From marvin24@gmx.de Mon Jun 1 05:34:05 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n51AY4sK257123 for ; Mon, 1 Jun 2009 05:34:05 -0500 X-ASG-Debug-ID: 1243852459-0e2a01080000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.gmx.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id B13E61D37E69 for ; Mon, 1 Jun 2009 03:34:19 -0700 (PDT) Received: from mail.gmx.net (mail.gmx.net [213.165.64.20]) by cuda.sgi.com with SMTP id xqhlRAV7YDCzAKGE for ; Mon, 01 Jun 2009 03:34:19 -0700 (PDT) Received: (qmail invoked by alias); 01 Jun 2009 10:34:18 -0000 Received: from unknown (EHLO localhost.localdomain) [78.52.34.214] by mail.gmx.net (mp002) with SMTP; 01 Jun 2009 12:34:18 +0200 X-Authenticated: #9962044 X-Provags-ID: V01U2FsdGVkX1+Fk1weEX6FjzMq0MxJunJSnSXgNZtOh1XeZGRvWu Nzw81m+2jR8Mp1 From: Marvin To: xfs@oss.sgi.com X-ASG-Orig-Subj: fsr stucks in D-state Subject: fsr stucks in D-state Date: Mon, 1 Jun 2009 12:33:39 +0200 User-Agent: KMail/1.11.2 (Linux/2.6.30-rc7; KDE/4.2.2; x86_64; ; ) MIME-Version: 1.0 Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200906011233.39721.marvin24@gmx.de> X-Y-GMX-Trusted: 0 X-FuHaFi: 0.6 X-Barracuda-Connect: mail.gmx.net[213.165.64.20] X-Barracuda-Start-Time: 1243852460 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.27300 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi, I observed a hang in D-state when using xfs_fsr. - xfsprogs is from git (3.0.2) - kernel also (2.6.30-rc7...) I tried 2.6.29.4 and it worked flawless. Machine is powerpc32. Here is the sysrq-t trace: xfs_fsr D 480f7f3c 0 4211 4210 Call Trace: [d1adfc40] [00001032] 0x1032 (unreliable) [d1adfd00] [c0008dd8] __switch_to+0x4c/0x6c [d1adfd20] [c02c5294] __schedule+0x230/0x360 [d1adfd70] [c02c53ec] schedule+0x28/0x54 [d1adfd80] [c02c7964] rwsem_down_failed_common+0x104/0x25c [d1adfdb0] [c02c7ae4] rwsem_down_write_failed+0x28/0x40 [d1adfde0] [c02c6994] down_write+0x30/0x40 [d1adfdf0] [c012399c] xfs_ilock+0x9c/0xa0 [d1adfe00] [c014375c] xfs_inactive+0x2e8/0x48c [d1adfe40] [c015113c] xfs_fs_clear_inode+0x40/0x50 [d1adfe50] [c00ab764] clear_inode+0x68/0xec [d1adfe60] [c00ac02c] generic_delete_inode+0x16c/0x170 [d1adfe80] [c00aaf20] iput+0x70/0x90 [d1adfe90] [c00a7424] dentry_iput+0xc8/0x154 [d1adfeb0] [c00a75e0] d_kill+0x50/0x8c [d1adfed0] [c00a80cc] dput+0x110/0x210 [d1adfef0] [c0095b50] __fput+0x178/0x204 [d1adff10] [c0091eec] filp_close+0x6c/0xa0 [d1adff30] [c0091fd4] sys_close+0xb4/0x124 [d1adff40] [c0011fc4] ret_from_syscall+0x0/0x38 --- Exception: c01 at 0x480f7f3c LR = 0x1000397c Greetings Marvin From Richard.Ems@cape-horn-eng.com Mon Jun 1 09:32:33 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n51EWW6G011805 for ; Mon, 1 Jun 2009 09:32:32 -0500 X-ASG-Debug-ID: 1243867150-49fe01b40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from smtprelay10.ispgateway.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EBD08148AB52 for ; Mon, 1 Jun 2009 07:39:10 -0700 (PDT) Received: from smtprelay10.ispgateway.de (smtprelay10.ispgateway.de [80.67.31.44]) by cuda.sgi.com with ESMTP id n4NMsecvgKZTHCS5 for ; Mon, 01 Jun 2009 07:39:10 -0700 (PDT) Received: from [62.43.225.238] (helo=[192.168.30.191]) by smtprelay10.ispgateway.de with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.68) (envelope-from ) id 1MB8ZC-0004GJ-R9; Mon, 01 Jun 2009 16:32:46 +0200 Message-ID: <4A23E68E.6070400@cape-horn-eng.com> Date: Mon, 01 Jun 2009 16:32:46 +0200 From: Richard Ems User-Agent: Thunderbird 2.0.0.21 (X11/20090310) MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs_growfs: XFS_IOC_FSGROWFSDATA xfsctl failed: Invalid argument Subject: Re: xfs_growfs: XFS_IOC_FSGROWFSDATA xfsctl failed: Invalid argument References: <4A180FCD.9080905@cape-horn-eng.com> <4A181B40.9080608@sandeen.net> <20090523180721.94212hyfjppuupmo@webmail.df.eu> <4A1833D7.30608@sandeen.net> <20090523194552.66062w3zquwvms00@webmail.df.eu> <4A1844AF.7030906@sandeen.net> <4A184DAC.8060400@sandeen.net> In-Reply-To: <4A184DAC.8060400@sandeen.net> X-Enigmail-Version: 0.95.7 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Df-Sender: 337294 X-Barracuda-Connect: smtprelay10.ispgateway.de[80.67.31.44] X-Barracuda-Start-Time: 1243867150 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.27304 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Eric Sandeen wrote: > if you growfs to a nr of blocks that is about 55 blocks less than the > actual device size, it should succeed for you. There's a case where the > last AG would be too small and it tries to compensate but there's an > overflow, I'll send a patch. Yes, it worked growing to a smaller size. Thanks again, Richard -- Richard Ems mail: Richard.Ems@Cape-Horn-Eng.com Cape Horn Engineering S.L. C/ Dr. J.J. Dómine 1, 5º piso 46011 Valencia Tel : +34 96 3242923 / Fax 924 http://www.cape-horn-eng.com From a.beregalov@gmail.com Mon Jun 1 10:22:43 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n51FMgxH016777 for ; Mon, 1 Jun 2009 10:22:42 -0500 X-ASG-Debug-ID: 1243870160-43ff03630000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-bw0-f226.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 76084148B17F for ; Mon, 1 Jun 2009 08:29:20 -0700 (PDT) Received: from mail-bw0-f226.google.com (mail-bw0-f226.google.com [209.85.218.226]) by cuda.sgi.com with ESMTP id dfy5BBVVZX8Ru2km for ; Mon, 01 Jun 2009 08:29:20 -0700 (PDT) Received: by bwz26 with SMTP id 26so7151114bwz.20 for ; Mon, 01 Jun 2009 08:22:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:date:message-id:subject :from:to:content-type:content-transfer-encoding; bh=XqUWFtCzZJ36lG32bMrBUSZXUfLnobM4Hm85lExw2Es=; b=jlZxdj6G2tbF4rMHJfunsj+W/qCu1qs4lTaqaxKMcGrDHEcshTvh/JljlMCZTeoI0w 0uTnVjwyAnClYQFraW3oxU8hvJf9VWtacO7ncvkXy24OqtyzpV9ao/9l5Di1lR5jq1ZY S/h4aiZ6KaOSoD501CQYOhNx5f2K+y3ByEtyA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type :content-transfer-encoding; b=MgvmjK9F36w1mHyVTeCiJQEAJpjv0Q7sG8P533twBVTM5UL5QObMYP/O34cEX9mpz1 ssC+ZlqbFZO7xXxT9zvmSmuF6I4JvMFW1NVTbyfaTrg+sVcg0+eEsOipLfVAU3mT8jTR Uuib9jzXZreuzJ0yxmr11wboklQ5qzLG3iw2M= MIME-Version: 1.0 Received: by 10.204.58.79 with SMTP id f15mr5804561bkh.202.1243869776933; Mon, 01 Jun 2009 08:22:56 -0700 (PDT) Date: Mon, 1 Jun 2009 19:22:56 +0400 Message-ID: X-ASG-Orig-Subj: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! Subject: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! From: Alexander Beregalov To: Kernel Testers List , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-bw0-f226.google.com[209.85.218.226] X-Barracuda-Start-Time: 1243870161 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.27306 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi Assertion failed: *nmap >= 1, file: fs/xfs/xfs_bmap.c, line: 4846 ------------[ cut here ]------------ kernel BUG at fs/xfs/support/debug.c:109! invalid opcode: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC last sysfs file: /sys/kernel/uevent_seqnum CPU 0 Modules linked in: Pid: 30665, comm: emerge Not tainted 2.6.30-rc6-00144-g5805977 #1 PowerEdge 1950 RIP: 0010:[] [] assfail+0x2b/0x30 RSP: 0018:ffff8800303c1b98 EFLAGS: 00010246 RAX: 0000000000000054 RBX: 0000000000000000 RCX: 0000000000000301 RDX: 0000000000000000 RSI: 0000000000000001 RDI: 0000000000000001 RBP: ffff8800303c1ba8 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000001 R11: 0000000000000001 R12: 0000000800000000 R13: ffff880078c0ccc0 R14: 0000000000000002 R15: ffff88007eb3f000 FS: 00007f7e92dbc6f0(0000) GS:ffff880005000000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000001b0a024 CR3: 0000000074cb0000 CR4: 00000000000006e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Process emerge (pid: 30665, threadinfo ffff8800303c0000, task ffff88007e335e10) Stack: ffff8800051cefa0 00000000780d89a3 ffff8800303c1d88 ffffffff803d6bad ffffffff804c9ad8 ffffffff814497f8 ffff880045a72000 ffff880045a72aa8 ffffffff81449800 0000000000000000 0000000000000000 00000000780d89a3 Call Trace: [] xfs_bmapi+0xad/0x1ad0 [] ? _atomic_dec_and_lock+0x88/0xb0 [] ? xfs_buf_free+0xd7/0x130 [] ? _spin_unlock+0x3f/0x80 [] ? xfs_buf_rele+0x124/0x190 [] ? xfs_buf_unlock+0x3d/0x80 [] ? xfs_trans_brelse+0x219/0x2e0 [] ? xfs_da_brelse+0x7f/0x150 [] xfs_dir2_leaf_getdents+0x640/0x7b0 [] ? filldir+0x0/0x100 [] ? filldir+0x0/0x100 [] xfs_readdir+0x12c/0x140 [] ? filldir+0x0/0x100 [] xfs_file_readdir+0x47/0x70 [] vfs_readdir+0xd0/0xf0 [] sys_getdents+0x96/0x110 [] system_call_fastpath+0x16/0x1b Code: 55 89 d1 48 89 e5 48 89 f2 48 83 ec 10 48 89 fe 65 48 8b 04 25 28 00 00 00 48 89 45 f8 31 c0 48 c7 c7 38 73 83 80 e8 25 a4 29 00 <0f> 0b eb fe 90 55 48 89 e5 41 57 49 89 d7 41 56 41 55 49 89 cd RIP [] assfail+0x2b/0x30 RSP ---[ end trace bf7e45980908c8f7 ]--- From felixb@sgi.com Mon Jun 1 11:09:15 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n51G9FLb019948 for ; Mon, 1 Jun 2009 11:09:15 -0500 Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3CF498F807A for ; Mon, 1 Jun 2009 09:09:29 -0700 (PDT) Received: from eagdhcp-232-182.americas.sgi.com (eagdhcp-232-182.americas.sgi.com [128.162.232.182]) by estes.americas.sgi.com (Postfix) with ESMTP id 12ACF700016A; Mon, 1 Jun 2009 11:09:29 -0500 (CDT) Cc: Kernel Testers List , xfs@oss.sgi.com Message-Id: From: Felix Blyakher To: Alexander Beregalov In-Reply-To: Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v926) Subject: Re: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! Date: Mon, 1 Jun 2009 11:09:29 -0500 References: X-Mailer: Apple Mail (2.926) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Jun 1, 2009, at 10:22 AM, Alexander Beregalov wrote: > Hi > > Assertion failed: *nmap >= 1, file: fs/xfs/xfs_bmap.c, line: 4846 Alexander, what test triggered this assertion? > > ------------[ cut here ]------------ > kernel BUG at fs/xfs/support/debug.c:109! > invalid opcode: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC > last sysfs file: /sys/kernel/uevent_seqnum > CPU 0 > Modules linked in: > Pid: 30665, comm: emerge Not tainted 2.6.30-rc6-00144-g5805977 #1 > PowerEdge 1950 > RIP: 0010:[] [] assfail+0x2b/0x30 > RSP: 0018:ffff8800303c1b98 EFLAGS: 00010246 > RAX: 0000000000000054 RBX: 0000000000000000 RCX: 0000000000000301 > RDX: 0000000000000000 RSI: 0000000000000001 RDI: 0000000000000001 > RBP: ffff8800303c1ba8 R08: 0000000000000000 R09: 0000000000000000 > R10: 0000000000000001 R11: 0000000000000001 R12: 0000000800000000 > R13: ffff880078c0ccc0 R14: 0000000000000002 R15: ffff88007eb3f000 > FS: 00007f7e92dbc6f0(0000) GS:ffff880005000000(0000) knlGS: > 0000000000000000 > CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 > CR2: 0000000001b0a024 CR3: 0000000074cb0000 CR4: 00000000000006e0 > DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 > DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 > Process emerge (pid: 30665, threadinfo ffff8800303c0000, task > ffff88007e335e10) > Stack: > ffff8800051cefa0 00000000780d89a3 ffff8800303c1d88 ffffffff803d6bad > ffffffff804c9ad8 ffffffff814497f8 ffff880045a72000 ffff880045a72aa8 > ffffffff81449800 0000000000000000 0000000000000000 00000000780d89a3 > Call Trace: > [] xfs_bmapi+0xad/0x1ad0 xfs_bmapi() here doesn't make sense at all. Up to this point the stack backtrace seems to be right. Strange ... Felix > > [] ? _atomic_dec_and_lock+0x88/0xb0 > [] ? xfs_buf_free+0xd7/0x130 > [] ? _spin_unlock+0x3f/0x80 > [] ? xfs_buf_rele+0x124/0x190 > [] ? xfs_buf_unlock+0x3d/0x80 > [] ? xfs_trans_brelse+0x219/0x2e0 > [] ? xfs_da_brelse+0x7f/0x150 > [] xfs_dir2_leaf_getdents+0x640/0x7b0 > [] ? filldir+0x0/0x100 > [] ? filldir+0x0/0x100 > [] xfs_readdir+0x12c/0x140 > [] ? filldir+0x0/0x100 > [] xfs_file_readdir+0x47/0x70 > [] vfs_readdir+0xd0/0xf0 > [] sys_getdents+0x96/0x110 > [] system_call_fastpath+0x16/0x1b > Code: 55 89 d1 48 89 e5 48 89 f2 48 83 ec 10 48 89 fe 65 48 8b 04 25 > 28 00 00 00 48 89 45 f8 31 c0 48 c7 c7 38 73 83 80 e8 25 a4 29 00 <0f> > 0b eb fe 90 55 48 89 e5 41 57 49 89 d7 41 56 41 55 49 89 cd > RIP [] assfail+0x2b/0x30 > RSP > ---[ end trace bf7e45980908c8f7 ]--- > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From felixb@sgi.com Mon Jun 1 11:45:56 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n51GjtR2022203 for ; Mon, 1 Jun 2009 11:45:56 -0500 Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay1.corp.sgi.com (Postfix) with ESMTP id EFBCD8F8050 for ; Mon, 1 Jun 2009 09:46:12 -0700 (PDT) Received: from eagdhcp-232-182.americas.sgi.com (eagdhcp-232-182.americas.sgi.com [128.162.232.182]) by estes.americas.sgi.com (Postfix) with ESMTP id 9C128700016A; Mon, 1 Jun 2009 11:46:12 -0500 (CDT) Cc: Linux Kernel Mailing List , Kernel Testers List , Alex Samad , Dave Chinner , xfs mailing list Message-Id: <36C1B891-5BC9-4149-AF22-58BC22AD7A3A@sgi.com> From: Felix Blyakher To: "Rafael J. Wysocki" In-Reply-To: Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v926) Subject: Re: [Bug #13375] Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Date: Mon, 1 Jun 2009 11:46:12 -0500 References: X-Mailer: Apple Mail (2.926) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean [cc'ing the xfs mailing list] On May 30, 2009, at 2:55 PM, Rafael J. Wysocki wrote: > This message has been generated automatically as a part of a report > of regressions introduced between 2.6.28 and 2.6.29. > > The following bug entry is on the current list of known regressions > introduced between 2.6.28 and 2.6.29. Please verify if it still > should > be listed and let me know (either way). > > > Bug-Entry : http://bugzilla.kernel.org/show_bug.cgi?id=13375 > Subject : Kernel crash with 2.6.29 + nfs + xfs (radix-tree) > Submitter : Alex Samad > Date : 2009-05-20 0:37 (11 days old) > References : http://marc.info/?l=linux-kernel&m=124278675503699&w=4 > > > -- > 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/ From a.beregalov@gmail.com Mon Jun 1 12:37:53 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n51HbqVH025820 for ; Mon, 1 Jun 2009 12:37:52 -0500 X-ASG-Debug-ID: 1243877888-7ee401270000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-fx0-f177.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7F5AE2C2B82 for ; Mon, 1 Jun 2009 10:38:08 -0700 (PDT) Received: from mail-fx0-f177.google.com (mail-fx0-f177.google.com [209.85.220.177]) by cuda.sgi.com with ESMTP id 6DIUmbS94EKvd86Y for ; Mon, 01 Jun 2009 10:38:08 -0700 (PDT) Received: by fxm25 with SMTP id 25so7279684fxm.20 for ; Mon, 01 Jun 2009 10:38:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=Jtu1iooZ+RGMe7zLzV0BkAq5iWE7NNABwzlQxzDWflk=; b=J4GqaAsmxfX1G473eq6P2ao8Z7Ve6DZf6b8AOzhxL2OwtOz64big+CBX1g6cpscbI9 qdzpgRH2R46BIrAOsYTHeGOiAyNoXt+qofKj4hjx2VWlp10JWHVJYjq23PRN+CRJXx3B KidqN4VlyMq3iy8YAs0t0g0BauSNwZlAtWFhc= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; b=jFStMwuRyiU+DSqGO6mUiB3+pt3QkrSfPZCuypBozG8rBfwDMEfD6J0W2fzsIx4+NC 0kCNnsZ76I58bC/wT2l3n9RoRpCPORGAdr8Uv1LIa8naLmVMgrjQQjd3UxVuxvEXgxNw dhP4pJbUwUdFFHIO0lD7mwM83Nl9JRRlObyjk= MIME-Version: 1.0 Received: by 10.204.97.140 with SMTP id l12mr5919995bkn.133.1243877887521; Mon, 01 Jun 2009 10:38:07 -0700 (PDT) In-Reply-To: References: Date: Mon, 1 Jun 2009 21:38:07 +0400 Message-ID: X-ASG-Orig-Subj: Re: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! Subject: Re: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! From: Alexander Beregalov To: Felix Blyakher Cc: Kernel Testers List , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-fx0-f177.google.com[209.85.220.177] X-Barracuda-Start-Time: 1243877889 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.27315 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean 2009/6/1 Felix Blyakher : > > On Jun 1, 2009, at 10:22 AM, Alexander Beregalov wrote: > >> Hi >> >> Assertion failed: *nmap >=3D 1, file: fs/xfs/xfs_bmap.c, line: 4846 > > Alexander, what test triggered this assertion? > >> >> ------------[ cut here ]------------ >> kernel BUG at fs/xfs/support/debug.c:109! >> invalid opcode: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC >> last sysfs file: /sys/kernel/uevent_seqnum >> CPU 0 >> Modules linked in: >> Pid: 30665, comm: emerge Not tainted 2.6.30-rc6-00144-g5805977 #1 >> PowerEdge 1950 >> RIP: 0010:[] =C2=A0[] assfail+0x2b/0= x30 >> RSP: 0018:ffff8800303c1b98 =C2=A0EFLAGS: 00010246 >> RAX: 0000000000000054 RBX: 0000000000000000 RCX: 0000000000000301 >> RDX: 0000000000000000 RSI: 0000000000000001 RDI: 0000000000000001 >> RBP: ffff8800303c1ba8 R08: 0000000000000000 R09: 0000000000000000 >> R10: 0000000000000001 R11: 0000000000000001 R12: 0000000800000000 >> R13: ffff880078c0ccc0 R14: 0000000000000002 R15: ffff88007eb3f000 >> FS: =C2=A000007f7e92dbc6f0(0000) GS:ffff880005000000(0000) >> knlGS:0000000000000000 >> CS: =C2=A00010 DS: 0000 ES: 0000 CR0: 0000000080050033 >> CR2: 0000000001b0a024 CR3: 0000000074cb0000 CR4: 00000000000006e0 >> DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 >> DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 >> Process emerge (pid: 30665, threadinfo ffff8800303c0000, task >> ffff88007e335e10) >> Stack: >> ffff8800051cefa0 00000000780d89a3 ffff8800303c1d88 ffffffff803d6bad >> ffffffff804c9ad8 ffffffff814497f8 ffff880045a72000 ffff880045a72aa8 >> ffffffff81449800 0000000000000000 0000000000000000 00000000780d89a3 >> Call Trace: >> [] xfs_bmapi+0xad/0x1ad0 > > xfs_bmapi() here doesn't make sense at all. > Up to this point the stack backtrace seems to be right. > Strange ... It was Gentoo's `emerge --metadata`. It reads many small files (ebuilds). I am sure it cannot be easily reproduced. It runs fine everyday. I do not have a testcase. I can try to run it forever in loop if you need. From a.beregalov@gmail.com Mon Jun 1 12:42:56 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n51HguTN026084 for ; Mon, 1 Jun 2009 12:42:56 -0500 X-ASG-Debug-ID: 1243878191-139900850000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-bw0-f226.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C29972C2BD3 for ; Mon, 1 Jun 2009 10:43:12 -0700 (PDT) Received: from mail-bw0-f226.google.com (mail-bw0-f226.google.com [209.85.218.226]) by cuda.sgi.com with ESMTP id 9ytrj1H1r2s1eufX for ; Mon, 01 Jun 2009 10:43:12 -0700 (PDT) Received: by bwz26 with SMTP id 26so7231994bwz.20 for ; Mon, 01 Jun 2009 10:43:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=iU5emfcUCghLF4LyVPp+awHve3Ls91MDZdZ6eziddjc=; b=CIy3eEDJRtS+E0jloGaqvM8QjnqIz5BAY8tUcUtic8gRgwKLDWWbtotLz7+RQFV7WI kwK9kQh25jPwcS6QiCW8TLXz7KT8HRlBX1AaVBz95os1hsDwSexriSdLQDY8TmHDd2aL UgV917SZVuXyqQox82xoSfxAypPM+RTPCwR0U= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; b=b7gcwm7G+qO7ShXfR4/CV0gmDw6yFBNsL4g6uZG376Ffu/iGy6qClqElWmjxSOb9Ed 4pUHOim51ke1y1UnbkpWvH2+YpM+LDO5QlNJNUMAvrnxDaBtLaH9UIBMkhpM4+hsVFwa Tslz/MaqwWmC60sNsvY4TxrKnSSDPPY9CfBOo= MIME-Version: 1.0 Received: by 10.204.71.68 with SMTP id g4mr5949579bkj.81.1243878191496; Mon, 01 Jun 2009 10:43:11 -0700 (PDT) In-Reply-To: References: Date: Mon, 1 Jun 2009 21:43:11 +0400 Message-ID: X-ASG-Orig-Subj: Re: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! Subject: Re: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! From: Alexander Beregalov To: Felix Blyakher Cc: Kernel Testers List , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-bw0-f226.google.com[209.85.218.226] X-Barracuda-Start-Time: 1243878192 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.27315 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean By the way, Felix, your last pull request was a month ago. Final release of 2.6.30 is coming soon, could you please send the fixes to Linus? Just in case you do not read LKML. From felixb@sgi.com Mon Jun 1 12:53:05 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n51Hr5jr026703 for ; Mon, 1 Jun 2009 12:53:05 -0500 Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2EE8B304062 for ; Mon, 1 Jun 2009 10:53:19 -0700 (PDT) Received: from eagdhcp-232-182.americas.sgi.com (eagdhcp-232-182.americas.sgi.com [128.162.232.182]) by estes.americas.sgi.com (Postfix) with ESMTP id F3FDD700016A; Mon, 1 Jun 2009 12:53:18 -0500 (CDT) Cc: Kernel Testers List , xfs@oss.sgi.com Message-Id: <304A466C-12DD-4505-9FEA-02AF294FEED1@sgi.com> From: Felix Blyakher To: Alexander Beregalov In-Reply-To: Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v926) Subject: Re: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! Date: Mon, 1 Jun 2009 12:53:19 -0500 References: X-Mailer: Apple Mail (2.926) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Jun 1, 2009, at 12:43 PM, Alexander Beregalov wrote: > By the way, > Felix, your last pull request was a month ago. > Final release of 2.6.30 is coming soon, could you please send the > fixes to Linus? > > Just in case you do not read LKML. Yes, I do. And it is on the top of my todo list today. Thanks, for heads up, though. Felix From felixb@sgi.com Mon Jun 1 12:58:42 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n51HwgVC027097 for ; Mon, 1 Jun 2009 12:58:42 -0500 Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay1.corp.sgi.com (Postfix) with ESMTP id A88C88F80AC for ; Mon, 1 Jun 2009 10:58:56 -0700 (PDT) Received: from eagdhcp-232-182.americas.sgi.com (eagdhcp-232-182.americas.sgi.com [128.162.232.182]) by estes.americas.sgi.com (Postfix) with ESMTP id 811A8700016A; Mon, 1 Jun 2009 12:58:56 -0500 (CDT) Cc: Kernel Testers List , xfs@oss.sgi.com Message-Id: From: Felix Blyakher To: Alexander Beregalov In-Reply-To: Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v926) Subject: Re: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! Date: Mon, 1 Jun 2009 12:58:56 -0500 References: X-Mailer: Apple Mail (2.926) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Jun 1, 2009, at 12:38 PM, Alexander Beregalov wrote: > It was Gentoo's `emerge --metadata`. It reads many small files > (ebuilds). > I am sure it cannot be easily reproduced. Right. Otherwise many more people would've reported it. > It runs fine everyday. I do not have a testcase. > I can try to run it forever in loop if you need. Yes, that will be good. The problem is that the traces are confusing. From one side readdir stack makes sense based on your description of the load, but OTOH the panic is from xfs_bmapi(), which doesn't fit in that backtrace at all. It seems like backtrace is from the concurrently running different thread. Don't have good idea for this bug atm. Felix From felixb@oss.sgi.com Mon Jun 1 13:47:26 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.6 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n51IlQaY030976 for ; Mon, 1 Jun 2009 13:47:26 -0500 Received: (from felixb@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id n51IlLGU030945; Mon, 1 Jun 2009 13:47:21 -0500 Date: Mon, 1 Jun 2009 13:47:21 -0500 Message-Id: <200906011847.n51IlLGU030945@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v2.6.29-6708-g4156e73 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 096324873f9c7172a17aff9db1356f4f01b77afe X-Git-Newrev: 4156e735d3abde8e9243b5d22f7999dd3fffab2e 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 4156e73 xfs: prevent deadlock in xfs_qm_shake() from 096324873f9c7172a17aff9db1356f4f01b77afe (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 4156e735d3abde8e9243b5d22f7999dd3fffab2e Author: Felix Blyakher Date: Mon Jun 1 13:13:24 2009 -0500 xfs: prevent deadlock in xfs_qm_shake() It's possible to recurse into filesystem from the memory allocation, which deadlocks in xfs_qm_shake(). Add check for __GFP_FS, and bail out if it is not set. Signed-off-by: Felix Blyakher Signed-off-by: Hedi Berriche Reviewed-by: Christoph Hellwig Reviewed-by: Andi Kleen Signed-off-by: Felix Blyakher ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/kmem.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) hooks/post-receive -- XFS development tree From felixb@oss.sgi.com Mon Jun 1 23:23:23 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00, J_CHICKENPOX_43 autolearn=no version=3.3.0-rupdated Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n524NNod070065 for ; Mon, 1 Jun 2009 23:23:23 -0500 Received: (from felixb@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id n524NLSH070026; Mon, 1 Jun 2009 23:23:21 -0500 Date: Mon, 1 Jun 2009 23:23:21 -0500 Message-Id: <200906020423.n524NLSH070026@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-linus, updated. v2.6.29-7201-g1b17d76 X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: 28e211700a81b0a934b6c7a4b8e7dda843634d2f X-Git-Newrev: 1b17d766463d51904cb242f194a780737e5f73ef 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-linus has been updated 1b17d76 xfs: prevent deadlock in xfs_qm_shake() e6da7c9 xfs: fix overflow in xfs_growfs_data_private 1f23920 xfs: fix double unlock in xfs_swap_extents() from 28e211700a81b0a934b6c7a4b8e7dda843634d2f (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 1b17d766463d51904cb242f194a780737e5f73ef Author: Felix Blyakher Date: Mon Jun 1 13:13:24 2009 -0500 xfs: prevent deadlock in xfs_qm_shake() It's possible to recurse into filesystem from the memory allocation, which deadlocks in xfs_qm_shake(). Add check for __GFP_FS, and bail out if it is not set. Signed-off-by: Felix Blyakher Signed-off-by: Hedi Berriche Reviewed-by: Christoph Hellwig Reviewed-by: Andi Kleen Signed-off-by: Felix Blyakher commit e6da7c9fed111ba1243297ee6eda8e24ae11c384 Author: Eric Sandeen Date: Sat May 23 14:30:12 2009 -0500 xfs: fix overflow in xfs_growfs_data_private In the case where growing a filesystem would leave the last AG too small, the fixup code has an overflow in the calculation of the new size with one fewer ag, because "nagcount" is a 32 bit number. If the new filesystem has > 2^32 blocks in it this causes a problem resulting in an EINVAL return from growfs: # xfs_io -f -c "truncate 19998630180864" fsfile # mkfs.xfs -f -bsize=4096 -dagsize=76288719b,size=3905982455b fsfile # mount -o loop fsfile /mnt # xfs_growfs /mnt meta-data=/dev/loop0 isize=256 agcount=52, agsize=76288719 blks = sectsz=512 attr=2 data = bsize=4096 blocks=3905982455, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=32768, version=2 = sectsz=512 sunit=0 blks, lazy-count=0 realtime =none extsz=4096 blocks=0, rtextents=0 xfs_growfs: XFS_IOC_FSGROWFSDATA xfsctl failed: Invalid argument Reported-by: richard.ems@cape-horn-eng.com Signed-off-by: Eric Sandeen Reviewed-by: Christoph Hellwig Reviewed-by: Felix Blyakher Signed-off-by: Felix Blyakher commit 1f23920dbf1377fa9e4aef4f3d20c34a06a71a35 Author: Felix Blyakher Date: Thu May 7 19:49:45 2009 -0500 xfs: fix double unlock in xfs_swap_extents() Regreesion from commit ef8f7fc, which rearranged the code in xfs_swap_extents() leading to double unlock of xfs inode ilock. That resulted in xfs_fsr deadlocking itself on platforms, which don't handle double unlock of rw_semaphore nicely. It caused the count go negative, which represents the write holder, without really having one. ia64 is one of the platforms where deadlock was easily reproduced and the fix was tested. Signed-off-by: Eric Sandeen Reviewed-by: Eric Sandeen Signed-off-by: Felix Blyakher ----------------------------------------------------------------------- Summary of changes: fs/xfs/linux-2.6/kmem.h | 2 +- fs/xfs/xfs_dfrag.c | 8 +++++--- fs/xfs/xfs_fsops.c | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) hooks/post-receive -- XFS development tree From felixb@sgi.com Mon Jun 1 23:26:41 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n524QfE6070255 for ; Mon, 1 Jun 2009 23:26:41 -0500 Received: from attica.americas.sgi.com (attica.americas.sgi.com [128.162.236.44]) by relay3.corp.sgi.com (Postfix) with ESMTP id 879AEAC006; Mon, 1 Jun 2009 21:26:54 -0700 (PDT) Received: by attica.americas.sgi.com (Postfix, from userid 29043) id 66DB5A1FAB93; Mon, 1 Jun 2009 23:26:53 -0500 (CDT) Date: Mon, 01 Jun 2009 23:26:53 -0500 To: torvalds@linux-foundation.org Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, akpm@linux-foundation.org Subject: [GIT PULL] XFS update for 2.6.30-rc8 User-Agent: Heirloom mailx 12.2 01/07/07 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-Id: <20090602042653.66DB5A1FAB93@attica.americas.sgi.com> From: felixb@sgi.com (Felix Blyakher) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean The following changes since commit d9244b5d2fbfe9fa540024b410047af13ceec90f: Linus Torvalds (1): Merge branch 'hwmon-for-linus' of git://git.kernel.org/.../jdelvare/staging are available in the git repository at: git://oss.sgi.com/xfs/xfs for-linus Eric Sandeen (1): xfs: fix overflow in xfs_growfs_data_private Felix Blyakher (2): xfs: fix double unlock in xfs_swap_extents() xfs: prevent deadlock in xfs_qm_shake() fs/xfs/linux-2.6/kmem.h | 2 +- fs/xfs/xfs_dfrag.c | 8 +++++--- fs/xfs/xfs_fsops.c | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) From marvin24@gmx.de Tue Jun 2 01:30:08 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n526U6qI078834 for ; Tue, 2 Jun 2009 01:30:08 -0500 X-ASG-Debug-ID: 1243924221-155101750000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.gmx.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 40B612C5858 for ; Mon, 1 Jun 2009 23:30:21 -0700 (PDT) Received: from mail.gmx.net (mail.gmx.net [213.165.64.20]) by cuda.sgi.com with SMTP id bSU6tQLtRnoqZDHO for ; Mon, 01 Jun 2009 23:30:21 -0700 (PDT) Received: (qmail invoked by alias); 02 Jun 2009 06:30:20 -0000 Received: from g227064093.adsl.alicedsl.de (EHLO localhost.localdomain) [92.227.64.93] by mail.gmx.net (mp054) with SMTP; 02 Jun 2009 08:30:20 +0200 X-Authenticated: #9962044 X-Provags-ID: V01U2FsdGVkX18xdhATC+gxPoFKOoTIsZhgPMnYbFDqPH4HQNrfir 9plmo25PYQOdq+ From: Marvin To: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: fsr stucks in D-state Subject: Re: fsr stucks in D-state Date: Tue, 2 Jun 2009 08:30:18 +0200 User-Agent: KMail/1.11.2 (Linux/2.6.30-rc7; KDE/4.2.2; x86_64; ; ) References: <200906011233.39721.marvin24@gmx.de> In-Reply-To: <200906011233.39721.marvin24@gmx.de> MIME-Version: 1.0 Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200906020830.18866.marvin24@gmx.de> X-Y-GMX-Trusted: 0 X-FuHaFi: 0.57 X-Barracuda-Connect: mail.gmx.net[213.165.64.20] X-Barracuda-Start-Time: 1243924222 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.27357 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi again, On Monday 01 June 2009 12:33:39 Marvin wrote: > Hi, > > I observed a hang in D-state when using xfs_fsr. > > - xfsprogs is from git (3.0.2) > - kernel also (2.6.30-rc7...) I pulled from "git://oss.sgi.com/xfs/xfs for-linus", which seems to include some deadlock fixes. Now, fsr no longer deadlocks, so this seems to be fixed. Sorry for the noise. Marvin > I tried 2.6.29.4 and it worked flawless. Machine is powerpc32. > > Here is the sysrq-t trace: > > xfs_fsr D 480f7f3c 0 4211 4210 > Call Trace: > [d1adfc40] [00001032] 0x1032 (unreliable) > [d1adfd00] [c0008dd8] __switch_to+0x4c/0x6c > [d1adfd20] [c02c5294] __schedule+0x230/0x360 > [d1adfd70] [c02c53ec] schedule+0x28/0x54 > [d1adfd80] [c02c7964] rwsem_down_failed_common+0x104/0x25c > [d1adfdb0] [c02c7ae4] rwsem_down_write_failed+0x28/0x40 > [d1adfde0] [c02c6994] down_write+0x30/0x40 > [d1adfdf0] [c012399c] xfs_ilock+0x9c/0xa0 > [d1adfe00] [c014375c] xfs_inactive+0x2e8/0x48c > [d1adfe40] [c015113c] xfs_fs_clear_inode+0x40/0x50 > [d1adfe50] [c00ab764] clear_inode+0x68/0xec > [d1adfe60] [c00ac02c] generic_delete_inode+0x16c/0x170 > [d1adfe80] [c00aaf20] iput+0x70/0x90 > [d1adfe90] [c00a7424] dentry_iput+0xc8/0x154 > [d1adfeb0] [c00a75e0] d_kill+0x50/0x8c > [d1adfed0] [c00a80cc] dput+0x110/0x210 > [d1adfef0] [c0095b50] __fput+0x178/0x204 > [d1adff10] [c0091eec] filp_close+0x6c/0xa0 > [d1adff30] [c0091fd4] sys_close+0xb4/0x124 > [d1adff40] [c0011fc4] ret_from_syscall+0x0/0x38 > --- Exception: c01 at 0x480f7f3c > LR = 0x1000397c > > Greetings > > Marvin From a.beregalov@gmail.com Tue Jun 2 03:21:34 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n528LX3J084197 for ; Tue, 2 Jun 2009 03:21:33 -0500 X-ASG-Debug-ID: 1243931294-46e201420000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-bw0-f226.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8CE54148D4BC for ; Tue, 2 Jun 2009 01:28:14 -0700 (PDT) Received: from mail-bw0-f226.google.com (mail-bw0-f226.google.com [209.85.218.226]) by cuda.sgi.com with ESMTP id 3cOEoghzuSDLp0rH for ; Tue, 02 Jun 2009 01:28:14 -0700 (PDT) Received: by bwz26 with SMTP id 26so7541023bwz.20 for ; Tue, 02 Jun 2009 01:21:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=udLN/cX+yssfeYtV7FNS26uecqXv1apDdCbhV/HV59A=; b=wfrCz8Lp5AUOHeWo/Cu9Vf5F5AfvZw7SYVrRSRqSqkRpc4iQFHqAXKKcFdP3gzehNQ 1rloGZgkKO34pSNaPoWbZblscP3uydEYyFwY6VhNKaK2suXvkDOqq0TScLg9/2P4PjI7 Z6omz9crslLOYnG/2Xw969K6bHJNi9U3b+oN8= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; b=fcWPGBpkbEieCKS2Rv1Rt99v/ujz/THEKBUXdMdBG1K5YXlu7joXsjVC0Z84wSaENw T9HFnlXRTZ4WqkIC1OqJId+ASxyCiYDANsMjRH7yrbf88F6eYLrDtS0aM1H3HnHww7z6 qL1TIHzz1F6M9NiYCFj2KfuSb3OtG21rjGro0= MIME-Version: 1.0 Received: by 10.204.65.17 with SMTP id g17mr6454073bki.193.1243930907080; Tue, 02 Jun 2009 01:21:47 -0700 (PDT) In-Reply-To: References: Date: Tue, 2 Jun 2009 12:21:47 +0400 Message-ID: X-ASG-Orig-Subj: Re: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! Subject: Re: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! From: Alexander Beregalov To: Felix Blyakher Cc: Kernel Testers List , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-bw0-f226.google.com[209.85.218.226] X-Barracuda-Start-Time: 1243931296 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.27361 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean 2009/6/1 Felix Blyakher : > > On Jun 1, 2009, at 12:38 PM, Alexander Beregalov wrote: > >> It was Gentoo's `emerge --metadata`. It reads many small files (ebuilds). >> I am sure it cannot be easily reproduced. > > Right. Otherwise many more people would've reported it. > >> It runs fine everyday. I do not have a testcase. >> I can try to run it forever in loop if you need. > > Yes, that will be good. > The problem is that the traces are confusing. From one > side readdir stack makes sense based on your description > of the load, but OTOH the panic is from xfs_bmapi(), which > doesn't fit in that backtrace at all. It seems like > backtrace is from the concurrently running different thread. > Don't have good idea for this bug atm. The host is still running, SysRq-W shows two precesses with the same stacktraces. SysRq : Show Blocked State task PC stack pid father emerge D 0000000000000000 3856 8399 8387 ffff880078da7b48 0000000000000046 ffff8800074b4b40 ffff880078da7af4 0000000000000001 000000000000d948 00000000001d2000 0000000000000001 ffff8800074b4b40 ffff88007f4725a0 ffff8800074b4eb8 0000000100000246 Call Trace: [] ? do_lookup+0xd8/0x270 [] __mutex_lock_common+0x16d/0x4f0 [] ? do_lookup+0xd8/0x270 [] ? trace_hardirqs_on+0x20/0x40 [] ? do_lookup+0xd8/0x270 [] mutex_lock_nested+0x48/0x70 [] do_lookup+0xd8/0x270 [] __link_path_walk+0x2b6/0xf00 [] ? do_path_lookup+0xec/0x200 [] ? do_path_lookup+0xec/0x200 [] path_walk+0x7e/0x100 [] do_path_lookup+0xb6/0x200 [] do_filp_open+0xf8/0x9e0 [] ? alloc_fd+0x49/0x170 [] ? _spin_unlock+0x3f/0x80 [] ? alloc_fd+0x139/0x170 [] do_sys_open+0x9b/0x130 [] sys_open+0x2e/0x50 [] system_call_fastpath+0x16/0x1b emerge D 0000000000000000 3280 1643 1901 ffff88000f43bb48 0000000000000046 ffff88002dc33870 ffff88000f43baf4 0000000000000001 000000000000d948 00000000001d2000 0000000000000003 ffff88002dc33870 ffff88007ea30000 ffff88002dc33be8 0000000300000246 Call Trace: [] ? do_lookup+0xd8/0x270 [] ? do_lookup+0xd8/0x270 [] __mutex_lock_common+0x16d/0x4f0 [] ? do_lookup+0xd8/0x270 [] ? trace_hardirqs_on+0x20/0x40 [] ? do_lookup+0xd8/0x270 [] mutex_lock_nested+0x48/0x70 [] do_lookup+0xd8/0x270 [] __link_path_walk+0x2b6/0xf00 [] ? do_path_lookup+0xec/0x200 [] ? do_path_lookup+0xec/0x200 [] path_walk+0x7e/0x100 [] do_path_lookup+0xb6/0x200 [] do_filp_open+0xf8/0x9e0 [] ? alloc_fd+0x49/0x170 [] ? _spin_unlock+0x3f/0x80 [] ? alloc_fd+0x139/0x170 [] do_sys_open+0x9b/0x130 [] sys_open+0x2e/0x50 [] system_call_fastpath+0x16/0x1b I will try to reproduce it. From mw@dermichi.com Tue Jun 2 05:29:12 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52ATBSM091152 for ; Tue, 2 Jun 2009 05:29:11 -0500 X-ASG-Debug-ID: 1243938559-1aee02930000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from firestarter.dermichi.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 016721B419A0 for ; Tue, 2 Jun 2009 03:29:19 -0700 (PDT) Received: from firestarter.dermichi.com (firestarter.dermichi.com [83.64.48.195]) by cuda.sgi.com with ESMTP id NSyuUhuko8lR31VM for ; Tue, 02 Jun 2009 03:29:19 -0700 (PDT) Received: from cerberus.net4you.net ([194.177.153.130] helo=[192.168.200.110]) by firestarter.dermichi.com with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.69) (envelope-from ) id 1MBRF5-0001CP-Fq; Tue, 02 Jun 2009 12:29:15 +0200 Message-ID: <4A24FEF9.6050309@dermichi.com> Date: Tue, 02 Jun 2009 12:29:13 +0200 From: Michael Weissenbacher User-Agent: Thunderbird 2.0.0.21 (X11/20090409) MIME-Version: 1.0 To: Eric Sandeen , Christoph Hellwig CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: regarding the inode64 mount option Subject: Re: regarding the inode64 mount option References: <4A1E81D8.7010706@dermichi.com> <20090528145612.GA14684@infradead.org> <4A1EAB31.7090604@sandeen.net> In-Reply-To: <4A1EAB31.7090604@sandeen.net> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: firestarter.dermichi.com[83.64.48.195] X-Barracuda-Start-Time: 1243938561 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.27370 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi Eric + Christoph! > http://sandeen.net/wordpress/?p=9 This is a scary list indeed! Does this apply only to Fedora on i686 or also to x86_64? In general, does the inode64 option make sense at all on a partition that is <1TB in size? > Actually they should still be accessible, we just won't create new > inodes not addressable by 32bit inode numbers. Well, in my tests it didn't work. I tried this is on fedora core 6 with vanilla kernel 2.6.28.10 x86_64. See here: (when mounted without inode64) [root@mojave ~]# ls /backup/ -lha ls: cannot access /backup/mojave_gentoo_backup: Invalid argument total 8.0K drwxr-xr-x 6 root root 99 2009-05-25 18:07 . drwxr-xr-x 26 root root 4.0K 2009-05-28 17:38 .. drwxr-xr-x 4 amandabackup disk 51 2009-05-07 15:46 amanda_holdings ?????????? ? ? ? ? ? mojave_gentoo_backup drwx--x--x 4 root root 41 2009-04-29 11:57 servers drwxrwxrwt 2 root root 6 2009-06-02 10:38 tmp [root@mojave ~]# ls /backup/mojave_gentoo_backup -lha ls: cannot access /backup/mojave_gentoo_backup: Invalid argument [root@mojave ~]# (when mounted with inode64) [root@mojave ~]# ls /backup/ -lha total 12K drwxr-xr-x 6 root root 99 2009-05-25 18:07 . drwxr-xr-x 26 root root 4.0K 2009-05-28 17:38 .. drwxr-xr-x 4 amandabackup disk 51 2009-05-07 15:46 amanda_holdings drwxr-xr-x 23 root root 4.0K 2009-05-05 10:53 mojave_gentoo_backup drwx--x--x 4 root root 41 2009-04-29 11:57 servers drwxrwxrwt 2 root root 6 2009-06-02 10:38 tmp [root@mojave ~]# ls /backup/mojave_gentoo_backup/ -lha total 27M drwxr-xr-x 23 root root 4.0K 2009-05-05 10:53 . drwxr-xr-x 6 root root 99 2009-05-25 18:07 .. drwxr-xr-x 2 root root 10 2009-05-05 11:53 backup (snipped) The filesystem is consistent - xfs_check (3.0.1) doesn't report any problems. thanks, Michael From a.beregalov@gmail.com Tue Jun 2 06:32:17 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52BWHH4094353 for ; Tue, 2 Jun 2009 06:32:17 -0500 X-ASG-Debug-ID: 1243942352-0cac02ff0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-fx0-f177.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0C1C72C61B9 for ; Tue, 2 Jun 2009 04:32:33 -0700 (PDT) Received: from mail-fx0-f177.google.com (mail-fx0-f177.google.com [209.85.220.177]) by cuda.sgi.com with ESMTP id vUAqDc9jvMBuRJUi for ; Tue, 02 Jun 2009 04:32:33 -0700 (PDT) Received: by fxm25 with SMTP id 25so7705757fxm.20 for ; Tue, 02 Jun 2009 04:32:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=5uM19+pS4LFP3ocAAtjcGdO9pb4OKxQtJzS3uuMpk8o=; b=u4iZFd+OE4HNoYmWR/+UqtxeqVmHzS5yrsp3Sr4rrHgLIle1gvms0upvAmAW2gkcxA MKxVjCtpFhHrtZNSzYmkennEwfrme5CEb6D33XLhbj7tUL3RAfXiJx+8t73CzLp5pBlv UP4xZ+3AuFUkjcOT3WCJaRkxKyRC/Ttgm9HVg= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; b=Ff0b9w5Y7a+mZYiptkgb4WqZ/x6K+voSRd/LYEfVDjqClQ+1vwb5DRuvtRtBVWU3yN oiJI/lWT+T3sVt/gEwzpdCQawXpGY2tJ3x8shlagQKFRn6J+1CEN00ACngtypQuW4+uB TGRNdo7RyMAbhzz3zHcRFrMvdO5YELAC74NP8= MIME-Version: 1.0 Received: by 10.204.52.2 with SMTP id f2mr6790086bkg.90.1243942352236; Tue, 02 Jun 2009 04:32:32 -0700 (PDT) In-Reply-To: References: Date: Tue, 2 Jun 2009 15:32:32 +0400 Message-ID: X-ASG-Orig-Subj: Re: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! Subject: Re: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! From: Alexander Beregalov To: Felix Blyakher Cc: Kernel Testers List , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-fx0-f177.google.com[209.85.220.177] X-Barracuda-Start-Time: 1243942354 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.27374 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Again similar trace: Assertion failed: *nmap >= 1, file: fs/xfs/xfs_bmap.c, line: 4846 ------------[ cut here ]------------ kernel BUG at fs/xfs/support/debug.c:109! invalid opcode: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC last sysfs file: /sys/kernel/uevent_seqnum CPU 0 Modules linked in: Pid: 1988, comm: emerge Not tainted 2.6.30-rc7-00227-gd9244b5 #66 PowerEdge 1950 RIP: 0010:[] [] assfail+0x2b/0x30 RSP: 0018:ffff88006db6bb98 EFLAGS: 00010246 RAX: 0000000000000054 RBX: 0000000000000000 RCX: 0000000000000000 RDX: 0000000000000000 RSI: ffff880077336558 RDI: 0000000010000000 RBP: ffff88006db6bba8 R08: ffff880077335e10 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000001 R12: 0000000800000000 R13: ffff8800581f2980 R14: 0000000000000002 R15: ffff88007eb87000 FS: 00007f63e31586f0(0000) GS:ffff880005000000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000001d04024 CR3: 000000005a70e000 CR4: 00000000000006e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Process emerge (pid: 1988, threadinfo ffff88006db6a000, task ffff880077335e10) Stack: ffff88006db6bbd8 00000000b772307d ffff88006db6bd88 ffffffff803d6bdd ffff880077335e10 ffffffff802d429b ffff880050450480 ffff88007e32e800 ffff88006db6bc08 ffffffff80280e6d 0000000000000000 00000000b772307d Call Trace: [] xfs_bmapi+0xad/0x1ad0 [] ? kmem_cache_free+0xbb/0x140 [] ? trace_hardirqs_on_caller+0x17d/0x1e0 [] ? xfs_buf_free+0xd7/0x130 [] ? _spin_unlock+0x3f/0x80 [] ? xfs_buf_rele+0x124/0x190 [] ? xfs_buf_unlock+0x3d/0x80 [] ? xfs_trans_brelse+0x219/0x2e0 [] ? xfs_da_brelse+0x7f/0x150 [] xfs_dir2_leaf_getdents+0x640/0x7b0 [] ? filldir+0x0/0x100 [] ? filldir+0x0/0x100 [] xfs_readdir+0x12c/0x140 [] ? filldir+0x0/0x100 [] xfs_file_readdir+0x47/0x70 [] vfs_readdir+0xd0/0xf0 [] sys_getdents+0x96/0x110 [] system_call_fastpath+0x16/0x1b Code: 55 89 d1 48 89 e5 48 89 f2 48 83 ec 10 48 89 fe 65 48 8b 04 25 28 00 00 00 48 89 45 f8 31 c0 48 c7 c7 78 73 83 80 e8 c5 a4 29 00 <0f> 0b eb fe 90 55 48 89 e5 41 57 49 89 d7 41 56 41 55 49 89 cd RIP [] assfail+0x2b/0x30 RSP From BATV+4d015a9e3df6a7aca34c+2109+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 2 07:14:01 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52CDwxN096844 for ; Tue, 2 Jun 2009 07:14:00 -0500 X-ASG-Debug-ID: 1243945241-160001610000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 339D7148D91B for ; Tue, 2 Jun 2009 05:20:41 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id DEFIvqQLn1MONyNd for ; Tue, 02 Jun 2009 05:20:41 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MBSse-0004Gy-P6; Tue, 02 Jun 2009 12:14:12 +0000 Date: Tue, 2 Jun 2009 08:14:12 -0400 From: Christoph Hellwig To: Marvin Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: fsr stucks in D-state Subject: Re: fsr stucks in D-state Message-ID: <20090602121412.GA16032@infradead.org> References: <200906011233.39721.marvin24@gmx.de> <200906020830.18866.marvin24@gmx.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200906020830.18866.marvin24@gmx.de> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1243945243 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Jun 02, 2009 at 08:30:18AM +0200, Marvin wrote: > I pulled from "git://oss.sgi.com/xfs/xfs for-linus", which seems to include > some deadlock fixes. Now, fsr no longer deadlocks, so this seems to be fixed. > Sorry for the noise. I'm pretty sure the fix was: xfs: fix double unlock in xfs_swap_extents() from Felix. From BATV+4d015a9e3df6a7aca34c+2109+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 2 07:38:37 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52Ccaax098184 for ; Tue, 2 Jun 2009 07:38:36 -0500 X-ASG-Debug-ID: 1243946333-2f7102c80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DF5F12C68D7 for ; Tue, 2 Jun 2009 05:38:53 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id F8Cj85D7Rl1XX66D for ; Tue, 02 Jun 2009 05:38:53 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MBTGX-0001BJ-1J; Tue, 02 Jun 2009 12:38:53 +0000 Date: Tue, 2 Jun 2009 08:38:53 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 8/9] Enable generic filesystems to be fsck'd Subject: Re: [PATCH 8/9] Enable generic filesystems to be fsck'd Message-ID: <20090602123852.GA4101@infradead.org> References: <1243450413-12681-1-git-send-email-sandeen@sandeen.net> <1243450413-12681-9-git-send-email-sandeen@sandeen.net> <20090528125128.GA13425@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090528125128.GA13425@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1243946333 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 28, 2009 at 08:51:28AM -0400, Christoph Hellwig wrote: > On Wed, May 27, 2009 at 01:53:32PM -0500, Eric Sandeen wrote: > > This includes a fair bit of rearranging to avoid code duplication, > > but the goal is to allow 'fsck -n -t $FSTYP $device' to be run on > > any generic filesystem. > > > > Any FS for which this doesn't work will need it's own fsck routine. > > Looks generally good, some comments: > > - I would get rid of _check_generic_test_fs and just opencode the > _check_generic_filesystem $TEST_DEV in the two callers. > - why the odd calling convention of _is_mounted which allows to > optionally pass the fstype? Currently we only have one caller > that doesn't pass it, and if we grow one that needs it I would > rather always pass it explicitly.. > > Btw, I seems like _check_testdir is never actually called, and I can't > really see a reason why it would be different from _check_test_fs. Here's a version with those changes and additionally making sure _check_test_fs continues to be a no-op for nfs and udf. Index: xfstests-dev/common.rc =================================================================== --- xfstests-dev.orig/common.rc 2009-06-02 12:12:24.000000000 +0000 +++ xfstests-dev/common.rc 2009-06-02 12:21:36.000000000 +0000 @@ -707,29 +707,29 @@ [ "$?" == "0" ] || _notrun "$qa_user user not defined." } -# check that a FS is mounted as XFS. if so, return mount point +# check that a FS on a device is mounted +# if so, return mount point # -_xfs_mounted() +_is_mounted() { if [ $# -ne 1 ] then - echo "Usage: _xfs_mounted device" 1>&2 + echo "Usage: _is_mounted device" 1>&2 exit 1 fi device=$1 - if _mount | grep "$device " | $AWK_PROG ' - /type xfs/ { print $3 ; exit 0 } - END { exit 1 } + if _mount | grep "$device " | $AWK_PROG -v pattern="type $FSTYP" ' + pattern { print $3 ; exit 0 } + END { exit 1 } ' then - echo "_xfs_mounted: $device is not a mounted XFS FS" + echo "_is_mounted: $device is not a mounted $FSTYP FS" exit 1 fi } - # remount a FS to a new mode (ro or rw) # _remount() @@ -749,14 +749,105 @@ fi } -# run xfs_check and friends on a FS. +# Run the apropriate repair/check on a filesystem # # if the filesystem is mounted, it's either remounted ro before being # checked or it's unmounted and then remounted # +# If set, we remount ro instead of unmounting for fsck USE_REMOUNT=0 +_umount_or_remount_ro() +{ + if [ $# -ne 1 ] + then + echo "Usage: _umount_or_remount_ro device" 1>&2 + exit 1 + fi + device=$1 + + if [ $USE_REMOUNT -eq 0 ] + then + mountpoint=`_is_mounted $device` + $UMOUNT_PROG $device + else + _remount $device ro + fi + echo "$mountpoint" +} + +_mount_or_remount_rw() +{ + if [ $# -ne 3 ] + then + echo "Usage: _mount_or_remount_rw opts device mountpoint" 1>&2 + exit 1 + fi + mount_opts=$1 + device=$2 + mountpoint=$3 + + if [ $USE_REMOUNT -eq 0 ] + then + if ! _mount -t $FSTYP $mount_opts $device $mountpoint + then + echo "!!! failed to remount $device on $mountpoint" + return 0 # ok=0 + fi + else + _remount $device rw + fi + + return 1 # ok=1 +} + +_check_generic_filesystem() +{ + device=$1 + + # If type is set, we're mounted + type=`_fs_type $device` + ok=1 + + if [ "$type" = "$FSTYP" ] + then + # mounted ... + mountpoint=`_umount_or_remount_ro $device` + fi + + fsck -t $FSTYP -n $device >$tmp.fsck 2>&1 + if [ $? -ne 0 ] + then + echo "_check_generic_filesystem: filesystem on $device is inconsistent (see $seq.full)" + + echo "_check_generic filesystem: filesystem on $device is inconsistent" >>$here/$seq.full + echo "*** fsck.$FSTYP output ***" >>$here/$seq.full + cat $tmp.fsck >>$here/$seq.full + echo "*** end fsck.$FSTYP output" >>$here/$seq.full + + ok=0 + fi + rm -f $tmp.fsck + + if [ $ok -eq 0 ] + then + echo "*** mount output ***" >>$here/$seq.full + _mount >>$here/$seq.full + echo "*** end mount output" >>$here/$seq.full + elif [ "$type" = "$FSTYP" ] + then + # was mounted ... + _mount_or_remount_rw "$MOUNT_OPTIONS" $device $mountpoint + ok=$? + fi + + [ $ok -eq 0 ] && exit 1 + return 0 +} + +# run xfs_check and friends on a FS. + _check_xfs_filesystem() { if [ $# -ne 3 ] @@ -787,15 +878,8 @@ if [ "$type" = "xfs" ] then - # mounted... - - if [ $USE_REMOUNT -eq 0 ] - then - mountpoint=`_xfs_mounted $device` - $UMOUNT_PROG $device - else - _remount $device ro - fi + # mounted ... + mountpoint=`_umount_or_remount_ro $device` fi $XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ @@ -848,17 +932,7 @@ echo "*** end mount output" >>$here/$seq.full elif [ "$type" = "xfs" ] then - # mounted... - if [ $USE_REMOUNT -eq 0 ] - then - if ! _mount -t xfs $extra_mount_options $device $mountpoint - then - echo "!!! failed to remount $device on $mountpoint" - ok=0 - fi - else - _remount $device rw - fi + _mount_or_remount_rw "$extra_mount_options" $device $mountpoint fi [ $ok -eq 0 ] && exit 1 @@ -908,12 +982,8 @@ } -_check_test_fs() +_check_xfs_test_fs() { - if [ "$FSTYP" != "xfs" ]; then - return - fi - TEST_LOG="none" TEST_RT="none" [ "$USE_EXTERNAL" = yes -a ! -z "$TEST_LOGDEV" ] && \ @@ -932,6 +1002,24 @@ fi } +_check_test_fs() +{ + case $FSTYP in + xfs) + _check_xfs_test_fs + ;; + nfs) + # no way to check consistency for nfs + ;; + udf) + # do nothing for now + ;; + *) + _check_generic_filesystem $TEST_DEV + ;; + esac +} + _check_scratch_fs() { case $FSTYP in @@ -953,6 +1041,7 @@ # Don't know how to check an NFS filesystem, yet. ;; *) + _check_generic_filesystem $SCRATCH_DEV ;; esac } @@ -987,25 +1076,6 @@ echo "$os/$platform $host $kernel" } -_check_testdir() -{ - case $FSTYP in - xfs) - _check_test_fs - ;; - udf) - _cleanup_testdir - _check_scratch_fs - _scratch_mount - ;; - nfs*) - # Don't know how to check an NFS filesystem, yet. - ;; - *) - ;; - esac -} - _setup_udf_scratchdir() { [ "$FSTYP" != "udf" ] \ From felixb@sgi.com Tue Jun 2 08:24:36 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52DOaYG100807 for ; Tue, 2 Jun 2009 08:24:36 -0500 Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay2.corp.sgi.com (Postfix) with ESMTP id 12D3C30408F for ; Tue, 2 Jun 2009 06:24:51 -0700 (PDT) Received: from [IPv6???1] (sshgate.corp.sgi.com [198.149.20.12]) by estes.americas.sgi.com (Postfix) with ESMTP id 4F2317000103; Tue, 2 Jun 2009 08:24:49 -0500 (CDT) Cc: Eric Sandeen , Christoph Hellwig , xfs@oss.sgi.com Message-Id: <8637EA4C-FD28-4733-9532-062DFBA746DA@sgi.com> From: Felix Blyakher To: Michael Weissenbacher In-Reply-To: <4A24FEF9.6050309@dermichi.com> Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v930.3) Subject: Re: regarding the inode64 mount option Date: Tue, 2 Jun 2009 08:24:47 -0500 References: <4A1E81D8.7010706@dermichi.com> <20090528145612.GA14684@infradead.org> <4A1EAB31.7090604@sandeen.net> <4A24FEF9.6050309@dermichi.com> X-Mailer: Apple Mail (2.930.3) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Jun 2, 2009, at 5:29 AM, Michael Weissenbacher wrote: > Hi Eric + Christoph! >> http://sandeen.net/wordpress/?p=9 > This is a scary list indeed! Does this apply only to Fedora on i686 > or also to x86_64? > > In general, does the inode64 option make sense at all on a partition > that is <1TB in size? inode64 doesn't do anything on a partition smaller than 1TB. >> Actually they should still be accessible, we just won't create new >> inodes not addressable by 32bit inode numbers. > Well, in my tests it didn't work. Indeed. (I thought I already replied stating this, but found my mail in Drafts folder). What you're seeing is expected result, which was observed in our environment as well. [snip] > The filesystem is consistent - xfs_check (3.0.1) doesn't report any > problems. Right, filesystem is still consistent. And xfs_check/xfs_repair has no idea that filesystem may be mounted without the inode64. Felix From sandeen@sandeen.net Tue Jun 2 10:10:42 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52FAfiZ107769 for ; Tue, 2 Jun 2009 10:10:42 -0500 X-ASG-Debug-ID: 1243955844-521303a40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8E3981041671 for ; Tue, 2 Jun 2009 08:17:24 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id G8ryaZ0Y5QEjrkAX for ; Tue, 02 Jun 2009 08:17:24 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n52FAk71015096; Tue, 2 Jun 2009 11:10:47 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n52FAkn0015097; Tue, 2 Jun 2009 11:10:46 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n52FAjfP021047; Tue, 2 Jun 2009 11:10:45 -0400 Message-ID: <4A2540F4.4050204@sandeen.net> Date: Tue, 02 Jun 2009 10:10:44 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 8/9] Enable generic filesystems to be fsck'd Subject: Re: [PATCH 8/9] Enable generic filesystems to be fsck'd References: <1243450413-12681-1-git-send-email-sandeen@sandeen.net> <1243450413-12681-9-git-send-email-sandeen@sandeen.net> <20090528125128.GA13425@infradead.org> <20090602123852.GA4101@infradead.org> In-Reply-To: <20090602123852.GA4101@infradead.org> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1243955846 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.27389 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > On Thu, May 28, 2009 at 08:51:28AM -0400, Christoph Hellwig wrote: >> On Wed, May 27, 2009 at 01:53:32PM -0500, Eric Sandeen wrote: >>> This includes a fair bit of rearranging to avoid code duplication, >>> but the goal is to allow 'fsck -n -t $FSTYP $device' to be run on >>> any generic filesystem. >>> >>> Any FS for which this doesn't work will need it's own fsck routine. >> Looks generally good, some comments: >> >> - I would get rid of _check_generic_test_fs and just opencode the >> _check_generic_filesystem $TEST_DEV in the two callers. >> - why the odd calling convention of _is_mounted which allows to >> optionally pass the fstype? Currently we only have one caller >> that doesn't pass it, and if we grow one that needs it I would >> rather always pass it explicitly.. >> >> Btw, I seems like _check_testdir is never actually called, and I can't >> really see a reason why it would be different from _check_test_fs. > > Here's a version with those changes and additionally making sure > _check_test_fs continues to be a no-op for nfs and udf. Thanks :) nitpicky comments below, mostly probably nitpicking stuff that was in my original patch ;) > Index: xfstests-dev/common.rc > =================================================================== > --- xfstests-dev.orig/common.rc 2009-06-02 12:12:24.000000000 +0000 > +++ xfstests-dev/common.rc 2009-06-02 12:21:36.000000000 +0000 > @@ -707,29 +707,29 @@ > [ "$?" == "0" ] || _notrun "$qa_user user not defined." > } > > -# check that a FS is mounted as XFS. if so, return mount point > +# check that a FS on a device is mounted > +# if so, return mount point > # > -_xfs_mounted() > +_is_mounted() > { > if [ $# -ne 1 ] > then > - echo "Usage: _xfs_mounted device" 1>&2 > + echo "Usage: _is_mounted device" 1>&2 > exit 1 > fi > > device=$1 > > - if _mount | grep "$device " | $AWK_PROG ' > - /type xfs/ { print $3 ; exit 0 } > - END { exit 1 } > + if _mount | grep "$device " | $AWK_PROG -v pattern="type $FSTYP" ' > + pattern { print $3 ; exit 0 } > + END { exit 1 } > ' > then > - echo "_xfs_mounted: $device is not a mounted XFS FS" > + echo "_is_mounted: $device is not a mounted $FSTYP FS" > exit 1 > fi > } > > - > # remount a FS to a new mode (ro or rw) > # > _remount() > @@ -749,14 +749,105 @@ > fi > } > > -# run xfs_check and friends on a FS. > +# Run the apropriate repair/check on a filesystem appropriate (that was probably my typo to start with!) > # > # if the filesystem is mounted, it's either remounted ro before being > # checked or it's unmounted and then remounted > # > > +# If set, we remount ro instead of unmounting for fsck > USE_REMOUNT=0 > > +_umount_or_remount_ro() > +{ > + if [ $# -ne 1 ] > + then > + echo "Usage: _umount_or_remount_ro device" 1>&2 might be clearer > + exit 1 > + fi > + device=$1 > + > + if [ $USE_REMOUNT -eq 0 ] > + then > + mountpoint=`_is_mounted $device` > + $UMOUNT_PROG $device > + else > + _remount $device ro > + fi > + echo "$mountpoint" Maybe we should move the mountpoint assignment outside the conditional, since we echo it unconditionally. Only the !USE_REMOUNT case cares anyway but still... > +} > + > +_mount_or_remount_rw() > +{ > + if [ $# -ne 3 ] > + then > + echo "Usage: _mount_or_remount_rw opts device mountpoint" 1>&2 > + exit 1 > + fi > + mount_opts=$1 > + device=$2 > + mountpoint=$3 > + > + if [ $USE_REMOUNT -eq 0 ] > + then > + if ! _mount -t $FSTYP $mount_opts $device $mountpoint > + then > + echo "!!! failed to remount $device on $mountpoint" > + return 0 # ok=0 > + fi > + else > + _remount $device rw > + fi > + > + return 1 # ok=1 > +} # Check a generic filesystem in no-op mode; this assumes that the # underlying fsck program accepts "-n" for a no-op (check-only) run, # and that it will still return an errno for corruption in this mode. # # Filesystems which don't support this will need to define their # own check routine. > +_check_generic_filesystem() > +{ > + device=$1 > + > + # If type is set, we're mounted > + type=`_fs_type $device` > + ok=1 > + > + if [ "$type" = "$FSTYP" ] > + then > + # mounted ... > + mountpoint=`_umount_or_remount_ro $device` > + fi > + > + fsck -t $FSTYP -n $device >$tmp.fsck 2>&1 > + if [ $? -ne 0 ] > + then > + echo "_check_generic_filesystem: filesystem on $device is inconsistent (see $seq.full)" > + > + echo "_check_generic filesystem: filesystem on $device is inconsistent" >>$here/$seq.full > + echo "*** fsck.$FSTYP output ***" >>$here/$seq.full > + cat $tmp.fsck >>$here/$seq.full > + echo "*** end fsck.$FSTYP output" >>$here/$seq.full > + > + ok=0 > + fi > + rm -f $tmp.fsck > + > + if [ $ok -eq 0 ] > + then > + echo "*** mount output ***" >>$here/$seq.full > + _mount >>$here/$seq.full > + echo "*** end mount output" >>$here/$seq.full > + elif [ "$type" = "$FSTYP" ] > + then > + # was mounted ... > + _mount_or_remount_rw "$MOUNT_OPTIONS" $device $mountpoint oops tab vs. space here > + ok=$? > + fi > + > + [ $ok -eq 0 ] && exit 1 > + return 0 > +} > + > +# run xfs_check and friends on a FS. > + > _check_xfs_filesystem() > { > if [ $# -ne 3 ] > @@ -787,15 +878,8 @@ > > if [ "$type" = "xfs" ] > then > - # mounted... > - > - if [ $USE_REMOUNT -eq 0 ] > - then > - mountpoint=`_xfs_mounted $device` > - $UMOUNT_PROG $device > - else > - _remount $device ro > - fi > + # mounted ... > + mountpoint=`_umount_or_remount_ro $device` > fi > > $XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ > @@ -848,17 +932,7 @@ > echo "*** end mount output" >>$here/$seq.full > elif [ "$type" = "xfs" ] > then > - # mounted... > - if [ $USE_REMOUNT -eq 0 ] > - then > - if ! _mount -t xfs $extra_mount_options $device $mountpoint > - then > - echo "!!! failed to remount $device on $mountpoint" > - ok=0 > - fi > - else > - _remount $device rw > - fi > + _mount_or_remount_rw "$extra_mount_options" $device $mountpoint > fi > > [ $ok -eq 0 ] && exit 1 > @@ -908,12 +982,8 @@ > > } > > -_check_test_fs() > +_check_xfs_test_fs() > { > - if [ "$FSTYP" != "xfs" ]; then > - return > - fi > - > TEST_LOG="none" > TEST_RT="none" > [ "$USE_EXTERNAL" = yes -a ! -z "$TEST_LOGDEV" ] && \ > @@ -932,6 +1002,24 @@ > fi > } > > +_check_test_fs() > +{ > + case $FSTYP in > + xfs) > + _check_xfs_test_fs > + ;; > + nfs) > + # no way to check consistency for nfs > + ;; > + udf) > + # do nothing for now > + ;; > + *) > + _check_generic_filesystem $TEST_DEV fix indentation here ... > + ;; > + esac > +} > + > _check_scratch_fs() > { > case $FSTYP in > @@ -953,6 +1041,7 @@ > # Don't know how to check an NFS filesystem, yet. > ;; > *) > + _check_generic_filesystem $SCRATCH_DEV > ;; > esac > } > @@ -987,25 +1076,6 @@ > echo "$os/$platform $host $kernel" > } > > -_check_testdir() > -{ > - case $FSTYP in > - xfs) > - _check_test_fs > - ;; > - udf) > - _cleanup_testdir > - _check_scratch_fs > - _scratch_mount > - ;; > - nfs*) > - # Don't know how to check an NFS filesystem, yet. > - ;; > - *) > - ;; > - esac > -} > - > _setup_udf_scratchdir() > { > [ "$FSTYP" != "udf" ] \ > From felixb@sgi.com Tue Jun 2 11:13:09 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52GD85X111227 for ; Tue, 2 Jun 2009 11:13:09 -0500 Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6979030408F for ; Tue, 2 Jun 2009 09:13:23 -0700 (PDT) Received: from eagdhcp-233-184.americas.sgi.com (eagdhcp-233-184.americas.sgi.com [128.162.233.184]) by estes.americas.sgi.com (Postfix) with ESMTP id 36EE77000103; Tue, 2 Jun 2009 11:13:23 -0500 (CDT) Cc: Michael Weissenbacher , xfs@oss.sgi.com Message-Id: <7945FF47-2A9B-46D8-9A49-3D7070AAC1E8@sgi.com> From: Felix Blyakher To: Christoph Hellwig In-Reply-To: <20090528145612.GA14684@infradead.org> Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v926) Subject: Re: regarding the inode64 mount option Date: Tue, 2 Jun 2009 11:13:22 -0500 References: <4A1E81D8.7010706@dermichi.com> <20090528145612.GA14684@infradead.org> X-Mailer: Apple Mail (2.926) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean [my unsent mail from yesterday, mostly for the second blob] On May 28, 2009, at 9:56 AM, Christoph Hellwig wrote: > On Thu, May 28, 2009 at 02:21:44PM +0200, Michael Weissenbacher wrote: >> Hi XFS-List! >> I understand that the inode64 mount option allows inodes to be >> created beyond 1TB. There are also certain performance problems >> that can be cured by using this option when handling LOTS of >> inodes. During my tests i noticed that enabling it is like a one- >> way street. Inodes created with inode64 enabled aren't accessible >> when the option is left out. > > Actually they should still be accessible, we just won't create new > inodes not addressable by 32bit inode numbers. The inodes are indeed accessible by most apps, but those 32bit apps using stat() (vs. stat64() ) will get confused and may bailout processing such inodes all together. >> Now i got a few questions: >> - Does the inode64 option work only on 64bit architectures or is it >> also possible to use it with i686 > > It is available for 32bit kernels starting with kernel 2.6.29. > >> - Is there a way to convert the inodes back > > There's an xfs_reno tool ported from IRIX to renumber the inodes. > I'll > see if I can finally get it packaged. > >> - Why doesn't the filesystem remember that inode64 was used in the >> past and enable it automatically > > Good question. We could introduce a flag in the superblock for this. Agree, it's a good idea to record that inode64 was used on previous mount, but I don't think we should enable it automatically. Though, providing the warning will be good. Felix From sandeen@sandeen.net Tue Jun 2 12:16:38 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_31, J_CHICKENPOX_42,J_CHICKENPOX_43,J_CHICKENPOX_44,J_CHICKENPOX_45, J_CHICKENPOX_48,J_CHICKENPOX_52,J_CHICKENPOX_56,J_CHICKENPOX_62, J_CHICKENPOX_63,J_CHICKENPOX_66,J_CHICKENPOX_92 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52HGb5l115046 for ; Tue, 2 Jun 2009 12:16:37 -0500 X-ASG-Debug-ID: 1243963400-725202650000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2DF811042A7C for ; Tue, 2 Jun 2009 10:23:20 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id sCR1celo8GNkGz9Y for ; Tue, 02 Jun 2009 10:23:20 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n52HGoNd018534 for ; Tue, 2 Jun 2009 13:16:50 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n52HGnUr003014 for ; Tue, 2 Jun 2009 13:16:50 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n52HGmo3011924 for ; Tue, 2 Jun 2009 13:16:49 -0400 Message-ID: <4A255E80.9000209@sandeen.net> Date: Tue, 02 Jun 2009 12:16:48 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH V3] xfstests: add aio-dio-regress tests Subject: [PATCH V3] xfstests: add aio-dio-regress tests Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1243963403 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-ASG-Whitelist: BODY (http://marc\.info/\?) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Pull in the aio-dio-regress test suite from http://git.kernel.org/?p=linux/kernel/git/zab/aio-dio-regress.git This now has all the right copyright signoffs too. Signed-off-by: Eric Sandeen --- .gitignore | 6 207 | 57 ++ 207.out | 3 208 | 57 ++ 208.out | 3 209 | 57 ++ 209.out | 3 210 | 57 ++ 210.out | 3 211 | 57 ++ 211.out | 3 212 | 58 +++ 212.out | 3 group | 6 src/Makefile | 6 src/aio-dio-regress/Makefile | 20 + src/aio-dio-regress/SOURCE | 7 src/aio-dio-regress/aio-dio-extend-stat.c | 181 +++++++++ src/aio-dio-regress/aio-dio-invalidate-failure.c | 174 +++++++++ src/aio-dio-regress/aio-dio-invalidate-readahead.c | 191 ++++++++++ src/aio-dio-regress/aio-dio-subblock-eof-read.c | 115 ++++++ src/aio-dio-regress/aio-free-ring-with-bogus-nr-pages.c | 85 ++++ src/aio-dio-regress/aio-io-setup-with-nonwritable-context-pointer.c | 51 ++ diff --git a/.gitignore b/.gitignore index 2cd722b..d7cbab1 100644 --- a/.gitignore +++ b/.gitignore @@ -88,3 +88,9 @@ src/unwritten_sync src/usemem src/writemod src/xfsctl +src/aio-dio-regress/aio-dio-extend-stat +src/aio-dio-regress/aio-dio-invalidate-failure +src/aio-dio-regress/aio-dio-invalidate-readahead +src/aio-dio-regress/aio-dio-subblock-eof-read +src/aio-dio-regress/aio-free-ring-with-bogus-nr-pages +src/aio-dio-regress/aio-io-setup-with-nonwritable-context-pointer diff --git a/207 b/207 new file mode 100755 index 0000000..1ac249f --- /dev/null +++ b/207 @@ -0,0 +1,57 @@ +#! /bin/sh +# FS QA Test No. 207 +# +# Run aio-dio-extend-stat - test race in dio aio completion +# +#----------------------------------------------------------------------- +# Copyright (c) 2009 Eric Sandeen. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=sandeen@sandeen.net + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +_supported_fs generic +_supported_os Linux + +AIO_TEST=aio-dio-extend-stat + +rm -f $TEST_DIR/aio-testfile +echo "==${AIO_TEST}==" +src/aio-dio-regress/$AIO_TEST $TEST_DIR/aio-testfile 2>&1 +status=$? +rm -f $TEST_DIR/aio-testfile + +exit diff --git a/207.out b/207.out new file mode 100644 index 0000000..1841efb --- /dev/null +++ b/207.out @@ -0,0 +1,3 @@ +QA output created by 207 +==aio-dio-extend-stat== +4000 iterations of racing extensions and collection passed diff --git a/208 b/208 new file mode 100755 index 0000000..61bfbae --- /dev/null +++ b/208 @@ -0,0 +1,57 @@ +#! /bin/sh +# FS QA Test No. 208 +# +# Run aio-dio-invalidate-failure - test race in read cache invalidation +# +#----------------------------------------------------------------------- +# Copyright (c) 2009 Eric Sandeen. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=sandeen@sandeen.net + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +_supported_fs generic +_supported_os Linux + +AIO_TEST=aio-dio-invalidate-failure + +rm -f $TEST_DIR/aio-testfile +echo "==${AIO_TEST}==" +src/aio-dio-regress/$AIO_TEST $TEST_DIR/aio-testfile 2>&1 +status=$? +rm -f $TEST_DIR/aio-testfile + +exit diff --git a/208.out b/208.out new file mode 100644 index 0000000..c222c41 --- /dev/null +++ b/208.out @@ -0,0 +1,3 @@ +QA output created by 208 +==aio-dio-invalidate-failure== +ran for 200 seconds without error, passing diff --git a/209 b/209 new file mode 100755 index 0000000..444178b --- /dev/null +++ b/209 @@ -0,0 +1,57 @@ +#! /bin/sh +# FS QA Test No. 209 +# +# Run aio-dio-invalidate-readahead - test sync DIO invalidation of readahead +# +#----------------------------------------------------------------------- +# Copyright (c) 2009 Eric Sandeen. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=sandeen@sandeen.net + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +_supported_fs generic +_supported_os Linux + +AIO_TEST=aio-dio-invalidate-readahead + +rm -f $TEST_DIR/aio-testfile +echo "==${AIO_TEST}==" +src/aio-dio-regress/$AIO_TEST $TEST_DIR/aio-testfile 2>&1 +status=$? +rm -f $TEST_DIR/aio-testfile + +exit diff --git a/209.out b/209.out new file mode 100644 index 0000000..db90b67 --- /dev/null +++ b/209.out @@ -0,0 +1,3 @@ +QA output created by 209 +==aio-dio-invalidate-readahead== +test ran for 30 seconds without error diff --git a/210 b/210 new file mode 100755 index 0000000..594cae5 --- /dev/null +++ b/210 @@ -0,0 +1,57 @@ +#! /bin/sh +# FS QA Test No. 210 +# +# Run aio-dio-subblock-eof-read - test AIO read of last block of DIO file +# +#----------------------------------------------------------------------- +# Copyright (c) 2009 Eric Sandeen. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=sandeen@sandeen.net + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +_supported_fs generic +_supported_os Linux + +AIO_TEST=aio-dio-subblock-eof-read + +rm -f $TEST_DIR/aio-testfile +echo "==${AIO_TEST}==" +src/aio-dio-regress/$AIO_TEST $TEST_DIR/aio-testfile 2>&1 +status=$? +rm -f $TEST_DIR/aio-testfile + +exit diff --git a/210.out b/210.out new file mode 100644 index 0000000..01012fb --- /dev/null +++ b/210.out @@ -0,0 +1,3 @@ +QA output created by 210 +==aio-dio-subblock-eof-read== +AIO read of last block in file succeeded. diff --git a/211 b/211 new file mode 100755 index 0000000..1ce9121 --- /dev/null +++ b/211 @@ -0,0 +1,57 @@ +#! /bin/sh +# FS QA Test No. 211 +# +# Run aio-free-ring-with-bogus-nr-pages - test aio_setup_ring with bad nr_pages +# +#----------------------------------------------------------------------- +# Copyright (c) 2009 Eric Sandeen. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=sandeen@sandeen.net + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +_supported_fs generic +_supported_os Linux + +AIO_TEST=aio-free-ring-with-bogus-nr-pages + +rm -f $TEST_DIR/aio-testfile +echo "==${AIO_TEST}==" +src/aio-dio-regress/$AIO_TEST $TEST_DIR/aio-testfile 2>&1 +status=$? +rm -f $TEST_DIR/aio-testfile + +exit diff --git a/211.out b/211.out new file mode 100644 index 0000000..bec76b7 --- /dev/null +++ b/211.out @@ -0,0 +1,3 @@ +QA output created by 211 +==aio-free-ring-with-bogus-nr-pages== +aio-free-ring-with-bogus-nr-pages: Success! diff --git a/212 b/212 new file mode 100755 index 0000000..9b58863 --- /dev/null +++ b/212 @@ -0,0 +1,58 @@ +#! /bin/sh +# FS QA Test No. 212 +# +# Run aio-io-setup-with-nonwritable-context-pointer - +# Test what happens when a non-writable context pointer is passed to io_setup +# +#----------------------------------------------------------------------- +# Copyright (c) 2009 Eric Sandeen. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=sandeen@sandeen.net + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +_supported_fs generic +_supported_os Linux + +AIO_TEST=aio-io-setup-with-nonwritable-context-pointer + +rm -f $TEST_DIR/aio-testfile +echo "==${AIO_TEST}==" +src/aio-dio-regress/$AIO_TEST $TEST_DIR/aio-testfile 2>&1 +status=$? +rm -f $TEST_DIR/aio-testfile + +exit diff --git a/212.out b/212.out new file mode 100644 index 0000000..259d895 --- /dev/null +++ b/212.out @@ -0,0 +1,3 @@ +QA output created by 212 +==aio-io-setup-with-nonwritable-context-pointer== +aio-io-setup-with-nonwritable-context-pointer: Success! diff --git a/group b/group index 0551d06..b72fe7b 100644 --- a/group +++ b/group @@ -311,3 +311,9 @@ atime 204 metadata rw auto 205 metadata rw auto 206 growfs auto quick +207 generic auto aio quick +208 generic auto aio +209 generic auto aio +210 generic auto aio quick +211 generic auto aio quick +212 generic auto aio quick diff --git a/src/Makefile b/src/Makefile index 634e1b3..6e68b79 100644 --- a/src/Makefile +++ b/src/Makefile @@ -35,10 +35,14 @@ ifeq ($(PKG_PLATFORM),linux) TARGETS += t_immutable endif +ifeq ($(HAVE_AIO), true) +SUBDIRS += aio-dio-regress +endif + CFILES = $(TARGETS:=.c) LDIRT = $(TARGETS) -default: $(TARGETS) +default: $(TARGETS) $(SUBDIRS) include $(BUILDRULES) LINKTEST = $(LTLINK) $@.c -o $@ $(CFLAGS) $(LDFLAGS) diff --git a/src/aio-dio-regress/Makefile b/src/aio-dio-regress/Makefile new file mode 100644 index 0000000..9968093 --- /dev/null +++ b/src/aio-dio-regress/Makefile @@ -0,0 +1,20 @@ +TOPDIR = ../.. +include $(TOPDIR)/include/builddefs + +TARGETS = $(basename $(wildcard *.c)) + +CFILES = $(TARGETS:=.c) +LDIRT = $(TARGETS) + +LIBAIO = -laio -lpthread + +default: $(TARGETS) + +include $(BUILDRULES) + +$(TARGETS): %: %.c + $(CC) -g -Wall $(LIBAIO) -o $@ $*.c + +install: + $(INSTALL) -m 755 -d $(PKG_LIB_DIR)/src/aio-dio-regress + $(INSTALL) -m 755 $(TARGETS) $(PKG_LIB_DIR)/src/aio-dio-regress diff --git a/src/aio-dio-regress/SOURCE b/src/aio-dio-regress/SOURCE new file mode 100644 index 0000000..b45ff0b --- /dev/null +++ b/src/aio-dio-regress/SOURCE @@ -0,0 +1,7 @@ +From: +http://www.kernel.org/pub/scm/linux/kernel/git/zab/aio-dio-regress.git + +description AIO and DIO regression tests +owner Zach Brown +URL git://git.kernel.org/pub/scm/linux/kernel/git/zab/aio-dio-regress.git + http://www.kernel.org/pub/scm/linux/kernel/git/zab/aio-dio-regress.git diff --git a/src/aio-dio-regress/aio-dio-extend-stat.c b/src/aio-dio-regress/aio-dio-extend-stat.c new file mode 100644 index 0000000..c274e58 --- /dev/null +++ b/src/aio-dio-regress/aio-dio-extend-stat.c @@ -0,0 +1,181 @@ +/* + * aio-dio-extend-stat - test race in dio aio completion + * Copyright (C) 2006 Rafal Wijata + * + * 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; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#define __USE_GNU +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef O_DIRECT +#define O_DIRECT 040000 /* direct disk access hint */ +#endif + +/* + * This was originally submitted to + * http://bugzilla.kernel.org/show_bug.cgi?id=6831 by + * Rafal Wijata . It caught a race in dio aio completion + * that would call aio_complete() before the dio callers would update i_size. + * A stat after io_getevents() would not see the new file size. + * + * The bug was fixed in the fs/direct-io.c completion reworking that appeared + * in 2.6.20. This test should fail on 2.6.19. + */ + +#define BUFSIZE 1024 + +static unsigned char buf[BUFSIZE] __attribute((aligned (4096))); + +/* + * this was arbitrarily chosen to take about two seconds on a dual athlon in a + * debugging kernel.. it trips up long before that. + */ +#define MAX_AIO_EVENTS 4000 + +#define fail(fmt , args...) do {\ + printf(fmt , ##args); \ + exit(1); \ +} while (0) + +void fun_write1(void* ptr); +void fun_writeN(void* ptr); +void fun_read(void* ptr); + +int handle = 0; +io_context_t ctxp; +struct iocb *iocbs[MAX_AIO_EVENTS]; +struct io_event ioevents[MAX_AIO_EVENTS]; + +volatile int submittedSize = 0; //synchronization + +int main(int argc, char **argv) +{ + pthread_t thread_read; + pthread_t thread_write; + int i; + int ret; + + if (argc != 2) + fail("only arg should be file name\n"); + + for (i = 0; i < BUFSIZE; ++i) + buf[i] = 'A' + (char)(i % ('Z'-'A'+1)); + + buf[BUFSIZE-1] = '\n'; + + handle = open(argv[1], O_CREAT | O_TRUNC | O_DIRECT | O_RDWR, 0600); + if (handle == -1) + fail("failed to open test file %s, errno: %d\n", + argv[1], errno); + + memset(&ctxp, 0, sizeof(ctxp)); + ret = io_setup(MAX_AIO_EVENTS, &ctxp); + if (ret) + fail("io_setup returned %d\n", ret); + + for (i = 0; i < MAX_AIO_EVENTS; ++i) { + + iocbs[i] = calloc(1, sizeof(struct iocb)); + if (iocbs[i] == NULL) + fail("failed to allocate an iocb\n"); + +/* iocbs[i]->data = i; */ + iocbs[i]->aio_fildes = handle; + iocbs[i]->aio_lio_opcode = IO_CMD_PWRITE; + iocbs[i]->aio_reqprio = 0; + iocbs[i]->u.c.buf = buf; + iocbs[i]->u.c.nbytes = BUFSIZE; + iocbs[i]->u.c.offset = BUFSIZE*i; + } + + pthread_create(&thread_read, NULL, (void*)&fun_read, NULL); + pthread_create(&thread_write, NULL, (void*)&fun_writeN, NULL); + + pthread_join(thread_read, NULL); + pthread_join(thread_write, NULL); + + io_destroy(ctxp); + close(handle); + + printf("%u iterations of racing extensions and collection passed\n", + MAX_AIO_EVENTS); + + return 0; +} + +void fun_read(void *ptr) +{ + long n = MAX_AIO_EVENTS; + struct stat filestat; + long long exSize; + long i; + long r; + + while (n > 0) { + r = io_getevents(ctxp, 1, MAX_AIO_EVENTS, ioevents, NULL); + if (r < 0) + fail("io_getevents returned %ld\n", r); + + n -= r; + for (i = 0; i < r; ++i) { + if (ioevents[i].obj->u.c.nbytes != BUFSIZE) + fail("error in block: expacted %d bytes, " + "receiced %ld\n", BUFSIZE, + ioevents[i].obj->u.c.nbytes); + + exSize = ioevents[i].obj->u.c.offset + + ioevents[i].obj->u.c.nbytes; + fstat(handle, &filestat); + if (filestat.st_size < exSize) + fail("write of %lu bytes @%llu finished, " + "expected filesize at least %llu, but " + "got %ld\n", ioevents[i].obj->u.c.nbytes, + ioevents[i].obj->u.c.offset, exSize, + filestat.st_size); + } + } +} + +void fun_writeN(void *ptr) +{ + int i; + int ret; + + for(i = 0; i < MAX_AIO_EVENTS; ++i) { + ret = io_submit(ctxp, 1, &(iocbs[i])); + if (ret != 1) + fail("io_subit returned %d instead of 1\n", ret); + } +} + +void fun_write1(void *ptr) +{ + int ret; + + ret = io_submit(ctxp, MAX_AIO_EVENTS, iocbs); + if (ret != MAX_AIO_EVENTS) + fail("io_subit returned %d instead of %u\n", ret, + MAX_AIO_EVENTS); +} diff --git a/src/aio-dio-regress/aio-dio-invalidate-failure.c b/src/aio-dio-regress/aio-dio-invalidate-failure.c new file mode 100644 index 0000000..a1a5df2 --- /dev/null +++ b/src/aio-dio-regress/aio-dio-invalidate-failure.c @@ -0,0 +1,174 @@ +/* + * aio-dio-invalidate-failure - test race in read cache invalidation + * Copyright (C) 2007 Zach Brown + * + * 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; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#define _XOPEN_SOURCE 500 /* pwrite */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * DIO invalidates the read cache after it writes. At one point it tried to + * return EIO if this failed. When called from AIO, though, this EIO return + * would clobber EIOCBQUEUED and cause fs/aio.c and fs/direct-io.c to complete + * an iocb twice. This typically references freed memory from an interrupt + * handler and oopses. + * + * This test hits the race after at most two minutes on a single spindle. It + * spins performing large dio writes. It also spins racing buffered writes. + * It assumes it's on ext3 using ordered writes. The ordered write bhs can be + * pinned by jbd as a transaction commits. If invalidate_inode_pages2_range() + * hits pages backed by those buffers ->releasepage will fail and it'll try to + * return -EIO. + */ +#ifndef O_DIRECT +#define O_DIRECT 040000 /* direct disk access hint */ +#endif + +#define GINORMOUS (32 * 1024 * 1024) + + +/* This test never survived to 180 seconds on a single spindle */ +#define SECONDS 200 + +static unsigned char buf[GINORMOUS] __attribute((aligned (4096))); + +#define fail(fmt , args...) do {\ + printf(fmt , ##args); \ + exit(1); \ +} while (0) + +void spin_dio(int fd) +{ + io_context_t ctx; + struct iocb iocb; + struct iocb *iocbs[1] = { &iocb }; + struct io_event event; + int ret; + + io_prep_pwrite(&iocb, fd, buf, GINORMOUS, 0); + + ret = io_queue_init(1, &ctx); + if (ret) + fail("io_queue_init returned %d", ret); + + while (1) { + ret = io_submit(ctx, 1, iocbs); + if (ret != 1) + fail("io_submit returned %d instead of 1", ret); + + ret = io_getevents(ctx, 1, 1, &event, NULL); + if (ret != 1) + fail("io_getevents returned %d instead of 1", ret); + + if (event.res == -EIO) { + printf("invalidation returned -EIO, OK\n"); + exit(0); + } + + if (event.res != GINORMOUS) + fail("event res %ld\n", event.res); + } +} + +void spin_buffered(int fd) +{ + int ret; + + while (1) { + ret = pwrite(fd, buf, GINORMOUS, 0); + if (ret != GINORMOUS) + fail("buffered write returned %d", ret); + } +} + +static void alarm_handler(int signum) +{ +} + +int main(int argc, char **argv) +{ + pid_t buffered_pid; + pid_t dio_pid; + pid_t pid; + int fd; + int fd2; + int status; + + if (argc != 2) + fail("only arg should be file name"); + + fd = open(argv[1], O_DIRECT|O_CREAT|O_RDWR, 0644); + if (fd < 0) + fail("open dio failed: %d\n", errno); + + fd2 = open(argv[1], O_RDWR, 0644); + if (fd < 0) + fail("open failed: %d\n", errno); + + buffered_pid = fork(); + if (buffered_pid < 0) + fail("fork failed: %d\n", errno); + + if (buffered_pid == 0) { + spin_buffered(fd2); + exit(0); + } + + dio_pid = fork(); + if (dio_pid < 0) { + kill(buffered_pid, SIGKILL); + fail("fork failed: %d\n", errno); + } + + if (dio_pid == 0) { + spin_dio(fd); + exit(0); + } + + signal(SIGALRM, alarm_handler); + alarm(SECONDS); + + pid = wait(&status); + if (pid < 0 && errno == EINTR) { + /* if we timed out then we're done */ + kill(buffered_pid, SIGKILL); + kill(dio_pid, SIGKILL); + printf("ran for %d seconds without error, passing\n", SECONDS); + exit(0); + } + + if (pid == dio_pid) + kill(buffered_pid, SIGKILL); + else + kill(dio_pid, SIGKILL); + + /* + * pass on the child's pass/fail return code or fail if the child + * didn't exit cleanly. + */ + exit(WIFEXITED(status) ? WEXITSTATUS(status) : 1); +} diff --git a/src/aio-dio-regress/aio-dio-invalidate-readahead.c b/src/aio-dio-regress/aio-dio-invalidate-readahead.c new file mode 100644 index 0000000..58ea8c0 --- /dev/null +++ b/src/aio-dio-regress/aio-dio-invalidate-readahead.c @@ -0,0 +1,191 @@ +/* + * aio-dio-invalidate-readahead - test sync DIO invalidation of readahead + * Copyright (C) 2007 Zach Brown + * + * 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; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#define _XOPEN_SOURCE 500 /* pwrite */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * sync DIO invalidates the read cache after it finishes the write. This + * is to invalidate cached pages which might have been brought in during + * the write. + * + * In http://lkml.org/lkml/2007/10/26/478 a user reported this failing + * for his case of readers and writers racing. It turned out that his + * reader wasn't actually racing with the writer, but read-ahead from + * the reader pushed reads up into the region that the writer was working + * on. + * + * This test reproduces his case. We have a writing thread tell + * a reading thread how far into the file it will find new data. + * The reader reads behind the writer, checking for stale data. + * If the kernel fails to invalidate the read-ahead after the + * write then the reader will see stale data. + */ +#ifndef O_DIRECT +#define O_DIRECT 040000 /* direct disk access hint */ +#endif + +#define FILE_SIZE (8 * 1024 * 1024) + +/* this test always failed before 10 seconds on a single spindle */ +#define SECONDS 30 + +#define fail(fmt , args...) do {\ + printf(fmt , ##args); \ + exit(1); \ +} while (0) + +int page_size; + +pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; +pthread_cond_t cond = PTHREAD_COND_INITIALIZER; +loff_t write_pos = 0; +loff_t read_pos = 0; +unsigned char byte = 0; + +static void *writer(void *arg) +{ + char *path = arg; + loff_t off; + void *buf; + int ret; + int fd; + time_t start = time(NULL); + + buf = memalign(page_size, page_size); + if (buf == NULL) + fail("failed to allocate an aligned page"); + + fd = open(path, O_DIRECT|O_CREAT|O_RDWR|O_TRUNC, 0644); + if (fd < 0) + fail("dio open failed: %d\n", errno); + + while (1) { + if ((time(NULL) - start) > SECONDS) { + printf("test ran for %u seconds without error\n", + SECONDS); + exit(0); + } + + pthread_mutex_lock(&mut); + while (read_pos != write_pos) + pthread_cond_wait(&cond, &mut); + byte++; + write_pos = 0; + pthread_mutex_unlock(&mut); + + memset(buf, byte, page_size); + + for (off = 0; off < FILE_SIZE; off += page_size) { + + ret = pwrite(fd, buf, page_size, off); + if (ret != page_size) + fail("write returned %d", ret); + + if ((rand() % 4) == 0) { + pthread_mutex_lock(&mut); + write_pos = off; + pthread_cond_signal(&cond); + pthread_mutex_unlock(&mut); + }; + } + } +} + +static void *reader(void *arg) +{ + char *path = arg; + unsigned char old; + loff_t read_to = 0; + void *found; + int fd; + int ret; + void *buf; + loff_t off; + + setvbuf(stdout, NULL, _IONBF, 0); + + buf = memalign(page_size, page_size); + if (buf == NULL) + fail("failed to allocate an aligned page"); + + fd = open(path, O_CREAT|O_RDONLY, 0644); + if (fd < 0) + fail("buffered open failed: %d\n", errno); + + while (1) { + pthread_mutex_lock(&mut); + read_pos = read_to; + pthread_cond_signal(&cond); + while (read_pos == write_pos) + pthread_cond_wait(&cond, &mut); + read_to = write_pos; + off = read_pos; + old = byte - 1; + pthread_mutex_unlock(&mut); + + for (; off < read_to; off += page_size) { + + ret = pread(fd, buf, page_size, off); + if (ret != page_size) + fail("write returned %d", ret); + + found = memchr(buf, old, page_size); + if (found) + fail("reader found old byte at pos %lu", + (unsigned long)off + + (unsigned long)found - + (unsigned long)buf); + } + } +} + +int main(int argc, char **argv) +{ + pthread_t reader_thread; + pthread_t writer_thread; + int ret; + + page_size = getpagesize(); + + if (argc != 2) + fail("only arg should be file name"); + + ret = pthread_create(&writer_thread, NULL, writer, argv[1]); + if (ret == 0) + ret = pthread_create(&reader_thread, NULL, reader, argv[1]); + if (ret) + fail("failed to start reader and writer threads: %d", ret); + + pthread_join(writer_thread, NULL); + pthread_join(reader_thread, NULL); + exit(0); +} diff --git a/src/aio-dio-regress/aio-dio-subblock-eof-read.c b/src/aio-dio-regress/aio-dio-subblock-eof-read.c new file mode 100644 index 0000000..cbcff97 --- /dev/null +++ b/src/aio-dio-regress/aio-dio-subblock-eof-read.c @@ -0,0 +1,115 @@ +/* + * aio-dio-subblock-eof-read - test AIO read of last block of DIO file + * Copyright (C) 2005 Jeff Moyer + * + * 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; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* + * Code taken from an example posted to linux-aio at kvack.org + * http://marc.info/?l=linux-aio&m=112263621431161&w=2 + * Original Author: Drangon Zhou + * Munged & rewritten by Jeff Moyer. + * + * Description: This source code implements a test to ensure that an AIO + * read of the last block in a file opened with O_DIRECT returns the proper + * amount of data. In the past, there was a bug that resulted in a return + * value of the requested block size, when in fact there was only a fraction + * of that data available. Thus, if the last data block contained 300 bytes + * worth of data, and the user issued a 4k read, we want to ensure that + * the return value is 300, not 4k. + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include + +/* Create a file of a size that is not a multiple of block size */ +#define FILE_SIZE 300 + +#define fail(fmt , args...) \ +do { \ + printf(fmt , ##args); \ + exit(1); \ +} while (0) + +static unsigned char buffer[4096] __attribute((aligned (4096))); + +int +main(int argc, char **argv) +{ + int ret; + int fd; + const char *filename; + struct iocb myiocb; + struct iocb *cb = &myiocb; + io_context_t ioctx; + struct io_event ie; + + if (argc != 2) + fail("only arg should be file name"); + + filename = argv[1]; + fd = open(filename, O_CREAT|O_RDWR|O_DIRECT, 0600); + if (fd < 0) + fail("open returned error %d\n", errno); + + ret = ftruncate(fd, FILE_SIZE); + if (ret < 0) + fail("truncate returned error %d\n", errno); + + /* <1> use normal disk read, this should be ok */ + ret = read(fd, buffer, 4096); + if (ret != FILE_SIZE) + fail("buffered read returned %d, should be 300\n", ret); + + /* <2> use AIO disk read, it sees error. */ + memset(&myiocb, 0, sizeof(myiocb)); + cb->data = 0; + cb->key = 0; + cb->aio_lio_opcode = IO_CMD_PREAD; + cb->aio_reqprio = 0; + cb->aio_fildes = fd; + cb->u.c.buf = buffer; + cb->u.c.nbytes = 4096; + cb->u.c.offset = 0; + + ret = io_queue_init(1, &ioctx); + if (ret != 0) + fail("io_queue_init returned error %d\n", ret); + + ret = io_submit(ioctx, 1, &cb); + if (ret != 1) + fail("io_submit returned error %d\n", ret); + + ret = io_getevents(ioctx, 1, 1, &ie, NULL); + if (ret != 1) + fail("io_getevents returned %d\n", ret); + + /* + * If all goes well, we should see 300 bytes read. If things + * are broken, we may very well see a result of 4k. + */ + if (ie.res != FILE_SIZE) + fail("AIO read of last block in file returned %d bytes, " + "expected %d\n", ret, FILE_SIZE); + + printf("AIO read of last block in file succeeded.\n"); + return 0; +} diff --git a/src/aio-dio-regress/aio-free-ring-with-bogus-nr-pages.c b/src/aio-dio-regress/aio-free-ring-with-bogus-nr-pages.c new file mode 100644 index 0000000..f133fc0 --- /dev/null +++ b/src/aio-dio-regress/aio-free-ring-with-bogus-nr-pages.c @@ -0,0 +1,85 @@ +/* + * aio-free-ring-with-bogus-nr-pages - test aio_setup_ring with bad nr_pages + * Copyright (C) 2006 Kostantin Khorenko + * Copyright (C) 2006 Jeff Moyer + * + * 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; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* + * Code taken from an example posted to Red Hat bugzilla #220971 + * + * Original Author: Kostantin Khorenko from OpenVZ/Virtuozzo + * Munged by Jeff Moyer. + * + * Description: "aio_setup_ring() function initializes info->nr_pages + * variable incorrectly, then this variable can be used in error path + * to free the allocated resources. By this way an unprivileged user + * can crash the node." + * + * At the beginning of aio_setup_ring, info->nr_pages is initialized + * to the requested number of pages. However, it is supposed to + * indicate how many pages are mapped in info->ring_pages. Thus, if + * the call to do_mmap fails: + * + * info->mmap_base = do_mmap(NULL, 0, info->mmap_size, + * PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, + * 0); + * if (IS_ERR((void *)info->mmap_base)) { + * up_write(&ctx->mm->mmap_sem); + * printk("mmap err: %ld\n", -info->mmap_base); + * info->mmap_size = 0; + * aio_free_ring(ctx); <--------- + * return -EAGAIN; + * } + * + * we end up calling aio_free_ring with a bogus array and cause an oops. + * + * This is a destructive test. + */ +#include +#include +#include +#include +#include +#include + +int main(int __attribute__((unused)) argc, char **argv) +{ + long res; + io_context_t ctx; + void* map; + + while (1) { + map = mmap(NULL, 100, PROT_READ, MAP_ANONYMOUS|MAP_PRIVATE, + 0, 0); + if (map == MAP_FAILED) + break; + map = mmap(NULL, 100, PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, + 0, 0); + if (map == MAP_FAILED) + break; + } + + memset(&ctx, 0, sizeof(ctx)); + res = io_setup(10000, &ctx); + if (res != -ENOMEM) { + printf("%s: Error: io_setup returned %ld, expected -ENOMEM\n", + basename(argv[0]), res); + return 1; + } else + printf("%s: Success!\n", basename(argv[0])); + return 0; +} diff --git a/src/aio-dio-regress/aio-io-setup-with-nonwritable-context-pointer.c b/src/aio-dio-regress/aio-io-setup-with-nonwritable-context-pointer.c new file mode 100644 index 0000000..092cbb4 --- /dev/null +++ b/src/aio-dio-regress/aio-io-setup-with-nonwritable-context-pointer.c @@ -0,0 +1,51 @@ +/* + * aio-io-setup-with-nonwritable-context-pointer - + * Test what happens when a non-writable context pointer is passed to io_setup + * Copyright (C) 2007 Jeff Moyer + * + * 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; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/* + * Author: Jeff Moyer + * + * Description: Pass a non-writable context pointer to io_setup to see if + * the kernel deals with it correctly. In the past, the reference counting + * in this particular error path was off and this operation would cause an + * oops. + * + * This is a destructive test. + */ +#include +#include +#include +#include +#include + +int +main(int __attribute__((unused)) argc, char **argv) +{ + void *addr; + + addr = mmap(NULL, 4096, PROT_READ, MAP_SHARED|MAP_ANONYMOUS, 0, 0); + if (!addr) { + perror("mmap"); + exit(1); + } + io_setup(1, addr /* un-writable pointer */); + + printf("%s: Success!\n", basename(argv[0])); + return 0; +} From BATV+4d015a9e3df6a7aca34c+2109+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 2 12:25:30 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52HPT6W115510 for ; Tue, 2 Jun 2009 12:25:30 -0500 X-ASG-Debug-ID: 1243963932-618202f60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D37561042B54 for ; Tue, 2 Jun 2009 10:32:13 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id YyVCa9xAzwo9Hx3u for ; Tue, 02 Jun 2009 10:32:13 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MBXk6-0005z9-72; Tue, 02 Jun 2009 17:25:42 +0000 Date: Tue, 2 Jun 2009 13:25:42 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 8/9] Enable generic filesystems to be fsck'd Subject: Re: [PATCH 8/9] Enable generic filesystems to be fsck'd Message-ID: <20090602172542.GA21701@infradead.org> References: <1243450413-12681-1-git-send-email-sandeen@sandeen.net> <1243450413-12681-9-git-send-email-sandeen@sandeen.net> <20090528125128.GA13425@infradead.org> <20090602123852.GA4101@infradead.org> <4A2540F4.4050204@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A2540F4.4050204@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1243963934 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Jun 02, 2009 at 10:10:44AM -0500, Eric Sandeen wrote: > Maybe we should move the mountpoint assignment outside the conditional, > since we echo it unconditionally. Only the !USE_REMOUNT case cares > anyway but still... It's only used to be passed as an argument to _mount_or_remount_rw where we only care for the !USE_REMOUNT case. So I've left this one as-is and fixed up all other issues. Index: xfstests-dev/common.rc =================================================================== --- xfstests-dev.orig/common.rc 2009-06-02 12:12:24.000000000 +0000 +++ xfstests-dev/common.rc 2009-06-02 17:10:20.000000000 +0000 @@ -707,29 +707,29 @@ [ "$?" == "0" ] || _notrun "$qa_user user not defined." } -# check that a FS is mounted as XFS. if so, return mount point +# check that a FS on a device is mounted +# if so, return mount point # -_xfs_mounted() +_is_mounted() { if [ $# -ne 1 ] then - echo "Usage: _xfs_mounted device" 1>&2 + echo "Usage: _is_mounted device" 1>&2 exit 1 fi device=$1 - if _mount | grep "$device " | $AWK_PROG ' - /type xfs/ { print $3 ; exit 0 } - END { exit 1 } + if _mount | grep "$device " | $AWK_PROG -v pattern="type $FSTYP" ' + pattern { print $3 ; exit 0 } + END { exit 1 } ' then - echo "_xfs_mounted: $device is not a mounted XFS FS" + echo "_is_mounted: $device is not a mounted $FSTYP FS" exit 1 fi } - # remount a FS to a new mode (ro or rw) # _remount() @@ -749,14 +749,112 @@ fi } -# run xfs_check and friends on a FS. +# Run the appropriate repair/check on a filesystem # # if the filesystem is mounted, it's either remounted ro before being # checked or it's unmounted and then remounted # +# If set, we remount ro instead of unmounting for fsck USE_REMOUNT=0 +_umount_or_remount_ro() +{ + if [ $# -ne 1 ] + then + echo "Usage: _umount_or_remount_ro " 1>&2 + exit 1 + fi + device=$1 + + if [ $USE_REMOUNT -eq 0 ] + then + mountpoint=`_is_mounted $device` + $UMOUNT_PROG $device + else + _remount $device ro + fi + echo "$mountpoint" +} + +_mount_or_remount_rw() +{ + if [ $# -ne 3 ] + then + echo "Usage: _mount_or_remount_rw " 1>&2 + exit 1 + fi + mount_opts=$1 + device=$2 + mountpoint=$3 + + if [ $USE_REMOUNT -eq 0 ] + then + if ! _mount -t $FSTYP $mount_opts $device $mountpoint + then + echo "!!! failed to remount $device on $mountpoint" + return 0 # ok=0 + fi + else + _remount $device rw + fi + + return 1 # ok=1 +} + +# Check a generic filesystem in no-op mode; this assumes that the +# underlying fsck program accepts "-n" for a no-op (check-only) run, +# and that it will still return an errno for corruption in this mode. +# +# Filesystems which don't support this will need to define their +# own check routine. +# +_check_generic_filesystem() +{ + device=$1 + + # If type is set, we're mounted + type=`_fs_type $device` + ok=1 + + if [ "$type" = "$FSTYP" ] + then + # mounted ... + mountpoint=`_umount_or_remount_ro $device` + fi + + fsck -t $FSTYP -n $device >$tmp.fsck 2>&1 + if [ $? -ne 0 ] + then + echo "_check_generic_filesystem: filesystem on $device is inconsistent (see $seq.full)" + + echo "_check_generic filesystem: filesystem on $device is inconsistent" >>$here/$seq.full + echo "*** fsck.$FSTYP output ***" >>$here/$seq.full + cat $tmp.fsck >>$here/$seq.full + echo "*** end fsck.$FSTYP output" >>$here/$seq.full + + ok=0 + fi + rm -f $tmp.fsck + + if [ $ok -eq 0 ] + then + echo "*** mount output ***" >>$here/$seq.full + _mount >>$here/$seq.full + echo "*** end mount output" >>$here/$seq.full + elif [ "$type" = "$FSTYP" ] + then + # was mounted ... + _mount_or_remount_rw "$MOUNT_OPTIONS" $device $mountpoint + ok=$? + fi + + [ $ok -eq 0 ] && exit 1 + return 0 +} + +# run xfs_check and friends on a FS. + _check_xfs_filesystem() { if [ $# -ne 3 ] @@ -787,15 +885,8 @@ if [ "$type" = "xfs" ] then - # mounted... - - if [ $USE_REMOUNT -eq 0 ] - then - mountpoint=`_xfs_mounted $device` - $UMOUNT_PROG $device - else - _remount $device ro - fi + # mounted ... + mountpoint=`_umount_or_remount_ro $device` fi $XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ @@ -848,17 +939,7 @@ echo "*** end mount output" >>$here/$seq.full elif [ "$type" = "xfs" ] then - # mounted... - if [ $USE_REMOUNT -eq 0 ] - then - if ! _mount -t xfs $extra_mount_options $device $mountpoint - then - echo "!!! failed to remount $device on $mountpoint" - ok=0 - fi - else - _remount $device rw - fi + _mount_or_remount_rw "$extra_mount_options" $device $mountpoint fi [ $ok -eq 0 ] && exit 1 @@ -908,12 +989,8 @@ } -_check_test_fs() +_check_xfs_test_fs() { - if [ "$FSTYP" != "xfs" ]; then - return - fi - TEST_LOG="none" TEST_RT="none" [ "$USE_EXTERNAL" = yes -a ! -z "$TEST_LOGDEV" ] && \ @@ -932,6 +1009,24 @@ fi } +_check_test_fs() +{ + case $FSTYP in + xfs) + _check_xfs_test_fs + ;; + nfs) + # no way to check consistency for nfs + ;; + udf) + # do nothing for now + ;; + *) + _check_generic_filesystem $TEST_DEV + ;; + esac +} + _check_scratch_fs() { case $FSTYP in @@ -953,6 +1048,7 @@ # Don't know how to check an NFS filesystem, yet. ;; *) + _check_generic_filesystem $SCRATCH_DEV ;; esac } @@ -987,25 +1083,6 @@ echo "$os/$platform $host $kernel" } -_check_testdir() -{ - case $FSTYP in - xfs) - _check_test_fs - ;; - udf) - _cleanup_testdir - _check_scratch_fs - _scratch_mount - ;; - nfs*) - # Don't know how to check an NFS filesystem, yet. - ;; - *) - ;; - esac -} - _setup_udf_scratchdir() { [ "$FSTYP" != "udf" ] \ From rherndon@sgi.com Tue Jun 2 14:21:54 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52JLrMT124315 for ; Tue, 2 Jun 2009 14:21:54 -0500 Received: from attica.americas.sgi.com (attica.americas.sgi.com [128.162.236.44]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7EC753040C0 for ; Tue, 2 Jun 2009 12:22:08 -0700 (PDT) Received: by attica.americas.sgi.com (Postfix, from userid 105247) id 03E33A1FAB93; Tue, 2 Jun 2009 14:22:07 -0500 (CDT) From: robert herndon To: xfs@oss.sgi.com Cc: robert herndon Subject: [PATCH] Fix mode for include/install-sh so that attempts Date: Tue, 2 Jun 2009 14:22:07 -0500 Message-Id: <1243970527-8611-1-git-send-email-rherndon@attica.americas.sgi.com> X-Mailer: git-send-email 1.5.4.rc3 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: robert herndon --- doc/INSTALL | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) mode change 100644 => 100755 include/install-sh diff --git a/doc/INSTALL b/doc/INSTALL index 2ecbf6c..35d34ce 100644 --- a/doc/INSTALL +++ b/doc/INSTALL @@ -1,5 +1,5 @@ This document describes how to configure and build the open source XFS -commands and utilites ("xfsprogs") from source, and how to install and +commands and utilities ("xfsprogs") from source, and how to install and run them. See the README file in the top level directory for details about how @@ -42,8 +42,11 @@ Linux Instructions # make # su root # make install - [and optionally, for the development libraries and headers] + [and optionally, for the development libraries and basic headers; + this is required to build xfsdump and dmapi] # make install-dev + [and optionally, for the development libraries and full headers; + this is required to build xfstests] Note that there are so many "install" variants out there that we wrote our own script (see "install-sh" in the top level directory). diff --git a/include/install-sh b/include/install-sh old mode 100644 new mode 100755 -- 1.5.6 From rherndon@sgi.com Tue Jun 2 14:22:19 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52JMJmc124344 for ; Tue, 2 Jun 2009 14:22:19 -0500 Received: from attica.americas.sgi.com (attica.americas.sgi.com [128.162.236.44]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8860EAC001 for ; Tue, 2 Jun 2009 12:22:33 -0700 (PDT) Received: by attica.americas.sgi.com (Postfix, from userid 105247) id F3736A1FAB93; Tue, 2 Jun 2009 14:22:32 -0500 (CDT) From: robert herndon To: xfs@oss.sgi.com Cc: robert herndon Subject: [PATCH] Update xfsdump's doc/INSTALL to document method/necessity Date: Tue, 2 Jun 2009 14:22:32 -0500 Message-Id: <1243970552-9444-1-git-send-email-rherndon@attica.americas.sgi.com> X-Mailer: git-send-email 1.5.4.rc3 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: robert herndon --- doc/INSTALL | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/doc/INSTALL b/doc/INSTALL index 6c32f28..7cd71b4 100644 --- a/doc/INSTALL +++ b/doc/INSTALL @@ -1,5 +1,5 @@ This document describes how to configure and build the open source XFS -commands and utilites ("xfsdump") from source, and how to install and +commands and utilities ("xfsdump") from source, and how to install and run them. 0. If you have the binary rpm, simply install it and skip to step 2 (below). @@ -13,6 +13,9 @@ run them. 1. Configure, build and install the package + Ensure that you have installed the required libraries and + header files. See doc/INSTALL in the xfsprogs repository. + The xfsdump package uses autoconf/configure and expects a GNU build environment (your platform must at least have both autoconf and gmake). You will also need to have installed either the e2fsprogs-devel package -- 1.5.6 From rherndon@sgi.com Tue Jun 2 14:22:43 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52JMhrk124378 for ; Tue, 2 Jun 2009 14:22:43 -0500 Received: from attica.americas.sgi.com (attica.americas.sgi.com [128.162.236.44]) by relay2.corp.sgi.com (Postfix) with ESMTP id 997923040CA for ; Tue, 2 Jun 2009 12:23:00 -0700 (PDT) Received: by attica.americas.sgi.com (Postfix, from userid 105247) id 5C8AFA1FAB93; Tue, 2 Jun 2009 14:23:00 -0500 (CDT) From: robert herndon To: xfs@oss.sgi.com Cc: robert herndon Subject: [PATCH] Update dmapi's doc/INSTALL to document method/necessity Date: Tue, 2 Jun 2009 14:23:00 -0500 Message-Id: <1243970580-12580-1-git-send-email-rherndon@attica.americas.sgi.com> X-Mailer: git-send-email 1.5.4.rc3 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: robert herndon --- doc/INSTALL | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/doc/INSTALL b/doc/INSTALL index ec5a4ef..19493f7 100644 --- a/doc/INSTALL +++ b/doc/INSTALL @@ -12,6 +12,9 @@ library from source, and how to install it. 1. Configure, build and install the package + Ensure that you have installed the required libraries and + header files. See doc/INSTALL in the xfsprogs repository. + The "dmapi" package uses autoconf/configure and expects a GNU build environment (your platform must at least have both autoconf and gmake). -- 1.5.6 From rherndon@sgi.com Tue Jun 2 14:23:07 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.3.0-rupdated Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52JN6Yi124416 for ; Tue, 2 Jun 2009 14:23:06 -0500 Received: from attica.americas.sgi.com (attica.americas.sgi.com [128.162.236.44]) by relay2.corp.sgi.com (Postfix) with ESMTP id 517573040C0 for ; Tue, 2 Jun 2009 12:23:24 -0700 (PDT) Received: by attica.americas.sgi.com (Postfix, from userid 105247) id 19363A1FAB93; Tue, 2 Jun 2009 14:23:24 -0500 (CDT) From: robert herndon To: xfs@oss.sgi.com Cc: robert herndon Subject: [PATCH] Update xfstests' README to document method/necessity Date: Tue, 2 Jun 2009 14:23:24 -0500 Message-Id: <1243970604-13732-1-git-send-email-rherndon@attica.americas.sgi.com> X-Mailer: git-send-email 1.5.4.rc3 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean From: robert herndon --- README | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) diff --git a/README b/README index 375e07c..f9725b4 100644 --- a/README +++ b/README @@ -18,6 +18,17 @@ Preparing system for tests (IRIX and Linux): - compile XFS into your kernel or load XFS modules - install user tools including mkfs.xfs, xfs_db & xfs_bmap + - install header files required to build xfstests' programs: + + # cd <...>/xfsprogs + # make install-qa + + % cd <...>/xfstests + % make xfstests + + This creates the directory /usr/include/xfs and installs + files there that are required to compile the programs in + this directory. - If you wish to run the udf components of the suite install mkfs_udf and udf_db for IRIX and mkudffs for Linux. Also download and build the Philips UDF Verification Software from -- 1.5.6 From sandeen@sandeen.net Tue Jun 2 14:47:52 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52Jlp3d125756 for ; Tue, 2 Jun 2009 14:47:51 -0500 X-ASG-Debug-ID: 1243972088-6de101720000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 15B392C9006; Tue, 2 Jun 2009 12:48:08 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id jlEYgop9KIamZTHB; Tue, 02 Jun 2009 12:48:08 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n52Jm7F1027249; Tue, 2 Jun 2009 15:48:07 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n52Jm7Nf020183; Tue, 2 Jun 2009 15:48:07 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n52Jm6Zj006463; Tue, 2 Jun 2009 15:48:06 -0400 Message-ID: <4A2581F6.8070705@sandeen.net> Date: Tue, 02 Jun 2009 14:48:06 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: robert herndon CC: xfs@oss.sgi.com, robert herndon X-ASG-Orig-Subj: Re: [PATCH] Update xfstests' README to document method/necessity Subject: Re: [PATCH] Update xfstests' README to document method/necessity References: <1243970604-13732-1-git-send-email-rherndon@attica.americas.sgi.com> In-Reply-To: <1243970604-13732-1-git-send-email-rherndon@attica.americas.sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1243972089 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.27406 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean robert herndon wrote: > From: robert herndon > > --- > README | 11 +++++++++++ > 1 files changed, 11 insertions(+), 0 deletions(-) > > diff --git a/README b/README > index 375e07c..f9725b4 100644 > --- a/README > +++ b/README > @@ -18,6 +18,17 @@ Preparing system for tests (IRIX and Linux): > > - compile XFS into your kernel or load XFS modules > - install user tools including mkfs.xfs, xfs_db & xfs_bmap > + - install header files required to build xfstests' programs: > + > + # cd <...>/xfsprogs > + # make install-qa With any luck, this will be going away soon, actually. It's only required for loggen, and we're looking for ways around that. See for example [PATCH, RFC] xfsprogs: add xfs_loggen and/or [PATCH 1/9 V2] Use xfs.h rather than libxfs.h on the list. -Eric From rherndon@sgi.com Tue Jun 2 16:08:40 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.3.0-rupdated Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52L8eOE129873 for ; Tue, 2 Jun 2009 16:08:40 -0500 Received: from attica.americas.sgi.com (attica.americas.sgi.com [128.162.236.44]) by relay2.corp.sgi.com (Postfix) with ESMTP id 206D23040C0; Tue, 2 Jun 2009 14:08:55 -0700 (PDT) Received: by attica.americas.sgi.com (Postfix, from userid 105247) id 8391CA1FAB93; Tue, 2 Jun 2009 16:08:54 -0500 (CDT) From: Robert Herndon To: xfs@oss.sgi.com Cc: Robert Herndon Subject: [PATCH] README: add hint on install-qa Date: Tue, 2 Jun 2009 16:08:54 -0500 Message-Id: <1243976934-18008-1-git-send-email-rherndon@sgi.com> X-Mailer: git-send-email 1.5.4.rc3 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Signed-off-by: Robert Herndon --- README | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) diff --git a/README b/README index 375e07c..964578d 100644 --- a/README +++ b/README @@ -18,6 +18,17 @@ Preparing system for tests (IRIX and Linux): - compile XFS into your kernel or load XFS modules - install user tools including mkfs.xfs, xfs_db & xfs_bmap + - install header files required to build xfstests' programs: + + # cd <...>/xfsprogs + # make install-qa + + % cd <...>/xfstests + % make xfstests + + This creates the directory /usr/include/xfs and installs + files there that are required to compile the programs in + this directory. - If you wish to run the udf components of the suite install mkfs_udf and udf_db for IRIX and mkudffs for Linux. Also download and build the Philips UDF Verification Software from -- 1.5.6 From rherndon@sgi.com Tue Jun 2 16:44:24 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52LiNR1131753 for ; Tue, 2 Jun 2009 16:44:23 -0500 Received: from attica.americas.sgi.com (attica.americas.sgi.com [128.162.236.44]) by relay2.corp.sgi.com (Postfix) with ESMTP id 445743040C8; Tue, 2 Jun 2009 14:44:41 -0700 (PDT) Received: by attica.americas.sgi.com (Postfix, from userid 105247) id 9B0C4A1FAB93; Tue, 2 Jun 2009 16:44:40 -0500 (CDT) From: Robert Herndon To: xfs@oss.sgi.com Cc: Robert Herndon Subject: [PATCH] Add -x mode to include/install-sh; add build hints to doc/INSTALL. Date: Tue, 2 Jun 2009 16:44:40 -0500 Message-Id: <1243979080-5665-1-git-send-email-rherndon@sgi.com> X-Mailer: git-send-email 1.5.4.rc3 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Signed-off-by: Robert Herndon --- doc/INSTALL | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) mode change 100644 => 100755 include/install-sh diff --git a/doc/INSTALL b/doc/INSTALL index 2ecbf6c..b3a7a3c 100644 --- a/doc/INSTALL +++ b/doc/INSTALL @@ -1,5 +1,5 @@ This document describes how to configure and build the open source XFS -commands and utilites ("xfsprogs") from source, and how to install and +commands and utilities ("xfsprogs") from source, and how to install and run them. See the README file in the top level directory for details about how @@ -42,8 +42,12 @@ Linux Instructions # make # su root # make install - [and optionally, for the development libraries and headers] + [and optionally, for the development libraries and basic headers; + this is required to build xfsdump and dmapi] # make install-dev + [and optionally, for the development libraries and full headers; + this is required to build xfstests] + # make install-qa Note that there are so many "install" variants out there that we wrote our own script (see "install-sh" in the top level directory). @@ -98,7 +102,8 @@ Mac OS X Instructions $ make $ su root # make install - [and optionally, for the development libraries and headers] + [and optionally, for the development libraries and headers; + this is required to build xfsdump and dmapi] # make install-dev diff --git a/include/install-sh b/include/install-sh old mode 100644 new mode 100755 -- 1.5.4.rc3 From rherndon@sgi.com Tue Jun 2 16:53:49 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52LrmKR132228 for ; Tue, 2 Jun 2009 16:53:48 -0500 Received: from attica.americas.sgi.com (attica.americas.sgi.com [128.162.236.44]) by relay3.corp.sgi.com (Postfix) with ESMTP id 104C7AC007; Tue, 2 Jun 2009 14:54:03 -0700 (PDT) Received: by attica.americas.sgi.com (Postfix, from userid 105247) id 4E320A1FAB93; Tue, 2 Jun 2009 16:54:02 -0500 (CDT) From: Robert Herndon To: xfs@oss.sgi.com Cc: Robert Herndon Subject: [PATCH] Add hint to see xfsprogs' doc/INSTALL in doc/INSTALL. Date: Tue, 2 Jun 2009 16:54:02 -0500 Message-Id: <1243979642-10017-1-git-send-email-rherndon@sgi.com> X-Mailer: git-send-email 1.5.4.rc3 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Signed-off-by: Robert Herndon --- doc/INSTALL | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/doc/INSTALL b/doc/INSTALL index 6c32f28..7cd71b4 100644 --- a/doc/INSTALL +++ b/doc/INSTALL @@ -1,5 +1,5 @@ This document describes how to configure and build the open source XFS -commands and utilites ("xfsdump") from source, and how to install and +commands and utilities ("xfsdump") from source, and how to install and run them. 0. If you have the binary rpm, simply install it and skip to step 2 (below). @@ -13,6 +13,9 @@ run them. 1. Configure, build and install the package + Ensure that you have installed the required libraries and + header files. See doc/INSTALL in the xfsprogs repository. + The xfsdump package uses autoconf/configure and expects a GNU build environment (your platform must at least have both autoconf and gmake). You will also need to have installed either the e2fsprogs-devel package -- 1.5.4.rc3 From rherndon@sgi.com Tue Jun 2 16:56:31 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n52LuVbU132343 for ; Tue, 2 Jun 2009 16:56:31 -0500 Received: from attica.americas.sgi.com (attica.americas.sgi.com [128.162.236.44]) by relay3.corp.sgi.com (Postfix) with ESMTP id A920CAC001; Tue, 2 Jun 2009 14:56:48 -0700 (PDT) Received: by attica.americas.sgi.com (Postfix, from userid 105247) id D087CA1FAB93; Tue, 2 Jun 2009 16:56:47 -0500 (CDT) From: Robert Herndon To: xfs@oss.sgi.com Cc: Robert Herndon Subject: [PATCH] Add hint to see xfsprogs' doc/INSTALL in doc/INSTALL. Date: Tue, 2 Jun 2009 16:56:47 -0500 Message-Id: <1243979807-20093-1-git-send-email-rherndon@sgi.com> X-Mailer: git-send-email 1.5.4.rc3 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Signed-off-by: Robert Herndon --- doc/INSTALL | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/doc/INSTALL b/doc/INSTALL index ec5a4ef..19493f7 100644 --- a/doc/INSTALL +++ b/doc/INSTALL @@ -12,6 +12,9 @@ library from source, and how to install it. 1. Configure, build and install the package + Ensure that you have installed the required libraries and + header files. See doc/INSTALL in the xfsprogs repository. + The "dmapi" package uses autoconf/configure and expects a GNU build environment (your platform must at least have both autoconf and gmake). -- 1.5.4.rc3 From BATV+ac29816878cb286aebda+2110+infradead.org+hch@bombadil.srs.infradead.org Wed Jun 3 11:40:16 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53GeErp183884 for ; Wed, 3 Jun 2009 11:40:16 -0500 X-ASG-Debug-ID: 1244047231-323f016e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C9EA62CCB36; Wed, 3 Jun 2009 09:40:31 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id KQphx35eFGKsJCmV; Wed, 03 Jun 2009 09:40:31 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MBtVu-0000Ee-JZ; Wed, 03 Jun 2009 16:40:30 +0000 Date: Wed, 3 Jun 2009 12:40:30 -0400 From: Christoph Hellwig To: Robert Herndon Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] README: add hint on install-qa Subject: Re: [PATCH] README: add hint on install-qa Message-ID: <20090603164029.GA30759@infradead.org> References: <1243976934-18008-1-git-send-email-rherndon@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1243976934-18008-1-git-send-email-rherndon@sgi.com> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244047231 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Jun 02, 2009 at 04:08:54PM -0500, Robert Herndon wrote: > + - install header files required to build xfstests' programs: > + > + # cd <...>/xfsprogs > + # make install-qa > + > + % cd <...>/xfstests > + % make xfstests > + > + This creates the directory /usr/include/xfs and installs > + files there that are required to compile the programs in > + this directory. Note that this is only required for loggen, and we're currently discussing options how to get rid of this. I would keep the patch on hold for now. From BATV+ac29816878cb286aebda+2110+infradead.org+hch@bombadil.srs.infradead.org Wed Jun 3 11:43:39 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53GhcXg184041 for ; Wed, 3 Jun 2009 11:43:38 -0500 X-ASG-Debug-ID: 1244047828-202a02bd0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 031DC10453BC; Wed, 3 Jun 2009 09:50:29 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id oDHyUnUN2pCgtFKQ; Wed, 03 Jun 2009 09:50:29 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MBtZD-0004VF-0K; Wed, 03 Jun 2009 16:43:55 +0000 Date: Wed, 3 Jun 2009 12:43:54 -0400 From: Christoph Hellwig To: Robert Herndon Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] Add -x mode to include/install-sh; add build hints to doc/INSTALL. Subject: Re: [PATCH] Add -x mode to include/install-sh; add build hints to doc/INSTALL. Message-ID: <20090603164354.GB30759@infradead.org> References: <1243979080-5665-1-git-send-email-rherndon@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1243979080-5665-1-git-send-email-rherndon@sgi.com> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244047830 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Should be two separate patches/commits, please. It would be useful to mention what package this is again in the subject line: [PATCH] xfsprogs: add -x mode to include/install-sh [PATCH] xfsprogs: add build hints to doc/INSTALL (also note that commit subject lines after the prefix are not capitalized. > # make install-dev > + [and optionally, for the development libraries and full headers; > + this is required to build xfstests] > + # make install-qa It's not actually required anymore. From sandeen@redhat.com Wed Jun 3 12:01:06 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-3.0 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53H16r2184773 for ; Wed, 3 Jun 2009 12:01:06 -0500 X-ASG-Debug-ID: 1244048483-590e00530000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B4C992CC393 for ; Wed, 3 Jun 2009 10:01:23 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id VOL1N5QbhNTcIl1Y for ; Wed, 03 Jun 2009 10:01:23 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n53H1Nvt006250 for ; Wed, 3 Jun 2009 13:01:23 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n53H1Mo1017792 for ; Wed, 3 Jun 2009 13:01:22 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n53H1KKo012070 for ; Wed, 3 Jun 2009 13:01:21 -0400 Message-ID: <4A26AC60.6060401@redhat.com> Date: Wed, 03 Jun 2009 12:01:20 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH] xfstests: Make the SCRATCH_DEV optional Subject: [PATCH] xfstests: Make the SCRATCH_DEV optional Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244048483 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.27485 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Tests will fail gracefully if there is no SCRATCH_DEV defined, so change the check script to allow it, and update README to reflect this. This just makes it simpler to set up the tests, at the expense of coverage. Long term it might be nice to allow either SCRATCH_DEV xor TEST_DEV to be missing, but for now this is simple. Signed-off-by: Eric Sandeen --- diff --git a/README b/README index 375e07c..210bded 100644 --- a/README +++ b/README @@ -26,25 +26,26 @@ Preparing system for tests (IRIX and Linux): set the environment variable DISABLE_UDF_TEST to 1. - - create two partitions to use for testing + - create one or two partitions to use for testing - one TEST partition - format as XFS, mount & optionally populate with NON-IMPORTANT stuff - - one SCRATCH partition + - one SCRATCH partition (optional) - leave empty and expect this partition to be clobbered - by some tests. + by some tests. If this is not provided, many tests will + not be run. (these must be two DIFFERENT partitions) - setup your environment - setenv TEST_DEV "device containing TEST PARTITION" - setenv TEST_DIR "mount point of TEST PARTITION" - - setenv SCRATCH_DEV "device containing SCRATCH PARTITION" - - setenv SCRATCH_MNT "mount point for SCRATCH PARTITION" - - setenv TAPE_DEV "tape device for testing xfsdump" - - setenv RMT_TAPE_DEV "remote tape device for testing xfsdump" - - setenv RMT_IRIXTAPE_DEV "remote IRIX tape device for testing xfsdump" - optionally: + - setenv SCRATCH_DEV "device containing SCRATCH PARTITION" + - setenv SCRATCH_MNT "mount point for SCRATCH PARTITION" + - setenv TAPE_DEV "tape device for testing xfsdump" + - setenv RMT_TAPE_DEV "remote tape device for testing xfsdump" + - setenv RMT_IRIXTAPE_DEV "remote IRIX tape device for testing xfsdump" - setenv SCRATCH_LOGDEV "device for scratch-fs external log" - setenv SCRATCH_RTDEV "device for scratch-fs realtime data" - setenv TEST_LOGDEV "device for test-fs external log" diff --git a/check b/check index 348b68e..55e90a1 100755 --- a/check +++ b/check @@ -160,26 +160,28 @@ MOUNT_OPTIONS -- $FULL_MOUNT_OPTIONS EOF -umount $SCRATCH_DEV 2>/dev/null -# call the overridden mkfs - make sure the FS is built -# the same as we'll create it later. - -if ! _scratch_mkfs $flag >$tmp.err 2>&1 -then - echo "our local _scratch_mkfs routine ..." - cat $tmp.err - echo "check: failed to mkfs \$SCRATCH_DEV using specified options" - exit 1 -fi - -# call the overridden mount - make sure the FS mounts with -# the same options that we'll mount with later. -if ! _scratch_mount >$tmp.err 2>&1 -then - echo "our local mount routine ..." - cat $tmp.err - echo "check: failed to mount \$SCRATCH_DEV using specified options" - exit 1 +if [ ! -z "$SCRATCH_DEV"]; then + umount $SCRATCH_DEV 2>/dev/null + # call the overridden mkfs - make sure the FS is built + # the same as we'll create it later. + + if ! _scratch_mkfs $flag >$tmp.err 2>&1 + then + echo "our local _scratch_mkfs routine ..." + cat $tmp.err + echo "check: failed to mkfs \$SCRATCH_DEV using specified options" + exit 1 + fi + + # call the overridden mount - make sure the FS mounts with + # the same options that we'll mount with later. + if ! _scratch_mount >$tmp.err 2>&1 + then + echo "our local mount routine ..." + cat $tmp.err + echo "check: failed to mount \$SCRATCH_DEV using specified options" + exit 1 + fi fi seq="check" From sandeen@redhat.com Wed Jun 3 12:16:56 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-3.0 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53HGtUO185629 for ; Wed, 3 Jun 2009 12:16:56 -0500 X-ASG-Debug-ID: 1244049826-202b039b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 052B11050C3F for ; Wed, 3 Jun 2009 10:23:46 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id LMHQbW936iouZufa for ; Wed, 03 Jun 2009 10:23:46 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n53HHCj4012631 for ; Wed, 3 Jun 2009 13:17:12 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n53HHBs9022250 for ; Wed, 3 Jun 2009 13:17:11 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n53HHAqt014606 for ; Wed, 3 Jun 2009 13:17:11 -0400 Message-ID: <4A26B016.2080108@redhat.com> Date: Wed, 03 Jun 2009 12:17:10 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH] xfstests: don't run 122 if required headers aren't found Subject: [PATCH] xfstests: don't run 122 if required headers aren't found Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244049827 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.27486 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Now that libxfs etc is optional, 122 (which compiles on the fly) is failing if those extra headers are missing. Signed-off-by: Eric Sandeen --- diff --git a/122 b/122 index 7123753..9fbe437 100755 --- a/122 +++ b/122 @@ -191,7 +191,8 @@ awk ' echo 'return 0; }' >>$cprog # create and run program -cc -o $oprog $cprog +cc -o $oprog $cprog >> $seq.full 2>&1 || \ + _notrun "Could not compile test program (see end of $seq.full)" $oprog | _type_size_filter > $progout # From BATV+ac29816878cb286aebda+2110+infradead.org+hch@bombadil.srs.infradead.org Wed Jun 3 12:18:47 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53HIlTH185701 for ; Wed, 3 Jun 2009 12:18:47 -0500 X-ASG-Debug-ID: 1244049544-765b03700000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4C6E91BC8AE0 for ; Wed, 3 Jun 2009 10:19:04 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id sXnjmPHY5OaaXma7 for ; Wed, 03 Jun 2009 10:19:04 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MBu7E-0000Ee-EU; Wed, 03 Jun 2009 17:19:04 +0000 Date: Wed, 3 Jun 2009 13:19:04 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] xfstests: Make the SCRATCH_DEV optional Subject: Re: [PATCH] xfstests: Make the SCRATCH_DEV optional Message-ID: <20090603171904.GA22100@infradead.org> References: <4A26AC60.6060401@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A26AC60.6060401@redhat.com> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244049545 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Jun 03, 2009 at 12:01:20PM -0500, Eric Sandeen wrote: > Tests will fail gracefully if there is no SCRATCH_DEV defined, so change > > the check script to allow it, and update README to reflect this. > > This just makes it simpler to set up the tests, at the expense of > coverage. > > Long term it might be nice to allow either SCRATCH_DEV xor TEST_DEV > to be missing, but for now this is simple. Looks good, Reviewed-by: Christoph Hellwig From BATV+ac29816878cb286aebda+2110+infradead.org+hch@bombadil.srs.infradead.org Wed Jun 3 12:50:49 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53HokLR187158 for ; Wed, 3 Jun 2009 12:50:49 -0500 X-ASG-Debug-ID: 1244051858-1e1b00490000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7561C1050FC9 for ; Wed, 3 Jun 2009 10:57:38 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id RuGbih7GEdil4fIH for ; Wed, 03 Jun 2009 10:57:38 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MBucB-0001lZ-Dt; Wed, 03 Jun 2009 17:51:03 +0000 Date: Wed, 3 Jun 2009 13:51:03 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] xfstests: don't run 122 if required headers aren't found Subject: Re: [PATCH] xfstests: don't run 122 if required headers aren't found Message-ID: <20090603175103.GA4538@infradead.org> References: <4A26B016.2080108@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A26B016.2080108@redhat.com> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244051858 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Jun 03, 2009 at 12:17:10PM -0500, Eric Sandeen wrote: > Now that libxfs etc is optional, 122 (which compiles on the fly) > is failing if those extra headers are missing. Oh, the great 122 tests. Indeed without all the headers defining the structures we can't actually check their size. Signed-off-by: Christoph Hellwig From richardc@efilmgroup.com Wed Jun 3 13:09:11 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=BAYES_50,HTML_MESSAGE, URIBL_GREY autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53I9Act188085 for ; Wed, 3 Jun 2009 13:09:11 -0500 X-ASG-Debug-ID: 1244052567-2f8803b70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from server1.goffgrafix.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 98CC91BC8634 for ; Wed, 3 Jun 2009 11:09:27 -0700 (PDT) Received: from server1.goffgrafix.com (server1.goffgrafix.com [208.43.246.226]) by cuda.sgi.com with ESMTP id w6YogyOUH6eCJApu for ; Wed, 03 Jun 2009 11:09:27 -0700 (PDT) Received: from c-76-118-59-6.hsd1.ma.comcast.net ([76.118.59.6] helo=Distrobution) by server1.goffgrafix.com with esmtpa (Exim 4.69) (envelope-from ) id 1MBukn-0001tn-Jo; Wed, 03 Jun 2009 13:59:58 -0400 From: "Richard Cohen" To: X-ASG-Orig-Subj: Online training benefits for emergency responders Subject: Online training benefits for emergency responders Date: Wed, 3 Jun 2009 13:59:53 -0400 Message-ID: <744F3701B00F4189AD4E457F5A921B37@Distrobution> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_0157_01C9E453.957E7140" X-Mailer: Microsoft Office Outlook 11 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579 Thread-Index: Acni9sO070hKwzIlS1SHrXC6yI0nRgAtnQrAADH0WmA= X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server1.goffgrafix.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - efilmgroup.com X-Barracuda-Connect: server1.goffgrafix.com[208.43.246.226] X-Barracuda-Start-Time: 1244052567 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.51 X-Barracuda-Spam-Status: No, SCORE=-1.51 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, BSF_SC7_SA_HREF_HTTP_MISMATCH, HTML_MESSAGE, HTTP_ESCAPED_HOST X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.27489 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC7_SA_HREF_HTTP_MISMATCH BODY: Custom Phishing Mismatch 0.00 HTTP_ESCAPED_HOST URI: Uses %-escapes inside a URL's hostname 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multi-part message in MIME format. ------=_NextPart_000_0157_01C9E453.957E7140 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit A cost-effective alternative to offsite training Online safety training for firefighters and other first responders Emergency Film Group, the leader in DVD-based emergency response training, has now partnered with Mastery Technologies to provide video-based training on demand. Over 100 interactive courses are available - take one course or many. These courses are SCORM compliant, and can be used on your existing Learning Management System (LMS), or we will set one up for you. Why online training? * 24 hour access eliminates travel time, scheduling conflicts, and training delays. * Automated record keeping for Compliance and easy reporting. Track progress for individuals, divisions and groups. * Track employees' progress toward training goals from any internet connection. Spend your time managing, not juggling classes or instructors. * We can build your LMS to be fully branded and customized for your company. * CEU's awarded by the International Association for Continuing Education and Training. For a list of all courses available, visit http://www.trainingentry.net/efilmgroup/index. To learn how Online Training can be incorporated into your organization, view this 25-minute webinar at http://www.masterytech.com/demos/webinar-safety-mastery/index.htm. Richard Cohen Vice President, Distribution EMERGENCY FILM GROUP P.O. BOX 1928 140 COOKE STREET EDGARTOWN, MA 02539 800-842-0999 (www.efilmgroup.com ) This message was sent from Emergency Film Group, 140 Cooke St., Edgartown, MA 02539. To unsubscribe, please reply with "unsubscribe" in the subject line. No virus found in this incoming message. Checked by AVG - www.avg.com Version: 8.5.339 / Virus Database: 270.12.48/2147 - Release Date: 06/01/09 06:09:00 No virus found in this incoming message. Checked by AVG - www.avg.com Version: 8.5.339 / Virus Database: 270.12.50/2150 - Release Date: 06/02/09 06:47:00 ------=_NextPart_000_0157_01C9E453.957E7140 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

 

 

 

A cost-effective alternative to offsite = training

Online safety training for firefighters and other first responders =

 

Emergency = Film Group, the leader in DVD-based emergency response training, has now partnered with Mastery Technologies to provide video-based training = on demand. Over 100 interactive courses are available - take one course = or many. These courses are SCORM compliant, and can be used on your = existing Learning Management System (LMS), or we will set one up for = you. 

 

Why online = training?

  • 24 = hour access eliminates travel time, scheduling conflicts, and training = delays.
  • Automated record keeping for Compliance and easy reporting. Track = progress for individuals, divisions and groups. =
  • Track employees' progress toward training goals from any internet = connection. Spend your time managing, not juggling classes or = instructors.
  • We can = build your LMS to be fully branded and customized for your = company.
  • CEU's = awarded by the International Association for Continuing Education and Training.  

For a list of all courses available, = visit http://www.trainingentry.net/efilmgroup/index.

To learn = how Online Training can be incorporated into your organization, view this = 25-minute webinar at http://www.masterytech.com/demos/webinar-safety-ma= stery/index.htm.

 =

Richard Cohen

Vice President, Distribution =

EMERGENCY FILM = GROUP

P.O. BOX 1928

140 COOKE STREET

EDGARTOWN, MA = 02539

800-842-0999=

(www.efilmgroup.com)=

 =

 

  



 

This message was sent from Emergency Film = Group, 140 Cooke St., Edgartown, MA 02539. To unsubscribe, please reply with “unsubscribe” in the = subject line.

 

 

 

No virus found in this incoming = message.
Checked by AVG - www.avg.com
Version: 8.5.339 / Virus Database: 270.12.48/2147 - Release Date: = 06/01/09 06:09:00

No virus found in this incoming = message.
Checked by AVG - www.avg.com
Version: 8.5.339 / Virus Database: 270.12.50/2150 - Release Date: = 06/02/09 06:47:00

------=_NextPart_000_0157_01C9E453.957E7140-- From sandeen@redhat.com Wed Jun 3 13:47:13 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,URIBL_BLACK autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53IlCpd189542 for ; Wed, 3 Jun 2009 13:47:13 -0500 X-ASG-Debug-ID: 1244054849-216502520000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6D8572CD5CF for ; Wed, 3 Jun 2009 11:47:29 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id meBlWQ0EgtuQntWn for ; Wed, 03 Jun 2009 11:47:29 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n53IlTBG017019 for ; Wed, 3 Jun 2009 14:47:29 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n53IlS44018252 for ; Wed, 3 Jun 2009 14:47:28 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n53IlR9K030330 for ; Wed, 3 Jun 2009 14:47:27 -0400 Message-ID: <4A26C53F.5080105@redhat.com> Date: Wed, 03 Jun 2009 13:47:27 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH] xfstests: Check for xlog_assign_lsn in xfs headers Subject: [PATCH] xfstests: Check for xlog_assign_lsn in xfs headers Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244054850 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.27491 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Check for xlog_assign_lsn in xfs headers Checking for libxfs.h isn't enough; some debian installs have libxfs.h but no xlog_assign_lsn, and the loggen build still fails. Signed-off-by: Eric Sandeen Tested-by: Aneesh Kumar K.V --- diff --git a/aclocal.m4 b/aclocal.m4 index ac616d1..8a61e39 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -421,6 +421,13 @@ AC_DEFUN([AC_PACKAGE_WANT_XFS_LIBXFS_H], AC_SUBST(have_libxfs) ]) +AC_DEFUN([AC_PACKAGE_WANT_XLOG_ASSIGN_LSN], + [ + AC_CHECK_DECL(xlog_assign_lsn, + [ have_xlog_assign_lsn=true ], [ have_xlog_assign_lsn=false ], + [[#include ]]) + ]) + AC_DEFUN([AC_PACKAGE_NEED_XFS_XQM_H], [ AC_CHECK_HEADERS([xfs/xqm.h]) if test "$ac_cv_header_xfs_xqm_h" != "yes"; then diff --git a/configure.in b/configure.in index 210a91e..6c2afe7 100644 --- a/configure.in +++ b/configure.in @@ -46,6 +46,7 @@ in AC_MULTILIB($enable_lib64) AC_PACKAGE_NEED_XFS_XFS_H AC_PACKAGE_WANT_XFS_LIBXFS_H + AC_PACKAGE_WANT_XLOG_ASSIGN_LSN AC_PACKAGE_NEED_XFS_XQM_H AC_PACKAGE_NEED_XFSCTL_MACRO AC_PACKAGE_NEED_XFS_HANDLE_H diff --git a/include/builddefs.in b/include/builddefs.in index e8f4b6b..7827ed5 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -15,6 +15,7 @@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ HAVE_LIBXFS = @have_libxfs@ +HAVE_XLOG_ASSIGN_LSN = @have_xlog_assign_lsn@ LIBXFS = @libxfs@ LIBACL = @libacl@ LIBATTR = @libattr@ diff --git a/m4/package_xfslibs.m4 b/m4/package_xfslibs.m4 index 903e4a7..870882f 100644 --- a/m4/package_xfslibs.m4 +++ b/m4/package_xfslibs.m4 @@ -13,6 +13,14 @@ AC_DEFUN([AC_PACKAGE_WANT_LIBXFS_H], AC_SUBST(have_libxfs) ]) +AC_DEFUN([AC_PACKAGE_WANT_XLOG_ASSIGN_LSN], + [ + AC_CHECK_DECL(xlog_assign_lsn, + [ have_xlog_assign_lsn=true ], [ have_xlog_assign_lsn=false ], + [[#include ]]) + AC_SUBST(have_have_xlog_assign_lsn) + ]) + AC_DEFUN([AC_PACKAGE_NEED_XFS_XQM_H], [ AC_CHECK_HEADERS([xfs/xqm.h]) if test "$ac_cv_header_xfs_xqm_h" != "yes"; then diff --git a/src/Makefile b/src/Makefile index 515e16e..7b01754 100644 --- a/src/Makefile +++ b/src/Makefile @@ -17,7 +17,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize \ fs_perms testx looptest locktest unwritten_mmap \ bulkstat_unlink_test bulkstat_unlink_test_modified t_dir_offset -ifeq ($(HAVE_LIBXFS), true) +ifeq ($(HAVE_XLOG_ASSIGN_LSN), true) LINUX_TARGETS += loggen endif From BATV+ac29816878cb286aebda+2110+infradead.org+hch@bombadil.srs.infradead.org Wed Jun 3 14:35:37 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53JZa6q191503 for ; Wed, 3 Jun 2009 14:35:37 -0500 X-ASG-Debug-ID: 1244057754-4e1301ef0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id D47452CCF99 for ; Wed, 3 Jun 2009 12:35:54 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id OKg4N2vj6ueqZBEx for ; Wed, 03 Jun 2009 12:35:54 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MBwFe-0003uq-FO; Wed, 03 Jun 2009 19:35:54 +0000 Date: Wed, 3 Jun 2009 15:35:54 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] xfstests: don't run 122 if required headers aren't found Subject: Re: [PATCH] xfstests: don't run 122 if required headers aren't found Message-ID: <20090603193554.GA4516@infradead.org> References: <4A26B016.2080108@redhat.com> <20090603175103.GA4538@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090603175103.GA4538@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244057754 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Jun 03, 2009 at 01:51:03PM -0400, Christoph Hellwig wrote: > On Wed, Jun 03, 2009 at 12:17:10PM -0500, Eric Sandeen wrote: > > Now that libxfs etc is optional, 122 (which compiles on the fly) > > is failing if those extra headers are missing. > > Oh, the great 122 tests. Indeed without all the headers defining > the structures we can't actually check their size. > > > Signed-off-by: Christoph Hellwig Umm, should be: Reviewed-by: Christoph Hellwig From BATV+ac29816878cb286aebda+2110+infradead.org+hch@bombadil.srs.infradead.org Wed Jun 3 14:38:30 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53JcS0t191661 for ; Wed, 3 Jun 2009 14:38:30 -0500 X-ASG-Debug-ID: 1244057926-3f3303090000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 88D0C2CD52E for ; Wed, 3 Jun 2009 12:38:46 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 0zzcosYGkSo20w9N for ; Wed, 03 Jun 2009 12:38:46 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MBwIQ-0004t3-4Z; Wed, 03 Jun 2009 19:38:46 +0000 Date: Wed, 3 Jun 2009 15:38:46 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH V3] xfstests: add aio-dio-regress tests Subject: Re: [PATCH V3] xfstests: add aio-dio-regress tests Message-ID: <20090603193845.GB4516@infradead.org> References: <4A255E80.9000209@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A255E80.9000209@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244057926 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Jun 02, 2009 at 12:16:48PM -0500, Eric Sandeen wrote: > +AIO_TEST=aio-dio-extend-stat > + > +rm -f $TEST_DIR/aio-testfile > +echo "==${AIO_TEST}==" > +src/aio-dio-regress/$AIO_TEST $TEST_DIR/aio-testfile 2>&1 the AIO_TEST variable seems superflous in all these tests. Also the echo isn't really strictly needed if only running one thing anyway. Modulo these nitpicks looks good to me, Reviewed-by: Christoph Hellwig From BATV+ac29816878cb286aebda+2110+infradead.org+hch@bombadil.srs.infradead.org Wed Jun 3 14:43:37 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53Jha2d191938 for ; Wed, 3 Jun 2009 14:43:37 -0500 X-ASG-Debug-ID: 1244058628-3cb5029f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3D93B102FCC8 for ; Wed, 3 Jun 2009 12:50:28 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 0e0sn110Oli3wE86 for ; Wed, 03 Jun 2009 12:50:28 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MBwNK-0001az-H6; Wed, 03 Jun 2009 19:43:50 +0000 Date: Wed, 3 Jun 2009 15:43:50 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] xfstests: Check for xlog_assign_lsn in xfs headers Subject: Re: [PATCH] xfstests: Check for xlog_assign_lsn in xfs headers Message-ID: <20090603194350.GA5313@infradead.org> References: <4A26C53F.5080105@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A26C53F.5080105@redhat.com> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244058629 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Jun 03, 2009 at 01:47:27PM -0500, Eric Sandeen wrote: > Check for xlog_assign_lsn in xfs headers > > Checking for libxfs.h isn't enough; some debian installs > have libxfs.h but no xlog_assign_lsn, and the loggen build still > fails. > > Signed-off-by: Eric Sandeen > Tested-by: Aneesh Kumar K.V I don't actually have a box with an old enough libxfs.h, but the test looks sane to me. Reviewed-by: Christoph Hellwig From rherndon@sgi.com Wed Jun 3 15:00:54 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53K0rFp192774 for ; Wed, 3 Jun 2009 15:00:54 -0500 Received: from attica.americas.sgi.com (attica.americas.sgi.com [128.162.236.44]) by relay2.corp.sgi.com (Postfix) with ESMTP id 029DA30407A; Wed, 3 Jun 2009 13:01:09 -0700 (PDT) Received: by attica.americas.sgi.com (Postfix, from userid 105247) id 4033BA0A6D48; Wed, 3 Jun 2009 15:01:08 -0500 (CDT) From: Robert Herndon To: xfs@oss.sgi.com Cc: Robert Herndon Subject: [PATCH] xfsprogs: add -x flags to include/install-sh Date: Wed, 3 Jun 2009 15:01:08 -0500 Message-Id: <1244059268-2135-1-git-send-email-rherndon@sgi.com> X-Mailer: git-send-email 1.5.4.rc3 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Signed-off-by: Robert Herndon --- 0 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 include/install-sh diff --git a/include/install-sh b/include/install-sh old mode 100644 new mode 100755 -- 1.5.6 From sandeen@sandeen.net Wed Jun 3 15:46:11 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_54,J_CHICKENPOX_64,J_CHICKENPOX_92,URIBL_BLACK autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53KkAmO194761 for ; Wed, 3 Jun 2009 15:46:10 -0500 X-ASG-Debug-ID: 1244061987-133101100000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B05AB2CDE0C for ; Wed, 3 Jun 2009 13:46:27 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id rKQyaV3ETpFLCS4u for ; Wed, 03 Jun 2009 13:46:27 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n53KkQPs029507 for ; Wed, 3 Jun 2009 16:46:26 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n53KkPiE023907 for ; Wed, 3 Jun 2009 16:46:25 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n53KkNAX019974 for ; Wed, 3 Jun 2009 16:46:23 -0400 Message-ID: <4A26E11F.2080103@sandeen.net> Date: Wed, 03 Jun 2009 15:46:23 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH, RFC] xfstests: random fallocate calls in fsx Subject: Re: [PATCH, RFC] xfstests: random fallocate calls in fsx References: <4A0B420E.3070908@sandeen.net> In-Reply-To: <4A0B420E.3070908@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244061987 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.1.27492 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Eric Sandeen wrote: > Seems to work for me. Any comments/suggestions? > > I can probably make it fall back to the xfs ioctl if fallocate > isn't supported, if strongly desired. ping? -Eric > diff --git a/aclocal.m4 b/aclocal.m4 > index 52f1c7d..120c1e0 100644 > --- a/aclocal.m4 > +++ b/aclocal.m4 > @@ -511,3 +511,14 @@ AC_DEFUN([AC_PACKAGE_NEED_XFSCTL_MACRO], > ]) > ]) > > +AC_DEFUN([AC_PACKAGE_WANT_FALLOCATE], > + [ AC_MSG_CHECKING([for fallocate]) > + AC_TRY_COMPILE([ > +#include > + ], [ > + fallocate(0, 0, 0, 0); > + ], have_fallocate=true > + AC_MSG_RESULT(true), > + AC_MSG_RESULT(false)) > + AC_SUBST(have_fallocate) > + ]) > diff --git a/configure.in b/configure.in > index 32a2496..61adac7 100644 > --- a/configure.in > +++ b/configure.in > @@ -62,6 +62,7 @@ in > AC_PACKAGE_WANT_GDBM > AC_PACKAGE_WANT_AIO > AC_PACKAGE_WANT_DMAPI > + AC_PACKAGE_WANT_FALLOCATE > ;; > esac > > diff --git a/include/builddefs.in b/include/builddefs.in > index 636f632..6a51b99 100644 > --- a/include/builddefs.in > +++ b/include/builddefs.in > @@ -56,6 +56,7 @@ RPM_VERSION = @rpm_version@ > ENABLE_SHARED = @enable_shared@ > HAVE_DB = @have_db@ > HAVE_AIO = @have_aio@ > +HAVE_FALLOCATE = @have_fallocate@ > HAVE_DMAPI = @have_dmapi@ > HAVE_ATTR_LIST = @have_attr_list@ > > diff --git a/ltp/Makefile b/ltp/Makefile > index bcdac84..3b81101 100644 > --- a/ltp/Makefile > +++ b/ltp/Makefile > @@ -25,6 +25,10 @@ LCFLAGS += -DAIO > LIBAIO = -laio -lpthread > endif > > +ifeq ($(HAVE_FALLOCATE), true) > +LCFLAGS += -DFALLOCATE > +endif > + > default: $(TARGETS) > > include $(BUILDRULES) > diff --git a/ltp/fsx.c b/ltp/fsx.c > index e4c528d..fe01f6e 100644 > --- a/ltp/fsx.c > +++ b/ltp/fsx.c > @@ -32,6 +32,9 @@ > #ifdef AIO > #include > #endif > +#ifdef FALLOCATE > +#include > +#endif > > #ifndef MAP_FILE > # define MAP_FILE 0 > @@ -65,6 +68,7 @@ int logcount = 0; /* total ops */ > #define OP_MAPREAD 5 > #define OP_MAPWRITE 6 > #define OP_SKIPPED 7 > +#define OP_FALLOCATE 8 > > #undef PAGE_SIZE > #define PAGE_SIZE getpagesize() > @@ -105,6 +109,11 @@ long numops = -1; /* -N flag */ > int randomoplen = 1; /* -O flag disables it */ > int seed = 1; /* -S flag */ > int mapped_writes = 1; /* -W flag disables */ > +#ifdef FALLOCATE > +int fallocate_calls = 1; /* -F flag disables */ > +#else > +int fallocate_calls = 0; /* -F flag disables */ > +#endif > int mapped_reads = 1; /* -R flag disables it */ > int fsxgoodfd = 0; > int o_direct; /* -Z */ > @@ -202,6 +211,7 @@ logdump(void) > { > int i, count, down; > struct log_entry *lp; > + char *falloc_type[3] = {"PAST_EOF", "EXTENDING", "INTERIOR"}; > > prt("LOG DUMP (%d total operations):\n", logcount); > if (logcount < LOGSIZE) { > @@ -265,6 +275,14 @@ logdump(void) > badoff < lp->args[!!down]) > prt("\t******WWWW"); > break; > + case OP_FALLOCATE: > + /* 0: offset 1: length 2: where alloced */ > + prt("FALLOCATE %s\tfrom 0x%x to 0x%x", > + falloc_type[lp->args[2]], lp->args[0], lp->args[0] + lp->args[1]); > + if (badoff >= lp->args[0] && > + badoff < lp->args[0] + lp->args[1]) > + prt("\t******FFFF"); > + break; > case OP_SKIPPED: > prt("SKIPPED (no operation)"); > break; > @@ -770,6 +788,64 @@ dotruncate(unsigned size) > } > } > > +#ifdef FALLOCATE > +/* fallocate is basically a no-op unless extending, then a lot like a truncate */ > +void > +dofallocate(unsigned offset, unsigned length) > +{ > + unsigned end_offset; > + int keep_size; > + > + if (length == 0) { > + if (!quiet && testcalls > simulatedopcount) > + prt("skipping zero length fallocate\n"); > + log4(OP_SKIPPED, OP_FALLOCATE, offset, length); > + return; > + } > + > + keep_size = random() % 2; > + > + end_offset = keep_size ? 0 : offset + length; > + > + if (end_offset > biggest) { > + biggest = end_offset; > + if (!quiet && testcalls > simulatedopcount) > + prt("fallocating to largest ever: 0x%x\n", end_offset); > + } > + > + /* > + * last arg: > + * 1: allocate past EOF > + * 2: extending prealloc > + * 3: interior prealloc > + */ > + log4(OP_FALLOCATE, offset, length, (end_offset > file_size) ? (keep_size ? 1 : 2) : 3); > + > + if (end_offset > file_size) { > + memset(good_buf + file_size, '\0', end_offset - file_size); > + file_size = end_offset; > + } > + > + if (testcalls <= simulatedopcount) > + return; > + > + if ((progressinterval && testcalls % progressinterval == 0) || > + (debug && (monitorstart == -1 || monitorend == -1 || > + end_offset <= monitorend))) > + prt("%lu falloc\tfrom 0x%x to 0x%x\n", testcalls, offset, length); > + if (fallocate(fd, keep_size ? FALLOC_FL_KEEP_SIZE : 0, (loff_t)offset, (loff_t)length) == -1) { > + prt("fallocate: %x to %x\n", offset, length); > + prterr("dofallocate: fallocate"); > + report_failure(161); > + } > +} > +#else > +void > +dofallocate(unsigned offset, unsigned length) > +{ > + return; > +} > +#endif > > void > writefileimage() > @@ -823,7 +899,7 @@ test(void) > unsigned long offset; > unsigned long size = maxoplen; > unsigned long rv = random(); > - unsigned long op = rv % (3 + !lite + mapped_writes); > + unsigned long op = rv % (3 + !lite + mapped_writes + fallocate_calls); > > /* turn off the map read if necessary */ > > @@ -845,22 +921,33 @@ test(void) > prt("%lu...\n", testcalls); > > /* > - * READ: op = 0 > - * WRITE: op = 1 > - * MAPREAD: op = 2 > - * TRUNCATE: op = 3 > - * MAPWRITE: op = 3 or 4 > + * lite !lite > + * READ: op = 0 0 > + * WRITE: op = 1 1 > + * MAPREAD: op = 2 2 > + * TRUNCATE: op = - 3 > + * MAPWRITE: op = 3 4 > + * FALLOCATE: op = - 5 > */ > if (lite ? 0 : op == 3 && (style & 1) == 0) /* vanilla truncate? */ > dotruncate(random() % maxfilelen); > else { > if (randomoplen) > size = random() % (maxoplen+1); > + > + /* truncate */ > if (lite ? 0 : op == 3) > dotruncate(size); > else { > offset = random(); > - if (op == 1 || op == (lite ? 3 : 4)) { > + /* fallocate */ > + if (op == 5) { > + offset %= maxfilelen; > + if (offset + size > maxfilelen) > + size = maxfilelen - offset; > + dofallocate(offset, size); > + /* write / mapwrite */ > + } else if (op == 1 || op == (lite ? 3 : 4)) { > offset %= maxfilelen; > if (offset + size > maxfilelen) > size = maxfilelen - offset; > @@ -868,6 +955,7 @@ test(void) > domapwrite(offset, size); > else > dowrite(offset, size); > + /* read / mapread */ > } else { > if (file_size) > offset %= file_size; > @@ -904,7 +992,7 @@ void > usage(void) > { > fprintf(stdout, "usage: %s", > - "fsx [-dnqxALOWZ] [-b opnum] [-c Prob] [-l flen] [-m start:end] [-o oplen] [-p progressinterval] [-r readbdy] [-s style] [-t truncbdy] [-w writebdy] [-D startingop] [-N numops] [-P dirpath] [-S seed] fname\n\ > + "fsx [-dnqxAFLOWZ] [-b opnum] [-c Prob] [-l flen] [-m start:end] [-o oplen] [-p progressinterval] [-r readbdy] [-s style] [-t truncbdy] [-w writebdy] [-D startingop] [-N numops] [-P dirpath] [-S seed] fname\n\ > -b opnum: beginning operation number (default 1)\n\ > -c P: 1 in P chance of file close+open at each op (default infinity)\n\ > -d: debug output for all operations\n\ > @@ -925,8 +1013,11 @@ usage(void) > #ifdef AIO > " -A: Use the AIO system calls\n" > #endif > -" -D startingop: debug output starting at specified operation\n\ > - -L: fsxLite - no file creations & no file size changes\n\ > +" -D startingop: debug output starting at specified operation\n" > +#ifdef FALLOCATE > +" -F: Do not use fallocate (preallocation) calls\n" > +#endif > +" -L: fsxLite - no file creations & no file size changes\n\ > -N numops: total # operations to do (default infinity)\n\ > -O: use oplen (see -o flag) for every op (default random)\n\ > -P: save .fsxlog and .fsxgood files in dirpath (default ./)\n\ > @@ -1092,7 +1183,7 @@ main(int argc, char **argv) > > setvbuf(stdout, (char *)0, _IOLBF, 0); /* line buffered stdout */ > > - while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:LN:OP:RS:WZ")) > + while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FLN:OP:RS:WZ")) > != EOF) > switch (ch) { > case 'b': > @@ -1186,6 +1277,9 @@ main(int argc, char **argv) > if (debugstart < 1) > usage(); > break; > + case 'F': > + fallocate_calls = 0; > + break; > case 'L': > lite = 1; > break; > @@ -1331,6 +1425,16 @@ main(int argc, char **argv) > } else > check_trunc_hack(); > > +#ifdef FALLOCATE > + if (!lite && fallocate_calls) { > + if (fallocate(fd, 0, 0, 1) && errno == EOPNOTSUPP) { > + warn("main: filesystem does not support fallocate, disabling"); > + fallocate_calls = 0; > + } else > + ftruncate(fd, 0); > + } > +#endif > + > while (numops == -1 || numops--) > test(); > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Wed Jun 3 17:01:09 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53M186P197953 for ; Wed, 3 Jun 2009 17:01:08 -0500 X-ASG-Debug-ID: 1244066485-5c3a01670000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 626362BEF97 for ; Wed, 3 Jun 2009 15:01:25 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id SEaN4g5FHZeWE64G for ; Wed, 03 Jun 2009 15:01:25 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n53M1Gox022509; Wed, 3 Jun 2009 18:01:16 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n53M1EVR012909; Wed, 3 Jun 2009 18:01:15 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n53M1Dib032761; Wed, 3 Jun 2009 18:01:13 -0400 Message-ID: <4A26F2A9.8050300@sandeen.net> Date: Wed, 03 Jun 2009 17:01:13 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/7] xfs: introduce a per-ag inode iterator Subject: Re: [PATCH 5/7] xfs: introduce a per-ag inode iterator References: <20090514171233.942489000@bombadil.infradead.org> <20090514171558.869514000@bombadil.infradead.org> In-Reply-To: <20090514171558.869514000@bombadil.infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244066486 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > From: Dave Chinner > > Given that we walk across the per-ag inode lists so often, it makes sense to > introduce an iterator for this. > > Convert the sync and reclaim code to use this new iterator, quota code will > follow in the next patch. > > [hch: merged the lookup and execute callbacks back into one to get the > pag_ici_lock locking correct and simplify the code flow] > > Signed-off-by: Dave Chinner > Signed-off-by: Christoph Hellwig Somehow I'm finding this hard to review, but... > Index: xfs/fs/xfs/linux-2.6/xfs_sync.c > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2009-05-14 16:20:37.012658983 +0200 > +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2009-05-14 16:22:26.321659103 +0200 ... > +STATIC int > +xfs_inode_ag_walk( > + struct xfs_mount *mp, > + xfs_agnumber_t ag, > + int (*execute)(struct xfs_inode *ip, > + struct xfs_perag *pag, int flags), > + int flags, > + int tag) > +{ > + struct xfs_perag *pag = &mp->m_perag[ag]; > + uint32_t first_index; > + int last_error = 0; > + int skipped; > + > +restart: > + skipped = 0; > + first_index = 0; > + do { > + int error = 0; > + xfs_inode_t *ip; > + > + ip = xfs_inode_ag_lookup(mp, pag, &first_index, tag); > + if (!ip) > + break; > + > + error = execute(ip, pag, flags); > + if (error == EAGAIN) { > + skipped++; > + continue; > + } > + if (error) > + last_error = error; > + /* > + * bail out if the filesystem is corrupted. > + */ > + if (error == EFSCORRUPTED) > + break; Ok so here we are looking for EFSCORRUPTED from the "execute" function. This might be xfs_sync_inode_data, xfs_sync_inode_attr, or xfs_reclaim_inode_now. But ... > + > + } while (1); ... > @@ -85,12 +201,17 @@ xfs_sync_inode_valid( > STATIC int > xfs_sync_inode_data( > struct xfs_inode *ip, > + struct xfs_perag *pag, > int flags) > { > struct inode *inode = VFS_I(ip); > struct address_space *mapping = inode->i_mapping; > int error = 0; > > + error = xfs_sync_inode_valid(ip, pag); > + if (error) > + return 0;xfs_sync_inode_attr( > + xfs_sync_inode_valid can return 0, ENOENT, or EFSCORRUPTED. Aren't we losing the error here... > if (mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) { > if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) { > if (flags & SYNC_TRYLOCK) > @@ -106,16 +227,22 @@ xfs_sync_inode_data( > out_wait: > if (flags & SYNC_IOWAIT) > xfs_ioend_wait(ip); > + IRELE(ip); > return error; > } > > STATIC int > xfs_sync_inode_attr( > struct xfs_inode *ip, > + struct xfs_perag *pag, > int flags) > { > int error = 0; > > + error = xfs_sync_inode_valid(ip, pag); > + if (error) > + return 0; and here? so xfs_sync_inode_data / xfs_sync_inode_attr are the "execute" in xfs_inode_ag_walk(): > + error = execute(ip, pag, flags); > + if (error == EAGAIN) { > + skipped++; > + continue; > + } > + if (error) > + last_error = error; above, and I think they're ignoring the return from xfs_sync_inode_valid(), therefore xfs_inode_ag_walk won't see EFSCORRUPTED from it either ... right? -Eric From sandeen@sandeen.net Wed Jun 3 17:18:26 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53MIQJC198814 for ; Wed, 3 Jun 2009 17:18:26 -0500 X-ASG-Debug-ID: 1244067523-16d302300000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E04AB1BC9054 for ; Wed, 3 Jun 2009 15:18:43 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id gsbRePDjUOqin3kt for ; Wed, 03 Jun 2009 15:18:43 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n53MIXbb029210; Wed, 3 Jun 2009 18:18:33 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n53MIQ8m017972; Wed, 3 Jun 2009 18:18:31 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n53MIPGw003417; Wed, 3 Jun 2009 18:18:26 -0400 Message-ID: <4A26F6B1.20509@sandeen.net> Date: Wed, 03 Jun 2009 17:18:25 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/7] xfs: introduce a per-ag inode iterator Subject: Re: [PATCH 5/7] xfs: introduce a per-ag inode iterator References: <20090514171233.942489000@bombadil.infradead.org> <20090514171558.869514000@bombadil.infradead.org> In-Reply-To: <20090514171558.869514000@bombadil.infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244067523 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.13 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > From: Dave Chinner > > Given that we walk across the per-ag inode lists so often, it makes sense to > introduce an iterator for this. > > Convert the sync and reclaim code to use this new iterator, quota code will > follow in the next patch. > > [hch: merged the lookup and execute callbacks back into one to get the > pag_ici_lock locking correct and simplify the code flow] > > Signed-off-by: Dave Chinner > Signed-off-by: Christoph Hellwig And a similar error handling question... > Index: xfs/fs/xfs/linux-2.6/xfs_sync.c > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2009-05-14 16:20:37.012658983 +0200 > +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2009-05-14 16:22:26.321659103 +0200 ... > +STATIC int > +xfs_inode_ag_walk( > + struct xfs_mount *mp, > + xfs_agnumber_t ag, > + int (*execute)(struct xfs_inode *ip, > + struct xfs_perag *pag, int flags), > + int flags, > + int tag) > +{ > + struct xfs_perag *pag = &mp->m_perag[ag]; > + uint32_t first_index; > + int last_error = 0; > + int skipped; > + > +restart: > + skipped = 0; > + first_index = 0; > + do { > + int error = 0; > + xfs_inode_t *ip; > + > + ip = xfs_inode_ag_lookup(mp, pag, &first_index, tag); > + if (!ip) > + break; > + > + error = execute(ip, pag, flags); > + if (error == EAGAIN) { > + skipped++; > + continue; > + } Ok, it's looking for EAGAIN here, I'm assuming this is for when we are calling xfs_reclaim_inode_now, because... ... > -STATIC void > -xfs_reclaim_inodes_ag( > - xfs_mount_t *mp, > - int ag, > - int mode) > +STATIC int > +xfs_reclaim_inode_now( > + struct xfs_inode *ip, > + struct xfs_perag *pag, > + int flags) > { > - xfs_inode_t *ip = NULL; > - xfs_perag_t *pag = &mp->m_perag[ag]; > - int nr_found; > - uint32_t first_index; > - int skipped; > - > -restart: > - first_index = 0; > - skipped = 0; > - do { ... > - > - /* > - * hmmm - this is an inode already in reclaim. Do > - * we even bother catching it here? > - */ > - if (xfs_reclaim_inode(ip, 0, mode)) > - skipped++; > - } while (nr_found); ... because before, that's what we did above, after testing for a non-0 return from xfs_reclaim_inode. But xfs_reclaim_inode_now() returns 0 or the result of xfs_reclaim_inode, which is 0/1, so above: > + error = execute(ip, pag, flags); > + if (error == EAGAIN) { > + skipped++; > + continue; > + } isn't going to see EAGAIN from xfs_reclaim_inode_now... am I following this right? -Eric From jeffpc@josefsipek.net Wed Jun 3 18:19:31 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53NJUvY201555 for ; Wed, 3 Jun 2009 18:19:31 -0500 X-ASG-Debug-ID: 1244071180-1a8f00780000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from josefsipek.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 95DDE121102A for ; Wed, 3 Jun 2009 16:19:40 -0700 (PDT) Received: from josefsipek.net (josefsipek.net [141.211.133.196]) by cuda.sgi.com with ESMTP id 4YOjIooJFqWjvZBC for ; Wed, 03 Jun 2009 16:19:40 -0700 (PDT) Received: by josefsipek.net (Postfix, from userid 1000) id 3BDA11C00DCC; Wed, 3 Jun 2009 19:19:39 -0400 (EDT) Date: Wed, 3 Jun 2009 19:19:39 -0400 From: "Josef 'Jeff' Sipek" To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH, RFC] xfstests: random fallocate calls in fsx Subject: Re: [PATCH, RFC] xfstests: random fallocate calls in fsx Message-ID: <20090603231939.GA9167@josefsipek.net> References: <4A0B420E.3070908@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A0B420E.3070908@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: josefsipek.net[141.211.133.196] X-Barracuda-Start-Time: 1244071180 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Good idea. On Wed, May 13, 2009 at 04:56:30PM -0500, Eric Sandeen wrote: > Seems to work for me. Any comments/suggestions? > > I can probably make it fall back to the xfs ioctl if fallocate > isn't supported, if strongly desired. Is the ioctl going away anytime soon? If not, it might be worth having fsx use _both_ if possible, or just the ioctl if fallocate doesn't seem to be available. > @@ -770,6 +788,64 @@ dotruncate(unsigned size) > } > } > > +#ifdef FALLOCATE > +/* fallocate is basically a no-op unless extending, then a lot like a truncate */ > +void > +dofallocate(unsigned offset, unsigned length) > +{ > + unsigned end_offset; > + int keep_size; > + > + if (length == 0) { > + if (!quiet && testcalls > simulatedopcount) > + prt("skipping zero length fallocate\n"); > + log4(OP_SKIPPED, OP_FALLOCATE, offset, length); > + return; > + } > + > + keep_size = random() % 2; > + > + end_offset = keep_size ? 0 : offset + length; I prefer seeing explicit ( ) in this case. ... -- Reality is merely an illusion, albeit a very persistent one. - Albert Einstein From jeffpc@josefsipek.net Wed Jun 3 18:25:48 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53NPmkL201795 for ; Wed, 3 Jun 2009 18:25:48 -0500 X-ASG-Debug-ID: 1244071565-0baa025b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from josefsipek.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 9913B11934EC for ; Wed, 3 Jun 2009 16:26:05 -0700 (PDT) Received: from josefsipek.net (josefsipek.net [141.211.133.196]) by cuda.sgi.com with ESMTP id uTMkrasj77JokZfY for ; Wed, 03 Jun 2009 16:26:05 -0700 (PDT) Received: by josefsipek.net (Postfix, from userid 1000) id 3D12C1C00DCC; Wed, 3 Jun 2009 19:26:05 -0400 (EDT) Date: Wed, 3 Jun 2009 19:26:05 -0400 From: "Josef 'Jeff' Sipek" To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 7/7] xfs: split xfs_sync_inodes Subject: Re: [PATCH 7/7] xfs: split xfs_sync_inodes Message-ID: <20090603232605.GB9167@josefsipek.net> References: <20090514171233.942489000@bombadil.infradead.org> <20090514171559.231368000@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090514171559.231368000@bombadil.infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: josefsipek.net[141.211.133.196] X-Barracuda-Start-Time: 1244071565 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE_7582B X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.18 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE_7582B Custom Rule 7582B X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 14, 2009 at 01:12:40PM -0400, Christoph Hellwig wrote: > xfs_sync_inodes is used to write back either file data or inode metadata. > In generally we always do these separately, except for one fishy case in > xfs_fs_put_super that does both. So separate xfs_sync_inodes into > separate xfs_sync_data and xfs_sync_attr functions. In xfs_fs_put_super > we first call the data sync and then the attr sync as that was the previous > order. The moved log force in that path doesn't make a different because ^^^^^^^^^ Typo. > Index: xfs/fs/xfs/linux-2.6/xfs_super.c > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2009-05-14 19:09:00.178792110 +0200 > +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2009-05-14 19:09:05.278808755 +0200 > @@ -1070,7 +1070,18 @@ xfs_fs_put_super( > int unmount_event_flags = 0; > > xfs_syncd_stop(mp); > - xfs_sync_inodes(mp, SYNC_ATTR|SYNC_DELWRI); > + > + if (!(sb->s_flags & MS_RDONLY)) { > + /* > + * XXX(hch): this should be SYNC_WAIT. > + * > + * Or more likely no needed at all because the VFS is already ^^ Typo. -- Real Programmers consider "what you see is what you get" to be just as bad a concept in Text Editors as it is in women. No, the Real Programmer wants a "you asked for it, you got it" text editor -- complicated, cryptic, powerful, unforgiving, dangerous. From jeffpc@josefsipek.net Wed Jun 3 18:28:52 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53NSquK201949 for ; Wed, 3 Jun 2009 18:28:52 -0500 X-ASG-Debug-ID: 1244072143-395d00f00000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from josefsipek.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0D92810521C5 for ; Wed, 3 Jun 2009 16:35:43 -0700 (PDT) Received: from josefsipek.net (josefsipek.net [141.211.133.196]) by cuda.sgi.com with ESMTP id eJBGr7JU9nClVfnp for ; Wed, 03 Jun 2009 16:35:43 -0700 (PDT) Received: by josefsipek.net (Postfix, from userid 1000) id 2150C1C00DCC; Wed, 3 Jun 2009 19:29:07 -0400 (EDT) Date: Wed, 3 Jun 2009 19:29:07 -0400 From: "Josef 'Jeff' Sipek" To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 6/7] xfs: use generic inode iterator in xfs_qm_dqrele_all_inodes Subject: Re: [PATCH 6/7] xfs: use generic inode iterator in xfs_qm_dqrele_all_inodes Message-ID: <20090603232907.GC9167@josefsipek.net> References: <20090514171233.942489000@bombadil.infradead.org> <20090514171559.029154000@bombadil.infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090514171559.029154000@bombadil.infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: josefsipek.net[141.211.133.196] X-Barracuda-Start-Time: 1244072145 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 14, 2009 at 01:12:39PM -0400, Christoph Hellwig wrote: > Use xfs_inode_ag_iterator instead of opencoding the inode walk in the > quota code. Mark xfs_inode_ag_iterator and xfs_sync_inode_valid non-static > to allow using them from the quota code. Nice cleanup. I don't see any problems with it. Jeff. -- Keyboard not found! Press F1 to enter Setup From jeffpc@josefsipek.net Wed Jun 3 18:30:31 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n53NUUbh202044 for ; Wed, 3 Jun 2009 18:30:30 -0500 X-ASG-Debug-ID: 1244072243-367701300000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from josefsipek.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8135610522FC for ; Wed, 3 Jun 2009 16:37:23 -0700 (PDT) Received: from josefsipek.net (josefsipek.net [141.211.133.196]) by cuda.sgi.com with ESMTP id sTwwYQuDIEezvBzM for ; Wed, 03 Jun 2009 16:37:23 -0700 (PDT) Received: by josefsipek.net (Postfix, from userid 1000) id BB6D81C00DCC; Wed, 3 Jun 2009 19:30:47 -0400 (EDT) Date: Wed, 3 Jun 2009 19:30:47 -0400 From: "Josef 'Jeff' Sipek" To: Christoph Hellwig Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 8/7] xfs: remove SYNC_IOWAIT Subject: Re: [PATCH 8/7] xfs: remove SYNC_IOWAIT Message-ID: <20090603233047.GD9167@josefsipek.net> References: <20090514171233.942489000@bombadil.infradead.org> <20090528121915.GA30037@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090528121915.GA30037@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: josefsipek.net[141.211.133.196] X-Barracuda-Start-Time: 1244072243 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.19 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, May 28, 2009 at 08:19:16AM -0400, Christoph Hellwig wrote: > We want to wait for all I/O to finish when we do data integrity syncs. So > there is no reason to keep SYNC_WAIT separate from SYNC_IOWAIT. This > causes a little change in behaviour for the ENOSPC flushing code which no ^^ Typo, otherwise good. Jeff. -- My public GPG key can be found at http://www.josefsipek.net/gpg/public-0xC7958FFE.txt From SRS0+kQpQ+89+fromorbit.com=david@internode.on.net Thu Jun 4 04:15:45 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n549FiGO232228 for ; Thu, 4 Jun 2009 04:15:45 -0500 X-ASG-Debug-ID: 1244106960-078700640000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AD3701D3A9DA for ; Thu, 4 Jun 2009 02:16:00 -0700 (PDT) Received: from mail.internode.on.net (bld-mail19.adl2.internode.on.net [150.101.137.104]) by cuda.sgi.com with ESMTP id tohNKFugoU6rKIAt for ; Thu, 04 Jun 2009 02:16:00 -0700 (PDT) Received: from discord (unverified [121.44.1.36]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 530899-1927428 for ; Thu, 04 Jun 2009 18:45:59 +0930 (CST) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1MC93G-0006ol-3s for xfs@oss.sgi.com; Thu, 04 Jun 2009 19:15:58 +1000 Date: Thu, 4 Jun 2009 19:15:58 +1000 From: Dave Chinner To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] [XFSQA] Add license boilerplate to 205 Subject: [PATCH] [XFSQA] Add license boilerplate to 205 Message-ID: <20090604091558.GS16929@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail19.adl2.internode.on.net[150.101.137.104] X-Barracuda-Start-Time: 1244106961 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.21 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean [XFSQA] Add license boilerplate to 205 Signed-off-by: Dave Chinner --- 205 | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-) diff --git a/205 b/205 index 502adc7..c85e102 100755 --- a/205 +++ b/205 @@ -5,6 +5,19 @@ # #----------------------------------------------------------------------- # Copyright (c) 2009 Dave Chinner +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #----------------------------------------------------------------------- # # creator From SRS0+jKn/+89+fromorbit.com=david@internode.on.net Thu Jun 4 04:23:17 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n549NG9D232558 for ; Thu, 4 Jun 2009 04:23:16 -0500 X-ASG-Debug-ID: 1244107412-544300a30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AE2F62CFE08 for ; Thu, 4 Jun 2009 02:23:33 -0700 (PDT) Received: from mail.internode.on.net (bld-mail18.adl2.internode.on.net [150.101.137.103]) by cuda.sgi.com with ESMTP id vXyPYxGQa2ywTcoB for ; Thu, 04 Jun 2009 02:23:33 -0700 (PDT) Received: from discord (unverified [121.44.1.36]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 538880-1927428 for multiple; Thu, 04 Jun 2009 18:53:32 +1030 (CDT) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1MC9AY-0006p4-Tk; Thu, 04 Jun 2009 19:23:30 +1000 Date: Thu, 4 Jun 2009 19:23:30 +1000 From: Dave Chinner To: Alexander Beregalov Cc: Kernel Testers List , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! Subject: Re: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! Message-ID: <20090604092330.GT16929@discord.disaster> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail18.adl2.internode.on.net[150.101.137.103] X-Barracuda-Start-Time: 1244107414 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.21 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Jun 01, 2009 at 07:22:56PM +0400, Alexander Beregalov wrote: > Hi > > Assertion failed: *nmap >= 1, file: fs/xfs/xfs_bmap.c, line: 4846 ..... > Call Trace: > [] xfs_bmapi+0xad/0x1ad0 > [] xfs_dir2_leaf_getdents+0x640/0x7b0 > [] xfs_readdir+0x12c/0x140 > [] xfs_file_readdir+0x47/0x70 > [] vfs_readdir+0xd0/0xf0 > [] sys_getdents+0x96/0x110 > [] system_call_fastpath+0x16/0x1b I'd say this indicates a corrupted directory. Can you run 'xfs_repair -n' over the filesystem and see if it finds a bad directory? Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0+9w2/+89+fromorbit.com=david@internode.on.net Thu Jun 4 04:45:04 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n549j3pj233848 for ; Thu, 4 Jun 2009 04:45:04 -0500 X-ASG-Debug-ID: 1244109116-3c43033f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.internode.on.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 48C361053373 for ; Thu, 4 Jun 2009 02:51:57 -0700 (PDT) Received: from mail.internode.on.net (bld-mail13.adl6.internode.on.net [150.101.137.98]) by cuda.sgi.com with ESMTP id Z3wbhHZS4GvkOJKt for ; Thu, 04 Jun 2009 02:51:57 -0700 (PDT) Received: from discord (unverified [121.44.1.36]) by mail.internode.on.net (SurgeMail 3.8f2) with ESMTP id 574545-1927428 for multiple; Thu, 04 Jun 2009 19:15:18 +0930 (CST) Received: from dave by discord with local (Exim 4.69) (envelope-from ) id 1MC9VY-0006pw-Is; Thu, 04 Jun 2009 19:45:12 +1000 Date: Thu, 4 Jun 2009 19:45:12 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Eric Sandeen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/5] xfs: fix xfs_quiesce_data Subject: Re: [PATCH 5/5] xfs: fix xfs_quiesce_data Message-ID: <20090604094512.GU16929@discord.disaster> References: <20090426140305.113371000@bombadil.infradead.org> <20090426140708.279368000@bombadil.infradead.org> <4A071F06.8040106@sandeen.net> <20090511201511.GB14195@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090511201511.GB14195@infradead.org> User-Agent: Mutt/1.5.18 (2008-05-17) X-Barracuda-Connect: bld-mail13.adl6.internode.on.net[150.101.137.98] X-Barracuda-Start-Time: 1244109119 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.21 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, May 11, 2009 at 04:15:11PM -0400, Christoph Hellwig wrote: > On Sun, May 10, 2009 at 01:37:58PM -0500, Eric Sandeen wrote: > > I guess I too would like a reason for the filestream_flush move > > somewhere in the changelog... > > Hehe, maybe Dave can chime in. Or I can test if it actually affects > anything and maybe move it out to another patch. The lack of > reliability of the filesystreams tests doesn't make this any easier to > test. (Just catching up on my mail backlog) I think that the filestream_flush() call should actually be after the data flush. filestream_flush() is used to clear the filestream association cache which holds references to the inodes. Where the flush is currently placed is destroying the association that defines the AG the data should be written to before the data is written. As a result it may not end up in the AG carefully associated with the inode during the write() syscall. This may be one of the reasons for the filestreams tests failing frequently.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+b120f952b32a2b3cb0f4+2111+infradead.org+hch@bombadil.srs.infradead.org Thu Jun 4 05:40:58 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n54Aevgd236783 for ; Thu, 4 Jun 2009 05:40:58 -0500 X-ASG-Debug-ID: 1244112075-0c96006e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6F0BA2D024A for ; Thu, 4 Jun 2009 03:41:15 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id C9mUBNAsxn2i13Pt for ; Thu, 04 Jun 2009 03:41:15 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MCANm-0002IR-R9; Thu, 04 Jun 2009 10:41:14 +0000 Date: Thu, 4 Jun 2009 06:41:14 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] [XFSQA] Add license boilerplate to 205 Subject: Re: [PATCH] [XFSQA] Add license boilerplate to 205 Message-ID: <20090604104114.GA8413@infradead.org> References: <20090604091558.GS16929@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090604091558.GS16929@discord.disaster> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244112075 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Thanks, looks good. On Thu, Jun 04, 2009 at 07:15:58PM +1000, Dave Chinner wrote: > [XFSQA] Add license boilerplate to 205 > > Signed-off-by: Dave Chinner > --- > 205 | 13 +++++++++++++ > 1 files changed, 13 insertions(+), 0 deletions(-) > > diff --git a/205 b/205 > index 502adc7..c85e102 100755 > --- a/205 > +++ b/205 > @@ -5,6 +5,19 @@ > # > #----------------------------------------------------------------------- > # Copyright (c) 2009 Dave Chinner > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > #----------------------------------------------------------------------- > # > # creator > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs ---end quoted text--- From BATV+b120f952b32a2b3cb0f4+2111+infradead.org+hch@bombadil.srs.infradead.org Thu Jun 4 05:45:02 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n54Aj2up237010 for ; Thu, 4 Jun 2009 05:45:02 -0500 X-ASG-Debug-ID: 1244112320-0c6200d80000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7F4F02D027E for ; Thu, 4 Jun 2009 03:45:20 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id FFT5PhVz9M82881G for ; Thu, 04 Jun 2009 03:45:20 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MCARk-0002lt-1P; Thu, 04 Jun 2009 10:45:20 +0000 Date: Thu, 4 Jun 2009 06:45:20 -0400 From: Christoph Hellwig To: "Josef 'Jeff' Sipek" Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 7/7] xfs: split xfs_sync_inodes Subject: Re: [PATCH 7/7] xfs: split xfs_sync_inodes Message-ID: <20090604104520.GB8413@infradead.org> References: <20090514171233.942489000@bombadil.infradead.org> <20090514171559.231368000@bombadil.infradead.org> <20090603232605.GB9167@josefsipek.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090603232605.GB9167@josefsipek.net> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244112320 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Jun 03, 2009 at 07:26:05PM -0400, Josef 'Jeff' Sipek wrote: > > order. The moved log force in that path doesn't make a different because > ^^^^^^^^^ > > Typo. > > > + * Or more likely no needed at all because the VFS is already > ^^ > > Typo. Thanks, fixed both for the next iteration. From BATV+b120f952b32a2b3cb0f4+2111+infradead.org+hch@bombadil.srs.infradead.org Thu Jun 4 05:45:45 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n54AjiqV237054 for ; Thu, 4 Jun 2009 05:45:45 -0500 X-ASG-Debug-ID: 1244112362-0c82009c0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 159F22D0284 for ; Thu, 4 Jun 2009 03:46:02 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 3OJsBkJSPkCOLdKF for ; Thu, 04 Jun 2009 03:46:02 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MCASQ-0004Ci-Oq; Thu, 04 Jun 2009 10:46:02 +0000 Date: Thu, 4 Jun 2009 06:46:02 -0400 From: Christoph Hellwig To: "Josef 'Jeff' Sipek" Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 8/7] xfs: remove SYNC_IOWAIT Subject: Re: [PATCH 8/7] xfs: remove SYNC_IOWAIT Message-ID: <20090604104602.GC8413@infradead.org> References: <20090514171233.942489000@bombadil.infradead.org> <20090528121915.GA30037@infradead.org> <20090603233047.GD9167@josefsipek.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090603233047.GD9167@josefsipek.net> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244112363 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Jun 03, 2009 at 07:30:47PM -0400, Josef 'Jeff' Sipek wrote: > > causes a little change in behaviour for the ENOSPC flushing code which no > ^^ > Typo, otherwise good. Thanks, fixed for the next iteration. From BATV+b120f952b32a2b3cb0f4+2111+infradead.org+hch@bombadil.srs.infradead.org Thu Jun 4 05:59:49 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n54Axm1b237745 for ; Thu, 4 Jun 2009 05:59:49 -0500 X-ASG-Debug-ID: 1244113206-0c9601580000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BE1E32CFE5C for ; Thu, 4 Jun 2009 04:00:06 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id hRefzU367HQoPRQ0 for ; Thu, 04 Jun 2009 04:00:06 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MCAg2-0000Tc-B9; Thu, 04 Jun 2009 11:00:06 +0000 Date: Thu, 4 Jun 2009 07:00:06 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/7] xfs: introduce a per-ag inode iterator Subject: Re: [PATCH 5/7] xfs: introduce a per-ag inode iterator Message-ID: <20090604110006.GA22115@infradead.org> References: <20090514171233.942489000@bombadil.infradead.org> <20090514171558.869514000@bombadil.infradead.org> <4A26F2A9.8050300@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A26F2A9.8050300@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244113206 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Jun 03, 2009 at 05:01:13PM -0500, Eric Sandeen wrote: > Ok so here we are looking for EFSCORRUPTED from the "execute" function. > This might be xfs_sync_inode_data, xfs_sync_inode_attr, or > xfs_reclaim_inode_now. But ... > > xfs_sync_inode_valid can return 0, ENOENT, or EFSCORRUPTED. > > Aren't we losing the error here... We can get the EFSCORRUPTED from xfs_iflush. > > > > + error = xfs_sync_inode_valid(ip, pag); > > + if (error) > > + return 0; > > and here? > > so xfs_sync_inode_data / xfs_sync_inode_attr are the "execute" in > xfs_inode_ag_walk(): If you look at the old code we return early with 0 for the XFS_FORCED_SHUTDOWN case, which is the only reason xfs_sync_inode_valid return xfs_sync_inode_valid in the new code. We don't actually break out of the loop in the new code, but don't do any action so the behaviour is as similar as it gets. An EFSCORRUPTED later in the execute function (which AFAICS can only come from xfs_iflush) will end up pssed down to xfs_inode_ag_iterator. I can't say that I like this too much. And in the end only xfs_fs_quota_sync actually every propagates the return value from xfs_sync_inodes, and then just directly to userspace. So I think we are safe just propagating the EFSCORRUPTED down and make all this a lot more logical. From BATV+b120f952b32a2b3cb0f4+2111+infradead.org+hch@bombadil.srs.infradead.org Thu Jun 4 06:26:42 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n54BQfa2239491 for ; Thu, 4 Jun 2009 06:26:42 -0500 X-ASG-Debug-ID: 1244115217-12d202590000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BB7ED10541F2 for ; Thu, 4 Jun 2009 04:33:37 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id o9dCNW1SjOQsCUjA for ; Thu, 04 Jun 2009 04:33:37 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MCB61-0003rz-Ge; Thu, 04 Jun 2009 11:26:57 +0000 Date: Thu, 4 Jun 2009 07:26:57 -0400 From: Christoph Hellwig To: randrik@mail.ru, Martin Spott Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Subject: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Message-ID: <20090604112657.GA10738@infradead.org> References: <20090520003745.GA27491@samad.com.au> <20090520090558.GQ16929@discord.disaster> <20090520095639.GA27496@samad.com.au> <20090526090916.GA17194@infradead.org> <20090527025457.GA32668@samad.com.au> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090527025457.GA32668@samad.com.au> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244115217 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Sorry guys, still haven't been able to track it down. Any chance one of you could run with CONFIG_XFS_DEBUG enabled and see if it trips over any of the asserts? From BATV+b120f952b32a2b3cb0f4+2111+infradead.org+hch@bombadil.srs.infradead.org Thu Jun 4 08:02:55 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n54D2siZ244899 for ; Thu, 4 Jun 2009 08:02:54 -0500 X-ASG-Debug-ID: 1244120989-1c2200820000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7E667148E6BD for ; Thu, 4 Jun 2009 06:09:49 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id LR931um4Tikr7Bbp for ; Thu, 04 Jun 2009 06:09:49 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MCCb8-0006ot-NX for xfs@oss.sgi.com; Thu, 04 Jun 2009 13:03:10 +0000 Date: Thu, 4 Jun 2009 09:03:10 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfstests: fix for bash 3.2 Subject: [PATCH] xfstests: fix for bash 3.2 Message-ID: <20090604130310.GA14560@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244120990 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Bash 3.2 wants a space before the closing "]" in a test: Signed-off-by: Christoph Hellwig Index: xfstests-dev/check =================================================================== --- xfstests-dev.orig/check 2009-06-04 12:36:21.000000000 +0000 +++ xfstests-dev/check 2009-06-04 12:36:26.000000000 +0000 @@ -160,7 +160,7 @@ EOF -if [ ! -z "$SCRATCH_DEV"]; then +if [ ! -z "$SCRATCH_DEV" ]; then umount $SCRATCH_DEV 2>/dev/null # call the overridden mkfs - make sure the FS is built # the same as we'll create it later. From felixb@sgi.com Thu Jun 4 08:33:20 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n54DXKPv245916 for ; Thu, 4 Jun 2009 08:33:20 -0500 Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7B8DAAC0AA for ; Thu, 4 Jun 2009 06:33:35 -0700 (PDT) Received: from eagdhcp-232-199.americas.sgi.com (eagdhcp-232-199.americas.sgi.com [128.162.232.199]) by estes.americas.sgi.com (Postfix) with ESMTP id DB9527000103; Thu, 4 Jun 2009 08:33:34 -0500 (CDT) Cc: xfs@oss.sgi.com Message-Id: <5D22C0D8-9A67-4DC3-8848-45F3540A2183@sgi.com> From: Felix Blyakher To: Christoph Hellwig In-Reply-To: <20090604130310.GA14560@infradead.org> Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v926) Subject: Re: [PATCH] xfstests: fix for bash 3.2 Date: Thu, 4 Jun 2009 08:33:33 -0500 References: <20090604130310.GA14560@infradead.org> X-Mailer: Apple Mail (2.926) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Jun 4, 2009, at 8:03 AM, Christoph Hellwig wrote: > Bash 3.2 wants a space before the closing "]" in a test: > > > Signed-off-by: Christoph Hellwig Reviewed-by: Felix Blyakher > > > Index: xfstests-dev/check > =================================================================== > --- xfstests-dev.orig/check 2009-06-04 12:36:21.000000000 +0000 > +++ xfstests-dev/check 2009-06-04 12:36:26.000000000 +0000 > @@ -160,7 +160,7 @@ > > EOF > > -if [ ! -z "$SCRATCH_DEV"]; then > +if [ ! -z "$SCRATCH_DEV" ]; then > umount $SCRATCH_DEV 2>/dev/null > # call the overridden mkfs - make sure the FS is built > # the same as we'll create it later. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Thu Jun 4 09:46:43 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n54EkgbC249273 for ; Thu, 4 Jun 2009 09:46:42 -0500 X-ASG-Debug-ID: 1244127218-0d7c000a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A07AF1055CAF for ; Thu, 4 Jun 2009 07:53:38 -0700 (PDT) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id FjmycVdLE6FUYHGb for ; Thu, 04 Jun 2009 07:53:38 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 7F281A9B0BF; Thu, 4 Jun 2009 09:46:58 -0500 (CDT) Message-ID: <4A27DE61.5030704@sandeen.net> Date: Thu, 04 Jun 2009 09:46:57 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (Macintosh/20090302) MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] [XFSQA] Add license boilerplate to 205 Subject: Re: [PATCH] [XFSQA] Add license boilerplate to 205 References: <20090604091558.GS16929@discord.disaster> In-Reply-To: <20090604091558.GS16929@discord.disaster> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1244127218 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.21 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dave Chinner wrote: > [XFSQA] Add license boilerplate to 205 > > Signed-off-by: Dave Chinner looks good to me :) Reviewed-by: Eric Sandeen Thanks Dave. > --- > 205 | 13 +++++++++++++ > 1 files changed, 13 insertions(+), 0 deletions(-) > > diff --git a/205 b/205 > index 502adc7..c85e102 100755 > --- a/205 > +++ b/205 > @@ -5,6 +5,19 @@ > # > #----------------------------------------------------------------------- > # Copyright (c) 2009 Dave Chinner > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > #----------------------------------------------------------------------- > # > # creator > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From BATV+b120f952b32a2b3cb0f4+2111+infradead.org+hch@bombadil.srs.infradead.org Thu Jun 4 12:17:11 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n54HHAjT254477 for ; Thu, 4 Jun 2009 12:17:11 -0500 X-ASG-Debug-ID: 1244135847-087d02530000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8756E1A680CF for ; Thu, 4 Jun 2009 10:17:28 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id uWEuY6mi6PKQ7C8u for ; Thu, 04 Jun 2009 10:17:28 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MCGZC-0007zc-Kb; Thu, 04 Jun 2009 17:17:26 +0000 Date: Thu, 4 Jun 2009 13:17:26 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/7] xfs: introduce a per-ag inode iterator Subject: Re: [PATCH 5/7] xfs: introduce a per-ag inode iterator Message-ID: <20090604171726.GA13501@infradead.org> References: <20090514171233.942489000@bombadil.infradead.org> <20090514171558.869514000@bombadil.infradead.org> <4A26F6B1.20509@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A26F6B1.20509@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244135848 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Wed, Jun 03, 2009 at 05:18:25PM -0500, Eric Sandeen wrote: > Ok, it's looking for EAGAIN here, I'm assuming this is for when we are > calling xfs_reclaim_inode_now, because... > > ... > ... because before, that's what we did above, after testing for a non-0 > return from xfs_reclaim_inode. > > But xfs_reclaim_inode_now() returns 0 or the result of > xfs_reclaim_inode, which is 0/1, so above: Yeah. Updated patch below that besides addressing the other comments makes xfs_reclaim_inode return -EAGAIN if it has to skip an inode. Subject: xfs: introduce a per-ag inode iterator From: Dave Chinner From: Dave Chinner Given that we walk across the per-ag inode lists so often, it makes sense to introduce an iterator for this. Convert the sync and reclaim code to use this new iterator, quota code will follow in the next patch. Also change xfs_reclaim_inode to return -EGAIN instead of 1 for an inode already under reclaim. This simplifies the AG iterator and doesn't matter for the only other caller. [hch: merged the lookup and execute callbacks back into one to get the pag_ici_lock locking correct and simplify the code flow] Signed-off-by: Dave Chinner Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2009-06-04 12:50:25.380940755 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2009-06-04 13:09:06.199942249 +0200 @@ -49,6 +49,123 @@ #include +STATIC xfs_inode_t * +xfs_inode_ag_lookup( + struct xfs_mount *mp, + struct xfs_perag *pag, + uint32_t *first_index, + int tag) +{ + int nr_found; + struct xfs_inode *ip; + + /* + * use a gang lookup to find the next inode in the tree + * as the tree is sparse and a gang lookup walks to find + * the number of objects requested. + */ + read_lock(&pag->pag_ici_lock); + if (tag == -1) { + nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, + (void **)&ip, *first_index, 1); + } else { + nr_found = radix_tree_gang_lookup_tag(&pag->pag_ici_root, + (void **)&ip, *first_index, 1, tag); + } + if (!nr_found) + goto unlock; + + /* + * Update the index for the next lookup. Catch overflows + * into the next AG range which can occur if we have inodes + * in the last block of the AG and we are currently + * pointing to the last inode. + */ + *first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); + if (*first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) + goto unlock; + + return ip; + +unlock: + read_unlock(&pag->pag_ici_lock); + return NULL; +} + +STATIC int +xfs_inode_ag_walk( + struct xfs_mount *mp, + xfs_agnumber_t ag, + int (*execute)(struct xfs_inode *ip, + struct xfs_perag *pag, int flags), + int flags, + int tag) +{ + struct xfs_perag *pag = &mp->m_perag[ag]; + uint32_t first_index; + int last_error = 0; + int skipped; + +restart: + skipped = 0; + first_index = 0; + do { + int error = 0; + xfs_inode_t *ip; + + ip = xfs_inode_ag_lookup(mp, pag, &first_index, tag); + if (!ip) + break; + + error = execute(ip, pag, flags); + if (error == EAGAIN) { + skipped++; + continue; + } + if (error) + last_error = error; + /* + * bail out if the filesystem is corrupted. + */ + if (error == EFSCORRUPTED) + break; + + } while (1); + + if (skipped) { + delay(1); + goto restart; + } + + xfs_put_perag(mp, pag); + return last_error; +} + +STATIC int +xfs_inode_ag_iterator( + struct xfs_mount *mp, + int (*execute)(struct xfs_inode *ip, + struct xfs_perag *pag, int flags), + int flags, + int tag) +{ + int error = 0; + int last_error = 0; + xfs_agnumber_t ag; + + for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { + if (!mp->m_perag[ag].pag_ici_init) + continue; + error = xfs_inode_ag_walk(mp, ag, execute, flags, tag); + if (error) { + last_error = error; + if (error == EFSCORRUPTED) + break; + } + } + return XFS_ERROR(last_error); +} + /* must be called with pag_ici_lock held and releases it */ STATIC int xfs_sync_inode_valid( @@ -85,12 +202,17 @@ xfs_sync_inode_valid( STATIC int xfs_sync_inode_data( struct xfs_inode *ip, + struct xfs_perag *pag, int flags) { struct inode *inode = VFS_I(ip); struct address_space *mapping = inode->i_mapping; int error = 0; + error = xfs_sync_inode_valid(ip, pag); + if (error) + return error; + if (!mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) goto out_wait; @@ -107,16 +229,22 @@ xfs_sync_inode_data( out_wait: if (flags & SYNC_IOWAIT) xfs_ioend_wait(ip); + IRELE(ip); return error; } STATIC int xfs_sync_inode_attr( struct xfs_inode *ip, + struct xfs_perag *pag, int flags) { int error = 0; + error = xfs_sync_inode_valid(ip, pag); + if (error) + return error; + xfs_ilock(ip, XFS_ILOCK_SHARED); if (xfs_inode_clean(ip)) goto out_unlock; @@ -136,117 +264,33 @@ xfs_sync_inode_attr( out_unlock: xfs_iunlock(ip, XFS_ILOCK_SHARED); + IRELE(ip); return error; } -/* - * Sync all the inodes in the given AG according to the - * direction given by the flags. - */ -STATIC int -xfs_sync_inodes_ag( - xfs_mount_t *mp, - int ag, - int flags) -{ - xfs_perag_t *pag = &mp->m_perag[ag]; - int nr_found; - uint32_t first_index = 0; - int error = 0; - int last_error = 0; - - do { - xfs_inode_t *ip = NULL; - - /* - * use a gang lookup to find the next inode in the tree - * as the tree is sparse and a gang lookup walks to find - * the number of objects requested. - */ - read_lock(&pag->pag_ici_lock); - nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, - (void**)&ip, first_index, 1); - - if (!nr_found) { - read_unlock(&pag->pag_ici_lock); - break; - } - - /* - * Update the index for the next lookup. Catch overflows - * into the next AG range which can occur if we have inodes - * in the last block of the AG and we are currently - * pointing to the last inode. - */ - first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); - if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) { - read_unlock(&pag->pag_ici_lock); - break; - } - - error = xfs_sync_inode_valid(ip, pag); - if (error) { - if (error == EFSCORRUPTED) - return 0; - continue; - } - - /* - * If we have to flush data or wait for I/O completion - * we need to hold the iolock. - */ - if (flags & SYNC_DELWRI) - error = xfs_sync_inode_data(ip, flags); - - if (flags & SYNC_ATTR) - error = xfs_sync_inode_attr(ip, flags); - - IRELE(ip); - - if (error) - last_error = error; - /* - * bail out if the filesystem is corrupted. - */ - if (error == EFSCORRUPTED) - return XFS_ERROR(error); - - } while (nr_found); - - return last_error; -} - int xfs_sync_inodes( xfs_mount_t *mp, int flags) { - int error; - int last_error; - int i; + int error = 0; int lflags = XFS_LOG_FORCE; if (mp->m_flags & XFS_MOUNT_RDONLY) return 0; - error = 0; - last_error = 0; if (flags & SYNC_WAIT) lflags |= XFS_LOG_SYNC; - for (i = 0; i < mp->m_sb.sb_agcount; i++) { - if (!mp->m_perag[i].pag_ici_init) - continue; - error = xfs_sync_inodes_ag(mp, i, flags); - if (error) - last_error = error; - if (error == EFSCORRUPTED) - break; - } if (flags & SYNC_DELWRI) - xfs_log_force(mp, 0, lflags); + error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, -1); - return XFS_ERROR(last_error); + if (flags & SYNC_ATTR) + error = xfs_inode_ag_iterator(mp, xfs_sync_inode_attr, flags, -1); + + if (!error && (flags & SYNC_DELWRI)) + xfs_log_force(mp, 0, lflags); + return XFS_ERROR(error); } STATIC int @@ -613,7 +657,7 @@ xfs_reclaim_inode( xfs_ifunlock(ip); xfs_iunlock(ip, XFS_ILOCK_EXCL); } - return 1; + return -EAGAIN; } __xfs_iflags_set(ip, XFS_IRECLAIM); spin_unlock(&ip->i_flags_lock); @@ -698,72 +742,20 @@ xfs_inode_clear_reclaim_tag( xfs_put_perag(mp, pag); } - -STATIC void -xfs_reclaim_inodes_ag( - xfs_mount_t *mp, - int ag, - int mode) +STATIC int +xfs_reclaim_inode_now( + struct xfs_inode *ip, + struct xfs_perag *pag, + int flags) { - xfs_inode_t *ip = NULL; - xfs_perag_t *pag = &mp->m_perag[ag]; - int nr_found; - uint32_t first_index; - int skipped; - -restart: - first_index = 0; - skipped = 0; - do { - /* - * use a gang lookup to find the next inode in the tree - * as the tree is sparse and a gang lookup walks to find - * the number of objects requested. - */ - read_lock(&pag->pag_ici_lock); - nr_found = radix_tree_gang_lookup_tag(&pag->pag_ici_root, - (void**)&ip, first_index, 1, - XFS_ICI_RECLAIM_TAG); - - if (!nr_found) { - read_unlock(&pag->pag_ici_lock); - break; - } - - /* - * Update the index for the next lookup. Catch overflows - * into the next AG range which can occur if we have inodes - * in the last block of the AG and we are currently - * pointing to the last inode. - */ - first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); - if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) { - read_unlock(&pag->pag_ici_lock); - break; - } - - /* ignore if already under reclaim */ - if (xfs_iflags_test(ip, XFS_IRECLAIM)) { - read_unlock(&pag->pag_ici_lock); - continue; - } - + /* ignore if already under reclaim */ + if (xfs_iflags_test(ip, XFS_IRECLAIM)) { read_unlock(&pag->pag_ici_lock); - - /* - * hmmm - this is an inode already in reclaim. Do - * we even bother catching it here? - */ - if (xfs_reclaim_inode(ip, 0, mode)) - skipped++; - } while (nr_found); - - if (skipped) { - delay(1); - goto restart; + return 0; } - return; + read_unlock(&pag->pag_ici_lock); + return xfs_reclaim_inode(ip, 0, flags); } int @@ -771,14 +763,6 @@ xfs_reclaim_inodes( xfs_mount_t *mp, int mode) { - int i; - - for (i = 0; i < mp->m_sb.sb_agcount; i++) { - if (!mp->m_perag[i].pag_ici_init) - continue; - xfs_reclaim_inodes_ag(mp, i, mode); - } - return 0; + return xfs_inode_ag_iterator(mp, xfs_reclaim_inode_now, mode, + XFS_ICI_RECLAIM_TAG); } - - From maillists0@gmail.com Thu Jun 4 14:12:48 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.4 required=5.0 tests=BAYES_00,HTML_MESSAGE autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n54JClup258126 for ; Thu, 4 Jun 2009 14:12:48 -0500 X-ASG-Debug-ID: 1244142785-6768019d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from an-out-0708.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DB14C1A6C2D8 for ; Thu, 4 Jun 2009 12:13:05 -0700 (PDT) Received: from an-out-0708.google.com (an-out-0708.google.com [209.85.132.250]) by cuda.sgi.com with ESMTP id lbejqOPvrYdxy6Ke for ; Thu, 04 Jun 2009 12:13:05 -0700 (PDT) Received: by an-out-0708.google.com with SMTP id c37so551859anc.32 for ; Thu, 04 Jun 2009 12:13:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:date:message-id:subject :from:to:content-type; bh=UMRiYPqUIYuoMMBYhsRiQM8U/mcDexy9qSpDckveYic=; b=nug9Dc10VelwPnsPnJucC/Edxpc8ohLCoJM5sG1brtJDpIiDgw35UqoKQbMGgN6yMl GNyjzdibA8oT0GSKkXpv/3Rf3znr98WYdB7x9/f2muj0Jfx8RZrHa0xkhfBgiGTKmjdO QlgW3IcXYTh4DjTYfmeJTlt0Cm2wsurj/F8DE= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=Ly0I1DqSQDue7T1sYL3S2GQX+I1NnV32nv6VKtuPaP1OlbvAUnamJAXsRY95ChO1Pa +8lU8poTTnaRE7b3CEQc1RQR1qilblFA4atRdZ4vAkThMArv1XaWcIU+jZNWCXAzH8B/ LU3tkwxIGt7xzSLG0VXZ4eTKbA32PIGJ1k/yY= MIME-Version: 1.0 Received: by 10.100.227.18 with SMTP id z18mr3064587ang.67.1244142781461; Thu, 04 Jun 2009 12:13:01 -0700 (PDT) Date: Thu, 4 Jun 2009 15:13:01 -0400 Message-ID: X-ASG-Orig-Subj: Repairing large partition Subject: Repairing large partition From: maillists0@gmail.com To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001636c9356a89f87b046b8a90f7 X-Barracuda-Connect: an-out-0708.google.com[209.85.132.250] X-Barracuda-Start-Time: 1244142785 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.61 X-Barracuda-Spam-Status: No, SCORE=-1.61 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_MESSAGE, NO_REAL_NAME, SUBJECT_FUZZY_TION X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.28 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.41 SUBJECT_FUZZY_TION Attempt to obfuscate words in Subject: 0.00 HTML_MESSAGE BODY: HTML included in message X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean --001636c9356a89f87b046b8a90f7 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Pardon if this is the wrong list for this question. I had a 50T xfs partition, spread across 3 storage devices which were lvm'd. After a power failure, 2 disks on one device failed. It was raid5, so that data is unrecoverable. I replaced the failed disks and rebuilt that array. I can mount the partition and see data on the first 2 devices. 'I ran xfs_repair -n' to see what might be done a couple of days ago and it still hasn't finished. Does anyone know how I could recreate the partition to include the third device without losing data from the first two devices? Any help will be greatly appreciated, including a pointer to the appropriate docs. Thanks. --001636c9356a89f87b046b8a90f7 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Pardon if this is the wrong list for this question.

I had a 50T xfs= partition, spread across 3 storage devices which were lvm'd. After a p= ower failure, 2 disks on one device failed. It was raid5, so that data is u= nrecoverable.

I replaced the failed disks and rebuilt that array. I can mount the par= tition and see data on the first 2 devices. 'I ran xfs_repair -n' t= o see what might be done a couple of days ago and it still hasn't finis= hed.=A0 Does anyone know how I could recreate the partition to include the = third device without losing data from the first two devices? Any help will = be greatly appreciated, including a pointer to the appropriate docs. Thanks= .
--001636c9356a89f87b046b8a90f7-- From sandeen@sandeen.net Thu Jun 4 16:18:11 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n54LIAST001045 for ; Thu, 4 Jun 2009 16:18:11 -0500 X-ASG-Debug-ID: 1244150707-585e01230000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E1D7588C57D for ; Thu, 4 Jun 2009 14:25:07 -0700 (PDT) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id iPpyBvRCtOBOrvCu for ; Thu, 04 Jun 2009 14:25:07 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 48F7CA9DADE; Thu, 4 Jun 2009 16:18:27 -0500 (CDT) Message-ID: <4A283A22.8050003@sandeen.net> Date: Thu, 04 Jun 2009 16:18:26 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (Macintosh/20090302) MIME-Version: 1.0 To: maillists0@gmail.com CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Repairing large partition Subject: Re: Repairing large partition References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1244150708 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.61 X-Barracuda-Spam-Status: No, SCORE=-1.61 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=SUBJECT_FUZZY_TION X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.37 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.41 SUBJECT_FUZZY_TION Attempt to obfuscate words in Subject: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean maillists0@gmail.com wrote: > Pardon if this is the wrong list for this question. > > I had a 50T xfs partition, spread across 3 storage devices which were > lvm'd. After a power failure, 2 disks on one device failed. It was > raid5, so that data is unrecoverable. > > I replaced the failed disks and rebuilt that array. I can mount the > partition and see data on the first 2 devices. 'I ran xfs_repair -n' to > see what might be done a couple of days ago and it still hasn't > finished. Does anyone know how I could recreate the partition to > include the third device without losing data from the first two devices? > Any help will be greatly appreciated, including a pointer to the > appropriate docs. Thanks. so was it a concat of 3 raid5s? -Eric From sandeen@sandeen.net Thu Jun 4 17:04:33 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.2 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n54M4WI8003182 for ; Thu, 4 Jun 2009 17:04:33 -0500 X-ASG-Debug-ID: 1244153089-735a02270000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3B6DC2D2B7E for ; Thu, 4 Jun 2009 15:04:49 -0700 (PDT) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id xXKk1aLowMMQCDh4 for ; Thu, 04 Jun 2009 15:04:49 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id D44589BF089; Thu, 4 Jun 2009 17:04:48 -0500 (CDT) Message-ID: <4A2844FF.7010101@sandeen.net> Date: Thu, 04 Jun 2009 17:04:47 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (Macintosh/20090302) MIME-Version: 1.0 To: maillists0@gmail.com, xfs-oss X-ASG-Orig-Subj: Re: Repairing large partition Subject: Re: Repairing large partition References: <4A283A22.8050003@sandeen.net> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1244153090 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.61 X-Barracuda-Spam-Status: No, SCORE=-1.61 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=SUBJECT_FUZZY_TION X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.39 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.41 SUBJECT_FUZZY_TION Attempt to obfuscate words in Subject: X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean maillists0@gmail.com wrote: > > > On Thu, Jun 4, 2009 at 5:18 PM, Eric Sandeen > wrote: > > maillists0@gmail.com wrote: >> Pardon if this is the wrong list for this question. >> >> I had a 50T xfs partition, spread across 3 storage devices which >> were lvm'd. After a power failure, 2 disks on one device failed. It >> was raid5, so that data is unrecoverable. >> >> I replaced the failed disks and rebuilt that array. I can mount the >> partition and see data on the first 2 devices. I ran xfs_repair >> -n' to see what might be done a couple of days ago and it still >> hasn't finished. Does anyone know how I could recreate the >> partition to include the third device without losing data from the >> first two devices? Any help will be greatly appreciated, including >> a pointer to the appropriate docs. Thanks. > > so was it a concat of 3 raid5s? > > > Exactly. Ok, I'm not sure there are any appropriate docs for this case ... the trick will be that the files you can see may well have had portions of their data on the bad piece, and other portions on the good pieces, so even if you get the filesystem framework all back in place it might be a trick to see which remaining files are now corrupted. Of course inodes & directories that were on the bad piece are gone, so those files are pretty well lost. xfs_repair -n is a good idea for a start, I think; I'd be sure you have the latest version, and using -P has been reported to actually speed things up for some people with very large filesystems. xfs_repair is probably the only documented/supported thing to try, though normally for this kind of extensive damage I'd suggest doing it on a filesystem image to see how it ends up... not so feasible with your filesystem, I suppose. One other option -might- be to do xfs_info on the mountpoint, get all the fs geometry, and re-mkfs (preferably with the same mkfs.xfs version) a sparse filesystem image on a file with the exact same geometry. Then dd bits from that freshly mkfs'd filesystem image, at the right offsets, onto the recreated bad chunk of the concat. Again, I'd feel better if you could do a dry run of this somehow ... You could maybe practice this by doing an xfs_metadump -o of the block device, xfs_mdrestore the resulting metadata image back into a sparse filesystem metadata image, do the above mkfs & dd trick into that image, and xfs_repair the result. (you'd probably need some way to teach dd to honor the sparseness, see for example the make-sparse.c tool in http://bugzilla.kernel.org/show_bug.cgi?id=11525#c4) Just some random thoughts ... -Eric From a.beregalov@gmail.com Fri Jun 5 04:23:25 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n559NOX8036359 for ; Fri, 5 Jun 2009 04:23:24 -0500 X-ASG-Debug-ID: 1244194221-1ab602600000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail-fx0-f225.google.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1BE0D1058E63 for ; Fri, 5 Jun 2009 02:30:22 -0700 (PDT) Received: from mail-fx0-f225.google.com (mail-fx0-f225.google.com [209.85.220.225]) by cuda.sgi.com with ESMTP id 3Y4en6W52zZaAPsA for ; Fri, 05 Jun 2009 02:30:22 -0700 (PDT) Received: by fxm25 with SMTP id 25so1279271fxm.20 for ; Fri, 05 Jun 2009 02:23:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:in-reply-to:references :date:message-id:subject:from:to:cc:content-type :content-transfer-encoding; bh=P8B7lxhRcPC/m68ZGdeeQy80wMfuh3vFPGDuoqQ1vaE=; b=couvziYqF/UrGv//oJC8UjPLxkYwhfjJjBWn+TLorCpOr96OAW0PFopJgNNPgnb8Px sSSPDA6duNFrCq2Vth5Tr2b7jAulvVwzhxbW5acvSqJqlYzQ6VlNCjUcy5c6/M+QwsGG yQXHc8ACJ03s3XGAWNpwLpSIt281HhexKb2No= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:content-transfer-encoding; b=ubvkiM5dNmgOyUm3rtoXsMpvDHl5U3XXH++rC/mH3m/9E37XvQcBVdjfeo7VYGSMcD Yz7FTIE5ExK7tHoVi5IFu5jffjjUHtifsKkuXm6tM1zuuXP3rcOkQH/Bm9exxdR285QN AtYDYd1i9GjpYowRB0QC35DmCeJABJDvB7cn4= MIME-Version: 1.0 Received: by 10.204.77.102 with SMTP id f38mr2990203bkk.65.1244193818298; Fri, 05 Jun 2009 02:23:38 -0700 (PDT) In-Reply-To: <20090604092330.GT16929@discord.disaster> References: <20090604092330.GT16929@discord.disaster> Date: Fri, 5 Jun 2009 13:23:38 +0400 Message-ID: X-ASG-Orig-Subj: Re: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! Subject: Re: 2.6.30-rc6: BUG at fs/xfs/support/debug.c:109! From: Alexander Beregalov To: Dave Chinner Cc: Kernel Testers List , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-fx0-f225.google.com[209.85.220.225] X-Barracuda-Start-Time: 1244194224 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.81 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean 2009/6/4 Dave Chinner : > On Mon, Jun 01, 2009 at 07:22:56PM +0400, Alexander Beregalov wrote: >> Hi >> >> Assertion failed: *nmap >=3D 1, file: fs/xfs/xfs_bmap.c, line: 4846 > ..... >> Call Trace: >> =C2=A0[] xfs_bmapi+0xad/0x1ad0 >> =C2=A0[] xfs_dir2_leaf_getdents+0x640/0x7b0 >> =C2=A0[] xfs_readdir+0x12c/0x140 >> =C2=A0[] xfs_file_readdir+0x47/0x70 >> =C2=A0[] vfs_readdir+0xd0/0xf0 >> =C2=A0[] sys_getdents+0x96/0x110 >> =C2=A0[] system_call_fastpath+0x16/0x1b > > I'd say this indicates a corrupted directory. =C2=A0Can you run > 'xfs_repair -n' over the filesystem and see if it finds a bad > directory? Hi Dave It is a rootfs. xfs_repair found and fixed all errors, but after reboot the problem still persists (but at another stage of running `emerge`). localhost ~ # echo s > /proc/sysrq-trigger localhost ~ # echo s > /proc/sysrq-trigger localhost ~ # echo u > /proc/sysrq-trigger localhost ~ # xfs_repair -nd /dev/sda2 Phase 1 - find and verify superblock... Phase 2 - using internal log - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan (but don't clear) agi unlinked lists... - process known inodes and perform inode discovery... - agno =3D 0 - agno =3D 1 - agno =3D 2 - agno =3D 3 - agno =3D 4 - agno =3D 5 - agno =3D 6 - agno =3D 7 - agno =3D 8 - agno =3D 9 - agno =3D 10 - agno =3D 11 - agno =3D 12 - agno =3D 13 - agno =3D 14 - agno =3D 15 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno =3D 0 - agno =3D 1 - agno =3D 2 - agno =3D 4 - agno =3D 3 - agno =3D 5 - agno =3D 6 - agno =3D 7 - agno =3D 8 - agno =3D 9 - agno =3D 10 - agno =3D 11 - agno =3D 12 - agno =3D 13 - agno =3D 14 - agno =3D 15 No modify flag set, skipping phase 5 Phase 6 - check inode connectivity... - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify link counts... No modify flag set, skipping filesystem flush and exiting. From hch@lst.de Fri Jun 5 05:26:11 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55AQ6e5039136 for ; Fri, 5 Jun 2009 05:26:11 -0500 X-ASG-Debug-ID: 1244197583-1ca003640000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from verein.lst.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1F55B1BCBC40 for ; Fri, 5 Jun 2009 03:26:24 -0700 (PDT) Received: from verein.lst.de (verein.lst.de [213.95.11.210]) by cuda.sgi.com with ESMTP id KAh9LIefZFSSZhMk for ; Fri, 05 Jun 2009 03:26:24 -0700 (PDT) X-ASG-Whitelist: Client Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id n55AQNDE030806 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Fri, 5 Jun 2009 12:26:23 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id n55AQNFW030804; Fri, 5 Jun 2009 12:26:23 +0200 Date: Fri, 5 Jun 2009 12:26:23 +0200 From: Christoph Hellwig To: viro@zeniv.linux.org.uk, xfs@oss.sgi.com X-ASG-Orig-Subj: [PATCH] xfs: remove ->write_super and stop maintaining ->s_dirt Subject: [PATCH] xfs: remove ->write_super and stop maintaining ->s_dirt Message-ID: <20090605102622.GA30685@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-Barracuda-Connect: verein.lst.de[213.95.11.210] X-Barracuda-Start-Time: 1244197585 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Al, can you put this in via the vfs tree? With people starting to change these bits now I think we're better off feeding this through the VFS tree early than later via the XFS tree. -- Subject: [PATCH] xfs: remove ->write_super and stop maintaining ->s_dirt From: Christoph Hellwig the write_super method is used for (1) writing back the superblock periodically from pdflush (2) called just before ->sync_fs for data integerity syncs We don't need (1) because we have our own peridoc writeout through xfssyncd, and we don't need (2) because xfs_fs_sync_fs performs a proper synchronous superblock writeout after all other data and metadata has been written out. Also remove ->s_dirt tracking as it's only used to decide when too call ->write_super. Signed-off-by: Christoph Hellwig Reviewed-by: Eric Sandeen Index: vfs-2.6/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- vfs-2.6.orig/fs/xfs/linux-2.6/xfs_super.c 2009-05-11 11:13:24.528784658 +0200 +++ vfs-2.6/fs/xfs/linux-2.6/xfs_super.c 2009-05-11 22:09:29.802683006 +0200 @@ -1108,15 +1108,6 @@ xfs_fs_put_super( unlock_kernel(); } -STATIC void -xfs_fs_write_super( - struct super_block *sb) -{ - if (!(sb->s_flags & MS_RDONLY)) - xfs_sync_fsdata(XFS_M(sb), 0); - sb->s_dirt = 0; -} - STATIC int xfs_fs_sync_super( struct super_block *sb, @@ -1141,7 +1132,6 @@ xfs_fs_sync_super( error = xfs_quiesce_data(mp); else error = xfs_sync_fsdata(mp, 0); - sb->s_dirt = 0; if (unlikely(laptop_mode)) { int prev_sync_seq = mp->m_sync_seq; @@ -1447,7 +1437,6 @@ xfs_fs_fill_super( XFS_SEND_MOUNT(mp, DM_RIGHT_NULL, mtpt, mp->m_fsname); - sb->s_dirt = 1; sb->s_magic = XFS_SB_MAGIC; sb->s_blocksize = mp->m_sb.sb_blocksize; sb->s_blocksize_bits = ffs(sb->s_blocksize) - 1; @@ -1537,7 +1526,6 @@ static struct super_operations xfs_super .write_inode = xfs_fs_write_inode, .clear_inode = xfs_fs_clear_inode, .put_super = xfs_fs_put_super, - .write_super = xfs_fs_write_super, .sync_fs = xfs_fs_sync_super, .freeze_fs = xfs_fs_freeze, .statfs = xfs_fs_statfs, Index: vfs-2.6/fs/xfs/xfs_trans.c =================================================================== --- vfs-2.6.orig/fs/xfs/xfs_trans.c 2009-05-05 14:18:45.481659125 +0200 +++ vfs-2.6/fs/xfs/xfs_trans.c 2009-05-11 22:09:29.803682225 +0200 @@ -628,8 +628,6 @@ xfs_trans_apply_sb_deltas( xfs_trans_log_buf(tp, bp, offsetof(xfs_dsb_t, sb_icount), offsetof(xfs_dsb_t, sb_frextents) + sizeof(sbp->sb_frextents) - 1); - - tp->t_mountp->m_super->s_dirt = 1; } /* From BATV+464f3644bd103b0265ce+2112+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 5 05:41:42 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55AfeEf040084 for ; Fri, 5 Jun 2009 05:41:42 -0500 X-ASG-Debug-ID: 1244198519-3de202a60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 53C961BCBCEF for ; Fri, 5 Jun 2009 03:41:59 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id WMRJLYiqOjbVEe9T for ; Fri, 05 Jun 2009 03:41:59 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MCWs1-0001F1-8H; Fri, 05 Jun 2009 10:41:57 +0000 Date: Fri, 5 Jun 2009 06:41:57 -0400 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , Eric Sandeen , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/5] xfs: fix xfs_quiesce_data Subject: Re: [PATCH 5/5] xfs: fix xfs_quiesce_data Message-ID: <20090605104157.GA25032@infradead.org> References: <20090426140305.113371000@bombadil.infradead.org> <20090426140708.279368000@bombadil.infradead.org> <4A071F06.8040106@sandeen.net> <20090511201511.GB14195@infradead.org> <20090604094512.GU16929@discord.disaster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090604094512.GU16929@discord.disaster> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244198519 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Thu, Jun 04, 2009 at 07:45:12PM +1000, Dave Chinner wrote: > On Mon, May 11, 2009 at 04:15:11PM -0400, Christoph Hellwig wrote: > > On Sun, May 10, 2009 at 01:37:58PM -0500, Eric Sandeen wrote: > > > I guess I too would like a reason for the filestream_flush move > > > somewhere in the changelog... > > > > Hehe, maybe Dave can chime in. Or I can test if it actually affects > > anything and maybe move it out to another patch. The lack of > > reliability of the filesystreams tests doesn't make this any easier to > > test. > > (Just catching up on my mail backlog) > > I think that the filestream_flush() call should actually be after > the data flush. filestream_flush() is used to clear the filestream > association cache which holds references to the inodes. > > Where the flush is currently placed is destroying the association > that defines the AG the data should be written to before the data is > written. As a result it may not end up in the AG carefully > associated with the inode during the write() syscall. > > This may be one of the reasons for the filestreams tests failing > frequently.... Makes sense. I stil get reliable failures on 171 and 172, but the others seem to pass with these changes. From news@mgras.net Fri Jun 5 06:21:03 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55BL1AR042123 for ; Fri, 5 Jun 2009 06:21:02 -0500 X-ASG-Debug-ID: 1244200878-6b0b010a0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from foehn.mgras.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 0CA052D4F04 for ; Fri, 5 Jun 2009 04:21:18 -0700 (PDT) Received: from foehn.mgras.de (quickstep.mgras.net [213.146.115.59]) by cuda.sgi.com with ESMTP id BO7ow7yF5TirnXlz for ; Fri, 05 Jun 2009 04:21:18 -0700 (PDT) Received: from osprey.mgras.de (osprey.mgras.de [192.168.48.3]) by foehn.mgras.de (8.13.1/8.13.0) with ESMTP id n55BKTtJ017338 for ; Fri, 5 Jun 2009 13:20:30 +0200 (CEST) Received: (from news@localhost) by osprey.mgras.de (AIX5.1/8.11.6p2/8.11.0) id n55BKTe25990 for linux-xfs@oss.sgi.com; Fri, 5 Jun 2009 13:20:29 +0200 To: linux-xfs@oss.sgi.com Path: not-for-mail From: Martin Spott Newsgroups: list.linux-xfs X-ASG-Orig-Subj: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Subject: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Date: Fri, 5 Jun 2009 11:20:28 +0000 (UTC) Organization: home Lines: 18 Message-ID: References: <20090520003745.GA27491@samad.com.au> <20090604112657.GA10738@infradead.org> NNTP-Posting-Host: jive.mgras.de X-Trace: osprey.mgras.de 1244200828 30600 192.168.48.5 (5 Jun 2009 11:20:28 GMT) X-Complaints-To: usenet@mgras.net NNTP-Posting-Date: Fri, 5 Jun 2009 11:20:28 +0000 (UTC) User-Agent: tin/1.9.3-20080506 ("Dalintober") (UNIX) (Linux/2.6.29.3 (x86_64)) X-Barracuda-Connect: quickstep.mgras.net[213.146.115.59] X-Barracuda-Start-Time: 1244200880 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.90 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi Christoph, Christoph Hellwig wrote: > Sorry guys, still haven't been able to track it down. Any chance one > of you could run with CONFIG_XFS_DEBUG enabled and see if it trips > over any of the asserts? I'm running these systems as application servers for schools - with diskless clients. Therefore it's highly impractical to to any debugging during the week (they're going to kill me ;-) , but I'll try to so over the weekend. Cheers, Martin. -- Unix _IS_ user friendly - it's just selective about who its friends are ! -------------------------------------------------------------------------- From npai@busiboutique.net Fri Jun 5 07:19:28 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.4 required=5.0 tests=BAYES_50,HTML_FONT_SIZE_LARGE, HTML_MESSAGE,J_CHICKENPOX_52,MIME_8BIT_HEADER autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55CJSO4045333 for ; Fri, 5 Jun 2009 07:19:28 -0500 X-ASG-Debug-ID: 1244204376-0de101350000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from busiboutique.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with SMTP id 4AF321BCC0E9 for ; Fri, 5 Jun 2009 05:19:36 -0700 (PDT) Received: from busiboutique.net (busiboutique.net [91.121.4.179]) by cuda.sgi.com with SMTP id 3LoUFqCtwHcTMJS8 for ; Fri, 05 Jun 2009 05:19:36 -0700 (PDT) Received: (qmail 12096 invoked by uid 503); 5 Jun 2009 12:20:01 -0000 Received: from unknown (HELO 192.168.100.67) (CONTACT@BUSIBOUTIQUE.NET@80.13.89.19) by busiboutique.net with ESMTPA; 5 Jun 2009 12:20:01 -0000 X-MessageId: 677978846567846466858373667985847381856946786984||767378858845887083647983834683717346677977 Reply-To: fabienne@busiboutique.net Message-ID: <5a59ad78307a3456c7312d0c0d8daec2@busiboutique.net> From: "=?windows-1252?Q?Fabienne_/_BusiBoutique?=" To: X-ASG-Orig-Subj: =?windows-1252?Q?on_n'a_jamais_imprim=E9_aussi_discr=E8tement_!?= Subject: =?windows-1252?Q?on_n'a_jamais_imprim=E9_aussi_discr=E8tement_!?= Date: Fri, 5 Jun 2009 14:19:25 +0200 X-Priority: 1 X-Mailer: SMTP COMPONENT MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=SPLITOR00A_001_498854312D" X-Barracuda-Connect: busiboutique.net[91.121.4.179] X-Barracuda-Start-Time: 1244204377 X-Barracuda-Bayes: INNOCENT GLOBAL 0.5749 1.0000 0.7500 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=HTML_FONT_SIZE_LARGE, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.94 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 HTML_FONT_SIZE_LARGE BODY: HTML font size is large X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean This is a multi-part message in MIME format. ------=SPLITOR00A_001_498854312D Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: quoted-printable On n'a jamais imprim=E9 aussi discr=E8tement ! Introduit par SAMSUNG, le mod=E8le CLP-310 d'imprimante laser couleur est = le plus l=E9ger et le plus compact.=20 Il a recours =E0 la technologie No NOIS' (sans bruit) pour un = fonctionnement quasiment sans bruit et le changement ais=E9 de cartouche.=20 L'imprimante couleur laser CLP-310 est compacte et l=E9g=E8re.=20 Rendu des couleurs plus =E9clatant=2E (valable jusqu'au 30 Juin 2009) CLP-310 Samsung - Laser Couleur=20 Fonction : Impression couleur Vitesse (mono) : Jusqu'=E0 16 ppm en A4 Vitesse (couleur) : Jusqu'=E0 4 ppm en A4 M=E9moire/stockage : 32 Mo =20 Prix Incroyable !=20 seulement 73,00 =80- HT soit 87,31 =80- TTC Cette offre est accessible sur le site,=20 Oui je veux profiter imm=E9diatement de cette offre sp=E9ciale ! =20 Comme d'habitude chez BusiBoutique.Com, en commandant aujourd'hui, =20 vous recevez la livraison sous 24 =E0 72 heures chez vous,=20 ou =E0 l'adresse de votre choix.=20 A tout de suite, Pour b=E9n=E9ficier de cette offre, =20 cliquez sur le lien ci-dessus ou contactez le Service Direct. =20 par t=E9l=E9phone au 03 88 70 50 16 ou par email =E0 = direct@busiboutique.com .=20 Cette offre vous est r=E9serv=E9e, non cumulable et valable uniquement=20 chez BusiBoutique.com, dans la limite des stocks disponibles. =20 Attention, il n'y a que quelques machines disponibles !, =20 les premiers arriv=E9s seront les premiers servis=2E Cordialement=20 Fabienne du Service Direct=20 =20 Informatique FRIESS service BusiBoutique.Com=20 32, rue Principale 67270 ROHR=20 Tel. 03 88 70 50 16 - Fax 03 88 70 54 10=20 site : www.busiboutique.com ------=SPLITOR00A_001_498854312D Content-Type: text/html; charset="windows-1252" Content-Transfer-Encoding: quoted-printable

On n'a jamais imprim=E9 aussi discr=E8tement = !

Introduit par SAMSUNG, le mod=E8le CLP-310 d'imprimante laser = couleur est le plus l=E9ger et le plus = compact
Il a recours =E0 la technologie No NOIS' (sans = bruit) pour un fonctionnement quasiment sans bruit et le changement ais=E9 = de cartouche. 
L'imprimante couleur laser CLP-310 est compacte et = l=E9g=E8re. 
Rendu des couleurs plus =E9clatant.
(valable jusqu'au 30 Juin 2009)


CLP-310 = Samsung - Laser Couleur=20

Fonction : Impression = couleur
Vitesse (mono) : Jusqu'=E0 16 ppm en A4
Vitesse (couleur) : = Jusqu'=E0 4 ppm en A4
M=E9moire/stockage : 32 Mo

 

Prix Incroyable !

seulement 73,00 =80- HT soit 87,31 =80- TTC

Cette offre est accessible = sur le site, 
Oui je veux profiter imm=E9diatement de cette offre = sp=E9ciale !
   =

Comme d'habitude chez BusiBoutique.Com, = en commandant aujourd'hui, 
vous recevez la livraison sous = 24 =E0 72 heures chez vous,
ou =E0 l'adresse de votre choix. =

A tout de suite, Pour b=E9n=E9ficier de cette offre,  =
cliquez sur le lien ci-dessus ou contactez le Service Direct. =  
par t=E9l=E9phone au
03 88 70 50 16 ou par = email =E0 direct@busiboutique.com .

Cette offre = vous est r=E9serv=E9e, non cumulable et valable uniquement 
chez = BusiBoutique.com, dans la limite des stocks disponibles.  =

Attention, il n'y a que quelques machines disponibles = !, 
les premiers arriv=E9s seront les premiers = servis.


Cordialement

Fabienne du = Service Direct


Informatique FRIESS service BusiBoutique.Com =
32, rue Principale 67270 ROHR

Tel. 03 88 70 50 16 - Fax = 03 88 70 54 10
site : www.busiboutique.com =

 

Conform=E9ment =E0 = la loi informatique et libert=E9 du 6 janvier 1978, nous vous rappelons = que vous disposez d'un droit d'acc=E8s, de rectification et de suppression = aux informations vous concernant. Pour exercer ce droit ou pour ne plus = recevoir de nouveaux messages BusiBoutique par e-mail, cliquez sur ce lien ! =

------=SPLITOR00A_001_498854312D-- From sandeen@redhat.com Fri Jun 5 11:20:32 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_31, J_CHICKENPOX_43,J_CHICKENPOX_53,J_CHICKENPOX_54,J_CHICKENPOX_62, J_CHICKENPOX_63,J_CHICKENPOX_64,J_CHICKENPOX_66 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55GKVkA054997 for ; Fri, 5 Jun 2009 11:20:31 -0500 X-ASG-Debug-ID: 1244218848-756501710000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id ABE281BCE1FE for ; Fri, 5 Jun 2009 09:20:48 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id 6ulvwIprp0RWTBw2 for ; Fri, 05 Jun 2009 09:20:48 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n55GKmWV006123 for ; Fri, 5 Jun 2009 12:20:48 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n55GKlOg008817 for ; Fri, 5 Jun 2009 12:20:47 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n55GKiQ7005512 for ; Fri, 5 Jun 2009 12:20:45 -0400 Message-ID: <4A2945DC.8040809@redhat.com> Date: Fri, 05 Jun 2009 11:20:44 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH] xfstests: update aio-stress.c, with copyright information intact Subject: [PATCH] xfstests: update aio-stress.c, with copyright information intact Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244218849 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Pulled from: http://ltp.cvs.sourceforge.net/viewvc/ltp/ltp/testcases/kernel/io/ltp-aiodio/aio-stress.c revision 1.8 There are a couple new options, but the main motivator is to get the license text intact again. Signed-off-by: Eric Sandeen --- iff --git a/ltp/aio-stress.c b/ltp/aio-stress.c index 6ebe082..ab9e006 100644 --- a/ltp/aio-stress.c +++ b/ltp/aio-stress.c @@ -1,7 +1,45 @@ /* + * Copyright (c) 2004 SuSE, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 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. + * + * 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 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. + * + * + * aio-stress + * + * will open or create each file on the command line, and start a series + * of aio to it. + * + * aio is done in a rotating loop. first file1 gets 8 requests, then + * file2, then file3 etc. As each file finishes writing, it is switched + * to reads + * + * io buffers are aligned in case you want to do raw io + * + * compile with gcc -Wall -laio -lpthread -o aio-stress aio-stress.c + * + * run aio-stress -h to see the options + * + * Please mail Chris Mason (mason@suse.com) with bug reports or patches */ #define _FILE_OFFSET_BITS 64 -#define PROG_VERSION "0.18" +#define PROG_VERSION "0.21" #define NEW_GETEVENTS #include @@ -50,6 +88,7 @@ unsigned long page_size_mask; int o_direct = 0; int o_sync = 0; int latency_stats = 0; +int completion_latency_stats = 0; int io_iter = 8; int iterations = RUN_FOREVER; int max_io_submit = 0; @@ -67,6 +106,7 @@ int padded_reclen = 0; int stonewall = 1; int verify = 0; char *verify_buf = NULL; +int unlink_files = 0; struct io_unit; struct thread_info; @@ -164,6 +204,8 @@ struct io_unit { long res; struct io_unit *next; + + struct timeval io_start_time; /* time of io_submit */ }; struct thread_info { @@ -203,15 +245,20 @@ struct thread_info { /* how much io this thread did in the last stage */ double stage_mb_trans; + + /* latency completion stats i/o time from io_submit until io_getevents */ + struct io_latency io_completion_latency; }; -static double time_since(struct timeval *tv) { +/* + * return seconds between start_tv and stop_tv in double precision + */ +static double time_since(struct timeval *start_tv, struct timeval *stop_tv) +{ double sec, usec; double ret; - struct timeval stop; - gettimeofday(&stop, NULL); - sec = stop.tv_sec - tv->tv_sec; - usec = stop.tv_usec - tv->tv_usec; + sec = stop_tv->tv_sec - start_tv->tv_sec; + usec = stop_tv->tv_usec - start_tv->tv_usec; if (sec > 0 && usec < 0) { sec--; usec += 1000000; @@ -222,11 +269,25 @@ static double time_since(struct timeval *tv) { return ret; } -static void calc_latency(struct timeval *tv, struct io_latency *lat) +/* + * return seconds between start_tv and now in double precision + */ +static double time_since_now(struct timeval *start_tv) +{ + struct timeval stop_time; + gettimeofday(&stop_time, NULL); + return time_since(start_tv, &stop_time); +} + +/* + * Add latency info to latency struct + */ +static void calc_latency(struct timeval *start_tv, struct timeval *stop_tv, + struct io_latency *lat) { double delta; int i; - delta = time_since(tv); + delta = time_since(start_tv, stop_tv); delta = delta * 1000; if (delta > lat->max) @@ -344,20 +405,19 @@ static void print_time(struct io_oper *oper) { double tput; double mb; - runtime = time_since(&oper->start_time); + runtime = time_since_now(&oper->start_time); mb = oper_mb_trans(oper); tput = mb / runtime; fprintf(stderr, "%s on %s (%.2f MB/s) %.2f MB in %.2fs\n", stage_name(oper->rw), oper->file_name, tput, mb, runtime); } -static void print_latency(struct thread_info *t) { - struct io_latency *lat = &t->io_submit_latency; +static void print_lat(char *str, struct io_latency *lat) { double avg = lat->total_lat / lat->total_io; int i; double total_counted = 0; - fprintf(stderr, "latency min %.2f avg %.2f max %.2f\n\t", - lat->min, avg, lat->max); + fprintf(stderr, "%s min %.2f avg %.2f max %.2f\n\t", + str, lat->min, avg, lat->max); for (i = 0 ; i < DEVIATIONS ; i++) { fprintf(stderr, " %.0f < %d", lat->deviations[i], deviations[i]); @@ -366,16 +426,30 @@ static void print_latency(struct thread_info *t) { if (total_counted && lat->total_io - total_counted) fprintf(stderr, " < %.0f", lat->total_io - total_counted); fprintf(stderr, "\n"); - memset(&t->io_submit_latency, 0, sizeof(t->io_submit_latency)); + memset(lat, 0, sizeof(*lat)); +} + +static void print_latency(struct thread_info *t) +{ + struct io_latency *lat = &t->io_submit_latency; + print_lat("latency", lat); +} + +static void print_completion_latency(struct thread_info *t) +{ + struct io_latency *lat = &t->io_completion_latency; + print_lat("completion latency", lat); } /* * updates the fields in the io operation struct that belongs to this * io unit, and make the io unit reusable again */ -void finish_io(struct thread_info *t, struct io_unit *io, long result) { +void finish_io(struct thread_info *t, struct io_unit *io, long result, + struct timeval *tv_now) { struct io_oper *oper = io->io_oper; + calc_latency(&io->io_start_time, tv_now, &t->io_completion_latency); io->res = result; io->busy = IO_FREE; io->next = t->free_ious; @@ -396,6 +470,7 @@ int read_some_events(struct thread_info *t) { int nr; int i; int min_nr = io_iter; + struct timeval stop_time; if (t->num_global_pending < io_iter) min_nr = t->num_global_pending; @@ -408,10 +483,11 @@ int read_some_events(struct thread_info *t) { if (nr <= 0) return nr; + gettimeofday(&stop_time, NULL); for (i = 0 ; i < nr ; i++) { event = t->events + i; event_io = (struct io_unit *)((unsigned long)event->obj); - finish_io(t, event_io, event->res); + finish_io(t, event_io, event->res, &stop_time); } return nr; } @@ -465,9 +541,11 @@ static int io_oper_wait(struct thread_info *t, struct io_oper *oper) { #else while(io_getevents(t->io_ctx, 1, &event, NULL) > 0) { #endif + struct timeval tv_now; event_io = (struct io_unit *)((unsigned long)event.obj); - finish_io(t, event_io, event.res); + gettimeofday(&tv_now, NULL); + finish_io(t, event_io, event.res, &tv_now); if (oper->num_pending == 0) break; @@ -641,7 +719,8 @@ int build_oper(struct thread_info *t, struct io_oper *oper, int num_ios, * runs through the iocbs in the array provided and updates * counters in the associated oper struct */ -static void update_iou_counters(struct iocb **my_iocbs, int nr) +static void update_iou_counters(struct iocb **my_iocbs, int nr, + struct timeval *tv_now) { struct io_unit *io; int i; @@ -649,6 +728,7 @@ static void update_iou_counters(struct iocb **my_iocbs, int nr) io = (struct io_unit *)(my_iocbs[i]); io->io_oper->num_pending++; io->io_oper->started_ios++; + io->io_start_time = *tv_now; /* set time of io_submit */ } } @@ -657,15 +737,18 @@ int run_built(struct thread_info *t, int num_ios, struct iocb **my_iocbs) { int ret; struct timeval start_time; + struct timeval stop_time; resubmit: gettimeofday(&start_time, NULL); ret = io_submit(t->io_ctx, num_ios, my_iocbs); - calc_latency(&start_time, &t->io_submit_latency); + gettimeofday(&stop_time, NULL); + calc_latency(&start_time, &stop_time, &t->io_submit_latency); + if (ret != num_ios) { /* some ios got through */ if (ret > 0) { - update_iou_counters(my_iocbs, ret); + update_iou_counters(my_iocbs, ret, &stop_time); my_iocbs += ret; t->num_global_pending += ret; num_ios -= ret; @@ -675,15 +758,19 @@ resubmit: * retry */ if (ret > 0 || ret == -EAGAIN) { + int old_ret = ret; if ((ret = read_some_events(t) > 0)) { goto resubmit; + } else { + fprintf(stderr, "ret was %d and now is %d\n", ret, old_ret); + abort(); } } fprintf(stderr, "ret %d (%s) on io_submit\n", ret, strerror(-ret)); return -1; } - update_iou_counters(my_iocbs, ret); + update_iou_counters(my_iocbs, ret, &stop_time); t->num_global_pending += ret; return 0; } @@ -972,7 +1059,7 @@ free_buffers: */ void global_thread_throughput(struct thread_info *t, char *this_stage) { int i; - double runtime = time_since(&global_stage_start_time); + double runtime = time_since_now(&global_stage_start_time); double total_mb = 0; double min_trans = 0; @@ -1013,121 +1100,109 @@ int worker(struct thread_info *t) aio_setup(&t->io_ctx, 512); restart: - printf("Starting %s iter:%d \n", __FUNCTION__,iteration); if (num_threads > 1) { - printf("num_threads %d \n", num_threads); pthread_mutex_lock(&stage_mutex); - threads_starting++; - if (threads_starting == num_threads) { - threads_ending = 0; - gettimeofday(&global_stage_start_time, NULL); - pthread_cond_broadcast(&stage_cond); - } - while (threads_starting != num_threads) - pthread_cond_wait(&stage_cond, &stage_mutex); + threads_starting++; + if (threads_starting == num_threads) { + threads_ending = 0; + gettimeofday(&global_stage_start_time, NULL); + pthread_cond_broadcast(&stage_cond); + } + while (threads_starting != num_threads) + pthread_cond_wait(&stage_cond, &stage_mutex); pthread_mutex_unlock(&stage_mutex); } if (t->active_opers) { -// printf("active_opers %p line:%d\n", t->active_opers, __LINE__); this_stage = stage_name(t->active_opers->rw); - gettimeofday(&stage_time, NULL); - t->stage_mb_trans = 0; + gettimeofday(&stage_time, NULL); + t->stage_mb_trans = 0; } + cnt = 0; /* first we send everything through aio */ -// printf("cnt:%d max_iterations:%d oper:%p\n",cnt, iterations,oper); - - while (t->active_opers && (cnt < iterations || iterations == RUN_FOREVER)) { -// printf("active_opers %p line:%d cnt:%d ", t->active_opers,__LINE__,cnt); - if (stonewall && threads_ending) { - oper = t->active_opers; - oper->stonewalled = 1; - oper_list_del(oper, &t->active_opers); - oper_list_add(oper, &t->finished_opers); -// printf(" if branch\n"); - } else { - run_active_list(t, io_iter, max_io_submit); -// printf(" else branch\n"); + while(t->active_opers && (cnt < iterations || iterations == RUN_FOREVER)) { + if (stonewall && threads_ending) { + oper = t->active_opers; + oper->stonewalled = 1; + oper_list_del(oper, &t->active_opers); + oper_list_add(oper, &t->finished_opers); + } else { + run_active_list(t, io_iter, max_io_submit); } - cnt++; + cnt++; } - if (latency_stats) print_latency(t); + if (completion_latency_stats) + print_completion_latency(t); + /* then we wait for all the operations to finish */ oper = t->finished_opers; -// printf("line:%d oper:%p\n", __LINE__, oper); do { - io_oper_wait(t, oper); - if (oper != NULL) { - oper = oper->next; - } - } while (oper != t->finished_opers); -// printf("finished_opers %p line:%d\n", t->finished_opers,__LINE__); + if (!oper) + break; + io_oper_wait(t, oper); + oper = oper->next; + } while(oper != t->finished_opers); /* then we do an fsync to get the timing for any future operations * right, and check to see if any of these need to get restarted */ oper = t->finished_opers; -// printf("oper %p line:%d\n", oper,__LINE__); - while (oper) { - if (fsync_stages) + while(oper) { + if (fsync_stages) fsync(oper->fd); - t->stage_mb_trans += oper_mb_trans(oper); - if (restart_oper(oper)) { - oper_list_del(oper, &t->finished_opers); - oper_list_add(oper, &t->active_opers); - oper = t->finished_opers; - continue; - } - oper = oper->next; - if (oper == t->finished_opers) - break; + t->stage_mb_trans += oper_mb_trans(oper); + if (restart_oper(oper)) { + oper_list_del(oper, &t->finished_opers); + oper_list_add(oper, &t->active_opers); + oper = t->finished_opers; + continue; + } + oper = oper->next; + if (oper == t->finished_opers) + break; } if (t->stage_mb_trans && t->num_files > 0) { -// printf("num_files %d line:%d\n", t->num_files,__LINE__); - double seconds = time_since(&stage_time); - fprintf(stderr, "thread %d %s totals (%.2f MB/s) %.2f MB in %.2fs\n", - t - global_thread_info, this_stage, t->stage_mb_trans/seconds, - t->stage_mb_trans, seconds); + double seconds = time_since_now(&stage_time); + fprintf(stderr, "thread %d %s totals (%.2f MB/s) %.2f MB in %.2fs\n", + t - global_thread_info, this_stage, t->stage_mb_trans/seconds, + t->stage_mb_trans, seconds); } if (num_threads > 1) { -// printf("num_threads %d line:%d\n", num_threads,__LINE__); - pthread_mutex_lock(&stage_mutex); - threads_ending++; - if (threads_ending == num_threads) { - threads_starting = 0; - pthread_cond_broadcast(&stage_cond); - global_thread_throughput(t, this_stage); - } -// printf("threads_ending %d line:%d\n", threads_ending,__LINE__); - while (threads_ending != num_threads) - pthread_cond_wait(&stage_cond, &stage_mutex); - pthread_mutex_unlock(&stage_mutex); + pthread_mutex_lock(&stage_mutex); + threads_ending++; + if (threads_ending == num_threads) { + threads_starting = 0; + pthread_cond_broadcast(&stage_cond); + global_thread_throughput(t, this_stage); + } + while(threads_ending != num_threads) + pthread_cond_wait(&stage_cond, &stage_mutex); + pthread_mutex_unlock(&stage_mutex); } - + /* someone got restarted, go back to the beginning */ if (t->active_opers && (cnt < iterations || iterations == RUN_FOREVER)) { - iteration++; + iteration++; goto restart; } /* finally, free all the ram */ -// printf("finished_opers %p line:%d\n", t->finished_opers,__LINE__); - while (t->finished_opers) { - oper = t->finished_opers; - oper_list_del(oper, &t->finished_opers); - status = finish_oper(t, oper); + while(t->finished_opers) { + oper = t->finished_opers; + oper_list_del(oper, &t->finished_opers); + status = finish_oper(t, oper); } if (t->num_global_pending) { fprintf(stderr, "global num pending is %d\n", t->num_global_pending); } io_queue_release(t->io_ctx); - + return status; } @@ -1138,7 +1213,6 @@ int run_workers(struct thread_info *t, int num_threads) int thread_ret; int i; -// printf("%s num_threads %d line:%d\n", __FUNCTION__,num_threads,__LINE__); for(i = 0 ; i < num_threads ; i++) { ret = pthread_create(&t[i].tid, NULL, (start_routine)worker, t + i); if (ret) { @@ -1178,6 +1252,10 @@ off_t parse_size(char *size_arg, off_t mult) { case 'K': mult = 1024; break; + case 'b': + case 'B': + mult = 1; + break; } ret = mult * num; return ret; @@ -1205,7 +1283,9 @@ void print_usage(void) { printf("\t-m shmfs mmap a file in /dev/shm for io buffers\n"); printf("\t-n no fsyncs between write stage and read stage\n"); printf("\t-l print io_submit latencies after each stage\n"); + printf("\t-L print io completion latencies after each stage\n"); printf("\t-t number of threads to run\n"); + printf("\t-u unlink files after completion\n"); printf("\t-v verification of bytes written\n"); printf("\t-x turn off thread stonewalling\n"); printf("\t-h this message\n"); @@ -1232,7 +1312,7 @@ int main(int ac, char **av) page_size_mask = getpagesize() - 1; while(1) { - c = getopt(ac, av, "a:b:c:C:m:s:r:d:i:I:o:t:lnhOSxv"); + c = getopt(ac, av, "a:b:c:C:m:s:r:d:i:I:o:t:lLnhOSxvu"); if (c < 0) break; @@ -1270,6 +1350,9 @@ int main(int ac, char **av) case 'l': latency_stats = 1; break; + case 'L': + completion_latency_stats = 1; + break; case 'm': if (!strcmp(optarg, "shm")) { fprintf(stderr, "using ipc shm\n"); @@ -1296,6 +1379,9 @@ int main(int ac, char **av) case 'x': stonewall = 0; break; + case 'u': + unlink_files = 1; + break; case 'v': verify = 1; break; @@ -1379,7 +1465,6 @@ int main(int ac, char **av) for (j = 0 ; j < num_contexts ; j++) { thread_index = open_fds % num_threads; open_fds++; -// fprintf(stderr, "adding file %s thread %d\n", av[i], thread_index); rwfd = open(av[i], O_CREAT | O_RDWR | o_direct | o_sync, 0600); assert(rwfd != -1); @@ -1407,25 +1492,21 @@ int main(int ac, char **av) if (num_threads > 1){ printf("Running multi thread version num_threads:%d\n", num_threads); run_workers(t, num_threads); - } - else { + } else { printf("Running single thread version \n"); - status = worker(t); + status = worker(t); } - - - for (i = optind ; i < ac ; i++) { - printf("Cleaning up file %s \n", av[i]); - unlink(av[i]); + if (unlink_files) { + for (i = optind ; i < ac ; i++) { + printf("Cleaning up file %s \n", av[i]); + unlink(av[i]); + } } if (status) { - printf("non zero return %d \n", status); - } - else{ - printf("aio-stress Completed successfully %d \n", status); + exit(1); } - - exit(0); + return status; } + From sandeen@sandeen.net Fri Jun 5 13:17:59 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55IHxFn057979 for ; Fri, 5 Jun 2009 13:17:59 -0500 X-ASG-Debug-ID: 1244225897-646b001a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DBCC72D6DB4 for ; Fri, 5 Jun 2009 11:18:17 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id 5gqOxwe53wXiWCaC for ; Fri, 05 Jun 2009 11:18:17 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n55II8PT000327; Fri, 5 Jun 2009 14:18:08 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n55II8AK009524; Fri, 5 Jun 2009 14:18:08 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n55II6CE023889; Fri, 5 Jun 2009 14:18:07 -0400 Message-ID: <4A29615E.2070303@sandeen.net> Date: Fri, 05 Jun 2009 13:18:06 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 5/7] xfs: introduce a per-ag inode iterator Subject: Re: [PATCH 5/7] xfs: introduce a per-ag inode iterator References: <20090514171233.942489000@bombadil.infradead.org> <20090514171558.869514000@bombadil.infradead.org> <4A26F6B1.20509@sandeen.net> <20090604171726.GA13501@infradead.org> In-Reply-To: <20090604171726.GA13501@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244225897 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.111 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > On Wed, Jun 03, 2009 at 05:18:25PM -0500, Eric Sandeen wrote: >> Ok, it's looking for EAGAIN here, I'm assuming this is for when we are >> calling xfs_reclaim_inode_now, because... >> >> ... >> ... because before, that's what we did above, after testing for a non-0 >> return from xfs_reclaim_inode. >> >> But xfs_reclaim_inode_now() returns 0 or the result of >> xfs_reclaim_inode, which is 0/1, so above: > > Yeah. Updated patch below that besides addressing the other comments > makes xfs_reclaim_inode return -EAGAIN if it has to skip an inode. > > Subject: xfs: introduce a per-ag inode iterator > From: Dave Chinner > > From: Dave Chinner > > Given that we walk across the per-ag inode lists so often, it makes sense to > introduce an iterator for this. > > Convert the sync and reclaim code to use this new iterator, quota code will > follow in the next patch. > > Also change xfs_reclaim_inode to return -EGAIN instead of 1 for an inode > already under reclaim. This simplifies the AG iterator and doesn't > matter for the only other caller. > > [hch: merged the lookup and execute callbacks back into one to get the > pag_ici_lock locking correct and simplify the code flow] > > Signed-off-by: Dave Chinner > Signed-off-by: Christoph Hellwig Ok, I like this version :) Reviewed-by: Eric Sandeen > Index: xfs/fs/xfs/linux-2.6/xfs_sync.c > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2009-06-04 12:50:25.380940755 +0200 > +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2009-06-04 13:09:06.199942249 +0200 > @@ -49,6 +49,123 @@ > #include > > > +STATIC xfs_inode_t * > +xfs_inode_ag_lookup( > + struct xfs_mount *mp, > + struct xfs_perag *pag, > + uint32_t *first_index, > + int tag) > +{ > + int nr_found; > + struct xfs_inode *ip; > + > + /* > + * use a gang lookup to find the next inode in the tree > + * as the tree is sparse and a gang lookup walks to find > + * the number of objects requested. > + */ > + read_lock(&pag->pag_ici_lock); > + if (tag == -1) { > + nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, > + (void **)&ip, *first_index, 1); > + } else { > + nr_found = radix_tree_gang_lookup_tag(&pag->pag_ici_root, > + (void **)&ip, *first_index, 1, tag); > + } > + if (!nr_found) > + goto unlock; > + > + /* > + * Update the index for the next lookup. Catch overflows > + * into the next AG range which can occur if we have inodes > + * in the last block of the AG and we are currently > + * pointing to the last inode. > + */ > + *first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); > + if (*first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) > + goto unlock; > + > + return ip; > + > +unlock: > + read_unlock(&pag->pag_ici_lock); > + return NULL; > +} > + > +STATIC int > +xfs_inode_ag_walk( > + struct xfs_mount *mp, > + xfs_agnumber_t ag, > + int (*execute)(struct xfs_inode *ip, > + struct xfs_perag *pag, int flags), > + int flags, > + int tag) > +{ > + struct xfs_perag *pag = &mp->m_perag[ag]; > + uint32_t first_index; > + int last_error = 0; > + int skipped; > + > +restart: > + skipped = 0; > + first_index = 0; > + do { > + int error = 0; > + xfs_inode_t *ip; > + > + ip = xfs_inode_ag_lookup(mp, pag, &first_index, tag); > + if (!ip) > + break; > + > + error = execute(ip, pag, flags); > + if (error == EAGAIN) { > + skipped++; > + continue; > + } > + if (error) > + last_error = error; > + /* > + * bail out if the filesystem is corrupted. > + */ > + if (error == EFSCORRUPTED) > + break; > + > + } while (1); > + > + if (skipped) { > + delay(1); > + goto restart; > + } > + > + xfs_put_perag(mp, pag); > + return last_error; > +} > + > +STATIC int > +xfs_inode_ag_iterator( > + struct xfs_mount *mp, > + int (*execute)(struct xfs_inode *ip, > + struct xfs_perag *pag, int flags), > + int flags, > + int tag) > +{ > + int error = 0; > + int last_error = 0; > + xfs_agnumber_t ag; > + > + for (ag = 0; ag < mp->m_sb.sb_agcount; ag++) { > + if (!mp->m_perag[ag].pag_ici_init) > + continue; > + error = xfs_inode_ag_walk(mp, ag, execute, flags, tag); > + if (error) { > + last_error = error; > + if (error == EFSCORRUPTED) > + break; > + } > + } > + return XFS_ERROR(last_error); > +} > + > /* must be called with pag_ici_lock held and releases it */ > STATIC int > xfs_sync_inode_valid( > @@ -85,12 +202,17 @@ xfs_sync_inode_valid( > STATIC int > xfs_sync_inode_data( > struct xfs_inode *ip, > + struct xfs_perag *pag, > int flags) > { > struct inode *inode = VFS_I(ip); > struct address_space *mapping = inode->i_mapping; > int error = 0; > > + error = xfs_sync_inode_valid(ip, pag); > + if (error) > + return error; > + > if (!mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) > goto out_wait; > > @@ -107,16 +229,22 @@ xfs_sync_inode_data( > out_wait: > if (flags & SYNC_IOWAIT) > xfs_ioend_wait(ip); > + IRELE(ip); > return error; > } > > STATIC int > xfs_sync_inode_attr( > struct xfs_inode *ip, > + struct xfs_perag *pag, > int flags) > { > int error = 0; > > + error = xfs_sync_inode_valid(ip, pag); > + if (error) > + return error; > + > xfs_ilock(ip, XFS_ILOCK_SHARED); > if (xfs_inode_clean(ip)) > goto out_unlock; > @@ -136,117 +264,33 @@ xfs_sync_inode_attr( > > out_unlock: > xfs_iunlock(ip, XFS_ILOCK_SHARED); > + IRELE(ip); > return error; > } > > -/* > - * Sync all the inodes in the given AG according to the > - * direction given by the flags. > - */ > -STATIC int > -xfs_sync_inodes_ag( > - xfs_mount_t *mp, > - int ag, > - int flags) > -{ > - xfs_perag_t *pag = &mp->m_perag[ag]; > - int nr_found; > - uint32_t first_index = 0; > - int error = 0; > - int last_error = 0; > - > - do { > - xfs_inode_t *ip = NULL; > - > - /* > - * use a gang lookup to find the next inode in the tree > - * as the tree is sparse and a gang lookup walks to find > - * the number of objects requested. > - */ > - read_lock(&pag->pag_ici_lock); > - nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, > - (void**)&ip, first_index, 1); > - > - if (!nr_found) { > - read_unlock(&pag->pag_ici_lock); > - break; > - } > - > - /* > - * Update the index for the next lookup. Catch overflows > - * into the next AG range which can occur if we have inodes > - * in the last block of the AG and we are currently > - * pointing to the last inode. > - */ > - first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); > - if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) { > - read_unlock(&pag->pag_ici_lock); > - break; > - } > - > - error = xfs_sync_inode_valid(ip, pag); > - if (error) { > - if (error == EFSCORRUPTED) > - return 0; > - continue; > - } > - > - /* > - * If we have to flush data or wait for I/O completion > - * we need to hold the iolock. > - */ > - if (flags & SYNC_DELWRI) > - error = xfs_sync_inode_data(ip, flags); > - > - if (flags & SYNC_ATTR) > - error = xfs_sync_inode_attr(ip, flags); > - > - IRELE(ip); > - > - if (error) > - last_error = error; > - /* > - * bail out if the filesystem is corrupted. > - */ > - if (error == EFSCORRUPTED) > - return XFS_ERROR(error); > - > - } while (nr_found); > - > - return last_error; > -} > - > int > xfs_sync_inodes( > xfs_mount_t *mp, > int flags) > { > - int error; > - int last_error; > - int i; > + int error = 0; > int lflags = XFS_LOG_FORCE; > > if (mp->m_flags & XFS_MOUNT_RDONLY) > return 0; > - error = 0; > - last_error = 0; > > if (flags & SYNC_WAIT) > lflags |= XFS_LOG_SYNC; > > - for (i = 0; i < mp->m_sb.sb_agcount; i++) { > - if (!mp->m_perag[i].pag_ici_init) > - continue; > - error = xfs_sync_inodes_ag(mp, i, flags); > - if (error) > - last_error = error; > - if (error == EFSCORRUPTED) > - break; > - } > if (flags & SYNC_DELWRI) > - xfs_log_force(mp, 0, lflags); > + error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, -1); > > - return XFS_ERROR(last_error); > + if (flags & SYNC_ATTR) > + error = xfs_inode_ag_iterator(mp, xfs_sync_inode_attr, flags, -1); > + > + if (!error && (flags & SYNC_DELWRI)) > + xfs_log_force(mp, 0, lflags); > + return XFS_ERROR(error); > } > > STATIC int > @@ -613,7 +657,7 @@ xfs_reclaim_inode( > xfs_ifunlock(ip); > xfs_iunlock(ip, XFS_ILOCK_EXCL); > } > - return 1; > + return -EAGAIN; > } > __xfs_iflags_set(ip, XFS_IRECLAIM); > spin_unlock(&ip->i_flags_lock); > @@ -698,72 +742,20 @@ xfs_inode_clear_reclaim_tag( > xfs_put_perag(mp, pag); > } > > - > -STATIC void > -xfs_reclaim_inodes_ag( > - xfs_mount_t *mp, > - int ag, > - int mode) > +STATIC int > +xfs_reclaim_inode_now( > + struct xfs_inode *ip, > + struct xfs_perag *pag, > + int flags) > { > - xfs_inode_t *ip = NULL; > - xfs_perag_t *pag = &mp->m_perag[ag]; > - int nr_found; > - uint32_t first_index; > - int skipped; > - > -restart: > - first_index = 0; > - skipped = 0; > - do { > - /* > - * use a gang lookup to find the next inode in the tree > - * as the tree is sparse and a gang lookup walks to find > - * the number of objects requested. > - */ > - read_lock(&pag->pag_ici_lock); > - nr_found = radix_tree_gang_lookup_tag(&pag->pag_ici_root, > - (void**)&ip, first_index, 1, > - XFS_ICI_RECLAIM_TAG); > - > - if (!nr_found) { > - read_unlock(&pag->pag_ici_lock); > - break; > - } > - > - /* > - * Update the index for the next lookup. Catch overflows > - * into the next AG range which can occur if we have inodes > - * in the last block of the AG and we are currently > - * pointing to the last inode. > - */ > - first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); > - if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) { > - read_unlock(&pag->pag_ici_lock); > - break; > - } > - > - /* ignore if already under reclaim */ > - if (xfs_iflags_test(ip, XFS_IRECLAIM)) { > - read_unlock(&pag->pag_ici_lock); > - continue; > - } > - > + /* ignore if already under reclaim */ > + if (xfs_iflags_test(ip, XFS_IRECLAIM)) { > read_unlock(&pag->pag_ici_lock); > - > - /* > - * hmmm - this is an inode already in reclaim. Do > - * we even bother catching it here? > - */ > - if (xfs_reclaim_inode(ip, 0, mode)) > - skipped++; > - } while (nr_found); > - > - if (skipped) { > - delay(1); > - goto restart; > + return 0; > } > - return; > + read_unlock(&pag->pag_ici_lock); > > + return xfs_reclaim_inode(ip, 0, flags); > } > > int > @@ -771,14 +763,6 @@ xfs_reclaim_inodes( > xfs_mount_t *mp, > int mode) > { > - int i; > - > - for (i = 0; i < mp->m_sb.sb_agcount; i++) { > - if (!mp->m_perag[i].pag_ici_init) > - continue; > - xfs_reclaim_inodes_ag(mp, i, mode); > - } > - return 0; > + return xfs_inode_ag_iterator(mp, xfs_reclaim_inode_now, mode, > + XFS_ICI_RECLAIM_TAG); > } > - > - > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From BATV+464f3644bd103b0265ce+2112+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 5 14:10:28 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55JARwu060813 for ; Fri, 5 Jun 2009 14:10:28 -0500 X-ASG-Debug-ID: 1244229450-2beb01600000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7FB508BBE00 for ; Fri, 5 Jun 2009 12:17:30 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id JfvPgvHHPY8vDc2k for ; Fri, 05 Jun 2009 12:17:30 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MCeo6-0005n3-IZ; Fri, 05 Jun 2009 19:10:30 +0000 Date: Fri, 5 Jun 2009 15:10:26 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] xfstests: update aio-stress.c, with copyright information intact Subject: Re: [PATCH] xfstests: update aio-stress.c, with copyright information intact Message-ID: <20090605191020.GA11399@infradead.org> References: <4A2945DC.8040809@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A2945DC.8040809@redhat.com> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244229451 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Jun 05, 2009 at 11:20:44AM -0500, Eric Sandeen wrote: > Pulled from: > http://ltp.cvs.sourceforge.net/viewvc/ltp/ltp/testcases/kernel/io/ltp-aiodio/aio-stress.c > revision 1.8 > > There are a couple new options, but the main motivator is to > get the license text intact again. > > Signed-off-by: Eric Sandeen Looks good, Reviewed-by: Christoph Hellwig From BATV+464f3644bd103b0265ce+2112+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 5 14:13:29 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55JDTWV060898 for ; Fri, 5 Jun 2009 14:13:29 -0500 X-ASG-Debug-ID: 1244229632-162e02a30000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 108418BBEBA; Fri, 5 Jun 2009 12:20:32 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id UTsdeuvD9uC360Nt; Fri, 05 Jun 2009 12:20:32 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MCerK-0000Gh-1k; Fri, 05 Jun 2009 19:13:46 +0000 Date: Fri, 5 Jun 2009 15:13:46 -0400 From: Christoph Hellwig To: Robert Herndon Cc: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: add -x flags to include/install-sh Subject: Re: [PATCH] xfsprogs: add -x flags to include/install-sh Message-ID: <20090605191345.GB11399@infradead.org> References: <1244059268-2135-1-git-send-email-rherndon@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1244059268-2135-1-git-send-email-rherndon@sgi.com> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244229633 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Thanks, I've put this into the xfsprogs, xfsdump and dmapi repositories. From sandeen@sandeen.net Fri Jun 5 14:15:41 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55JFehw060998 for ; Fri, 5 Jun 2009 14:15:40 -0500 X-ASG-Debug-ID: 1244229763-15aa02c60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id BE8F98BBFEA for ; Fri, 5 Jun 2009 12:22:43 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id HpVdlX5nJSiQ8T3m for ; Fri, 05 Jun 2009 12:22:43 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n55JFejd014503; Fri, 5 Jun 2009 15:15:40 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n55JFegT025453; Fri, 5 Jun 2009 15:15:40 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n55JFcJJ001361; Fri, 5 Jun 2009 15:15:39 -0400 Message-ID: <4A296EDA.9020802@sandeen.net> Date: Fri, 05 Jun 2009 14:15:38 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 6/7] xfs: use generic inode iterator in xfs_qm_dqrele_all_inodes Subject: Re: [PATCH 6/7] xfs: use generic inode iterator in xfs_qm_dqrele_all_inodes References: <20090514171233.942489000@bombadil.infradead.org> <20090514171559.029154000@bombadil.infradead.org> In-Reply-To: <20090514171559.029154000@bombadil.infradead.org> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244229763 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.116 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > Use xfs_inode_ag_iterator instead of opencoding the inode walk in the > quota code. Mark xfs_inode_ag_iterator and xfs_sync_inode_valid non-static > to allow using them from the quota code. > > > Signed-off-by: Christoph Hellwig > > Index: xfs/fs/xfs/quota/xfs_qm_syscalls.c > =================================================================== > --- xfs.orig/fs/xfs/quota/xfs_qm_syscalls.c 2009-05-13 14:52:54.087659167 +0200 > +++ xfs/fs/xfs/quota/xfs_qm_syscalls.c 2009-05-13 14:57:36.531661369 +0200 ... > + error = xfs_sync_inode_valid(ip, pag); > + if (error) > + return 0; Does this need the same error propagation treatment as 5/7 ? -Eric From BATV+464f3644bd103b0265ce+2112+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 5 14:17:30 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55JHT5G061051 for ; Fri, 5 Jun 2009 14:17:30 -0500 X-ASG-Debug-ID: 1244229468-2c9401e60000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id B253F1A6D678 for ; Fri, 5 Jun 2009 12:17:48 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id NRbhzhwF7dZnWrPS for ; Fri, 05 Jun 2009 12:17:48 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MCevB-0000Zb-7Q; Fri, 05 Jun 2009 19:17:46 +0000 Date: Fri, 5 Jun 2009 15:17:45 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 6/7] xfs: use generic inode iterator in xfs_qm_dqrele_all_inodes Subject: Re: [PATCH 6/7] xfs: use generic inode iterator in xfs_qm_dqrele_all_inodes Message-ID: <20090605191744.GA17489@infradead.org> References: <20090514171233.942489000@bombadil.infradead.org> <20090514171559.029154000@bombadil.infradead.org> <4A296EDA.9020802@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A296EDA.9020802@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244229468 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Jun 05, 2009 at 02:15:38PM -0500, Eric Sandeen wrote: > Does this need the same error propagation treatment as 5/7 ? Yes, I've already fixed this up in my local copy: Subject: xfs: use generic inode iterator in xfs_qm_dqrele_all_inodes From: Christoph Hellwig Use xfs_inode_ag_iterator instead of opencoding the inode walk in the quota code. Mark xfs_inode_ag_iterator and xfs_sync_inode_valid non-static to allow using them from the quota code. Signed-off-by: Christoph Hellwig Reviewed-by: Josef 'Jeff' Sipek Index: xfs/fs/xfs/quota/xfs_qm_syscalls.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_syscalls.c 2009-06-04 12:47:30.742821242 +0200 +++ xfs/fs/xfs/quota/xfs_qm_syscalls.c 2009-06-04 13:03:51.039832673 +0200 @@ -847,105 +847,55 @@ xfs_qm_export_flags( } -/* - * Release all the dquots on the inodes in an AG. - */ -STATIC void -xfs_qm_dqrele_inodes_ag( - xfs_mount_t *mp, - int ag, - uint flags) +STATIC int +xfs_dqrele_inode( + struct xfs_inode *ip, + struct xfs_perag *pag, + int flags) { - xfs_inode_t *ip = NULL; - xfs_perag_t *pag = &mp->m_perag[ag]; - int first_index = 0; - int nr_found; - - do { - /* - * use a gang lookup to find the next inode in the tree - * as the tree is sparse and a gang lookup walks to find - * the number of objects requested. - */ - read_lock(&pag->pag_ici_lock); - nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, - (void**)&ip, first_index, 1); - - if (!nr_found) { - read_unlock(&pag->pag_ici_lock); - break; - } - - /* - * Update the index for the next lookup. Catch overflows - * into the next AG range which can occur if we have inodes - * in the last block of the AG and we are currently - * pointing to the last inode. - */ - first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); - if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) { - read_unlock(&pag->pag_ici_lock); - break; - } - - /* skip quota inodes */ - if (ip == XFS_QI_UQIP(mp) || ip == XFS_QI_GQIP(mp)) { - ASSERT(ip->i_udquot == NULL); - ASSERT(ip->i_gdquot == NULL); - read_unlock(&pag->pag_ici_lock); - continue; - } + int error; - /* - * If we can't get a reference on the inode, it must be - * in reclaim. Leave it for the reclaim code to flush. - */ - if (!igrab(VFS_I(ip))) { - read_unlock(&pag->pag_ici_lock); - continue; - } + /* skip quota inodes */ + if (ip == XFS_QI_UQIP(ip->i_mount) || ip == XFS_QI_GQIP(ip->i_mount)) { + ASSERT(ip->i_udquot == NULL); + ASSERT(ip->i_gdquot == NULL); read_unlock(&pag->pag_ici_lock); + return 0; + } - /* avoid new inodes though we shouldn't find any here */ - if (xfs_iflags_test(ip, XFS_INEW)) { - IRELE(ip); - continue; - } + error = xfs_sync_inode_valid(ip, pag); + if (error) + return error; - xfs_ilock(ip, XFS_ILOCK_EXCL); - if ((flags & XFS_UQUOTA_ACCT) && ip->i_udquot) { - xfs_qm_dqrele(ip->i_udquot); - ip->i_udquot = NULL; - } - if (flags & (XFS_PQUOTA_ACCT|XFS_GQUOTA_ACCT) && - ip->i_gdquot) { - xfs_qm_dqrele(ip->i_gdquot); - ip->i_gdquot = NULL; - } - xfs_iput(ip, XFS_ILOCK_EXCL); + xfs_ilock(ip, XFS_ILOCK_EXCL); + if ((flags & XFS_UQUOTA_ACCT) && ip->i_udquot) { + xfs_qm_dqrele(ip->i_udquot); + ip->i_udquot = NULL; + } + if (flags & (XFS_PQUOTA_ACCT|XFS_GQUOTA_ACCT) && ip->i_gdquot) { + xfs_qm_dqrele(ip->i_gdquot); + ip->i_gdquot = NULL; + } + xfs_iput(ip, XFS_ILOCK_EXCL); + IRELE(ip); - } while (nr_found); + return 0; } + /* * Go thru all the inodes in the file system, releasing their dquots. + * * Note that the mount structure gets modified to indicate that quotas are off - * AFTER this, in the case of quotaoff. This also gets called from - * xfs_rootumount. + * AFTER this, in the case of quotaoff. */ void xfs_qm_dqrele_all_inodes( struct xfs_mount *mp, uint flags) { - int i; - ASSERT(mp->m_quotainfo); - for (i = 0; i < mp->m_sb.sb_agcount; i++) { - if (!mp->m_perag[i].pag_ici_init) - continue; - xfs_qm_dqrele_inodes_ag(mp, i, flags); - } + xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, -1); } /*------------------------------------------------------------------------*/ Index: xfs/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2009-06-04 13:01:29.388941822 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2009-06-04 13:02:26.249965001 +0200 @@ -141,7 +141,7 @@ restart: return last_error; } -STATIC int +int xfs_inode_ag_iterator( struct xfs_mount *mp, int (*execute)(struct xfs_inode *ip, @@ -167,7 +167,7 @@ xfs_inode_ag_iterator( } /* must be called with pag_ici_lock held and releases it */ -STATIC int +int xfs_sync_inode_valid( struct xfs_inode *ip, struct xfs_perag *pag) Index: xfs/fs/xfs/linux-2.6/xfs_sync.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.h 2009-06-04 12:47:30.804939977 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.h 2009-06-04 13:02:26.249965001 +0200 @@ -54,4 +54,10 @@ void xfs_inode_set_reclaim_tag(struct xf void xfs_inode_clear_reclaim_tag(struct xfs_inode *ip); void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, struct xfs_inode *ip); + +int xfs_sync_inode_valid(struct xfs_inode *ip, struct xfs_perag *pag); +int xfs_inode_ag_iterator(struct xfs_mount *mp, + int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), + int flags, int tag); + #endif From sandeen@sandeen.net Fri Jun 5 15:11:52 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55KBpIX062755 for ; Fri, 5 Jun 2009 15:11:51 -0500 X-ASG-Debug-ID: 1244232729-22f400ce0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3065D2D728D for ; Fri, 5 Jun 2009 13:12:09 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id Rjz2EBKpXQlG7oEF for ; Fri, 05 Jun 2009 13:12:09 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n55KBvkG028017; Fri, 5 Jun 2009 16:11:57 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n55KBut6007696; Fri, 5 Jun 2009 16:11:57 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n55KBtK6010542; Fri, 5 Jun 2009 16:11:55 -0400 Message-ID: <4A297C0B.8060302@sandeen.net> Date: Fri, 05 Jun 2009 15:11:55 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 6/7] xfs: use generic inode iterator in xfs_qm_dqrele_all_inodes Subject: Re: [PATCH 6/7] xfs: use generic inode iterator in xfs_qm_dqrele_all_inodes References: <20090514171233.942489000@bombadil.infradead.org> <20090514171559.029154000@bombadil.infradead.org> <4A296EDA.9020802@sandeen.net> <20090605191744.GA17489@infradead.org> In-Reply-To: <20090605191744.GA17489@infradead.org> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244232730 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.119 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > On Fri, Jun 05, 2009 at 02:15:38PM -0500, Eric Sandeen wrote: >> Does this need the same error propagation treatment as 5/7 ? > > Yes, I've already fixed this up in my local copy: > > Subject: xfs: use generic inode iterator in xfs_qm_dqrele_all_inodes > From: Christoph Hellwig > > Use xfs_inode_ag_iterator instead of opencoding the inode walk in the > quota code. Mark xfs_inode_ag_iterator and xfs_sync_inode_valid non-static > to allow using them from the quota code. > > > Signed-off-by: Christoph Hellwig > Reviewed-by: Josef 'Jeff' Sipek Ok, this looks fine to me. Reviewed-by: Eric Sandeen > > Index: xfs/fs/xfs/quota/xfs_qm_syscalls.c > =================================================================== > --- xfs.orig/fs/xfs/quota/xfs_qm_syscalls.c 2009-06-04 12:47:30.742821242 +0200 > +++ xfs/fs/xfs/quota/xfs_qm_syscalls.c 2009-06-04 13:03:51.039832673 +0200 > @@ -847,105 +847,55 @@ xfs_qm_export_flags( > } > > > -/* > - * Release all the dquots on the inodes in an AG. > - */ > -STATIC void > -xfs_qm_dqrele_inodes_ag( > - xfs_mount_t *mp, > - int ag, > - uint flags) > +STATIC int > +xfs_dqrele_inode( > + struct xfs_inode *ip, > + struct xfs_perag *pag, > + int flags) > { > - xfs_inode_t *ip = NULL; > - xfs_perag_t *pag = &mp->m_perag[ag]; > - int first_index = 0; > - int nr_found; > - > - do { > - /* > - * use a gang lookup to find the next inode in the tree > - * as the tree is sparse and a gang lookup walks to find > - * the number of objects requested. > - */ > - read_lock(&pag->pag_ici_lock); > - nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, > - (void**)&ip, first_index, 1); > - > - if (!nr_found) { > - read_unlock(&pag->pag_ici_lock); > - break; > - } > - > - /* > - * Update the index for the next lookup. Catch overflows > - * into the next AG range which can occur if we have inodes > - * in the last block of the AG and we are currently > - * pointing to the last inode. > - */ > - first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); > - if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) { > - read_unlock(&pag->pag_ici_lock); > - break; > - } > - > - /* skip quota inodes */ > - if (ip == XFS_QI_UQIP(mp) || ip == XFS_QI_GQIP(mp)) { > - ASSERT(ip->i_udquot == NULL); > - ASSERT(ip->i_gdquot == NULL); > - read_unlock(&pag->pag_ici_lock); > - continue; > - } > + int error; > > - /* > - * If we can't get a reference on the inode, it must be > - * in reclaim. Leave it for the reclaim code to flush. > - */ > - if (!igrab(VFS_I(ip))) { > - read_unlock(&pag->pag_ici_lock); > - continue; > - } > + /* skip quota inodes */ > + if (ip == XFS_QI_UQIP(ip->i_mount) || ip == XFS_QI_GQIP(ip->i_mount)) { > + ASSERT(ip->i_udquot == NULL); > + ASSERT(ip->i_gdquot == NULL); > read_unlock(&pag->pag_ici_lock); > + return 0; > + } > > - /* avoid new inodes though we shouldn't find any here */ > - if (xfs_iflags_test(ip, XFS_INEW)) { > - IRELE(ip); > - continue; > - } > + error = xfs_sync_inode_valid(ip, pag); > + if (error) > + return error; > > - xfs_ilock(ip, XFS_ILOCK_EXCL); > - if ((flags & XFS_UQUOTA_ACCT) && ip->i_udquot) { > - xfs_qm_dqrele(ip->i_udquot); > - ip->i_udquot = NULL; > - } > - if (flags & (XFS_PQUOTA_ACCT|XFS_GQUOTA_ACCT) && > - ip->i_gdquot) { > - xfs_qm_dqrele(ip->i_gdquot); > - ip->i_gdquot = NULL; > - } > - xfs_iput(ip, XFS_ILOCK_EXCL); > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + if ((flags & XFS_UQUOTA_ACCT) && ip->i_udquot) { > + xfs_qm_dqrele(ip->i_udquot); > + ip->i_udquot = NULL; > + } > + if (flags & (XFS_PQUOTA_ACCT|XFS_GQUOTA_ACCT) && ip->i_gdquot) { > + xfs_qm_dqrele(ip->i_gdquot); > + ip->i_gdquot = NULL; > + } > + xfs_iput(ip, XFS_ILOCK_EXCL); > + IRELE(ip); > > - } while (nr_found); > + return 0; > } > > + > /* > * Go thru all the inodes in the file system, releasing their dquots. > + * > * Note that the mount structure gets modified to indicate that quotas are off > - * AFTER this, in the case of quotaoff. This also gets called from > - * xfs_rootumount. > + * AFTER this, in the case of quotaoff. > */ > void > xfs_qm_dqrele_all_inodes( > struct xfs_mount *mp, > uint flags) > { > - int i; > - > ASSERT(mp->m_quotainfo); > - for (i = 0; i < mp->m_sb.sb_agcount; i++) { > - if (!mp->m_perag[i].pag_ici_init) > - continue; > - xfs_qm_dqrele_inodes_ag(mp, i, flags); > - } > + xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, -1); > } > > /*------------------------------------------------------------------------*/ > Index: xfs/fs/xfs/linux-2.6/xfs_sync.c > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2009-06-04 13:01:29.388941822 +0200 > +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2009-06-04 13:02:26.249965001 +0200 > @@ -141,7 +141,7 @@ restart: > return last_error; > } > > -STATIC int > +int > xfs_inode_ag_iterator( > struct xfs_mount *mp, > int (*execute)(struct xfs_inode *ip, > @@ -167,7 +167,7 @@ xfs_inode_ag_iterator( > } > > /* must be called with pag_ici_lock held and releases it */ > -STATIC int > +int > xfs_sync_inode_valid( > struct xfs_inode *ip, > struct xfs_perag *pag) > Index: xfs/fs/xfs/linux-2.6/xfs_sync.h > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.h 2009-06-04 12:47:30.804939977 +0200 > +++ xfs/fs/xfs/linux-2.6/xfs_sync.h 2009-06-04 13:02:26.249965001 +0200 > @@ -54,4 +54,10 @@ void xfs_inode_set_reclaim_tag(struct xf > void xfs_inode_clear_reclaim_tag(struct xfs_inode *ip); > void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, > struct xfs_inode *ip); > + > +int xfs_sync_inode_valid(struct xfs_inode *ip, struct xfs_perag *pag); > +int xfs_inode_ag_iterator(struct xfs_mount *mp, > + int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), > + int flags, int tag); > + > #endif > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Fri Jun 5 15:32:19 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55KWInk063333 for ; Fri, 5 Jun 2009 15:32:18 -0500 X-ASG-Debug-ID: 1244233956-6ed501320000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EA7601227B5E for ; Fri, 5 Jun 2009 13:32:36 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id Z1ZTd7VYhUSWZ6YQ for ; Fri, 05 Jun 2009 13:32:36 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n55KWRm7032346; Fri, 5 Jun 2009 16:32:27 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n55KWQE3012352; Fri, 5 Jun 2009 16:32:26 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n55KWPRm013585; Fri, 5 Jun 2009 16:32:25 -0400 Message-ID: <4A2980D9.9050901@sandeen.net> Date: Fri, 05 Jun 2009 15:32:25 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 7/7] xfs: split xfs_sync_inodes Subject: Re: [PATCH 7/7] xfs: split xfs_sync_inodes References: <20090514171233.942489000@bombadil.infradead.org> <20090514171559.231368000@bombadil.infradead.org> In-Reply-To: <20090514171559.231368000@bombadil.infradead.org> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244233956 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE_7582B X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE_7582B Custom Rule 7582B X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > xfs_sync_inodes is used to write back either file data or inode metadata. > In generally we always do these separately, except for one fishy case in ^^^ "In general" > xfs_fs_put_super that does both. So separate xfs_sync_inodes into > separate xfs_sync_data and xfs_sync_attr functions. In xfs_fs_put_super > we first call the data sync and then the attr sync as that was the previous > order. The moved log force in that path doesn't make a different because > we will force the log again as part of the real unmount process. > > The filesystem readonly checks are not performed by the new function but > instead moved into the callers, given that most callers alredy have it > further up in the stack. Also add debug checks that we do not pass in > incorrect flags in the new xfs_sync_data and xfs_sync_attr function and > fix the one place that did pass in a wrong flag. > > Also remove a comment mentioning xfs_sync_inodes that has been incorrect > for a while because we always take either the iolock or ilock in the > sync path these days. > > > Signed-off-by: Christoph Hellwig Reviewed-by: Eric Sandeen > Index: xfs/fs/xfs/linux-2.6/xfs_super.c > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2009-05-14 19:09:00.178792110 +0200 > +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2009-05-14 19:09:05.278808755 +0200 > @@ -1070,7 +1070,18 @@ xfs_fs_put_super( > int unmount_event_flags = 0; > > xfs_syncd_stop(mp); > - xfs_sync_inodes(mp, SYNC_ATTR|SYNC_DELWRI); > + > + if (!(sb->s_flags & MS_RDONLY)) { > + /* > + * XXX(hch): this should be SYNC_WAIT. > + * > + * Or more likely no needed at all because the VFS is already > + * calling ->sync_fs after shutting down all filestem > + * operations and just before calling ->put_super. > + */ > + xfs_sync_data(mp, 0); > + xfs_sync_attr(mp, 0); > + } > > #ifdef HAVE_DMAPI > if (mp->m_flags & XFS_MOUNT_DMAPI) { > Index: xfs/fs/xfs/linux-2.6/xfs_sync.c > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2009-05-14 19:09:04.687659175 +0200 > +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2009-05-14 19:09:05.279808603 +0200 > @@ -265,29 +265,40 @@ xfs_sync_inode_attr( > return error; > } > > +/* > + * Write out pagecache data for the whole filesystem. > + */ > int > -xfs_sync_inodes( > - xfs_mount_t *mp, > - int flags) > +xfs_sync_data( > + struct xfs_mount *mp, > + int flags) > { > - int error = 0; > - int lflags = XFS_LOG_FORCE; > + int error; > > - if (mp->m_flags & XFS_MOUNT_RDONLY) > - return 0; > + ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT|SYNC_IOWAIT)) == 0); > > - if (flags & SYNC_WAIT) > - lflags |= XFS_LOG_SYNC; > + error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, -1); > + if (error) > + return XFS_ERROR(error); > > - if (flags & SYNC_DELWRI) > - error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, -1); > + xfs_log_force(mp, 0, > + (flags & SYNC_WAIT) ? > + XFS_LOG_FORCE | XFS_LOG_SYNC : > + XFS_LOG_FORCE); > + return 0; > +} > > - if (flags & SYNC_ATTR) > - error = xfs_inode_ag_iterator(mp, xfs_sync_inode_attr, flags, -1); > +/* > + * Write out inode metadata (attributes) for the whole filesystem. > + */ > +int > +xfs_sync_attr( > + struct xfs_mount *mp, > + int flags) > +{ > + ASSERT((flags & ~SYNC_WAIT) == 0); > > - if (!error && (flags & SYNC_DELWRI)) > - xfs_log_force(mp, 0, lflags); > - return XFS_ERROR(error); > + return xfs_inode_ag_iterator(mp, xfs_sync_inode_attr, flags, -1); > } > > STATIC int > @@ -401,12 +412,12 @@ xfs_quiesce_data( > int error; > > /* push non-blocking */ > - xfs_sync_inodes(mp, SYNC_DELWRI|SYNC_BDFLUSH); > + xfs_sync_data(mp, 0); > xfs_qm_sync(mp, SYNC_BDFLUSH); > xfs_filestream_flush(mp); > > /* push and block */ > - xfs_sync_inodes(mp, SYNC_DELWRI|SYNC_WAIT|SYNC_IOWAIT); > + xfs_sync_data(mp, SYNC_WAIT|SYNC_IOWAIT); > xfs_qm_sync(mp, SYNC_WAIT); > > /* write superblock and hoover up shutdown errors */ > @@ -435,7 +446,7 @@ xfs_quiesce_fs( > * logged before we can write the unmount record. > */ > do { > - xfs_sync_inodes(mp, SYNC_ATTR|SYNC_WAIT); > + xfs_sync_attr(mp, SYNC_WAIT); > pincount = xfs_flush_buftarg(mp->m_ddev_targp, 1); > if (!pincount) { > delay(50); > @@ -518,8 +529,8 @@ xfs_flush_inodes_work( > void *arg) > { > struct inode *inode = arg; > - xfs_sync_inodes(mp, SYNC_DELWRI | SYNC_TRYLOCK); > - xfs_sync_inodes(mp, SYNC_DELWRI | SYNC_TRYLOCK | SYNC_IOWAIT); > + xfs_sync_data(mp, SYNC_TRYLOCK); > + xfs_sync_data(mp, SYNC_TRYLOCK | SYNC_IOWAIT); > iput(inode); > } > > Index: xfs/fs/xfs/linux-2.6/xfs_quotaops.c > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_quotaops.c 2009-05-14 19:05:24.908659400 +0200 > +++ xfs/fs/xfs/linux-2.6/xfs_quotaops.c 2009-05-14 19:09:05.280834851 +0200 > @@ -50,9 +50,11 @@ xfs_fs_quota_sync( > { > struct xfs_mount *mp = XFS_M(sb); > > + if (sb->s_flags & MS_RDONLY) > + return -EROFS; > if (!XFS_IS_QUOTA_RUNNING(mp)) > return -ENOSYS; > - return -xfs_sync_inodes(mp, SYNC_DELWRI); > + return -xfs_sync_data(mp, 0); > } > > STATIC int > Index: xfs/fs/xfs/linux-2.6/xfs_sync.h > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.h 2009-05-14 19:09:04.694659368 +0200 > +++ xfs/fs/xfs/linux-2.6/xfs_sync.h 2009-05-14 19:09:05.280834851 +0200 > @@ -29,8 +29,6 @@ typedef struct xfs_sync_work { > struct completion *w_completion; > } xfs_sync_work_t; > > -#define SYNC_ATTR 0x0001 /* sync attributes */ > -#define SYNC_DELWRI 0x0002 /* look at delayed writes */ > #define SYNC_WAIT 0x0004 /* wait for i/o to complete */ > #define SYNC_BDFLUSH 0x0008 /* BDFLUSH is calling -- don't block */ > #define SYNC_IOWAIT 0x0010 /* wait for all I/O to complete */ > @@ -41,7 +39,8 @@ void xfs_syncd_stop(struct xfs_mount *mp > > int xfs_inode_flush(struct xfs_inode *ip, int sync); > > -int xfs_sync_inodes(struct xfs_mount *mp, int flags); > +int xfs_sync_attr(struct xfs_mount *mp, int flags); > +int xfs_sync_data(struct xfs_mount *mp, int flags); > int xfs_sync_fsdata(struct xfs_mount *mp, int flags); > > int xfs_quiesce_data(struct xfs_mount *mp); > Index: xfs/fs/xfs/xfs_filestream.c > =================================================================== > --- xfs.orig/fs/xfs/xfs_filestream.c 2009-05-14 19:05:24.929659282 +0200 > +++ xfs/fs/xfs/xfs_filestream.c 2009-05-14 19:09:05.283807995 +0200 > @@ -542,10 +542,8 @@ xfs_filestream_associate( > * waiting for the lock because someone else is waiting on the lock we > * hold and we cannot drop that as we are in a transaction here. > * > - * Lucky for us, this inversion is rarely a problem because it's a > - * directory inode that we are trying to lock here and that means the > - * only place that matters is xfs_sync_inodes() and SYNC_DELWRI is > - * used. i.e. freeze, remount-ro, quotasync or unmount. > + * Lucky for us, this inversion is not a problem because it's a > + * directory inode that we are trying to lock here. > * > * So, if we can't get the iolock without sleeping then just give up > */ > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Fri Jun 5 15:37:15 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55KbEMH063556 for ; Fri, 5 Jun 2009 15:37:14 -0500 X-ASG-Debug-ID: 1244234252-6ee001510000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3A6151227BB4 for ; Fri, 5 Jun 2009 13:37:32 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id YxxXBAIcD1t0BKoJ for ; Fri, 05 Jun 2009 13:37:32 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n55KbPW9000974; Fri, 5 Jun 2009 16:37:25 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n55KbOu1014171; Fri, 5 Jun 2009 16:37:24 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n55KbM8V014378; Fri, 5 Jun 2009 16:37:23 -0400 Message-ID: <4A298202.8080904@sandeen.net> Date: Fri, 05 Jun 2009 15:37:22 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 8/7] xfs: remove SYNC_IOWAIT Subject: Re: [PATCH 8/7] xfs: remove SYNC_IOWAIT References: <20090514171233.942489000@bombadil.infradead.org> <20090528121915.GA30037@infradead.org> In-Reply-To: <20090528121915.GA30037@infradead.org> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244234253 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > We want to wait for all I/O to finish when we do data integrity syncs. So > there is no reason to keep SYNC_WAIT separate from SYNC_IOWAIT. This > causes a little change in behaviour for the ENOSPC flushing code which no > does a second submission and wait of buffered I/O, but that should finish > ASAP as we already did an asynchronous writeout earlier. > > > Signed-off-by: Christoph Hellwig Seems ok to me. Reviewed-by: Eric Sandeen > Index: xfs/fs/xfs/linux-2.6/xfs_sync.c > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2009-05-27 12:59:57.115813662 +0200 > +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2009-05-27 13:01:14.634816358 +0200 > @@ -226,7 +226,7 @@ xfs_sync_inode_data( > xfs_iunlock(ip, XFS_IOLOCK_SHARED); > > out_wait: > - if (flags & SYNC_IOWAIT) > + if (flags & SYNC_WAIT) > xfs_ioend_wait(ip); > IRELE(ip); > return error; > @@ -277,7 +277,7 @@ xfs_sync_data( > { > int error; > > - ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT|SYNC_IOWAIT)) == 0); > + ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); > > error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, -1); > if (error) > @@ -419,7 +419,7 @@ xfs_quiesce_data( > xfs_filestream_flush(mp); > > /* push and block */ > - xfs_sync_data(mp, SYNC_WAIT|SYNC_IOWAIT); > + xfs_sync_data(mp, SYNC_WAIT); > xfs_qm_sync(mp, SYNC_WAIT); > > /* write superblock and hoover up shutdown errors */ > @@ -532,7 +532,7 @@ xfs_flush_inodes_work( > { > struct inode *inode = arg; > xfs_sync_data(mp, SYNC_TRYLOCK); > - xfs_sync_data(mp, SYNC_TRYLOCK | SYNC_IOWAIT); > + xfs_sync_data(mp, SYNC_TRYLOCK | SYNC_WAIT); > iput(inode); > } > > Index: xfs/fs/xfs/linux-2.6/xfs_sync.h > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.h 2009-05-27 13:00:29.045814647 +0200 > +++ xfs/fs/xfs/linux-2.6/xfs_sync.h 2009-05-27 13:01:39.162941539 +0200 > @@ -31,7 +31,6 @@ typedef struct xfs_sync_work { > > #define SYNC_WAIT 0x0004 /* wait for i/o to complete */ > #define SYNC_BDFLUSH 0x0008 /* BDFLUSH is calling -- don't block */ > -#define SYNC_IOWAIT 0x0010 /* wait for all I/O to complete */ > #define SYNC_TRYLOCK 0x0020 /* only try to lock inodes */ > > int xfs_syncd_init(struct xfs_mount *mp); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Fri Jun 5 15:45:08 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55Kj7ZK063796 for ; Fri, 5 Jun 2009 15:45:08 -0500 X-ASG-Debug-ID: 1244234725-069c02e20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 611EB2D7463 for ; Fri, 5 Jun 2009 13:45:26 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id HAl5dSjIM0qgogQr for ; Fri, 05 Jun 2009 13:45:26 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n55KjHva002905; Fri, 5 Jun 2009 16:45:17 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n55KjGVt016678; Fri, 5 Jun 2009 16:45:17 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n55KjF57015671; Fri, 5 Jun 2009 16:45:16 -0400 Message-ID: <4A2983DB.90300@sandeen.net> Date: Fri, 05 Jun 2009 15:45:15 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: [PATCH 9/7] xfs: remove SYNC_BDFLUSH Subject: Re: [PATCH 9/7] xfs: remove SYNC_BDFLUSH References: <20090514171233.942489000@bombadil.infradead.org> <20090528121947.GB30037@infradead.org> In-Reply-To: <20090528121947.GB30037@infradead.org> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244234726 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.121 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > SYNC_BDFLUSH is a leftover from IRIX and rather misnamed for todays > code. Make xfs_sync_fsdata and xfs_dq_sync use the SYNC_TRYLOCK flag > for not blocking on logs just as the inode sync code already does. > > For xfs_sync_fsdata it's a trivial 1:1 replacement, but for xfs_qm_sync > I use the opportunity to decouple the non-blocking lock case from the > different flushing modes, similar to the inode sync code. > > > Signed-off-by: Christoph Hellwig Reviewed-by: Eric Sandeen > Index: xfs/fs/xfs/linux-2.6/xfs_sync.c > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2009-05-27 13:02:57.426938830 +0200 > +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2009-05-27 13:07:53.227939055 +0200 > @@ -350,7 +350,7 @@ xfs_sync_fsdata( > * If this is xfssyncd() then only sync the superblock if we can > * lock it without sleeping and it is not pinned. > */ > - if (flags & SYNC_BDFLUSH) { > + if (flags & SYNC_TRYLOCK) { > ASSERT(!(flags & SYNC_WAIT)); > > bp = xfs_getsb(mp, XFS_BUF_TRYLOCK); > @@ -415,7 +415,7 @@ xfs_quiesce_data( > > /* push non-blocking */ > xfs_sync_data(mp, 0); > - xfs_qm_sync(mp, SYNC_BDFLUSH); > + xfs_qm_sync(mp, SYNC_TRYLOCK); > xfs_filestream_flush(mp); > > /* push and block */ > @@ -565,8 +565,8 @@ xfs_sync_worker( > xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE); > xfs_reclaim_inodes(mp, XFS_IFLUSH_DELWRI_ELSE_ASYNC); > /* dgc: errors ignored here */ > - error = xfs_qm_sync(mp, SYNC_BDFLUSH); > - error = xfs_sync_fsdata(mp, SYNC_BDFLUSH); > + error = xfs_qm_sync(mp, SYNC_TRYLOCK); > + error = xfs_sync_fsdata(mp, SYNC_TRYLOCK); > if (xfs_log_need_covered(mp)) > error = xfs_commit_dummy_trans(mp, XFS_LOG_FORCE); > } > Index: xfs/fs/xfs/quota/xfs_qm.c > =================================================================== > --- xfs.orig/fs/xfs/quota/xfs_qm.c 2009-05-27 13:04:00.607842293 +0200 > +++ xfs/fs/xfs/quota/xfs_qm.c 2009-05-27 13:10:21.688940102 +0200 > @@ -905,11 +905,6 @@ xfs_qm_dqdetach( > } > } > > -/* > - * This is called to sync quotas. We can be told to use non-blocking > - * semantics by either the SYNC_BDFLUSH flag or the absence of the > - * SYNC_WAIT flag. > - */ > int > xfs_qm_sync( > xfs_mount_t *mp, > @@ -918,17 +913,13 @@ xfs_qm_sync( > int recl, restarts; > xfs_dquot_t *dqp; > uint flush_flags; > - boolean_t nowait; > int error; > > if (!XFS_IS_QUOTA_RUNNING(mp) || !XFS_IS_QUOTA_ON(mp)) > return 0; > > + flush_flags = (flags & SYNC_WAIT) ? XFS_QMOPT_SYNC : XFS_QMOPT_DELWRI; > restarts = 0; > - /* > - * We won't block unless we are asked to. > - */ > - nowait = (boolean_t)(flags & SYNC_BDFLUSH || (flags & SYNC_WAIT) == 0); > > again: > xfs_qm_mplist_lock(mp); > @@ -948,18 +939,10 @@ xfs_qm_sync( > * don't 'seem' to be dirty. ie. don't acquire dqlock. > * This is very similar to what xfs_sync does with inodes. > */ > - if (flags & SYNC_BDFLUSH) { > - if (! XFS_DQ_IS_DIRTY(dqp)) > + if (flags & SYNC_TRYLOCK) { > + if (!XFS_DQ_IS_DIRTY(dqp)) > continue; > - } > - > - if (nowait) { > - /* > - * Try to acquire the dquot lock. We are NOT out of > - * lock order, but we just don't want to wait for this > - * lock, unless somebody wanted us to. > - */ > - if (! xfs_qm_dqlock_nowait(dqp)) > + if (!xfs_qm_dqlock_nowait(dqp)) > continue; > } else { > xfs_dqlock(dqp); > @@ -976,7 +959,7 @@ xfs_qm_sync( > /* XXX a sentinel would be better */ > recl = XFS_QI_MPLRECLAIMS(mp); > if (!xfs_dqflock_nowait(dqp)) { > - if (nowait) { > + if (flags & SYNC_TRYLOCK) { > xfs_dqunlock(dqp); > continue; > } > @@ -994,7 +977,6 @@ xfs_qm_sync( > * Let go of the mplist lock. We don't want to hold it > * across a disk write > */ > - flush_flags = (nowait) ? XFS_QMOPT_DELWRI : XFS_QMOPT_SYNC; > xfs_qm_mplist_unlock(mp); > xfs_dqtrace_entry(dqp, "XQM_SYNC: DQFLUSH"); > error = xfs_qm_dqflush(dqp, flush_flags); > Index: xfs/fs/xfs/linux-2.6/xfs_sync.h > =================================================================== > --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.h 2009-05-27 13:07:58.997814418 +0200 > +++ xfs/fs/xfs/linux-2.6/xfs_sync.h 2009-05-27 13:08:19.922972203 +0200 > @@ -29,9 +29,8 @@ typedef struct xfs_sync_work { > struct completion *w_completion; > } xfs_sync_work_t; > > -#define SYNC_WAIT 0x0004 /* wait for i/o to complete */ > -#define SYNC_BDFLUSH 0x0008 /* BDFLUSH is calling -- don't block */ > -#define SYNC_TRYLOCK 0x0020 /* only try to lock inodes */ > +#define SYNC_WAIT 0x0001 /* wait for i/o to complete */ > +#define SYNC_TRYLOCK 0x0002 /* only try to lock inodes */ > > int xfs_syncd_init(struct xfs_mount *mp); > void xfs_syncd_stop(struct xfs_mount *mp); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Fri Jun 5 16:17:39 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55LHdgG064828 for ; Fri, 5 Jun 2009 16:17:39 -0500 X-ASG-Debug-ID: 1244236677-075a03740000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DA5B02D75CC for ; Fri, 5 Jun 2009 14:17:57 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id A8luaQXndeXDfFWL for ; Fri, 05 Jun 2009 14:17:57 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n55LHuc0010044 for ; Fri, 5 Jun 2009 17:17:56 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n55LHuQX026173 for ; Fri, 5 Jun 2009 17:17:56 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n55LHs3k020198 for ; Fri, 5 Jun 2009 17:17:55 -0400 Message-ID: <4A298B82.3050903@sandeen.net> Date: Fri, 05 Jun 2009 16:17:54 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH xfstests: Make "new" script insert appropriate license on tests Subject: [PATCH xfstests: Make "new" script insert appropriate license on tests Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244236677 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.122 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Don't default to SGI copyright, someone else may be making this test... Signed-off-by: Eric Sandeen --- iff --git a/new b/new index 45ff163..8e32824 100755 --- a/new +++ b/new @@ -79,6 +79,8 @@ fi echo -n "Creating skeletal script for you to edit ..." +year=`date +%Y` + cat <$id #! /bin/sh # FS QA Test No. $id @@ -86,7 +88,20 @@ cat <$id # what am I here for? # #----------------------------------------------------------------------- -# Copyright (c) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. +# Copyright (c) $year YOUR NAME HERE. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #----------------------------------------------------------------------- # # creator From BATV+464f3644bd103b0265ce+2112+infradead.org+hch@bombadil.srs.infradead.org Fri Jun 5 16:38:53 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55Lcr98065585 for ; Fri, 5 Jun 2009 16:38:53 -0500 X-ASG-Debug-ID: 1244237951-6ef1034d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 549281228BA2 for ; Fri, 5 Jun 2009 14:39:11 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 0ZmTFKW8VGu7YkTt for ; Fri, 05 Jun 2009 14:39:11 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MCh83-0002Cd-2E; Fri, 05 Jun 2009 21:39:11 +0000 Date: Fri, 5 Jun 2009 17:39:11 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH xfstests: Make "new" script insert appropriate license on tests Subject: Re: [PATCH xfstests: Make "new" script insert appropriate license on tests Message-ID: <20090605213910.GA7315@infradead.org> References: <4A298B82.3050903@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A298B82.3050903@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244237952 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Fri, Jun 05, 2009 at 04:17:54PM -0500, Eric Sandeen wrote: > Don't default to SGI copyright, someone else may be > making this test... Ah nice one. Reviewed-by: Christoph Hellwig Mabe it's also time to audit new if actually creates a skeleton up to the latest standards for test cases? From felixb@sgi.com Fri Jun 5 17:14:08 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55ME8Fm066546 for ; Fri, 5 Jun 2009 17:14:08 -0500 Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay1.corp.sgi.com (Postfix) with ESMTP id 919758F81B4 for ; Fri, 5 Jun 2009 15:14:24 -0700 (PDT) Received: from eagdhcp-232-151.americas.sgi.com (eagdhcp-232-151.americas.sgi.com [128.162.232.151]) by estes.americas.sgi.com (Postfix) with ESMTP id 52031700016A; Fri, 5 Jun 2009 17:14:24 -0500 (CDT) Cc: xfs mailing list Message-Id: From: Felix Blyakher To: Eric Sandeen In-Reply-To: <4A298B82.3050903@sandeen.net> Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v926) Subject: Re: [PATCH xfstests: Make "new" script insert appropriate license on tests Date: Fri, 5 Jun 2009 17:14:24 -0500 References: <4A298B82.3050903@sandeen.net> X-Mailer: Apple Mail (2.926) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Jun 5, 2009, at 4:17 PM, Eric Sandeen wrote: > Don't default to SGI copyright, someone else may be > making this test... > > Signed-off-by: Eric Sandeen Reviewed-by: Felix Blyakher > > --- > > iff --git a/new b/new > index 45ff163..8e32824 100755 > --- a/new > +++ b/new > @@ -79,6 +79,8 @@ fi > > echo -n "Creating skeletal script for you to edit ..." > > +year=`date +%Y` > + > cat <$id > #! /bin/sh > # FS QA Test No. $id > @@ -86,7 +88,20 @@ cat <$id > # what am I here for? > # > #----------------------------------------------------------------------- > -# Copyright (c) 2000-2005 Silicon Graphics, Inc. All Rights > Reserved. > +# Copyright (c) $year YOUR NAME HERE. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software > Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > #----------------------------------------------------------------------- > # > # creator > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From richard@intrameta.com Fri Jun 5 17:24:24 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n55MOOBx066788 for ; Fri, 5 Jun 2009 17:24:24 -0500 X-ASG-Debug-ID: 1244240680-6bae01c90000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sigil.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id E3D07122A63A for ; Fri, 5 Jun 2009 15:24:40 -0700 (PDT) Received: from mail.sigil.org (tx1-250.intrameta.com [69.13.51.250]) by cuda.sgi.com with ESMTP id 3EmCdUAOF3zOIpAc for ; Fri, 05 Jun 2009 15:24:40 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by mail.sigil.org (Postfix) with ESMTP id 3C67BB249 for ; Fri, 5 Jun 2009 15:46:49 -0500 (CDT) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: amavisd-new at sigil.org Received: from mail.sigil.org ([127.0.0.1]) by localhost (mail.sigil.org [127.0.0.1]) (amavisd-new, port 10024) with LMTP id LB2lBfHeeqXv for ; Fri, 5 Jun 2009 15:46:46 -0500 (CDT) Received: from magus.portal.sigil.org (ip72-202-157-83.ks.ks.cox.net [72.202.157.83]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sigil.org (Postfix) with ESMTPSA id 9A833B256 for ; Fri, 5 Jun 2009 15:46:45 -0500 (CDT) Date: Fri, 5 Jun 2009 17:22:37 -0500 From: Richard Kolkovich To: xfs@oss.sgi.com X-ASG-Orig-Subj: Segmentation fault during xfs_repair Subject: Segmentation fault during xfs_repair Message-ID: <20090605222236.GA39825@magus.portal.sigil.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-OS: FreeBSD magus 7.2-PRERELEASE i386 X-Composed-With: vim User-Agent: Mutt/1.5.19 (2009-01-05) X-Barracuda-Connect: tx1-250.intrameta.com[69.13.51.250] X-Barracuda-Start-Time: 1244240680 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.126 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean We have a corrupted XFS partition on a storage server. Attempting to run xfs_repair the first time yielded the message about a corrupt log file, so I have run xfs_repair with -L to clear that. Now, xfs_repair segfaults in Phase 3. I have tried -P and a huge -m to no avail. It always seems to segfault at the same point: bad directory block magic # 0 in block 11 for directory inode 341521797 corrupt block 11 in directory inode 341521797 will junk block Segmentation fault (core dumped) Here is the backtrace: (gdb) bt #0 traverse_int_dir2block (mp=0x7fff4243c1d0, da_cursor=0x7fff4243bca0, rbno=0x7fff4243bd98) at dir2.c:358 #1 0x000000000041650e in process_node_dir2 () at dir2.c:1940 #2 process_leaf_node_dir2 (mp=0x7fff4243c1d0, ino=341521797, dip=0x27131600, ino_discovery=1, dirname=0x46bdcd "", parent=0x7fff4243c080, blkmap=0x7f8828b5c060, dot=0x7fff4243be6c, dotdot=0x7fff4243be68, repair=0x7fff4243be64, isnode=1) at dir2.c:2033 #3 0x00000000004182cc in process_dir2 (mp=0x7fff4243c1d0, ino=341521797, dip=0x27131600, ino_discovery=1, dino_dirty=0x7fff4243c090, dirname=0x46bdcd "", parent=0x7fff4243c080, blkmap=0x7f8828b5c060) at dir2.c:2086 #4 0x000000000040f9dc in process_dinode_int (mp=0x7fff4243c1d0, dino=0x27131600, agno=5, ino=5977477, was_free=0, dirty=0x7fff4243c090, used=0x7fff4243c094, verify_mode=0, uncertain=0, ino_discovery=1, check_dups=0, extra_attr_check=1, isa_dir=0x7fff4243c08c, parent=0x7fff4243c080) at dinode.c:2668 #5 0x000000000040fbae in process_dinode (mp=0x7fff4254c438, dino=0x7fff4254c418, agno=939524166, ino=5888, was_free=46501, dirty=0x3, used=0x7fff4243c094, ino_discovery=1, check_dups=0, extra_attr_check=1, isa_dir=0x7fff4243c08c, parent=0x7fff4243c080) at dinode.c:2779 #6 0x00000000004088f6 in process_inode_chunk (mp=0x7fff4243c1d0, agno=5, num_inos=, first_irec=0x2198f60, ino_discovery=1, check_dups=0, extra_attr_check=1, bogus=0x7fff4243c114) at dino_chunks.c:778 #7 0x0000000000408edd in process_aginodes (mp=0x7fff4243c1d0, pf_args=0x7f88284d97b0, agno=5, ino_discovery=1, check_dups=0, extra_attr_check=1) at dino_chunks.c:1024 #8 0x000000000041bfdf in process_ag_func (wq=0x2003730, agno=5, arg=0x7f88284d97b0) at phase3.c:161 #9 0x000000000041c79b in process_ags () at phase3.c:200 #10 phase3 (mp=0x7fff4243c1d0) at phase3.c:239 #11 0x0000000000432435 in main (argc=, argv=) at xfs_repair.c:719 I can provide the full core file, if need be (956M). The xfs_metadump can be found at: http://files.intrameta.com/metadump.gz (735M) Any suggestions/ideas on how to proceed are welcome. Please Reply-All, as I'm not subscribed to the ML. Thanks, -- Richard Kolkovich IntraMeta Corporation richard@intrameta.com From sandeen@sandeen.net Fri Jun 5 21:45:22 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n562jL91078978 for ; Fri, 5 Jun 2009 21:45:21 -0500 X-ASG-Debug-ID: 1244256339-59d203330000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DC5FD121B40F for ; Fri, 5 Jun 2009 19:45:39 -0700 (PDT) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id hvlbqEN6HOWw24Rb for ; Fri, 05 Jun 2009 19:45:39 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 8DCB3A9DAD0; Fri, 5 Jun 2009 21:45:37 -0500 (CDT) Message-ID: <4A29D851.9000700@sandeen.net> Date: Fri, 05 Jun 2009 21:45:37 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (Macintosh/20090302) MIME-Version: 1.0 To: Richard Kolkovich CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Segmentation fault during xfs_repair Subject: Re: Segmentation fault during xfs_repair References: <20090605222236.GA39825@magus.portal.sigil.org> In-Reply-To: <20090605222236.GA39825@magus.portal.sigil.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1244256339 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.140 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Richard Kolkovich wrote: > We have a corrupted XFS partition on a storage server. Attempting to run xfs_repair the first time yielded the message about a corrupt log file, so I have run xfs_repair with -L to clear that. Now, xfs_repair segfaults in Phase 3. I have tried -P and a huge -m to no avail. It always seems to segfault at the same point: > > bad directory block magic # 0 in block 11 for directory inode 341521797 > corrupt block 11 in directory inode 341521797 > will junk block > Segmentation fault (core dumped) For starters, which xfsprogs version.... if not latest, try latest... if latest, I'll grab that metadump image and see if I can reproduce it. -Eric > Here is the backtrace: > > (gdb) bt > #0 traverse_int_dir2block (mp=0x7fff4243c1d0, da_cursor=0x7fff4243bca0, rbno=0x7fff4243bd98) > at dir2.c:358 > #1 0x000000000041650e in process_node_dir2 () at dir2.c:1940 > #2 process_leaf_node_dir2 (mp=0x7fff4243c1d0, ino=341521797, dip=0x27131600, ino_discovery=1, > dirname=0x46bdcd "", parent=0x7fff4243c080, blkmap=0x7f8828b5c060, dot=0x7fff4243be6c, > dotdot=0x7fff4243be68, repair=0x7fff4243be64, isnode=1) at dir2.c:2033 > #3 0x00000000004182cc in process_dir2 (mp=0x7fff4243c1d0, ino=341521797, dip=0x27131600, > ino_discovery=1, dino_dirty=0x7fff4243c090, dirname=0x46bdcd "", parent=0x7fff4243c080, > blkmap=0x7f8828b5c060) at dir2.c:2086 > #4 0x000000000040f9dc in process_dinode_int (mp=0x7fff4243c1d0, dino=0x27131600, agno=5, > ino=5977477, was_free=0, dirty=0x7fff4243c090, used=0x7fff4243c094, verify_mode=0, > uncertain=0, ino_discovery=1, check_dups=0, extra_attr_check=1, isa_dir=0x7fff4243c08c, > parent=0x7fff4243c080) at dinode.c:2668 > #5 0x000000000040fbae in process_dinode (mp=0x7fff4254c438, dino=0x7fff4254c418, agno=939524166, > ino=5888, was_free=46501, dirty=0x3, used=0x7fff4243c094, ino_discovery=1, check_dups=0, > extra_attr_check=1, isa_dir=0x7fff4243c08c, parent=0x7fff4243c080) at dinode.c:2779 > #6 0x00000000004088f6 in process_inode_chunk (mp=0x7fff4243c1d0, agno=5, > num_inos=, first_irec=0x2198f60, ino_discovery=1, check_dups=0, > extra_attr_check=1, bogus=0x7fff4243c114) at dino_chunks.c:778 > #7 0x0000000000408edd in process_aginodes (mp=0x7fff4243c1d0, pf_args=0x7f88284d97b0, agno=5, > ino_discovery=1, check_dups=0, extra_attr_check=1) at dino_chunks.c:1024 > #8 0x000000000041bfdf in process_ag_func (wq=0x2003730, agno=5, arg=0x7f88284d97b0) > at phase3.c:161 > #9 0x000000000041c79b in process_ags () at phase3.c:200 > #10 phase3 (mp=0x7fff4243c1d0) at phase3.c:239 > #11 0x0000000000432435 in main (argc=, argv=) > at xfs_repair.c:719 > > I can provide the full core file, if need be (956M). The xfs_metadump can be found at: > > http://files.intrameta.com/metadump.gz (735M) > > Any suggestions/ideas on how to proceed are welcome. Please Reply-All, as I'm not subscribed to the ML. > > Thanks, > From richard@intrameta.com Fri Jun 5 22:16:25 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n563GOKQ081080 for ; Fri, 5 Jun 2009 22:16:25 -0500 X-ASG-Debug-ID: 1244258609-29fe01110000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sigil.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 695C21266E5A for ; Fri, 5 Jun 2009 20:23:29 -0700 (PDT) Received: from mail.sigil.org (tx1-250.intrameta.com [69.13.51.250]) by cuda.sgi.com with ESMTP id eZ5AKRg7AIHNlD81 for ; Fri, 05 Jun 2009 20:23:29 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by mail.sigil.org (Postfix) with ESMTP id A8846B2A5; Fri, 5 Jun 2009 20:38:50 -0500 (CDT) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: amavisd-new at sigil.org Received: from mail.sigil.org ([127.0.0.1]) by localhost (mail.sigil.org [127.0.0.1]) (amavisd-new, port 10024) with LMTP id z1Rwbm-CwgHR; Fri, 5 Jun 2009 20:38:49 -0500 (CDT) Received: from magus.portal.sigil.org (ip72-202-157-83.ks.ks.cox.net [72.202.157.83]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sigil.org (Postfix) with ESMTPSA id DC8E8B291; Fri, 5 Jun 2009 20:38:48 -0500 (CDT) Date: Fri, 5 Jun 2009 22:14:46 -0500 From: Richard Kolkovich To: Eric Sandeen Cc: "xfs@oss.sgi.com" X-ASG-Orig-Subj: Re: Segmentation fault during xfs_repair Subject: Re: Segmentation fault during xfs_repair Message-ID: <20090606031445.GB39825@magus.portal.sigil.org> References: <20090605222236.GA39825@magus.portal.sigil.org> <4A29D851.9000700@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A29D851.9000700@sandeen.net> X-OS: FreeBSD magus 7.2-PRERELEASE i386 X-Composed-With: vim User-Agent: Mutt/1.5.19 (2009-01-05) X-Barracuda-Connect: tx1-250.intrameta.com[69.13.51.250] X-Barracuda-Start-Time: 1244258610 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.143 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean On Fri, Jun 05, 2009 at 10:45:37PM -0400, Eric Sandeen wrote: > Richard Kolkovich wrote: > > We have a corrupted XFS partition on a storage server. Attempting to run xfs_repair the first time yielded the message about a corrupt log file, so I have run xfs_repair with -L to clear that. Now, xfs_repair segfaults in Phase 3. I have tried -P and a huge -m to no avail. It always seems to segfault at the same point: > > > > bad directory block magic # 0 in block 11 for directory inode 341521797 > > corrupt block 11 in directory inode 341521797 > > will junk block > > Segmentation fault (core dumped) > > For starters, which xfsprogs version.... if not latest, try latest... if > latest, I'll grab that metadump image and see if I can reproduce it. > > -Eric Sorry - forgot to mention that. Running on Fedora 11 (64bit). Tried using 2.10.2 (from yum) and building from latest stable source (3.0.1). Let me know if I should try a dev build. Thanks, -- Richard Kolkovich IntraMeta Corporation richard@intrameta.com From sandeen@sandeen.net Fri Jun 5 22:30:05 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n563U4Io082000 for ; Fri, 5 Jun 2009 22:30:04 -0500 X-ASG-Debug-ID: 1244259429-2a1601be0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1231B1266ECB for ; Fri, 5 Jun 2009 20:37:09 -0700 (PDT) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id BSpL2SSPCGI8E08a for ; Fri, 05 Jun 2009 20:37:09 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id E7567AC08EC; Fri, 5 Jun 2009 22:25:21 -0500 (CDT) Message-ID: <4A29E1A1.1010202@sandeen.net> Date: Fri, 05 Jun 2009 22:25:21 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (Macintosh/20090302) MIME-Version: 1.0 To: Richard Kolkovich CC: "xfs@oss.sgi.com" X-ASG-Orig-Subj: Re: Segmentation fault during xfs_repair Subject: Re: Segmentation fault during xfs_repair References: <20090605222236.GA39825@magus.portal.sigil.org> <4A29D851.9000700@sandeen.net> <20090606031445.GB39825@magus.portal.sigil.org> In-Reply-To: <20090606031445.GB39825@magus.portal.sigil.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1244259430 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Richard Kolkovich wrote: > On Fri, Jun 05, 2009 at 10:45:37PM -0400, Eric Sandeen wrote: >> Richard Kolkovich wrote: >>> We have a corrupted XFS partition on a storage server. >>> Attempting to run xfs_repair the first time yielded the message >>> about a corrupt log file, so I have run xfs_repair with -L to >>> clear that. Now, xfs_repair segfaults in Phase 3. I have tried >>> -P and a huge -m to no avail. It always seems to segfault at the >>> same point: >>> >>> bad directory block magic # 0 in block 11 for directory inode >>> 341521797 corrupt block 11 in directory inode 341521797 will junk >>> block Segmentation fault (core dumped) >> For starters, which xfsprogs version.... if not latest, try >> latest... if latest, I'll grab that metadump image and see if I can >> reproduce it. >> >> -Eric > > Sorry - forgot to mention that. > > Running on Fedora 11 (64bit). Tried using 2.10.2 (from yum) and > building from latest stable source (3.0.1). Let me know if I should > try a dev build. (Hm, did I really leave F11 at 2.10.2? I thought it was newer, but anyway) No, I doubt anything else has fixed this since 3.0.1 I'll try pulling down that metadump image & see what I can see. Feel free to file an xfsprogs bug with fedora, too, so the issue doesn't get lost... -Eric > Thanks, > From sandeen@sandeen.net Fri Jun 5 23:43:50 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n564hnkQ084813 for ; Fri, 5 Jun 2009 23:43:49 -0500 X-ASG-Debug-ID: 1244263447-5f5802d40000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 70EB22D8079 for ; Fri, 5 Jun 2009 21:44:07 -0700 (PDT) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id SvtPnejOUdtzHRiT for ; Fri, 05 Jun 2009 21:44:07 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 48927AC08EC; Fri, 5 Jun 2009 23:44:06 -0500 (CDT) Message-ID: <4A29F415.5020203@sandeen.net> Date: Fri, 05 Jun 2009 23:44:05 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (Macintosh/20090302) MIME-Version: 1.0 To: Richard Kolkovich CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Segmentation fault during xfs_repair Subject: Re: Segmentation fault during xfs_repair References: <20090605222236.GA39825@magus.portal.sigil.org> In-Reply-To: <20090605222236.GA39825@magus.portal.sigil.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1244263448 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.148 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Richard Kolkovich wrote: > We have a corrupted XFS partition on a storage server. Attempting to run xfs_repair the first time yielded the message about a corrupt log file, so I have run xfs_repair with -L to clear that. Now, xfs_repair segfaults in Phase 3. I have tried -P and a huge -m to no avail. It always seems to segfault at the same point: > > bad directory block magic # 0 in block 11 for directory inode 341521797 > corrupt block 11 in directory inode 341521797 > will junk block > Segmentation fault (core dumped) ... > I can provide the full core file, if need be (956M). The xfs_metadump can be found at: > > http://files.intrameta.com/metadump.gz (735M) > > Any suggestions/ideas on how to proceed are welcome. Please Reply-All, as I'm not subscribed to the ML. Ok, on a -g (not -02) build: Program terminated with signal 11, Segmentation fault. #0 0x0000000000418d05 in traverse_int_dir2block (mp=0x7ffff4c4f150, da_cursor=0x7ffff4c4eb30, rbno=0x7ffff4c4ebdc) at dir2.c:356 356 da_cursor->level[i].hashval = (gdb) p i $1 = 46501 i is set from i = da_cursor->active = be16_to_cpu(node->hdr.level); (gdb) p node->hdr.level // note this is big endian $2 = 42421 that's a crazily deep btree, well beyond anything sane: #define XFS_DA_NODE_MAXDEPTH 5 /* max depth of Btree */ So repair really should be checking for this before it goes off and indexes it: 356 da_cursor->level[i].hashval = because the cursor only has this much in the array: dir2_level_state_t level[XFS_DA_NODE_MAXDEPTH]; I'll have to ponder what repair should do in this case ... and I'll see if there's something we can do in xfs_db to just whack out this problem and let repair continue for now. -Eric From sandeen@sandeen.net Sat Jun 6 00:09:55 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n5659s6U088127 for ; Sat, 6 Jun 2009 00:09:54 -0500 X-ASG-Debug-ID: 1244265012-5f3703ab0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 665652D81C0 for ; Fri, 5 Jun 2009 22:10:12 -0700 (PDT) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id kINJbCMyinVaDi4k for ; Fri, 05 Jun 2009 22:10:12 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id A4654AC08EC; Sat, 6 Jun 2009 00:10:12 -0500 (CDT) Message-ID: <4A29FA34.5020809@sandeen.net> Date: Sat, 06 Jun 2009 00:10:12 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (Macintosh/20090302) MIME-Version: 1.0 To: Richard Kolkovich CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Segmentation fault during xfs_repair Subject: Re: Segmentation fault during xfs_repair References: <20090605222236.GA39825@magus.portal.sigil.org> <4A29F415.5020203@sandeen.net> In-Reply-To: <4A29F415.5020203@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1244265013 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.149 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Eric Sandeen wrote: > I'll have to ponder what repair should do in this case ... and I'll see > if there's something we can do in xfs_db to just whack out this problem > and let repair continue for now. > > -Eric > > This should get you over that hump I think: --- xfsprogs-3.0.1.orig/repair/dir2.c 2009-06-06 00:01:10.711081870 -0500 +++ xfsprogs-3.0.1/repair/dir2.c 2009-06-06 00:05:52.993365954 -0500 @@ -353,6 +353,14 @@ } } + if (i >= XFS_DA_NODE_MAXDEPTH) { + do_warn(_("bad header depth for directory inode %llu\n"), + da_cursor->ino); + da_brelse(bp); + i = -1; + goto error_out; + } + da_cursor->level[i].hashval = be32_to_cpu(node->btree[0].hashval); da_cursor->level[i].bp = bp; but I have to say, that is one fried filesystem you've got there.... -Eric From nobody@server20.speedpacket.com Sun Jun 7 11:23:48 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.1 required=5.0 tests=BAYES_50,SUBJ_ALL_CAPS autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n57GNjqJ176526 for ; Sun, 7 Jun 2009 11:23:48 -0500 X-ASG-Debug-ID: 1244392258-63b201290000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from server20.speedpacket.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7A72D148ED27 for ; Sun, 7 Jun 2009 09:30:58 -0700 (PDT) Received: from server20.speedpacket.com (server20.speedpacket.com [84.40.22.45]) by cuda.sgi.com with ESMTP id 11UWCcgravBTfKe6 for ; Sun, 07 Jun 2009 09:30:58 -0700 (PDT) Received: from nobody by server20.speedpacket.com with local (Exim 4.69) (envelope-from ) id 1MDL9P-000659-Aj for xfs@oss.sgi.com; Sun, 07 Jun 2009 18:23:15 +0200 To: xfs@oss.sgi.com X-ASG-Orig-Subj: UPGRADE NOTICE!! Subject: UPGRADE NOTICE!! X-PHP-Script: www.geelonline.be/raffer/x.php for 80.255.59.242 From: Erasmusmc Technical Services Reply-To: stc697@gmail.com MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit Message-Id: Date: Sun, 07 Jun 2009 18:23:15 +0200 X-SPEEDPACKET-MailScanner-Information: Please contact the ISP for more information X-SPEEDPACKET-MailScanner-ID: 1MDL9P-000659-Aj X-SPEEDPACKET-MailScanner: Found to be clean X-SPEEDPACKET-MailScanner-MCPCheck: X-SPEEDPACKET-MailScanner-SpamCheck: X-SPEEDPACKET-MailScanner-From: nobody@server20.speedpacket.com X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server20.speedpacket.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [99 32002] / [47 12] X-AntiAbuse: Sender Address Domain - server20.speedpacket.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: server20.speedpacket.com[84.40.22.45] X-Barracuda-Start-Time: 1244392260 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4935 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 1.50 X-Barracuda-Spam-Status: No, SCORE=1.50 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC0_SA372b X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.282 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.50 BSF_SC0_SA372b Custom Rule SA372b X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dear Erasmusmc Webmail Account Subscriber, We are currently performing maintenance on our Digital webmail Server. We intend upgrading our Digital Erasmusmc webmail Security Server for better online services due to spam mail and virus. In order to ensure you do not experience service interruption, Please you have to repond to this email immediately and enter your Username here (**********) and password here (**********) and Checkout your new features and enhancements with your new and improved Erasmusmc mail account. To enable us upgrade your Account for better online services please reply to this mail. NB: We request your username and password for Identification purpose only. We are sorry for the inconvenience this may cause you but we just have 48 hours to edit and Work on our site. ----Erasmusmc Webmail Technical Services.----- From news@mgras.net Sun Jun 7 12:29:21 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n57HTJQL180255 for ; Sun, 7 Jun 2009 12:29:21 -0500 X-ASG-Debug-ID: 1244396191-1259018e0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from foehn.mgras.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3A976148F196 for ; Sun, 7 Jun 2009 10:36:31 -0700 (PDT) Received: from foehn.mgras.de (quickstep.mgras.net [213.146.115.59]) by cuda.sgi.com with ESMTP id bb5PBfNGKnoB3Wvw for ; Sun, 07 Jun 2009 10:36:31 -0700 (PDT) Received: from osprey.mgras.de (osprey.mgras.de [192.168.48.3]) by foehn.mgras.de (8.13.1/8.13.0) with ESMTP id n57HSk7i027958 for ; Sun, 7 Jun 2009 19:28:46 +0200 (CEST) Received: (from news@localhost) by osprey.mgras.de (AIX5.1/8.11.6p2/8.11.0) id n57HSjY34724 for linux-xfs@oss.sgi.com; Sun, 7 Jun 2009 19:28:45 +0200 To: linux-xfs@oss.sgi.com Path: not-for-mail From: Martin Spott Newsgroups: list.linux-xfs X-ASG-Orig-Subj: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Subject: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Date: Sun, 7 Jun 2009 17:28:45 +0000 (UTC) Organization: home Lines: 44 Message-ID: References: <20090520003745.GA27491@samad.com.au> <20090604112657.GA10738@infradead.org> NNTP-Posting-Host: jive.mgras.de X-Trace: osprey.mgras.de 1244395725 36062 192.168.48.5 (7 Jun 2009 17:28:45 GMT) X-Complaints-To: usenet@mgras.net NNTP-Posting-Date: Sun, 7 Jun 2009 17:28:45 +0000 (UTC) User-Agent: tin/1.9.3-20080506 ("Dalintober") (UNIX) (Linux/2.6.29.4 (x86_64)) X-Barracuda-Connect: quickstep.mgras.net[213.146.115.59] X-Barracuda-Start-Time: 1244396194 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.52 X-Barracuda-Spam-Status: No, SCORE=-1.52 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_RULE7568M X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.288 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_RULE7568M Custom Rule 7568M X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi Christoph, Christoph Hellwig wrote: > Sorry guys, still haven't been able to track it down. Any chance one > of you could run with CONFIG_XFS_DEBUG enabled and see if it trips > over any of the asserts? "Say N unless you are an XFS developer, or you play one on TV." Very nice ;-) I'm have to regret that I'm neither an XFS developer nor do I pretend to be one. Yet, as I understand, I should see at least _some_ debug info via 'dmesg', if there is any. Apparently the kernel is now having XFS with debugging enabled: Jun 7 18:53:33 isnix1 kernel: SGI XFS with ACLs, security attributes, large block/inode numbers, debug enabled Jun 7 18:53:33 isnix1 kernel: SGI XFS Quota Management subsystem Jun 7 18:53:33 isnix1 kernel: XFS mounting filesystem cciss/c0d0p2 [...] .... but aside from the well-known messages as: Installing knfsd (copyright (C) 1996 okir@monad.swb.de). NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory NFSD: unable to find recovery directory /var/lib/nfs/v4recovery NFSD: starting 90-second grace period reconnect_path: npd != pd reconnect_path: npd != pd reconnect_path: npd != pd [...] .... I'm unable to find any helpful information in this context. Anything I could try - this sunday evening ? Cheers, Martin. -- Unix _IS_ user friendly - it's just selective about who its friends are ! -------------------------------------------------------------------------- From felixb@sgi.com Sun Jun 7 13:27:06 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n57IR5pe183381 for ; Sun, 7 Jun 2009 13:27:06 -0500 Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9FF14AC00A for ; Sun, 7 Jun 2009 11:27:22 -0700 (PDT) Received: from [IPv6???1] (sshgate.corp.sgi.com [198.149.20.12]) by estes.americas.sgi.com (Postfix) with ESMTP id 1CB5970001C8; Sun, 7 Jun 2009 13:27:22 -0500 (CDT) Cc: linux-xfs@oss.sgi.com Message-Id: <1641C8DC-0F15-4085-9A01-4B86E8B4BF6C@sgi.com> From: Felix Blyakher To: Martin Spott In-Reply-To: Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v930.3) Subject: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Date: Sun, 7 Jun 2009 13:27:20 -0500 References: <20090520003745.GA27491@samad.com.au> <20090604112657.GA10738@infradead.org> X-Mailer: Apple Mail (2.930.3) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Jun 7, 2009, at 12:28 PM, Martin Spott wrote: > Hi Christoph, > > Christoph Hellwig wrote: > >> Sorry guys, still haven't been able to track it down. Any chance one >> of you could run with CONFIG_XFS_DEBUG enabled and see if it trips >> over any of the asserts? > > "Say N unless you are an XFS developer, or you play one on TV." Or unless you're told by an XFS developer :) > > > Very nice ;-) > > I'm have to regret that I'm neither an XFS developer nor do I pretend > to be one. Yet, as I understand, I should see at least _some_ debug > info via 'dmesg', if there is any. Apparently the kernel is now having > XFS with debugging enabled: > > Jun 7 18:53:33 isnix1 kernel: SGI XFS with ACLs, security > attributes, large block/inode numbers, debug enabled > Jun 7 18:53:33 isnix1 kernel: SGI XFS Quota Management subsystem > Jun 7 18:53:33 isnix1 kernel: XFS mounting filesystem cciss/c0d0p2 > [...] > > > .... but aside from the well-known messages as: > > Installing knfsd (copyright (C) 1996 okir@monad.swb.de). > NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery > directory > NFSD: unable to find recovery directory /var/lib/nfs/v4recovery > NFSD: starting 90-second grace period > reconnect_path: npd != pd > reconnect_path: npd != pd > reconnect_path: npd != pd > [...] > > > .... I'm unable to find any helpful information in this context. Have you already reproduced the crash with the debug kernel? The xfs debug module would not necessarily produce the verbose log. It does, however, have many asserts, which would crash much earlier and provide more hints as to the reasons to your original crash. > Anything I could try - this sunday evening ? If you haven't tried to reproduce the panic, try it now. Good luck! Felix > > > Cheers, > Martin. > -- > Unix _IS_ user friendly - it's just selective about who its friends > are ! > -------------------------------------------------------------------------- > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Sun Jun 7 13:27:25 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n57IROSO183408 for ; Sun, 7 Jun 2009 13:27:25 -0500 X-ASG-Debug-ID: 1244399262-585503a10000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 61EDB2DA882 for ; Sun, 7 Jun 2009 11:27:42 -0700 (PDT) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id EcEcQS9Fdr2uInYX for ; Sun, 07 Jun 2009 11:27:42 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 1E2F7AC08EC; Sun, 7 Jun 2009 13:27:37 -0500 (CDT) Message-ID: <4A2C0698.9060800@sandeen.net> Date: Sun, 07 Jun 2009 13:27:36 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (Macintosh/20090302) MIME-Version: 1.0 To: Martin Spott CC: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Subject: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) References: <20090520003745.GA27491@samad.com.au> <20090604112657.GA10738@infradead.org> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1244399263 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.291 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Martin Spott wrote: > Hi Christoph, > > Christoph Hellwig wrote: > >> Sorry guys, still haven't been able to track it down. Any chance one >> of you could run with CONFIG_XFS_DEBUG enabled and see if it trips >> over any of the asserts? > > "Say N unless you are an XFS developer, or you play one on TV." > > Very nice ;-) > > I'm have to regret that I'm neither an XFS developer nor do I pretend > to be one. Yet, as I understand, I should see at least _some_ debug > info via 'dmesg', if there is any. CONFIG_XFS_DEBUG is more of addded checks and asserts, not so much in the way of extra messages - at least, until you actually hit a problem. -Eric From BATV+386b524bfa2c9398024b+2114+infradead.org+hch@bombadil.srs.infradead.org Sun Jun 7 13:55:47 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n57Itdrh184660 for ; Sun, 7 Jun 2009 13:55:47 -0500 X-ASG-Debug-ID: 1244400959-0ad400860000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 918762DA993 for ; Sun, 7 Jun 2009 11:55:59 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id Kqg1jZZCvqfJmgoC for ; Sun, 07 Jun 2009 11:55:59 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MDNXC-00053Y-Jj; Sun, 07 Jun 2009 18:55:58 +0000 Date: Sun, 7 Jun 2009 14:55:58 -0400 From: Christoph Hellwig To: Martin Spott Cc: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Subject: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Message-ID: <20090607185558.GA753@infradead.org> References: <20090520003745.GA27491@samad.com.au> <20090604112657.GA10738@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244400959 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, Jun 07, 2009 at 05:28:45PM +0000, Martin Spott wrote: > reconnect_path: npd != pd > reconnect_path: npd != pd > reconnect_path: npd != pd > [...] > > > .... I'm unable to find any helpful information in this context. > Anything I could try - this sunday evening ? That warning is what really makes me freak out, as it really, really shouldn't happen. Can you see if it gives any additional useful output with the patch below? Index: linux-2.6/fs/exportfs/expfs.c =================================================================== --- linux-2.6.orig/fs/exportfs/expfs.c 2009-06-07 20:40:09.085814403 +0200 +++ linux-2.6/fs/exportfs/expfs.c 2009-06-07 20:54:47.550942377 +0200 @@ -88,6 +88,14 @@ find_disconnected_root(struct dentry *de return dentry; } +static void dump_dentry(struct dentry *dentry, const char *var) +{ + printk("%s: dentry 0x%p inode 0x%p ino %lld name %s\n", + var, dentry, dentry->d_inode, + dentry->d_inode ? + (unsigned long long)dentry->d_inode->i_ino : 0, + dentry->d_name.name); +} /* * Make sure target_dir is fully connected to the dentry tree. @@ -187,8 +195,11 @@ reconnect_path(struct vfsmount *mnt, str */ if (npd == pd) noprogress = 0; - else + else { printk("%s: npd != pd\n", __func__); + dump_dentry(npd, "npd"); + dump_dentry(pd, "pd"); + } dput(npd); dput(ppd); if (IS_ROOT(pd)) { From news@mgras.net Sun Jun 7 13:55:53 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n57ItqJm184689 for ; Sun, 7 Jun 2009 13:55:52 -0500 X-ASG-Debug-ID: 1244400970-653d031f0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from foehn.mgras.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4E13F2DA9A9 for ; Sun, 7 Jun 2009 11:56:11 -0700 (PDT) Received: from foehn.mgras.de (quickstep.mgras.net [213.146.115.59]) by cuda.sgi.com with ESMTP id G94rssRhQCAiyXpS for ; Sun, 07 Jun 2009 11:56:11 -0700 (PDT) Received: from osprey.mgras.de (osprey.mgras.de [192.168.48.3]) by foehn.mgras.de (8.13.1/8.13.0) with ESMTP id n57ItMcF029646 for ; Sun, 7 Jun 2009 20:55:22 +0200 (CEST) Received: (from news@localhost) by osprey.mgras.de (AIX5.1/8.11.6p2/8.11.0) id n57ItL612510 for linux-xfs@oss.sgi.com; Sun, 7 Jun 2009 20:55:21 +0200 To: linux-xfs@oss.sgi.com Path: not-for-mail From: Martin Spott Newsgroups: list.linux-xfs X-ASG-Orig-Subj: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Subject: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Date: Sun, 7 Jun 2009 18:55:21 +0000 (UTC) Organization: home Lines: 23 Message-ID: References: <20090520003745.GA27491@samad.com.au> <20090604112657.GA10738@infradead.org> <4A2C0698.9060800@sandeen.net> NNTP-Posting-Host: jive.mgras.de X-Trace: osprey.mgras.de 1244400921 8992 192.168.48.5 (7 Jun 2009 18:55:21 GMT) X-Complaints-To: usenet@mgras.net NNTP-Posting-Date: Sun, 7 Jun 2009 18:55:21 +0000 (UTC) User-Agent: tin/1.9.3-20080506 ("Dalintober") (UNIX) (Linux/2.6.29.4 (x86_64)) X-Barracuda-Connect: quickstep.mgras.net[213.146.115.59] X-Barracuda-Start-Time: 1244400972 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.292 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Eric Sandeen wrote: > CONFIG_XFS_DEBUG is more of addded checks and asserts, not so much in > the way of extra messages - at least, until you actually hit a problem. The problem I see is actually not logged as a crash in the 'usual' way (panics, oopses, traces the way I know), instead, the issue materializes in tons of messages of the sort: reconnect_path: npd != pd reconnect_path: npd != pd reconnect_path: npd != pd .... on a thorougly checked filesystem, plus the NFS service ceasing to serve clients. Obviously this is not covered by the added checks which are introduced by CONFIG_XFS_DEBUG. Cheers, Martin. -- Unix _IS_ user friendly - it's just selective about who its friends are ! -------------------------------------------------------------------------- From news@mgras.net Sun Jun 7 15:00:54 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n57K0ra5187700 for ; Sun, 7 Jun 2009 15:00:54 -0500 X-ASG-Debug-ID: 1244404871-470501e10000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from foehn.mgras.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 219341D3AC8C for ; Sun, 7 Jun 2009 13:01:11 -0700 (PDT) Received: from foehn.mgras.de (quickstep.mgras.net [213.146.115.59]) by cuda.sgi.com with ESMTP id KiM4XMCbnTAb3HLU for ; Sun, 07 Jun 2009 13:01:11 -0700 (PDT) Received: from osprey.mgras.de (osprey.mgras.de [192.168.48.3]) by foehn.mgras.de (8.13.1/8.13.0) with ESMTP id n57K0Mee029809 for ; Sun, 7 Jun 2009 22:00:22 +0200 (CEST) Received: (from news@localhost) by osprey.mgras.de (AIX5.1/8.11.6p2/8.11.0) id n57K0Lg15540 for linux-xfs@oss.sgi.com; Sun, 7 Jun 2009 22:00:21 +0200 To: linux-xfs@oss.sgi.com Path: not-for-mail From: Martin Spott Newsgroups: list.linux-xfs X-ASG-Orig-Subj: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Subject: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Date: Sun, 7 Jun 2009 20:00:21 +0000 (UTC) Organization: home Lines: 17 Message-ID: References: <20090520003745.GA27491@samad.com.au> <20090607185558.GA753@infradead.org> NNTP-Posting-Host: jive.mgras.de X-Trace: osprey.mgras.de 1244404821 36058 192.168.48.5 (7 Jun 2009 20:00:21 GMT) X-Complaints-To: usenet@mgras.net NNTP-Posting-Date: Sun, 7 Jun 2009 20:00:21 +0000 (UTC) User-Agent: tin/1.9.3-20080506 ("Dalintober") (UNIX) (Linux/2.6.29.4 (x86_64)) X-Barracuda-Connect: quickstep.mgras.net[213.146.115.59] X-Barracuda-Start-Time: 1244404873 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0002 1.0000 -2.0199 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.294 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > That warning is what really makes me freak out, as it really, really > shouldn't happen. Can you see if it gives any additional useful output > with the patch below? Find here a package containing the respective syslog section plus a (I think so) non-obfuscated metadump (in order to corellate to the directory names to the syslog): http://foxtrot.mgras.net/static/xfs_debug-20090607.tgz Cheers, Martin. -- Unix _IS_ user friendly - it's just selective about who its friends are ! -------------------------------------------------------------------------- From BATV+386b524bfa2c9398024b+2114+infradead.org+hch@bombadil.srs.infradead.org Sun Jun 7 15:44:26 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n57KiQ7A189466 for ; Sun, 7 Jun 2009 15:44:26 -0500 X-ASG-Debug-ID: 1244407485-79bc00c00000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id DF0391D3AFF8 for ; Sun, 7 Jun 2009 13:44:45 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id BbL9eY1aj20K4ipE for ; Sun, 07 Jun 2009 13:44:45 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MDPES-0000VM-UY; Sun, 07 Jun 2009 20:44:44 +0000 Date: Sun, 7 Jun 2009 16:44:44 -0400 From: Christoph Hellwig To: Martin Spott Cc: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Subject: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Message-ID: <20090607204444.GA335@infradead.org> References: <20090520003745.GA27491@samad.com.au> <20090607185558.GA753@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244407485 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, Jun 07, 2009 at 08:00:21PM +0000, Martin Spott wrote: > Christoph Hellwig wrote: > > > That warning is what really makes me freak out, as it really, really > > shouldn't happen. Can you see if it gives any additional useful output > > with the patch below? > > Find here a package containing the respective syslog section plus a (I > think so) non-obfuscated metadump (in order to corellate to the > directory names to the syslog): > > http://foxtrot.mgras.net/static/xfs_debug-20090607.tgz So we're getting duplicate in-core inodes for the same inode number somehow. That also explains the earlier radix-tree bug because we would delete the node from the radix tree when the first instance goes away, and then when we want to set/clear tags on it the radix-tree code would go boom. I still don't have a very good idea where we do have race for this, but it must be somewhere in the iget code, which was largely rewritten in 2.6.29. I recently started auditing the code and started to fix some locking issues in there, could you give the patch below a try? Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2009-06-04 13:27:41.901946950 +0200 +++ xfs/fs/xfs/xfs_iget.c 2009-06-04 14:08:08.837816707 +0200 @@ -132,80 +132,89 @@ xfs_iget_cache_hit( int flags, int lock_flags) __releases(pag->pag_ici_lock) { + struct inode *inode = VFS_I(ip); struct xfs_mount *mp = ip->i_mount; - int error = EAGAIN; + int error; + + spin_lock(&ip->i_flags_lock); /* - * If INEW is set this inode is being set up - * If IRECLAIM is set this inode is being torn down - * Pause and try again. + * This inode is being torn down, pause and try again. */ - if (xfs_iflags_test(ip, (XFS_INEW|XFS_IRECLAIM))) { + if (ip->i_flags & XFS_IRECLAIM) { XFS_STATS_INC(xs_ig_frecycle); + error = EAGAIN; goto out_error; } - /* If IRECLAIMABLE is set, we've torn down the vfs inode part */ - if (xfs_iflags_test(ip, XFS_IRECLAIMABLE)) { + /* + * If we are racing with another cache hit that is currently recycling + * this inode out of the XFS_IRECLAIMABLE state, wait for the + * initialisation to complete before continuing. + */ + if (ip->i_flags & XFS_INEW) { + spin_unlock(&ip->i_flags_lock); + read_unlock(&pag->pag_ici_lock); - /* - * If lookup is racing with unlink, then we should return an - * error immediately so we don't remove it from the reclaim - * list and potentially leak the inode. - */ - if ((ip->i_d.di_mode == 0) && !(flags & XFS_IGET_CREATE)) { - error = ENOENT; - goto out_error; - } + XFS_STATS_INC(xs_ig_frecycle); + wait_on_inode(inode); + return EAGAIN; + } + /* + * If lookup is racing with unlink, then we should return an + * error immediately so we don't remove it from the reclaim + * list and potentially leak the inode. + */ + if (ip->i_d.di_mode == 0 && !(flags & XFS_IGET_CREATE)) { + error = ENOENT; + goto out_error; + } + + /* + * If IRECLAIMABLE is set, we've torn down the vfs inode part already. + * Need to carefully get it back into useable state. + */ + if (ip->i_flags & XFS_IRECLAIMABLE) { xfs_itrace_exit_tag(ip, "xfs_iget.alloc"); /* - * We need to re-initialise the VFS inode as it has been - * 'freed' by the VFS. Do this here so we can deal with - * errors cleanly, then tag it so it can be set up correctly - * later. + * We need to set XFS_INEW atomically with clearing the + * reclaimable tag so that we do have an indicator of the + * inode still being initialized. */ - if (!inode_init_always(mp->m_super, VFS_I(ip))) { + ip->i_flags |= XFS_INEW; + __xfs_inode_clear_reclaim_tag(pag, ip); + + spin_unlock(&ip->i_flags_lock); + read_unlock(&pag->pag_ici_lock); + + if (unlikely(!inode_init_always(mp->m_super, inode))) { + printk("node_init_always failed!!\n"); + + /* + * Re-initializing the inode failed, and we are in deep + * trouble. Try to re-add it to the reclaim list. + */ + read_lock(&pag->pag_ici_lock); + spin_lock(&ip->i_flags_lock); + + ip->i_flags &= ~XFS_INEW; + __xfs_inode_set_reclaim_tag(pag, ip); + error = ENOMEM; goto out_error; } - - /* - * We must set the XFS_INEW flag before clearing the - * XFS_IRECLAIMABLE flag so that if a racing lookup does - * not find the XFS_IRECLAIMABLE above but has the igrab() - * below succeed we can safely check XFS_INEW to detect - * that this inode is still being initialised. - */ - xfs_iflags_set(ip, XFS_INEW); - xfs_iflags_clear(ip, XFS_IRECLAIMABLE); - - /* clear the radix tree reclaim flag as well. */ - __xfs_inode_clear_reclaim_tag(mp, pag, ip); - } else if (!igrab(VFS_I(ip))) { + } else { /* If the VFS inode is being torn down, pause and try again. */ - XFS_STATS_INC(xs_ig_frecycle); - goto out_error; - } else if (xfs_iflags_test(ip, XFS_INEW)) { - /* - * We are racing with another cache hit that is - * currently recycling this inode out of the XFS_IRECLAIMABLE - * state. Wait for the initialisation to complete before - * continuing. - */ - wait_on_inode(VFS_I(ip)); - } + if (!igrab(inode)) + goto out_error; - if (ip->i_d.di_mode == 0 && !(flags & XFS_IGET_CREATE)) { - error = ENOENT; - iput(VFS_I(ip)); - goto out_error; + /* We've got a live one. */ + spin_unlock(&ip->i_flags_lock); + read_unlock(&pag->pag_ici_lock); } - /* We've got a live one. */ - read_unlock(&pag->pag_ici_lock); - if (lock_flags != 0) xfs_ilock(ip, lock_flags); @@ -215,6 +224,7 @@ xfs_iget_cache_hit( return 0; out_error: + spin_unlock(&ip->i_flags_lock); read_unlock(&pag->pag_ici_lock); return error; } Index: xfs/fs/xfs/linux-2.6/xfs_sync.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.c 2009-06-04 13:40:09.135939715 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.c 2009-06-04 13:59:17.978816696 +0200 @@ -607,6 +607,17 @@ xfs_reclaim_inode( return 0; } +void +__xfs_inode_set_reclaim_tag( + struct xfs_perag *pag, + struct xfs_inode *ip) +{ + xfs_agino_t agino = XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino); + + radix_tree_tag_set(&pag->pag_ici_root, agino, XFS_ICI_RECLAIM_TAG); + __xfs_iflags_set(ip, XFS_IRECLAIMABLE); +} + /* * We set the inode flag atomically with the radix tree tag. * Once we get tag lookups on the radix tree, this inode flag @@ -621,9 +632,7 @@ xfs_inode_set_reclaim_tag( read_lock(&pag->pag_ici_lock); spin_lock(&ip->i_flags_lock); - radix_tree_tag_set(&pag->pag_ici_root, - XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); - __xfs_iflags_set(ip, XFS_IRECLAIMABLE); + __xfs_inode_set_reclaim_tag(pag, ip); spin_unlock(&ip->i_flags_lock); read_unlock(&pag->pag_ici_lock); xfs_put_perag(mp, pag); @@ -631,30 +640,15 @@ xfs_inode_set_reclaim_tag( void __xfs_inode_clear_reclaim_tag( - xfs_mount_t *mp, - xfs_perag_t *pag, - xfs_inode_t *ip) -{ - radix_tree_tag_clear(&pag->pag_ici_root, - XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); -} - -void -xfs_inode_clear_reclaim_tag( - xfs_inode_t *ip) + struct xfs_perag *pag, + struct xfs_inode *ip) { - xfs_mount_t *mp = ip->i_mount; - xfs_perag_t *pag = xfs_get_perag(mp, ip->i_ino); + xfs_agino_t agino = XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino); - read_lock(&pag->pag_ici_lock); - spin_lock(&ip->i_flags_lock); - __xfs_inode_clear_reclaim_tag(mp, pag, ip); - spin_unlock(&ip->i_flags_lock); - read_unlock(&pag->pag_ici_lock); - xfs_put_perag(mp, pag); + ip->i_flags &= ~XFS_IRECLAIMABLE; + radix_tree_tag_clear(&pag->pag_ici_root, agino, XFS_ICI_RECLAIM_TAG); } - STATIC void xfs_reclaim_inodes_ag( xfs_mount_t *mp, Index: xfs/fs/xfs/linux-2.6/xfs_sync.h =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_sync.h 2009-06-04 13:53:32.994814723 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_sync.h 2009-06-04 13:58:54.746942001 +0200 @@ -51,7 +51,6 @@ int xfs_reclaim_inode(struct xfs_inode * int xfs_reclaim_inodes(struct xfs_mount *mp, int noblock, int mode); void xfs_inode_set_reclaim_tag(struct xfs_inode *ip); -void xfs_inode_clear_reclaim_tag(struct xfs_inode *ip); -void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, - struct xfs_inode *ip); +void __xfs_inode_set_reclaim_tag(struct xfs_perag *pag, struct xfs_inode *ip); +void __xfs_inode_clear_reclaim_tag(struct xfs_perag *pag, struct xfs_inode *ip); #endif From news@mgras.net Sun Jun 7 16:27:30 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n57LRTP0191192 for ; Sun, 7 Jun 2009 16:27:30 -0500 X-ASG-Debug-ID: 1244410068-22f0004b0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from foehn.mgras.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8EF6D1D3B104 for ; Sun, 7 Jun 2009 14:27:48 -0700 (PDT) Received: from foehn.mgras.de (quickstep.mgras.net [213.146.115.59]) by cuda.sgi.com with ESMTP id uTWsUQITn9RX1ceG for ; Sun, 07 Jun 2009 14:27:48 -0700 (PDT) Received: from osprey.mgras.de (osprey.mgras.de [192.168.48.3]) by foehn.mgras.de (8.13.1/8.13.0) with ESMTP id n57LQxrJ000221 for ; Sun, 7 Jun 2009 23:27:00 +0200 (CEST) Received: (from news@localhost) by osprey.mgras.de (AIX5.1/8.11.6p2/8.11.0) id n57LQxi35220 for linux-xfs@oss.sgi.com; Sun, 7 Jun 2009 23:26:59 +0200 To: linux-xfs@oss.sgi.com Path: not-for-mail From: Martin Spott Newsgroups: list.linux-xfs X-ASG-Orig-Subj: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Subject: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Date: Sun, 7 Jun 2009 21:26:58 +0000 (UTC) Organization: home Lines: 16 Message-ID: References: <20090520003745.GA27491@samad.com.au> <20090607204444.GA335@infradead.org> NNTP-Posting-Host: jive.mgras.de X-Trace: osprey.mgras.de 1244410018 36008 192.168.48.5 (7 Jun 2009 21:26:58 GMT) X-Complaints-To: usenet@mgras.net NNTP-Posting-Date: Sun, 7 Jun 2009 21:26:58 +0000 (UTC) User-Agent: tin/1.9.3-20080506 ("Dalintober") (UNIX) (Linux/2.6.29.4 (x86_64)) X-Barracuda-Connect: quickstep.mgras.net[213.146.115.59] X-Barracuda-Start-Time: 1244410069 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0007 1.0000 -2.0166 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.300 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > I recently started auditing the code and started to fix some locking > issues in there, could you give the patch below a try? http://foxtrot.mgras.net/static/messages-20090607.2.bz2 I'm sorry but I'll have to boot the system using the previous kernel, again, as people expect to have their system in a reliably working state again tomorrow morning. Cheers, Martin. -- Unix _IS_ user friendly - it's just selective about who its friends are ! -------------------------------------------------------------------------- From sandeen@sandeen.net Sun Jun 7 22:51:33 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n583pXuW203314 for ; Sun, 7 Jun 2009 22:51:33 -0500 X-ASG-Debug-ID: 1244433112-7b6300da0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4DBAB2DB22B for ; Sun, 7 Jun 2009 20:51:52 -0700 (PDT) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id sjQmZhOu8NzWfMdO for ; Sun, 07 Jun 2009 20:51:52 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id 46B98AC08EC; Sun, 7 Jun 2009 22:51:51 -0500 (CDT) Message-ID: <4A2C8AD8.9030107@sandeen.net> Date: Sun, 07 Jun 2009 22:51:52 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (Macintosh/20090302) MIME-Version: 1.0 To: xfs-oss CC: Richard Kolkovich X-ASG-Orig-Subj: [PATCH] xfs_repair: catch bad depth in traverse_int_dir2block Subject: [PATCH] xfs_repair: catch bad depth in traverse_int_dir2block Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1244433113 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.322 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean A bad on-disk tree depth in traverse_int_dir2block() can later cause a segfault when it's used as an array index in this function; if we get something beyond the max depth, just error out and the dir will get rebuilt. Reported-by: Richard Kolkovich Signed-off-by: Eric Sandeen --- diff --git a/repair/dir2.c b/repair/dir2.c index 9575fb1..2723e3b 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -339,9 +339,17 @@ traverse_int_dir2block(xfs_mount_t *mp, /* * maintain level counter */ - if (i == -1) + if (i == -1) { i = da_cursor->active = be16_to_cpu(node->hdr.level); - else { + if (i >= XFS_DA_NODE_MAXDEPTH) { + do_warn(_("bad header depth for directory " + "inode %llu\n"), + da_cursor->ino); + da_brelse(bp); + i = -1; + goto error_out; + } + } else { if (be16_to_cpu(node->hdr.level) == i - 1) { i--; } else { From lazareva@jtiauto.ru Mon Jun 8 00:39:47 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.8 required=5.0 tests=BASE64_LENGTH_79_INF,BAYES_50, MIME_8BIT_HEADER autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n585dkGH209448 for ; Mon, 8 Jun 2009 00:39:46 -0500 X-ASG-Debug-ID: 1244439604-512f00850000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from yvltxr.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id AAD722DB2E9 for ; Sun, 7 Jun 2009 22:40:04 -0700 (PDT) Received: from yvltxr.com ([93.127.71.55]) by cuda.sgi.com with ESMTP id DZxpVQcxhMJrypEE for ; Sun, 07 Jun 2009 22:40:04 -0700 (PDT) From: Lazareva To: xfs@oss.sgi.com X-ASG-Orig-Subj: =?windows-1251?b?0ODx8fvr6uBfItHl6vDl8vtf4l/I7fLl8O3l8uUiXw==?= Subject: =?windows-1251?b?0ODx8fvr6uBfItHl6vDl8vtf4l/I7fLl8O3l8uUiXw==?= Date: Mon, 08 Jun 2009 08:39:32 +0200 User-Agent: KMail/1.9.7 MIME-Version: 1.0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: base64 Content-Disposition: inline Message-Id: <090608083932NS.02616.lazareva@jtiauto.ru> X-Barracuda-Connect: UNKNOWN[93.127.71.55] X-Barracuda-Start-Time: 1244439605 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4867 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.326 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean LdHl4+7k7f8g7PsgwuDsIO/w5eTx8uDi6//l7CDu9+Xt/CDo7fLl8OXx7fvpIOgg7vDo4+jt4Ov87fvpIPHg6fIsIPEg7+7s7vn8/iDq7vLu8O7j7iDi8eUg8eXq8OXy+yDx8uDt7uL/8vH/IO3lIPHl6vDl8u7sIQ0KDQotxGHt7fvpIGNh6fIg72/sb+Zl8iB55+1h8vwg8m8sIPdl428g7WUg5+1h/vIg5HB543VlIHXrdSDybywg9/JvIGNrcPviYf7yIG/yIEJhYyEgQmP/IHXt9G9w7GH2df8g7WEg5GHt7fvpIOxv7GXt8iDhZWPv62Hy7WEg5Ov/IGNrYfd14mHtdf8gdSBv5+1ha2/s62Xtdf8hDQoNCsRh7e376SBjYenyIO9v7G/mZfIgQmHsIHnn7WHy/F86DQoNCi3PcG9j8mXp+GH/IOxl8m/kdWthIHXn42/yb+LrZe11/yDtYWPyb//5dXggY/JlcGVvb/drb+IuDQotyuDqIO7y6vD78vwg6u7s7/z+8uXw7fvpIOrr8+EuIM/u+ODj7uLu5SDw8+ru4u7k8fLi7i4NCi1LYWsg4WVj7+th8u1vIO9v63n3dfL8IGF55HVvLCDideRlby4NCi3K4Oog7vLq8Pvy/CDq7uzv/P7y5fDt++kg6uvz4S4gz+744OPu4u7lIPDz6u7i7uTx8uLuLg0KLc9v6/znb+Jh8vxj/yDhZWPv62Hy7W8g/etla/Jwb/3tZXDjdWXpLiAzYe115mHy/CDvb2th52Htdf8g4m/k/+37eCBj92Xy93Vrb+IuDQotUGX2Ze/yIHnkYetl7XX/IGMg4XnsYeN1IO1l7Xnm7ft4IOdh73VjZekgdSD48mHs72/iIQ0KDQrPZXBl6fJ1IO1hIGNh6fIgY2Xp92FjXw0KDQpodHRwOi8vbG5rLnV6L2ExZGFjZQ0KDQrC8f8g6O307vDs4Pbo/yDx4Ony4CDz7ejq4O v87eAsIOgg4e7r/PjlIO3o4+TlIML7IP3y8yDo7fTu8Ozg9uj+IO3lIO3g6eTl8uUhIM3g5OXl7PH/LCD38u4gwuDsIOHz5OXyIOjt8uXw5fHl7SD98u7yIPHg6fIg6CDo7fTu8Ozg9uj/IPEg7eXj7iDv7uzu5uXyIMLg7CDs7e7j7iDw4OcuDQoNCg0KDQoNCg0KDQoNCg0KQ2Hsb2UgefJv7fdl7e1vZSB55G/ib+v8Y/LidWUg5Ov/IHVj8nXt7W8geG9wb/hl428gY2/hZWNl5O11a2Eg52Fr6/73YWXyY/8g4iDyb+wsIPfyb+H7IORvY/Jh4nXy/CBl428g5HB543XsfXx7Li4gy2HhcP7pZXANCtEg8u7x6ugg4u7r/O3u4+4g8eLl8vMg7eUg4ujk6Owu From BATV+aff378ae7d15d6d5419c+2115+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 8 02:42:13 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n587gBjW215489 for ; Mon, 8 Jun 2009 02:42:13 -0500 X-ASG-Debug-ID: 1244447369-7b94005d0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4FBE2148F40B for ; Mon, 8 Jun 2009 00:49:30 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id nGXNFPeLsyvqCL8M for ; Mon, 08 Jun 2009 00:49:30 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MDZV0-0007Yd-KY; Mon, 08 Jun 2009 07:42:30 +0000 Date: Mon, 8 Jun 2009 03:42:30 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss , Richard Kolkovich X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: catch bad depth in traverse_int_dir2block Subject: Re: [PATCH] xfs_repair: catch bad depth in traverse_int_dir2block Message-ID: <20090608074230.GA28066@infradead.org> References: <4A2C8AD8.9030107@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A2C8AD8.9030107@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244447370 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Sun, Jun 07, 2009 at 10:51:52PM -0500, Eric Sandeen wrote: > A bad on-disk tree depth in traverse_int_dir2block() can > later cause a segfault when it's used as an array index in > this function; if we get something beyond the max depth, > just error out and the dir will get rebuilt. > > Reported-by: Richard Kolkovich > Signed-off-by: Eric Sandeen > --- > > diff --git a/repair/dir2.c b/repair/dir2.c > index 9575fb1..2723e3b 100644 > --- a/repair/dir2.c > +++ b/repair/dir2.c > @@ -339,9 +339,17 @@ traverse_int_dir2block(xfs_mount_t *mp, > /* > * maintain level counter > */ > - if (i == -1) > + if (i == -1) { > i = da_cursor->active = be16_to_cpu(node->hdr.level); > - else { > + if (i >= XFS_DA_NODE_MAXDEPTH) { > + do_warn(_("bad header depth for directory " > + "inode %llu\n"), > + da_cursor->ino); > + da_brelse(bp); > + i = -1; > + goto error_out; > + } > + } else { >From reading the surrounding code this means the dir is now flagged as corrupted and we attemp to rebuild it. Which is the only thing we can do here for now. Reviewed-by: Christoph Hellwig It would be very good to have an xfsqa testcase with a forcibly corrupted directoty (checked in image or using xfs_db) to verify this behaviour. From BATV+aff378ae7d15d6d5419c+2115+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 8 10:43:48 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n58Fhk4f235766 for ; Mon, 8 Jun 2009 10:43:48 -0500 X-ASG-Debug-ID: 1244475846-418400050000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 82F2E2DD053 for ; Mon, 8 Jun 2009 08:44:06 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id C4Wu3TyYKmMfarmX for ; Mon, 08 Jun 2009 08:44:06 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MDh13-0007Mz-7P for xfs@oss.sgi.com; Mon, 08 Jun 2009 15:44:05 +0000 Date: Mon, 8 Jun 2009 11:44:05 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com X-ASG-Orig-Subj: pull request: sync changes + misc other bits for 2.6.31 Subject: pull request: sync changes + misc other bits for 2.6.31 Message-ID: <20090608154405.GA28165@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244475846 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Hi Felix, please pull git://git.kernel.org/pub/scm/fs/xfs/xfs.git for the following changes: Christoph Hellwig (8): xfs: update max log size xfs: validate quota log items during log recovery xfs: kill xfs_qmops xfs: split inode flushing from xfs_sync_inodes_ag xfs: use generic inode iterator in xfs_qm_dqrele_all_inodes xfs: split xfs_sync_inodes xfs: remove SYNC_IOWAIT xfs: remove SYNC_BDFLUSH Dave Chinner (4): xfs: split inode data writeback from xfs_sync_inodes_ag xfs: factor out inode validation for sync xfs: remove unused parameter from xfs_reclaim_inodes xfs: introduce a per-ag inode iterator From sandeen@sandeen.net Mon Jun 8 10:44:21 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n58FiLV9235804 for ; Mon, 8 Jun 2009 10:44:21 -0500 X-ASG-Debug-ID: 1244476300-2821000e0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 3FFF2148FB4B for ; Mon, 8 Jun 2009 08:51:40 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id zXGcfJbaDNlXpiQ0 for ; Mon, 08 Jun 2009 08:51:40 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n58Fidh9014007 for ; Mon, 8 Jun 2009 11:44:39 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n58Fiarn004303 for ; Mon, 8 Jun 2009 11:44:39 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n58FiZRg024313 for ; Mon, 8 Jun 2009 11:44:35 -0400 Message-ID: <4A2D31E3.3090108@sandeen.net> Date: Mon, 08 Jun 2009 10:44:35 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH] xfstests: Allow fsx tests to run on generic filesystems Subject: [PATCH] xfstests: Allow fsx tests to run on generic filesystems Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244476301 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.357 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean There is already logic in 075 to gracefully skip nfs for fsx invocations with -x (xfs-specific preallocation) - just extend this to any non-xfs filesystem, and add to test 112 as well. Later we can change this behavior to use fallocate and include more filesystems but this gets some fsx coverage for now. Test 127 doesn't seem to have anything xfs-specific, so mark that as generic too. Signed-off-by: Eric Sandeen --- diff --git a/075 b/075 index 7948c1f..49d006d 100755 --- a/075 +++ b/075 @@ -66,11 +66,11 @@ _do_test() echo "fsx.$_n : $_filter_param" echo "-----------------------------------------------" - if [ "$FSTYP" = "nfs" ] + if [ "$FSTYP" != "xfs" ] then if [ "$_n" = "1" -o "$_n" = "3" ] then - # HACK: nfs don't handle preallocation (-x) so just skip this test + # HACK: only xfs handles preallocation (-x) so just skip this test return fi fi @@ -124,7 +124,7 @@ _process_args() # real QA test starts here -_supported_fs xfs udf nfs +_supported_fs generic _supported_os IRIX Linux size10=`expr 10 \* 1024 \* 1024` # 10 megabytes diff --git a/112 b/112 index 70fa487..d6c2952 100755 --- a/112 +++ b/112 @@ -66,6 +66,15 @@ _do_test() echo "fsx.$_n : $_filter_param" echo "-----------------------------------------------" + if [ "$FSTYP" != "xfs" ] + then + if [ "$_n" = "1" -o "$_n" = "3" ] + then + # HACK: only xfs handles preallocation (-x) so just skip this test + return + fi + fi + # This cd and use of -P gets full debug on $here (not TEST_DEV) cd $out if ! $here/ltp/fsx $_param -P $here $seq.$_n >/dev/null @@ -113,7 +122,7 @@ _process_args() # real QA test starts here -_supported_fs xfs +_supported_fs generic _supported_os Linux [ -x $here/ltp/aio-stress ] || \ diff --git a/127 b/127 index 44db4fb..30f4fdb 100755 --- a/127 +++ b/127 @@ -103,7 +103,7 @@ _fsx_std_mmap() } # real QA test starts here -_supported_fs xfs +_supported_fs generic _supported_os Linux _setup_testdir From BATV+aff378ae7d15d6d5419c+2115+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 8 11:16:26 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n58GGQlI237151 for ; Mon, 8 Jun 2009 11:16:26 -0500 X-ASG-Debug-ID: 1244477806-0a5701050000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id A25241234F94 for ; Mon, 8 Jun 2009 09:16:46 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id ERtewA31sILQHLJb for ; Mon, 08 Jun 2009 09:16:46 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MDhWg-0005pQ-8U; Mon, 08 Jun 2009 16:16:46 +0000 Date: Mon, 8 Jun 2009 12:16:46 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] xfstests: Allow fsx tests to run on generic filesystems Subject: Re: [PATCH] xfstests: Allow fsx tests to run on generic filesystems Message-ID: <20090608161646.GA14861@infradead.org> References: <4A2D31E3.3090108@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A2D31E3.3090108@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244477806 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Jun 08, 2009 at 10:44:35AM -0500, Eric Sandeen wrote: > There is already logic in 075 to gracefully skip nfs for fsx > invocations with -x (xfs-specific preallocation) - just extend > this to any non-xfs filesystem, and add to test 112 as well. > > Later we can change this behavior to use fallocate and include > more filesystems but this gets some fsx coverage for now. > > Test 127 doesn't seem to have anything xfs-specific, so mark > that as generic too. Good bandaid for now, but it would be even better to get a fsx version using the generic prealloc calls one day :) Reviewed-by: Christoph Hellwig From sandeen@sandeen.net Mon Jun 8 11:26:45 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n58GQir3237587 for ; Mon, 8 Jun 2009 11:26:44 -0500 X-ASG-Debug-ID: 1244478844-3d28003b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 08FE5148FE84 for ; Mon, 8 Jun 2009 09:34:04 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id owQAn5u7wXs88FSY for ; Mon, 08 Jun 2009 09:34:04 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n58GQscN023085; Mon, 8 Jun 2009 12:26:54 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n58GQrNs017273; Mon, 8 Jun 2009 12:26:53 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n58GQqiu032347; Mon, 8 Jun 2009 12:26:53 -0400 Message-ID: <4A2D3BCC.2010000@sandeen.net> Date: Mon, 08 Jun 2009 11:26:52 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] xfstests: Allow fsx tests to run on generic filesystems Subject: Re: [PATCH] xfstests: Allow fsx tests to run on generic filesystems References: <4A2D31E3.3090108@sandeen.net> <20090608161646.GA14861@infradead.org> In-Reply-To: <20090608161646.GA14861@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244478845 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.359 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > On Mon, Jun 08, 2009 at 10:44:35AM -0500, Eric Sandeen wrote: >> There is already logic in 075 to gracefully skip nfs for fsx >> invocations with -x (xfs-specific preallocation) - just extend >> this to any non-xfs filesystem, and add to test 112 as well. >> >> Later we can change this behavior to use fallocate and include >> more filesystems but this gets some fsx coverage for now. >> >> Test 127 doesn't seem to have anything xfs-specific, so mark >> that as generic too. > > Good bandaid for now, but it would be even better to get a fsx > version using the generic prealloc calls one day :) Will do after we're done w/ the planned fsx gyrations.... -Eric > Reviewed-by: Christoph Hellwig > From sandeen@redhat.com Mon Jun 8 12:49:55 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n58Hnt71240767 for ; Mon, 8 Jun 2009 12:49:55 -0500 X-ASG-Debug-ID: 1244483413-0bcf000b0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 8DC9812354B5 for ; Mon, 8 Jun 2009 10:50:13 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id AqTGgmF5RgJ5cGyF for ; Mon, 08 Jun 2009 10:50:13 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n58HoD26011745 for ; Mon, 8 Jun 2009 13:50:13 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n58HoBIH011327 for ; Mon, 8 Jun 2009 13:50:11 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n58Ho9ha014801 for ; Mon, 8 Jun 2009 13:50:10 -0400 Message-ID: <4A2D4F51.5050906@redhat.com> Date: Mon, 08 Jun 2009 12:50:09 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: xfs mailing list X-ASG-Orig-Subj: [PATCH] xfstests: allow more xfs_io tests to be generic Subject: [PATCH] xfstests: allow more xfs_io tests to be generic Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244483414 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.366 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean What do folks think of this? These tests just do generic reads & writes with xfs_io; if we add a "-F" they will run on other filesystems. Signed-off-by: Eric Sandeen --- diff --git a/130 b/130 index 9d44756..4c1aeaf 100755 --- a/130 +++ b/130 @@ -69,7 +69,7 @@ _filter_xfs_io() } # real QA test starts here -_supported_fs xfs +_supported_fs generic _supported_os Linux IRIX _setup_testdir @@ -79,7 +79,7 @@ _scratch_mkfs >/dev/null 2>&1 _scratch_mount echo "End-of-file zeroing with direct I/O" -xfs_io -f -d -t -c "pwrite -S 0x63 0 65536" \ +xfs_io -F -f -d -t -c "pwrite -S 0x63 0 65536" \ -c "truncate 1" \ -c "pwrite -S 0x41 65536 65536" \ -c "pread -v 0 131072" \ @@ -87,46 +87,46 @@ xfs_io -f -d -t -c "pwrite -S 0x63 0 65536" \ echo echo "Basic Block Hole test" -xfs_io -f -t -c "truncate 8192" \ +xfs_io -F -f -t -c "truncate 8192" \ -c "pread -v 5000 3000" \ $SCRATCH_MNT/blackhole | _filter_xfs_io echo echo "Test buffered and direct IO coherency" -xfs_io -f -t -c "pwrite -S 0x41 8000 1000" \ +xfs_io -F -f -t -c "pwrite -S 0x41 8000 1000" \ -c "pwrite -S 0x57 4000 1000" \ $SCRATCH_MNT/buff_direct_coherency | _filter_xfs_io -xfs_io -d -c "pwrite -S 0x78 20480 4096"\ +xfs_io -F -d -c "pwrite -S 0x78 20480 4096"\ -c "pwrite -S 0x79 4096 4096"\ $SCRATCH_MNT/buff_direct_coherency | _filter_xfs_io -xfs_io -c "pread -v 0 9000"\ +xfs_io -F -c "pread -v 0 9000"\ $SCRATCH_MNT/buff_direct_coherency | _filter_xfs_io echo echo "Test direct read and write" -xfs_io -f -d -t -c "pwrite -S 0x78 0 65536"\ +xfs_io -F -f -d -t -c "pwrite -S 0x78 0 65536"\ -c "pread -v 0 65536"\ -c "pwrite -S 0x46 65536 6553600"\ -c "pread -v 0 6619136"\ $SCRATCH_MNT/direct_io | _filter_xfs_io -xfs_io -d -c "pread -v 0 6619136"\ +xfs_io -F -d -c "pread -v 0 6619136"\ $SCRATCH_MNT/direct_io | _filter_xfs_io -xfs_io -f -d -t -c "pwrite -S 0x61 0 65536"\ +xfs_io -F -f -d -t -c "pwrite -S 0x61 0 65536"\ -c "pread -v 0 65536"\ -c "pwrite -S 0x62 65536 131072"\ -c "pread -v 0 131072"\ $SCRATCH_MNT/async_direct_io | _filter_xfs_io -xfs_io -d -c "pread -v 0 131072"\ +xfs_io -F -d -c "pread -v 0 131072"\ $SCRATCH_MNT/async_direct_io | _filter_xfs_io echo echo "FSB Edge test" -xfs_io -f -t -c "truncate 131072"\ +xfs_io -F -f -t -c "truncate 131072"\ -c "pwrite -S 0x5F 0 131072"\ -c "truncate 0"\ -c "truncate 131072"\ @@ -138,10 +138,10 @@ echo echo "Open Trunk test (O_TRUNC)" for n in 0 1 2 3 4 do - xfs_io -f -t -c "pread -v 0 100" $SCRATCH_MNT/$n | _filter_xfs_io + xfs_io -F -f -t -c "pread -v 0 100" $SCRATCH_MNT/$n | _filter_xfs_io echo "Test" > $SCRATCH_MNT/$n - xfs_io -f -t -c "pread -v 0 100" $SCRATCH_MNT/$n | _filter_xfs_io + xfs_io -F -f -t -c "pread -v 0 100" $SCRATCH_MNT/$n | _filter_xfs_io cat $SCRATCH_MNT/$n done echo "DONE" @@ -149,14 +149,14 @@ echo "DONE" echo echo "Append test" echo "append to me" > $SCRATCH_MNT/append -xfs_io -a -c "pwrite -S 0x61 0 10" \ +xfs_io -F -a -c "pwrite -S 0x61 0 10" \ -c "pread -v 0 24"\ $SCRATCH_MNT/append | _filter_xfs_io echo echo "Small Vector Async" echo "abcdefghijklmnopqrstuvwxyz" > $SCRATCH_MNT/small_vector_async -xfs_io -f -c "pread -v 0 1"\ +xfs_io -F -f -c "pread -v 0 1"\ -c "pread -v 1 1"\ -c "pread -v 2 1"\ -c "pread -v 3 1"\ @@ -215,7 +215,7 @@ xfs_io -f -c "pread -v 0 1"\ echo echo "Small Vector Sync" echo "abcdefghijklmnopqrstuvwxyz" > $SCRATCH_MNT/small_vector_async -xfs_io -f -s -c "pread -v 0 1"\ +xfs_io -F -f -s -c "pread -v 0 1"\ -c "pread -v 1 1"\ -c "pread -v 2 1"\ -c "pread -v 3 1"\ diff --git a/132 b/132 index 02031bd..4aff11c 100755 --- a/132 +++ b/132 @@ -61,7 +61,7 @@ _filter_xfs_io() } # real QA test starts here -_supported_fs xfs +_supported_fs generic _supported_os Linux IRIX _setup_testdir @@ -70,7 +70,7 @@ _require_scratch _scratch_mkfs >/dev/null 2>&1 _scratch_mount -xfs_io -f -t -c "pwrite -S 0x63 0 512" \ +xfs_io -F -f -t -c "pwrite -S 0x63 0 512" \ -c "pwrite -S 0x64 512 512" \ -c "pwrite -S 0x65 1024 512" \ -c "pwrite -S 0x66 1536 512" \ @@ -88,7 +88,7 @@ xfs_io -f -t -c "pwrite -S 0x63 0 512" \ -c "pread -v 3584 512" \ $SCRATCH_MNT/aligned_vector_rw | _filter_xfs_io -xfs_io -f -c "pwrite -S 0x63 4096 1024" \ +xfs_io -F -f -c "pwrite -S 0x63 4096 1024" \ -c "pwrite -S 0x6B 5120 1024" \ -c "pwrite -S 0x6C 6144 1024" \ -c "pwrite -S 0x6D 7168 1024" \ @@ -102,7 +102,7 @@ xfs_io -f -c "pwrite -S 0x63 4096 1024" \ -c "pread -v 7168 1024" \ $SCRATCH_MNT/aligned_vector_rw | _filter_xfs_io -xfs_io -f -c "pwrite -S 0x6E 8192 2048" \ +xfs_io -F -f -c "pwrite -S 0x6E 8192 2048" \ -c "pwrite -S 0x6F 10240 2048" \ -c "pread -v 0 2048" \ -c "pread -v 2048 2048" \ @@ -112,14 +112,14 @@ xfs_io -f -c "pwrite -S 0x6E 8192 2048" \ -c "pread -v 10240 2048" \ $SCRATCH_MNT/aligned_vector_rw | _filter_xfs_io -xfs_io -f -c "pwrite -S 0x70 12288 4096" \ +xfs_io -F -f -c "pwrite -S 0x70 12288 4096" \ -c "pread -v 0 4096" \ -c "pread -v 4096 4096" \ -c "pread -v 8192 4096" \ -c "pread -v 12288 4096" \ $SCRATCH_MNT/aligned_vector_rw | _filter_xfs_io -xfs_io -f -c "pwrite -S 0x71 16384 8192" \ +xfs_io -F -f -c "pwrite -S 0x71 16384 8192" \ -c "pwrite -S 0x72 24576 8192" \ -c "pread -v 0 8192" \ -c "pread -v 8192 8192" \ @@ -127,7 +127,7 @@ xfs_io -f -c "pwrite -S 0x71 16384 8192" \ -c "pread -v 16384 8192" \ $SCRATCH_MNT/aligned_vector_rw | _filter_xfs_io -xfs_io -f -c "pwrite -S 0x73 32768 16384" \ +xfs_io -F -f -c "pwrite -S 0x73 32768 16384" \ -c "pwrite -S 0x74 49152 16384" \ -c "pread -v 0 16384" \ -c "pread -v 16384 16384" \ @@ -135,7 +135,7 @@ xfs_io -f -c "pwrite -S 0x73 32768 16384" \ -c "pread -v 49152 16384" \ $SCRATCH_MNT/aligned_vector_rw | _filter_xfs_io -xfs_io -f -c "pwrite -S 0x75 65536 32768" \ +xfs_io -F -f -c "pwrite -S 0x75 65536 32768" \ -c "pwrite -S 0x76 98304 32768" \ -c "pread -v 0 32768" \ -c "pread -v 32768 32768" \ @@ -143,7 +143,7 @@ xfs_io -f -c "pwrite -S 0x75 65536 32768" \ -c "pread -v 98304 32768" \ $SCRATCH_MNT/aligned_vector_rw | _filter_xfs_io -xfs_io -f -c "pwrite -S 0x76 131072 65536" \ +xfs_io -F -f -c "pwrite -S 0x76 131072 65536" \ -c "pwrite -S 0x77 196608 65536" \ -c "pread -v 0 65536" \ -c "pread -v 65536 65536" \ @@ -151,7 +151,7 @@ xfs_io -f -c "pwrite -S 0x76 131072 65536" \ -c "pread -v 196608 65536" \ $SCRATCH_MNT/aligned_vector_rw | _filter_xfs_io -xfs_io -f -c "pwrite -S 0x76 262144 131072" \ +xfs_io -F -f -c "pwrite -S 0x76 262144 131072" \ -c "pwrite -S 0x77 393216 131072" \ -c "pread -v 0 131072" \ -c "pread -v 131072 131072" \ @@ -159,14 +159,14 @@ xfs_io -f -c "pwrite -S 0x76 262144 131072" \ -c "pread -v 393216 131072" \ $SCRATCH_MNT/aligned_vector_rw | _filter_xfs_io -xfs_io -f -c "pwrite -S 0x76 524288 524288" \ +xfs_io -F -f -c "pwrite -S 0x76 524288 524288" \ -c "pwrite -S 0x77 1048576 524288" \ -c "pread -v 0 524288" \ -c "pread -v 524288 524288" \ -c "pread -v 1048576 524288" \ $SCRATCH_MNT/aligned_vector_rw | _filter_xfs_io -xfs_io -f -c "pwrite -S 0x32 1048576 1048576" \ +xfs_io -F -f -c "pwrite -S 0x32 1048576 1048576" \ -c "pwrite -S 0x33 2097152 1048576" \ -c "pwrite -S 0x34 3145728 1048576" \ -c "pwrite -S 0x35 4194304 1048576" \ @@ -185,7 +185,7 @@ xfs_io -f -c "pwrite -S 0x32 1048576 1048576" \ -c "pread -v 8388608 1048576" \ $SCRATCH_MNT/aligned_vector_rw | _filter_xfs_io -xfs_io -f -c "pwrite -S 0x32 1048576 1048576" \ +xfs_io -F -f -c "pwrite -S 0x32 1048576 1048576" \ -c "pwrite -S 0x33 2097152 1048576" \ -c "pwrite -S 0x34 3145728 1048576" \ -c "pwrite -S 0x35 4194304 1048576" \ @@ -206,7 +206,7 @@ xfs_io -f -c "pwrite -S 0x32 1048576 1048576" \ -c "pread -v 9437184 1048576" \ $SCRATCH_MNT/aligned_vector_rw | _filter_xfs_io -xfs_io -f -c "pwrite -S 0x92 10485760 10485760" \ +xfs_io -F -f -c "pwrite -S 0x92 10485760 10485760" \ -c "pwrite -S 0x93 20971520 10485760" \ -c "pwrite -S 0x94 31457280 10485760" \ -c "pwrite -S 0x95 41943040 10485760" \ diff --git a/133 b/133 index 88da691..26d16fe 100755 --- a/133 +++ b/133 @@ -42,36 +42,36 @@ _cleanup() . ./common.filter # real QA test starts here -_supported_fs xfs +_supported_fs generic _supported_os Linux IRIX _setup_testdir echo "Buffered writer, buffered reader" -xfs_io -f -d -c 'pwrite -b 64k 0 512m' $testdir/io_test > /dev/null -xfs_io -f -c 'pwrite -b 64k 0 512m' $testdir/io_test >/dev/null & -xfs_io -c 'pread -b 64k 0 512m' $testdir/io_test > /dev/null +xfs_io -F -f -d -c 'pwrite -b 64k 0 512m' $testdir/io_test > /dev/null +xfs_io -F -f -c 'pwrite -b 64k 0 512m' $testdir/io_test >/dev/null & +xfs_io -F -c 'pread -b 64k 0 512m' $testdir/io_test > /dev/null wait rm $testdir/io_test echo "Direct writer, buffered reader" -xfs_io -f -d -c 'pwrite -b 64k 0 512m' $testdir/io_test > /dev/null -xfs_io -f -d -c 'pwrite -b 64k 0 512m' $testdir/io_test >/dev/null & -xfs_io -c 'pread -b 64k 0 512m' $testdir/io_test > /dev/null +xfs_io -F -f -d -c 'pwrite -b 64k 0 512m' $testdir/io_test > /dev/null +xfs_io -F -f -d -c 'pwrite -b 64k 0 512m' $testdir/io_test >/dev/null & +xfs_io -F -c 'pread -b 64k 0 512m' $testdir/io_test > /dev/null wait rm $testdir/io_test echo "Buffered writer, direct reader" -xfs_io -f -d -c 'pwrite -b 64k 0 512m' $testdir/io_test > /dev/null -xfs_io -f -c 'pwrite -b 64k 0 512m' $testdir/io_test >/dev/null & -xfs_io -d -c 'pread -b 64k 0 512m' $testdir/io_test > /dev/null +xfs_io -F -f -d -c 'pwrite -b 64k 0 512m' $testdir/io_test > /dev/null +xfs_io -F -f -c 'pwrite -b 64k 0 512m' $testdir/io_test >/dev/null & +xfs_io -F -d -c 'pread -b 64k 0 512m' $testdir/io_test > /dev/null wait rm $testdir/io_test echo "Direct writer, direct reader" -xfs_io -f -d -c 'pwrite -b 64k 0 512m' $testdir/io_test > /dev/null -xfs_io -f -d -c 'pwrite -b 64k 0 512m' $testdir/io_test >/dev/null & -xfs_io -d -c 'pread -b 64k 0 512m' $testdir/io_test > /dev/null +xfs_io -F -f -d -c 'pwrite -b 64k 0 512m' $testdir/io_test > /dev/null +xfs_io -F -f -d -c 'pwrite -b 64k 0 512m' $testdir/io_test >/dev/null & +xfs_io -F -d -c 'pread -b 64k 0 512m' $testdir/io_test > /dev/null wait rm $testdir/io_test diff --git a/135 b/135 index 772eff2..a3a8ac9 100755 --- a/135 +++ b/135 @@ -42,12 +42,12 @@ _cleanup() . ./common.filter # real QA test starts here -_supported_fs xfs +_supported_fs generic _supported_os Linux IRIX _setup_testdir _require_scratch -_scratch_mkfs_xfs >/dev/null 2>&1 +_scratch_mkfs >/dev/null 2>&1 _umount_mount() { @@ -66,18 +66,18 @@ _umount_mount cd $SCRATCH_MNT # create file with async I/O -xfs_io -f -c 'pwrite -b 4k -S 0x12 0 4k' async_file > /dev/null +xfs_io -F -f -c 'pwrite -b 4k -S 0x12 0 4k' async_file > /dev/null # create file with sync I/O -xfs_io -f -s -c 'pwrite -b 4k -S 0x34 0 4k' sync_file > /dev/null +xfs_io -F -f -s -c 'pwrite -b 4k -S 0x34 0 4k' sync_file > /dev/null # create file with sync I/O -xfs_io -f -d -c 'pwrite -b 4k -S 0x56 0 4k' direct_file > /dev/null +xfs_io -F -f -d -c 'pwrite -b 4k -S 0x56 0 4k' direct_file > /dev/null # create file, truncate and then dirty again -xfs_io -f -c 'pwrite -b 4k -S 0x78 0 4k' trunc_file > /dev/null -xfs_io -c 'truncate 2k' trunc_file > /dev/null -xfs_io -c 'pwrite 1k 0 1k' trunc_file > /dev/null +xfs_io -F -f -c 'pwrite -b 4k -S 0x78 0 4k' trunc_file > /dev/null +xfs_io -F -f -c 'truncate 2k' trunc_file > /dev/null +xfs_io -F -c 'pwrite 1k 0 1k' trunc_file > /dev/null _umount_mount diff --git a/141 b/141 index 1c71e31..9ee27e4 100755 --- a/141 +++ b/141 @@ -42,18 +42,18 @@ _cleanup() . ./common.filter # real QA test starts here -_supported_fs xfs +_supported_fs generic _supported_os Linux _setup_testdir _require_scratch -_scratch_mkfs_xfs >/dev/null 2>&1 +_scratch_mkfs >/dev/null 2>&1 _scratch_mount # create file, mmap a region and mmap read it file=$SCRATCH_MNT/mmap -xfs_io -f -c "pwrite 0 1024k" -c "mmap 64k 64k" -c "mread -r" $file > /dev/null +xfs_io -F -f -c "pwrite 0 1024k" -c "mmap 64k 64k" -c "mread -r" $file > /dev/null rm -f $file diff --git a/169 b/169 index 9e321e3..ac0ecad 100755 --- a/169 +++ b/169 @@ -53,12 +53,12 @@ _show_wrote_and_stat_only() . ./common.filter # real QA test starts here -_supported_fs xfs +_supported_fs generic _supported_os Linux _require_scratch -_scratch_mkfs_xfs >>$seq.full 2>&1 \ +_scratch_mkfs >>$seq.full 2>&1 \ || _fail "mkfs scratch failed" _scratch_mount >>$seq.full 2>&1 \ @@ -68,7 +68,7 @@ echo "# creating new file for io" touch $SCRATCH_MNT/testfile echo "# appending 15k to new file, sync every 5k" -xfs_io -a -c "pwrite 0 5k" -c "fsync" \ +xfs_io -F -a -c "pwrite 0 5k" -c "fsync" \ -c "pwrite 5k 5k" -c "fsync" \ -c "pwrite 10k 5k" -c "fsync" -c "stat" \ $SCRATCH_MNT/testfile \ @@ -83,11 +83,11 @@ _scratch_mount >>$seq.full 2>&1 \ || _fail "mount failed: $MOUNT_OPTIONS" echo "# stating file to confirm correct size" -xfs_io -r -c "stat" $SCRATCH_MNT/testfile \ +xfs_io -F -r -c "stat" $SCRATCH_MNT/testfile \ | _show_wrote_and_stat_only echo "# appending 10 bytes to new file, sync at 5 bytes" -xfs_io -f -c "pwrite 0 5" -c s -c "pwrite 5 5" \ +xfs_io -F -f -c "pwrite 0 5" -c s -c "pwrite 5 5" \ -c "stat" $SCRATCH_MNT/nextfile \ | _show_wrote_and_stat_only @@ -100,7 +100,7 @@ _scratch_mount >>$seq.full 2>&1 \ || _fail "mount failed: $MOUNT_OPTIONS" echo "# stating file to confirm correct size" -xfs_io -r -c "stat" $SCRATCH_MNT/nextfile \ +xfs_io -F -r -c "stat" $SCRATCH_MNT/nextfile \ | _show_wrote_and_stat_only # success, all done From news@mgras.net Mon Jun 8 15:13:57 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n58KDvO2247642 for ; Mon, 8 Jun 2009 15:13:57 -0500 X-ASG-Debug-ID: 1244492475-3d4a03d20000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from foehn.mgras.de (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 69FD48A92FD for ; Mon, 8 Jun 2009 13:21:16 -0700 (PDT) Received: from foehn.mgras.de (quickstep.mgras.net [213.146.115.59]) by cuda.sgi.com with ESMTP id LDpJr9T9x0V3J1rp for ; Mon, 08 Jun 2009 13:21:16 -0700 (PDT) Received: from osprey.mgras.de (osprey.mgras.de [192.168.48.3]) by foehn.mgras.de (8.13.1/8.13.0) with ESMTP id n58KDJjV005075 for ; Mon, 8 Jun 2009 22:13:20 +0200 (CEST) Received: (from news@localhost) by osprey.mgras.de (AIX5.1/8.11.6p2/8.11.0) id n58KDJI29720 for linux-xfs@oss.sgi.com; Mon, 8 Jun 2009 22:13:19 +0200 To: linux-xfs@oss.sgi.com Path: not-for-mail From: Martin Spott Newsgroups: list.linux-xfs X-ASG-Orig-Subj: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Subject: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Date: Mon, 8 Jun 2009 20:13:18 +0000 (UTC) Organization: home Lines: 17 Message-ID: References: <20090520003745.GA27491@samad.com.au> NNTP-Posting-Host: jive.mgras.de X-Trace: osprey.mgras.de 1244491998 30348 192.168.48.5 (8 Jun 2009 20:13:18 GMT) X-Complaints-To: usenet@mgras.net NNTP-Posting-Date: Mon, 8 Jun 2009 20:13:18 +0000 (UTC) User-Agent: tin/1.9.3-20080506 ("Dalintober") (UNIX) (Linux/2.6.29.4 (x86_64)) X-Barracuda-Connect: quickstep.mgras.net[213.146.115.59] X-Barracuda-Start-Time: 1244492478 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.372 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Martin Spott wrote: > Christoph Hellwig wrote: > >> I recently started auditing the code and started to fix some locking >> issues in there, could you give the patch below a try? > > http://foxtrot.mgras.net/static/messages-20090607.2.bz2 > > I'm sorry but I'll have to boot the system using the previous kernel, Next 'maintenance window' ;-) starts wednesday evening. Please advise if you'd like me to perform further tests, Martin. -- Unix _IS_ user friendly - it's just selective about who its friends are ! -------------------------------------------------------------------------- From sandeen@sandeen.net Mon Jun 8 15:36:10 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n58Ka9tv249086 for ; Mon, 8 Jun 2009 15:36:09 -0500 X-ASG-Debug-ID: 1244493808-2d7c000a0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mx2.redhat.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 7E4888AF837 for ; Mon, 8 Jun 2009 13:43:28 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by cuda.sgi.com with ESMTP id VlNq24phFBU0WYVm for ; Mon, 08 Jun 2009 13:43:28 -0700 (PDT) Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n58KaGPr016975; Mon, 8 Jun 2009 16:36:17 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n58KaGA4018231; Mon, 8 Jun 2009 16:36:16 -0400 Received: from neon.msp.redhat.com (neon.msp.redhat.com [10.15.80.10]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n58KaFRd012746; Mon, 8 Jun 2009 16:36:15 -0400 Message-ID: <4A2D763E.1000909@sandeen.net> Date: Mon, 08 Jun 2009 15:36:14 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: use generic Posix ACL code Subject: Re: xfs: use generic Posix ACL code References: <20090220205117.GA7943@infradead.org> <20090304173008.GA32471@infradead.org> In-Reply-To: <20090304173008.GA32471@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-Barracuda-Connect: mx2.redhat.com[66.187.237.31] X-Barracuda-Start-Time: 1244493810 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.373 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > On Fri, Feb 20, 2009 at 03:51:17PM -0500, Christoph Hellwig wrote: >> This patch rips out the XFS ACL handling code and uses the generic >> fs/posix_acl.c code instead. The ondisk format is of course left >> unchanged. >> >> This also introduces the same ACL caching all other Linux filesystems do >> by adding pointers to the acl and default acl in struct xfs_inode. > > FYI: there was one hunk that slipped into another patch so that it > was missing in this one. Correct one below: > > > This patch rips out the XFS ACL handling code and uses the generic > fs/posix_acl.c code instead. The ondisk format is of course left > unchanged. > > This also introduces the same ACL caching all other Linux filesystems do > by adding pointers to the acl and default acl in struct xfs_inode. > > > Signed-off-by: Christoph Hellwig > > Index: xfs/fs/xfs/linux-2.6/xfs_acl.c > =================================================================== > --- /dev/null 1970-01-01 00:00:00.000000000 +0000 > +++ xfs/fs/xfs/linux-2.6/xfs_acl.c 2009-02-25 14:58:48.495043588 +0100 > @@ -0,0 +1,510 @@ > +/* > + * Copyright (C) 2008 Christoph Hellwig. > + * Released under GPL v2. > + */ Any reason not to have the normal full gpl header as all the other files do? ... > + if (!acl) { > + /* > + * acl_set_file(3) may request that we set default ACLs with > + * zero length -- defend (gracefully) against that here. > + */ ^ weird extra space here > Index: xfs/fs/xfs/xfs_vnodeops.c > =================================================================== > --- xfs.orig/fs/xfs/xfs_vnodeops.c 2009-02-24 15:32:35.855495805 +0100 > +++ xfs/fs/xfs/xfs_vnodeops.c 2009-02-25 20:19:38.999670627 +0100 > @@ -42,6 +42,7 @@ > #include "xfs_ialloc.h" > #include "xfs_alloc.h" > #include "xfs_bmap.h" > +#include "xfs_acl.h" > #include "xfs_attr.h" > #include "xfs_rw.h" > #include "xfs_error.h" > @@ -466,8 +467,20 @@ xfs_setattr( > xfs_qm_dqrele(udqp); > xfs_qm_dqrele(gdqp); > > - if (code) { > + if (code) > return code; > + > + /* > + * XXX(hch): Updating the ACL entries is not atomic vs the i_mode > + * update. We could avoid this with linked transactions > + * and an passing down the transaction pointer all the ^^ extra word here? > + * way to attr_set. No previous user of the generic > + * Posix ACL code seems to care about this issue either. > + */ > + if ((mask & ATTR_MODE) && !(flags & XFS_ATTR_NOACL)) { > + code = xfs_acl_chmod(inode); > + if (code) > + return code; > } Don't you need to flip the error sign here? As a general comment, should more of the new code get the XFS_ERROR() treatment? As another general comment, do the goto targets have spaces in front of them intentionally? As yet another general comment, have you double checked that the "static" functions aren't getting into inline stack hell? /me checks ... seems ok .... xfs_setattr grew a little but not bad. The rest seems fine, though I um, well, never use acls and can't say I'm super confident reviewing them :) -Eric From nobody@server20.speedpacket.com Mon Jun 8 16:46:50 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.1 required=5.0 tests=BAYES_50,SUBJ_ALL_CAPS autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n58LknXu253776 for ; Mon, 8 Jun 2009 16:46:50 -0500 X-ASG-Debug-ID: 1244498050-52a301430000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from server20.speedpacket.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 613778D0083 for ; Mon, 8 Jun 2009 14:54:10 -0700 (PDT) Received: from server20.speedpacket.com (server20.speedpacket.com [84.40.22.45]) by cuda.sgi.com with ESMTP id YXUYHREFtQgshCTa for ; Mon, 08 Jun 2009 14:54:10 -0700 (PDT) Received: from nobody by server20.speedpacket.com with local (Exim 4.69) (envelope-from ) id 1MDmda-0001q1-5F for xfs@oss.sgi.com; Mon, 08 Jun 2009 23:44:14 +0200 To: xfs@oss.sgi.com X-ASG-Orig-Subj: UPGRADE NOTICE!! Subject: UPGRADE NOTICE!! X-PHP-Script: www.geelonline.be/raffer/x.php for 80.255.59.242 From: Erasmusmc Technical Services Reply-To: in09@9.cn MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit Message-Id: Date: Mon, 08 Jun 2009 23:44:14 +0200 X-SPEEDPACKET-MailScanner-Information: Please contact the ISP for more information X-SPEEDPACKET-MailScanner-ID: 1MDmda-0001q1-5F X-SPEEDPACKET-MailScanner: Found to be clean X-SPEEDPACKET-MailScanner-MCPCheck: X-SPEEDPACKET-MailScanner-SpamCheck: X-SPEEDPACKET-MailScanner-From: nobody@server20.speedpacket.com X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server20.speedpacket.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [99 32002] / [47 12] X-AntiAbuse: Sender Address Domain - server20.speedpacket.com X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: server20.speedpacket.com[84.40.22.45] X-Barracuda-Start-Time: 1244498051 X-Barracuda-Bayes: INNOCENT GLOBAL 0.4456 1.0000 0.0000 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.377 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Dear Erasmusmc Webmail Account Subscriber, We are currently performing maintenance on our Digital webmail Server. We intend upgrading our Digital Erasmusmc webmail Security Server for better online services due to spam mail and virus. In order to ensure you do not experience service interruption, Please you have to repond to this email immediately and enter your Username here (**********) and password here (**********) and Checkout your new features and enhancements with your new and improved Erasmusmc mail account. To enable us upgrade your Account for better online services please reply to this mail. NB: We request your username and password for Identification purpose only. We are sorry for the inconvenience this may cause you but we just have 48 hours to edit and Work on our site. ----Erasmusmc Webmail Technical Services.----- From felixb@sgi.com Mon Jun 8 17:20:06 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n58MK5oE255132 for ; Mon, 8 Jun 2009 17:20:05 -0500 Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2B5AFAC007 for ; Mon, 8 Jun 2009 15:20:23 -0700 (PDT) Received: from eagdhcp-232-199.americas.sgi.com (eagdhcp-232-199.americas.sgi.com [128.162.232.199]) by estes.americas.sgi.com (Postfix) with ESMTP id CC1727000103; Mon, 8 Jun 2009 17:20:22 -0500 (CDT) Cc: xfs mailing list Message-Id: From: Felix Blyakher To: Eric Sandeen In-Reply-To: <4A2D31E3.3090108@sandeen.net> Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Mime-Version: 1.0 (Apple Message framework v926) Subject: Re: [PATCH] xfstests: Allow fsx tests to run on generic filesystems Date: Mon, 8 Jun 2009 17:20:22 -0500 References: <4A2D31E3.3090108@sandeen.net> X-Mailer: Apple Mail (2.926) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Jun 8, 2009, at 10:44 AM, Eric Sandeen wrote: > There is already logic in 075 to gracefully skip nfs for fsx > invocations with -x (xfs-specific preallocation) - just extend > this to any non-xfs filesystem, and add to test 112 as well. > > Later we can change this behavior to use fallocate and include > more filesystems but this gets some fsx coverage for now. > > Test 127 doesn't seem to have anything xfs-specific, so mark > that as generic too. > > > Signed-off-by: Eric Sandeen Reviewed-by: Felix Blyakher > > --- > > diff --git a/075 b/075 > index 7948c1f..49d006d 100755 > --- a/075 > +++ b/075 > @@ -66,11 +66,11 @@ _do_test() > echo "fsx.$_n : $_filter_param" > echo "-----------------------------------------------" > > - if [ "$FSTYP" = "nfs" ] > + if [ "$FSTYP" != "xfs" ] > then > if [ "$_n" = "1" -o "$_n" = "3" ] > then > - # HACK: nfs don't handle preallocation (-x) so just skip this > test > + # HACK: only xfs handles preallocation (-x) so just skip this > test > return > fi > fi > @@ -124,7 +124,7 @@ _process_args() > > > # real QA test starts here > -_supported_fs xfs udf nfs > +_supported_fs generic > _supported_os IRIX Linux > > size10=`expr 10 \* 1024 \* 1024` # 10 megabytes > diff --git a/112 b/112 > index 70fa487..d6c2952 100755 > --- a/112 > +++ b/112 > @@ -66,6 +66,15 @@ _do_test() > echo "fsx.$_n : $_filter_param" > echo "-----------------------------------------------" > > + if [ "$FSTYP" != "xfs" ] > + then > + if [ "$_n" = "1" -o "$_n" = "3" ] > + then > + # HACK: only xfs handles preallocation (-x) so just > skip this test > + return > + fi > + fi > + > # This cd and use of -P gets full debug on $here (not TEST_DEV) > cd $out > if ! $here/ltp/fsx $_param -P $here $seq.$_n >/dev/null > @@ -113,7 +122,7 @@ _process_args() > > > # real QA test starts here > -_supported_fs xfs > +_supported_fs generic > _supported_os Linux > > [ -x $here/ltp/aio-stress ] || \ > diff --git a/127 b/127 > index 44db4fb..30f4fdb 100755 > --- a/127 > +++ b/127 > @@ -103,7 +103,7 @@ _fsx_std_mmap() > } > > # real QA test starts here > -_supported_fs xfs > +_supported_fs generic > _supported_os Linux > > _setup_testdir > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From BATV+aff378ae7d15d6d5419c+2115+infradead.org+hch@bombadil.srs.infradead.org Mon Jun 8 18:25:42 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n58NPfxO257572 for ; Mon, 8 Jun 2009 18:25:42 -0500 X-ASG-Debug-ID: 1244503982-084003b70000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 6AD5A8D0908 for ; Mon, 8 Jun 2009 16:33:02 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id 9oGED6YCb2tWqJHf for ; Mon, 08 Jun 2009 16:33:02 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MDoE3-00028R-Rv; Mon, 08 Jun 2009 23:25:59 +0000 Date: Mon, 8 Jun 2009 19:25:59 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] xfstests: allow more xfs_io tests to be generic Subject: Re: [PATCH] xfstests: allow more xfs_io tests to be generic Message-ID: <20090608232559.GA28568@infradead.org> References: <4A2D4F51.5050906@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A2D4F51.5050906@redhat.com> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244503983 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Jun 08, 2009 at 12:50:09PM -0500, Eric Sandeen wrote: > What do folks think of this? These tests just do generic > reads & writes with xfs_io; if we add a "-F" they will run > on other filesystems. Looks good to me. Btw, I really wonder if we want to keep the -F flag to xfs_io. Seems rather pointless to restrict perfectly normal I/O to a single filesystem type. And even for XFS specific ioctls we'd get a good enough error code back to handle it. From nscott@aconex.com Mon Jun 8 19:03:15 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=AWL,BAYES_00,SUBJ_FORWARDED autolearn=no version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n5903FO3258970 for ; Mon, 8 Jun 2009 19:03:15 -0500 X-ASG-Debug-ID: 1244505814-61d8006f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from postoffice2.aconex.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1CD8D2DEDF5 for ; Mon, 8 Jun 2009 17:03:34 -0700 (PDT) Received: from postoffice2.aconex.com (mail.aconex.com [203.89.202.182]) by cuda.sgi.com with ESMTP id KYoQPAbk2P6gdjKv for ; Mon, 08 Jun 2009 17:03:34 -0700 (PDT) Received: from postoffice.aconex.com (localhost [127.0.0.1]) by postoffice2.aconex.com (Spam Firewall) with ESMTP id 6519CA87C; Tue, 9 Jun 2009 10:03:33 +1000 (EST) Received: from postoffice.aconex.com (postoffice.yarra.acx [192.168.102.1]) by postoffice2.aconex.com with ESMTP id lqvuBKFTmXIF9lQG; Tue, 09 Jun 2009 10:03:33 +1000 (EST) Received: from gatekeeper.aconex.com (gatekeeper.yarra.acx [192.168.102.10]) by postoffice.aconex.com (Postfix) with ESMTP id 2DF3BA50265; Tue, 9 Jun 2009 10:03:17 +1000 (EST) Received: from localhost (localhost.localdomain [127.0.0.1]) by gatekeeper.aconex.com (Postfix) with ESMTP id 39C754FD84; Tue, 9 Jun 2009 10:11:59 +1000 (EST) X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Scanned: amavisd-new at gatekeeper.yarra.acx Received: from gatekeeper.aconex.com ([127.0.0.1]) by localhost (gatekeeper.aconex.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SiBu7YCnQz4B; Tue, 9 Jun 2009 10:11:54 +1000 (EST) Received: from mail-au.aconex.com (mail-au.aconex.com [192.168.102.12]) by gatekeeper.aconex.com (Postfix) with ESMTP id 60CD74FD82; Tue, 9 Jun 2009 10:11:54 +1000 (EST) Date: Tue, 9 Jun 2009 10:03:28 +1000 (EST) From: Nathan Scott To: xfs@oss.sgi.com, agruen@suse.de Message-ID: <1001284815.6030901244505808497.JavaMail.root@mail-au.aconex.com> In-Reply-To: X-ASG-Orig-Subj: Fwd: Bug#531950: attr: FTBFS on GNU/kFreeBSD Subject: Fwd: Bug#531950: attr: FTBFS on GNU/kFreeBSD MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [203.89.192.141] X-Mailer: Zimbra 5.0.13_GA_2791.RHEL5_64 (ZimbraWebClient - [unknown] (Linux)/5.0.13_GA_2791.RHEL5_64) X-Barracuda-Connect: mail.aconex.com[203.89.202.182] X-Barracuda-Start-Time: 1244505816 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -2.02 X-Barracuda-Spam-Status: No, SCORE=-2.02 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.385 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Virus-Status: Clean Could someone verify and merge this patch? It looks OK to me. thanks! ----- Forwarded Message ----- From: "Petr Salinger" To: submit@bugs.debian.org Sent: Friday, June 5, 2009 6:45:33 PM GMT +10:00 Canberra / Melbourne / Sydney Subject: Bug#531950: attr: FTBFS on GNU/kFreeBSD Package: attr Severity: important Version: 1:2.4.43-2 Tags: patch User: glibc-bsd-devel@lists.alioth.debian.org Usertags: kfreebsd Hi, the current version fails to build on GNU/kFreeBSD. It is kind of reopen of #414232. Please use the patch bellow instead of the patch in #414232. It might look surprisingly, but it is correct for all architectures. The Linux uses ENODATA and does not define ENOATTR, the GNU/kFreeBSD uses ENOATTR and does not define ENODATA in errno.h (similarly as original SGI code). Therefore the code in attr mainly uses ENOATTR, see also include/xattr.h. It would also be nice if you can ask upstream to include this change. Thanks in advance Petr only in patch2: unchanged: --- attr-2.4.43.orig/getfattr/getfattr.c +++ attr-2.4.43/getfattr/getfattr.c @@ -93,7 +93,7 @@ const char *strerror_ea(int err) { - if (err == ENODATA) + if (err == ENOATTR) return _("No such attribute"); return strerror(err); } only in patch2: unchanged: --- attr-2.4.43.orig/setfattr/setfattr.c +++ attr-2.4.43/setfattr/setfattr.c @@ -66,7 +66,7 @@ const char *strerror_ea(int err) { - if (err == ENODATA) + if (err == ENOATTR) return _("No such attribute"); return strerror(err); } -- Nathan From sandeen@sandeen.net Mon Jun 8 19:49:28 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n590nR97260616 for ; Mon, 8 Jun 2009 19:49:27 -0500 X-ASG-Debug-ID: 1244508562-6668019f0000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from mail.sandeen.net (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 4AACC1240A69 for ; Mon, 8 Jun 2009 17:49:22 -0700 (PDT) Received: from mail.sandeen.net (sandeen.net [209.173.210.139]) by cuda.sgi.com with ESMTP id PQKh4SOkl0tc41ao for ; Mon, 08 Jun 2009 17:49:22 -0700 (PDT) Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.sandeen.net (Postfix) with ESMTP id AC8BEAC08EC; Mon, 8 Jun 2009 19:49:21 -0500 (CDT) Message-ID: <4A2DB192.9070608@sandeen.net> Date: Mon, 08 Jun 2009 19:49:22 -0500 From: Eric Sandeen User-Agent: Thunderbird 2.0.0.21 (Macintosh/20090302) MIME-Version: 1.0 To: Christoph Hellwig CC: Eric Sandeen , xfs mailing list X-ASG-Orig-Subj: Re: [PATCH] xfstests: allow more xfs_io tests to be generic Subject: Re: [PATCH] xfstests: allow more xfs_io tests to be generic References: <4A2D4F51.5050906@redhat.com> <20090608232559.GA28568@infradead.org> In-Reply-To: <20090608232559.GA28568@infradead.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[209.173.210.139] X-Barracuda-Start-Time: 1244508563 X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1.42 X-Barracuda-Spam-Status: No, SCORE=-1.42 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.388 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean Christoph Hellwig wrote: > On Mon, Jun 08, 2009 at 12:50:09PM -0500, Eric Sandeen wrote: >> What do folks think of this? These tests just do generic >> reads & writes with xfs_io; if we add a "-F" they will run >> on other filesystems. > > Looks good to me. Btw, I really wonder if we want to keep the -F > flag to xfs_io. Seems rather pointless to restrict > perfectly normal I/O to a single filesystem type. And even for XFS > specific ioctls we'd get a good enough error code back to handle it. I was thinking the same thing. -Eric From BATV+f282063ac8d967d1d57a+2116+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 9 03:08:46 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n5988hZf021383 for ; Tue, 9 Jun 2009 03:08:46 -0500 X-ASG-Debug-ID: 1244535367-16f602f50000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 2AB678D1B3B for ; Tue, 9 Jun 2009 01:16:07 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id bcv9Apk2hdOYriQn for ; Tue, 09 Jun 2009 01:16:07 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MDwOE-0002cC-1K; Tue, 09 Jun 2009 08:09:02 +0000 Date: Tue, 9 Jun 2009 04:09:02 -0400 From: Christoph Hellwig To: Nathan Scott Cc: xfs@oss.sgi.com, agruen@suse.de X-ASG-Orig-Subj: Re: Fwd: Bug#531950: attr: FTBFS on GNU/kFreeBSD Subject: Re: Fwd: Bug#531950: attr: FTBFS on GNU/kFreeBSD Message-ID: <20090609080901.GA2025@infradead.org> References: <1001284815.6030901244505808497.JavaMail.root@mail-au.aconex.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1001284815.6030901244505808497.JavaMail.root@mail-au.aconex.com> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244535368 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Tue, Jun 09, 2009 at 10:03:28AM +1000, Nathan Scott wrote: > Could someone verify and merge this patch? It looks OK to > me. Andreas now takes care ot attr. Btw, the submitter should stop that stupid GNU wanking - errnos are defined by the kernel so it's a FreeBSD issues and has nothing to do with their glibc abuse. From BATV+f282063ac8d967d1d57a+2116+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 9 03:39:47 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n598dlqR023048 for ; Tue, 9 Jun 2009 03:39:47 -0500 X-ASG-Debug-ID: 1244537230-6f54008a0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id EEA118D3B14 for ; Tue, 9 Jun 2009 01:47:11 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id qNk3xJjBjvzdH44w for ; Tue, 09 Jun 2009 01:47:11 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MDwsI-0000La-8H; Tue, 09 Jun 2009 08:40:06 +0000 Date: Tue, 9 Jun 2009 04:40:06 -0400 From: Christoph Hellwig To: Martin Spott Cc: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Subject: Re: Kernel crash with 2.6.29 + nfs + xfs (radix-tree) Message-ID: <20090609084006.GA31760@infradead.org> References: <20090520003745.GA27491@samad.com.au> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244537231 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Jun 08, 2009 at 08:13:18PM +0000, Martin Spott wrote: > Martin Spott wrote: > > Christoph Hellwig wrote: > > > >> I recently started auditing the code and started to fix some locking > >> issues in there, could you give the patch below a try? > > > > http://foxtrot.mgras.net/static/messages-20090607.2.bz2 > > > > I'm sorry but I'll have to boot the system using the previous kernel, > > Next 'maintenance window' ;-) starts wednesday evening. Please advise > if you'd like me to perform further tests, For now I'd love you to test the locking patch I sent you in my last mail. In the meantime I still fail to reproduce anything like your problem locally. I know we do need to reboot the machine or unexport/rexport the nfs export while it's mounted on a client to hit the codepath, but even while running stree tests on an nfs client while continuesly un/reexporting things on the server I can't hit it. > > Martin. > -- > Unix _IS_ user friendly - it's just selective about who its friends are ! > -------------------------------------------------------------------------- > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs ---end quoted text--- From BATV+f282063ac8d967d1d57a+2116+infradead.org+hch@bombadil.srs.infradead.org Tue Jun 9 04:01:08 2009 X-Spam-Checker-Version: SpamAssassin 3.3.0-rupdated (updated) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.0 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_64, J_CHICKENPOX_66,LOCAL_GNU_PATCH autolearn=ham version=3.3.0-rupdated Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n59918VB024183 for ; Tue, 9 Jun 2009 04:01:08 -0500 X-ASG-Debug-ID: 1244538088-57d202a20000-NocioJ X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from bombadil.infradead.org (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id C21E72DFEBE for ; Tue, 9 Jun 2009 02:01:28 -0700 (PDT) Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) by cuda.sgi.com with ESMTP id QK73p4je5edvaWM4 for ; Tue, 09 Jun 2009 02:01:28 -0700 (PDT) X-ASG-Whitelist: Client Received: from hch by bombadil.infradead.org with local (Exim 4.69 #1 (Red Hat Linux)) id 1MDxCx-0003Ti-M1; Tue, 09 Jun 2009 09:01:27 +0000 Date: Tue, 9 Jun 2009 05:01:27 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: Christoph Hellwig , xfs@oss.sgi.com X-ASG-Orig-Subj: Re: xfs: use generic Posix ACL code Subject: Re: xfs: use generic Posix ACL code Message-ID: <20090609090127.GA8268@infradead.org> References: <20090220205117.GA7943@infradead.org> <20090304173008.GA32471@infradead.org> <4A2D763E.1000909@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4A2D763E.1000909@sandeen.net> User-Agent: Mutt/1.5.18 (2008-05-17) 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[18.85.46.34] X-Barracuda-Start-Time: 1244538088 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean On Mon, Jun 08, 2009 at 03:36:14PM -0500, Eric Sandeen wrote: > > + * Copyright (C) 2008 Christoph Hellwig. > > + * Released under GPL v2. > > + */ > > Any reason not to have the normal full gpl header as all the other files do? Seems a bit pointless, but seeing that my other files also grew the full one in the meantime I've updated it. > > + if (!acl) { > > + /* > > + * acl_set_file(3) may request that we set default ACLs with > > + * zero length -- defend (gracefully) against that here. > > + */ > > ^ weird extra space here fixed. > > + /* > > + * XXX(hch): Updating the ACL entries is not atomic vs the i_mode > > + * update. We could avoid this with linked transactions > > + * and an passing down the transaction pointer all the > > ^^ extra word here? fixed. > > + * way to attr_set. No previous user of the generic > > + * Posix ACL code seems to care about this issue either. > > + */ > > + if ((mask & ATTR_MODE) && !(flags & XFS_ATTR_NOACL)) { > > + code = xfs_acl_chmod(inode); > > + if (code) > > + return code; > > } > > Don't you need to flip the error sign here? Yes, need to flip the error here. > As a general comment, should more of the new code get the XFS_ERROR() > treatment? I've added a couple more. Note that XFS_ERROR expects a positive errno value so it's not really convenient for the highlevel functions dealing with the negative Linux errnos. > As another general comment, do the goto targets have spaces in front of > them intentionally? Yes. > As yet another general comment, have you double checked that the > "static" functions aren't getting into inline stack hell? I've applied some STATIC love to the larger functions, and kept small helpers that make sense to inline static in xfs_acl.c Updated version below: -- Subject: xfs: use generic Posix ACL code From: Christoph Hellwig This patch rips out the XFS ACL handling code and uses the generic fs/posix_acl.c code instead. The ondisk format is of course left unchanged. This also introduces the same ACL caching all other Linux filesystems do by adding pointers to the acl and default acl in struct xfs_inode. Signed-off-by: Christoph Hellwig Index: xfs/fs/xfs/linux-2.6/xfs_acl.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xfs/fs/xfs/linux-2.6/xfs_acl.c 2009-06-09 10:59:01.812940123 +0200 @@ -0,0 +1,523 @@ +/* + * Copyright (c) 2008, Christoph Hellwig + * 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_acl.h" +#include "xfs_attr.h" +#include "xfs_bmap_btree.h" +#include "xfs_inode.h" +#include "xfs_vnodeops.h" +#include +#include + + +#define XFS_ACL_NOT_CACHED ((void *)-1) + +/* + * Locking scheme: + * - all ACL updates are protected by inode->i_mutex, which is taken before + * calling into this file. + * - access and updates to the ip->i_acl and ip->i_default_acl pointers are + * protected by inode->i_lock. + */ + +STATIC struct posix_acl * +xfs_acl_from_disk(struct xfs_acl *aclp) +{ + struct posix_acl_entry *acl_e; + struct posix_acl *acl; + struct xfs_acl_entry *ace; + int count, i; + + count = be32_to_cpu(aclp->acl_cnt); + + acl = posix_acl_alloc(count, GFP_KERNEL); + if (!acl) + return ERR_PTR(-ENOMEM); + + for (i = 0; i < count; i++) { + acl_e = &acl->a_entries[i]; + ace = &aclp->acl_entry[i]; + + /* + * The tag is 32 bits on disk and 16 bits in core. + * + * Because every access to it goes through the core + * format first this is not a problem. + */ + acl_e->e_tag = be32_to_cpu(ace->ae_tag); + acl_e->e_perm = be16_to_cpu(ace->ae_perm); + + switch (acl_e->e_tag) { + case ACL_USER: + case ACL_GROUP: + acl_e->e_id = be32_to_cpu(ace->ae_id); + break; + case ACL_USER_OBJ: + case ACL_GROUP_OBJ: + case ACL_MASK: + case ACL_OTHER: + acl_e->e_id = ACL_UNDEFINED_ID; + break; + default: + goto fail; + } + } + return acl; + +fail: + posix_acl_release(acl); + return ERR_PTR(-EINVAL); +} + +STATIC void +xfs_acl_to_disk(struct xfs_acl *aclp, const struct posix_acl *acl) +{ + const struct posix_acl_entry *acl_e; + struct xfs_acl_entry *ace; + int i; + + aclp->acl_cnt = cpu_to_be32(acl->a_count); + for (i = 0; i < acl->a_count; i++) { + ace = &aclp->acl_entry[i]; + acl_e = &acl->a_entries[i]; + + ace->ae_tag = cpu_to_be32(acl_e->e_tag); + ace->ae_id = cpu_to_be32(acl_e->e_id); + ace->ae_perm = cpu_to_be16(acl_e->e_perm); + } +} + +/* + * Update the cached ACL pointer in the inode. + * + * Because we don't hold any locks while reading/writing the attribute + * from/to disk another thread could have raced and updated the cached + * ACL value before us. In that case we release the previous cached value + * and update it with our new value. + */ +STATIC void +xfs_update_cached_acl(struct inode *inode, struct posix_acl **p_acl, + struct posix_acl *acl) +{ + spin_lock(&inode->i_lock); + if (*p_acl && *p_acl != XFS_ACL_NOT_CACHED) + posix_acl_release(*p_acl); + *p_acl = posix_acl_dup(acl); + spin_unlock(&inode->i_lock); +} + +struct posix_acl * +xfs_get_acl(struct inode *inode, int type) +{ + struct xfs_inode *ip = XFS_I(inode); + struct posix_acl *acl = NULL, **p_acl; + struct xfs_acl *xfs_acl; + int len = sizeof(struct xfs_acl); + char *ea_name; + int error; + + switch (type) { + case ACL_TYPE_ACCESS: + ea_name = SGI_ACL_FILE; + p_acl = &ip->i_acl; + break; + case ACL_TYPE_DEFAULT: + ea_name = SGI_ACL_DEFAULT; + p_acl = &ip->i_default_acl; + break; + default: + return ERR_PTR(-EINVAL); + } + + spin_lock(&inode->i_lock); + if (*p_acl != XFS_ACL_NOT_CACHED) + acl = posix_acl_dup(*p_acl); + spin_unlock(&inode->i_lock); + + /* + * If we have a cached ACLs value just return it, not need to + * go out to the disk. + */ + if (acl) + return acl; + + xfs_acl = kzalloc(sizeof(struct xfs_acl), GFP_KERNEL); + if (!xfs_acl) + return ERR_PTR(-ENOMEM); + + error = -xfs_attr_get(ip, ea_name, (char *)xfs_acl, &len, ATTR_ROOT); + if (error) { + /* + * If the attribute doesn't exist make sure we have a negative + * cache entry, for any other error assume it is transient and + * leave the cache entry as XFS_ACL_NOT_CACHED. + */ + if (error == -ENOATTR) { + acl = NULL; + goto out_update_cache; + } + goto out; + } + + acl = xfs_acl_from_disk(xfs_acl); + if (IS_ERR(acl)) + goto out; + + out_update_cache: + xfs_update_cached_acl(inode, p_acl, acl); + out: + kfree(xfs_acl); + return acl; +} + +STATIC int +xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl) +{ + struct xfs_inode *ip = XFS_I(inode); + struct posix_acl **p_acl; + char *ea_name; + int error; + + if (S_ISLNK(inode->i_mode)) + return -EOPNOTSUPP; + + switch (type) { + case ACL_TYPE_ACCESS: + ea_name = SGI_ACL_FILE; + p_acl = &ip->i_acl; + break; + case ACL_TYPE_DEFAULT: + if (!S_ISDIR(inode->i_mode)) + return acl ? -EACCES : 0; + ea_name = SGI_ACL_DEFAULT; + p_acl = &ip->i_default_acl; + break; + default: + return -EINVAL; + } + + if (acl) { + struct xfs_acl *xfs_acl; + int len; + + xfs_acl = kzalloc(sizeof(struct xfs_acl), GFP_KERNEL); + if (!xfs_acl) + return -ENOMEM; + + xfs_acl_to_disk(xfs_acl, acl); + len = sizeof(struct xfs_acl) - + (sizeof(struct xfs_acl_entry) * + (XFS_ACL_MAX_ENTRIES - acl->a_count)); + + error = -xfs_attr_set(ip, ea_name, (char *)xfs_acl, + len, ATTR_ROOT); + + kfree(xfs_acl); + } else { + /* + * A NULL ACL argument means we want to remove the ACL. + */ + error = -xfs_attr_remove(ip, ea_name, ATTR_ROOT); + + /* + * If the attribute didn't exist to start with that's fine. + */ + if (error == -ENOATTR) + error = 0; + } + + if (!error) + xfs_update_cached_acl(inode, p_acl, acl); + return error; +} + +int +xfs_check_acl(struct inode *inode, int mask) +{ + struct xfs_inode *ip = XFS_I(inode); + struct posix_acl *acl; + int error = -EAGAIN; + + xfs_itrace_entry(ip); + + /* + * If there is no attribute fork no ACL exists on this inode and + * we can skip the whole exercise. + */ + if (!XFS_IFORK_Q(ip)) + return -EAGAIN; + + acl = xfs_get_acl(inode, ACL_TYPE_ACCESS); + if (IS_ERR(acl)) + return PTR_ERR(acl); + if (acl) { + error = posix_acl_permission(inode, acl, mask); + posix_acl_release(acl); + } + + return error; +} + +static int +xfs_set_mode(struct inode *inode, mode_t mode) +{ + int error = 0; + + if (mode != inode->i_mode) { + struct iattr iattr; + + iattr.ia_valid = ATTR_MODE; + iattr.ia_mode = mode; + + error = -xfs_setattr(XFS_I(inode), &iattr, XFS_ATTR_NOACL); + } + + return error; +} + +static int +xfs_acl_exists(struct inode *inode, char *name) +{ + int len = sizeof(struct xfs_acl); + + return (xfs_attr_get(XFS_I(inode), name, NULL, &len, + ATTR_ROOT|ATTR_KERNOVAL) == 0); +} + +int +posix_acl_access_exists(struct inode *inode) +{ + return xfs_acl_exists(inode, SGI_ACL_FILE); +} + +int +posix_acl_default_exists(struct inode *inode) +{ + if (!S_ISDIR(inode->i_mode)) + return 0; + return xfs_acl_exists(inode, SGI_ACL_DEFAULT); +} + +/* + * No need for i_mutex because the inode is not yet exposed to the VFS. + */ +int +xfs_inherit_acl(struct inode *inode, struct posix_acl *default_acl) +{ + struct posix_acl *clone; + mode_t mode; + int error = 0, inherit = 0; + + if (S_ISDIR(inode->i_mode)) { + error = xfs_set_acl(inode, ACL_TYPE_DEFAULT, default_acl); + if (error) + return error; + } + + clone = posix_acl_clone(default_acl, GFP_KERNEL); + if (!clone) + return -ENOMEM; + + mode = inode->i_mode; + error = posix_acl_create_masq(clone, &mode); + if (error < 0) + goto out_release_clone; + + /* + * If posix_acl_create_masq returns a positive value we need to + * inherit a permission that can't be represented using the Unix + * mode bits and we actually need to set an ACL. + */ + if (error > 0) + inherit = 1; + + error = xfs_set_mode(inode, mode); + if (error) + goto out_release_clone; + + if (inherit) + error = xfs_set_acl(inode, ACL_TYPE_ACCESS, clone); + + out_release_clone: + posix_acl_release(clone); + return error; +} + +int +xfs_acl_chmod(struct inode *inode) +{ + struct posix_acl *acl, *clone; + int error; + + if (S_ISLNK(inode->i_mode)) + return -EOPNOTSUPP; + + acl = xfs_get_acl(inode, ACL_TYPE_ACCESS); + if (IS_ERR(acl) || !acl) + return PTR_ERR(acl); + + clone = posix_acl_clone(acl, GFP_KERNEL); + posix_acl_release(acl); + if (!clone) + return -ENOMEM; + + error = posix_acl_chmod_masq(clone, inode->i_mode); + if (!error) + error = xfs_set_acl(inode, ACL_TYPE_ACCESS, clone); + + posix_acl_release(clone); + return error; +} + +void +xfs_inode_init_acls(struct xfs_inode *ip) +{ + /* + * No need for locking, inode is not live yet. + */ + ip->i_acl = XFS_ACL_NOT_CACHED; + ip->i_default_acl = XFS_ACL_NOT_CACHED; +} + +void +xfs_inode_clear_acls(struct xfs_inode *ip) +{ + /* + * No need for locking here, the inode is not live anymore + * and just about to be freed. + */ + if (ip->i_acl != XFS_ACL_NOT_CACHED) + posix_acl_release(ip->i_acl); + if (ip->i_default_acl != XFS_ACL_NOT_CACHED) + posix_acl_release(ip->i_default_acl); +} + + +/* + * System xattr handlers. + * + * Currently Posix ACLs are the only system namespace extended attribute + * handlers supported by XFS, so we just implement the handlers here. + * If we ever support other system extended attributes this will need + * some refactoring. + */ + +static int +xfs_decode_acl(const char *name) +{ + if (strcmp(name, "posix_acl_access") == 0) + return ACL_TYPE_ACCESS; + else if (strcmp(name, "posix_acl_default") == 0) + return ACL_TYPE_DEFAULT; + return -EINVAL; +} + +static int +xfs_xattr_system_get(struct inode *inode, const char *name, + void *value, size_t size) +{ + struct posix_acl *acl; + int type, error; + + type = xfs_decode_acl(name); + if (type < 0) + return type; + + acl = xfs_get_acl(inode, type); + if (IS_ERR(acl)) + return PTR_ERR(acl); + if (acl == NULL) + return -ENODATA; + + error = posix_acl_to_xattr(acl, value, size); + posix_acl_release(acl); + + return error; +} + +static int +xfs_xattr_system_set(struct inode *inode, const char *name, + const void *value, size_t size, int flags) +{ + struct posix_acl *acl = NULL; + int error = 0, type; + + type = xfs_decode_acl(name); + if (type < 0) + return type; + if (flags & XATTR_CREATE) + return -EINVAL; + if (type == ACL_TYPE_DEFAULT && !S_ISDIR(inode->i_mode)) + return value ? -EACCES : 0; + if ((current_fsuid() != inode->i_uid) && !capable(CAP_FOWNER)) + return -EPERM; + + if (!value) + goto set_acl; + + acl = posix_acl_from_xattr(value, size); + if (!acl) { + /* + * acl_set_file(3) may request that we set default ACLs with + * zero length -- defend (gracefully) against that here. + */ + goto out; + } + if (IS_ERR(acl)) { + error = PTR_ERR(acl); + goto out; + } + + error = posix_acl_valid(acl); + if (error) + goto out_release; + + error = -EINVAL; + if (acl->a_count > XFS_ACL_MAX_ENTRIES) + goto out_release; + + if (type == ACL_TYPE_ACCESS) { + mode_t mode = inode->i_mode; + error = posix_acl_equiv_mode(acl, &mode); + + if (error <= 0) { + posix_acl_release(acl); + acl = NULL; + + if (error < 0) + return error; + } + + error = xfs_set_mode(inode, mode); + if (error) + goto out_release; + } + + set_acl: + error = xfs_set_acl(inode, type, acl); + out_release: + posix_acl_release(acl); + out: + return error; +} + +struct xattr_handler xfs_xattr_system_handler = { + .prefix = XATTR_SYSTEM_PREFIX, + .get = xfs_xattr_system_get, + .set = xfs_xattr_system_set, +}; Index: xfs/fs/xfs/linux-2.6/xfs_iops.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_iops.c 2009-06-04 14:09:13.801818699 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_iops.c 2009-06-08 20:13:15.594852150 +0200 @@ -17,6 +17,7 @@ */ #include "xfs.h" #include "xfs_fs.h" +#include "xfs_acl.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_inum.h" @@ -51,6 +52,7 @@ #include #include #include +#include #include #include #include @@ -202,9 +204,8 @@ xfs_vn_mknod( { struct inode *inode; struct xfs_inode *ip = NULL; - xfs_acl_t *default_acl = NULL; + struct posix_acl *default_acl = NULL; struct xfs_name name; - int (*test_default_acl)(struct inode *) = _ACL_DEFAULT_EXISTS; int error; /* @@ -219,18 +220,14 @@ xfs_vn_mknod( rdev = 0; } - if (test_default_acl && test_default_acl(dir)) { - if (!_ACL_ALLOC(default_acl)) { - return -ENOMEM; - } - if (!_ACL_GET_DEFAULT(dir, default_acl)) { - _ACL_FREE(default_acl); - default_acl = NULL; - } - } + if (IS_POSIXACL(dir)) { + default_acl = xfs_get_acl(dir, ACL_TYPE_DEFAULT); + if (IS_ERR(default_acl)) + return -PTR_ERR(default_acl); - if (IS_POSIXACL(dir) && !default_acl) - mode &= ~current->fs->umask; + if (!default_acl) + mode &= ~current->fs->umask; + } xfs_dentry_to_name(&name, dentry); error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip, NULL); @@ -244,10 +241,10 @@ xfs_vn_mknod( goto out_cleanup_inode; if (default_acl) { - error = _ACL_INHERIT(inode, mode, default_acl); + error = -xfs_inherit_acl(inode, default_acl); if (unlikely(error)) goto out_cleanup_inode; - _ACL_FREE(default_acl); + posix_acl_release(default_acl); } @@ -257,8 +254,7 @@ xfs_vn_mknod( out_cleanup_inode: xfs_cleanup_inode(dir, inode, dentry); out_free_acl: - if (default_acl) - _ACL_FREE(default_acl); + posix_acl_release(default_acl); return -error; } @@ -488,26 +484,6 @@ xfs_vn_put_link( kfree(s); } -#ifdef CONFIG_XFS_POSIX_ACL -STATIC int -xfs_check_acl( - struct inode *inode, - int mask) -{ - struct xfs_inode *ip = XFS_I(inode); - int error; - - xfs_itrace_entry(ip); - - if (XFS_IFORK_Q(ip)) { - error = xfs_acl_iaccess(ip, mask, NULL); - if (error != -1) - return -error; - } - - return -EAGAIN; -} - STATIC int xfs_vn_permission( struct inode *inode, @@ -515,9 +491,6 @@ xfs_vn_permission( { return generic_permission(inode, mask, xfs_check_acl); } -#else -#define xfs_vn_permission NULL -#endif STATIC int xfs_vn_getattr( Index: xfs/fs/xfs/Makefile =================================================================== --- xfs.orig/fs/xfs/Makefile 2009-06-08 15:33:32.338939538 +0200 +++ xfs/fs/xfs/Makefile 2009-06-08 20:13:15.595816379 +0200 @@ -40,7 +40,7 @@ xfs-$(CONFIG_PROC_FS) += quota/xfs_qm_s endif xfs-$(CONFIG_XFS_RT) += xfs_rtalloc.o -xfs-$(CONFIG_XFS_POSIX_ACL) += xfs_acl.o +xfs-$(CONFIG_XFS_POSIX_ACL) += $(XFS_LINUX)/xfs_acl.o xfs-$(CONFIG_PROC_FS) += $(XFS_LINUX)/xfs_stats.o xfs-$(CONFIG_SYSCTL) += $(XFS_LINUX)/xfs_sysctl.o xfs-$(CONFIG_COMPAT) += $(XFS_LINUX)/xfs_ioctl32.o Index: xfs/fs/xfs/xfs_inode.h =================================================================== --- xfs.orig/fs/xfs/xfs_inode.h 2009-05-27 12:59:33.805814547 +0200 +++ xfs/fs/xfs/xfs_inode.h 2009-06-08 20:13:15.597816983 +0200 @@ -18,6 +18,7 @@ #ifndef __XFS_INODE_H__ #define __XFS_INODE_H__ +struct posix_acl; struct xfs_dinode; struct xfs_inode; @@ -272,6 +273,11 @@ typedef struct xfs_inode { /* VFS inode */ struct inode i_vnode; /* embedded VFS inode */ +#ifdef CONFIG_XFS_POSIX_ACL + struct posix_acl *i_acl; + struct posix_acl *i_default_acl; +#endif + /* Trace buffers per inode. */ #ifdef XFS_INODE_TRACE struct ktrace *i_trace; /* general inode trace */ Index: xfs/fs/xfs/linux-2.6/xfs_xattr.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_xattr.c 2009-05-27 12:59:33.734839585 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_xattr.c 2009-06-08 20:13:15.599816470 +0200 @@ -29,67 +29,6 @@ #include -/* - * ACL handling. Should eventually be moved into xfs_acl.c - */ - -static int -xfs_decode_acl(const char *name) -{ - if (strcmp(name, "posix_acl_access") == 0) - return _ACL_TYPE_ACCESS; - else if (strcmp(name, "posix_acl_default") == 0) - return _ACL_TYPE_DEFAULT; - return -EINVAL; -} - -/* - * Get system extended attributes which at the moment only - * includes Posix ACLs. - */ -static int -xfs_xattr_system_get(struct inode *inode, const char *name, - void *buffer, size_t size) -{ - int acl; - - acl = xfs_decode_acl(name); - if (acl < 0) - return acl; - - return xfs_acl_vget(inode, buffer, size, acl); -} - -static int -xfs_xattr_system_set(struct inode *inode, const char *name, - const void *value, size_t size, int flags) -{ - int acl; - - acl = xfs_decode_acl(name); - if (acl < 0) - return acl; - if (flags & XATTR_CREATE) - return -EINVAL; - - if (!value) - return xfs_acl_vremove(inode, acl); - - return xfs_acl_vset(inode, (void *)value, size, acl); -} - -static struct xattr_handler xfs_xattr_system_handler = { - .prefix = XATTR_SYSTEM_PREFIX, - .get = xfs_xattr_system_get, - .set = xfs_xattr_system_set, -}; - - -/* - * Real xattr handling. The only difference between the namespaces is - * a flag passed to the low-level attr code. - */ - static int __xfs_xattr_get(struct inode *inode, const char *name, void *value, size_t size, int xflags) @@ -199,7 +138,9 @@ struct xattr_handler *xfs_xattr_handlers &xfs_xattr_user_handler, &xfs_xattr_trusted_handler, &xfs_xattr_security_handler, +#ifdef CONFIG_XFS_POSIX_ACL &xfs_xattr_system_handler, +#endif NULL }; @@ -310,7 +251,7 @@ xfs_vn_listxattr(struct dentry *dentry, /* * Then add the two synthetic ACL attributes. */ - if (xfs_acl_vhasacl_access(inode)) { + if (posix_acl_access_exists(inode)) { error = list_one_attr(POSIX_ACL_XATTR_ACCESS, strlen(POSIX_ACL_XATTR_ACCESS) + 1, data, size, &context.count); @@ -318,7 +259,7 @@ xfs_vn_listxattr(struct dentry *dentry, return error; } - if (xfs_acl_vhasacl_default(inode)) { + if (posix_acl_default_exists(inode)) { error = list_one_attr(POSIX_ACL_XATTR_DEFAULT, strlen(POSIX_ACL_XATTR_DEFAULT) + 1, data, size, &context.count); Index: xfs/fs/xfs/Kconfig =================================================================== --- xfs.orig/fs/xfs/Kconfig 2009-05-27 12:59:33.810814625 +0200 +++ xfs/fs/xfs/Kconfig 2009-06-08 20:13:15.600822394 +0200 @@ -39,6 +39,7 @@ config XFS_QUOTA config XFS_POSIX_ACL bool "XFS POSIX ACL support" depends on XFS_FS + select FS_POSIX_ACL help POSIX Access Control Lists (ACLs) support permissions for users and groups beyond the owner/group/world scheme. Index: xfs/fs/xfs/linux-2.6/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_super.c 2009-06-08 15:35:48.557939145 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_super.c 2009-06-08 20:13:15.603816560 +0200 @@ -43,7 +43,6 @@ #include "xfs_itable.h" #include "xfs_fsops.h" #include "xfs_rw.h" -#include "xfs_acl.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_utils.h" @@ -1735,18 +1734,8 @@ xfs_init_zones(void) if (!xfs_ili_zone) goto out_destroy_inode_zone; -#ifdef CONFIG_XFS_POSIX_ACL - xfs_acl_zone = kmem_zone_init(sizeof(xfs_acl_t), "xfs_acl"); - if (!xfs_acl_zone) - goto out_destroy_ili_zone; -#endif - return 0; -#ifdef CONFIG_XFS_POSIX_ACL - out_destroy_ili_zone: -#endif - kmem_zone_destroy(xfs_ili_zone); out_destroy_inode_zone: kmem_zone_destroy(xfs_inode_zone); out_destroy_efi_zone: @@ -1780,9 +1769,6 @@ xfs_init_zones(void) STATIC void xfs_destroy_zones(void) { -#ifdef CONFIG_XFS_POSIX_ACL - kmem_zone_destroy(xfs_acl_zone); -#endif kmem_zone_destroy(xfs_ili_zone); kmem_zone_destroy(xfs_inode_zone); kmem_zone_destroy(xfs_efi_zone); Index: xfs/fs/xfs/xfs_attr.c =================================================================== --- xfs.orig/fs/xfs/xfs_attr.c 2009-06-08 15:33:32.333939669 +0200 +++ xfs/fs/xfs/xfs_attr.c 2009-06-08 20:13:15.607816651 +0200 @@ -45,7 +45,6 @@ #include "xfs_error.h" #include "xfs_quota.h" #include "xfs_trans_space.h" -#include "xfs_acl.h" #include "xfs_rw.h" #include "xfs_vnodeops.h" Index: xfs/fs/xfs/xfs_iomap.c =================================================================== --- xfs.orig/fs/xfs/xfs_iomap.c 2009-06-08 15:33:32.336939423 +0200 +++ xfs/fs/xfs/xfs_iomap.c 2009-06-08 20:13:15.609816626 +0200 @@ -42,7 +42,6 @@ #include "xfs_error.h" #include "xfs_itable.h" #include "xfs_rw.h" -#include "xfs_acl.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_space.h" Index: xfs/fs/xfs/xfs_rw.c =================================================================== --- xfs.orig/fs/xfs/xfs_rw.c 2009-05-27 12:59:33.824814593 +0200 +++ xfs/fs/xfs/xfs_rw.c 2009-06-08 20:13:15.611821071 +0200 @@ -41,7 +41,6 @@ #include "xfs_ialloc.h" #include "xfs_attr.h" #include "xfs_bmap.h" -#include "xfs_acl.h" #include "xfs_error.h" #include "xfs_buf_item.h" #include "xfs_rw.h" Index: xfs/fs/xfs/linux-2.6/xfs_ioctl.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_ioctl.c 2009-06-08 15:33:32.339969976 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_ioctl.c 2009-06-08 20:13:15.613816717 +0200 @@ -41,7 +41,6 @@ #include "xfs_itable.h" #include "xfs_error.h" #include "xfs_rw.h" -#include "xfs_acl.h" #include "xfs_attr.h" #include "xfs_bmap.h" #include "xfs_buf_item.h" Index: xfs/fs/xfs/linux-2.6/xfs_lrw.c =================================================================== --- xfs.orig/fs/xfs/linux-2.6/xfs_lrw.c 2009-05-27 12:59:33.795814740 +0200 +++ xfs/fs/xfs/linux-2.6/xfs_lrw.c 2009-06-08 20:13:15.615816692 +0200 @@ -42,7 +42,6 @@ #include "xfs_error.h" #include "xfs_itable.h" #include "xfs_rw.h" -#include "xfs_acl.h" #include "xfs_attr.h" #include "xfs_inode_item.h" #include "xfs_buf_item.h" Index: xfs/fs/xfs/quota/xfs_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot.c 2009-06-08 15:33:32.343939267 +0200 +++ xfs/fs/xfs/quota/xfs_dquot.c 2009-06-08 20:13:15.618816585 +0200 @@ -42,7 +42,6 @@ #include "xfs_error.h" #include "xfs_itable.h" #include "xfs_rw.h" -#include "xfs_acl.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_space.h" Index: xfs/fs/xfs/quota/xfs_dquot_item.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_dquot_item.c 2009-05-27 12:59:33.833814900 +0200 +++ xfs/fs/xfs/quota/xfs_dquot_item.c 2009-06-08 20:13:15.620816700 +0200 @@ -42,7 +42,6 @@ #include "xfs_error.h" #include "xfs_itable.h" #include "xfs_rw.h" -#include "xfs_acl.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" Index: xfs/fs/xfs/quota/xfs_qm.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm.c 2009-06-08 15:37:16.795939614 +0200 +++ xfs/fs/xfs/quota/xfs_qm.c 2009-06-08 20:13:15.623816384 +0200 @@ -42,7 +42,6 @@ #include "xfs_error.h" #include "xfs_bmap.h" #include "xfs_rw.h" -#include "xfs_acl.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_space.h" Index: xfs/fs/xfs/quota/xfs_qm_bhv.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_bhv.c 2009-06-08 15:33:32.333939669 +0200 +++ xfs/fs/xfs/quota/xfs_qm_bhv.c 2009-06-08 20:13:15.626816906 +0200 @@ -42,7 +42,6 @@ #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_rw.h" -#include "xfs_acl.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_qm.h" Index: xfs/fs/xfs/quota/xfs_qm_stats.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_stats.c 2009-05-27 12:59:33.848814856 +0200 +++ xfs/fs/xfs/quota/xfs_qm_stats.c 2009-06-08 20:13:15.628851662 +0200 @@ -42,7 +42,6 @@ #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_rw.h" -#include "xfs_acl.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_qm.h" Index: xfs/fs/xfs/quota/xfs_qm_syscalls.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_qm_syscalls.c 2009-06-08 15:35:27.426938973 +0200 +++ xfs/fs/xfs/quota/xfs_qm_syscalls.c 2009-06-08 20:13:15.953874385 +0200 @@ -45,7 +45,6 @@ #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_rw.h" -#include "xfs_acl.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_utils.h" Index: xfs/fs/xfs/quota/xfs_trans_dquot.c =================================================================== --- xfs.orig/fs/xfs/quota/xfs_trans_dquot.c 2009-06-08 15:33:32.316939599 +0200 +++ xfs/fs/xfs/quota/xfs_trans_dquot.c 2009-06-08 20:13:15.964816489 +0200 @@ -42,7 +42,6 @@ #include "xfs_rtalloc.h" #include "xfs_error.h" #include "xfs_rw.h" -#include "xfs_acl.h" #include "xfs_attr.h" #include "xfs_buf_item.h" #include "xfs_trans_priv.h" Index: xfs/fs/xfs/xfs_vnodeops.c =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.c 2009-06-08 15:33:32.329939230 +0200 +++ xfs/fs/xfs/xfs_vnodeops.c 2009-06-09 10:57:29.244817470 +0200 @@ -42,6 +42,7 @@ #include "xfs_ialloc.h" #include "xfs_alloc.h" #include "xfs_bmap.h" +#include "xfs_acl.h" #include "xfs_attr.h" #include "xfs_rw.h" #include "xfs_error.h" @@ -467,8 +468,20 @@ xfs_setattr( xfs_qm_dqrele(udqp); xfs_qm_dqrele(gdqp); - if (code) { + if (code) return code; + + /* + * XXX(hch): Updating the ACL entries is not atomic vs the i_mode + * update. We could avoid this with linked transactions + * and passing down the transaction pointer all the way + * to attr_set. No previous user of the generic + * Posix ACL code seems to care about this issue either. + */ + if ((mask & ATTR_MODE) && !(flags & XFS_ATTR_NOACL)) { + code = -xfs_acl_chmod(inode); + if (code) + return XFS_ERROR(code); } if (DM_EVENT_ENABLED(ip, DM_EVENT_ATTRIBUTE) && Index: xfs/fs/xfs/xfs_vnodeops.h =================================================================== --- xfs.orig/fs/xfs/xfs_vnodeops.h 2009-06-04 13:23:55.176814867 +0200 +++ xfs/fs/xfs/xfs_vnodeops.h 2009-06-08 20:13:15.980816850 +0200 @@ -18,6 +18,7 @@ int xfs_setattr(struct xfs_inode *ip, st #define XFS_ATTR_DMI 0x01 /* invocation from a DMI function */ #define XFS_ATTR_NONBLOCK 0x02 /* return EAGAIN if operation would block */ #define XFS_ATTR_NOLOCK 0x04 /* Don't grab any conflicting locks */ +#define XFS_ATTR_NOACL 0x08 /* Don't call xfs_acl_chmod */ int xfs_readlink(struct xfs_inode *ip, char *link); int xfs_fsync(struct xfs_inode *ip); Index: xfs/fs/xfs/xfs_acl.c =================================================================== --- xfs.orig/fs/xfs/xfs_acl.c 2009-05-27 12:59:33.872814840 +0200 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,874 +0,0 @@ -/* - * Copyright (c) 2001-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 - */ -#include "xfs.h" -#include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_bit.h" -#include "xfs_inum.h" -#include "xfs_ag.h" -#include "xfs_dir2.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dir2_sf.h" -#include "xfs_attr_sf.h" -#include "xfs_dinode.h" -#include "xfs_inode.h" -#include "xfs_btree.h" -#include "xfs_acl.h" -#include "xfs_attr.h" -#include "xfs_vnodeops.h" - -#include -#include - -STATIC int xfs_acl_setmode(struct inode *, xfs_acl_t *, int *); -STATIC void xfs_acl_filter_mode(mode_t, xfs_acl_t *); -STATIC void xfs_acl_get_endian(xfs_acl_t *); -STATIC int xfs_acl_access(uid_t, gid_t, xfs_acl_t *, mode_t, cred_t *); -STATIC int xfs_acl_invalid(xfs_acl_t *); -STATIC void xfs_acl_sync_mode(mode_t, xfs_acl_t *); -STATIC void xfs_acl_get_attr(struct inode *, xfs_acl_t *, int, int, int *); -STATIC void xfs_acl_set_attr(struct inode *, xfs_acl_t *, int, int *); -STATIC int xfs_acl_allow_set(struct inode *, int); - -kmem_zone_t *xfs_acl_zone; - - -/* - * Test for existence of access ACL attribute as efficiently as possible. - */ -int -xfs_acl_vhasacl_access( - struct inode *vp) -{ - int error; - - xfs_acl_get_attr(vp, NULL, _ACL_TYPE_ACCESS, ATTR_KERNOVAL, &error); - return (error == 0); -} - -/* - * Test for existence of default ACL attribute as efficiently as possible. - */ -int -xfs_acl_vhasacl_default( - struct inode *vp) -{ - int error; - - if (!S_ISDIR(vp->i_mode)) - return 0; - xfs_acl_get_attr(vp, NULL, _ACL_TYPE_DEFAULT, ATTR_KERNOVAL, &error); - return (error == 0); -} - -/* - * Convert from extended attribute representation to in-memory for XFS. - */ -STATIC int -posix_acl_xattr_to_xfs( - posix_acl_xattr_header *src, - size_t size, - xfs_acl_t *dest) -{ - posix_acl_xattr_entry *src_entry; - xfs_acl_entry_t *dest_entry; - int n; - - if (!src || !dest) - return EINVAL; - - if (size < sizeof(posix_acl_xattr_header)) - return EINVAL; - - if (src->a_version != cpu_to_le32(POSIX_ACL_XATTR_VERSION)) - return EOPNOTSUPP; - - memset(dest, 0, sizeof(xfs_acl_t)); - dest->acl_cnt = posix_acl_xattr_count(size); - if (dest->acl_cnt < 0 || dest->acl_cnt > XFS_ACL_MAX_ENTRIES) - return EINVAL; - - /* - * acl_set_file(3) may request that we set default ACLs with - * zero length -- defend (gracefully) against that here. - */ - if (!dest->acl_cnt) - return 0; - - src_entry = (posix_acl_xattr_entry *)((char *)src + sizeof(*src)); - dest_entry = &dest->acl_entry[0]; - - for (n = 0; n < dest->acl_cnt; n++, src_entry++, dest_entry++) { - dest_entry->ae_perm = le16_to_cpu(src_entry->e_perm); - if (_ACL_PERM_INVALID(dest_entry->ae_perm)) - return EINVAL; - dest_entry->ae_tag = le16_to_cpu(src_entry->e_tag); - switch(dest_entry->ae_tag) { - case ACL_USER: - case ACL_GROUP: - dest_entry->ae_id = le32_to_cpu(src_entry->e_id); - break; - case ACL_USER_OBJ: - case ACL_GROUP_OBJ: - case ACL_MASK: - case ACL_OTHER: - dest_entry->ae_id = ACL_UNDEFINED_ID; - break; - default: - return EINVAL; - } - } - if (xfs_acl_invalid(dest)) - return EINVAL; - - return 0; -} - -/* - * Comparison function called from xfs_sort(). - * Primary key is ae_tag, secondary key is ae_id. - */ -STATIC int -xfs_acl_entry_compare( - const void *va, - const void *vb) -{ - xfs_acl_entry_t *a = (xfs_acl_entry_t *)va, - *b = (xfs_acl_entry_t *)vb; - - if (a->ae_tag == b->ae_tag) - return (a->ae_id - b->ae_id); - return (a->ae_tag - b->ae_tag); -} - -/* - * Convert from in-memory XFS to extended attribute representation. - */ -STATIC int -posix_acl_xfs_to_xattr( - xfs_acl_t *src, - posix_acl_xattr_header *dest, - size_t size) -{ - int n; - size_t new_size = posix_acl_xattr_size(src->acl_cnt); - posix_acl_xattr_entry *dest_entry; - xfs_acl_entry_t *src_entry; - - if (size < new_size) - return -ERANGE; - - /* Need to sort src XFS ACL by */ - xfs_sort(src->acl_entry, src->acl_cnt, sizeof(src->acl_entry[0]), - xfs_acl_entry_compare); - - dest->a_version = cpu_to_le32(POSIX_ACL_XATTR_VERSION); - dest_entry = &dest->a_entries[0]; - src_entry = &src->acl_entry[0]; - for (n = 0; n < src->acl_cnt; n++, dest_entry++, src_entry++) { - dest_entry->e_perm = cpu_to_le16(src_entry->ae_perm); - if (_ACL_PERM_INVALID(src_entry->ae_perm)) - return -EINVAL; - dest_entry->e_tag = cpu_to_le16(src_entry->ae_tag); - switch (src_entry->ae_tag) { - case ACL_USER: - case ACL_GROUP: - dest_entry->e_id = cpu_to_le32(src_entry->ae_id); - break; - case ACL_USER_OBJ: - case ACL_GROUP_OBJ: - case ACL_MASK: - case ACL_OTHER: - dest_entry->e_id = cpu_to_le32(ACL_UNDEFINED_ID); - break; - default: - return -EINVAL; - } - } - return new_size; -} - -int -xfs_acl_vget( - struct inode *vp, - void *acl, - size_t size, - int kind) -{ - int error; - xfs_acl_t *xfs_acl = NULL; - posix_acl_xattr_header *ext_acl = acl; - int flags = 0; - - if(size) { - if (!(_ACL_ALLOC(xfs_acl))) { - error = ENOMEM; - goto out; - } - memset(xfs_acl, 0, sizeof(xfs_acl_t)); - } else - flags = ATTR_KERNOVAL; - - xfs_acl_get_attr(vp, xfs_acl, kind, flags, &error); - if (error) - goto out; - - if (!size) { - error = -posix_acl_xattr_size(XFS_ACL_MAX_ENTRIES); - } else { - if (xfs_acl_invalid(xfs_acl)) { - error = EINVAL; - goto out; - } - if (kind == _ACL_TYPE_ACCESS) - xfs_acl_sync_mode(XFS_I(vp)->i_d.di_mode, xfs_acl); - error = -posix_acl_xfs_to_xattr(xfs_acl, ext_acl, size); - } -out: - if(xfs_acl) - _ACL_FREE(xfs_acl); - return -error; -} - -int -xfs_acl_vremove( - struct inode *vp, - int kind) -{ - int error; - - error = xfs_acl_allow_set(vp, kind); - if (!error) { - error = xfs_attr_remove(XFS_I(vp), - kind == _ACL_TYPE_DEFAULT? - SGI_ACL_DEFAULT: SGI_ACL_FILE, - ATTR_ROOT); - if (error == ENOATTR) - error = 0; /* 'scool */ - } - return -error; -} - -int -xfs_acl_vset( - struct inode *vp, - void *acl, - size_t size, - int kind) -{ - posix_acl_xattr_header *ext_acl = acl; - xfs_acl_t *xfs_acl; - int error; - int basicperms = 0; /* more than std unix perms? */ - - if (!acl) - return -EINVAL; - - if (!(_ACL_ALLOC(xfs_acl))) - return -ENOMEM; - - error = posix_acl_xattr_to_xfs(ext_acl, size, xfs_acl); - if (error) { - _ACL_FREE(xfs_acl); - return -error; - } - if (!xfs_acl->acl_cnt) { - _ACL_FREE(xfs_acl); - return 0; - } - - error = xfs_acl_allow_set(vp, kind); - - /* Incoming ACL exists, set file mode based on its value */ - if (!error && kind == _ACL_TYPE_ACCESS) - error = xfs_acl_setmode(vp, xfs_acl, &basicperms); - - if (error) - goto out; - - /* - * If we have more than std unix permissions, set up the actual attr. - * Otherwise, delete any existing attr. This prevents us from - * having actual attrs for permissions that can be stored in the - * standard permission bits. - */ - if (!basicperms) { - xfs_acl_set_attr(vp, xfs_acl, kind, &error); - } else { - error = -xfs_acl_vremove(vp, _ACL_TYPE_ACCESS); - } - -out: - _ACL_FREE(xfs_acl); - return -error; -} - -int -xfs_acl_iaccess( - xfs_inode_t *ip, - mode_t mode, - cred_t *cr) -{ - xfs_acl_t *acl; - int rval; - struct xfs_name acl_name = {SGI_ACL_FILE, SGI_ACL_FILE_SIZE}; - - if (!(_ACL_ALLOC(acl))) - return -1; - - /* If the file has no ACL return -1. */ - rval = sizeof(xfs_acl_t); - if (xfs_attr_fetch(ip, &acl_name, (char *)acl, &rval, ATTR_ROOT)) { - _ACL_FREE(acl); - return -1; - } - xfs_acl_get_endian(acl); - - /* If the file has an empty ACL return -1. */ - if (acl->acl_cnt == XFS_ACL_NOT_PRESENT) { - _ACL_FREE(acl); - return -1; - } - - /* Synchronize ACL with mode bits */ - xfs_acl_sync_mode(ip->i_d.di_mode, acl); - - rval = xfs_acl_access(ip->i_d.di_uid, ip->i_d.di_gid, acl, mode, cr); - _ACL_FREE(acl); - return rval; -} - -STATIC int -xfs_acl_allow_set( - struct inode *vp, - int kind) -{ - if (vp->i_flags & (S_IMMUTABLE|S_APPEND)) - return EPERM; - if (kind == _ACL_TYPE_DEFAULT && !S_ISDIR(vp->i_mode)) - return ENOTDIR; - if (vp->i_sb->s_flags & MS_RDONLY) - return EROFS; - if (XFS_I(vp)->i_d.di_uid != current_fsuid() && !capable(CAP_FOWNER)) - return EPERM; - return 0; -} - -/* - * Note: cr is only used here for the capability check if the ACL test fails. - * It is not used to find out the credentials uid or groups etc, as was - * done in IRIX. It is assumed that the uid and groups for the current - * thread are taken from "current" instead of the cr parameter. - */ -STATIC int -xfs_acl_access( - uid_t fuid, - gid_t fgid, - xfs_acl_t *fap, - mode_t md, - cred_t *cr) -{ - xfs_acl_entry_t matched; - int i, allows; - int maskallows = -1; /* true, but not 1, either */ - int seen_userobj = 0; - - matched.ae_tag = 0; /* Invalid type */ - matched.ae_perm = 0; - - for (i = 0; i < fap->acl_cnt; i++) { - /* - * Break out if we've got a user_obj entry or - * a user entry and the mask (and have processed USER_OBJ) - */ - if (matched.ae_tag == ACL_USER_OBJ) - break; - if (matched.ae_tag == ACL_USER) { - if (maskallows != -1 && seen_userobj) - break; - if (fap->acl_entry[i].ae_tag != ACL_MASK && - fap->acl_entry[i].ae_tag != ACL_USER_OBJ) - continue; - } - /* True if this entry allows the requested access */ - allows = ((fap->acl_entry[i].ae_perm & md) == md); - - switch (fap->acl_entry[i].ae_tag) { - case ACL_USER_OBJ: - seen_userobj = 1; - if (fuid != current_fsuid()) - continue; - matched.ae_tag = ACL_USER_OBJ; - matched.ae_perm = allows; - break; - case ACL_USER: - if (fap->acl_entry[i].ae_id != current_fsuid()) - continue; - matched.ae_tag = ACL_USER; - matched.ae_perm = allows; - break; - case ACL_GROUP_OBJ: - if ((matched.ae_tag == ACL_GROUP_OBJ || - matched.ae_tag == ACL_GROUP) && !allows) - continue; - if (!in_group_p(fgid)) - continue; - matched.ae_tag = ACL_GROUP_OBJ; - matched.ae_perm = allows; - break; - case ACL_GROUP: - if ((matched.ae_tag == ACL_GROUP_OBJ || - matched.ae_tag == ACL_GROUP) && !allows) - continue; - if (!in_group_p(fap->acl_entry[i].ae_id)) - continue; - matched.ae_tag = ACL_GROUP; - matched.ae_perm = allows; - break; - case ACL_MASK: - maskallows = allows; - break; - case ACL_OTHER: - if (matched.ae_tag != 0) - continue; - matched.ae_tag = ACL_OTHER; - matched.ae_perm = allows; - break; - } - } - /* - * First possibility is that no matched entry allows access. - * The capability to override DAC may exist, so check for it. - */ - switch (matched.ae_tag) { - case ACL_OTHER: - case ACL_USER_OBJ: - if (matched.ae_perm) - return 0; - break; - case ACL_USER: - case ACL_GROUP_OBJ: - case ACL_GROUP: - if (maskallows && matched.ae_perm) - return 0; - break; - case 0: - break; - } - - /* EACCES tells generic_permission to check for capability overrides */ - return EACCES; -} - -/* - * ACL validity checker. - * This acl validation routine checks each ACL entry read in makes sense. - */ -STATIC int -xfs_acl_invalid( - xfs_acl_t *aclp) -{ - xfs_acl_entry_t *entry, *e; - int user = 0, group = 0, other = 0, mask = 0; - int mask_required = 0; - int i, j; - - if (!aclp) - goto acl_invalid; - - if (aclp->acl_cnt > XFS_ACL_MAX_ENTRIES) - goto acl_invalid; - - for (i = 0; i < aclp->acl_cnt; i++) { - entry = &aclp->acl_entry[i]; - switch (entry->ae_tag) { - case ACL_USER_OBJ: - if (user++) - goto acl_invalid; - break; - case ACL_GROUP_OBJ: - if (group++) - goto acl_invalid; - break; - case ACL_OTHER: - if (other++) - goto acl_invalid; - break; - case ACL_USER: - case ACL_GROUP: - for (j = i + 1; j < aclp->acl_cnt; j++) { - e = &aclp->acl_entry[j]; - if (e->ae_id == entry->ae_id && - e->ae_tag == entry->ae_tag) - goto acl_invalid; - } - mask_required++; - break; - case ACL_MASK: - if (mask++) - goto acl_invalid; - break; - default: - goto acl_invalid; - } - } - if (!user || !group || !other || (mask_required && !mask)) - goto acl_invalid; - else - return 0; -acl_invalid: - return EINVAL; -} - -/* - * Do ACL endian conversion. - */ -STATIC void -xfs_acl_get_endian( - xfs_acl_t *aclp) -{ - xfs_acl_entry_t *ace, *end; - - INT_SET(aclp->acl_cnt, ARCH_CONVERT, aclp->acl_cnt); - end = &aclp->acl_entry[0]+aclp->acl_cnt; - for (ace = &aclp->acl_entry[0]; ace < end; ace++) { - INT_SET(ace->ae_tag, ARCH_CONVERT, ace->ae_tag); - INT_SET(ace->ae_id, ARCH_CONVERT, ace->ae_id); - INT_SET(ace->ae_perm, ARCH_CONVERT, ace->ae_perm); - } -} - -/* - * Get the ACL from the EA and do endian conversion. - */ -STATIC void -xfs_acl_get_attr( - struct inode *vp, - xfs_acl_t *aclp, - int kind, - int flags, - int *error) -{ - int len = sizeof(xfs_acl_t); - - ASSERT((flags & ATTR_KERNOVAL) ? (aclp == NULL) : 1); - flags |= ATTR_ROOT; - *error = xfs_attr_get(XFS_I(vp), - kind == _ACL_TYPE_ACCESS ? - SGI_ACL_FILE : SGI_ACL_DEFAULT, - (char *)aclp, &len, flags); - if (*error || (flags & ATTR_KERNOVAL)) - return; - xfs_acl_get_endian(aclp); -} - -/* - * Set the EA with the ACL and do endian conversion. - */ -STATIC void -xfs_acl_set_attr( - struct inode *vp, - xfs_acl_t *aclp, - int kind, - int *error) -{ - xfs_acl_entry_t *ace, *newace, *end; - xfs_acl_t *newacl; - int len; - - if (!(_ACL_ALLOC(newacl))) { - *error = ENOMEM; - return; - } - - len = sizeof(xfs_acl_t) - - (sizeof(xfs_acl_entry_t) * (XFS_ACL_MAX_ENTRIES - aclp->acl_cnt)); - end = &aclp->acl_entry[0]+aclp->acl_cnt; - for (ace = &aclp->acl_entry[0], newace = &newacl->acl_entry[0]; - ace < end; - ace++, newace++) { - INT_SET(newace->ae_tag, ARCH_CONVERT, ace->ae_tag); - INT_SET(newace->ae_id, ARCH_CONVERT, ace->ae_id); - INT_SET(newace->ae_perm, ARCH_CONVERT, ace->ae_perm); - } - INT_SET(newacl->acl_cnt, ARCH_CONVERT, aclp->acl_cnt); - *error = xfs_attr_set(XFS_I(vp), - kind == _ACL_TYPE_ACCESS ? - SGI_ACL_FILE: SGI_ACL_DEFAULT, - (char *)newacl, len, ATTR_ROOT); - _ACL_FREE(newacl); -} - -int -xfs_acl_vtoacl( - struct inode *vp, - xfs_acl_t *access_acl, - xfs_acl_t *default_acl) -{ - int error = 0; - - if (access_acl) { - /* - * Get the Access ACL and the mode. If either cannot - * be obtained for some reason, invalidate the access ACL. - */ - xfs_acl_get_attr(vp, access_acl, _ACL_TYPE_ACCESS, 0, &error); - if (error) - access_acl->acl_cnt = XFS_ACL_NOT_PRESENT; - else /* We have a good ACL and the file mode, synchronize. */ - xfs_acl_sync_mode(XFS_I(vp)->i_d.di_mode, access_acl); - } - - if (default_acl) { - xfs_acl_get_attr(vp, default_acl, _ACL_TYPE_DEFAULT, 0, &error); - if (error) - default_acl->acl_cnt = XFS_ACL_NOT_PRESENT; - } - return error; -} - -/* - * This function retrieves the parent directory's acl, processes it - * and lets the child inherit the acl(s) that it should. - */ -int -xfs_acl_inherit( - struct inode *vp, - mode_t mode, - xfs_acl_t *pdaclp) -{ - xfs_acl_t *cacl; - int error = 0; - int basicperms = 0; - - /* - * If the parent does not have a default ACL, or it's an - * invalid ACL, we're done. - */ - if (!vp) - return 0; - if (!pdaclp || xfs_acl_invalid(pdaclp)) - return 0; - - /* - * Copy the default ACL of the containing directory to - * the access ACL of the new file and use the mode that - * was passed in to set up the correct initial values for - * the u::,g::[m::], and o:: entries. This is what makes - * umask() "work" with ACL's. - */ - - if (!(_ACL_ALLOC(cacl))) - return ENOMEM; - - memcpy(cacl, pdaclp, sizeof(xfs_acl_t)); - xfs_acl_filter_mode(mode, cacl); - error = xfs_acl_setmode(vp, cacl, &basicperms); - if (error) - goto out_error; - - /* - * Set the Default and Access ACL on the file. The mode is already - * set on the file, so we don't need to worry about that. - * - * If the new file is a directory, its default ACL is a copy of - * the containing directory's default ACL. - */ - if (S_ISDIR(vp->i_mode)) - xfs_acl_set_attr(vp, pdaclp, _ACL_TYPE_DEFAULT, &error); - if (!error && !basicperms) - xfs_acl_set_attr(vp, cacl, _ACL_TYPE_ACCESS, &error); -out_error: - _ACL_FREE(cacl); - return error; -} - -/* - * Set up the correct mode on the file based on the supplied ACL. This - * makes sure that the mode on the file reflects the state of the - * u::,g::[m::], and o:: entries in the ACL. Since the mode is where - * the ACL is going to get the permissions for these entries, we must - * synchronize the mode whenever we set the ACL on a file. - */ -STATIC int -xfs_acl_setmode( - struct inode *vp, - xfs_acl_t *acl, - int *basicperms) -{ - struct iattr iattr; - xfs_acl_entry_t *ap; - xfs_acl_entry_t *gap = NULL; - int i, nomask = 1; - - *basicperms = 1; - - if (acl->acl_cnt == XFS_ACL_NOT_PRESENT) - return 0; - - /* - * Copy the u::, g::, o::, and m:: bits from the ACL into the - * mode. The m:: bits take precedence over the g:: bits. - */ - iattr.ia_valid = ATTR_MODE; - iattr.ia_mode = XFS_I(vp)->i_d.di_mode; - iattr.ia_mode &= ~(S_IRWXU|S_IRWXG|S_IRWXO); - ap = acl->acl_entry; - for (i = 0; i < acl->acl_cnt; ++i) { - switch (ap->ae_tag) { - case ACL_USER_OBJ: - iattr.ia_mode |= ap->ae_perm << 6; - break; - case ACL_GROUP_OBJ: - gap = ap; - break; - case ACL_MASK: /* more than just standard modes */ - nomask = 0; - iattr.ia_mode |= ap->ae_perm << 3; - *basicperms = 0; - break; - case ACL_OTHER: - iattr.ia_mode |= ap->ae_perm; - break; - default: /* more than just standard modes */ - *basicperms = 0; - break; - } - ap++; - } - - /* Set the group bits from ACL_GROUP_OBJ if there's no ACL_MASK */ - if (gap && nomask) - iattr.ia_mode |= gap->ae_perm << 3; - - return xfs_setattr(XFS_I(vp), &iattr, 0); -} - -/* - * The permissions for the special ACL entries (u::, g::[m::], o::) are - * actually stored in the file mode (if there is both a group and a mask, - * the group is stored in the ACL entry and the mask is stored on the file). - * This allows the mode to remain automatically in sync with the ACL without - * the need for a call-back to the ACL system at every point where the mode - * could change. This function takes the permissions from the specified mode - * and places it in the supplied ACL. - * - * This implementation draws its validity from the fact that, when the ACL - * was assigned, the mode was copied from the ACL. - * If the mode did not change, therefore, the mode remains exactly what was - * taken from the special ACL entries at assignment. - * If a subsequent chmod() was done, the POSIX spec says that the change in - * mode must cause an update to the ACL seen at user level and used for - * access checks. Before and after a mode change, therefore, the file mode - * most accurately reflects what the special ACL entries should permit/deny. - * - * CAVEAT: If someone sets the SGI_ACL_FILE attribute directly, - * the existing mode bits will override whatever is in the - * ACL. Similarly, if there is a pre-existing ACL that was - * never in sync with its mode (owing to a bug in 6.5 and - * before), it will now magically (or mystically) be - * synchronized. This could cause slight astonishment, but - * it is better than inconsistent permissions. - * - * The supplied ACL is a template that may contain any combination - * of special entries. These are treated as place holders when we fill - * out the ACL. This routine does not add or remove special entries, it - * simply unites each special entry with its associated set of permissions. - */ -STATIC void -xfs_acl_sync_mode( - mode_t mode, - xfs_acl_t *acl) -{ - int i, nomask = 1; - xfs_acl_entry_t *ap; - xfs_acl_entry_t *gap = NULL; - - /* - * Set ACL entries. POSIX1003.1eD16 requires that the MASK - * be set instead of the GROUP entry, if there is a MASK. - */ - for (ap = acl->acl_entry, i = 0; i < acl->acl_cnt; ap++, i++) { - switch (ap->ae_tag) { - case ACL_USER_OBJ: - ap->ae_perm = (mode >> 6) & 0x7; - break; - case ACL_GROUP_OBJ: - gap = ap; - break; - case ACL_MASK: - nomask = 0; - ap->ae_perm = (mode >> 3) & 0x7; - break; - case ACL_OTHER: - ap->ae_perm = mode & 0x7; - break; - default: - break; - } - } - /* Set the ACL_GROUP_OBJ if there's no ACL_MASK */ - if (gap && nomask) - gap->ae_perm = (mode >> 3) & 0x7; -} - -/* - * When inheriting an Access ACL from a directory Default ACL, - * the ACL bits are set to the intersection of the ACL default - * permission bits and the file permission bits in mode. If there - * are no permission bits on the file then we must not give them - * the ACL. This is what what makes umask() work with ACLs. - */ -STATIC void -xfs_acl_filter_mode( - mode_t mode, - xfs_acl_t *acl) -{ - int i, nomask = 1; - xfs_acl_entry_t *ap; - xfs_acl_entry_t *gap = NULL; - - /* - * Set ACL entries. POSIX1003.1eD16 requires that the MASK - * be merged with GROUP entry, if there is a MASK. - */ - for (ap = acl->acl_entry, i = 0; i < acl->acl_cnt; ap++, i++) { - switch (ap->ae_tag) { - case ACL_USER_OBJ: - ap->ae_perm &= (mode >> 6) & 0x7; - break; - case ACL_GROUP_OBJ: - gap = ap; - break; - case ACL_MASK: - nomask = 0; - ap->ae_perm &= (mode >> 3) & 0x7; - break; - case ACL_OTHER: - ap->ae_perm &= mode & 0x7; - break; - default: - break; - } - } - /* Set the ACL_GROUP_OBJ if there's no ACL_MASK */ - if (gap && nomask) - gap->ae_perm &= (mode >> 3) & 0x7; -} Index: xfs/fs/xfs/xfs_acl.h =================================================================== --- xfs.orig/fs/xfs/xfs_acl.h 2009-05-27 12:59:33.878814836 +0200 +++ xfs/fs/xfs/xfs_acl.h 2009-06-08 20:13:15.986851487 +0200 @@ -18,81 +18,48 @@ #ifndef __XFS_ACL_H__ #define __XFS_ACL_H__ -/* - * Access Control Lists - */ -typedef __uint16_t xfs_acl_perm_t; -typedef __int32_t xfs_acl_tag_t; -typedef __int32_t xfs_acl_id_t; +struct inode; +struct posix_acl; +struct xfs_inode; #define XFS_ACL_MAX_ENTRIES 25 #define XFS_ACL_NOT_PRESENT (-1) -typedef struct xfs_acl_entry { - xfs_acl_tag_t ae_tag; - xfs_acl_id_t ae_id; - xfs_acl_perm_t ae_perm; -} xfs_acl_entry_t; - -typedef struct xfs_acl { - __int32_t acl_cnt; - xfs_acl_entry_t acl_entry[XFS_ACL_MAX_ENTRIES]; -} xfs_acl_t; +/* On-disk XFS access control list structure */ +struct xfs_acl { + __be32 acl_cnt; + struct xfs_acl_entry { + __be32 ae_tag; + __be32 ae_id; + __be16 ae_perm; + } acl_entry[XFS_ACL_MAX_ENTRIES]; +}; /* On-disk XFS extended attribute names */ -#define SGI_ACL_FILE "SGI_ACL_FILE" -#define SGI_ACL_DEFAULT "SGI_ACL_DEFAULT" +#define SGI_ACL_FILE "SGI_ACL_FILE" +#define SGI_ACL_DEFAULT "SGI_ACL_DEFAULT" #define SGI_ACL_FILE_SIZE (sizeof(SGI_ACL_FILE)-1) #define SGI_ACL_DEFAULT_SIZE (sizeof(SGI_ACL_DEFAULT)-1) -#define _ACL_TYPE_ACCESS 1 -#define _ACL_TYPE_DEFAULT 2 - #ifdef CONFIG_XFS_POSIX_ACL +extern int xfs_check_acl(struct inode *inode, int mask); +extern struct posix_acl *xfs_get_acl(struct inode *inode, int type); +extern int xfs_inherit_acl(struct inode *inode, struct posix_acl *default_acl); +extern int xfs_acl_chmod(struct inode *inode); +extern void xfs_inode_init_acls(struct xfs_inode *ip); +extern void xfs_inode_clear_acls(struct xfs_inode *ip); +extern int posix_acl_access_exists(struct inode *inode); +extern int posix_acl_default_exists(struct inode *inode); -struct vattr; -struct xfs_inode; - -extern struct kmem_zone *xfs_acl_zone; -#define xfs_acl_zone_init(zone, name) \ - (zone) = kmem_zone_init(sizeof(xfs_acl_t), (name)) -#define xfs_acl_zone_destroy(zone) kmem_zone_destroy(zone) - -extern int xfs_acl_inherit(struct inode *, mode_t mode, xfs_acl_t *); -extern int xfs_acl_iaccess(struct xfs_inode *, mode_t, cred_t *); -extern int xfs_acl_vtoacl(struct inode *, xfs_acl_t *, xfs_acl_t *); -extern int xfs_acl_vhasacl_access(struct inode *); -extern int xfs_acl_vhasacl_default(struct inode *); -extern int xfs_acl_vset(struct inode *, void *, size_t, int); -extern int xfs_acl_vget(struct inode *, void *, size_t, int); -extern int xfs_acl_vremove(struct inode *, int); - -#define _ACL_PERM_INVALID(perm) ((perm) & ~(ACL_READ|ACL_WRITE|ACL_EXECUTE)) - -#define _ACL_INHERIT(c,m,d) (xfs_acl_inherit(c,m,d)) -#define _ACL_GET_ACCESS(pv,pa) (xfs_acl_vtoacl(pv,pa,NULL) == 0) -#define _ACL_GET_DEFAULT(pv,pd) (xfs_acl_vtoacl(pv,NULL,pd) == 0) -#define _ACL_ACCESS_EXISTS xfs_acl_vhasacl_access -#define _ACL_DEFAULT_EXISTS xfs_acl_vhasacl_default - -#define _ACL_ALLOC(a) ((a) = kmem_zone_alloc(xfs_acl_zone, KM_SLEEP)) -#define _ACL_FREE(a) ((a)? kmem_zone_free(xfs_acl_zone, (a)):(void)0) - +extern struct xattr_handler xfs_xattr_system_handler; #else -#define xfs_acl_zone_init(zone,name) -#define xfs_acl_zone_destroy(zone) -#define xfs_acl_vset(v,p,sz,t) (-EOPNOTSUPP) -#define xfs_acl_vget(v,p,sz,t) (-EOPNOTSUPP) -#define xfs_acl_vremove(v,t) (-EOPNOTSUPP) -#define xfs_acl_vhasacl_access(v) (0) -#define xfs_acl_vhasacl_default(v) (0) -#define _ACL_ALLOC(a) (1) /* successfully allocate nothing */ -#define _ACL_FREE(a) ((void)0) -#define _ACL_INHERIT(c,m,d) (0) -#define _ACL_GET_ACCESS(pv,pa) (0) -#define _ACL_GET_DEFAULT(pv,pd) (0) -#define _ACL_ACCESS_EXISTS (NULL) -#define _ACL_DEFAULT_EXISTS (NULL) -#endif - +# define xfs_check_acl NULL +# define xfs_get_acl(inode, type) NULL +# define xfs_inherit_acl(inode, default_acl) 0 +# define xfs_acl_chmod(inode) 0 +# define xfs_inode_init_acls(ip) +# define xfs_inode_clear_acls(ip) +# define posix_acl_access_exists(inode) 0 +# define posix_acl_default_exists(inode) 0 +#endif /* CONFIG_XFS_POSIX_ACL */ #endif /* __XFS_ACL_H__ */ Index: xfs/fs/xfs/xfs_iget.c =================================================================== --- xfs.orig/fs/xfs/xfs_iget.c 2009-06-08 15:33:32.349939542 +0200 +++ xfs/fs/xfs/xfs_iget.c 2009-06-08 20:13:15.989816599 +0200 @@ -18,6 +18,7 @@ #include "xfs.h" #include "xfs_fs.h" #include "xfs_types.h" +#include "xfs_acl.h" #include "xfs_bit.h" #include "xfs_log.h" #include "xfs_inum.h" @@ -82,6 +83,7 @@ xfs_inode_alloc( memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); ip->i_size = 0; ip->i_new_size = 0; + xfs_inode_init_acls(ip); /* * Initialize inode's trace buffers. @@ -558,6 +560,7 @@ xfs_ireclaim( ASSERT(atomic_read(&ip->i_pincount) == 0); ASSERT(!spin_is_locked(&ip->i_flags_lock)); ASSERT(completion_done(&ip->i_flush)); + xfs_inode_clear_acls(ip); kmem_zone_free(xfs_inode_zone, ip); } Index: xfs/fs/xfs/xfs_inode.c =================================================================== --- xfs.orig/fs/xfs/xfs_inode.c 2009-05-27 12:59:33.887814585 +0200 +++ xfs/fs/xfs/xfs_inode.c 2009-06-08 20:13:15.996816304 +0200 @@ -49,7 +49,6 @@ #include "xfs_utils.h" #include "xfs_dir2_trace.h" #include "xfs_quota.h" -#include "xfs_acl.h" #include "xfs_filestream.h" #include "xfs_vnodeops.h" Index: xfs/fs/xfs/xfs_arch.h =================================================================== --- xfs.orig/fs/xfs/xfs_arch.h 2009-05-27 12:59:33.893814302 +0200 +++ xfs/fs/xfs/xfs_arch.h 2009-06-08 20:13:15.998828222 +0200 @@ -73,28 +73,6 @@ static inline void be64_add_cpu(__be64 * #endif /* __KERNEL__ */ -/* do we need conversion? */ -#define ARCH_NOCONVERT 1 -#ifdef XFS_NATIVE_HOST -# define ARCH_CONVERT ARCH_NOCONVERT -#else -# define ARCH_CONVERT 0 -#endif - -/* generic swapping macros */ - -#ifndef HAVE_SWABMACROS -#define INT_SWAP16(type,var) ((typeof(type))(__swab16((__u16)(var)))) -#define INT_SWAP32(type,var) ((typeof(type))(__swab32((__u32)(var)))) -#define INT_SWAP64(type,var) ((typeof(type))(__swab64((__u64)(var)))) -#endif - -#define INT_SWAP(type, var) \ - ((sizeof(type) == 8) ? INT_SWAP64(type,var) : \ - ((sizeof(type) == 4) ? INT_SWAP32(type,var) : \ - ((sizeof(type) == 2) ? INT_SWAP16(type,var) : \ - (var)))) - /* * get and set integers from potentially unaligned locations */ @@ -107,16 +85,6 @@ static inline void be64_add_cpu(__be64 * ((__u8*)(pointer))[1] = (((value) ) & 0xff); \ } -/* does not return a value */ -#define INT_SET(reference,arch,valueref) \ - (__builtin_constant_p(valueref) ? \ - (void)( (reference) = ( ((arch) != ARCH_NOCONVERT) ? (INT_SWAP((reference),(valueref))) : (valueref)) ) : \ - (void)( \ - ((reference) = (valueref)), \ - ( ((arch) != ARCH_NOCONVERT) ? (reference) = INT_SWAP((reference),(reference)) : 0 ) \ - ) \ - ) - /* * In directories inode numbers are stored as unaligned arrays of unsigned * 8bit integers on disk. From zengzhiping.good@vip.163.com Tue Jun 9 04:46:27 2009 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id n599kOvA027489 for ; Tue, 9 Jun 2009 04:46:25 -0500 X-ASG-Debug-ID: 1244540762-21c501db0000-w1Z2WR X-Barracuda-URL: http://cuda.sgi.com:80/cgi-bin/mark.cgi Received: from m14-53.vip.163.com (localhost [127.0.0.1]) by cuda.sgi.com (Spam Firewall) with ESMTP id 1AB692E0559 for ; Tue, 9 Jun 2009 02:46:03 -0700 (PDT) Received: from m14-53.vip.163.com (m14-53.vip.163.com [220.181.14.53]) by cuda.sgi.com with ESMTP id 2wIwGj8lPJSXDEaj for ; Tue, 09 Jun 2009 02:46:03 -0700 (PDT) Received: from zengzhiping.good ( [58.248.7.142] ) by ajax-webmail-wmsvr3 (Coremail) ; Tue, 9 Jun 2009 13:44:59 +0800 (CST) Date: Tue, 9 Jun 2009 13:44:59 +0800 (CST) From: "zengzhiping.good" To: commons-dev-digest , dev , hivemind-dev , fvwm , linuxers , commits , dev , hit-dev , fvwm , linux , commits , dev , hibernate-devel , fvwm , linux , commits , dev , hibernate-dev , fupm-mm2100 , linux , commander-list , dev , hhs-oig-media-l , acronimbus , funcionarios-crh , linux-xfs , commander-list-digest , dev , herbyswildworld2 , full-disclosure , linux-usb-users , comm-dev-forum , dev , herb-recipe , full-disclosure , linux-usb-devel , comm-dev-forum , dev , helptheanimals , fugli , linux-raid , colorsync-users , dev , help , ftba-devel , linux-ppp , colorsync-dev , dev , "matthias.emmert" , help-xlogmaster , ftba-commits , linux-newbie , coffeehouse , dev , help-vcdimager , fsfe-uk , linux-net , cocoa-dev , webmaster , dev , help-texinfo , fsfe-translators , linux-msdos , cockapoo , dev , help-tar , support , fsfe-nl , linux-m68k , cobaltfacts , dev-tech-xpinstall , help-sweater , fsfe-newsfr-fr , linux-laptop , cobalt-users , dev-tech-xpcom , help-stow , fsfe-newsfr-en , linux-kernel , ope , dev-tech-network , help-source-highlight , fsfe-france , webmaster , linux-kernel-announce , cml , dev-tech-ldap , forum , help-snakecharmer , fsfe-france-sci , linux-kernel-announce , cma-l , dev-tech-layout , help-snacc , support , fsfe-france-pr , linux-india-help , cluster , dev-tech-editor , help-smalltalk Message-ID: <23834958.639421244526299501.JavaMail.coremail@g1a53.vip.163.com> X-ASG-Orig-Subj: =?gbk?B?1sfE3M2oxrfFxiBJQy9JRL+ow8W9+8+1zbOhosrV?= =?gbk?B?t9HPtc2zoaK2qbLNytW30c+1zbOhosuuv9i53MDtz7XNs6Gi?= =?gbk?B?tee/2LncwO3Ptc2zoaK/vMfaz7XNs6Gi1rjOxsPFvfvPtc2z?= =?gbk?B?INa4zsa/vMfaz7XNs6Givfiz9s2otcC53MDtz7XNsyAg?= Subject: =?gbk?B?1sfE3M2oxrfFxiBJQy9JRL+ow8W9+8+1zbOhosrV?= =?gbk?B?t9HPtc2zoaK2qbLNytW30c+1zbOhosuuv9i53MDtz7XNs6Gi?= =?gbk?B?tee/2LncwO3Ptc2zoaK/vMfaz7XNs6Gi1rjOxsPFvfvPtc2z?= =?gbk?B?INa4zsa/vMfaz7XNs6Givfiz9s2otcC53MDtz7XNsyAg?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_171466_24122326.1244526299466" X-Originating-IP: [58.248.7.142] Disposition-Notification-To: zengzhiping.good@vip.163.com X-Priority: 1 X-Mailer: Coremail Webmail Server Version XT2_snapshot build 090513(7592.2351.2332) Copyright (c) 2002-2009 www.mailtech.cn 163vip X-CM-TRANSID: ZwiowKBr5QHc9i1K4M0ZAA--.43494W X-CM-SenderInfo: p2hqw6pklsx03joj00ng6yx1iorwjhhfrp/ X-Coremail-Antispam: 1Ur529EdanIXcx71UUUUU7IcSsGvfJTRUUUbYAYjxAI67I2x7 xF5VCq3s1lb7IF0VAFz4v204v264kEYxAxM7k042IEFTZYmTnxM7k042IE42xK82IY64kI x2x0424lb7IF0VCF04k20xvEscIUGFyrM7k042IE4IxYO2xFxVAqjxCEw4Av424lb7IF0V CIc40E14yln7xl0VAFz4vEwTZvWa43M2k0o2IE14AK6ss0LwAajcAI6xAYOVCqmInELaWl n7IjY7xE6298M2k07cx0zVASpT9fM2k07cx0zVAlq-4ln7IjY7xE6InkMc804VCqF7xvr2 I5MxCIbVA2zIxYr2IEbsI20wCS07vEb7Iv0xC_Jr1lV2xY67kC6x804xWlV2xY67AvxsIE eIx0w2Cm54CxMIAIbVAFxVCF77xC64kEw24lV2xY67C26IkvcIIF6IxKo4kEV4ylV2xY62 AExVA0xI801c8C04v7MIAIbVAqx4xG62kEwI0EbcxfMIAIbVAqx4xG64xvF2IEw4CE5I8C rVC2j2WlV2xY6cIj6x8ErcxFaVAv8VWUMIAIbVAv7VC0I7IYx2IY67AKxVWUJVWUGwCS07 vEYx0Ex4A2jsIE14v26r1j6r4UMIAIbVACI402YVCY1x02628vn2kIc2xKxwCS07vE7I0Y 64k_MIAIbVCY1Ik26cxK6x8YrwCS07vEc2xSY4AK67AK6r4rMIAIbVCY0x0Ix7I2Y4AK6r 4j6ryUMIAIbVCF72vE77IF4bIYCTnIWIevJa73U X-Barracuda-Connect: m14-53.vip.163.com[220.181.14.53] X-Barracuda-Start-Time: 1244540801 X-Barracuda-Virus-Scanned: by cuda.sgi.com at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=2.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.1 X-Virus-Scanned: ClamAV version 0.94.2, clamav-milter version 0.94.2 on oss.sgi.com X-Virus-Status: Clean ------=_Part_171466_24122326.1244526299466 Content-Type: multipart/alternative; boundary="----=_Part_171468_19068586.1244526299466" ------=_Part_171468_19068586.1244526299466 Content-Type: text/plain; charset=gbk Content-Transfer-Encoding: base64 CgrX8L60tcS+rcDto7oKCiAgICAgICAgxPq6w6OhCgogICAgILmk0rW8trL6xrehormmxNzHv7Tz o6zWysG/zsi2qKGixfrBv8TDu/WhorzbuPG4/NPFu92joaOhICC7ttOttqm5uiAgKM/Wvauy+sa3 T0VNtPrA7bzbtKvT68T6oaLPo837xNy5u9PrufO5q8u+us/X9ykKCiAgICDWx8TczajGt8XGICBJ Qy9JRL+ow8W9+8+1zbOhosrVt9HPtc2zoaK2qbLNytW30c+1zbOhosuuv9i53MDtz7XNs6Gitee/ 2LncwO3Ptc2zoaK/vMfaz7XNs6Gi1rjOxsPFvfvPtc2zINa4zsa/vMfaz7XNs6Givfiz9s2otcC5 3MDtz7XNswoKCiAgICAguePW3crQ1sfJ/bXn19O/xry809DP3rmry77Kx9K7vNLXqNK11sLBptPa obDSu7+ozaihsc+1zbO1xMnosbjJ+rL6oaLI7bz+v6q3oqGiz7XNs9X7us+1xNHQt6LQzb/GvLy5 q8u+o6y5q8u+vLTT0CCjqNbHxNzNqKOpxrfFxsirz7XB0MPFvfuhor+8x9qhosqzzMPK1bfRoaLW uM7Gw8W9+7+8x9qhosuuv9i53MDtoaK157/YytW30aGitefM3bncwO2hotGyuPyhos2js7WzoaGi 0KPUsNK7v6jNqKGixvPStdK7v6jNqKGi0KHH+NK7v6jNqLXIz7XNs7XE07K8/rywz+C52MjtvP6y +sa3LM2syrHOqsHLysrTprK7zazTw7untcS49tDUu6/Q6Mfzo6y7ub/JuPm+3dPDu6fQ6MfzzqrT w7unwb/J7bap1sbSu8zX16jTw8+1zbOho7mry767udO109DW1sDgxuvIq7XEuPfW1tOyvP7J6LG4 o6zU2sL61+O499bWuabE3NDox/O1xM2syrHIw7/Nu6fE3Lm707XT0Lj8tuC1xNGh1PG/1bzkoaMK CiAgICDNqLn9tuDE6rXExazBpqOsuavLvs/W0tHTtdPQyq68uNbW1sfE3L+osvrGt7XEz7XNs7+q t6LT69Om08O+rdHpo6zTtdPQ0rvWp7zitsu1xNeo0rW8vMr1yMuyxbbTzumjrNTav8a8vLei1bnI 1dDC1MLS7LXEvfHM7KOsztK5q8u+vau84bPW0tTOyLaooaLKytPDoaLKtdPDtcTUrdTyo6zOqrj3 tdi/zcnMzOG5qbPJyuy/yb+/tcSy+sa3z7XNs9LUvLDTxcG8tcTIq7PMuPrX2bf+zvGjoQoKICAg IL/GvLy4xLHkyfq77qOszt7P38nkxrW8vMr10tS8sMn6zu/KtrHwvLzK9dPryMvDx7XEyfq77sjV 0ua99MPco6zX986q16jStbXEzt7P38nkxrW8vMr10tS8sMn6zu/KtrHwvLzK9bXEsvrGt9Om08O/ qreiuavLvqOs1sfJ/bXn19O/xry8vauyu7bPtcS4+tfZt9bO9tDCtcTK0LOh0OjH86OsvLDKsbXE tffV+7L6xre94bm5o6y/qrei0MK1xLmmxNyjrM3Gs/a4/LrDtcSy+sa3o6EKCtS4xPq1xMn6u+7S 8s7Sw8e1xMWswaa2+Lj8vNPK5srKo6EKCiAKCtejo7oKCiAgICC5pNf3y7PA+woKICAgIMWjxOq0 87eio6GjoaOhCgogCgq549bdytDWx8n9tefX07/GvLzT0M/euavLvgrU+ObDo7oxNTgxNDg2ODU5 NiAgICAgICAgICAgICAgICAgICAgICAgICAgVEVMOjAyMC04MjUyMjIyMSAgRkFYOjAyMC04MjUy MTYyMQrTyrHgOjUxMDY2MCAgICBxcTo4NDkzODQyMTIK08rP5KO6emVuZ3poaXBpbmcuZ29vZEAx NjMuY29tCs341rejund3dy5nenpudC5jb20uY24KuePW3crQzOy608f4tqvG1LTzwu3CtzO6xdHF 4vm488731/kxMDEzCgoKCg== ------=_Part_171468_19068586.1244526299466 Content-Type: text/html; charset=gbk Content-Transfer-Encoding: quoted-printable

=D7=F0=BE=B4=B5=C4=BE=AD=C0=ED=A3=BA

        =C4=FA=BA=C3=A3=A1

     =B9= =A4=D2=B5=BC=B6=B2=FA=C6=B7=A1=A2=B9=A6=C4=DC=C7=BF=B4=F3=A3=AC=D6=CA=C1=BF= =CE=C8=B6=A8=A1=A2=C5=FA=C1=BF=C4=C3=BB=F5=A1=A2=BC=DB=B8=F1=B8=FC=D3=C5=BB= =DD=A3=A1=A3=A1  =BB=B6=D3=AD=B6=A9=B9=BA  (=CF=D6=BD=AB=B2=FA=C6=B7OEM=B4=FA=C0=ED=BC=DB=B4=AB=D3=EB=C4=FA=A1=A2=CF= =A3=CD=FB=C4=DC=B9=BB=D3=EB=B9=F3=B9=AB=CB=BE=BA=CF=D7=F7)

    =D6= =C7=C4=DC=CD=A8=C6=B7=C5=C6  IC/ID=BF=A8=C3=C5=BD=FB=CF=B5=CD=B3=A1=A2= =CA=D5=B7=D1=CF=B5=CD=B3=A1=A2=B6=A9=B2=CD=CA=D5=B7=D1=CF=B5=CD=B3=A1=A2=CB= =AE=BF=D8=B9=DC=C0=ED=CF=B5=CD=B3=A1=A2=B5=E7=BF=D8=B9=DC=C0=ED=CF=B5=CD=B3= =A1=A2=BF=BC=C7=DA=CF=B5=CD=B3=A1=A2=D6=B8=CE=C6=C3=C5=BD=FB=CF=B5=CD=B3 = =D6=B8=CE=C6=BF=BC=C7=DA=CF=B5=CD=B3=A1=A2=BD=F8=B3=F6=CD=A8=B5=C0=B9=DC=C0= =ED=CF=B5=CD=B3


     =B9=E3=D6=DD=CA=D0=D6=C7=C9=FD=B5=E7=D7=D3= =BF=C6=BC=BC=D3=D0=CF=DE=B9=AB=CB=BE=CA=C7=D2=BB=BC=D2=D7=A8=D2=B5=D6=C2=C1= =A6=D3=DA=A1=B0=D2=BB=BF=A8=CD=A8=A1=B1=CF=B5=CD=B3=B5=C4=C9=E8=B1=B8=C9=FA= =B2=FA=A1=A2=C8=ED=BC=FE=BF=AA=B7=A2=A1=A2=CF=B5=CD=B3=D5=FB=BA=CF=B5=C4=D1= =D0=B7=A2=D0=CD=BF=C6=BC=BC=B9=AB=CB=BE=A3=AC=B9=AB=CB=BE=BC=B4=D3=D0 =A3= =A8=D6=C7=C4=DC=CD=A8=A3=A9=C6=B7=C5=C6=C8=AB=CF=B5=C1=D0=C3=C5=BD=FB=A1=A2= =BF=BC=C7=DA=A1=A2=CA=B3=CC=C3=CA=D5=B7=D1=A1=A2=D6=B8=CE=C6=C3=C5=BD=FB=BF= =BC=C7=DA=A1=A2=CB=AE=BF=D8=B9=DC=C0=ED=A1=A2=B5=E7=BF=D8=CA=D5=B7=D1=A1=A2= =B5=E7=CC=DD=B9=DC=C0=ED=A1=A2=D1=B2=B8=FC=A1=A2=CD=A3=B3=B5=B3=A1=A1=A2=D0= =A3=D4=B0=D2=BB=BF=A8=CD=A8=A1=A2=C6=F3=D2=B5=D2=BB=BF=A8=CD=A8=A1=A2=D0=A1= =C7=F8=D2=BB=BF=A8=CD=A8=B5=C8=CF=B5=CD=B3=B5=C4=D3=B2=BC=FE=BC=B0=CF=E0=B9= =D8=C8=ED=BC=FE=B2=FA=C6=B7,=CD=AC=CA=B1=CE=AA=C1=CB=CA=CA=D3=A6=B2=BB=CD= =AC=D3=C3=BB=A7=B5=C4=B8=F6=D0=D4=BB=AF=D0=E8=C7=F3=A3=AC=BB=B9=BF=C9=B8=F9= =BE=DD=D3=C3=BB=A7=D0=E8=C7=F3=CE=AA=D3=C3=BB=A7=C1=BF=C9=ED=B6=A9=D6=C6=D2= =BB=CC=D7=D7=A8=D3=C3=CF=B5=CD=B3=A1=A3=B9=AB=CB=BE=BB=B9=D3=B5=D3=D0=D6=D6= =C0=E0=C6=EB=C8=AB=B5=C4=B8=F7=D6=D6=D3=B2=BC=FE=C9=E8=B1=B8=A3=AC=D4=DA=C2= =FA=D7=E3=B8=F7=D6=D6=B9=A6=C4=DC=D0=E8=C7=F3=B5=C4=CD=AC=CA=B1=C8=C3=BF=CD= =BB=A7=C4=DC=B9=BB=D3=B5=D3=D0=B8=FC=B6=E0=B5=C4=D1=A1=D4=F1=BF=D5=BC=E4=A1= =A3

    =CD=A8=B9=FD=B6=E0=C4=EA=B5=C4=C5=AC=C1=A6=A3=AC=B9= =AB=CB=BE=CF=D6=D2=D1=D3=B5=D3=D0=CA=AE=BC=B8=D6=D6=D6=C7=C4=DC=BF=A8=B2=FA= =C6=B7=B5=C4=CF=B5=CD=B3=BF=AA=B7=A2=D3=EB=D3=A6=D3=C3=BE=AD=D1=E9=A3=AC=D3= =B5=D3=D0=D2=BB=D6=A7=BC=E2=B6=CB=B5=C4=D7=A8=D2=B5=BC=BC=CA=F5=C8=CB=B2=C5= =B6=D3=CE=E9=A3=AC=D4=DA=BF=C6=BC=BC=B7=A2=D5=B9=C8=D5=D0=C2=D4=C2=D2=EC=B5= =C4=BD=F1=CC=EC=A3=AC=CE=D2=B9=AB=CB=BE=BD=AB=BC=E1=B3=D6=D2=D4=CE=C8=B6=A8= =A1=A2=CA=CA=D3=C3=A1=A2=CA=B5=D3=C3=B5=C4=D4=AD=D4=F2=A3=AC=CE=AA=B8=F7=B5= =D8=BF=CD=C9=CC=CC=E1=B9=A9=B3=C9=CA=EC=BF=C9=BF=BF=B5=C4=B2=FA=C6=B7=CF=B5= =CD=B3=D2=D4=BC=B0=D3=C5=C1=BC=B5=C4=C8=AB=B3=CC=B8=FA=D7=D9=B7=FE=CE=F1=A3= =A1

    =BF=C6=BC=BC=B8=C4=B1=E4=C9=FA=BB=EE=A3=AC=CE=DE=CF= =DF=C9=E4=C6=B5=BC=BC=CA=F5=D2=D4=BC=B0=C9=FA=CE=EF=CA=B6=B1=F0=BC=BC=CA=F5= =D3=EB=C8=CB=C3=C7=B5=C4=C9=FA=BB=EE=C8=D5=D2=E6=BD=F4=C3=DC=A3=AC=D7=F7=CE= =AA=D7=A8=D2=B5=B5=C4=CE=DE=CF=DF=C9=E4=C6=B5=BC=BC=CA=F5=D2=D4=BC=B0=C9=FA= =CE=EF=CA=B6=B1=F0=BC=BC=CA=F5=B5=C4=B2=FA=C6=B7=D3=A6=D3=C3=BF=AA=B7=A2=B9= =AB=CB=BE=A3=AC=D6=C7=C9=FD=B5=E7=D7=D3=BF=C6=BC=BC=BD=AB=B2=BB=B6=CF=B5=C4= =B8=FA=D7=D9=B7=D6=CE=F6=D0=C2=B5=C4=CA=D0=B3=A1=D0=E8=C7=F3=A3=AC=BC=B0=CA= =B1=B5=C4=B5=F7=D5=FB=B2=FA=C6=B7=BD=E1=B9=B9=A3=AC=BF=AA=B7=A2=D0=C2=B5=C4= =B9=A6=C4=DC=A3=AC=CD=C6=B3=F6=B8=FC=BA=C3=B5=C4=B2=FA=C6=B7=A3=A1

=D4=B8=C4=FA=B5=C4=C9=FA=BB=EE=D2=F2=CE=D2=C3=C7=B5=C4=C5=AC=C1=A6=B6=F8= =B8=FC=BC=D3=CA=E6=CA=CA=A3=A1

 

=D7=A3=A3=BA

    =B9=A4=D7=F7=CB=B3=C0=FB

    =C5=A3=C4=EA=B4=F3=B7=A2=A3=A1=A3=A1=A3=A1

 

=B9=E3=D6=DD=CA=D0=D6=C7=C9= =FD=B5=E7=D7=D3=BF=C6=BC=BC=D3=D0=CF=DE=B9=AB=CB=BE=
=D4=F8=E6=C3=A3=BA15814868596&= nbsp;           &nbs= p;             =
TEL:020-8= 2522221  FAX:020-82521621
=D3=CA=B1=E0:510660    qq:= 849384212
=D3=CA=CF=E4=A3=BA
zengzhiping.good@163.com
=CD=F8=D6=B7=A3=BA= www.gzznt.com.cn
=B9=E3=D6=DD=CA=D0=CC=EC=BA=D3=C7=F8=B6=AB=C6=D4=B4=F3=C2=ED= =C2=B73=BA=C5=D1=C5=E2=F9=B8=F3=CE=F7=D7=F91013
<= /P>


------=_Part_171468_19068586.1244526299466-- ------=_Part_171466_24122326.1244526299466 Content-Type: application/vnd.ms-excel; name="=?gbk?Q?=D6=C7=C4=DC=CD=A8OEM_=B4=FA=C0=ED=BC=DB.xls?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?gbk?Q?=D6=C7=C4=DC=CD=A8OEM_=B4=FA=C0=ED=BC=DB.xls?=" 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAAjAAAAAQAAAAAAAAAA EAAAAwAAAAEAAAD+////AAAAAAAAAABzAAAA9AAAAHUBAAD2AQAAdwIAAPgCAAB5AwAA+gMAAHsE AAD8BAAAfQUAAP4FAAB/BgAAAAcAAGEHAADiBwAAYwgAAOQIAABlCQAA5gkAAGcKAADoCgAAaQsA AOoLAABrDAAA7AwAAG0NAADuDQAAbw4AAPAOAABxDwAA8g8AAHMQAAD0EAAA//////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////9 ////AgAAAAUAAAD+////LREAAC4RAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8A AAAQAAAAEQAAABIAAAATAAAAFAAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAAAAHQAA AB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAA LAAAAC0AAAAuAAAALwAAADAAAAAxAAAAMgAAAP7///80AAAANQAAADYAAAA3AAAAOAAAADkAAAA6 AAAAOwAAADwAAAA9AAAAPgAAAD8AAABAAAAAQQAAAEIAAABDAAAARAAAAEUAAABGAAAARwAAAEgA AABJAAAASgAAAEsAAABMAAAATQAAAE4AAABPAAAAUAAAAFEAAABSAAAAUwAAAFQAAABVAAAAVgAA AFcAAABYAAAAWQAAAFoAAABbAAAAXAAAAF0AAABeAAAAXwAAAGAAAABhAAAAYgAAAGMAAABkAAAA ZQAAAGYAAABnAAAAaAAAAGkAAABqAAAAawAAAGwAAABtAAAAbgAAAG8AAABwAAAAcQAAAHIAAAB0 AAAA/f///3UAAAB2AAAAdwAAAHgAAAB5AAAAegAAAHsAAAB8AAAAfQAAAH4AAAB/AAAAgAAAAFIA bwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAWAAUA//////////8DAAAAIAgCAAAAAADAAAAAAAAARgAAAAAgIeO014jJAQCewG3qpckB BAAAAMAFAAAAAAAAVwBvAHIAawBiAG8AbwBrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAABIAAgENAAAA//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAzAAAASq8hAAAAAABNAEIARAAwADAAMAA2ADgAMABGAEYAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAABAP//////////BQAAAAoAAwAAAAAA wAAAAAAAAEYAAAAAAJWDbeqlyQEAlYNt6qXJAQAAAAAAAAAAAAAAAE0AQgBEADAAMAAwADUAMgBG ADcAQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAEBAQAAAAsA AAAJAAAACgADAAAAAADAAAAAAAAARgAAAAAAlYNt6qXJAWB4mm3qpckBAAAAAAAAAAAAAAAAAQBP AGwAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAoAAgH///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAFAAAAAAAAAABAEMAbwBtAHAATwBiAGoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAEgACAQQAAAAGAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAEAAABNAAAAAAAAAAEATwBsAGUAMQAwAE4AYQB0AGkAdgBlAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAIB/////wcAAAD/////AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAAAAAAAAAQBPAGwAZQAxADAASQB0AGUA bQBOAGEAbQBlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAgD///////// //////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAABQAAAAAAAAD+//// AgAAAP7////+/////v///wYAAAD+////CAAAAAkAAAAKAAAA/v///wwAAAANAAAADgAAAA8AAAAQ AAAAEQAAABIAAAATAAAAFAAAAP7///8WAAAA/v////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////wEAAAIA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAABAP7/AwoAAP////8KAAMAAAAAAMAAAAAAAABGBwAAAFBCcnVzaAAHAAAAUEJydXNoAAcAAABQ QnJ1c2gA9DmycQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAEAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQD+/wMKAAD/////CgADAAAAAADAAAAAAAAA RgkAAAC7rbHKzbzGrAAHAAAAUEJydXNoAAcAAABQQnJ1c2gA9DmycQAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wAABQECAAAAAAAA AAAAAAAAAAAAAAABAAAA4IWf8vlPaBCrkQgAKyez2TAAAACsAAAACAAAAAEAAABIAAAAAQBPAGwA ZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAoAAgD///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAA FAAAAAAAAAABAEMAbwBtAHAATwBiAGoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAEgACAQgAAAAKAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAUAAABPAAAAAAAAAAEATwBsAGUAMQAwAE4AYQB0AGkAdgBlAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAIA////////////////AAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAKRYAAAAAAAABQBTAHUAbQBtAGEAcgB5AEkAbgBm AG8AcgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAgECAAAADAAAAP// //8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAA3AAAAAAAAACgWAAAQk2W WAAAAAAAADYAAAAoAAAAhgAAADgAAAABABgAAAAAAGBYAAAAAAAAAAAAAAAAAAAAAAAA//////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////AAD+ /v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+ /v7+/v7+/v7+/v7//v7//f7//f78//v5//r3//r5//r8//3//v7/+f7//P///P/59/3+/f///v/8 9/b///7//P39+/r///z6/vj7//n6//r3+vj9/f3/+////f///f///f///v/9///7///2/v3z///2 //////r//v7//P///P///v///Pn///74/fz9///2+Pj///78+vr//f///P//+Pv/+/z//P78//38 //j6//f9//z///7//fz///v+//f5//n4+//5+////v////7//f7//f/6/v/4/f/4/f79/P7/+/7/ +////P/9/v/4///4//7///7///7//P///P///f////////v+//r5//74/f/7/f7/+/3//v///P7/ /f///P3//v37+fn//f/8+fv////////////////////////////////////////////////8/v7/ //8AAP////////////////////////////////////////////////////////////////////// /////////////////////////v///P//+/3//vr//vr//vr//v3//P///P///P779/r49/7+/v/+ //79///////9/P//+///+///+/3+/P39/f///////v///v///v///v/9//z7/fn9/vn//ff/+/b/ /PP///n//v369f/99v/+/f/+/f///Pn/9/j/+Pj/+P3//P/+///8///8//79/////v//+////P/+ //3///7/+/z9+f38///9///8///+/////v/9//j4//v4///+/f//+f//+P//+fv/+fj/+/v////9 ///6///8//z/+vX/+vD///P///z//f////r9//r8///7///8//n9//f+//3//////P//+P//9/3/ +/n8+v///////v//+f//+f/7/P///////v////////////////////////////////////////// /////////wAA//////////////////////////////////////////////////////////////// ///////////////////////////////+///8///+/f//+/7/+/7//f/////8///5///4///45eXf lZaUj46QioyN4OXkXmNhZ2ljaWljcW9vcW5waGRpdnJ3b21t4d/e///7/v/7/v/9/f//+///+//+ +P/4+//8+//////////8///5//76//75+//7+P/59f/2+f/3+vj3//v///n/9vX/8/z/7/z/7fn/ 7/r/7fj/7fj/8Pf/7/b/8PX/7/X/7/T/8fb/8/f/8fb/7vH/8fP/9Pn/+Pv/+/n/9vr/6v7/5v7/ 7Pr/8vb/+fT/9/f/7/3/6P7/5vv/6Pn/7/v/7/v/7Pr/7Pf/8/f/8/f/7Pf/7fj/9Pn/9/r/9f3/ 8v7/7P3/4/X/7/r/8/r/+f3//P7+/P37///+/f39//////////////////////////////////// ////////////////AAD///////////////////////////////////////////////////////// ///////////////////////////////////9///9/v/7/f/9/P//+////f///v////v///f///X/ //jZ1dAYFBMWFRcZHR7d5uMTHBkaGhohHB4XERYgGSAeFiAcFyAeGh/s6+39//79//z7//r9/vr/ //z///7//f3//v7/+fn/+vr//P///f////v///n5//v1//v5//j9//z/+///9f/59f+psteOptRc fbVliMxlh9NridhxjNx5k+B/mOiDm++FnfGIo/OLp/SPqvuVrP+dsP+kuP+nwf+owf+swP+rw/+i y/+izv+sy/+yzP+20f+30/+71P+81P/A1f++2P++3v/C4f/L4v/M4v/H4//I4v/N4v/T5P/Y5//Z 6v/V7P/Q7f/N7//N8f/R8f/Y8//i9P/q+P/4///9//v6/fv///f///////////////////////// //////////////////////8AAP////////////////////////////////////////////////// //////////////////////////////////////////////3///39///8///7///8///9/////v// +///+P//+unk4yEcHSIfIRYYGdff3hYfHBgdG1ZYWJOSlHx4fR4aIBgUGhwYHebl5/r//vr//fv/ /v3//v37+v/8+//9///9///+/v/+///7///7///+/////vb+/vH9//T9//j6//r2//by//b1/8HK 9bLM/42w8nqg7nec7niV5nWQ4XCL22uG12iA1GV9z1p6xVd6xFJ1xVNwxVdrw1VqvE1qrUdkp0Na qj9aqzdhojZiojtcqz5cqz9foUFgn0Vfoklcp0taqUZapz1eoz1goEhen0Venj5fpD1ep0VbqUtb qEteokdeokBdqDldqzJYqjJYqjBWpEJirWaAxmt/tuj3/+32//r///788v////////////////// /////////////////////////////wAA//////////////////////////////////////////// ///////////////////////////////////////////////////8///4///4///8//7//f3/+/3/ +P7/+P7/+P//+///5OHjHBcZGBIXIR0i29reGB4dDBoOb4By8Pvz3OHfHh4eJCEjFxUV6Ojo+P38 ztPUwMfK1Nve4OXo5enq8PDw8/Pz+fn/+Pf///3///z///r/+/v/8v3/7Pv/5vH/5vH/5PD/7PX/ 8/b/8fb/5vL/4vL/4PP/4/P/7Pb/7ff/6vf/6vf/7/f/7fj/6Pz/4/3/3/r/4/j/7/b/7/f/6Pr/ 5ff/7/T/7PP/3fb/1fP/1ej/09//0d3/ztv7x9Lwxc7zwcP5ub33rLntprXmpLDgn6/ei6PRiaDS jpnTi5TNhpPBe4+/bIbIZYLNXXvKZoTTQF6rME2iOlS+PlbAQViu1uf/8fj////7//////////// ////////////////////////////////////AAD///////////////////////////////////// //////////////////////////////////////////////////////////7///n///j///v///79 /v/6/f/4/f/4/f/4/v/2+f7y7vMeGRsiGx4aFRfp5ugSFxYRIRZNX1I0QjecpJoZGhYVFBAlISDm 5OT8/v9yd3oRGBsPFhkYHSAUGBkZGBocGx0QExcgJCk/RUpOUVlXVGNeXW1ZY21cbINVZplOYpxb c6Fdc5xqdp58hKx4hK6DkbuQnMScpcqtstG4v9q+yeTH0u3U2PXX3vfQ5PbN6frO6f/T6P/e6P/h 6//b7//b7//i6//j7f/a9P/a9v/c8v/j8f/q8v/v9v/0+//2/P/49v/29P/z9f/x9v/z9//x+P/s +f/s+P/v9f/x9f/v+P/s9//j8//e8P/d7v/f8P/Y6//Y7P/F3P8xTL4wUMGNp/vv+P/9/vz//f3/ //////////////////////////////////////////8AAP////////////////////////////// //39/f7+/uPj4+Xl5eTk5Orq6v/////////////////////////////////////+///8///8/+vo 6uTk5OXm5Obm5vj3+f76///8///8//Pq7ScfIBoVFCMgHNzd2RkbGxQYHRccHx4iHT5CNyEgFiIh FxcSD/Dr7P/8/3h3exgaGhscGh4aGR8ZGiIWHCAXGh4bFxkfGhAdHwoYHhUXIRcYIhMYISg1RTBF ZCRBZiNFaSpKdStHfStDfTNMhDhPh0xen09eo0pan0pdoUVenktho0tYpEhapzpapTRcpDxhqz1d qUJdrjdSqDZVsDNWty1RvDFYwi1WuStUuydMxC5OxXKJ7dzs/+r3//b///X7//r8//v7//37///7 ///6///8//v9//L5//b8//j6//r7//b5//b7//j7//f6//r5/+/0/97x/4ur9yZUwFeA3eLy//v+ //3////+9f///////////////////////////////////////wAA//////////////////////// ////////////9vb2FhYWHx8fExMTkZGR/////////v7+/v7+/v7+/v7+/v7+/v7+/v7+/v3///v/ //r/nJufHiAgFBURGhkV5eHg//7///z///3/8evsGxcWHB0ZFBgT3uTfxcnKw8LMxMDLw8HBz83F Hx4UHhsTIx4d6OHk//z/dnN1HBoZGhoUIR4ZVE9MeXBzgnx9fXtwbXdxWXGHXXidXG2YX2yabnin WGmaT26lT3SuSm2lR2qpRWq6Sm/BT3C5XHi5YHKxXXC5UG3IS2zJTGu2WHPETmjUR2TXRWrSQWvO LlvELVjFNVrINlvNKFHPIE7RH1DSHEvLGkbBJVLSGkXYHETYKkrMPFWx5fT/8///8fz68/7/5vD/ 6/P/+Pr/+Pj/8fX/6vX/3vT/5Pr/7vf/8PT/6fP/5fD/7ff/6Oz/9/X/8/f/1u//l8L/GU7GJ1XA 4fT/8/n/+v7////7////////////////////////////////////////AAD///////////////// ///////////////29vb///8eHh4XFxcdHR2CgoL////9/f3///////////////////////////// /////v//+/2Rk5MZHhwaHx0TFhT28vH//v7//v7///7v8OwOFRATHxkYIyDe6ef4/f///P/++v// /v/38/IbFxYdGBkhGh3t5uv//f9wa20gHxsfIhlyeG34//b6//v2//X9//Tt//9qktMoWL4mS8Mt T8srSMEvUckkUM0hS8KryP82U7suVMpNeeosVbKSsvTi8v/f9P9Dcs4rXb251f+71P8nUM8cR9Jo hfGoyv8+cetBdvV3o/+Tu/8fT9cbStSHsv8qUrxXfd253v96nv9KcP4cR9QvVcG90/zv///v//+5 0e03WbYwUraRpt3h9f/U8P9giNBQgtRJeMnS7f+iuP85WbhbgOh1mP9AW7KKltbc7f9OeNs2busW T+AlUMfW6v/2+//7/v////z/+u3///////////////////////////////////8AAP////////// //////////////////////////f39xUVFSAgIBgYGHp6ev////v7+/39/f7+/v7+/v7+/v////// /////////////vv//42ZpQQVKgMSMgAOMu32/+30/+72/+j0/9ft/wATMQARMwAQNNHg/+j0/+Pv /+r2/+z1/9ng/wgMLxUXNRESJuPh7f/9/3t2dx8cGBcZE4mPivj/++//9/T/+Pv/9er6/1mBzBxO xh9K3SNL4ChP0CFLzhRF3R1L35a1/zJOxB9IzUh09zBZxpu7/+z6/+P4/z500x5Ywq/S/4Wl8R5O 1hlJ3WGA8zBRvxtQ1hJM1BxOxk599xRJ2hVH1423/zJYuFp+3G6S9ilMwSJKyxZI1iVSxbrT/+39 /+///7rU/CBPyB1O0IWl7tTx/4Gp/x1NthhRuixgxTJUsnWW/RtLyUR8/2KW/yhVyG6M62SE4x5T yBlV3QpB2CVOyNrs//f8//v+//78/P//9///8v///////////////////////////////wAA//// ////////////////////////////////+fn5ISEhFhYWGBgYU1NTR0dHVFRUTU1NTU1NTU1NTk5O Tk5OTk5OT09PTU9PTlVSP1BZMUtzLlGVGj6cI0m1SGzYSW7WTXTWT33cN27PGlG5IU++I0i8OEzD LkS0KVO0IE2uIEWzKki3SmLGAA9dBBRD09709Pn8gX56GRESGhMWmZaf9/v/8///8P76///79vv/ udD/PF26J0fGnb3/u97/r9b/H0/WGErakrn/NFnBJkzQUnj/J03DlbP/7Pr/3vP/SHreE0/KlMf/ JVa6GUnRH0zdT3j3JU7MOG36Nm77PHP0L2fsDELcGEveirb/LlW9R27iKlLIL1nEk8D/F0/WIlPH u9b/7fr/9Pv/wNH/H1DEHFDMhaTp0+z/THPdKVLGpMf/ZIXbOVbDXIH7IFXOQn/3YJ//IFjHTX/x IFDAIFfAjsb/F0jSMVXH2uj/+/7/9/n///7//vrv///0///4///3//////////////////////// AAD////////////////////////////////7+/v7+/saGhoYGBgdHR0XFxcXFxcVFRUaGhoaGhoa GhoaGhobGxsbGxsbGxsZGxsXHBoHFyQNKl0yV6spVMMjTcgsVc8pVMkiUsIZUMMPTs4GRs0TS9od StsiP8o3VNUnU8QjVcUkUdAlT9IlSsoxUr8MKnfK4f/s+f9scnkfGyAeFxqUjZT//f/6/v/4/f/9 +vz6+v/q9v+Dmt44V8RRdNzP8P+84f8XSskZTt6Swf8sVLovUcxQcPEqT8Ocuf/t+v/o9/9NdOAZ UNlmov8UT8M5ae0eSc5MdfMjUNARRdUXTNwgVdQ1a+4XTecYS+GFsv8sVcJRdessUsgkUMGSxv8J RNAhU8m3z//u9f/4+f/E0v8lUssgUtCKpejX7/9Xe+YeRrypyP9riOsxTsFjh/8XTcpBfvZgnv8Z VMJMfu4xX88dUL6WyP8cTdcqT7/i7f/6+fv8/P/9//////v///j9+fT//PT///T///////////// //////8AAP////////////////////////////////v7+////xsbGx4eHhcXFxYWFhwcHB4eHhoa GhoaGhoaGhoaGhoaGhoaGhoaGhwaGh8ZGhYWJBUlUC5JiS5NnDNUpFhzvWR9xV55yVZ41kd16xhM zxdN0B9QyjFYwClJojhRoTtUpCxLpitQuClSxiVQxSxTwFd509fu/1hojAwVHhoeGI+Nhf///P/4 ///6///7///7//P4/9jr/ylVtCRUvY+u87rc/xpS1QhH2Dtv6x9KuVVy32SA7CZNt5W0/+7z//H0 /1Jr3xtG2y1r9R1c3F6M/yVMwGCG8itXyhZL2BJJ1CBNwF6K/xZJ2w5D2k5+/yFJv2J/4WB+4x5L yxhO4RRO7R9OyMza//39//f6/7rI/yRKziBJzo2j5d3y/3SY7CZSwyNM0SdM0jFPwIen/yBQ1BZN 2BdP1CJRxXmY8y5Jqy1T1zJf9hZI4C1UyN7p///+/////v////f4/Pz+////+///+f38+P//9v// /////////////wAA/////////////////////////////////f//+Pj4GBgYGxkZHhwbeHZ1//// +/r8//7//f///f/+/f/+/v7+/v7+/v7+//3+//7///n/hY+tABA5AA89LkNw5vX/6PT/4/P/2O7/ p8f/KlPNHlDSHUy/rtD/3PH/5/H/6vH/3/D/xuD/ABhtNlu9KlDAMFXDNli2Q2ClABQ3ChYgZGdl 5N7Z//3///j///r/+vr/8/f/3PH/iL3/F1K/L1ewocb/HlHXDULOJ1PIY4frxuD/ZH7YMVm5l7r/ 7fj/6u//Y3XmIUTUGFLZEk3Ld6L/N1fAa4flxOP/KVK5Mlu+XXvMrMr/MVfDKVLGK0+7YH3Y2Oz/ 2O3/NVW+I0zHHUrJN1m30tbz//v++Pv/ucz/KlDWIknTjqPn4/X/0/D/OV6wLE3CM0/FuM3/mK/9 NFW8TnTkLVG9YHvV4e//3+3/Mky2MlTQJEzDO1yy5O7///////75+/v1/f7//Pz////+/Pr5//7/ /vv3///y///p////////AAD////////////////////////////9///5/vz6/PwbGRkeGRohHRhz cGz//v/+/P/9/v/7///7//v7//v9/////v////7///7//f37/v+Gkp4KGSkLGChCTF32+v/z9//u +v/m+P+90v80U8AZR9ApU8rB0f/19v/7+f/9+v/6+f/k5/8IETcBEkodO44yV78hS8ItVcUSL4QA D0QOFSkYGBivraX///j///zx9f+cpe5ifuM9d+guceYfWMs+beYlSM44U8y2zf/H3f/W7/9nhstO eMuOtfrh+f/g8/9hd9cpSMEoWMhsoP97ov88Wbx4idrh7//m+P/Y5/rv+f/p8v/e8P/f8P/c5P/u 9P/v+//q9//t8v/Y4P/i8//h7v//9v//+v/2+/+2zv8eT88dTNOLoenq9v/q+v/j9P/i6P/k6P/q 8//q9//j8v/f7P/g5v/u7//4+v/0+//k8P/a6v/e7f/o8//x/P/2///9//n///f///v//f//+//9 /P///P7//vn///f///T///T///8AAP////////////////////////////3///v///f8+yEcHhoT FiAdH3Nye/X1//b5//b6//b8//b+//b+//b8//b7//b8//j9//r8//H3/5GerAISHwgRH1FVZ/Lz //b6/+/+/+f6/8HU/zRRvh9N2yFKxcTS///7//z2+//9/////vn09RsbIQgQJwALPnya6TVbxx5G vTNYyCI/mgAMRwwXNxMaI2xxb/j9+/H4/42Y6jdRuyNUuh1ZvSFZxD9s2zlRw0FPr9nk/+bz/9rt /3CKwDdanJW38t73/+P4/2Z3xj1VtTRZrbnk/5Oz/z1VqY+b3eXq//r///n98f/9//r5//b7//P5 ///8//r4/vD9//P+//f1//b0//D5//j+///0///3//P6/6rJ/h5TzCBT0oui7ez1//P8//j+//z3 //z3//j+//T///T///f9//32///7///9//v///T9//L7//f9//j9//L7//L9//n+//7//f/+/f/8 //r6//j6//v8//3+///9/f7+/vr5+////wAA/////////////////////////////f//+v//9Pf7 HBcZHhkiFRMpZ2uO5vP/5PL/6vP/7fP/8fT/7/T/6PT/5PT/4/b/5Pf/7fb/7Pb/e4qrCRk+BxFA OD9w6/D/7PX/4/v/2vf/t9T/KUvGGEnhIFDOttD/8Pv/+v3/+fv8/P/46vHkFR0TFBoZExop0t7/ v9T/OlixKVTJIU/MKVDEABx3AAo+ERYvSEtZ0tbu0dj/ucn/stP/rdX/p8r/rcr/t8n/yNP/5/L/ 7Pj/6vb/w9T7v9T/1Of/7fv/6PH/ytD/v83/u9b/0vP/xd//vtL/xdD/6e//9v3/+v7/+vf/9/T/ 9Pb/8/f/8fX/8fr/5fj/5fn/7/b/7/f/6fv/6vr/+Pb/+PX/4u//t9j/H1bFGk/Ejafz4O3/7ff/ 8vn/9vT/8/T/7Pf/5/r/5vv/7Pr/9Pj/+vf/+Pn/8/r/7Pj/6vj/7fj/8fn/8/n/8/r/9Pj/9Pn/ 9Pz/8/z/8fv/8fr/7vj/7vj/7/v/7/r/+Pz/////AAD////////////////////////////9///6 /v/y9fkhHRwUExwSGz1KW5Q9WaY3VKlDWatIWapNWqlLWqlCW6s8Xaw6Xqo+XqlDWqVTZq9EYKcj QIsqQ5k7T6d8jd54jtZxldVvmeZYge4eS9ITRd8nU85JZZRdbXRiaG9xdXZsdGpkbl4cJRgXHxUY Gxnd3+ro8P9Ya6QSNJIqVcwoVdUkTMMgOZUPIWgPIFkOHllrfMWyyf+jwv+py/+jw/+qx/+txf+x x/+yyP+yyf+xxv+1y/+zyf+uw/+6y/+zwv+2wv+rvv+tyf+sz/+mx/+pxv+xyf+xx/+4z/+yx/ql tfegrvagrvahsvWbsO2guvaSs/KWtvefufyTrOygwPWhwPWjsfOns/mivP5znPEOSsYTTc9afeSR qPacs/GitfKks/yhtP+ct/qWufiWu/edvPmpvvytvPqtvfiqvPuku/+jvf+lvvyovvitvPqvu/ur u/2qvPupwPinwvWrwvSpwPilvf+kv/+kwfqsxe/t+v////8AAP////////////////////////// //3///r8//j7/xscExohJAEVPjNXoylcyhdOzR5MzyRLzylKzyVMzR1PzRhPzhZO0RtO1CFL1BxH zBpMyhlOzR1O2CJQ2itP0SRLyx9S0Q5HzAlC0xVM4xtL3ylOwAkbSgsUHhIWGxcZGRkYFBcZExke HA8VFBkeH+Xq7fr9/251iQAKOAokailOsCtXyilV0hlFyB9Kzx9KzylT1iFMyyJMxyFMxS1W1CNM yiRQyxpJwidWzyFPzBpGySRO0R5KxypT0SdOzilN1iZI2CpO2h5LxB5QwhxOxCNW0hhMzhVJyxpQ zB1RzR5N1CFM1x9J0idQ1SZU0RxMyRxQ0h9T1iJQ0xxKxyRYyhdJuyZLyypN0h9Myw9Gzw1T9ABB 5h1P5SJP1hxMyRxMyR5L0B1M0xlQ0RZSzhZSzhlSzSJQzSZQyyhRyydRzCJPzyJQzSRTxidSxypN zSpL0CZNziNOzSFOziRQzSlRxydQyh9O1RxN0RxRxkBsv9fw/////wAA//////////////////// /////////f7/+P3/9vr/Hh8VDhYVCR4+Q2amIlWzIVbEJVLFKlDGLlDILVDIJ1PGIlTGIlPHJVLL J1PQI1LSF07VD0vbCELhFUnjI0rOLFHJI0/KJFXPIlbOKFfLJUq4O1WpHytPFhgiGhsfHBsdIx4g HRocGRgaHSIhDRMS4ufm//79cnF1FRUlDhg6aIG/UHXPIFHFGk/VHk/bHUzWG0vJJFHKKVLNLVPP HkTCKFHMIEzBKVjMG0vII1LSJFHYHkvSK1jXF0TDG0jPIEnUIEXVIUjSLFXTJlLHJ1fNFknDF07P FlDRFVDOFE7MG1DWHU3UGUbNIEzPIk/OG03LHE3RGEjPIE/PJFPNG0/BLF7QJUzMI0rLJ1PQIlTW DUjUEErZHErTHUnMH1LOHVHNHk/PHk/RHFHQGlLPGVDRGU7NHEzKIU3KI0/MI0/MHk3NHU3LIVDE I07FJk3OJUvRIU7NHU/NHE/OH0/NKE7KJk7MHErUFkbOHE7ETXXI4/j/////AAD///////////// ///////////////7/v/y+f/0+v8ZGRMdHBgTGSRmdIvK4//M5v/T5v/W5f/a4v/a4f/Y5P/W5v/W 5//U5//H4P/E5P89Z8giVNISRtkeS9C61f/U5v/d7//R5f/F3v8AEjIJHD8KFTPN0ePz8vv49vzw 7PL89v/Kxc4aFRYZGBQeHRnq6+n//f9zbHMXDxYZGCJweI/a8/9agcZYgtVhgdRHZK8WNXIVM24V LnQeM35XarWYrfGVreeRrOWIouSNpu6NpvCEoOeMqeyNre+MrPOKqfSLovCSqfWRpO2NouaQpuiS rO+JqeuJrO6EqOiEqeeLremOq+iSqeeWrO2Sq+uNqeqMpuyOqO6UrvCHo+CQruWPquJJX6AaMHEZ MnATL2w2UpKUsPCPp+mUrO6NqemNquePqOaRqOaSqeeRp+iOpOyNo+uQpu2RqOyQquyPq+yNqu+M qe6OquuPqeuOqOuLqeqHqumErOaGreSLq+aUqOmWpe6Up/iPpvKSquasveT6+v////8AAP////// //////////////////////3///r9//j7/xwaGR0ZGB0bG29xcvr///j///v///3////9///9///+ /////////P///Pj//+b5/0xtvSdSyRlN3R9LxtHm//H4//j6//3//+jx5xMcEhcdGBYYGe7u9P/9 ///9///8/v/8/+nk7SAZHCMbGyAZFunj5P76/3NvdSEbHB8aGXJycvP9/9/3/932/+T0/+r4/7TG 1wcZKgcTNQELMwoTORUfPeTv/+/7/+/4/+33/+v2/+r4/+f4/+X5/+L5/+H2/+r3/+bv/+/1//H1 //H2/+31/+r1/+j5/+b4/+r7/+z8/+z4//P6//L4/+73/+34/+34/+n0/+35/+36/+36/zdEWgcT KwgULAgTKWlyhvP7/+31//H5/+33/+35/+36//H7//P6//T4//T3//P1//P0/+/1/+v2/+j2/+X3 /+P3/+H1/+Hz/+Ly/+Xz/+P2/+L6/+P9/+b9/+r8//H3//P1/+zw/+/1//P5//j5///6/////wAA /////////v7+/////Pz8/f39//////z7///8//b2GxccGRgcGRgadnR0//7///7///7/+f3++//+ +//8///+//////7///3//fn/7/b/VXDGIk7JEUzeHlLKyN//9Pv///3/+/b18/PtHiEYGRYRHxsa y8nP7+3z8vLs7vHo8vXzz87SHRUcJxoiIxMa7eHn//z+WFpaGBsZGxwYTktH///++/r+/f3//fz/ +/z/+v/89v//WF9uDBEmEBcoERghGR8eSU5NZ2dtYF9oY2ZqYWZnX2hsW2dpWWZkWWdjYGhoY2ds YmJwYFxva2V4YVtsZmRwYWJsXmBoZmZsZ2ZoZWRmaWVqZ2RtYWFtYmJwX2BqZGZuYmVtYWNtFxgm ExUgDxceDxgciI6V+/7//////vz8+/7/+v3/+/z//fz/+Pr7/f////z//vn///j//Pb/3d3vy9Lh x9bf5/r/5Pr/0+n/yt3/1OL/6O7/7/X/8fv/8Pr/+/7///7/+/f/+fj/+Pr/+Pv//fz///3////+ ////AAD9/f38/Pz///////////////////////7///z/+/8UGjcFEjgAEDRlcZXv9f/n7P/o9P/k 9f/j+P/k+f/m8//p8v/q9f/r8//v8v/b5/9JadIdUdQJSNkXS8PL4f/3+f///f///v7u7ugWFw4h HRgeGRgbFh8ZFx0ZGxUfIxgQFA4eHh4fGB8bEBoqHCfo3eX///94e3lZXlxXWlhxbWz//vv///j/ /vb///z//vn///f7/vX5+/+YmqUOEhcaHx0YHRQbHBMZFRQnIyIbGREfHRUbGhYcHRkfIxgUGw4d IRUVGA8ZFhggGyQcFB4jGyIeFxogGRwjGh0gGRweFhcfGhkiHB0ZFBYeFx4fGR4kHx4fHBgTEREg HyMXEhsfHCUaHx6prqz09vf///////v///v///z7+/v69ff//v////z+//v//v//+v+ooKpUT1hq aW10eXoSHRo/T07q+/9RZIdJW5xzhNN1gtCvvv3k9P/v+v/9+v/78/P//v///f/7/v/7/v///v// //////7///8AAP////7+/v////z8/P7+/v7+/vj4+P/////+/93n/y1JkBY9nxNAqRQ/rBs/qiFF sQ45qBNBsB9NuCVPuSpLuC5Nui1PuidJtCtItSFFuxJHzRBO3AhJ2ipYzrrG///4///7///7+uXp 4xQbFBscGiQfIRwUHiIaJBgXGRcbFh4eGBwcFhsbGxobHxUUHdjY3vv7+//+/f/+///+//T0+v/+ ///++f//+//5///9///7+v///v/8//n4/87S0xsgHhgeGRwhHxcXHRQTFxwaGVdUUFRNUFVOU1FM TVZVUVRVTFNVT1dZWVFSVkpITlRQVlZRU1VPVFZNV1RMV1ROWVFNWE9RWVNSW1RPWFpTWFVQTVNO S1lUVVZSWEtFUFNPWru9vvv//vz+//38/v/+//74+f///v/////9//r2/Pv+//b9//j8/1hZXRoX GSAeHRIUDhkfFMbNvvr/+PP//+34/7C7+UJXsilUwyJUxEpz1tPt/+/1///+///9+v///P3+//r/ //v///r///b//////wAA/////f39////////////////////+/3++/7/3+7/PV+zJlXIGU/MG0/R J1TTHEfGIlPVHU/RHE/NHEzJHkfGIknJIk/OIE7LJk3NI03OFkzPFlLUEUvNKlK8vMP8/PT/+/T7 ///+z9TSGR4dGRgaFhETIRodHhcaHR4iExUWGxkYGxkYGhwcGR4fERYZyMzN//39///++fj6+/7/ +P7/9Pj9///+//r7//v///v///7///7+/vr//v3//f/++v/7Njw3DBIRHiAoEhEaFxcXq6an//n/ //v///z///7/pqWhj5GLkJORjZKR1dna/f////////////3///z//fv/v7/LiI6Ti5CTk5GXzcjK /Pn1+/j08O3v8/H36ufw6ejx5+vs3uPh4OTl4ePk4+Lm//7/+/78+v37//v//Pr/+v3/9v7/fYGG Gx8gGBkVFhgSGyEc8Pfy+f/5/f/79fr48/b/6ev/uMn/H07CEUzRHFDTKU+7xNb/6fD//f///v/6 +///+v//+v/++P//9P//////AAD////9/f38/Pz////6+vr+/v7////7+v76+P/n7v9CXp8vVqsu WLkwV7ovTrFAW706V7oxUbIxVK45XbU8Xrg4XbkuWLssVLozULNCXb82WbssVrcoU7RAX66/xfL7 +f///v/8/fvl4eaemqCelp2inJ2koJWbmY6SlZOcn6SbmKGal6CXl52VmZqTlpTo6uT//vqtrKh6 f355goVvfH55hYd/g4SFhIh7d4OHg46Cf4GFg4KNi4uEgoGmpaH///v7//t1engVGh0ZHCEfISKY lpb+9/r//f//+///+f9WVFMbHRcVGRMdJB2xtrT5//r7//f9//n9//z9///4+/+EiYwYIR4VHxka HRuYmJj9//6qrasVGRoMEBEWGx4SFxgRFxYWHRoXHhsQGBdia2/4///6//79//z//////v/7/P+Y mqQcHCIXFxcdIRYUHBXs9v/x+//z+v/2+f///////v/89P/t7/94lPIpVdAQRdIfT9YyVbyrxv/s +//v+/X4//n6//n6//z7//77//////8AAP39/f7+/v////n5+f/////////////+//35//T4/9Hj /8Hd/8nm/8Hc/9Dj/8vb/3SDwWFxrFdooVZqoVRqnkxnn0dnqElpq1FnqFNlpFNopU1loVJsqFlt nW5xkHt6inh7f4WKif/9///9///9///8+P/98v//9/3//vj7//f2///8//3+//7//f7/+v7/9v// /HJzcRUbGhQeHg8ZGRQeHhMXGBgZHRscJhgaIh4eHhoZFSAeHSAcG29ravr59fv9983RzBkbHA0Q FBkaHpKRk//+/v37+//8///7/2FfXhsdFxUaERceF62ysPv//Pn/9/3/+P3/+fr9+/3+/4uMkBYd FhkeFRkaFpydm/v//6GmpRcbHBkeHRwhHxYbGRcaGBwfHRgcFw0UEWdydvT///b69f//+fz79/// /+bl7hMSHCMdIh0ZGBccE4uXm8ba/cjd/7zO/8bS/93k9enr7LCpsNDO68nZ/zRVvBhL1xNL4BlI z2mM7eP2//T///r/+fv/+Pr///3//////P///wAA////+Pj41tbWVFRUTU1NSEhISkpKUE9RTkpQ R0ZQRk9cdYSU7Pr/7fv/6PP/lZ2qExopDhIlEA8pExUtExcpDhYnCxYsBhUvAhYvDB41BA8jEBcq DhYnDRIhHxkqGBMiDxUcSFFUsrS0kpOP7fHr/f/7/f//+vz99fb6/f//+fv7/v/7/f71///5UU5J ///7/P7/cXJ2HRweHx8fFxQQGRgUICYhERgVFBkcEhYXGR8aERUPGxkZGxUab2lu//7////83drV FxUUIiIiGhsfgYOE+//8+v/7/Pv9/vv9ZGVjGRoWGxwYHB0btbO5/f7//P/7///5///5//79//v/ kYiSIBgYHRcSHxsWoZ2c+Pf5v77CeHV3amhoYmJcbGxmY1tcHRUWHhkWGhsZanB19vz////8///4 ///4+vz2h4WLGxMdIhQYIhobEhcYzuL7n7//KVC6JEi+PFy/e5LEoLDBFBseZmxz7fb/iqLqHk/P EUrlFUjkKU3Jrrn3+vj////////8+v7//f3////8////AAD+/v7////f398VFRUaGhoeHh4XFxca GhoeGRscGRsWGxkVHBmLkZD7///AxL4UGRAcGxcbGRkgGSAfGB8cFxgWGR4QGTQGFz4AFkIADTsH GEMKGUACDzURHkQIDjsNFkIHF0FATmpNU1oaGxdaXlhYXlmFiIyPkpe/vsLMzMzd4dzz9u3///e3 ta0gHRlUUlLu7/N0dXkXFBYaFRaPiIXb19LM0MvS2dTQ1dTQ1dTQ19BxdXAaGhodGR5waXD//f// /Pvg3NchHhoXFRQcGx18fn/5//r7//z9//////9kZWMYGRcgHh0ZFhi6uL79+/////75+vb///v/ //7/+/+QhY8mGx0jGhckHRqbl5b//f///f//+vz///7///v//Pe4sLEiFxkkHRocGBdlaGz2+f3/ //z//vf///v///5cVlskHCMgFRghGh1XXF/T6f8nVboQR9AWSdsfR76tx/9XZnkZISEfISKqq7+1 w/4gTcYPSOMMQ+YlS9Ohq/j28////f////z6///9/v////v///8AAP////39/d/f3x8fHxYWFh0d HRkZGRgYGCAbHRgVFxsgHhccGhYZF76/vRcaGBkcGh8dHfXy9P38/v/+//r7+fH5/0ReqzBTwSlO yCxT0yZNziZNzSZQyyVRxidTxCpTwC1QuFhvvQkPLBwZGx4cHB4cHBUWFBwdGxgYGBsbGxwdGxka GExLR01LSh0bGhkZGRoZG2xrbRoaGh8dHZqYl////v///v3//vv9/f3///n8+nh5dxwcHBYVF3Fu cP/+///+/tvZ2BkXFhkZGRoaGnd3d/r9+/3//v7+/v///25ubhMTExsbGx0dHYiHicbFx8HBwcnK yMHCwMfHx8XCxHZzdSUgIRwYFx4cG4B+fsPCxMfGyMXDw8nHx8bEw8PBwJ6cnB4ZGhwaGRkXF2lr bP3///37+v/+///5///5/yAZIBQSGBsbIRobH3Z2dtzv/xdQwwBE2wtF1CtSvtXk/xkaJCIeJCMa J7Cjw8/T/ylPxQ1D1hJK5SlU2Wx/0O30//j+//v/+fv/+///+///+f///wAA/f39////4uLiFBQU ICAgVlZW7+/v8PDw8ezu+ff3yM3MDxQSICEdGRoWGRkZGRsb3dne//7//Pv9/f/+/v/96vf/L1C3 FkPUF0ThEULkE0XrCkPmCkflC0zkBkfYEkrXI07ZNlG5BAwxGxgaHRsbGxkYHhwbHBoZGxsbGBgY FRUVHh4eFhYWHh4eGRkZGBgYpaWle3t7FhYWExMTn5+f/f39/v7++/v7/f39////////fHx8HR0d GhoabW1t/v7+////0tLSHR0dHR0dHBwccXFx/Pz8/Pz8////+/v7cnJyHBwcGRkZGRkZGhoaGRkZ Hx8fFxcXGRkZGRkZGRkZGhoaFRUVFxcXFhYWGxsbGRkZFRUVGBgYFxcXGBgYHR0dGhoaHBwcICAg HBwcYWFh/f39//////7///v///v/FxQWGh4fEhkcEBUYhIKB3Oz/FlDHBk/mDUfOV33dtcHjIx8k IxggKBsrraG91tv/LVTIEUrcD0niGUnNcorc5vL/9v3/+//7/f/8///8///8////AAD9/f3////X 19cdHR0cHBxQUFCQkJCRkZGSjY+XlZX7//+4vbseHxsYGRUaGhr9/////f/49/n+/f/6/fv///7q 9/8vULcjUd8aTeAQR94SS+QJSN4GTtsGUd0FS9oVTt8iStgnQKgKEzQZGxURFg1hZV9ZWFpVUVZV VFYXFxcdHR0YGBgdHR0XFxcaGhoZGRn9/f13d3cYGBgYGBikpKT+/v7///////////////////91 dXUVFRUbGxtvb2/////////Nzc0bGxsWFhYUFBRkZGT////////////7+/t0dHQbGxsWFhYdHR0f Hx8WFhYcHBwTExMgICAcHBwYGBgjIyMcHBwaGhoeHh4bGxsZGRkdHR0fHx8aGhoZGRkfHx8ZGRkb GxsSEhIeHh5qamr7+/v///////78//v3+/VKUkgOFg8WHh0cISB9eXjl8f8USrUHS9IXUMR4nvB4 hqMmJSkoHiQhGCKsrLq/0/8aS78OT+cER+AXS81uidnq9P/4+////v/9/f///P//+/////8AAP// /////+jo6BMTExwcHCIiIhAQEB8fHyAbHVFPT/v//9LX1RYXEyEiHh4eHvX39//7///+///+//n8 +v///ur3/zNUux1L2BVI2g9E0CBT0RxVyBZXxAxRxgdI0xBI3R1I1UllygsWNBccExskFz5GPPz7 /f/9//38/v39/fn5+erq6hwcHBkZGRoaGszMzP///3BwcBoaGh0dHaGhof////39/f////////r6 +v///8/Pz7+/v8jIyNLS0v///////9PT0x0dHR8fHx0dHV1dXf////z8/P////7+/nJychsbGx0d HRYWFm1tbYaGhoaGhoODg4WFhYKCgoiIiFxcXBcXFx4eHhwcHGBgYIqKioWFhYKCgoaGhoSEhIKC gnh4eBgYGBsbGxgYGGdnZ/////////j7+fv/+fr/93N7cBYfFRIcFhQbGFdXV+Xx/yxbvQtHvyla wKzO/0tadBsdHh8aGSIhJZejtZq78xhOygVH4gZH3x5RzZGs7+z2//r8///9///7///6///6//// /wAA/////Pz839/fHx8fFxcXExMTHx8fGhoaHhkbTUtL+///7vPxGxwYFhcTFBQU3d/f//3//Pv9 /v3//f/++/z66vf/Nle+FUPQF0rcIlLQhan9lLX0i7Lwa5ntH1HZFUnjGkvXVHnbtcbhFh4UGSEW Fx4XgIKD+vn9/v3//////v7+aWlpGhoaHBwcHBwc9fX1////eXl5FxcXFxcXqKio////////+/v7 /////v7+////+Pj4/v7+////+vr6/////f391NTUExMTFhYWHBwcWFhY/////////f39////dXV1 GRkZGhoaGBgYt7e3/////////////////v7+/f39lpaWGBgYGxsbFhYWoqKi////////+/v7//// /f39////zc3NHx8fHR0dFRUVYWFh/////////v/9//76///7m5uVGR0XDRwUEB4aFBkc3ez/WH3X J1fBLFOoj6zlDRwvFhsZJigcGiMmjKXPXIfeFU/XCkflGE7hLFTEyeD/8vz//f/+///+//v///r/ //z/////AAD9/f3////t7e2xsbGsrKytra2xsbGmpqawq62vra30+fj7//5TVFAUFREoKCi6vLz/ /f/9/P7//v/9//7+//3i7/87XMMfTdoTRtgkTMLd8f/t+f/o9v++1/8kSs4UROAUR9NOeNjk9/+R l5ISGBMRFBIbHR3b3d3+/v76+vrBwcEdHR0WFhYZGRmdnZ3////7+/t1dXUVFRUeHh6xsbH4+Pj/ ///////9/f3////9/f3////////////////////+/v7R0dEiIiIXFxccHBxSUlL////+/v7////+ /v50dHQXFxcVFRUjIyOSkpLS0tLR0dHU1NTW1tbW1tbOzs58fHwdHR0bGxsZGRmFhYXOzs7W1tbY 2NjV1dXPz8/Y2Nifn58fHx8TExMbGxthYWH////6+vr///7///z//fj//vpLT0oPHRcRHxsWGhuQ lLCrwP9FXq6Kntint9xNV2hWXWBMU06Fl6iHrvMiVMQVStsSRNokS8t9mO/o+P/6//79//n///n/ /f///P///v////8AAP////z8/P39/fT09Pr6+o6OjoqKipKSkpSPkZCOjouQj4mOjF9gXB8gHBcX F2BiYpGNkpCPkYqJi4OGhJGSkH2KqjRVvBlH1BtM3iVHuPH0///9//32+9fb/yxFyRxG5RtR2kd2 0ub4//3//xscIBsdHhsfGoSIg////v///1FRURcXFxwcHExMTPz8/P///////3R0dBkZGRwcHGJi Ynp6en9/f4CAgIiIiI6OjpCQkJWVlZCQkIiIiIeHh4mJiX5+fmZmZhcXFxUVFR8fH1BQUP////39 /f////r6+m5ubhsbGx0dHRgYGB4eHhsbGx0dHRcXFxcXFxkZGR4eHhoaGhISEh4eHhgYGCEhIRsb GxQUFBsbGxwcHBcXFxgYGB4eHhYWFhwcHB8fH1paWv////////3++vn98v//+P///NbY2BEaFxMa FyQaGiQVI/vz//Ts///4///6//r6//H3/+/5/9ry/1KC6BFJziNP4ihHzGV31Ojw//r7//3+9f3/ +Pv/+P3/+f//+////P///wAA////+vr6////////9vb2FxcXHx8fGBgYHRgaGhgYFxwbFhsZGRoW GxwYFhYWISMjGxccGBcZHx4gHSAeFhcVBRIyOVrBGUfUGUvbLE269PP///77//7+19f/NU3PGUPi EUjPT3vY4vH///7/rKqwFRQWGBkVHB4Y4+Ti/f39p6enICAgGRkZsLCw/////Pz8////cXFxGxsb Hh4eGBgYHBwcFxcXHBwcGxsbFRUVGBgYHR0dHR0dHBwcFhYWGxsbHx8fGBgYGRkZGhoaHR0dSUlJ /f39/////f39/v7+cXFxGhoaGxsbERERHBwcGxsbGxsbGRkZGxsbGxsbGRkZGxsbGxsbGRkZGhoa FhYWGRkZHBwcGRkZGBgYGxsbGhoaGRkZGxsbGBgYGhoaXFxc///////////+///7+fj0//7/+Pf7 r7W0GB4ZIBURLBwdZFJf59bj//3+//z/8ff/4/L/orb3YYLYHVDEFkvKL1HMYHPW3eH/+/b///j7 ///4/f/5+v/5+//4///4///5////AAD////////////4+Pj7+/sWFhYZGRkdHR0fGhwVExMeIyIT GBYeHxsfIBwREREaHBwcGB0YFxkeHR8UFxUaGxkGEzM3WL8dTNYaTNQpTrbt8///+v/3+P/P2/8m RsgaR+QVSM5VfNjs9v///P///v8ZGBoXFxcbHBp7e3v+/v7////v7+8VFRX////5+fn////9/f19 fX0VFRUWFhYfHx8aGhoVFRUgICAdHR0XFxcUFBQbGxsbGxsYGBgbGxsbGxsbGxseHh4ZGRkbGxsb GxsZGRn09PT////+/v7///9ra2saGhoYGBgdHR1jY2N2dnZxcXF3d3d2dnZ0dHRzc3NiYmIWFhYb GxsdHR1iYmJ0dHR1dXVycnJ3d3d1dXVzc3Nra2sZGRkbGxsfHx9XV1f//////////v//+///+v// +P/9+P/i6eT1//MeIRIfHRIgHBd0cG/4+ffx+/+81v9tj+0jS8EmUs8kVcMpVbKHpOnm8v/89P// 9v///f//+fb7//72///6///9//7///j///8AAPz8/Pv7+/////////Pz85CQkJKSko+Pj5mUlp6c nJKXlpSZl2doZBcYFCIiIlJUVI2JjpGQko2MjouOjJOUknyJqTVWvRxM1BlN0CxVuOTz//j8//P7 /7/T/ypNzRlH4h9P1lF20ufx///9/v/+/5KRkxwZGxkWGBgYGOLi4vz8/P////////v7+/////n5 +f///2trax0dHSAgIH9/f8nJycTExLOzs7Ozs7y8vLa2tqqqqpeXl09PTxAQEB8fHxsbGzExMVxc XGVlZZCQkJmZmfn5+f7+/v////39/WZmZh0dHRUVFRYWFrm5uf7+/v////n5+f7+/v////7+/oyM jBkZGRwcHBcXF5ycnPn5+f////////z8/Pj4+P///9bW1hsbGxcXFxsbG1lZWf7+/v7+/v/7///4 ///4///5///7//v/+/j/9e736p6kmWdpY1BRTUtQTu37/0lmny9TqylPuy9Tvnqf8b3b/+T4//L5 ///7///8///4/P/9//r///b///j///v//v//+////wAA////////+vr6/f39/////Pz80tLSpaWl //7//vz8+///+//+mpuXFRYSGhoaTU9P//3//fz+//7//f/++/z65PH/PV7FGUnQGEzOK1az4/j/ 9P//8f7/vtT/Kk/JG0jfHk7VSG3J7fj////7//v69/L0HhogHhwiHh0fU1NT1tbW/f39/////v7+ /Pz8////////dnZ2GBgYGBgYpqam+/v7/////////Pz8////////////////n5+fGhoaHBwcHh4e b29v/v7+////////9/f3////////////+fn5Y2NjFhYWHBwcHx8fgoKCr6+vqampr6+vrKysq6ur r6+vc3NzHR0dFRUVHR0dd3d3srKypqamqKiotra2p6enr6+vioqKGxsbGhoaGxsbW1tb9/f3//// //7///v///r//fX///z+/f/5+v/5+P/++P//+/3/+/v////++P//6Pn/5Pj/6Pb/6fL/5u//8fn/ 9/3/+v37///5///8/fb9//v/+v7/+P//+v/8+//8//7/////AAD6+vr////+/v7////GxsbCwsIW FhYZGRn9+Pr////6//77//6vsKwfIBwSEhIXGRn28vf5+Pr//v/9//7///7q9/87XMMbS9McUNMl ULHf+P/r/P/r+/+/1v8mS8MeTOAYS9FSe9fo9f////j///7/+/9qZ3ATEhsXFhgdHR1mZmb8/Pz/ ///////9/f3+/v79/f1qamoVFRUcHBydnZ38/Pz8/Pz////////8/Pz////7+/v9/f2ioqIYGBgY GBgaGhpra2v////9/f3+/v7////////7+/v6+vr///9fX18XFxcbGxscHBwTExMXFxcYGBgcHBwY GBgeHh4UFBQgICAVFRUfHx8XFxcWFhYYGBgfHx8XFxcYGBgYGBgbGxsaGhodHR0ZGRkSEhJQUFD/ ///8/Pz5+fn7/f79/////v/8/fv///n7//nz+v34/f/7+//7+f////z///v0//34///7+Pr//f// /P/++fv//fn///n9/vT///z//f/5+//6///6//77//n9//v//v////8AAP////n5+f////v7+6Sk pBwcHB4eHhwcHHNucPv5+ff8+/n+/MbHwxwdGR0dHR0fH+Pf5P/+///+//b59////uDt/zdYvx9O 2BRE0iZRvtbw/+r7/+j5/7rR/ytPyxRF1xpS10Nwy+r7////9v/+///7/7e4vB0gJBkbHFBQUOLi 4v////////39/f7+/v///////1hYWCQkJBcXF15eXvz8/P////////////z8/P///////////6Sk pB0dHR8fHxMTE3Nzc/////v7+/////39/f39/f7+/v///////0tLSxsbGxkZGRwcHBsbGx8fHxwc HBUVFR4eHh0dHRYWFhoaGhkZGRYWFhYWFh4eHh0dHRcXFx0dHRsbGxkZGRoaGhoaGhYWFiAgIBwc HEdHR/////39/fv//vL/9/T/+fj//Pr++f//+f///P3+//X3///9////////+P//9/r/+/v////8 ///5///4///9////+///+v39/fv///v+//j+/fv//P3/+f//+f//+////v///wAA/Pz8/v7+/Pz8 ////+vr6jY2NISEhFBQUGhUXrKqqy9DPys/NpKWhHR4aFRUVExUVmZWaxsXHwsHDztHPysvJx9T0 Pl/GFkTSGkngIUvMcpPif5rTfZjYY4HaIk7RFkvcFk7TQm7L6vr////5//n8//3//f//FRoZ7O7u /v7++Pj4////+vr6/////v7+/f39/v7+gYGBWVlZWFhYf39/////////9/f3/v7+/////f39/v7+ ////oqKiGRkZExMTHx8fZmZm+fn5+vr6/////////////////f39/Pz8qampm5ubm5ubnZ2dm5ub lZWVnJychISEZGRkOTk5GhoaGxsbFhYWIyMjHh4eGhoaGBgYcHBwmZmZm5uboKCgmZmZoaGhlZWV np6em5uboKCg+Pj4////+//++P/58P/18//5+v/7//34//7+7+7y/f3///7/+/n4///4+vzw9v/1 /f/+//j///f///v///3+//j4//v6//7//f7/9vr7+v/+/f/8///7///7///7///7////AAD8/Pz/ ///////+/v7///////9XV1cVFRUbFhggHh4XHBsSFxUeHxscHRkeHh4cHh4dGR4dHB4XFhgdIB4c HRtue5s4WcAdSdwaSOkUQd4iTdIkT8ghTcgaS80SSdoQTNwZTdVNddXn9f/8+/f//v/++/37//z0 /PX9//77+/v////29vb////////////9/f3+/v79/f39/f3////6+vr////+/v7////+/v7////+ /v79/f3+/v7ExMSBgYGFhYV9fX2fn5/////////+/v78/Pz////9/f3////////////8/Pz6+vr/ //////////9UVFQeHh4XFxcgICAYGBgaGhohISFNTU0YGBgbGxsfHx8MDAxqamrv7+/////+/v77 +/v////8/Pz////////////////39/f////8/v76///9/////v3//P37/v/2/P/2+f7//v/7+vb/ //n4//n5//3+9f//+v/5/P/6/////v///P/++Pn//P3////9/////v///f///v////z///v///8A AP////7+/vv7+/////////v7+9PT0xoaGh4aGRsZGBYZFxgdGxYXFR4eHhcXFxkYGhwaGhoYGB0g Hg8UEhUaHXF9oTtYuiFJ0RpJ4RFB3xZH3xdJ3xNG3BdN4A9I2RRK0x9Nykpsxuf2//v+//j3+/// //7/+v3/+f3+/P////z8/P////////z8/Pv7+/////////////////////////v7+/////7+/v7+ /v////////////////z8/P////v7+/39/f////////n5+f////7+/v39/f////////////n5+f// //////z8/Pr6+v7+/vj4+E9PTxkZGRUVFVhYWJCQkNvb2////5mZmRcXFxcXFyIiIhcXFxgYGOfn 59fX1/////z8/P////////39/fz8/P/////////7/f/9//3+//v9/v/+///+//v+//f9//v+//r8 /f///v3//PP79Pj//P/9//75//f+//b///38///7/v///v///vz8/P/+///8///9///9/////v// /P///wAA/v7+////+vr6/////////////Pz8i4yKIR4ZFhcOHiAaGx4cFBYXGRoeHRwgGBcZHh0Z GxwTGR8UDBUSDxooa3ikP1CmN1XGH07OFUzVFkzVGEvXGkrYHEvVIU3QKFDHLVC3WHK+5PT/7fT/ +/z///7///34///5///+//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// +/v7/////////////f39/////////f39fn5+4eHh+/v7/////////Pz8////19fXExMTHBwcGhoa FxcXHBwcqqqq////////////////+vr6/////////v7+//////7///7//////////////f///f// /f/////////////+/f/+/f////7///7//f//+/////7///////////////////7///7///7///// ///////+////AAD9/f3////////////////4+Pj////8/ftLS0UeHhgUFREYGxnFyMy/wsfJyc/K x8nOy8bGx73KzsLGz8y1wtK7x+9odrg8UaI0Wa4sWLMsVrcuVLowU7s0U7o3VLY8WKxIX6N4jcDl 9P/x+//6/v////7//fb///n///7///////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////5 +fn///+8vLyfn5+lpaWnp6erq6upqamqqqq0tLSrq6usrKyzs7O2tra2tra/v7+7u7u4uLitra0f Hx8cHBwcHBwaGhpMTEz////8/Pz////+/v7////9/f37+/v///////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////8AAP////////////r6+v////////j4+P///87LzSEeIBYYGBcbHHd6fvv+ //v7///8///+/f/++f//+P3//PL8/+37/+Xx/+b0/+v4/+75/+z3/+v1/+nz/+ny/+nz/+n1/+f1 /+z5//P///b///X99v3/+f//+P//+P///v////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////3FxcRsbGxcXFxYWFh0dHRoaGhwcHBgYGCIiIhsbGxoaGh0dHRsbGxYWFhwcHBwc HBoaGhQUFBYWFh0dHRYWFiAgIMDAwP////////X19f////////////7+/v////////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////wAA/////f39////+/v7/Pz8////////+/r8//z/dHF6HyAkExcY FxwdyMvP/f3///3///7////+///7///6+v/+8fv/7/z/8/z////+///4///+//7///z/+/z/+vz/ +v3/+P//+P/+9v73+f/4+f/3/f/7///8///8//////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /////////////f39+vr6b29vHR0dGxsbGRkZGxsbGBgYHh4eGxsbDw8PICAgFxcXFhYWHh4eGhoa FhYWHh4eGhoaGxsbISEhGBgYGBgYGhoaU1NT/Pz8/////////////v7+/////f39//////////// //////////////////////////////////////////////////////////////////////////// ////////////////////////////////AAD////6+vr////////6+vr+/v7//////v/8+P//+/8Z Gh4WGxoUGxhHTEvr7PD8+v//+v//+f///P3//Pn///v9//z4//73/vv+//3//v3//f/+/P/8+//8 +//6/f/6/f/6//77//z9//z7//r+/v7++v/++v///f///v////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////6+vqjo6Nvb29ra2ttbW1ubm5zc3NxcXF0dHSCgoJzc3N3d3d3d3d5 eXl+fn6CgoKAgIB3d3eHh4eDg4ONjY15eXmMjIyHh4f8/Pz7+/v////////+/v77+/v///////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////8AAPz8/P////v7+/////////7+/vz8/Pj3+f/8 ///8/+7w8BMZFFhgWc3Uz+Hl5v/9///7///5///8///+///++f7/9fj88f3/+P3//P/////+///+ //39//3+//3+/////////Pv8+P///P37+v/9///8///3//74///+//////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////r6+vz8/P////////////////7+/v7+/v////b29v// //////7+/v7+/vr6+v////////////v7+/39/f////7+/v////7+/v7+/v39/f39/f////7+/v// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////wAA+/v7/////////f39+/v7//////// //////z+/Pz84eXgwsrA+v/49v/1+//+/P7///z///f///j///v////+//75///3///4/f/8/f// /f///f////7////////////8///7///7///8/fv6/vv9/vr///v///v///7///////////////// //////////////////////////////////////////////////////////////////////////// /////////////////////////////////////v7+/f39/////f39/////v7+/Pz8////////9/f3 ////////+vr6/v7+////////9/f3/////f39/Pz8/////f39/v7+////9fX1////////+vr6/f39 //////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////AAD////8/Pz6+vr///////// ///7+/v8/Pz////9+/r///v6//b3//T6//n7//z7///+/f///P//+///+v///v///Pv///v///n/ //z9//z///7///7///////////7///z//fn///z///v//////v/+/P///P/8+f///v////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////7+/v////7+/v+/v7////9/f3////+ /v7////////+/v79/f3////+/v7+/v7////////9/f3////////4+Pj////9/f3////6+vr///// ///////////9/f3///////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAJCBAAAAYFACcgzQfJwAAABgMAAOEAAgCwBMEAAgAAAOIAAABcAHAAAgAAICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIAAgCwBGEBAgAAAMAB AAA9AQgABAABAAIAAwC6AQ8ADAAAVGhpc1dvcmtib29rnAACAA4AGQACAAAAEgACAAAAEwACAAAA rwECAAAAvAECAAAAPQASAOABeAA5IbIROAABAAAAAQBYAkAAAgAAAI0AAgAAACIAAgAAAA4AAgAB ALcBAgAAANoAAgAAADEAFADwAAAA/3+QAQAAAACGPAIBi1tTTzEAFADwAAAA/3+QAQAAAACGPAIB i1tTTzEAFADwAAAA/3+QAQAAAACGPAIBi1tTTzEAFADwAAAA/3+QAQAAAACGPAIBi1tTTzEAFAC0 AAAA/3+QAQAAAACGPAIBi1tTTzEAFADwAAEA/3+8AgAAAACGPAIBi1tTTzEAFADwAAAACACQAQAA AACGPAIBi1tTTzEAFAC0AAEA/3+8AgAAAACGPAIBi1tTTzEAFADcAAEA/3+8AgAAAACGPAIBi1tT TzEAFADcAAEACAC8AgAAAACGPAIBi1tTTzEAFAC0AAEACAC8AgAAAACGPAIBi1tTTzEALgC0AAAA /3+QAQAAAAEAPA8BVABpAG0AZQBzACAATgBlAHcAIABSAG8AbQBhAG4AMQAUALQAAAAIAJABAAAA AIY8AgGLW1NPMQAUAPAABAAMAJABAAABAIY8AgGLW1NPMQAUAPAABAAkAJABAAABAIY8AgGLW1NP MQAUANwAAAAIAJABAAAAAIY8AgGLW1NPHgQrAAUAEwABIgDl/yIAIwAsACMAIwAwADsAIgDl/yIA XAAtACMALAAjACMAMAAeBDUABgAYAAEiAOX/IgAjACwAIwAjADAAOwBbAFIAZQBkAF0AIgDl/yIA XAAtACMALAAjACMAMAAeBDcABwAZAAEiAOX/IgAjACwAIwAjADAALgAwADAAOwAiAOX/IgBcAC0A IwAsACMAIwAwAC4AMAAwAB4EQQAIAB4AASIA5f8iACMALAAjACMAMAAuADAAMAA7AFsAUgBlAGQA XQAiAOX/IgBcAC0AIwAsACMAIwAwAC4AMAAwAB4EaQAqADIAAV8AIAAiAOX/IgAqACAAIwAsACMA IwAwAF8AIAA7AF8AIAAiAOX/IgAqACAAXAAtACMALAAjACMAMABfACAAOwBfACAAIgDl/yIAKgAg ACIALQAiAF8AIAA7AF8AIABAAF8AIAAeBC4AKQApAABfICogIywjIzBfIDtfICogXC0jLCMjMF8g O18gKiAiLSJfIDtfIEBfIB4EeQAsADoAAV8AIAAiAOX/IgAqACAAIwAsACMAIwAwAC4AMAAwAF8A IAA7AF8AIAAiAOX/IgAqACAAXAAtACMALAAjACMAMAAuADAAMABfACAAOwBfACAAIgDl/yIAKgAg ACIALQAiAD8APwBfACAAOwBfACAAQABfACAAHgQ2ACsAMQAAXyAqICMsIyMwLjAwXyA7XyAqIFwt IywjIzAuMDBfIDtfICogIi0iPz9fIDtfIEBfIB4EGgAXABUAAFwkIywjIzBfKTtcKFwkIywjIzBc KR4EHwAYABoAAFwkIywjIzBfKTtbUmVkXVwoXCQjLCMjMFwpHgQgABkAGwAAXCQjLCMjMC4wMF8p O1woXCQjLCMjMC4wMFwpHgQlABoAIAAAXCQjLCMjMC4wMF8pO1tSZWRdXChcJCMsIyMwLjAwXCke BBUAsAAQAAAiWWVzIjsiWWVzIjsiTm8iHgQaALEAFQAAIlRydWUiOyJUcnVlIjsiRmFsc2UiHgQU ALIADwAAIk9uIjsiT24iOyJPZmYiHgRdALMALAABWwAkAKwgLQAyAF0AXAAgACMALAAjACMAMAAu ADAAMABfACkAOwBbAFIAZQBkAF0AXAAoAFsAJACsIC0AMgBdAFwAIAAjACwAIwAjADAALgAwADAA XAApAOAAFAAAAAAA9f8gAAAAAAAAAAAAAADAIOAAFAABAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAB AAAA9f8gAAD0AAAAAAAAAADAIOAAFAACAAAA9f8gAAD0AAAAAAAAAADAIOAAFAACAAAA9f8gAAD0 AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADA IOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA 9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAA AAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAA9f8gAAD0AAAAAAAAAADAIOAA FAAAAAAA9f8gAAD0AAAAAAAAAADAIOAAFAAAAAAAAQAgAAAAAAAAAAAAAADAIOAAFAABAAkA9f8g AAD4AAAAAAAAAADAIOAAFAAOAAAA9P8AAAD0AAAAAAAAAADAIOAAFAABACwA9f8gAAD4AAAAAAAA AADAIOAAFAABACoA9f8gAAD4AAAAAAAAAADAIOAAFAABACsA9f8gAAD4AAAAAAAAAADAIOAAFAAB ACkA9f8gAAD4AAAAAAAAAADAIOAAFAAPAAAA9P8AAAD0AAAAAAAAAADAIOAAFAAJAAAAAQAYAAAY AAAAAAAAAADAIOAAFAAFAAAAAQAYAAAYAAAAAAAAAADAIOAAFAAFAAAAAQAaAAAYAAAAAAAAAADA IOAAFAAFAAAAAQAQAAAYAAAAAAAAAADAIOAAFAAFAAAAAQAgAAAIAAAAAAAAAADAIOAAFAAFAAAA AQAaAAA4EhFAIEAgAADAIOAAFAAFAAAAAQAaAAA4ERFAIEAgAADAIOAAFAAHAAAAAQAqAAB4IRFA IEAgAAQJIOAAFAAFAAAAAQAaAAA4IRFAIEAgAADAIOAAFAAMAAAAAQAaAAA4ERFAIEAgAADAIOAA FAAFAAAAAQAZAAA4IRFAIEAgAADAIOAAFAAFAAAAAQAdAAA4IRFAIEAgAADAIOAAFAAHAAAAAQAo AAB4IRFAIEAgAAQJIOAAFAAOAAAAEQEgAAAAAAAAAAAAAADAIOAAFAAMAAAAAQAaAAA4EiFAIEAg AADAIOAAFAAFAAAAAQAaAAA4ESFAIEAgAADAIOAAFAAFAAAAAQAdAAA4ISFAIEAgAADAIOAAFAAK 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 AAAAAAAAAAYBAwADAAAAAQAGAAABGgAFAAAAAQAAARYBGwAFAAAAAQAAAR4BKAADAAAAAQACAAAC AQAEAAAAAQAAASYCAgAEAAAAAQAAFaMAAAAAAAAASAAAAAEAAABIAAAAAf/Y/+AAEEpGSUYAAQIB AEgASAAA/+0ADEFkb2JlX0NNAAL/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsKCxEV DwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0ODRAO DhAUDg4OFBQODg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/ wAARCACAAIADASIAAhEBAxEB/90ABAAI/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFBgcICQoL AQABBQEBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhEDBCESMQVB UWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfSVeJl8rOE w9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIBAgQEAwQF BgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYWorKDByY1 wtJEk1SjF2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9ic3R1dnd4eX p7fH/9oADAMBAAIRAxEAPwD1VJJJJSkkkklKSSSSUpJJJJSkkkklKSWN1D63/V/p2bVgZGWw5Ntg qLGe4Vlx27sl49lDd3+kWynShOIBlExEtY2K4vJAIOx2UkkkmpUkkkkp/9D1VJJJJSkkkklKSSSS UpJc91P64YmOX1YLftVrDtL5iprgYexz/pO/62uWz+qZWe17uoZLvROhaHenWO3t127/AHfSVfJz eOBoes+G32sU80Y6bnweo6h9dumYjLXUV25oqYXTQBtJADva97m+3993/VrlsrrnX/rDijMyM2vo 3RXOcHVUOJvexv8Awns9T1Jc36WPT/pKlz2P1W/Fx3NZttoa94xsx8srhodZ6e07Pdub+iY9zP8A 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 939Frsb++31/+Dp/R2LvsPCxMGhuPiVNppbqGtHc8ud+c97v33I6SoQxxhtvQBl+kabcYCO2/dSS SSeuUkkkkpSSSSSn/9b1VJJJJSkkkklKWf1joXS+tU109Rp9ZlLxYzUtIMbSN9Za7Y9p22MWgkjG RiRKJMSNiNCoi9Cjoopx6mUY9baaaxtZWwBrWgfmsY32tREkkFKSSSSUpJJJJSkkkklKSSSSU//Z /+0bglBob3Rvc2hvcCAzLjAAOEJJTQQlAAAAAAAQAAAAAAAAAAAAAAAAAAAAADhCSU0D7QAAAAAA EABIAAAAAQACAEgAAAABAAI4QklNBCYAAAAAAA4AAAAAAAAAAAAAP4AAADhCSU0EDQAAAAAABAAA AHg4QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAAAAAABADhCSU0ECgAAAAAAAQAAOEJJ TScQAAAAAAAKAAEAAAAAAAAAAjhCSU0D9QAAAAAASAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQCh mZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D+AAAAAAA cAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAA AAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAA4 QklNBAAAAAAAAAIAAThCSU0EAgAAAAAABAAAAAA4QklNBAgAAAAAABAAAAABAAACQAAAAkAAAAAA OEJJTQQeAAAAAAAEAAAAADhCSU0EGgAAAAADPwAAAAYAAAAAAAAAAAAAAMgAAADIAAAABWcqaAeY mAAtADEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAMgAAADIAAAAAAAAAAAAAAAA AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpj AAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRv bWxvbmcAAADIAAAAAFJnaHRsb25nAAAAyAAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAAAAAF c2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAGb3JpZ2lu ZW51bQAAAAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51bQAAAApFU2xp Y2VUeXBlAAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9u ZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAAAyAAAAABSZ2h0bG9uZwAAAMgAAAAD dXJsVEVYVAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dlVEVYVAAAAAEAAAAAAAZhbHRU YWdURVhUAAAAAQAAAAAADmNlbGxUZXh0SXNIVE1MYm9vbAEAAAAIY2VsbFRleHRURVhUAAAAAQAA AAAACWhvcnpBbGlnbmVudW0AAAAPRVNsaWNlSG9yekFsaWduAAAAB2RlZmF1bHQAAAAJdmVydEFs aWduZW51bQAAAA9FU2xpY2VWZXJ0QWxpZ24AAAAHZGVmYXVsdAAAAAtiZ0NvbG9yVHlwZWVudW0A AAARRVNsaWNlQkdDb2xvclR5cGUAAAAATm9uZQAAAAl0b3BPdXRzZXRsb25nAAAAAAAAAApsZWZ0 T3V0c2V0bG9uZwAAAAAAAAAMYm90dG9tT3V0c2V0bG9uZwAAAAAAAAALcmlnaHRPdXRzZXRsb25n AAAAAAA4QklNBBEAAAAAAAEBADhCSU0EFAAAAAAABAAAAAI4QklNBAwAAAAAFb8AAAABAAAAgAAA AIAAAAGAAADAAAAAFaMAGAAB/9j/4AAQSkZJRgABAgEASABIAAD/7QAMQWRvYmVfQ00AAv/uAA5B ZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwM DAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAIAAgAMBIgACEQEDEQH/3QAEAAj/ xAE/AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYH CAkKCxAAAQQBAwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFD ByWSU/Dh8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80YnlKSFtJXE1OT0pbXF1eX1VmZ2 hpamtsbW5vY3R1dnd4eXp7fH1+f3EQACAgECBAQDBAUGBwcGBTUBAAIRAyExEgRBUWFxIhMFMoGR FKGxQiPBUtHwMyRi4XKCkkNTFWNzNPElBhaisoMHJjXC0kSTVKMXZEVVNnRl4vKzhMPTdePzRpSk hbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2JzdHV2d3h5ent8f/2gAMAwEAAhEDEQA/APVUkkklKSSS SUpJJJJSkkkklKSSSSUpJY3UPrf9X+nZtWBkZbDk22CosZ7hWXHbuyXj2UN3f6RbKdKE4gGUTES1 jYri8kAg7HZSSSSalSSSSSn/0PVUkkklKSSSSUpJJJJSklz3U/rhiY5fVgt+1WsO0vmKmuBh7HP+ k7/ra5bP6plZ7Xu6hku9E6Fod6dY7e3Xbv8Ad9JV8nN44Gh6z4bfaxTzRjpufB6jqH126ZiMtdRX bmiphdNAG0kAO9r3ub7f33f9WuWyuudf+sOKMzIza+jdFc5wdVQ4m97G/wDCez1PUlzfpY9P+kqX PY/Vb8XHc1m22hr3jGzHyyuGh1np7Ts925v6Jj3M/wBH/o1X6hh20PrFlhyMXIYMnFftLK3MeJcW UfRp9F++p9P+BWn8Mw8xIS44Rxz4/wBXkyR9XB+mIY5fpQ9Prn62GeWWvFt2jp9rPFza+nWZlePV Vm4uRW+hrr2aGsma7mtb9Cz97/SL0T/F99Y3dT6aMDKcXZmE2G2O/wANSIYy4O/PfV7acj/rdn+H XmLXsbYwubvDXBzq5iQD9Hh3/Urp8fJyMHGo+sFl4wjvH2TCrY2ze+XepVd7fVrZlUu/7T/zNH6b +c9NW/iso4xhhKHEc8hj9+/V70Y8OP8AVY4+r3P8p6IYoQ/6ms5ec+Ooi46mQ/di+qJKt07Po6lg 05uPIrvbuDXCHNPD67G/m2VP/R2fy1ZWUQQSD0bykkkkFP8A/9H1VJJJJSklhdb+uXROjl1Vlv2n Lb/2lohzwf8AhXT6dH/XX71wHXvrt1vq7H0Nf9gxXgj0aCdxEcXZPte/+rV6Nat8vyGfNRA4In9O fpH+D+8xZM8IaE2ewe86l9ccHGLq8Npy7WmCQdtc67mm3X3s/d2rlM/q/Ueobzl5D21OBa9lTjUx oc01OM7va/a795c/i599OJLqw6tz2tFzyW1Vvd/PNs2BzvSY4ss/67/o1JmHn5r7LLmGwYjh64EA AACCAAAAgwAAAIQAAACFAAAAhgAAAIcAAACIAAAAiQAAAIoAAACLAAAAjAAAAI0AAACOAAAAjwAA AJAAAACRAAAAkgAAAJMAAACUAAAAlQAAAJYAAACXAAAAmAAAAJkAAACaAAAAmwAAAJwAAACdAAAA ngAAAJ8AAACgAAAAoQAAAKIAAACjAAAApAAAAKUAAACmAAAApwAAAKgAAACpAAAAqgAAAKsAAACs AAAArQAAAK4AAACvAAAAsAAAALEAAACyAAAAswAAALQAAAC1AAAAtgAAALcAAAC4AAAAuQAAALoA AAC7AAAAvAAAAL0AAAC+AAAAvwAAAMAAAADBAAAAwgAAAMMAAADEAAAAxQAAAMYAAADHAAAAyAAA AMkAAADKAAAAywAAAMwAAADNAAAAzgAAAM8AAADQAAAA0QAAANIAAADTAAAA1AAAANUAAADWAAAA 1wAAANgAAADZAAAA2gAAANsAAADcAAAA3QAAAN4AAADfAAAA4AAAAOEAAADiAAAA4wAAAOQAAADl AAAA5gAAAOcAAADoAAAA6QAAAOoAAADrAAAA7AAAAO0AAADuAAAA7wAAAPAAAADxAAAA8gAAAPMA AAD1AAAA/f////YAAAD3AAAA+AAAAPkAAAD6AAAA+wAAAPwAAAD9AAAA/gAAAP8AAAAAAQAA23RT h472PLL6bH+6uxttPuptxfWy/oLP+487kyETIwRxy+e+H1RP6H7zDKc5neu3Cgw8rJxqch1Lm5VF Tgx90OLQQf6Q1jBud+re6xn/AAf/AAKM3p3Uc2w23FprqP8ATMh4bitLHS77L6e/7bVfR/gsSv7R vR8jMxOn9QLGUDMdcGNycjNJ9CxjXH0bGYgFf8ztZX9syf57ZZZ6DPtKO/OZbe21+QDDLWHOAcBW Rtt9PDbFGL9P/BWez1af0HqrU+6Y8UvdxYRI5B7gyy9UY/3Yx+T/AMbREC9Ttugz844dbG4Vf2iq 5zbXZWSN5NjPa1leNYXMxHMqbXV6l3qZF/oV5P6K1Uup3sychz6sh1jLB64Y/c7bbYR67axq1tj4 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 fq/8f/xtq0anUNqFtJip/vLzoST/AKY/v7v+mgdE+rvUuvWOqwKycVri12XcIqaAdNxb/OX7dv6G j/rnpL0joH1M6Z0UNsLn5mUDvF10QxxA3ux6W+yndH8u3/hVD8bwicoDHk4euXF04umUx/f/AL7H hxzkNdB3ea+r31Fzbsu3NyXuwun5QbYcYD9K6z862vd/Ra7G/vt9f/g6f0di77DwsTBobj4lTaaW 6hrR3PLnfnPe799yOkqEMcYbb0AZfpGm3GAjtv3UkkknrlJJJJKUkkkkp//W9VSSSSUpJJJJSln9 Y6F0vrVNdPUafWZS8WM1LSDG0jfWWu2PadtjFoJIxkYkSiTEjYjQqIvQo6KKceplGPW2mmsbWVsA a1oH5rGN9rURJJBSkkkklKSSSSUpJJJJSkkkklP/2QA4QklNBCEAAAAAAFUAAAABAQAAAA8AQQBk AG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAAAATAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgA bwBwACAANwAuADAAAAABADhCSU0EBgAAAAAABwAIAAAAAQEA/+ESSGh0dHA6Ly9ucy5hZG9iZS5j b20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRj emtjOWQnPz4KPD9hZG9iZS14YXAtZmlsdGVycyBlc2M9IkNSIj8+Cjx4OnhhcG1ldGEgeG1sbnM6 eD0nYWRvYmU6bnM6bWV0YS8nIHg6eGFwdGs9J1hNUCB0b29sa2l0IDIuOC4yLTMzLCBmcmFtZXdv cmsgMS41Jz4KPHJkZjpSREYgeG1sbnM6cmRmPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIy LXJkZi1zeW50YXgtbnMjJyB4bWxuczppWD0naHR0cDovL25zLmFkb2JlLmNvbS9pWC8xLjAvJz4K CiA8cmRmOkRlc2NyaXB0aW9uIGFib3V0PSd1dWlkOmExODk4MTQ3LWMwNTgtMTFkZC05ZmE4LTgw MDFjOWY2NjA1NCcKICB4bWxuczp4YXBNTT0naHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21t Lyc+CiAgPHhhcE1NOkRvY3VtZW50SUQ+YWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmExODk4MTQ0LWMw NTgtMTFkZC05ZmE4LTgwMDFjOWY2NjA1NDwveGFwTU06RG9jdW1lbnRJRD4KIDwvcmRmOkRlc2Ny aXB0aW9uPgoKPC9yZGY6UkRGPgo8L3g6eGFwbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9J3cnPz7/7gAOQWRvYmUAZEAA AAAB/9sAhAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgIC AgICAgIDAwMDAwMDAwMDAQEBAQEBAQEBAQECAgECAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwP/wAARCADIAMgDAREAAhEBAxEB/90ABAAZ/8QBogAAAAYC AwEAAAAAAAAAAAAABwgGBQQJAwoCAQALAQAABgMBAQEAAAAAAAAAAAAGBQQDBwIIAQkACgsQAAIB AwQBAwMCAwMDAgYJdQECAwQRBRIGIQcTIgAIMRRBMiMVCVFCFmEkMxdScYEYYpElQ6Gx8CY0cgoZ wdE1J+FTNoLxkqJEVHNFRjdHYyhVVlcassLS4vJkg3SThGWjs8PT4yk4ZvN1Kjk6SElKWFlaZ2hp anZ3eHl6hYaHiImKlJWWl5iZmqSlpqeoqaq0tba3uLm6xMXGx8jJytTV1tfY2drk5ebn6Onq9PX2 9/j5+hEAAgEDAgQEAwUEBAQGBgVtAQIDEQQhEgUxBgAiE0FRBzJhFHEIQoEjkRVSoWIWMwmxJMHR Q3LwF+GCNCWSUxhjRPGisiY1GVQ2RWQnCnODk0Z0wtLi8lVldVY3hIWjs8PT4/MpGpSktMTU5PSV pbXF1eX1KEdXZjh2hpamtsbW5vZnd4eXp7fH1+f3SFhoeIiYqLjI2Oj4OUlZaXmJmam5ydnp+So6 SlpqeoqaqrrK2ur6/9oADAMBAAIRAxEAPwDf49+691737r3Xvfuvde9+691737r3Xvfuvde9+691 737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvf uvde9+691737r3Xvfuvde9+691//0N/j37r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvd e9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+69173 7r3Xvfuvde9+691737r3X//R3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3 Xvfuvde9+691737r3Xvfuvde9+691737r3XFmVFZ3ZURFLO7EKqqouzMxsFVQLkn6e9gFiABUnrR IAJJx1UF8pf54fwH+LW9sT13lOwsh2vuyXcmLwu76fpyhpt54frfG1VfT02Xzu8NyQ1tPhGbAUck k82Mxs2QzDGEx/aqzA+8j/b/AO6n7xe4W0Xe/wBnsAsNoS2aWKS8Jg+pIBKxwIVLsXIoHYJHQ110 6jnmj3U5Q5UuLW1vrx5Z5XApCviBATlmINABxoCW+XVt2Hy+K3BicXnsFkaLMYTN46iy+Hy2NqYq zHZTFZKmircfkaCrgZ4KqiraSZJYpEYo6MGBIPvHSeCa1nmtriJkuI3KsrCjKymjKQcggggg8D1I kciTRxyxOGjZQQRwIIqCPkR04+2ur9e9+691737r3Xvfuvde9+691737r3Xvfuvdf//S3+Pfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3XvfuvdRRXULS1cC 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 WhqZKeTXUU1XHHpYa3Yi9+D7MPdT285U96vbvfOSd3tlfdNxTw9vJAJWThVfTI8uiraN2u9vmKhj 1bt/LZ+JPyq+VsVftDrfq7NN13SPSV21e5N+QZbCdPY7BZDIxnKYTJZqTF1Y3XWYGrRq3HU2KWrl KM6ssausg+U73T+7p7hbF7j3vIW7WotL6ymdbiYrQKquQMjizLUhOPmaA9ZFbPyzdc3tBe2H6djR asaha0Fft/Lrcx+GX8s/o/4kpR7vqFl7S7wkpUTJ9o7nhZI8ZI0SRy0ew9rGpqsVtDHAg/up5sjL qbyVLIVjSX+Sfbfl/kqzgjtoFm3Jalp2A1EnJpx0j08/n1OeycsbZssUfhQq90OMhGan09P8PVj3 uQuhH1737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf//U3+Pf uvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691pE/zpfiLm/wCX38w9v/PvpPaFDmukvkBl t14TtTY8kNXQ7dwXZe+8DkcTv7C1VfjD9xgsR3VgqypyNHUxKTSbgpahirpJFC3Qb2G33aPff2q3 n7u3O85a5hUPZd1HlXNKv8X+LEL2g0ZCuMHqC+ddmteVd7Xm+3tiYZj3gDCOua4/jyftr8uqdNz7 o7B+cnYXUXTnx76C3CuV2/ityY7YfW+3MtP2PvDIybszFBlt5bs3NuNMLtrGUeMSvgo0eqkhx2Fx FHFqqZgzl1yK9rfbna/uu8kbhe71zpZ2pmJSS5mNEeFO4QhBUtJg6AgLu1FAJNOok5k5g3n3J3G1 i5b25mv1NFOnAxkseAGmuTSnW0p/Lw/4T1de9ZU+D7Q+c5wXb/YCJT12L6Lx075Lp/Z78yx0++Kq WOnbtnMwejzUsscW3YZQ6eDIqIqr3iz70/fHvt/lfZfZ60uNn2dfivnb/H5m/EYSuLSMmunRqmIo dcZqvUt8leymz7T4W58yRpd7wRUr/oSn5j8Z+3t+RGetmSjo6THUlLQY+lpqGhoqeGkoqKjgipqS kpaeNYaempaaFUhp6eCJAqIihVUAAAD3gxJJJLI8srlpWJJJJJJOSSTkknJJ49TmqhQFUAKOAHUn 3TrfXvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X//V 3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+690DHyF6A6u+UfTe/Oh+5dvjcnXnYmFl w2coo52o8hSOJI6nHZrCZGNWmxWfwWSgiq6KpQEw1MKMQy3UnfLnMW8cp73tvMWw3rW+7WkqyRuP JlPAjgyngynDKSDg9I9w2+03SznsL6EPayLRh/mPEH0I6Cv4gfBb4yfBjY02x/jt1zQ7YOWFLJu/ euTlbO9i7+r6RX8VfvPeVcpyeTEUs0r09FF4MZQGaRaOlp0Yp7EnuL7n86+6m+y8wc6bubi8Pwoi JFBEMCkUEYWNK0GohdTnLsxz0X7Fy5s3LdsbTZ7FYYyak5LMf6TGpPyFaDyA6N37AHR51737r3Xv fuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf//W 3+Pfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde 9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvdf/9ff49+6 91737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3X vfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691737r3Xvfuvde9+691//2WIAB/B8iwAA BgbnKa4YBmrmA/vYk3fA2mia/wBYiwAAAgAAAAAAAAAAACEAAG4e8FCLAADnKa4YBmrmA/vYk3fA 2mia/4lQTkcNChoKAAAADUlIRFIAAACbAAAAvQgCAAAAK/aY8AAAAAFzUkdCAK7OHOkAAAAJcEhZ cwAADsQAAA7EAZUrDhsAAIrkSURBVHhe7b0HlGVZed9b4caKXdVxOkx3T84EIUAiiTggY0TOPD+9 ZUvIAoQltLx4WpIl2cJasuUnvyULAcIiiCQYhDRgkBAMcZjAAAMMTKSnc6yc7r2V3u///c/ZdepW d1X3aBbmeflMze1zzz1nn72/vL/9fd/uXF5e7vjfx/9CEOj6X2gs/3sogsD/xuj/anTQua7UXVoz XFPA2uu6ivjuLHwWyYXr8RSPn8/n/x+hvNSx3NXRmSDzT2SVs0P4HHBJUNXvGUYXlzo6O/nS0Rk9 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 wh6BeuzEMSiD/F/6c/d3vqNdS6NoOfdt37YdtLE8DA61KIhSiLxSSyyow/EYPOhMU+mvyO42xGyI rXOcl60LcMNk0EFbAFq+3FgNBkYJo/aWGa9pRuUTP+v7bUlZLJtK/LV4OFaBR2ziOgiB+x1TyU/e CRYBiJD0TNdCjF9xFxN5xJ2gike8/YSnT1rtCpKv9lRJcSHvhdy5vfsvpth4qVradfEu9rxCYnMj S3Anjx87c4qlkqOsCEDD9AEEOPDFNI029XsZkQdoiufYsmnLju3b0dNHjxw5fvSYwvaXlgkfwguI lj5w4EcA5cixw/La13u4csWll5llzbW0aR+kSTwZmwlc/ySM+mHZH3EUoV98Wbot2ZnJXuUnW6G+ x7Zcut8nRZ72lTQ14sR2E5QL5wFNZCMo9x6zCFWzqekMJoPDeAWE70UYF/KnA5Zggnt3BNy2tJ04 9yDqFanVaqHqWO3yfkDYO8SIIDMhC+Q8PEQ7bHNC4zAf7yIgwTExNGiK56AD0IjU0fw8pRjoDEUb 6MOui3ZqWa1Pi6AP3v/A7p27r7z8ipf9wstAM81Cms42p1lsJVbjOWfURm0Cvr0PhtU/CaMJkdaU ZjgLW6BgG8+RWpZjiazMnUZV0gdp6uKOrkWnH/c6Gq+gZaQQX71VkgEBAAACAQAAAwEAAAQBAAAF AQAABgEAAAcBAAAIAQAACQEAAAoBAAALAQAADAEAAA0BAAAOAQAADwEAABABAAARAQAAEgEAABMB AAAUAQAAFQEAABYBAAAXAQAAGAEAABkBAAAaAQAAGwEAABwBAAAdAQAAHgEAAB8BAAAgAQAAIQEA ACIBAAAjAQAAJAEAACUBAAAmAQAAJwEAACgBAAApAQAAKgEAACsBAAAsAQAALQEAAC4BAAAvAQAA MAEAADEBAAAyAQAAMwEAADQBAAA1AQAANgEAADcBAAA4AQAAOQEAADoBAAA7AQAAPAEAAD0BAAA+ AQAAPwEAAEABAABBAQAAQgEAAEMBAABEAQAARQEAAEYBAABHAQAASAEAAEkBAABKAQAASwEAAEwB AABNAQAATgEAAE8BAABQAQAAUQEAAFIBAABTAQAAVAEAAFUBAABWAQAAVwEAAFgBAABZAQAAWgEA AFsBAABcAQAAXQEAAF4BAABfAQAAYAEAAGEBAABiAQAAYwEAAGQBAABlAQAAZgEAAGcBAABoAQAA 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 oEYd8GkyAwBYKcKKEWFqjrgaVgd9PyLt///Y/+AAEEpGSUYAAQEBAMgAyAAA/9sAQwADAgIDAgID AwMDBAMDBAUIBQUEBAUKBwcGCAwKDAwLCgsLDQ4SEA0OEQ4LCxAWEBETFBUVFQwPFxgWFBgSFBUU /9sAQwEDBAQFBAUJBQUJFA0LDRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU FBQUFBQUFBQUFBQU/8AAEQgF9gWFAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgME BQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEV UtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3 eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh 4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALUR AAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDTh JfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJ ipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz 9PX29/j5+v/aAAwDAQACEQMRAD8A/VOiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAZLKkEbSSMERRksxwAK8y8VfGOO0aSDSIvPZflNw eQD7CqfxW8ZNcXR0e1kKxp/rmQ/ePpXntvZxknAOP61rBLdoDRuPHPiC+lMh1W4QnPyI2F/IUWHj 7xLYlS+oSEA/dY7gRVZLFVGEBLetO8uMpsZSrqM4Ycmt7vsS7Hb6D8bZFcR6rbBk/wCesPB/KvS9 E8Raf4htxNY3KTL3UH5h9RXzlLCpwq8M3t0FMsZ7nRblbizle3nVshlbGfwqHBNdmM+oqK868D/F SLWHSx1QC3vOiy9EkP8AQ16ICCMjkVg04uzGLRRRUgFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA8ACAgAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFct478ZQeGLAxq4N9MCIox1H+0aveK/FNt4V0xrmc7 pDxHGOrH/CvBNU1K417UnvbqQvM57DoOwFaRjfUCuZXu5ZXYl5Sd7OwzmtKyMQ2EnIPPzDGKSONQ BtB3f3hVsQo6hGkG89MjFdCikRfuMMOGdk3DngimTsY1D7dzE8epqbyGi3ISWXtzTkjUQsEUs/Yg 9Kskp3MO9Q3lkMe9U2i3qBtLOPQYrZhCoRuBZvTNV5GkMrAqFGevemHqYlzblSG24I688iuw8I/F W80GRLXUM3ljwN/WSP8AxFYV1aGWPlSv+0OappZYXqDjjBqGk0UmfRuj63Za9ZpdWNwk8Td1PT2P pV6vmTRdWvvDF19psJWjYH7g6OPQjoa9k8IfFCx18R215iyvyPusflY+xrmlC2xZ29FHWiswCiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqOs6xbaFp8t5dSBI0HfufQVbllS GNpJGCIoyzHoBXhHxB8Xy+J9RMUBIsIWxGv98+pq4x5mBleJtevPFmrNdTSERZxHCOirUllZiKMc ANTNOsjJt2rh85weAa01tt6kBArJ/FmulEN9hqRbiCuQw5wKUjLBnjBI/WpYC+7JPQY3betOLRSo 6OrKydG7Gq9SPQhhuVYkOMcdDS2qIm9mlwOoBFRL+7cgKrZ6lu1LlXGU5GcYx3phoOkMK3B8uRmJ XPTiopVYyKchd3rUsiSrGGhCHnv2qUo9y5JVWIHODgUAylIJPKKbhj1FVZIA0Z7HOM+tXQu+TEv7 lB1YDIpWiQRuyv5sY+YcYzT1AzWtN+wEAEdDVK5tHLExtgqfvCtcZlAfbsJ4C1BLD5SbPueuORSs Vc6Hwl8T73w8gg1Ldd2YOAx5ZB7etev6RrdnrtotxZTrNGR2PI+or55ksXNv8yggjIpmmatf+Grp bmwmdGB+ZFGQ3sRWMoJlJn0xRXDeDvilY+IDHa3uLC/PAWQ4WQ/7J/pXc1ztNaMoKKKKQBRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRXOeOfFkXhXSHl3D7VJ8sKH19fwppNuyA5H4s+M/KUaNa ShWf/XuD0/2a85s7Q5UFSw9TTVD6lcPNMfOdiWYt1JNatrCbVQD0I4FdSVtCWyxAjiJgVLqvKkcY pfOZEJBDe2OlLHctKuyR/lU5Cr/Wml4gAWwPatTPqOS5lnhZWyIwONvajylZNok3L/WlkkRFBQcn +EUoh+8QVV+tDQEVohSZkePcn941Ze2jhDLJITCeQFOCDVe2nKyncw54pLnejAMNwPIzRbUQjMrF CGPlqeauSrGER1dwCO/FV90ezJj4Pb3pi7mYhjvB6D0oActuZDy+UJ5NMz+9CpyDwM1LBEVYhiVU /wANPENuq7VkJuFbv0xRfuFisbfaxAAQg5yabkDhsEn1qxcLIJNwkBAGNoFVCh37QW3tyAecUikg d2WIq2GJHUdqpHaQqD5W71ozv5axgx8H+Kobzy5414CBDktjFN7iWiMe5sVDl8ncOQBXWeDvifqP h/Za6lvvrEnh2OZIx7HuPasnyUIWRPnyPvVSkt4zxIT3IrNq5dz6G0fXLLXrRbiynWaM+h5HsRV+ vmbSdavvDl+lxZTNFk8oPut9RXsXhH4m2WulLa8ItL3oAx+Vz7VhKm46lJ3O3opAcjI6UtZDCiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAgvbyLT7SW5ncJFGpZmPpXz34o8RzeLtZluSrCJDtijI4C11fx V8XNqdyNHspSII2/fOh+83pXJadp8kYBB6njIrphGyuxMdZwo8QVQwb24q4YHRV6kA+tSPC0IGcB j6dKjVt8irIpBU5AFbJGT3J0t2GX2F/TpiodrS7x5IaQkDIqV5CzEopRehBPWn2ryNCySssY3ZB7 mmtA3GmI24+ZdpHcmlRnkV2GMkY5I6U1ppApVv3gB+8RSQqDGWb5HPQLQBEbJocnfg5zgDP86JGa Xhjz6mrLO8UQ8xSGb+JhjNLbJE8EhLYb+EU9RFaPMYCEksfUYqcxGSEKylHJ4bpU0kbvGpbZgcD1 qK4R5lyzF1ToPSktR7Ec0rW5GVWRR1yec1MLNLi3d1DK3fAqqq53Y+Y5zg1dFxK6YDgDodtOwrkE Kj7PLtxEyY4Y5L/SopopmSNlwCeTk4xSy2Jj2sVO3OQx5zUkCrIrFiQg6H3oAikWKaRUmjYKozuD d6ayhspkBD045p87ZbAG4nv6U2WJvLKFOD/F6UBYc0RjiWI4B7EVWWDymK8O361ZIeOOMHbIijA/ vZphdZgP3ItnHXnJJoGtCjNZEyDcApB6BarXFs4nJEQDDpitmMm4DGQNGE6Me9VLwOyfLyDzkVFr 6FXNjwn8Ur3w/L9m1EPe2IwARzJH9D/EPrXsWka3Za7aLc2M6zxN6dR7Edq+dp7QMFIOAR1PeptK 1W98OXi3FhO0b/xLnKsPQ1lOCeqKTPpGiuK8I/Euz14Jb3eLS86YJ+Vj7Gu0ByMjkVztWKFooopA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAVyHxE8XL4d0wwQt/p1wCEA6qO5rotY1aDRNOmvLhsRxjOO7HsBXgGq3934l1i a+nJ3t0Q9FXsK0hG7uxFKzjeaTMgJYncWPU1vPOZY0iDbAveoreFfKU5GR1wc1Y2LK4RlSNP7/U1 1JWIbbG3IBC/MWCng+tPlIYJIuQ+PmzSI7Rqdx8wDhfUU4DzQpADA9Tnp9aokgR3N0qqCzNzz0xU v7l5JFcsrjp6U2XfIoQPhBn7gzUdvEYo5Nz+YEGQWPNAEi/LyWLAUxNi3JkAOCMfSnwzRrFsUHce do5xTjtwu8/OT0xxTFcRt08Y3SFlBzzSRpN5JbeACeCO1OKrJhSAMdMHFPBjdShfbjocUBtsMTds PV5CeM9KjuQ6hApxn73PFSljG4wxJxxjvUYcvGwkXYx7GncBYY3DEAjJ6ilLwoyxO5APORTI7ZZE 2ozeYOcM3NLCr3J8qRI2QDJYH5hSuFhVTcdwZyvQZbjFO+zB45BGcEc9etKEUhY1I2njFDwxW0q7 pljGM0BYYIwQMEiVTnPala6ZhJkg7edvrSyXSMhkUk9gMU2C4jkTasahu/ajfUNtCEyyyoGWMDPX 1FNkGGPZzyM+tSRSyq7JEm2TqCTkUSM3meUyBJh1cnOfwphsSW90VgKMu9scioQhkGIxjPZvSnLa M8gaNyzAcnPApVkSIZYnzCcAjpS32GytNEuCkyZKj5StVjZNIuAMVdmklMqgiNkP3ic/pUZH73cm 5B6DpR0Ayp7RxICrFV67vQ11PhD4oahoNwtpqLfbbHoG/wCWif4iscxtOdj5J+mKqXOn7ASCOD19 amUU9yos+h9J1mz1y1W4sp1mjP8AdPI9jV6vmnTdQ1Dw5erc2Fw8EnUhmyj+xFev+Dvibaa8Etr/ AGWV/wBMbv3ch/2T/Q1yyg1sabnb0UUVkAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUjMFUknAHJJpa8++KPjL+zLX+y7R/9KmGJGB5R f8apLmdgOU+JHi1tf1IWls+bSBiBj+NvWudhTyo1ZgVY8Giys9mGddzsM5NaMFn9obGfuDJweK64 qyIbBI43XYpO0jqBipGt9yqoYgqMCmFmiUiHGScc1Ik0mEQgAfxHuavVEaMZLModSfTbwKcsYYkA gHr6VLciO5VYzEVT1TrUccce5SquwHAz1NNAKSVYKuB6laYHEf3eCByOtTyRbWDKo8w9QTUcqrnJ wWY87aBDYSzS7gFAxk4qwJQzB3G4561CymJgEYNRs3EYIAbtRYL6CSstzecghD1K1FcWDW85KTAq emKXYtqzFWMgPNKxYopKspP94U9gFDjG0Eg92x0p8t0oXYQoHd8cikKrgMZMZPIApbkqJQihduOc UmC0IsJv/dnnswqWDdDxGRycknvTfLIA2KRuHB7CnOREoHLsTnI7UxdRFjBmaZQhTkEd80k2zaAU DD171GI0bdw6Y+bK9DSwyxRTYlBdepBNGo7DHnVZkRJFII+cEdKCzuCqgeW3Vu9FwILqQeXF5fmN gDualaCaC4AUrtUYKdaQDCojhBG/CnkDnNGftEqKikk85bsKmV1NwC0nlBuD6VWlj8mRpAWIFMCU boCTGdqtwabJGjrjzBwegpuVAMm5sYwF7VK1vEsRkC5eloCuMMkWQE6jrnrmpgdjBhGmw9cnmq5E TxHJxKTnAqaKMPCd7c+1MOolzvkUsFCluhqiowAjnefpxV3zWiaEEAxjghj2pHuYhOyrH+5Y5yeo qRmVd2kjkkENk9D2qpLZhUO0bWHcda2zaETl0JMZ7EVBcWqPMMkgAfw96B3Nrwf8T73Q1jtr/N5a L8obPzoP616/o+uWWvWq3FlOs0Z64PI+or53kt41jcs+GB5GKNK1q98PTm60+Vkcfwg/K31FYyp3 1RaaPpeiuE8F/FKz8QlLS9UWOoYAwx+Rz7H+ld0DkVzNNOzKFooopAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFR3FxHawPNK4SNAWZj0AoAyfFniSHwvo 8t3J80uNsUeeWavC2kudaupLuYlp3bec1o+MvEsvirWDKpzaodsMfoPX6mm6VYyo4k5VT2rphGyJ bsLBbyCMPIp5OD7VYhKopKL8/Q84q1dLDECFyWbr6VVaAiSMMAgI4x3rdXM2OZAT8igeo3VFC2+Q qqEY5pSjR3O3aNrfxZpL0SWWWG4gjoPSmD0HrPIko25Bx90U53YKr7sc9KSJfMVOQCRwD1qu0cwl wz4Qt0NAhYwWklk3Nnvu6VKoV5BgYf36VM0clqrGRQYn6e9R/KQDgHPQUbgRXUggDrIVLnvHTEQx yJJscfLkA1LawZDtIVyDnpTI5/PmaUlgsRwFJ6inbQN2Txp5S5baxPOMYpTNPNEFkw3PG0dKSYxX UqzRx7UU4akaNipKEhSemaPMT7CNZeR87EiNuevehZYgC0kZk4+6pxmkLu8m1jnI4GKIdrnLjLKe BQMWMfa4dzK0aD+AnkCooi8Q2pGTCP4u9WkjWZDPCwLKcMg61HiVYmVOpOSM0vICKNlJKvv3H7vY UOiRTfvUDluFJFR+dHwskmJAehFTy8hHB29qYCsiFjjjptI6ikhUq7huX/vE8UyFvMdolPzetSgl dxJVgOxpWFcEnWSPy+MZ/hAz+dV5RIuUxtU8kHkmhYWaYPFtQDtUxUzLkfM4PJHahpWH1IQgKiNd 24epqSOF9mx2BB6bqeqRqGYPhl6561Ck0kl7H8u9QeRjJoGEe2CXmEcDBNCQ5LyK3Xkg84qaeQ7n TzMoTn5hjHtUcSv5bkgLGOhHej1D0GqmFYSyhs8gEU2FDIu2RcDt2Ip6bHRZSNx7ZpzOFdt43Dtj tTYtyNy0YEYY+WOh602GCGWYBiyzKcq5PymplYYG9/3R7DqKhCKhOMnJ6mp1GVZ90s0sZCYXuBya jazzGThRjngVpMiQx52Yc/xmq+JWDFD8p9utOwJ2Ma5s0kbJJDEYBTjFdb4R+KF74f8ALtL/AH31 kuFDMf3iD696wZITgZJyO9V7rTx5G6QEZ6Faz5U9GaXPofSdas9btVuLOdZoz6HkexFXq+ZdG1TU PDdz9psZ3iweRnII9xXsPg74o2PiBktLvFnfY/i+4/0Nc86fLsNanc0UnWlrIYUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXlHxW8YfaZf7Es5Dgc3DL69lrrfiD4v TwvpDCM7ryYbY1B5H+1XienxSTzSO0shaQlndjkk/WtYRvqJl/R7VGkD4UMo+8a3vMWF8j5lI5Ha s2ykFnD90Mf7/XNacLedD5kgUxjkljiupKyMnqyJFMjZ+6p7GmXCncCSWIPGKdPdA7uRtI4A5pEE kkQRGAJ5x0OKqwiIRFZcyccZyaMfaBkyAn6UYBXDZJU/WnEN8ogUDuWxQAy5V2mBYgKBgEDHNSId yrG2Dn2yaEEbzqs6liwx1xTZI3jb9yFOODnNDBa6iPCZIzGHMm04HPSmJAyZYA7fenoyPC+SRKOw 6ZqItKkIAkL5ODuoXmDBZGSXcTlT2IoeYyTE7AN+OB0xUxnhmkCG3EcZHO0859RTZlUWxi2MN/3Z B94fjT9QRGJDFM0ZVlTGQccGm+UZskSHapzgUsMTPabTMzyDs1DuLcHYQSRg8UvQF5k0FxE6vvyT 0BA71XfbbyKd2/PUUwMJJfLU84yR7VJKjQTAoSeOp5our6D1sLuNxEwA8k552VJahosyD52XjcaE cvGT5YC9yetEN2YsoEBDDqe1BNiMFZJy7IpJz2olkUHbgnj8qPvktk8fhTN4kTysjeTww6insG5P arEgLx8E/wAR9KSYRKGeFjKR/APWmxo5ygUgp94k9fpSKNjEIAjHr60hi+YSAAmJWHAPammRYSxy dw+8F7VbkSPejZLEDnaarzypMhEcYiA7j7x+tDAbHEtxGzM/BHHGKS1/0bayb8KcDaM496Hl+zwg MGO7oaUKXxguB3VTTGRuqyyuzjIB/OpxGZI2QA+WegFQuu6UbHbcvJFSFo0j372D+i0MSQ5YgqKN 2CvQYqGRwrGR2CknvUqqrITKx3nhaSCeEYWRQ2TjPWgCjJK7yFQFxU73EmI2aLzcEDCdxRdRhbng jZ78VKzyeRmIhT0BHekMe9snzAO7eZyM/wANV5JHgHlFXfBwGH9aSISOV8ybbJGOlSLcJFKm5/MT +ICjcRTl8xmAIZj6U1iskREe4leufWrd2RnfCoJ7EjimwIIySR8zDp2FAzPMEnlAFVB/iHrVB7cG TcvBHTbxW20UgOCRnruPSoUttzSKBvc88dqktbG34T+J2o+HpEttR3XtjnAYn50H9a9h0XXbLxBZ rc2M6zxH0PIPoRXzxc2u6M+YqlOmVJ3UzR9SvvDt4LjTbmSEqclDyGHuO9ZOmmvMdz6aoriPB3xP sfEAS3uytnfYxhj8jn2P9K7brXM01oyhaKKKQBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFVNV1ODR9PmvLhtsUS7j7+1WicCvFvid4ufXNROnWr4sID8zqf8AWP3/AAFVFXYHP6zq03in W5byfAV+EQnhV7VatIYoZVQHgjriq9lp0kaq2xSx/iJ6CtiDTjLGQrfMOflrrSsjNu4yzljWGSOT gFuGA7VOy28mUd9kIHBboTUflJ5G7cpbptPU1H9nR43ABYd8nvWnqQPa2WLCRFWUnqKAPs0LSMxw D0Heo42bbEinLKfvVYkgne42ZUKeWOaLgMaYTIGYkZHCr/WprVfNiWNZXkYZ6jtTZbTy8TrtXsTn +lJHI7FxCCJAOSOBT0F5FOUFOI0y5OMnnFWI4igQliMD5jnvU4j+zWg2jLMclz2qpK8jx+WZFLg9 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 qEjMqqxOX4zVl7ICFP3rNIp5GKPICOJkjZwTtOOGbqaetrvBcSeUcfxDioZCyhUdACTxmpboTopR +VI4+lAEREiI+drEcZxx9aW2LIVOTwOcDioFRnZcSbUHDA9xT7uSW3QhDvVxgEChsaQk8bQ3JYBQ G5JDZzSFFZA24q5bJ5qtHEzICJDvHUVNGSykP8yryMVPUfQlaSJZC5RsHuT1NKYDcyKAh3MOM0gw 7K+4FD/CafMQXRskhewqrC6kG542dZM7U4wxzUVzMHEZznPPHFWFaG4ZpeVHT5qiZQrl/LDDpmkB TulWXG0cewrNubNQy5ARuuRXRqeiFCAec4qnPEhbBTrS22GuxveE/ide+H2jttQ3Xlj0Dk5dB9e/ 417BpGt2Wu2i3FlOs0Z646j2I7V86m3j2sVYsM8hjnH0o0vV77w/qC3NjcNCw5ZR91h6EVlKnctM +mKK4fwh8ULHXVjt7xls708YY/K/0NduCCMg5B7iuZprcoWiiikAUUUUAFFFFABRRRQAUUUUAFFF FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUANkk WGNndgqKCST0ArwXx54rPivVmWJj9hgO2Mdj711/xX8aCFf7Cs5MzyDM7IeVHZfxrznS7WITYLCV hwQOxreEerEzQ0eyFuCVADHuBWusT+SG8sBjkAluan062t4l3MoXnqGyc1NJbLNcJIjRyArk4PIr cgpWIkW4TbGJDnDFj0qS/u5LK4xFEr7jzkYApmZC8iovlqOhzQJpUjHmkO45UYqiCGQST3DuY8qv OM1SvFS6ViJ3tHH90Zq7OjqpaRz83O1TVeGIPltoPPftVAT2Zt5rVCJS0nQ7hhj70ux3bcVwg4Ga i3KrOWXkDAYDrU8UwMCptww5FLVBvuOs9OO8s+FB6881O5iTcsTKSeN0nAFVDIruVYtH34PWm3Fo t5L++ckKMqu7ANIFYvQQCK5YhRIwXOD0quVcNkkI5PGDSxq0+EyFUcfWnCKMsSN+UPzcfyoGNiht 4Zg87GRsZwtOBdvmwFU9CtQ+VGtwHKs2/gZPQVclt2tZVRSXiYZ3FsY9qYvQbbAIrsIwW6ZFQ+Q8 c5kPytnKgHJqZZdh2OGIP900xxKZlTeiQ9gxO6kgATFZGLHaX4Jxmq7ovnmLmQ46ntV7METxopfz GPYcH60kpnWRxsVoe7Z5WlexRWSNrQbQpYP2FF6qSEBZMNjAyORTpBJ8qg/uupZu1V4hG7EscAHg 4601rqJ6EbrPHIqOwdSPvjkU+MCKJiI0k77u4NPSdLfcSCFHY85oikWIuzRs+4fLtHQ0xbBcA+XF 5exs/eGOlRy2cix71deeoHNSMGGAThSM7u+ary3MluMIzHPfuaWo9yN7iSJl8naQB8wzzVrbJLCG eIkYz06VDuQqzkFmJ79afFeKsjRBmddvQkimLzIvKLYUgkN0FWIWNuojVFBP8ZNV4UjmJAY4HGCe R+NPVA7MqjOzrg8U2IiulZLjCqN/UhT1p6RryeQxHC0M0klwpK546gdaejSBsLGQvpjmi4DY0CZM jMrdfwqFywudiMxEgyGq4YmXDZBJ4x1qBIt0jYZjtP5UvUZJEZrMHKBn7ClD70TOQ/0pHkA+aVyo XptGTTY7+VJn3IvTCluaAEdV3YLbipznoakaViSVwpI7mogxI3sQWzgkDqaesZG5jt59RTEV5gJp V81iCpzhT1pbyVmUMzs2BhQKWe0dn8zIQY5CikWXyUwCWXGCcUtGPUZG/lKodQS/QnrUgBYZcn5f 4cUrooIeRzlRwpPSnB/tLpyWbHOOKAKwjbzTyoB7d6kXZFlS+Dnn0FOkdQ2JVKY/iXrRZG2JlacS eTtyuF6n3pWHcaVERB5IB700OpkYDk+maaZZLqQlWxH6AdRSeX+98xUUsOhFMCSKJQrhssD0XHSl Me9FXdnaP4aYuZH3NN5YYFcZ4qaFHjYKoGwd6QeYyOVUdkf5lA78ZNIfKmjaPBSQ9MmppkimLbif M/uf1qF0MeAGVmzkgjmmIqSWeVO35QOw5JqpLCCCGXB9CK0oml855FO1egwOlE9uJPnkcyZ6E9c0 m9bFIwpLKPYwVAGH8We9dd4L+Jl94cCWmoM17ZDoxOXQfXuKwfI3Fo9vPb3qrcWz7gHRTx0x0pOK asO59GaPrdlr1mtzZTrPEf7p5HsR2q/XzNpOsX3hq7N3YSmJhwVXow9CO9eweDvijY+IFS3vdtjf dNrH5HPse30NcsqbWxdzuaKQHNLWQwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACsbxVro0HSpZl2tOQfLVjjn1rUurmOzt5JpW 2xoNxNeIeNfFEviPUPKhBKZ4OCNo9KpK7EYVw8uqak10yhZZW3H/ABrY06HyyQsAjJPLY5Y0y3sP KhCyAFgf9YvQVr2vljkEkDuema60rIzbuNE0UhMUaMs55JxRNCloomwGlK4HNXLvUGjIf92xxjaK xxPDNJISSsn8We1WkK5aF0JIgnCyEck9KilZ2VFXD7T94daZ5GUXa5m5+8RUiyLEmxQHUn585BFP 0F6jSyrExkUZHfvSxxxiMvGMlhyDUVxbNJbMN+wFhtCdRUwkVLcq7BWHGDQBB5qQhlxlvenAoibs 7cjoDUTvGqt5j4wMhqxrrWU3GOPJI7npQ7dQSfQ2Zb3zZMAK2Bzmo0vowcuM44BrmxqW05Qqp7im SamwKrvwTzg96i6ZfKdSl4rtlcAg8t6VOlxJNJkMNvvXKwXw8vLchuwPWtG2udsXyOOPfOKrmWxL TN6RgAXc4BwAopUk8/BKMUXsTzVC01X1j81jxg9q0nmiW3CxsQx5Jp7CRDuFzNgnygo5qdLhGgIy MdN/eoEmEcgz84PtipU8mVQHi8p0OVGc5pMZIt3OY/3aLGpOCz9SKmaaSPe5AAIGT61BK/mqm7bG ijkA5JpzTSPEWHMajj1pWAkeKN03OW3N91ao/Z2RgSMKD0xThK0jK7Fk2kbc96vRf6QwLEpt6gel GqC1zPu2CSKoxnt7015DHA2TyetTyxq07y7RtXgMRiorpHcI5wV4GKpdhehBFN/ox/eq5B+UdDUk sjRQea4Xjn6VGuwbiUG4deKLpCUAd9yMM4A4pNah00EEf2iPz4zkk9DxUF7FLIuy3kEUxYYY9KtB XiiTaCFPY1Cq7Zuu4HoBTvoBIbNoXKlg8mBkjpmhp2iUphc9SPakyUbIyzNximbXiVt8ZLE4ViOR R6gTNcZiV0OM+nao1J8/d5jDIxnNEcMskW8RMqjqcVXk84sNqjBbHJxxRdCLMyFdwX51HWT3pLFV RHbeRITwuKnfZHAQM5Bz61B9qyCxHIHUCluVsLG6JKyOwL9wfWmyzK8oRiAw4BpY7dVIlcgk8nFO EUVyrcKrdQ1FwRFgxAFh8mf1pjSecwBJTA4x3qwUWSEqJOV6g1EFEqAqM44p9QJJQAqqm48Ddmlj ijEbLHlW7kmoHcMUO8qo/hI61KQSQI05PfNG4tiNVEjOJMBl5U9c0sYIXcxXzFPUVIu2KR45Nu7H Reaqh4y5YMyYODuHWhgtCSVVuHXbkk9accsWhbgAd+hpuUFyhywwO/Q0ssxjlZ/LLKRjI9aAHW4e 3ZQVDE1LfwtCgMYB71FDasHdyckDOc9PwqKW7ZkdQu4g96Ldg8hkBQTM7qBkYx6VYcbZCjNgEfhU FvGsqea4I56GnTTpcyRp5bcHAfHApDBY/KGd+1ugzThbwiMln3TN1xTrgOJIwyqcDovWluVRWTy+ rDrik2CHWPk4KyZVcdT61FJb5DMvKj0qOXJIXBB9uhpkWYW2xAnPUc4FFhqxDFaSsS8jkYJIz3od WdSzbgDxzU1xbvJBsaYgnuP5UGH90iIxBUc5Ocmh6gtDOMAmygJyOTWfdWITaTwxOR61uRWhLuBk H1qKaCPeuFMjdM5p3GtTe8G/FG70Qra35a6tF4BP3kFew6Prllr1qtxZTrMhHY8j6ivna6hYux8t QPao9L1u98PXqXFhcvbtn5lI+V/Y1hKF9UXc+nKK4Xwd8VLDX2W0vStjf52gO3ySn/ZP9K7qudpr cYUUUUgCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKxPFevw6FpkkjybHYYGOo96AON+J3ixkf+zrWTBH39v8R/8ArVwenxyKxOwtJ1wOSaZPbyar dy3KFtzNkFutbGniW2UMBukA5PpXVGKSujNsux2Mk6RvKnlp1KNxmnwxJNdlduIxywXpTYppLqKQ yS7AT0PWiHdLZSCNzCE6lhy30rUXoR3X2OKcpHGVXqxpXmgjteIwq9yRk4qBpFWMBgSX6Z60xrhV XaDl9vSqsTcexLIJYy/lnpgUKS8ZaQjr36mmhfNhX/SXHqg6CntJCq7Tl/Q0MBFEbZjZtijkFTUM 0y2wyWMiEc5FOZdsZJKj3Nc5reqC1DIzhUx1ovZXYb7EOqam0krqg+UDPHTFZVtHLqZViWSM87uh NP0WaS9aTaCI+gZh96uysNAEdukko/DuK59ZvRm2kEc7J4djuI1XymkxzTv+EfEeQ0RRscMeuK7L ylUKqrgY6jrUjqrEFowwAxgGq5F1J52cA9k9omEZmVaSzukb51ZwxOCrHp+Fdle6LG9uZI9w5yRi uW1HSC7EgGN16MKlprYpS5tyZbl4y2HCkjqKtQMJ5kaRj8vQ5xXPvePYSpDPkh8fMB1NaUVyD8yO HHcDtTjPQHG51UU8bRDA3Ec5Jp+4y7ZFUIQcYJzXP2+oeY6r0A7etbUc0LqFJz7CtkZbaFppPKh3 M24twMdqT7QoXAJJPTPakE0U8aoy7W9c0CBl+aIjA5y3WgCQSgN88bSMMbcVNcERRbsZkP8AyzVu azWmlaTOcP8AzqwIv3gmYjJ4yaGhE6FZAOSB/d7Co2mZSYECyJn5nx/KnYAkUb1G7sKkUQM/lLIx bOTj+VSMqCOOFDJubr90mml4i26Qbi3TnOK0Z7BdymNgMdVNZ5hEpk2AAr95j2qr3AejvJCVLBmB wAewqCRQkqjK7sc1LEVtwWlO9fUd6jmUSOpC89hQBaeQ20ayIEwRwWxzVGQyyPhsEgfeU5BpZ5GY ktHkLxg0gjLBAxwo5wtAXHpdvPA1uZWXHBxxTDEWh253beMseTTZY1aTEY69TS3CKZEAIbj+H1p6 IQGNmhCw8nvUMzPsGV24q1nMG3n1yvWocl1G/Hsc0ah6jrcLIpPIboOKHKW94oDZ2jkgcU9JFiyi qeR8zVXR45JQFBOOCx9aQEhkEUzu4+U+gpgZUjZidqnmldiC2MnHHNPtXzHJvwcnABHSi4Iijjjj JlzuQ8/PUjAMjPGSo9ccCi4VjGqyldjfdxTN4aHykRgB1OetMBEd3hXIVj3ZRyakABj+VCcd+tS2 6hINrqFzUS3BtgYyQVPO0daW47CoElkAkOeO3aj7MGZirYCjINQJIkTeZ5bLu4+anQyvh+itg8jn HvR5iH2l2TC6ORhuRngimq2QQ8She2O9Pij81N1xMrEDA2Lgmm7d8TBVdivTmi4MlDwLbbWjYSE8 DPFVJJXBGV+UdPapIZZZF2yLgjtT1ZcEHlvSj0DTqOeQGNWwVb2qqAXk3OxCJ1LVNGf3r78qnv0z UvkusnlyEJGwzuo2AY8xMJAHzdqqiYA+TIdsj9MDipMurbmPmAHp0yKccOodW2Y6jGaLDRCyvG4J OQOAP604OD8xY7val8szo0qk4Xg5qOE+WN74Yf3qN2MnjeLY7uzA44WqzgXMJBj2rnp3NTBoZX+W TeTyQB0ps6Tsp8nYeepOKLC8inJtcqGwgPc9KSeEGIGKMSHp81WEiMmVkC4796GXH7vB2jnNJlaG FdWYlKKpV9pyeOhrtvB3xQvdCAttS33VmvAZuWUex71gSwGXJbAUfdIqpPEGVQyFWPfsalq6sNM+ itH1yy121FxZTrMh64PI+oq/XzLpmrah4buxPZSSW7A846MPcV7B4N+KNl4h2215izvemGOFf6Vz yptbFXO6opAcjI5FLWQwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAoopCcDJ4FAFbU9Sg0mxlurhxHFGMkk/pXhPibxBJ4m1Qsyfxf89MgDsPStf4n+LzrV8NPtJA bOBvnI6O3/1q57S9P88oEKIM/NnvW8I9xM0dLtfIiIDjf7nNaAjIVfMwV7FTio40jClchGXgHvSS tJEEKngdN/PNdKRjdsnmgaCTl1ZAPlAGTmlWSaVFRcArVVrkzuWlYxk45A4qTekKgQ3B25+Ykcmi wXIgvlXHzsXA9TTZFWWQGPAwT8xHWmzoJpPlBEY/iqErhgFJK54A71XoBcjgyvBC+ozUMmIWwFDD 2NTwRZYl2VAOcE1RuruK1ZmVwSPU0g9CrqeoxRZBbORj2rjb6J9SlSGNlUMcsTzxV/Wb8POzYLMf 7vernhyxczKHiYnruPauebcnyo3iuXVmpouni0kjcJ8ieg4NdL9qWeUBgsYcYCg1ViWQZjSP5ieB VkNJErRPAFxyD61qlyqxk3d3H3U3lRiONljb1YZqvbz5ikVTvlJwxAx+VRsjzS/vOPQHmnxKbfKO MZPG007CJ2uwqmIy5I5wByKp3EKThRy+erYo4MhI2kZwQ1T27xhSGwkmeB607AYF3pAkRgI96jue 1c/LYSWZzA+I+SVxzXockYd0BDAPwQvSs3U9C8iPdDgnsPSspRTehUZNLU4+CYzsu0+W/Q7utaMV 3JEmHcNt5wo5qDUNGywkIaKbHDKcVmxyS6chjnZmyc+Y3WoUnHRmtlLVHWW925RW27yed2elaTSG VFc9McKK5SC6RtroxPHY8VoQX8v3g4AHABFaqV9zJxsbyyKyt8gUj+Ko4FAXBJK9RuOahhudybiV LHqRUyTIoILAk8DI6VZCfQfJbqNskKoD6s1N3i1kUucHOcjvSQwx2/csOpzzUslvDcxh3kACchWp eoy4hN8oZpBGpPBFNgsh++BdpB/eIxVd5NiqYxs4zjNFveShmRclH4POKQA048hkEHmEdAtNVJEY bgAcfdxyKJZWgCxxIpKnJNMmMkh8wsAfeqsK45zmQrLhQeQR1pGuFaPCIDIOp9RUu+PaAxIbHLY6 0x43Xi2AGfvM9JjKbYL7xgA9AKltmSJyXXcT6VNJb7QgcBmBzxVdv3jOzAjngDvVC1EmmaJtzkRx k9etE8RGHTDq3OAKfaQkyfKm5OpB5xUco8u6MsTsFxgrR6AOZm8kFVG/uDUTCXa6RkqOu6p/OWSJ Qcg98nrTN8aNwd+OvtSAiRo3PUmQcsD0pzTSIrZjyKm3wqkgKEs33WxVR1kR8I+Yu60wJJCbuAbl 2IOMgY/WprSMCJol5B7nrVcSOpEJJGeVAFIsanBctuXpmjQB0sEs6ggjCHnLVHsDSFgoLf3qmIj8 uObccklSuKb5qA7M4+lAthfLZcM3zH+6w6VPbW2ZsZ6jnntTXWRcEMGVuuaPLE0cnmsY2A+Ur1pO 5RDdBo1dEHfgils5FDISdxHVc0pZMKV3MFHOOhoUxBgUjG5uh9KLMLkTkiV2Ykc8BPSnRO5lYsuA OnHWgQyxXG2UDySe3Wg3EiM4UFlycCgRNNKskJV9oHtUDQyIUCfMCOATmpzbqbcbuGPJqOCVW8vK hgp+U0xkTICgLBgc4wBSRrglSCF6jFW94juGLoGQdm6VSur2NZE8zcnmNtVlXgUWFfsSQ3G2J4to BPQEdaCpjXawG388Ug3xy+Q7hmHJyO1S3LI8KoSqsfvDuaWwxm8DhApyOccVHKzJErbSVJwQBnFP hiRIyocK/bvilDeTCUDEgnJI709xbEUikMCqEAjqe9CbWwpOCTzmnlnZcqvy/rQCYiHKZHqaQxGj V9yA8AY3VT8qS3UqSZV9TzVuWWJmYKQC3VagPAAgIBJHc2/lxPgIeWXvQBTmUTMWaQjA6NVK4tti h1Uo5PB7itrYrjBjbj+I96qFR5hYn73TJ7UrFLQ6Pwj8VL3QmW1v0kvLJQP3nV0+h717HpGs2euW aXNlOs0TDt1HsR2r5tvbMjBHzZ6kdqm0TWNR8O3Uc9lMysp5GeGHoR3rKVO+qKTufTNFcP4O+KNj 4gVLe8K2d/0Kk/Kx9jXbg5GRyK5mmtyhaKKKQBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA FFFFABRRRQAVxXxN8VPomkta2xxdzjG4fwL6102t6xBoWmzXlwcJGOFzgsewH1rwTWddufEWozXE riMSHIjfoPYVcVcCrplm0x3ZAAOWzzmtyCEZHl4D9qi03Tf3Bl+6qnkngVrr9mgwS2XIycDpXXFW MpO5TCTKu7aFcDPqDVhIPNtw7ndJ2Wo5JHKFF3HnggcU4TSNGFcbCvcHqKtkpFcQqqkYxLnPNTKI mj4z5i8MO1OkmVYkIVeOC7Hk083vmw+UtsEUDmTPJoAhKRLbs7MSeoUUkaBYmY4J7CpW8lYlYZVi OTUBjOwgFgAM5A4oAik4JJ+X8a5nW7oucKFGD/FV7WNW+zjYpDHpkVzYZ9UmMe/Ck8lT0rOpLlVk aU49WOsdPfUL1JyflU4VR616LomniCBxJIGYjsOlZmgaKiKCzBFA49TWqpuEViyKgDYU55IqYQ6s c5X0CQTQMshbKZ445p8u+VkkkIVQcncaZM7xAZ+fdwO+2pYomiYb9ky9Tz1rV+ZktyC6k+0SBUYS L2welSrFLDh227F6jrmmXcEbY8sMC3YDGKSG1kTZGXAQ9S/egdrkJCSEbSCcklRVu3tRJH5spA54 Qcmm+bbW07WquDNjJAHapIbOVoyyttT64JoYCXErK0YT5OwJpkEiyRNuLNKp6sKnddqAOv3TjdUE kpdCgGD2xy1JAVdQktbmNVc4mzwcVj6lpfnAARqR3z6VvpGW4Cex4qYvBDbyKCAcZ+br9KTV9Bp2 PPbq0eyP+irtUdV68UywvlnV9xKNnAD8V1d5BDMRsG1u5FYWq6Ksqh8HzF5U5xWLi47GykpE1vey oACo2Cti3mSVOSMiuRW5ltG2zjEZHUdM1cglYKjCQhB6d6qMnYlx1Ort22oACWB5JPpUigS54HlH rkVi2epcqMjBrVs5uDhuDnitrpq5k9GStIR9zEijjmpo5wVKsuAOhFVxIss2CVXJy2OMCh1SMhFf zMnkH0oaBFgRMzjecRg5ytE00W35kL46YqOM/vfKaQj0CninTQW9koRZcyN1JOaEJiKsZhMkhJDc BTRKkoTdGcIR0NSDypFQZwRyAfWppGWUKvmBWjPQd/rR5j8ivBuaE7mAqvsPmg8hKdIWEnylfVv/ AK1StGXAeQ/KOgxT2EQvE8ckgiO0t6UhL7Qqjex7CpS0iybVO5R3xTomCSMQCmQRkjpQMplpGHzo Fx69Kc0UQi3ZAbP8NIUDrt8xpOepHWgxnzAsjBVxnaB1o6i6ERjdiWySAOQOadF+5O7B2MOR3pUZ oC21Ww34VJEVeDI4Yn7p609w1H2e2SN3JPynAyOlR3aeU4k3AA/w9abDceWrqGBHTBHWlWRQu8rk Y6HmkAwT/uiu3PoaZBE4dnOOR3qR4ZY+XRVixkMW/pSv90nejbhwEPIphqMztny3C9hUpdp2+RQU qLy5IlPmHcT0U9TTs/Z0XGUOeVBpegDZG8khYkJBOGAFIZPK4J2uelTTSuCNg5PIps77jtRQX/iG OR9KAGb/ALSpAYqSPvdxSb/KXaBkgctjrT4oUicjBy3OD1plxOZCQy8dsdBRvqHUehSSMKzFT6Gh jm4VUUMqelV2ify8/f70+2eVHzFhZOjMw7UWBMV3MqsAV5bkUkV2ry+Q0eFUZ3ds0yFAk778uQc7 jwKkDoULBPmDelA7dhEbzJnfO7A6mol8yTc7FWA7CrIgACyZAB4IzVZYmDkbsL7UeYW1HRxEuZOO RjmnmRIkYEbh6imSZijZdu5T1FSZRYwOnGAMUCInnMsaGOMkCjzkaLEobe3QnoKcCyll27d3Q1GN oZuWc9lPrTDQZJEkF4q+bnauTxwaDKB8qRcN/GvSpVg82TMillYZ24p4mWPcvl4I6egpbj23EiYO ioeCO5qsY1kn2nhR2p5DvMEkB2dcrU/lIsbuh37OmeCaLWHuVDGpiK8gk8cVVni42ryB1PStBZo5 k/eDy27Ac1V2zDI2h1U5570W7hcyjb7mZ1bC9QR612HhH4q3fh0Ja6gJL2yHHmdXQf1rCuRHKuYz t9Rjiq8lluDcj/dI5NQ0nuik2fRWja5Za/ZJdWU6zRMM8HkfUdqv18x6ZrWqeH7rztPn+zODyDyr exFexeD/AIpWOvMlpfYsdQPG1j8jn/ZP9K5pQa1RZ3VFIDkZFLWQBRRRQAUUUUAFFFFABRRRQAUU UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF FFFABRRRQAUUUUAFIzBFLE4A5JNLXAfFLxgNKsjpts/+kzj5yv8AAtNK7sBxnxJ8Wf8ACR6qLSBs 2NsxAx0Zu5/pWZYaSZIlkCgt2LVQ0axaSUhSCvXdXSJI4RPkLBeCBXVGNmTKWlgMLyYgZ13HGUB6 e5qSS0ltHaB5RKrDJKnNMLRW7MUPzt1OOfpTEaRZfPGRj+E81sZEspZyEfhFHGOKZsKOFIYxsMim yytKRI2Ae1Dzs6qoYEHqaAHSW7Iuz5SzH5VPQUSFUIVnLSDrsPFIJFUhBlgOASeRREsQONqovcii waEbSA/KGdnI4Haq8961vA2CScYxU0k4R8gYA4BNcprV+zGTkqB6HrSk+VajirszNVvpJJduze+e AD1rd8LaQqENIgLH5mxxWPoVmb2fz3Gc8Diu90iyFpFn+I9d1c0VzSuzeTtGyJQ8Cj5AUYDhQTwa meUzsrE5OOlOZxuIVEZe56GmtOqSfuVAYjv0FdOxzim7jEbI2Q/rjmrCNaSxIY2Zjj5ifWqRSe4c tPgnbwFqbbFJCoUtC6jj0P1paD1J12RkjbvX13VD56zuUCbwOvPSpYIcAN145BpEiWAs0QBc/eU+ ntSQ2K6KclCOP71SW3zxb32AoeB3NU3vo435BUZydw4xWFq3ie3t7kqj7j+QqrWJ32Ollui8T8jr wBVa3miQkMwV2H61wd74nnmDLCRHkcHP61my6ve5Ll94A4Oe9S5RRag2eow30VuGLZZs4yCKrKVk n6KqtyT615eNUukdmEhYkfdz0qS18a3FlcxCa2cjPJByBSU4j5JHpLCJH54Pbim3AheLYCMn25rA 0fxrp+qbwsxW4zjY4xit61u08xJAobHXitE76oza5dGZV1pzvHghTHzkYrnp7ObT528ti8Z/5Zk9 K7dALiZhkhT822qNzaIzs4QOR0NZSp32NIztucza3avMoQhCOxGMGtK3nZJQob3OahvdMRiG24YH ORVFrh7UssmdpPBPes7tPU0snsdOt0jvjgNjrV3y9oXODxkle1cvbz7YhJuDHuvetC21QsijDAnr kVtGVzJxtsbPlKrbYSGXqzE/NUjpu2lYzgfxsOarQyRTx/6zGR95auhthTndgdWNUQRzOka8gsfU cGnwSKsJAQAnksRy1JIBKm5gokHQHoaRJUCAscMTxRe47WHqYTHtRNrdz3pkmYogzuSc4CYpY5Fj IVf3knU+gpxuUWchEEk3UhjxT2FuNhcvG3RAO+OaYYXI+f7p5zmppUCyeazAAn7o6VFdW08iZZiq g5UL3FK6YyFkLYAYbO3rULOZG2kln7ZHarjMAioYh5h4DVFFE27OzLjggVQtx8sH7tBLIQwHAFN8 kLsYfNzj6VAkckcjs+WXtu7U/aqtja0YPO4nrSAW7tpIwTCMmondQgwhDDgjtVxBtiGwllPUmoJF BttrElg2eO9CYWGDNw6hsuOmPQU+fT5beTaskaKBkD0FNjtmS33BCueRz1qScPcKCvyMvJzzmi4E bsrI6lWMh6NUKsFjCSKVb1qxEftJ/eYDH0qGVPnYdTn60wHKjBXYjBJwopwMUYBZSX96hhkd7th1 AqSd13kpkHoVbrU2AZIsWfPbIkxtFSW1unkZbJB6FjRiKQoJvlJ6DrihkAchX+XtmhjuQu8gZtgO AMAA0QxSrE0h3KCOc0qKYHH8Tk9/SpC+Y3iDnk9DVXdieowtIxUIAfQEVMYioJLgHHK4qF08r5d2 c8ZFMZ1jZEw7nHWgY7zEPyo2W64NJIzNCSGXeD94CnqE3KDFhjyTTBEiFnxhR29aT0BAkhyMsqEj k+tOFkSzySjeF6fNRHArqXAAHXmpUWZoS235QeD2NL1KfkURLmTDkqP4RUqjynUtls9M9KbiOdWJ 4PTkcipGtW+yqBMSBySeopvURLMhgALKSG6c4xUenwfbdw2bGJ5UmmSTvcRpvYuF4Bpxd4CRHwSO c0thoLt/sz7FbbMp4xyDSxu2wbmUMR3qK4VY0Rx8z55zzVu6kV1TCgnAJ4p+gELwCWTBAAA4+tV4 hvlCvlOcfWpZ7h0dGKhR0zimvNhCduT696V9AYzayyMTwvYYxTGXzmYyMc9gDUpLuylhx3yaWQKz lVAND3C+hQntQzFy5Axis2ZW37twU5wCK31tPMVmcptPAQHmqs0OI8IoKjnmpKTN7wj8Urvw0Ftt SZ7yxXgOeXQf1Fex6Jr1j4hsUu7C4WeJh26j2I7V853FmWiMpQnsKNE1jUPDV99ospWibuvVWHuK ylBPUpO59OUVw/g34o2XiIra3a/Yr4cYfhX+hrtwcjIrnaa3GLRRRSAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooprusaMzEKqjJJ7CgDM8S6/B4b0ma8mIyowi92bsK8BkuJ/EGoy3NySZpXJPP6VtePfFD+LNb 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 8R/unkH0I7Gr1fMmkapqfh65+16fM9vMp+ZDyrj0I717F4L+KNl4kRLe8Asr/GCpPyOfY1zShbVF Hc0UgORS1mAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFea/FfxmLK3OkWkmLiQZmZf4V9PxrrfGPieHwto8ly5BnYbY Y88s1eCqkmsX8t3NKZZ5G3P7VrCN9RXJtKgLEZGB3966q1tykLBgVXqQe9Z9siWkayFuemCua0Re SGMI3zIeQdvNdKVkQ3dlVZooRGfLaYFs7c4xUtxcnap8sqGPCntUFy5EpCIJGHTB6fhUqzyrFjYJ mbr/ALNWySGWRyVRY92epHao5LdlgEhjClT1zUrwNaPuZJXL8gDBAp/2tLiEh0mjwcbSvWi4WKyz sz5cA54BNOAZmbkZH3QKjnuIY4znzUjHBbyyTTy0IiUxymUHnoQfxzT3E9COV2Vsuy5A5ArktZ1D zFcYLegNaOuaxGkhjRghUdO+K522R9QvVcSAwocDHOTWNSdlZGsI9WWPDWnXUrGSdAXY4VR0Ar0T TovIhMaspKHgH1rJ0+0NoVZ2xngA9K1XhKTiOIAkrnI6VMIJIUm2yzGskqyb8DHpVZoIxyFZiO46 mpLf9zl7mIhug5wDSsQ82B1J4APStiBZIms4Q20DPPPUVA0YMLSSrgnkYPWnSW0Uj43ySY565p3m RxpsWQNjqrdqAQyJYw28u29hjYnSrT4iQsCWccncaq2w818kKm08MO1QXjPb7jlZBn72eDRYVzD8 V6yxzDg4Ydu1crYRiZlJbJzznqasa/eGbUFXezN2CdPxqzpsClFDKA3cisZyOmEbl+1thGPMKgxH oD3rkfH3xNt/BNnO7Jvl2kKhPSun8Rar/wAI/oj3QCssSkplsZP0r5C1rWZ/Hmu3Gpaju+zxyEJE DwfevFxNf2aPssrwH1iWq0JNe8aeIvHYLy3r6dbE8LEeStYqx29gJFMrz7/vmQ5JpmpagEkdYSYo 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 YZ46j6irtfMula9qfhy586xnMWDyh+63sRXsXgz4n2XiFY7e7K2l/jlSflc+xrnlBrYZ3FFIDkZH SlrMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiioL 28i0+1luJmCRRqWYmgDD8ceK4vC2kNJuH2uXKQofX1/CvDoQ93cmW4PmSSNvZm7mtHxRr0vi3Vmu TkwqSsaf3Vp1nabowsZ8tl6Fq6IRE3YuxQiMDaShI5PappNs7IixrlcHJYg59abMqi3Ebgzz54Yd qBMttbgyLhs4OK3S6mZZQpC4d5C9wOAoGQKhlRbdmYtmZupxjNOkniCNMu5ZAMAEdTVJC8u52ZpG 9fSqt1J8jQa5Z4chht+7tHUVSl3BgqxmRT/E3GKkgYpH1IX3pHmeJlxJkP0NLYe5C0G772UzRKFi iJHPH3h3qR50LMGbzO3PSszVbsQRhcYJHG01V+pNuxQ1nUhsEeSuByVHNc/aQHU7vex2ojfKQc7v rTby6kvL1YIzudurHkAV1ehaQtuqKAuzvgdTXK37SVuh0pKCL9lZxwwxNtJJ7+prQkMVqCxjfze4 7VYgtgIwV+Xb69qiZYpdzu5J/nW6SSsYX6jJpFlRSilNvXNRtJDIsgERD8EMOlJFg3BAgPln3zmn vK4BjyEXOWwKewbiwSCCHcJMSsfu+lIJZQw3MrA915zT47aOVDl+SOM0wOlvIi+WzAcAj1p6Cuwk lMp3JMY8Aht4yPwp1pEkiiRyT7t/SiT5VHm/Kx7Z6UlwsE8aYZ1Zeqg8YpeQyeZnIURjKAdzisbU 4n8ln8sZPX5s1fMwC7QCytxmqbALA0QkYnvnvTQmeeatGkGoKxfIJzt6E1r2My7VAYgH0FReINLE iFgfnXkFRnFUtM1AMi7TgDg5HOa5Ki6I7KTtZnFftD+F/wC3vAF3NawvPeWx3jaATgd6+ftMn/tL Q7eQoRJs2sp6givs0iC4tnWdPMSRSrIB1Br5h8e/DnUfAviC5ubW0km0O6JdSvPln3r57GUedM/R MlxypySbPPrqxIPTJqk1uQ2CCPpXWNbLOFdTuDdDUI0t/mG35q+Or4eSZ+u4XHRlFaieE2t7eY/a QSqDKqwyM1ua/q/9tSRxx28Sxx4wIkC7azYdJG8KDk98VtWWmJC33cbuprKnCajydxVq1Lm9rfUh 0/T9vOevIyK9c+G3h4LYCR1ZWkOSF71ieEfCzajcRSTQsIF5U4617FZqun2hKKsRA4wOlfT4DDtW bPzfPMwUk4LcxL5Ft3FuSrhhxx0rqvDdn5NtHGfkGOSBya5/SrE6pdNNId0aNnOMCu70yFVYbmVY sdu1fV0Y21Py3Ezu7F2J4lYKhYE8AE9anSd7NTHJGqw5yGXrUE6xCfMXzhOhxUoma9I8xgsadRjr mu887YHeO5lUN8ikZLAZIpbKKQTttb9z/eIyTVpoIuWTCvjhRzUVtdXEUrKWRW7ADqKW+gCSRsGZ LaRo143MRxUk6Isa8qfVu9V7qadA5VkYMQuMVCEkU/u8Ang5p2uC02JoD5TszyCQf3QnP86mnkgu QBGSHxk8YqJ7c2e1DMcuPmbtSoVUGOD5sjJZhQ+4rlaPcxdfL25PUtmkkglgjEYZXLc5xUwby3UA b+eSDU89wJ3CJghBzihoDm9S0sxr83zseTtFYNxaS2jbgplXOSo6gV3LxmVWIIx3qnNpaupeIgvj vWcodjRTfU5s3S+XuViHH8O2tC11Hygq7gW7DFVb7SmGCAVlHOc8Gqv2gqqmfCFeM1ldrc0snsdJ DeGRgfmP0FXoiCQMhV7nFcxBdMmG3ZU9hWjHegvtDcEVrGVzJxs9DXldJHwr5df0ppV2Y7SHP93p VW1UK/mMwB7CrOC6FkOB0FX5IQqy+XlQFDEYJ9KagX54geT1Of5VEGYKV25OfvU+IKhzjdIxwKbE Pi2om1eAvGWOTSiSEKY5MM56YPWpGCBHU/Mx9O1VRJECYGwWI6Y5pdQZLPGEjjBYuc5wM8UrRvGM yEsp5zmnmQwwjbgIBjHpUFxKkqELlcj7xpgOcCPaVZcMOMUr7WUN5gUjsTVWBUSPDs0jDue5pZFD oCRuVeQCKS0Bk6RAkuCu48EU24JVlXG1vUdKjCmZVdG2le3rTj5z8EAE8g013Ajkn8vBK7vekknc SRsiblY4I749anWJU2qy5Y/xUyWNhJujO3HQ0hofIwjUrnJPoKZK7+RH5UMZBPzsW5qIRs0R+dgw OSO1PiQ7sZLLjtQIdNJ56oEcqg7Y6VHLIMgiQhlOPmHWpLd1lDMVYbeAp4zUclqrKpbPqQKoCTeG RfO+ZCecc1LFFAqs7SCNQOOMZFQK/wA2z7qKOpFKZRGpO3zF96VhiLIYYHZAWVvWi0jM7EMdmeTn gU3zJHQkJwOgNBdxIF2hVYcgHNICxC5RJPl8znAGePrVTmWTYMswPPFTMkiSoEwQRnbmhC5csOMc cU0A9BCgIBI4+bNRShcAhtinoAOTTptrZUYJPP1ogaNtxJOAOAR0NCYnqR71ZQCnIORmnq3nur7l JXgKelI6GQhmADdBjvS5EKEKoJPela4+hA7eWx+XBB/gqzNJJFEMIQrDOTUUjhGDZKvnilkiMjby S5IyRngUr2C1xJW3KACAe3GTSRF4onV2JQ8kinrIjAszDjgCo334BGdg5Kkdapag9NBsbmPcQ3Xv 61LPBkIVw3GeR0/GmTOhuIhs5Pp0qUq7ocIx9xUgQRPIshxGPffyKkMaSpnCoc4AA6U+1fEbxyL3 +8eppYEJmYcBMdDT3GVWiaIFW3SIRkPTQeRlscYAAq4qlQxZ8xqMgZ6VT81riYsFXavUCjoJasCr NtQZCZ+ZlHNQzwqXIiYhuxb0+lWpiQhZDtQ9VpkYRVHAJI/KlsPcpLaYzuYMc+lUZ7YzTAJlWQ5G 2tiWMhtynGOoqCSPGSAAxFTuVsdB4P8AizeaDKtnqiyXliOPNP34/wDGvZtI1qy12zS6sbhLiFh1 U8j2I7V82PbCRdshzu6jFP0jV9Q8K3v2nTZ2jAHzRdVYehFRKFxn07RXEeDPihY+JIUjusWV4eNr n5WPtXbA5GR0rnaa3GLRRRSAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo oooAK8k+KPjH7beDR7R8xRn98VP3j6V2HxA8WJ4b0pkjb/TJwVjA6gdzXjGnRxPOZbhiQTkkckk1 pBXDbUntbQx7GUhVPY1tW8EVyrAOA+KQWdi93bhjIqp83seKsSRpHJuhVCzdBXUtEZN3Gx27s4BY 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 PNRVAyvT5qSzMUU7xshYKpZeM0BqAgaeFioCqo+9nr7VHb3M6yiLzChAwuKc7JGGI+bPO1e1Otki nlU/MjDoBT2DRjHUwqyyHdk9c9albMkCNsVSvfuRTpwskqoUKsvVjVeRSr7WbI7AUgJW2TxbAuc8 EVCkOGZFAH8IA709mkZlAwgPGcYAoaINISzEMPun0qdQ0JAwW1W3Iwc9cVWy6koFGPU1Yj8vySrE hl6N61WdmdQCdpFPzKWug7KsPLIIfue4qqiiGQOdzL05FTO8qhQnDE43N1NWXuGZEUhSw4JApXF5 FQwq8jHgcZGRVZoCxJPAbgYq7NJtP7xgSO/YVDJhhlNpHYqeM0bjMa6tpFJWOTBB4Ydq7bwf8Vb/ AEN47XU0N3ZcKJc/On+IrnXtIpYiJdwcHotU7zTt+MttHZc0nFNWY7n0lpOs2euWi3NlcJcRHuh6 H0Poau18x6Pq+o+FLxbjT5/s/wDeTqjj3HevZvB3xQsPEYS3uStnfY+6x+R/of6VzyhbYo7aijrR WYBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVU1bU4NH0+e8uG2xRKWPv7Va6V4v 8U/Fj6xqI062lC2du3zkfxv/AICqirsDnNc1m48Taw97OxCsfkTsq9hVyzs0yHOFB71DpVirKxx5 mRxj1rWmmRLeKJ8IF6Z4NdSXYiTHXA+zxqdwk44WoYZ1hDqp4boR2qe48to8OBtZeFXqKq2ypFGU CLz03HpWq0RmK0/lwsmzJJ5Yd6aPOYLlcAdMUgV2crvIReuVxUsbqCSZAQeABxSGTW7bMNKfk/uA 81TGZbiUBcIOdzdKWci5IwOe3rQriNNik7l5YUAxZYhnyt24evSsvU7v7HB5atg9Mr0q/dXqxRMX 5cjGK4vWtSLSHarEHgKO9KUuVDjG7KV7cNqF2LdCyvn5sDqK7TQ9MWO2UKpwvTArG8P6NKkAdlEr vySe1dfaTvp8aqBz3GMgVhCN3zM1lKysiXlAp8zA7nFWoZ1ijcgJgjlmHNVJpmuImY4PGflqjbsy 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 r06UxWUBWQ5BpbFXuUbm1Ep+7xjgVm3Vmqp8hKt1yD3roVRJJj5n7vA+8eKotGHkeMOCc8HFJIbZ 0fg34tXmhLFa6orXVoPl8wcug/rXs2laxZ63arcWc6zRsOqnkfWvmme3VZipxketWtG1rU/DM4ub CYxc5ePqrj3FZTihp3PpmiuJ8GfE+w8TqkE/+h32P9XJwrf7prtqwaa3GFFFFIAooooAKKKKACii igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKoa5rEGhabNeTsAiDgep7CgDmPib4vOhaWbO1lC39yNoPdF7mvHrDSpZpP PeZpU/uHufWptS1GbxDrE15cHc0jZAP8I7AVo2WbZo8EKOT9a6YRFLQ0NNuGtbhQiKrdt44qW/VX uD5wRmPOR0FVZ4ssrb8sakkWJEXezFjzgVsl2MvUhPzTExuW9GPQUjJvIBbB6F1HSpJyDsaIeWMc j1pscThVd3ESt0B6mqeothMvGTiQyKDyGGM09Zld9+wAAfdAqJ8MzKrbvepkICFQCTj5j6Uugyv5 ru5cgKFPB9aZcXIMQ5xzyakdA74DEYNZOrXaRfIjEH3qtFqTqyjrWqKluTIAsaZJbNY+hQDWLlbn aRDn5Ae/vTJXbU7k2qqXT+PPTHpXXaDZmzKNHBvKjCoK45N1HpsdSXIi/b2ItYQHY4PbFPtCZ5GR i8SdAxXg1pS6hFMoE8e11HaqhvPPXbIGLAZVE9a6UrKxz3vqSW9lJIHjjCqQM73OBVcxyKjKJvNc 9SeABTnWRHCyZUkZ2ntTVAEgRjsyMjI4NMQNDsQBUWXHylkHWpRGWkSEyPGMfdHIFTRgx52/PGgz tXtUdxLFdRgK7R/SmBXRBau21VkBJ+ZuakDm7CwyxGONRlpVOAPYU+G2iAJV84H8bVFK/kxnzMlX bAA6Yoe4LYi+5LHDbSDylPzO/JxUsz+UCIec9cd6iTAkLKnlqo4z3pn2iSRi0qGOMng+tMRcW62y IGJV2HQii6fJKAkp3dqht5ba4uWgYS7l5DkcfnUs4jCqjMQg6betT10K6CRvFaRfLsGeAO5pI7og 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 iQEAAIoBAACLAQAAjAEAAI0BAACOAQAAjwEAAJABAACRAQAAkgEAAJMBAACUAQAAlQEAAJYBAACX AQAAmAEAAJkBAACaAQAAmwEAAJwBAACdAQAAngEAAJ8BAACgAQAAoQEAAKIBAACjAQAApAEAAKUB AACmAQAApwEAAKgBAACpAQAAqgEAAKsBAACsAQAArQEAAK4BAACvAQAAsAEAALEBAACyAQAAswEA ALQBAAC1AQAAtgEAALcBAAC4AQAAuQEAALoBAAC7AQAAvAEAAL0BAAC+AQAAvwEAAMABAADBAQAA wgEAAMMBAADEAQAAxQEAAMYBAADHAQAAyAEAAMkBAADKAQAAywEAAMwBAADNAQAAzgEAAM8BAADQ AQAA0QEAANIBAADTAQAA1AEAANUBAADWAQAA1wEAANgBAADZAQAA2gEAANsBAADcAQAA3QEAAN4B AADfAQAA4AEAAOEBAADiAQAA4wEAAOQBAADlAQAA5gEAAOcBAADoAQAA6QEAAOoBAADrAQAA7AEA AO0BAADuAQAA7wEAAPABAADxAQAA8gEAAPMBAAD0AQAA9QEAAPcBAAD9////+AEAAPkBAAD6AQAA +wEAAPwBAAD9AQAA/gEAAP8BAAAAAgAAFHa0UUVmAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAhOBk9K8O+Iv ixvE+q/ZLdmXT7Ziv/XQ9z9K7H4qeMW0q0XS7M5u7kYkYH/Vp/ieleXWFjtU5GCeuO5raEeoPYu6 RDbwNmQAgjAPpVrycPglTg5Ap9sipDsEKjI6t1qS1NxDIHC7l6EkDgV0pWRk3diIymENDyxOTnoK b5gizj5mYdqklRhGSUHPULwBUdpIqSAPGTnuaegncSOMyMGLDrz7U6eGF5PMdmkweFU96e3kjzTE hEhPIFV+UfcE2g9RQA+OT7O4Lw4Y9FHT8aYxdpH3OArdhUjhNyt5mMdQBwainmTy87QwB5Apra4v IguZls4cFt3vXH6vqDNIFjYu5OBgZxWlqupAeYJFxz8oJrL0XTlu70Xk0Xz9AB0xWFST2W5tCK3Z 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 NSMbcwqiRqrk5Ye9RCN0d0ZFYYyHBpgQAuJQodXfqdxx/KrMl3KkuFQLxjjkAVHBDErGVot8ucc1 ZZ7i2AVwNj/MFFDERtOjDAVi57mq7wXUhygjbb1wCKlX5d8jEIc8CkdyyD5TtP8AEDTQmPghZoNw dPO/jXpio13BQnluZCepPFMObfDSYYt0xUnDsC7Mg6fLRYaZMVMKfPGFQcZByTTkugyiMIQR1Y9D VcxyOzIudi/xGnyEoDul4A6UrDTECeZuXcV9QKhuPLt5QsERjXHz5Ynn1pYnlOSmcHrSNuM5GQIz 6nOaeonqKknmOrL64ye9SSk7/vhVPamxxK20OxTac8HAapFWBZNzkqg7daVgGIwncqCDx1PBpq4h VyrgKvJzyTT5AfOEixgIR8rKev4U5IwQVO1R3z3p6bgMM76gq8okaDOCMf8A16RAY+UIAI5b/Chr QqwfAKe1SKsOxgECAAACAgAAAwIAAAQCAAAFAgAABgIAAAcCAAAIAgAACQIAAAoCAAALAgAADAIA AA0CAAAOAgAADwIAABACAAARAgAAEgIAABMCAAAUAgAAFQIAABYCAAAXAgAAGAIAABkCAAAaAgAA GwIAABwCAAAdAgAAHgIAAB8CAAAgAgAAIQIAACICAAAjAgAAJAIAACUCAAAmAgAAJwIAACgCAAAp AgAAKgIAACsCAAAsAgAALQIAAC4CAAAvAgAAMAIAADECAAAyAgAAMwIAADQCAAA1AgAANgIAADcC AAA4AgAAOQIAADoCAAA7AgAAPAIAAD0CAAA+AgAAPwIAAEACAABBAgAAQgIAAEMCAABEAgAARQIA AEYCAABHAgAASAIAAEkCAABKAgAASwIAAEwCAABNAgAATgIAAE8CAABQAgAAUQIAAFICAABTAgAA VAIAAFUCAABWAgAAVwIAAFgCAABZAgAAWgIAAFsCAABcAgAAXQIAAF4CAABfAgAAYAIAAGECAABi AgAAYwIAAGQCAABlAgAAZgIAAGcCAABoAgAAaQIAAGoCAABrAgAAbAIAAG0CAABuAgAAbwIAAHAC AABxAgAAcgIAAHMCAAB0AgAAdQIAAHYCAAB4AgAA/f///3kCAAB6AgAAewIAAHwCAAB9AgAAfgIA AH8CAACAAgAAUKWJ7ehpMBd887iRsxRrxtH8VQzSC4bauEbsx6VLKx8zaDkgciqwTzJx5kQYDpji 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