From xa@embarqmail.com Sat Mar 1 00:55:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 305B37F3F for ; Sat, 1 Mar 2014 00:55:21 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 16F97304070 for ; Fri, 28 Feb 2014 22:55:20 -0800 (PST) X-ASG-Debug-ID: 1393656918-04cbb066e514dda0001-NocioJ Received: from smtp.centurylink.net (mail.centurylink.net [205.219.233.9]) by cuda.sgi.com with ESMTP id Hdit9ooJEKqf9cSx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Feb 2014 22:55:19 -0800 (PST) X-Barracuda-Envelope-From: xa@embarqmail.com X-Barracuda-Apparent-Source-IP: 205.219.233.9 DKIM-Signature: v=1; a=rsa-sha1; d=embarqmail.com; s=ctl201402; c=relaxed/simple; q=dns/txt; i=@embarqmail.com; t=1393656918; h=From:Subject:Date:To:MIME-Version:Content-Type; bh=mvoOSwvX7rlbGq9oeQ2kdD7w204=; b=R/NSdNpByA64eo6ifxuNjNAWweKCuxJlx41C7cDW52VJ4MalZu0VtCvNuy22Zx9l c9af9X9uLfl6PX6wqU1RZ1UXRjBphGVa/YjsotKkc3cBM6DBRYsv4+urOpZ+PTr3 eP/2gjUM2tGTA44VUr0q2fyDtPu7gUj1BP/RFZfenxWCz7TY7DTRkKd7af1aLRIM PhDY5XjM+uJLTKRhq6B2puHhLcm1KSIep6SWdY4uWAo2ExhitvtS5vK+y48cJnN5 e1UnwtlsGIV7IGzwsxM6mJNty+aIYreF3UlpalNhSORtMcnoKowPGVWQe07rzFpf D2WvUskxk0uI2Rbk/iEoQA==; X_CMAE_Category: , , X-CNFS-Analysis: v=2.0 cv=Dc+VW4RW c=1 sm=1 a=9cW_t1CCXrUA:10 a=FKkrIqjQGGEA:10 a=1poGYrevpj8A:10 a=zrtfsDcf3T0A:10 a=1oqGTYSLAAAA:8 a=yDjO97oZzV9gxRwCLwYA:9 a=QEXdDO2ut3YA:10 a=bPbYnNDodHUA:10 a=wEIR26VSdGQA:10 a=86MgZOqIem2TsYtTcSUA:9 a=_W_S_7VecoQA:10 a=i4PDXFCCRecA:10 a=u_tVw9u34zAA:10 a=MJ0PlSgV6g9bp7uPG9IA:9 a=n3BslyFRqc0A:10 a=QEkGX9cb6z4A:10 a=TlBaDqK8ynXYOjef44tEQg==:117 X-CM-Score: 0 X-Scanned-by: Cloudmark Authority Engine X-Authed-Username: eGFAZW1iYXJxbWFpbC5jb20= Authentication-Results: smtp01.agate.dfw.synacor.com header.from=xa@embarqmail.com; sender-id=neutral Authentication-Results: smtp01.agate.dfw.synacor.com smtp.mail=xa@embarqmail.com; spf=neutral; sender-id=neutral Received-SPF: neutral (smtp01.agate.dfw.synacor.com: 10.40.66.3 is neither permitted nor denied by domain of embarqmail.com) Received: from [10.40.66.3] ([10.40.66.3:40262] helo=md41.agate.dfw.synacor.com) by smtp.centurylink.net (envelope-from ) (ecelerity 3.5.1.37854 r(Momo-dev:3.5.1.0)) with ESMTP id 13/D9-22961-05481135; Sat, 01 Mar 2014 01:55:14 -0500 Date: Sat, 1 Mar 2014 01:55:12 -0500 (EST) From: " Pt" Reply-To: Pt Message-ID: <648865124.34882954.1393656912623.JavaMail.root@embarqmail.com> In-Reply-To: <12376970.34877785.1393656819748.JavaMail.root@embarqmail.com> Subject: THANKS MIME-Version: 1.0 X-ASG-Orig-Subj: THANKS Content-Type: multipart/mixed; boundary="----=_Part_34882948_1994962937.1393656912500" X-Originating-IP: [10.40.0.31] X-Mailer: Zimbra 7.2.2_GA_2852 (ZimbraWebClient - GC33 (Win)/7.2.2_GA_2852) X-Barracuda-Connect: mail.centurylink.net[205.219.233.9] X-Barracuda-Start-Time: 1393656919 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.21 X-Barracuda-Spam-Status: No, SCORE=1.21 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145628 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 1.21 MISSING_HEADERS Missing To: header 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; ------=_Part_34882948_1994962937.1393656912500 Content-Type: multipart/alternative; boundary="----=_Part_34882949_679901548.1393656912500" ------=_Part_34882949_679901548.1393656912500 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit -- SEE ATTACHMENT LETTER ------=_Part_34882949_679901548.1393656912500 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 7bit


--
SEE ATTACHMENT LETTER
------=_Part_34882949_679901548.1393656912500-- ------=_Part_34882948_1994962937.1393656912500 Content-Type: application/pdf; name="Financial Intelligence Headquarters.pdf" Content-Disposition: attachment; filename="Financial Intelligence Headquarters.pdf" Content-Transfer-Encoding: base64 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 5q2iHlF7vZwYmEeKZchCpR8OPGuUh5EjcpOoXjADd8XPBLxi9/a6XCzb4wz4fqQGamnSRPE0JG3q ZzS0TNuxX316S63+h40u8zy7VRxWQ+cOmI9vuXO0i+nzWx+yRcbaaV6ZQbkSLtmtzGxdAWvHaWX1 HJJDt7J9TNp5ZWcdklqveseUPtmpVW8HnzRO7uiHPiTNvOqnKSR9gTkk9eA6pEITWo8uGaop14dB m5Dsu/xVKSrbjQNR6Jhup7rUmpnHMfXBzE7oiT0zs6b+OgVzTKMw0zynsbnkmEZspjQP9FWPVFbP hijoQRNdbTpqTXeW+qDGnnqm+pH6q0wehUrDdGNT3UgjVl2ehzRPrvn00U9ZKuonMhEwTNZPemrM L0Xqgl+g2LGwbLG7YTHjIMISx6HFhQ8Dfvjvt4atjrz00y+Y4wvmQOY4c8Dxi1v/CzrloIZlbmRz dHJlYW0KZW5kb2JqCjYgMCBvYmoKMTAzMDIKZW5kb2JqCjQgMCBvYmoKPDwvVHlwZS9QYWdlL01l ZGlhQm94IFswIDAgNjEyIDc5Ml0KL1JvdGF0ZSAwL1BhcmVudCAzIDAgUgovUmVzb3VyY2VzPDwv UHJvY1NldFsvUERGIC9JbWFnZUMgL0ltYWdlSSAvVGV4dF0KL0NvbG9yU3BhY2UgMjQgMCBSCi9F eHRHU3RhdGUgMjUgMCBSCi9YT2JqZWN0IDI2IDAgUgovRm9udCAyNyAwIFIKPj4KL0NvbnRlbnRz IDUgMCBSCj4+CmVuZG9iagozIDAgb2JqCjw8IC9UeXBlIC9QYWdlcyAvS2lkcyBbCjQgMCBSCl0g L0NvdW50IDEKL1JvdGF0ZSAwPj4KZW5kb2JqCjEgMCBvYmoKPDwvVHlwZSAvQ2F0YWxvZyAvUGFn ZXMgMyAwIFIKPj4KZW5kb2JqCjcgMCBvYmoKPDwvVHlwZS9FeHRHU3RhdGUKL09QTSAxPj5lbmRv YmoKOSAwIG9iagpbL0luZGV4ZWQKL0RldmljZUdyYXkKMjU1CjwwMEZGRkVGREY2RkNGOEUyRkJG NUZBRjNGNzYwMzEwMjNBNEEzQzNEOTdFQkYxRjlGNEU5OEYzNjA0MEIxQThDCkMwMTAwNjBEMDcw MTEyNDdFRUYyQ0QzODBFMDkxNTcyM0YwQzFFMEYxQjk0QzRENjJDMDhDODM3Nzc1QzA1MEEKN0NF NEIwMDMyN0Q1NjM3NTlGOTNCQ0MzNDk4QkU2RUQ0M0IzQjdFQUNFRTdFRjJFNjhFMUU4NzYxM0RG NjUzNAo4MEMxMkExOEM2OUExMTMyOUMyMDdEQzlEODY2MTk1MDZDQzVDQUYwMjZCRUIxNDRFQzRF REFEQjQyQUZBMkRFCjU5OUJDMjMwRDc4QUM3RTNEQzVEMUNERDk2ODdBMTM5MTY1NTkyNzA0MEQw RTAxRjVGNDg4RDc4MzUyRDZCMUQKMTRBNzdBMjIzRTdCOTE3MzQxMjFBREJCQTZBNDI4NEMyMzE3 MjVCOTg1RDE5MDRGNjI1RTNCQUU3RjY5OEVBNQo2RTUyRTU1NDgyNDY5REQ0ODQ5RUFCNjdDQjUz QjJEOTVBN0VDQzZBQjU4MTk4QUM0QjREODlBODU2RDI4NjgzCjZGMzM0NTI5NjQyNEI4OTVEMzk5 QkEyQjg4NzQyRkI2NUI3OUJENTE3MUJGQUE2RDU4NjFCNEEwQTNDRjU3QTk+XWVuZG9iagoyNCAw IG9iago8PC9SOQo5IDAgUj4+CmVuZG9iagoyNSAwIG9iago8PC9SNwo3IDAgUj4+CmVuZG9iagoy NiAwIG9iago8PC9SMTEKMTEgMCBSL1IxMAoxMCAwIFIvUjgKOCAwIFI+PgplbmRvYmoKMTEgMCBv YmoKPDwvU3VidHlwZS9JbWFnZQovQ29sb3JTcGFjZS9EZXZpY2VSR0IKL1dpZHRoIDU1NwovSGVp Z2h0IDczMgovQml0c1BlckNvbXBvbmVudCA4Ci9GaWx0ZXIvRENURGVjb2RlL0xlbmd0aCA1NjEz Nz4+c3RyZWFtCv/Y/+4ADkFkb2JlAGQAAAAAAf/bAEMABAMDBAMDBAQDBAUEBAUGCgcGBgYGDAkJ BwoPDQ8PDg0ODhASFxQQERYRDg4UGxQWGBkaGhoQExweHBkeFxkaGf/bAEMBBAUFBgUGDAcHDBkR DhEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGf/AABEI AtwCLQMBEQACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMD AgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUm JygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaX mJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4 +fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncA AQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6 Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeo qaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhED EQA/APv6gAoAKACgAoAKACgAoAKACgAoAKADIzjPNABQAUAFABQAUAFABQAUAFABQAUAFABQAUAF ABQAUAFABQAUAFAEM83lFPc8/SsKlTkaNIQ5rk1bmYUAFABQAUAFABQAUAFABQAUAFABQAUAFABQ AUAFABQAUAFABQAZBzg9KACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoA oXN9glID06t/h/jXDWxHLojpp0ubVkenPmZsnkgk889ajCt31LrxsjTr0TjCgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAzbxt7Mew4rzKj9pUO2krJF63fzIUbvjmu+m+aKOWa5ZNEl aEBQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAY8krJcSPG2DuPTuP61406klNtHe opwVy/bXYnGGG1/T1r0aVZVDlnTcCzXQZBQAUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAIzq gy7BR6k4pNpbha5ALyJnVELMSccCsVWhJ2Ro6cktSxW5mU7+fy1EanDMMn2FcmJqcsbG9GN3czTX lN8x3k1o+24Q+pxW9B2qIxrK8TYr2TzwoAKACgAoAKACgAoAKACgAoAKACgAoAqrceXM0ch+XPyn 0rljUtNxZu4c0eZFquowCgAoAKACgBsjbEJ/KonLli2VFXdjLk+4fwryI/Gdy3LOnP8AK6e+RXo0 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 G3PJ97zdtnpJFtUN2jOL1RnsY92VHAJz2jiGMg29e183LYJpEbWN0gD1jR+de+43rK7a4EHqaZvE cPmnnZdnJcKWhmAbqkSD/8iPtRBmuDbaXXl/Vf0/T2lJiYzGcNWAs9JH48DAUAbpez1ti65xE7bQ tUOPOXuQVrN+Wt2xj7a2jdT8acF9tOSDEQftYXfm2CRFJRnLVTKiz2KnTYTk9BLU0iWK4/9smBUL Dzmz5UgU1OIOCqWRIa0l8FY66sq6ny84+GTKLg8Aea2PFPqGUiJMLcCxST36oBCqgBJQkPRCJH1t m+BUx4SSRwElRfIbZ5myzhkxRDVrbtLcN0RDNERDNERDNERDNERDNERDNER90v8AKyZgQAplbmRz dHJlYW0KZW5kb2JqCjggMCBvYmoKPDwvU3VidHlwZS9JbWFnZQovQ29sb3JTcGFjZS9EZXZpY2VS R0IKL1dpZHRoIDU1NwovSGVpZ2h0IDczMgovQml0c1BlckNvbXBvbmVudCA4Ci9GaWx0ZXIvRENU RGVjb2RlL0xlbmd0aCAxMTIxMDc+PnN0cmVhbQr/2P/uAA5BZG9iZQBkAAAAAAH/2wBDAAQDAwQD AwQEAwQFBAQFBgoHBgYGBgwJCQcKDw0PDw4NDg4QEhcUEBEWEQ4OFBsUFhgZGhoaEBMcHhwZHhcZ Ghn/2wBDAQQFBQYFBgwHBwwZEQ4RGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZ GRkZGRkZGRkZGRkZGRn/wAARCALcAi0DAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAEC AwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ 2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QA tREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaH iImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq 8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD76oAKACgAoAKACgAoAKACgAoAKmKHawgptJbk8zM+LVLK a/lsormFruNd7wq3zKv+1WKlRqaRZboOCuaBHrWy9xCixaYgoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgBkq7o23UAeZfEfxW3h++0aK3faouVmuf+uW7b/7N/47XzWb4+OCcKC9f60Z9HlG XvF0Ktb0PQYOW8xNu3b8rL/FX0rcaijV/rU+dqS5q0Yvpcv0CCgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgBnC9RUTfMSpt6FK21Szu57mGyuYriS2fy51Vvmib/aqU6MtGWqU07svKB6V tzN7Ee0FIHeoc3Hcv4haoQUAFABQAUAFABQAUAFABQAUAFABQAUAFABQAUAFADd6/wB6gB1AEM8i xDczbf8AerOc/ZxuXFczsfPHxF+NVzdTXGl+DZvKgX5Z79fvSf8AXL/Z/wBuvgs0zqVCTS/r8D6j A5WqyTl/X4mT8A77yvHE8cr5e7tJN25tzMyujVxcPOvUn7z/ACOvOsMqUbo+n15Br9Pb5FqfEQ3J KQwoAKACgAoAKACgAoAKACgAoAKAGMyr99tlAB5sfy/vF+b7vzUAPoAKACgAoAKAGs/y0AfMHxD1 f+29W1G7DboN3kx/7q/LX5Hj6zzLMJP+X+vI/YcjoLD4aFP+a57V8ONaGseENNmk+eWKPyZW/wBp Plr9Eyyu8RgbdtD8zzehHB4urLzO3r2DygoAKACgAoAZuVf4qAGfaYfM8rzY/M/u7vmoAmoAKACg AoAKACgAoAKACgAoAKACgAoArTfxCoqS5qDaEqkVVUT4w1PX72y8Y6pq+kXcltc/bpWWSNvvpu/8 er8dxOMrrEtJ9fI/RPq9P6um10Pffhl8WovF6rp2s+Xaauq/Lt+VLlf9n/a/2a+9yzOFiHZ/1+B8 vjcv9hqesI3y819NKcbXPE+F2H1QBQAUAFABQAUAFABQAUAFABQAUAFABQAUAG7bQBGGXHpUxcn8 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 L92vxfOsT9YrXR+k4HDezgc/XJN81JI7Yu0grMAoAKACgApRAntLuWyuYLm1k8ueGRZFb+6y11xl YTSasyfVdWu9Z1Ca+1CVpru4bcSegrPFVpYqf7v4SaOFgkR6fYXOqX0dlYwSXNzM22OONfmatI0Z wS+q/F/XcivWhhj2jTtL0X4M2X9oeJJI9Q8UzxfuLWP5vIX/ANl/2m/75r7uhRwvDtNyk7z+f/BR 8q6tXOJJS2/r0PLfFfjDVvGOofbNWl3Iv+qhX/VQL/s18fjc0qZpUtX+Fbf0kj3sLhpZcrw/r8zB 7V46dGq7L4vmenGNWavX/r7jvfA/wl1nxe0V1dJ/Zmkt832iRfnk/wCua19VgMkxuJs6+kPl+jue JjMzwuCdo6v5/wCR65c654N+D1g9jZJ9q1Bvvxwtunk/66N/DX1VTE4LI4fuN/n+tz5xUa2bSXtN v67WPGPGvxJ1nxlJ5dxN9j07+GzhZtv/AAP+9XxeNzrE5o+WO3y/yR9Ng8rjl6vHf+vNnF14VV+z PaS9sbfh3w/da+bkWaFlhCM2M9WLen+7XoYbDyrw5jjqVFQfKel/Fv4WXdvf3evaAjXVndyeZc28 a7nhb+Jv92vqc9yuNH3l/X4nzWW5g5NRZ4zXxbXKrH2HNzK4VM1HEfANT5PiLWn6hdaVeRXmm3Ul rcx/dkjba1XTr4rB/C/yOarCjW3X5nsHhv43w39udL+IFlHdWsvytcxRblb/AK6Rf/E19rgs+o1/ dxa/P9EfM4vJK1N82Ef5fqxPEXwdsdZtf7Z+GV7De2jfN9l8zcP+AN/7K1GNyaOZe/g/6+9o0wOZ vL3yY1f18kePXdncafdPa3sMtrdRt80Ui7WSvi5RWGThiN/67H0cY1K8ufDbf13NXwt4r1PwlqK3 ukXDRM3+thb/AFUq/wC0tbYTFV8FLnpPT5fqTisPSxq5Kq1/rsek3ukaL8XbSXVPC5TSvFMSBrvT 3+7cf7S//Ff99V9csNTz+g6sN1/XkfNYWvUyWfsqmz/rzPHrm1mtLiW3u42iliba0bLtZWr4mCjR rujU6f10Pp4U5YmPtaZFWRqFABQAUAFABQAVEnd2FP3JEttczWdxFcWsnlTwMssTL/Cy10wm8Oro MRacNT7Q8E+JIfFnh2w1OIBWmX94v9yT+Ja/ZsFiPaw1PzKvR5HY6Q8CvQjqzngLQAUAFABQAUAF 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 Iu4Vi0YuEXujgvEHwM+HHiecnWvBmjzSY/1sduIX/wC+k2msuSJjKlDsef6t+xn8Kb9na303UNNY nObXUHH/AKHuqvZxOOVGB5Nr/wCyT4I00IbbUvEAO5ut1Cf/AGjXM4o8mUUeMa58ING0yeOOC+1N lPPzyRH/ANp1yyijndk9jx28hWC6miQkpG7BcnOKgR0egeGrbVmuRczTr5art8sqP/ZaB3PZPCX7 P3hrXmhN7qGsL5ke5vKniXn/AL91vGKNUke0eHP2Mvh5ds32y88QTgKpw17Go/8AHYhXTCEW7HVC EZOx6VpH7JPwk0plb/hGBfMOhvLuWX+bV2uKPSjSh2PRNB8CeFvDUy23h7w5pOmIgyrW9miMPxxR ypK52RpQ7HUqBWaRSih9a2NUGKCHJhUsi7Cg0CgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAo AKACgAoAKACgAoAKACgD/9kKZW5kc3RyZWFtCmVuZG9iagoyNyAwIG9iago8PC9SMjEKMjEgMCBS L1IyMwoyMyAwIFIvUjEzCjEzIDAgUi9SMTUKMTUgMCBSL1IxNwoxNyAwIFIvUjE5CjE5IDAgUj4+ CmVuZG9iagoyOCAwIG9iago8PC9MZW5ndGgxIDE2MjgwL0ZpbHRlci9GbGF0ZURlY29kZS9MZW5n dGggMjkgMCBSPj5zdHJlYW0KeJztew14U1W67lpr/2Rn77bZadM0bZombZqkSZombdKfIJBY0hAp tKlQaIFIQYqgg1L5EVCk6ABSUPBn0GHOjMg46ChHgqCi4lBHrM44HuA4CpzRi3NkkBF7YOaq41Xb 3G/tpAUcZ865z3PP89znuZOdtff63996v299P6spwgihbNSLGBRvneqtQcpn3DK4Tb9+8dwl6fJV JxHCd1y/Ypml+YI/Dyreh/K/LVhyw+IVr0SOIEQOIsRbb/jeqgXp/rKAkL1oYffc+b9pmbcToVAX VNYthIrcqeIBhAQYj8oXLl62MvO+38B8y753y/Vz0+W6coS4A4vnrlwixIWZCKlppeXmuYu7M/2n wc285Jaly9LlUJi2L7m1e8k/t5f/O/S3AD1/QBGYZR4qoYlZhUoQSv37SBoW4bkcRmXe+N/0mYle grQf0oBSoulRpfxLdBDF0G6oeUmp3Q3pHuX+ONoOLQi5Ie1HN8PIE1D/DLQ8gxYr7b+E9ibI3Yzu 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 LFvJZp+fYCratrjdLo/j/ISm547FbT3h1f1vnrqQz1S0bya+ADOrTt79/lU3/ymrbvtyq04mqYuu 7Ki3tAW0o9JAApffYhtN4VyjrN28DY7nO7fpnnbTfLQdaDMoccJk1qstVldXzc6tUzZ3pl3Z39qC +In4T6mewADmYQFeGQ9IklsUO+fOXZ7vKsxziaG6ihBTQRvgOaxHG2bigvjJC296br2+Z3tRcV52 SeHOdWt2FBe6XUqUPIn32K3avwUnLPGXpmqdWsacFklj0jij/kBaqtnpzDzA2k3KyzHkmHPQYORG Ug0DetR7u3w+Om+76KLr8oFy9Nb76KbzdlHc8pMHLS/RTaaEzcXPnMI1PnbrvLuv+eGpBx/Eflwe f4IxmxY2Za+25Kaa+bF/YYxT5NCzU/HNlwclqdiRqr5fC3+0zvsS9b++asWtan2ZqVXr7cxBtf4j 62NvYl+YqZrMS/VSvVQv1Uv1Uv2/qcpX9fSvUspboPKZPIeAPrGBbVu+7KpFfNOqVmlhy1f9L85f YNHQza+0GiU+Z42JBLWotERrQPkNog2WwzK4ChYBD02wClrpXW0htKgaFoorQ5gOjAAdHYGKqoa5 DRW1g+Xl6u+CeD9ov7QlX/i321k4m/gcA2fUcBaY4/CnwQQc+XOA/il44P8btEFYOQuj0KltheAs HIYx8nffRTBmuAXGFL72TpJ/Adj94Enujz9QlHXQMvfF5CeOXWue/xE4kwv39xvbP1Wezz126vS5 /Re+YTxoyCbdFDU/qPw3Cmwe4AplbmRzdHJlYW0KZW5kb2JqCjM5IDAgb2JqCjM4NzgKZW5kb2Jq CjIxIDAgb2JqCjw8L0Jhc2VGb250L0hVRUNWUCtUVEUyNDVBMEQ4dDAwL0ZvbnREZXNjcmlwdG9y IDIwIDAgUi9UeXBlL0ZvbnQKL0ZpcnN0Q2hhciAxL0xhc3RDaGFyIDMzL1dpZHRoc1sgMjUwIDcy NCA0NTkgNDQzIDM4MyA1ODQgMzc5IDgyMSAyODUgMjg2IDc1NiA3NzEgNTY2IDMxMCA1MzUKNTQx IDUyOCA2MDIgMzE4IDQ0NiA1MTggMjUwIDM1MyA2NTMgNzEyIDY0NyA3MTAgNTUyIDU5MCA2NzUg OTAzCjcyNiA2MDNdCi9FbmNvZGluZyA0MCAwIFIvU3VidHlwZS9UcnVlVHlwZT4+CmVuZG9iago0 MCAwIG9iago8PC9UeXBlL0VuY29kaW5nL0Jhc2VFbmNvZGluZy9XaW5BbnNpRW5jb2RpbmcvRGlm ZmVyZW5jZXNbCjEvc3BhY2UvRC9lL2Evci9FL2h5cGhlbi9tL2kvbC9PL3cvbi9zbGFzaC9GL3Uv ZC9CL2YvYy95L2NvbW1hL0kvUi9WL0MvQS9ML1AvWS9NL04vVF0+PgplbmRvYmoKMjMgMCBvYmoK PDwvQmFzZUZvbnQvU05EQUJOK1RpbWVzLVJvbWFuL0ZvbnREZXNjcmlwdG9yIDIyIDAgUi9UeXBl L0ZvbnQKL0ZpcnN0Q2hhciAzMi9MYXN0Q2hhciAzMi9XaWR0aHNbCjI1MF0KL0VuY29kaW5nL1dp bkFuc2lFbmNvZGluZy9TdWJ0eXBlL1R5cGUxPj4KZW5kb2JqCjEzIDAgb2JqCjw8L0Jhc2VGb250 L1ZSQ0JBVCtUVEUxNUYzQUEwdDAwL0ZvbnREZXNjcmlwdG9yIDEyIDAgUi9UeXBlL0ZvbnQKL0Zp cnN0Q2hhciAxL0xhc3RDaGFyIDI3L1dpZHRoc1sgMzMzIDgzMyA2NjcgMTAwMCA2NjcgNjY3IDcy MiA2NjcgNDQ0IDMzMyA2MTEgNjY3IDM4OSA4MzMgNzc4Cjc3OCA2NjcgNzIyIDcyMiA4MzMgNzc4 IDM4OSAzODkgNzIyIDgzMyA3NzggODMzXQovRW5jb2RpbmcgNDEgMCBSL1N1YnR5cGUvVHJ1ZVR5 cGU+PgplbmRvYmoKNDEgMCBvYmoKPDwvVHlwZS9FbmNvZGluZy9CYXNlRW5jb2RpbmcvV2luQW5z aUVuY29kaW5nL0RpZmZlcmVuY2VzWwoxL3NwYWNlL0gvdS9tL2Evbi9TL2UvdC9sL3MvRi9JL04v QS9DL0wvVC9FL0cvUi9wYXJlbmxlZnQvcGFyZW5yaWdodC9QL1UvQi9PXT4+CmVuZG9iagoxNSAw IG9iago8PC9CYXNlRm9udC9UQ09WQUErSGVsdmV0aWNhL0ZvbnREZXNjcmlwdG9yIDE0IDAgUi9U eXBlL0ZvbnQKL0ZpcnN0Q2hhciAzMi9MYXN0Q2hhciAxMjIvV2lkdGhzWwoyNzggMCAwIDAgMCAw IDAgMTkxIDMzMyAzMzMgMCAwIDI3OCAzMzMgMjc4IDI3OAo1NTYgNTU2IDU1NiA1NTYgNTU2IDU1 NiA1NTYgNTU2IDU1NiA1NTYgMjc4IDI3OCAwIDAgMCAwCjAgNjY3IDY2NyA3MjIgMCA2NjcgNjEx IDc3OCA3MjIgMjc4IDUwMCA2NjcgNTU2IDgzMyA3MjIgNzc4CjY2NyAwIDcyMiA2NjcgNjExIDcy MiA2NjcgOTQ0IDY2NyA2NjcgMCAwIDAgMCAwIDAKMCA1NTYgNTU2IDUwMCA1NTYgNTU2IDI3OCA1 NTYgNTU2IDIyMiAwIDUwMCAyMjIgODMzIDU1NiA1NTYKNTU2IDU1NiAzMzMgNTAwIDI3OCA1NTYg NTAwIDcyMiA1MDAgNTAwIDUwMF0KL0VuY29kaW5nL1dpbkFuc2lFbmNvZGluZy9TdWJ0eXBlL1R5 cGUxPj4KZW5kb2JqCjE3IDAgb2JqCjw8L0Jhc2VGb250L1dPR1RXRCtIZWx2ZXRpY2EtQm9sZC9G b250RGVzY3JpcHRvciAxNiAwIFIvVHlwZS9Gb250Ci9GaXJzdENoYXIgMzIvTGFzdENoYXIgMTIx L1dpZHRoc1sKMjc4IDAgMCAwIDU1NiAwIDAgMCAzMzMgMzMzIDAgNTg0IDI3OCAzMzMgMjc4IDI3 OAo1NTYgNTU2IDU1NiA1NTYgNTU2IDU1NiAwIDU1NiA1NTYgNTU2IDMzMyAwIDAgMCAwIDAKMCA3 MjIgNzIyIDcyMiA3MjIgNjY3IDYxMSA3NzggNzIyIDI3OCAwIDcyMiA2MTEgODMzIDcyMiA3NzgK NjY3IDAgNzIyIDY2NyA2MTEgNzIyIDY2NyA5NDQgMCA2NjcgMCAwIDAgMCAwIDAKMCA1NTYgNjEx IDU1NiA2MTEgNTU2IDMzMyA2MTEgNjExIDI3OCAwIDU1NiAyNzggODg5IDYxMSA2MTEKNjExIDAg Mzg5IDU1NiAzMzMgNjExIDU1NiAwIDU1NiA1NTZdCi9FbmNvZGluZy9XaW5BbnNpRW5jb2Rpbmcv U3VidHlwZS9UeXBlMT4+CmVuZG9iagoxOSAwIG9iago8PC9CYXNlRm9udC9MWUJLVlArVFRFMTVC NEIxOHQwMC9Gb250RGVzY3JpcHRvciAxOCAwIFIvVHlwZS9Gb250Ci9GaXJzdENoYXIgMS9MYXN0 Q2hhciAxMy9XaWR0aHNbIDM0MiA2ODcgNzEyIDM0MiAzNDIgNjY0IDM2MSA2NjggNDU2IDEwNTgg OTY0IDY5OSA3MTJdCi9FbmNvZGluZyA0MiAwIFIvU3VidHlwZS9UcnVlVHlwZT4+CmVuZG9iago0 MiAwIG9iago8PC9UeXBlL0VuY29kaW5nL0Jhc2VFbmNvZGluZy9XaW5BbnNpRW5jb2RpbmcvRGlm ZmVyZW5jZXNbCjEvc3BhY2Uvby9uL2wvaS9lL3BlcmlvZC9hL3QvbS9hdC9kL2hdPj4KZW5kb2Jq CjIwIDAgb2JqCjw8L1R5cGUvRm9udERlc2NyaXB0b3IvRm9udE5hbWUvSFVFQ1ZQK1RURTI0NUEw RDh0MDAvRm9udEJCb3hbLTkgLTI1NyA4NzggNzI2XS9GbGFncyA0Ci9Bc2NlbnQgNzI2Ci9DYXBI ZWlnaHQgNzI2Ci9EZXNjZW50IC0yNTcKL0l0YWxpY0FuZ2xlIDAKL1N0ZW1WIDEzMQovTWlzc2lu Z1dpZHRoIDUwMAovRm9udEZpbGUyIDI4IDAgUj4+CmVuZG9iagoyMiAwIG9iago8PC9UeXBlL0Zv bnREZXNjcmlwdG9yL0ZvbnROYW1lL1NOREFCTitUaW1lcy1Sb21hbi9Gb250QkJveFswIDAgMTAw MCAxMDAwXS9GbGFncyA1Ci9Bc2NlbnQgMAovQ2FwSGVpZ2h0IDAKL0Rlc2NlbnQgMAovSXRhbGlj QW5nbGUgMAovU3RlbVYgMAovQXZnV2lkdGggMjUwCi9NYXhXaWR0aCAyNTAKL01pc3NpbmdXaWR0 aCAyNTAKL0NoYXJTZXQoL3NwYWNlKS9Gb250RmlsZTMgMzAgMCBSPj4KZW5kb2JqCjEyIDAgb2Jq Cjw8L1R5cGUvRm9udERlc2NyaXB0b3IvRm9udE5hbWUvVlJDQkFUK1RURTE1RjNBQTB0MDAvRm9u dEJCb3hbMCAtMjEwIDk0MSA3MjhdL0ZsYWdzIDQKL0FzY2VudCA3MjgKL0NhcEhlaWdodCA3MjgK L0Rlc2NlbnQgLTIxMAovSXRhbGljQW5nbGUgMAovU3RlbVYgMTQxCi9NaXNzaW5nV2lkdGggNzUw Ci9Gb250RmlsZTIgMzIgMCBSPj4KZW5kb2JqCjE0IDAgb2JqCjw8L1R5cGUvRm9udERlc2NyaXB0 b3IvRm9udE5hbWUvVENPVkFBK0hlbHZldGljYS9Gb250QkJveFstOCAtMjE4IDkyOSA3NDFdL0Zs YWdzIDQKL0FzY2VudCA3NDEKL0NhcEhlaWdodCA3NDEKL0Rlc2NlbnQgLTIxOAovSXRhbGljQW5n bGUgMAovU3RlbVYgMTM5Ci9NaXNzaW5nV2lkdGggMjc4Ci9DaGFyU2V0KC9mb3VyL0wvQS95L24v Yy9YL2ZpdmUvTS9CL3ovby9kL1kvc2l4L04vQy9wL2Uvc2V2ZW4vTy9xL2YvZWlnaHQvUC9FL3Iv Zy9uaW5lL0Yvcy9oL2NvbG9uL1IvRy90L2kvc2VtaWNvbG9uL1MvSC91L1QvSS92L3F1b3Rlc2lu Z2xlL2svVS9KL3cvbC9hL1YvSy94L20vYi9XL3BhcmVucmlnaHQvc3BhY2UvY29tbWEvaHlwaGVu L3BlcmlvZC9zbGFzaC96ZXJvL29uZS90d28vdGhyZWUvcGFyZW5sZWZ0KS9Gb250RmlsZTMgMzQg MCBSPj4KZW5kb2JqCjE2IDAgb2JqCjw8L1R5cGUvRm9udERlc2NyaXB0b3IvRm9udE5hbWUvV09H VFdEK0hlbHZldGljYS1Cb2xkL0ZvbnRCQm94WzAgLTIxOSA5MzIgNzYzXS9GbGFncyA0Ci9Bc2Nl bnQgNzYzCi9DYXBIZWlnaHQgNzYzCi9EZXNjZW50IC0yMTkKL0l0YWxpY0FuZ2xlIDAKL1N0ZW1W IDEzOQovTWlzc2luZ1dpZHRoIDI3OAovQ2hhclNldCgvZm91ci9ML0EveS9uL2MvZml2ZS9NL0Iv by9kL1kvTi9DL3AvZS9zZXZlbi9PL0QvZi9laWdodC9QL0Uvci9nL25pbmUvRi9zL2gvY29sb24v Ui9HL3QvaS9TL0gvdS9UL0kvdi9rL1UvbC9hL1YvSy94L20vYi9XL3BhcmVucmlnaHQvcGx1cy9z cGFjZS9jb21tYS9oeXBoZW4vcGVyaW9kL3NsYXNoL2RvbGxhci96ZXJvL29uZS90d28vdGhyZWUv cGFyZW5sZWZ0KS9Gb250RmlsZTMgMzYgMCBSPj4KZW5kb2JqCjE4IDAgb2JqCjw8L1R5cGUvRm9u dERlc2NyaXB0b3IvRm9udE5hbWUvTFlCS1ZQK1RURTE1QjRCMTh0MDAvRm9udEJCb3hbMCAtMTEx IDk3OCA3NTldL0ZsYWdzIDQKL0FzY2VudCA3NTkKL0NhcEhlaWdodCA3NTkKL0Rlc2NlbnQgLTEx MQovSXRhbGljQW5nbGUgMAovU3RlbVYgMTQ2Ci9NaXNzaW5nV2lkdGggMTAwMAovRm9udEZpbGUy IDM4IDAgUj4+CmVuZG9iagoyIDAgb2JqCjw8L1Byb2R1Y2VyKEdQTCBHaG9zdHNjcmlwdCA4LjE1 KQovQ3JlYXRpb25EYXRlKEQ6MjAxNDAxMDcxMTI3NTApCi9Nb2REYXRlKEQ6MjAxNDAxMDcxMTI3 NTApCi9UaXRsZShNaWNyb3NvZnQgV29yZCAtIEZpbmFuY2lhbCBJbnRlbGxpZ2VuY2UgSGVhZHF1 YXJ0ZXJzMSkKL0NyZWF0b3IoUFNjcmlwdDUuZGxsIFZlcnNpb24gNS4yKQovQXV0aG9yKEFkbWlu aXN0cmF0b3IpPj5lbmRvYmoKeHJlZgowIDQzCjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAxMDY4 NyAwMDAwMCBuIAowMDAwMjI2MjUwIDAwMDAwIG4gCjAwMDAwMTA2MTkgMDAwMDAgbiAKMDAwMDAx MDQwOCAwMDAwMCBuIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMTAzODcgMDAwMDAgbiAKMDAw MDAxMDczNSAwMDAwMCBuIAowMDAwMDgwNTU0IDAwMDAwIG4gCjAwMDAwMTA3NzYgMDAwMDAgbiAK MDAwMDA2NzczNiAwMDAwMCBuIAowMDAwMDExNDUxIDAwMDAwIG4gCjAwMDAyMjQ5NzEgMDAwMDAg biAKMDAwMDIyMjg1MCAwMDAwMCBuIAowMDAwMjI1MTc4IDAwMDAwIG4gCjAwMDAyMjMyNjUgMDAw MDAgbiAKMDAwMDIyNTYxOSAwMDAwMCBuIAowMDAwMjIzNzM4IDAwMDAwIG4gCjAwMDAyMjYwNDIg MDAwMDAgbiAKMDAwMDIyNDIwNCAwMDAwMCBuIAowMDAwMjI0NTI0IDAwMDAwIG4gCjAwMDAyMjIy NDQgMDAwMDAgbiAKMDAwMDIyNDczMiAwMDAwMCBuIAowMDAwMjIyNjkwIDAwMDAwIG4gCjAwMDAw MTEzMzkgMDAwMDAgbiAKMDAwMDAxMTM2OSAwMDAwMCBuIAowMDAwMDExMzk5IDAwMDAwIG4gCjAw MDAxOTI4MDkgMDAwMDAgbiAKMDAwMDE5Mjg5NiAwMDAwMCBuIAowMDAwMjAzMjYzIDAwMDAwIG4g CjAwMDAyMDMyODUgMDAwMDAgbiAKMDAwMDIwMzY1NyAwMDAwMCBuIAowMDAwMjAzNjc3IDAwMDAw IG4gCjAwMDAyMDkyMzUgMDAwMDAgbiAKMDAwMDIwOTI1NiAwMDAwMCBuIAowMDAwMjEzODA0IDAw MDAwIG4gCjAwMDAyMTM4MjUgMDAwMDAgbiAKMDAwMDIxODI0MCAwMDAwMCBuIAowMDAwMjE4MjYx IDAwMDAwIG4gCjAwMDAyMjIyMjMgMDAwMDAgbiAKMDAwMDIyMjUyNyAwMDAwMCBuIAowMDAwMjIz MTEwIDAwMDAwIG4gCjAwMDAyMjQ0MDggMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSA0MyAvUm9v dCAxIDAgUiAvSW5mbyAyIDAgUgovSUQgWygaAlu1OBX2ILwZJfjGjr91KSgaAlu1OBX2ILwZJfjG jr91KV0KPj4Kc3RhcnR4cmVmCjIyNjQ3OQolJUVPRgo= ------=_Part_34882948_1994962937.1393656912500-- From fdmanana@gmail.com Sat Mar 1 04:56:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 91EFE7F3F for ; Sat, 1 Mar 2014 04:56:05 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 60FC5304043 for ; Sat, 1 Mar 2014 02:56:05 -0800 (PST) X-ASG-Debug-ID: 1393671362-04bdf05daa163390001-NocioJ Received: from mail-wi0-f172.google.com (mail-wi0-f172.google.com [209.85.212.172]) by cuda.sgi.com with ESMTP id Alym2EjyejubQD4D (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 01 Mar 2014 02:56:03 -0800 (PST) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.172] Received: by mail-wi0-f172.google.com with SMTP id r20so1666800wiv.17 for ; Sat, 01 Mar 2014 02:56:02 -0800 (PST) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.172] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=sMBStUVeVBWfSUod8waoDNmgmrSSvufTHPzGBpPyEX4=; b=K42lSOvb/oguVJz1kT/j8eKoLucEbHrvmU6IRRtjC2fBkUz+liUM1A3K0lSamjO5Kc U9+Z+ltxb6Pq4bwTAP/9dtBIJtORSoFGG2LU00luC92y9gHdjUUzz7iklhFfqaa7TQRI cV2c9QeoO+S2hdy0QQbaRv5RQKQciIFezpYEsf48l5Lfy3DlVi3fxrgRwSzPb2dONdrP 2gOxbjKT5VHcHOlplRan3XcRjzQBj7/Mavh6tUs9ta7c3JSBqSjmUtLnnV7pemD60wxn 88AotJnO3+zR/YluRflHo4aD77ffaXR89YP+FAqNqlsrFbXVsYC/PLL7NDQXaKIL3hIV D51A== X-Received: by 10.180.165.174 with SMTP id yz14mr7298119wib.34.1393671361888; Sat, 01 Mar 2014 02:56:01 -0800 (PST) Received: from storm-desktop.lan (bl5-78-108.dsl.telepac.pt. [82.154.78.108]) by mx.google.com with ESMTPSA id fs4sm13345271wib.11.2014.03.01.02.56.01 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 01 Mar 2014 02:56:01 -0800 (PST) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, Filipe David Borba Manana Subject: [PATCH] Btrfs: correctly flush data on defrag when compression is enabled Date: Sat, 1 Mar 2014 10:55:54 +0000 X-ASG-Orig-Subj: [PATCH] Btrfs: correctly flush data on defrag when compression is enabled Message-Id: <1393671354-7140-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-wi0-f172.google.com[209.85.212.172] X-Barracuda-Start-Time: 1393671363 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature When the defrag flag BTRFS_DEFRAG_RANGE_START_IO is set and compression enabled, we weren't flushing completely, as writing compressed extents is a 2 steps process, one to compress the data and another one to write the compressed data to disk. Signed-off-by: Filipe David Borba Manana --- fs/btrfs/ioctl.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index d4c1795..f914b5d 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -1382,8 +1382,12 @@ int btrfs_defrag_file(struct inode *inode, struct file *file, } } - if ((range->flags & BTRFS_DEFRAG_RANGE_START_IO)) + if ((range->flags & BTRFS_DEFRAG_RANGE_START_IO)) { filemap_flush(inode->i_mapping); + if (test_bit(BTRFS_INODE_HAS_ASYNC_EXTENT, + &BTRFS_I(inode)->runtime_flags)) + filemap_flush(inode->i_mapping); + } if ((range->flags & BTRFS_DEFRAG_RANGE_COMPRESS)) { /* the filemap_flush will queue IO into the worker threads, but -- 1.7.9.5 From fdmanana@gmail.com Sat Mar 1 04:57:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM,T_DKIM_INVALID autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2AEB97F3F for ; Sat, 1 Mar 2014 04:57:17 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B4393AC002 for ; Sat, 1 Mar 2014 02:57:13 -0800 (PST) X-ASG-Debug-ID: 1393671431-04bdf05dab163620001-NocioJ Received: from mail-wg0-f51.google.com (mail-wg0-f51.google.com [74.125.82.51]) by cuda.sgi.com with ESMTP id 8kzx2eGALu7AwIsD (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 01 Mar 2014 02:57:12 -0800 (PST) X-Barracuda-Envelope-From: fdmanana@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.51 Received: by mail-wg0-f51.google.com with SMTP id a1so1444263wgh.22 for ; Sat, 01 Mar 2014 02:57:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=TUkc6VFd7iSRDjAk9H9h4yHx3Vi0OuwLQt+OturrGe0=; b=VEUZ1Oz3E7cyHAolyuy4PFqLNHE9OU1aAMY6nZpRRkPIDwqxyGuDl4boENnD/NQ2py izqB7gQVztUifcj7nXFZIuriqUUr00uxzCy0wvOT51YZ6TxC7HYCgxOI2YdmCELt1TYP Wub5qvRTrflqIHB7cI3Ew+3MxcYg1lHj12d59gbP8F0lqfsXIOTXV57jGAAtZ37kjvyj jjVEoHDupahdMa3mtyezx/WM4RFarctiaUrAX2A0O46ySeATCuZfct4g7kgTU5ZG4NjA DV4Q8+nla+DZuHN2M8gKJfPTJMBzRWH/Ve/2HlJoaqO2WtKBeNR4m87yAhtuylcuq+fG glag== X-Received: by 10.180.7.227 with SMTP id m3mr6456869wia.59.1393671430599; Sat, 01 Mar 2014 02:57:10 -0800 (PST) Received: from storm-desktop.lan (bl5-78-108.dsl.telepac.pt. [82.154.78.108]) by mx.google.com with ESMTPSA id ff7sm14476895wic.10.2014.03.01.02.57.09 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sat, 01 Mar 2014 02:57:09 -0800 (PST) From: Filipe David Borba Manana To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, Filipe David Borba Manana Subject: [PATCH] Btrfs: make defrag not fragment files when using prealloc extents Date: Sat, 1 Mar 2014 10:57:03 +0000 X-ASG-Orig-Subj: [PATCH] Btrfs: make defrag not fragment files when using prealloc extents Message-Id: <1393671423-7349-1-git-send-email-fdmanana@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Barracuda-Connect: mail-wg0-f51.google.com[74.125.82.51] X-Barracuda-Start-Time: 1393671431 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145634 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature When using prealloc extents, a file defragment operation may actually fragment the file and increase the amount of data space used by the file. This change fixes that behaviour. Example: $ mkfs.btrfs -f /dev/sdb3 $ mount /dev/sdb3 /mnt $ cd /mnt $ xfs_io -f -c 'falloc 0 1048576' foobar && sync $ xfs_io -c 'pwrite -S 0xff -b 100000 5000 100000' foobar $ xfs_io -c 'pwrite -S 0xac -b 100000 200000 100000' foobar $ xfs_io -c 'pwrite -S 0xe1 -b 100000 900000 100000' foobar && sync Before defragmenting the file: $ btrfs filesystem df /mnt Data, single: total=8.00MiB, used=1.25MiB System, DUP: total=8.00MiB, used=16.00KiB System, single: total=4.00MiB, used=0.00 Metadata, DUP: total=1.00GiB, used=112.00KiB Metadata, single: total=8.00MiB, used=0.00 $ btrfs-debug-tree /dev/sdb3 (...) item 6 key (257 EXTENT_DATA 0) itemoff 15810 itemsize 53 prealloc data disk byte 12845056 nr 1048576 prealloc data offset 0 nr 4096 item 7 key (257 EXTENT_DATA 4096) itemoff 15757 itemsize 53 extent data disk byte 12845056 nr 1048576 extent data offset 4096 nr 102400 ram 1048576 extent compression 0 item 8 key (257 EXTENT_DATA 106496) itemoff 15704 itemsize 53 prealloc data disk byte 12845056 nr 1048576 prealloc data offset 106496 nr 90112 item 9 key (257 EXTENT_DATA 196608) itemoff 15651 itemsize 53 extent data disk byte 12845056 nr 1048576 extent data offset 196608 nr 106496 ram 1048576 extent compression 0 item 10 key (257 EXTENT_DATA 303104) itemoff 15598 itemsize 53 prealloc data disk byte 12845056 nr 1048576 prealloc data offset 303104 nr 593920 item 11 key (257 EXTENT_DATA 897024) itemoff 15545 itemsize 53 extent data disk byte 12845056 nr 1048576 extent data offset 897024 nr 106496 ram 1048576 extent compression 0 item 12 key (257 EXTENT_DATA 1003520) itemoff 15492 itemsize 53 prealloc data disk byte 12845056 nr 1048576 prealloc data offset 1003520 nr 45056 (...) Now defragmenting the file results in more data space used than before: $ btrfs filesystem defragment -f foobar && sync $ btrfs filesystem df /mnt Data, single: total=8.00MiB, used=1.55MiB System, DUP: total=8.00MiB, used=16.00KiB System, single: total=4.00MiB, used=0.00 Metadata, DUP: total=1.00GiB, used=112.00KiB Metadata, single: total=8.00MiB, used=0.00 And the corresponding file extent items are now no longer perfectly sequential as before, and we're now needlessly using more space from data block groups: $ btrfs-debug-tree /dev/sdb3 (...) item 6 key (257 EXTENT_DATA 0) itemoff 15810 itemsize 53 extent data disk byte 12845056 nr 1048576 extent data offset 0 nr 4096 ram 1048576 extent compression 0 item 7 key (257 EXTENT_DATA 4096) itemoff 15757 itemsize 53 extent data disk byte 13893632 nr 102400 extent data offset 0 nr 102400 ram 102400 extent compression 0 item 8 key (257 EXTENT_DATA 106496) itemoff 15704 itemsize 53 extent data disk byte 12845056 nr 1048576 extent data offset 106496 nr 90112 ram 1048576 extent compression 0 item 9 key (257 EXTENT_DATA 196608) itemoff 15651 itemsize 53 extent data disk byte 13996032 nr 106496 extent data offset 0 nr 106496 ram 106496 extent compression 0 item 10 key (257 EXTENT_DATA 303104) itemoff 15598 itemsize 53 prealloc data disk byte 12845056 nr 1048576 prealloc data offset 303104 nr 593920 item 11 key (257 EXTENT_DATA 897024) itemoff 15545 itemsize 53 extent data disk byte 14102528 nr 106496 extent data offset 0 nr 106496 ram 106496 extent compression 0 item 12 key (257 EXTENT_DATA 1003520) itemoff 15492 itemsize 53 extent data disk byte 12845056 nr 1048576 extent data offset 1003520 nr 45056 ram 1048576 extent compression 0 (...) With this change, the above example will no longer cause allocation of new data space nor change the sequentiality of the file extents, that is, defragment will be effectless, leaving all extent items pointing to the extent starting at disk byte 12845056. In a 20Gb filesystem I had, mounted with the autodefrag option and 20 files of 400Mb each, initially consisting of a single prealloc extent of 400Mb, having random writes happening at a low rate, lead to a total of over ~17Gb of data space used, not far from eventually reaching an ENOSPC state. Signed-off-by: Filipe David Borba Manana --- fs/btrfs/ioctl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index f914b5d..1ae45bd 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c @@ -983,7 +983,8 @@ static bool defrag_check_next_extent(struct inode *inode, struct extent_map *em) return false; next = defrag_lookup_extent(inode, em->start + em->len); - if (!next || next->block_start >= EXTENT_MAP_LAST_BYTE) + if (!next || next->block_start >= EXTENT_MAP_LAST_BYTE || + (em->block_start + em->block_len == next->block_start)) ret = false; free_extent_map(next); -- 1.7.9.5 From andrew@digital-domain.net Sat Mar 1 07:47:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4739E7F54 for ; Sat, 1 Mar 2014 07:47:13 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D944FAC008 for ; Sat, 1 Mar 2014 05:47:09 -0800 (PST) X-ASG-Debug-ID: 1393681626-04bdf05dab16d610001-NocioJ Received: from a.painless.aa.net.uk (a.painless.aa.net.uk [81.187.30.51]) by cuda.sgi.com with ESMTP id FpeKFdgYZHn3rTBI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Mar 2014 05:47:07 -0800 (PST) X-Barracuda-Envelope-From: andrew@digital-domain.net X-Barracuda-Apparent-Source-IP: 81.187.30.51 Received: from tau.digital-domain.net ([217.169.2.54] helo=omega.digital-domain.net) by a.painless.aa.net.uk with esmtp (Exim 4.77) (envelope-from ) id 1WJkFr-0007dG-C7; Sat, 01 Mar 2014 13:47:05 +0000 From: Andrew Clayton To: xfs@oss.sgi.com Cc: Andrew Clayton Subject: [PATCH] man: xfs_repair.8: Fix a grammatical error Date: Sat, 1 Mar 2014 13:46:40 +0000 X-ASG-Orig-Subj: [PATCH] man: xfs_repair.8: Fix a grammatical error Message-Id: <1393681600-13098-1-git-send-email-andrew@digital-domain.net> X-Mailer: git-send-email 1.8.5.3 X-Barracuda-Connect: a.painless.aa.net.uk[81.187.30.51] X-Barracuda-Start-Time: 1393681627 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145636 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Fix an issue in the -o force_geometry suboption text. Signed-off-by: Andrew Clayton --- man/man8/xfs_repair.8 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/man/man8/xfs_repair.8 b/man/man8/xfs_repair.8 index ed20fb7..b7c2d8c 100644 --- a/man/man8/xfs_repair.8 +++ b/man/man8/xfs_repair.8 @@ -144,7 +144,7 @@ reduce repair times on concat based filesystems. .BI force_geometry Check the filesystem even if geometry information could not be validated. Geometry information can not be validated if only a single allocation -group and exist and thus we do not have a backup superblock available, or +group exists and thus we do not have a backup superblock available, or if there are two allocation groups and the two superblocks do not agree on the filesystem geometry. Only use this option if you validated the geometry yourself and know what you are doing. If In doubt run -- 1.8.5.3 From abouzaid@ncb.ly Sat Mar 1 11:39:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=HTML_FONT_LOW_CONTRAST, HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 67C687F54 for ; Sat, 1 Mar 2014 11:39:18 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E4D6BAC004 for ; Sat, 1 Mar 2014 09:39:14 -0800 (PST) X-ASG-Debug-ID: 1393695547-04cbb066e416f5d0001-NocioJ Received: from vweb8.lttnet.net (62.240.36.43.static.ltt.ly [62.240.36.43]) by cuda.sgi.com with ESMTP id JZHFbPftV51jYemn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Mar 2014 09:39:08 -0800 (PST) X-Barracuda-Envelope-From: abouzaid@ncb.ly X-Barracuda-Apparent-Source-IP: 62.240.36.43 Received: from [202.109.114.192] (port=3037 helo=tyyug) by vweb8.lttnet.net with esmtpa (Exim 4.80.1) (envelope-from ) id 1WJnsO-0000Jc-NO for xfs@oss.sgi.com; Sat, 01 Mar 2014 19:39:06 +0200 Message-ID: <38753066C56B43E9B1A30076ECA8E316@lbfypj> From: "Ralph Poquette" To: "xfs" Subject: =?windows-1251?B?eGZzQG9zcy5zZ2kuY29tLCDn4Oru6+7y6PL8?= =?windows-1251?B?IO3gIOHo7eDw7fv1IO7v9uju7eD1ISEsIN3x?= =?windows-1251?B?y8LOxw==?= Date: Sat, 1 Mar 2014 18:39:15 +0100 X-ASG-Orig-Subj: =?windows-1251?B?eGZzQG9zcy5zZ2kuY29tLCDn4Oru6+7y6PL8?= =?windows-1251?B?IO3gIOHo7eDw7fv1IO7v9uju7eD1ISEsIN3x?= =?windows-1251?B?y8LOxw==?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_1278_01CF357D.8C4EEAC0" X-Priority: 3 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vweb8.lttnet.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - ncb.ly X-Get-Message-Sender-Via: vweb8.lttnet.net: authenticated_id: abouzaid@ncb.ly X-Barracuda-Connect: 62.240.36.43.static.ltt.ly[62.240.36.43] X-Barracuda-Start-Time: 1393695548 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.34 X-Barracuda-Spam-Status: No, SCORE=1.34 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_INVIS_TEXT_2K, BSF_SC0_TG035a, BSF_SC0_TG163d, HTML_FONT_LOW_CONTRAST, HTML_MESSAGE, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145640 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.54 HTML_FONT_LOW_CONTRAST BODY: HTML font color similar to background 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 0.00 BSF_SC0_TG035a Message contains invalid style definition 0.10 BSF_SC0_INVIS_TEXT_2K Custom Rule BSF_SC0_INVIS_TEXT_2K 0.50 BSF_SC0_TG163d Custom Rule TG163d This is a multi-part message in MIME format. ------=_NextPart_000_1278_01CF357D.8C4EEAC0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =EE=EA=E0=E7=E0=F2=FC=F1=FF =F4=E8=EDa=ED=F1=EE=E2=EE =ED=E5=E7a=E2=E8=F1= =E8=EC=FB=EC =E8 =EE=E1=E5=F1=EF=E5=F7=E5=ED=ED=FB=EC =D3=E7=ED=E0=F2=FC =EF=EE=E4=F0=EE=E1=ED=EE=F1=F2=E8... http://goo.gl/rHiGke=20 - =CD=F3 =F1=EB=E0=E2=E0 =E1=EE=E3=F3, - =F1 =EE=E1=EB=E5=E3=F7=E5=ED=E8=E5= =EC =E2=E7=E4=EE=F5=ED=F3=EB =C2=E8=EA=F2=EE=F0. - =CE=F7=ED=F3=EB=E0=F1=FC= .=20 - =DD=F2=EE =EC=EE=E9 =E1=FB=E2=F8=E8=E9 =EE=E4=ED=EE=EA=F3=F0=F1=ED=E8=EA= , =EA=EE=E3=E4=E0-=F2=EE =F1=EC=E5=E2=F8=E8=E9 =ED=E0=E7=FB=E2=E0=F2=FC =EC= =E5=ED=FF =F1=E2=EE=E8=EC =E4=F0=F3=E3=EE=EC, - =EA=EE=F0=EE=F2=EA=EE =EF= =EE=FF=F1=ED=E8=EB=E0 =FF =F1=E2=EE=E8=EC =F1=EF=F3=F2=ED=E8=EA=E0=EC. =CD= =E5=F2, =ED=F3 =EA=E0=EA=EE=E2 =ED=E0=F5=E0=EB!=20 =D7=F3=E2=F1=F2=E2=EE =F1=F2=F0=E0=F5=E0 =EA =EC=E5=EB=EA=E8=EC =E3=F0=FB= =E7=F3=ED=E0=EC, =E2=E8=E4=E8=EC=EE, =CA=E0=F9=E5=FE =E1=FB=EB=EE =ED=E5=E2= =E5=E4=EE=EC=EE, =EF=EE=F2=EE=EC=F3 =F7=F2=EE =EE=ED =F1=EB=E8=F8=EA=EE=EC= =E4=EE=EB=E3=EE =F1=EE=EE=E1=F0=E0=E6=E0=EB =EE =EF=F0=E8=F7=E8=ED=E0=F5= =EC=EE=E5=E3=EE =F1=F2=EE=EB=FC =ED=E5=E0=E4=E5=EA=E2=E0=F2=ED=EE=E3=EE = =EF=EE=E2=E5=E4=E5=ED=E8=FF, =ED=EE =ED=E0=EA=EE=ED=E5=F6 =F3 =ED=E5=E3=EE= =F5=E2=E0=F2=E8=EB=EE =F3=EC=E0 =EF=F0=EE=F1=EB=E5=E4=E8=F2=FC =E7=E0 =EC= =EE=E8=EC =E2=E7=E3=EB=FF=E4=EE=EC. =CD=E0=E3=EB=EE=E5 =E6=E8=E2=EE=F2=ED= =EE=E5 =EF=F0=EE=E4=EE=EB=E6=E0=EB=EE =F1=E8=E4=E5=F2=FC =E2 =F3=E3=EE=EB= =EE=F7=EA=E5, =EA=E0=EA =EC=ED=E5 =EF=EE=EA=E0=E7=E0=EB=EE=F1=FC, =E7=EB=EE= =F0=E0=E4=ED=EE =F3=F5=EC=FB=EB=FF=FF=F1=FC.=20 =CF=EE=F1=EB=E5=E4=ED=E8=E5 =F1=EB=EE=E2=E0 =E4=EE=E3=EE=E2=EE=F0=E8=F2=FC= =EC=ED=E5 =ED=E5 =E4=E0=EB=E8 - =E2=FB=E4=E2=E8=E3=E0=F2=FC =F3=F1=EB=EE= =E2=E8=FF =E8 =F6=E5=EB=EE=E2=E0=F2=FC=F1=FF =EE=E4=ED=EE=E2=F0=E5=EC=E5=ED= =ED=EE =EE=EA=E0=E7=E0=EB=EE=F1=FC =ED=E5 =EF=EE=E4 =F1=E8=EB=F3 =E4=E0=E6= =E5 =EC=ED=E5. =CC=EE=E8 =F0=F3=EA=E8, =F3=E6=E5 =ED=E5 =F1=EF=F0=E0=F8=E8= =E2=E0=FF =F5=EE=E7=FF=E9=F1=EA=EE=E3=EE =F1=EE=E3=EB=E0=F1=E8=FF, =EE=E1= =F5=E2=E0=F2=E8=EB=E8 =E5=E3=EE =E7=E0 =F8=E5=FE. =C5=E4=E8=ED=F1=F2=E2=E5= =ED=ED=EE=E5, =F7=F2=EE =FF =EF=EE=ED=FF=EB=E0, - =EC=EE=E8 =F3=F1=EB=EE=E2= =E8=FF =ED=E5=F1=EA=EE=EB=FC=EA=EE =F3=F1=F2=E0=F0=E5=EB=E8, =EA=F0=E5=F1= =F2=E8=EA=EE=EC =E2=FB=F8=E8=E2=E0=F2=FC =EC=ED=E5 =E2=F1=E5-=F2=E0=EA=E8= =EF=F0=E8=E4=E5=F2=F1=FF =ED=E0=F3=F7=E8=F2=FC=F1=FF. =C5=F1=EB=E8 =F2=EE= =EB=FC=EA=EE =EE=ED =F1=E8=EB=FC=ED=EE =EF=EE=EF=F0=EE=F1=E8=F2. =CE=F7=E5= =ED=FC =F1=E8=EB=FC=ED=EE =EF=EE=EF=F0=EE=F1=E8=F2.=20 - =D2=FC=F4=F3, =F7=E5=F0=F2! - =E2 =F1=E5=F0=E4=F6=E0=F5 =E2=FB=F0=F3=E3= =E0=EB=F1=FF =EA=ED=FF=E7=FC. - =C0=EB=E5=ED=E0, =FF =EF=FB=F2=E0=FE=F1=FC= =F1=E4=E5=EB=E0=F2=FC =F2=E5=E1=E5 =EF=F0=E5=E4=EB=EE=E6=E5=ED=E8=E5 =F0= =F3=EA=E8 =E8 =F1=E5=F0=E4=F6=E0, =ED=EE =F1 =F2=EE=E1=EE=E9 =E8 =FD=F2=EE= =E3=EE =EF=EE-=F7=E5=EB=EE=E2=E5=F7=E5=F1=EA=E8 =ED=E5 =EF=EE=EB=F3=F7=E0= =E5=F2=F1=FF.=20 =C8 =F1 =FD=F2=E8=EC=E8 =F1=EB=EE=E2=E0=EC=E8 =EE=ED =E1=FB=F1=F2=F0=EE =F0= =E0=E7=E2=E5=F0=ED=F3=EB=F1=FF =E8 =E2=FB=F8=E5=EB, =ED=E5 =EE=F1=F2=E0=E2= =E8=E2 =ED=E0=EC =E2=F0=E5=EC=E5=ED=E8 =ED=E0 =EF=E0=F0=EE=F7=EA=F3 =EE=F7= =E5=ED=FC =E2=EE=EB=ED=F3=FE=F9=E8=F5 =E2=EE=EF=F0=EE=F1=EE=E2. =C3=EE=F1= =F2=E8 =E8 =F1=F2=F0=E0=E6=ED=E8=EA=E8 =F2=EE=E6=E5 =EF=EE=F2=FF=ED=F3=EB= =E8=F1=FC =EA =E2=FB=F5=EE=E4=F3, =ED=E5 =E7=E0=E1=FB=E2 =EF=F0=E8=F5=E2=E0= =F2=E8=F2=FC =F1 =F1=EE=E1=EE=E9 =ED=E0=F8=E8 =E2=E5=F9=E8, =EA=EE=ED=F4=E8= =F1=EA=EE=E2=E0=ED=ED=FB=E5 =EF=F0=E8 =EE=E1=FB=F1=EA=E5, =E2 =F2=EE=EC =F7= =E8=F1=EB=E5 =E8 =EF=F0=EE =EC=E5=F2=EB=F3 =ED=E5 =E7=E0=E1=FB=EB=E8. =DD= =F2=EE, =ED=E0=E2=E5=F0=ED=EE=E5, =F7=F2=EE=E1 =ED=E0=EC =ED=E5 =EF=F0=E8= =F8=EB=E0 =E2 =E3=EE=EB=EE=E2=F3 =EC=FB=F1=EB=FC =F1=EC=FB=F2=FC=F1=FF, =F5= =EE=F2=FF =FF =F1=EE=EC=ED=E5=E2=E0=FE=F1=FC, =F7=F2=EE =F3 =EC=E5=ED=FF = =E2 =E1=EB=E8=E6=E0=E9=F8=E5=E5, =E4=E0 =E8 =ED=E5 =EE=F7=E5=ED=FC, =E2=F0= =E5=EC=FF =E2=EE=E7=ED=E8=EA=ED=E5=F2 =E6=E5=EB=E0=ED=E8=E5 =EF=EE=EB=E5=F2= =E0=F2=FC.=20 - =CD=E8=F7=E5=E3=EE, - =E1=EB=E0=E6=E5=ED=ED=EE =E7=E0=E6=EC=F3=F0=E8=E2= =F8=E8=F1=FC, =EE=F2=E2=E5=F2=E8=EB =EE=ED. - =CA=F1=F2=E0=F2=E8, =F7=F2=EE= =F2=FB =EE=E1 =FD=F2=EE=EC =EA=EE=F0=EE=EB=E5=E2=F1=EA=EE=EC =E4=E5=EB=E5= =E4=F3=EC=E0=E5=F8=FC?=20 =CC=FB =E1=EE=EB=F2=E0=EB=E8 =EE =E2=F1=FF=EA=EE=E9 =E5=F0=F3=ED=E4=E5, =E2= =EF=EB=EE=F2=FC =E4=EE =F0=E0=E7=ED=EE=E2=E8=E4=ED=EE=F1=F2=E5=E9 =EA=E2=E0= =F8=E5=ED=EE=E9 =EA=E0=EF=F3=F1=F2=FB =E8 =F0=E5=F6=E5=EF=F2=EE=E2 =E5=E5= =EF=F0=E8=E3=EE=F2=EE=E2=EB=E5=ED=E8=FF. =CF=F0=E8=F7=E5=EC =FD=F2=E0 =F2= =E5=EC=E0 =E2=FB=E7=E2=E0=EB=E0 =ED=E0 =F3=E4=E8=E2=EB=E5=ED=E8=E5 =EE=E6= =E5=F1=F2=EE=F7=E5=ED=ED=FB=E5 =F1=EF=EE=F0=FB. =CC=FB =ED=E5 =F1=EE=F8=EB= =E8=F1=FC =ED=E5 =F2=EE=EB=FC=EA=EE =E2=EE =E2=EA=F3=F1=E0=F5 =FD=F2=EE=E3= =EE =EF=F0=EE=F1=F2=E5=F6=EA=EE=E3=EE, =ED=EE =F7=E5=F0=F2=EE=E2=F1=EA=E8= =ED=E5=EE=E1=F5=EE=E4=E8=EC=EE=E3=EE =E2 =EB=FE=E1=EE=EC =F3=E2=E0=E6=E0= =FE=F9=E5=EC =F1=E5=E1=FF =E4=EE=EC=E5 =E1=EB=FE=E4=E0, =ED=EE =E8 =E2 =F1= =EF=EE=F1=EE=E1=E0=F5 =F1=EE=E1=F1=F2=E2=E5=ED=ED=EE =F1=E0=EC=EE=E3=EE =EA= =E2=E0=F8=E5=ED=E8=FF. =DF =F3=F2=E2=E5=F0=E6=E4=E0=EB=E0, =F7=F2=EE =EB=F3= =F7=F8=E5 =E2=F1=E5=E3=EE =EA=E2=E0=F1=E8=F2=FC =EA=E0=EF=F3=F1=F2=F3 =F1= =EA=EB=FE=EA=E2=EE=E9, =EA=ED=FF=E7=FC =E6=E5 =ED=E0=F1=F2=E0=E8=E2=E0=EB= =ED=E0 =EE=E1=FF=E7=E0=F2=E5=EB=FC=ED=EE=EC =EF=F0=E8=F1=F3=F2=F1=F2=E2=E8= =E8 =F1=EB=E0=E4=EA=EE=E3=EE =E8 =E3=EE=F0=FC=EA=EE=E3=EE =EF=E5=F0=F6=E0= (=F2=EE=E6=E5 =EC=ED=E5 =EB=FE=E1=E8=F2=E5=EB=FC =EA=EE=ED=F2=F0=E0=F1=F2= =EE=E2!). =CF=F0=E5=E4=F1=F2=E0=E2=E8=F2=FC =CA=E0=F9=E5=FF =F0=FF=E4=EE=EC= =F1 =EA=E0=E4=EA=EE=E9 =E7=E0 =EA=F0=EE=F8=E5=ED=E8=E5=EC =EA=EE=F7=E0=ED= =EE=E2 =F3 =EC=E5=ED=FF =ED=E5 =EF=EE=EB=F3=F7=E8=EB=EE=F1=FC, =ED=EE =EC= =FB =E4=EE=F1=EF=EE=F0=E8=EB=E8=F1=FC =E4=EE =F2=EE=E3=EE, =F7=F2=EE =F0=E5= =F8=E8=EB=E8 =EF=F0=EE=E2=E5=F0=E8=F2=FC =E2=F1=E5 =EE=EF=FB=F2=ED=FB=EC = =EF=F3=F2=E5=EC, =EF=F0=E8=F7=E5=EC =ED=E0 =EA=EE=EC-=ED=E8=E1=F3=E4=FC =F2= =F0=E5=F2=FC=E5=EC, =ED=E5 =E7=E0=E8=ED=F2=E5=F0=E5=F1=EE=E2=E0=ED=ED=EE=EC= =E2 =F0=E5=E7=F3=EB=FC=F2=E0=F2=E0=F5 =ED=E0=F8=E8=F5 =EA=F3=EB=E8=ED=E0= =F0=ED=FB=F5 =E4=E5=E1=E0=F2=EE=E2 =EB=E8=F6=E5. =C1=EB=E0=E3=EE =E2 =E7=E0= =EA=F0=EE=EC=E0=F5 =EA=ED=FF=E6=E5=F1=EA=EE=E3=EE =E7=E0=EC=EA=E0 =EF=F0=E8= =F1=F3=F2=F1=F2=E2=EE=E2=E0=EB=E8 =EA=E0=E4=EA=E8 =F1 =EE=E1=EE=E8=EC=E8 = =E2=E8=E4=E0=EC=E8 =EA=E0=EF=F3=F1=F2=FB.=20 - =CD=EE, =ED=EE, =F2=EE=EB=FC=EA=EE =E1=E5=E7 =F0=F3=EA! - =D1=E5=ED=FC=EA= =E0 =EF=EE=EF=FF=F2=E8=EB=F1=FF =EF=EE=E4 =F1=EF=E0=F1=E8=F2=E5=EB=FC=ED=FB= =E9 =EF=EE=EB=EE=E3 =EA=F0=EE=E2=E0=F2=E8 =E8 =E7=E0=F2=E0=E8=EB=F1=FF =F2= =E0=EC, =EE=E1=E8=E6=E5=ED=ED=EE =F1=E2=E5=F0=EA=E0=FF =E3=EB=E0=E7=E8=F9= =E0=EC=E8.=20 - =D7=F2=EE, =ED=E5 =E6=E4=E0=EB=E8? - =EC=F0=E0=F7=ED=EE =F1=EF=F0=EE=F1= =E8=EB=E0 =FF, =EE=E4=E5=F0=E3=E8=E2=E0=FF =EF=EE=F2=FF=ED=F3=E2=F8=F3=FE= =F1=FF =EA =EF=F0=E8=E2=FF=E7=E0=ED=ED=FB=EC =E6=E5=F0=E5=E1=F6=E0=EC =ED= =E0 =E4=F0=F3=E3=EE=E9 =F1=F2=EE=F0=EE=ED=E5 =EF=EE=EB=FF=ED=FB =EB=EE=F8= =E0=E4=FC. ------=_NextPart_000_1278_01CF357D.8C4EEAC0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=EE=EA=E0=E7=E0=F2=FC=F1=FF= =F4=E8=EDa=ED=F1=EE=E2=EE =ED=E5=E7a=E2=E8=F1=E8=EC=FB=EC =E8 =EE=E1=E5=F1= =EF=E5=F7=E5=ED=ED=FB=EC
=D3=E7=ED=E0=F2=FC =EF=EE=E4=F0=EE=E1=ED=EE= =F1=F2=E8...
 
 
- =CD=F3 =F1=EB=E0=E2=E0= =E1=EE=E3=F3, - =F1 =EE=E1=EB=E5=E3=F7=E5=ED=E8=E5=EC =E2=E7=E4=EE=F5=ED= =F3=EB =C2=E8=EA=F2=EE=F0. - =CE=F7=ED=F3=EB=E0=F1=FC.=20
- =DD=F2=EE =EC=EE=E9 =E1= =FB=E2=F8=E8=E9 =EE=E4=ED=EE=EA=F3=F0=F1=ED=E8=EA, =EA=EE=E3=E4=E0-=F2=EE= =F1=EC=E5=E2=F8=E8=E9 =ED=E0=E7=FB=E2=E0=F2=FC =EC=E5=ED=FF =F1=E2=EE=E8= =EC =E4=F0=F3=E3=EE=EC, - =EA=EE=F0=EE=F2=EA=EE =EF=EE=FF=F1=ED=E8=EB=E0 = =FF =F1=E2=EE=E8=EC =F1=EF=F3=F2=ED=E8=EA=E0=EC. =CD=E5=F2, =ED=F3 =EA=E0= =EA=EE=E2 =ED=E0=F5=E0=EB!=20
=D7=F3=E2=F1=F2=E2=EE =F1= =F2=F0=E0=F5=E0 =EA =EC=E5=EB=EA=E8=EC =E3=F0=FB=E7=F3=ED=E0=EC, =E2=E8=E4= =E8=EC=EE, =CA=E0=F9=E5=FE =E1=FB=EB=EE =ED=E5=E2=E5=E4=EE=EC=EE, =EF=EE=F2= =EE=EC=F3 =F7=F2=EE =EE=ED =F1=EB=E8=F8=EA=EE=EC =E4=EE=EB=E3=EE =F1=EE=EE= =E1=F0=E0=E6=E0=EB =EE =EF=F0=E8=F7=E8=ED=E0=F5 =EC=EE=E5=E3=EE =F1=F2=EE= =EB=FC =ED=E5=E0=E4=E5=EA=E2=E0=F2=ED=EE=E3=EE =EF=EE=E2=E5=E4=E5=ED=E8=FF= , =ED=EE =ED=E0=EA=EE=ED=E5=F6 =F3 =ED=E5=E3=EE =F5=E2=E0=F2=E8=EB=EE =F3= =EC=E0 =EF=F0=EE=F1=EB=E5=E4=E8=F2=FC =E7=E0 =EC=EE=E8=EC =E2=E7=E3=EB=FF= =E4=EE=EC. =CD=E0=E3=EB=EE=E5 =E6=E8=E2=EE=F2=ED=EE=E5 =EF=F0=EE=E4=EE=EB= =E6=E0=EB=EE =F1=E8=E4=E5=F2=FC =E2 =F3=E3=EE=EB=EE=F7=EA=E5, =EA=E0=EA =EC= =ED=E5 =EF=EE=EA=E0=E7=E0=EB=EE=F1=FC, =E7=EB=EE=F0=E0=E4=ED=EE =F3=F5=EC= =FB=EB=FF=FF=F1=FC.=20
=CF=EE=F1=EB=E5=E4=ED=E8= =E5 =F1=EB=EE=E2=E0 =E4=EE=E3=EE=E2=EE=F0=E8=F2=FC =EC=ED=E5 =ED=E5 =E4=E0= =EB=E8 - =E2=FB=E4=E2=E8=E3=E0=F2=FC =F3=F1=EB=EE=E2=E8=FF =E8 =F6=E5=EB=EE= =E2=E0=F2=FC=F1=FF =EE=E4=ED=EE=E2=F0=E5=EC=E5=ED=ED=EE =EE=EA=E0=E7=E0=EB= =EE=F1=FC =ED=E5 =EF=EE=E4 =F1=E8=EB=F3 =E4=E0=E6=E5 =EC=ED=E5. =CC=EE=E8= =F0=F3=EA=E8, =F3=E6=E5 =ED=E5 =F1=EF=F0=E0=F8=E8=E2=E0=FF =F5=EE=E7=FF=E9= =F1=EA=EE=E3=EE =F1=EE=E3=EB=E0=F1=E8=FF, =EE=E1=F5=E2=E0=F2=E8=EB=E8 =E5= =E3=EE =E7=E0 =F8=E5=FE. =C5=E4=E8=ED=F1=F2=E2=E5=ED=ED=EE=E5, =F7=F2=EE = =FF =EF=EE=ED=FF=EB=E0, - =EC=EE=E8 =F3=F1=EB=EE=E2=E8=FF =ED=E5=F1=EA=EE= =EB=FC=EA=EE =F3=F1=F2=E0=F0=E5=EB=E8, =EA=F0=E5=F1=F2=E8=EA=EE=EC =E2=FB= =F8=E8=E2=E0=F2=FC =EC=ED=E5 =E2=F1=E5-=F2=E0=EA=E8 =EF=F0=E8=E4=E5=F2=F1= =FF =ED=E0=F3=F7=E8=F2=FC=F1=FF. =C5=F1=EB=E8 =F2=EE=EB=FC=EA=EE =EE=ED =F1= =E8=EB=FC=ED=EE =EF=EE=EF=F0=EE=F1=E8=F2. =CE=F7=E5=ED=FC =F1=E8=EB=FC=ED= =EE =EF=EE=EF=F0=EE=F1=E8=F2.=20
- =D2=FC=F4=F3, =F7=E5=F0= =F2! - =E2 =F1=E5=F0=E4=F6=E0=F5 =E2=FB=F0=F3=E3=E0=EB=F1=FF =EA=ED=FF=E7= =FC. - =C0=EB=E5=ED=E0, =FF =EF=FB=F2=E0=FE=F1=FC =F1=E4=E5=EB=E0=F2=FC =F2= =E5=E1=E5 =EF=F0=E5=E4=EB=EE=E6=E5=ED=E8=E5 =F0=F3=EA=E8 =E8 =F1=E5=F0=E4= =F6=E0, =ED=EE =F1 =F2=EE=E1=EE=E9 =E8 =FD=F2=EE=E3=EE =EF=EE-=F7=E5=EB=EE= =E2=E5=F7=E5=F1=EA=E8 =ED=E5 =EF=EE=EB=F3=F7=E0=E5=F2=F1=FF.=20
=C8 =F1 =FD=F2=E8=EC=E8 = =F1=EB=EE=E2=E0=EC=E8 =EE=ED =E1=FB=F1=F2=F0=EE =F0=E0=E7=E2=E5=F0=ED=F3=EB= =F1=FF =E8 =E2=FB=F8=E5=EB, =ED=E5 =EE=F1=F2=E0=E2=E8=E2 =ED=E0=EC =E2=F0= =E5=EC=E5=ED=E8 =ED=E0 =EF=E0=F0=EE=F7=EA=F3 =EE=F7=E5=ED=FC =E2=EE=EB=ED= =F3=FE=F9=E8=F5 =E2=EE=EF=F0=EE=F1=EE=E2. =C3=EE=F1=F2=E8 =E8 =F1=F2=F0=E0= =E6=ED=E8=EA=E8 =F2=EE=E6=E5 =EF=EE=F2=FF=ED=F3=EB=E8=F1=FC =EA =E2=FB=F5= =EE=E4=F3, =ED=E5 =E7=E0=E1=FB=E2 =EF=F0=E8=F5=E2=E0=F2=E8=F2=FC =F1 =F1=EE= =E1=EE=E9 =ED=E0=F8=E8 =E2=E5=F9=E8, =EA=EE=ED=F4=E8=F1=EA=EE=E2=E0=ED=ED= =FB=E5 =EF=F0=E8 =EE=E1=FB=F1=EA=E5, =E2 =F2=EE=EC =F7=E8=F1=EB=E5 =E8 =EF= =F0=EE =EC=E5=F2=EB=F3 =ED=E5 =E7=E0=E1=FB=EB=E8. =DD=F2=EE, =ED=E0=E2=E5= =F0=ED=EE=E5, =F7=F2=EE=E1 =ED=E0=EC =ED=E5 =EF=F0=E8=F8=EB=E0 =E2 =E3=EE= =EB=EE=E2=F3 =EC=FB=F1=EB=FC =F1=EC=FB=F2=FC=F1=FF, =F5=EE=F2=FF =FF =F1=EE= =EC=ED=E5=E2=E0=FE=F1=FC, =F7=F2=EE =F3 =EC=E5=ED=FF =E2 =E1=EB=E8=E6=E0=E9= =F8=E5=E5, =E4=E0 =E8 =ED=E5 =EE=F7=E5=ED=FC, =E2=F0=E5=EC=FF =E2=EE=E7=ED= =E8=EA=ED=E5=F2 =E6=E5=EB=E0=ED=E8=E5 =EF=EE=EB=E5=F2=E0=F2=FC.=20
- =CD=E8=F7=E5=E3=EE, - = =E1=EB=E0=E6=E5=ED=ED=EE =E7=E0=E6=EC=F3=F0=E8=E2=F8=E8=F1=FC, =EE=F2=E2=E5= =F2=E8=EB =EE=ED. - =CA=F1=F2=E0=F2=E8, =F7=F2=EE =F2=FB =EE=E1 =FD=F2=EE= =EC =EA=EE=F0=EE=EB=E5=E2=F1=EA=EE=EC =E4=E5=EB=E5 =E4=F3=EC=E0=E5=F8=FC?= =20
=CC=FB =E1=EE=EB=F2=E0=EB= =E8 =EE =E2=F1=FF=EA=EE=E9 =E5=F0=F3=ED=E4=E5, =E2=EF=EB=EE=F2=FC =E4=EE = =F0=E0=E7=ED=EE=E2=E8=E4=ED=EE=F1=F2=E5=E9 =EA=E2=E0=F8=E5=ED=EE=E9 =EA=E0= =EF=F3=F1=F2=FB =E8 =F0=E5=F6=E5=EF=F2=EE=E2 =E5=E5 =EF=F0=E8=E3=EE=F2=EE= =E2=EB=E5=ED=E8=FF. =CF=F0=E8=F7=E5=EC =FD=F2=E0 =F2=E5=EC=E0 =E2=FB=E7=E2= =E0=EB=E0 =ED=E0 =F3=E4=E8=E2=EB=E5=ED=E8=E5 =EE=E6=E5=F1=F2=EE=F7=E5=ED=ED= =FB=E5 =F1=EF=EE=F0=FB. =CC=FB =ED=E5 =F1=EE=F8=EB=E8=F1=FC =ED=E5 =F2=EE= =EB=FC=EA=EE =E2=EE =E2=EA=F3=F1=E0=F5 =FD=F2=EE=E3=EE =EF=F0=EE=F1=F2=E5= =F6=EA=EE=E3=EE, =ED=EE =F7=E5=F0=F2=EE=E2=F1=EA=E8 =ED=E5=EE=E1=F5=EE=E4= =E8=EC=EE=E3=EE =E2 =EB=FE=E1=EE=EC =F3=E2=E0=E6=E0=FE=F9=E5=EC =F1=E5=E1= =FF =E4=EE=EC=E5 =E1=EB=FE=E4=E0, =ED=EE =E8 =E2 =F1=EF=EE=F1=EE=E1=E0=F5= =F1=EE=E1=F1=F2=E2=E5=ED=ED=EE =F1=E0=EC=EE=E3=EE =EA=E2=E0=F8=E5=ED=E8=FF= . =DF =F3=F2=E2=E5=F0=E6=E4=E0=EB=E0, =F7=F2=EE =EB=F3=F7=F8=E5 =E2=F1=E5= =E3=EE =EA=E2=E0=F1=E8=F2=FC =EA=E0=EF=F3=F1=F2=F3 =F1 =EA=EB=FE=EA=E2=EE= =E9, =EA=ED=FF=E7=FC =E6=E5 =ED=E0=F1=F2=E0=E8=E2=E0=EB =ED=E0 =EE=E1=FF=E7= =E0=F2=E5=EB=FC=ED=EE=EC =EF=F0=E8=F1=F3=F2=F1=F2=E2=E8=E8 =F1=EB=E0=E4=EA= =EE=E3=EE =E8 =E3=EE=F0=FC=EA=EE=E3=EE =EF=E5=F0=F6=E0 (=F2=EE=E6=E5 =EC=ED= =E5 =EB=FE=E1=E8=F2=E5=EB=FC =EA=EE=ED=F2=F0=E0=F1=F2=EE=E2!). =CF=F0=E5=E4= =F1=F2=E0=E2=E8=F2=FC =CA=E0=F9=E5=FF =F0=FF=E4=EE=EC =F1 =EA=E0=E4=EA=EE= =E9 =E7=E0 =EA=F0=EE=F8=E5=ED=E8=E5=EC =EA=EE=F7=E0=ED=EE=E2 =F3 =EC=E5=ED= =FF =ED=E5 =EF=EE=EB=F3=F7=E8=EB=EE=F1=FC, =ED=EE =EC=FB =E4=EE=F1=EF=EE=F0= =E8=EB=E8=F1=FC =E4=EE =F2=EE=E3=EE, =F7=F2=EE =F0=E5=F8=E8=EB=E8 =EF=F0=EE= =E2=E5=F0=E8=F2=FC =E2=F1=E5 =EE=EF=FB=F2=ED=FB=EC =EF=F3=F2=E5=EC, =EF=F0= =E8=F7=E5=EC =ED=E0 =EA=EE=EC-=ED=E8=E1=F3=E4=FC =F2=F0=E5=F2=FC=E5=EC, =ED= =E5 =E7=E0=E8=ED=F2=E5=F0=E5=F1=EE=E2=E0=ED=ED=EE=EC =E2 =F0=E5=E7=F3=EB=FC= =F2=E0=F2=E0=F5 =ED=E0=F8=E8=F5 =EA=F3=EB=E8=ED=E0=F0=ED=FB=F5 =E4=E5=E1=E0= =F2=EE=E2 =EB=E8=F6=E5. =C1=EB=E0=E3=EE =E2 =E7=E0=EA=F0=EE=EC=E0=F5 =EA=ED= =FF=E6=E5=F1=EA=EE=E3=EE =E7=E0=EC=EA=E0 =EF=F0=E8=F1=F3=F2=F1=F2=E2=EE=E2= =E0=EB=E8 =EA=E0=E4=EA=E8 =F1 =EE=E1=EE=E8=EC=E8 =E2=E8=E4=E0=EC=E8 =EA=E0= =EF=F3=F1=F2=FB.=20
- =CD=EE, =ED=EE, =F2=EE= =EB=FC=EA=EE =E1=E5=E7 =F0=F3=EA! - =D1=E5=ED=FC=EA=E0 =EF=EE=EF=FF=F2=E8= =EB=F1=FF =EF=EE=E4 =F1=EF=E0=F1=E8=F2=E5=EB=FC=ED=FB=E9 =EF=EE=EB=EE=E3 = =EA=F0=EE=E2=E0=F2=E8 =E8 =E7=E0=F2=E0=E8=EB=F1=FF =F2=E0=EC, =EE=E1=E8=E6= =E5=ED=ED=EE =F1=E2=E5=F0=EA=E0=FF =E3=EB=E0=E7=E8=F9=E0=EC=E8.=20
- =D7=F2=EE, =ED=E5 =E6=E4= =E0=EB=E8? - =EC=F0=E0=F7=ED=EE =F1=EF=F0=EE=F1=E8=EB=E0 =FF, =EE=E4=E5=F0= =E3=E8=E2=E0=FF =EF=EE=F2=FF=ED=F3=E2=F8=F3=FE=F1=FF =EA =EF=F0=E8=E2=FF=E7= =E0=ED=ED=FB=EC =E6=E5=F0=E5=E1=F6=E0=EC =ED=E0 =E4=F0=F3=E3=EE=E9 =F1=F2= =EE=F0=EE=ED=E5 =EF=EE=EB=FF=ED=FB =EB=EE=F8=E0=E4=FC.=20
=C8=E4=E5=E9 =EF=EE=EB=F3=F7=F8=E5, =E5=F1=F2=E5=F1=F2=E2=E5=ED=ED= =EE, =ED=E5 =E1=FB=EB=EE. =D1=EE=E1=F1=F2=E2=E5=ED=ED=EE, =E8=E4=E5=E9 =ED= =E5 =E1=FB=EB=EE =E2=EE=EE=E1=F9=E5, =ED=E8=EA=E0=EA=E8=F5.
<= /DIV>
------=_NextPart_000_1278_01CF357D.8C4EEAC0-- From sandeen@sandeen.net Sat Mar 1 14:42:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2B9B67F54 for ; Sat, 1 Mar 2014 14:42:44 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0B9E78F8037 for ; Sat, 1 Mar 2014 12:42:43 -0800 (PST) X-ASG-Debug-ID: 1393706561-04cbb066e41784a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id spzZlYuC2riIz5fC for ; Sat, 01 Mar 2014 12:42:42 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 99221617803E; Sat, 1 Mar 2014 14:42:41 -0600 (CST) Message-ID: <53124642.9040805@sandeen.net> Date: Sat, 01 Mar 2014 14:42:42 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Andrew Clayton , xfs@oss.sgi.com Subject: Re: [PATCH] man: xfs_repair.8: Fix a grammatical error References: <1393681600-13098-1-git-send-email-andrew@digital-domain.net> X-ASG-Orig-Subj: Re: [PATCH] man: xfs_repair.8: Fix a grammatical error In-Reply-To: <1393681600-13098-1-git-send-email-andrew@digital-domain.net> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1393706562 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145643 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/1/14, 7:46 AM, Andrew Clayton wrote: > Fix an issue in the -o force_geometry suboption text. > > Signed-off-by: Andrew Clayton thanks, Reviewed-by: Eric Sandeen > --- > man/man8/xfs_repair.8 | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/man/man8/xfs_repair.8 b/man/man8/xfs_repair.8 > index ed20fb7..b7c2d8c 100644 > --- a/man/man8/xfs_repair.8 > +++ b/man/man8/xfs_repair.8 > @@ -144,7 +144,7 @@ reduce repair times on concat based filesystems. > .BI force_geometry > Check the filesystem even if geometry information could not be validated. > Geometry information can not be validated if only a single allocation > -group and exist and thus we do not have a backup superblock available, or > +group exists and thus we do not have a backup superblock available, or From david@fromorbit.com Sun Mar 2 19:03:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9988C29DF7 for ; Sun, 2 Mar 2014 19:03:28 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0DF8BAC002 for ; Sun, 2 Mar 2014 17:03:24 -0800 (PST) X-ASG-Debug-ID: 1393808602-04cbb066e71b1380001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id CBveUQGixFC89x3E for ; Sun, 02 Mar 2014 17:03:23 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag5bAMvTE1N5LJYePGdsb2JhbABagwaDQ4UMszeFWYEYFwMBAQEBHxkNKIIlAQEFJxMNDyMQCAMOCgklDwUlAwcaE4d4r2icIxcWjkMHhDgEmDuKVYsYKA Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Mar 2014 11:33:21 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WKHHq-00021G-8f; Mon, 03 Mar 2014 12:03:18 +1100 Date: Mon, 3 Mar 2014 12:03:18 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: check all buffers in xfs_check_page_type() Message-ID: <20140303010318.GG13647@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: check all buffers in xfs_check_page_type() References: <1393615369-41882-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1393615369-41882-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1393808602 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145679 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Feb 28, 2014 at 02:22:49PM -0500, Brian Foster wrote: > xfs_aops_discard_page() was introduced in the following commit: > > xfs: truncate delalloc extents when IO fails in writeback > > ... to clean up left over delalloc ranges after I/O failure in > ->writepage(). generic/224 tests for this scenario and occasionally > reproduces panics on sub-4k blocksize filesystems. > > The cause of this is failure to clean up the delalloc range on a > page where the first buffer does not match one of the expected > states of xfs_check_page_type(). If a buffer is not unwritten, > delayed or dirty&mapped, xfs_check_page_type() stops and > immediately returns 0. > > The stress test of generic/224 creates a scenario where the first > several buffers of a page with delayed buffers are mapped&uptodate > and some subsequent buffer is delayed. If the ->writepage() happens > to fail for this page, xfs_aops_discard_page() incorrectly skips > the entire page. > > Modify xfs_aops_discard_page() to iterate all of the page buffers > to ensure a delayed buffer does not go undetected. > > Signed-off-by: Brian Foster > --- > > The only other caller to xfs_check_page_type() is xfs_convert_page(). I > think this is safe with respect to that codepath, given the additional > imap checks therein and whatnot, but thoughts appreciated. Just to close the loop ifor everyone else on the IRC discussion Brian and I had - removing the break statement is likely to cause problems with xfs_convert_page(). What xfs_convert_page() assumes is that xfs_check_page_type() will return true iff the first iand subsequent buffers on the page match the given type and can be written back. Skipping over buffers that have unknown contents is incorrect behaviour - if the first buffer on the page is unmapped, then it should break and return false. However, xfs_aops_discard_page() requires it to check all buffers on the page for delalloc state so that we can punch them correctly, and so breaking out at the first unwriteable buffer is a bug. Hence to fix this, we need to change the way xfs_convert_page() works. It needs to stop processing buffesr in it's main loop whenever "done" gets set so that it stops at the same point that xfs_check_page_type() stops checking the buffers on the page. Once that is done, then we can modify xfs_check_page_type() to return true when it finds the first buffer of a given type on the page or false if it finds an unmapped buffer and we are looking for IO_DELALLOC.... And it needs a decent set of comments, too :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Mar 2 22:43:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E6F2C29DF7 for ; Sun, 2 Mar 2014 22:43:55 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id BA765304032 for ; Sun, 2 Mar 2014 20:43:52 -0800 (PST) X-ASG-Debug-ID: 1393821829-04cbb066e71b8b00001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id ODMBRdUlngXuCyCY for ; Sun, 02 Mar 2014 20:43:50 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtydAJkHFFN5LJYePGdsb2JhbABagwY7gwiFDKAjBJMQhnQXAwEBAQEfGQ0ogmYcOyQ0BSUDBy2HeJw9r3cWjWx0ghgPgXsEmDuVbSiBLQ Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Mar 2014 15:13:49 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WKKjD-0002UA-BC for xfs@oss.sgi.com; Mon, 03 Mar 2014 15:43:47 +1100 Date: Mon, 3 Mar 2014 15:43:47 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [ANNOUNCE] xfsprogs: master branch updated to 48733b2 Message-ID: <20140303044347.GH13647@dastard> X-ASG-Orig-Subj: [ANNOUNCE] xfsprogs: master branch updated to 48733b2 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1393821830 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145683 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The xfsprogs repository at git://oss.sgi.com/xfs/cmds/xfsprogs has just been updated. The new head of the master branch is commit: 48733b2 xfs_repair.8: Fix a grammatical error New Commits: Andrew Clayton (1): [48733b2] xfs_repair.8: Fix a grammatical error Dave Chinner (14): [9718fa2] mkfs: default log size for small filesystems too large [0aa7d59] mkfs: proto file creation does not set ftype correctly [beed0dc] repair: translation lookups limit scalability [586f8ab] repair: per AG locks contend for cachelines [602dcc0] libxfs: buffer cache hashing is suboptimal [12b55ba] repair: limit auto-striding concurrency apprpriately [1177f66] repair: use a listhead for the dotdot list [004e18d] repair: fix prefetch queue limiting [1c88e98] repair: BMBT prefetch needs to be CRC aware [1164bde] repair: factor out threading setup code [71014d1] repair: prefetch runs too far ahead [0c6b1ca] metadump: contiguous metadata object need to be split [fd49185] metadump: Only verify obfuscated metadata being dumped [f63c754] metadump: pathname obfuscation overruns symlink buffer Eric Sandeen (7): [4e11214] xfs_metadump: include F in getopts string [a872b62] xfs_copy: band-aids for CRC filesystems [a223e63] xfs_logprint: Don't error out after split items lose context [81c4920] xfs_logprint: don't advance op counter in xlog_print_trans_icreate [617c3c2] xfs_io: add missing break in O_TMPFILE case [ade06f8] xfs_io: test for invalid -Tr flag combination before open [17d7016] xfs_growfs: don't grow data if only -m is specified Lukas Czerner (1): [938904c] xfs_io: add fzero command for zeroing range via fallocate Code Diffstat: copy/xfs_copy.c | 18 ++++++- db/io.h | 1 + db/metadump.c | 124 ++++++++++++++++++++++++++++++-------------- db/xfs_metadump.sh | 2 +- growfs/xfs_growfs.c | 9 ++-- include/cache.h | 4 +- include/libxfs.h | 1 + io/init.c | 1 + io/open.c | 10 ++-- io/prealloc.c | 44 +++++++++++++++- libxfs/cache.c | 7 ++- libxfs/init.h | 1 - libxfs/rdwr.c | 12 ++++- logprint/log_misc.c | 9 ++-- man/man8/xfs_io.8 | 5 ++ man/man8/xfs_repair.8 | 2 +- mkfs/proto.c | 8 +++ mkfs/xfs_mkfs.c | 48 +++++++++-------- repair/dino_chunks.c | 24 ++++----- repair/dinode.c | 55 ++++++++++++++------ repair/dinode.h | 18 ++++--- repair/globals.h | 5 +- repair/incore.c | 4 +- repair/phase3.c | 40 ++------------- repair/phase4.c | 48 ++--------------- repair/phase6.c | 46 ++++++++--------- repair/prefetch.c | 139 +++++++++++++++++++++++++++++++++++++++++++++++++- repair/prefetch.h | 10 ++++ repair/scan.c | 11 ++-- repair/xfs_repair.c | 23 ++++++++- 30 files changed, 489 insertions(+), 240 deletions(-) -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Sun Mar 2 23:40:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4EE2429DF7 for ; Sun, 2 Mar 2014 23:40:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id C5618AC003 for ; Sun, 2 Mar 2014 21:40:07 -0800 (PST) X-ASG-Debug-ID: 1393825200-04cb6c56771b6e20002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 4UuOZBjzRbyzGFS4 for ; Sun, 02 Mar 2014 21:40:05 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ak5PAJkUFFN5LJYePGdsb2JhbABagwaIT7omFwMBAQEBHxkNKIIlAQEFJy8zCBgxOQMHFBmHeMwlF452hCIErigogS4k Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Mar 2014 16:10:00 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKLbY-0002b8-L7 for xfs@oss.sgi.com; Mon, 03 Mar 2014 16:39:56 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKLbY-00085l-KD for xfs@oss.sgi.com; Mon, 03 Mar 2014 16:39:56 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace Date: Mon, 3 Mar 2014 16:39:53 +1100 X-ASG-Orig-Subj: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace Message-Id: <1393825194-1719-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393825194-1719-1-git-send-email-david@fromorbit.com> References: <1393825194-1719-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1393825204 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145685 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner While the verifier reoutines may return EFSBADCRC when a buffer ahs a bad CRC, we need to translate that to EFSCORRUPTED so that the higher layers treat the error appropriately and so we return a consistent error to userspace. This fixes a xfs/005 regression. Signed-off-by: Dave Chinner --- fs/xfs/xfs_mount.c | 3 +++ fs/xfs/xfs_symlink.c | 4 ++++ fs/xfs/xfs_trans_buf.c | 11 +++++++++++ 3 files changed, 18 insertions(+) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index f96c056..993cb19 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -314,6 +314,9 @@ reread: error = bp->b_error; if (loud) xfs_warn(mp, "SB validate failed with error %d.", error); + /* bad CRC means corrupted metadata */ + if (error == EFSBADCRC) + error = EFSCORRUPTED; goto release_buf; } diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 14e58f2..5fda189 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -80,6 +80,10 @@ xfs_readlink_bmap( if (error) { xfs_buf_ioerror_alert(bp, __func__); xfs_buf_relse(bp); + + /* bad CRC means corrupted metadata */ + if (error == EFSBADCRC) + error = EFSCORRUPTED; goto out; } byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 647b6f1..b8eef05 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -275,6 +275,10 @@ xfs_trans_read_buf_map( XFS_BUF_UNDONE(bp); xfs_buf_stale(bp); xfs_buf_relse(bp); + + /* bad CRC means corrupted metadata */ + if (error == EFSBADCRC) + error = EFSCORRUPTED; return error; } #ifdef DEBUG @@ -338,6 +342,9 @@ xfs_trans_read_buf_map( if (tp->t_flags & XFS_TRANS_DIRTY) xfs_force_shutdown(tp->t_mountp, SHUTDOWN_META_IO_ERROR); + /* bad CRC means corrupted metadata */ + if (error == EFSBADCRC) + error = EFSCORRUPTED; return error; } } @@ -375,6 +382,10 @@ xfs_trans_read_buf_map( if (tp->t_flags & XFS_TRANS_DIRTY) xfs_force_shutdown(tp->t_mountp, SHUTDOWN_META_IO_ERROR); xfs_buf_relse(bp); + + /* bad CRC means corrupted metadata */ + if (error == EFSBADCRC) + error = EFSCORRUPTED; return error; } #ifdef DEBUG -- 1.9.0 From dave@fromorbit.com Sun Mar 2 23:40:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 99B7F29DF7 for ; Sun, 2 Mar 2014 23:40:09 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2AA14AC003 for ; Sun, 2 Mar 2014 21:40:05 -0800 (PST) X-ASG-Debug-ID: 1393825200-04cb6c56771b6e20001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id qqGGZOlWBR4rtg4Y for ; Sun, 02 Mar 2014 21:40:00 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkJPAJkUFFN5LJYePGdsb2JhbABagwaIT7omFwMBAQEBHxkNKIMCO4ECAweIJZxHr3WOdoQiBK4oKA Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Mar 2014 16:10:00 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKLbY-0002b7-Kg for xfs@oss.sgi.com; Mon, 03 Mar 2014 16:39:56 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKLbY-00085J-Ja for xfs@oss.sgi.com; Mon, 03 Mar 2014 16:39:56 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfs: fixes for for-next Date: Mon, 3 Mar 2014 16:39:52 +1100 X-ASG-Orig-Subj: [PATCH 0/2] xfs: fixes for for-next Message-Id: <1393825194-1719-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1393825200 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145685 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, A couple of quick fixes - the new verifier code leaks EFSBADCRC to userspace, so any code that is checking for EFSCORRUPTED is not going to be working correctly. The first patch fixes this regression. The second patch fixes a long standing issues with vmapped RAM potentially causing deadlocks due to GFP_KERNEL allocations being done for page tables inside GFP_NOFS contexts. This will fix many of the lockdep reports about it, but won't get rid of them all. It will, however, guarantee that we won't deadlock due to the problem which is a big step up. Cheers, Dave. From dave@fromorbit.com Sun Mar 2 23:40:12 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 50CA729E06 for ; Sun, 2 Mar 2014 23:40:12 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 14E4A8F8039 for ; Sun, 2 Mar 2014 21:40:08 -0800 (PST) X-ASG-Debug-ID: 1393825205-04bdf05dac1ceb70001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 4yeK2bReU6a5VRnS for ; Sun, 02 Mar 2014 21:40:06 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ak5PAJkUFFN5LJYePGdsb2JhbABagwaIT7omFwMBAQEBHxkNKIIlAQEFJy8zCBgxOQMHFBmHeMwlF411hSMEoxCLGCiBLA Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Mar 2014 16:10:00 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKLbY-0002b9-Lo for xfs@oss.sgi.com; Mon, 03 Mar 2014 16:39:56 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKLbY-00085w-Ke for xfs@oss.sgi.com; Mon, 03 Mar 2014 16:39:56 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/2] xfs: use NOIO contexts for vm_map_ram Date: Mon, 3 Mar 2014 16:39:54 +1100 X-ASG-Orig-Subj: [PATCH 2/2] xfs: use NOIO contexts for vm_map_ram Message-Id: <1393825194-1719-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393825194-1719-1-git-send-email-david@fromorbit.com> References: <1393825194-1719-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1393825205 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145685 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When we map pages in the buffer cache, we can do so in GFP_NOFS contexts. However, the vmap interfaces do not provide any method of communicating this information to memory reclaim, and hence we get lockdep complaining about it regularly and occassionally see hangs that may be vmap related reclaim deadlocks. We can also see these same problems from anywhere where we use vmalloc for a large buffer (e.g. attribute code) inside a transaction context. A typical lockdep report shows up as a reclaim state warning like so: [14046.101458] ================================= [14046.102850] [ INFO: inconsistent lock state ] [14046.102850] 3.14.0-rc4+ #2 Not tainted [14046.102850] --------------------------------- [14046.102850] inconsistent {RECLAIM_FS-ON-W} -> {IN-RECLAIM_FS-W} usage. [14046.102850] kswapd0/14 [HC0[0]:SC0[0]:HE1:SE1] takes: [14046.102850] (&xfs_dir_ilock_class){++++?+}, at: [<791a04bb>] xfs_ilock+0xff/0x16a [14046.102850] {RECLAIM_FS-ON-W} state was registered at: [14046.102850] [<7904cdb1>] mark_held_locks+0x81/0xe7 [14046.102850] [<7904d390>] lockdep_trace_alloc+0x5c/0xb4 [14046.102850] [<790c2c28>] kmem_cache_alloc_trace+0x2b/0x11e [14046.102850] [<790ba7f4>] vm_map_ram+0x119/0x3e6 [14046.102850] [<7914e124>] _xfs_buf_map_pages+0x5b/0xcf [14046.102850] [<7914ed74>] xfs_buf_get_map+0x67/0x13f [14046.102850] [<7917506f>] xfs_attr_rmtval_set+0x396/0x4d5 [14046.102850] [<7916e8bb>] xfs_attr_leaf_addname+0x18f/0x37d [14046.102850] [<7916ed9e>] xfs_attr_set_int+0x2f5/0x3e8 [14046.102850] [<7916eefc>] xfs_attr_set+0x6b/0x74 [14046.102850] [<79168355>] xfs_xattr_set+0x61/0x81 [14046.102850] [<790e5b10>] generic_setxattr+0x59/0x68 [14046.102850] [<790e4c06>] __vfs_setxattr_noperm+0x58/0xce [14046.102850] [<790e4d0a>] vfs_setxattr+0x8e/0x92 [14046.102850] [<790e4ddd>] setxattr+0xcf/0x159 [14046.102850] [<790e5423>] SyS_lsetxattr+0x88/0xbb [14046.102850] [<79268438>] sysenter_do_call+0x12/0x36 Now, we can't completely remove these traces - mainly because vm_map_ram() will do GFP_KERNEL allocation and that generates the above warning before we get into the reclaim code, but we can turn them all into false positive warnings. To do that, use the method that DM and other IO context code uses to avoid this problem: there is a process flag to tell memory reclaim not to do IO that we can set appropriately. That prevents GFP_KERNEL context reclaim being done from deep inside the vmalloc code in places we can't directly pass a GFP_NOFS context to. That interface has a pair of wrapper functions: memalloc_noio_save() and memalloc_noio_restore(). Adding them around vm_map_ram and the vzalloc call in kmem_alloc_large() will prevent deadlocks and most lockdep reports for this issue. Also, convert the vzalloc() call in kmem_alloc_large() to use __vmalloc() so that we can pass the correct gfp context to the data page allocation routine inside __vmalloc() so that it is clear that GFP_NOFS context is important to this vmalloc call. Signed-off-by: Dave Chinner --- fs/xfs/kmem.c | 21 ++++++++++++++++++++- fs/xfs/xfs_buf.c | 11 +++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/fs/xfs/kmem.c b/fs/xfs/kmem.c index 66a36be..844e288 100644 --- a/fs/xfs/kmem.c +++ b/fs/xfs/kmem.c @@ -65,12 +65,31 @@ kmem_alloc(size_t size, xfs_km_flags_t flags) void * kmem_zalloc_large(size_t size, xfs_km_flags_t flags) { + unsigned noio_flag = 0; void *ptr; + gfp_t lflags; ptr = kmem_zalloc(size, flags | KM_MAYFAIL); if (ptr) return ptr; - return vzalloc(size); + + /* + * __vmalloc() will allocate data pages and auxillary structures (e.g. + * pagetables) with GFP_KERNEL, yet we may be under GFP_NOFS context + * here. Hence we need to tell memory reclaim that we are in such a + * context via PF_MEMALLOC_NOIO to prevent memory reclaim re-entering + * the filesystem here and potentially deadlocking. + */ + if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) + noio_flag = memalloc_noio_save(); + + lflags = kmem_flags_convert(flags); + ptr = __vmalloc(size, lflags | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL); + + if ((current->flags & PF_FSTRANS) || (flags & KM_NOFS)) + memalloc_noio_restore(noio_flag); + + return ptr; } void diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 9c061ef..107f2fd 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -396,7 +396,17 @@ _xfs_buf_map_pages( bp->b_addr = NULL; } else { int retried = 0; + unsigned noio_flag; + /* + * vm_map_ram() will allocate auxillary structures (e.g. + * pagetables) with GFP_KERNEL, yet we are likely to be under + * GFP_NOFS context here. Hence we need to tell memory reclaim + * that we are in such a context via PF_MEMALLOC_NOIO to prevent + * memory reclaim re-entering the filesystem here and + * potentially deadlocking. + */ + noio_flag = memalloc_noio_save(); do { bp->b_addr = vm_map_ram(bp->b_pages, bp->b_page_count, -1, PAGE_KERNEL); @@ -404,6 +414,7 @@ _xfs_buf_map_pages( break; vm_unmap_aliases(); } while (retried++ <= 1); + memalloc_noio_restore(noio_flag); if (!bp->b_addr) return -ENOMEM; -- 1.9.0 From lczerner@redhat.com Mon Mar 3 06:16:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 568AA7F4E for ; Mon, 3 Mar 2014 06:16:30 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 39635304032 for ; Mon, 3 Mar 2014 04:16:27 -0800 (PST) X-ASG-Debug-ID: 1393848985-04cbb066e71ce550001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id o695WONjz6bsJyi8 for ; Mon, 03 Mar 2014 04:16:26 -0800 (PST) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s23CGOCq023465 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 3 Mar 2014 07:16:24 -0500 Received: from dhcp-1-138.brq.redhat.com (dhcp-1-138.brq.redhat.com [10.34.1.138]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s23CGKxj028029 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 3 Mar 2014 07:16:23 -0500 Date: Mon, 3 Mar 2014 13:16:20 +0100 (CET) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Eric Sandeen cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [PATCH 5/8] xfstests: Add fallocate zero range operation to fsstress In-Reply-To: <5310C9F8.20009@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH 5/8] xfstests: Add fallocate zero range operation to fsstress Message-ID: References: <1393603865-26198-1-git-send-email-lczerner@redhat.com> <1393603865-26198-5-git-send-email-lczerner@redhat.com> <5310C9F8.20009@sandeen.net> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1393848986 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, 28 Feb 2014, Eric Sandeen wrote: > Date: Fri, 28 Feb 2014 11:40:08 -0600 > From: Eric Sandeen > To: Lukas Czerner , linux-ext4@vger.kernel.org > Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com > Subject: Re: [PATCH 5/8] xfstests: Add fallocate zero range operation to > fsstress > > On 2/28/14, 10:11 AM, Lukas Czerner wrote: > > This commit adds fzero operation support for fsstress, which is meant to > > exercise fallocate FALLOC_FL_ZERO_RANGE support. > > > > Also reorganise the common fallocate code into a single do_fallocate() > > function and use flags use the right mode. > > > > Also in order to make more obvious which fallocate mode fsstress is > > testing translate fallocate flags into human readable strings. > > Can you enhance that so that if it's passed a flag which isn't > in the known array, it prints the leftover values? Otherwise > they are silently dropped, which might be confusing. > > Handling the case where a flag is not in the array would future-proof > it, I think. > > -Eric Yes, I can do that. The only reason I've left this out was to force people to actually update it when they update the test with new flag. Thanks! -Lukas From lczerner@redhat.com Mon Mar 3 06:21:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BA9CD7F4E for ; Mon, 3 Mar 2014 06:21:10 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 808DB8F8033 for ; Mon, 3 Mar 2014 04:21:10 -0800 (PST) X-ASG-Debug-ID: 1393849269-04bdf05da91e7010001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cAQjq2OfUfPWIH3A for ; Mon, 03 Mar 2014 04:21:09 -0800 (PST) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s23CL6Af011242 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 3 Mar 2014 07:21:07 -0500 Received: from dhcp-1-138.brq.redhat.com (dhcp-1-138.brq.redhat.com [10.34.1.138]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s23CL30f016745 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 3 Mar 2014 07:21:05 -0500 Date: Mon, 3 Mar 2014 13:21:03 +0100 (CET) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: Andreas Dilger cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org Subject: Re: [PATCH 7/8] xfstests: Add fallocate zero range operation to fsx In-Reply-To: X-ASG-Orig-Subj: Re: [PATCH 7/8] xfstests: Add fallocate zero range operation to fsx Message-ID: References: <1393603865-26198-1-git-send-email-lczerner@redhat.com> <1393603865-26198-7-git-send-email-lczerner@redhat.com> User-Agent: Alpine 2.00 (LFD 1167 2008-08-23) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1393849269 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, 28 Feb 2014, Andreas Dilger wrote: > Date: Fri, 28 Feb 2014 12:08:47 -0700 > From: Andreas Dilger > To: Lukas Czerner > Cc: linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org > Subject: Re: [PATCH 7/8] xfstests: Add fallocate zero range operation to fsx > > On Feb 28, 2014, at 9:11 AM, Lukas Czerner wrote: > > This commit adds fallocate FALLOC_FL_ZERO_RANGE support for fsx. > > It looks like this patch breaks the option handling for these > fallocate features. > > > int fallocate_calls = 1; /* -F flag disables */ > > int punch_hole_calls = 1; /* -H flag disables */ > > +int zero_range_calls = 1; /* -z flag disables */ > > So these fallocate tests are on by default... > > > +int > > +test_fallocate(int mode) > > { > > #ifdef HAVE_LINUX_FALLOC_H > > + int ret = 0; > > if (!lite && fallocate_calls) { ^^^^^^^^^^^^^^^ Right, I forgot about this. > > + if (fallocate(fd, mode, 0, 1) && errno == EOPNOTSUPP) { > > if(!quiet) > > warn("main: filesystem does not support fallocate, disabling\n"); > > } else { > > + ret = 1; > > ftruncate(fd, 0); > > } > > } > > #endif > > } > > And this returns 1 or 0 depending if they are supported or not... > > > + while ((ch = getopt(argc, argv, "b:c:dfl:m:no:p:qr:s:t:w:xyAD:FHzLN:OP:RS:WZ")) > > != EOF) > > switch (ch) { > > case 'H': > > punch_hole_calls = 0; > > break; > > + case 'z': > > + zero_range_calls = 0; > > + break; > > And the option parsing sets the values to zero if they are disabled, > so far, so good... > > > + fallocate_calls = test_fallocate(0); > > + punch_hole_calls = test_fallocate(FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE); > > + zero_range_calls = test_fallocate(FALLOC_FL_ZERO_RANGE); > > But here, the values set by option parsing are clobbered and the > tests are only enabled or disabled depending on whether the kernel > supports that feature or not. I think you need something like: Right, and the 'fallocate_calls' test needs to disappear from test_fallocate(). Thanks! -Lukas > > if (fallocate_calls) > fallocate_calls = test_fallocate(0); > if (punch_hole_calls) > punch_hole_calls = test_fallocate(FALLOC_FL_PUNCH_HOLE | > FALLOC_FL_KEEP_SIZE); > if (zero_range_calls) > zero_range_calls = test_fallocate(FALLOC_FL_ZERO_RANGE); > > Cheers, Andreas > > > > > > From mould26@topeasy23.eicp.net Mon Mar 3 06:40:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.2 required=5.0 tests=DEAR_SOMETHING,HTML_MESSAGE, MIME_HTML_ONLY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 083AA7F4E for ; Mon, 3 Mar 2014 06:40:18 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DDDB18F8039 for ; Mon, 3 Mar 2014 04:40:17 -0800 (PST) X-ASG-Debug-ID: 1393850410-04cb6c56751cd7c0001-NocioJ Received: from topeasy23.eicp.net ([182.96.174.4]) by cuda.sgi.com with SMTP id pxnSiqDMvyhiVCrt for ; Mon, 03 Mar 2014 04:40:12 -0800 (PST) X-Barracuda-Envelope-From: mould26@topeasy23.eicp.net X-Barracuda-Apparent-Source-IP: 182.96.174.4 Received: from 6PHZXEVNS4DKT4N[127.0.0.1] by 6PHZXEVNS4DKT4N[127.0.0.1] (SMTPD32); Mon, 3 Mar 2014 20:18:07 +0800 From: "mould26@topeasy23.eicp.net" Subject: Re: Smart mini massager from China factory cut down your cost To: "xfs" X-ASG-Orig-Subj: Re: Smart mini massager from China factory cut down your cost MIME-Version: 1.0 Sender: mould26@topeasy23.eicp.net Reply-To: sangmaisi3@163.com Date: Mon, 3 Mar 2014 20:18:07 +0800 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline X-Barracuda-Connect: UNKNOWN[182.96.174.4] X-Barracuda-Start-Time: 1393850410 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.24 X-Barracuda-Spam-Status: No, SCORE=0.24 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, MIME_HTML_ONLY, MISSING_MID, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145694 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 MIME_HTML_ONLY BODY: Message only has text/html MIME parts 0.00 HTML_MESSAGE BODY: HTML included in message 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Message-Id: <20140303124017.331571296184@cuda.sgi.com>

Dear Sir or Madam:

How are you today?

We are a professional supplier of Electronic massage products. We have almost 10 years experience in this area. You can also check our  for more detail information.

I wonder does your esteemed company still need any massager products? You see we are a professional manufacturer of massager products in China. Product series including facial massager, body massagers, slimming massage belt, foot massagers and so on.

As a direct factory and a pure export enterprise of massager products, we have the advantage of low price and good quality assurance. First, we combined design, develop and manufacture as a whole, we can offer you the most competitive prices.
Second, our products all had passed by the Medical CE, FDA,CMDCAS and ISO13485 certificate etc. I hope these advantages will help your marketing in future.

Thank you very much and looking forward your reply.

Best Regards,

Sunmas (H.K) Trading Limited

EMAIL TO US NOW!

From sandeen@sandeen.net Mon Mar 3 11:34:41 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A02277F4E for ; Mon, 3 Mar 2014 11:34:41 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 887C0304032 for ; Mon, 3 Mar 2014 09:34:41 -0800 (PST) X-ASG-Debug-ID: 1393868076-04cb6c56771e4f80001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id tkkKWnl9PlN37cNP for ; Mon, 03 Mar 2014 09:34:36 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 54B8263C59A5; Mon, 3 Mar 2014 11:34:36 -0600 (CST) Message-ID: <5314BD2B.1010904@sandeen.net> Date: Mon, 03 Mar 2014 11:34:35 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace References: <1393825194-1719-1-git-send-email-david@fromorbit.com> <1393825194-1719-2-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace In-Reply-To: <1393825194-1719-2-git-send-email-david@fromorbit.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1393868076 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145701 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/2/14, 11:39 PM, Dave Chinner wrote: > From: Dave Chinner > > While the verifier reoutines may return EFSBADCRC when a buffer ahs > a bad CRC, we need to translate that to EFSCORRUPTED so that the > higher layers treat the error appropriately and so we return a > consistent error to userspace. This fixes a xfs/005 regression. Can you say a little more about the philosophy here? xfs/005 regresses because it expects "structure needs cleaning" So if we instead return our (icky) CRC error code, we get something else. But it is truly a different root cause. So the goal is to NEVER leak EFSBADCRC to userspace? Maybe a comment above that error definition would help document that. And I'm bit worried that we'll leak more in the future if things changed, or if things got missed here. Everything you have here looks fine, but it's not obvious that every path has been caught; it seems a bit random. I know we _just_ merged my "differentiator" patches, but I wonder if it would be better to add XFS_BSTATE_BADCRC to b_state or some other field, and go back to always assigning EFSCORRUPTED. What do you think? When I wrote those I wasn't thinking about keeping it all internal to the filesystem. -Eric > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_mount.c | 3 +++ > fs/xfs/xfs_symlink.c | 4 ++++ > fs/xfs/xfs_trans_buf.c | 11 +++++++++++ > 3 files changed, 18 insertions(+) > > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index f96c056..993cb19 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -314,6 +314,9 @@ reread: > error = bp->b_error; > if (loud) > xfs_warn(mp, "SB validate failed with error %d.", error); > + /* bad CRC means corrupted metadata */ > + if (error == EFSBADCRC) > + error = EFSCORRUPTED; > goto release_buf; > } > > diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c > index 14e58f2..5fda189 100644 > --- a/fs/xfs/xfs_symlink.c > +++ b/fs/xfs/xfs_symlink.c > @@ -80,6 +80,10 @@ xfs_readlink_bmap( > if (error) { > xfs_buf_ioerror_alert(bp, __func__); > xfs_buf_relse(bp); > + > + /* bad CRC means corrupted metadata */ > + if (error == EFSBADCRC) > + error = EFSCORRUPTED; > goto out; > } > byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); > diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c > index 647b6f1..b8eef05 100644 > --- a/fs/xfs/xfs_trans_buf.c > +++ b/fs/xfs/xfs_trans_buf.c > @@ -275,6 +275,10 @@ xfs_trans_read_buf_map( > XFS_BUF_UNDONE(bp); > xfs_buf_stale(bp); > xfs_buf_relse(bp); > + > + /* bad CRC means corrupted metadata */ > + if (error == EFSBADCRC) > + error = EFSCORRUPTED; > return error; > } > #ifdef DEBUG > @@ -338,6 +342,9 @@ xfs_trans_read_buf_map( > if (tp->t_flags & XFS_TRANS_DIRTY) > xfs_force_shutdown(tp->t_mountp, > SHUTDOWN_META_IO_ERROR); > + /* bad CRC means corrupted metadata */ > + if (error == EFSBADCRC) > + error = EFSCORRUPTED; > return error; > } > } > @@ -375,6 +382,10 @@ xfs_trans_read_buf_map( > if (tp->t_flags & XFS_TRANS_DIRTY) > xfs_force_shutdown(tp->t_mountp, SHUTDOWN_META_IO_ERROR); > xfs_buf_relse(bp); > + > + /* bad CRC means corrupted metadata */ > + if (error == EFSBADCRC) > + error = EFSCORRUPTED; > return error; > } > #ifdef DEBUG > From bfoster@redhat.com Mon Mar 3 11:44:34 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3F8137F51 for ; Mon, 3 Mar 2014 11:44:34 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B17E8AC005 for ; Mon, 3 Mar 2014 09:44:33 -0800 (PST) X-ASG-Debug-ID: 1393868672-04cb6c56751e5910001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kbZRuJC6HG7uRdAx for ; Mon, 03 Mar 2014 09:44:32 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s23HiTPY026020 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 3 Mar 2014 12:44:29 -0500 Received: from laptop.bfoster (vpn-50-144.rdu2.redhat.com [10.10.50.144]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s23HiTJW009272; Mon, 3 Mar 2014 12:44:29 -0500 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id F20CB1210DA; Mon, 3 Mar 2014 12:44:28 -0500 (EST) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s23HiRsR029339; Mon, 3 Mar 2014 12:44:27 -0500 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 3 Mar 2014 12:44:26 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace Message-ID: <20140303174425.GB28196@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace References: <1393825194-1719-1-git-send-email-david@fromorbit.com> <1393825194-1719-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1393825194-1719-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1393868672 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Mar 03, 2014 at 04:39:53PM +1100, Dave Chinner wrote: > From: Dave Chinner > > While the verifier reoutines may return EFSBADCRC when a buffer ahs > a bad CRC, we need to translate that to EFSCORRUPTED so that the > higher layers treat the error appropriately and so we return a > consistent error to userspace. This fixes a xfs/005 regression. > > Signed-off-by: Dave Chinner > --- This change looks Ok to me, but when I start looking through the users of bp->b_error, I see examples like xfs_dir3_data_read() being called in xfs_dir2_leaf_addname() where it looks like an error could bubble all the way up to xfs_vn_mknod() and its callers. If the intent is to use EFSBADCRC as an internal-only error to differentiate corruption from crc failure, why not push this more closely to the boundaries that we have already defined? For example, we already convert positive errnos to negative at the internal/external boundaries. Could we convert those to use some kind of XFS_USERSPACE_ERROR(error) macro/helper that converts errors appropriately? Another thought could be to reconsider whether we still need some of these extra warnings, as in the xfs_mount.c hunk below, now that we have the generic xfs_verifier_error() messaging. E.g., if we could remove those, perhaps we could snub out EFSBADCRC in or around the verifier after it makes a distinction. Brian > fs/xfs/xfs_mount.c | 3 +++ > fs/xfs/xfs_symlink.c | 4 ++++ > fs/xfs/xfs_trans_buf.c | 11 +++++++++++ > 3 files changed, 18 insertions(+) > > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index f96c056..993cb19 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -314,6 +314,9 @@ reread: > error = bp->b_error; > if (loud) > xfs_warn(mp, "SB validate failed with error %d.", error); > + /* bad CRC means corrupted metadata */ > + if (error == EFSBADCRC) > + error = EFSCORRUPTED; > goto release_buf; > } > > diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c > index 14e58f2..5fda189 100644 > --- a/fs/xfs/xfs_symlink.c > +++ b/fs/xfs/xfs_symlink.c > @@ -80,6 +80,10 @@ xfs_readlink_bmap( > if (error) { > xfs_buf_ioerror_alert(bp, __func__); > xfs_buf_relse(bp); > + > + /* bad CRC means corrupted metadata */ > + if (error == EFSBADCRC) > + error = EFSCORRUPTED; > goto out; > } > byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); > diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c > index 647b6f1..b8eef05 100644 > --- a/fs/xfs/xfs_trans_buf.c > +++ b/fs/xfs/xfs_trans_buf.c > @@ -275,6 +275,10 @@ xfs_trans_read_buf_map( > XFS_BUF_UNDONE(bp); > xfs_buf_stale(bp); > xfs_buf_relse(bp); > + > + /* bad CRC means corrupted metadata */ > + if (error == EFSBADCRC) > + error = EFSCORRUPTED; > return error; > } > #ifdef DEBUG > @@ -338,6 +342,9 @@ xfs_trans_read_buf_map( > if (tp->t_flags & XFS_TRANS_DIRTY) > xfs_force_shutdown(tp->t_mountp, > SHUTDOWN_META_IO_ERROR); > + /* bad CRC means corrupted metadata */ > + if (error == EFSBADCRC) > + error = EFSCORRUPTED; > return error; > } > } > @@ -375,6 +382,10 @@ xfs_trans_read_buf_map( > if (tp->t_flags & XFS_TRANS_DIRTY) > xfs_force_shutdown(tp->t_mountp, SHUTDOWN_META_IO_ERROR); > xfs_buf_relse(bp); > + > + /* bad CRC means corrupted metadata */ > + if (error == EFSBADCRC) > + error = EFSCORRUPTED; > return error; > } > #ifdef DEBUG > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@redhat.com Mon Mar 3 13:14:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E55777F51 for ; Mon, 3 Mar 2014 13:14:05 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BE8408F8065 for ; Mon, 3 Mar 2014 11:14:01 -0800 (PST) X-ASG-Debug-ID: 1393874040-04cb6c56771eb340001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cHBeGXgijvdegkrU for ; Mon, 03 Mar 2014 11:14:00 -0800 (PST) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s23JDxYw028404 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 3 Mar 2014 14:14:00 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s23JDwLI004584 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Mon, 3 Mar 2014 14:13:59 -0500 Message-ID: <5314D476.7030503@redhat.com> Date: Mon, 03 Mar 2014 13:13:58 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs_repair: fix array overrun in do_inode_prefetch X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfs_repair: fix array overrun in do_inode_prefetch Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1393874040 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Coverity spotted this: do_inode_prefetch() does a while loop, creating queues: for (i = 0; i < thread_count; i++) { ... create_work_queue(&queues[i], mp, 1); ... } and then does this to wait for them all to complete: for (; i >= 0; i--) destroy_work_queue(&queues[i]); But we leave the first for loop with (i == thread_coun)t, and the second one will try to index queues[] one past the end. Signed-off-by: Eric Sandeen --- diff --git a/repair/prefetch.c b/repair/prefetch.c index 0f9e3fe..e47a48e 100644 --- a/repair/prefetch.c +++ b/repair/prefetch.c @@ -995,7 +995,7 @@ do_inode_prefetch( /* * wait for workers to complete */ - for (; i >= 0; i--) + while (i--) destroy_work_queue(&queues[i]); free(queues); } From sandeen@redhat.com Mon Mar 3 14:42:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C4DF27F4E for ; Mon, 3 Mar 2014 14:42:01 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id AE1A7304043 for ; Mon, 3 Mar 2014 12:41:58 -0800 (PST) X-ASG-Debug-ID: 1393879316-04cb6c56781f3500001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LEomC50CBcxFx1IM for ; Mon, 03 Mar 2014 12:41:57 -0800 (PST) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s23KfuaY008248 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 3 Mar 2014 15:41:56 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s23Kftmj010282 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Mon, 3 Mar 2014 15:41:55 -0500 Message-ID: <5314E912.9080708@redhat.com> Date: Mon, 03 Mar 2014 14:41:54 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfsprogs: fix use after free in inode_item_done() X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfsprogs: fix use after free in inode_item_done() Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1393879317 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Commit "3a19fb7 libxfs: stop caching inode structures" introduced a use after free. libxfs_iput() already does the check for ip->i_itemp, and a kmem_zone_free() if it's present, and then frees the ip pointer. Re-checking ip->i_itemp after the libxfs_iput call will access the freed ip pointer, as will setting ip_>i_itemp to NULL. Simply remove the offending code to fix this up. Signed-off-by: Eric Sandeen --- diff --git a/libxfs/trans.c b/libxfs/trans.c index 6c9d202..2e6720e 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -694,7 +694,6 @@ inode_item_done( xfs_mount_t *mp; xfs_buf_t *bp; int error; - extern kmem_zone_t *xfs_ili_zone; ip = iip->ili_inode; mp = iip->ili_item.li_mountp; @@ -739,12 +738,6 @@ ili_done: } else { libxfs_iput(ip, 0); } - - if (ip->i_itemp) - kmem_zone_free(xfs_ili_zone, ip->i_itemp); - else - ASSERT(0); - ip->i_itemp = NULL; } static void From pbrunk@uga.edu Mon Mar 3 15:06:25 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 62DA27F50 for ; Mon, 3 Mar 2014 15:06:25 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id E36CDAC002 for ; Mon, 3 Mar 2014 13:06:21 -0800 (PST) X-ASG-Debug-ID: 1393880776-04bdf05daa211400001-NocioJ Received: from na01-bn1-obe.outbound.protection.outlook.com (mail-bn1blp0190.outbound.protection.outlook.com [207.46.163.190]) by cuda.sgi.com with ESMTP id We3ZXozGF3njPheZ (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 03 Mar 2014 13:06:17 -0800 (PST) X-Barracuda-Envelope-From: pbrunk@uga.edu X-Barracuda-Apparent-Source-IP: 207.46.163.190 Received: from CH1PRD0210HT001.namprd02.prod.outlook.com (10.255.149.164) by BLUPR02MB262.namprd02.prod.outlook.com (10.141.76.20) with Microsoft SMTP Server (TLS) id 15.0.888.9; Mon, 3 Mar 2014 21:06:15 +0000 Received: from [128.192.88.244] (128.192.88.244) by pod51004.outlook.com (10.255.149.164) with Microsoft SMTP Server (TLS) id 14.16.423.0; Mon, 3 Mar 2014 21:06:15 +0000 Message-ID: <5314EE97.3020004@uga.edu> Date: Mon, 3 Mar 2014 16:05:27 -0500 From: Paul Brunk User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Thunderbird/29.0a2 MIME-Version: 1.0 To: Subject: rebuilt HW RAID60 array; XFS filesystem looks bad now Content-Type: text/plain; charset="UTF-8"; format=flowed X-ASG-Orig-Subj: rebuilt HW RAID60 array; XFS filesystem looks bad now Content-Transfer-Encoding: 7bit X-Originating-IP: [128.192.88.244] X-Forefront-PRVS: 0139052FDB X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009001)(6009001)(428001)(199002)(189002)(76786001)(77096001)(76796001)(93516002)(92726001)(85852003)(86362001)(74662001)(47446002)(19580395003)(77982001)(63696002)(66066001)(65956001)(65806001)(95416001)(92566001)(85306002)(31966008)(74502001)(93136001)(80022001)(94946001)(94316002)(79102001)(83506001)(90146001)(83072002)(59766001)(56816005)(83322001)(80316001)(53806001)(59896001)(56776001)(64126003)(75432001)(54316002)(4396001)(74366001)(36756003)(81342001)(54356001)(69226001)(33656001)(80976001)(76482001)(51856001)(81542001)(47736001)(76176001)(23676002)(50986001)(95666003)(47776003)(49866001)(81816001)(47976001)(87936001)(50466002)(74706001)(46102001)(74876001)(81686001);DIR:OUT;SFP:1101;SCL:1;SRVR:BLUPR02MB262;H:CH1PRD0210HT001.namprd02.prod.outlook.com;CLIP:128.192.88.244;FPR:A023D1DA.A002978D.DFF3D3FF.44D8D461.20593;PTR:InfoNoRecords;A:1;MX:1;LANG:en; Received-SPF: None (: uga.edu does not designate permitted sender hosts) X-OriginatorOrg: uga.edu X-Barracuda-Connect: mail-bn1blp0190.outbound.protection.outlook.com[207.46.163.190] X-Barracuda-Start-Time: 1393880777 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145708 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi: Short version: XFS filesystem on HW RAID60 array. Array has been multiply rebuilt due to drive insertions. XFS filesystem damaged and trying to salvage what I can, and I want to make sure I have no option other than "xfs_repair -L". Details follow. # uname -a Linux rccstor7.local 2.6.32-431.5.1.el6.x86_64 #1 SMP Wed Feb 12 00:41:43 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux xfs_repair version 3.1.1. The box has one 4-core Opteron CPU and 8 GB of RAM. I have a 32TB HW RAID60 volume (Areca 1680 HW RAID) made of two RAID6 raid sets. This volume is a PV in Linux LVM, with a single LV defined in it. The LV had an XFS filesystem created on it (no external log). I can't do xfs_info on it because I can't mount the filesystem. I had multiple drive removals and insertions (due to timeout error with non-TLER drives in the RAID array, an unfortunate setup I inherited), which triggered multiple HW RAID rebuilds. This caused the RAID volume to end up defined twice in the controller, with each of the two constituent RAID sets being defined twice. At Areca's direction, I did a "raid set rescue" in the Areca controller. That succeeded in reducing the number of volumes from two to one, and the RAID volume is now "normal" in the RAID controller instead of "failed". The logical volume is visible to the OS now, unlike when the RAID status was "failed". # lvdisplay --- Logical volume --- LV Path /dev/vg0/lv0 LV Name lv0 VG Name vg0 LV UUID YMlFWe-PTGe-5kHx-V3uo-31Vp-grXR-9ZBt3R LV Write Access read/write LV Creation host, time , LV Status available # open 0 LV Size 32.74 TiB Current LE 8582595 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:2 That's good, but now I think the XFS filesystem is in bad shape. # grep /media/shares /etc/fstab UUID="9cba4e90-1d8f-4a98-8701-df10a28556da" /media/shares xfs pquota 0 0 That UUID entry in /dev/disk/by-uuid is a link to /dev/dm-2. "dm-2" is the RAID volume. Here it is in /proc/partitions: major minor #blocks name 253 2 35154309120 dm-2 When I try to mount the XFS filesystem: # mount /media/shares mount: wrong fs type, bad option, bad superblock on /dev/mapper/vg0-lv0, missing codepage or helper program, or other error In some cases useful info is found in syslog - try dmesg | tail or so # dmesg|tail XFS (dm-2): Mounting Filesystem XFS (dm-2): Log inconsistent or not a log (last==0, first!=1) XFS (dm-2): empty log check failed XFS (dm-2): log mount/recovery failed: error 22 XFS (dm-2): log mount failed # xfs_check /dev/dm-2 xfs_check: cannot init perag data (117) XFS: Log inconsistent or not a log (last==0, first!=1) XFS: empty log check failed # xfs_repair -n /dev/dm-2 produced at least 7863 lines of output. It begins Phase 1 - find and verify superblock... Phase 2 - using internal log - scan filesystem freespace and inode maps... bad magic # 0xa04850d in btbno block 0/108 expected level 0 got 10510 in btbno block 0/108 bad btree nrecs (144, min=255, max=510) in btbno block 0/108 block (0,80-80) multiply claimed by bno space tree, state - 2 block (0,108-108) multiply claimed by bno space tree, state - 7 # egrep -c "invalid start block" xfsrepair.out 2061 # egrep -c "multiply claimed by bno" xfsrepair.out 4753 Included in the output are 381 occurrences of this pair of messages: bad starting inode # (0 (0x0 0x0)) in ino rec, skipping rec badly aligned inode rec (starting inode = 0) Is there anything I should try prior to xfs_repair -L? I'm just trying to salvage whatever I can from this FS. I'm aware it could be all gone. Thanks. -- Paul Brunk, system administrator Georgia Advanced Computing Resource Center (GACRC) Enterprise IT Svcs, the University of Georgia From sandeen@sandeen.net Mon Mar 3 15:24:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 5E4D47F50 for ; Mon, 3 Mar 2014 15:24:35 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C4B2FAC002 for ; Mon, 3 Mar 2014 13:24:34 -0800 (PST) X-ASG-Debug-ID: 1393881872-04cbb054b6073f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id DUGyYW7G00G8IsUE for ; Mon, 03 Mar 2014 13:24:33 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B6BCF6178008; Mon, 3 Mar 2014 15:24:32 -0600 (CST) Message-ID: <5314F310.8080703@sandeen.net> Date: Mon, 03 Mar 2014 15:24:32 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Paul Brunk , xfs@oss.sgi.com Subject: Re: rebuilt HW RAID60 array; XFS filesystem looks bad now References: <5314EE97.3020004@uga.edu> X-ASG-Orig-Subj: Re: rebuilt HW RAID60 array; XFS filesystem looks bad now In-Reply-To: <5314EE97.3020004@uga.edu> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1393881872 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145709 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Paul - On 3/3/14, 3:05 PM, Paul Brunk wrote: > Hi: It sounds like things are badly scrambled. > Is there anything I should try prior to xfs_repair -L? The log failure is probably just the first error xfs encounters; I imagine that after you zap the log, you'll find that everything else is in equally bad shape. You could _try_ an # xfs_metadump -o /dev/whatever fs.metadump # xfs_mdrestore fs.metadump fs.img and then try your various metadata salvage techniques on fs.img (recreating as necessary with another xfs_mdrestore after failure) as practice runs, but I'm guessing that xfs_metadump will fail in equally spectacular ways. Unless you can get your storage somehow reassembled properly, I doubt that there's much xfs tools can do to help you. -Eric > I'm just trying to salvage whatever I can from this FS. I'm aware it > could be all gone. Thanks. > From david@fromorbit.com Mon Mar 3 16:13:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 395BA7F50 for ; Mon, 3 Mar 2014 16:13:23 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 264F8304032 for ; Mon, 3 Mar 2014 14:13:20 -0800 (PST) X-ASG-Debug-ID: 1393884797-04cb6c56771f9970001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id TJ4lY5H7OUt8h9vc for ; Mon, 03 Mar 2014 14:13:18 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApFuAIf9FFN5LJYePGdsb2JhbABagwaDQ4UMs0eFWYEfFwMBAQEBHxkNKIIlAQEEATocIwULCAMVAwklDwUlAwcaE4dxB8xmFxaOQweEOASYO5VtKA Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Mar 2014 08:43:17 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WKb6o-0004sS-JX; Tue, 04 Mar 2014 09:13:14 +1100 Date: Tue, 4 Mar 2014 09:13:14 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace Message-ID: <20140303221314.GI13647@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace References: <1393825194-1719-1-git-send-email-david@fromorbit.com> <1393825194-1719-2-git-send-email-david@fromorbit.com> <5314BD2B.1010904@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5314BD2B.1010904@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1393884797 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145710 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 03, 2014 at 11:34:35AM -0600, Eric Sandeen wrote: > On 3/2/14, 11:39 PM, Dave Chinner wrote: > > From: Dave Chinner > > > > While the verifier reoutines may return EFSBADCRC when a buffer ahs > > a bad CRC, we need to translate that to EFSCORRUPTED so that the > > higher layers treat the error appropriately and so we return a > > consistent error to userspace. This fixes a xfs/005 regression. > > Can you say a little more about the philosophy here? > > xfs/005 regresses because it expects "structure needs cleaning" > > So if we instead return our (icky) CRC error code, we get something else. > > But it is truly a different root cause. > > So the goal is to NEVER leak EFSBADCRC to userspace? Maybe a comment > above that error definition would help document that. Not permanently. At the moment, none of the code handles it correctly, and the leak to userspace is just a symptom that tells us we got somethign wrong. We have plenty of places where we check for EFSCORRUPTED and do something special, but if we get EFSBADCRC instead it will do the wrong thing.... > And I'm bit worried that we'll leak more in the future if things changed, > or if things got missed here. Everything you have here looks fine, but > it's not obvious that every path has been caught; it seems a bit random. It's not random. It's buffer reads that matter, and I checked all the calls to xfs_buf_read, xfs_buf_read_map, xfs_trans_read_buf and xfs_trans_read_buf. There aren't any other read interfaces that use verifiers, and so nothing else can return EFSBADCRC. For the log recovery cases, the buffer reads don' use verifiers, and those that do won't return EFSBADCRC (e.g. inode buffers). > I know we _just_ merged my "differentiator" patches, but I wonder if > it would be better to add XFS_BSTATE_BADCRC to b_state or some other > field, and go back to always assigning EFSCORRUPTED. What do you think? It's just the first layer of adding differentiating support. We've just put the mechanism in place to do the differentiation because we need it for *userspace functionality* before we need it for in-kernel functionality. We put it in the kernel because it has value to us developers to indicate what type of corruption error was detected in the dmesg output. We can't however, do everything at once, so for the moment the kernel code needs to translate it back to something the higher layers understand and treat correctly. > When I wrote those I wasn't thinking about keeping it all internal > to the filesystem. Only for the moment, until there's code in the kernel that makes it a meaningfully different error. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Mon Mar 3 16:20:39 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 68D137F51 for ; Mon, 3 Mar 2014 16:20:39 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5668B8F8065 for ; Mon, 3 Mar 2014 14:20:36 -0800 (PST) X-ASG-Debug-ID: 1393885235-04cbb054b60b0d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id dMUIJGCxg9AeVzeD for ; Mon, 03 Mar 2014 14:20:35 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D1F27610C4E7; Mon, 3 Mar 2014 16:20:34 -0600 (CST) Message-ID: <53150032.9050801@sandeen.net> Date: Mon, 03 Mar 2014 16:20:34 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace References: <1393825194-1719-1-git-send-email-david@fromorbit.com> <1393825194-1719-2-git-send-email-david@fromorbit.com> <5314BD2B.1010904@sandeen.net> <20140303221314.GI13647@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace In-Reply-To: <20140303221314.GI13647@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1393885235 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145710 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/3/14, 4:13 PM, Dave Chinner wrote: > On Mon, Mar 03, 2014 at 11:34:35AM -0600, Eric Sandeen wrote: >> On 3/2/14, 11:39 PM, Dave Chinner wrote: >>> From: Dave Chinner >>> >>> While the verifier reoutines may return EFSBADCRC when a buffer ahs >>> a bad CRC, we need to translate that to EFSCORRUPTED so that the >>> higher layers treat the error appropriately and so we return a >>> consistent error to userspace. This fixes a xfs/005 regression. >> >> Can you say a little more about the philosophy here? >> >> xfs/005 regresses because it expects "structure needs cleaning" >> >> So if we instead return our (icky) CRC error code, we get something else. >> >> But it is truly a different root cause. >> >> So the goal is to NEVER leak EFSBADCRC to userspace? Maybe a comment >> above that error definition would help document that. > > Not permanently. At the moment, none of the code handles it > correctly, and the leak to userspace is just a symptom that tells us > we got somethign wrong. We have plenty of places where we check for > EFSCORRUPTED and do something special, but if we get EFSBADCRC > instead it will do the wrong thing.... > >> And I'm bit worried that we'll leak more in the future if things changed, >> or if things got missed here. Everything you have here looks fine, but >> it's not obvious that every path has been caught; it seems a bit random. > > It's not random. It's buffer reads that matter, and I > checked all the calls to xfs_buf_read, xfs_buf_read_map, > xfs_trans_read_buf and xfs_trans_read_buf. There aren't any other > read interfaces that use verifiers, and so nothing else can return > EFSBADCRC. For the log recovery cases, the buffer reads don' use > verifiers, and those that do won't return EFSBADCRC (e.g. inode > buffers). > >> I know we _just_ merged my "differentiator" patches, but I wonder if >> it would be better to add XFS_BSTATE_BADCRC to b_state or some other >> field, and go back to always assigning EFSCORRUPTED. What do you think? > > It's just the first layer of adding differentiating support. We've > just put the mechanism in place to do the differentiation because we > need it for *userspace functionality* before we need it for > in-kernel functionality. We put it in the kernel because it has > value to us developers to indicate what type of corruption error was > detected in the dmesg output. We can't however, do everything at > once, so for the moment the kernel code needs to translate it back > to something the higher layers understand and treat correctly. > >> When I wrote those I wasn't thinking about keeping it all internal >> to the filesystem. > > Only for the moment, until there's code in the kernel that makes it > a meaningfully different error. Ok, thanks. Modulo Brian's question about other paths, what is here so far looks ok to me, then. A commit message that indicates that this is somewhat temporary might be in order? -Eric From david@fromorbit.com Mon Mar 3 16:29:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6356B7F50 for ; Mon, 3 Mar 2014 16:29:54 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DC40DAC004 for ; Mon, 3 Mar 2014 14:29:50 -0800 (PST) X-ASG-Debug-ID: 1393885788-04bdf05da92171c0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id P0xRQcWrVgIgyJxy for ; Mon, 03 Mar 2014 14:29:48 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApNuADkBFVN5LJYePGdsb2JhbABagwaDQ4UMs0iFWYEdFwMBAQEBHxkNKIIlAQEEAScTHCMFCwgDDgcDCSUPBSUDBxoTh3EHzGoXFo5DB4Q4BJg7lW0o Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Mar 2014 08:59:47 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WKbMo-0004vC-CD; Tue, 04 Mar 2014 09:29:46 +1100 Date: Tue, 4 Mar 2014 09:29:46 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace Message-ID: <20140303222946.GJ13647@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace References: <1393825194-1719-1-git-send-email-david@fromorbit.com> <1393825194-1719-2-git-send-email-david@fromorbit.com> <20140303174425.GB28196@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140303174425.GB28196@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1393885788 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145710 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 03, 2014 at 12:44:26PM -0500, Brian Foster wrote: > On Mon, Mar 03, 2014 at 04:39:53PM +1100, Dave Chinner wrote: > > From: Dave Chinner > > > > While the verifier reoutines may return EFSBADCRC when a buffer ahs > > a bad CRC, we need to translate that to EFSCORRUPTED so that the > > higher layers treat the error appropriately and so we return a > > consistent error to userspace. This fixes a xfs/005 regression. > > > > Signed-off-by: Dave Chinner > > --- > > This change looks Ok to me, but when I start looking through the users > of bp->b_error, I see examples like xfs_dir3_data_read() being called in > xfs_dir2_leaf_addname() where it looks like an error could bubble all > the way up to xfs_vn_mknod() and its callers. Sure, but: xfs_dir3_data_read xfs_da_read_buf xfs_trans_read_buf_map Which means the patch prevents the EFSBADCRC leaking back out through that path because it converts it in xfs_trans_read_buf_map. > If the intent is to use EFSBADCRC as an internal-only error to > differentiate corruption from crc failure, why not push this more > closely to the boundaries that we have already defined? For example, we > already convert positive errnos to negative at the internal/external > boundaries. Could we convert those to use some kind of > XFS_USERSPACE_ERROR(error) macro/helper that converts errors > appropriately? That doesn't solve the problem needing an error conversion layer in the first place. The long term goal is to remove the error conversions in XFS by converting the core code to the same error passing conventions as the rest of the kernel code. We manage to screw the negation up fairly regularly because it is convoluted and we cal into generic code that returns negative errors from the core that returns positive errors in lots of places. The conversion surface is just too large to manage sanely. > Another thought could be to reconsider whether we still need some of > these extra warnings, as in the xfs_mount.c hunk below, now that we have > the generic xfs_verifier_error() messaging. E.g., if we could remove > those, perhaps we could snub out EFSBADCRC in or around the verifier > after it makes a distinction. Redundant errors aren't s significant problem. It's the lack of meaningful error messages that are much more of an issue. We get more meaningful error messages as a result of the EFSBADCRC changes that have been made, but for the moment that error simply means EFSCORRUPTED to the higher layers. Hence the translation back to EFSCORRUPTED at the (low) layers where the error no longer has a distinct meaning. As we add more functionality, EFSBADCRC will become more meaningful and so get propagated higher into the kernel code. But for now, it should remain an error that doesn't escape the lower layers... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Mar 3 16:31:26 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 428E87F53 for ; Mon, 3 Mar 2014 16:31:26 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0E50B8F804C for ; Mon, 3 Mar 2014 14:31:25 -0800 (PST) X-ASG-Debug-ID: 1393885884-04bdf05dac217370001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 7sF5jlZvjvMqfgX7 for ; Mon, 03 Mar 2014 14:31:24 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao5uAEACFVN5LJYePGdsb2JhbABagwaDQ4UMs0iFWYEdFwMBAQEBHxkNKIIlAQEFOhwjEAgDFQMJJQ8FJQMHGhOHeMxqFxaOQweEOASUUYNqlW0ogSwk Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Mar 2014 09:01:03 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WKbO2-0004vN-DI; Tue, 04 Mar 2014 09:31:02 +1100 Date: Tue, 4 Mar 2014 09:31:02 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace Message-ID: <20140303223102.GK13647@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace References: <1393825194-1719-1-git-send-email-david@fromorbit.com> <1393825194-1719-2-git-send-email-david@fromorbit.com> <5314BD2B.1010904@sandeen.net> <20140303221314.GI13647@dastard> <53150032.9050801@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53150032.9050801@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1393885884 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145710 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 03, 2014 at 04:20:34PM -0600, Eric Sandeen wrote: > On 3/3/14, 4:13 PM, Dave Chinner wrote: > > On Mon, Mar 03, 2014 at 11:34:35AM -0600, Eric Sandeen wrote: > >> On 3/2/14, 11:39 PM, Dave Chinner wrote: > >>> From: Dave Chinner > >>> > >>> While the verifier reoutines may return EFSBADCRC when a buffer ahs > >>> a bad CRC, we need to translate that to EFSCORRUPTED so that the > >>> higher layers treat the error appropriately and so we return a > >>> consistent error to userspace. This fixes a xfs/005 regression. > >> > >> Can you say a little more about the philosophy here? > >> > >> xfs/005 regresses because it expects "structure needs cleaning" > >> > >> So if we instead return our (icky) CRC error code, we get something else. > >> > >> But it is truly a different root cause. > >> > >> So the goal is to NEVER leak EFSBADCRC to userspace? Maybe a comment > >> above that error definition would help document that. > > > > Not permanently. At the moment, none of the code handles it > > correctly, and the leak to userspace is just a symptom that tells us > > we got somethign wrong. We have plenty of places where we check for > > EFSCORRUPTED and do something special, but if we get EFSBADCRC > > instead it will do the wrong thing.... > > > >> And I'm bit worried that we'll leak more in the future if things changed, > >> or if things got missed here. Everything you have here looks fine, but > >> it's not obvious that every path has been caught; it seems a bit random. > > > > It's not random. It's buffer reads that matter, and I > > checked all the calls to xfs_buf_read, xfs_buf_read_map, > > xfs_trans_read_buf and xfs_trans_read_buf. There aren't any other > > read interfaces that use verifiers, and so nothing else can return > > EFSBADCRC. For the log recovery cases, the buffer reads don' use > > verifiers, and those that do won't return EFSBADCRC (e.g. inode > > buffers). > > > >> I know we _just_ merged my "differentiator" patches, but I wonder if > >> it would be better to add XFS_BSTATE_BADCRC to b_state or some other > >> field, and go back to always assigning EFSCORRUPTED. What do you think? > > > > It's just the first layer of adding differentiating support. We've > > just put the mechanism in place to do the differentiation because we > > need it for *userspace functionality* before we need it for > > in-kernel functionality. We put it in the kernel because it has > > value to us developers to indicate what type of corruption error was > > detected in the dmesg output. We can't however, do everything at > > once, so for the moment the kernel code needs to translate it back > > to something the higher layers understand and treat correctly. > > > >> When I wrote those I wasn't thinking about keeping it all internal > >> to the filesystem. > > > > Only for the moment, until there's code in the kernel that makes it > > a meaningfully different error. > > Ok, thanks. Modulo Brian's question about other paths, what is here > so far looks ok to me, then. A commit message that indicates that > this is somewhat temporary might be in order? Sure, I can improve the commit message by including a summary of this discussion. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Mar 3 16:41:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 912217F52 for ; Mon, 3 Mar 2014 16:41:53 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 11EA6AC002 for ; Mon, 3 Mar 2014 14:41:52 -0800 (PST) X-ASG-Debug-ID: 1393886510-04bdf05dac2189b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 3yMRlx9ftlIZymNa for ; Mon, 03 Mar 2014 14:41:51 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao5uAL0EFVN5LJYePGdsb2JhbABagwaDQ4UMs0iFWYEdFwMBAQEBHxkNKIIlAQEFJxMcIxAIAxgJJQ8FJQMHGhOHeMxoFxaOQweEOAEDmDuKVYsYKA Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Mar 2014 09:06:17 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WKbT7-0004wJ-5e; Tue, 04 Mar 2014 09:36:17 +1100 Date: Tue, 4 Mar 2014 09:36:17 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfsprogs: fix use after free in inode_item_done() Message-ID: <20140303223617.GL13647@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: fix use after free in inode_item_done() References: <5314E912.9080708@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5314E912.9080708@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1393886510 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145710 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 On Mon, Mar 03, 2014 at 02:41:54PM -0600, Eric Sandeen wrote: > Commit "3a19fb7 libxfs: stop caching inode structures" > introduced a use after free. > > libxfs_iput() already does the check for ip->i_itemp, and a > kmem_zone_free() if it's present, and then frees the ip pointer. > Re-checking ip->i_itemp after the libxfs_iput call will access > the freed ip pointer, as will setting ip_>i_itemp to NULL. > > Simply remove the offending code to fix this up. which leaves the rest of the ili_done: code looking a little strange. can you convert that now to be: ili_done: if (iip->ili_lock_flags) { iip->ili_lock_flags = 0; return; } /* free the inode */ libxfs_iput(ip, 0); } Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@redhat.com Mon Mar 3 16:48:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 93A187F55 for ; Mon, 3 Mar 2014 16:48:35 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7CA898F8064 for ; Mon, 3 Mar 2014 14:48:35 -0800 (PST) X-ASG-Debug-ID: 1393886912-04cbb054b80cea0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id XifBUJ1YVtjBP1dL for ; Mon, 03 Mar 2014 14:48:33 -0800 (PST) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s23MmUfO027075 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 3 Mar 2014 17:48:31 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s23MmT0k008605 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Mon, 3 Mar 2014 17:48:30 -0500 Message-ID: <531506BD.80209@redhat.com> Date: Mon, 03 Mar 2014 16:48:29 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs-oss Subject: Re: [PATCH] xfsprogs: fix use after free in inode_item_done() References: <5314E912.9080708@redhat.com> <20140303223617.GL13647@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: fix use after free in inode_item_done() In-Reply-To: <20140303223617.GL13647@dastard> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1393886913 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 3/3/14, 4:36 PM, Dave Chinner wrote: > On Mon, Mar 03, 2014 at 02:41:54PM -0600, Eric Sandeen wrote: >> Commit "3a19fb7 libxfs: stop caching inode structures" >> introduced a use after free. >> >> libxfs_iput() already does the check for ip->i_itemp, and a >> kmem_zone_free() if it's present, and then frees the ip pointer. >> Re-checking ip->i_itemp after the libxfs_iput call will access >> the freed ip pointer, as will setting ip_>i_itemp to NULL. >> >> Simply remove the offending code to fix this up. > > which leaves the rest of the ili_done: code looking a little > strange. > > can you convert that now to be: > > ili_done: > if (iip->ili_lock_flags) { > iip->ili_lock_flags = 0; > return; > } > /* free the inode */ > libxfs_iput(ip, 0); > } yeah, I actually had that first. Not sure why I didn't go with it ;) (Still looks strange to my untrained eye; "if lock flags are set, unset them and don't free the inode, otherwise free it") Anyway, I'll resend. No need to educate me on these details, for now. ;) -Eric > Cheers, > > Dave. > From david@fromorbit.com Mon Mar 3 16:53:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 24F827F58 for ; Mon, 3 Mar 2014 16:53:52 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6699AC002 for ; Mon, 3 Mar 2014 14:53:51 -0800 (PST) X-ASG-Debug-ID: 1393887229-04bdf05dab219580001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id d8VunlU4Ia4rVhOb for ; Mon, 03 Mar 2014 14:53:49 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ApJuAOYGFVN5LJYePGdsb2JhbABaDoJ4g0OFDLNIhVmBHRcDAQEBAR8ZDSiCJQEBBAE6HCMFCwgDDgoJJQ8FJQMHGhOHcQfMXxcWjkMHhDgEmDuVGlMo Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Mar 2014 09:23:48 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WKbk1-000506-1g; Tue, 04 Mar 2014 09:53:45 +1100 Date: Tue, 4 Mar 2014 09:53:45 +1100 From: Dave Chinner To: Paul Brunk Cc: xfs@oss.sgi.com Subject: Re: rebuilt HW RAID60 array; XFS filesystem looks bad now Message-ID: <20140303225344.GM13647@dastard> X-ASG-Orig-Subj: Re: rebuilt HW RAID60 array; XFS filesystem looks bad now References: <5314EE97.3020004@uga.edu> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5314EE97.3020004@uga.edu> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1393887229 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145711 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 03, 2014 at 04:05:27PM -0500, Paul Brunk wrote: > Hi: > > Short version: XFS filesystem on HW RAID60 array. Array has been > multiply rebuilt due to drive insertions. XFS filesystem damaged and > trying to salvage what I can, and I want to make sure I have no option > other than "xfs_repair -L". Details follow. > > # uname -a > Linux rccstor7.local 2.6.32-431.5.1.el6.x86_64 #1 SMP Wed Feb 12 > 00:41:43 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux > > xfs_repair version 3.1.1. The box has one 4-core Opteron CPU and 8 > GB of RAM. > > I have a 32TB HW RAID60 volume (Areca 1680 HW RAID) made of two RAID6 > raid sets. Hmmm - yet another horror story from someone using an Areca HW RAID controller. I'm starting to wonder if we should be putting an entry in the FAQ saying "don't use Areca RAID controllers if you value your data"... [snip] > # mount /media/shares > mount: wrong fs type, bad option, bad superblock on /dev/mapper/vg0-lv0, > missing codepage or helper program, or other error > In some cases useful info is found in syslog - try > dmesg | tail or so > > # dmesg|tail > XFS (dm-2): Mounting Filesystem > XFS (dm-2): Log inconsistent or not a log (last==0, first!=1) > XFS (dm-2): empty log check failed > XFS (dm-2): log mount/recovery failed: error 22 > XFS (dm-2): log mount failed That's bad. The log does not contain a valid header in it's first block. > # xfs_repair -n /dev/dm-2 > produced at least 7863 lines of output. It begins > > Phase 1 - find and verify superblock... > Phase 2 - using internal log > - scan filesystem freespace and inode maps... > bad magic # 0xa04850d in btbno block 0/108 > expected level 0 got 10510 in btbno block 0/108 > bad btree nrecs (144, min=255, max=510) in btbno block 0/108 Corrupted freespace btree blocks. > block (0,80-80) multiply claimed by bno space tree, state - 2 > block (0,108-108) multiply claimed by bno space tree, state - 7 with duplicate entries in them. That's not a good sign... > > # egrep -c "invalid start block" xfsrepair.out > 2061 > # egrep -c "multiply claimed by bno" xfsrepair.out > 4753 > > Included in the output are 381 occurrences of this pair of messages: > > bad starting inode # (0 (0x0 0x0)) in ino rec, skipping rec > badly aligned inode rec (starting inode = 0) Ok, so the inode btree is also full of corrupt blocks. > Is there anything I should try prior to xfs_repair -L? Pray? Basically, then primary metadata in the filesystem that tracks allocated space and inodes looks to be badly corrupted. If the metadata is corrupted like this from the rebuild, then the rest of the block device is likely to be busted up just as badly. So you might be able to recover some of the filesysetm structure with XFS repair, but all your data is going to be just as corrupted. I'd be using metadump like Eric suggested to create a test image to see what filesystem structure you'll end up with after running repair. But with the corrupt AG btrees, there's a good chance even metadump won't be able to run successfully on the filesystem. And even that won't tell you how badly damaged the data is, just what data you will have access to after running repair. > I'm just trying to salvage whatever I can from this FS. I'm aware it > could be all gone. Thanks. Good luck :/ Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Mar 3 16:56:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3AFDA7F5A for ; Mon, 3 Mar 2014 16:56:10 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id ACA27AC002 for ; Mon, 3 Mar 2014 14:56:09 -0800 (PST) X-ASG-Debug-ID: 1393887367-04bdf05dab219760001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 7cbDGgUpOlrLr6Q9 for ; Mon, 03 Mar 2014 14:56:07 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao9uABMIFVN5LJYePGdsb2JhbABSCIMGg0OFDLNJhVmBHRcDAQEBAR8ZDSiCJQEBBScTHCMQCAMYCSUPBSUDBxoTh3jMXxcWjW1WB4Q4BJg7ilWLGCg Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Mar 2014 09:25:40 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WKbls-00050K-2i; Tue, 04 Mar 2014 09:55:40 +1100 Date: Tue, 4 Mar 2014 09:55:40 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfsprogs: fix use after free in inode_item_done() Message-ID: <20140303225540.GN13647@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: fix use after free in inode_item_done() References: <5314E912.9080708@redhat.com> <20140303223617.GL13647@dastard> <531506BD.80209@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <531506BD.80209@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1393887367 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145711 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 On Mon, Mar 03, 2014 at 04:48:29PM -0600, Eric Sandeen wrote: > On 3/3/14, 4:36 PM, Dave Chinner wrote: > > On Mon, Mar 03, 2014 at 02:41:54PM -0600, Eric Sandeen wrote: > >> Commit "3a19fb7 libxfs: stop caching inode structures" > >> introduced a use after free. > >> > >> libxfs_iput() already does the check for ip->i_itemp, and a > >> kmem_zone_free() if it's present, and then frees the ip pointer. > >> Re-checking ip->i_itemp after the libxfs_iput call will access > >> the freed ip pointer, as will setting ip_>i_itemp to NULL. > >> > >> Simply remove the offending code to fix this up. > > > > which leaves the rest of the ili_done: code looking a little > > strange. > > > > can you convert that now to be: > > > > ili_done: > > if (iip->ili_lock_flags) { > > iip->ili_lock_flags = 0; > > return; > > } > > /* free the inode */ > > libxfs_iput(ip, 0); > > } > > yeah, I actually had that first. Not sure why I didn't go with it ;) > > (Still looks strange to my untrained eye; "if lock flags are set, unset them and don't free the inode, otherwise free it") If the lock falgs are set, it means the caller expects the transaction commit to return the inode to it in a locked state. Exactly the same semantics as the kernel code - the lock flags track how the transaction releases the inode... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Mon Mar 3 16:58:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2F3907F60 for ; Mon, 3 Mar 2014 16:58:57 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9253EAC002 for ; Mon, 3 Mar 2014 14:58:56 -0800 (PST) X-ASG-Debug-ID: 1393887534-04cbb054b80d770001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id bsscoledvQ0sbtg4 for ; Mon, 03 Mar 2014 14:58:54 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id D4A09610C4E7; Mon, 3 Mar 2014 16:58:53 -0600 (CST) Message-ID: <53150924.2000208@sandeen.net> Date: Mon, 03 Mar 2014 16:58:44 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: [PATCH V2] xfsprogs: fix use after free in inode_item_done() References: <5314E912.9080708@redhat.com> X-ASG-Orig-Subj: [PATCH V2] xfsprogs: fix use after free in inode_item_done() In-Reply-To: <5314E912.9080708@redhat.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1393887534 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145711 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 Commit "3a19fb7 libxfs: stop caching inode structures" introduced a use after free. libxfs_iput() already does the check for ip->i_itemp, and a kmem_zone_free() if it's present, and then frees the ip pointer. Re-checking ip->i_itemp after the libxfs_iput call will access the freed ip pointer, as will setting ip_>i_itemp to NULL. Simply remove the offending code to fix this up. Signed-off-by: Eric Sandeen --- V2: Make it prettier based on Dave's comments. diff --git a/libxfs/trans.c b/libxfs/trans.c index 6c9d202..c443863 100644 --- a/libxfs/trans.c +++ b/libxfs/trans.c @@ -694,7 +694,6 @@ inode_item_done( xfs_mount_t *mp; xfs_buf_t *bp; int error; - extern kmem_zone_t *xfs_ili_zone; ip = iip->ili_inode; mp = iip->ili_item.li_mountp; @@ -736,15 +735,9 @@ ili_done: if (iip->ili_lock_flags) { iip->ili_lock_flags = 0; return; - } else { - libxfs_iput(ip, 0); } - - if (ip->i_itemp) - kmem_zone_free(xfs_ili_zone, ip->i_itemp); - else - ASSERT(0); - ip->i_itemp = NULL; + /* free the inode */ + libxfs_iput(ip, 0); } static void From david@fromorbit.com Mon Mar 3 17:14:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4BD7A7F62 for ; Mon, 3 Mar 2014 17:14:10 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B92C7AC004 for ; Mon, 3 Mar 2014 15:14:06 -0800 (PST) X-ASG-Debug-ID: 1393888441-04cb6c56771ffa80001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id HmiJjnPKBNgmO6CS for ; Mon, 03 Mar 2014 15:14:01 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao5uALwLFVN5LJYePGdsb2JhbABagwaDQ4UMs0mFWYEeFwMBAQEBHxkNKIIlAQEFJxMcIxAIAxgJJQ8FJQMHGhOHeMxiFxaOQweEOAEDmDuKVYsYKA Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Mar 2014 09:39:34 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WKbzI-00053H-QD; Tue, 04 Mar 2014 10:09:32 +1100 Date: Tue, 4 Mar 2014 10:09:32 +1100 From: Dave Chinner To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH V2] xfsprogs: fix use after free in inode_item_done() Message-ID: <20140303230932.GO13647@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfsprogs: fix use after free in inode_item_done() References: <5314E912.9080708@redhat.com> <53150924.2000208@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53150924.2000208@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1393888441 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145711 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 On Mon, Mar 03, 2014 at 04:58:44PM -0600, Eric Sandeen wrote: > Commit "3a19fb7 libxfs: stop caching inode structures" > introduced a use after free. > > libxfs_iput() already does the check for ip->i_itemp, and a > kmem_zone_free() if it's present, and then frees the ip pointer. > Re-checking ip->i_itemp after the libxfs_iput call will access > the freed ip pointer, as will setting ip_>i_itemp to NULL. > > Simply remove the offending code to fix this up. > > Signed-off-by: Eric Sandeen > --- > > V2: Make it prettier based on Dave's comments. looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Mar 3 17:15:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 032167F69 for ; Mon, 3 Mar 2014 17:15:04 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E23738F804C for ; Mon, 3 Mar 2014 15:15:03 -0800 (PST) X-ASG-Debug-ID: 1393888501-04cb6c56781ffb40001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id JZMghnmzGOY9Mz6z for ; Mon, 03 Mar 2014 15:15:02 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao1uALwLFVN5LJYePGdsb2JhbABagwaDQ4UMs0mFWYEeFwMBAQEBHxkNKIIlAQEFOhwjEAgDGAklDwUlAwcaE4d4zGIXFo5DB4Q4BJg7ilWLGCg Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Mar 2014 09:40:48 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WKc0J-00053U-KE; Tue, 04 Mar 2014 10:10:35 +1100 Date: Tue, 4 Mar 2014 10:10:35 +1100 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs_repair: fix array overrun in do_inode_prefetch Message-ID: <20140303231035.GP13647@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs_repair: fix array overrun in do_inode_prefetch References: <5314D476.7030503@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5314D476.7030503@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1393888501 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145711 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 03, 2014 at 01:13:58PM -0600, Eric Sandeen wrote: > Coverity spotted this: > > do_inode_prefetch() does a while loop, creating queues: > > for (i = 0; i < thread_count; i++) { > ... > create_work_queue(&queues[i], mp, 1); > ... > } > > and then does this to wait for them all to complete: > > for (; i >= 0; i--) > destroy_work_queue(&queues[i]); > > But we leave the first for loop with (i == thread_coun)t, and > the second one will try to index queues[] one past the end. ugh. My fault. Fix looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Mon Mar 3 19:21:10 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 36A757F4E for ; Mon, 3 Mar 2014 19:21:10 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 99F77AC004 for ; Mon, 3 Mar 2014 17:21:06 -0800 (PST) X-ASG-Debug-ID: 1393896062-04cbb054b716e70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZOip1dTOhMzFZcri for ; Mon, 03 Mar 2014 17:21:02 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s241L0QJ004460 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 3 Mar 2014 20:21:00 -0500 Received: from laptop.bfoster (vpn-50-144.rdu2.redhat.com [10.10.50.144]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s241Kxfm016981; Mon, 3 Mar 2014 20:20:59 -0500 Received: from laptop.bfoster (localhost.localdomain [127.0.0.1]) by laptop.bfoster (Postfix) with ESMTP id 585D71210DA; Mon, 3 Mar 2014 20:20:59 -0500 (EST) Received: (from bfoster@localhost) by laptop.bfoster (8.14.7/8.14.7/Submit) id s241Kwvs030885; Mon, 3 Mar 2014 20:20:58 -0500 X-Authentication-Warning: laptop.bfoster: bfoster set sender to bfoster@redhat.com using -f Date: Mon, 3 Mar 2014 20:20:57 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace Message-ID: <20140304012056.GA29755@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace References: <1393825194-1719-1-git-send-email-david@fromorbit.com> <1393825194-1719-2-git-send-email-david@fromorbit.com> <20140303174425.GB28196@laptop.bfoster> <20140303222946.GJ13647@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140303222946.GJ13647@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1393896062 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Mar 04, 2014 at 09:29:46AM +1100, Dave Chinner wrote: > On Mon, Mar 03, 2014 at 12:44:26PM -0500, Brian Foster wrote: > > On Mon, Mar 03, 2014 at 04:39:53PM +1100, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > While the verifier reoutines may return EFSBADCRC when a buffer ahs > > > a bad CRC, we need to translate that to EFSCORRUPTED so that the > > > higher layers treat the error appropriately and so we return a > > > consistent error to userspace. This fixes a xfs/005 regression. > > > > > > Signed-off-by: Dave Chinner > > > --- > > > > This change looks Ok to me, but when I start looking through the users > > of bp->b_error, I see examples like xfs_dir3_data_read() being called in > > xfs_dir2_leaf_addname() where it looks like an error could bubble all > > the way up to xfs_vn_mknod() and its callers. > > Sure, but: > > xfs_dir3_data_read > xfs_da_read_buf > xfs_trans_read_buf_map > > Which means the patch prevents the EFSBADCRC leaking back out > through that path because it converts it in xfs_trans_read_buf_map. > Ok, I see. FWIW, I was also trolling through some of the log recovery code and it appears that code uses b_ops for write verification purposes only (i.e., crc generation I suspect), correct? > > If the intent is to use EFSBADCRC as an internal-only error to > > differentiate corruption from crc failure, why not push this more > > closely to the boundaries that we have already defined? For example, we > > already convert positive errnos to negative at the internal/external > > boundaries. Could we convert those to use some kind of > > XFS_USERSPACE_ERROR(error) macro/helper that converts errors > > appropriately? > > That doesn't solve the problem needing an error conversion layer in > the first place. The long term goal is to remove the error > conversions in XFS by converting the core code to the same error > passing conventions as the rest of the kernel code. We manage to > screw the negation up fairly regularly because it is convoluted and > we cal into generic code that returns negative errors from the core > that returns positive errors in lots of places. The conversion > surface is just too large to manage sanely. > Well it wasn't clear that the error conversion layer was a problem that itself needed solving, but fair enough. ;) If the objective is to move away from the positive/negative business to something more "kernel native," then building more infrastructure around that is probably not the way to go, unless that was actually part of the changeover strategy (e.g., if we happened to use something that conditionally negated error values to support incremental codepath conversions... as a semi-random thought). > > Another thought could be to reconsider whether we still need some of > > these extra warnings, as in the xfs_mount.c hunk below, now that we have > > the generic xfs_verifier_error() messaging. E.g., if we could remove > > those, perhaps we could snub out EFSBADCRC in or around the verifier > > after it makes a distinction. > > Redundant errors aren't s significant problem. It's the lack of > meaningful error messages that are much more of an issue. We get > more meaningful error messages as a result of the EFSBADCRC changes > that have been made, but for the moment that error simply means > EFSCORRUPTED to the higher layers. Hence the translation back to > EFSCORRUPTED at the (low) layers where the error no longer has > a distinct meaning. > Right, the purpose is not to solve the problem of redundant errors. Rather, if the only thing preventing the consolidation of the EFSBADCRC trap to a single hunk are redundant errors, then it wouldn't be a problem to remove those errors and push the EFSBADCRC trap into the generic code for the purpose of clarity. Brian > As we add more functionality, EFSBADCRC will become more meaningful > and so get propagated higher into the kernel code. But for now, it > should remain an error that doesn't escape the lower layers... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From mnardarinkamar@karlie.com Mon Mar 3 19:41:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CE9FC7F4E for ; Mon, 3 Mar 2014 19:41:28 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6E790304032 for ; Mon, 3 Mar 2014 17:41:28 -0800 (PST) X-ASG-Debug-ID: 1393897285-04bdf05dac222460001-NocioJ Received: from hostforever.ru (hostforever.ru [195.211.103.205]) by cuda.sgi.com with ESMTP id ezMYRfXGJ4nrOMMt for ; Mon, 03 Mar 2014 17:41:25 -0800 (PST) X-Barracuda-Envelope-From: mnardarinkamar@karlie.com X-Barracuda-Apparent-Source-IP: 195.211.103.205 Received: from localhost (localhost [127.0.0.1]) by hostforever.ru (Postfix) with ESMTP id 6BE1B1D440E; Tue, 4 Mar 2014 05:41:29 +0400 (MSK) X-Virus-Scanned: Debian amavisd-new at mail.hostforever.ru Received: from hostforever.ru ([127.0.0.1]) by localhost (mail.ligrserv.net [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id orQVmS03pHH7; Tue, 4 Mar 2014 05:41:29 +0400 (MSK) Received: from 50-57-55-128.static.cloud-ips.com (unknown [50.57.55.128]) (Authenticated sender: info@shahovskoe.ru) by hostforever.ru (Postfix) with ESMTPA id C68DF1D440F; Tue, 4 Mar 2014 05:41:26 +0400 (MSK) Message-ID: <15125E858CEC4B96B21836715F69C3C9@mbmcfv> Reply-To: =?windows-1251?B?0Ojx6i3s5e3l5Obl8A==?= From: =?windows-1251?B?0Ojx6i3s5e3l5Obl8A==?= To: , , , Subject: =?windows-1251?B?x+Dw5ePo8fLw6PDu4uDt7fvpIO3gIOru7fLu?= =?windows-1251?B?8OUg4OLy7vLw4O3x7+7w8g==?= Date: Tue, 4 Mar 2014 02:41:29 +0100 X-ASG-Orig-Subj: =?windows-1251?B?x+Dw5ePo8fLw6PDu4uDt7fvpIO3gIOru7fLu?= =?windows-1251?B?8OUg4OLy7vLw4O3x7+7w8g==?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_1A22_01CF3753.3EDBF710" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-Barracuda-Connect: hostforever.ru[195.211.103.205] X-Barracuda-Start-Time: 1393897285 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145719 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is a multi-part message in MIME format. ------=_NextPart_000_1A22_01CF3753.3EDBF710 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =D1=EF=E5=F6=E8=E0=EB=FC=ED=EE =E4=EB=FF =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5= =EB=E5=E9 =EF=F0=E5=E4=EF=F0=E8=FF=F2=E8=E9 =E8 =F1=EE=F2=F0=F3=E4=ED=E8=EA= =EE=E2 =F1=EB=F3=E6=E1 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8: =C4=E5=EB=EE=E2=E0=FF =E8 =EA=EE=ED=EA=F3=F0=E5=ED=F2=ED=E0=FF =F0=E0=E7= =E2=E5=E4=EA=E0.=20 =D1=EE=E2=F0=E5=EC=E5=ED=ED=FB=E5 =F2=E5=F5=ED=EE=EB=EE=E3=E8=E8 =E8 =EF= =EE=E4=F5=EE=E4=FB. =D1=C0=CD=CA=D2-=CF=C5=D2=C5=D0=C1=D3=D0=C3, 11, 12 =CC=C0=D0=D2=C0 =C7a=ED=FF=F2=E8=FF =EF=F0o=E9=E4y=F2 =E2 =F2=E5=F7=E5=ED=E8=E5 =E4=E2y= x =E4=EDe=E9 c 10:00 =E4o 17:00 c =EFe=F0e=F0=FB=E2a=EC=E8 =EDa =EAo=F4e-= =E1=F0e=E9=EA =E8 o=E1e=E4. =C4=EB=FF =EFo=EBy=F7e=ED=E8=FF =EFo=EB=EDo=E9 =EF=F0o=E3=F0a=EC=EC=FB = =E8 yc=EBo=E2=E8=E9 y=F7ac=F2=E8=FF c=E2=FF=E6=E8=F2ec=FC c =EDa=EC=E8 =EF= o =F2e=EBe=F4o=EDy: 8 =EA=EE=E4_=D1=CF=E1 64--2 - 5--8 -- =E7= I =D2=E5=EC=E0=F2=E8=EA=E0 =EC=E5=F0=EE=EF=F0=E8=FF=F2=E8=FF: =CC=E5=F1=F2=EE =E4=E5=EB=EE=E2=EE=E9 =E8 =EA=EE=ED=EA=F3=F0=E5=ED=F2=ED= =EE=E9 =F0=E0=E7=E2=E5=E4=EA=E8 =E2 =EE=E1=E5=F1=EF=E5=F7=E5=ED=E8=E8 =FD= =EA=EE=ED=EE=EC=E8=F7=E5=F1=EA=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8= =E1=E8=E7=ED=E5=F1=E0.=20 =CA=EE=ED=EA=F3=F0=E5=ED=F6=E8=FF =E8 =EA=EE=ED=EA=F3=F0=E5=ED=F2=ED=E0= =FF =F0=E0=E7=E2=E5=E4=EA=E0. =D0=EE=EB=FC =E1=E8=E7=ED=E5=F1-=F0=E0=E7=E2=E5=E4=EA=E8 =E2 =EF=F0=E8=ED= =FF=F2=E8=E8 =F3=EF=F0=E0=E2=EB=E5=ED=F7=E5=F1=EA=EE=E3=EE =F0=E5=F8=E5=ED= =E8=FF. =C1=E8=E7=ED=E5=F1-=F0=E0=E7=E2=E5=E4=EA=E0 =E8 =E1=E5=E7=EE=EF=E0=F1=ED= =EE=F1=F2=FC =E1=E8=E7=ED=E5=F1=E0. =CE=F1=ED=EE=E2=ED=FB=E5 =ED=E0=EF=F0=E0=E2=EB=E5=ED=E8=FF =E2=E5=E4=E5= =ED=E8=FF =E4=E5=EB=EE=E2=EE=E9 =F0=E0=E7=E2=E5=E4=EA=E8. =D7=E5=EB=EE=E2=E5=F7=E5=F1=EA=E8=E9 =F4=E0=EA=F2=EE=F0 =E2 =E4=E5=EB=EE= =E2=EE=E9 =F0=E0=E7=E2=E5=E4=EA=E5. =CE=E1=F9=E8=E5 =EF=EE=EB=EE=E6=E5=ED=E8=FF =EF=EE =E8=ED=F4=EE=F0=EC=E0= =F6=E8=EE=ED=ED=EE=E9 =E1=E5=E7=EE=EF=E0=F1=ED=EE=F1=F2=E8. =CF=F0=E0=E2=EE=E2=FB=E5 =EE=F1=ED=EE=E2=FB =E7=E0=F9=E8=F2=FB =EA=EE=ED= =F4=E8=E4=E5=ED=F6=E8=E0=EB=FC=ED=EE=E9 =E8=ED=F4=EE=F0=EC=E0=F6=E8=E8. =CF=F0=EE=EC=FB=F8=EB=E5=ED=ED=E0=FF =EA=EE=ED=F2=F0=F0=E0=E7=E2=E5=E4=EA= =E0.=20 =CE=F0=E3=E0=ED=E8=E7=E0=F6=E8=FF =F1=EB=F3=E6=E1=FB =E1=E8=E7=ED=E5=F1= -=F0=E0=E7=E2=E5=E4=EA=E8. =20 =C0=EF=EF=E0=F0=E0=F2=ED=FB=E5 =E8 =EF=F0=EE=E3=F0=E0=EC=EC=ED=FB=E5 =F1= =F0=E5=E4=F1=F2=E2=E0 =E7=E0=F9=E8=F2=FB. ------=_NextPart_000_1A22_01CF3753.3EDBF710 Content-Type: application/msword; name="=?windows-1251?B?4O3g6+jy6Pfl8erg/yDw4Ofi5eTq4C5kb2M=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?windows-1251?B?4O3g6+jy6Pfl8erg/yDw4Ofi5eTq4C5kb2M=?=" 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAYAAAAAAAAAAA EAAAYgAAAAEAAAD+////AAAAAF8AAAD///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////s pcEAX8AZBAAA8BK/AAAAAAAAEAAAAAAACAAAuCAAAA4AYmpiagAVABUAAAAAAAAAAAAAAAAAAAAA AAAZBBYA7V0AAGJ/AABifwAAWwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAA AAAAAAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAALcAAAAAAK4GAAAAAAAArgYAACcU AAAAAAAAJxQAAAAAAAAnFAAAAAAAACcUAAAAAAAAJxQAABQAAAAAAAAAAAAAAP////8AAAAAOxQA AAAAAAA7FAAAAAAAADsUAAAAAAAAOxQAABQAAABPFAAAFAAAADsUAAAAAAAA+jkAAOQBAABjFAAA AAAAAGMUAAAAAAAAYxQAAAAAAABjFAAAAAAAAGMUAAAAAAAAcBYAAAAAAABwFgAAAAAAAHAWAAAA AAAAbTkAAAIAAABvOQAAAAAAAG85AAAAAAAAbzkAAAAAAABvOQAAAAAAAG85AAAAAAAAbzkAACQA AADeOwAAsgIAAJA+AAA+AAAAkzkAACEAAAAAAAAAAAAAAAAAAAAAAAAAJxQAAAAAAABwFgAAAAAA AAAAAAAAAAAAAAAAAAAAAABOFgAAIgAAAHAWAAAAAAAAcBYAAAAAAABwFgAAAAAAAJM5AAAAAAAA AAAAAAAAAAAnFAAAAAAAACcUAAAAAAAAYxQAAAAAAAAAAAAAAAAAAGMUAADrAQAAtDkAABYAAAAM FwAAAAAAAAwXAAAAAAAADBcAAAAAAABwFgAAOgAAACcUAAAAAAAAYxQAAAAAAAAnFAAAAAAAAGMU AAAAAAAAbTkAAAAAAAAAAAAAAAAAAAwXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAcBYAAAAAAABtOQAAAAAAAAAAAAAAAAAADBcAAAAAAAAMFwAA qgAAAOElAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEScAAAAAAABjFAAAAAAAAP////8AAAAAwH+mrhI3 zwEAAAAAAAAAAP////8AAAAAqhYAACIAAABdJgAAEgAAAAAAAAAAAAAAWTkAABQAAADKOQAAMAAA APo5AAAAAAAAbyYAAKIAAADOPgAAAAAAAMwWAABAAAAAzj4AACQAAAARJwAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR JwAAcBAAAM4+AAAAAAAAAAAAAAAAAAAnFAAAAAAAAIE3AADYAQAAcBYAAAAAAABwFgAAAAAAAAwX AAAAAAAAcBYAAAAAAABwFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcBYA AAAAAABwFgAAAAAAAHAWAAAAAAAAkzkAAAAAAACTOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAADBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAWAAAA AAAAcBYAAAAAAABwFgAAAAAAAPo5AAAAAAAAcBYAAAAAAABwFgAAAAAAAHAWAAAAAAAAcBYAAAAA AAAAAAAAAAAAAP////8AAAAA/////wAAAAD/////AAAAAAAAAAAAAAAA/////wAAAAD/////AAAA AP////8AAAAA/////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD/////AAAAAP////8AAAAA /////wAAAAD/////AAAAAP////8AAAAA/////wAAAAD/////AAAAAM4+AAAAAAAAcBYAAAAAAABw FgAAAAAAAHAWAAAAAAAAcBYAAAAAAABwFgAAAAAAAHAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwFgAAAAAAAHAWAAAAAAAAcBYA AAAAAACuBgAAPwwAAO0SAAA6AQAABQASAQAAGQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0ENQRB BDwEPgRCBEAETwQgAD0EMAQgAEIEPgQsACAARwRCBD4EIAA/BD4EPQRPBEIEOAQ1BCAAIgARBDgE NwQ9BDUEQQQtAEAEMAQ3BDIENQQ0BDoEMAQiACAAKAA4BDsEOAQgACIAGgQ+BD0EOgRDBEAENQQ9 BEIEPQQwBE8EIABABDAENwQyBDUENAQ6BDAEIgApACAAMARBBEEEPgRGBDgEOARABEMENQRCBEEE TwQgAEMEIABDBEcEMARBBEIEPQQ4BDoEPgQyBCAAQARLBD0EOgQwBCAAQQQgAE0EOgQ+BD0EPgQ8 BDgERwQ1BEEEOgQ4BDwEIABIBD8EOAQ+BD0EMAQ2BDUEPAQsACAACABDBEEEPwQ1BEUEIAA0BDUE PwQ1BDsEPgQ/BDUEQARBBDoEPgQzBD4EIAA4BCAAQQQ+BD8EQAQ1BDQENQQ7BEwEPQRLBEUEIAAx BDgENwQ9BDUEQQQ+BDIEIAA9BDAEIAA4ADAALQA5ADAAJQAgADcEMAQyBDgEQQQ4BEIEIAA4BDwE NQQ9BD0EPgQgAD4EQgQgADMEQAQwBDwEPgRCBD0EPgQ5BCAAQAQwBDEEPgRCBEsEIABBBDsEQwQ2 BDEESwQgADEEOAQ3BD0ENQRBBC0AQAQwBDcEMgQ1BDQEOgQ4BC4AIAAfBEAEOAQgAE0EQgQ+BDwE IAA3BDAEQgRABDAEQgRLBCAAPQQwBCAAPQQ1BDUEIABBBD4EQQRCBDAEMgQ7BE8ETgRCBCAANAQ+ BCAANQAlACAAPgRCBCAAPwRABDgEMQRLBDsEOAQgADoEPgQ8BD8EMAQ9BDgEOAQuAA0ADQARBDgE NwQ9BDUEQQQtAEAEMAQ3BDIENQQ0BDoEMAQgADIEIAA0BDUEMgQ1BDsEPgQ/BDwENQQ9BEIENQQg AC0AIABNBEIEPgQgAD0ENQQ+BEIESgQ1BDwEOwQ1BDwEMARPBCAARwQwBEEEQgRMBCAAPgQxBDUE QQQ/BDUERwQ1BD0EOARPBCAAMQQ1BDcEPgQ/BDAEQQQ9BD4EQQRCBDgEIAAxBDgENwQ9BDUEQQQw BDoAIAAyBCAAMQQ+BDsETARIBDgERQQgADoEPgQ8BD8EMAQ9BDgETwRFBCAAPAQ+BDMEQwRCBCAA QQQ+BDcENAQwBDIEMARCBEwEQQRPBCAANAQwBDYENQQgAEEEMAQ8BD4EQQRCBD4ETwRCBDUEOwRM BD0ESwQ1BCAAPwQ+BDQEQAQwBDcENAQ1BDsENQQ9BDgETwQsACAAOgQ+BEIEPgRABEsENQQgADAE PQQwBDsEOAQ3BDgEQARDBE4EQgQgADoEPgQ9BDoEQwRABDUEPQRCBD0EQwROBCAAQQRABDUENARD BCAAQQQgAD8EPgQ3BDgERgQ4BDkEIAAxBDUENwQ+BD8EMARBBD0EPgRBBEIEOAQuACAAHQQ+BCAA NAQwBDYENQQgADUEQQQ7BDgEIABDBCAAEgQwBEEEIAA9BDUEMQQ+BDsETARIBD4EOQQgADEEOAQ3 BD0ENQRBBCAAEyAgADIEPgQ/BEAEPgRBBCAANAQ+BDEEQAQ+BD8EPgRABE8ENAQ+BEcEPQQ+BEEE QgQ4BCAAOAQgAD8EOwQwBEIENQQ2BDUEQQQ/BD4EQQQ+BDEEPQQ+BEEEQgQ4BCAAOgQ+BD0EQgRA BDAEMwQ1BD0EQgQwBCAAMgRBBEIEMAQ1BEIEIAA/BEAEMAQ6BEIEOARHBDUEQQQ6BDgEIAA6BDAE NgQ0BEsEOQQgADQENQQ9BEwELgAgABQEOwRPBCAAQgQ+BDMEPgQsACAARwRCBD4EMQRLBCAAPQQw BCAAPQQ1BDMEPgQgAD4EQgQyBDUEQgQ4BEIETAQsACAAPQQwBDQEPgQgADcEPQQwBEIETAQgAEEE PwQ+BEEEPgQxBEsEIAA4BCAAPAQ1BEIEPgQ0BEsEIAA7BDUEMwQwBDsETAQ9BD4EMwQ+BCAAQQQx BD4EQAQwBCAAOAQ9BEQEPgRABDwEMARGBDgEOAQsACAAPgRBBD0EPgQyBD0ESwQ1BCAAPwQ+BDQE RQQ+BDQESwQgADoEIAAwBD0EMAQ7BDgENwRDBCAAOAQ9BEQEPgRABDwEMARGBDgEOAQsACAAqwBA BDAEQQRCBEAEPgQyBEsENQQgAD8EQAQ4BDcEPQQwBDoEOAQgAD4EPwQwBEEEPQQ+BEEEQgQ4BLsA IAAyBD4EIAAyBDcEMAQ4BDwEPgQ+BEIEPQQ+BEgENQQ9BDgETwRFBCAAPAQ1BDYENARDBCAATgRA BDgENAQ4BEcENQRBBDoEOAQ8BDgEIAA7BDgERgQwBDwEOAQgADgEIAA4BD0ESwQ1BCAAQgQ+BD0E OgQ+BEEEQgQ4BCAAKAA9BDAEPwRABDgEPAQ1BEAELAAgADoEMAQ6BCAAPgQ/BEAENQQ0BDUEOwQ4 BEIETAQgAEQEOAQ9BDAEPQRBBD4EMgRDBE4EIABDBEEEQgQ+BDkERwQ4BDIEPgRBBEIETAQgADoE PgQ8BD8EMAQ9BDgEOAQgAD8EPgQgAD8EQAQ1BDQEQQRCBDAEMgQ7BDUEPQQ9BEsEPAQgADEEQwRF BDMEMAQ7BEIENQRABEEEOgQ4BDwEIAA0BD4EOgRDBDwENQQ9BEIEMAQ8BCkALgANAA0AHQQwBEgE IABGBDUEPQRCBEAEIAA6BEAEMARCBDoEPgRBBEAEPgRHBD0EPgQzBD4EIAA+BDEEQwRHBDUEPQQ4 BE8EIAA/BEAEPgQyBD4ENAQ4BEIEIABBBDUEPAQ4BD0EMARABEsEIAA4BCAAOgRDBEAEQQRLBCAA PwQ+BCAAOgQ+BD0EOgRDBEAENQQ9BEIEPQQ+BDkEIABABDAENwQyBDUENAQ6BDUELgAgABIESwQg ADwEPgQ2BDUEQgQ1BCAAPQQwBEMERwQ4BEIETARBBE8EIAA9BDAEIABNBEIEOARFBCAAQQQ1BDwE OAQ9BDAEQAQwBEUEIABCBDUEPgRABDgEOAQgADgEIAA/BEAEMAQ6BEIEOAQ6BDUEIAA/BEAEOAQ8 BDUEPQQ1BD0EOARPBCAAPAQ1BEIEPgQ0BD4EMgQgAEAEMAQ3BDIENQQ0BDoEOAQsACAAPwQ1BEAE NQQ9BDUEQQQ1BD0EPQRLBEUEIAAyBCAAMQQ4BDcEPQQ1BEEELAAgADgEIAAwBDQEMAQ/BEIEOARA BD4EMgQwBD0EPQRLBEUEIAA6BCAAMQQ4BDcEPQQ1BEEEQwQuAA0ADQASBCAAQAQ1BDcEQwQ7BEwE QgQwBEIENQQgAD4EMQRDBEcENQQ9BDgETwQgABIESwQ6AA0ADQBABDAEQQRBBDwEPgRCBEAEOARC BDUEIABBBDgEQQRCBDUEPAQ9BEsEOQQgAD8EPgQ0BEUEPgQ0BCAAOgQgADgEPQREBD4EQAQ8BDAE RgQ4BD4EPQQ9BD4ELQAwBD0EMAQ7BDgEQgQ4BEcENQRBBDoEPgQ5BCAAQAQwBDEEPgRCBDUEIAAy BCAAQAQ1BEgENQQ9BDgEOAQgADcEMAQ0BDAERwQgAD8EPgQgAD4EMQQ1BEEEPwQ1BEcENQQ9BDgE TgQgADEENQQ3BD4EPwQwBEEEPQQ+BEEEQgQ4BCAAOgQ+BDwEPwQwBD0EOAQ4BA0APwQ+BDsEQwRH BDgEQgQ1BCAAQQQ4BEEEQgQ1BDwEPQRLBDUEIAA3BD0EMAQ9BDgETwQgAD8EPgQgAD8EQAQwBDIE OAQ7BDAEPAQgAEEEPgQ3BDQEMAQ9BDgETwQgAD8EPgQ0BEAEMAQ3BDQENQQ7BDUEPQQ4BE8EIAA6 BD4EPQQ6BEMEQAQ1BD0EQgQ9BD4EOQQgAEAEMAQ3BDIENQQ0BDoEOAQsACAAPwQ+BEAETwQ0BDoE QwQgAD8EQAQ+BDIENQQ0BDUEPQQ4BE8EIAA6BD4EPQQ6BEMEQAQ1BD0EQgQ9BD4EOQQgAEAEMAQ3 BDIENQQ0BDoEOAQgADIEIAA6BD4EPAQ/BDAEPQQ4BDgELAAgAEEEPwQ+BEEEPgQxBDAEPAQgADgE IAA8BDUEQgQ+BDQEMAQ8BCAAQQQxBD4EQAQwBCAAOAQgADAEPQQwBDsEOAQAAAAIAAAQCQAAEgkA AHIKAADGDwAAyA8AAMoPAACGEQAAiBEAALwRAAD+EwAAABgAAGwZAAB2GQAAeBkAAL4ZAADAGQAA yhkAAM4ZAADQGQAA8hkAAPQZAAD2GQAAAhoAABQaAAAkGwAAJhsAAIIbAACEGwAAhhsAAAQeAAAG HgAACB4AAA4eAADx4/HY0NjCs6LYoNiUi4KUgpSClIKUgouUs6J20NjQZlYAAAAfFWjpMAcAFmjp MAcANQiBQ0osAE9KBABRSgQAYUosAB8VaKBNpAAWaKBNpAA1CIFDSiwAT0oEAFFKBABhSiwAFxVo oE2kABZooE2kADUIgU9KBABRSgQAERZo6TAHADUIgU9KBQBRSgUAERZozWnrADUIgU9KBQBRSgUA FxVooE2kABZooE2kADUIgU9KBQBRSgUAA1UIASAVaLw0cgAWaKBNpAA1CIFCKglPSgQAUUoEAHBo ADOZAAAdFWi8NHIAFmigTaQAQioJT0oEAFFKBABwaAAzmQAbFWigTaQAFmigTaQANQiBT0oFAFFK BQBeSgMADhZooE2kAE9KBABRSgQAABQVaKBNpAAWaKBNpABPSgQAUUoEAAAaA2oAAAAAFmg3VUkA VQgBbUgABG5IAAR1CAEAGxVooE2kABZooE2kADYIgU9KAwBRSgMAXkoDAAAhAAgAAHIKAAB0CgAA yA8AAMoPAACGEQAAiBEAALwRAAC+EQAArBIAABwYAABqGQAAbBkAANAZAAAkGwAAJhsAAIIbAACE GwAA3hsAAFAcAAC+HAAA/hwAAAAdAAD2AAAAAAAAAAAAAAAA8QAAAAAAAAAAAAAAAOUAAAAAAAAA AAAAAADdAAAAAAAAAAAAAAAA1QAAAAAAAAAAAAAAAPEAAAAAAAAAAAAAAADVAAAAAAAAAAAAAAAA 8QAAAAAAAAAAAAAAAM0AAAAAAAAAAAAAAADNAAAAAAAAAAAAAAAAzQAAAAAAAAAAAAAAAPEAAAAA AAAAAAAAAADVAAAAAAAAAAAAAAAA1QAAAAAAAAAAAAAAAPEAAAAAAAAAAAAAAADVAAAAAAAAAAAA AAAA1QAAAAAAAAAAAAAAAMUAAAAAAAAAAAAAAADFAAAAAAAAAAAAAAAAxQAAAAAAAAAAAAAAAMUA AAAAAAAAAAAAAADxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAomAAtGBgBnZKBNpAAI AAAKJgALRgUAZ2SgTaQAAAcAAAMkAWEkAWdkoE2kAAAHAAADJANhJANnZKBNpAAACwAAAyQDD4Qw /V6EMP1hJANnZKBNpAAABAAAZ2SgTaQAAAgAAA+E2AlehNgJZ2SgTaQAABY3BDAEIAA4BD0ERAQ+ BEAEPAQwBEYEOAQ4BA0AQwRBBD4EMgQ1BEAESAQ1BD0EQQRCBDIEQwQ1BEIENQQgAD8EQAQwBDoE QgQ4BEcENQRBBDoEOAQ1BCAAPQQwBDIESwQ6BDgEIAA/BEAEPgQyBDUENAQ1BD0EOARPBCAAOAQ9 BEQEPgRABDwEMARGBDgEPgQ9BD0EPgQtADAEPQQwBDsEOARCBDgERwQ1BEEEOgQ+BDkEIABABDAE MQQ+BEIESwQgAD8EPgQgAD4EPwRABDUENAQ1BDsENQQ9BDgETgQgAEQEOAQ9BDAEPQRBBD4EMgQ+ BDkEIABDBEEEQgQ+BDkERwQ4BDIEPgRBBEIEOAQgADoEPgQ8BD8EMAQ9BDgEOAQgAD0EMAQgAD4E QQQ9BD4EMgQ1BCAAPwRABDUENARBBEIEMAQyBDsETwQ1BDwESwRFBCAANAQ+BDoEQwQ8BDUEPQRC BD4EMgQNAA0AFAQwBEIEMAQgAEEEOwQ1BDQEQwROBEkENQQzBD4EIAA6BEMEQARBBDAEIAA/BD4E IABABDAENwQyBDUENAQ6BDUEIAAtACAAMQAxAC0AMQAyACAAHAQQBCAEIgQQBC4AIAANABMEPgRA BD4ENAQgAD8EQAQ+BDIENQQ0BDUEPQQ4BE8EIAATICAAIQQQBB0EGgQiBC0AHwQVBCIEFQQgBBEE IwQgBBMELgAgABwENQRABD4EPwRABDgETwRCBDgENQQgAEEEPgRBBEIEPgQ4BEIEQQRPBCAAQQQg AD8EQAQ4BDwENQQ9BDUEPQQ4BDUEPAQgAEEEMAQ8BEsERQQgADAEOgRCBEMEMAQ7BEwEPQRLBEUE IAA8BDUEQgQ+BDQEOAQ6BCAAOAQgADgEPQRBBEIEQARDBDwENQQ9BEIEPgQyBCwAIAAxBEMENAQ1 BEIEIABBBD4ENAQ1BEAENgQwBEIETAQgADEEPgQ7BEwESAQ+BDUEIAA6BD4EOwQ4BEcENQRBBEIE MgQ+BCAAPwRABDAEOgRCBDgERwQ1BEEEOgQ4BEUEIAA3BDAENAQwBD0EOAQ5BC4ADQANABIEQQQ1 BDwEIABDBEcEMARBBEIEPQQ4BDoEMAQ8BCAAQQQ1BDwEOAQ9BDAEQAQwBCAAMQRDBDQENQRCBCAA PwRABDUENAQ+BEEEQgQwBDIEOwQ1BD0EPgQ6AA0ADQA+BDEEQwRHBDUEPQQ4BDUEIAA/BD4EIAA/ BEAEPgQzBEAEMAQ8BDwENQQgAEEEIAAyBEsENAQwBEcENQQ5BCAAIQQ1BEAEQgQ4BEQEOAQ6BDAE QgQwBDsADQA6BD4EPAQ/BDsENQQ6BEIEIAAwBDoEQgRDBDAEOwRMBD0ESwRFBCAAOAQ9BEQEPgRA BDwEMARGBDgEPgQ9BD0EPgQtAEEEPwRABDAEMgQ+BEcEPQRLBEUEIAA8BDAEQgQ1BEAEOAQwBDsE PgQyBDsADQA6BEMEOwRMBEIEQwRABD0EMARPBCAAPwRABD4EMwRABDAEPAQ8BDAEIAAiABcEPQQw BDoEPgQ8BEEEQgQyBD4EIABBBCAAIQQwBD0EOgRCBC0AHwQ1BEIENQRABDEEQwRABDMEPgQ8BCIA OwANADUENgQ1BDQEPQQ1BDIEPQRLBDUEIAA+BDEENQQ0BEsEIAA4BCAAOgQ+BEQENQQtADEEQAQ1 BDkEOgQ4BC4ADQANABcEMAQ0BDAEQgRMBCAAMgQ+BD8EQAQ+BEEESwQgAD8EPgQgAEMEQQQ7BD4E MgQ4BE8EPAQgAEMERwQwBEEEQgQ4BE8EIAAyBCAAPgQxBEMERwQ1BD0EOAQ4BCwAIAA/BD4EOwRD BEcEOARCBEwEIAA/BD4EOwQ9BEMETgQgAD8EQAQ+BDMEQAQwBDwEPARDBCAAOgRDBEAEQQQwBCAA OAQgAEAEMARBBD8EOARBBDAEPQQ4BDUEIAA8BD4ENgQ9BD4EIAA/BD4EIABCBDUEOwQ1BEQEPgQ9 BEMEIAAyBCAAIQQwBD0EOgRCBC0AHwQ1BEIENQRABDEEQwRABDMENQQ6ACAADQAoADgAMQAyACkA IAA2ADQAMgAgADUAOAAgADMAMQANAA0AEgQ+BDcEPAQ+BDYEPQQ+BCAAOgQ+BEAEPwQ+BEAEMARC BDgEMgQ9BD4ENQQgAD4EMQRDBEcENQQ9BDgENQQgACgANAQ7BE8EIABBBD4EQgRABEMENAQ9BDgE OgQ+BDIEIABCBD4EOwRMBDoEPgQgABIEMARIBDUEOQQgADoEPgQ8BD8EMAQ9BDgEOAQpACAAOAQv ADgEOwQ4BCAAQQQ/BDUERgQ4BDAEOwRMBD0ESwQ1BCAAPwRABDUENAQ7BD4ENgQ1BD0EOARPBCAA NAQ7BE8EIAA6BD4EQAQ/BD4EQAQwBEIEOAQyBD0ESwRFBCAAOgQ7BDgENQQ9BEIEPgQyBC4AIAAt BEIEPgQgAD8EPgQ3BDIEPgQ7BDgEQgQgADAENAQwBD8EQgQ4BEAEPgQyBDAEQgRMBCAAOgRDBEAE QQQgADoEIAA9BEMENgQ0BDAEPAQgABIEMARIBDUEMwQ+BCAAPwRABDUENAQ/BEAEOARPBEIEOARP BCAAOAQgAD0ENQQ/BD4EQQRABDUENARBBEIEMgQ1BD0EPQQ+BCAAMgQ+BCAAMgRABDUEPARPBCAA QwRHBDUEMQRLBCAAQAQ1BEgEMARCBEwEIAA6BD4EPQQ6BEAENQRCBD0ESwQ1BCAANwQwBDQEMARH BDgELAAgAEEEPgRFBEAEMAQ9BE8ETwQgADoEPgQ9BEQEOAQ0BDUEPQRGBDgEMAQ7BEwEPQQ+BEEE QgRMBCAAMgQgAD4EQgQ9BD4ESAQ1BD0EOAQ4BCAAPwRABD4EMQQ7BDUEPAQgADoEPgQ8BD8EMAQ9 BDgEOAQgADgEIABIBDAEMwQ+BDIEIAA/BD4EIAA4BEUEIABABDUESAQ1BD0EOAROBC4ADQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0AAAYeAAAmHgAAKB4AALgg AAD6AAAAAAAAAAAAAAAA8gAAAAAAAAAAAAAAAOoAAAAAAAAAAAAAAADeAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAMkAw+EMP1ehDD9YSQDZ2SgTaQAAAcAAAMk A2EkA2dkoE2kAAAHAAADJAFhJAFnZKBNpAAABAAAZ2SgTaQAAAQOHgAAEB4AACQeAAAmHgAAKB4A ALgeAAC8HgAAKh8AACwfAAAkIAAAKCAAAHggAACKIAAAtiAAALggAADy4tLHu7K7sruyu7K7pgAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcVaKBNpAAWaChL7QA1CIFPSgUAUUoFABEWaKBN pAA1CIFPSgUAUUoFABcVaKBNpAAWaKBNpAA1CIFPSgUAUUoFABQVaKBNpAAWaKBNpABPSgQAUUoE AAAfFWigTaQAFmigTaQANQiBQ0o4AE9KBABRSgQAYUo4AB8VaOkwBwAWaOkwBwA1CIFDSiwAT0oE AFFKBABhSiwAGRZo6TAHADUIgUNKLABPSgQAUUoEAGFKLAAADjIAMZBoATpwoE2kAB+wgi4gsMZB IbClBiKwUgMjkGgBJJBuBCWwAAAXsMQCGLDEAgyQxAIAbh7wsTcAAESg9P6Fpq/X4xLX93L+tD// iVBORw0KGgoAAAANSUhEUgAAAKEAAACLCAYAAAAJZvnmAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ bWFnZVJlYWR5ccllPAAAA2RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6 eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEz NDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu MC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVz b3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1N Ok9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGNTVBRkFBMEYwNzJERjExOTE0OUM1Nzc2QzA5 QjY1QiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCQUU4MEQ2OTczQTIxMURGQjlDMjlGNzg4 RTJFRjlCQSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCQUU4MEQ2ODczQTIxMURGQjlDMjlG Nzg4RTJFRjlCQSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3Mi PiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozRjk4MkZFREYy NzJERjExOTE0OUM1Nzc2QzA5QjY1QiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGNTVBRkFB MEYwNzJERjExOTE0OUM1Nzc2QzA5QjY1QiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRG PiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pvju22MAADPSSURBVHja7H0LnFVVvf9a a+9zhoGBwREMJVAMpTCUHMQoCsPIB6UXP3g1ut70r3+9di0J039eyv6WXk3/2vVeryZpmIVpmvxF TZIwX0ESJDYKUqSGDqKTPAdmZu+91rq/33rsvfaZMzNnHucxMEsXZ88+++y99lrf9Xuv36JSStLd 8slFvyJFKmOh1mOlFCsdCcdZ+JzkXgRt3gwfu+CzEZq/Ho5tfYMMlKKX3118ep/ez6+AdzqVEjKX MnoGY3QkAI5gJer/9KdGIP4vx5vPevjnDAFIlEIiODcIIR+Gqx6EumEALv2jlAuE9YCpCwF4cxlj IwF8hDINPl3xkuQzBiBJgKgg6HxKDcSJAMhrpBDXCC4b4PhGuOD+gWHeH0EoRU+fNwOQda3nsRkA PgU89WmApymgRlwMQJIHg+YEVdQQfosAhE/J4F+kiOq+chLnYong4hopBYLx3oHhrszCSvScWYCq VZ7vPZPJ+jP8jE/8jEd83yMASFWZ5ylAMgUg6gAzDxHUdFJdwyg1v9P38fCepmbgGfC8CZ7vL4aL n4GfTRgY8v2GEhZ8pQf1LgDIhQgK5mmwtGe96XsrNquoGzF/xBzYIjChji771tIjUEr4F6iiVN9J C9YZQBlfEpx/Cy65dWDo+71MWDAKb9EARArFNAgdxcO9j5LpLPhkIuflgpG44MMPpskl3lda6onf MH17D88pSqkuq+ZU3sIjPgO+/RLU5gEI9FcQFiYSjoJ6GUMAMl1jzdfiT2u4VqmIP4X7twKium49 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 DgAAAA4AAAAOAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMgYAABgAAADAAwAA0AMAAOADAADwAwAAAAQA ABAEAAAgBAAAMAQAAEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA4AMAAPADAAAABAAA EAQAADIGAAAoAgAA2AEAAOgBAAAgBAAAMAQAAEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQ AwAA4AMAAPADAAAABAAAEAQAACAEAAAwBAAAQAQAAFAEAABgBAAAcAQAAIAEAACQBAAAwAMAANAD AADgAwAA8AMAAAAEAAAQBAAAIAQAADAEAABABAAAUAQAAGAEAABwBAAAgAQAAJAEAADAAwAA0AMA AOADAADwAwAAAAQAABAEAAAgBAAAMAQAAEAEAABQBAAAYAQAAHAEAACABAAAkAQAAMADAADQAwAA 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 AAAhAGt5lhaDAAAAigAAABwAAAAAAAAAAAAAAAAAGQIAAHRoZW1lL3RoZW1lL3RoZW1lTWFuYWdl ci54bWxQSwECLQAUAAYACAAAACEApV59LccGAADXGwAAFgAAAAAAAAAAAAAAAADWAgAAdGhlbWUv dGhlbWUvdGhlbWUxLnhtbFBLAQItABQABgAIAAAAIQAN0ZCftgAAABsBAAAnAAAAAAAAAAAAAAAA ANEJAAB0aGVtZS90aGVtZS9fcmVscy90aGVtZU1hbmFnZXIueG1sLnJlbHNQSwUGAAAAAAUABQBd AQAAzAoAAAAAPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9 InllcyI/Pg0KPGE6Y2xyTWFwIHhtbG5zOmE9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRz Lm9yZy9kcmF3aW5nbWwvMjAwNi9tYWluIiBiZzE9Imx0MSIgdHgxPSJkazEiIGJnMj0ibHQyIiB0 eDI9ImRrMiIgYWNjZW50MT0iYWNjZW50MSIgYWNjZW50Mj0iYWNjZW50MiIgYWNjZW50Mz0iYWNj ZW50MyIgYWNjZW50ND0iYWNjZW50NCIgYWNjZW50NT0iYWNjZW50NSIgYWNjZW50Nj0iYWNjZW50 NiIgaGxpbms9ImhsaW5rIiBmb2xIbGluaz0iZm9sSGxpbmsiLz4AAAAAWwoAAAwAACYAAAgA//// /wAIAAAOHgAAuCAAAAoAAAASAAAAAAgAAAAdAAC4IAAACwAAABEAAAAPAADwgAAAAAAABvAYAAAA AwQAAAIAAAACAAAAAQAAAAEAAAADAAAAHwAB8CwAAABiAAfwJAAAAAYGRKD0/oWmr9fjEtf3cv60 P/8AuTcAAAEAAAA0JgAAAAAAACMAC/AMAAAAhsEAAAAAxcEAAAAAQAAe8RAAAAD//wAAAAD/AICA gAD3AAAQAA8AAvBaAQAAEAAI8AgAAAACAAAAAgQAAA8AA/D4AAAADwAE8CgAAAABAAnwEAAAAAAA AAAAAAAAAAAAAAAAAAACAArwCAAAAAAEAAAFAAAADwAE8MAAAACyBArwCAAAAAIEAAAACgAAkwAL 8IIAAAB/AIAA4QAEQQEAAAAFwRIAAAA/AQAABgC/AQAAEAD/AQAACACAwxQAAACBwyYAAAC/AyAA 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAApQZoAbQAtACBgRIwAAAAAAAAAAAAAAAAAABWCgAAVgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAEQoMRAPAQ AAgA/P0BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEhQAAAAAAjw/w8ACQE/AADjBAAA////f/// /3////9/////f////3////9/////fyhTagAABAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAACEEAAAA AAAAAAAAAAAAAAAAAAAAEBwAAAcAAAAAAAAAAAB4AAAAeAAAAAAAAAAAAAAAoAUAAAAAAAALAAAA AAAAANwAAAD//xIAAAAAAAAAAAAAAAAAAAAEAFUAcwBlAHIABgB2AGkAYwB0AG8AcgAAAAAAAAAA AAAAAAAAAAAAAAAAACQAAAAGAAAABgAAAAAADAABAAwAAgAMAAMADAAEAAwABQAMAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7/AAAGAQIAAAAAAAAAAAAAAAAAAAAA AAEAAADghZ/y+U9oEKuRCAArJ7PZMAAAABwBAAANAAAAAQAAAHAAAAAEAAAAeAAAAAcAAACIAAAA CAAAAJwAAAAJAAAArAAAABIAAAC4AAAACgAAANgAAAAMAAAA5AAAAA0AAADwAAAADgAAAPwAAAAP AAAABAEAABAAAAAMAQAAEwAAABQBAAACAAAA4wQAAB4AAAAIAAAAVXNlcgAAAAAeAAAADAAAAE5v cm1hbC5kb3RtAB4AAAAIAAAAdmljdG9yAAAeAAAABAAAADIAAAAeAAAAGAAAAE1pY3Jvc29mdCBP ZmZpY2UgV29yZAAAAEAAAAAAAAAAAAAAAEAAAAAA8vWiEjfPAUAAAAAA8vWiEjfPAQMAAAABAAAA AwAAAIsBAAADAAAA0AgAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+/wAABgECAAAAAAAAAAAAAAAAAAAAAAABAAAAAtXN 1ZwuGxCTlwgAKyz5rjAAAADsAAAADAAAAAEAAABoAAAADwAAAHAAAAAFAAAAfAAAAAYAAACEAAAA EQAAAIwAAAAXAAAAlAAAAAsAAACcAAAAEAAAAKQAAAATAAAArAAAABYAAAC0AAAADQAAALwAAAAM AAAAyQAAAAIAAADjBAAAHgAAAAQAAAAqAAAAAwAAABIAAAADAAAABQAAAAMAAABWCgAAAwAAAAAA DgALAAAAAAAAAAsAAAAAAAAACwAAAAAAAAALAAAAAAAAAB4QAAABAAAAAQAAAAAMEAAAAgAAAB4A AAAJAAAAzeDn4uDt6OUAAwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAA AAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABcAAAAYAAAA GQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACAAAAAhAAAAIgAAACMAAAAkAAAAJQAAACYAAAAn AAAAKAAAACkAAAAqAAAAKwAAACwAAAAtAAAALgAAAP7///8wAAAAMQAAADIAAAAzAAAANAAAADUA AAA2AAAANwAAADgAAAA5AAAAOgAAADsAAAA8AAAAPQAAAD4AAAA/AAAAQAAAAEEAAABCAAAAQwAA AEQAAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAA/v///1AAAABRAAAA UgAAAFMAAABUAAAAVQAAAFYAAAD+////WAAAAFkAAABaAAAAWwAAAFwAAABdAAAAXgAAAP7////9 ////YQAAAP7////+/////v////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////9SAG8AbwB0ACAARQBuAHQAcgB5AAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAFAf//////////AwAAAAYJAgAAAAAAwAAAAAAAAEYA AAAAAAAAAAAAAAAwqLiuEjfPAWMAAACAAAAAAAAAADEAVABhAGIAbABlAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAIB/////wUAAAD/////AAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAPI+AAAAAAAAVwBvAHIAZABEAG8A YwB1AG0AZQBuAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoAAgEB AAAA//////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7V0AAAAA AAAFAFMAdQBtAG0AYQByAHkASQBuAGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAKAACAQIAAAAEAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAE8AAAAAEAAAAAAAAAUARABvAGMAdQBtAGUAbgB0AFMAdQBtAG0AYQByAHkASQBuAGYAbwBy AG0AYQB0AGkAbwBuAAAAAAAAAAAAAAA4AAIB////////////////AAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAVwAAAAAQAAAAAAAAAQBDAG8AbQBwAE8AYgBqAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAgD///////////////8AAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// /////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAA////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAQAAAP7///////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////8BAP7/AwoAAP////8GCQIAAAAAAMAAAAAAAABGIAAAAMTu6vPs5e3yIE1p Y3Jvc29mdCBXb3JkIDk3LTIwMDMACgAAAE1TV29yZERvYwAQAAAAV29yZC5Eb2N1bWVudC44APQ5 snEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAA== ------=_NextPart_000_1A22_01CF3753.3EDBF710-- From david@fromorbit.com Mon Mar 3 22:32:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B10207F4E for ; Mon, 3 Mar 2014 22:32:52 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 85D15304032 for ; Mon, 3 Mar 2014 20:32:49 -0800 (PST) X-ASG-Debug-ID: 1393907567-04cb6c5676210780001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id HgoUavb7QyRTaUso for ; Mon, 03 Mar 2014 20:32:47 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhNiAA1XFVN5LJYePGdsb2JhbABagwaDQ4UMs02FWYEbFwMBAQEBHxkNKIIlAQEBAwEnExwjEAgDDgcDCSUPBSUDBxoTh3EHzDwXFo5DB4Q4BJg7lW0o Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Mar 2014 15:02:28 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WKh1l-0005kM-Ai; Tue, 04 Mar 2014 15:32:25 +1100 Date: Tue, 4 Mar 2014 15:32:25 +1100 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace Message-ID: <20140304043225.GQ13647@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace References: <1393825194-1719-1-git-send-email-david@fromorbit.com> <1393825194-1719-2-git-send-email-david@fromorbit.com> <20140303174425.GB28196@laptop.bfoster> <20140303222946.GJ13647@dastard> <20140304012056.GA29755@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140304012056.GA29755@laptop.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1393907567 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145724 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Mar 03, 2014 at 08:20:57PM -0500, Brian Foster wrote: > On Tue, Mar 04, 2014 at 09:29:46AM +1100, Dave Chinner wrote: > > On Mon, Mar 03, 2014 at 12:44:26PM -0500, Brian Foster wrote: > > > On Mon, Mar 03, 2014 at 04:39:53PM +1100, Dave Chinner wrote: > > > > From: Dave Chinner > > > > > > > > While the verifier reoutines may return EFSBADCRC when a buffer ahs > > > > a bad CRC, we need to translate that to EFSCORRUPTED so that the > > > > higher layers treat the error appropriately and so we return a > > > > consistent error to userspace. This fixes a xfs/005 regression. > > > > > > > > Signed-off-by: Dave Chinner > > > > --- > > > > > > This change looks Ok to me, but when I start looking through the users > > > of bp->b_error, I see examples like xfs_dir3_data_read() being called in > > > xfs_dir2_leaf_addname() where it looks like an error could bubble all > > > the way up to xfs_vn_mknod() and its callers. > > > > Sure, but: > > > > xfs_dir3_data_read > > xfs_da_read_buf > > xfs_trans_read_buf_map > > > > Which means the patch prevents the EFSBADCRC leaking back out > > through that path because it converts it in xfs_trans_read_buf_map. > > > > Ok, I see. FWIW, I was also trolling through some of the log recovery > code and it appears that code uses b_ops for write verification purposes > only (i.e., crc generation I suspect), correct? Yes. > > > If the intent is to use EFSBADCRC as an internal-only error to > > > differentiate corruption from crc failure, why not push this more > > > closely to the boundaries that we have already defined? For example, we > > > already convert positive errnos to negative at the internal/external > > > boundaries. Could we convert those to use some kind of > > > XFS_USERSPACE_ERROR(error) macro/helper that converts errors > > > appropriately? > > > > That doesn't solve the problem needing an error conversion layer in > > the first place. The long term goal is to remove the error > > conversions in XFS by converting the core code to the same error > > passing conventions as the rest of the kernel code. We manage to > > screw the negation up fairly regularly because it is convoluted and > > we cal into generic code that returns negative errors from the core > > that returns positive errors in lots of places. The conversion > > surface is just too large to manage sanely. > > > > Well it wasn't clear that the error conversion layer was a problem that > itself needed solving, but fair enough. ;) If the objective is to move > away from the positive/negative business to something more "kernel > native," then building more infrastructure around that is probably not > the way to go, unless that was actually part of the changeover strategy > (e.g., if we happened to use something that conditionally negated error > values to support incremental codepath conversions... as a semi-random > thought). I'm not sure there's any real benefit to adding infrastructure when doing the conversion. It's a lot of little changes involving pushing the conversion down from the top layers, combined with converting interfaces (e.g. bmapi) as they get exposed. Some functions will be able to lose variables as the return becomes a tri-state value (e.g. the btree functions for looking up records); others will be able to use IS_ERR() for pointer returns, and so on. This will have a flow on effect on the code in the callers, and so it really comes down to spending the time to peel back each layer carefully. It's a lot of work, hence the "long term goal" aspect of it. We've been talking about doing this cleanup for several years now, but it hasn't yet been done because it's going to take hundreds of patches to do... ;) > > > Another thought could be to reconsider whether we still need some of > > > these extra warnings, as in the xfs_mount.c hunk below, now that we have > > > the generic xfs_verifier_error() messaging. E.g., if we could remove > > > those, perhaps we could snub out EFSBADCRC in or around the verifier > > > after it makes a distinction. > > > > Redundant errors aren't s significant problem. It's the lack of > > meaningful error messages that are much more of an issue. We get > > more meaningful error messages as a result of the EFSBADCRC changes > > that have been made, but for the moment that error simply means > > EFSCORRUPTED to the higher layers. Hence the translation back to > > EFSCORRUPTED at the (low) layers where the error no longer has > > a distinct meaning. > > > > Right, the purpose is not to solve the problem of redundant errors. > Rather, if the only thing preventing the consolidation of the EFSBADCRC > trap to a single hunk are redundant errors, then it wouldn't be a > problem to remove those errors and push the EFSBADCRC trap into the > generic code for the purpose of clarity. I don't see much point in trying to have a single trap for EFSBADCRC because the moment we want to handle one of those cases specially we are going to have to - as a first step - remove the single trap and push it outwards to all the places that need it like this patch does.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From mixsojo@mail.ru Mon Mar 3 22:33:47 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, HTML_FONT_SIZE_LARGE,HTML_MESSAGE,T_TVD_MIME_EPI autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id A81207F4E for ; Mon, 3 Mar 2014 22:33:46 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D2C30AC007 for ; Mon, 3 Mar 2014 20:33:42 -0800 (PST) X-ASG-Debug-ID: 1393907618-04cb6c5678210830001-NocioJ Received: from mail.scg-tpe.com.tw (mail.scg-tpe.com.tw [220.130.64.169]) by cuda.sgi.com with ESMTP id Fas9skwyhNkJcHOL for ; Mon, 03 Mar 2014 20:33:39 -0800 (PST) X-Barracuda-Envelope-From: mixsojo@mail.ru X-Barracuda-Apparent-Source-IP: 220.130.64.169 Received: by mail.scg-tpe.com.tw (Postfix, from userid 98) id 3A3A23D045; Tue, 4 Mar 2014 12:33:41 +0800 (CST) Received: from Unknown (unknown [192.168.1.254]) by mail.scg-tpe.com.tw (Postfix) with ESMTPA id 91DF139026; Tue, 4 Mar 2014 12:33:02 +0800 (CST) Message-ID: <4609B89329894D79B80432FF21BD2E44@adtudk> Reply-To: "zjxac" From: "zjxac" To: "cl" Subject: =?utf-8?B?0JPQvtCy0L7RgNGP0YnQuNC5INGF0L7QvNGP0LogV29v?= =?utf-8?B?ZHkgTydUaW1l?= Date: Tue, 4 Mar 2014 10:32:04 +0500 X-ASG-Orig-Subj: =?utf-8?B?0JPQvtCy0L7RgNGP0YnQuNC5INGF0L7QvNGP0LogV29v?= =?utf-8?B?ZHkgTydUaW1l?= Organization: =?utf-8?B?0J7QntCewqvQn9GA0L7RhNC40YIt0JzCuw==?= MIME-Version: 1.0 Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_000_12C4_01CF3794.FC6E5390" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3505.912 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3505.912 X-Barracuda-Connect: mail.scg-tpe.com.tw[220.130.64.169] X-Barracuda-Start-Time: 1393907618 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.01 X-Barracuda-Spam-Status: No, SCORE=0.01 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, EXTRA_MPART_TYPE, HTML_FONT_SIZE_LARGE, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145724 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_FONT_SIZE_LARGE BODY: HTML font size is large 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain This is a multi-part message in MIME format. ------=_NextPart_000_12C4_01CF3794.FC6E5390 Content-Type: multipart/alternative; boundary="----=_NextPart_001_12C5_01CF3794.FC6E5390" ------=_NextPart_001_12C5_01CF3794.FC6E5390 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable =D0=97=D0=B4=D1=80=D0=B0=D0=B2=D1=81=D1=82=D0=B2=D1=83=D0=B9=D1=82= =D0=B5, =D0=A3=D0=B2=D0=B0=D0=B6=D0=B0=D0=B5=D0=BC=D1=8B=D0=B9 =D0=BF=D0=BE= =D0=BA=D1=83=D0=BF=D0=B0=D1=82=D0=B5=D0=BB=D1=8C. =D0=A7=D1=83=D0=B4=D0=B5=D1=81=D0=BD=D1=8B=D0=B9 =D1=85=D0=BE=D0=BC=D1=8F= =D1=87=D0=BE=D0=BA Woody O'Time =D0=BF=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D1=8F= =D0=B5=D1=82 =D0=BD=D0=B5 =D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE =D1=81=D0=BB= =D0=BE=D0=B2=D0=B0, =D0=BD=D0=BE =D0=B4=D0=B0=D0=B6=D0=B5 =D0=B2=D0=BE=D1= =81=D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0=BE=D0=B4=D0=B8=D1=82 =D0=B8=D0= =BD=D1=82=D0=BE=D0=BD=D0=B0=D1=86=D0=B8=D1=8E!=20 =D0=9E=D0=BD =D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D0=B8=D1=82 =D0=B7=D0=B0=D0=B1= =D0=B0=D0=B2=D0=BD=D1=8B=D0=BC =C2=AB=D0=BC=D1=83=D0=BB=D1=8C=D1=82=D1=8F= =D1=88=D0=BD=D1=8B=D0=BC=C2=BB =D0=B3=D0=BE=D0=BB=D0=BE=D1=81=D0=BA=D0=BE= =D0=BC, =D0=BE=D1=82=D0=BA=D1=80=D1=8B=D0=B2=D0=B0=D1=8F =D1=80=D0=BE=D1=82= =D1=81=D0=BE=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B5=D0=BD= =D0=BD=D0=BE =D0=B7=D0=B2=D1=83=D0=BA=D0=B0=D0=BC.=20 =D0=9D=D0=B5=D0=BF=D0=BE=D0=B4=D1=80=D0=B0=D0=B6=D0=B0=D0=B5=D0=BC=D0=B0=D1= =8F =D0=B6=D0=B8=D0=B2=D0=B0=D1=8F =D0=BC=D0=B8=D0=BC=D0=B8=D0=BA=D0=B0 =D0= =B3=D0=BE=D0=B2=D0=BE=D1=80=D1=8F=D1=89=D0=B5=D0=B3=D0=BE =D1=85=D0=BE=D0= =BC=D1=8F=D0=BA=D0=B0 =D0=BF=D0=BE=D0=B4=D0=BD=D0=B8=D0=BC=D0=B0=D0=B5=D1= =82 =D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BD=D0=B8=D0=B5 =D0=B8 =D0= =B2=D1=81=D0=B5=D0=B3=D0=B4=D0=B0 =D0=B2=D1=8B=D0=B7=D1=8B=D0=B2=D0=B0=D0= =B5=D1=82 =D1=83=D0=BB=D1=8B=D0=B1=D0=BA=D1=83! =D0=9F=D1=80=D0=BE=D1=81=D1=82=D0=BE =D0=BD=D0=B0=D0=B6=D0=BC=D0=B8=D1=82= =D0=B5 =D0=BD=D0=B0 =D0=BB=D0=B0=D0=BF=D0=BA=D1=83 =D0=B8=D0=B3=D1=80=D1=83= =D1=88=D0=BA=D0=B8, =D1=87=D1=82=D0=BE=D0=B1=D1=8B =D0=B0=D0=BA=D1=82=D0=B8= =D0=B2=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82=D1=8C =D0=B7=D0=B0= =D0=BF=D0=B8=D1=81=D1=8B=D0=B2=D0=B0=D1=8E=D1=89=D0=B5=D0=B5 =D1=83=D1=81= =D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=BE.=20 =D0=92 =D1=82=D0=B5=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 6 =D1=81=D0=B5=D0=BA=D1= =83=D0=BD=D0=B4 =D1=85=D0=BE=D0=BC=D1=8F=D0=BA =D0=B1=D1=83=D0=B4=D0=B5=D1= =82 =D0=B7=D0=B0=D0=BF=D0=BE=D0=BC=D0=B8=D0=BD=D0=B0=D1=82=D1=8C =D0=B2=D0= =B0=D1=88=D1=83 =D1=80=D0=B5=D1=87=D1=8C, =D0=B0 =D0=BF=D0=BE=D1=82=D0=BE= =D0=BC =D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82=D0=B8=D1=87=D0=B5=D1=81= =D0=BA=D0=B8 =D0=B5=D0=B5 =D0=B2=D0=BE=D1=81=D0=BF=D1=80=D0=BE=D0=B8=D0=B7= =D0=B2=D0=B5=D0=B4=D0=B5=D1=82.=20 =D0=A2=D0=B0=D0=BA =D0=BC=D0=BE=D0=B6=D0=BD=D0=BE =D0=B8=D0=B3=D1=80=D0=B0= =D1=82=D1=8C =D0=B4=D0=BE =D0=B1=D0=B5=D1=81=D0=BA=D0=BE=D0=BD=D0=B5=D1=87= =D0=BD=D0=BE=D1=81=D1=82=D0=B8. =D0=97=D0=B0=D0=B1=D0=B0=D0=B2=D0=BD=D0=B0=D1=8F =D0=BC=D1=8F=D0=B3=D0=BA= =D0=B0=D1=8F =D0=B8=D0=B3=D1=80=D1=83=D1=88=D0=BA=D0=B0, =D0=BA=D0=BE=D1=82=D0=BE=D1=80=D0=B0=D1=8F =D1=83=D0=BC=D0=B5=D0=B5=D1=82 =D0=BF=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D1=8F=D1=82=D1=8C =D1=81=D0=BB=D0=BE= =D0=B2=D0=B0 =D0=BD=D0=B0 =D0=BB=D1=8E=D0=B1=D0=BE=D0=BC =D1=8F=D0=B7=D1=8B= =D0=BA=D0=B5! =D0=97=D0=B0=D0=BA=D0=B0=D0=B6=D0=B8=D1=82=D0=B5 =D0=BF=D1=80=D1=8F=D0=BC= =D0=BE =D1=81=D0=B5=D0=B9=D1=87=D0=B0=D1=81 =D1=81=D0=BE =D1=81=D0=BA=D0=B8= =D0=B4=D0=BA=D0=BE=D0=B9 50 %! =D0=97=D0=B0=D0=BA=D0=B0=D0= =B7=D0=B0=D1=82=D1=8C =D0=9E=D1=81=D1=82=D0=B5=D1=80=D0=B5=D0=B3=D0=B0=D0=B9=D1=82=D0=B5=D1=81=D1= =8C =D0=B4=D0=B5=D1=88=D0=B5=D0=B2=D1=8B=D1=85 =D0=BF=D0=BE=D0=B4=D0=B4=D0= =B5=D0=BB=D0=BE=D0=BA! =D0=A1 =D0=BE=D0=B3=D1=80=D0=BE=D0=BC=D0=BD=D1=8B=D0=BC =D1=83=D0=B2=D0=B0= =D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC =D0=BA =D0=92=D0=B0=D0=BC, =D0=9E=D0= =9E=D0=9E "=D0=9F=D1=80=D0=BE=D1=84=D0=B8=D1=82-=D0=9C". =D0=95=D1=81=D0=BB=D0=B8 =D0=92=D1=8B =D1=85=D0=BE=D1=82=D0=B8=D1=82=D0=B5= =D0=BE=D1=82=D0=BF=D0=B8=D1=81=D0=B0=D1=82=D1=8C=D1=81=D1=8F =D0=BE=D1=82= =D1=80=D0=B0=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B8, =D0=BF=D0=B5=D1=80=D0=B5= =D0=B9=D0=B4=D0=B8=D1=82=D0=B5 =D0=BF=D0=BE =D1=81=D1=81=D1=8B=D0=BB=D0=BA= =D0=B5=20 =D0=9E=D1=82=D0=BF=D0=B8=D1=81=D0=B0=D1=82=D1=8C=D1=81=D1=8F =D0=BE=D1=82= =D1=80=D0=B0=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B8. ------=_NextPart_001_12C5_01CF3794.FC6E5390 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable
         =D0=97=D0= =B4=D1=80=D0=B0=D0=B2=D1=81=D1=82=D0=B2=D1=83=D0=B9=D1=82=D0=B5,=20 =D0=A3=D0=B2=D0=B0=D0=B6=D0=B0=D0=B5=D0=BC=D1=8B=D0=B9 =D0=BF=D0=BE=D0=BA= =D1=83=D0=BF=D0=B0=D1=82=D0=B5=D0=BB=D1=8C.
=D0=A7=D1=83=D0=B4=D0=B5=D1=81=D0=BD=D1=8B=D0=B9 =D1= =85=D0=BE=D0=BC=D1=8F=D1=87=D0=BE=D0=BA Woody O'Time =D0=BF=D0=BE=D0=B2=D1= =82=D0=BE=D1=80=D1=8F=D0=B5=D1=82 =D0=BD=D0=B5 =D1=82=D0=BE=D0=BB=D1=8C=D0= =BA=D0=BE =D1=81=D0=BB=D0=BE=D0=B2=D0=B0, =D0=BD=D0=BE=20 =D0=B4=D0=B0=D0=B6=D0=B5 =D0=B2=D0=BE=D1=81=D0=BF=D1=80=D0=BE=D0=B8=D0=B7= =D0=B2=D0=BE=D0=B4=D0=B8=D1=82 =D0=B8=D0=BD=D1=82=D0=BE=D0=BD=D0=B0=D1=86= =D0=B8=D1=8E!
=D0=9E=D0=BD =D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D0=B8=D1= =82 =D0=B7=D0=B0=D0=B1=D0=B0=D0=B2=D0=BD=D1=8B=D0=BC =C2=AB=D0=BC=D1=83=D0= =BB=D1=8C=D1=82=D1=8F=D1=88=D0=BD=D1=8B=D0=BC=C2=BB =D0=B3=D0=BE=D0=BB=D0= =BE=D1=81=D0=BA=D0=BE=D0=BC, =D0=BE=D1=82=D0=BA=D1=80=D1=8B=D0=B2=D0=B0=D1= =8F =D1=80=D0=BE=D1=82=20 =D1=81=D0=BE=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0= =BD=D0=BE =D0=B7=D0=B2=D1=83=D0=BA=D0=B0=D0=BC. =D0=9D=D0=B5=D0=BF=D0=BE=D0=B4=D1=80=D0=B0=D0=B6=D0= =B0=D0=B5=D0=BC=D0=B0=D1=8F =D0=B6=D0=B8=D0=B2=D0=B0=D1=8F =D0=BC=D0=B8=D0= =BC=D0=B8=D0=BA=D0=B0 =D0=B3=D0=BE=D0=B2=D0=BE=D1=80=D1=8F=D1=89=D0=B5=D0= =B3=D0=BE =D1=85=D0=BE=D0=BC=D1=8F=D0=BA=D0=B0 =D0=BF=D0=BE=D0=B4=D0=BD=D0= =B8=D0=BC=D0=B0=D0=B5=D1=82=20 =D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BD=D0=B8=D0=B5 =D0=B8 =D0=B2= =D1=81=D0=B5=D0=B3=D0=B4=D0=B0 =D0=B2=D1=8B=D0=B7=D1=8B=D0=B2=D0=B0=D0=B5= =D1=82 =D1=83=D0=BB=D1=8B=D0=B1=D0=BA=D1=83! =D0=9F=D1=80=D0=BE=D1=81=D1=82=D0=BE =D0=BD=D0=B0=D0= =B6=D0=BC=D0=B8=D1=82=D0=B5 =D0=BD=D0=B0 =D0=BB=D0=B0=D0=BF=D0=BA=D1=83 =D0= =B8=D0=B3=D1=80=D1=83=D1=88=D0=BA=D0=B8, =D1=87=D1=82=D0=BE=D0=B1=D1=8B =D0= =B0=D0=BA=D1=82=D0=B8=D0=B2=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82= =D1=8C=20 =D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D1=8B=D0=B2=D0=B0=D1=8E=D1=89=D0=B5=D0=B5 = =D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=D0=BE. =D0=92 =D1=82=D0=B5=D1=87=D0=B5=D0=BD=D0=B8=D0=B5 = 6 =D1=81=D0=B5=D0=BA=D1=83=D0=BD=D0=B4 =D1=85=D0=BE=D0=BC=D1=8F=D0=BA =D0= =B1=D1=83=D0=B4=D0=B5=D1=82 =D0=B7=D0=B0=D0=BF=D0=BE=D0=BC=D0=B8=D0=BD=D0= =B0=D1=82=D1=8C =D0=B2=D0=B0=D1=88=D1=83 =D1=80=D0=B5=D1=87=D1=8C, =D0=B0= =D0=BF=D0=BE=D1=82=D0=BE=D0=BC=20 =D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0= =B8 =D0=B5=D0=B5 =D0=B2=D0=BE=D1=81=D0=BF=D1=80=D0=BE=D0=B8=D0=B7=D0=B2=D0= =B5=D0=B4=D0=B5=D1=82. =D0=A2=D0=B0=D0=BA =D0=BC=D0=BE=D0=B6=D0=BD=D0=BE = =D0=B8=D0=B3=D1=80=D0=B0=D1=82=D1=8C =D0=B4=D0=BE =D0=B1=D0=B5=D1=81=D0=BA= =D0=BE=D0=BD=D0=B5=D1=87=D0=BD=D0=BE=D1=81=D1=82=D0=B8.
=D0=97=D0=B0=D0=B1=D0=B0=D0=B2=D0=BD=D0=B0= =D1=8F =D0=BC=D1=8F=D0=B3=D0=BA=D0=B0=D1=8F=20 =D0=B8=D0=B3=D1=80=D1=83=D1=88=D0=BA=D0=B0,
 
=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D0=B0=D1=8F= =D1=83=D0=BC=D0=B5=D0=B5=D1=82
 
=D0=BF=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D1=8F= =D1=82=D1=8C =D1=81=D0=BB=D0=BE=D0=B2=D0=B0 =D0=BD=D0=B0 =D0=BB=D1=8E=D0=B1= =D0=BE=D0=BC=20 =D1=8F=D0=B7=D1=8B=D0=BA=D0=B5!
 
 
3D""
=D0=97=D0=B0=D0=BA=D0=B0=D0=B6=D0=B8=D1=82=D0=B5 =D0=BF= =D1=80=D1=8F=D0=BC=D0=BE =D1=81=D0=B5=D0=B9=D1=87=D0=B0=D1=81 =D1=81=D0=BE= =D1=81=D0=BA=D0=B8=D0=B4=D0=BA=D0=BE=D0=B9 50 %!
           &n= bsp;           &nb= sp;           &nbs= p;          =20 <= FONT size=3D6>=D0=97=D0=B0=D0=BA=D0=B0=D0=B7=D0=B0=D1=82=D1=8C=
=D0=9E=D1=81=D1=82=D0=B5=D1=80= =D0=B5=D0=B3=D0=B0=D0=B9=D1=82=D0=B5=D1=81=D1=8C =D0=B4=D0=B5=D1=88=D0=B5= =D0=B2=D1=8B=D1=85=20 =D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D0=BB=D0=BE=D0=BA!
=D0=A1 =D0=BE=D0=B3=D1=80=D0=BE=D0=BC=D0=BD=D1=8B=D0=BC=  =D1=83=D0=B2=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC =D0=BA =D0=92= =D0=B0=D0=BC, =D0=9E=D0=9E=D0=9E "=D0=9F=D1=80=D0=BE=D1=84=D0=B8=D1=82-=D0= =9C".
=D0=95=D1=81=D0=BB=D0=B8 =D0=92=D1=8B =D1=85=D0=BE=D1= =82=D0=B8=D1=82=D0=B5 =D0=BE=D1=82=D0=BF=D0=B8=D1=81=D0=B0=D1=82=D1=8C=D1= =81=D1=8F =D0=BE=D1=82 =D1=80=D0=B0=D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B8,&= nbsp;=D0=BF=D0=B5=D1=80=D0=B5=D0=B9=D0=B4=D0=B8=D1=82=D0=B5 =D0=BF=D0=BE=20  =D1=81=D1=81=D1=8B=D0=BB=D0=BA=D0=B5
------=_NextPart_001_12C5_01CF3794.FC6E5390-- ------=_NextPart_000_12C4_01CF3794.FC6E5390 Content-Type: image/png; name="pic00002.png" Content-Transfer-Encoding: base64 Content-ID: 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 ------=_NextPart_000_12C4_01CF3794.FC6E5390-- DORAEMON-PICTURE-SPAM-ENGINE:.png-604 From sandeen@redhat.com Mon Mar 3 23:24:31 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9EADA7F4E for ; Mon, 3 Mar 2014 23:24:31 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 46209AC005 for ; Mon, 3 Mar 2014 21:24:30 -0800 (PST) X-ASG-Debug-ID: 1393910666-04bdf05dab22f240001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id XgbR6YfWT5I2Fdr2 for ; Mon, 03 Mar 2014 21:24:27 -0800 (PST) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s245OQkl022137 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 4 Mar 2014 00:24:26 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s245OPMP024256 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Tue, 4 Mar 2014 00:24:25 -0500 Message-ID: <53156389.4060405@redhat.com> Date: Mon, 03 Mar 2014 23:24:25 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfstests: fix error msg in aio-dio-subblock-eof-read.c X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfstests: fix error msg in aio-dio-subblock-eof-read.c Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1393910667 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 io_getevents returns the number of events; printing its return as "bytes read" is ... wrong. Signed-off-by: Eric Sandeen --- diff --git a/src/aio-dio-regress/aio-dio-subblock-eof-read.c b/src/aio-dio-regress/aio-dio-subblock-eof-read.c index a48841d..8f74cec 100644 --- a/src/aio-dio-regress/aio-dio-subblock-eof-read.c +++ b/src/aio-dio-regress/aio-dio-subblock-eof-read.c @@ -105,8 +107,8 @@ main(int argc, char **argv) * 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); + fail("AIO read of last block in file returned %lu bytes, " + "expected %d\n", ie.res, FILE_SIZE); printf("AIO read of last block in file succeeded.\n"); return 0; From sandeen@redhat.com Mon Mar 3 23:25:52 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F40AC7F4E for ; Mon, 3 Mar 2014 23:25:51 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D3EEF304043 for ; Mon, 3 Mar 2014 21:25:48 -0800 (PST) X-ASG-Debug-ID: 1393910746-04cb6c5675212470001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qnzHyzfFAqKhHmiH for ; Mon, 03 Mar 2014 21:25:47 -0800 (PST) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s245Pjx7022305 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 4 Mar 2014 00:25:46 -0500 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s245Piri016857 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Tue, 4 Mar 2014 00:25:45 -0500 Message-ID: <531563D8.2070007@redhat.com> Date: Mon, 03 Mar 2014 23:25:44 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfstests: memset proper length in resvtest.c X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfstests: memset proper length in resvtest.c Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1393910747 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 sizeof(pointer) is not very relevant; sizeof(*pointer) is a bit more so. Signed-off-by: Eric Sandeen --- diff --git a/src/resvtest.c b/src/resvtest.c index 037d9ea..a07f503 100644 --- a/src/resvtest.c +++ b/src/resvtest.c @@ -73,7 +73,7 @@ main(int argc, char **argv) perror("open"); exit(1); } - memset(writebuffer, 'A', sizeof(writebuffer)); + memset(writebuffer, 'A', sizeof(*writebuffer)); unlink(filename); writefd = open(filename, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); From sandeen@sandeen.net Mon Mar 3 23:44:00 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4B12A7F4E for ; Mon, 3 Mar 2014 23:44:00 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 12049304032 for ; Mon, 3 Mar 2014 21:43:59 -0800 (PST) X-ASG-Debug-ID: 1393911837-04bdf05dab230370001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id RHnHa8BQkCoqcKAg for ; Mon, 03 Mar 2014 21:43:58 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id AA148610C54C; Mon, 3 Mar 2014 23:43:57 -0600 (CST) Message-ID: <5315681C.5070704@sandeen.net> Date: Mon, 03 Mar 2014 23:43:56 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: [PATCH V2] xfstests: fix error msg in aio-dio-subblock-eof-read.c References: <53156389.4060405@redhat.com> X-ASG-Orig-Subj: [PATCH V2] xfstests: fix error msg in aio-dio-subblock-eof-read.c In-Reply-To: <53156389.4060405@redhat.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1393911837 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145726 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- io_getevents returns the number of events; printing its return as "bytes read" is ... wrong. Signed-off-by: Eric Sandeen --- V2: print as signed so we can easily see errors returned diff --git a/src/aio-dio-regress/aio-dio-subblock-eof-read.c b/src/aio-dio-regress/aio-dio-subblock-eof-read.c index a48841d..8f74cec 100644 --- a/src/aio-dio-regress/aio-dio-subblock-eof-read.c +++ b/src/aio-dio-regress/aio-dio-subblock-eof-read.c @@ -105,8 +107,8 @@ main(int argc, char **argv) * 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); + fail("AIO read of last block in file returned %ld bytes, " + "expected %d\n", ie.res, FILE_SIZE); printf("AIO read of last block in file succeeded.\n"); return 0; From dave@fromorbit.com Tue Mar 4 02:52:16 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C84E27F4E for ; Tue, 4 Mar 2014 02:52:16 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A40BF8F8065 for ; Tue, 4 Mar 2014 00:52:16 -0800 (PST) X-ASG-Debug-ID: 1393923133-04bdf05dac239590002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id FUdXLuGyTJqS7tno for ; Tue, 04 Mar 2014 00:52:15 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlsGAIuTFVN5LJYe/2dsb2JhbABagwbDGxd0giUBAQUnLzMIGDE5AxsZh3jMLReOboQiBKMQh1eDQSg Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Mar 2014 19:22:12 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKl4w-0006Hf-PC for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKl4w-000709-OS for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 12/13] xfs_db: Use EFSBADCRC for CRC validity indication Date: Tue, 4 Mar 2014 19:51:56 +1100 X-ASG-Orig-Subj: [PATCH 12/13] xfs_db: Use EFSBADCRC for CRC validity indication Message-Id: <1393923117-9559-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393923117-9559-1-git-send-email-david@fromorbit.com> References: <1393923117-9559-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1393923134 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145730 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_db currently gives indication as to whether a buffer CRC is ok or not. Currently it does this by checking for EFSCORRUPTED in the b_error field of the buffer. Not that we have EFSBADCRC to indicate a bad CRC independently of structure corruption, use that instead to drive the CRC correct/incorrect indication in the structured output. Signed-off-by: Dave Chinner --- db/io.c | 5 +++-- db/io.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/db/io.c b/db/io.c index d29816c..9a787c8 100644 --- a/db/io.c +++ b/db/io.c @@ -521,10 +521,11 @@ set_cur( } /* - * keep the buffer even if the verifier says it is corrupted. + * Keep the buffer even if the verifier says it is corrupted. * We're a diagnostic tool, after all. */ - if (!bp || (bp->b_error && bp->b_error != EFSCORRUPTED)) + if (!bp || (bp->b_error && bp->b_error != EFSCORRUPTED && + bp->b_error != EFSBADCRC)) return; iocur_top->buf = bp->b_addr; iocur_top->bp = bp; diff --git a/db/io.h b/db/io.h index d8cf383..ad39bee 100644 --- a/db/io.h +++ b/db/io.h @@ -67,6 +67,6 @@ static inline bool iocur_crc_valid() { return (iocur_top->bp && - iocur_top->bp->b_error != EFSCORRUPTED && + iocur_top->bp->b_error != EFSBADCRC && (!iocur_top->ino_buf || iocur_top->ino_crc_ok)); } -- 1.9.0 From dave@fromorbit.com Tue Mar 4 02:52:17 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 826AD7F4E for ; Tue, 4 Mar 2014 02:52:17 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6D2D6304043 for ; Tue, 4 Mar 2014 00:52:17 -0800 (PST) X-ASG-Debug-ID: 1393923135-04cb6c567721b350001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id keUCNAJhdTw23r3A for ; Tue, 04 Mar 2014 00:52:16 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlsGAIuTFVN5LJYe/2dsb2JhbABagwbDGxd0giUBAQUnLzMIGDE5AxsZh3jMRI5uhCIEqmeDQSg Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Mar 2014 19:22:12 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKl4w-0006HZ-MB for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKl4w-0006z4-LR for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 06/13] libxfs: skip pointless CRC updates after verifier failures Date: Tue, 4 Mar 2014 19:51:50 +1100 X-ASG-Orig-Subj: [PATCH 06/13] libxfs: skip pointless CRC updates after verifier failures Message-Id: <1393923117-9559-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393923117-9559-1-git-send-email-david@fromorbit.com> References: <1393923117-9559-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1393923135 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145730 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner [userspace port] Most write verifiers don't update CRCs after the verifier has failed and the buffer has been marked in error. These two didn't, but should. Add returns to the verifier failure block, since the buffer won't be written anyway. Signed-off-by: Dave Chinner --- libxfs/xfs_alloc_btree.c | 1 + libxfs/xfs_ialloc_btree.c | 1 + 2 files changed, 2 insertions(+) diff --git a/libxfs/xfs_alloc_btree.c b/libxfs/xfs_alloc_btree.c index 282a320..5b38c24 100644 --- a/libxfs/xfs_alloc_btree.c +++ b/libxfs/xfs_alloc_btree.c @@ -355,6 +355,7 @@ xfs_allocbt_write_verify( XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, bp->b_target->bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + return; } xfs_btree_sblock_calc_crc(bp); diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index 27a5dd9..d9589b7 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -242,6 +242,7 @@ xfs_inobt_write_verify( XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, bp->b_target->bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + return; } xfs_btree_sblock_calc_crc(bp); -- 1.9.0 From dave@fromorbit.com Tue Mar 4 02:52:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0E6517F4E for ; Tue, 4 Mar 2014 02:52:18 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CF461304043 for ; Tue, 4 Mar 2014 00:52:17 -0800 (PST) X-ASG-Debug-ID: 1393923133-04bdf05dac239590003-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id CurmEorfwrFx22Ev for ; Tue, 04 Mar 2014 00:52:16 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlsGAIuTFVN5LJYe/2dsb2JhbABagwbDGxd0giUBAQUnLzMIGDE5AxsZh3jMRI5uhCIEqmeBb4FSKA Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Mar 2014 19:22:12 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKl4w-0006HU-KB for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKl4w-0006y9-JP for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 01/13] libxfs: be more forgiving of a v4 secondary sb w/ junk in v5 fields Date: Tue, 4 Mar 2014 19:51:45 +1100 X-ASG-Orig-Subj: [PATCH 01/13] libxfs: be more forgiving of a v4 secondary sb w/ junk in v5 fields Message-Id: <1393923117-9559-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393923117-9559-1-git-send-email-david@fromorbit.com> References: <1393923117-9559-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1393923135 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145730 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner [userspace port] Today, if xfs_sb_read_verify encounters a v4 superblock with junk past v4 fields which includes data in sb_crc, it will be treated as a failing checksum and a significant corruption. There are known prior bugs which leave junk at the end of the V4 superblock; we don't need to actually fail the verification in this case if other checks pan out ok. So if this is a secondary superblock, and the primary superblock doesn't indicate that this is a V5 filesystem, don't treat this as an actual checksum failure. We should probably check the garbage condition as we do in xfs_repair, and possibly warn about it or self-heal, but that's a different scope of work. Signed-off-by: Dave Chinner --- libxfs/xfs_sb.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index 48b1a97..16088a6 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -542,6 +542,11 @@ xfs_sb_verify( * single bit error could clear the feature bit and unused parts of the * superblock are supposed to be zero. Hence a non-null crc field indicates that * we've potentially lost a feature bit and we should check it anyway. + * + * However, past bugs (i.e. in growfs) left non-zeroed regions beyond the + * last field in V4 secondary superblocks. So for secondary superblocks, + * we are more forgiving, and ignore CRC failures if the primary doesn't + * indicate that the fs version is V5. */ static void xfs_sb_read_verify( @@ -562,8 +567,12 @@ xfs_sb_read_verify( if (!xfs_verify_cksum(bp->b_addr, be16_to_cpu(dsb->sb_sectsize), offsetof(struct xfs_sb, sb_crc))) { - error = EFSCORRUPTED; - goto out_error; + /* Only fail bad secondaries on a known V5 filesystem */ + if (bp->b_bn != XFS_SB_DADDR && + xfs_sb_version_hascrc(&mp->m_sb)) { + error = EFSCORRUPTED; + goto out_error; + } } } error = xfs_sb_verify(bp, true); -- 1.9.0 From dave@fromorbit.com Tue Mar 4 02:52:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7F0A17F4E for ; Tue, 4 Mar 2014 02:52:18 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5B171304043 for ; Tue, 4 Mar 2014 00:52:18 -0800 (PST) X-ASG-Debug-ID: 1393923135-04cb6c567721b350002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 8HqEmaN1imkh0dNK for ; Tue, 04 Mar 2014 00:52:17 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlsGAIuTFVN5LJYe/2dsb2JhbABagwbDGxd0giUBAQUnLzMIGDE5AxsZh3jMLReNenSEIgSjEIdXg0EogS0 Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Mar 2014 19:22:12 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKl4w-0006HV-Kf for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKl4w-0006yQ-Jl for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 02/13] libxfs: sanitize sb_inopblock in xfs_mount_validate_sb Date: Tue, 4 Mar 2014 19:51:46 +1100 X-ASG-Orig-Subj: [PATCH 02/13] libxfs: sanitize sb_inopblock in xfs_mount_validate_sb Message-Id: <1393923117-9559-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393923117-9559-1-git-send-email-david@fromorbit.com> References: <1393923117-9559-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1393923136 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145730 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner [userspace port] xfs_mount_validate_sb doesn't check sb_inopblock for sanity (as does its xfs_repair counterpart, FWIW). If it's out of bounds, we can go off the rails in i.e. xfs_inode_buf_verify(), which uses sb_inopblock as a loop limit when stepping through a metadata buffer. The problem can be demonstrated easily by corrupting sb_inopblock with xfs_db and trying to mount the result: # mkfs.xfs -dfile,name=fsfile,size=1g # xfs_db -x fsfile xfs_db> sb 0 xfs_db> write inopblock 512 inopblock = 512 xfs_db> quit # mount -o loop fsfile mnt and we blow up in xfs_inode_buf_verify(). With this patch, we get a (very noisy) corruption error, and fail the mount as we should. Signed-off-by: Dave Chinner --- libxfs/xfs_sb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index 16088a6..4be7366 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -258,6 +258,7 @@ xfs_mount_validate_sb( sbp->sb_inodelog < XFS_DINODE_MIN_LOG || sbp->sb_inodelog > XFS_DINODE_MAX_LOG || sbp->sb_inodesize != (1 << sbp->sb_inodelog) || + sbp->sb_inopblock != howmany(sbp->sb_blocksize,sbp->sb_inodesize) || (sbp->sb_blocklog - sbp->sb_inodelog != sbp->sb_inopblog) || (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE) || (sbp->sb_rextsize * sbp->sb_blocksize < XFS_MIN_RTEXTSIZE) || -- 1.9.0 From dave@fromorbit.com Tue Mar 4 02:52:18 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C1FAE7F4E for ; Tue, 4 Mar 2014 02:52:18 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9D169304043 for ; Tue, 4 Mar 2014 00:52:15 -0800 (PST) X-ASG-Debug-ID: 1393923133-04bdf05dac239590001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id vfNwIJDTZqBSFRv1 for ; Tue, 04 Mar 2014 00:52:13 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq4LAIuTFVN5LJYe/2dsb2JhbABagwapG5oAF3SDAjuBAgOILJxxr1OOboQiBKpng0Eo Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Mar 2014 19:22:12 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKl4w-0006HT-Jq for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKl4w-0006y5-Iz for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 00/13] xfsprogs: initial EFSBADCRC support Date: Tue, 4 Mar 2014 19:51:44 +1100 X-ASG-Orig-Subj: [PATCH 00/13] xfsprogs: initial EFSBADCRC support Message-Id: <1393923117-9559-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1393923133 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145730 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Folks, This series is a userspace port of Eric's EFSBADCRC verifier error discrimination patch set. It brings across all the relevant pathes form the kernel code and shoe-horns them into the libxfs codebase. There are two extra patches on the end of the series - one to make xfs_db use EFSBADCRC for it's CRC validity indication, and the other to make xfs_repair detect and handle primary superblock CRC failures and recalculation when the primary superblock is rebuilt and rewritten. This is the first step in bring full awareness of CRC errors into xfs_repair. More patches will follow as I make more repair code aware that EFSBADCRC means that the object that was just read needs repair. Cheers, Dave. From dave@fromorbit.com Tue Mar 4 02:52:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 475A27F58 for ; Tue, 4 Mar 2014 02:52:19 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DD1D38F8065 for ; Tue, 4 Mar 2014 00:52:18 -0800 (PST) X-ASG-Debug-ID: 1393923133-04bdf05dac239590004-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 9eLmmP7pUhmD4jRm for ; Tue, 04 Mar 2014 00:52:17 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlsGAIuTFVN5LJYe/2dsb2JhbABagwbDGxd0giUBAQUnLzMIGDE5AxsZh3jMRI4IZoQiBKpng0EogS0 Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Mar 2014 19:22:12 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKl4w-0006HX-LR for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKl4w-0006ye-Ke for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 04/13] libxfs: skip verification on initial "guess" superblock read Date: Tue, 4 Mar 2014 19:51:48 +1100 X-ASG-Orig-Subj: [PATCH 04/13] libxfs: skip verification on initial "guess" superblock read Message-Id: <1393923117-9559-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393923117-9559-1-git-send-email-david@fromorbit.com> References: <1393923117-9559-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1393923137 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145730 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner [userspace port] When xfs_readsb() does the very first read of the superblock, it makes a guess at the length of the buffer, based on the sector size of the underlying storage. This may or may not match the filesystem sector size in sb_sectsize, so we can't i.e. do a CRC check on it; it might be too short. In fact, mounting a filesystem with sb_sectsize larger than the device sector size will cause a mount failure if CRCs are enabled, because we are checksumming a length which exceeds the buffer passed to it. So always read twice; the first time we read with NULL buffer ops to skip verification; then set the proper read length, hook up the proper verifier, and give it another go. Once we are sure that we've got the right buffer length, we can also use bp->b_length in the xfs_sb_read_verify, rather than the less-trusted on-disk sectorsize for secondary superblocks. Before this we ran the risk of passing junk to the crc32c routines, which didn't always handle extreme values. Signed-off-by: Dave Chinner --- libxfs/xfs_sb.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index 5c10c97..6ad99a5 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -566,7 +566,7 @@ xfs_sb_read_verify( XFS_SB_VERSION_5) || dsb->sb_crc != 0)) { - if (!xfs_verify_cksum(bp->b_addr, be16_to_cpu(dsb->sb_sectsize), + if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), offsetof(struct xfs_sb, sb_crc))) { /* Only fail bad secondaries on a known V5 filesystem */ if (bp->b_bn == XFS_SB_DADDR || @@ -599,7 +599,6 @@ xfs_sb_quiet_read_verify( { struct xfs_dsb *dsb = XFS_BUF_TO_SBP(bp); - if (dsb->sb_magicnum == cpu_to_be32(XFS_SB_MAGIC)) { /* XFS filesystem, verify noisily! */ xfs_sb_read_verify(bp); -- 1.9.0 From dave@fromorbit.com Tue Mar 4 02:52:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 088DC7F4E for ; Tue, 4 Mar 2014 02:52:20 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D77148F8065 for ; Tue, 4 Mar 2014 00:52:19 -0800 (PST) X-ASG-Debug-ID: 1393923133-04bdf05dac239590005-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 0s3pZI2YlncfEtL4 for ; Tue, 04 Mar 2014 00:52:18 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlsGAIuTFVN5LJYe/2dsb2JhbABagwbDGxd0giUBAQUnLzMIGDE5AxsZh3jMLReNbYEBhCIEoxCHV4NBKIEs Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Mar 2014 19:22:13 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKl4w-0006HW-L7 for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKl4w-0006yW-KD for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 03/13] libxfs: xfs_sb_read_verify() doesn't flag bad crcs on primary sb Date: Tue, 4 Mar 2014 19:51:47 +1100 X-ASG-Orig-Subj: [PATCH 03/13] libxfs: xfs_sb_read_verify() doesn't flag bad crcs on primary sb Message-Id: <1393923117-9559-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393923117-9559-1-git-send-email-david@fromorbit.com> References: <1393923117-9559-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1393923137 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145730 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner [userspace port] My earlier commit 10e6e65 deserves a layer or two of brown paper bags. The logic in that commit means that a CRC failure on the primary superblock will *never* result in an error return. Hopefully this fixes it, so that we always return the error if it's a primary superblock, otherwise only if the filesystem has CRCs enabled. Signed-off-by: Dave Chinner --- libxfs/xfs_sb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index 4be7366..5c10c97 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -569,7 +569,7 @@ xfs_sb_read_verify( if (!xfs_verify_cksum(bp->b_addr, be16_to_cpu(dsb->sb_sectsize), offsetof(struct xfs_sb, sb_crc))) { /* Only fail bad secondaries on a known V5 filesystem */ - if (bp->b_bn != XFS_SB_DADDR && + if (bp->b_bn == XFS_SB_DADDR || xfs_sb_version_hascrc(&mp->m_sb)) { error = EFSCORRUPTED; goto out_error; -- 1.9.0 From dave@fromorbit.com Tue Mar 4 02:52:20 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 24A757F58 for ; Tue, 4 Mar 2014 02:52:20 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E5D21304043 for ; Tue, 4 Mar 2014 00:52:19 -0800 (PST) X-ASG-Debug-ID: 1393923136-04bdf05dac2395a0002-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id MPDXV641at41a0tV for ; Tue, 04 Mar 2014 00:52:18 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlsGAIuTFVN5LJYe/2dsb2JhbABagwbDGxd0giUBAQUnLzMIGDE5AxsZh3jMRJMQBKpng0Eo Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Mar 2014 19:22:12 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKl4w-0006Ha-Ms for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKl4w-0006zB-Lk for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 07/13] libxfs: Use defines for CRC offsets in all cases Date: Tue, 4 Mar 2014 19:51:51 +1100 X-ASG-Orig-Subj: [PATCH 07/13] libxfs: Use defines for CRC offsets in all cases Message-Id: <1393923117-9559-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393923117-9559-1-git-send-email-david@fromorbit.com> References: <1393923117-9559-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1393923137 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145730 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner [userspace port] Some calls to crc functions used useful #defines, others used awkward offsetof() constructs. Switch them all to #define to make things a bit cleaner. Signed-off-by: Dave Chinner --- include/xfs_ag.h | 6 ++++++ include/xfs_dinode.h | 2 ++ include/xfs_format.h | 2 ++ include/xfs_sb.h | 2 ++ libxfs/xfs_alloc.c | 10 ++++------ libxfs/xfs_ialloc.c | 5 ++--- libxfs/xfs_inode_buf.c | 4 ++-- libxfs/xfs_sb.c | 5 ++--- libxfs/xfs_symlink_remote.c | 5 ++--- 9 files changed, 24 insertions(+), 17 deletions(-) diff --git a/include/xfs_ag.h b/include/xfs_ag.h index 3fc1098..0fdd410 100644 --- a/include/xfs_ag.h +++ b/include/xfs_ag.h @@ -89,6 +89,8 @@ typedef struct xfs_agf { /* structure must be padded to 64 bit alignment */ } xfs_agf_t; +#define XFS_AGF_CRC_OFF offsetof(struct xfs_agf, agf_crc) + #define XFS_AGF_MAGICNUM 0x00000001 #define XFS_AGF_VERSIONNUM 0x00000002 #define XFS_AGF_SEQNO 0x00000004 @@ -167,6 +169,8 @@ typedef struct xfs_agi { /* structure must be padded to 64 bit alignment */ } xfs_agi_t; +#define XFS_AGI_CRC_OFF offsetof(struct xfs_agi, agi_crc) + #define XFS_AGI_MAGICNUM 0x00000001 #define XFS_AGI_VERSIONNUM 0x00000002 #define XFS_AGI_SEQNO 0x00000004 @@ -222,6 +226,8 @@ typedef struct xfs_agfl { __be32 agfl_bno[]; /* actually XFS_AGFL_SIZE(mp) */ } xfs_agfl_t; +#define XFS_AGFL_CRC_OFF offsetof(struct xfs_agfl, agfl_crc) + /* * tags for inode radix tree */ diff --git a/include/xfs_dinode.h b/include/xfs_dinode.h index e5869b5..623bbe8 100644 --- a/include/xfs_dinode.h +++ b/include/xfs_dinode.h @@ -89,6 +89,8 @@ typedef struct xfs_dinode { /* structure must be padded to 64 bit alignment */ } xfs_dinode_t; +#define XFS_DINODE_CRC_OFF offsetof(struct xfs_dinode, di_crc) + #define DI_MAX_FLUSH 0xffff /* diff --git a/include/xfs_format.h b/include/xfs_format.h index 997c770..77f6b8b 100644 --- a/include/xfs_format.h +++ b/include/xfs_format.h @@ -145,6 +145,8 @@ struct xfs_dsymlink_hdr { __be64 sl_lsn; }; +#define XFS_SYMLINK_CRC_OFF offsetof(struct xfs_dsymlink_hdr, sl_crc) + /* * The maximum pathlen is 1024 bytes. Since the minimum file system * blocksize is 512 bytes, we can get a max of 3 extents back from diff --git a/include/xfs_sb.h b/include/xfs_sb.h index 35061d4..f7b2fe7 100644 --- a/include/xfs_sb.h +++ b/include/xfs_sb.h @@ -182,6 +182,8 @@ typedef struct xfs_sb { /* must be padded to 64 bit alignment */ } xfs_sb_t; +#define XFS_SB_CRC_OFF offsetof(struct xfs_sb, sb_crc) + /* * Superblock - on disk version. Must match the in core version above. * Must be padded to 64 bit alignment. diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index e4fb1ad..8a6725e 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -464,7 +464,7 @@ xfs_agfl_read_verify( return; agfl_ok = xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - offsetof(struct xfs_agfl, agfl_crc)); + XFS_AGFL_CRC_OFF); agfl_ok = agfl_ok && xfs_agfl_verify(bp); @@ -494,8 +494,7 @@ xfs_agfl_write_verify( if (bip) XFS_BUF_TO_AGFL(bp)->agfl_lsn = cpu_to_be64(bip->bli_item.li_lsn); - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), - offsetof(struct xfs_agfl, agfl_crc)); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_AGFL_CRC_OFF); } const struct xfs_buf_ops xfs_agfl_buf_ops = { @@ -2222,7 +2221,7 @@ xfs_agf_read_verify( if (xfs_sb_version_hascrc(&mp->m_sb)) agf_ok = xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - offsetof(struct xfs_agf, agf_crc)); + XFS_AGF_CRC_OFF); agf_ok = agf_ok && xfs_agf_verify(mp, bp); @@ -2252,8 +2251,7 @@ xfs_agf_write_verify( if (bip) XFS_BUF_TO_AGF(bp)->agf_lsn = cpu_to_be64(bip->bli_item.li_lsn); - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), - offsetof(struct xfs_agf, agf_crc)); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_AGF_CRC_OFF); } const struct xfs_buf_ops xfs_agf_buf_ops = { diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index afe1a82..b83ad98 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1555,7 +1555,7 @@ xfs_agi_read_verify( if (xfs_sb_version_hascrc(&mp->m_sb)) agi_ok = xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - offsetof(struct xfs_agi, agi_crc)); + XFS_AGI_CRC_OFF); agi_ok = agi_ok && xfs_agi_verify(bp); if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, @@ -1583,8 +1583,7 @@ xfs_agi_write_verify( if (bip) XFS_BUF_TO_AGI(bp)->agi_lsn = cpu_to_be64(bip->bli_item.li_lsn); - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), - offsetof(struct xfs_agi, agi_crc)); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_AGI_CRC_OFF); } const struct xfs_buf_ops xfs_agi_buf_ops = { diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c index d245d72..4f29033 100644 --- a/libxfs/xfs_inode_buf.c +++ b/libxfs/xfs_inode_buf.c @@ -292,7 +292,7 @@ xfs_dinode_verify( if (!xfs_sb_version_hascrc(&mp->m_sb)) return false; if (!xfs_verify_cksum((char *)dip, mp->m_sb.sb_inodesize, - offsetof(struct xfs_dinode, di_crc))) + XFS_DINODE_CRC_OFF)) return false; if (be64_to_cpu(dip->di_ino) != ino) return false; @@ -313,7 +313,7 @@ xfs_dinode_calc_crc( ASSERT(xfs_sb_version_hascrc(&mp->m_sb)); crc = xfs_start_cksum((char *)dip, mp->m_sb.sb_inodesize, - offsetof(struct xfs_dinode, di_crc)); + XFS_DINODE_CRC_OFF); dip->di_crc = xfs_end_cksum(crc); } diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index 05bc860..bbcf886 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -566,7 +566,7 @@ xfs_sb_read_verify( dsb->sb_crc != 0)) { if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - offsetof(struct xfs_sb, sb_crc))) { + XFS_SB_CRC_OFF)) { /* Only fail bad secondaries on a known V5 filesystem */ if (bp->b_bn == XFS_SB_DADDR || xfs_sb_version_hascrc(&mp->m_sb)) { @@ -629,8 +629,7 @@ xfs_sb_write_verify( if (bip) XFS_BUF_TO_SBP(bp)->sb_lsn = cpu_to_be64(bip->bli_item.li_lsn); - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), - offsetof(struct xfs_sb, sb_crc)); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_SB_CRC_OFF); } const struct xfs_buf_ops xfs_sb_buf_ops = { diff --git a/libxfs/xfs_symlink_remote.c b/libxfs/xfs_symlink_remote.c index 539db0c..09ee9d4 100644 --- a/libxfs/xfs_symlink_remote.c +++ b/libxfs/xfs_symlink_remote.c @@ -117,7 +117,7 @@ xfs_symlink_read_verify( return; if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - offsetof(struct xfs_dsymlink_hdr, sl_crc)) || + XFS_SYMLINK_CRC_OFF) || !xfs_symlink_verify(bp)) { XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); @@ -145,8 +145,7 @@ xfs_symlink_write_verify( struct xfs_dsymlink_hdr *dsl = bp->b_addr; dsl->sl_lsn = cpu_to_be64(bip->bli_item.li_lsn); } - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), - offsetof(struct xfs_dsymlink_hdr, sl_crc)); + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_SYMLINK_CRC_OFF); } const struct xfs_buf_ops xfs_symlink_buf_ops = { -- 1.9.0 From dave@fromorbit.com Tue Mar 4 02:52:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EEA417F66 for ; Tue, 4 Mar 2014 02:52:20 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8EE3DAC002 for ; Tue, 4 Mar 2014 00:52:20 -0800 (PST) X-ASG-Debug-ID: 1393923136-04bdf05dac2395a0003-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id u5o1YDYhCt0wpZ4d for ; Tue, 04 Mar 2014 00:52:19 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlwGAIuTFVN5LJYe/2dsb2JhbABQCoMGwxsXdIIlAQEFJy8zCBgxOQMbGYd4zC0XjXWFGwSjEIdXg0Eo Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Mar 2014 19:22:13 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKl4w-0006Hd-OQ for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKl4w-0006zj-NB for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 10/13] libxfs: add xfs_verifier_error() Date: Tue, 4 Mar 2014 19:51:54 +1100 X-ASG-Orig-Subj: [PATCH 10/13] libxfs: add xfs_verifier_error() Message-Id: <1393923117-9559-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393923117-9559-1-git-send-email-david@fromorbit.com> References: <1393923117-9559-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1393923139 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145730 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner [userspace port] We want to distinguish between corruption, CRC errors, etc. In addition, the full stack trace on verifier errors seems less than helpful; it looks more like an oops than corruption. Create a new function to specifically alert the user to verifier errors, which can differentiate between EFSCORRUPTED and CRC mismatches. It doesn't dump stack unless the xfs error level is turned up high. Define a new error message (EFSBADCRC) to clearly identify CRC errors. (Defined to EBADMSG, bad message) Signed-off-by: Dave Chinner --- include/darwin.h | 1 + include/freebsd.h | 1 + include/gnukfreebsd.h | 1 + include/irix.h | 2 ++ include/linux.h | 1 + libxfs/util.c | 13 +++++++++++++ libxfs/xfs.h | 1 + 7 files changed, 20 insertions(+) diff --git a/include/darwin.h b/include/darwin.h index 97b8990..95f865b 100644 --- a/include/darwin.h +++ b/include/darwin.h @@ -150,6 +150,7 @@ typedef unsigned char uchar_t; #define ENOATTR 989 /* Attribute not found */ #define EFSCORRUPTED 990 /* Filesystem is corrupted */ +#define EFSBADCRC 991 /* Bad CRC detected */ #define constpp char * const * #define HAVE_FID 1 diff --git a/include/freebsd.h b/include/freebsd.h index 2e1ae49..b51688b 100644 --- a/include/freebsd.h +++ b/include/freebsd.h @@ -45,6 +45,7 @@ #define constpp char * const * #define EFSCORRUPTED 990 /* Filesystem is corrupted */ +#define EFSBADCRC 991 /* Bad CRC detected */ typedef off_t xfs_off_t; typedef off_t off64_t; diff --git a/include/gnukfreebsd.h b/include/gnukfreebsd.h index 1ec291f..2140acd 100644 --- a/include/gnukfreebsd.h +++ b/include/gnukfreebsd.h @@ -36,6 +36,7 @@ #define constpp char * const * #define EFSCORRUPTED 990 /* Filesystem is corrupted */ +#define EFSBADCRC 991 /* Bad CRC detected */ typedef off_t xfs_off_t; typedef __uint64_t xfs_ino_t; diff --git a/include/irix.h b/include/irix.h index a450684..5040451 100644 --- a/include/irix.h +++ b/include/irix.h @@ -52,6 +52,8 @@ typedef char* xfs_caddr_t; #define xfs_flock64 flock64 #define xfs_flock64_t struct flock64 +#define EFSBADCRC 991 /* Bad CRC detected */ + typedef struct xfs_error_injection { __int32_t fd; __int32_t errtag; diff --git a/include/linux.h b/include/linux.h index 502fd1f..5586290 100644 --- a/include/linux.h +++ b/include/linux.h @@ -136,6 +136,7 @@ platform_discard_blocks(int fd, uint64_t start, uint64_t len) #define ENOATTR ENODATA /* Attribute not found */ #define EFSCORRUPTED EUCLEAN /* Filesystem is corrupted */ +#define EFSBADCRC EBADMSG /* Bad CRC detected */ typedef loff_t xfs_off_t; typedef __uint64_t xfs_ino_t; diff --git a/libxfs/util.c b/libxfs/util.c index 8109ab3..1b05540 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -730,3 +730,16 @@ cmn_err(int level, char *fmt, ...) fputs("\n", stderr); va_end(ap); } + +/* + * Warnings specifically for verifier errors. Differentiate CRC vs. invalid + * values, and omit the stack trace unless the error level is tuned high. + */ +void +xfs_verifier_error( + struct xfs_buf *bp) +{ + xfs_alert(NULL, "Metadata %s detected at block 0x%llx/0x%x", + bp->b_error == EFSBADCRC ? "CRC error" : "corruption", + bp->b_bn, BBTOB(bp->b_length)); +} diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 364fd83..5a21590 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -449,3 +449,4 @@ int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); void xfs_trans_mod_sb(xfs_trans_t *, uint, long); void xfs_trans_init(struct xfs_mount *); int xfs_trans_roll(struct xfs_trans **, struct xfs_inode *); +void xfs_verifier_error(struct xfs_buf *bp); -- 1.9.0 From dave@fromorbit.com Tue Mar 4 02:52:21 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 354017F6B for ; Tue, 4 Mar 2014 02:52:21 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 98558AC004 for ; Tue, 4 Mar 2014 00:52:20 -0800 (PST) X-ASG-Debug-ID: 1393923135-04cb6c567721b350003-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id XadoHnSj8UdJbxPB for ; Tue, 04 Mar 2014 00:52:18 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlsGAIuTFVN5LJYe/2dsb2JhbABagwbDGxd0giUBAQUnLzMIGDE5AxsZh3jMLReTEASjEIdXg0Eo Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Mar 2014 19:22:13 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKl4w-0006Hc-Nb for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKl4w-0006zd-Mp for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 09/13] libxfs: add helper for updating checksums on xfs_bufs Date: Tue, 4 Mar 2014 19:51:53 +1100 X-ASG-Orig-Subj: [PATCH 09/13] libxfs: add helper for updating checksums on xfs_bufs Message-Id: <1393923117-9559-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393923117-9559-1-git-send-email-david@fromorbit.com> References: <1393923117-9559-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1393923138 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145730 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner [userspace port] Many/most callers of xfs_update_cksum() pass bp->b_addr and BBTOB(bp->b_length) as the first 2 args. Add a helper which can just accept the bp and the crc offset, and work it out on its own, for brevity. Signed-off-by: Dave Chinner --- include/libxfs.h | 7 +++++++ libxfs/xfs_alloc.c | 4 ++-- libxfs/xfs_attr_leaf.c | 2 +- libxfs/xfs_btree.c | 6 ++---- libxfs/xfs_da_btree.c | 2 +- libxfs/xfs_dir2_block.c | 2 +- libxfs/xfs_dir2_data.c | 2 +- libxfs/xfs_dir2_leaf.c | 2 +- libxfs/xfs_dir2_node.c | 2 +- libxfs/xfs_ialloc.c | 2 +- libxfs/xfs_sb.c | 2 +- libxfs/xfs_symlink_remote.c | 2 +- 12 files changed, 20 insertions(+), 15 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index 610e7d5..7500903 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -786,6 +786,13 @@ xfs_buf_verify_cksum(struct xfs_buf *bp, unsigned long cksum_offset) cksum_offset); } +static inline void +xfs_buf_update_cksum(struct xfs_buf *bp, unsigned long cksum_offset) +{ + xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), + cksum_offset); +} + #define xfs_notice(mp,fmt,args...) cmn_err(CE_NOTE,fmt, ## args) #define xfs_warn(mp,fmt,args...) cmn_err(CE_WARN,fmt, ## args) #define xfs_alert(mp,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 2f6a241..dca612b 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -493,7 +493,7 @@ xfs_agfl_write_verify( if (bip) XFS_BUF_TO_AGFL(bp)->agfl_lsn = cpu_to_be64(bip->bli_item.li_lsn); - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_AGFL_CRC_OFF); + xfs_buf_update_cksum(bp, XFS_AGFL_CRC_OFF); } const struct xfs_buf_ops xfs_agfl_buf_ops = { @@ -2249,7 +2249,7 @@ xfs_agf_write_verify( if (bip) XFS_BUF_TO_AGF(bp)->agf_lsn = cpu_to_be64(bip->bli_item.li_lsn); - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_AGF_CRC_OFF); + xfs_buf_update_cksum(bp, XFS_AGF_CRC_OFF); } const struct xfs_buf_ops xfs_agf_buf_ops = { diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 0bd3169..90937d6 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -198,7 +198,7 @@ xfs_attr3_leaf_write_verify( if (bip) hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn); - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_ATTR3_LEAF_CRC_OFF); + xfs_buf_update_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF); } /* diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index fffed0a..9be4abd 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -218,8 +218,7 @@ xfs_btree_lblock_calc_crc( return; if (bip) block->bb_u.l.bb_lsn = cpu_to_be64(bip->bli_item.li_lsn); - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), - XFS_BTREE_LBLOCK_CRC_OFF); + xfs_buf_update_cksum(bp, XFS_BTREE_LBLOCK_CRC_OFF); } bool @@ -251,8 +250,7 @@ xfs_btree_sblock_calc_crc( return; if (bip) block->bb_u.s.bb_lsn = cpu_to_be64(bip->bli_item.li_lsn); - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), - XFS_BTREE_SBLOCK_CRC_OFF); + xfs_buf_update_cksum(bp, XFS_BTREE_SBLOCK_CRC_OFF); } bool diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index 4e8b41a..0c0c5e0 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -220,7 +220,7 @@ xfs_da3_node_write_verify( if (bip) hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn); - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DA3_NODE_CRC_OFF); + xfs_buf_update_cksum(bp, XFS_DA3_NODE_CRC_OFF); } /* diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index 13561c3..3fe10ea 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -98,7 +98,7 @@ xfs_dir3_block_write_verify( if (bip) hdr3->lsn = cpu_to_be64(bip->bli_item.li_lsn); - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DIR3_DATA_CRC_OFF); + xfs_buf_update_cksum(bp, XFS_DIR3_DATA_CRC_OFF); } const struct xfs_buf_ops xfs_dir3_block_buf_ops = { diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index 2a0de28..bcb4c7f 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -262,7 +262,7 @@ xfs_dir3_data_write_verify( if (bip) hdr3->lsn = cpu_to_be64(bip->bli_item.li_lsn); - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DIR3_DATA_CRC_OFF); + xfs_buf_update_cksum(bp, XFS_DIR3_DATA_CRC_OFF); } const struct xfs_buf_ops xfs_dir3_data_buf_ops = { diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index 0fa147f..710f005 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -235,7 +235,7 @@ __write_verify( if (bip) hdr3->info.lsn = cpu_to_be64(bip->bli_item.li_lsn); - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DIR3_LEAF_CRC_OFF); + xfs_buf_update_cksum(bp, XFS_DIR3_LEAF_CRC_OFF); } static void diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index 78c77ed..f4260ea 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -126,7 +126,7 @@ xfs_dir3_free_write_verify( if (bip) hdr3->lsn = cpu_to_be64(bip->bli_item.li_lsn); - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_DIR3_FREE_CRC_OFF); + xfs_buf_update_cksum(bp, XFS_DIR3_FREE_CRC_OFF); } const struct xfs_buf_ops xfs_dir3_free_buf_ops = { diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index 21683b5..b1382d6 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1583,7 +1583,7 @@ xfs_agi_write_verify( if (bip) XFS_BUF_TO_AGI(bp)->agi_lsn = cpu_to_be64(bip->bli_item.li_lsn); - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_AGI_CRC_OFF); + xfs_buf_update_cksum(bp, XFS_AGI_CRC_OFF); } const struct xfs_buf_ops xfs_agi_buf_ops = { diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index 43fdb59..db267c2 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -628,7 +628,7 @@ xfs_sb_write_verify( if (bip) XFS_BUF_TO_SBP(bp)->sb_lsn = cpu_to_be64(bip->bli_item.li_lsn); - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_SB_CRC_OFF); + xfs_buf_update_cksum(bp, XFS_SB_CRC_OFF); } const struct xfs_buf_ops xfs_sb_buf_ops = { diff --git a/libxfs/xfs_symlink_remote.c b/libxfs/xfs_symlink_remote.c index 716f8a3..b59bf14 100644 --- a/libxfs/xfs_symlink_remote.c +++ b/libxfs/xfs_symlink_remote.c @@ -144,7 +144,7 @@ xfs_symlink_write_verify( struct xfs_dsymlink_hdr *dsl = bp->b_addr; dsl->sl_lsn = cpu_to_be64(bip->bli_item.li_lsn); } - xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), XFS_SYMLINK_CRC_OFF); + xfs_buf_update_cksum(bp, XFS_SYMLINK_CRC_OFF); } const struct xfs_buf_ops xfs_symlink_buf_ops = { -- 1.9.0 From dave@fromorbit.com Tue Mar 4 02:52:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BBFEA7F78 for ; Tue, 4 Mar 2014 02:52:21 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 889BD8F8065 for ; Tue, 4 Mar 2014 00:52:21 -0800 (PST) X-ASG-Debug-ID: 1393923133-04bdf05dac239590006-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id oy82aMImDiyG1ysT for ; Tue, 04 Mar 2014 00:52:19 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlsGAIuTFVN5LJYe/2dsb2JhbABagwbDGxd0giUBAQUnLzMIGDE5AxsZh3jMLReTEASjEIdXg0Eo Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Mar 2014 19:22:13 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKl4w-0006Hb-NF for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKl4w-0006zM-MS for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 08/13] libxfs: add helper for verifying checksums on xfs_bufs Date: Tue, 4 Mar 2014 19:51:52 +1100 X-ASG-Orig-Subj: [PATCH 08/13] libxfs: add helper for verifying checksums on xfs_bufs Message-Id: <1393923117-9559-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393923117-9559-1-git-send-email-david@fromorbit.com> References: <1393923117-9559-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1393923139 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145730 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner [userspace port] Many/most callers of xfs_verify_cksum() pass bp->b_addr and BBTOB(bp->b_length) as the first 2 args. Add a helper which can just accept the bp and the crc offset, and work it out on its own, for brevity. Signed-off-by: Dave Chinner --- include/libxfs.h | 7 +++++++ libxfs/xfs_alloc.c | 6 ++---- libxfs/xfs_attr_leaf.c | 3 +-- libxfs/xfs_btree.c | 8 ++++---- libxfs/xfs_da_btree.c | 3 +-- libxfs/xfs_dir2_block.c | 3 +-- libxfs/xfs_dir2_data.c | 3 +-- libxfs/xfs_dir2_leaf.c | 3 +-- libxfs/xfs_dir2_node.c | 3 +-- libxfs/xfs_ialloc.c | 4 ++-- libxfs/xfs_sb.c | 3 +-- libxfs/xfs_symlink_remote.c | 3 +-- 12 files changed, 23 insertions(+), 26 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index f688598..610e7d5 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -779,6 +779,13 @@ extern uint32_t crc32c_le(uint32_t crc, unsigned char const *p, size_t len); #include +static inline int +xfs_buf_verify_cksum(struct xfs_buf *bp, unsigned long cksum_offset) +{ + return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), + cksum_offset); +} + #define xfs_notice(mp,fmt,args...) cmn_err(CE_NOTE,fmt, ## args) #define xfs_warn(mp,fmt,args...) cmn_err(CE_WARN,fmt, ## args) #define xfs_alert(mp,fmt,args...) cmn_err(CE_ALERT,fmt, ## args) diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index 8a6725e..2f6a241 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -463,8 +463,7 @@ xfs_agfl_read_verify( if (!xfs_sb_version_hascrc(&mp->m_sb)) return; - agfl_ok = xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - XFS_AGFL_CRC_OFF); + agfl_ok = xfs_buf_verify_cksum(bp, XFS_AGFL_CRC_OFF); agfl_ok = agfl_ok && xfs_agfl_verify(bp); @@ -2220,8 +2219,7 @@ xfs_agf_read_verify( int agf_ok = 1; if (xfs_sb_version_hascrc(&mp->m_sb)) - agf_ok = xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - XFS_AGF_CRC_OFF); + agf_ok = xfs_buf_verify_cksum(bp, XFS_AGF_CRC_OFF); agf_ok = agf_ok && xfs_agf_verify(mp, bp); diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index fd52397..0bd3169 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -214,8 +214,7 @@ xfs_attr3_leaf_read_verify( struct xfs_mount *mp = bp->b_target->bt_mount; if ((xfs_sb_version_hascrc(&mp->m_sb) && - !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - XFS_ATTR3_LEAF_CRC_OFF)) || + !xfs_buf_verify_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF)) || !xfs_attr3_leaf_verify(bp)) { XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c index 2dd6fb7..fffed0a 100644 --- a/libxfs/xfs_btree.c +++ b/libxfs/xfs_btree.c @@ -227,8 +227,8 @@ xfs_btree_lblock_verify_crc( struct xfs_buf *bp) { if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) - return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - XFS_BTREE_LBLOCK_CRC_OFF); + return xfs_buf_verify_cksum(bp, XFS_BTREE_LBLOCK_CRC_OFF); + return true; } @@ -260,8 +260,8 @@ xfs_btree_sblock_verify_crc( struct xfs_buf *bp) { if (xfs_sb_version_hascrc(&bp->b_target->bt_mount->m_sb)) - return xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - XFS_BTREE_SBLOCK_CRC_OFF); + return xfs_buf_verify_cksum(bp, XFS_BTREE_SBLOCK_CRC_OFF); + return true; } diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index 53414f5..4e8b41a 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -238,8 +238,7 @@ xfs_da3_node_read_verify( switch (be16_to_cpu(info->magic)) { case XFS_DA3_NODE_MAGIC: - if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - XFS_DA3_NODE_CRC_OFF)) + if (!xfs_buf_verify_cksum(bp, XFS_DA3_NODE_CRC_OFF)) break; /* fall through */ case XFS_DA_NODE_MAGIC: diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index 1d8f598..13561c3 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -71,8 +71,7 @@ xfs_dir3_block_read_verify( struct xfs_mount *mp = bp->b_target->bt_mount; if ((xfs_sb_version_hascrc(&mp->m_sb) && - !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - XFS_DIR3_DATA_CRC_OFF)) || + !xfs_buf_verify_cksum(bp, XFS_DIR3_DATA_CRC_OFF)) || !xfs_dir3_block_verify(bp)) { XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index 189699f..2a0de28 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -235,8 +235,7 @@ xfs_dir3_data_read_verify( struct xfs_mount *mp = bp->b_target->bt_mount; if ((xfs_sb_version_hascrc(&mp->m_sb) && - !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - XFS_DIR3_DATA_CRC_OFF)) || + !xfs_buf_verify_cksum(bp, XFS_DIR3_DATA_CRC_OFF)) || !xfs_dir3_data_verify(bp)) { XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index 683536e..0fa147f 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -207,8 +207,7 @@ __read_verify( struct xfs_mount *mp = bp->b_target->bt_mount; if ((xfs_sb_version_hascrc(&mp->m_sb) && - !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - XFS_DIR3_LEAF_CRC_OFF)) || + !xfs_buf_verify_cksum(bp, XFS_DIR3_LEAF_CRC_OFF)) || !xfs_dir3_leaf_verify(bp, magic)) { XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index ced8c58..78c77ed 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -99,8 +99,7 @@ xfs_dir3_free_read_verify( struct xfs_mount *mp = bp->b_target->bt_mount; if ((xfs_sb_version_hascrc(&mp->m_sb) && - !xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - XFS_DIR3_FREE_CRC_OFF)) || + !xfs_buf_verify_cksum(bp, XFS_DIR3_FREE_CRC_OFF)) || !xfs_dir3_free_verify(bp)) { XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index b83ad98..21683b5 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1554,8 +1554,8 @@ xfs_agi_read_verify( int agi_ok = 1; if (xfs_sb_version_hascrc(&mp->m_sb)) - agi_ok = xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - XFS_AGI_CRC_OFF); + agi_ok = xfs_buf_verify_cksum(bp, XFS_AGI_CRC_OFF); + agi_ok = agi_ok && xfs_agi_verify(bp); if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index bbcf886..43fdb59 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -565,8 +565,7 @@ xfs_sb_read_verify( XFS_SB_VERSION_5) || dsb->sb_crc != 0)) { - if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - XFS_SB_CRC_OFF)) { + if (!xfs_buf_verify_cksum(bp, XFS_SB_CRC_OFF)) { /* Only fail bad secondaries on a known V5 filesystem */ if (bp->b_bn == XFS_SB_DADDR || xfs_sb_version_hascrc(&mp->m_sb)) { diff --git a/libxfs/xfs_symlink_remote.c b/libxfs/xfs_symlink_remote.c index 09ee9d4..716f8a3 100644 --- a/libxfs/xfs_symlink_remote.c +++ b/libxfs/xfs_symlink_remote.c @@ -116,8 +116,7 @@ xfs_symlink_read_verify( if (!xfs_sb_version_hascrc(&mp->m_sb)) return; - if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), - XFS_SYMLINK_CRC_OFF) || + if (!xfs_buf_verify_cksum(bp, XFS_SYMLINK_CRC_OFF) || !xfs_symlink_verify(bp)) { XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); -- 1.9.0 From dave@fromorbit.com Tue Mar 4 02:52:22 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9B63A7F73 for ; Tue, 4 Mar 2014 02:52:21 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 49884AC002 for ; Tue, 4 Mar 2014 00:52:18 -0800 (PST) X-ASG-Debug-ID: 1393923136-04bdf05dac2395a0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id S4MEpDawcCvJb5ic for ; Tue, 04 Mar 2014 00:52:16 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlsGAIuTFVN5LJYe/2dsb2JhbABagwbDGxd0giUBAQUnLzMIGDE5AxsZh3jMRI16dIQiBKpng0EogS0 Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Mar 2014 19:22:12 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKl4w-0006HY-Lq for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKl4w-0006yk-L4 for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 05/13] libxfs: limit superblock corruption errors to actual corruption Date: Tue, 4 Mar 2014 19:51:49 +1100 X-ASG-Orig-Subj: [PATCH 05/13] libxfs: limit superblock corruption errors to actual corruption Message-Id: <1393923117-9559-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393923117-9559-1-git-send-email-david@fromorbit.com> References: <1393923117-9559-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1393923136 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145730 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner [userspace port] Today, if xfs_sb_read_verify xfs_sb_verify xfs_mount_validate_sb detects superblock corruption, it'll be extremely noisy, dumping 2 stacks, 2 hexdumps, etc. This is because we call XFS_CORRUPTION_ERROR in xfs_mount_validate_sb as well as in xfs_sb_read_verify. Also, *any* errors in xfs_mount_validate_sb which are not corruption per se; things like too-big-blocksize, bad version, bad magic, v1 dirs, rw-incompat etc - things which do not return EFSCORRUPTED - will still do the whole XFS_CORRUPTION_ERROR spew when xfs_sb_read_verify sees any error at all. And it suggests to the user that they should run xfs_repair, even if the root cause of the mount failure is a simple incompatibility. I'll submit that the probably-not-corrupted errors don't warrant this much noise, so this patch removes the warning for anything other than EFSCORRUPTED returns, and replaces the lower-level XFS_CORRUPTION_ERROR with an xfs_notice(). Signed-off-by: Dave Chinner --- libxfs/xfs_sb.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index 6ad99a5..05bc860 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -266,8 +266,7 @@ xfs_mount_validate_sb( sbp->sb_dblocks == 0 || sbp->sb_dblocks > XFS_MAX_DBLOCKS(sbp) || sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp))) { - XFS_CORRUPTION_ERROR("SB sanity check failed", - XFS_ERRLEVEL_LOW, mp, sbp); + xfs_notice(mp, "SB sanity check failed"); return XFS_ERROR(EFSCORRUPTED); } @@ -580,7 +579,7 @@ xfs_sb_read_verify( out_error: if (error) { - if (error != EWRONGFS) + if (error == EFSCORRUPTED) XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, error); -- 1.9.0 From dave@fromorbit.com Tue Mar 4 02:52:23 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1E5BA7F7B for ; Tue, 4 Mar 2014 02:52:22 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 08CA88F8065 for ; Tue, 4 Mar 2014 00:52:21 -0800 (PST) X-ASG-Debug-ID: 1393923135-04cb6c567721b350004-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id dj4TfaK7YYJ7JwSY for ; Tue, 04 Mar 2014 00:52:20 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Al4GAIuTFVN5LJYe/2dsb2JhbABagwaqNJdKgR0XdIIlAQEBBCcvMwgYMTkDGxmHeMwtF45GhEoEqmeDQSiBLiQ Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Mar 2014 19:22:13 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKl4w-0006Hg-Pc for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKl4w-00070J-On for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 13/13] repair: phase 1 does not handle superblock CRCs Date: Tue, 4 Mar 2014 19:51:57 +1100 X-ASG-Orig-Subj: [PATCH 13/13] repair: phase 1 does not handle superblock CRCs Message-Id: <1393923117-9559-14-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393923117-9559-1-git-send-email-david@fromorbit.com> References: <1393923117-9559-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1393923139 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145730 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Phase 1 of xfs_repair verifies and corrects the primary superblock of the filesystem. It does not verify that the CRC of the superblock that is found is correct, nor does it recalculate the CRC of the superblock it rewrites. This happens because phase1 does not use the libxfs buffer cache - it just uses pread/pwrite on a memory buffer, and works directly from that buffer. Hence we need to add CRC verification to verify_sb(), and CRC recalculation to write_primary_sb() so that it works correctly. This also enables us to use get_sb() as the method of fetching the superblock from disk after phase 1 without needing to use the libxfs buffer cache and guessing at the sector size. This prevents a verifier error because it attempts to CRC a superblock buffer that is much longer than the usual sector sizes. Signed-off-by: Dave Chinner --- repair/agheader.c | 2 +- repair/globals.h | 3 ++- repair/phase1.c | 5 ++-- repair/protos.h | 3 ++- repair/sb.c | 71 +++++++++++++++++++++++++++++------------------------ repair/xfs_repair.c | 26 +++++++++++--------- 6 files changed, 62 insertions(+), 48 deletions(-) diff --git a/repair/agheader.c b/repair/agheader.c index 53e47b6..fc5dac9 100644 --- a/repair/agheader.c +++ b/repair/agheader.c @@ -472,7 +472,7 @@ verify_set_agheader(xfs_mount_t *mp, xfs_buf_t *sbuf, xfs_sb_t *sb, int status = XR_OK; int status_sb = XR_OK; - status = verify_sb(sb, (i == 0)); + status = verify_sb(sbuf->b_addr, sb, (i == 0)); if (status != XR_OK) { do_warn(_("bad on-disk superblock %d - %s\n"), diff --git a/repair/globals.h b/repair/globals.h index cbb2ce7..f6e0a22 100644 --- a/repair/globals.h +++ b/repair/globals.h @@ -49,7 +49,8 @@ #define XR_BAD_SB_UNIT 17 /* bad stripe unit */ #define XR_BAD_SB_WIDTH 18 /* bad stripe width */ #define XR_BAD_SVN 19 /* bad shared version number */ -#define XR_BAD_ERR_CODE 20 /* Bad error code */ +#define XR_BAD_CRC 20 /* Bad CRC */ +#define XR_BAD_ERR_CODE 21 /* Bad error code */ /* XFS filesystem (il)legal values */ diff --git a/repair/phase1.c b/repair/phase1.c index 62de211..ec75ada 100644 --- a/repair/phase1.c +++ b/repair/phase1.c @@ -70,13 +70,14 @@ phase1(xfs_mount_t *mp) ag_bp = alloc_ag_buf(MAX_SECTSIZE); sb = (xfs_sb_t *) ag_bp; - if (get_sb(sb, 0LL, MAX_SECTSIZE, 0) == XR_EOF) + rval = get_sb(sb, 0LL, MAX_SECTSIZE, 0); + if (rval == XR_EOF) do_error(_("error reading primary superblock\n")); /* * is this really an sb, verify internal consistency */ - if ((rval = verify_sb(sb, 1)) != XR_OK) { + if (rval != XR_OK) { do_warn(_("bad primary superblock - %s !!!\n"), err_string(rval)); if (!find_secondary_sb(sb)) diff --git a/repair/protos.h b/repair/protos.h index 601f2a9..ff42fa7 100644 --- a/repair/protos.h +++ b/repair/protos.h @@ -18,7 +18,8 @@ void xfs_init(libxfs_init_t *args); -int verify_sb(xfs_sb_t *sb, +int verify_sb(char *sb_buf, + xfs_sb_t *sb, int is_primary_sb); int verify_set_primary_sb(xfs_sb_t *root_sb, int sb_index, diff --git a/repair/sb.c b/repair/sb.c index c54d89b..b111aca 100644 --- a/repair/sb.c +++ b/repair/sb.c @@ -139,7 +139,7 @@ find_secondary_sb(xfs_sb_t *rsb) c_bufsb = (char *)sb + i; libxfs_sb_from_disk(&bufsb, (xfs_dsb_t *)c_bufsb); - if (verify_sb(&bufsb, 0) != XR_OK) + if (verify_sb(c_bufsb, &bufsb, 0) != XR_OK) continue; do_warn(_("found candidate secondary superblock...\n")); @@ -245,7 +245,7 @@ sb_validate_ino_align(struct xfs_sb *sb) */ int -verify_sb(xfs_sb_t *sb, int is_primary_sb) +verify_sb(char *sb_buf, xfs_sb_t *sb, int is_primary_sb) { __uint32_t bsize; int i; @@ -263,8 +263,34 @@ verify_sb(xfs_sb_t *sb, int is_primary_sb) if (is_primary_sb && sb->sb_inprogress == 1) return(XR_BAD_INPROGRESS); - /* check to make sure blocksize is legal 2^N, 9 <= N <= 16 */ + /* + * before going *any further*, validate the sector size and if the + * version says we should have CRCs enabled, validate that. + */ + + /* check to make sure sectorsize is legal 2^N, 9 <= N <= 15 */ + if (sb->sb_sectsize == 0) + return(XR_BAD_SECT_SIZE_DATA); + + bsize = 1; + for (i = 0; bsize < sb->sb_sectsize && + i < sizeof(sb->sb_sectsize) * NBBY; i++) { + bsize <<= 1; + } + + if (i < XFS_MIN_SECTORSIZE_LOG || i > XFS_MAX_SECTORSIZE_LOG) + return(XR_BAD_SECT_SIZE_DATA); + + /* check sb sectorsize field against sb sectlog field */ + if (i != sb->sb_sectlog) + return(XR_BAD_SECT_SIZE_DATA); + + /* sector size in range - CRC check time */ + if (xfs_sb_version_hascrc(sb) && + !xfs_verify_cksum(sb_buf, sb->sb_sectsize, XFS_SB_CRC_OFF)) + return XR_BAD_CRC; + /* check to make sure blocksize is legal 2^N, 9 <= N <= 16 */ if (sb->sb_blocksize == 0) return(XR_BAD_BLOCKSIZE); @@ -300,26 +326,6 @@ verify_sb(xfs_sb_t *sb, int is_primary_sb) sb->sb_inopblock != howmany(sb->sb_blocksize,sb->sb_inodesize)) return(XR_BAD_INO_SIZE_DATA); - /* check to make sure sectorsize is legal 2^N, 9 <= N <= 15 */ - - if (sb->sb_sectsize == 0) - return(XR_BAD_SECT_SIZE_DATA); - - bsize = 1; - - for (i = 0; bsize < sb->sb_sectsize && - i < sizeof(sb->sb_sectsize) * NBBY; i++) { - bsize <<= 1; - } - - if (i < XFS_MIN_SECTORSIZE_LOG || i > XFS_MAX_SECTORSIZE_LOG) - return(XR_BAD_SECT_SIZE_DATA); - - /* check sb sectorsize field against sb sectlog field */ - - if (i != sb->sb_sectlog) - return(XR_BAD_SECT_SIZE_DATA); - if (xfs_sb_version_hassector(sb)) { /* check to make sure log sector is legal 2^N, 9 <= N <= 15 */ @@ -482,9 +488,11 @@ write_primary_sb(xfs_sb_t *sbp, int size) do_error(_("couldn't seek to offset 0 in filesystem\n")); } - libxfs_sb_to_disk(buf, sbp, XFS_SB_ALL_BITS); + if (xfs_sb_version_hascrc(sbp)) + xfs_update_cksum((char *)buf, size, XFS_SB_CRC_OFF); + if (write(x.dfd, buf, size) != size) { free(buf); do_error(_("primary superblock write failed!\n")); @@ -494,7 +502,7 @@ write_primary_sb(xfs_sb_t *sbp, int size) } /* - * get a possible superblock -- don't check for internal consistency + * get a possible superblock -- checks for internal consistency */ int get_sb(xfs_sb_t *sbp, xfs_off_t off, int size, xfs_agnumber_t agno) @@ -529,9 +537,10 @@ get_sb(xfs_sb_t *sbp, xfs_off_t off, int size, xfs_agnumber_t agno) do_error("%s\n", strerror(error)); } libxfs_sb_from_disk(sbp, buf); - free(buf); - return (verify_sb(sbp, 0)); + rval = verify_sb((char *)buf, sbp, agno == 0); + free(buf); + return rval; } /* returns element on list with highest reference count */ @@ -745,13 +754,11 @@ verify_set_primary_sb(xfs_sb_t *rsb, off = (xfs_off_t)agno * rsb->sb_agblocks << rsb->sb_blocklog; checked[agno] = 1; - - if (get_sb(sb, off, size, agno) == XR_EOF) { - retval = XR_EOF; + retval = get_sb(sb, off, size, agno); + if (retval == XR_EOF) goto out_free_list; - } - if (verify_sb(sb, 0) == XR_OK) { + if (retval == XR_OK) { /* * save away geometry info. * don't bother checking the sb diff --git a/repair/xfs_repair.c b/repair/xfs_repair.c index 6327076..08b25f0 100644 --- a/repair/xfs_repair.c +++ b/repair/xfs_repair.c @@ -137,6 +137,8 @@ err_string(int err_code) _("bad stripe width in superblock"); err_message[XR_BAD_SVN] = _("bad shared version number in superblock"); + err_message[XR_BAD_CRC] = + _("bad CRC in superblock"); done = 1; } @@ -529,6 +531,8 @@ main(int argc, char **argv) xfs_buf_t *sbp; xfs_mount_t xfs_m; char *msgbuf; + struct xfs_sb psb; + int rval; progname = basename(argv[0]); setlocale(LC_ALL, ""); @@ -558,13 +562,12 @@ main(int argc, char **argv) exit(1); } - /* prepare the mount structure */ - memset(&xfs_m, 0, sizeof(xfs_mount_t)); - libxfs_buftarg_init(&xfs_m, x.ddev, x.logdev, x.rtdev); - sbp = libxfs_readbuf(xfs_m.m_ddev_targp, XFS_SB_DADDR, - 1 << (XFS_MAX_SECTORSIZE_LOG - BBSHIFT), 0, - &xfs_sb_buf_ops); - libxfs_sb_from_disk(&xfs_m.m_sb, XFS_BUF_TO_SBP(sbp)); + rval = get_sb(&psb, 0, XFS_MAX_SECTORSIZE, 0); + if (rval != XR_OK) { + do_warn(_("Primary superblock bad after phase 1!\n" + "Exiting now.\n")); + exit(1); + } /* * if the sector size of the filesystem we are trying to repair is @@ -583,7 +586,7 @@ main(int argc, char **argv) geom.sectsize = BBSIZE; } - if (xfs_m.m_sb.sb_sectsize < geom.sectsize) { + if (psb.sb_sectsize < geom.sectsize) { long old_flags; old_flags = fcntl(fd, F_GETFL, 0); @@ -595,7 +598,10 @@ main(int argc, char **argv) } } } - mp = libxfs_mount(&xfs_m, &xfs_m.m_sb, x.ddev, x.logdev, x.rtdev, 0); + + /* prepare the mount structure */ + memset(&xfs_m, 0, sizeof(xfs_mount_t)); + mp = libxfs_mount(&xfs_m, &psb, x.ddev, x.logdev, x.rtdev, 0); if (!mp) { fprintf(stderr, @@ -603,8 +609,6 @@ main(int argc, char **argv) progname); exit(1); } - libxfs_putbuf(sbp); - libxfs_purgebuf(sbp); /* * set XFS-independent status vars from the mount/sb structure -- 1.9.0 From dave@fromorbit.com Tue Mar 4 02:52:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4FEDF7F83 for ; Tue, 4 Mar 2014 02:52:23 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E2F2D8F8071 for ; Tue, 4 Mar 2014 00:52:22 -0800 (PST) X-ASG-Debug-ID: 1393923136-04bdf05dac2395a0004-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 7IWnv2sGozF4uIGT for ; Tue, 04 Mar 2014 00:52:20 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlsGAIuTFVN5LJYe/2dsb2JhbABagwbDGxd0giUBAQUnLzMIGDE5AxsZh3jMLReTEASqZ4NBKA Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail07.adl2.internode.on.net with ESMTP; 04 Mar 2014 19:22:13 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WKl4w-0006He-Os for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WKl4w-0006zt-O3 for xfs@oss.sgi.com; Tue, 04 Mar 2014 19:51:58 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 11/13] libxfs: modify verifiers to differentiate CRC from other errors Date: Tue, 4 Mar 2014 19:51:55 +1100 X-ASG-Orig-Subj: [PATCH 11/13] libxfs: modify verifiers to differentiate CRC from other errors Message-Id: <1393923117-9559-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393923117-9559-1-git-send-email-david@fromorbit.com> References: <1393923117-9559-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1393923139 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145730 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner [userspace port] Modify all read & write verifiers to differentiate between CRC errors and other inconsistencies. This sets the appropriate error number on bp->b_error, and then calls xfs_verifier_error() if something went wrong. That function will issue the appropriate message to the user. Also, fix the silly bug in xfs_buf_ioerror() that this patch exposes. Signed-off-by: Dave Chinner --- include/libxfs.h | 2 +- libxfs/xfs_alloc.c | 37 +++++++++++++++++-------------------- libxfs/xfs_alloc_btree.c | 15 ++++++++------- libxfs/xfs_attr_leaf.c | 14 ++++++++------ libxfs/xfs_attr_remote.c | 15 ++++++--------- libxfs/xfs_bmap_btree.c | 16 ++++++++-------- libxfs/xfs_da_btree.c | 14 ++++++++------ libxfs/xfs_dir2_block.c | 14 ++++++++------ libxfs/xfs_dir2_data.c | 17 +++++++++-------- libxfs/xfs_dir2_leaf.c | 14 ++++++++------ libxfs/xfs_dir2_node.c | 14 ++++++++------ libxfs/xfs_dquot_buf.c | 11 +++++++---- libxfs/xfs_ialloc.c | 21 ++++++++++----------- libxfs/xfs_ialloc_btree.c | 15 ++++++++------- libxfs/xfs_inode_buf.c | 3 +-- libxfs/xfs_sb.c | 10 ++++------ libxfs/xfs_symlink_remote.c | 12 +++++++----- 17 files changed, 126 insertions(+), 118 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index 7500903..6bc6c94 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -365,7 +365,7 @@ enum xfs_buf_flags_t { /* b_flags bits */ #define XFS_BUF_PRIORITY(bp) (cache_node_get_priority( \ (struct cache_node *)(bp))) #define xfs_buf_set_ref(bp,ref) ((void) 0) -#define xfs_buf_ioerror(bp,err) (bp)->b_error = (err); +#define xfs_buf_ioerror(bp,err) ((bp)->b_error = (err)) #define xfs_daddr_to_agno(mp,d) \ ((xfs_agnumber_t)(XFS_BB_TO_FSBT(mp, d) / (mp)->m_sb.sb_agblocks)) diff --git a/libxfs/xfs_alloc.c b/libxfs/xfs_alloc.c index dca612b..6c82be0 100644 --- a/libxfs/xfs_alloc.c +++ b/libxfs/xfs_alloc.c @@ -452,7 +452,6 @@ xfs_agfl_read_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; - int agfl_ok = 1; /* * There is no verification of non-crc AGFLs because mkfs does not @@ -463,14 +462,13 @@ xfs_agfl_read_verify( if (!xfs_sb_version_hascrc(&mp->m_sb)) return; - agfl_ok = xfs_buf_verify_cksum(bp, XFS_AGFL_CRC_OFF); - - agfl_ok = agfl_ok && xfs_agfl_verify(bp); - - if (!agfl_ok) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + if (!xfs_buf_verify_cksum(bp, XFS_AGFL_CRC_OFF)) + xfs_buf_ioerror(bp, EFSBADCRC); + else if (!xfs_agfl_verify(bp)) xfs_buf_ioerror(bp, EFSCORRUPTED); - } + + if (bp->b_error) + xfs_verifier_error(bp); } static void @@ -485,8 +483,8 @@ xfs_agfl_write_verify( return; if (!xfs_agfl_verify(bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); return; } @@ -2216,18 +2214,17 @@ xfs_agf_read_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; - int agf_ok = 1; - - if (xfs_sb_version_hascrc(&mp->m_sb)) - agf_ok = xfs_buf_verify_cksum(bp, XFS_AGF_CRC_OFF); - agf_ok = agf_ok && xfs_agf_verify(mp, bp); - - if (unlikely(XFS_TEST_ERROR(!agf_ok, mp, XFS_ERRTAG_ALLOC_READ_AGF, - XFS_RANDOM_ALLOC_READ_AGF))) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + if (xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_buf_verify_cksum(bp, XFS_AGF_CRC_OFF)) + xfs_buf_ioerror(bp, EFSBADCRC); + else if (XFS_TEST_ERROR(!xfs_agf_verify(mp, bp), mp, + XFS_ERRTAG_ALLOC_READ_AGF, + XFS_RANDOM_ALLOC_READ_AGF)) xfs_buf_ioerror(bp, EFSCORRUPTED); - } + + if (bp->b_error) + xfs_verifier_error(bp); } static void @@ -2238,8 +2235,8 @@ xfs_agf_write_verify( struct xfs_buf_log_item *bip = bp->b_fspriv; if (!xfs_agf_verify(mp, bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); return; } diff --git a/libxfs/xfs_alloc_btree.c b/libxfs/xfs_alloc_btree.c index 5b38c24..215be7e 100644 --- a/libxfs/xfs_alloc_btree.c +++ b/libxfs/xfs_alloc_btree.c @@ -337,12 +337,14 @@ static void xfs_allocbt_read_verify( struct xfs_buf *bp) { - if (!(xfs_btree_sblock_verify_crc(bp) && - xfs_allocbt_verify(bp))) { - trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); + if (!xfs_btree_sblock_verify_crc(bp)) + xfs_buf_ioerror(bp, EFSBADCRC); + else if (!xfs_allocbt_verify(bp)) xfs_buf_ioerror(bp, EFSCORRUPTED); + + if (bp->b_error) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + xfs_verifier_error(bp); } } @@ -352,9 +354,8 @@ xfs_allocbt_write_verify( { if (!xfs_allocbt_verify(bp)) { trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); return; } xfs_btree_sblock_calc_crc(bp); diff --git a/libxfs/xfs_attr_leaf.c b/libxfs/xfs_attr_leaf.c index 90937d6..f7f02ae 100644 --- a/libxfs/xfs_attr_leaf.c +++ b/libxfs/xfs_attr_leaf.c @@ -187,8 +187,8 @@ xfs_attr3_leaf_write_verify( struct xfs_attr3_leaf_hdr *hdr3 = bp->b_addr; if (!xfs_attr3_leaf_verify(bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); return; } @@ -213,12 +213,14 @@ xfs_attr3_leaf_read_verify( { struct xfs_mount *mp = bp->b_target->bt_mount; - if ((xfs_sb_version_hascrc(&mp->m_sb) && - !xfs_buf_verify_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF)) || - !xfs_attr3_leaf_verify(bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + if (xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_buf_verify_cksum(bp, XFS_ATTR3_LEAF_CRC_OFF)) + xfs_buf_ioerror(bp, EFSBADCRC); + else if (!xfs_attr3_leaf_verify(bp)) xfs_buf_ioerror(bp, EFSCORRUPTED); - } + + if (bp->b_error) + xfs_verifier_error(bp); } const struct xfs_buf_ops xfs_attr3_leaf_buf_ops = { diff --git a/libxfs/xfs_attr_remote.c b/libxfs/xfs_attr_remote.c index 59bb12d..5cf5c73 100644 --- a/libxfs/xfs_attr_remote.c +++ b/libxfs/xfs_attr_remote.c @@ -100,7 +100,6 @@ xfs_attr3_rmt_read_verify( struct xfs_mount *mp = bp->b_target->bt_mount; char *ptr; int len; - bool corrupt = false; xfs_daddr_t bno; /* no verification of non-crc buffers */ @@ -115,11 +114,11 @@ xfs_attr3_rmt_read_verify( while (len > 0) { if (!xfs_verify_cksum(ptr, XFS_LBSIZE(mp), XFS_ATTR3_RMT_CRC_OFF)) { - corrupt = true; + xfs_buf_ioerror(bp, EFSBADCRC); break; } if (!xfs_attr3_rmt_verify(mp, ptr, XFS_LBSIZE(mp), bno)) { - corrupt = true; + xfs_buf_ioerror(bp, EFSCORRUPTED); break; } len -= XFS_LBSIZE(mp); @@ -127,10 +126,9 @@ xfs_attr3_rmt_read_verify( bno += mp->m_bsize; } - if (corrupt) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); - xfs_buf_ioerror(bp, EFSCORRUPTED); - } else + if (bp->b_error) + xfs_verifier_error(bp); + else ASSERT(len == 0); } @@ -155,9 +153,8 @@ xfs_attr3_rmt_write_verify( while (len > 0) { if (!xfs_attr3_rmt_verify(mp, ptr, XFS_LBSIZE(mp), bno)) { - XFS_CORRUPTION_ERROR(__func__, - XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); return; } if (bip) { diff --git a/libxfs/xfs_bmap_btree.c b/libxfs/xfs_bmap_btree.c index 3136e4f..a4bd69d 100644 --- a/libxfs/xfs_bmap_btree.c +++ b/libxfs/xfs_bmap_btree.c @@ -759,12 +759,14 @@ static void xfs_bmbt_read_verify( struct xfs_buf *bp) { - if (!(xfs_btree_lblock_verify_crc(bp) && - xfs_bmbt_verify(bp))) { - trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); + if (!xfs_btree_lblock_verify_crc(bp)) + xfs_buf_ioerror(bp, EFSBADCRC); + else if (!xfs_bmbt_verify(bp)) xfs_buf_ioerror(bp, EFSCORRUPTED); + + if (bp->b_error) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + xfs_verifier_error(bp); } } @@ -773,11 +775,9 @@ xfs_bmbt_write_verify( struct xfs_buf *bp) { if (!xfs_bmbt_verify(bp)) { - xfs_warn(bp->b_target->bt_mount, "bmbt daddr 0x%llx failed", bp->b_bn); trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); return; } xfs_btree_lblock_calc_crc(bp); diff --git a/libxfs/xfs_da_btree.c b/libxfs/xfs_da_btree.c index 0c0c5e0..154adb1 100644 --- a/libxfs/xfs_da_btree.c +++ b/libxfs/xfs_da_btree.c @@ -209,8 +209,8 @@ xfs_da3_node_write_verify( struct xfs_da3_node_hdr *hdr3 = bp->b_addr; if (!xfs_da3_node_verify(bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); return; } @@ -233,17 +233,20 @@ static void xfs_da3_node_read_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_da_blkinfo *info = bp->b_addr; switch (be16_to_cpu(info->magic)) { case XFS_DA3_NODE_MAGIC: - if (!xfs_buf_verify_cksum(bp, XFS_DA3_NODE_CRC_OFF)) + if (!xfs_buf_verify_cksum(bp, XFS_DA3_NODE_CRC_OFF)) { + xfs_buf_ioerror(bp, EFSBADCRC); break; + } /* fall through */ case XFS_DA_NODE_MAGIC: - if (!xfs_da3_node_verify(bp)) + if (!xfs_da3_node_verify(bp)) { + xfs_buf_ioerror(bp, EFSCORRUPTED); break; + } return; case XFS_ATTR_LEAF_MAGIC: case XFS_ATTR3_LEAF_MAGIC: @@ -260,8 +263,7 @@ xfs_da3_node_read_verify( } /* corrupt block */ - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); - xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); } const struct xfs_buf_ops xfs_da3_node_buf_ops = { diff --git a/libxfs/xfs_dir2_block.c b/libxfs/xfs_dir2_block.c index 3fe10ea..cede01f 100644 --- a/libxfs/xfs_dir2_block.c +++ b/libxfs/xfs_dir2_block.c @@ -70,12 +70,14 @@ xfs_dir3_block_read_verify( { struct xfs_mount *mp = bp->b_target->bt_mount; - if ((xfs_sb_version_hascrc(&mp->m_sb) && - !xfs_buf_verify_cksum(bp, XFS_DIR3_DATA_CRC_OFF)) || - !xfs_dir3_block_verify(bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + if (xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_buf_verify_cksum(bp, XFS_DIR3_DATA_CRC_OFF)) + xfs_buf_ioerror(bp, EFSBADCRC); + else if (!xfs_dir3_block_verify(bp)) xfs_buf_ioerror(bp, EFSCORRUPTED); - } + + if (bp->b_error) + xfs_verifier_error(bp); } static void @@ -87,8 +89,8 @@ xfs_dir3_block_write_verify( struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; if (!xfs_dir3_block_verify(bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); return; } diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c index bcb4c7f..dc9df4d 100644 --- a/libxfs/xfs_dir2_data.c +++ b/libxfs/xfs_dir2_data.c @@ -208,7 +208,6 @@ static void xfs_dir3_data_reada_verify( struct xfs_buf *bp) { - struct xfs_mount *mp = bp->b_target->bt_mount; struct xfs_dir2_data_hdr *hdr = bp->b_addr; switch (hdr->magic) { @@ -222,8 +221,8 @@ xfs_dir3_data_reada_verify( xfs_dir3_data_verify(bp); return; default: - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, hdr); xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); break; } } @@ -234,12 +233,14 @@ xfs_dir3_data_read_verify( { struct xfs_mount *mp = bp->b_target->bt_mount; - if ((xfs_sb_version_hascrc(&mp->m_sb) && - !xfs_buf_verify_cksum(bp, XFS_DIR3_DATA_CRC_OFF)) || - !xfs_dir3_data_verify(bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + if (xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_buf_verify_cksum(bp, XFS_DIR3_DATA_CRC_OFF)) + xfs_buf_ioerror(bp, EFSBADCRC); + else if (!xfs_dir3_data_verify(bp)) xfs_buf_ioerror(bp, EFSCORRUPTED); - } + + if (bp->b_error) + xfs_verifier_error(bp); } static void @@ -251,8 +252,8 @@ xfs_dir3_data_write_verify( struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; if (!xfs_dir3_data_verify(bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); return; } diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c index 710f005..8e0cbc9 100644 --- a/libxfs/xfs_dir2_leaf.c +++ b/libxfs/xfs_dir2_leaf.c @@ -206,12 +206,14 @@ __read_verify( { struct xfs_mount *mp = bp->b_target->bt_mount; - if ((xfs_sb_version_hascrc(&mp->m_sb) && - !xfs_buf_verify_cksum(bp, XFS_DIR3_LEAF_CRC_OFF)) || - !xfs_dir3_leaf_verify(bp, magic)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + if (xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_buf_verify_cksum(bp, XFS_DIR3_LEAF_CRC_OFF)) + xfs_buf_ioerror(bp, EFSBADCRC); + else if (!xfs_dir3_leaf_verify(bp, magic)) xfs_buf_ioerror(bp, EFSCORRUPTED); - } + + if (bp->b_error) + xfs_verifier_error(bp); } static void @@ -224,8 +226,8 @@ __write_verify( struct xfs_dir3_leaf_hdr *hdr3 = bp->b_addr; if (!xfs_dir3_leaf_verify(bp, magic)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); return; } diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c index f4260ea..3256756 100644 --- a/libxfs/xfs_dir2_node.c +++ b/libxfs/xfs_dir2_node.c @@ -98,12 +98,14 @@ xfs_dir3_free_read_verify( { struct xfs_mount *mp = bp->b_target->bt_mount; - if ((xfs_sb_version_hascrc(&mp->m_sb) && - !xfs_buf_verify_cksum(bp, XFS_DIR3_FREE_CRC_OFF)) || - !xfs_dir3_free_verify(bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + if (xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_buf_verify_cksum(bp, XFS_DIR3_FREE_CRC_OFF)) + xfs_buf_ioerror(bp, EFSBADCRC); + else if (!xfs_dir3_free_verify(bp)) xfs_buf_ioerror(bp, EFSCORRUPTED); - } + + if (bp->b_error) + xfs_verifier_error(bp); } static void @@ -115,8 +117,8 @@ xfs_dir3_free_write_verify( struct xfs_dir3_blk_hdr *hdr3 = bp->b_addr; if (!xfs_dir3_free_verify(bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); return; } diff --git a/libxfs/xfs_dquot_buf.c b/libxfs/xfs_dquot_buf.c index 6bbb0ff..e089ec8 100644 --- a/libxfs/xfs_dquot_buf.c +++ b/libxfs/xfs_dquot_buf.c @@ -237,10 +237,13 @@ xfs_dquot_buf_read_verify( { struct xfs_mount *mp = bp->b_target->bt_mount; - if (!xfs_dquot_buf_verify_crc(mp, bp) || !xfs_dquot_buf_verify(mp, bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + if (!xfs_dquot_buf_verify_crc(mp, bp)) + xfs_buf_ioerror(bp, EFSBADCRC); + else if (!xfs_dquot_buf_verify(mp, bp)) xfs_buf_ioerror(bp, EFSCORRUPTED); - } + + if (bp->b_error) + xfs_verifier_error(bp); } /* @@ -255,8 +258,8 @@ xfs_dquot_buf_write_verify( struct xfs_mount *mp = bp->b_target->bt_mount; if (!xfs_dquot_buf_verify(mp, bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); return; } } diff --git a/libxfs/xfs_ialloc.c b/libxfs/xfs_ialloc.c index b1382d6..c19d84a 100644 --- a/libxfs/xfs_ialloc.c +++ b/libxfs/xfs_ialloc.c @@ -1551,18 +1551,17 @@ xfs_agi_read_verify( struct xfs_buf *bp) { struct xfs_mount *mp = bp->b_target->bt_mount; - int agi_ok = 1; - if (xfs_sb_version_hascrc(&mp->m_sb)) - agi_ok = xfs_buf_verify_cksum(bp, XFS_AGI_CRC_OFF); - - agi_ok = agi_ok && xfs_agi_verify(bp); - - if (unlikely(XFS_TEST_ERROR(!agi_ok, mp, XFS_ERRTAG_IALLOC_READ_AGI, - XFS_RANDOM_IALLOC_READ_AGI))) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + if (xfs_sb_version_hascrc(&mp->m_sb) && + !xfs_buf_verify_cksum(bp, XFS_AGI_CRC_OFF)) + xfs_buf_ioerror(bp, EFSBADCRC); + else if (XFS_TEST_ERROR(!xfs_agi_verify(bp), mp, + XFS_ERRTAG_IALLOC_READ_AGI, + XFS_RANDOM_IALLOC_READ_AGI)) xfs_buf_ioerror(bp, EFSCORRUPTED); - } + + if (bp->b_error) + xfs_verifier_error(bp); } static void @@ -1573,8 +1572,8 @@ xfs_agi_write_verify( struct xfs_buf_log_item *bip = bp->b_fspriv; if (!xfs_agi_verify(bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); return; } diff --git a/libxfs/xfs_ialloc_btree.c b/libxfs/xfs_ialloc_btree.c index d9589b7..0a29d73 100644 --- a/libxfs/xfs_ialloc_btree.c +++ b/libxfs/xfs_ialloc_btree.c @@ -224,12 +224,14 @@ static void xfs_inobt_read_verify( struct xfs_buf *bp) { - if (!(xfs_btree_sblock_verify_crc(bp) && - xfs_inobt_verify(bp))) { - trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); + if (!xfs_btree_sblock_verify_crc(bp)) + xfs_buf_ioerror(bp, EFSBADCRC); + else if (!xfs_inobt_verify(bp)) xfs_buf_ioerror(bp, EFSCORRUPTED); + + if (bp->b_error) { + trace_xfs_btree_corrupt(bp, _RET_IP_); + xfs_verifier_error(bp); } } @@ -239,9 +241,8 @@ xfs_inobt_write_verify( { if (!xfs_inobt_verify(bp)) { trace_xfs_btree_corrupt(bp, _RET_IP_); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - bp->b_target->bt_mount, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); return; } xfs_btree_sblock_calc_crc(bp); diff --git a/libxfs/xfs_inode_buf.c b/libxfs/xfs_inode_buf.c index 4f29033..de16ed9 100644 --- a/libxfs/xfs_inode_buf.c +++ b/libxfs/xfs_inode_buf.c @@ -88,8 +88,7 @@ xfs_inode_buf_verify( } xfs_buf_ioerror(bp, EFSCORRUPTED); - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_HIGH, - mp, dip); + xfs_verifier_error(bp); #ifdef DEBUG xfs_alert(mp, "bad inode magic/vsn daddr %lld #%d (magic=%x)", diff --git a/libxfs/xfs_sb.c b/libxfs/xfs_sb.c index db267c2..7ee4612 100644 --- a/libxfs/xfs_sb.c +++ b/libxfs/xfs_sb.c @@ -569,7 +569,7 @@ xfs_sb_read_verify( /* Only fail bad secondaries on a known V5 filesystem */ if (bp->b_bn == XFS_SB_DADDR || xfs_sb_version_hascrc(&mp->m_sb)) { - error = EFSCORRUPTED; + error = EFSBADCRC; goto out_error; } } @@ -578,10 +578,9 @@ xfs_sb_read_verify( out_error: if (error) { - if (error == EFSCORRUPTED) - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - mp, bp->b_addr); xfs_buf_ioerror(bp, error); + if (error == EFSCORRUPTED || error == EFSBADCRC) + xfs_verifier_error(bp); } } @@ -616,9 +615,8 @@ xfs_sb_write_verify( error = xfs_sb_verify(bp, false); if (error) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, - mp, bp->b_addr); xfs_buf_ioerror(bp, error); + xfs_verifier_error(bp); return; } diff --git a/libxfs/xfs_symlink_remote.c b/libxfs/xfs_symlink_remote.c index b59bf14..ebf60ac 100644 --- a/libxfs/xfs_symlink_remote.c +++ b/libxfs/xfs_symlink_remote.c @@ -116,11 +116,13 @@ xfs_symlink_read_verify( if (!xfs_sb_version_hascrc(&mp->m_sb)) return; - if (!xfs_buf_verify_cksum(bp, XFS_SYMLINK_CRC_OFF) || - !xfs_symlink_verify(bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); + if (!xfs_buf_verify_cksum(bp, XFS_SYMLINK_CRC_OFF)) + xfs_buf_ioerror(bp, EFSBADCRC); + else if (!xfs_symlink_verify(bp)) xfs_buf_ioerror(bp, EFSCORRUPTED); - } + + if (bp->b_error) + xfs_verifier_error(bp); } static void @@ -135,8 +137,8 @@ xfs_symlink_write_verify( return; if (!xfs_symlink_verify(bp)) { - XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); xfs_buf_ioerror(bp, EFSCORRUPTED); + xfs_verifier_error(bp); return; } -- 1.9.0 From roger@filmlight.ltd.uk Tue Mar 4 07:04:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3A5CB7F4E for ; Tue, 4 Mar 2014 07:04:24 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1EEEF304043 for ; Tue, 4 Mar 2014 05:04:20 -0800 (PST) X-ASG-Debug-ID: 1393938258-04cbb054b636dd0001-NocioJ Received: from a.mx.filmlight.ltd.uk (a.mx.filmlight.ltd.uk [77.107.81.250]) by cuda.sgi.com with SMTP id DHbxrkEsnFVWp56b for ; Tue, 04 Mar 2014 05:04:19 -0800 (PST) X-Barracuda-Envelope-From: roger@filmlight.ltd.uk X-Barracuda-Apparent-Source-IP: 77.107.81.250 Received: (dqd 24905 invoked from network); 4 Mar 2014 13:04:18 -0000 Received: from montana.filmlight.ltd.uk (HELO ?10.44.0.132?) (roger@10.44.0.132) by a.mx.filmlight.ltd.uk with SMTP; 4 Mar 2014 13:04:18 -0000 Subject: Re: [PATCH] xfsprogs: fix use after free in inode_item_done() From: Roger Willcocks X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: fix use after free in inode_item_done() To: Eric Sandeen Cc: Dave Chinner , xfs-oss In-Reply-To: <531506BD.80209@redhat.com> References: <5314E912.9080708@redhat.com> <20140303223617.GL13647@dastard> <531506BD.80209@redhat.com> Content-Type: text/plain Date: Tue, 04 Mar 2014 13:04:17 +0000 Message-Id: <1393938257.8455.6.camel@montana.filmlight.ltd.uk> Mime-Version: 1.0 X-Mailer: Evolution 2.12.3 (2.12.3-19.el5) Content-Transfer-Encoding: 7bit X-Barracuda-Connect: a.mx.filmlight.ltd.uk[77.107.81.250] X-Barracuda-Start-Time: 1393938259 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145736 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 On Mon, 2014-03-03 at 16:48 -0600, Eric Sandeen wrote: > On 3/3/14, 4:36 PM, Dave Chinner wrote: ... > > which leaves the rest of the ili_done: code looking a little > > strange. > > > > can you convert that now to be: > > > > ili_done: > > if (iip->ili_lock_flags) { > > iip->ili_lock_flags = 0; > > return; > > } > > /* free the inode */ > > libxfs_iput(ip, 0); > > } > > yeah, I actually had that first. Not sure why I didn't go with it ;) > > (Still looks strange to my untrained eye; "if lock flags are set, unset them and don't free the inode, otherwise free it") > I'd be tempted to write: ili_done: if (iip->ili_lock_flags == 0) /* don't return locked inode */ libxfs_iput(ip, 0); iip->ili_lock_flags = 0; -- Roger Willcocks From bfoster@redhat.com Tue Mar 4 08:01:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 6C43B7F4E for ; Tue, 4 Mar 2014 08:01:55 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 23EB38F8071 for ; Tue, 4 Mar 2014 06:01:51 -0800 (PST) X-ASG-Debug-ID: 1393941710-04bdf05dac24c800001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HfBURaPmKCMwJ491 for ; Tue, 04 Mar 2014 06:01:51 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s24E1kje010679 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 4 Mar 2014 09:01:47 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s24E1jRq019486; Tue, 4 Mar 2014 09:01:45 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5965D12452B; Tue, 4 Mar 2014 09:01:44 -0500 (EST) Date: Tue, 4 Mar 2014 09:01:44 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace Message-ID: <20140304140143.GA51235@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace References: <1393825194-1719-1-git-send-email-david@fromorbit.com> <1393825194-1719-2-git-send-email-david@fromorbit.com> <20140303174425.GB28196@laptop.bfoster> <20140303222946.GJ13647@dastard> <20140304012056.GA29755@laptop.bfoster> <20140304043225.GQ13647@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140304043225.GQ13647@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1393941710 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Mar 04, 2014 at 03:32:25PM +1100, Dave Chinner wrote: > On Mon, Mar 03, 2014 at 08:20:57PM -0500, Brian Foster wrote: > > On Tue, Mar 04, 2014 at 09:29:46AM +1100, Dave Chinner wrote: > > > On Mon, Mar 03, 2014 at 12:44:26PM -0500, Brian Foster wrote: > > > > On Mon, Mar 03, 2014 at 04:39:53PM +1100, Dave Chinner wrote: > > > > > From: Dave Chinner > > > > > > > > > > While the verifier reoutines may return EFSBADCRC when a buffer ahs > > > > > a bad CRC, we need to translate that to EFSCORRUPTED so that the > > > > > higher layers treat the error appropriately and so we return a > > > > > consistent error to userspace. This fixes a xfs/005 regression. > > > > > > > > > > Signed-off-by: Dave Chinner > > > > > --- > > > > > > > > This change looks Ok to me, but when I start looking through the users > > > > of bp->b_error, I see examples like xfs_dir3_data_read() being called in > > > > xfs_dir2_leaf_addname() where it looks like an error could bubble all > > > > the way up to xfs_vn_mknod() and its callers. > > > > > > Sure, but: > > > > > > xfs_dir3_data_read > > > xfs_da_read_buf > > > xfs_trans_read_buf_map > > > > > > Which means the patch prevents the EFSBADCRC leaking back out > > > through that path because it converts it in xfs_trans_read_buf_map. > > > > > > > Ok, I see. FWIW, I was also trolling through some of the log recovery > > code and it appears that code uses b_ops for write verification purposes > > only (i.e., crc generation I suspect), correct? > > Yes. > > > > > If the intent is to use EFSBADCRC as an internal-only error to > > > > differentiate corruption from crc failure, why not push this more > > > > closely to the boundaries that we have already defined? For example, we > > > > already convert positive errnos to negative at the internal/external > > > > boundaries. Could we convert those to use some kind of > > > > XFS_USERSPACE_ERROR(error) macro/helper that converts errors > > > > appropriately? > > > > > > That doesn't solve the problem needing an error conversion layer in > > > the first place. The long term goal is to remove the error > > > conversions in XFS by converting the core code to the same error > > > passing conventions as the rest of the kernel code. We manage to > > > screw the negation up fairly regularly because it is convoluted and > > > we cal into generic code that returns negative errors from the core > > > that returns positive errors in lots of places. The conversion > > > surface is just too large to manage sanely. > > > > > > > Well it wasn't clear that the error conversion layer was a problem that > > itself needed solving, but fair enough. ;) If the objective is to move > > away from the positive/negative business to something more "kernel > > native," then building more infrastructure around that is probably not > > the way to go, unless that was actually part of the changeover strategy > > (e.g., if we happened to use something that conditionally negated error > > values to support incremental codepath conversions... as a semi-random > > thought). > > I'm not sure there's any real benefit to adding infrastructure when > doing the conversion. It's a lot of little changes involving pushing > the conversion down from the top layers, combined with converting > interfaces (e.g. bmapi) as they get exposed. > > Some functions will be able to lose variables as the return becomes > a tri-state value (e.g. the btree functions for looking up records); > others will be able to use IS_ERR() for pointer returns, and so on. > This will have a flow on effect on the code in the callers, and so > it really comes down to spending the time to peel back each layer > carefully. > > It's a lot of work, hence the "long term goal" aspect of it. We've > been talking about doing this cleanup for several years now, but it > hasn't yet been done because it's going to take hundreds of patches > to do... ;) > Indeed. I just wasn't aware of that, so I was thinking aloud a bit (along the same lines of pushing the conversion from top-to-bottom). In any event, it's good to have this in mind going forward. > > > > Another thought could be to reconsider whether we still need some of > > > > these extra warnings, as in the xfs_mount.c hunk below, now that we have > > > > the generic xfs_verifier_error() messaging. E.g., if we could remove > > > > those, perhaps we could snub out EFSBADCRC in or around the verifier > > > > after it makes a distinction. > > > > > > Redundant errors aren't s significant problem. It's the lack of > > > meaningful error messages that are much more of an issue. We get > > > more meaningful error messages as a result of the EFSBADCRC changes > > > that have been made, but for the moment that error simply means > > > EFSCORRUPTED to the higher layers. Hence the translation back to > > > EFSCORRUPTED at the (low) layers where the error no longer has > > > a distinct meaning. > > > > > > > Right, the purpose is not to solve the problem of redundant errors. > > Rather, if the only thing preventing the consolidation of the EFSBADCRC > > trap to a single hunk are redundant errors, then it wouldn't be a > > problem to remove those errors and push the EFSBADCRC trap into the > > generic code for the purpose of clarity. > > I don't see much point in trying to have a single trap for EFSBADCRC > because the moment we want to handle one of those cases specially we > are going to have to - as a first step - remove the single trap and > push it outwards to all the places that need it like this patch > does.... > Agreed. I'm less concerned about it with the understanding that EFSBADCRC is not to be forever isolated to the world of verifiers. I just wanted to make sure my point was clear. ;) Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Tue Mar 4 09:05:19 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7F7DA7F4E for ; Tue, 4 Mar 2014 09:05:19 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 56B78304048 for ; Tue, 4 Mar 2014 07:05:16 -0800 (PST) X-ASG-Debug-ID: 1393945515-04cbb054b946160001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id B47uXcKoaJMCKyCY for ; Tue, 04 Mar 2014 07:05:15 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s24F5EZK017144 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 4 Mar 2014 10:05:14 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s24F5DHs012905; Tue, 4 Mar 2014 10:05:13 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3EE6512452B; Tue, 4 Mar 2014 10:05:11 -0500 (EST) Date: Tue, 4 Mar 2014 10:05:11 -0500 From: Brian Foster To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH V2] xfstests: fix error msg in aio-dio-subblock-eof-read.c Message-ID: <20140304150511.GB51235@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH V2] xfstests: fix error msg in aio-dio-subblock-eof-read.c References: <53156389.4060405@redhat.com> <5315681C.5070704@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5315681C.5070704@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1393945515 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Mar 03, 2014 at 11:43:56PM -0600, Eric Sandeen wrote: > io_getevents returns the number of events; printing its > return as "bytes read" is ... wrong. > > Signed-off-by: Eric Sandeen > --- > > V2: print as signed so we can easily see errors returned > Reviewed-by: Brian Foster > diff --git a/src/aio-dio-regress/aio-dio-subblock-eof-read.c b/src/aio-dio-regress/aio-dio-subblock-eof-read.c > index a48841d..8f74cec 100644 > --- a/src/aio-dio-regress/aio-dio-subblock-eof-read.c > +++ b/src/aio-dio-regress/aio-dio-subblock-eof-read.c > @@ -105,8 +107,8 @@ main(int argc, char **argv) > * 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); > + fail("AIO read of last block in file returned %ld bytes, " > + "expected %d\n", ie.res, FILE_SIZE); > > printf("AIO read of last block in file succeeded.\n"); > return 0; > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Mar 4 09:37:03 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 9C2217F4E for ; Tue, 4 Mar 2014 09:37:03 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1ABE1AC004 for ; Tue, 4 Mar 2014 07:37:02 -0800 (PST) X-ASG-Debug-ID: 1393947418-04cb6c567823a250001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id eRpZzG8Er6I8ABBI for ; Tue, 04 Mar 2014 07:36:58 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s24Favhc026798 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 4 Mar 2014 10:36:58 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s24FavVp027378; Tue, 4 Mar 2014 10:36:57 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 07F9A12452B; Tue, 4 Mar 2014 10:36:55 -0500 (EST) Date: Tue, 4 Mar 2014 10:36:55 -0500 From: Brian Foster To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfstests: memset proper length in resvtest.c Message-ID: <20140304153655.GC51235@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfstests: memset proper length in resvtest.c References: <531563D8.2070007@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <531563D8.2070007@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1393947418 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Mar 03, 2014 at 11:25:44PM -0600, Eric Sandeen wrote: > sizeof(pointer) is not very relevant; sizeof(*pointer) > is a bit more so. > > Signed-off-by: Eric Sandeen > --- > > diff --git a/src/resvtest.c b/src/resvtest.c > index 037d9ea..a07f503 100644 > --- a/src/resvtest.c > +++ b/src/resvtest.c > @@ -73,7 +73,7 @@ main(int argc, char **argv) > perror("open"); > exit(1); > } > - memset(writebuffer, 'A', sizeof(writebuffer)); > + memset(writebuffer, 'A', sizeof(*writebuffer)); > It's not clear to me how much this is intending to write/read. If the entire buffer, we should probably use the buffer size. sizeof(*writebuffer) is a single byte, no? Also, there are other instances of the same thing throughout this file. I think they need to be consistent, in any event, for the test to work. Brian > unlink(filename); > writefd = open(filename, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Tue Mar 4 10:49:35 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7803B7F4E for ; Tue, 4 Mar 2014 10:49:35 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 15D64AC004 for ; Tue, 4 Mar 2014 08:49:31 -0800 (PST) X-ASG-Debug-ID: 1393951769-04cb6c5676240c30001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id G3chhXMMYWJSU4y3 for ; Tue, 04 Mar 2014 08:49:29 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id BDD1063BDFCA; Tue, 4 Mar 2014 10:49:29 -0600 (CST) Message-ID: <53160419.50104@sandeen.net> Date: Tue, 04 Mar 2014 10:49:29 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Brian Foster , Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfstests: memset proper length in resvtest.c References: <531563D8.2070007@redhat.com> <20140304153655.GC51235@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfstests: memset proper length in resvtest.c In-Reply-To: <20140304153655.GC51235@bfoster.bfoster> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1393951769 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145741 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/4/14, 9:36 AM, Brian Foster wrote: > On Mon, Mar 03, 2014 at 11:25:44PM -0600, Eric Sandeen wrote: >> sizeof(pointer) is not very relevant; sizeof(*pointer) >> is a bit more so. >> >> Signed-off-by: Eric Sandeen >> --- >> >> diff --git a/src/resvtest.c b/src/resvtest.c >> index 037d9ea..a07f503 100644 >> --- a/src/resvtest.c >> +++ b/src/resvtest.c >> @@ -73,7 +73,7 @@ main(int argc, char **argv) >> perror("open"); >> exit(1); >> } >> - memset(writebuffer, 'A', sizeof(writebuffer)); >> + memset(writebuffer, 'A', sizeof(*writebuffer)); >> > > It's not clear to me how much this is intending to write/read. If the > entire buffer, we should probably use the buffer size. > sizeof(*writebuffer) is a single byte, no? > > Also, there are other instances of the same thing throughout this file. > I think they need to be consistent, in any event, for the test to work. yeah, sorry, I was in a bit too much of a rush; just disregard this for now I guess. too-quick reaction to a gcc compile warning. -Eric From BATV+3fa895667d296d67fb80+3845+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 4 11:21:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 399697F4E for ; Tue, 4 Mar 2014 11:21:08 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1CB628F8070 for ; Tue, 4 Mar 2014 09:21:05 -0800 (PST) X-ASG-Debug-ID: 1393953663-04cbb054b6546f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id rNFBjU0MHuG2lHZm (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Mar 2014 09:21:03 -0800 (PST) X-Barracuda-Envelope-From: BATV+3fa895667d296d67fb80+3845+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WKt1b-0007Zm-2m; Tue, 04 Mar 2014 17:21:03 +0000 Date: Tue, 4 Mar 2014 09:21:03 -0800 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: Zhi Yong Wu Subject: [PATCH 0/2] RFC: O_TMPFILE tests Message-ID: <20140304172103.GA24528@infradead.org> X-ASG-Orig-Subj: [PATCH 0/2] RFC: O_TMPFILE tests MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1393953663 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.10 X-Barracuda-Spam-Status: No, SCORE=2.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MJ1576, BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145742 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 1.50 BSF_SC0_MJ1576 Custom Rule MJ1576 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 This series adds a generic and one xfs-specific test for the O_TMPFILE functionality. For now it's purely RFC as there is no infrastructure to test the filesystem and xfs_io supports O_TMPFILE yet, as I plan to implement that ontop of Lukas' refactoring of the related feature checks. Even with these tests not going in ASAP having them out and waiting to be merged is enough that I'd be fine with merging the tmpfile branch into for-next so that it can go into the 3.15 merge window. From BATV+3fa895667d296d67fb80+3845+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 4 11:21:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6B4117F4E for ; Tue, 4 Mar 2014 11:21:30 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3FCEF304039 for ; Tue, 4 Mar 2014 09:21:27 -0800 (PST) X-ASG-Debug-ID: 1393953685-04bdf05daa266090001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id ps1YhFSaj1CZq4F3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Mar 2014 09:21:25 -0800 (PST) X-Barracuda-Envelope-From: BATV+3fa895667d296d67fb80+3845+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WKt1x-0007aJ-3B; Tue, 04 Mar 2014 17:21:25 +0000 Date: Tue, 4 Mar 2014 09:21:25 -0800 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: Zhi Yong Wu Subject: [PATCH 1/2] generic: add a basic O_TMPFILE test Message-ID: <20140304172125.GB24528@infradead.org> X-ASG-Orig-Subj: [PATCH 1/2] generic: add a basic O_TMPFILE test References: <20140304172103.GA24528@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140304172103.GA24528@infradead.org> Signed-off-by: Christoph Hellwig User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1393953685 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145742 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 diff --git a/tests/generic/004 b/tests/generic/004 new file mode 100755 index 0000000..2848d36 --- /dev/null +++ b/tests/generic/004 @@ -0,0 +1,70 @@ +#! /bin/bash +# FS QA Test No. 004 +# +# Test O_TMPFILE opens +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 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 +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f ${testfile} +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +#_require_xfs_io_falloc_flink + +testfile="${TEST_DIR}/tst-tmpfile-flink" + +# test creating a r/w tmpfile, do I/O and link it into the namespace +$XFS_IO_PROG -T \ + -c "pwrite 0 4096" \ + -c "pread 0 4096" \ + -c "flink ${testfile}" \ + ${TEST_DIR} | _filter_xfs_io + +if [ ! -f "${testfile}" ]; then + echo "failed to link testfile into place" + exit 1 +fi + +rm -f ${tmpfile} + +# test creating a r/o tmpfile. Should fail +$XFS_IO_PROG -Tr ${TEST_DIR} -c "close" | _filter_test_dir + +# success, all done +status=0 +exit diff --git a/tests/generic/004.out b/tests/generic/004.out new file mode 100644 index 0000000..b85c11c --- /dev/null +++ b/tests/generic/004.out @@ -0,0 +1,6 @@ +QA output created by 004 +wrote 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +/mnt/test: Invalid argument diff --git a/tests/generic/group b/tests/generic/group index 34bd118..cf2e5ee 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -6,6 +6,7 @@ 001 rw dir udf auto quick 002 metadata udf auto quick 003 atime auto quick +004 auto quick 005 dir udf auto quick 006 dir udf auto quick 007 dir udf auto quick From BATV+3fa895667d296d67fb80+3845+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 4 11:21:50 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 929A67F4E for ; Tue, 4 Mar 2014 11:21:50 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 83B3B8F8070 for ; Tue, 4 Mar 2014 09:21:50 -0800 (PST) X-ASG-Debug-ID: 1393953708-04cb6c5675243ce0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id f04dVEe0myHIdSQ0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Mar 2014 09:21:48 -0800 (PST) X-Barracuda-Envelope-From: BATV+3fa895667d296d67fb80+3845+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WKt2K-0007ai-Aw; Tue, 04 Mar 2014 17:21:48 +0000 Date: Tue, 4 Mar 2014 09:21:48 -0800 From: Christoph Hellwig To: xfs@oss.sgi.com Cc: Zhi Yong Wu Subject: [PATCH 2/2] xfs: add a test for unlinked inodes due to O_TMPFILE Message-ID: <20140304172148.GC24528@infradead.org> X-ASG-Orig-Subj: [PATCH 2/2] xfs: add a test for unlinked inodes due to O_TMPFILE References: <20140304172103.GA24528@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140304172103.GA24528@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1393953708 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.145742 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 Make sure that we see unlinked inodes when shutting a filesystem down that has an open O_TMPFILE descriptor, and make sure that it has been deleted after a mount/umount cycle. Signed-off-by: Christoph Hellwig diff --git a/tests/xfs/006 b/tests/xfs/006 new file mode 100755 index 0000000..6be8418 --- /dev/null +++ b/tests/xfs/006 @@ -0,0 +1,86 @@ +#! /bin/bash +# XFS QA Test No. 006 +# +# Test O_TMPFILE interaction with log recovery and repair. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 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 +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* + rm -f ${testfile} +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/repair + +# real QA test starts here +_supported_fs generic +_supported_os Linux + +_require_scratch +#_require_xfs_io_falloc_flink + +testfile="${SCRATCH_MNT}/tst-tmpfile-flink" + +_scratch_mount + +# test creating a r/w tmpfile, do I/O and link it into the namespace +$XFS_IO_PROG -x -T \ + -c "pwrite 0 4096" \ + -c "pread 0 4096" \ + -c "freeze" \ + -c "thaw" \ + -c "shutdown" \ + ${SCRATCH_MNT} | _filter_xfs_io + +_scratch_unmount + +# repair should find an unlinked inode and an incorrect icount +_scratch_xfs_repair -n 2>&1 | \ + _filter_repair > $tmp.repair + +ino=`grep 'disconnected inode ' $tmp.repair | \ + head -1 | \ + awk '{print $3}' | \ + sed 's/,//'` + +cat $tmp.repair | sed "s/$ino/XXX/g" + +# filesystem should be clean after an unmount/mount cycle +_scratch_mount +_scratch_unmount + +_scratch_xfs_repair -n 2>&1 | _filter_repair + +# success, all done +status=0 +exit diff --git a/tests/xfs/006.out b/tests/xfs/006.out new file mode 100644 index 0000000..46f3b73 --- /dev/null +++ b/tests/xfs/006.out @@ -0,0 +1,43 @@ +QA output created by 006 +wrote 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +Phase 1 - find and verify superblock... +Phase 2 - using 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... + - process newly discovered inodes... +Phase 4 - check for duplicate blocks... + - setting up duplicate extent list... + - check for inodes claiming duplicate blocks... +No modify flag set, skipping phase 5 +Phase 6 - check inode connectivity... + - traversing filesystem ... + - traversal finished ... + - moving disconnected inodes to lost+found ... +disconnected inode XXX, would move to lost+found +Phase 7 - verify link counts... +would have reset inode XXX nlinks from 0 to 1 +No modify flag set, skipping filesystem flush and exiting. +Phase 1 - find and verify superblock... +Phase 2 - using 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... + - process newly discovered inodes... +Phase 4 - check for duplicate blocks... + - setting up duplicate extent list... + - check for inodes claiming duplicate blocks... +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. diff --git a/tests/xfs/group b/tests/xfs/group index ba34650..2f896e1 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -3,6 +3,7 @@ 003 db auto quick 004 db auto quick 005 auto quick +006 auto quick 008 rw ioctl auto quick 009 rw ioctl auto prealloc quick 012 rw auto quick From jack@suse.cz Tue Mar 4 14:37:24 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2A9987F4E for ; Tue, 4 Mar 2014 14:37:24 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6CD3AC001 for ; Tue, 4 Mar 2014 12:37:23 -0800 (PST) X-ASG-Debug-ID: 1393965441-04cb6c5678254080001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id UpZFmC0NMMeVHYPw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Mar 2014 12:37:22 -0800 (PST) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id CE201ACC8 for ; Tue, 4 Mar 2014 20:37:20 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 1243881ED0; Tue, 4 Mar 2014 21:37:20 +0100 (CET) From: Jan Kara To: xfs@oss.sgi.com Cc: Jan Kara Subject: [PATCH xfstests] generic/300: Add missing requirements for fallocate & punch hole Date: Tue, 4 Mar 2014 21:37:17 +0100 X-ASG-Orig-Subj: [PATCH xfstests] generic/300: Add missing requirements for fallocate & punch hole Message-Id: <1393965437-28787-1-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1393965441 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3593 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Test 300 requires support for fallocate and punch hole from the filesystem. Add proper require checks. Signed-off-by: Jan Kara --- tests/generic/300 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/generic/300 b/tests/generic/300 index 7c6072815b40..8b80c14c6f4e 100755 --- a/tests/generic/300 +++ b/tests/generic/300 @@ -43,6 +43,8 @@ _supported_fs generic _supported_os Linux _need_to_be_root _require_scratch +_require_xfs_io_falloc +_require_xfs_io_falloc_punch NUM_JOBS=$((4*LOAD_FACTOR)) BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` -- 1.8.1.4 From david@fromorbit.com Tue Mar 4 14:39:46 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EA6E87F4E for ; Tue, 4 Mar 2014 14:39:45 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5CFF0AC001 for ; Tue, 4 Mar 2014 12:39:45 -0800 (PST) X-ASG-Debug-ID: 1393965582-04cbb054b864ea0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id o6oUNHGYBMLjzlQc for ; Tue, 04 Mar 2014 12:39:42 -0800 (PST) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgYHALg5FlN5LJYe/2dsb2JhbABagwa8PIVXgR8XdIIlAQEBAwE6HCMFCwgDDgoJJQ8FJQMhE4YdgVQHzU4XFo47B4Q4BI5HiXSKVYdXg0EogSw Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Mar 2014 07:09:41 +1030 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1WKw7b-0008CR-Po; Wed, 05 Mar 2014 07:39:27 +1100 Date: Wed, 5 Mar 2014 07:39:27 +1100 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com, Zhi Yong Wu Subject: Re: [PATCH 2/2] xfs: add a test for unlinked inodes due to O_TMPFILE Message-ID: <20140304203927.GG6851@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: add a test for unlinked inodes due to O_TMPFILE References: <20140304172103.GA24528@infradead.org> <20140304172148.GC24528@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140304172148.GC24528@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1393965582 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3594 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Mar 04, 2014 at 09:21:48AM -0800, Christoph Hellwig wrote: > Make sure that we see unlinked inodes when shutting a filesystem > down that has an open O_TMPFILE descriptor, and make sure that it > has been deleted after a mount/umount cycle. > > Signed-off-by: Christoph Hellwig > > diff --git a/tests/xfs/006 b/tests/xfs/006 > new file mode 100755 > index 0000000..6be8418 > --- /dev/null > +++ b/tests/xfs/006 > @@ -0,0 +1,86 @@ > +#! /bin/bash > +# XFS QA Test No. 006 > +# > +# Test O_TMPFILE interaction with log recovery and repair. > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2014 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 > +#----------------------------------------------------------------------- > +# > + > +seq=`basename $0` > +seqres=$RESULT_DIR/$seq > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -f $tmp.* > + rm -f ${testfile} > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > +. ./common/repair > + > +# real QA test starts here > +_supported_fs generic XFS only. > +_supported_os Linux > + > +_require_scratch > +#_require_xfs_io_falloc_flink > + > +testfile="${SCRATCH_MNT}/tst-tmpfile-flink" > + > +_scratch_mount > + > +# test creating a r/w tmpfile, do I/O and link it into the namespace > +$XFS_IO_PROG -x -T \ > + -c "pwrite 0 4096" \ > + -c "pread 0 4096" \ > + -c "freeze" \ > + -c "thaw" \ > + -c "shutdown" \ > + ${SCRATCH_MNT} | _filter_xfs_io $testfile? Also, I don't see the file being linked into the namespace, so the comment is probably wrong. Also, please add a comment as to why the freeze/thaw is necessary. > +# repair should find an unlinked inode and an incorrect icount > +_scratch_xfs_repair -n 2>&1 | \ > + _filter_repair > $tmp.repair > + > +ino=`grep 'disconnected inode ' $tmp.repair | \ > + head -1 | \ > + awk '{print $3}' | \ > + sed 's/,//'` > + > +cat $tmp.repair | sed "s/$ino/XXX/g" Ok, so we should see that line in the golden output... .... > diff --git a/tests/xfs/006.out b/tests/xfs/006.out > new file mode 100644 > index 0000000..46f3b73 > --- /dev/null > +++ b/tests/xfs/006.out > @@ -0,0 +1,43 @@ > +QA output created by 006 > +wrote 4096/4096 bytes at offset 0 > +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +read 4096/4096 bytes at offset 0 > +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) > +Phase 1 - find and verify superblock... > +Phase 2 - using 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... > + - process newly discovered inodes... > +Phase 4 - check for duplicate blocks... > + - setting up duplicate extent list... > + - check for inodes claiming duplicate blocks... > +No modify flag set, skipping phase 5 > +Phase 6 - check inode connectivity... > + - traversing filesystem ... > + - traversal finished ... > + - moving disconnected inodes to lost+found ... > +disconnected inode XXX, would move to lost+found There it is, but is moving it to lost+found the right thing to do, given that it was on the unlinked list and should have had a zero link count? i.e. aren't we supposed to free unlinked inodes with a zero link count, not recover them to lost+found? > +Phase 7 - verify link counts... > +would have reset inode XXX nlinks from 0 to 1 Yeah, that seems like the wrong behaviour to have for an anonymous O_TMPFILE file - it's making it visible because we moved it to lost+found in phase 6.... Also, I don't see any icount mismatch, so the comment above in the test is probably wrong. > diff --git a/tests/xfs/group b/tests/xfs/group > index ba34650..2f896e1 100644 > --- a/tests/xfs/group > +++ b/tests/xfs/group > @@ -3,6 +3,7 @@ > 003 db auto quick > 004 db auto quick > 005 auto quick > +006 auto quick and repair. Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+3fa895667d296d67fb80+3845+infradead.org+hch@bombadil.srs.infradead.org Tue Mar 4 15:04:30 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id F145F7F4E for ; Tue, 4 Mar 2014 15:04:29 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8C13FAC001 for ; Tue, 4 Mar 2014 13:04:25 -0800 (PST) X-ASG-Debug-ID: 1393967059-04cbb054b866ac0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 9KbK3Kq1RQnnXk8f (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Mar 2014 13:04:20 -0800 (PST) X-Barracuda-Envelope-From: BATV+3fa895667d296d67fb80+3845+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 198.137.202.9 Received: from hch by bombadil.infradead.org with local (Exim 4.80.1 #2 (Red Hat Linux)) id 1WKwVd-00030f-V2; Tue, 04 Mar 2014 21:04:17 +0000 Date: Tue, 4 Mar 2014 13:04:17 -0800 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , Zhi Yong Wu , xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: add a test for unlinked inodes due to O_TMPFILE Message-ID: <20140304210417.GA10628@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: add a test for unlinked inodes due to O_TMPFILE References: <20140304172103.GA24528@infradead.org> <20140304172148.GC24528@infradead.org> <20140304203927.GG6851@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140304203927.GG6851@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1393967060 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3595 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Mar 05, 2014 at 07:39:27AM +1100, Dave Chinner wrote: > > +_supported_fs generic > > XFS only. Hmm. I remember fixing this up, but for some reason it didn't make it into the final patch. > > +# test creating a r/w tmpfile, do I/O and link it into the namespace > > +$XFS_IO_PROG -x -T \ > > + -c "pwrite 0 4096" \ > > + -c "pread 0 4096" \ > > + -c "freeze" \ > > + -c "thaw" \ > > + -c "shutdown" \ > > + ${SCRATCH_MNT} | _filter_xfs_io > > $testfile? No, O_TMPFILE doesn't take an actual file name but a "virtual" parent directory. It's a reall creative abuse of the open ABI.. > Also, I don't see the file being linked into the namespace, so the > comment is probably wrong. Also, please add a comment as to > why the freeze/thaw is necessary. Yes, we don't want to link it so that we have it on the unlinke dinode list. The freeze/thaw is to make sure the log has been cleaned, I'll add a comment explaining it. > There it is, but is moving it to lost+found the right thing to do, > given that it was on the unlinked list and should have had a zero > link count? i.e. aren't we supposed to free unlinked inodes with a > zero link count, not recover them to lost+found? > Yeah, that seems like the wrong behaviour to have for an anonymous > O_TMPFILE file - it's making it visible because we moved it to > lost+found in phase 6.... Good question. I thought about this a little and decided that it wasn't worth special casing O_TMPFILE inodes in repair, but thinking about it a bit more this also happens for normal unlinked but open files. I can look into this if you want, and would create another test for that case. > > Also, I don't see any icount mismatch, so the comment above in the > test is probably wrong. We do have an icount mismatch, but _filter_repair filters it away. From hoteldelaescalon@integra.com.sv Tue Mar 4 15:08:44 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=HTML_FONT_LOW_CONTRAST, HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 059697F4E for ; Tue, 4 Mar 2014 15:08:44 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B839F8F8089 for ; Tue, 4 Mar 2014 13:08:43 -0800 (PST) X-ASG-Debug-ID: 1393967319-04bdf05dac278e30001-NocioJ Received: from mail.integra.com.sv (mail.integra.com.sv [200.13.161.5]) by cuda.sgi.com with ESMTP id Wv6ZCpCRPcf4Y6nt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 04 Mar 2014 13:08:40 -0800 (PST) X-Barracuda-Envelope-From: hoteldelaescalon@integra.com.sv X-Barracuda-Apparent-Source-IP: 200.13.161.5 Received: from localhost (localhost.localdomain [127.0.0.1]) by mail.integra.com.sv (Postfix) with ESMTP id 2AC8559F1F2 for ; Tue, 4 Mar 2014 20:20:55 +0000 (UTC) X-Virus-Scanned: amavisd-new at integra.com.sv Received: from mail.integra.com.sv ([127.0.0.1]) by localhost (mail.integra.com.sv [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id aiIqC-3melKO for ; Tue, 4 Mar 2014 20:20:54 +0000 (UTC) Received: from xbzucf (168.subnet-72-18-98.ellijay.com [72.18.98.168]) by mail.integra.com.sv (Postfix) with ESMTPA id 55B9D5AA552 for ; Tue, 4 Mar 2014 20:20:51 +0000 (UTC) Message-ID: From: "Alvaro Liddell" To: "xfs" Subject: =?windows-1251?B?eGZzQG9zcy5zZ2kuY29tLCDn4Oru6+7y6PL8?= =?windows-1251?B?IO3gIOHo7eDw7fv1IO7v9uju7eD1ISEsIPr9?= =?windows-1251?B?/dDv7g==?= Date: Wed, 5 Mar 2014 03:24:23 +0600 X-ASG-Orig-Subj: =?windows-1251?B?eGZzQG9zcy5zZ2kuY29tLCDn4Oru6+7y6PL8?= =?windows-1251?B?IO3gIOHo7eDw7fv1IO7v9uju7eD1ISEsIPr9?= =?windows-1251?B?/dDv7g==?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_05E4_01CF3822.675D6050" X-Priority: 3 X-Barracuda-Connect: mail.integra.com.sv[200.13.161.5] X-Barracuda-Start-Time: 1393967320 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.25 X-Barracuda-Spam-Status: No, SCORE=1.25 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_INVIS_TEXT_1K, BSF_SC0_TG035a, BSF_SC0_TG163d, HTML_FONT_LOW_CONTRAST, HTML_MESSAGE, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3595 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.54 HTML_FONT_LOW_CONTRAST BODY: HTML font color similar to background 0.00 HTML_MESSAGE BODY: HTML included in message 0.20 PR0N_SUBJECT Subject has letters around special characters (pr0n) 0.00 BSF_SC0_TG035a Message contains invalid style definition 0.00 BSF_SC0_INVIS_TEXT_1K Custom Rule BSF_SC0_INVIS_TEXT_1K 0.50 BSF_SC0_TG163d Custom Rule TG163d This is a multi-part message in MIME format. ------=_NextPart_000_05E4_01CF3822.675D6050 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =ED=E0=F0=E0=E1=EE=F2=E0=F2=FC =ED=E0 =E1=E8=ED=E0=F0=ED=FB=F5 =EE=EF=F6=E8= =EE=ED=E0=F5 =D3=E7=ED=E0=F2=FC =EF=EE=E4=F0=EE=E1=ED=EE=F1=F2=E8... http://goo.gl/CkdZp4=20 - =C8 =ED=E5 =EF=EE=E4=F3=EC=E0=FE=85=20 - =C4=F3=EC=E0=E5=F8=FC, =FD=F2=EE =ED=E5 =E1=F0=E5=E4=EE=E2=FB=E5 =EC=FB= =F1=EB=E8? - =F3=F2=EE=F7=ED=E8=EB=E0 =FF, =E2=F1=E5 =E5=F9=E5 =EF=F0=EE=E4= =EE=EB=E6=E0=FF =F1=EE=EC=ED=E5=E2=E0=F2=FC=F1=FF.=20 =CF=E0=F0=E5=ED=FC =E2=FB=F0=E0=E7=E8=EB =EA=F0=E0=E9=ED=FE=FE =F1=F2=E5=EF= =E5=ED=FC =E7=E0=E4=F3=EC=F7=E8=E2=EE=F1=F2=E8, =E2=FB=E8=F1=EA=E8=E2=E0=FF= =E2 =E7=E0=EA=F0=EE=EC=E0=F5 =F1=E2=EE=E5=E9 =ED=E5=E4=E0=EB=E5=EA=EE=E9= =EF=E0=EC=FF=F2=E8 =F1=EE=EE=F2=E2=E5=F2=F1=F2=E2=F3=FE=F9=E8=E9 =F1=EA=E0= =E7=EE=F7=ED=EE=EC=F3 =F1=F2=E0=ED=E4=E0=F0=F2=F3 =EE=F2=E2=E5=F2, =ED=EE= =ED=E5 =ED=E0=F8=E5=EB =E8 =EF=EE=E4=ED=FF=EB =ED=E0 =EC=E5=ED=FF =EE=E7= =E0=E4=E0=F7=E5=ED=ED=FB=E9 =E2=E7=E3=EB=FF=E4:=20 - =CD=EE =EF=EE=F7=E5=EC=F3?! =DF =E7=ED=E0=FE, =F7=F2=EE =FD=F2=EE =F2=E0= =EA=EE=E5=85=20 =CE=E4=ED=E0=EA=EE =EF=EE=EA=F0=E0=F1=ED=E5=E2=F8=E8=E5 =E3=EB=E0=E7=E0 =E7= =E0=F1=F2=E0=E2=E8=EB=E8 =EC=E5=ED=FF =F3=F1=EE=EC=ED=E8=F2=FC=F1=FF =E2 = =E5=E3=EE =F7=E5=F1=F2=ED=EE=F1=F2=E8.=20 - =C4=E5=E9=F1=F2=E2=E8=F2=E5=EB=FC=ED=EE, =ED=E8=F7=E5=E3=EE =ED=E5 =F7=F3= =E2=F1=F2=E2=F3=FE, - =EF=EE=E6=E0=EB =EE=ED =EF=EB=E5=F7=E0=EC=E8. - =CC= =EE=E6=E5=F2, =EE=ED=E8 =ED=E0=EF=F3=F2=E0=EB=E8 =F7=E5=E3=EE? =C2 =F2=E0= =EA=EE=E9 =ED=E5=F0=E0=E7=E1=E5=F0=E8=F5=E5, =EA=E0=EA=E0=FF =F1=E5=E9=F7= =E0=F1 =E2 =F1=F2=EE=EB=E8=F6=E5 =F2=E2=EE=F0=E8=F2=F1=FF, =FD=F2=EE =F1=EE= =E2=F1=E5=EC =ED=E5=F3=E4=E8=E2=E8=F2=E5=EB=FC=ED=EE.=20 - =C8 =E4=EE =EA=E0=EA=E8=F5 =EF=EE=F0 =F2=FB =E1=F3=E4=E5=F8=FC =EC=E5=ED= =FF =F2=F3=F2 =F2=E5=F0=EF=E5=F2=FC? - =CC=EE=FF =F1=F3=E4=FC=E1=E0 =E5=F9= =E5 =EF=F0=EE=E4=EE=EB=E6=E0=EB=E0 =EC=E5=ED=FF =E2=EE=EB=ED=EE=E2=E0=F2=FC= , =F5=EE=F2=FF =EF=EE=E4=E3=E0=E4=E8=EB=E0 =EE=ED=E0 =EC=ED=E5 =E8=E7=F0=FF= =E4=ED=EE.=20 =D1=EA=E0=E7=E0=F2=FC, =F7=F2=EE =FF =E8=F1=EF=F3=E3=E0=EB=E0=F1=FC, - =FD= =F2=EE =ED=E8=F7=E5=E3=EE =ED=E5 =F1=EA=E0=E7=E0=F2=FC. =C2=ED=F3=F2=F0=E8= =EF=EE=F5=EE=EB=EE=E4=E5=EB=EE =F2=E0=EA, =F7=F2=EE =E2=EF=EE=F0=F3 =EC=FF= =F1=EE =E7=E0=EC=EE=F0=E0=E6=E8=E2=E0=F2=FC. =C2=F1=E5 =EC=FB=F8=F6=FB =F1= =EA=EE=E2=E0=EB=EE =F1=F2=F0=E0=ED=ED=EE=E9 =F1=F3=E4=EE=F0=EE=E3=EE=E9, = =E0 =ED=E0 =EB=E1=F3 =E2=FB=F1=F2=F3=EF=E8=EB=E8 =EF=F0=E5=E4=E0=F2=E5=EB= =FC=F1=EA=E8=E5 =EA=E0=EF=E5=EB=FC=EA=E8 =EF=EE=F2=E0. =D3 =EC=E5=ED=FF =E2= =EE=E7=ED=E8=EA=EB=EE =EE=F9=F3=F9=E5=ED=E8=E5, =EA=E0=EA =F3 =EB=E8=F1=FB= , =EF=F0=EE=EA=F0=E0=E2=F8=E5=E9=F1=FF =E2 =EA=F3=F0=FF=F2=ED=E8=EA =E2 =F2= =EE=F2 =EC=EE=EC=E5=ED=F2, =EA=EE=E3=E4=E0 =F2=F3=E4=E0 =E7=E0=F5=EE=E4=E8= =F2 =EE=F5=EE=F2=ED=E8=EA =F1 =F0=F3=E6=FC=E5=EC. =D7=F3=E2=F1=F2=E2=EE =EE= =F2=E2=F0=E0=F2=E8=F2=E5=EB=FC=ED=EE=E5 - =E5=F9=E5 =ED=E8=F7=E5=E3=EE =ED= =E5 =F3=EA=F0=E0=EB=E0, =ED=EE =ED=E5=EF=F0=E8=FF=F2=ED=EE=F1=F2=FC=FE =F3= =E6=E5 =E7=E0 =E2=E5=F0=F1=F2=F3 =F0=E0=E7=E8=F2. =C0 =E7=ED=E0=FF =F1=E5= =E1=FF, =FF =EC=EE=E3=EB=E0 =F1 =F2=E2=E5=F0=E4=EE=E9 =F3=E2=E5=F0=E5=ED=ED= =EE=F1=F2=FC=FE =F1=EA=E0=E7=E0=F2=FC, =F7=F2=EE =EA=F2=EE =E1=FB =ED=E8 = =F1=F2=EE=FF=EB =F1=E5=E9=F7=E0=F1 =E7=E0 =EC=EE=E5=E9 =F1=EF=E8=ED=EE=E9= , =F5=EE=F2=FC =F1=E0=EC=E0=FF =ED=E5=E2=E8=ED=ED=E0=FF =EE=E2=E5=F7=EA=E0= =E2 =EC=E8=F0=E5, =E0 =ED=E5=EF=F0=E8=FF=F2=ED=EE=F1=F2=E5=E9 =EC=ED=E5 = =ED=E5 =E8=E7=E1=E5=E6=E0=F2=FC. =C8 =FF =E7=E0=F0=E0=ED=E5=E5 =E1=FB=EB=E0= =EF=F0=EE=F2=E8=E2!=20 =CA=E0=F8=E5=E9 =F2=E5=EC =E2=F0=E5=EC=E5=ED=E5=EC =EF=EE=E2=EE=E7=E8=EB=F1= =FF =E2=EE=E7=EB=E5 =EA=E0=EC=E8=ED=E0 =E8, =EF=EE=E2=E5=F0=ED=F3=E2=F8=E8= =F1=FC =EA=EE =EC=ED=E5, =EF=F0=EE=F2=FF=ED=F3=EB =EF=F3=E7=E0=F2=FB=E9 =E1= =EE=EA=E0=EB =F1 =EA=F0=E0=F1=ED=EE=E9 =E6=E8=E4=EA=EE=F1=F2=FC=FE.=20 - =C0 =EE=E4=E5=F2=FC=F1=FF =EC=ED=E5 =F1=ED=E0=F7=E0=EB=E0 =EC=EE=E6=ED=EE= =E8=EB=E8 =FD=F2=EE =ED=E5=EE=E1=FF=E7=E0=F2=E5=EB=FC=ED=E0=FF =F7=E0=F1= =F2=FC =EF=F0=EE=E3=F0=E0=EC=EC=FB? ------=_NextPart_000_05E4_01CF3822.675D6050 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=ED=E0=F0=E0=E1=EE=F2=E0=F2= =FC =ED=E0 =E1=E8=ED=E0=F0=ED=FB=F5 =EE=EF=F6=E8=EE=ED=E0=F5
=D3=E7=ED=E0=F2=FC =EF=EE=E4=F0=EE=E1=ED=EE= =F1=F2=E8...
 
 
- =C8 =ED=E5 =EF=EE=E4=F3= =EC=E0=FE=85=20
- =C4=F3=EC=E0=E5=F8=FC,= =FD=F2=EE =ED=E5 =E1=F0=E5=E4=EE=E2=FB=E5 =EC=FB=F1=EB=E8? - =F3=F2=EE=F7= =ED=E8=EB=E0 =FF, =E2=F1=E5 =E5=F9=E5 =EF=F0=EE=E4=EE=EB=E6=E0=FF =F1=EE=EC= =ED=E5=E2=E0=F2=FC=F1=FF.=20
=CF=E0=F0=E5=ED=FC =E2=FB= =F0=E0=E7=E8=EB =EA=F0=E0=E9=ED=FE=FE =F1=F2=E5=EF=E5=ED=FC =E7=E0=E4=F3=EC= =F7=E8=E2=EE=F1=F2=E8, =E2=FB=E8=F1=EA=E8=E2=E0=FF =E2 =E7=E0=EA=F0=EE=EC= =E0=F5 =F1=E2=EE=E5=E9 =ED=E5=E4=E0=EB=E5=EA=EE=E9 =EF=E0=EC=FF=F2=E8 =F1= =EE=EE=F2=E2=E5=F2=F1=F2=E2=F3=FE=F9=E8=E9 =F1=EA=E0=E7=EE=F7=ED=EE=EC=F3= =F1=F2=E0=ED=E4=E0=F0=F2=F3 =EE=F2=E2=E5=F2, =ED=EE =ED=E5 =ED=E0=F8=E5=EB= =E8 =EF=EE=E4=ED=FF=EB =ED=E0 =EC=E5=ED=FF =EE=E7=E0=E4=E0=F7=E5=ED=ED=FB= =E9 =E2=E7=E3=EB=FF=E4:=20
- =CD=EE =EF=EE=F7=E5=EC= =F3?! =DF =E7=ED=E0=FE, =F7=F2=EE =FD=F2=EE =F2=E0=EA=EE=E5=85=20
=CE=E4=ED=E0=EA=EE =EF=EE= =EA=F0=E0=F1=ED=E5=E2=F8=E8=E5 =E3=EB=E0=E7=E0 =E7=E0=F1=F2=E0=E2=E8=EB=E8= =EC=E5=ED=FF =F3=F1=EE=EC=ED=E8=F2=FC=F1=FF =E2 =E5=E3=EE =F7=E5=F1=F2=ED= =EE=F1=F2=E8.=20
- =C4=E5=E9=F1=F2=E2=E8=F2= =E5=EB=FC=ED=EE, =ED=E8=F7=E5=E3=EE =ED=E5 =F7=F3=E2=F1=F2=E2=F3=FE, - =EF= =EE=E6=E0=EB =EE=ED =EF=EB=E5=F7=E0=EC=E8. - =CC=EE=E6=E5=F2, =EE=ED=E8 =ED= =E0=EF=F3=F2=E0=EB=E8 =F7=E5=E3=EE? =C2 =F2=E0=EA=EE=E9 =ED=E5=F0=E0=E7=E1= =E5=F0=E8=F5=E5, =EA=E0=EA=E0=FF =F1=E5=E9=F7=E0=F1 =E2 =F1=F2=EE=EB=E8=F6= =E5 =F2=E2=EE=F0=E8=F2=F1=FF, =FD=F2=EE =F1=EE=E2=F1=E5=EC =ED=E5=F3=E4=E8= =E2=E8=F2=E5=EB=FC=ED=EE.=20
- =C8 =E4=EE =EA=E0=EA=E8= =F5 =EF=EE=F0 =F2=FB =E1=F3=E4=E5=F8=FC =EC=E5=ED=FF =F2=F3=F2 =F2=E5=F0=EF= =E5=F2=FC? - =CC=EE=FF =F1=F3=E4=FC=E1=E0 =E5=F9=E5 =EF=F0=EE=E4=EE=EB=E6= =E0=EB=E0 =EC=E5=ED=FF =E2=EE=EB=ED=EE=E2=E0=F2=FC, =F5=EE=F2=FF =EF=EE=E4= =E3=E0=E4=E8=EB=E0 =EE=ED=E0 =EC=ED=E5 =E8=E7=F0=FF=E4=ED=EE.=20
=D1=EA=E0=E7=E0=F2=FC, =F7= =F2=EE =FF =E8=F1=EF=F3=E3=E0=EB=E0=F1=FC, - =FD=F2=EE =ED=E8=F7=E5=E3=EE= =ED=E5 =F1=EA=E0=E7=E0=F2=FC. =C2=ED=F3=F2=F0=E8 =EF=EE=F5=EE=EB=EE=E4=E5= =EB=EE =F2=E0=EA, =F7=F2=EE =E2=EF=EE=F0=F3 =EC=FF=F1=EE =E7=E0=EC=EE=F0=E0= =E6=E8=E2=E0=F2=FC. =C2=F1=E5 =EC=FB=F8=F6=FB =F1=EA=EE=E2=E0=EB=EE =F1=F2= =F0=E0=ED=ED=EE=E9 =F1=F3=E4=EE=F0=EE=E3=EE=E9, =E0 =ED=E0 =EB=E1=F3 =E2=FB= =F1=F2=F3=EF=E8=EB=E8 =EF=F0=E5=E4=E0=F2=E5=EB=FC=F1=EA=E8=E5 =EA=E0=EF=E5= =EB=FC=EA=E8 =EF=EE=F2=E0. =D3 =EC=E5=ED=FF =E2=EE=E7=ED=E8=EA=EB=EE =EE=F9= =F3=F9=E5=ED=E8=E5, =EA=E0=EA =F3 =EB=E8=F1=FB, =EF=F0=EE=EA=F0=E0=E2=F8=E5= =E9=F1=FF =E2 =EA=F3=F0=FF=F2=ED=E8=EA =E2 =F2=EE=F2 =EC=EE=EC=E5=ED=F2, = =EA=EE=E3=E4=E0 =F2=F3=E4=E0 =E7=E0=F5=EE=E4=E8=F2 =EE=F5=EE=F2=ED=E8=EA = =F1 =F0=F3=E6=FC=E5=EC. =D7=F3=E2=F1=F2=E2=EE =EE=F2=E2=F0=E0=F2=E8=F2=E5= =EB=FC=ED=EE=E5 - =E5=F9=E5 =ED=E8=F7=E5=E3=EE =ED=E5 =F3=EA=F0=E0=EB=E0,= =ED=EE =ED=E5=EF=F0=E8=FF=F2=ED=EE=F1=F2=FC=FE =F3=E6=E5 =E7=E0 =E2=E5=F0= =F1=F2=F3 =F0=E0=E7=E8=F2. =C0 =E7=ED=E0=FF =F1=E5=E1=FF, =FF =EC=EE=E3=EB= =E0 =F1 =F2=E2=E5=F0=E4=EE=E9 =F3=E2=E5=F0=E5=ED=ED=EE=F1=F2=FC=FE =F1=EA= =E0=E7=E0=F2=FC, =F7=F2=EE =EA=F2=EE =E1=FB =ED=E8 =F1=F2=EE=FF=EB =F1=E5= =E9=F7=E0=F1 =E7=E0 =EC=EE=E5=E9 =F1=EF=E8=ED=EE=E9, =F5=EE=F2=FC =F1=E0=EC= =E0=FF =ED=E5=E2=E8=ED=ED=E0=FF =EE=E2=E5=F7=EA=E0 =E2 =EC=E8=F0=E5, =E0 = =ED=E5=EF=F0=E8=FF=F2=ED=EE=F1=F2=E5=E9 =EC=ED=E5 =ED=E5 =E8=E7=E1=E5=E6=E0= =F2=FC. =C8 =FF =E7=E0=F0=E0=ED=E5=E5 =E1=FB=EB=E0 =EF=F0=EE=F2=E8=E2!=20
=CA=E0=F8=E5=E9 =F2=E5=EC= =E2=F0=E5=EC=E5=ED=E5=EC =EF=EE=E2=EE=E7=E8=EB=F1=FF =E2=EE=E7=EB=E5 =EA= =E0=EC=E8=ED=E0 =E8, =EF=EE=E2=E5=F0=ED=F3=E2=F8=E8=F1=FC =EA=EE =EC=ED=E5= , =EF=F0=EE=F2=FF=ED=F3=EB =EF=F3=E7=E0=F2=FB=E9 =E1=EE=EA=E0=EB =F1 =EA=F0= =E0=F1=ED=EE=E9 =E6=E8=E4=EA=EE=F1=F2=FC=FE.=20
- =C0 =EE=E4=E5=F2=FC=F1= =FF =EC=ED=E5 =F1=ED=E0=F7=E0=EB=E0 =EC=EE=E6=ED=EE =E8=EB=E8 =FD=F2=EE =ED= =E5=EE=E1=FF=E7=E0=F2=E5=EB=FC=ED=E0=FF =F7=E0=F1=F2=FC =EF=F0=EE=E3=F0=E0= =EC=EC=FB?=20
- =CD=F3 =E8 =E7=F0=FF. =C1=F3=E4=F3 =F2=EE=E3=E4=E0 =E1=E5=E7 =F2= =E5=E1=FF =EF=EE=E4=E2=E8=E3=E8 =F1=EE=E2=E5=F0=F8=E0=F2=FC.
=
------=_NextPart_000_05E4_01CF3822.675D6050-- From oktyabrina.moya.77@motorpatrol.com Tue Mar 4 17:56:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 374D07F4E for ; Tue, 4 Mar 2014 17:56:01 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DA4A1AC001 for ; Tue, 4 Mar 2014 15:56:00 -0800 (PST) X-ASG-Debug-ID: 1393977357-04bdf05dac281680001-NocioJ Received: from hostforever.ru (hostforever.ru [195.211.103.205]) by cuda.sgi.com with ESMTP id ZwP3Bgp79BHhieng for ; Tue, 04 Mar 2014 15:55:58 -0800 (PST) X-Barracuda-Envelope-From: oktyabrina.moya.77@motorpatrol.com X-Barracuda-Apparent-Source-IP: 195.211.103.205 Received: from localhost (localhost [127.0.0.1]) by hostforever.ru (Postfix) with ESMTP id E4EA11D460D; Wed, 5 Mar 2014 03:56:01 +0400 (MSK) X-Virus-Scanned: Debian amavisd-new at mail.hostforever.ru Received: from hostforever.ru ([127.0.0.1]) by localhost (mail.ligrserv.net [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id pSLn2PfLDGBv; Wed, 5 Mar 2014 03:56:01 +0400 (MSK) Received: from 130.236.159.27.broad.xm.fj.dynamic.163data.com.cn (unknown [27.159.236.130]) (Authenticated sender: info@shahovskoe.ru) by hostforever.ru (Postfix) with ESMTPA id BDE701D4607; Wed, 5 Mar 2014 03:55:55 +0400 (MSK) Message-ID: Reply-To: =?windows-1251?B?w/Dg5uTg7fHq7uUg7/Dg4u4=?= From: =?windows-1251?B?w/Dg5uTg7fHq7uUg7/Dg4u4=?= To: , , , Subject: =?windows-1251?B?4uDw6ODt8vsg/fT05ery6OLt7uPuIOjx7+7r?= =?windows-1251?B?/Ofu4uDt6P8g5ODt7fv1IOLl+eXpLg==?= Date: Wed, 5 Mar 2014 00:56:02 +0100 X-ASG-Orig-Subj: =?windows-1251?B?4uDw6ODt8vsg/fT05ery6OLt7uPuIOjx7+7r?= =?windows-1251?B?/Ofu4uDt6P8g5ODt7fv1IOLl+eXpLg==?= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_10C0_01CF380D.AE6CA600" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 X-Barracuda-Connect: hostforever.ru[195.211.103.205] X-Barracuda-Start-Time: 1393977357 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.25 X-Barracuda-Spam-Status: No, SCORE=1.25 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, RCVD_NUMERIC_HELO, RCVD_NUMERIC_HELO_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3600 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 RCVD_NUMERIC_HELO Received: contains an IP address used for HELO 0.00 HTML_MESSAGE BODY: HTML included in message 1.25 RCVD_NUMERIC_HELO_2 Received: contains an IP address used for HELO This is a multi-part message in MIME format. ------=_NextPart_000_10C0_01CF380D.AE6CA600 Content-Type: multipart/alternative; boundary="----=_NextPart_001_10C1_01CF380D.AE6CA600" ------=_NextPart_001_10C1_01CF380D.AE6CA600 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =E2=E0=F1 =ED=E0 =EA=EE=ED=F1=F3=EB=FC=F2=E0= =F6=E8=EE=ED=ED=FB=E9 =F1=E5=EC=E8=ED=E0=F0 17-18 =EC=E0=F0=F2=E0, =D1=E0= =ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3:=20 "=CA=EE=F0=EF=EE=F0=E0=F2=E8=E2=ED=EE=E5 =EF=F0=E0=E2=EE. =C8=E7=EC=E5=ED= =E5=ED=E8=FF =C3=F0=E0=E6=E4=E0=ED=F1=EA=EE=E3=EE =EA=EE=E4=E5=EA=F1=E0 =D0= =D4 2014. =CE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =EE=F4=EE=F0=EC=EB=E5=ED=E8=FF= =EF=F0=E0=E2 =ED=E0 =ED=E5=E4=E2=E8=E6=E8=EC=EE=E5 =E8=EC=F3=F9=E5=F1=F2= =E2=EE". =C7=E0=EF=E8=F1=FC =ED=E0 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED=ED=FB=E9= =F1=E5=EC=E8=ED=E0=F0 =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3: +7 - =EA=EE= =E4_=CF=E5=F2=E5=F0=E1=F3=F0=E3=E0 - 6=F72 * 5=EE _ 9I =C4=EB=FF =EF=F0=E5=E4=F1=F2=E0=E2=E8=F2=E5=EB=E5=E9 =EA=EE=EC=EF=E0=ED=E8= =E9 =F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=EE=E3=EE =E1=E8=E7=ED=E5=F1=E0 =E8 =EA= =EE=F0=EF=EE=F0=E0=F2=E8=E2=ED=FB=F5 =FE=F0=E8=F1=F2=EE=E2 =96 =EF=EE=E4=E0= =F0=EE=EA! =D1=F0=E5=E4=E8 =F2=E5=EC: =95 =CD=EE=E2=FB=E5 =EF=F0=E0=E2=E8=EB=E0 =F1=EE=E2=E5=F0=F8=E5=ED=E8=FF = =E8 =EE=E1=E6=E0=EB=EE=E2=E0=ED=E8=FF =F1=E4=E5=EB=EE=EA. =C8=E7=EC=E5=ED= =E5=ED=E8=FF =E2 =E2=E5=F9=ED=EE=EC =EF=F0=E0=E2=E5. =CD=EE=E2=EE=E5 =E2 = =EE=E1=E5=F1=EF=E5=F7=E5=ED=E8=E8 =E8=F1=EF=EE=EB=ED=E5=ED=E8=FF =EE=E1=FF= =E7=E0=F2=E5=EB=FC=F1=F2=E2 =95 =CF=F0=E0=E2=EE =E7=E0=F1=F2=F0=EE=E9=EA=E8. =CF=F0=E0=E2=EE =F1=EE=E1= =F1=F2=E2=E5=ED=ED=EE=F1=F2=E8. =CE=F2=EA=E0=E7 =EE=F2 =EF=F0=E0=E2=E0 =F5= =EE=E7=FF=E9=F1=F2=E2=E5=ED=ED=EE=E3=EE =E2=E5=E4=E5=ED=E8=FF. =CF=F0=E0=E2= =EE =EE=EF=E5=F0=E0=F2=E8=E2=ED=EE=E3=EE =F3=EF=F0=E0=E2=EB=E5=ED=E8=FF. = =D1=E5=F0=E2=E8=F2=F3=F2=FB. =C2=EB=E0=E4=E5=ED=E8=E5 =E8 =E5=E3=EE =E7=E0= =F9=E8=F2=E0. =CD=EE=E2=E5=EB=EB=FB =E2=E5=F9=ED=FB=F5 =EF=F0=E0=E2 =ED=E0= =EE=E1=FA=E5=EA=F2=FB =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2=E8 =95 =C8=E7=EC=E5=ED=E5=ED=E8=FF =E2 =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=E8= =E3=F0=E0=E6=E4=E0=ED=F1=EA=E8=F5 =EF=F0=E0=E2=EE=EE=F2=ED=EE=F8=E5=ED=E8= =E9 =E2 =F1=F4=E5=F0=E5 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2=E8 =95 =CA=EB=FE=F7=E5=E2=FB=E5 =E8=E7=EC=E5=ED=E5=ED=E8=FF =C3=F0=E0=E6=E4=E0= =ED=F1=EA=EE=E3=EE =EA=EE=E4=E5=EA=F1=E0 =D0=D4 =E2 2014 =E3. =CD=EE=E2=FB= =E9 =EF=EE=E4=F5=EE=E4 =EA =EE=E1=FA=E5=EA=F2=E0=EC =E3=F0=E0=E6=E4=E0=ED= =F1=EA=E8=F5 =EF=F0=E0=E2. =95 =CF=F0=E8=ED=FF=F2=FB=E5 =E8 =EF=EB=E0=ED=E8=F0=F3=E5=EC=FB=E5 =E8=E7= =EC=E5=ED=E5=ED=E8=FF, =E7=E0=F2=F0=E0=E3=E8=E2=E0=FE=F9=E8=E5 =EA=EE=F0=EF= =EE=F0=E0=F2=E8=E2=ED=FB=E5 =EE=F2=ED=EE=F8=E5=ED=E8=FF =E8 =EA=EE=F0=EF=EE= =F0=E0=F2=E8=E2=ED=EE=E5 =EF=F0=E0=E2=EE. =95 =CF=F0=E8=ED=E8=EC=E0=E5=EC=FB=E5 =E8=E7=EC=E5=ED=E5=ED=E8=FF =C3=CA = =D0=D4 =C4=EB=FF =E2=F1=E5=F5 =F3=F7=E0=F1=F2=ED=E8=EA=EE=E2 =F1=E5=EC=E8=ED=E0=F0= =E0: - =EE=E1=F3=F7=E5=ED=E8=E5 =EF=EE =EF=F0=EE=E3=F0=E0=EC=EC=E5 =F1=E5=EC=E8= =ED=E0=F0=E0 =F1 =E2=FB=E4=E0=F7=E5=E9 =D1=E5=F0=F2=E8=F4=E8=EA=E0=F2=E0; - =F1=E1=EE=F0=ED=E8=EA =E8=ED=F4=EE=F0=EC=E0=F6=E8=EE=ED=ED=EE-=EC=E5=F2= =EE=E4=E8=F7=E5=F1=EA=E8=F5 =EC=E0=F2=E5=F0=E8=E0=EB=EE=E2; - =FD=EA=F1=EA=F3=F0=F1=E8=EE=ED=ED=E0=FF =EF=F0=EE=E3=F0=E0=EC=EC=E0; - =E5=E6=E5=E4=ED=E5=E2=ED=FB=E5 =EE=E1=E5=E4=FB =E8 =EA=EE=F4=E5-=E1=F0=E5= =E9=EA=E8. ------=_NextPart_001_10C1_01CF380D.AE6CA600 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=CF=F0=E8=E3=EB=E0=F8=E0=E5=EC =E2=E0=F1 =ED=E0 =EA=EE=ED=F1=F3=EB=FC= =F2=E0=F6=E8=EE=ED=ED=FB=E9 =F1=E5=EC=E8=ED=E0=F0 17-18 =EC=E0=F0=F2=E0, = =D1=E0=ED=EA=F2-=CF=E5=F2=E5=F0=E1=F3=F0=E3:=20
"=CA=EE=F0=EF=EE=F0=E0=F2=E8=E2=ED=EE=E5 =EF=F0=E0=E2=EE. =C8=E7=EC=E5= =ED=E5=ED=E8=FF =C3=F0=E0=E6=E4=E0=ED=F1=EA=EE=E3=EE =EA=EE=E4=E5=EA=F1=E0= =D0=D4=20 2014. =CE=F1=EE=E1=E5=ED=ED=EE=F1=F2=E8 =EE=F4=EE=F0=EC=EB=E5=ED=E8=FF= =EF=F0=E0=E2 =ED=E0 =ED=E5=E4=E2=E8=E6=E8=EC=EE=E5 =E8=EC=F3=F9=E5=F1=F2= =E2=EE".
 
=C7=E0=EF=E8=F1=FC =ED=E0 =EA=EE=ED=F1=F3=EB=FC=F2=E0=F6=E8=EE=ED=ED= =FB=E9 =F1=E5=EC=E8=ED=E0=F0 =EF=EE =F2=E5=EB=E5=F4=EE=ED=F3:=20 +7 - =EA=EE=E4_=CF=E5=F2=E5=F0=E1=F3=F0=E3=E0 - 6=F72 * 5=EE= _ 9I
 
=C4=EB=FF =EF=F0=E5=E4=F1=F2=E0=E2=E8=F2=E5=EB=E5=E9 =EA=EE=EC=EF=E0= =ED=E8=E9 =F1=F2=F0=EE=E8=F2=E5=EB=FC=ED=EE=E3=EE =E1=E8=E7=ED=E5=F1=E0 =E8= =EA=EE=F0=EF=EE=F0=E0=F2=E8=E2=ED=FB=F5 =FE=F0=E8=F1=F2=EE=E2 =96=20 =EF=EE=E4=E0=F0=EE=EA!
 
=D1=F0=E5=E4=E8 =F2=E5=EC:
 
=95 =CD=EE=E2=FB=E5 =EF=F0=E0=E2=E8=EB=E0 =F1=EE=E2=E5=F0=F8=E5= =ED=E8=FF =E8 =EE=E1=E6=E0=EB=EE=E2=E0=ED=E8=FF =F1=E4=E5=EB=EE=EA. =C8=E7= =EC=E5=ED=E5=ED=E8=FF =E2 =E2=E5=F9=ED=EE=EC=20 =EF=F0=E0=E2=E5. =CD=EE=E2=EE=E5 =E2 =EE=E1=E5=F1=EF=E5=F7=E5=ED=E8=E8 =E8= =F1=EF=EE=EB=ED=E5=ED=E8=FF =EE=E1=FF=E7=E0=F2=E5=EB=FC=F1=F2=E2
=95&n= bsp;=CF=F0=E0=E2=EE =E7=E0=F1=F2=F0=EE=E9=EA=E8.=20 =CF=F0=E0=E2=EE =F1=EE=E1=F1=F2=E2=E5=ED=ED=EE=F1=F2=E8. =CE=F2=EA=E0=E7 = =EE=F2 =EF=F0=E0=E2=E0 =F5=EE=E7=FF=E9=F1=F2=E2=E5=ED=ED=EE=E3=EE =E2=E5=E4= =E5=ED=E8=FF. =CF=F0=E0=E2=EE =EE=EF=E5=F0=E0=F2=E8=E2=ED=EE=E3=EE=20 =F3=EF=F0=E0=E2=EB=E5=ED=E8=FF. =D1=E5=F0=E2=E8=F2=F3=F2=FB. =C2=EB=E0=E4= =E5=ED=E8=E5 =E8 =E5=E3=EE =E7=E0=F9=E8=F2=E0. =CD=EE=E2=E5=EB=EB=FB =E2=E5= =F9=ED=FB=F5 =EF=F0=E0=E2 =ED=E0 =EE=E1=FA=E5=EA=F2=FB=20 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2=E8
=95 =C8=E7=EC=E5=ED=E5=ED=E8= =FF =E2 =F0=E5=E3=F3=EB=E8=F0=EE=E2=E0=ED=E8=E8 =E3=F0=E0=E6=E4=E0=ED=F1=EA= =E8=F5 =EF=F0=E0=E2=EE=EE=F2=ED=EE=F8=E5=ED=E8=E9 =E2=20 =F1=F4=E5=F0=E5 =ED=E5=E4=E2=E8=E6=E8=EC=EE=F1=F2=E8
=95 =CA=EB=FE= =F7=E5=E2=FB=E5 =E8=E7=EC=E5=ED=E5=ED=E8=FF =C3=F0=E0=E6=E4=E0=ED=F1=EA=EE= =E3=EE =EA=EE=E4=E5=EA=F1=E0 =D0=D4 =E2 2014=20 =E3. =CD=EE=E2=FB=E9 =EF=EE=E4=F5=EE=E4 =EA =EE=E1=FA=E5=EA=F2=E0=EC =E3=F0= =E0=E6=E4=E0=ED=F1=EA=E8=F5 =EF=F0=E0=E2.
=95 =CF=F0=E8=ED=FF=F2=FB= =E5 =E8 =EF=EB=E0=ED=E8=F0=F3=E5=EC=FB=E5=20 =E8=E7=EC=E5=ED=E5=ED=E8=FF, =E7=E0=F2=F0=E0=E3=E8=E2=E0=FE=F9=E8=E5 =EA=EE= =F0=EF=EE=F0=E0=F2=E8=E2=ED=FB=E5 =EE=F2=ED=EE=F8=E5=ED=E8=FF =E8 =EA=EE=F0= =EF=EE=F0=E0=F2=E8=E2=ED=EE=E5=20 =EF=F0=E0=E2=EE.
=95 =CF=F0=E8=ED=E8=EC=E0=E5=EC=FB=E5 =E8=E7=EC=E5= =ED=E5=ED=E8=FF =C3=CA =D0=D4
 
=C4=EB=FF =E2=F1=E5=F5 =F3=F7=E0=F1=F2=ED=E8=EA=EE=E2 =F1=E5=EC=E8=ED= =E0=F0=E0:
- =EE=E1=F3=F7=E5=ED=E8=E5 =EF=EE =EF=F0=EE=E3=F0=E0=EC=EC=E5= =F1=E5=EC=E8=ED=E0=F0=E0 =F1 =E2=FB=E4=E0=F7=E5=E9=20 =D1=E5=F0=F2=E8=F4=E8=EA=E0=F2=E0;
- =F1=E1=EE=F0=ED=E8=EA =E8=ED=F4=EE= =F0=EC=E0=F6=E8=EE=ED=ED=EE-=EC=E5=F2=EE=E4=E8=F7=E5=F1=EA=E8=F5 =EC=E0=F2= =E5=F0=E8=E0=EB=EE=E2;
-=20 =FD=EA=F1=EA=F3=F0=F1=E8=EE=ED=ED=E0=FF =EF=F0=EE=E3=F0=E0=EC=EC=E0;
-= =E5=E6=E5=E4=ED=E5=E2=ED=FB=E5 =EE=E1=E5=E4=FB =E8=20 =EA=EE=F4=E5-=E1=F0=E5=E9=EA=E8.
------=_NextPart_001_10C1_01CF380D.AE6CA600-- ------=_NextPart_000_10C0_01CF380D.AE6CA600 Content-Type: application/octet-stream; name="2014__GK.docx" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="2014__GK.docx" UEsDBBQABgAIAAAAIQBruNnWrQEAAJsHAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIooAAC AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0 lU1P4zAQhu9I/IfI11Xisge0Qk05AHtckLarPbv2pLWIP+SZAv33TJo2AtTi8tFLpGQ87/t47MyM L59cWzxAQht8Lc6qkSjA62Csn9fi3/R3+UsUSMob1QYPtVgBisvJ6cl4uoqABWd7rMWCKF5IiXoB TmEVIniONCE5Rfya5jIqfa/mIH+ORudSB0/gqaROQ0zG19CoZUvFzRN/7kkStCiKq35h51ULFWNr tSImlQ/evHEpNw4VZ67X4MJG/MEYQu506CL7DTZ5t1yaZA0UdyrRH+UYQz6GZKQJeul4D9X7Mjs4 Q9NYDUN+pxZT0IDINXdtNUScsn7Lv5fDL90MEmd+P8ggnYVAWrWA30/Q6x5o/9/S4qZpQPONyx+K w7KrfNVbvMjNuwER1/sQk9f/QZk7edwoZxEeYfb3aBQvxLMgTQjkAx3j7AfpLAR4cySGrXIWoYOF dHbAvfvgleiFD/D3NFWzFo5BsJHOQhA3f5Dr59crsZZ5z5Lb5F0KEXmYpE9sezstuuyS+2+ERBaG ebGr3w6OPIi+XGfoRp0Bs8Nbrkfr5BkAAP//AwBQSwMEFAAGAAgAAAAhAB6RGrfzAAAATgIAAAsA CAJfcmVscy8ucmVscyCiBAIooAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAACMkttKA0EMhu8F32HIfTfbCiLS2d5IoXci6wOEmewBdw7MpNq+ vaMgulDbXub058tP1puDm9Q7pzwGr2FZ1aDYm2BH32t4bbeLB1BZyFuagmcNR86waW5v1i88kZSh PIwxq6Lis4ZBJD4iZjOwo1yFyL5UupAcSQlTj5HMG/WMq7q+x/RXA5qZptpZDWln70C1x1g2X9YO XTcafgpm79jLiRXIB2Fv2S5iKmxJxnKNain1LBpsMM8lnZFirAo24Gmi1fVE/1+LjoUsCaEJic/z fHWcA1peD3TZonnHrzsfIVksFn17+0ODsy9oPgEAAP//AwBQSwMEFAAGAAgAAAAhAEg23qNbAQAA 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 ------=_NextPart_000_10C0_01CF380D.AE6CA600-- From sandeen@sandeen.net Tue Mar 4 18:04:56 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 563087F4E for ; Tue, 4 Mar 2014 18:04:56 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0DE7FAC006 for ; Tue, 4 Mar 2014 16:04:52 -0800 (PST) X-ASG-Debug-ID: 1393977890-04bdf05dac281c90001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id S4kHTymz6sMNBkE5 for ; Tue, 04 Mar 2014 16:04:50 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-2.local (c-50-188-35-29.hsd1.mn.comcast.net [50.188.35.29]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B5CAF60003C4; Tue, 4 Mar 2014 18:04:49 -0600 (CST) Message-ID: <53166A20.4040109@sandeen.net> Date: Tue, 04 Mar 2014 18:04:48 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 00/13] xfsprogs: initial EFSBADCRC support References: <1393923117-9559-1-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 00/13] xfsprogs: initial EFSBADCRC support In-Reply-To: <1393923117-9559-1-git-send-email-david@fromorbit.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1393977890 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3600 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/4/14, 2:51 AM, Dave Chinner wrote: > Hi Folks, > > This series is a userspace port of Eric's EFSBADCRC verifier error > discrimination patch set. It brings across all the relevant pathes > form the kernel code and shoe-horns them into the libxfs codebase. > There are two extra patches on the end of the series - one to make > xfs_db use EFSBADCRC for it's CRC validity indication, and the other > to make xfs_repair detect and handle primary superblock CRC failures > and recalculation when the primary superblock is rebuilt and > rewritten. > > This is the first step in bring full awareness of CRC errors into > xfs_repair. More patches will follow as I make more repair code > aware that EFSBADCRC means that the object that was just read > needs repair. You can slap: Reviewed-by: Eric Sandeen on the first 11 of these anyway. (or maybe we should swap SOB/RB, and add a new Userspace-ported-by ;)) -Eric From sandeen@sandeen.net Tue Mar 4 18:12:38 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 0FC177F4E for ; Tue, 4 Mar 2014 18:12:38 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id A9A70AC004 for ; Tue, 4 Mar 2014 16:12:37 -0800 (PST) X-ASG-Debug-ID: 1393978355-04cb6c567625ec10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id pCqEdE7FXw5yTjs7 for ; Tue, 04 Mar 2014 16:12:35 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-2.local (c-50-188-35-29.hsd1.mn.comcast.net [50.188.35.29]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id AF06460003C4; Tue, 4 Mar 2014 18:12:34 -0600 (CST) Message-ID: <53166BF1.6010507@sandeen.net> Date: Tue, 04 Mar 2014 18:12:33 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 12/13] xfs_db: Use EFSBADCRC for CRC validity indication References: <1393923117-9559-1-git-send-email-david@fromorbit.com> <1393923117-9559-13-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 12/13] xfs_db: Use EFSBADCRC for CRC validity indication In-Reply-To: <1393923117-9559-13-git-send-email-david@fromorbit.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1393978355 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3599 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/4/14, 2:51 AM, Dave Chinner wrote: > From: Dave Chinner > > xfs_db currently gives indication as to whether a buffer CRC is ok > or not. Currently it does this by checking for EFSCORRUPTED in the > b_error field of the buffer. Not that we have EFSBADCRC to indicate Now that... > a bad CRC independently of structure corruption, use that instead to > drive the CRC correct/incorrect indication in the structured output. > > Signed-off-by: Dave Chinner Reviewed-by: Eric Sandeen > --- > db/io.c | 5 +++-- > db/io.h | 2 +- > 2 files changed, 4 insertions(+), 3 deletions(-) > > diff --git a/db/io.c b/db/io.c > index d29816c..9a787c8 100644 > --- a/db/io.c > +++ b/db/io.c > @@ -521,10 +521,11 @@ set_cur( > } > > /* > - * keep the buffer even if the verifier says it is corrupted. > + * Keep the buffer even if the verifier says it is corrupted. > * We're a diagnostic tool, after all. > */ > - if (!bp || (bp->b_error && bp->b_error != EFSCORRUPTED)) > + if (!bp || (bp->b_error && bp->b_error != EFSCORRUPTED && > + bp->b_error != EFSBADCRC)) > return; > iocur_top->buf = bp->b_addr; > iocur_top->bp = bp; > diff --git a/db/io.h b/db/io.h > index d8cf383..ad39bee 100644 > --- a/db/io.h > +++ b/db/io.h > @@ -67,6 +67,6 @@ static inline bool > iocur_crc_valid() > { > return (iocur_top->bp && > - iocur_top->bp->b_error != EFSCORRUPTED && > + iocur_top->bp->b_error != EFSBADCRC && > (!iocur_top->ino_buf || iocur_top->ino_crc_ok)); > } > From dave@fromorbit.com Tue Mar 4 19:12:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5997B7F4E for ; Tue, 4 Mar 2014 19:12:04 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3EBA58F8089 for ; Tue, 4 Mar 2014 17:12:01 -0800 (PST) X-ASG-Debug-ID: 1393981919-04cbb054b772830001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 2r90VfDZ9LgPZUtQ for ; Tue, 04 Mar 2014 17:11:59 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AshOACZ5FlN5LJYePGdsb2JhbABagwaIULpnFwMBAQEBHxkNKIIlAQEFJy8zCBgYGTkDBxQZh3jNeBeOYgyEIgSuKCg Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail04.adl6.internode.on.net with ESMTP; 05 Mar 2014 11:41:38 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WL0My-0000ec-7G for xfs@oss.sgi.com; Wed, 05 Mar 2014 12:11:36 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WL0My-0000ST-6K for xfs@oss.sgi.com; Wed, 05 Mar 2014 12:11:36 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/2] xfs: inode log reservations are still too small Date: Wed, 5 Mar 2014 12:11:33 +1100 X-ASG-Orig-Subj: [PATCH 2/2] xfs: inode log reservations are still too small Message-Id: <1393981893-2497-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393981893-2497-1-git-send-email-david@fromorbit.com> References: <1393981893-2497-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1393981919 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3602 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Back in commit 23956703 ("xfs: inode log reservations are too small"), the reservation size was increased to take into account the difference in size between the in-memory BMBT block headers and the on-disk BMDR headers. This solved a transaction overrun when logging the inode size. Recently, however, we've seen a number of these same overruns on kernels with the above fix in it. All of them have been by 4 bytes, so we must still not be accounting for something correctly. Through inspection it turns out the above commit didn't take into account everything it should have. That is, it only accounts for a single log op_hdr structure, when it can actually require up to four op_hdrs - one for each region (log iovec) that is formatted. These regions are the inode log format header, the inode core, and the two forks that can be held in the literal area of the inode. This means we are not accounting for 36 bytes of log space that the transaction can use, and hence when we get inodes in certain formats with particular fragmentation patterns we can overrun the transaction. Fix this by adding the correct accounting for log op_headers in the transaction. Signed-off-by: Dave Chinner --- fs/xfs/xfs_trans_resv.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c index 8515b04..d2c8e4a 100644 --- a/fs/xfs/xfs_trans_resv.c +++ b/fs/xfs/xfs_trans_resv.c @@ -81,20 +81,28 @@ xfs_calc_buf_res( * on disk. Hence we need an inode reservation function that calculates all this * correctly. So, we log: * - * - log op headers for object + * - 4 log op headers for object + * - for the ilf, the inode core and 2 forks * - inode log format object - * - the entire inode contents (core + 2 forks) - * - two bmap btree block headers + * - the inode core + * - two inode forks containing bmap btree root blocks. + * - the btree data contained by both forks will fit into the inode size, + * hence when combined with the inode core above, we have a total of the + * actual inode size. + * - the BMBT headers need to be accounted separately, as they are + * additional to the records and pointers that fit inside the inode + * forks. */ STATIC uint xfs_calc_inode_res( struct xfs_mount *mp, uint ninodes) { - return ninodes * (sizeof(struct xlog_op_header) + - sizeof(struct xfs_inode_log_format) + - mp->m_sb.sb_inodesize + - 2 * XFS_BMBT_BLOCK_LEN(mp)); + return ninodes * + (4 * sizeof(struct xlog_op_header) + + sizeof(struct xfs_inode_log_format) + + mp->m_sb.sb_inodesize + + 2 * XFS_BMBT_BLOCK_LEN(mp)); } /* -- 1.9.0 From dave@fromorbit.com Tue Mar 4 19:12:04 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8685D7F50 for ; Tue, 4 Mar 2014 19:12:04 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4F5358F808E for ; Tue, 4 Mar 2014 17:12:01 -0800 (PST) X-ASG-Debug-ID: 1393981917-04bdf05daa284aa0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id L2btRF58EcridUN5 for ; Tue, 04 Mar 2014 17:11:58 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AshOACZ5FlN5LJYePGdsb2JhbABagwaIULpnFwMBAQEBHxkNKIIlAQEFJyAPMwgYMTkDBxQZh3ixNpxCF415hRcEoxCLGCiBLA Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail04.adl6.internode.on.net with ESMTP; 05 Mar 2014 11:41:38 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WL0My-0000eb-6p for xfs@oss.sgi.com; Wed, 05 Mar 2014 12:11:36 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WL0My-0000SL-5y for xfs@oss.sgi.com; Wed, 05 Mar 2014 12:11:36 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/2] xfs: xfs_check_page_type buffer checks need help Date: Wed, 5 Mar 2014 12:11:32 +1100 X-ASG-Orig-Subj: [PATCH 1/2] xfs: xfs_check_page_type buffer checks need help Message-Id: <1393981893-2497-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 In-Reply-To: <1393981893-2497-1-git-send-email-david@fromorbit.com> References: <1393981893-2497-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1393981918 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3603 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_aops_discard_page() was introduced in the following commit: xfs: truncate delalloc extents when IO fails in writeback ... to clean up left over delalloc ranges after I/O failure in ->writepage(). generic/224 tests for this scenario and occasionally reproduces panics on sub-4k blocksize filesystems. The cause of this is failure to clean up the delalloc range on a page where the first buffer does not match one of the expected states of xfs_check_page_type(). If a buffer is not unwritten, delayed or dirty&mapped, xfs_check_page_type() stops and immediately returns 0. The stress test of generic/224 creates a scenario where the first several buffers of a page with delayed buffers are mapped & uptodate and some subsequent buffer is delayed. If the ->writepage() happens to fail for this page, xfs_aops_discard_page() incorrectly skips the entire page. This then causes later failures either when direct IO maps the range and finds the stale delayed buffer, or we evict the inode and find that the inode still has a delayed block reservation accounted to it. We can easily fix this xfs_aops_discard_page() failure by making xfs_check_page_type() check all buffers, but this breaks xfs_convert_page() more than it is already broken. Indeed, xfs_convert_page() wants xfs_check_page_type() to tell it if the first buffers on the pages are of a type that can be aggregated into the contiguous IO that is already being built. xfs_convert_page() should not be writing random buffers out of a page, but the current behaviour will cause it to do so if there are buffers that don't match the current specification on the page. Hence for xfs_convert_page() we need to: a) return "not ok" if the first buffer on the page does not match the specification provided to we don't write anything; and b) abort it's buffer-add-to-io loop the moment we come across a buffer that does not match the specification. Hence we need to fix both xfs_check_page_type() and xfs_convert_page() to work correctly with pages that have mixed buffer types, whilst allowing xfs_aops_discard_page() to scan all buffers on the page for a type match. Reported-by: Brian Foster Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 81 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 50 insertions(+), 31 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index ef62c6b..98016b3 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -632,38 +632,46 @@ xfs_map_at_offset( } /* - * Test if a given page is suitable for writing as part of an unwritten - * or delayed allocate extent. + * Test if a given page contains at least one buffer of a given @type. + * If @check_all_buffers is true, then we walk all the buffers in the page to + * try to find one of the type passed in. If it is not set, then the caller only + * needs to check the first buffer on the page for a match. */ -STATIC int +STATIC bool xfs_check_page_type( struct page *page, - unsigned int type) + unsigned int type, + bool check_all_buffers) { - if (PageWriteback(page)) - return 0; + struct buffer_head *bh; + struct buffer_head *head; - if (page->mapping && page_has_buffers(page)) { - struct buffer_head *bh, *head; - int acceptable = 0; + if (PageWriteback(page)) + return false; + if (!page->mapping) + return false; + if (!page_has_buffers(page)) + return false; - bh = head = page_buffers(page); - do { - if (buffer_unwritten(bh)) - acceptable += (type == XFS_IO_UNWRITTEN); - else if (buffer_delay(bh)) - acceptable += (type == XFS_IO_DELALLOC); - else if (buffer_dirty(bh) && buffer_mapped(bh)) - acceptable += (type == XFS_IO_OVERWRITE); - else - break; - } while ((bh = bh->b_this_page) != head); + bh = head = page_buffers(page); + do { + if (buffer_unwritten(bh)) { + if (type == XFS_IO_UNWRITTEN) + return true; + } else if (buffer_delay(bh)) { + if (type == XFS_IO_DELALLOC); + return true; + } else if (buffer_dirty(bh) && buffer_mapped(bh)) { + if (type == XFS_IO_OVERWRITE); + return true; + } - if (acceptable) - return 1; - } + /* If we are only checking the first buffer, we are done now. */ + if (!check_all_buffers) + break; + } while ((bh = bh->b_this_page) != head); - return 0; + return false; } /* @@ -697,7 +705,7 @@ xfs_convert_page( goto fail_unlock_page; if (page->mapping != inode->i_mapping) goto fail_unlock_page; - if (!xfs_check_page_type(page, (*ioendp)->io_type)) + if (!xfs_check_page_type(page, (*ioendp)->io_type, false)) goto fail_unlock_page; /* @@ -742,6 +750,15 @@ xfs_convert_page( p_offset = p_offset ? roundup(p_offset, len) : PAGE_CACHE_SIZE; page_dirty = p_offset / len; + /* + * The moment we find a buffer that doesn't match our current type + * specification or can't be written, abort the loop and start + * writeback. As per the above xfs_imap_valid() check, only + * xfs_vm_writepage() can handle partial page writeback fully - we are + * limited here to the buffers that are contiguous with the current + * ioend, and hence a buffer we can't write breaks that contiguity and + * we have to defer the rest of the IO to xfs_vm_writepage(). + */ bh = head = page_buffers(page); do { if (offset >= end_offset) @@ -750,7 +767,7 @@ xfs_convert_page( uptodate = 0; if (!(PageUptodate(page) || buffer_uptodate(bh))) { done = 1; - continue; + break; } if (buffer_unwritten(bh) || buffer_delay(bh) || @@ -762,10 +779,11 @@ xfs_convert_page( else type = XFS_IO_OVERWRITE; - if (!xfs_imap_valid(inode, imap, offset)) { - done = 1; - continue; - } + /* + * imap should always be valid because of the above + * partial page end_offset check on the imap. + */ + ASSERT(xfs_imap_valid(inode, imap, offset)); lock_buffer(bh); if (type != XFS_IO_OVERWRITE) @@ -777,6 +795,7 @@ xfs_convert_page( count++; } else { done = 1; + break; } } while (offset += len, (bh = bh->b_this_page) != head); @@ -868,7 +887,7 @@ xfs_aops_discard_page( struct buffer_head *bh, *head; loff_t offset = page_offset(page); - if (!xfs_check_page_type(page, XFS_IO_DELALLOC)) + if (!xfs_check_page_type(page, XFS_IO_DELALLOC, true)) goto out_invalidate; if (XFS_FORCED_SHUTDOWN(ip->i_mount)) -- 1.9.0 From dave@fromorbit.com Tue Mar 4 19:12:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 486437F58 for ; Tue, 4 Mar 2014 19:12:08 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D8FABAC006 for ; Tue, 4 Mar 2014 17:12:04 -0800 (PST) X-ASG-Debug-ID: 1393981917-04bdf05daa284aa0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id cEUpzYWapyoBzXbe for ; Tue, 04 Mar 2014 17:11:57 -0800 (PST) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgdiACZ5FlN5LJYePGdsb2JhbABagwY7qHwEmXwXAwEBAQEfGQ0ogwI7gQIDB4glDp17sAaMV4IXhCIErCaCAig Received: from ppp121-44-150-30.lns20.syd7.internode.on.net (HELO dastard) ([121.44.150.30]) by ipmail04.adl6.internode.on.net with ESMTP; 05 Mar 2014 11:41:38 +1030 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1WL0My-0000ea-6R for xfs@oss.sgi.com; Wed, 05 Mar 2014 12:11:36 +1100 Received: from dave by disappointment with local (Exim 4.82) (envelope-from ) id 1WL0My-0000S9-5H for xfs@oss.sgi.com; Wed, 05 Mar 2014 12:11:36 +1100 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfs: more bug fixes Date: Wed, 5 Mar 2014 12:11:31 +1100 X-ASG-Orig-Subj: [PATCH 0/2] xfs: more bug fixes Message-Id: <1393981893-2497-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.9.0 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1393981917 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3603 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The first patch here fixes the issue that Brian first reported and posted a candidate fix for here: http://oss.sgi.com/pipermail/xfs/2014-February/034667.html It fixes the problems with xfs_check_page_type() and xfs_convert_page() as well. The second is a fix for a transaction overrun problem that has been showing up on RHEL7 kernels quite frequently of late. It has been reproduced on upstream kernels as well, and the patch should address the oversight made in previous fixes to the inode reservation size calculation. Cheers, Dave. From sandeen@sandeen.net Tue Mar 4 21:33:28 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B5D797F53 for ; Tue, 4 Mar 2014 21:33:28 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8A105304048 for ; Tue, 4 Mar 2014 19:33:28 -0800 (PST) X-ASG-Debug-ID: 1393990403-04bdf05da928af50001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id L9pL2LBp1Fa0VvF5 for ; Tue, 04 Mar 2014 19:33:23 -0800 (PST) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 2859960003C4; Tue, 4 Mar 2014 21:33:23 -0600 (CST) Message-ID: <53169B02.1030709@sandeen.net> Date: Tue, 04 Mar 2014 21:33:22 -0600 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: inode log reservations are still too small References: <1393981893-2497-1-git-send-email-david@fromorbit.com> <1393981893-2497-3-git-send-email-david@fromorbit.com> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: inode log reservations are still too small In-Reply-To: <1393981893-2497-3-git-send-email-david@fromorbit.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1393990403 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3607 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 3/4/14, 7:11 PM, Dave Chinner wrote: > From: Dave Chinner > > Back in commit 23956703 ("xfs: inode log reservations are too > small"), the reservation size was increased to take into account the > difference in size between the in-memory BMBT block headers and the > on-disk BMDR headers. This solved a transaction overrun when logging > the inode size. > > Recently, however, we've seen a number of these same overruns on > kernels with the above fix in it. All of them have been by 4 bytes, > so we must still not be accounting for something correctly. > > Through inspection it turns out the above commit didn't take into > account everything it should have. That is, it only accounts for a > single log op_hdr structure, when it can actually require up to four > op_hdrs - one for each region (log iovec) that is formatted. These > regions are the inode log format header, the inode core, and the two > forks that can be held in the literal area of the inode. > > This means we are not accounting for 36 bytes of log space that the > transaction can use, and hence when we get inodes in certain formats > with particular fragmentation patterns we can overrun the > transaction. Fix this by adding the correct accounting for log > op_headers in the transaction. > > Signed-off-by: Dave Chinner Makes sense to me; Reviewed-by: Eric Sandeen > --- > fs/xfs/xfs_trans_resv.c | 22 +++++++++++++++------- > 1 file changed, 15 insertions(+), 7 deletions(-) > > diff --git a/fs/xfs/xfs_trans_resv.c b/fs/xfs/xfs_trans_resv.c > index 8515b04..d2c8e4a 100644 > --- a/fs/xfs/xfs_trans_resv.c > +++ b/fs/xfs/xfs_trans_resv.c > @@ -81,20 +81,28 @@ xfs_calc_buf_res( > * on disk. Hence we need an inode reservation function that calculates all this > * correctly. So, we log: > * > - * - log op headers for object > + * - 4 log op headers for object > + * - for the ilf, the inode core and 2 forks > * - inode log format object > - * - the entire inode contents (core + 2 forks) > - * - two bmap btree block headers > + * - the inode core > + * - two inode forks containing bmap btree root blocks. > + * - the btree data contained by both forks will fit into the inode size, > + * hence when combined with the inode core above, we have a total of the > + * actual inode size. > + * - the BMBT headers need to be accounted separately, as they are > + * additional to the records and pointers that fit inside the inode > + * forks. > */ > STATIC uint > xfs_calc_inode_res( > struct xfs_mount *mp, > uint ninodes) > { > - return ninodes * (sizeof(struct xlog_op_header) + > - sizeof(struct xfs_inode_log_format) + > - mp->m_sb.sb_inodesize + > - 2 * XFS_BMBT_BLOCK_LEN(mp)); > + return ninodes * > + (4 * sizeof(struct xlog_op_header) + > + sizeof(struct xfs_inode_log_format) + > + mp->m_sb.sb_inodesize + > + 2 * XFS_BMBT_BLOCK_LEN(mp)); > } > > /* > From Evelinn.Mikkelsen@radboudumc.nl Wed Mar 5 03:31:55 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=HTML_MESSAGE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 749F07F4E for ; Wed, 5 Mar 2014 03:31:55 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 016E2AC009 for ; Wed, 5 Mar 2014 01:31:54 -0800 (PST) X-ASG-Debug-ID: 1394011908-04cbb054b88ae30001-NocioJ Received: from co9outboundpool.messaging.microsoft.com (co9ehsobe004.messaging.microsoft.com [207.46.163.27]) by cuda.sgi.com with ESMTP id SboOHBPbImrGrwf1 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO); Wed, 05 Mar 2014 01:31:49 -0800 (PST) X-Barracuda-Envelope-From: Evelinn.Mikkelsen@radboudumc.nl X-Barracuda-Apparent-Source-IP: 207.46.163.27 Received: from mail175-co9-R.bigfish.com (10.236.132.227) by CO9EHSOBE019.bigfish.com (10.236.130.82) with Microsoft SMTP Server id 14.1.225.22; Wed, 5 Mar 2014 09:01:37 +0000 Received: from mail175-co9 (localhost [127.0.0.1]) by mail175-co9-R.bigfish.com (Postfix) with ESMTP id 3F90F9C0272; Wed, 5 Mar 2014 09:01:36 +0000 (UTC) X-Forefront-Antispam-Report: CIP:131.174.165.7;KIP:(null);UIP:(null);IPV:NLI;H:umcsmtp01.extern.umcn.nl;RD:umcsmtp01.extern.umcn.nl;EFVD:NLI X-SpamScore: 10 X-BigFish: VPS10(zzc89bhc85dhzz1f42h208ch1ee6h1de0h1d18h1fdah2073h2146h1202h1e76h2189h1d1ah1d2ah21bch21a7h1fc6hzz17326ah8275bh18c673h1de097h186068h1954cbh1df0b3oz2fh109h839hd25hf0ah1288h12a5h12bdh137ah1441h14ddh1504h1537h153bh15d0h162dh1631h1758h18e1h1946h19b5h1b0ah1bceh224fh1d0ch1d2eh1d3fh1dc1h1dfeh1dffh1e1dh1fe8h1ff5h20f0h2216h2336h2438h2461h2487h24d7h2516h2545h255eh25f6h1724k1155h) Received-SPF: pass (mail175-co9: domain of radboudumc.nl designates 131.174.165.7 as permitted sender) client-ip=131.174.165.7; envelope-from=Evelinn.Mikkelsen@radboudumc.nl; helo=umcsmtp01.extern.umcn.nl ;tern.umcn.nl ; Received: from mail175-co9 (localhost.localdomain [127.0.0.1]) by mail175-co9 (MessageSwitch) id 1394010095604620_28124; Wed, 5 Mar 2014 09:01:35 +0000 (UTC) Received: from CO9EHSMHS022.bigfish.com (unknown [10.236.132.228]) by mail175-co9.bigfish.com (Postfix) with ESMTP id 8FCBD180065; Wed, 5 Mar 2014 09:01:35 +0000 (UTC) Received: from umcsmtp01.extern.umcn.nl (131.174.165.7) by CO9EHSMHS022.bigfish.com (10.236.130.32) with Microsoft SMTP Server id 14.16.227.3; Wed, 5 Mar 2014 09:01:35 +0000 Received: from UMCEXCAS01.umcn.nl ([131.174.244.48]) by umcsmtp01.extern.umcn.nl with Microsoft SMTPSVC(6.0.3790.4675); Wed, 5 Mar 2014 10:01:34 +0100 Received: from UMCEXMBX12.umcn.nl ([169.254.4.175]) by UMCEXCAS01.umcn.nl ([10.48.3.159]) with mapi id 14.03.0174.001; Wed, 5 Mar 2014 10:01:25 +0100 From: Subject: Belangrijke (Controleer uw e-mail) Thread-Topic: Belangrijke (Controleer uw e-mail) X-ASG-Orig-Subj: Belangrijke (Controleer uw e-mail) Thread-Index: Ac84UXsigY77rNwdRm6sjw4w3XbY7g== Date: Wed, 5 Mar 2014 09:01:24 +0000 Message-ID: Accept-Language: en-GB, nl-NL, en-US Content-Language: en-GB X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.11.13.11] Content-Type: multipart/alternative; boundary="_000_A049FEF496251041BFAA9AAAC731134FBF3394F8UMCEXMBX12umcnn_" MIME-Version: 1.0 X-OriginalArrivalTime: 05 Mar 2014 09:01:34.0229 (UTC) FILETIME=[820ADC50:01CF3851] To: Undisclosed recipients:; X-OriginatorOrg: radboudumc.nl X-FOPE-CONNECTOR: Id%0$Dn%*$RO%0$TLS%0$FQDN%$TlsDn% X-Barracuda-Connect: co9ehsobe004.messaging.microsoft.com[207.46.163.27] X-Barracuda-Start-Time: 1394011908 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_MESSAGE, NO_REAL_NAME, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3614 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 NO_REAL_NAME From: does not include a real name 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.00 HTML_MESSAGE BODY: HTML included in message --_000_A049FEF496251041BFAA9AAAC731134FBF3394F8UMCEXMBX12umcnn_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Uw mailbox is het opslag limiet overschreden zoals ingesteld door uw beheer= der en u zult niet in staat zijn om nieuwe mails te ontvangen totdat u opni= euw valideren. Opnieuw te valideren -> kopi=EBren of klik hier http://dutch= 65644e.yolasite.com Het Radboudumc staat geregistreerd bij de Kamer van Koophandel in het hande= lsregister onder nummer 41055629. The Radboud university medical center is listed in the Commercial Register = of the Chamber of Commerce under file number 41055629. --_000_A049FEF496251041BFAA9AAAC731134FBF3394F8UMCEXMBX12umcnn_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable

Uw mailbox is het opslag limiet overschreden zoals ingesteld door uw b= eheerder en u zult niet in staat zijn om nieuwe mails te ontvangen totdat u= opnieuw valideren. Opnieuw te valideren -> kopi=EBren of klik hier http= ://dutch65644e.yolasite.com

=0D =0D

=0D =0D Het Radboudumc staat geregistreerd bij de Kamer van Koophandel in het hand= elsregister onder nummer 41055629.
The Radboud university medical cente= r is listed in the Commercial Register of the Chamber of Commerce under fil= e number 41055629.
=0D

=0D =0D =0D --_000_A049FEF496251041BFAA9AAAC731134FBF3394F8UMCEXMBX12umcnn_-- From bronislav_barkhonina1986@myrambler.ru Wed Mar 5 08:02:13 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=HTML_IMAGE_ONLY_08, HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 2F4087F3F for ; Wed, 5 Mar 2014 08:02:13 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0AEA930406A for ; Wed, 5 Mar 2014 06:02:09 -0800 (PST) X-ASG-Debug-ID: 1394028124-04cb6c567528f2c0001-NocioJ Received: from bug.itass.su (bug.itass.su [212.83.24.23]) by cuda.sgi.com with SMTP id OOMsPvqR8ICMf27R for ; Wed, 05 Mar 2014 06:02:06 -0800 (PST) X-Barracuda-Envelope-From: bronislav_barkhonina1986@myrambler.ru X-Barracuda-Apparent-Source-IP: 212.83.24.23 Received: from [91.121.95.51] (account alex@amik.ru HELO Unknown) by bug.itass.su (CommuniGate Pro SMTP 5.4.1) with ESMTPSA id 28912; Wed, 05 Mar 2014 18:01:14 +0400 Received-SPF: none receiver=bug.itass.su; client-ip=91.121.95.51; envelope-from=bronislav_barkhonina1986@myrambler.ru MessageID: <4C08CFDD7FD5453B98BDF2605F2F1A8A@wndjp> Reply-To: =?windows-1251?B?weDp8eDw7uLo9w==?= From: =?windows-1251?B?weDp8eDw7uLo9w==?= To: , , , , , Subject: =?windows-1251?B?RndkOjQ0M1/g8e/l6vJf7/DuX+Tu9e7k?= Date: Wed, 5 Mar 2014 18:00:34 +0400 X-ASG-Orig-Subj: =?windows-1251?B?RndkOjQ0M1/g8e/l6vJf7/DuX+Tu9e7k?= MIME-Version: 1.0 Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_000_05D5_01CF389C.CE4D2690" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Mail 6.0.6001.18416 X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6001.18645 Message-ID: X-Barracuda-Connect: bug.itass.su[212.83.24.23] X-Barracuda-Start-Time: 1394028125 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.78 X-Barracuda-Spam-Status: No, SCORE=1.78 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG035a, EXTRA_MPART_TYPE, HTML_IMAGE_ONLY_08, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.3620 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry 1.78 HTML_IMAGE_ONLY_08 BODY: HTML: images with 400-800 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 BSF_SC0_TG035a Message contains invalid style definition ------=_NextPart_000_05D5_01CF389C.CE4D2690 Content-Type: multipart/alternative; boundary="----=_NextPart_001_05D6_01CF389C.CE4D2690" ------=_NextPart_001_05D6_01CF389C.CE4D2690 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =20

vip =EF=EE=E4=E0=F0=EE=EA =EF=E0=F0=F2=ED=E5=F0=F3 =E1=E8=E7=ED=E5= =F1 =EF=EE=E4=E0=F0=EA=E8
=20
=ED=E0=EB=EE=E3=EE=EE=E1=EB=EE=E6=E5=ED=E8=E5 =F0=E5=EA=EB=E0=EC=ED= =EE=E9 =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2=E8
=20
=20 ------=_NextPart_001_05D6_01CF389C.CE4D2690 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
3D""=20

 =20 vip =EF=EE=E4=E0=F0=EE=EA =EF=E0=F0=F2=ED=E5=F0=F3 =E1=E8=E7=ED=E5=F1 =EF= =EE=E4=E0=F0=EA=E8
=20

 =20 =ED=E0=EB=EE=E3=EE=EE=E1=EB=EE=E6=E5=ED=E8=E5 =F0=E5=EA=EB=E0=EC=ED=EE=E9= =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2=E8
 

 
------=_NextPart_001_05D6_01CF389C.CE4D2690-- ------=_NextPart_000_05D5_01CF389C.CE4D2690 Content-Type: image/jpeg; name="859384219.jpg" Content-Transfer-Encoding: base64 Content-ID: <7B8217AAE1584796A23859F8938D4BD9@wndjp> /9j/4AAQSkZJRgABAQEAeAB4AAD/2wBDABgQEhUSDxgVExUaGRgcIzsmIyAgI0gzNis7VUtaWFRL UlFeaodzXmSAZVFSdqB3gIyQl5mXW3GmsqWTsIeUl5L/2wBDARkaGiMfI0UmJkWSYVJhkpKSkpKS kpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpL/wAARCAGPAqsDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDqqKKK ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiortp0t2a2VGkHQOeKraNfSahZmaRVUhyuF6dB /jQPldrl6ismbUb1tWmsrWKBvLUNmQkcYH+NXZ7r7JY+fdABlUblU8E+goG4tWLNFZtlqMz3K297 CsTyLvj2ngj0+taE3+pf/dNAnFp2Y6iuW0bSI9QszNJNKrbyuFIxV7/hGrf/AJ+Z/wAx/hTNHCKd mzboqC+4sbj/AK5N/KsDSdFivrFJ5J5lZiRhSMcGkTGKau2dNRWJ/wAI1b/8/M/5j/CtmNBHGqAk hQBk0CkktmOorl7HTU1G8vjLLInlynG0+pP+FSanocVnYS3CTzMyYwGIx1Apl+zje1zpKKz7cn/h H0Pf7N/7LUfhok6QmTn5m/nSIcdGzUoorF8Uki0gwSP3o/kaAjHmdjaoqvfWiXtq8L8Ej5W/unsa paNdOgewvCFntx+BTHBzQCjdXRq0VhnOtaiCpBsrc9f75rcAAAA4AoCUbBRWbrF/JbCO3tl3XE/C HsKrL4faZQ97eTPLjqD0HpzQNRVrtm3RWAPtOgzx75TNYyNt+Y/c5NaeqWS39oUGBIOUb0NAONmt dC5RWbpeob7eSO7YJPb8Sdhj1qtbI2r6j9rcA2kJKxj+8aA5N7m3RWJ4qz9jgAJGZccfQ0f8I1b/ APPzP+Y/wpjUVa7Zt0Vl2ehQ2lyk6TzMUzgMRg8Yqt4qVnW0RDgs5A5+lISinKyZu0VmeHpjJpwj dgzxMUPt6VD4kd2hhtYnAeZ+h9B/9egOT3uU2aKx/CxJ0xsnP70/yFbFApLldgooooJCiiigAooo oAKKKKACiiigAooooAKKKKAEyM4zRketVZyROSKdG2/J796ALGR60ZHrUWQTiloAk3D1o3Co+KKA JNwo3Co6WgB+4UbhTKKAH7hSbxTaWgBd4o30lFAC7qN1JRQAu72o3e1JRQAu4+lG40lFAC7jRk0U UAGTRk0UUAHNHNFFABzTs02igB1FIOtLQAUUUUAFFFFABRRRQA2T/Vt9DWR4V/5Bbf8AXU/yFa8n +rb6Gsjwr/yC2/66n+Qpmi+BkN5Dd6XcT6krJMHfDKV5Cnpz+X6VJ4ilWfRIpU+67qw/EGl1vULe exa1t386WUhQqc4wR1p2qWMp8PxwL8zwqpIA64GKC19ly3Ir3/kN6X/uCtqb/Uv/ALprCWSPUNZs Wt2yIY8scfpW7N/qX/3TQTPojmdGGq/Yz9hMQi3n72M54q693rFivn3cccsI4YJ1HvVbQtWtLKxM U7sH3k4Ck8cVZvtbt7i0kgtFeaWUFAu0jGeM0Gkk3L4dDRluI7rSZZoTlHiYj8jWHpA1f7An2Mxe Tk43Yz15rUt7Z7PQHglxvWJycds5NUNF1iztNOSGZ2DgkkBSe9BMdnyq+pPjxB/et/0rZj3eWvmY 34G7HrWb/wAJDp3/AD0f/vg1PNqlrDaR3Ls3lyfdO080ESUn0KPh7/j71L/rt/Vqt+IP+QNcfRf/ AEIVV8NBn+2XO3CTS5XP4n+tWvEH/IGuPov/AKEKOpT/AIn3Bb/8i+n/AF7f+y1kaQNW+wr9iMXk 5ON2M5rXt/8AkX0/69v/AGWszRdXs7PT1hndg4YnAUnvQNXs7K+pO15q1gBLexxyQ5w2zqvvTfEc yXGnWssR3I8oIP4Gl1DWIby1a2sleWSX5MbSMZqDV7d7XRLKCQgsknOPxoHFaptWZ0lc94kIa5iS 2VjdbCWKD+DHf9a19SvUsLRpmwW6KucbjVbR7Fo915dA/ap8ls/wgnpQZw933mSaI0DaZF9nGABh s9c981frEuN2j6j9oRSbW4OJPRGraVgyhlIIPIIpCmtb9zFk58WRA8gRcfka26ytatJ2eK9tMGWD nbj7wpsPiK0MY88SRP3UqTTKackmjWZVYYZQR7ilrAkupdbuUgtVeO2jbdJJnBI9q0dVvvsNuNg3 zOdsaep9aRLg9F1MbxAVe/ZbZX3hP3+wcEe9b2mtC1jCbcYj28CoNI08WkBeUZnl5kJ5/CqiMdG1 HyyP9EuGyGJ+41Mt2kuVdA8V5+xwY6+b/Q0Y8Qf3rf8ASjxUR9jgPbzQf0NT/wDCQ6d/z0f/AL4N A1fkVlcLMaz9pT7UYfJ53bcZ6VB4j/11h/12/wAKsx69YSyLGkjFnIUfIepqt4j/ANdYf9dv8KBR vzq6sSW2bTX5oTny7hd654Ge9NXN5rc8vPl20ZVe43Ef5/KjxGHhW3vYlXfC/wB40/QoiulyTOoD zFnJHcf5zQP7PN8hvhX/AJBbf9dT/IVsVj+Ff+QW3/XU/wAhWxSZnU+NhRRRQQFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAU7j/XGlt+ppLn/AFxpbfqaQyRfv0/FMX79SUxCYoxUE92kDFWWRiF3Hauc CpVlRsAOuSN2M84p2AdilxUX2mDj98nPA560faoCrESoQvXnpSsBLRUX2qDK/vB8/Sj7TDx845wR +NFgJaKgS9gdowrk+YPlOOPb+VWKACiiigAooooAKKKKACloooAKKKKACiiigAorKutcijmaC2hk uZV7J09+f/rVHHr4WVUvbOW2DdGbn+gosX7OXY2aKiuJxFaSXCgOEQuMHrgZ61Hp119tso7jZs35 +XOcYJH9KCbO1yyOtLUcr+VC8mM7FLY9cCq9jf8A2vTzdeVsxu+Xdnp70BZ2uXKKqaXff2haef5f l/MRt3Zp9/eR2Nq80hHA+VScbj6UByu9ixRVDTtQfULJ54oFV1faEaTg9O+Pf0p9jqC3TvDJGYLi M/NExzx6g9xQNxaLlFUrnUPI1K3tPK3ecM792Mfhipb28isoDJKfZVHVj6CgXK9CxTY40iXbGioO uFGBVX7XMlhJdT2wjKpvEfmZP48cVnx6/cyIHj0qZ1PRlYkH/wAdoKUJPY2VhiRy6RornqwUAmn1 if25ef8AQIn/ADP/AMTV/U7/APs+0E/leZlgu3djrQDhK9i1HFHHny0VMnJ2jGaceRg0iNuRWxjI zVbU7z7BaNP5fmYIG3OOtBKTbsSfY7X/AJ9of++BTo4IYm3RxRocYyqgVXu7/wCzaaLzyt2VU7N2 OuO/41Zt5fOt45cbd6BsZzjIzQN3tceQGBBAIPBBqH7Ha/8APtD/AN8Cq2rapHpsa5USSMeI92Dj 16VZt7kTWSXLDYrJvIznFAWklcPsdr/z7Q/98CnNBCyBGijKL0UqMCsg+IGkdvslhNOg43DI/kDS Nr10iln0qZVHJJJAH/jtMr2czbRFRQqKFUdABgCh0WRSrqGU9QRkVBYXP2yzjuNmzeD8uc45xRqF 19is5LjZv2Y+XOM5OP60iLO9upOEUJsCgLjG3HGKi+x2v/PtD/3wKW1m+0WsU23b5ihsZzjNJe3H 2S0kn279gztzjNAa3sPjghiJMUSIT1KqBSyRRygCRFcA5AYZqOyuPtdpHPt2bxnbnOKj1K9FhaGY qHOQAm7GaB2d7dSeSGKXHmxo+Om5QcU+q2nXgvrbzdhjYMVdD1UjtVmgTutGNkjSVdsiK6+jDIpV VUUKihVHQAYArHm12VbuaCGwkmMTFSUYn+lMfXrlFLPpUyqOpJIA/wDHadi/ZyNyo5LeGVt0kMbn pllBNMsbj7XaRz7Nm8Z25ziq9/q9vZv5QDTTngRIMnPbP+c0iVF3si8iLGoVFCqOgUYFNeGKRw7x ozDoSoJFZH9vTJ81xplxFEPvPycfmB/OtOzu4b2ATQNlT1B6g+hoG4yjqyemyRRygCWNHA6Bhms/ VNVaxuI4UtmnaRcgK2D+WDVb+3Lz/oET/mf/AImgFCT1RsPDFIoV40ZR0DKCBTPsdr/z7Q/98Cod NvZbxZDNaPbbSMB8/N+gpl/q9vZv5XzSzngRIMnJ6Z/znnpQFpXsWhaWykEW8QI5BCDinvFHIQZE VtpyNwzisf8At6ZPmuNMuIoh95+Tj8wP51p2d5DewCaBsqeoPUH0NASjJaslkjSRdsiK6+jDIpVR UQIqhVHQAYFZd/rL2t8bWKzadgob5W5/LBqL+3bhfmm0u4SMfebngfkKB+zk0bEcaRLtjRUHXCjA p1V7G8ivrcTQ7tucEMMEGrFBDunqFFFFAgooooAKKKKACiiigAooooAKKKKACiiigCnc/wCuNLb9 TUV9IUnGOhqW1Ocn1FAyVfv0+mL9+oJy7XcMauyqQScd6aVyW7BPC7yzFRw0BQfWq7WczZXaASd2 /P8As4xVx7qNJzC2d4QyfhUA1ODaG+YAw+dz6U1cNAS3kPls0SR7WyQPpioYbWZ40faqlANqnvz3 p76qoiR0gkcMnmHttFLJqsauUWNmbC7R/ezT1FoIunuJFYlDnk9eOe1H9mHaArgfd3e+Cc/zpsuq skrYgzFGwR2zyCaWTVdiTEIu6OURgZ65xzR7waEkVh5UyOGXC4z8vPGen51erP8A7QP9rC02DZjG /wD2sZxUEWpXLTx7lj8p5HTjr8tKzYXSNeiseHUbovE77PLm3bVA5XFAu7wad9raVTv4VdvQ5o5R 3NiisOa8u7eK4jabcyFCH284PWkTUJxFEzSM4FzsJC/My47inyMXMjdoPArKku/td3GtvKyxvC/t hgaNEmmujJLNJnZiMKDxx3/Gly9R3NC3nE28bCpU4INTVVtP9dcf79WqTFF3QUUUUigrO164Nvpc hXIL4QEHGM1o1m+IYWm0qTb1Qh8Y64oKh8SuTaVZx2dlGqAbmAZmx1NT3NvHcwtFKoZWHeotMuY7 qyjeMjhQCM9DU80qQRNJIwVVGSTQDvzeZn/ZXstBuIJJRJtifaQuMDHT+dVdF1Ozt9LhimnVHXdk EH+8attd/btDuZ/KaMGNwATnIx1qvodhaT6VDJLbxu53ZYjk/MaZp9l83cnudYsHtpVW5UsyEAYP XH0qLQv+Rfb6PVi60yyW1mZbWIEIxB29OKr6F/yL7fR6A93l07j/AAxxpIJ/vtVYn+2tTbk/ZLXn bwQ7VRtrqQaPHZWw3SzyMDgZwtdHY2aWNkIUwSB8zY+8aBz91t9WUPCn/IMf/rsf5Crmo2H2nbNC 3lXUfMcg/kfaqfhT/kGP/wBdj/IVNql9KkyWVoCbiXqw52D1o6ilf2jsY1xqobU7W4mTDwArIFOQ Tz0rY0+1e6lGoXhDOR+6QHKoP8azbjTbeDV7G227ldTvJ6seeau2s76XeLYTFmt3/wBTIe3tQXOz Xul7Vv8AkF3X/XNv5Vn6Pqllb6ZDFNcKrqDkYPHJrQ1b/kF3X/XNv5VR0XT7SbS4JJbeN3YHLFeT yaDONuTXuWv7a07/AJ+l/I/4VW8UnOlAj/nov8jV3+yrD/n0i/75ql4p40of9dB/I0BDl5lYni1n T1iQG5XIUA8H/CqOu6lZ3OmvFBOHcsDgA+taMWl2JiQm1iJKj+GqGv2FrBpjyQ28aOGHKjnrQOPJ zK1yTV/+RaX/AHI/6Vet5kt9IhmkOESBSf8AvkVR1f8A5Fpf9yP+lU3L6q1pp0RIhjiRpXA6Hb/n 8aBqN4/Mimje+sLzVLjPPywocHau4f8A6vzrUMby+F1SNSzmAYA71JrcaxaHOkahVVQAB25FTaY4 j0e3duiwgn8qBOV438yrod3aLp0cfmJG6cOrEKc1Nql1btptyqzxEmM4AcZNZtjp6avLJeXCqsRY hVQYJ9zU2oaHYwWM8saMHRCR8560Dajz+Zd0D/kD2/0P8zSeIP8AkDXH0X/0IUugf8ge3+h/maTx B/yBrj6L/wChCjqR/wAvPmQafq1hFYW8clwqusagjB4OPpTdV1Wxn02eKK4VnZcAYPNS6dptlJp9 u720TM0akkr1OKZq2nWcWmTyR20auq5BC8igr3ObqWtF/wCQTbf7lVNRIvdYtbMHckZ8yQbcj2B/ z3q1o5C6PbsegjzWLZJqVzcz39i0eJGK5f047flQEV7zZoWeLPxBc2/yhLlRKnJJz3/9mNbFcxqE WqxmK+u/KYWzBhtOO444rpIZVmhSVM7XUMM+hoFUWzMfR/8AkNan/v8A9TV/Wf8AkE3P+4aoaP8A 8hrU/wDf/qav6z/yCbn/AHDQEvjXyK+nzfZ/Dsc2M7Ii2Pzpnhy3H2VruRVM07E7++M/pzmn2MJu PDiQqcF4iAfzpvhyfdY/Z3wssDFSvfGf8c0De0rdzW69aw41XTfEIhhAEV0udg/hPP8AgfzrcrEy L7xIjwkFLVMMw5BPPH6/pQTDqGp/8jFp/wBP8a26xNT/AORi0/6f41t0BPZEV3N9ntZZsZ8tC2PX FZnhy3BtmvJVUzTuTv74z+nOa0ryE3FnNCpwXQqD+FZ/hufNibZ8LLAxUr3xn/HNAL4HY1uvWsNV XTvEKxwgCK6XJQfwn/Oa3KxGIvvEcbQkFLVfmYcgnnj9f0oCHUjuLiK18UGSdwieVjJ+lXpNb04R sfPD8fdCnmqU0MVx4pMcyK6eVnDDjpWkdKsCP+PSL/vmgqXLpfsUvDcEiR3E7R+XHO4aNfQc/wCN bNYmisbfVLuxRy8KDcuTnHTj9f0rbpMmp8QUUUUGYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBmal /rh9Kms/u/hTL9AzsT1AzT7PhR9KAJ1+/UMn/IQh/wB01Mv36jmhd545UcLt4OR1pomWxn30DTao 2C6gWx5Xvz0qmtrNKLVPLYL9lG/j0ycfniujpapTsHLcwZFmOnw27W8p/djaU/vehpJLG6N2LkIf MiVMAdG9a36KOcOUw5bW6ZpoRCds0qyb88AU6TTJHE7eWvmNOGUk/wAPFbOaM+9LmYWRjnTbnzft Ib979oMmwnjb0/PFSRabKq228rlHd3x/telamR6im+bH/fX160czCyMyDTLgNGsjp5cO7Zjqc+tT /wBnk6WLRn+YdGHrmrnmx4zvGPrSGeIMBvGTRdhoZ50uSSOXzZwZZCp3AcDFO/sr5B+/YS+b5pcD vjFXhPGX2Buako5mCSZnrpMaj5ZXDbGUt3O45Jqe3sorSRpIsgFQCvY471ZpaV2x2KtkSxmfaVDP kZFWqKKG7glZBRRRSGFBGRg9KKKAMibRWSZprC5a3Zj93+H3qMaLdXEi/b70yxr/AAr3rboouX7S RBPbB7GS2iAQNGUX0GRimaZatZWMdu7BimeR05JP9atUUE3drDJkMsEkYOC6lc/UVV0+we0002rO rMd3zDpzV0UtAXdrGTo2ijT5GllZZJOilew71rEZBFFFA5ScndmbpthPp+nyQJJG0rMWViDgcAf0 p+l6c1mZJZ5PNuJT8z1fooBzbv5lC6sHn1S2uw6hYRgqep61NqFml9atC52nqrDsas0UBzPTyM9L O6bTJbS4mR3ZCquM/rVGHSdUgiWOLUFRF6AA8VvUUDU2jE/s7WP+gkPyNWtQ0+a80yO2aVfNUqWc 9CQK0aKA53uJGu2NVPYAVU1aza+smgRgpJByfarlFBKdnco3tg9zpQtFdQwVRuPTjH+FGkacunW2 zhpGOXYd/Sr1FA+Z2sVtStmvLGW3VgpcDBPTrmoZLKU6OtkjqH2BC3OKv0UApNaENlbi0tI4Ac7B jOOtF7CbmzmhUgGRCoJ7VNRQK7vcrabbNZ2MVuzBigOSOnXNGpWrXljLbowUvjBPTqDVmigLu9yG zhNvaQwsQTGgUkd8Ckv7drqylgVgpdcAntU9FAX1uUBZSro4s0dRJs2b+cVPYWos7OOAHO0cnHU1 YooG5N6EdzCtxbyQtwJFK5x0z3rPjsL2LS0tYrlUkR8iQZ5Xnj9a1KKAUmtDP0jTTYJIZHEk0hyz VZvoDdWcsCkKXXAJ7VPRQDk27lfT7drSyigZgxQYJFVb3R0mlNxbSNb3HXcvQn3FaVFAKTTuYn9l alL8lxqRMZ+9t61pafYw2EAjiGT/ABMerGrNFAObehQu7B59TtrpXULCOVPU1foooE22FZt7pEc8 puLeRre467l6E+/6VpUUApNbGJ/ZWpS/JPqRMZ+9t61o6fYQ2EHlxDJPLMerGrVFA3NtWMi+0q6m 1E3drcrCSoXoc1H/AGbq54OpDHfituii4/aMqadp0WnxkJlnY5Z26mrdFFBLbbuwooooEFFFFABR RRQAUUUUAFFFFABRRRQAUUUUAU7n/Wn6Utt1NJc/640tv1NAyVfv0+mL9+n0CK9w0odRHnGOePyq IecehkwORnj0/wDr1YedUlWMgksRSPOylgEzhguc9TVozdr7lb98+QnmZPrT/JnIwSSPTNP+1Ejh Ofc0LcuWA2qBnBp3ZNl3GyW7lmCjjsc9vSkFvOBtBABGDk/WnyXLCRkAAwcAmmG6l6ADkDBx+f6U LmD3SRbdgkqkj9509vakeBymQE3YxgD3pjzyqG5PP3cD6/4Upmn6gHHbA60WYXiKLYlyGIAIOfrT vsxWPapzgYA6VHF5zTIXB46nFXaTbQ4pMrx25WQMW4GMAdzViiipbuaJJBS0lLSGFFFFABRRRQAU UUUAFFFFABRRRQAClpBS0AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAB RRRQAUVjJrMgtr15ljSSBtqLg8+mRUj6pIZdPWFEdbn75weOmcfrQX7ORq0VmjUmXVri2nCJDHH5 isQcnABP17/lVY61MdIS6jSNpjL5bJg4HXH6YoD2cjborOutQlg1G1gKIIph8zNng+lRDWN8V+0e xjb8oMHkepoDkZrVTu7i8il229j56Yzv80Lz6YNS2E0lxZRTSqEd1yQBjFVdfuRb6XL03SDy1B75 6/pmgUV71g0zVTe281xJD5MUX8W7dnAye3bj86gGut5a3D2bLZs+0S+YCf8Avn8KmsLMQ6EIGIQy REuxGMFh3+nT8KwBcxzaVb6fyh807pWHyjk/40zWMYtuyOjvtSFs8MUMRnnm5RM7Rj6miw1EXUks MsRgnh++hbcAPXNUNYZLXUNPuGbcE+UqoySPWk0grc3N/dqwBkBHlfxD60C5Fy3JG18hmkWzdrVZ NhmDf0/+vV3UdRSygjdE895WAjRT973/AM+orno5ox4angLgSiUEoeD1H+FW9RYRrokz5EabSzY4 H3T/AENBTpq+xqafqJu5poJoDbzxHlC2cj1H+fSrF9c/ZLOSfZv2DO3OM1lWjpJ4quWjZWUwjBU5 HRava5/yCLn/AHf6igzcVzJFWLXH3wG5s2hhn+5IH3D+VW21DGrrY+V1Tdv3f0rBjlOpRWFnbRsW gwzseAK0H/5G2P8A64/0NBcoJdO5eg1DztUnsvKx5S7t+7r07fjV2sSx/wCRovv+uY/9lrbpGc0k 9AooooICiiigAooooAKKKKACiiigAooooAKKKKAKdz/rjS2/U0lz/rjS2/U0hkq/fp9Rr9+pKYhh iQyeYR83HNJJCrjB4y24+9SUU7isiNYUDE4znAx6U8Io6KKWlouFkIVU9QKMD0FLRSHYTFLRRQAU UUUAFFFFABRRRQAUtJRQAtFFFABRRRQAUUUUAFFFFAAKWkFLQAUUUUAFFFFABRRRQAUUUUAFFFFA BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHMSW7TeIZ7aRPkmYM2Tj5RzxRpcMqeIRCRlbcMox/CvO P510X2aH7R9o8tfNxjf3xQltCk7zpGolcYZh1NO5t7XS3kYGvrKNZgMag+dEYVJ6ZOVP/oQqG6s2 tdZtrSBf3JkWVFzk9s/+gmulltoZpI3ljVmjOUJ/hP8AkUNbQvOs7RqZUGFbuP8AOaLgqtkjI8U7 0jtZlXIjkyf0x/Ks3VLN7W2hZAAbkfvADnLZzxXVTwRXMflzoHTOcGkmtYJ1RZYlcIcqD2ouEanK kiP7RFZ2sAuXEeVC8+uOlZOtut1q1pZMwEanfJlsD/8AXgH862p7aG5CieNXCnIz2NRTabZzyNJL bo7t1YjrQTGSTuOuiLixuFhIkLRso2nPOOlcxJLE3huGBWBmEx+Udep/xFdVb28NshSCNY1JyQPW o10+0Wbzlt4xJnO7HegcJqJlaliLVdNml+WILgsemado7LJrl/JHzGejDp1rYuLeG5TZPGsi5zhh Rb28NsmyCNY1znCigOdctjE1e3hudWt7SKJEkc+ZJIBg4/zmtm7WH7LIbhA8SKWZSM8DmlW2hWcz iNfNYYLd6fLEk0bRyqGRuoPekS5Xt5GR4at8QzXm1U89ztVeigE/1zUuqXMN1o100EgcKMEjscit KONIo1jjUKijAA7VEtlbJC8KwqI5Dll7GmPmTlzM5+L/AEJ9MvF4WRBG+Oc/hVu4dYfFUTysEUxY DHpnBrWazt3gWFolMa/dXHSie0t7hFWaJXC9M9qB+0Tepk6Y6y+I72SM7k2Y3Dp2/wAK3Kit7aG2 QpBGsak5IUVLSIk7vQKKKKCQooooAKKKKACiiigAooooAKKKKACiiigClcMDOwB5AGRTrfqaztSd o9QZkODgVLbX6gHzEOfaq5H0IVRbM0F+/UlUF1CPf9xsU7+0U7Rt+dHIw9pHuXaKo/2h6RfrR9vb tGPzo5GHtIl6iqP22T+6tJ9rlP8Ad/KnyMPaI0KKz/tM3qPyo8+U/wAf6UcjDnRoUVn+bIf4zS7n P8TfnRyhzl+kzVLDnufzpdh7mlyhzFzcPUUm9f7w/OquwUvA6AUcocxZ3r/eFHmIO9Vs0lHKHMyw Zk9aTz096r0lPlQuZlj7SvoaQ3Sj+E1XNNNPlQuZk5vP9j9aab1uyD86gNNNPlQuZk5vZP7q003s v+z+VQmmmnyolyZKbyb+8B+FNN1Of4z+VR4zR0qrIlyZf0+SRy+9iauVR03+Or1Yy3N4fCFQX12l latPIrMq44XrycVPWZ4k/wCQPN9V/mKk1irySK//AAksH/PtP+Qqa016G6uo7dYZUZ+hbGOlXtP/ AOQfbf8AXJf5Csu+/wCRosf+uZ/9mpmi5XdWNuiqep6gmnwqxQySOcIg7ms7+0NajQTyWKmLqVA+ bH55H5UiFBtXN2iqltqMNxYG85VFBLgjkY61mpqeq3hMljZKIexk7+/UUAoNm7RWXYanNdxTxPB5 V5EmRG3G444ODz1/mOapXOp6zatGs9vAplO1O+T+DUWGqbbsdDRWfYTaiTI2owxxIq5BQ5+vc1U/ tTUb0s+m2itCpxukP3v1FAuRm3RWXp2pzvdtZ38IiuOq7RwwqC51HUTqs1pZQwyeWA3zcHGB7j1o D2bvY26KwZNV1OxKvqFonkscZQ9D+Zq5quoS2htPJCkTPtbcO3H+NAezdzSorO1XU/shWC3Xzbp/ up1x9ale6ez083F+V3gciMcZ7CgXK7FyisRb3W51EsFlEsTDKhzzj8x/Kruk6j9viYOhjniO2VCO h/yDQNwaVy9RVbU7h7SwlnjCl0GRu6dayob3XZ4lljtYGRxkHIGR/wB9UAoNq5vUVk6TqF3c3s9v eJGjRLyEHf8AM0/VNUa1lW2toWnuXGQoBwB6+9AcjvY06Kwm1TVLIh7+yXyT1aP+Hkd8n+lbcUiz RJJGco4DKfUGgUotFTU9Sj05Y2kR33kgbao/8JLB/wA+0/5CjxH/AK2w/wCu3+FbdMv3VFNooafq 9tfP5abkl/uOOav1gX/lHxHafZv9aD++2f1/CtHVNSWwWNVjaWaU4SMd6BShquXqXqKwTqOswRrP cWKGHGSF4IGO/Jx+IrWtryK4sxdISI9pJyORjrSE4NFiisMarqV65bTrNTCOjSfxfqKs6XqclzM1 tdw+RcKM4PG76A0A6bSNOism/wBVmW6Nnp9uZplxuJHC/wCfWoo9VvrW4SPVLVY45GAEin5Vz6nJ H60B7N2Nuis7Vb+WzuLOOIIRPJtbcO2R0/On6xf/ANn2ZkXBkY4QHuaBKLdvMvUVk2+pzy6HJesq eaucAA44q3ZXZl02O6nKrlNzY4AoBwaLdFY2javNqF7LG6oI1UsuBg9RjPNbNASi4uzCiiigkKKK KACiiigAooooAKKKKACiiigAooooAwtUGb9h7Cq8fWrOpf8AIQP0FV4+projsckt2PHWnAUig5qQ LVEjcgMATyaduX+8PzpkiIXwzkbhyKb5VsDy360ikTrz0p4U+lNg2BNsZyBUoqWUgCeppwUe9IKc KRSFGPSnZpopwFSMM0c015I4hmR1X6mqc2s2cXAcyH0UUFWL2KXFYM/iF8HyIVHuxzWdPqt7Pw07 Aei8CiwWOwxSYrj4NSvIP9XO+PQ8itGDxDMABNEj+pXg0WY7G/ikIrPh1y0k+/ujPuMirkVxBMP3 cqN+NFmIcRTSKkIpCKBERFNIqQik25qhMjxRt9akIA6Uw0yWMNNNPNMNNEMvaZ91/rV2qem/6t/r VysZbnRD4QrH8TSH7EkCAM00gG3vjrx+lbFcsq6jqWoyzQvGTauVXf0HJxxj2pI3prW/Y6aGMQwx xKSQihQT14FY99/yNFj/ANcz/wCzUeX4g/57W/5D/Cqd9b6tC41GeSIvAuAVx0+mPeguEdd0WtV2 HxBYeZt2453dOprcbG07sYxzmsuS0OraXbSSSbJwodXA6H6VXNnrciCB7pBH0Lg/NiglpNJX2Mwb f7K1LZjb5y4x0xmun03YNOt/L27fLH3emcc/rUdtpsMGnmz5ZWB3nuSaz00/VrLMVlco0PYP2oKk 1PS5rqLb7U5URfaMfMRjfjjr39KyvEX/AB8af/12/qKtaVpr2jyT3MvnXEgALHsPTP8AnoKTV7Ga 8ltGi24ik3Nk444/woJjZT3L1xMtvbvM/wB1Bk1jR3OsakvnWnlW0OflDclvzB/pWzcwJcwPDJna 4wcVjRWWs2i+TbTxGFT8m7rj8qAha3n5kFqt2niWEX0iSS+WeV6YwfYUkqXj+JLsWEiRybBkv0xh fY+1WbHSbyHVku55VlBBLHPOSOlFzYakurT3dk0SiQBfmPbA9vag05lffoVdSttTEKy6lItxbxtl kjbb/SpNfl8+10+W3BBdsoD17YqWSx1i8Ahu54xAx+fZjOPyqxqOmPKllHbbQluwzuPbj/CgXMk1 co2KSaZqym+G9rhcCY9FbuM1r6pfrp9t5pXexO1VzjJpdTsUv7RoiBvHKMexqmdNuLrS1trwhZYj mORWz+dBN4ys2RquvzqJVlghDDIjI+7+hpnhoSC81ETENIHG8joTls09bfXmURvcRKpG0sOSB69O tS6Fps+nPc+cysHI2kHrjP8AjQNtcrWhPrv/ACB7n/dH8xUmj/8AIKtv+uYpdUt3utPmgixvcADJ 4607T4Wt7GGGTG5EAOKRnf3LeZm6Z/yMOofT/CmWOz/hKLzdt3bflz1zx0/CrdlYzQatd3L7fLl+ 7g80mqaW9xMt1aTGG4UYznqP6Uy+ZXt5FnVth0u58zbjy2xu9ccfriq/hz/kDQfVv/QjVR9O1W+I jvrlFh7iP+LkVtQxJDCkUYwiAKB7UEuyjy3MXxQgkNkhyA0hBx+FO/4Riz/57T/mP8Ks6vYzXklq YtuIpNzbjjjitKgfO1FJMqWGm21gpECncRhnY5JrNu9n/CV23mbceXxu9fmx+tbtUNU00XwjdJDF PEco47UCjLXUuybDG3mbdmDu3dMd81y9l/yLV/j/AJ6f/E1cay1q4jEE90ixYwzKeSMd/WtW2sYb eyFqoJjwQc9TnrQUmoLe5Homz+yrfy9v3Odvr3qfFt9qziL7Rjrxvx/OshdN1OxYpp9yphPRZP4a taXpssE7XV5L5twwx67fxoFJLV3Kvh3Z9svz8u/zOPXGT/8AWrXuhbGMfaxEUzx5uMZ/Gs6+0u4F 2bzTpvKlbG5T0ao00y/vLhH1OdWijYN5a9GxmgbtJ81w8Qf8fmmf9dv6rSHdqU092eLe3R0iHPzH H3qm1/Tp9QEH2fb+7LZ3HHXH+FXI7QQacbWLH+rK/UkdaA5koruY9l/yKc/0b+dELyXVhZ6bAcb0 3Svz8q56fjVy302ePQZLNtnmtnGDxzTtC0xtPiczbTM5xkHOBQU5LV+ZX01Fj8SXiIMKsQAHt8tb lZtrYzRa1c3bbfKlXC4PPb/CtKkZTd2FFFFBAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBial/wAf 5+gqGLqam1L/AI/z9BUMXet47HJLdjx1p4pg61IKokhl8rzP3gOcdaT/AEYcHnNTlFbO4ZzwaFij HRBSuWhscsKttTOSasimKijkKPyqDUL1LKHceXP3V9aTKSLLOiDLsqj3NVZdWs4eDLuPoozXMzzy TyF5WJJP4VHUmljem1/tDD+LGqU2q3k3WXaPReKzwM08AnoKtIewrMznLsWPuaSpY1wORTjGCc1p ymbqJMrFcmja3PBq0FA6CnFGwMKevpS9mS6vYp7T34pQMVaI9RTTGp7Yo9mNVV1IKASDkHH0qxgA YxmoSjDtxQ42HGomTQ6hdQ/cmbHoeauxeIJl/wBbGr+44NZLD14plZyNDpoddtH/ANYHjPuMir8c qTxiSJgynoRXFVp6Lem2n8qQ/upP0NSJo6I0w1IaYaZmxhpppxppqiWX9N/1TfWrdVNO/wBS31q3 WMtzohsFVLDT0spJ3V2bzm3HI6df8at0VJd3sFQ3tst5aSW7MVDjqO3OamooEnYitYRbW0cKksI1 CgnvUtFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBiakCb9seg qGLvU+o/8fz/AEFQRdTW8djlluyRfvU8Uwfep4pkjhThTRTLm5jtYTJIfoO5NIpBeXaWcO9+Sfur 6muZuZ5LiRpJDlj29KddXMl1MZJD9B2AqKnY2SsMANOWMscdqcFJbGKmVQowKqMLkTnZaDVRU7fj UqoxOFUn6CpbeDzDlh8o/WrqqU4H3f5VpsYNtlIW0m0kjGKYiFnA2n6VpMcDOO9FFyRiRIo4QA0/ HIPYUUZO4j8akBu1X4dBn3FUZY2MpCxkY7DmtE0lNMCj9kcqCOvoajaGROqmtKjPb86fMBlEDuAa ryRhWyOhq7cReXJwPlbkVWd0OVJpSs0aQbT0INtKBgU3camRVkXIJFZpJvQ6HJLc3dHvfPh8mQ/v EHHuKvmuVjZ7WVZEYbga6W3uFuYFlTv1HoaTViH3Q80w040w0EM0dO/1B+tWqq6d/wAe/wCJq1WE tzohsFFFFIoKKKCQO9ABRTS4pPM9KAH0VHvNLuNAD6KZuNLuNADqKTdS5oAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKAMTUv+P5voKgi71Pqf/H63+6KghBJ+UE/Sto7HLLckX71SChLadjk Rn8alFnN6D86d0Ci+xBNOlvEZJDgD9a567unu5i78D+FfQVpX+mancSbvLUoPuqGrMmsLyHPmQOB 6gZo5kaxjYhp0Zw3TNMUHoetTou0e9aR1FNpIdS06NDIwAq+sKBQuAcVo3Y5SO2lL5XaFAAxip6T IU46U6oAa/A3Z6djVeS+VThVyfemXlx/Cv4VNolhHdSu1wCQmPl6ZqJSsdUKSteRVN1PKdsYP0UV KljqDDeIX/Gta51G009zDHDh17AYqOw1ea6vVRoSIm4yB0qOZ7mqSRlJcXClgUY7PvDHSp4bsPjK 9eM1o6oZbK6S6hAKSkJKpHB9DWbqSRwai6RqFRgDgdjVRlclwjLoWu+etIeuajgffHz1HBp0jrGu 5jgVocbVnYzb+SUoQ2QM8CqI6c1b1G4aQKMYXPSqW4kjArOe50U/hHUoJHQ0g56DNISwfBGKg0JA ecscmr2l3f2ebax/dvwfb3rOoquYLHXE00ms7SbzzI/IkPzoPlPqKvk1SOeWhqaeQLYfU1YLqO9U rL/j3H1NT5FYS3OmOxKZB2pvmGo80ZqSh5c03NJSgUALRRiloAKWijFABn3pf1pPwo+lMB2aWm/W ge1ADwaWmZpVPOKQDqKKKACimlwKTeaAH0VHuPrS5PrQA+imZPrS7qAHUUm6lyKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACmlwDgcm opplSNndwka9WNc1qevSS5is8xRf3/4m/wAKaVwNXULiwt5jLdSbnI4jXmsubxEw+W0t0jX1brWI SSSSSSepNA9atIkuy6vfS/euGHsvFQG7uT1nk/76qHvUrQ4TOee9aKIm7D0vrpOVuJBj/aq1Dr19 F1kEg9HFZuaCOKlodzcTVdPuyBe2ojb++lPm0kPH51jIsyemea5+p7S7mtHDwSFT3HY0RbWxMoqW 5o2nyl0ZcOD0NWDz2qe0vLXVSFkAhu8Yz2aq8xaC4MM0ZVux6g1opXOecHEWmXBbyW28Y6/SpKOo welUQnZmWu0XkZkPybgSfatvc9tq4n4NtOAoYdB6VjXEZAKgZKH8xUIuZRGIvMYIDkKaykjvWqud XeW9mrfabpFJAxk9Koy65bwjbbRZ+gwKzbrVbi6g8l9oTAB96okgdaSj3CxvT6vb3GnFJQTK68qO xrGQNLJliT6k1GoZ/uKT71oWkIH4daqMRSairk8CbFz0JqHUQxhDZ4U5q3SMAVIIyCORWhxc15XZ kLtdMnBFPt7RpScLtQfrV6PTggGFyM55q+sQVcYpSehcdHoZK2AHrVa8spFYNGpYAc1vEADNRSYZ SPWo1aLvZnM0VfFgFn+YkxscDbyc1fGn26xsoj5IxuPWkotlOokU9HhJlaY9FGB9a1SaigiFvEsa 9B+tOLVaRhOV2adof9HWp+agsj/oyVPya55bnXD4UGKUAUlLmpKFpcU3Ipcj0oAXApQBSZ9qX8KY C0tICKXrQAUvFJijOKACj6UtIaADPelzTe9L0FAEmeM1C8v5UOxI2imhQKQCZY9Bj60u1u7U7NGa AE2+9Gxv71OzRmgBuHHfNLuYdRTsiimA3zB34pwYHoaTaD1FNMQ7cUASZpcmosOvQ5o8xh1FICbd S5FQiRT7U4EHoaAJKKZS5NADqKTdRuFAC0UZooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKr3E6RxtJK22JOp9akkP8IOO5PoK5PXNR+1TeTEf3EZx/vH1qoq7Ah1XU5NQlwMrA v3U/qaoHnvTlUswA71J9nORz9fat1Ehsjji3nJ4A61OYYx/D+tPACjA4AqeK2MiZY7fQVaikZORV 8tP7op3arYtU/vNUHlnztu049KrQm5Fgeg/KnDhT+VXPs8Q/h/WiW2QrhBtYCi4rmZJF/Eg+oqGr pBU4IwRSAAZIHWpcTRTKgJBBBII5BHauj0y9TVIhbXWBcoPkf+9/9eudc5YkcUI7xSK8bbWU5BHa smabo6B1aORkdeV9aQZyeB7VZWVNUsEu1AE0fyyCqwFXF3RyzjysRkV/vAH3qJ7VHH+IzU/fHeiq EpSWxnSWKrzyB/sn+lSQ2JPKQ/8AAnrRt1LSZdcAVbqG7HTCo2tSgmnE/wCsf8Foktkhx5fBPer5 NV50LEEdRSTZM3dEIFFKYS4+f8MU1AwfaefQ1dzCxYh3YJJOKcTTc4GBUcj4FRuaLRCM26THoKRk VxhhkGkTBckcjAqTFXsZN3ZDDbRQMWjXbnrzxTDewiUodw9GxwasPGsiFG+6wway30+aGOX94PKA yPU0FxSe5OuoRStjlewzUxNYg4ORxWnAz+SpkOSaaFVio6m7Zt/oqD2qbJNQWf8Ax6x/Sp65ZbnX D4UKKUUlLSKClHvR0ooAX8KXikFLQAv40fWkpQaAFBpwwaZ16UA4+tADulLRnIpB1oEKBTWNKxwK hLE/d/OgY4mm71Hf8qBGDyxJp4UDoKQDfMHoaPMA7Gn4oA9aYDRKnoRTgyHoaUqD1Apvlr24oAdj 8aOaZsI5BpMyr7igCTNGajE3ZlxTwynoaAHdaTmjFFACFQeopvlj+EkU/NGaAGbZB0bNKGfIBFOy KUUALRRRQAUZopKAHbjSg5ptFAD6KQHNLSAKKKKACiiigAooooAKKKKACiiigAooooAKCcAk0UyX nC+poAydevTa2RVTiWbgewrkx9a0NeuftOpPg/LH8q1nqCWAFaxJbHxhmcbeD61bpsahFwPxNWLe HzDk/dH610JWMZO4yEKZBv8AwFXehqNbZVk3g8A8CpDQZsBycn0pKR5FROai+0r6GkNRb2JqXPHv UMdwrEjp71LTE4tblS6JMu38qiZShwwwa0MA9QKbIiyLhvwPpTuFzMkjD8jhv51WbIOCORV51KOV Paq1wvzj3FZzXU2g+he8PXf2e/ETH93P8pHv2qfUy8Ny0IyoU9j1FYoJVgRwQciuh1fE9va3i/8A LRMGohpIKivG5StQfNDBwPUE9a0BwQR2rJqRJZE+6xrdo5jZjkLE8Yp+ayG1IwRAlAzMcD0rP+23 AlaQSsCxzjtWMtGbwTaOhmu4YeJJFU+neiG4juI98TZGcVzM0rTymSTlj1q3pM4hlcSOFQjofWpK a0N2kOKaHDDIOQaQmqsZNilqrzPgVIzVm31x8xiXr3NMFq7E0sk0ThkztIB6cGrlrI8se51A9Md6 xEvJ412+ZkAYwadaam9tGycPk5Ge1NyH7Nm9uUNgsAT2Jpl7xZyk/wB01gX18bhkYLtOOcVYtbiW SB4nLFWGOTSTuwcOVXZFBF5jZP3R+tXx0piKFAAGAKkrVI5KtTnZu2aj7LF/uip8e1VLecrbxgL0 UU77S/YCuOW56cPhRbx7Cmv5mR5YX8arfaZPaj7TJ6ikUXOfQUv4VTF1J6A09bz+8n5UAWcD0o2+ lMS4jfo2D71L7igBhGOooAzUn1ppXuKBDe1HX60vX6/zpO9ACrTulIBjmmu1ADXOfpSA+gqMyEn5 RmjbI3VgPpQMl5o/Go/K7liaXy/c0ASc0vNReSeoY0bJV6NmgCXJpc+oqLe6j5hml81cfMCKAJOD S0xWVujCl5FACkA9RTGjU+1PzjrRkUARbXB+VqXzHX7y5qTFFADBMh68U4FT0agordRTDAvYkUAS Yp1RIhVh83FS0AFJRRQAUUUUALSUtJQAU8N60yloAfRUdEZJc+gpASUUUUAFFFFABRRRQAUUUUAF FFFABVe6k8tJH/uITVis7V226fdH/ZxTQHFsxdyTySc1JAMSio6khz5gPat0tSHsWQoz6VogbQFG MCs7vWgrq/3SDitWc7HAgZpsjBVyaKp35KpxxxSY4LmdiGV5LmXZHzS/YyPvsc1PZp5VqHH3m70p OevNRqy51eV2RSaNoW3Ic+1XLW5DjBqJgQSPxFQwjbc4pRbvYtNTRq0vG3NJTJmKRkqMn+VanOVb n/XGqlx1Wp2YscscmmnbnnFDWhcXZlStxWMnhdSDzFJisRsbjt6dq2bHnw1dA9n/AMKxZvuZqzn+ IZ+lSLKh74+tVgrsMohIHep7e281S7jA6LWnMzKUYkc04kjMe0cNkNUFE4MLlNwY+1NjbI+bqKyb uy0rLQdSMcDNIXUe9ICXOQOlK4zZ0q4aSPyimNg6irxNUtGiMcDSyZBY45rS8iWUAgBV7ZNaLbU5 pq70KzGse5hkSQtjcCc1vSWjKpZ5FAHU1nSnJHl4ZffjP0p77BHmjuZhgdj8xxUSxE1tNarNCfLY 5PH0rO+x3CzBAvXuOlZ2V9Toi29yMKMquMtWlFGEUCrVlpkayCRwWOO/StaO2iH/ACzX8qpTSM6t Nz0TMUD2pwjc9FJ/CuhjjQdEUfhUo9qHW8jJYTzMqMYjUEHOKWqlxqUSSuoDsQT0FV21X+7Efxas GztSsrGnn2o/Csn+1JO0Q/OlGqP3i/I0rjNXNFZyapGfvKy/rVqK6il+6wP86YFipI53jPByPQ1C CD0paBGlDOso44PpUtZKkqcqcEVoW8wlTn7w60ASMO4pAOc0+kOAKBDXbAqDBc89PSpG5OTTSyr1 IFAxQKcBUfnRj1NH2hPQ0AS4FHFRi4T0NOE8Z/ix9RQA8Y9aXFIGVuhBpohUSbwXz/vHH5UAOwc0 0qG6gU/n1o+ooEQtAp6EikCSoeGyKnxRg0AQ+cwOGWlE0Z9jTiOORTTGh6rQMfwejZo5qIwD+FiK TbMn3W3UATZNGah891++lPjlV2xg5oAlAooooAKKKKACiiigAooooEFLSUUDA0Q9CfU02Q4U1JGM IB7UgHUUUUAFFFFABRRRQAUUUUAFFFFABWbrIzpt0PYGtKqd/H5lvcR/3ozTW4HDVYjkXCqOtVzx 1p0X+sWuhMzkrlurVvCyNuY9uMd6q1oKflX6CtGYMM1U1AfJ+FXDUckauuD19aQ4NJkNgwmtvKz8 y0MjqcFT+VVnSS2l8yIkEVaTWp9mGhQn1xiou0XOipu9xjqVG5uKqwZe43AcZp80892+H+VfQDir dvAIlHHNCTvcpJU0TZpaKK0MCndDEgx6VUuPur9atXLBpOOcDFVLg/KPrRLY0juQ1t2v7vwxMx/j krDz3ro57Sb+wLWCIZY/OwrnbNiPTmt7osixEbRnk9auNbxqOEFGmWX2WD5h87ctU118sZOKG7vQ lpJXOb1mFUmWWMcN14rNOGOeldWzoV5G72xVSTTLa5xIoKZHRapxM41DBVFyByxParMdnNJ0AUVq Q6RDGwLFpG7DpVq4i+y22cfMeOO1LlsVzJlIyyggF/ujHFSC7uP+erVX3L6n8qN6+tb2Rjdk73M0 iFXkJBGCKiUAAAdqTzEH8Qp9GwaixO0SlUOATnpQZ7kONrIV75XkU0Mv94UoK/3h+dJxQ1Jo0LG5 ZphHJjnpgVqKK55WCsGDDIOetdBbuJYVcfxCsakbGtOVyZaeOtMWnVibHJTx5mc/7RqPyvatp7QF icd6jNmPSgdzI8uk8utU2QpjWR7UBczPLo2YNX2tHHao2gcdVpANgupYiAx3D361pQTrMuQazDGR 1FCbo23KcGmBsVJC/lyhu3Q1Xt5RKme46ipTTEatRTSBRyeKakoFsrE9qpuxkbcenYUAPeZnPHAp tJS0ALRSUtABRRRQAU4O6/dYikpKAJluXH3gDUi3SdwR+tVqSgC8ssbdHFOrO2g0qs6/dYj8aANC j8KprcyL1AapFu0/iUrQBPgUYpFkR/usDTqBCUiqASQAKdzRQAUUUUAFFFFABRRRQAUUlFAC02Rg kbMegGadVTVJNlmwHVuKaV3Ymb5YtlOyu57m6WNiCucnitsVjaHF+8kkPbgVs06lr6EUbuN2FFFF QbBRRRQAUUUUAFFFFABRRRQAGopPvKe3Q1JTH+ZSKAOG1OA21/LEegbI+lV0OHB7V0Pia08yJLtB yvyvXOgZ7E1qmSy7157VZt5wAEb8DVCHzQceW5HstW1trhvuwyH/AICa3TTRjKLLTOqnDMBTqrrp 97IQDC/1I6VoJp9zgAx9vWhtLqRysqsiupDUz7OnvWgNNuD1Cj8acNLm7ugqeePcpKfQz0iRWBxT 60F0p8HMo/KnjSR3lP4Cl7SIOEnuY88pjUEDJNQvcEx4HU9a3n0iBlw8jGmLo1lnG5mP+9R7SI1T ZzhOBk1Wkfec/lXYf2LYnrGT9Wp66RYL/wAuyH65qZVEzSMLHH2Nubu8igH8bc/TvXbuoyFA4UYF NS1trY74oURgMZA5pVOaxbuWkLtprRgjmpRRii4WKf2dFYsF5qqsTrM0arkHke1a2wUBAO1Wp2Id NMrwW4jGTyx6mpGhDfeGamxRUXbLUUiv9lj/ALi/lTTZxH+Bfyq1RT5mFkY+paeTEDbxruU5Ix1r NiSWZtkcbF+hGOldVimhFBJCgE9atVGkQ6abM+DS4REokjUtjk1J/Zdr/wA8hV6io52Vyoo/2Vaf 88/1q3HGsaBEGFHAFPopOTe40khMUvQE0UjcqR6g0hmJ/wAJDYbiG3jB9KeNd00/8tCPqKypNAl3 EjnJqFtBuB0FAG8NX01uk4p41DT26XCVzDaJcj+GoW0q5X+A0AdgLiybpPH+dOzbN0ljP41xDWNw v8DUwwTr2YUAdyYIH/iQ/jUTafC33WH4GuK/fr/E4/E0ouLleksg/GgDq4VSK8MSPlu6nrVwrisQ PeMLTULVPNYR7WB5q5HroGFvLOWI9yBkUAX2YlFTsKSkgu7O5H7mZc/3TwalMZHSgBlRyXEcX3m5 9BUjIX+UNg98VH9gU85yaAKsmpAfcjJ+tRNqc3aNRVxtOFRtpx7UAVhqs46xqaeur/34fyNK2nt2 qJrGQfw0DLkepWz9SV+oqykscg+R1b6GsVrVx1U1H5TKcjIPtQB0NFYkd1cxdHJHo1W4tUHSaMj3 WgRfoqOK4hl+5IM+h4qXFMBM0YFLSYoATFOV3X7rH86TFFAEouZB1ANOF2P4kP4VBRQBaFzEe5H4 U4TRno4qlgUbRQBeEiHow/OnZHrWdtoCkdM0AaVFVoZzwr/nVigQUUUtABWTrMuZEjHYZNa1c9du Z7xsc5bArSmtbnPiH7tu5saTH5dmpxy3NXaZCgSJVHYU+s27s3grRSCiiikUFFFFABRRRQAUUUUA FB6UUHpQAwmmk0rVGTQA043EMAVbqDTxFGv3Y0H0UVGxyMGlik52Meex9aAJRgdAKR2IRivJAJAp aKAMgX9z8rbt6jnO3GeAcfhUq3t1IBtj4Kk5CE/StLtjtRnA64AqrrsKxm/ab/eAICe+NuM/jT5j fEQhFcNg78YwKtm4iHWRfzpk15FFA0xYbF6mi/kBSaDUApbzG6ABQ2TnP+FObT7pi2bn5T0G4+ua s216k8CShHw4yABnvUnn+kMh/CndhZFUaaSSXm3ZORntxTrbThBOsvmElRjAGBVxTuUEgjPY0tLm YWFopKrzzfwIfqakYSSb2wOgpQcKSBnAqJBUy0wIBPc4GLcg5p2+8YnESL9TVkUuRRcCvtvGPLRq PzoME7Ahrjg8HC1OXQdWH500zxD+MUXAZ9mz96RzwAMHHanwxLCu1ST7mk+0R9sn6Cjz89I3P4UX AloqLzJT0iP4mj/SD0RB9TSAloqPy7g9XQfQUvkSnrMfwAoAfRTPs2fvSSH8aX7LF3BP1NAAXUdW H50hmjH8Yp4t4h0RfypfLUdAB+FAEXnJ2yfoKUSE9Eb8qmC0oUUARBKNlTUUAQ+X7U0wqeqirFFA FU2sZ6oKY1hCeqCrtFAGa+lQN/APyqpNoUDjhQK3aMCgDmToTxH9zK6f7rEUhsb9Pu3Uh/3uf510 20elJsX0oA5Zre/z8ywv/vRilRr9OPJTHszCuo8tfSjy09BQM5dodTmkDpJ5RHZB/P1qT7PrC8+e x+orpAijtS7RQI50S6vH1CP9Vp39oX6fftFb6Gt/YKQxA9hQBhjV2H+ss5B9DmnDWLU/filT6rWw bdD/AAj8qjazibrGKAM5dR09/wDlqB9Rinh7GT7s0Z/GrL6Zbt1jFQPots38GKAGmzt5Push+hqN tKU/dJpW0KH+FmX6Gm/2PKn+ruZB/wACoAifSXH3TSLbXsP3GJHpnNT/AGLUE+5dsfrRjVU/jR/q tAEYublP9bBu91qRb2E8NuQ/7Qo+06gn37eNvpSG+k/5a2P5UAWFdH+66t9DS4qobuzJ/eWjqfUC nLdWPaSWP65oAs0VGs9s33bsfjUg2t92aM/jTAKTFSCNj/dP0NHlv/dNAEeKMU/aR2NJigBuKnhl 2/K3SosUmP8AOKAL9AqtDLt+Vjx9KsigRHdSeVbyP6CsTTU86+Tvj5jW3cwpPEY5MlT6HFQWFlHb TO0ZY8Y5q4ySi0YzpuU0+hfooorM3CiiigAooooAKKKKACiiigAoPSijtQBGRUbLUxFNIoAqPkVA 71fZQahktw1ADILwH5JTg9m9atMyqpZjhR3rNls2/hpiS3Ntxjen900AW21OxXrcx/nUT61p46zg /QVTng0y9P71DbynuOKpyeHHPNrcxyD3601YWppnXdOXpuP0SopdfsHXa0LuvoQKyH0PUE/5Y7vo aYNHv8/8ezVaSDU1v+Ekt412xWrBR0GcCmP4nP8ADaj8WqjHoN+/WNUH+0atR6BHHzd3Sgf3VofK Goh8TXLHCW8eT0HJrQsp9TnHm3RjtoevK8mmwJa2vFla73/vvTzb3F026dzj+6OlQ2hj5dRMjGO3 Qkf3vWhElIzhRViG1WMYAqcR0gKoSX+8B+FOEcneQ/hVoR04JQBU8gnq7n8acLZe+T9TVoJS7aAK y2yD+AVIsKj+EflU2KXFAEYQelOCinYooATFLRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUU UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRgUUUAJgUbRS0UAN2Ck8selPooAiMCHqo/Km NZwt1jU/hViigCk2mWzdYlqFtGtj0Uj6GtOigDK/sdR9yWRfxo/s64T7l3IPrWrRQBlfZ9QT7twG +oo/4mC9VietWjAoAzPOuB9+0B+ho+0D+O2kH0rTwKTaPSgDN8+Dusi/UVMl5CFwJB+Iq2Y1PUCm mCM9UH5UAQfaIjzvX86mtuY9397mmm0hP8C/lU4AAwOgoAKKKKACiiigAooooAKKKKACiiigAooo oAMUhFLRQA3FNK1JikoAjK00xg9RU2KTFAFZ7aNx8yA1F/ZsOcqCp/2Tir2KWgCmtmy/dmkH40/7 M/8Az3f86s0YoAqm0B+87n8aVbKIfwg/WrWKMUAQrCi9AKeEFPooAbtpcUtFABiiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigDH+3XP/PT/wAdFH265/56f+Oiq9FcXNLufP8Atqn8z+8sfbrj/np/46KPt1x/ z0/8dFV6KOaXcPbVP5n95Y+3XH/PT/x0Ufbrj/np/wCOiq9FHNLuHtqn8z+8sfbrj/np/wCOij7b cf8APT/x0VXoo5pdw9tU/mf3lj7bcf8APT/x0Ufbbj/np/46Kr0Uc0u4e2qfzP7yx9uuP+en/joo +3XH/PT/AMdFV6KOaXcPbVP5n95Y+3XH/PT/AMdFH264/wCen/joqvRRzS7h7ap/M/vLH264/wCe n/joo+3XH/PT/wAdFV6KOaXcPbVP5n95Y+3XH/PT/wAdFH264/56f+Oiq9FHNLuHtqn8z+8sfbrj /np/46KPt1x/z0/8dFV6KOaXcPbVP5n95Y+3XH/PT/x0Ufbrj/np/wCOiq9FHNLuHtqn8z+8sfbr j/np/wCOij7dcf8APT/x0VXoo5pdw9tU/mf3lj7dcf8APT/x0Ufbrj/np/46Kr0Uc0u4e2qfzP7y x9uuP+en/joo+3XH/PT/AMdFV6KOaXcPbVP5n95Y+3XH/PT/AMdFH264/wCen/joqvRRzS7h7ap/ M/vLH264/wCen/joo+3XH/PT/wAdFV6KOaXcPbVP5n95Y+3XH/PT/wAdFH264/56f+Oiq9FHNLuH tqn8z+8sfbrj/np/46KPt1x/z0/8dFV6KOaXcPbVP5n95Y+3XH/PT/x0Ufbrj/np/wCOiq9FHNLu Htqn8z+8sfbrj/np/wCOij7dcf8APT/x0VXoo5pdw9tU/mf3lj7dcf8APT/x0Ufbrj/np/46Kr0U c0u4e2qfzP7yx9uuP+en/joo+3XH/PT/AMdFV6KOaXcPbVP5n95Y+3XH/PT/AMdFH264/wCen/jo qvRRzS7h7ap/M/vLH264/wCen/joo+3XH/PT/wAdFV6KOaXcPbVP5n95Y+3XH/PT/wAdFH264/56 f+Oiq9FHNLuHtqn8z+8sfbrj/np/46KPt1x/z0/8dFV6KOaXcPbVP5n95Y+3XH/PT/x0Ufbrj/np /wCOiq9FHNLuHtqn8z+8sfbrj/np/wCOij7dcf8APT/x0VXoo5pdw9tU/mf3lj7dcf8APT/x0Ufb rj/np/46Kr0Uc0u4e2qfzP7yx9uuP+en/joo+3XH/PT/AMdFV6KOaXcPbVP5n95Y+3XH/PT/AMdF H264/wCen/joqvRRzS7h7ap/M/vLH264/wCen/joo+3XH/PT/wAdFV6KOaXcPbVP5n95Y+3XH/PT /wAdFH264/56f+Oiq9FHNLuHtqn8z+8sfbrj/np/46KPt1x/z0/8dFV6KOaXcPbVP5n95Y+3XH/P T/x0Ufbrj/np/wCOiq9FHNLuHtqn8z+8sfbrj/np/wCOij7dcf8APT/x0VXoo5pdw9tU/mf3lj7d cf8APT/x0Ufbrj/np/46Kr0Uc0u4e2qfzP7yx9uuP+en/joo+3XH/PT/AMdFV6KOaXcPbVP5n95Y +3XH/PT/AMdFH264/wCen/joqvRRzS7h7ap/M/vLH264/wCen/joo+3XH/PT/wAdFV6KOaXcPbVP 5n95Y+3XP/PT/wAdFH265/56f+Oiq9FHNLuHtqn8z+8sfbrn/np/46KPt1z/AM9P/HRVeijml3D2 1T+Z/eWPt1z/AM9P/HRR9uuf+en/AI6Kr0Uc0u4e2qfzP7woooqTMKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD/9k= ------=_NextPart_000_05D5_01CF389C.CE4D2690-- From bfoster@redhat.com Wed Mar 5 09:49:08 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 5AD307F3F for ; Wed, 5 Mar 2014 09:49:08 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 31FAD8F8078 for ; Wed, 5 Mar 2014 07:49:05 -0800 (PST) X-ASG-Debug-ID: 1394034540-04cb6c5677299670001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7RsYFSOw0nz0FnSa for ; Wed, 05 Mar 2014 07:49:01 -0800 (PST) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s25FmxHB014327 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Mar 2014 10:48:59 -0500 Received: from bfoster.bfoster ([10.18.41.237]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id s25FmwQv015660; Wed, 5 Mar 2014 10:48:58 -0500 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7B79F12452B; Wed, 5 Mar 2014 10:48:57 -0500 (EST) Date: Wed, 5 Mar 2014 10:48:56 -0500 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace Message-ID: <20140305154855.GA55736@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: don't leak EFSBADCRC to userspace References: <1393825194-1719-1-git-send-email-david@fromorbit.com> <1393825194-1719-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1393825194-1719-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1394034541 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Mar 03, 2014 at 04:39:53PM +1100, Dave Chinner wrote: > From: Dave Chinner > > While the verifier reoutines may return EFSBADCRC when a buffer ahs > a bad CRC, we need to translate that to EFSCORRUPTED so that the > higher layers treat the error appropriately and so we return a > consistent error to userspace. This fixes a xfs/005 regression. > > Signed-off-by: Dave Chinner > --- Looking through again, I don't see any obvious cases where EFSBADCRC could slip through. The verifier users mostly call xfs_trans_read_buf_map(). The readahead case looks like it should be handled by the xfs_buf_iowait() checks therein. The one case I came across that looked suspicious is the readahead/read cycle for inode log recovery in xlog_recover_commit_trans(). This calls into xfs_buf_read() and ultimately uses bp->b_error directly in xlog_recover_inode_pass2(). That said, I don't see any crc checking in these verifiers and thus they don't source EFSBADCRC. Looks good to me... Reviewed-by: Brian Foster > fs/xfs/xfs_mount.c | 3 +++ > fs/xfs/xfs_symlink.c | 4 ++++ > fs/xfs/xfs_trans_buf.c | 11 +++++++++++ > 3 files changed, 18 insertions(+) > > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index f96c056..993cb19 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -314,6 +314,9 @@ reread: > error = bp->b_error; > if (loud) > xfs_warn(mp, "SB validate failed with error %d.", error); > + /* bad CRC means corrupted metadata */ > + if (error == EFSBADCRC) > + error = EFSCORRUPTED; > goto release_buf; > } > > diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c > index 14e58f2..5fda189 100644 > --- a/fs/xfs/xfs_symlink.c > +++ b/fs/xfs/xfs_symlink.c > @@ -80,6 +80,10 @@ xfs_readlink_bmap( > if (error) { > xfs_buf_ioerror_alert(bp, __func__); > xfs_buf_relse(bp); > + > + /* bad CRC means corrupted metadata */ > + if (error == EFSBADCRC) > + error = EFSCORRUPTED; > goto out; > } > byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); > diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c > index 647b6f1..b8eef05 100644 > --- a/fs/xfs/xfs_trans_buf.c > +++ b/fs/xfs/xfs_trans_buf.c > @@ -275,6 +275,10 @@ xfs_trans_read_buf_map( > XFS_BUF_UNDONE(bp); > xfs_buf_stale(bp); > xfs_buf_relse(bp); > + > + /* bad CRC means corrupted metadata */ > + if (error == EFSBADCRC) > + error = EFSCORRUPTED; > return error; > } > #ifdef DEBUG > @@ -338,6 +342,9 @@ xfs_trans_read_buf_map( > if (tp->t_flags & XFS_TRANS_DIRTY) > xfs_force_shutdown(tp->t_mountp, > SHUTDOWN_META_IO_ERROR); > + /* bad CRC means corrupted metadata */ > + if (error == EFSBADCRC) > + error = EFSCORRUPTED; > return error; > } > } > @@ -375,6 +382,10 @@ xfs_trans_read_buf_map( > if (tp->t_flags & XFS_TRANS_DIRTY) > xfs_force_shutdown(tp->t_mountp, SHUTDOWN_META_IO_ERROR); > xfs_buf_relse(bp); > + > + /* bad CRC means corrupted metadata */ > + if (error == EFSBADCRC) > + error = EFSCORRUPTED; > return error; > } > #ifdef DEBUG > -- > 1.9.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From lczerner@redhat.com Wed Mar 5 09:51:53 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 3ADCD7F3F for ; Wed, 5 Mar 2014 09:51:53 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BA02FAC009 for ; Wed, 5 Mar 2014 07:51:52 -0800 (PST) X-ASG-Debug-ID: 1394034711-04cbb054b6ab890001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZU93VMi6aODs11o4 for ; Wed, 05 Mar 2014 07:51:51 -0800 (PST) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s25FpmbV013219 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Mar 2014 10:51:49 -0500 Received: from localhost.localdomain.com (vpn1-6-48.ams2.redhat.com [10.36.6.48]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s25FpkuM022264; Wed, 5 Mar 2014 10:51:46 -0500 From: Lukas Czerner To: linux-ext4@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, lczerner@redhat.com Subject: [PATCH v2 0/8] Add tests for zero range into xfstests Date: Wed, 5 Mar 2014 16:51:31 +0100 X-ASG-Orig-Subj: [PATCH v2 0/8] Add tests for zero range into xfstests Message-Id: <1394034699-21187-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1394034711 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Hi, this patch set adds two new test for zero range into xfstests - generic/008 and ext4/001. It also adds zero range support for fsstress and fsx. Thanks! -Lukas Changes in v2: - fsstress print left over flag values - rework test_fallocate() to work properly From lczerner@redhat.com Wed Mar 5 09:51:54 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 080BA7F3F for ; Wed, 5 Mar 2014 09:51:54 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id AAA0FAC009 for ; Wed, 5 Mar 2014 07:51:53 -0800 (PST) X-ASG-Debug-ID: 1394034712-04bdf05dac2bef50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Q8ssgNanwTs2jFIs for ; Wed, 05 Mar 2014 07:51:52 -0800 (PST) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s25Fpq0l019666 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Mar 2014 10:51:52 -0500 Received: from localhost.localdomain.com (vpn1-6-48.ams2.redhat.com [10.36.6.48]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s25FpkuN022264; Wed, 5 Mar 2014 10:51:49 -0500 From: Lukas Czerner To: linux-ext4@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, lczerner@redhat.com Subject: [PATCH v2 1/8] xfstests: Create single function for testing xfs_io commands Date: Wed, 5 Mar 2014 16:51:32 +0100 X-ASG-Orig-Subj: [PATCH v2 1/8] xfstests: Create single function for testing xfs_io commands Message-Id: <1394034699-21187-2-git-send-email-lczerner@redhat.com> In-Reply-To: <1394034699-21187-1-git-send-email-lczerner@redhat.com> References: <1394034699-21187-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1394034712 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Currently there are several function testing various xfs_io commands. This commit creates _require_xfs_io_command() to test any xfs_command. Signed-off-by: Lukas Czerner --- common/rc | 72 +++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/common/rc b/common/rc index f2c3c3a..7f530d0 100644 --- a/common/rc +++ b/common/rc @@ -1296,12 +1296,43 @@ _user_do() fi } +_require_xfs_io_command() +{ + if [ $# -ne 1 ] + then + echo "Usage: _require_xfs_io_command command" 1>&2 + exit 1 + fi + command=$1 + + testfile=$TEST_DIR/$$.xfs_io + case $command in + "falloc" ) + testio=`$XFS_IO_PROG -F -f -c "falloc 0 1m" $testfile 2>&1` + ;; + "fpunch" | "fcollapse" | "zero" ) + testio=`$XFS_IO_PROG -F -f -c "pwrite 0 20k" -c "fsync" \ + -c "$command 4k 8k" $testfile 2>&1` + ;; + "fiemap") + testio=`$XFS_IO_PROG -F -f -c "pwrite 0 20k" -c "fsync" \ + -c "fiemap -v" $testfile 2>&1` + ;; + *) + testio=`$XFS_IO_PROG -c "$command help" 2>&1` + esac + + rm -f $testfile 2>&1 > /dev/null + echo $testio | grep -q "not found" && \ + _notrun "xfs_io $command support is missing" + echo $testio | grep -q "Operation not supported" && \ + _notrun "xfs_io $command failed (old kernel/wrong fs?)" +} + # check that xfs_io, kernel, and filesystem all support zero _require_xfs_io_zero() { - testio=`$XFS_IO_PROG -c "zero help" 2>&1` - echo $testio | grep -q 'command "zero" not found' && \ - _notrun "zero command not supported" + _require_xfs_io_command "zero" } # check that xfs_io, glibc, kernel, and filesystem all (!) support @@ -1309,54 +1340,27 @@ _require_xfs_io_zero() # _require_xfs_io_falloc() { - testfile=$TEST_DIR/$$.falloc - testio=`$XFS_IO_PROG -F -f -c "falloc 0 1m" $testfile 2>&1` - rm -f $testfile 2>&1 > /dev/null - echo $testio | grep -q "not found" && \ - _notrun "xfs_io fallocate support is missing" - echo $testio | grep -q "Operation not supported" && \ - _notrun "xfs_io fallocate command failed (old kernel/wrong fs?)" + _require_xfs_io_command "falloc" } # check that xfs_io, kernel and filesystem all support fallocate with hole # punching _require_xfs_io_falloc_punch() { - testfile=$TEST_DIR/$$.falloc - testio=`$XFS_IO_PROG -F -f -c "pwrite 0 20k" -c "fsync" \ - -c "fpunch 4k 8k" $testfile 2>&1` - rm -f $testfile 2>&1 > /dev/null - echo $testio | grep -q "not found" && \ - _notrun "xfs_io fallocate punch support is missing" - echo $testio | grep -q "Operation not supported" && \ - _notrun "xfs_io fallocate punch command failed (no fs support?)" + _require_xfs_io_command "fpunch" } # check that xfs_io, kernel and filesystem all support fallocate with collapse # range _require_xfs_io_falloc_collapse() { - testfile=$TEST_DIR/$$.falloc - testio=`$XFS_IO_PROG -f -c "pwrite 0 20k" -c "fsync" \ - -c "fcollapse 4k 8k" $testfile 2>&1` - rm -f $testfile 2>&1 > /dev/null - echo $testio | grep -q "not found" && \ - _notrun "xfs_io fallocate collapse range support is missing" - echo $testio | grep -q "Operation not supported" && \ - _notrun "xfs_io fallocate collapse range failed (no fs support?)" + _require_xfs_io_command "fcollapse" } # check that xfs_io, kernel and filesystem support fiemap _require_xfs_io_fiemap() { - testfile=$TEST_DIR/$$.fiemap - testio=`$XFS_IO_PROG -F -f -c "pwrite 0 20k" -c "fsync" \ - -c "fiemap -v" $testfile 2>&1` - rm -f $testfile 2>&1 > /dev/null - echo $testio | grep -q "not found" && \ - _notrun "xfs_io fiemap support is missing" - echo $testio | grep -q "Operation not supported" && \ - _notrun "xfs_io fiemap command failed (no fs support?)" + _require_xfs_io_command "fiemap" } # Check that a fs has enough free space (in 1024b blocks) -- 1.8.3.1 From lczerner@redhat.com Wed Mar 5 09:51:57 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DB2937F59 for ; Wed, 5 Mar 2014 09:51:57 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A3E208F8070 for ; Wed, 5 Mar 2014 07:51:57 -0800 (PST) X-ASG-Debug-ID: 1394034716-04bdf05da92bef60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id zHlYRC4VBl8coePj for ; Wed, 05 Mar 2014 07:51:56 -0800 (PST) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s25FpsPr013527 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Mar 2014 10:51:55 -0500 Received: from localhost.localdomain.com (vpn1-6-48.ams2.redhat.com [10.36.6.48]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s25FpkuO022264; Wed, 5 Mar 2014 10:51:52 -0500 From: Lukas Czerner To: linux-ext4@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, lczerner@redhat.com Subject: [PATCH v2 2/8] xfstests: create _test_block_boundaries in common/punch Date: Wed, 5 Mar 2014 16:51:33 +0100 X-ASG-Orig-Subj: [PATCH v2 2/8] xfstests: create _test_block_boundaries in common/punch Message-Id: <1394034699-21187-3-git-send-email-lczerner@redhat.com> In-Reply-To: <1394034699-21187-1-git-send-email-lczerner@redhat.com> References: <1394034699-21187-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1394034716 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Create new function _test_block_boundaries() which is testing content of the blocks after the operation such as zero, or punch hole. The test is doing the operation around block boundaries to assure correct behaviour of the operation on block unaligned ranges. This has been based on test xfs/290 which has been changed to use this new function. A small change to the output file was required. Signed-off-by: Lukas Czerner --- common/punch | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/290 | 40 ++------------------- tests/xfs/290.out | 13 +++++-- 3 files changed, 119 insertions(+), 40 deletions(-) diff --git a/common/punch b/common/punch index 9340d3b..f2d538c 100644 --- a/common/punch +++ b/common/punch @@ -566,3 +566,109 @@ _test_generic_punch() [ $? -ne 0 ] && die_now od -x $testfile | head -n -1 } + +_test_block_boundaries() +{ + + remove_testfile=1 + sync_cmd="-c fsync" + unwritten_tests=1 + OPTIND=1 + while getopts 'dk' OPTION + do + case $OPTION in + k) remove_testfile= + ;; + d) sync_cmd= + ;; + ?) echo Invalid flag + exit 1 + ;; + esac + done + shift $(($OPTIND - 1)) + + bs=$1 + zero_cmd=$2 + filter_cmd=$3 + testfile=$4 + + # Block size plus 1 + bs_p1=$(($bs + 1)) + # Block size plus 2 + bs_p2=$(($bs + 2)) + + # Block size minus 1 + bs_m1=$(($bs - 1)) + + # Block size multiplied by 2 + bs_t2=$(($bs * 2)) + + # Block size divided by 2 + bs_d2=$(($bs / 2)) + + echo "zero 0, 1" + $XFS_IO_PROG -f -t -c "pwrite -S 0x41 0 $bs" \ + -c "pwrite -S 0x42 $bs $bs" \ + -c "$zero_cmd 0 1" \ + -c "pread -v 0 $bs_t2" \ + $testfile | $filter_cmd + + echo "zero 0, $bs_m1" + $XFS_IO_PROG -f -t -c "pwrite -S 0x41 0 $bs" \ + -c "pwrite -S 0x42 $bs $bs" \ + -c "$zero_cmd 0 $bs_m1" \ + -c "pread -v 0 $bs_t2" \ + $testfile | $filter_cmd + + echo "zero 0, $bs" + $XFS_IO_PROG -f -t -c "pwrite -S 0x41 0 $bs" \ + -c "pwrite -S 0x42 $bs $bs" \ + -c "$zero_cmd 0 $bs" \ + -c "pread -v 0 $bs_t2" \ + $testfile | $filter_cmd + + echo "zero 0, $bs_p1" + $XFS_IO_PROG -f -t -c "pwrite -S 0x41 0 $bs" \ + -c "pwrite -S 0x42 $bs $bs" \ + -c "$zero_cmd 0 $bs_p1" \ + -c "pread -v 0 $bs_t2" \ + $testfile | $filter_cmd + + echo "zero $bs_m1, $bs" + $XFS_IO_PROG -f -t -c "pwrite -S 0x41 0 $bs" \ + -c "pwrite -S 0x42 $bs $bs" \ + -c "$zero_cmd $bs_m1 $bs" \ + -c "pread -v 0 $bs_t2" \ + $testfile | $filter_cmd + + echo "zero $bs_m1, $bs_p1" + $XFS_IO_PROG -f -t -c "pwrite -S 0x41 0 $bs" \ + -c "pwrite -S 0x42 $bs $bs" \ + -c "$zero_cmd $bs_m1 $bs_p1" \ + -c "pread -v 0 $bs_t2" \ + $testfile | $filter_cmd + + echo "zero $bs_m1, $bs_p2" + $XFS_IO_PROG -f -t -c "pwrite -S 0x41 0 $bs" \ + -c "pwrite -S 0x42 $bs $bs" \ + -c "$zero_cmd $bs_m1 $bs_p2" \ + -c "pread -v 0 $bs_t2" \ + $testfile | $filter_cmd + + + echo "zero $bs, $bs" + $XFS_IO_PROG -f -t -c "pwrite -S 0x41 0 $bs" \ + -c "pwrite -S 0x42 $bs $bs" \ + -c "$zero_cmd $bs $bs" \ + -c "pread -v 0 $bs_t2" \ + $testfile | $filter_cmd + + + echo "zero $bs_d2 , $bs" + $XFS_IO_PROG -f -t -c "pwrite -S 0x41 0 $bs" \ + -c "pwrite -S 0x42 $bs $bs" \ + -c "$zero_cmd $bs_d2 $bs" \ + -c "pread -v 0 $bs_t2" \ + $testfile | $filter_cmd +} diff --git a/tests/xfs/290 b/tests/xfs/290 index 547a0ba..cbe7108 100755 --- a/tests/xfs/290 +++ b/tests/xfs/290 @@ -38,6 +38,7 @@ trap "exit \$status" 0 1 2 3 15 # get standard environment, filters and checks . ./common/rc . ./common/filter +. ./common/punch # real QA test starts here @@ -49,44 +50,7 @@ _require_xfs_io_zero testfile=$TEST_DIR/290.$$ -test_zero() -{ - zero_start=$1 - zero_len=$2 - - $XFS_IO_PROG -f -t -c "pwrite -S 0x41 0 4096" \ - -c "pwrite -S 0x42 4096 4096" \ - -c "zero $zero_start $zero_len" \ - -c "pread -v 0 8192" \ - $testfile | _filter_xfs_io_unique -} - -# [0,1] -- Shouldn't toss anything -test_zero 0 1 - -#[0,4095] -- Shouldn't toss anything -test_zero 0 4095 - -#[0,4096] -- Should toss first page -test_zero 0 4096 - -#[0,4097] -- Should toss first page -test_zero 0 4097 - -#[4095,8191] -- Should toss last byte of first page -test_zero 4095 4096 - -#[4095,8192] -- Should toss second page & last byte of first page -test_zero 4095 4097 - -#[4095,8193] -- Should toss second page & last byte of first page -test_zero 4095 4098 - -#[4096,8192] -- Should toss second page -test_zero 4096 4096 - -#[1024,5120] -- Should toss from 1024 to end of first page -test_zero 1024 4096 +_test_block_boundaries 4096 zero _filter_xfs_io_unique $testfile # success, all done status=0 diff --git a/tests/xfs/290.out b/tests/xfs/290.out index 229c2b3..2487a93 100644 --- a/tests/xfs/290.out +++ b/tests/xfs/290.out @@ -1,4 +1,5 @@ QA output created by 290 +zero 0, 1 wrote 4096/4096 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote 4096/4096 bytes at offset 4096 @@ -10,6 +11,7 @@ XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) * read 8192/8192 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 4095 wrote 4096/4096 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote 4096/4096 bytes at offset 4096 @@ -21,6 +23,7 @@ XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) * read 8192/8192 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 4096 wrote 4096/4096 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote 4096/4096 bytes at offset 4096 @@ -31,6 +34,7 @@ XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) * read 8192/8192 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 4097 wrote 4096/4096 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote 4096/4096 bytes at offset 4096 @@ -42,6 +46,7 @@ XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) * read 8192/8192 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 4095, 4096 wrote 4096/4096 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote 4096/4096 bytes at offset 4096 @@ -54,6 +59,7 @@ XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 00001ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 42 ...............B read 8192/8192 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 4095, 4097 wrote 4096/4096 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote 4096/4096 bytes at offset 4096 @@ -65,6 +71,7 @@ XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) * read 8192/8192 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 4095, 4098 wrote 4096/4096 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote 4096/4096 bytes at offset 4096 @@ -76,6 +83,7 @@ XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) * read 8192/8192 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 4096, 4096 wrote 4096/4096 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote 4096/4096 bytes at offset 4096 @@ -86,15 +94,16 @@ XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) * read 8192/8192 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 2048 , 4096 wrote 4096/4096 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote 4096/4096 bytes at offset 4096 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) 00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA * -00000400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +00000800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ * -00001400: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +00001800: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB * read 8192/8192 bytes at offset 0 XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -- 1.8.3.1 From lczerner@redhat.com Wed Mar 5 09:51:59 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E521A7F5F for ; Wed, 5 Mar 2014 09:51:59 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id CBAD38F8078 for ; Wed, 5 Mar 2014 07:51:59 -0800 (PST) X-ASG-Debug-ID: 1394034718-04cb6c567729b070001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xuQLM7mGqGvy43ZE for ; Wed, 05 Mar 2014 07:51:58 -0800 (PST) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s25FpvqA016193 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Mar 2014 10:51:58 -0500 Received: from localhost.localdomain.com (vpn1-6-48.ams2.redhat.com [10.36.6.48]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s25FpkuP022264; Wed, 5 Mar 2014 10:51:55 -0500 From: Lukas Czerner To: linux-ext4@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, lczerner@redhat.com Subject: [PATCH v2 3/8] generic/008: Add test for fallocate zero range at block boundary Date: Wed, 5 Mar 2014 16:51:34 +0100 X-ASG-Orig-Subj: [PATCH v2 3/8] generic/008: Add test for fallocate zero range at block boundary Message-Id: <1394034699-21187-4-git-send-email-lczerner@redhat.com> In-Reply-To: <1394034699-21187-1-git-send-email-lczerner@redhat.com> References: <1394034699-21187-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1394034718 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Add test for fallocate zero range at block boundary. This is similar to the test xfs/290 however this one is generic and we're testing different block sizes as well - namely 1k, 2k, 4k and 64k. Note that we're not creating file systems with given block size buy rather test all 4 options. Signed-off-by: Lukas Czerner --- common/rc | 2 +- tests/generic/008 | 57 +++++++ tests/generic/008.out | 433 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 4 files changed, 492 insertions(+), 1 deletion(-) create mode 100755 tests/generic/008 create mode 100644 tests/generic/008.out diff --git a/common/rc b/common/rc index 7f530d0..70b8ff5 100644 --- a/common/rc +++ b/common/rc @@ -1310,7 +1310,7 @@ _require_xfs_io_command() "falloc" ) testio=`$XFS_IO_PROG -F -f -c "falloc 0 1m" $testfile 2>&1` ;; - "fpunch" | "fcollapse" | "zero" ) + "fpunch" | "fcollapse" | "zero" | "fzero" ) testio=`$XFS_IO_PROG -F -f -c "pwrite 0 20k" -c "fsync" \ -c "$command 4k 8k" $testfile 2>&1` ;; diff --git a/tests/generic/008 b/tests/generic/008 new file mode 100755 index 0000000..65e1661 --- /dev/null +++ b/tests/generic/008 @@ -0,0 +1,57 @@ +#! /bin/bash +# FS QA Test No. 008 +# +# Makes calls to fallocate zero range and checks tossed ranges +# +# Primarily tests page boundries and boundries that are +# off-by-one to ensure we're only tossing what's expected +# +#----------------------------------------------------------------------- +# Copyright 2014 (C) Red Hat, Inc., Lukas Czerner +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/punch + +# real QA test starts here + +# Modify as appropriate. +_supported_os Linux + +_require_xfs_io_command "fzero" + +testfile=$TEST_DIR/008.$$ + +_test_block_boundaries 1024 fzero _filter_xfs_io_unique $testfile +_test_block_boundaries 2048 fzero _filter_xfs_io_unique $testfile +_test_block_boundaries 4096 fzero _filter_xfs_io_unique $testfile +_test_block_boundaries 65536 fzero _filter_xfs_io_unique $testfile + +# success, all done +status=0 +exit diff --git a/tests/generic/008.out b/tests/generic/008.out new file mode 100644 index 0000000..0c3fb53 --- /dev/null +++ b/tests/generic/008.out @@ -0,0 +1,433 @@ +QA output created by 008 +zero 0, 1 +wrote 1024/1024 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 1024 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 00 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 .AAAAAAAAAAAAAAA +00000010: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +00000400: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 1023 +wrote 1024/1024 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 1024 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +000003f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 ...............A +00000400: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 1024 +wrote 1024/1024 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 1024 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +00000400: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 1025 +wrote 1024/1024 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 1024 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +00000400: 00 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 .BBBBBBBBBBBBBBB +00000410: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 1023, 1024 +wrote 1024/1024 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 1024 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +000003f0: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 00 AAAAAAAAAAAAAAA. +00000400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +000007f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 42 ...............B +read 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 1023, 1025 +wrote 1024/1024 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 1024 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +000003f0: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 00 AAAAAAAAAAAAAAA. +00000400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +read 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 1023, 1026 +wrote 1024/1024 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 1024 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +000003f0: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 00 AAAAAAAAAAAAAAA. +00000400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +read 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 1024, 1024 +wrote 1024/1024 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 1024 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +00000400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +read 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 512 , 1024 +wrote 1024/1024 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 1024 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +00000200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +00000600: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 1 +wrote 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 2048/2048 bytes at offset 2048 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 00 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 .AAAAAAAAAAAAAAA +00000010: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +00000800: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 2047 +wrote 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 2048/2048 bytes at offset 2048 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +000007f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 ...............A +00000800: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 2048 +wrote 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 2048/2048 bytes at offset 2048 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +00000800: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 2049 +wrote 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 2048/2048 bytes at offset 2048 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +00000800: 00 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 .BBBBBBBBBBBBBBB +00000810: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 2047, 2048 +wrote 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 2048/2048 bytes at offset 2048 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +000007f0: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 00 AAAAAAAAAAAAAAA. +00000800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +00000ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 42 ...............B +read 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 2047, 2049 +wrote 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 2048/2048 bytes at offset 2048 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +000007f0: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 00 AAAAAAAAAAAAAAA. +00000800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +read 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 2047, 2050 +wrote 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 2048/2048 bytes at offset 2048 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +000007f0: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 00 AAAAAAAAAAAAAAA. +00000800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +read 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 2048, 2048 +wrote 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 2048/2048 bytes at offset 2048 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +00000800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +read 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 1024 , 2048 +wrote 2048/2048 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 2048/2048 bytes at offset 2048 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +00000400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +00000c00: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 1 +wrote 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 4096/4096 bytes at offset 4096 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 00 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 .AAAAAAAAAAAAAAA +00000010: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +00001000: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 8192/8192 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 4095 +wrote 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 4096/4096 bytes at offset 4096 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +00000ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 ...............A +00001000: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 8192/8192 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 4096 +wrote 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 4096/4096 bytes at offset 4096 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +00001000: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 8192/8192 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 4097 +wrote 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 4096/4096 bytes at offset 4096 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +00001000: 00 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 .BBBBBBBBBBBBBBB +00001010: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 8192/8192 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 4095, 4096 +wrote 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 4096/4096 bytes at offset 4096 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +00000ff0: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 00 AAAAAAAAAAAAAAA. +00001000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +00001ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 42 ...............B +read 8192/8192 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 4095, 4097 +wrote 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 4096/4096 bytes at offset 4096 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +00000ff0: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 00 AAAAAAAAAAAAAAA. +00001000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +read 8192/8192 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 4095, 4098 +wrote 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 4096/4096 bytes at offset 4096 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +00000ff0: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 00 AAAAAAAAAAAAAAA. +00001000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +read 8192/8192 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 4096, 4096 +wrote 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 4096/4096 bytes at offset 4096 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +00001000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +read 8192/8192 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 2048 , 4096 +wrote 4096/4096 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 4096/4096 bytes at offset 4096 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +00000800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +00001800: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 8192/8192 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 1 +wrote 65536/65536 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 65536/65536 bytes at offset 65536 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 00 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 .AAAAAAAAAAAAAAA +00000010: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +00010000: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 131072/131072 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 65535 +wrote 65536/65536 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 65536/65536 bytes at offset 65536 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +0000fff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 ...............A +00010000: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 131072/131072 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 65536 +wrote 65536/65536 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 65536/65536 bytes at offset 65536 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +00010000: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 131072/131072 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 0, 65537 +wrote 65536/65536 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 65536/65536 bytes at offset 65536 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +00010000: 00 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 .BBBBBBBBBBBBBBB +00010010: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 131072/131072 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 65535, 65536 +wrote 65536/65536 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 65536/65536 bytes at offset 65536 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +0000fff0: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 00 AAAAAAAAAAAAAAA. +00010000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +0001fff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 42 ...............B +read 131072/131072 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 65535, 65537 +wrote 65536/65536 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 65536/65536 bytes at offset 65536 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +0000fff0: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 00 AAAAAAAAAAAAAAA. +00010000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +read 131072/131072 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 65535, 65538 +wrote 65536/65536 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 65536/65536 bytes at offset 65536 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +0000fff0: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 00 AAAAAAAAAAAAAAA. +00010000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +read 131072/131072 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 65536, 65536 +wrote 65536/65536 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 65536/65536 bytes at offset 65536 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +00010000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +read 131072/131072 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +zero 32768 , 65536 +wrote 65536/65536 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 65536/65536 bytes at offset 65536 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA +* +00008000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +* +00018000: 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 BBBBBBBBBBBBBBBB +* +read 131072/131072 bytes at offset 0 +XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) diff --git a/tests/generic/group b/tests/generic/group index 34bd118..a99b6a1 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -9,6 +9,7 @@ 005 dir udf auto quick 006 dir udf auto quick 007 dir udf auto quick +008 auto quick prealloc 010 other udf auto 011 dir udf auto quick 013 other ioctl udf auto quick -- 1.8.3.1 From lczerner@redhat.com Wed Mar 5 09:52:01 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C3DD17F5F for ; Wed, 5 Mar 2014 09:52:01 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 71867AC007 for ; Wed, 5 Mar 2014 07:52:01 -0800 (PST) X-ASG-Debug-ID: 1394034720-04bdf05da92bef70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lquyMoilus7fptzy for ; Wed, 05 Mar 2014 07:52:00 -0800 (PST) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s25Fq07L003494 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Mar 2014 10:52:00 -0500 Received: from localhost.localdomain.com (vpn1-6-48.ams2.redhat.com [10.36.6.48]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s25FpkuQ022264; Wed, 5 Mar 2014 10:51:58 -0500 From: Lukas Czerner To: linux-ext4@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, lczerner@redhat.com Subject: [PATCH v2 4/8] xfstests: Move fallocate include into global.h Date: Wed, 5 Mar 2014 16:51:35 +0100 X-ASG-Orig-Subj: [PATCH v2 4/8] xfstests: Move fallocate include into global.h Message-Id: <1394034699-21187-5-git-send-email-lczerner@redhat.com> In-Reply-To: <1394034699-21187-1-git-send-email-lczerner@redhat.com> References: <1394034699-21187-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1394034720 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Move the inclusion of falloc.h with all it's possible defines for the fallocate mode into global.h header file so we do not have to include and define it manually in every tool using fallocate. Signed-off-by: Lukas Czerner Reviewed-by: Eric Sandeen --- configure.ac | 3 ++- ltp/fsstress.c | 11 ++--------- ltp/fsx.c | 11 ++++------- src/global.h | 25 +++++++++++++++++++++++++ 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/configure.ac b/configure.ac index 6fba3ad..2f95c4c 100644 --- a/configure.ac +++ b/configure.ac @@ -25,7 +25,8 @@ AC_HEADER_STDC sys/wait.h \ sys/types.h \ strings.h \ - err.h + err.h \ + linux/falloc.h ]) AC_CHECK_HEADERS([ sys/fs/xfs_fsops.h \ sys/fs/xfs_itable.h \ diff --git a/ltp/fsstress.c b/ltp/fsstress.c index c56f168..7dec7c6 100644 --- a/ltp/fsstress.c +++ b/ltp/fsstress.c @@ -27,13 +27,6 @@ #ifdef HAVE_LINUX_FIEMAP_H #include #endif -#ifdef FALLOCATE -#include -#ifndef FALLOC_FL_PUNCH_HOLE -/* Copy-paste from linux/falloc.h */ -#define FALLOC_FL_PUNCH_HOLE 0x02 /* de-allocates range */ -#endif -#endif #ifndef HAVE_ATTR_LIST #define attr_list(path, buf, size, flags, cursor) (errno = -ENOSYS, -1) #endif @@ -2085,7 +2078,7 @@ dwrite_f(int opno, long r) void fallocate_f(int opno, long r) { -#ifdef FALLOCATE +#ifdef HAVE_LINUX_FALLOC_H int e; pathname_t f; int fd; @@ -2507,7 +2500,7 @@ mknod_f(int opno, long r) void punch_f(int opno, long r) { -#ifdef FALLOCATE +#ifdef HAVE_LINUX_FALLOC_H int e; pathname_t f; int fd; diff --git a/ltp/fsx.c b/ltp/fsx.c index 2f1e3e8..c36a038 100644 --- a/ltp/fsx.c +++ b/ltp/fsx.c @@ -33,9 +33,6 @@ #ifdef AIO #include #endif -#ifdef FALLOCATE -#include -#endif #ifndef MAP_FILE # define MAP_FILE 0 @@ -882,7 +879,7 @@ do_punch_hole(unsigned offset, unsigned length) } #endif -#ifdef FALLOCATE +#ifdef HAVE_LINUX_FALLOC_H /* fallocate is basically a no-op unless extending, then a lot like a truncate */ void do_preallocate(unsigned offset, unsigned length) @@ -1139,7 +1136,7 @@ usage(void) " -A: Use the AIO system calls\n" #endif " -D startingop: debug output starting at specified operation\n" -#ifdef FALLOCATE +#ifdef HAVE_LINUX_FALLOC_H " -F: Do not use fallocate (preallocation) calls\n" #endif #ifdef FALLOC_FL_PUNCH_HOLE @@ -1296,7 +1293,7 @@ int aio_rw(int rw, int fd, char *buf, unsigned len, unsigned offset) void test_fallocate() { -#ifdef FALLOCATE +#ifdef HAVE_LINUX_FALLOC_H if (!lite && fallocate_calls) { if (fallocate(fd, 0, 0, 1) && errno == EOPNOTSUPP) { if(!quiet) @@ -1306,7 +1303,7 @@ test_fallocate() ftruncate(fd, 0); } } -#else /* ! FALLOCATE */ +#else /* ! HAVE_LINUX_FALLOC_H */ fallocate_calls = 0; #endif diff --git a/src/global.h b/src/global.h index e6a2c2b..8180f66 100644 --- a/src/global.h +++ b/src/global.h @@ -149,4 +149,29 @@ #include #endif +#ifdef HAVE_LINUX_FALLOC_H +#include + +#ifndef FALLOC_FL_KEEP_SIZE +#define FALLOC_FL_KEEP_SIZE 0x01 +#endif + +#ifndef FALLOC_FL_PUNCH_HOLE +#define FALLOC_FL_PUNCH_HOLE 0x02 #endif + +#ifndef FALLOC_FL_NO_HIDE_STALE +#define FALLOC_FL_NO_HIDE_STALE 0x04 +#endif + +#ifndef FALLOC_FL_COLLAPSE_RANGE +#define FALLOC_FL_COLLAPSE_RANGE 0x08 +#endif + +#ifndef FALLOC_FL_ZERO_RANGE +#define FALLOC_FL_ZERO_RANGE 0x10 +#endif + +#endif /* HAVE_LINUX_FALLOC_H */ + +#endif /* GLOBAL_H */ -- 1.8.3.1 From lczerner@redhat.com Wed Mar 5 09:52:05 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ACC8E7F5F for ; Wed, 5 Mar 2014 09:52:05 -0600 (CST) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2EBE1AC009 for ; Wed, 5 Mar 2014 07:52:05 -0800 (PST) X-ASG-Debug-ID: 1394034723-04cb6c567529b090001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id aY33qMNk1A4djiiR for ; Wed, 05 Mar 2014 07:52:03 -0800 (PST) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s25Fq2e5019950 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Mar 2014 10:52:03 -0500 Received: from localhost.localdomain.com (vpn1-6-48.ams2.redhat.com [10.36.6.48]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s25FpkuR022264; Wed, 5 Mar 2014 10:52:00 -0500 From: Lukas Czerner To: linux-ext4@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, lczerner@redhat.com Subject: [PATCH v2 5/8] xfstests: Add fallocate zero range operation to fsstress Date: Wed, 5 Mar 2014 16:51:36 +0100 X-ASG-Orig-Subj: [PATCH v2 5/8] xfstests: Add fallocate zero range operation to fsstress Message-Id: <1394034699-21187-6-git-send-email-lczerner@redhat.com> In-Reply-To: <1394034699-21187-1-git-send-email-lczerner@redhat.com> References: <1394034699-21187-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1394034723 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This commit adds fzero operation support for fsstress, which is meant to exercise fallocate FALLOC_FL_ZERO_RANGE support. Also reorganise the common fallocate code into a single do_fallocate() function and use flags use the right mode. Also in order to make more obvious which fallocate mode fsstress is testing translate fallocate flags into human readable strings. Signed-off-by: Lukas Czerner --- ltp/fsstress.c | 178 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 120 insertions(+), 58 deletions(-) diff --git a/ltp/fsstress.c b/ltp/fsstress.c index 7dec7c6..00fda36 100644 --- a/ltp/fsstress.c +++ b/ltp/fsstress.c @@ -70,6 +70,7 @@ typedef enum { OP_MKDIR, OP_MKNOD, OP_PUNCH, + OP_ZERO, OP_READ, OP_READLINK, OP_RENAME, @@ -114,6 +115,17 @@ typedef struct pathname { char *path; } pathname_t; +struct print_flags { + unsigned long mask; + const char *name; +}; + +struct print_string { + char *buffer; + int len; + int max; +}; + #define FT_DIR 0 #define FT_DIRm (1 << FT_DIR) #define FT_REG 1 @@ -155,6 +167,7 @@ void link_f(int, long); void mkdir_f(int, long); void mknod_f(int, long); void punch_f(int, long); +void zero_f(int, long); void read_f(int, long); void readlink_f(int, long); void rename_f(int, long); @@ -192,6 +205,7 @@ opdesc_t ops[] = { { OP_MKDIR, "mkdir", mkdir_f, 2, 1 }, { OP_MKNOD, "mknod", mknod_f, 2, 1 }, { OP_PUNCH, "punch", punch_f, 1, 1 }, + { OP_ZERO, "zero", zero_f, 1, 1 }, { OP_READ, "read", read_f, 1, 0 }, { OP_READLINK, "readlink", readlink_f, 1, 0 }, { OP_RENAME, "rename", rename_f, 2, 1 }, @@ -242,6 +256,7 @@ int verbose = 0; sig_atomic_t should_stop = 0; char *execute_cmd = NULL; int execute_freq = 1; +struct print_string flag_str = {0}; void add_to_flist(int, int, int); void append_pathname(pathname_t *, char *); @@ -543,6 +558,73 @@ int main(int argc, char **argv) return 0; } +int +add_string(struct print_string *str, const char *add) +{ + int len = strlen(add); + + if (len <= 0) + return 0; + + if (len > (str->max - 1) - str->len) { + str->len = str->max - 1; + return 0; + } + + memcpy(str->buffer + str->len, add, len); + str->len += len; + str->buffer[str->len] = '\0'; + + return len; +} + +char * +translate_flags(int flags, const char *delim, + const struct print_flags *flag_array) +{ + int i, mask, first = 1; + const char *add; + + if (!flag_str.buffer) { + flag_str.buffer = malloc(4096); + flag_str.max = 4096; + flag_str.len = 0; + } + if (!flag_str.buffer) + return NULL; + flag_str.len = 0; + flag_str.buffer[0] = '\0'; + + for (i = 0; flag_array[i].name && flags; i++) { + mask = flag_array[i].mask; + if ((flags & mask) != mask) + continue; + + add = flag_array[i].name; + flags &= ~mask; + if (!first && delim) + add_string(&flag_str, delim); + else + first = 0; + add_string(&flag_str, add); + } + + /* Check whether there are any leftover flags. */ + if (flags) { + int ret; + char number[11]; + + if (!first && delim) + add_string(&flag_str, delim); + + ret = snprintf(number, 11, "0x%x", flags) > 0; + if (ret > 0 && ret <= 11) + add_string(&flag_str, number); + } + + return flag_str.buffer; +} + void add_to_flist(int ft, int id, int parent) { @@ -2075,8 +2157,23 @@ dwrite_f(int opno, long r) close(fd); } + +#ifdef HAVE_LINUX_FALLOC_H +struct print_flags falloc_flags [] = { + { FALLOC_FL_KEEP_SIZE, "KEEP_SIZE"}, + { FALLOC_FL_PUNCH_HOLE, "PUNCH_HOLE"}, + { FALLOC_FL_NO_HIDE_STALE, "NO_HIDE_STALE"}, + { FALLOC_FL_COLLAPSE_RANGE, "COLLAPSE_RANGE"}, + { FALLOC_FL_ZERO_RANGE, "ZERO_RANGE"}, + { -1, NULL} +}; + +#define translate_falloc_flags(mode) \ + ({translate_flags(mode, "|", falloc_flags);}) +#endif + void -fallocate_f(int opno, long r) +do_fallocate(int opno, long r, int mode) { #ifdef HAVE_LINUX_FALLOC_H int e; @@ -2088,28 +2185,26 @@ fallocate_f(int opno, long r) struct stat64 stb; int v; char st[1024]; - int mode = 0; init_pathname(&f); if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) { if (v) - printf("%d/%d: fallocate - no filename\n", procid, opno); + printf("%d/%d: do_fallocate - no filename\n", procid, opno); free_pathname(&f); return; } fd = open_path(&f, O_RDWR); - e = fd < 0 ? errno : 0; - check_cwd(); if (fd < 0) { if (v) - printf("%d/%d: fallocate - open %s failed %d\n", - procid, opno, f.path, e); + printf("%d/%d: do_fallocate - open %s failed %d\n", + procid, opno, f.path, errno); free_pathname(&f); return; } + check_cwd(); if (fstat64(fd, &stb) < 0) { if (v) - printf("%d/%d: fallocate - fstat64 %s failed %d\n", + printf("%d/%d: do_fallocate - fstat64 %s failed %d\n", procid, opno, f.path, errno); free_pathname(&f); close(fd); @@ -2123,14 +2218,21 @@ fallocate_f(int opno, long r) mode |= FALLOC_FL_KEEP_SIZE & random(); e = fallocate(fd, mode, (loff_t)off, (loff_t)len) < 0 ? errno : 0; if (v) - printf("%d/%d: fallocate(%d) %s %st %lld %lld %d\n", - procid, opno, mode, + printf("%d/%d: fallocate(%s) %s %st %lld %lld %d\n", + procid, opno, translate_falloc_flags(mode), f.path, st, (long long)off, (long long)len, e); free_pathname(&f); close(fd); #endif } +void +fallocate_f(int opno, long r) +{ +#ifdef HAVE_LINUX_FALLOC_H + do_fallocate(opno, r, 0); +#endif +} void fdatasync_f(int opno, long r) @@ -2501,55 +2603,15 @@ void punch_f(int opno, long r) { #ifdef HAVE_LINUX_FALLOC_H - int e; - pathname_t f; - int fd; - __int64_t lr; - off64_t off; - off64_t len; - struct stat64 stb; - int v; - char st[1024]; - int mode = FALLOC_FL_PUNCH_HOLE; + do_fallocate(opno, r, FALLOC_FL_PUNCH_HOLE); +#endif +} - init_pathname(&f); - if (!get_fname(FT_REGFILE, r, &f, NULL, NULL, &v)) { - if (v) - printf("%d/%d: punch hole - no filename\n", procid, opno); - free_pathname(&f); - return; - } - fd = open_path(&f, O_RDWR); - e = fd < 0 ? errno : 0; - check_cwd(); - if (fd < 0) { - if (v) - printf("%d/%d: punch hole - open %s failed %d\n", - procid, opno, f.path, e); - free_pathname(&f); - return; - } - if (fstat64(fd, &stb) < 0) { - if (v) - printf("%d/%d: punch hole - fstat64 %s failed %d\n", - procid, opno, f.path, errno); - free_pathname(&f); - close(fd); - return; - } - inode_info(st, sizeof(st), &stb, v); - lr = ((__int64_t)random() << 32) + random(); - off = (off64_t)(lr % MIN(stb.st_size + (1024 * 1024), MAXFSIZE)); - off %= maxfsize; - len = (off64_t)(random() % (1024 * 1024)); - mode |= FALLOC_FL_KEEP_SIZE & random(); - e = fallocate(fd, mode, (loff_t)off, (loff_t)len) < 0 ? errno : 0; - if (v) - printf("%d/%d: punch hole(%d) %s %s %lld %lld %d\n", - procid, opno, mode, - f.path, st, (long long)off, (long long)len, e); - free_pathname(&f); - close(fd); +void +zero_f(int opno, long r) +{ +#ifdef HAVE_LINUX_FALLOC_H + do_fallocate(opno, r, FALLOC_FL_ZERO_RANGE); #endif } -- 1.8.3.1 From lczerner@redhat.com Wed Mar 5 09:52:09 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8CC0D7F54 for ; Wed, 5 Mar 2014 09:52:09 -0600 (CST) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3A974AC00B for ; Wed, 5 Mar 2014 07:52:09 -0800 (PST) X-ASG-Debug-ID: 1394034728-04bdf05dab2befb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KEU4TwkxYQoVikFm for ; Wed, 05 Mar 2014 07:52:08 -0800 (PST) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s25Fq6AZ013743 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Mar 2014 10:52:06 -0500 Received: from localhost.localdomain.com (vpn1-6-48.ams2.redhat.com [10.36.6.48]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s25FpkuS022264; Wed, 5 Mar 2014 10:52:03 -0500 From: Lukas Czerner To: linux-ext4@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, lczerner@redhat.com Subject: [PATCH v2 6/8] fsstress: translate flags in fiemap_f Date: Wed, 5 Mar 2014 16:51:37 +0100 X-ASG-Orig-Subj: [PATCH v2 6/8] fsstress: translate flags in fiemap_f Message-Id: <1394034699-21187-7-git-send-email-lczerner@redhat.com> In-Reply-To: <1394034699-21187-1-git-send-email-lczerner@redhat.com> References: <1394034699-21187-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1394034728 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Translate flags in fiemap_f output to human readable strings. Signed-off-by: Lukas Czerner Reviewed-by: Eric Sandeen --- ltp/fsstress.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/ltp/fsstress.c b/ltp/fsstress.c index 00fda36..40f9a03 100644 --- a/ltp/fsstress.c +++ b/ltp/fsstress.c @@ -2266,6 +2266,18 @@ fdatasync_f(int opno, long r) free_pathname(&f); close(fd); } + +#ifdef HAVE_LINUX_FIEMAP_H +struct print_flags fiemap_flags[] = { + { FIEMAP_FLAG_SYNC, "SYNC"}, + { FIEMAP_FLAG_XATTR, "XATTR"}, + { -1, NULL} +}; + +#define translate_fiemap_flags(mode) \ + ({translate_flags(mode, "|", fiemap_flags);}) +#endif + void fiemap_f(int opno, long r) { @@ -2328,9 +2340,10 @@ fiemap_f(int opno, long r) e = ioctl(fd, FS_IOC_FIEMAP, (unsigned long)fiemap); if (v) - printf("%d/%d: ioctl(FIEMAP) %s%s %lld %lld %x %d\n", + printf("%d/%d: ioctl(FIEMAP) %s%s %lld %lld (%s) %d\n", procid, opno, f.path, st, (long long)fiemap->fm_start, - (long long) fiemap->fm_length, fiemap->fm_flags, e); + (long long) fiemap->fm_length, + translate_fiemap_flags(fiemap->fm_flags), e); free(fiemap); free_pathname(&f); close(fd); -- 1.8.3.1 From lczerner@redhat.com Wed Mar 5 09:52:11 2014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 742197F75 for ; Wed, 5 Mar 2014 09:52:11 -0600 (CST) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4B39B8F8070 for ; Wed, 5 Mar 2014 07:52:11 -0800 (PST) X-ASG-Debug-ID: 1394034730-04cbb054b7ab8f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Ql5uDxoSzd77RgND for ; Wed, 05 Mar 2014 07:52:10 -0800 (PST) X-Barracuda-Envelope-From: lczerner@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s25Fq9Q7032344 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Mar 2014 10:52:09 -0500 Received: from localhost.localdomain.com (vpn1-6-48.ams2.redhat.com [10.36.6.48]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s25FpkuT022264; Wed, 5 Mar 2014 10:52:06 -0500 From: Lukas Czerner To: linux-ext4@vger.kernel.org Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, lczerner@redhat.com Subject: [PATCH v2 7/8] xfstests: Add fallocate zero range operation to fsx Date: Wed, 5 Mar 2014 16:51:38 +0100 X-ASG-Orig-Subj: [PATCH v2 7/8] xfstests: Add fallocate zero range operation to fsx Message-Id: <1394034699-21187-8-git-send-email-lczerner@redhat.com> In-Reply-To: <1394034699-21187-1-git-send-email-lczerner@redhat.com> References: <1394034699-21187-1-git-send-email-lczerner@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1394034730 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 This commit adds fallocate FALLOC_FL_ZERO_RANGE support for fsx. Signed-off-by: Lukas Czerner --- ltp/fsx.c | 137 +++++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 105 insertions(+), 32 deletions(-) diff --git a/ltp/fsx.c b/ltp/fsx.c index c36a038..bd1ed76 100644 --- a/ltp/fsx.c +++ b/ltp/fsx.c @@ -69,6 +69,7 @@ int logcount = 0; /* total ops */ * TRUNCATE: - 4 * FALLOCATE: - 5 * PUNCH HOLE: - 6 + * ZERO RANGE: - 7 * * When mapped read/writes are disabled, they are simply converted to normal * reads and writes. When fallocate/fpunch calls are disabled, they are @@ -92,7 +93,8 @@ int logcount = 0; /* total ops */ #define OP_TRUNCATE 4 #define OP_FALLOCATE 5 #define OP_PUNCH_HOLE 6 -#define OP_MAX_FULL 7 +#define OP_ZERO_RANGE 7 +#define OP_MAX_FULL 8 /* operation modifiers */ #define OP_CLOSEOPEN 100 @@ -139,6 +141,7 @@ int seed = 1; /* -S flag */ int mapped_writes = 1; /* -W flag disables */ int fallocate_calls = 1; /* -F flag disables */ int punch_hole_calls = 1; /* -H flag disa